From 225ec5628248d9c5c2f5a030e063c14013015047 Mon Sep 17 00:00:00 2001 From: supermap123 Date: Mon, 6 Nov 2023 14:06:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5new-iearth-11=E5=88=86?= =?UTF-8?q?=E6=94=AF-public-Resource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rakensberg_solitary_mountain_1k_2_S-20.hdr | Bin 0 -> 1420700 bytes .../public/Resource/config/configToken.json | 4 + .../js/iclient-leaflet/iclient-leaflet-es6.js | 102289 +++++++++++++ .../iclient-leaflet-es6.min.js | 1678 + .../js/iclient-leaflet/iclient-leaflet.css | 2772 + .../js/iclient-leaflet/iclient-leaflet.js | 116468 +++++++++++++++ .../iclient-leaflet/iclient-leaflet.min.css | 8 + .../js/iclient-leaflet/iclient-leaflet.min.js | 1421 + .../js/iclient-leaflet/include-leaflet.js | 177 + .../js/iclient-leaflet/workers/TurfWorker.js | 336 + .../Resource/js/leaflet/images/layers-2x.png | Bin 0 -> 1259 bytes .../Resource/js/leaflet/images/layers.png | Bin 0 -> 696 bytes .../js/leaflet/images/marker-icon-2x.png | Bin 0 -> 2464 bytes .../js/leaflet/images/marker-icon.png | Bin 0 -> 1466 bytes .../js/leaflet/images/marker-shadow.png | Bin 0 -> 618 bytes .../Resource/js/leaflet/leaflet-src.esm.js | 13970 ++ .../js/leaflet/leaflet-src.esm.js.map | 1 + .../public/Resource/js/leaflet/leaflet-src.js | 14064 ++ .../Resource/js/leaflet/leaflet-src.js.map | 1 + .../public/Resource/js/leaflet/leaflet.css | 640 + .../public/Resource/js/leaflet/leaflet.js | 6 + .../public/Resource/js/leaflet/leaflet.js.map | 1 + .../public/Resource/model/projector.s3m | Bin 0 -> 9114 bytes .../public/Resource/particle/fountain.json | 2 +- 24 files changed, 253837 insertions(+), 1 deletion(-) create mode 100644 SuperMap iEarth/public/Resource/BDZ/drakensberg_solitary_mountain_1k_2_S-20.hdr create mode 100644 SuperMap iEarth/public/Resource/config/configToken.json create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.js create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.min.js create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.css create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.js create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.css create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.js create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/include-leaflet.js create mode 100644 SuperMap iEarth/public/Resource/js/iclient-leaflet/workers/TurfWorker.js create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/images/layers-2x.png create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/images/layers.png create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/images/marker-icon-2x.png create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/images/marker-icon.png create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/images/marker-shadow.png create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.esm.js create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.esm.js.map create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.js create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.js.map create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet.css create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet.js create mode 100644 SuperMap iEarth/public/Resource/js/leaflet/leaflet.js.map create mode 100644 SuperMap iEarth/public/Resource/model/projector.s3m diff --git a/SuperMap iEarth/public/Resource/BDZ/drakensberg_solitary_mountain_1k_2_S-20.hdr b/SuperMap iEarth/public/Resource/BDZ/drakensberg_solitary_mountain_1k_2_S-20.hdr new file mode 100644 index 0000000000000000000000000000000000000000..c6d3d53b683dfe271759d6af8730cc46668f1b6e GIT binary patch literal 1420700 zcmZ_1SCAb?mZrIJWeOw&$zm0&d%D>@J2q=OGiy6NyKA-&YXp!0QbU7ikYh#yNXS$G z5}F`E#&wT~D^fsE6v<*$b#+bm4h6IpnLq*wNhpE@i!AoTn$7#Z?o;jepGefqn6WLd zM|gO|jT=|Q`TRfUxaYroY3ZDKZF3ej&u{pbFLtf&UiadzP1`rVIH!AH&AJyCZyeY@ zFt~AGOT&UiOS|SQ|G)mj-~78Zo3_8Ut#{pP+cvCO*U<3qR=xPY|NFmr@!$OIi~s(A z{hR--A(P4d4nV|_vY|J~<%f5r2BU)1|SU(g%% zjc~50H`m9<7F{m$=Hs!mm;Kn#<)dHnq=Ls#9Ek@3=%h%!uDcKphfWZYjlG#+1x$IDm7#v@L3c&u{y&{%Xi;3fUo zAzmW5{Lz@d>@WGt|NXc0$G6h&$+v~AqiqLU-(?-O{jxP|tF^{0hg)OnrMA)5gKU@E zO0B-lwN~5W)>2EYb?O5jZ7;RC_NXJ&H`%GojbyYftIy~QTwY}Pr@9gaCU@Pt@wa0A-+g(SE zdbxe1Slt!m%?y*A(aaoc;nrJi5*zT4w^hkC-zLp|l*L)1U%DQzBQ`?ozY`{Uk9 zkMH$8{MdVXdMdqjJw1GXREPMLL>v&&#C@P|)%6wFWfj*O^f``jy>)%IuaBQXr7!Hg z&{yjJsPANdX&~w^5B$3SgMmtaZ6Id*0A;v89w_xk1HRwW77aK%t~Br-+rR4%`)KR) z`~+iuehELfl9jkG>_5WK?F%lb(s!=+FuxxCg0hz{kCiVcm%_^jD4t(j^-}fnyZoxk zlus^|D8eb3bmOc8VMpvT=f7MMS{F41uf2DFYyyC7_CvtkG=YWL9nA4Z}`Nmfd zUOB*>F*F`tIXYe&dk+)CF=Io#Y;?Icc9^@X_Rsu`!#4e7f6MEq=h>u^i3z_%o= zj_q1Yp|!QOrKQEU9-x#cu4ROE)aqM?S{=XY3cqgs@?F~yzx0q&gzZ{qx$BpmNmtx?sEh5cU(@b7JtgWId%k>~dDSk@}*-*5|*`i8hAMz{qs{e2&Cha}udnf`$xZX!=L+49~% zw8afnwtPAeZixq~Te1TKTPoBK43xK22mF?hQWzK*=51wUvlzF z{}A`r-}9nLU#WMvFTsr0rFVQEmp9y#aJ^hArlQ;v^p-9UUkWZ(xWO`)E_&{z_t_k} zRJj;jC|~p!+{NfpnHwj6@#2LGY=sv*Hr`$Q;8J`scj3ZCcDsvtc3tF2@x^*>zNwp% zIyKuf%##A1oVT3^FBR>!y~t@jAW;dpW9!H5j=Vg^jm(j(i$}I-CY}*$X>fP;jRS}{9_Umj-X(;b)c_J+Ma0^atI zL#%2y^9VQf!IprV8(g)x*59;*3x>GKKVkj5mMV52yI?^}yr9_9V)ozwM{=8sSJZ~M zt;5y>+@@LX<`}YJ1a#k0d|R&7Y(cfX#J%R}faw0$&7E{`|8vuG!^hmx!`z<3+`8Q2 zow=^g&aMQ+`Oe1lh^{W0Vh$PVva&Gl3KkAicU=)BSXk}~JBPcXh1ISc&+T#?kYCu< zwQ!;D3b^et4P8T+1zyKaQ0WXfc?nvUI$};xvu%$V`7JCBxlGJO`v~T$Y^JKl`-(9P zu01a^MeE0A@*LcTlbdtg^xWZjySs-rL&wdh5x^I-byU^d?$0O=@1Bbccv0r=eBIwvNhfkZ5?7G+2U!8)wp%*Z?P`bEguaOF(|Ss6$ATc{dr!ZzprdBXVs|x zH+?zT5Z_x+_dpfbSEJK#khc|JIK$p*PfRp?p5ID;JXUS)QJ7VDZBF^XDm}JkfKKINO&6}Cp7Pi?hONAk#uQ5Z$21COg zY@H2%=~*n#nAst%$HuL`Q`8`FJ9{=4ERzJ|))C1f316%e8CK#Gz|$V)`{~6kFG>U%$@MT`x>d zPEzyN!)wv?`ltJ@Rj=oDAf_#U{W?bs^L&4;XiuHM$YI#7@*>%5*Xg;qYcV!YCN9rY zu3mkQK1*hT>&bG88uqP3Po<#CmZ_aCtH!(IPwyo$6DGs$)cw{rX3g=5M3;+LE`3sE zb<3@PCTkdRY#=MBKH6pEK>%!i+`t9&$?2bC*gkG4EvV4BsZvHTY?YR1LD(|Nc1(w7 zn0maRp1w}nIyWVI0?!s_Uv@p-H+81G3KQa@W;|X0=UM%S>ak7w}RLokY`w$jA>d4!*d*q5| zTb91mQE9Ii1$c)tnbr23DhMJJEj_z7`iwOUC}y=aX!!sX#jHnrKEN*0f5HytWHEoc zDctxW#cgsM<4t}ejhi-BHU%^Un-g{%V8`#Uv+r)IV2C$kVo@hW&#U5d+`rhvk1`xX#!? zF2)z=Q&Ef3e$?=V0JD`lf9~A5_ujl1&=M|B|Mh&JhszaK>z5}GOg#%`SbO5ewr>M7pKW^ z>S&qA1T&qvaB&37r>+;K@4xAXxyv(T05JmW(v8hsAFA)AK3PJS2O~$<$6c890&vmx&FtDzbs@YJedMF+$~u0Gkuj@AB8On7In|!c%)!C)=muCWGtc$p|}# zfxE6QTs)bRQS{df?8Yp*>vfatVuM}&dQlZM-*A&NRpFErJM?;WQqT9-^E6LRR80N$8;%!ABz>n@A(zxUssFNn0{fw~5j^-@()5$L)>*!kRu%pz~jf~oJQe}?5qzq|0R-+*E(MCrT(}%^ugmln* ztD_5vJ(JO_PkW0U?R4x?Ybuurwz5GMFWo7(NWC_BRwsQ-hq2Q}gxRcN3SHL$N*Ocw z0Y&R%p;%rG?c+HB9CR$5eC{ENZ2zWCqneqzbW3BmqFbaZ5rBG z+Vo#GhFH^JQ(4w^;}GRnSk?f09B+zQN1GdadN!*c+e6QjzHLtfrj;!=vAF?m#3mZ7 z1E(%rpYP4~^qD(|jlSN#-uL=)>J(P+V2N0k2>O2l$X}262$g(=Hr8F?Q zrM$JYQt;T;p*LTm0qO4GOOq8FV>lX=AxrZFR0&2ky5;LX^aioX?46JQ`L}ayc2|1%Ixt(!xvYhsQuVbq-lbG*Y%hYone}4TM zSIe7Vlj~IDLm*%>K)e$0?Z_9|d)V5l77S@YT%xD>)wu!yTqOZH7`|;VNU!nwEqm&p6KD=;x*TO}Muk1oQ^u!#ON#-6e`UX)wB zXwhQ7C|EqYC|n%DgpoxaCg?d`bh`bbEYEjzrbidn(MAWni z&|m=TGB((SccdM8!Zmm^3s`>+ade(}gH^&f7qcj1F{ zAfhTf0M!T|<}iKiDqn%%z~_z}0uK32cqTTxP2uK4X7X=s3^zm@8#ip+uwlc-je7Wv zMXlJZZU{C;8{9^>;r)#{wH?`5fE_&irabFSo4kSJeSjfY)X8vyi=Nu%89>7*(bLl- ze)t}oiN*=SXHR_;B7~<)-b7Cv6KxN%B1aYHWKM=Vp?8y<|dgJ$l=&8?$FC)N(P@sd28CU;aHGg3mcR5w;I`+IG z$He&}CZ4VH(G(omFm}Y}ibfG!7~tdlIWJ(G^=I;;&{=n;UXXz#XQ&rWizrYiITLVL zeD z@$;ucp%g?c=gk|YacF+9pq8$6(1K`w{htns*mkHAKR+jc`30F45LaTm%*o4gVH?V*FO;+t*b9!ZipC`0iqvWSNt+Ng1u8=3SW}8?ZGutS1W7ETwg$+=E}3Lm zUi0Y4R%5Ag`V_G9fXLyvDR-I+rc*RfOF>w|!EH(*Ktx0fi-1EqLl_Z9AWQ_M{K6Ra z{9;i73@us=h%$>8Ipa|o9+el>r-v?Hym$y)RTjlC$}P_6U{#_;^@{~CEgUop7FW~V z;As&Oh2!8}F+B-Q@+9TdIt0-ooazlinyy=_s!o?Jv_@0JD)G)xF@kLjxa^H5?CSu` z4!62P&IniS#N4v1Vj^k;4UjG+ob7z%e0susje_s5J0RH+qVx6@`$zvgO0|6HLw{C z#_Z3td;9hwcJcJ>+jnd~pw-~^_Xq2BG9#WhxP5E_Dcl-u%WVaX2e!_XXUZNps8osN zkcx3g$thJvCMlp84Ac;4uK!)!_27%}BZ(XVJ}Cm0eR}I2kyJH-bg;*74hc_4US{b@ zL?$uocGv36&|vqNV}te?}1SrPTloUzw-=bjfc zZ4WP#Y9yoP`OH~~GD$cBmgisKvQ5zOR;?) zk`u;y@e#2(5z1egF600u3@-;@e5cW1Y=Tb{F|q%=$b|jIRfIJ16EmbO%%G;Z8TU{dwwfm^xTw{P8wZkB*hlTFeI* z=@A?PsBYiB?ZDbC$11p4yOkH#ZjM@AXN6fsp$texw=y>-{mm>Jo-?sVW&O-}mtKz>U#sVRLMWECiJwyA^N{vRS0Wa)aw)y8!YMyC zV(3!PppI^VdIoe2vV8P@yk6gdbu8TFI&(a-P)dlR1(i#gi;yZHsuN$pCq@L>yrx;Y zTR$$MVpw$mP9c33m`uXiHJ>1Yu_|1UfE_bz)v-8?F) zM{q4mMeD*mYfX645X|EI&TthzMOam@Dg^#w!3?v0(pFMX3xKC2mz+HHFbF%!hHLpb zJB?PxCM>FLYXzc8IFA|(Qi2j@c$&<$nQRv3S+l@GfNwwOsNm;Ukiip@#ng*W3cOZ9 zfg%RwMR_BIpd{ENi^C;8g^ge27nhcl7e`BC8f%L)ix#^@mBqoL_ZAm~pCz=rCGRcH zi%cAwXSs+2>e;EL#ex&34Hrfxze4JSDi(bVkOIOIN_OfZ>RW_H;*CpNEU3$sbJbBt zaq4}MI7htM<5cr)^?KI|s_;1|KLuZ>1$gm8lFbsJl3YuQ89vOI$amQKOZ7`y>J2hl zMCKj~HjHkpY-rqQx@i4+fHMMA1Q%ekzO*i0A8r_?KD<8I;3)|urbM(yc1*M(T<Nrn$mPC^C1u2lTxXY4r_0l8gmGeL)5Dr*6VDQ12yl8Q@V(iEX9sYE3rg&OdIdeK< zH*KdK>r2{OP%Y0+jQ)L1i#Dd$m zqg&4k6)6!?WZb@Ur+h1W`}Q4oH+SdGo!kCSmL_*QPn|8W04;9c@wZF2M(;Gx#KRbJ zw@LLocQ`YL0+YOU-FA0oX{A@uN|$jvy3@#WcpmjToGN?s=It1H)uby)r4tw9ZUlyz zjH*bd8+ozhMl_i>q`2!b0T_jJ9BQa;@&=I^(CMzvFysiNxbnbBHI0WGNk*WW)XC+{B~k}V_)c^Bexi#Z9=Y(s@I@kS(znt- z)Eol%$AMDBev2i)FneEv7xU(Wlf2=;!Hv?q^8E6=07!)MhvpT95cH3ODW&-_?KSFd zUfzIG(V7$J_{5HBu;Zb|Jirsodms0ln=khr(ue>K0dYKl0a-o;b*bABJXk$(qZJcq zX{tz;wmK{%rV{570c%e~6V`Le_k`7TXaLtSMD$rXHqr_x2RvQ!cm<0_EmR`$f;3rp z5S@XM$GSs_MK$0syg0W65X6i9lG0MQB!mZe)RvSM*Ottped*FAOSFHY4RCU%RkS8UIgFL)8$XHazbs=Rq7txw%(a&|AdgzMNVwcXs zTPUd3*(9=nMcy-SIs%W4MoMc#(WMDYd_YcqIDJ%8nNQU4UD8Bjn?y}aklVL5=<~Hg zf@MNZ!f#sg625#DiDYOCKZ$VDdmE=g6O;*sWr99QHWXk3j~Wc|;>fzPvBa&*u3twz zT<6!jsS>k}*EzN;9QW>ezpl#uq4hb=0C0X@{Y2o zoGNh-*OTcbgUFHpH$t|Md~sl9h@f>9=bN{P%rrU3%t^+&jMGeRG?{#dmYIosfeFHb z%8nh;cA=w8Ik>~^^gDv7lH0j+Ck@#hJ9fGq(awN+xFeysoh3^Bj-BkGPL&>}VMa<(SX(U>SKtk2&D%7c-3BXYnO8HZW zpHqOUB1oNvRoOGAPerGLQ|@H;)ald7DFAoslsla{b<%MxL_2vhI^|C{aM(%hI&Gv& z4+`0l6ZFd9&}hgB-vxIb+(l<*m>&?jaW!1#+4x*uki!K?Sm_+mC(@=&9%1sZd$@kk zMn&`RT_Dn2Cl8)j=INCOR@`_)DwISuWjUAe&52$i2Ak9(S#(8)u-YaQ{A7JvK{J$* zJT#h@Ocj3viDEuAIqFg=Vt_MoOqQuRt3| zRp({dhqEp{AcS^7^DpPQ<|=DF;dhh@bqed8sP-;CLBNJmk}86se*Omrv#FlDq>;ye zCv)luc;H0B2m>~}a`g5s@u+6*Ijp&OCga}eZTtj^$i#!fFi4(G@|~1hnv=|_;C_o1 zf|K&1hNnKXMaUEj0|Awy;AW_b7Z*}YMT@g=%)zw7OF}Vjsauveuzk!{7Rb3Jb=qFa z!Y|EfU0zaHx^&sHWlLjwid&jl0{t3b8t2q#CD<;;o^PG736*N|QLp!#)Z=3w)Iw@XRrMWF|06eV76q4`ukK zS+ONDe~B|Of{45=*O~=whg!k~HOmH(Vy>iATd<%)JW1gq{cXSv7p^aF$eZMeH)L76 z^?B1js3hnWtc#3r<#na?L+gTWw=V3C*Oj^xO1fR>?(SaK&4%yx>q2lBbdRk20NLeC zUS&bu=!OEX#p5@!z_P!aHYVnpsv;yLCX^KB6prb|kXI}b%qyk7(q9}vIPr)GE)`({ zbRfVKY^iR|0=nUCSs*tuSd@#7;b82I4B| z(1c!3R)=HY0<7CCDfT{IzRjD5EF-U8VB^!>v}wff=FZQM5JLDUP$Y5W&t_?;oy`M} zv#75CsWropCb^YLD~T<4>c!J%&#H+w0n7HX61virI~AVv5YDr9C$w%ndGf?bcI$W# z>GC@CRCF?+6sWQ3PZrZNP^)r)HvFlQ3A~7_DZ{w=ADB{ye529rLLVMaA~>u1tUdPq=#AvTRmQ0N7=Q%K#pYZVp{j)niS?%tPF z@7=o>eHq~UJxQnMr8!(LhbUCz z$el(ujEt zqeCz`i_c9D_OrTrmE65+4RQ+-$YY06pEFnJK4kC;BIyi!qMagJ8aWXwoaM&;M={Sd zHOYqZ6)MSvhjO&_1%tYaWXUP&b+JZbg$Z=}G||)#At2^jNOk*+&s6rd7f|f^Kz``Ma`LckdFFX4sp%FypiU-Xb1xHI)DR% z=7f_V?wSvR!4cNO^WdoC{GZHkwAbWy!ClojNCpO1A;(~=N8ia8*y4z;sG)3$0t~m3 zGNFJ!Ogh0FIRcG@(mNRb5Gs%}+|k)p?QAk!u#j4UB?>ZGmBfig;f6oxf~X1>*5nhU zZD{fHl4PlX6S~;ov2>|l(g5((4(y^OZfUqIS(=AyOP9q zM0uJZrH&U8ZaTb=R^iPIli88uJrQtoUDMOIYw4UT>_Qi-fvZKkwNJq!fJoN?Pcw{UnrPe~|vZZBcL6&c{oMz)> z>FhKKX69~88LDtrJ(5n~TyK8Hq4m?&ty_;EWU+qT`Wm?O>!R*xT?4SBRnR=p9jqIs z{3nX*u2ZAh{kj52P;sC%qEy!9?L_gq!zfM1YX$2M5+akTi8l?WiPnB9u{t0OR_)88 z5b@*n$%mJaroqsV0dh2|TXO`wwvKMg4Gt>Kr5M*wgr`BHlom)iu!U;N>_8)iXvECU z9Tg}S?aZY#EE+L)?flKIV0UF#xI40Su-mhCZ2Mig-Me?~{uLDE3CXTH0IO&28bK%m z;quO+T$NN4&hO;U#Dj?>RmpMTmGiHgX5aCCniSaaT5N-MWQ8%S)6OH2|D- z0w)i$wG-4~1#0>!g@``PsY4NI6pQpB9SsfF;S(b^ws~aJGbu6YjqosGxT!+GlAh7V z4a(tbk|QyVOQE>Dz{&Q(Gw$>ZF%kKeNcOdLpcpcV~S0%B?bH1JH!_;d}1>bm~GUFl8s$Eq*Cz-n-}T24DKSd4UvoW&~kQ&THKX(2-3k+|4yA z=c*j5w;C0bgO;MF1D`+TeWq_!E4ADEzEL6lF`Bd_^=p%;#pGIc@|vZ*)Fys@Z2}x3 z6R(U@=$5FKVv>PJO8!u=tUP8T1xY)sOW8=Dh6InFO_4F>qxFLLx>z$R>cY@@vi-$L zeA@T|$XC7a&j`a1G05N>DZP1OqEwyvE8}@3&{lzgG4LC1uIGT}xpR3`n!~wKbCEi5 zoa>u|x!`f`M-+~vg!2wG>)B|<`5)jRmDHREaYfw#cPG&_r8UN+G)_koN)M{QMo-?k zQltZ%a*>AYP~x^{rl@Fn3r0mLA#KUkS;WxGuKUhBtFBI*ghZVbi>fm`005H2yJ`fg zjDRS@7=NVVVX!4Z2}((Xf5ufn#(1u@Ztjedl znf&>Be5ySrpfqB-2p1p(q$nV>@G6QSraTj%Sj_^@DhVL@ z9Riu(KD;A~wk(?ztV@;R&Ykb>D(;4ZyLJJ^ENizr+!gH(b|sYBZoem>CBJ9)?mc_l z?qE-{JKV!wO1LMsBiydcZVqv~@;b}z1iFsw%0ki@5VNZ8tb?KQyqfPe0-|~2Y8eM> zxIM8P%Lqqs#dK$dIHQJ%)=5M2V03xeItY2*c7OjNOD^g2JSwtzq(Wz@;f-0Zs2DXN2T4&TPgIA27*ts0bohtK}3h2^slK2VjxYLkm_Bb6WSU1 z#J%`l=1WkRfAHYpg9q+@_Q8Yu{$A-pazA?Tv-@mtj28DFu<`JrZQpkf^3e1?>*#)? zHM8g8!-w&MhWqz*kdE~1E{eJo!PwpN2HuDlgyeOCwluE$GII~uHm2ki=fAAo35Z}m z%MtR>@CZ3(3O}h;c^Z@>oh($$xx-LTys}*6Iz+qnqj!+ zebq4BfN^VC;2MqpW%^yDUk$zj<*|yPX+)Pq6^$ZhQ))BKK*_65gu@|==5*-@KH`TA z#>0bxx4pnmnjiO%OHW6J{`~oAu$|tZm=Ja9nAy_;#uU?m;LLy8?IhG1v zVzlSiG%Revg0jMn(xpSK^%6ja1Ld&80F$AJD8oZKSwJ~W??7M)xULJ|rY#qC9fY<; z@J#cU5c;` zmeiJ(mPClu6taHtG*h4ET2^+Z-j5?g)63nA5;c|WQKf8Hq}6Eanef0q7-hSti{d(M z$QX6sF@tR=Ye7pE$k4pyU&@6WdbLuu7Uhq6$ zpd9W~#lBv){D#bWl3S*wlGEhp`tp=^99mcGPMP~@cYR7yAnMi@46)rmtWCP}hSme! z2v;yl0omQd>*|oNcE)6VW&=7$<$YByS9pnEp8#fIT{!Pe{g`gF4!#9|T0YQu} zJCnD7AIX%b@sFm?+LNbDd%DvPSKOQt> zK_zb6;|(cOg-$PS9*3Yjjvo_Fj~$DSN5}l}x?@MvW`C@h?mAJ?Gt;9_9QP-RK$sKj zl<3t1yl(Yma;i?3CB!QBdHMh>mGP`G5@EWz^9Wz1VM=$gpfvSM463p*ZeuSH6H`PC zeo7vVNhD#|QBKOJzeakZ2J^;@9ZS(^xtH=>rUkv0yNM2Uw`Pee0*i4}%#808#2jh9 zf`}=_iH4*+Ck|RM1m1_0;P2tI2M-_7pv{L5{R8(fxSu?%6G@@rgXCfOz&|We>NrYF zr25=bUK%C;)ZFyIo^${HgGY}ZK8hax2fcupYr++T+FC3Xi-lNFY;e_uQ8AL@DZX35 zb$m~6;w~KkPme$l#m9U1ZW%>w$vw9Uz?2R|q#RK`nd<~IvtZSsPG3Zq>yxvXE~`n2 zRQeI(y1s^e>FRCm7LkBfeH!J=H)K)?YOZ9i&^3nP?%CZp^}Nz7gC1; zs+5$fl&5^%O4}{}X-JAcH!Jl^ScF18mNRF59Hu1C2wz%wJhtf3dGqJNI*NmBY#T&} znuq6x&GFn>PqC=A!7-W}G=D_-PjeenVyYQp)@haEGzOm`B}>akQyyOd^nGZ}iNm%&eGg{Ub_U&$;IVxvmv7a!pwqtk$+ zv+yL4bc?6MK-3^h!4N_codk!~rFqfIRHN~WM!$SUDnWrB2!(Yqlw-xiEq@jazAXA# zF&r*;D;k$C1B@@ftUaDB?KM)ah+fW8cPk1y(ef4Lm-Bk=%XSbi%=tN;U!JFe7kGJ= zmddg$*BURYqe)k}ybRUrsmXV|MB!2dYi;pQQuxb}o4#oSD({?bf<{n8BIqIw^`CTCam30A$JOyD<`93+Fum%!0fW+#iMud?b2q-C<8WkTm zZahf1dj0wh8%PJmY#=B7RO+Zm6A-_wPa~JmXG+=0QR>axdO{RD^~;mbK`WqVu+z%6 z;^Xev4ABqt9ZlEA%g2gGj~<1GN26nPs%f7)7991*g5wp|!^c9^Y0I*!ay&W_z`@4! z%%Y+(QCu87smz{}Wm0^G5X2fH;m(C;Ba)CBF34$z;ndK=;zb!wP29%hiHu}uKwJ_V z6A(4vn`HYdjd1ZQ7CY6H8G>*VIoWS_J)E?8FR<LdTvbhSNtl$OU|`A5_20AuE(M-Hy$ z9z4Lmd;jNLkFMdKu1j@Wnh5oHeWQDg3Zd$)AcozSq#S)2K*^Be@79T$ykj=%)hnod3X~8W2}J_7}uiIB#$cdG+~%2 z|JovH0wV=sBj=(_IxCZuS^`PNG!)QF*nEv-&^$?@Wvlvy)1g8tvJhLaVsV`Wq+GQc z$`FxpnuRsqoU|Df<+A66N{}Q*2~)8G2 zlIj_Ld8008>ayIj=h(rPM6RyaT)n7a`J?@k0OkjlpFq%DGQ=Pagmf3`I>D#y zZSY^Fi_q_1cXrUHKxf)QosKS3m!c+-QeVUVz4X77 zCKJKn5dfk!;2AN}Ws040-81U|UWNGug)-N#KfEp=NSQ?+zH6efyE|DMbjOrm!pRt3 zMr+G!g0)8|(VE7!Qy_(<;^?PqLv-iC?##OGgQUZvDMvR9Z>%xpUb$z8%%5_~M@GKc zWFZ+5QjXU_hUW!PCbNAoA-iYCj_o^0xbYU5ELwbV=g!KmI&+q?h;|pG9`^voaCfpN z0eEFf1^D^B&%d!37^>{syKf)0eQ&4|z0tUDpEYXJz45bsY`#I=4&uN!Xy7S({k}RK zMjfs`^9E;2PslEg-z&VnF|@Zy;uF1^s!$2f5`Nw$7%GmYi}EfDr$W{tqNC7sDu>8z z4{(gZTg#kp9jouJ8B(B`8 ze~Gq~hZd-$3xzgQ=d5MsKp~W1_GCUvBZL&uC5M{Dkv9Fl4&9g_M6{CE9Y1pW7r}q8TYX+?>MPIke1;=H$}t`gAXC9;{}x zn#Ca;ZBOLM)T?t4q;p25%7=5OfmJC{tq`BHz^r`2{Ar15Nt9`;yxf42#TIKSM2H*N zgdv)(&yz{?{1j$2Aq!~LLQy>hNW}tA^e;AbrGy#f3#AW(D`U(5Toq)gO1c6*&}Z?| zrHdCQ%7T@yi!84PdXd)yOr`slCqz2|9mTJRmQR<$G#-kgFN0P}6Z+9M;iL|GRvWMu zsH$Dqg{xEeRpW~4%Df#CuPCp~zbq^}T6AE%vb4gl%!1!4=T27C+qpR}y0--78&Jdo zJ#h8Q3dY+1n!iMTE(u8zsPq)#CI14x>P;GFS=w9IXTYC^NS4y@F|kwylRc9-c6IXE zbu!NxQ;MY#XbnXPkgU@?p>Ep4(Z?UP<4afXhlOu@U+K7fO$S=)74p`%hf1vjt5g*h zCqAyP+To&)aM~yHGV9ip^kW{_szo-7=9}&A{?BW3qUqnQ30FsJ>Q}E`v&KrYCRiO) zj;!IpwQC@*Nc+pR^{IE4C%d(^?i#|?k~4i_tvLa1(kkZUijUc>EY(WOGU`;0;0mr> zB^?DjYpBwlyDB>iNM;nNWffJoX9npoOpVu<7#&K7J~~F;qesQh^r2ZG8}LQh*aQjd3y*$)VRQZ!c^g%P788;a0XT#eQ@;3S~iBxgZz zCOZAX8E_@CnrBoCv?(Mzb?WfRCP5X&s0VB#(3zabNv6ifr$N{$7#@R=IpNYBEgln1 zj~g1r^E`U1MV(9V=*<6mSHC> z80nCV7bT6*Mw-am5w!CY|BIRa>x4sv1Eu3m;X?jgftH1`Yha2bTXbg{+yOfjQ+NT% zJOu?B?*rSyl%w=Mj$0F}@J@c(7YweD)(DH#gp@qkjK3-fuaCb;9tYo)ALpJt`TDW{ z+C9#FO>^{h{>j&0fBpEQuM1DUW)JNlCHXqwm^{zYv0hY89zVm`o`N@3vJV}anAeoX z1-R}Zp;TQKV)X&B(aK&|IQWl1`C= zHSgpf71XCWrYJ5=8kv(nS2K$Zk)6u4FBQuyB8ez(pp50SMc^sZ$1g1}p9#%USqdt} zN{7=mV|-jWw4$_fbVVMxz5MbQD}xp9t_)TsE3<$5x2wu4b5fYKmGO$qN~m{W#lL;3 zHBI5Brvk!a9xD@;+M}Annhuxj677O`l_dc#SrxZ9B;8iiXcmZGLcJ=pt;s#D*d>on zq-A4gyH)k(T}S;C+B%qzU6J7`3CxODYI+#``-!5ZH7mn8rw>vyJ8Ra_EPQhd@_fj0 z!7`%{8Zw%iWMTg3yewZ!X&uQssK_R~u=-0W_uIAa!Lsrix4Pc=2IbaVTwMTl)ZA(a zxO(;9L%5tk_rcms_gXJMZuiXknJLlCE$f&)1}iSgF?)*4 zIio5ACLdvuXguZM;C9cfFUZgB$j?N%vDKYf)Mte9 zl(6Fw@5bk9zF5B}2d!|dN-c_82*U#U5Ebe679}5%mmls6-*o#vcr$p*Qx3fu?EA%= zF%TT33 z**16p81nWfFoZP!#|bi{G^EOF2PC>W}gkCr&Q z)5{#iU0Xt7HrXpnV5$-yuj7jBVih-aC+nnpc~3B#0iVpS7N4&(V~4?uE;e8bFJcw( z>iNsh$!0<|nNV9OQ_4#5A#sHRSpVaD82STqjbyMHqX_6v%n!>#vhvZx`{tX4XeG*Dz&9QQTTM$UCkP3d(v9IOWC2M#-@Zv6(9|pg z$i(ukfRCx5At*QSzj}tA{N#pY;&pR;vp_BK2hf_B%E#iwu#73x7-GWz65%W0OK~b)9AxYO+s`Ir>o}U)6kreeSx5~{kQqg7t zPH8w*RAPB{ACbP}eqoIBdgP|l}1k+CbOKFpyY@XGQZ-*)G=xb@2SX}5_+lJtE~)Q9$8sjwQAMMm8(|ym8Df~WqrB<2jf+>mC>qt z?Xvw2B1ROqGK7pF>)>xkAf;QG)9I?f6JPAg@`{&xI(jD4BQLJxvN{&bO^1m0+A zBl>U3?>gmf{VU!q?@?-(_q@d3xP20Q49H?W7J)wEBa&vu*-EtX83vrl#j2bh>1!OW zzN0bybTvSe5hvxg4{QiYxrL5KOAB8|84Aus`=R?R7>VRlUqqb}enXz&N1A|$@6|PD z<~8TmA^#3^XW<%JuKO2jojj=$cR+8=+S;1Du(;Zv>*M})pilg||KY9Ii zc2UyxRHgEImKM(uA0r{d)xTWx$=Wgy_T6Qhz@TEW%#9mr8_N=h5##978T*Iv%rZwl zf=T~(BnuLwZJEJs31cobFPaAVL!HzgTT{$%Hx5s?Cm>fR3;e1n!cc!Xd0yjvSwL8W zanU~iW_I73`-b1lz4hjsZ&u%`+yCZUZ@snu%{Tp9;eP+tbNksyAGX^6)|>nHM{oK4 z&%L#Ozgj3fQ4iMct>HHz>zi+iv2SMfy?JmS(N1Yh_$fsh?=7SbS#gxBl!(j%(n>n$ zv&x{9qC%QLlrb=a3`VIi2xS{l%$ev#G@}xHte_dm6&|Sc$5XSh1%1A^NnHwcFE*>2 zp_JJ&(aRjY5a#i&e>!N0StLl+iq{v>h$usnqO;xWx*IKh$M{LOQUgV@07;=kCBx-%SLeQJ#iS9^!icyyCXcnG2f}zu-JVk41(8{rCx{@^Lc^vg9 z){Ffo?cF4Z#bLyvJNF+X6iqgqM@yti!i0quhzvb6nsbV%r2dTaPt_{s6Li-z5;F}b z#G4AsUB40C%%XqXt@w5$_%vrET8X&>L>KqvPw#;lz$5rbXTc^`_d(XProvESBB%;5 zbzrm}e17wdz*+m+fyt34MPT?XY^;47JaOMPvhnS=-+iY=_1oaP=-b?P?2W&z`{tV` zPrmu~n{V8=P2aHBo}{(=HhwZ)NHwe)XWf)`L{)-SUh-=>Z6AZ#5Z7(~D_xKKs$Sxh znqsXvUAnicmU^^zq0Rw{*WH`JQtwkh{qmj$)BJ@AM`YrZhn5b8)U$@PNG-aX4XMDU zej}OuE9pcN-e|;$31!uas|s!^#0h8p)oCQq(vU_pqwyD}z94;5_Eo7fM2|?BwCOwr za>kN6E5R7qoP(NwN8^!|8E%10AnVVNcb$?pCTw58eb4aWAIGh4&VpDsH`m-ecTQz) z(I`7-Zajx^DF#d8oPcwP;^q_$sI#fL**Wp{z1g67b}%Pl9nH=gaYtsqU@T6LwI+cW z4$q!F!YL2J-Mo2k%X70Zy^JiS27iZ|i}KBy(WVVi(+GRbsIzb=O0)R*U?QgCQ3Nn8FOn&1B2s=WE%uS=V6f=t{S$4yX#OD@Rx5USSoj3SK$9s*&oeuNrPw zmRFT1FYsh-+rw7&ESmhvoVIIn%<^)6WoE_l8a~}A&~tH9Jp!_nW*U8Iv2Z6c)Gd7x z(xz!bP*}cLl_>y2VP!=9Pigl_&!#-4 z?R6^v`t>q29$KB3u3i1fnnP8mHH*DVX|3)k354;7TU%LCR_jX@Y!Zc+Ae3TsRJ8ld*t!JEKA^3zwN!w{4RI zkG4&>JYp6?GSZxh>udsrGP5R>nI$3K+=P&w60nHZ3S(4o18i_MpL(4ztU;df)Pxsk z*jOLzj>si@lu+hOoUDJM zrNpWeLqB(46d*8go%}rfqWXF13-@_Wu&qGXrc}T}TCv+f*N`H;S`S+FIDRZSp5s*k zYaw+IGk)}h=2fuy79u9WYcR{Is3+l0302{h0i8{<%qdteG4TF!Da{{JpmV~8?c;-O zFfj!JCa=fLX$n{YgTiUD z0x!$wky?~{RnAs|nSx*Rb)6KZkXU)*0jvKu_v9O~GYeV$cR3NZ_8oHdyTZ4$eD}To z?x){>|NVF0efN8cD&K!cE0yn~?`EcZXcUzx$#+>!0Gc84H~vXpF#fjuWad){OX`An zE=7J{E+TsTH(#Nn6>gfOU#hOE|2Nm>Z} zZ}gF=OJey&cxv&`3cl*Nr1?cmF+_M&J^?@Z41s0)^ucfXRcLAo`+_87ZJyfNct%sM z|10&4G)C9Lo^q_)ma?bmOzBHMf1a$#w^Hm3n(Qqi(Jy8u9`{&sfZrP;Gzdg&!MJFwzs zXJ4BA(r2?XQo(L^qn=`A_MCXOWbX%avYhW@QjHpVk(OW z>8e7859f9l#noF7ITzq^$U#vYzt8H+ z;wwYo$~7UG%Mjxd{LC~nHmRPDoH|b$(-d_pvWe@r`~9`QmZU|?4zKpF2dh7NJ^$M4 zufO)1e?56EeBHkWAz4>m%e?;D=<7M{s=hu`@RY8Fo3?&;b!N@#_t#|Bt{GjM!+@`i zyK}PS6@0?OxPue^kzE#T<{6?wjI)ZzS9!SUJgk|gk{wt0zV|f^?mU&;*xAPpMZ^tsXSKzu&!GxBu<8_wRq_?YI5@>^pDo_ixv|!{$40 zzr(&JR`2Ym%I6_%Y!fXICiT6fI&bc&DAPzeyTi=PTW64EQQlAktO1B+ z9PhfJZp~j1pVSCXf8yt`2tc) z^OlcfP3=Bw!BIh&Yv93^LHtH!xtzti?2(fV7*GipeBdsfy~sq4BBGi?0w1H?jGB!P zC#3#o&~(hVxr);iQGewbv-K>L1f$jUYyNspnhd$CB-Atp8r@>%R!FR=?nqxXy$6CB za#=4DOC%x|i{Mw`P5;#l!!D#FTS$Iku{Y&!^rQi83K+%0^0!4%6?9g; zzyCdK)#Cf#|Ngu3_u=p3?}Hzzl<51?51#db?|=S#VHh5B#P8uQ74cUU|LwD)w&X7a zHvEF%GQQ^IN#*OzHz?ho;=I3$=_)AW4K>3-1q7aufWcaH0Hsw5a_y3iM zi`un5NSb_P(NT3#Zr>ye3({(&>`X1l!zv*;ylit zCQt5EaPr65I-(?8B?<*|56{WWMVp3mD(KYrW!dVN4b~eYkuja%Ixr^-^|VeV?W2k+JuL{5{+$;Xo{42Drs=ivs4&!e0>N6b3aeAIrSo&2BY?Xt_eG@fqVFR>4tRG;Y4W zIs&=L>)F>{f6cvKeXRgq`I~^c{%;v&eH(7VQd=5C1=e@oKJ-pq_)ZwAcuMq6p87kX zW6hzoHNH(l`qVIaXS$vPh^Nlv!EP4h9@t+mkF&X#hvl6n8tct@oRfM^1F!{HDzGA5 zDNGZnxpLjkg7S}c?5J&LBo8S^@izV=qTBjY7>ZaW-)PE(OsWwq9VioljqJbSD)@@N zPx#MM7I;OpGR$^Ubz|0)s`7Q2SqiCIS$Bx>N|lpEG3dkz(r`%u;DBqE?ZUI0@( zsxZ@$OY1al1z|~XN0Kk=M}P$7$bw2^~bp0 z<6Liif+>tZDSvvnQ$^&gGNTfF#rDrha1|<}L@6fxH`|J$dGZgBGqWG_f}4+W;%arG z36G^Rhj@@;>Xk1H=ulSb8`P?dy#50DOl8nXE| zh_X)?GkFj(Q1K@-C;k~~2KZv}$dVl-XRn8uG0Z${N;4;3`j;}ZU-Gld#>#qwr|>8= zYJHIQ%1a?UEr_8hSfiI3wZSHfml95f!}z5Gv&s4uHKkU0B(sOf`&FVZ5!njxv^fLI z^O~e_tVpSr`A_Cbh2g)Dm)kP!ZAtq~Xvv=*9cKQ$$WsOu(iKZf}E77g^cULB>GOw^Gh?1{>z8sZT z|9`&T1jx$zT=%UtuO65+#_a6*p0iKwd+t4T&%IT*O6Udz=P3h%&;#8x4G5x9lbASw zto8qY!y3Aq88z91%phoz9ZjN1GzvzIQ`BhGFv%zgC^&2C{+{<+WY?)mZmsWIQ_pL` z_xqmbectyU%!oSjGhpY8PS;WD3_DWXHg$G(cCdAH1|7}GJw5cDS#Ef)Ngonlr#n9X zdmSm{Z!n_(X9eR3S-TW!qn)P}pr@D~U7bQ%7b(i}o8lHv$?A6xzkZg`DOXrZ{ET#s znWd}o5n9xdCK#J*B**tE1^^Z~(-1uavPowDs@Vm3n$;`nE|FfTdF`Zi3c=`W&kJsEs6E3Nm%ZJ(qsojCr@ImanfI$njB9Wo-oun%3Xi{5H@d8 zeI1;YL8|&$>0U!=-B6nD>8#c(Tc4$!s<}F2^ zmKQHyGF%)5o{cRim6y0uYDu+}DzD;pQ|YWb1ycYjwgS<`609a%rCaZeu!lX?Fy8PY z!cC<`5g5(VKSOVf0>R%!pk}`F9eQGNF=36H3y-nKx+% zE7R&%$=M@`P5(fQciUp5+-}Tt+kQ+?oZA_qi?6*8G+&Teoi6 z;_oV zR|hDHA`RW^DSTTPC*L-DBmFv@jQ;QiVN%?Kgs>7`?tzYPhP!fazPW4Ho58O9?mfG9 z?cN>iD)D5VCxK?L%fDIN#a%ADf;XFW!}Hv@H(U7uMp+Trz40Z4?C<#jvWg{3Wf)6} za^qghbB!15UoF2Dy&9StPOAocw&XFqM~DiZTw?*77DY~5$Ii3Q`R7}uJGDQ{G(q?5 z|6u0QvyhV63%VdT;ie2Ivl}X_V$svRe^VXHGZ}W0b|i(N*Q0 zdj`|+FOalZ$y()=n23M|^%FCoZs~+3A>>AKRL zU2!L56*QyHOjlR8gOiOLy~*!~0WI^H zeM*Y44#lf+d9{TEm>9jlUo_(DFjJLN`MYfXD=nx^1(&oXQ;EndHC=JlRe~mS<*x`J zWs0S@(pqM$S*(=KyyVh|vM5ZvgjF81;-kB0bfYAySD#JcT@Z-}pViwlIC&Vxyf)0NFb$L}m`5842_DG)qv5Z#_LjGXue|d*;jCc>`nj zikZV2AJfNY&V-}A@^ulXJp;W%$V@s;k(nV?x;b>P&@@VdW}Z2^j0-?8g~_Oe2uIhd zqJm(I(hO~q!Z#C`d^^0QiV><_P7XkPz~25mBKtlS#m2yOhDy4R1}0nl=bY{WZ)B zOyBaI_?GmyDV}O|7OK9mlZ3Jj^u@$YnnzRLaICW;?a8j!M(pHlp`uk);)NMJ+~B%% zs4&lOZ1e3^P5MTeF^mYEOZ2yS&YU@O*~u)qIawu_;(o?xESp{I>%+t6iovwBj-X71 zCruD)l4pu@`U8yI5i(IRQ}u`@l^@WTvRx70`_ZL&L@Ah!Fl=+i!WiM1y3cJ*LDTw{ z(&pNh)Ybv^yV>2Acx!1(V3dWS0;yPPs+BJu+V(f5aqV041FRscAF7|O>kt#S%p^d% zNYNSrf|L5G&`J4}uE8cbdmM2eemMSl&Jr%PtsrcaiwSTJWz_Cq3wNe>>X;uq z<)0p*J`E=ES<)4?<)0sB!wFEBY|j(nX+m2{ps7jI`b+RbUnQ2Ce(lwW%BQ3y=zQaK z{MOeiZ}>laQHYd&gm)sPxTotk{Vum>*xo(6_w3!XXBWuav&-);@Oby`J$r(^+1D-*s;k{~!%& z>Q;r=rZeU)_nTiM>}2{Alzy24sw%nin2n-bzx1-)U98>Uw-E*5L}4dq4LW;3hKilQ z6e~N!OQywL(4BO)5L$XVVlhif&l<^~q?Z7SuGh&)R%OzFdGm=;j_eG6#bU|7qD`~~ zbe_pxJFN)jetwphgW2{Q6m{tI&`^s6s1-dl!8L~}+ z&C}D86^@)uPM{H!$qCF#;P&eJwBhn=lY9{x5xfnfAZo@dBzuL z*O}?)0;IVv_}LM5mcZv22-~f_TYGmWH=V9KuLoV7zN^p)WO*v+&hX5#&J8Vgxv+t+4 zucsAW(h4#$%`+o;Wne7O4fJAR?}A*3VP?_`jTeToCeFKLT@PpRR6_g zy>q_qirzcjV;giSAGwS@F7b4;SS&i1%Y#T%kMTPyfvsIjrrvpHj4q89=kKsWs*%5T zdyZg|`fG9)kCHC^E^~M@FgCm;SqClr)-X;Z60GXh-yD-elE!A;wS=qzIi!dM%Bsvj zjA)wyqIENILx%d95@n?SoGP*Ibl>c1pEbl}B||-}mvN)s8U7%$uFVI6`-iq;scs`H z6y2AVTnx7s(2^3C%eLe;Z{D(HbA3y*Zn$jOyxDDOZQSE#^X7Oa8HT$bo+Y=L4Y$^=<<|Y! zKUh?jgpHX-F_VlQ=7`H7_Yti;CUzn_Srb?>md74@{4vj(S<*g_)9tzQiFjvL9UiQG ztnukjaqxc%gc=;k?~X)g0g0qXQq@iO;z(JUFIxAB(mF3=d7?V~D`(3L1xc!EY6qf- zKL2_Ko`!IA_%6Iz!BdcX6YQmShr3$$>;aRo6Dsa?yW_o0Jlwl)@9w?(!o5Xq?V;bB z-M4SwUcWE9ms`I#WxLy3un+Iv?e>o3o*wM}Lvm-2+ns^c!LG`irCt6F2TfDI_f%2c z8(AUMy!p%c&k*X%v`-! z?$I$I)eHkkQr^d3V7@!nBXf_WA7*4x+9nk}{Ik$z`PsA$DN${lPuUP<_v0p$p!x?> zWmNUbJsvM)#_g%L?*UjIu5Kr1 z)DDKZ4caq&m?~-edQ@pRp3&#QurTSAxrz0ii5IEl*{C1}3`S@Y5piK}yKR6_k;8{wv}lmv zk6Tg{xg;79luLpV(h|72l6R@na@Q&dLO<;;@R`87(5HgHHw8i9xDC7y_;9eyr^3Le z`0N%4sn6GS?8ZRXGQfndWxg@0wN#ENj5dpuc3D!jly4Dz%I_qpOtzQs5y<2hzMZ*( zX64?BEX^uh>=?ZC9i@yIV6TY`45cSr6o0ejW=j^`bo0$O-5lLC+Q`Z4B61=~*=%HP zczvE(xz}G$Q%x(Pl(e%orSfvdq>3UMXS7D0pOcsPoC8ZUv-_F+Kh)RM2oTBBEi`my zGMA45ey02U138*ul(0>KIk!E%jnZdMqH|jf5at0ZWUWBUp)DgsS5Z|U-6U|X+FaV? zHmA14n^T*r#?|iwQZskC#>Q=x4mC#@i?_b5$T#L&-@iQ~%&Y8@gP<8mnp8aj=#Q+_ z6=}U|>p1j3JvZr%L3-L88@0s90p#!-KAL?D0qPzjFQo4;1| z4pmhU3XoXwa|N3*puW)-qX_UMXcN6mS146O8a^{%CwMKuskKC{d*h2%iBvt)Tv};Q zG$vPW*Kouns54-4MNTluW_R}Q+Z*mH?B}Wd`}alrf#!b49_~x+b^FqL z_qn~5eR+{qNIgp$RU7==vv;=vdAGy;-L;z^?%q5LaHCHpg;gQd_6ATLE~R{Ce+{6H zr1eIp0I#Svs$CIZ{>b0`E`0f)b+(|=u0Z-*@sw+AQs_$e>O_MbS;|6fVkt#Y3db2_ zseh`B5w5DTlF>WK68&!|(kJ!$C+~wON}dRmDpifIZi~7wsqvT1qNeDXurqulVwybB zF!!fP@}@io@b0m1IiJG9WpXm>6L6mOV-4H-^T4#+5Qjg2srHs6Wa}mjnRsjmfhi%e zZFzgCt=`_;*52Nxy}b=Sw*4!7Y&TN+_MA!2%J{70=*sa~Db7%ebNt|hBHvp?CgYnu zADvm%M1{(vArqH6IJ*m*bhOq5853XZ>2YCj!le=OaF9NvTPz@S1#6R~81@=!RD%0T zvrJ1xaKFkjD;3S?lkKUYdo9VGX=)}Jm{y~n=&d)!BwR=5j9Nz#jv4Dbny~}sxy~%y z>qO7s#^yV9=E^n-C+sfuMBVA0Zr4+U0X*HqbAJUO`DkOedmP|< z(45^}u_1zcNK(1NB5pt-bo%tp!H&O{a%{wh1W^$j-K%yPt|EpNfm6b~k%fu>!K$B- ze~L~9tbVH!uEzb!$>rrhRk8vpPOiJ^AFkA}KLx4m+(K1POAP4+m8wKjGFzCTxMC@K zvVKX5*F9NL&Rvw_?YIc>Sh^r!-U1UfSfAWYDzoF^A|BnO%K4mLC9yLarzWV6RMN3R zn@TUhT-j5bi3*>&tUD_ZZsc|SRadj&kr$<_tJa;OW|C0Ha9-L*xaXjr5-gOa63B1Q}pVmZv4Z(^7_MAXoAEjb;Lx0OZ9oCN$% z#sGzPWH3a-MOD-xL|W{YqyS;QR4PHm5PueY$#WIL29Sf!rG>%*@Pm6n1r%}{!o$!7 zrO*e3kVjz{RKgZL$vy2Z{D;N^J!wzrG2cOtf{^dwgUAS)ft&-5U=ir7lyXb-n*>Wn zB;u0LE)teKT%2A+`)a{DQ~3kP=(^jRZu@rYyr7y_N@+W9!96&5(~+7F1|-bOou^RGlvLnpV-8*Af^C;A5s=WzXE~e(+ec zF5;m+ogi6jm+_)sI)DmD_+{M~*H)m8YwTMwDwQhW>DjGEnFWNep(1UYbnAs6y0e z^G~USs$fRRj8>R@awLu(9R*4`M6)Tyf)IMbCDU@0v~^GZou&;vg%%Y`De37Z8C@Vm zpuGGG&5+{-Ch8$U-AhFiY&HmJxD=eB$KtO6hOY7Hb)?^yMK3|j99*1OROg;OkdG@k zDp`rp+`Bh0M5YX%2|p|QMssKXTl)_j*suMq16;WSxwm+V+yDO7TW=lU`9nOd53%zE z&)79zv7b-a4~E5Jx9^|!=nfZgTKql3UcfB^;}XjohQA|qYj*P<==&zZ^$+12f2{(m z#5HwQ{zzTxZ+#U@81^OuCSG!{&=4y(__wtD3?t=>A^Z}oWe;9pa_|d9vw@AZqp^X1 zqea;iMzR;2wZij>V%30*oxeu1?$rDYVC!~{c>>V#=IK0WhbpMNi|$t$-cikccb=hkpUU z%x!><4K2A8W(u9{)x`G|UGtKq?d+geZ$hXb~YCEr=p4DdT!Jv*Ll4nW4a#aeHKW z7{-@M+CQh!A?i91u9&(Nbm=erXy9S(=ap4lDdSAEJYk#eJ)WW ze(fpx?cu8gxNTqidgW`;SDSR^p;9TJWw|)3k|tvHiYo&x913Mw=jQSXbS+wu6uIgy z8L9NG1S^|fSH|WxpOLDpU3Vdqj;N9rB~`gF!>`F2m}Dk|lXBMH`29eNtUDYR;WqUX|z0 zOIpV^#T`dcg@|srg2s8A*Q=aLyoIBdzvQx!%zavv47K zXLp@u@X}>8KYcArw30=N=B4KnM`AQpKV+`-XJ^lz-5)o`CoiRNK8uwG(1$%D*!`LF~PJ;2yyx`_DCDiTP!~6XMC3;YO zW0g{;6}_caLT2x$80$bY#81JjdpKax=49RN40!dA=dgL7;HW(cy~JUhgEn(qvn9xz^91b&+?ZBZ!2M)Ode|7NSp+koc9XiAfAJ8?= z95{3kuDV0b##kO6Iusrlp|40V3u^bj<@UEiS-AQZq}@vqw#6iELRW{s?05aW>1fKX zZ@y_~0-O*~U^O|5l1;2(6lBTn0=aY#E96Vme{~ckcM4I~mN9j6s zkLGP0AZrk`Vnt}egIJ39>sWkS=T%Hg8m4NhP-;3hWMXvia$C?|FnS7$QCn7wjM@r@&NjH28t2+tL`_3y zdwZoV!^bLZ>2{Ec0&aY5+YsMwfC4QBdL~1yV%C>r~Dr8Ki`EV~eyjC#0b#q*V!5gDXf1$n*%aaEht7 zB3Gl`v#R=Oq9i3Lr_;}pSKG>r=>bL4u!G7S-fv8iG(?p}5Hz0l}nTt(>OzDDI%x@g#)J4S1!ov9jQ*P zPSO&z4q@vV0y$BMwqW9L<1Ftd7q+OOb3-g)UXI=#s-q>!n{{z^=FGwFVi)k_(*3=z zW|`^QI=cq38FYI;tPMNA&nvDInF4T?mmJO*!am<6pJ{YH>YMkL&$2}Jp_%wagML7tn+hGY~?8ziKR=j5<>HJD*& z_OiYv@W`ca)+|b;SgA=n=qO=QphUAKQQ11KF4k_i?F#}~LQJ!D5wDoJTdP|#hCHD& zhaBCsv9c+HFby~I2yD8ICGKZHrQd*P-H_S1VMDa>Y#t{YpR<8`8{sWX&FY@t7)a^z zO*Uf?j|8bwwPqai6E|13Wc3S>_%(bZW~;SRCtB&UYR%JdlzSu$knc-kS`c>8@ zyL%z6vF`=NkhlaSb~98?LwZb_Eqi24qGY*im|R{2U;?mcZ;URD_qqLJBtk)Ha&7oL z)eDE-zl48&E?BRn4{K2dk z>kpn|K;|w)HCc;vm0k_@eaW<{X~JAw~2(5L{RqMSc|DuS2ah;1nSe60yqMVfG?*p zPeM{&`X^DQC{+4lXf4g4NF!Cb#ZWx^#~58dlF7%!lkoEO?g3K#h=`cnKW|g8{1ZU*Y1a zww7^-NeI~1Hg4SNHd4EioO}jXuD#{V$9U}8mP)w7UFxUGA?Y?n(pO!lP?DOf<#-1s zhMI66o4T1i$xj|}fs{|Op@y&@TVxH}gdI(6Xt5G1R~*a(3}V8&tU-<7a#vIlV#5SV z#2MNQE;yDJI~S`IMkY$m#9b2FoqF}4CJ;>{U6dCjrxPn0Wz|g-D16j`yNi|;bPad)%PvPblA3I-#HNd!x}1|6;ZhN7gUiUWz(X;U@JFq+21 zB=yMfIMLbsrBf?YSdSdJ3N9mC6vojJBekj(RsXB?!x$~)4Ws2{ugenVa@plrozYKN;D9T z_91#wij;b)l%@04B;Q+sh|P4hXk-Id!D7`z`DN}{9BIlRGn35NtubBDXzrBD^|v&A z``fn=$wf)JZ?#B98Wb6nNK4Bo(~#&$W1=dc9-o(BZWV*q3y6-jTj=#cLB`3_pi1D* zojXUR&;B`))jn&peP3#J#aetTv(icV)9Rnp9X0)(dS@Qf6g3wlaiV}x31H~Ht+o47 z)|dhpW8-49IiGm6gPYOVT=K}DMOzyBB{t%7OuyPr}%LGJf$w zMJjzv6u`fI@!a1sm7O6841K3}QWx2_zyJNKj3SC&r=>*IPn=pVG;R{F1v+~?kspK4 zUS}3r+~J}i$lW9EaPYP}oIY|mK2kpHj-(EU zN5&jJqK_PDY=__GLG^Hv8~dW*VAFvEd@r^`0pfKZKWyK=xBR{)emrD^g29 zE&(CkChDM;B*LH_X2osZP6Xv6#By0#9gFsC>{*ngHcJvE)@=M>hEt*%tM;KI`3ItZ zCHzw%l*abw*?0zuE-7hNfEZn&?c#J@oa%EdZ+itC zG$Wh3D6bz^6|~}LURAQS+HEu6w)N6W<$+t@5a%FG#y^VH7ga9|(esE$G<|h)9{jO| zlM1qGv1fxuz}8LF0s}1*Bq1ll!if`T`0y zo3ntWiffsHoxDqD`e=EtQXL!d$Wxt5acm)Ijs8!D1d=OCYZhQ_mR{dkLEp&PeVBx7 z{r%e2bCI4qCs5-{ME|EpXQG=lT)|o7*5lcFR%UTXONQxvC#{J^o^?O*X>Y%s=|Jf_ z$QBiZP}mhMj+aEGJm{ow8oQ=|0xHboCXh+H0(55MI1HsAgE()XjO&$LwN|OrD67_V zuT~8zU#!)*Q>*F&+*a&TtyF8Sl44KSs;*M3*_TzSgOyPY-lABcvgjOyO+grh!Y*Z2 z%v&f(Zw5Z55%eXO}Cd9LQL?c-PtAwH<-J_mFQQp|OBidQ8<2Xx1Kb2xR zuMDEmJ>#DB%=Tm9O$CT3+`ZHaC0@amwWg1N;80dNE5wTRyKr6i6bbO`-S^f$?AH;P zq4Gly9E6XsGCq(xQF z+-h=BjVc_{ebVt6G6A51w>lCifCVe(SvO<=F@vjZ#T19cD$`m?S10oin0SyuDEf|b zbQ~6jq!GE_i8j~8JC@ib;}%_N-er9BK|#W{^60XY_f%EW)_=T5)YhYtJB;gH-0wB)`_NkLP;#>}27{Vw_~$sT3+ zJ=H?$&S*)Xf}9K(<(q_#rias-tq6*goC-{t2{CnQ%))HMbz_z}8;*LsigjKvS=p}A zYA>QD=O34$8!x*&GM_cN^xQ-(0?UR}w}PhxqedoNbWuc^Q_Y~9;1DWGPh!;`CO|?= zwSIcWB@dTeOm^MGN)#~>A+3=HDQo(q5X=dRgO+Q$)>%6(e;ixqzgfZ=y&S;C4S21J zb@3)ulNOb3q-BMsQ1DnKbQ|_%A!A=KJAjDP)X`CAG$xaYeRGMNhxNZf7d+nGoo+>wJbj4D{H(R&&y6cV`2mhoOIt_d;* z;L-cYq35^-Qf+Us=oPiF&nGs(J`o1(adj zT#2x2V-c_#<{)4Y#J=JR0J(&o4NFZ+fS?*yFk&mz}~iPc$&DZUIP%eZ1tw`r1UmZRZQWAhMSszp0hmfa^7iQ)1K`MGzLKj5^ESU3 z4|nsX0G~B4@-l`YA!Nl=F27`S|8V#S%Ow`rsbUV7jIa)Q@*WSG#vDdgNM78-rbhxT z7V?Wm>K2oAxDMAlckZNG#`Tjd4*k?qPsv}UwC0~l(W}zbXvcW|dG|t#ikSF|GFaWq z1!+rmNTSjnb-sXxlp=vz+*K7TQ@j1%43=iFzW^;^=KknF{*ZL!;rLKd2s;SE!o$N+ zgoa3X2jw8(k;>8Rkt4?dVdmJ;qt#!*_Lu{{c|StL2AbzEUVfXIi1uRHj9Rg1y1+j3t9o%x7p-$EZbx zX%uB>uQVo8lGrntt^U>g?_Od0AJWqLT-{6l#Sv;@(Lf@#uyEs^`zJ9ItMxfq)MS5X z0JZg0_1cP>zfQ#ElWu4JNmdJed`I*|R%&14aji&wyk;ny|P&Ih2z-R?^ zuKk|20umA&A{SdtP6~}|Zd_~feDb(5F4eZ0Js3AanzMmWeX45<#|<>3DN>a0%6I<0 zlDbx>RIPFlv01~NDW|IHOoJ9bOk%DI=B%loYQZRB9IGhayMM>NH;{N=cx!k9wlbQo2X&z6_S=FDnPnxY&PDEBG zv5Bgj#oE!VaEa+ELdHE!qN7nd>KRG+Aw$5jJXSqKc8h`Aa7z7X8FPLokeogY;usvS+Y+MHkZ}RsuXv zz}Ps5G^Dz^qoYM9D#^)8$G>!@yE+wbuBzNiEIF;#3Trrv`pfZ?5SPkgM0@TDe-S6!2C79JR&_ zh^vNq#2tw9KF>GR=JKjFmWa?s%t5G9Y4o&~+Oz>LH z1cNl({&!MxCgyaz{ZHbKr;&6pE>MHW76{{&e5J;Rs#BUqRY3UWHZ>WPM5pQox6yAX z0ju14IJUvBFKuw^-G+14^FV~-#t3J3*7K3{dOo2j=;@;a_^f9D=>g!z4V$8kMKKg9 zsU{TmLDI7PT6AtUK*z!^GJN%SsncY%#V+v5P=m_qpcmBTt|MXivyl&Dx;2bcl*TU^ zr#Fnqhn!S4Sm$<>cKRp3%*v98n5USar{;W)(bU0y^PCRZn)v?rG74X`6s(+71$7!m zs(LV#4E3)M!+U(g8aCvmhPzrcufV!K_M#Be`_&eLEDR2$4*EkQ2;NAtNyEtn4c^Y{ z?vW$)qhB&)B@jD)!f5smkKSRc98aBa$Im`?`~;WdXZ909-!XsOoyh6~?zm@f)fb*P z@y@Yh@0|wRMnJHZ1C9a3-;#J+sRCYzfJP7ipB00|Ewv+ zELQ$dijI+Ljjxhc`k%&q$ls_ls^W@j{Ot>>H^RZ^U*MH|p4akO6&Y=IyhAy*KK0Zy z2uF!Wg^|<0-r;wC;fb9)FjRN2oTt4*dY5Q1@xOA9rC3Kb{V3k*XtkKYK6d6FAoMk& zHji?IfsR>wS<%lE&q+bQ^p7881p#L4DdsxT3{^Z;Lm&){=tTbW`Y~tx3&*!uWzeq1 zN9`k#dhiP6r)zHRX-kiTd=w(be& z+t`~+lOh>7^vTTH3Jj#FpFy=5Fc{E_;;#;;mgvf~5@Wrg9GQEENYOFb(Jt7aAOw_D zbUk?mX$U6tqOAqcytI>`l-+K7qFP9+{~@a$?Be)u9#ctZt4<<(TFf3$8Xk+NGyocU@+1^ z+iNsN7ncIzEGZ17%dg7xgYPk%7h)@K9 zmqnMF9*2Ua5M`&H>EA>kayPn=`R~>iG&waXm^?-qSl*t*Q`MdGCt1;W&_b_nLTX}l z0^=ITk1z69A{Bdj!=54qMv9Cxdt%I0g>2|%omuZ*-nE?88{Pwrjp#rw=5$)Z2ty_i zvNKd-#xgW=tf_^(7<#8V)>sL+YEk4EWXfR;tVN}_H=5=9a&lLJXV~v~*`s-7);cRL zSb!peo`L4oswPSE1?rJm=txIa*KEwqb7#!d4A_hrmlrMxOHzr=UJB8NVL<&c75T7A zl`&hx9UYVggpYB(I505CHaM_qurw47mIgKrX6l23)w-{>;+iH-DgJ2;Lh(u?#dWeF zcB~7Ffxa_8Bk&pLe2t(^e#sJvM1N<7iF*}VHA76&48_Rk)_{dohTVcPWc0!M_A7_1{R#CylPpA`Gqg$dG&tQt3jEE{p-`05!%8|0L_Pd~d;Q z|K45=W)El@X|@248KGY5nrz=bur0o?v~_4pTJ0etTX| z=S=v8>s!~s$aTrpI=4QxE?}>$Z{iuzQ7mn?TYDSqgbnp zg1(oF3KxlX?!_j99dhr5@VQY+rvBz>7Ab>v&u~UTfwrJN8(vKRq8U(j7Z|%|Txo1&Tz>4> zvE#;$1#-F_H@3z{0`^#%FTtE{2Z^N`8Vz!uSk6#;lNq8y+yHnh7~UpAw=CI3!~=M% za|qR7JR9MoDx$QVX2b*+54RKzN8wAgk|*+xpd`5uhcy~r*@~P&%GfYC=%(T19O1t< z41M=Cn?s;XO>lL3>eUq+IiQtIFcSfX3X0HVl#ZSpWHp0_4YF_yCT1EL=r~SO83Alz zU#Y*+x2C^1XYQQ-xuDI@EwOau@HwokG*^o&+3x3#Wib8}NvUVz=) z!TvF`6CV}9Xb!2k>H7X2+m+*u^dEeX3Y0}^ts>p>NV}<1`=J44AM+}Gm0`2~%9bmxQZZ3Imsh&W>z6f4 z^j&rdwM6t@lbFZLeeosX#d(V~q5IMo0z8v`(PS$iPDcJ^VB7#*9k$%71}U0bAiscf z0?rTOp1?+`t8h4T=5m|RFhEENm@~@(AvjFr(nS>OysP7!8LIQzJ3|myVPM-kq8TYh z_-0V&F+=ZDGw$g~>r5a8^%Pj`>a5rthydG^Xs=1d7^&!H7y4&Qfx|pMH)HQc%eC`t zZUF`=;<0>Ph;S^ES`EQNU_l%ORXt{@CZGqmXYNqzgkKcW?14Eci!?{+uv`vY=u>FC zT3Cs5mZ}LWc~u5$XvGZLuv#w+)a!%w!GYSKA1V*787d8ae<(Fr9rA;zA!ihf>IG2} z8R=^2ib{x>r8y;Z;vh3Kyip+>dO70jGmy|@kwy!u^W$ra_RpDr z#lhT$s;p^%&#b;G;GmQ1Qa9LZCkficeLw{U!PvL-mNRG z57wQteyx2Vx#D^~--V0Ykl|VYR?0Qp5NsS~7A?OB{hErgW>LDE<1MX{n2jBwsr5ls z`lLhjfq#&fYGECf8`%?)NnF)N(Ej8n>TzdKO!)H*3Ns+8BY|lelLPw`;f_4VdXD%3 z5Ez!Ufj|doOaFZOh3DOi&9YCCm85e#Q)NTU(e;@qCJX#d{g<`;)2T?&PQw$KL_GC*EN@_6{cN@mM}AKPx!$ zcZgT;n$#h&RSzDNv$_v&719IQJ#Js#IEw?U*+YA9gm+PoEZVFC{@92a2lQCJVIyo` zd;Qf{0#@_3ZV<;3D(VDjG|Na(+9U%FcmJE`pM9RZs`XQ1P%E*ERr(s59<3`H|z$Bpx2b3!Y( z>2YHtJ}ET7di+*c3}hWp7Gu@y;oC-VZLCF30$0*H&IZ&bgWieCvK**5o7N(t88k^W zX~g8o2o+Txlj>t|p}VM6%H|R_9rfKMO_!+>sbq=2EWSL%L=74AqlLDbF;0aR97aMq z$ylF+tHJc)8WCWF?@W(WJ8PCd4SPmQFiJCOH|CMI$w0p${7_F#E0~+=uK`HMAzF(T zmYFWYnA7?5=Ew6=^WD7Cd_S)|Kjgljm$_D-Q8Ao05erl_uz#-a$5rj)Q1AN6BuR=? zFxh$$kSTWjTO?$@3yw1V4Q0hI=sKEZpt4h5WMurb>6K~esq}O-+pJvWaKGlJ3~Q`I zien5&-B-`m`~rbgEN%FxoPV%YuE--C5sv{d<+T$^FT2EFn!W_0+TgpwMaEJVn}Mal zg-wV@Re!aVNtQQ+fp@l=It`QIf39A`cqmK=<~c><>#PixqPCdsp1HDn5QV7ZE&l0h zW*o7|8oA(LMycb08CfCo-xzZ5jF1BmQfD?bIwc9TYPJu9?&6-fH$4ksnBfiaeQ7B} z-yh5g=lXfkwPmK;dB|8MXA@wjdd)4k8BwUH4FlrLPR-v&GUc{g9Sdic7sYDbkSeUW ztjFyPgLD|gVVaf=e9=_Z;h=`Kf%@{n%+SzaIMlp!XlUuurOTErU3&Mj6uVm*ut!7b z!J&AtAh}qt5BPcxG}h`-Z6tL@ZIvX!8dp3vt9m+`gAhP^f;7&FkdFK+(ljiEOW?KW z_@845@O^{Z)dGoFw6#H#P7aNS|MqBwR!OeX`S?xsfKp7143wVUjaHQtZ@7UfD`i$$ zuP!MiN;KBNWkIKV?4o5vNpV1^)MzG0#+vu6mq|*p^+&3A17@D-;CR5XB8m3Y_Lx<> zw6Mt5t#nY}x6-aiucP0TK}im7%n6K$z7!Qii9f@mUtbjBwEJ}__?KC`Zf&%#b?w@< z;E|m>@wyhCw7Yy>Z5>~@eqD8a9^7)zZ7AWs;<#?Y!gcDEgoSlR5?J%bHq<1GrEG7k zu}xE?`$3aTGuf;xXXbvK;iwoql)+{7Kg<90;h#MsA?bhd1%>|~eG~-)0p;KUK#sm{ zX9mUNSj76Nr=w^7?l%qosW_&i`3qWxQcGkpPgP3NYn@DW-1|4q27{Q7i5}Y{1gaUr z?QKRzBI2~W1L^&=ELIMe-VTp6fum#4@8~=6u?)UwcszaLczB|EG6UP9_cEv6doMnf zfA`%}r%t`=Po>_gvAa`+_fMVXnbXlJFnKET?y2`{r<|eBoy>qocj8>3@7OVs@5J%9 z#Z|73=m!Nyg2Sx>AIxJ@!(@T*jea-3&(RwxJ5>!PyLU&s@_55Iss4@Dq-(>5C%o=n z{U3yKZJ-UzDMpgLWkF1Dv3iOijjUI&>?n5hw8(&6cW;ke8 zCR8UPQ6`4x2b0p1sT`Vd8eN#PR*mT5Jh(Hjlw}|7*sTSsY$PmY!z-@T$NI$7XZ_YeMwaUTW^pyyAS0F;H<{IKMP+V18=B zzsyHf&R>aT)zbJXSlH+KMBS3F|2hv}&3N(yUDUHon+u}*p|^MH`w zyE1*a&Gea$p1cN8NqIDdtV~at8cvD6R#dBoIy;>$DrywGk^$^rgoLUiT5|?hm+7L7 z1=MW%Yl@iyd7`Pj+~LL5i*iJSWuI0oTNBaGSOa;*2@@wyoG@X+#4wSOsL1iew^;T~ zzWewrCMnBdYFSLtZ@}mW$vZoj!#&?|-;C1qdrTXy>B#e^@aJey?x4zv)vjuHl{`({ z8>8bxKHr;?Ql!uIB|0+FH!=;t;xo>M^pG#Ph3VsJazIgODEaNT#*6?+ z#8w65`BJ)Eirg@dN&|cW=;IP*qbMdvnn4(b6+$tUuvU~IS_f;63St#Wm>R4Mh0g`=BBIB(Oqnsa9aTuN zF`twg>)T2!DN?4iSld!iNs%o9-2al5i8nN(){uW(uM^|ei*f7LFJ1QqBO7#U+$ML{ zhU=Q_331M^&8%CyzMgO{SU&=R$VK0cZ?|E6ZG$=-ouy12Lwg)a)8ZDiA3Ial14T{M ztKm_#A-F4Hp5{#MdAhtk%Uzn>YZ#~gkrDK^QGnu5N>vfyxnG^jVfI(>j^?BigYmd)Pq4cn z!3Rm)zSLXcf$|}LuvJ2j?QN=sMi2f^vm2mW+EdE`!K^-2DN zJYUDh1LGr%d@nFAh9{cdK@L);eCHii8PkUk`6F4RAdMiw!M{I1ux39p)wCe4FCHrw zt_|aW(eL_O&@Luw%mEt)>+3kjv~VylmY0PrQSKEwH(m)}9`RdRSr`a_5(J47&rKll z*=Mm>pACNV|0{l z7_Ect1syB-DRtmyYflq@mCHJj98JuebTW;T{RJ^S{qExUk`^=`7du#okT1hAJcfH` zTh^3PnGI}1`{1TdVG+xKrMIp&BUSx~(Ttq2j^;zm)0)Q31qN^89!~YX0DY6rNP>x+KDGYb@61 z=k&QWiH(uLDmRuJC2iOVNg^uy3IK2xmx@lpdrF8v>T7^6P$dx=D5p2-$V&dzrkAd% zOe0Akc+)9(WS1nov`hP7~T7sRUMM7E}hr@LdY!2+Rzg zX|7yqGH>mS6pOXAFgO8`r>p61Mo~8!p|EB~3uhplg2>sPfiC1c#DTzpuE-W3>5e4* zd{4bML?rv!>3&ccqWS2saHMI_*$blU+`<9@6Dgel7Ur1tt%-GI%aXcV+@IR_iPLzT z(VPWog2hctoms*J)g_3)taIwID0>G9OHmaBBIM|vz~rpgf_esuMT5amlfiG<(9lqQ zSze@DzO24Hw_?TemCOCg%nBZ^Y+12##fp_Hb-f~3ndN$=TajAnSEQG(2w|mP9xlr- zT{Z+T!=cRJ&`@PCB!ntIHG>x$(DxWL3{^)eCnnaKwH^?8r~xZ^#f!@{S_H;LGD6>F zwMz{{cSK8vtCR6tNq0Y*Fu1vVQ+Q(rGSaz8_0Ze+8>*+_g3SE+CIrKIIsPTinahhx zx8iKz7)uIPXrs+Z0aEfUh>3WLm83gy5bfu;WvJYRSfn{wq)5LI-KVYzH5U$T7`7fB zuEz$2g6q~t>#~3j(&Yrab@AGw@enNj``X;S++XL`X88b8Ftt8hhl#o&0(@>`nQxZC z@^p*<_><`w{mJxH2@$;)Y%hVnX7Z!*wm8JOAEj6x!abPe39-bq&U5ak4?m*yoku_N z3xuB7#{iYb0G~=&U($hgCzV4x3O}V4Ddl)-nGlv@Bnp|V-ApV*GtFNPUtu|r;5GHI zvxrqvXk(gq8G)Bo2cjo66CD_VuV~JqOh%{|9xbB3lzrn(VyVWFy!?pW$=@i2!%Jc2$f z=r2GXx&xz0yP7X57Mh#8PmZV(vf6_`B+jn})OsyNf+?DecWvTCfq)I0d+ERF^g*&& zBz%#0jbcjAN>o2<>6&L0Eu}5vY5&we>W#nv6$ZI^0u&krbtMuKuK87fDr{m+=tLO$ zUli=rCPAV9S%FnVRBm)X$&jmYjB3FD*4ze!;&3pie=6+yH&gpT`T^$urif?#c@)xC zXc5wt6cUYWQKPhI1iTOIMPoDPjXm$*8Zr=x7{SS$3u8 z^-MuAJU^V&GdzVsbAqJHdg2$%fS>GmF-ODVRv#i3=1oL zS?EVHrU_N2RLnf4gv!~B=eI22(7{F5D;5kVkg(u7T`gG1W#z)uf_PzyL-M)yBv%U- zF1+qKKH0AHwMZDgRrO56^jZBT9}R~1p{4=*ecxZrg2BDem|7#hlYT!Pj_fy$x>KFL zt4uqBn@+X{Ka?UVNMunOUr2G?^rV# zxFG&!_AEvC(THDV{9CH4qDrXFK9X5^dA%JS9V?;ZAS;gvh%*@Zu7SE*w9~QZwN}7} zk;3L0JW}4e@0mYZPZXji-Bh~O#@{nD>Z!;a6(rSk;pdQ4!rGfxP~niep(yFi9M!rX z{w5Zmx*5xmw!CD)N%x%+Qn7qn2p&sVquD!Yu5fU%>H=R5=>LmQhd7yW9Kk48&#Fim z4n{+zr4=+EAY2wF99*$#Wq#GFm23m6&RMBD?0UGeahKaQD^s8_#}`Q|W^h%bp>QxY z5ZAMkn*m)INKk%MKx<4_aYuZ6=GI$p zcM#D+sUb=+{Vf_U2nVqkhy#QE1`V}g`p<$I>o?=hb1LSLhM|I}5#5FHtaR_Jpf}ya zw7W@|;++N?7zfboeV3`z)IiFkTrD#%(klLKax@9-ue7X(gje*tgEHeY$ zqzTb~Ze4DzDEQdgk$R}RT&>j}ts7;!(LNb&Zb1L(dsH_h^*_G5Dv=Zblhs04&eAh^ zwTNgngVsL~{NU?4t~Ji|Ioff^BR=z>mQj*4Py*v;5C8lT5;T&5bWjL`hC+!8q{b6Z zaImFA|4EF`1cpzuTt!at$7KGSoKNgMIiFraP^}ZvfpiqS-mJul1ksz&uoeH1;WX6# z-rBntA-Lb+c9vXPF%p>wgi0q*L8_BDny20ei0^Y_@=qN5 z;FO^a5JEx`&wrTuc<{sF9|1o0k3af^n@`+_!#@7_W1ji=Bd$OE*nODQt^4>~J>u>M zr?n^F%HVj~pZZ7Wh{81a2^sB|5gLKx2}+0W9DDoixB0DsIlYV{k+iB`nu&S{x#-@? zQ{FV$8|?jC#c~=^R5`(faumoxDH6z$NBr7E*-Ep$JLAId0q{Nu`hWPbD`>VrALR}T=tNio;(&!aFh6y~YjVP40lAC0+2Y2!5o;~1OP*ohea@-2Occrb0 zK9mX_uZDj5B5M;utt~z2d<@duWPmxz5x@y9Y{j5cr1WB&J$A_`B}#Qf*FhbzsMSD1 z=Brxa%R_Zoi&blG zP{5DN4cuYZ!yAHy?gqbbG>Y;%zMgLidDRz&=**x)y_FeL2%;h-9Zu%w%tcaSs-7zm zduHd3$S#s93Y!)2E8Wd9RJ&QPq@%Oiq3L$lFyQVQ8vpT9{j^|eYKohhpTYzjX5md~ z(#eHhG5pj~(wSCQl*$xP-IYuWLSr(?mR`{6CH0G2IC#v?^X%NTlY<7*(00Iyq!0&0xEFU|OpI(`>a;p~F81zhg%5kkN_4v=0Iw zx*VO8>Spx76e&#YQH}hIf@ES&=GNQHbuD~{vZJjR(rhJ1tzk)e9yz4z|5se8l5zKUB+)_d1- zT}FhWM)d`i^+RAaQJ3k>1XCHZnoK$`TAqeqBm%9VUcYb1pn=Sf)S8&VT&0f4VbedP zes3Z5VViyPup>$H^I!O1=Cpt_BgWj0|3?A_M>RQMqbc!I0V$G)oLP=W zzN$LfUrW92e$SK}7WiORj7(LxyNs-K8fF7&P-BPiDhoKON065OXcJXEs(aAX9WT9u zs(j~!KiTx&$#;>J=skC;^nP$UpWrV1AoKqFK(qKhbo>Znh99+j^3g|ZAAR!4N1p^d z;?^E~^il9hK_B56|B?HowehSz{;~Tg2Wdb0IR3Cjiu6O2CNy=Y)9;@SA?bVXqG`o+ zlCR)Baa-ScTLB!kIZ}gkM@Apww>N}Z_~y{TLqIe~0%!mJfB^uz!@U{KAz0Q#b}JKE zk(b~TiCJb=-2Y@9kyjWNXXqqr^CBlDdOamEH6)IzBS}`h;D6d3Lvff~&QP2u{mwj^ z5?$$^$RH}+5gx& zpgmhj+DvQ=x}NCHcau`*drFQGX6xCIlquQ@*KmQPmtYoNsswA&rWh~^)L)geOo=0B zQ)b;sKc#eafbg1jb%52Ho-sXUB)Ha)RAXX<(K<{G`y6=L4WMCvUTK(q3_UlmAU_q8 zw1S6PUpT_JCpz9>C=6~WFZ4H*i2J7qcxZ3Z@DPxB1FI6{uIDb}DpLywZlE$2Qv4Ap z&F6}QN37dyKfbM-TNEHMUFQV-ISk&ueyVG;VpblZwy16mu3cAA@mlrp*QPg7RHU{D z4c)ZJ5IE&)T&Bot{XfiTRk#KP&Y~b+(ZV3ADyp`KK350-6*~7|)3nr4$ahXlcsbcL z@9h$Q@i2RxQTQhJD;L(2KE?DT+7xBK^8N&@Vw%!UI7$NA>>v?|x%>o83jTLWVaO&Mt-d2dgU ztfCdniU_89WM#}NS+X8Re_hVbRFc6q3f$xgppZlfzLf(Kx4_CA*f;~q=#JDP;3CL) z@~8om;Nq|t5gJ8S(o`RkKgIj3r)9GiK_pR|Ap$mjIi~80%F3JxNVh5n{8p`YYf`J1 zu1VjurgB$lO?X#v&0TBmx{KYd$#Ju0jpJVVu4s*0U1HCzf}*S4Dz`GVs=5*vHdsDv z*>Wz+jF+NvW}uF!4Qtg(HinK4a5vJcsd7|un6A-c#`1v1L}L=LmGK&UH^m4!3X;LM zGfa+Su#e)ZqN0SRO&nK3)h|fTC!}hV#W);o)u zW<|)=YfDhD`QCfiu4P+$@4XH%-n%xwH^T$BwnZOkd}M{WwQJW_*5$z^WDVD6B}gk) zkPJ7bH*JhIvBo7eQLqWGN#MY4_F!8R*o2!L_yV|DW<{-njJF3LWF$(7Y2-z%_@PNR z?&s&~NQ(;n<)fxtWbF~X*@3Ka3f`bW-P3=^1akD}b5K)9c6JW(N$`e)KMZiMjsdXD zKh1s4eLgxImVWlhXP9+ z`)x}RieoWgGa&C@$F}@QWQvp{Oj|ba2q7cb8J|bxl3RaXdMp_A=TW^pFJP~XZ8ByG zovVzRb+o5%tF))JNTp-V5G}XmCgd&cF(H_kK7XQD3y6huVp^g9XfMW_Ad|(OnFOf+MeFhFh4~pddoGE z!O7JAJO_D}nbeqZPF(2L z(2^a_bfi32cT1UWjpD7h-g=u7sqS`K0+Em&`RHB7JLi2WNc3X}CrP7vhSj77g27-Y zf{F3U5E4oVR@YST8g}pBA@4ovUcX#d{-EsGn*xlV(JqUOZ-!t-VedI2-yY9MM z%p6*iMP9D1tqN9VP@@hrHmhh)Fcb`CF=8o92DMRD^rKR&pc?52AAMM65Kc%}M^Tzr z!qG2oWoDfXzmXvJ1Dk z6e#7-rZ;R~W3LIWo$`=0R&aL2trJcc2Bkc0ZjS z`2hU3uL@#7%rn+&Xg$*C5@gzw)T`~|Ve92`v#FSY-FWW9NqmGzzN zd-uF+0>mlWN%!eI_x3&K4(B}2{o_b63dP_IB1kdFR8$_L@WsR8BUI$%HdK z3BzpjXpVC7DXHb!&6$AdYLpy43pKb?No%cChugj{>rF_4O_7>(;Gb&y|Z`*Ti9} zeZ9aF;)#Qz&Oxfg(FxV{^ZvSKGXR0VB9<94mfkpJ_ZruQceM+a>sIDh>1u#P6ib2ik0va7|*C0Hg}mb5<+v=H_9Q3@dqbP*xdL!X@qGB4FMr zh(&UVFN)?^+|kWSvGp@UPDUox^o$NSBgM7fAkq9gvDjn()VwS^D^~2({pyu#r@D+_ z#=ufNz7@8bh%_$Q$$iwF1Pk5bHv1@0)SK(%dFU)8f5@MvI(O>nA@#^#FBq|0x@7y( zeqxSQ72=3eRtayPW50LjAj;zBprVk-g)$gYj^6!!_6RHolGm}DT`7$dnx8wwlo ziGn)}0?Vby1wWnvp@l0be5-&{%qcw`I8l#>O!lF=LMY<_x21$5MtEEZ+JsqV07;YUtBP7=hze2R32~H`RaVkW_T6WR%9h+y8BCru2MF^O)0PG`v^XUdkcn`2T@-OusR4Owwts{#@+rRY!XH} zvOgLbvtP1nGRtIs34i2$-`;ZshCpTVPPoW*Xvl$>Za6D$`Wt-v zaPQu{{WYZ7tR|wEW0QYkzlwIoO7jJ`1>FYU_f%Mel?6MIXA7vantTR~uPx#djlpN4 z&sv=h;OQR8z&72t$1(IY*X!fJC&%5R?uiV?V|VNTF3|7zZT=VnRFe9{x7;laxnJ@fQN1G7Tzh0&g;8P%{W}D!V0jDUPQA_w8 znkmrv&by|<^3F?leIIZWXB1ET=;Mz-Mgir?Qzt+2C&!;U$*s|Mr}*N@=u}o;@+TcP z_}rgr-pF^HvTNn!n2jfeq=H=ipzvV{E*b%xFw}ROP;B4%i|&Pc`>a3z<HvrK;{*k#Sc3lKpv|7|!oI$VVUW00))fT|c6DMA@oFu5pp!bDyRX*_i z^Un!ClToLr=P&;)P}KT={!Fw}a<>WJ)?Y5A7S?GKX7%i7E!Ov8oh(QZ^Nf#Yk3Gq= z^ki1bfPdnA(N3N~gG|nZNQJPs!$_z5P77mgq}s=j7f@@P%>ZP(ui}Txkk1M_ZBB&K z!Xeh22Foc~Hg$^Lpr3l%LDTB!xD#-k zSf5mePiCdn{v4j^CiZ}sbxVj$o`lA$Fi0-|9Fnf`n&@TEw2A<7Iz}LQfLdmD@P@;L zt4|7Z{G5#KGi)>Aurb#JGxI=!6~?8nK#Xm4#u<8+OpGmJ{ef35M2$@^?yP{EP#8&r z%hJo2RhDZpFh>S?U&q*3uuIsvifhzegjI4VxfTNnHo@!M4e8I5I*4v+*1+-$H$f`b z*47nRt_MioT*GSF(!Rd^mUi?%uC6_GOT^W;mnM2X4sZ?apIYBOvAw;WS(@HJ*mj}p zx(TSaDW;pcQj&dR<|b_#3Rr|R*py60L0A`Ebxo!jOFj-vEyFd1rL5Y5kkP4wy15iY z3ZM~O6RkE@{DZAl^Rse8MT{yH{II?S4Jx_%%PW^v=*x*N&V!y8YyF9vlZ9c9HU^|; z+OV>ocwb}eJxX>^G%=06-Q;!}(rdr^0noPVlmm$M_L=zF-|+J+Ub1^}7Vuo`J4=h} z0Osb-EP%;#k?QObT8ioq&=Ih7$+o2!lVO!HtWv?p%JRsna6U2g1eDi=Rbu7|_^X1Y zKf=vr9{)VLE2dBX_hpifMJN}=LB>*ngOP|HJn` z4j-K_a7+Nw0C3|ey`9q4ZA@{^B2%2IbCWA=OsP|WtKXQ{cb^16i~8=9CpUto=~E~D zNAAPSM<0F|KFDh-`X0ui@o2vW+GeKx3wP^J?(NSAF~Lj-r}>4Dk(tAaIZI%6uNQ&K zSFzB(7QOO+Bt%nW^QD)l?fK1bUa;$nFTAK~^IzL^^H-+Rx?i5HiayOZ1(-ki*^eQc zKbBHEmJKP-if96x|3Zm?`@tCul@%c|TM(-wpL)t2FC05gNzW6<+>^}^O{nHk)LKt3 zPtnQ)cq%S8QZpE_jRKA5TFx@BUn9d_DY<920Y28ii5f!9sS*;Y3fMZE-bvcUg zny{Oa87PU92;{AF1cD|rp{J1rO+0mU?$QDSJWv+rP*DaKDY)^xf~sj0t-mTqo{|KH z2&$H1&`5`d8(A%Di6~!%45iW2XjKg}4nmedl`d?wS`0j#z*~U{6`<&~>(=^pXX&`K z9{RcdW*`zY<=XCU;a3DX`L)|ouiJO<3-(WJ;VTo9w~6)k)Wk}A^MnZ#+9wE6$pqS3 zL${7jX-1?0yOA0HZzK}ecSG}ami*Qf)Lq-s-Mxki*seABgz&?xWGgglp4kk&^qT6@ zu~s#}FD1|dVLd%{MfLWu1!Q5g;QaZj8sJS?Q?7I8axt!o6$rBxrzf1BM3-h^tb{79 zR-oAi$}%)#t<^3;xaTe!yT=Iws&>5H12dlUQ?ah7EAD5+@Ba}2bR*t(_>&8Ut=pi*b#!r zuDoTVTfkuq5=%V|x*pJN1uWJoR4*xAif$`U(-)P#CwO60m4To+X%#fV8-$l;0|js! zQAr)vAP8U(_U6q_OU@%hAGxETm3#^Kn}Mskem9Wb0#}W;h3zFqojK5V=g#V`mO-KC z;NVxky88;Z`^R%LydJA8p&N5({+qw;t5kHH>2?N!BnhH{c zIiva*mVijoMbrgUSt6pCNxJL;!%nO~oG&;HJo!KT73z7^R97N;8U8-2z5!YlAf)M= z;iP3iv;rY5bJE6;v)bq>56NURUX$ac)n)U|916{<)hux1tTVtzSCEbMrrXA7x9GPd zIhsW4q}|>dgQG0~m(4Z7FanUEs5=nv_akSRT00`H2mDwDGkTCbSa zPVyz@1mZBRrOH2Q;HCR{%P$0$qzHim_gs!mS1+(D>OTP&FJLKE{z8J~i4*9x(9Kt& zo8o1FCmrL&H&U|yC{*I#I$Ij8MIt5AifL+O=|4ChiYb=)(MMdsOkGb&k3F@~or*VR zc>X=hxwo4uY}3YGa=E6sUas?~NV79&a<{$9Ws*DGu^uIsjb-94_oBZ}Q6li9c?nLx*nbjXfSfu%% z{BvW;+C2AMk~sw#f8l@be%6Ev`?H^-z_R=#D?gQc_FQSOsIXAUAIK}qh0_!EZ32tM zr;d{+dGg68qbJJ1;n)U^WN4|&cY^#|tn?@`vGk81wQ>eT7i&>1I?OEpnXTFcM;Kei z)aU?*+HzVDeMEzB4-|Ad#dVZGJ_f?MJ6`03^bVtt|87Xv3P~j>=g@j^v|7r}Zeb1;&_0pXP>n z(Un;a|ManjhHthrUhJ2U-^1=hdkwzXF*Lv>6m!)onr-Md>&~E0xzFL0mDvXj^h712 zo0{bE;g~AqY7+h#1iD*N%*zsd4-=a>2QVF)$*qz$7^H}qrqHWP_M1B9x!8{Z$m+zl z6?saX64NF#5My&^Lo?Ie0R31t9uRA1`uJ`W>qKs@Vjf4 z`)dd(E?u?+@{B3SEgrKJG}Hz4mLj|A)#-&~P5k`NUded@K*$vt8#H9nYbOojocMwi zRRs_ICCz$Bp`EC={-T0R%X8+?X;hgV&q~d7vx+mp!I_{T@mB~aPFZ`VyoF2#5O4np z!U+I+Nwz&^jkN~4x^&yc=(byJiW!?k%SlP+;zK~9>qG|FzIbcWwzE}H%cZ^ame-7G zHsT`%I~VA}?Gt#S(&`L!*Ey`QDjmqNoC&Ig`O2*;Bhi)`-E$=(mPGTdd(Pv9EpeCt zN04QU0g5JF*2NA%R$PlJ9q8c8FppBI5+5a_s)HI zUJ9djX|A7l=iH*sy&&#`?uzWLD+Up1OLuut&c>G#U*!^VsIQDK2R8fu0-A3x7g5KE z)`1eH9!lvFg!7xKhHZ)FnwH14V1vrWh7R}lgILWS2ve;46zq(4w@1e}?ZWPuO$d-d9 z9su8(L=r)`k&#HT$-Vm`^RCtm;?l!=!*E)VHrDtd@CH-lx~D#r-!rslkN(I6SA8|0 zzSf3qf{D&rf^-1gF?T$Ldnc# z0Rs=rFghG;n<+>*3WN{c@g}s-sn$wg`nBO;dFl|Tr|DyjLwC+79<&au6Se!h#v$AQ zj(0*e9nBlpQS=Ks*6WM*0Rl`nu{Gh10@6tn`zI9|1|Rj)#VY4vnU)qT8zYQW z_NtL3z#M5CrKXm(#NiVqkQf;xdMqhrvh)73)aB}OJx6k)D39eYmB5tX2s4bSpz&7T z%G_*8=i;PiZrP~%8kXl|@>>yE4k5OZ0f8ct=k+3n;ih5(5!X6qlytnTzu9R?JNoLx zTW$^Za7`q0nzvyrbwjC1cX9Rd5l^Oy0S$VR*_$f3p2|F)0gmX~o7PW&A=g`d$GRFE^njWc${K5-+rsWl{oMs?c6$r)xLAiPG=fq3cF|v3GG;awQn1TBBf`L0a zQ;Y86qwmZCg^OW|^7$aY28NZJO@4J0wDz*$3I#Sw!j;kT%!=h8qo5wLr5bA6oR0$+{pNT?n>e`_x6=x6W z3~V-xDSbbk00Wp(CBC}tDaAiT{IKgdO(fl5VfP?{>TX0?KCcJq)iEh9Ts|mPxGR8>nH{plrnfVqj7VLEEivVF4u4O+x2G42PlU7@3?W05 z4w0sl4H}rW{aT#DmY7UNx97g3$z-@K{}2B_RXLJs$x@X8GY{1}N`a_mjt;)hM>k|i zoua131d`M(z$Af_iSExi+653*>$D3bC36*nN=gEk`$IkVpKqdSqOM9|g$pKR@Zi0b zgC&9>YL=73RiY~Drb(;t!PLHJBBcBWMjHj9`Qr2w`nhLRHUP3E$3m za1xZHV-B2rM2F2s-D4?GvcxjvvpK|apfx@S1<~=Bz5)MC3CB(bCg`4RN_yoOjk%v@ zH7V1yvGrenX?C4ozraL|mBDljw21(ocp2GL{4Wqibie=WH;5;i;{_Q~EKBkv)GsN- z0UpODi4M^|Ich%iAEgjI$CyZ}7pP%lys24;$fXP}mYejUT;^TXZgYz_S5hBE$(2*3 z-f}+qmZ;Ry_*VWdNZO{KCy2G5>^A03A-aUeSSpy|E$|MD(|+P}OTz0(Xh z+C3IM9B1w68ayUS>hHqqW8;vAdpwb;5dkl0mnke3m%5BQ2e?0nRB{I;c zWysmbc!vEWB`cxBlLIcYwL?XN8Z$oh(1YP?5owS_Ek!Q1OvoX&w2eaJ-FM_nD?PQr z!xJ|cKK{h;F#|!|4nYi4dga#Xom2l-&ICm4TM>=nDM4mqGIUrG>_$Rij)7 zf*0nDnGMOqyqa8QSJ=>)?SSJ2R&G?`cu;Y!HF_bM@ERM);XUpnA(UEir;Mx1m$Nt8 zgwNRKj7ygGEQyJ9RE_La0JyE4&9W2WBi6m_EG^o_7ei-;yDozc3&Y5O*w|5>12%G` zbFRKDW>E?j9j9<)Kmz6H+?8I_<<~fjI+{C{NqmR^wip3S^iLUDi##c&e|mr~2QJ)p zTS#23|M-tzHv9`4lq)PX=%803G6whPxT%GDxyL4suHUOlXNwG|AYU2D)9p;%<#+kP z)b9G+XkO2i_smb3BMRC5%KChNWomx)$_(dQb@rmnomZcm)^e2e;N^jlVqOyHj-8&7 zVzfQIZM)wVkUta5^T3_27L|j<#!ASe;JtTTg9)D*pgL?Q-myVbQ|6{tCJ?N4PQRUc z=W=*h69H7KIo98NGp-!%F1 zMIQqOmV_aSa>e(nXf8S!Q8CvC5zLOj(!xl2- z7>@0M0qzmF?FpuQ3g}Qj1#PRHH6SQ+!e%w9v zgC%+eB0?wS2cpAl$^xWrWRLyot+S(6Sl5J&1y9d+4fOX&Q!Uy0XXxiqbhshE4|EJz?nc`y!Lu%U9k z9)5oYm;llNa$-?$5s+|iw~Ahg21?-c?-j7o05J_msmw4Da%M9xM0+ikHdRZta?XKk z4h-X(ab?$2ZUxx{aJurvqT?N3;eA%`Hm%KXgypX5XWu>sxb!S z#c>!FG%x4r0~BSH?jMD=p*v1(*gneno;6HMv8xOYUNF4zX4*2ycNU8~un=&PysxH--Dmmf+7e)$d zL^BE<9WyjrV*TGNH#?p~!3$$3XZF)ZM8jWR#v z3?bks;$+)jgd=7CF zBMnyvX!u1H7Bb>Tov#ZI1zQ>3lu_LlUwcH#( zyO2aSW=D{^YDbunp3Z!)PL)II!m8LDCmz$bOx?D;sJkMVt0e0-;$@Lo-O{C7mk`bX zz?MMTWITn%fyKK!%Zu>UEQ+|RTRX?W>`aoiKjYoj#W~Ty#l05XShA!at+Qgb8lP0< z1hb+F;Sy3ONt&@NDCcid&XfQj)*4v1Mtf@74iLK%#IE#@9uI1gWdzq!<%qyP2oeA{ zCTW7UNTiO^)V{Gy+!Qi|)&Xxy`g?4r<((dbY0i8z0UGD7Ea*kY$x{!FwJ>H~2MCy^ zt~xY7edYYhmGQi++Wh*YgGvRxd{BW7w=<$9z`^UvXrFS+cy@GnBu_1-(u7eE$HFUv zI1Xp{e>RngYAEBsL2Ean+hrEI?Mt`aMx!{flw0Y{yG8qm6<-W%Nd-aYER0bzG;6%R zRiO%xi-EJWx>IY0Xp%VHq5Azf=4A536i3;cySGe4F#u{LFWmmLP%YXAQ8U6;A$2Hp z5K`qd*u)mn5v|01Rgu{Q$QH|60uYHYC4;oiP_!REx zzzC%);U-NH^v^))+|i=V_h1a}_*obh@sTFwaiAUg8;zeo%92U{Y4}+QLU)eP4np^w zu+AK$^lZQUl7Bf5r6Zr{Uu`nMQx)CJ^2lAZ2g-G9a`Wrld zCAgX~Jbp-}G4^vC)2BAMQ%xEf%3O-86u|vZCK>mBcsKoLvWr>Ol6&@WeCAET-J5Vz zF*#XCu){4UZovAmqgxrxGw4EQWrA+QU~_#&0y z_(vGqKAd6+RSdp0;d9Yb{~&5+K5@C=jsn)w51giKyYEPE0NQqsLfcaYZ87sTuC|4W zf^RGRo`B{fd`FyLLM4J_50JNoYs?i3$Aq}OC~BvRo0!!H#(o^{o#Kib zb6L^qWW>G!TS7b)uv0gVxI%TB$3==hR!O3XQAad0KWip20Cdar9Hx2Yi-Jj)S;=qF zxpki{-AzU4SDqgG5gDKCg2;7X%vEi)AuI_@|i0^@c4pGzm9~F$G2>`mzhL~Box@SRUKHDde*L=b;3ZxWe3UbzQ zQz3xC6wmlw8)lZ-(7S}+MYFOqXU*(zRK!(LFtd#CruUeOG@e#8%;TNhEd5hcD|Q2U zBwF+Uvptb9BPJD~YYBu6;wEOd6A9CI78DR=;F!Q(YEhN1Zt2Vm_!f8e8M`YiN%YTp zVsq(7(*!}QW^{3u?&sWv;Ky<_-72X?`Af5F)^tPlq;3XgeI=uMQa6c%q80~SE`?j@ zivtIhTpTsHsQiZi3FsD_Rr^vahX{@;I=To83#`!)96FNyW#moQUla_&@wNoQ{3I8R z=85EGzlw8IIGEuCBQREmh23B z9h*3)mh)80HNqL%d7QcZ%m3)j38Si2$AYRdU|BY>R47Bn<^M_hl#NsqLYoa%SJzjC zm08XjiD8tMrx*pYhEZ;kUNy=AmG^l}F9DUaX5+vXXj$?$0)%A%GcSoVHhD7#x(!1H zn}JN>As_ruL1HE}5C*sh%gdh1P60O%M4Tw$($7K6b&qedf! z2&&M+`u;MzHH!BLC>d0`gKdgbqQ?r|?sOwB@`_{=$KkZRA8SzX~bA zN;KWy<}k#(`l@(g5tMvMQm22xfspxMF#`N06>@%bp<~-me*&czLMq1}o^2IG>IzDJ z&p(rTIy_Z|2IkQ-k3I1u!Iz^)jyfiOV-(u|&f}wzec@uoT5cHjee;`v6^#!QG_12) zL+3(5Mqwl5Pqr7XaK6K1=y@QrZ}|yMp+*Vd_B+s1K+1!rYCdT&S;F*^GjI&-88*t} zY*$9bDsVWg-!-u{!AB11pv12B(gaYFgL``7gdOI9>;+6cOi(-!445==OM?lr#$$4f z&r>L(MqqpN{4n*c3@*GG*CMT z8%|H_5nr@Wn=?A2#f2qHmgumm7IB3T{Ytm0#Ed9(qhQh#?ts7yTq4{gZzl~kO!3ad z*s0L-Ew@1bZZ-JB$pZXEl45Jr0HweK!*dwXAy#7fY1^i5PS!L>8uaN`H46}0W(#K! zL@t=-O#t#(B!8p7p?JL-#;?EbdJf~DoYot!Udh$3L~IpZT`qbRT@y35BP)SOh=z%y zQw?u{q1}A2&Ry9gey8aYVkXu?)J#?}Uz*_&@|T>U;u-;-oGYlAw9?MW0ef?p+cg7x zoNWMl2%F82ZC#+<6~xU9+Gfv%HGq#(6%FtDcxrfxrcT+lJd4aqoP!06%dTPcwlpDq z(l(Xz93Vddx@`sM;spMXHbZB9QC=#iM9$Qr-9kXozRipCLO+In^bTp=a33A9^bVa4 zQaDgfbWbR!8D6V>~Anvi)Lv##44h2c^$b)@j676-`b|G9x&fbBWb z6NKga`#0lg!GW?ZLqVI{;dhpIMT5oN3Py06{azLCC*_0VxUr$e+wZxj?B{;?% zb192Nq`)tGLCm$y0ySf7S?9+ykSTrP=#>4`(s zl4{f%0w(eM+6r3w+@UrGbsF0xAJ}wn=s=#Z44SDO=57$JexRsXofO8}h}%~bH3Mp3 zYPeXyAwx5v5V)kgV5^YI;EE4&Z&ruK?Aap@h{Xj6+q0)1d=uj7n}(4%OH|lo_wplp zY=B3{>d45*zI|aNy?-R^&+1?H2ZD|6@(@2PrvEVm5go?R_cc_`q^E}E>qPGXF|$74 zbAj)nmYJgylZzQTpI}0C%pK1GViZJn3&%)0_1VSkaswQZ(layr1HX|<={i=J^$ zH$R1nc?`?S@ni1EwD9Y1jvhUF1lP)U;dn{&jA@x9=S|D}wtFo7C=Aa%!l?*8PXBN- z<|Sq3Ve{eZ;h_vTR(Y@}410hx7@mJToR~QC4Cx*?bXvsR3VwY}yJ$c%gR#d9#;Q}! zL##^_yX3|vw=3!h*IS%K0ees|L;8<(3Z2?cebC&_wX&^ejr40 zqYv(vPw=8wRX6Y@07Fn$8FjEsp{YiZd**j$UWuTAdEjn_N>XFM&Wi&&9Gw|+TDVI} zSXdGgnCu^(&vd15mH6L+g>FI4a)W`+aK{qc2!vx#hF@8rJapx1#p~1E5WW;MeSclk z^_W%?;q0ayLZ@;Jd4P_gog)e;b7qx$+l#TLgyz?xO}h>EsZF|Mw&4rm!e-q78|;&D zx@q5PA1_2HH2;4zwP?5jz*pH!X_{$7xlfZlR(kY&``8IY_?3Im74)S%^~P37qQE0m zkg?3Q>24%Zzb0o08CJGJhBWj89~IKCDpDv)C9Uyl&C()@YvTFMiMx{%gL#4DH0!qf z<(?Q}`I4Tbq$Zvd&33ag(C%nvTJ7K!iJeu3dMx)czE_&I6>__cZc{4+zq@ zEDwJ}26$6Eg@88bd;D?t-89VMiN8JiB=851Lv};+{NDE@dRls05U6z-{wIv6*!n;@ zTM9o$4i5LL=lt`ZdVx-GaT%NL3I89cCT>87c=}TV~Y`BX81S#Msg3DEV`3fBv7(~W9X&9_4z&( zaW;i~rwpwtfsuqUlEoVC_a)G=Nz=a9UVR1J$H7v@+?gT&=bkV9Iy_ed7!~?Z1MJV! zKSTM6WNovpIS^+D)Uryy!99-A|`qA4l!D&C|vZ9yYFNHLvntpZw2Oh zR{32vPA4c-8oo)C4kY{Q$9;!o)T|Be{&Jz~IDH;J=JqpAjZ%Q3lP z?nV$ErISlEX^RfW24d}IyV%^ow^5v9);FQjo&f2w8l8=z7dS|UDzUR)~?fW*048FpG}|cO|-?|DD9RHYWPga zfCCDKX|<^!eDX+7;bcO3Cq1t`w6Pw%^=<;Z1#}bl!*6#3{!OnuU-z2sHEY(aUbDup zPOFx!w8AZKTKS2kC9P!{ac9*kXCg>ni%GzW@Xej)rD+*9 zGmDwcS>ak^e23OqhSv$;(u+EKV0ywlKu}C@(GYHy#hn8>F@feOIo}7(i!iYG6*1P8 z2!L~B7ew=XBe)=d%gRY)yAstclY#2VvNCRz=|PEZCo#`X_N-U zg?fRpo^l1gzieEuyxmhGW7y^g^O!Tmo8ft$*BHv=Rab##3wzl}x#Q~8qHTN(S7#R@ zulFoWFIZR+3yiO-Gv9M~SkBd859)_;lN2BIGGN^fic2-$L%c-2OyUjwcsHS(M)~q6 ztlT-L!xbp!IXa~`&?!^CL(@Gf%D+@*u$Q$u)?2fRG${YxB*Ug`z+b4EYUzNv2$*x% zHs*W6x^&l?N>{A;UWNId;(FA_ARI3*vHC*&o<{o)^%H$hE6-p%2~h~ayYk(Y1G)VN z_8&Ol_cQFPK>3=bEpmbRRV>cnNZo-_Rk)r(R|0qO(0H*tT~1TIJyqj+8U^O}@V!aG z;cPzIUj+BSyS?I&dxr=1rkE_IM-t*!*j-O@4T zJC7rIgYwDIBEkpeA>y3~uZ({+0X$}5e}L;jp9t(V$;z$sWGMg^M|R7_c@Q;^vI+`M zCiGeT0rF!u3@lG^av`nwxI315GCc9uM~@yk`dy)$4fHhAgYSJiVSJRyK307+_lR`M z%4mSyC*9n65Duh^A3Rg86?>BvGr2?$WR=?+l`Z3BzIWUr3;N>M4EcJe80v{~OxYqw zW}h6H?TLM58|Wnz3+>~T!cN`VQcgX9blDC>HP?~juse&SSO(24fO*kHW!x+*^`o9!u1xELadQjiW|_~q zc9Tu_7DDhMn$$d@1WU7Fc-I~%w|t!ZnC8fY6Lqcb>Z)}AZ>NC|ekW&y7FevsXM&yy zyOSyN=JilK^{Ap_#<09FHB4(wj{dyoQnli0n@sjhZ<;Y3N~*r`+Kd$G3SGnW6jwGV z0e;i_Z9t~N)tr2(P`ox{cy?le+FQZFd7d6cbWgb51n8amN;U3dF-EunE-DQa&r94L z);PgmVC{frUCYrJnXN5ejQ9z#s3WFENTFy7FDC|mUNeVov$R~n3XAk*cv_l-e{6=j zgz&mD3Sgk4XD!d1k2fNcv(hv1wD=CBW$-U6zFnE#3s+S~H+)q>X99dXV0@mt5ZMl> zWlNV;Xy@LVh?{%RFv;dE>by(hGF;Dwe0s;NZJk9)n~MRxJ}92l&3;NqYj{~A%k9N< zstNM4z&<_dLcPSTDby+22fJ%BI}2tOxZQZhcspQZI}&y`2z0ozc9SMt7IHU3n{4gXHnU@8suilk&OMq)#j^!3-|0 zo~x;oRNJ9+j_=Lc;)yDh5js=MFj+W7kLJ6B@`3uRAZWQj)vPOy6g*Dl(HEXc5 zq*r$Z44UV0UCXk_$(PUADyKlTw>Z%w$$b3w1+Efu8$Q$5{MEm0r zzb|i)hkr9YjIkvzgc?TP#Jp+mhe)O4bCJR+yXGD-zCAsOf0IAb7s)dWwHXsMJabGm4bNA*LC*DW7sLDCikA^`{^5#S2)!U?i3F)li#Xa(0 z6Qt8ol;D^2H1y4*PZ-V}BcO2nI72$RMHC>ToXg>68KdP-=$oo0A%5mrR^izIOgQ08 z0o_Y4ok+CJ*Is$$)!$h-L6f<^d(%oeB3W$eQne@Ik`vNS_n6+qj9+bu`W3 zV|Z8wNE3!Ru9Y}lVeQE{p8ZOdm#4}LxJik@8GL4*Cw<_`*W;!NFJj4_XLzX9666C2gK8xAg^KBr0a~ddJ{@Dr!7EVc({-Vog@)#FGW_9 zS#KME!-K7w*D9`_yef(s+R5}Z3VtQ{-oNtyC@DQVXvk-E+ku=qMDH#kpJ(%L1)2w; zljJsW2VO)|Fx%Us38i*7A+JMp`vljX7w}EsD`fg6M8^5V{*+iycmbBE78lxECe=uI zC*!bV&#MVr0&kv|eN#qizlQZi5248!!Uh7^rU1lgM+(sS6wsIJ9|RBeLhdG2FbCAc3>%Pnr3xS!kUcI5`YI=CC$EAv_lhI@Wt{pvdrY2BjD4YO)r z=Z-}g@XudeUsx6Gb2j*k(K(@uvKIL(#$CSa3hA8cSrhMr_%$a}zin_oXDfp@Z#MkX zyw9U>>L`aql@5`E1h`TJ^`l=24D`2WHRkh3n<%+f*pfl0pn;r8pChT~P{kvLe3Cbb zcz}XcQZQA_oDF$%GcJ|3QI?0Ysf~xJ`+C{?E2l~pqDQxOR=5YbI>45~1H!!8zHNI` z=#VLJ3Wo{cmf%*RV;a&WuFfK$W)nR(R2q&{&eA|RZ!fLvPcifYESciD;!TT_!K+3BvKT=6RS>(m$Xk`i_OU|RSN|`4vvATt(x8!Y+yoB+R9!$s z08!&?=bF5S2ZD>Gh&$qly8BH*)%>Mo>53ALIo*w_Ga5tem zZD`s&ak%|V!#|;*kS}=`CgkjfH%!c!LoqdB5W)mT0(+aSWxEkh7x#0MTTDKbggAv< z1MnBi#KMu2NJ9mwvx0#oP*RqktsEJ|&tH_29|Q82>}E>HU(TpZz*wHgOot2=78FpO zFt9-WAV740aq30?ZoI^z*$q`UJwxU7oLH5 ziG0aLluo2Bo}rLM0&MAy8P$%anH?QmI%dL;QWTk#fQ1zI9=Zot67`D>?kx4@E=*4& z_$EJOgu)x9Xv;FJ&okOHN{!D2wg=+_@xVKdUACA4w+o_`P4jY`z;_{ehLuIEE^xkU zRs`y{$u)3YBFBq@929NG3)1r!RKYwsd^E|+*&5(ToKIGlCfq^M!j|~D@t&;IKq1aa=0u9oIHJHwWYmFw%L47 z_1T+6`aBTVwVX^9RT|1Ui`iU&y?SHR7cWUKCDxF~iNvMK zpbs|^EK?}Rt`JX?S?DU67RmvhL9ME`MdNw!82G7d+pthuDRRaPU9z+3Hde`#a*)51 zsKCaJ8*!35PQ_EGOT{=&4l1sm79$iK76t~kaKZZ0%<4j*3qjO6LI(%2bqW^!{5&th z1q-esF1aweI>R=t9)7Q)KwR|p5RXYGMpqMj-PJaKzPg4$n&Yp{ze>**PAnAaK#zdC z;;-ow1t~8FDf!0)mGDGkiAEDu!QD@7Xoh^dZ!kp=n%&_;2m>>G*qHHjr6jV3i_CXDXg+Y43-7!wkx8KB5u zG*lk;LuUY$f>r}py$5i!d`ZZ;HySR2yAVVbzBHTS%1;(>HjV6SOdTx>Azjq5z)2Vy z9V~D!#ThMWxM zWCWra1XB0xIH9Ou)J!qJsQX1$F$niuiakxO4Gfh!dcwUj76AR7;4?wcH~gDz3i|!& zPmQt{_il^aoKi=rw00-Q$;yd*VfqF532~GtDux$|Ae`tQw2?pzI9Nr-&jN^GXS!B( zwIVQDt<`HaSI;1FY^$Ml)VNXS{Hn+;{KcE^AH?zY-0QbHbG2Y436Ev;lWQO z+G)Zgd9fIYBmvmK%#WavFVV4tW#Ep)H#6J-PBZYQrV!31$dJ{{um+Rtg%l2G7%0*h zV2hq>1W&B-d8-sZ{zQJ63EPv9pc~Cd;H*Izv@l(NG9|2$kEl+~0GqXGF^rMTKp+#S z163>onSld)&PvU~rDZ0BT4X2}jDmlDe%Xj(1&K7P1%NR?>2x@y0i?UAy+;5gNGV?E zZW>2GofS(QM+pKenQj5a1iL0raVVnnnoiU1sE`P_t&l(Cui}AQJKW4vho9Lp%P?gY zz%sL@+`uf9-IUZ_Zn~NM9qAbz&LC5O6POx84w(;1TCB(*iu8&$>f7T9sSDI_w$|U6 zzTp#u^w;LPyVrEX2+1n4>o5m8E(aZ>rHlf@;)oEPHD(7qF8<1#!J@?-)Z(d?OwlD7 z@KEY!2Gb{MGd*Rxo4}wqt{1`eyRp0v+Jom&?b?DnG0-emlz``X7h3qCQxDEZJyl{Tpd-j>imhx=ve zlC3KDtSn1k113h8U-FiAJUt!EcN2K%h9Ca_VX?(HB2VbeqKFp$Lop@%=l`Mkw%Y*4 z+chS1Uq0t6U;gq}==Q`GrelvOr)WwEMrJrXNHmpdO0#Fa&(=@)ffh7Vd18n@7;$ui z5$LF4p$8bt3u8brEqkl*p5H3PX^Y2zRb5hE8Zqk}9hYvgGl&FN#b2>d7?lRe7uttPfZ#k;vL;gPO!+ml6e$_#OGdNConT4gfWhr96ver zr?zy|ISMbP{RKMN07;3ef#gGuIU+5nUx?S1nL<+#KU$!jvmPPTXy%AjT%(PpO{5=I zk`$Dz%1pWdr4(p-mQg4U5%A0aLe+zQR7lkbF+eKE?gP2NNZ}Yjxvyt$Y1r+}gK*$n z7#_d3frkks3LD{=2&g5As9evGcXXJ`P=cEVlnt;PD=C$WNvhl?Jg9#Jz|=p^#4Bbv&Zfp4@QpRW8lZ*k1$tOK@`Hkfz&WlK25NsNZ*6OYn*PHdJu5~_*s@g%#>#Ui72F*f> zY={biPZZgj&vLJL-Q`P0f_d?6JWBv-@TuSgqenSw+`Bn7sr|*9v4+Vb9imJgo0y~` z!-Amh)idCn04VVJq5P^w`peHVOu(`+?+3>Up621Wb&0mcf)bCQHyV;mo;Ndpu2w2w(ZP)H~+ z^l(ev*lx;dhMO8cRtZZ;TaDUrjG`9O0!ntU2V$ARg_(g=_QEJj5Un~aj*(&vaf_KI zb^txzCW%5v&m@udX8K(W93yz-=ovgS9j%i99@9$~JL8dlWfmG~UYS7lndlXj~hW4@z9_bSY4g6l%PAiR#- zN*O3-*Ec(7U(-@~79Gt5A#)w#qJDY~LN=X&Vw)VKMxLj_#v&Ug@({?k#CeC9rJK-t z0cz?5^7(S~gd3Z<-;l~{uZLEK?&dYJ(X3v>uLoJy6cG#)rS!xL9DUM&l<$nLt^%An z(G!lqEeOvNpD}WPp4H17sd$ZMvCiZG&pCi6cbwnBA(m$CH-rz@7#nV$HZZk`J8JQj zDchH`n5iPSOcj5q$)pNIFa)$|;9Z@NC~^=fBar=kjFgEGYAO>Ez{#DRB`~trriM!v z<1N*ei5id?FV`8s3j8u*RR&KlKB2DFzDt^E7UkQlq5k^(CuFf%!f67EQU&ml+-g()Ou`a(LgEGo2fr$kC>SgQ zgB}=U)tCJaSYerW#;lP_E#tZ*aNC)t^o)m9$d{33aU4U!tHI zps~I6;m;WNgD&6*wUObdf@+8+Ukqk_5Y4PHqJFI=pc36i=fev+4*B$7rJjOk*6Zxp z0pVWGpLj)R=6?Hk5I?QuP2kLopei!6`b;wK*6)dO>ORVyJoWKLY$`20b>%Y8AQl$q zQmC0{$p~Yprgxx?y#^~efg7~1AYe0WD}ZPMFV~yv>FMq53B6~~#K#S4@p#X*x2M)y z5bW_ut*6Mh>y{aetDxF=kw;zm!Tfa5!Vr(;9~Z6}v~hRz3QKd>%1V_M#8Z(}-KiYP zFFOxEbRYbe#7`q&)0ENXjI5I|Y=a&ewgGLh!|=*~GH$3DBWD5lYRHpVq(aaJq5h>A zNBz%AKlMK@|46RUmV_4?F$~Y-kWrs{Djd&%YyOGi(IdPaJwhMMIhF!UtTf*dCsgz2 zqe!T-(>(G>g%}{w34#+$6azR{v#w9hdV;(&Y6CWlmBl5a+Hd-4K1gVDNSm0B6;l8ihK1FnB<@8*XX~?nfqI zjYxx^UQD=O2T+v-+@PeHnKPlKMTj4OFl$!N?9?1L8<+s#!kiRbRaaX}w0U+`AQ)za znN5I(q}7=nenw6L?1cfa^U@thjWZ#M4VETVC#DsN@Dt9x;DQUZ6?iQJ!y9kl!V!zG z;Puh93PSkR^pUPyh3!EAM>ha7d@R-$%u!d(QOeNql zbvrfJ6&Bj-zAz@l^$G3U*_o9!M!IQiK?pMP+^#JG7=gsF=s+iV25t1a+5tJF}*EvCzXGkrl;(|`bns^~SC8Tog1iS#&$H z(n>vhA;bm!Kp9-j>R=~7sXGmec{^@#sqO~P5 zgQ`EPP!p5k3{b|JbT4MlwAR?N3(rHVYrc&-U)y$#k%m7;NZ-5$b`1Zm4K5$mh^MzN9bnN#lmKR7G^*=vb<3-@{R|MXF ztwu}25)?qcoF^*CWYPb2JOF97QRZz{fkq7P?X$^AGnmblV*gxubn;e%HSCjua=RP6zay7+hum}scToq&KwzEza3%zv9QyfohA z*v1r2w#j?*!ABo_VC`w%#M1L*y%8e5@dkn^ZQ1gf8Y22v+=(+@emODS5UfOI!%r9j-1;>2driz>`*)Xy4V1aQWxOg}Q9|1_$&_(|Q zI(}%p?=FKzS!*VHS!*O0rs%Gu+XM(vYmA1A6XAZcee6No!&D=L3;<(=>o&e13P?I0 zCn?y|4xv$GqKDR)NwyOqqF4-(5Ho33q#`y{tTRXq)2pBlq{+jt99Sd!j20dV4oi3$ zMER5mT%f59=j3TsJUdYd=ud=SR3oO<9z-m3Cz`0c?o1H|=1Vu>6IJd`x+of&s3=2H zekt<)qBnk8UcL~eBOHvc#+}H_nuXkH$BIQ=?Vtj zYO){LWg5G29gb1YN(Iv>EsfwTGZEpT1;7d-X`5^^mrx_1;o&9z;x#m{8c+#hn8Q>p zF`6R=x%#43nGrZGXSO1c6gl+fsTnJ6)CPzNHS}|Nm|=!ONVm`%Le_OR<>2B31!khEa!S?<`}Cid&GjV2)^G zM8B=PH2{mQFDF<;9xY=tI0 z7}S@7%%=8-d+C%J8tNTx;jcCX(%~&)kU;KUw=au4I^y=Z5kq9|Lizw8*$kP4%G%vy z$vtz=`~3YZ8fGrU!7w_UvZffxqYZ`BA&}ZI@evNNz~wo~Dv2XUgqKe~dF*(SE_BZn znI@V*>YfEI{g20jmWlh+_9Wpy&BKLIN8L;Rh3Oe+`3mCbs1e5^^|pdnWD@tOa)nCN z|2It$En#uWW{5UMESF0HCFeCl5?<1Jn7y4B`+r&(o&$xO%=gNz|!jkB|-dbPL{syS(dd^N-*+n%aox)UkSBtA- zq@@_e>=gWqU4R_9wqsk(>?~Z3etfYn!O!KXN%QJAyJVKY=Bb+Qf>`vl~GkG zjTiz+W&zn$W5&M5xKW%_qsOvcx2TCtY%Zx_n?yJRLuxf4cA#lq;RF@TP@1joHQbuy z_rM_Dz>HAIEV3idPlCAxC?~uPtTq?8sD)A>$JPiuL|OZ zSvleDEH_i7qhPJV8NynRC6xr}v>ay$Q>VqrIfB~d{FGe?ytUB=ntsbB_Ad62&K;v+ zdq>4~17ycRlq|KO-4a{WuMNTy*^ouY5Z3Y z>v%L9E$hP7E_JvXT04ckt#?Os);{+T9QKmmjvcW}{jo;(VECSiUhbCmnAIKTT= zncWl3k5Nt}FP1VNT5cbkG^@pghpS5SyTip%e~$Z)E17<0KpGpAZZjyYSSR=3XhGP$_zn zWa}UlX~0G^cL1dVb!QW8#agQT$@Qkxn!(yJ(p0 zL7of%6nErj@bhPMAOMS>f|~T;NZ_R4n@ObJbiXF%ld}{*p#`m$Y2;dtYanNIeTrcu zl`U(+YKrDoWUg5OU>1zps201z05V``CB<*f9dL4Pj412LFJ5|C65a@x6fV9*sw@^B zPDy}u1m+~YnC^g%CJ#X`&Z2_UYUpzvc;xwFBw3qs7g-G*_o=&shFWgF5BH96aW{F5 z2Bmb1prs8Iq&G((i7-0`h|m}9yASeaTi zV0E%FP|0Yu!b4U8CM!@+>nx8JWv{+^;nkIeWuhPP{5(I~#>K%pZaAOGz(L8AY%gzf zTZ>?%fuvKxn^-6%b0~GKCf!9GE$y%+GD=BfYX|s{0Tw;U$gIVz+hf~L1k`Y zv0-1)V0Pa=ekjgas!2Ug9FJ?2W^uIGqTM;Tf@hO`iW0Z~{PoeuheD39j7J}R>`?oZnEdK{4gP(bjrU?|C_J1bd_Y8%!s!f7U<` z*n9I$0K)t?BA9|b2&VWYo0im^#93M^Py_ghvkCZ0N;VQ-Y!X&+#dwOdx;N^{7?}k3 zco7(LghP7ZuLSaiEm_oiI^Ri<0 zWv&U+gsk>Tq_r_ctp!$#S}XGpS(6s|a||T$3F&+id@KkeOC@HQj%UV%@>Rn~P8THBf|4(i25D?F1Si8UOQb;x zSX;ULB(TdDi1g34n5h+CEASYeX?t4H$b@C`+&xiz^5_x0!7xAlI0SRF4WKc>lto7u zIA$4_PM!=91#tfBMb3$^vp)1t^tGH6TV6ET!_2zf;S8kHClk%M!8sGCtQk}e7*qzJ zlJTCgL8@K=I+q+V}|SS7+U>oXNFc~AKhj0{8^g8 zv!{N%j$c|O0L@&$!ggq8u>2$H8Nivm#zQH$HU7eDHZo(?zjGmuO(wwQuDd$y!c5ly>5F#RPSrq+9Dm5fE6R6Ph9 zGc(Mim}17QTwIYqhJm47ZRO`BOYr58~fmG7ZXI-cGQ{YD0SV#sE@mo(RJ{GrL(8)q094-!CnGj1VuD@Ku z&Xe9quOztH;FB6@y836qA`T%sv>0?^XGO6^vfa5eG4osjcDi}xD8nkz#n zz3fL3FFU)#5h0bBH5?>VwG@6;jdJYXm9*3uHIslF^Ds%gjd*~9yiJUs89{pl+%ouC zhGg;&kyCB95XcS%Kv*8N)mip~K2{y!T;0t69MT|{9Bfg@yyD)UI9s*V@U}1AX0YjR zEqyUE%=GKZU+`<&6g3jJG8@%Fm|mHlBPy>BGiN1B6fILP1* zicDtnUAC_z=+19janS{?f>U=R{${jG|2ADrf$kDMyFGl5kYC_n@j zIla=ZXw(S5MXRG(y1BKujrfo*VQY#j=CQ3?qb(_5wjk94{iHtNH#h0;>*s*SE&8v( zj~AZ0-XapP>9(%cT&*)y6`&#+yErS#$?MOL<;+deGH<0a&LzL;eCV)@t{=BDdFGj?-Ba#(+cB#bpvzVyGkiBZKE?!EX|$XwJ;s)k7S5Vj z{%bT-8m%J^VwD2T_?&r(a6R1f;CPeK#U5uuOwAEr#5Uh{OmLQR9;?N z9LPFKxwZF|$?WS*$dKOGZGkOVdN+!#)LM3CSgx`USalPM_6dL*CbSAqxn-!j*|tV$ zKT;hymH1oLex*q;(Y!o4S~8(_@MIV&dr$>?knz#LBr@vAivGp$K6RyfbldW!;j-2S zsAB4zhfhdG#Ug`IlWwC%p+H!gV?c**hOkHuv(Rer)YFg}t~*!9UXCHmM3dt#SSrAW z??L>yO9)*H%WxjwNs5npy#-KH zfM9-`_>LHrWZa};E~a58r#nx(P7C+Z)M(Ba!khw1fKDQ!SrtwJvU)V!jGjhG5L4p; zEJDgxnn$QI<*U%)Dxnfe{NR%G>f{!a1wo$# ziQ;AKN_Xfsm4tODYZbVzd4^2y!$V@ zTT7#Klo8>VGsv|6QEfLN}kYk<^(h$vULqJp!jhdZ0%%AS+1|Cg*cfwQW-wtauQ-_=lbu}O^YB)K{F zot*c3_ulvJi$)LvRG~2fc4(wPx+*~Ih#GtB_WHiH_TJS%(KiYRRM9DjpvEShZH&f5 z(`e$22}WZQ)192ebCR5#y#JWr+6CnPYVYbOs#fj2YK=L@9CJ+G)E4G7=UZJsa~ls1 z?x(q>&@2s3B0oE3(8K|l3tkwsl$PsU0lsiIB$Y%xjgs6EFOP3!H8TBDC67m-EhWgcLR;k#L|18o zLD7A~8%N)3a>Wf>?@s}u;9g4>3E8z2}e zEB&?!oOnZ2_D%QWPaH|*+jr7lsSxYDy{KUVRvz!C>!xr>k09ly)J?o&p!VcmSQXdjxgGNte zL?Zh~OF9J1IWy4OhT)QV;VQ_qv!EtD$3XYu(kxKc7+ZK)6S}WCo!mgv--qFz^uIJ7=3E>n^ ztL8Y2+bSqPN7u`dHBA@(s#vH`&#@V?${KcEIH%93P0vgd+-0XvtHXigb6V}!5<`aY z#%GxVUh3e-w71i0byKpFr=$&5Ii;{Nsc7*NqR?O^aE}MvpI%TD0?9x5rAwABbxR6J z-%A$x?&3n5Sn&qRo*l*`K||3?qnMa^JtkhSwN^GcfmC30w*V9?=}u#wt@`zJYy#q* zsR-E|no509k0ZE2 z@(+=)zM*Z3E8jJT29z#fSYUPGqG!r=WR+VzYONTqHB2G6 z%&N$d_yt-s zRt(975nHw7KgYIg2(G`l8LbAOmu$m83>eICGV*YP=E8F+57w;VsweavSi#i}x8^Zi zm%$qk$uOqtNdt1XXP4iOSvhqoxf?S~Z&pEGOiI@>$`V6$6$X^2N~M3=vy|A}CE3OJ zlwy2JG0>Y|07*|4WCg#_Iv6C0^NTMO3N7fzy&sV~`sBN0tQys|8SxwnUG-^|slMP(6P^KNM0cNJSO3 z41+(I_XwW%XPml!0#g6_x4+%prexOusuckd(FGOyp|r*8anERj(q6fXu;og*)xH_5 zMNIKhf7z)}Tb)7uXx4nOjTp0Mw77oV2DBNsZX_qodTig}wr+iWUD3Mn>-yH__~P1{ z>S`kUr6Px>!$85LV!|GA^U9OtdQqo^>7b`P;`oqiNiquBEqxeD>z$((;G{zyK2?NP z*hxHt!h-&tyddbT)-xjyvlH^S70gGY-W&Gt21e^>o~n2H6Zd8_QL(lsMAMoI3Gxl= zQQNn*BJAZfALu3jVpg#E5#^xkxq9wdI4#yA%wtbMYDvrE6$t9TTrwB$m&|qK9}6o% z+@o0;c#CMloD$k@oPFq^e~5eo!qCe`YDvm-50>yC2}}KfCeD)Z864Px^ zHldE;b^!2%K_!f)tRGhpi$W8Qa2}xxS3?uE2NYew2&b593|jUWbLD?ntic)j&nuK> zAdsx#-sSoq+`BbP6X*dZS)|*J!-tUy$QGUEP ztGq_RYBbvD>Rg}_6VAeg+?J&@NxR|Sq0 zT9kB9ld}linJQ2eD#q=VDaqs!>P=dtxU9r5XK4mhDakklf-|u8A^{iBe@`O}Hph62 ztzSn1cJhEY1jZs3(aSWyiIcW5Iw1|XiOa2$k_3tI`9%)YyhdK3KnXLP#m`y-9+JRk z%7%?VqfEWojuaegc#LvbjOuJQUh(NV4evxzcVyL{xk>F>o7|W~Pq4;<$Jw)2cdnlG z9Uzc=A8=3i9P;lzZF!*7e z0sMl#>z5bljNWhJDZlv%uTQJ)bwPq18OL4AG%azxe`^_@+#I%mmQed(q2RWHHZ zOJg(v@w93);+$zi*qsLOa@Eq+O8bqQMIBa1Y}0gshE=HI9eC%`{MY#QJgwi`6#p8* zGE17=)T}D)(D=FvOw$2&4P6(wGsLSK;w5OgweF4KiV40pQyxNckRfwu1-DihDidTcC!?MhZw>87J98k7#M~i?^ zU$H~ZTGD`^rqITnE^T%u$h6r#yQ_Ozkc*`ogSE_{cvR&RCAcBK@iGij9&6DmkiS|cYe1FRWV1cd*jSwJU#|!@20st@BQXC0norR zjb>`}gv&f|#?mN6T5&{ocexT6B4}1ZpVf=6w(^vz%LtID(HWzfGFgI$r`ebjUq9)!AHe_Mfa-6)`YINn zSLFfvwtu{GD7l5M#9GRXtQpw1>wG)tO& z?6JofM2Rhbz#qDJXoih`QZNKKqbYj9~)+ECG!gAC*J1`xSD}2As5$E zcV>n8lg#+UrcY`{)YQ=ody8$;?l_p;xIN%iLRJrwtGb-EPeJ`^XEfPxio{rF|Hh}< zi~t7aXNspEUocKtg8*{j#!*{O8=SVOQ7uj-0mPFE5W&fl%up+T4nXJI;YVP>)DCAo zPp8~F0~!a=z`Fw0aq++-)J*wo9Z&Xqd@iEf$r4;b&QWJ07-2z-u*)rq;DfD!56W4) zj4{p(<0>2?zqFd1mQDZqUC85XMayjj%1TJG_h=r#^G`bogQUG~`LTS66s|5Q`}=m|1|JIS&_6 zhJGXiu0Rp|1J=cSCz5TBM=hR7W}v_@zCa@`qon@v3yIwF>yZcn9OBSAC$At__nEwa zU)nNVTXE!$slFrM&Qrw-YVlYWQcs#(hbP+pF4j6zLqHZMO24gPEyDhrc1F`FmtKba z!3HQR_`uAkEr9&yrDN0{)qVKQrSYtiKHxLGvsTaz?PCt4Zf#IuP~27O?q1XlR{F&S zqyPSLO|FpJbXDkWquNT6hXz?1tT}8+gN<+cV1UY7Z%chdprvH5N~Hp^Vtl2D(8V>3 z6?*W*VrYfBwQY^rmCY$p1TB%h9r43{W?AibQ9MUGv_=zG-ZhUCIGPs&nX&=by4|Ae z;za|C%N#BEzGTTNMn!tMJ($EVWZ=n@X69QzD*`qv7;kaIK@^$R3Sw;q=U0X?&zuoO zI$O+mDh-cfo>7+LF*6gzm4fEc8EDCC!c#$b(Jkpbi-7YBH)tnT3#xYDiY$Y+SY z2&$MM)zV-_rpq0FMsKA<#pamfg` zNcIqcc|gXOWT5@2fAG zV|3rW(b^dId<%1td*=k~w7(R81YrzrF&6y`%RxR0+6MCY7u(D6H(6GZ*@d=Fr4WoP z1Jp)lqV>Jj3HSY@&HID$s_rGoI53dV`pipDjn|e{Vga;3tlJR6IW}xuk4K!F-~)M;kZwZ!FO5->^Q}(3HaO`gMMNEA4lIweiYiO>VXNs?jPpaMDWj-V}eS+@O=t zSo9U&+omFb{;2+zKwzKHBo(7aZdlYH=h%rhHh1&8F_rnM;ZYxM^5qjSNh}|n=@fnFyN{SW5$7;lK zEk;_to_XFqS9lgqN&b2PS}7#Xe(kI7D<9TGsHRxBVWpPCCKu3J{Z zLo%dko+X1S%ZkYZ`>O{sDI~vXki7F4G>!n_lG>vH@(Q5XDQ$f4;xmFDR=FpJ z!68WfMknIoGEGy=jH|1$vI=CESt=!hNIxC zW2)Uj*7XI-)IfL}Apr z`pttCfwI7vpLMEGR#^%%vZyzT&Np*rz}gGAf)`aNoQE1)7TV4LZ~e5QnEbieq}(}K zp>2G2&X}jOY(Q3fwr8ibSEux_VzNg85ZWT$H!%me_DxuC)1&pv`mpWFZzSHiqB9Su zaxkn%X6Y7a%8MZNX~Kf)+*!P3A}pV*@kLIZ(O!*&(oof`W&a#f^?EI776lWnGhW~q zR=XmwOKu~7xt5Ql!=VaFV8ILCA{GB%WF&OCVoaF7ev@%)iNc;7rPt}qpj-Xf#Hz?fMYWx ziMPh*SI%=YMxgg^=DI23Dyeq#8gw<3HC+Y8U9ofaVLw&|sjhjkkD#v3A{J!hWmxvs z814#RSL_e~OfUKR(skDx1S`3{M%JFYs!7!KiYuvJ)i2FcFQC^dm{!F?kEGf}b>2z@ z4~fmh4^Fk3Zzy|P)Myi)Py{DSe-7C6+Q;mnh7c8wRFcCycRp}bD%8&M7bAUAbPg) zl6(2%sapFg@$F(@;#gXb*7Kxsz|)&So^3Xu71m-iD$%I4AgVQ|Kx)^n4TKg>3uiSBD_j-MZrHe) z+~hKoS(`R(x@VK$T-v1fH*ZQd=XfXHl-;PMC|rYmkdoDYsT@P_qN8k^z3Q zd6I~Bbp2!0{p6;mr|$ecdH61WTOh5btz2|Qr6QQU>uz~^|H|CxU;aY)f;yf8S~+_E z^1qo2LM=>Uo+G3B#Caw|eHDdHR|7=_U!cHuB=W5`8)TQbam!Ud5Gr%ze?rbSn?{ z9F7k8hw2BLEo(t%3EP{CNVKNWHu&xv2ChQ}uCYoXbtjk`NOq$>W<()QX1hhO zT}>`~@3-?Wgs^Aa6!+7t)_~q8O2K-k$*C}Zd)Zsr)Z%M^02qY}GTW$+;tC_sMbz#4U>e&8WiPElS> z+xRoJvkSC0r!uLN?|`|wj)HhAnChogCOhP2m}_lPRhhO1tfuHHm#B9_LB=&qy>T%0 z_JIrH(z6FT*DH_*YU-GD5wc!7>k0H-M{m~uKbaEmjhNI zuf|phr>aiD>GJdu6^6ki~d7AD-9>j|ai&Pvj&I3pE3)GtSa|;OEmtCffXsRx#NdlrK z7pt1&=@h6s&Mk?-T=>Lk*Mq1$8N1`z-MI}&T?<(SW$QcC>x8d@rU{Vj278paknGB99<&Nm%>kqF-t0bb zloTaPr8N@>QXn^Q^pJX=?r@%V7dRSy(LLS*hN|!Rl`-b(@lnE&Q*IBC)*0fxE(9B{#2jYg*I?g}<&w zJ$AT#ZLpNWP5xe>R6y^0a+rI4twIGyqKVHr&o2^1@!iF{?gB=cjcEl%>3jw&ulwVu zf6+$k-~Il#fvvvxp8LfqGV{Ls&O7f=fk0J_tlCV>n?C|Y-4930IrM|qWE?^@21X&P zE!cV00hNRhzmx++;}>$nim`vXpspug-lBGdnO-a>?~~*fk>mH+7a^zRM;?8IBtKb( z@`q@HR}baoI(6nt~Vy9J`F@>-WperY5tPW|l%#LCYR$8sMseD_5 zVq3rrNE4uJvgOvAWu{{)4Aq?#ot=E9!jOqFjH2m2^$2-@R03R+_$l*um!Q8{(gGLR zR-q_*l_+YL14-TG3i4#;^6G*?X?#YDS(kuPz|>8MaJs~kD!_Mw8r=bAAa*hz8r(dx z0?{P&=Z>`AtK?Fffd|gjHaicpTDhP~G8^bwy=Y)&h6`)vBHID%*a3{K`1}ZGY|*4v zQVj|=cjALr2qhRCJqsYs0Hk?v%DlU*OF;m3Xa0j#F?vNgqKqTGoPPRgP}D2MP=%#= zB*jI(yG0i>HGJWxT!o4Ix`LHp z{bt~u1(LG-YZfNnBweDl(i)`&Q-BR#g{~a4;C1vclLcaRV>j3uo092eu$1MS;;lWw zL!|t_7#>*d^4$@%)j?Z}OU=?7(A8a2N`>M0x}rF%ur<2L-CPl0HC0%+3b5)j#$Ueo z=6|e{FM5=$+GRwse@E>@Gw7iTR((3g>`V@(Sm-P&sAvw1mBc6d6g)HYD;#17hX9HQ zho~*hE1Vd7y0UVGzmlk8&@1>rcF?K-U} z;SnT0k+8rZ9wV4gF;%GFMkDd*swy#$>mgK|wPV(EUE%v$d%5^&q(NO*pG2Y$xQq;E z(=ep?7WRr7%2voh%8Ryok{Tiwsd)Uov4LyqFY=4k$L{Wiw8mXcDabCMI)J>^V6J8H z*5H(qWadCvQ;#)HqkFtRFSH#7+6qfn=#siU2|Tt0d6jk?8=I|SLNd&CgJbkoqAz#7 z0&@M1g5D676rk5hAKtOEm*pwE*`eEZzoS|DvHrsj@VRLJ6B3-+(TlGMG#^S3kpXt? zL5soV8V6F^O}};zNlklO_R+Pa9-w7R!frEmWmz)CR}SJiaSufRbM_JBD zT6MquI8bB^_kGeC=-e7Q1J3Gl0L`4$YJ$2p3Pwa(DKS!M=^j8LmB@hI+x3r-qTG)S zX+T4#$*LwMQh`uzZe5PE-lHXF*87d|rZRjM=-mt&e@I|_@0NS-)hpg?*}@y%@@nAT z6Ysf4|IBOMdC$o2=44Zb5Rp7Ad4pd+2GYzoSGj6Gi__F$0tU3z>Lp36e}qt4Ky942 z(ej9s=2#(KxRspqQ4^%MQlS$0oBPie1MIm_@@k>hQYfiqAf)=^OvFGn;Qo zG6sMhf5|<0@)J^%)lLv(b3UlU@F=M59xfl25_0(P!=BOAs)fuSL{=Vw0U(Ut2)^SK zy1#GG{h&d2#-O`Z!#1EQLgobIbj?B#TisiKd0AILnU&nK97C!x zRfooYWa4cz-ivmtPV(f*usNtNBvc8z(Cr)quzD_9@bpopWuI?)w((zwlpIK|zo>ua zXsC}daFq{st15hg)l{~1BQIi1ZZJdzQ!<1znc=6E&Nb1Nnbsyu!a~NgK}8S$<#%Uq z>F^+{n;22(c#0+^PsOLVfY+bony$;d%|LW7Mo@NSC7GNoxX#X|ZR2U*Cjf+6PM&&Tmh6h=8Db3x%`p ztubI3eQqRo@aCIu5&u1DIs6x^lYm-(>)0Lwar%shb1Y-sK07Htv` zK3ve)fdO`HfAjEE4x)3c-J$zn#v=?IW!L4#=IqK)@2>37uKG~3z}iUiPCr-zs|DB? zqf)%yxuZ%b1mK*aGk6>U;zghttWI{0PJvob9loZvGp~2OY1t)sx4yevT7Iawi#lNl z#XGlqH6F0JrF@ERz9N&^hwwcz@wApIlI8n}K7Ir=!TruCazt>|~6M>n|if24Y} zznd8=Yy4JBkakrG(kBR}dGa~C)o+EoN)+};(W6$cQdtL+20cZi;lg+6cE z6mNF-6gF=Ll>NPJyxz)--L`Itw-&c;*~*80Yj(@lcuQrg-%^8Qw`oYt;96=m1iQ#L z1FSurWC`4ynFu$)wU;j|S&dBX26Ft(v5|o?qD?2N;Mx>wlpL{YAGde`HC0H&U+&%i z6QH*B+!~T4(omU()GqI%PXGR2DP}?!IP`&~PK#T+cM4+G$kWBZtKE+(@am62t8FId zd*Ay$?f37#3bRJo5VJOonkUJuDguKPb)9$OI0c;t@=>S_; z{u4?w1h$oCn4nTeMCIoN)efn;X7LgaI_-ub1hXhVvFyZhVg2onfYS#X#;m^>R5PwB zsNPJHQVxeJnM!m^+X6;QujV#>rL7SqC4XESXx%_<-rasi!4UhN2D{#5GPNfzzZZ47 z4{9yEMjD2IRoUt30cuU&^i6SOi=ZDX z8ZA#3a;=~KA$3ASui31_$j;KA^%}P*V?RydILOu+xTJ!Qw89W$hP_xV#`eK(q(rXX z95Fy0o1$1SyOp1T)J{Ya?bXkI_FPffHq2bcvn2{o1+TO19gcwdyu4QN#0or{Tq_LS zV%W9QOQ&7+$xnV#+}gpd7cJ%zK6+vI0$Pl;8Rspq?l1bVqVnYL&1&u@p4q}fXKFRS zLwrHmy6BV*@r(-H-uT=c$D(F$^qE8+Xhxu9F|Ky>wkOz&CkIWsP7Dae)~7$c#wK9< z@E8+1GD2ey`ouuQ>%?utNag0%_ZmWtjT_6fm2g*b>&j#T01Mq)d&FA z1CAE>g=o;-(IUl45y!hUW>1m7s(}7`^;Nwj|04x+SNvB0)d{;@BFlVGoM47$*g>h0 zyzyei_&($BN~z&RpfM%w7Sp4z&bL zcouobT?yE1Q50(ssaf{}Jm)3s#Rtj)Gl8=^&}1}p|Ni|Cc*b~I!Mc6>#8koOWN&p( zO$o!W=v~$nuI=g{$^)E3J-}#nut}&a4h;*=?btcEcISu`ZVh+EjR$L3tn@`Ychq*~ z_|n>7S+LHHNPX=KZv}htS@BbN<%GVwl08Mxmm_d{iyRHdR0V(c!)#*kH~$a->=CgK zKMY$Q3p4t=cJP`G*&=g>Da(;S!b(iOIL3bPu9&K zxF4ij=?1c^7-~m!V|LRaiZR?h8+qP}p zx^3%y_qlCFMQCl~og5$fZOwd|f7{AexUEg;|G0Nc_1-)z`ri1SWV5;_8$Y0o7DR7O zMjFs!&)niQ6^7hEWIw<$z-rw%+AK=`{xmLJhZ;5%W=|85|xQP|9c zeyyy5=W?$D!vjD-Wqgm)5yk0cN~Ya`yt$4J(hy6=jL%}2r)d6SI>S*)j`JFyk;AzuU@%bPE{;-mEFyx` zx3H-TIU5XK#MRAdl!ptOAut=XNzzCOvTRrG)6pb)v65$L4Lh=ykkVo0z@Iz2Bx@9s zwnNa)V6G0UUVNI17eH8%1Q%VHG`y`BlT48R97F}WqSU{2%(qmD0AxSQC2d@g#h$@q zL9)9jE847Co6+jh8ds$cJqK55J)+44 z8MN;7R|Str|9~{}Ja8bivgw1`OXVmwysVR+S}ldo)a!`Cb<x;Z*Icvgn$^p)*DUL~Cce6)t}LWkig!Xk8D@>oNo-l{6M=lboW;$2Z>TsA zEDsHKf6loGGF=oAuJ{UfO9qA8-B`gHoxL7!R+K8-{+i_K0>`Qu+8ROsF$Wqik}I0!2{@t` zF#fb=UcoeNH_sbC796)p2u=}s{{etl8^rwsqwaqIFi!DU+Ht(M7{Z9PCT=$#>CA4A zxJ~Y&D6>T8lLXE}SG}gYEOZ_OeB;5q-t{{xw3=H6L1_Us|B~#CxHs!-^s;lO8-!Kc zf8sy(q>&Y?)oA9&?B0d2Zq(TAZL>Kf9hOn#DuR5$SWWd{695hI;pQIBJmMc6&GlGv zHUwD=nTxjjY6XB6qk69Lyk`OlWHw@K*c_laMP@=5jTrw}Hm!HmVg4__uog4CI3P1B zHndodXtkIH%>T*Wn|}tTKr19{?|kSl8!$`t>5=XOJ?^CdgC6@8Zh+}m&IF^y484sN zFXj$jZeY|%9%!S*Ik4Gnp{=~N01bu@Z_94o7T@;|#94yJJGS3PmgSD^dckYXjgR$i z{k{)wyYD{0nfn%id@Ce6RlVWZ?w(?x&&j5E!26Fg%PL*ll6w_4G%53X`63kdGY zw1{v|kAW>~kcvN0t@Dwe%lnYg7*RjEyZnEi0#yc{)q@6}<>XQe`ggzm7qHp?sufk6 zT*jZh`z}3b_jU^{XeC$t z+?c7`fXlBMEVvgE8bVfs1Vm zl{GVNKlcaESj$pWk{kJ6y%T6JC$@*wj9Sh_Yh^6vg*b70ts^qWl-MxTtTAmQo0bwN zB8VuNu86`~kmF}J!HX!i380VxI^WgRjac2HP(|%T#W2jQ{j#k1@KG!dCM^#d=dD=^ z6srn2OSWXG)p9_$fsJwngOw6^wXj?ktZ>D>2#yX0`Uqs?jtFF+6xKhJ~@ zyEC~i;v%~wFBq;7%H-6FmW7L~3S#v~$Z-t(LWpVZ#^OY6ws>fh^}L0KAU6MTISJ=)t@!`n;|AX!;-!Df(*Yv zoFc6=r1coGNl^x9t{bIU1MG*;=$6nP*Q`C+q$`Z zMtRqD0-5XxmA$zjrpv<-{8*Vw?=v8+ps4l$qH)?B#?!nuG={7Anay?;qva-`X=GeB zMtMGl%Z3r#AUq#$X+BD375JoliDozgY>ulCLqp9+RcF`t0n_A;Q=K<%benSxEXBBf zJeD#ACF_{jtcT6Uh|cN|`-M@L>kgYD76XppX<_N*^s*ft;)3MntCFi}zAh`s?X+yg z=W}q!RiDQy$VbbnU{(ZwjIY48eR;%_7ogQGjEv(t+QxnkKT#cd9@ zqv$$!ZRPXHGIx!lp>&Ydr4eemUt9zK6BuqChI{Y4k>*(mwiO|1&w(6}TD3V{Zzku; zUJrcwJvoHtcz0nJd~^2-5}|g9+rmJRfit_b=gke>GnfMjWq9Te9)^#^bq!8ou$7&4 z{xyu|CPNjbh9dqy*^T4`NmSn335%2TcKLQK_eLL(mZ&2k`ap=yY$VYx>E3d-~|L(Te?kj8s z9=FEZiU2FDH{Mc)083TI%fr0$|l34uR%?f$?Po-4+hx>Dj$;t9M|Ni&>cddto$DV3FoT(xE52AZzD4rscwiiRLG zT$_Tdi#>|j(P{B?ye1G?d7R~f%1f?upUcns9AE{rQH)}n%vlQ;V!iC@O8dQL&*Fkc ziY=Efi-VNRP4kpFA~)efQbg78WjfY8M^oB6Iy%~U1$^f*DUm^}%>r&(W_mKCq_JGA z!pVi%i!NkmCPB3kY*qG{PF{LJ2-lg=^z^ew(d|>aPdD(i69DlHUt&GB*$;nVtfk+G z)Pcr&r5f^^`g6(#q1OB@>riy}lRY3BV|?aWiRC{RdnL{(IlW*w>aNHDqi%7rdl9r% z&0q9n^J+O!NQL#qLeu1u5k{p=*oNoS;I5)!Itq`nJv=#7uxLdeLN#JCD`FPnkRTn5 z*!E~mjwj`K=*Sk~A*@5K!B_69CS=ZxXvekyu;#?!Z55zhIfwnDeY1(sSW7>chh$dg zd$R=dwJ<2OV)klUx==DaU37GlxiPdawpfS&s;H@#w*Vm0jOsx4KVHAOqv60vMj>MU|2)y#Exni&wM`CP{AtMks+8goYRP(iG9$Pczi93I*=$Ol8K zuvG0F0*P@}4espIM}s^4pdUg@27yz*m3H6p)!h3`r>-(syGL84970vG-#mf!>VKqr0<<0HC=??`HeAtM;~TDMQ3e>AS>b1RVYqo~vIAh<`8B)gP>ji#gc%sNlLIPOEiY)q=%SB`?*MEsjp@w)?gs5pN$W zavH!G5DpNGfWIpqY~n#R#bBs^a8v+ea5`{TNUPg6R(i8BT_9P8E%D#YBl&Tn#4uwc z$bP*I4~wk&)uS}$M)_y6#{Cd%$twIF*ezV`93?J_r|QLl!xexSvl&XVpt!NI?oWUE z)BEqg|HnUK!{YIRukzq&zV}y*9sQEVE`-&+)BZLSzHc32+s;oIJo?Fx@JzoEtXOL8 z{s3iPtkrnycZflz!yCqY5td2Y(2Oq=Vv5_KKkw7TMNeOMB${&AvO{C{i6_{y;~y(> zUT|(W+PYM2YCIfndHAp-jzjX)$3|fLSzCuafWHg=GKh^z(fMUV=dY&d{6|A)vM=cE zihZs{z091sa{P#K*3eD+y7$RCEvQWpnSo?su-CR70fo?F+&IN>1VTIF=qLGCTOy;c z>&Kv_oic8G*}PrU0O}-*HK$3BJrm2eyba}&?c0+{FM{HU?Z#6hvt=ob%#nTh4;YmFf-Iea_p}AV|2G3=M*%b<#uPn1QdxpYr^-1hc%joUzS zL$euq^_&)Xr}(FZOw5R^K!9fuHKZ7Mnz~%8Yn@nzw7nq1*3ahIa^NsHqbU;cq9#5z zkcP3iS=CD;8p0Vs+FgXc3)hv+)y-&`J_D&4o(oL#OA_cLj*Il|I+{4JfQW8Vk)s6% zv3>I_;cvIG-w&L2x>>ZYgzPRsV1{ww^#P?7e4w!w2j`VROIvyJlDcabWiQYuGTME@ z56|GC2AcKL{b!3>%5x5f;Gw+n)EB=*bZ7RG+mW!ntoO1I zH(d{lVQnQ3ZRXjlI@@M-rX`Ht>0AdBzSow}b#6=hxU*)hlG|9-Ol@|F$BSEI0I3(S z&az&}B;}elbVY*IDLr0NKCyw5-`rj~Eu z!?BRs-&9c3*RWbC$(sGuA(kmWY)(n}8{)(H#hijQ;98Wp7TnVY*X!rS5016#5tk#4 zNlI9wjjT24?3e0iw4 zs|?s$V;J3;EdsiqDAWc}0;UMP?GtWrWOzsas?R{NnSV zf@`}+=*Oqvy@wEv65zcTsoBvCwu9F)+44aM5f|VFg!@NB^Y8ICIcoJf94?&={?TwZSY%qBX)$RKJV3Y*{15-85RT!QCi=j4OX&g8B4z=+ zp4Q}}gj#@mpr87{y@0r#?<)o<+q8FJ)#`Z77&TJhvv}^|wpg$v0+rPS7L3PRTY+(I z+qVJB_f_esvj{0XlJ%iBdkWMz*JGxdYIlt%X=t}#od+Hvf2WAI-L{ir9o?7EARa6A zS!k}GVibN8+**+_c@6~Y_J{3kWuVwpXSNBYtlCJm?`;;R)|w!)Qj?J}PAw`I&|G+~ z?M8uC|L0%n4gcBwsfhIa$M^rpE(ck(+;3Vfsl$N$=Rb4r=7(wZ5rk*=rh`@&Xbivp z1NYiUQEG0`>Q}hE;=Y}OSi5hYWEmYik>!xUxK>Pf+TIA36MRayUnOqKb!_WwW@miu`Tx$KiraE70n18gM_A0{0&bxYwBC zoCix0o{M2BXkh$E09KQ~!f+Y0wvJ=h92g8zyVOms4@h|&*T=nn#u!6#qkZ;O_Jz?I z>mlO^*6`{ciUMzFO%yZU>KcYAMLJY9NF0YjVmBFAb<7a40NXKy6!y%D-a1BzE2%c! z0Bj>W1rcmOTRg|lN2Tp*;ex4f4uLj`Awr zf$r=ab}4sG1xDR0#FjG6de-xsAT59`jW;(lhjluESI0^>lny=n19a&G*+OmMHWyUD zdv2SqtLcrmHB?7Br2?j!S)E7HPF4f?lC*y;hfQ++KLyH-MU0w3XpX5{WLLtqA$rGD z821!SA7!vi`Oq_lczb&IjHto6-DwO@UjgAZison&7jWRt*T~FeVF69tnZ2~rUs@oy z1Hu?C^a{w2FK7zUUNC<*L%AZhY=NV|T~6m7-Tv$0K&LIk~*5K5Pp-Ql6l(?yz6ae z=fJEM{e!)a37fB7BVMlM2IQcT0m6*YWpML64?T~)+*>(*WjVMK#N=p^w}~iIz42Rv zHx}e!{2cZ8T83xE&%q|6=OM?#-#TLXa{Sh)P&OCkD*w#^__0y+I!p#du94y)zz>LT z7rxL!j%_e%q)r_qjkL&wp+{&7Dn*uDAv0f03W#)Y9*8anS?7`A>2Pz) zJXoB%=mhxbpzCTae6ESVD>F4vVm4e~5y;<)=PQ`L*0QCI+)A#ZP&gWnu9x+LAb;pF zd)F)yBo=hHHJSbL(rvfhdfTmpRNqp<$$m2}dUqo$nlOLG*K5551y_i%bXOO7YB=nw z9d+n8SE&MGmMPWeZ<^-_v4x8W_G6|*;sedW?#1X4yAql~{(${}zuQ}YA)D#hDEpqh zQp^Dq^IaZ5NbtaVq&=>Vp zyM}spjgs+8q5w!Qjey8zn_l)9uHF6->WR||)X_8J@=)eDlz;3o|M-ky#eCRu{R}W5 zod0{6502~9^cCVQ-+(SQOkeN3166mw_^(F=bCQ~wTo%gzNj&|pK`$4`-vw7!DLX1o z*f|8mR}JDd_?H*NtDRiIQuU7}POqht%nRtQM)D@k^v#mBrI;gfZ{6y)jews+x_7|5 zL28-Y2LWysNPg%9fx8}}U3;|h*B&Z`k~OD~*zP@hHS3n)-X_rJnK00&uF^=kz9-Bd z5uivF!OwA9-Ijm4m(n6dejN@ahtzcn5Wruux+>K$Ur!43O0}D5fpM1H2JDeoEnZUjE)>2JMdJ!h=~ zd{Yb_@c$Ut|HB{rz~-KX{Wkavf5$Ly1RkS+f2oxk4*36u?E-YqH9z|-dOEkKp7MtN z9`t`w&TI_XF!(U~98xmf;T#M;!4-y+Ftvppd}!6d3gkVLa`u-D`oE5v{(FOcNwrGj zVpONXw3GC7fPRg#EJ1up;oE@x0OjDOadzgMji3wlYupnXC8jJGC-7(80Izj}u~*I* zU(vpt~iC$~<)8U`sAh#6ByM)&NB zS8#|>-_KwWMcQhtfN5EOE+&CV)}LrrBGj1!Eq7tEr#iQHUJe;Cw%4_JjQh+3iM(ECtv0Nr1h6@1U=Xx^sMz6lfKb*QKUa7?$lTuY|gT_~pfmySux&vx}aqJV}Lty-Q&aD_bwg(JOZ|vlnx9 z&s}iQMPl*NW0mrxqJtZ1h4vSNQI_FVJ348lwJgCtreJAvZwKf{UJ7jg z@8o$IxE)Rg@qJZ|;C~q`hKets1SoZN*}?k7xGSuJHQnjTCQuQ}Be)KyrxF0_uP<=8 zxTkNZ(M~Ads1Y&vb=lCBcjKG*ysaaOt>+vs%TN=f=*k{x6#PnB6I7@PGW5o&LsSuj z^VXT^jE%=Oqve?D*Pwytbj2hxy@&&xi>q5ZiYu#Hm8Oo$eB^tJNFh8z@o+id=}dZr zfXwaATH~70A}TFa0vzL6BXEDKm9PH&H7Ei~15<5#%s-YK&?n*k zAoM1~vbO4j$pI}RjN$(KsQ@Se+`ghTfPMRFd-DQf&q~6Uy~3CPI^=Zi!fTct+8s*- zF!(0GYY0?7LHHla1FHnWhi)jZPooU*C6!$PhlRERYx!v6Q-fxEv3{l_17V1M!;d(JgF-HHGpx0ytIRD2`=4P<@z zi6_#H4#(t!sXEX^mV2QX#rSf z*OO^F0qdFRst|h0w;YUjd~o~r?WzuFzw3rN&=C8R%^x;NB2)(m6*$H@hwUWhJoXsU zIF0*VU$&>$_l!_&U=n{4qks7SPGz9tAQZPeLMjg|Tg(h;@}nW}|L%8eQu?(7e)ry} zU&@h&zHj9L)q&HPwKg37$ksu;5rlzOgaOF{-$5DR$!pP^wJhT=so|bO+V?LsAq-Fl zKKJai?wJ$m-#n!y!Svd{%B!z1xP>9jJsE}C0BJvdv>YqAni^&Y z@XU0@XXU0&MHPrUN-7MfS%&RxMVZKz7MG(@QnSqwn(SILj~+Vp0l6S^2S^*^0jgTX zBuHGLDgj{coV~5{Bj7w(uNR@d-tabj!akKqG2l}wv%h~4nRHKc+3%`^g38hq%e zFhFgV0y!1Y!L(LM=H)ZB20kHe(_kK$2dd0xe(eC44kAg_iarVqraqUFw35`fO# zqnX5`13>N=npT?WVyCVu0#0AjNGJ*NlrS^`A}WGB<-konH)n6TdHpRp4%pEoPiT@y z5N=IFJ6ih7kO`y`R9H|*hB)PbTdZaS1qk*O`U7r$n?xHVtmA5e)>OB$Qr2Bm4yEk* zOoyp9XjT=e`7l)n6?B4;1IkL)MHRl)OV9>Qf=tyVc`m3PRk;$SgJD|dQQ<6`LX)>QU_`ada=!04*cqQYZ$2lNd1G&2aIuptp{oh zgSq<^e0{$G$pCc$VtmaEbZ$3Xe|OnXnperLe*{&i0l+0;dw9Q56NFDeOm|7)kB8K& zw+dj_iclla%jXlGIsr2~`nAP^Qa0Eiw%=0(xhMmA2{lXZuRrjS{eph!0@lvpxaEri z|J95Y{>RK?YwJbx6Bfn&WqJVVJXi^B07M`hw5(lDXvi!_EPoq2GlNIpao_zg^8ah{ zJO^Rm%_B!J(*^MV#e42o9|ikE|Nf7EfZ390hAi+G1#mZ@-$ftRX>Be1D&P1TbwP}M;5?b-nLD^ucrNu9U!zH%t>L{Ra9ZL2lnsw zmIe4cHT!D!w^6|D<4zEc#2m--b^`D4)EV~knukwyR7~*}1NtR;0({pUetSfVe>56| zA-;b4J$MM1-u^g!{Y|D`Neu{y&$=-shN~5@l3zw4w%5|sK-bf6Sz{R#ixkz?rxO6? zN2Y1rZ9`%_Lii2;oCb=5`k|?hC@`Gbebk4pb^y4~ga2bx0jv}NKR1kaumAA%__hD> zeVY1IYTx;eI{L4?3i5vw;I~n+7hl9__YL&~o_`+f=h=Qn(_$q7Kd|q=60trb|0JS7 z_3>s|JsxFv@X<&8BNYSv_;88SNM{n35cWT19$KB^{tJftFE&QQeq+EtLa+zFv^yp{ z!ar@cnJ#I=pyd2!*wt_Aq9bX&+xnT))nkE#o7{cudc@hITgx(ncfL7%@=!{9|A8svym z3xGR6gNTs9a^9-aAZQ3@pXH~H>FAi+&VkE-PZa|aGtO0luvY@#hf< z8iGm$iWN`az@43u0pqMB6fBep-sa6%_%#`U!@Tg?UG1z=s9T0Ac6dDrIZnuR6b$q5 z=?NLFV3>1R&z!Zhn}wHplsjiXOiKWR#uolG^J66v9nP!hgs%ZKG>4;A#e3P1Dje*=^wO@a+*eA{)Sefg)9c86F!z72WjM z0G5U@FbWOQ$Pf<>wW0!GgKITeG*^8sAdB`Iex;$2Z0| zAR_QT_+!TC}2ob0T&6k+DiakOsQ=kfGbC z2(kk!K@Kjrlt~0my2Qm9F0$UteOl$iP?}1C0+Pl}H^ny=)hN(dS_LHo&p!w1micRn z2qJo>%;m?5H!BDf7M@*brU9*1?!n~8L+DJM>z%h=qq6?NRy26<7TD#bw%2{6LKc)48KF>#0 znhXi$KvkxC69Y!`t@-xhW_Z@OcLa(Bo&bRzjSTky5pl|dQ`5j5Y*E+XpcMz0?aQhS z9)0A|N8J}IR0kuE)ds%yHHOhX`ph%dIMBE_4gs^;W8hYJ__xEbxcgp?#)13c$#0~6 z1GIs+=^GFnZsNeN-EU9%ol?WG_rY)fM0N02wGAW;NDhliJZn-0d{Po-)_dx4?^t1} zD!w2JtVR@|G>F&dPy-y9rg?Sg9YHJV6G#d`&Ih~)cgC8@bGyet>3RIQ@mTOUJh1Np zbx+t+#*USORZ4Du=>Uoe)d52Y_cKwiuZ@YOvqu!&kZH!NMF_> z3OL29*~_@`_WLxsCU_b8(_(Q2sCxqO-#$In%D}LO1GX(V6>>JeI;>G>M zunv-t>dD@~9?Sqc3Kpg!-px)b!94LIDa=Dcq|vLF9_G~|09TW0BcU=}ydJ5Z(H)4-9Rb_7>o=_d*{(m7 zUcP5utRO3T>Bn?5q_92Zl5Htat19oM}eiE6Jjc@iggX#X{AqIxm12X4Y#@O7^@%B$h`QnR;j-N)XqyU?PR#_ zl7b8h*bSuzXrTwO=r*dSJnJNgMol4MSf(zWl-@X*tQH zyo?vMPZJ|Q0XIG-K$V?qC4tPF*H6oUD#L6PE9VqU(jVYK(7ZK|E068BA@`mp3`eL* zhE=Bg>+9H*B@4iS;!vw|Yi#jgGqEAOUsM#rHvm2$yZ~MkW59{OZls~6_5N*q+}$Fl z-$z975yl#qJO1*Ad;dm(+=}c<(k}>rQt}1u#*NS(H^TyObdIJvdE8S`j1`{xc^5U5ap^!!%#T2rw5AUdJk9qPxBbAfiWT1!m>ugoCZ#mRr93 zw%YRI?aP;ASV)#fx7U}u+almTzPUoTU4$Bk;B|SyykAx^l=oMDTmz0|plMZza9-4( zQ`NkI4VXug(nGE_Dxn<^U!0+NegQFnmUR3lbAKK(QV#Q0qTk#d>H zbJ?uk8JQ{2ada&bDsH-wxVDBX&|MobAQy3fIXr>#@Oyd{!3mHJE4g@D7p!6x7YfO| z`F-(KQ4YD47a_>o;E0`;c$4<3*0-H zrTO-t?|QqNUIAM$Md*k6cNI{p&720*x9VT{_uWzflHJ8U`e09WH^KtnKiONM_0T4O z;ztKm$En|pTS53mWUAZG@WF$I?1t{c-anMv;Qe!tkHQr|@0Xe5VfWvd6x_d#EdcHx zsK5L6C|4{kr#e=@K>jO=SxgPJH?YnktM8(M-D0LMOre@m-4c%b~-cX%fB0b}VXJWy^= zGY>ltiJlO5zuGn}(rHWsQHF^&Jvv$;JRXh~cKl#g{!R@*y8RJ=KSqzF{ePZ7o{aRz`2v+KNW7~V0|o}%$`&*#Zi4+j z*Hhu7Wx7?MA5cF7i;h?1G-<0_{Doa|D{X;hWhU9 z%3JzgV$e|GV}fKDFxk;tLnZrhRO`ekBR@q7kNT?Qort=Z!xw1 znP;EI2jHG6!T1#r;~Sh`KK`)vIes+5T-~U{IQV7a4@UmOhdnVd4;`vMR1ARMcO1;W z3e5l7V16{$U$O4MykT25WY>RYG(Og8{$l_Q!)@IbNx{8Y^6u*J{ zO(yi~w{{a-!-yRu8L}LAWZ?MG+5Vg+5qyzZ6a{zwNZ?O>d*D}wJ^TQ+YKk8!z(=;{ zVjj;cNVMg09(PfD2;q6H3ww8WZE-=D_eDK)GppSs+KANgf)Z_=*H*v_>=pc~)2;QD z{8H|ck@{)k`#_021MYnGlFWeXkHRltodESC&gP-=gt3b38`dh{&11up>(T-H9*SR} z7jWe#X{yR6U>P#ddk3|TFDvr1`90W!K?}fNoa47_bO79Wry99GPk?Xaej2)m>={;Z zK=0Y&<*gfG1V8R*YH#nbBWVxluOmXlnKU`p0K(B&nV6!)OWu(*aRBbP>b0XJvu=T^_t`o!L9?tlkmRfiK^-{I=U} zyY*HGw!68=|KS(pzo$BYP5eQxD@@UAC{U|IPPO{r7!@Eb4~|x;%I?KZsuGoxr$Tig zua1i3kRVKbFowO?TytrKtZ7X8xfQLt-15NH<-S&t;50hGg_h~DJ4Z?hxI+bvj#$TA zuwua@2;3k^z$-Y8IYs=NpHE8$*2q}FP*AWd)`0@T&SG|mCCCCbX6sjK=x_df^X%Xy zEJA*uLLsiBsv%?$r)V<;5BdXn$pdC8d|?0msL^s2WbXGG1XOg5xeNEL-do*6tDn2= z8|#x!Kmo9O*Q(t`iUcsv$!dVhK<`r~IEMB0wr}@Hz0ntkx?^|mp6uQ|EAR$jR@m33 zdO;!p(kAZIOtF<*r9Y0wWDAe0J(#(1_=YM4^yQbo<-T3ES^*Gpul*A=lrF*lYSaoy)?rQn9pE>=u~Zs5+jI%szkN_m z0vrOW6r=-05!yJVG41hWbhTQQ4p2|6v1$tJ4g4{qHk`2yq$5ERQc=(c%zwt^RiN=;Ye+)--40Lz#3&&jO$WyVuAzv)W)Go^9D?71cs!>u>$4nR zeF~2rb(ShG)eKaDs`~W3RnkR6ZqV(l?C{%*907I#x3x^6U{=C-(@EOI!XyKK$ZM%- zS6jb;c7aUk0+TwKw|^H z9_|$Ul4w`=Zsna&DP+Jxqyg>rbl+)He?XD0FMsQ0JcI6~kJ22VRN(gY z7oLBfMi5RA8U#G!gw=daJp%WYR)T718JTmCE18u4#kPY;TTiP9vPoU0MuOr<}CBzoKF}(t75LlDq zc&mVRY*(#U56P?rOCk1j#^f7g1pZu=52;JQQ9;mF$0d+%SDdAdO|-#D-r@q0UVq)9 zCZq!{C2~<;bu!8UB}Ai5z%lWQ=}`Q{CaDJioYVt??>bJRKSAYkHqgv4+-J`LFQ-vS zP`sqpLU$oKUZB8C$`=%UEvYmN7-_06!mk|K3+T{ONi?f|;DzGBFK*HWO?n3FGs@65 zsGD{>))wdZ3Q|*06RfmY0I-h`Kbj|NfkqMnjcb}En>SK3Zp0G+p+;dLCWkT&#Jg!@ z0gXOoCzB;WD~bXx^97{R&663j zMp;q3#8eV?OPaGFxxk&5CHW6efz9=wOHrYa*c{V?F>yJyvm#W49QBNE_fztdDb8eZ zKtk}T-LQye!!4dzM!nGiOJfBPz*ZAf&vnWJrz zU0}ASo#2mT*pSLM_2A+a`;lDvPU; z8n6T`%S&f)*R`fcd4mcI3#1G|pOND7j&H#?-lSoh|$Zp%PYQ zQIPtT=JX8r7Dmf!z(tzE!dkk@=^^8#H-pvSL$w-x+$0Vxj)xSq3YTUaiPmax%Q@!d zRt}B0=@y9*(jrhJ{1+mds0eXA6`CT>9Es{Q#ETQG2XR-Gk^(d03S2zu>`BW(mC#G( zV1m6rX(V)>M020wf~ah@9u)kl+CmYvOe-2dJy5;Bx-SFpD@dLq{srJ$wFX#PP&I84|$AU`Y5As>GlFA~Pa|hU)DIcug>m z)XF`kNJx_SzfdI5>{kr{(8_@4L{N@ET4!vc&H&Jv4^*10yYFP_0tf^uGU&>v60?U{ z54_5)SVI~n$HJ1(bozlb83bZ5s@)v7IpiKM`VZ#5u4O!yXzy8&46gKeQFNyxCyz8hn zM!t3Ar#$?$BA8MzWr7(+dJ*omlfN%V0)B*7U&WGuo8;SS8c}fgmrnWy;sm{jFrlb& zgJuNvhI?v^l^YiPL%D%g_2ie_6Y=BZPjIS`{iFOJ_eirIHl0dJ0Mfi-a;V4|W?hLg zkG4uT?62q*s_a7H@r)H7KcMRPg;gE4U6UPZbcVG}oHScz`Y;fnQ{<=<-1t`299DAh zdN4I7SY4r6M4A!2^ix>K&?xJ{xN$=kA3x#DD!WaYQlIqco=Nd!Z{Y#B+&d~$YZMVM zT%z(6TN?r6!y2z-2o({E+R-$EV&mQXCJKmd>pi$7CkD$FS3EAT%cvfNmm%UOuj;`~ zELin`LJq>VPf_(C-6Jg?&M}w4xe_AW3|Y#N04^-)GS7uxRs*M9VV%tsF9JBQ9#@~K z5cCrkx-Q>cUKDg?7;j!eFWD_iFYjGixuVB5U@X1dEn&xHyg1L7Q9`&bx6orjpa5|S zUuPc(dq6wo%nw^T=m)r&ZKx4UMP6XpJSrLl-tKI7*2s>jbWiv_%yckmk~hl%)q-Me zS*NF5pp$qMf;F)*x&RCa2)Z-;aPrJiB*sXQFfrs(dJ$@k6S<2ranZ#WCrmBW%ncdS ze#mM!t3N0COqNCs3Pcn23Ka_#n8zE55MdQWokeXWJ(kj-# zpj8bk$%k`uvzL)aASEK6Q=%IoWyX`upttrwAD|-G&3(hs$%FNCHe8m>t1(YCz40VSVx!vXA0nQ`ZMOpSK&RC#lmh;)B2#1_Yi}hlgmqC*rN||l%XUn0;O?m0?w3cm`CC~wcXKNc zd&3Pkz~Ie#phP^s>@? +w_Eh=abz9h)1B>E)p0ojp3Dy0PEq`$j<+%I`*w7J_F|I4Nd%Qig9Aq}sBx0%~ zn2>;y@bwqIfuVrV8I%O`6TAvmsOunvf1P1BARe*%%@IGgkXr-zU;M(oHwh_$wgUi< zlwe&4X$jyvT$!^)NJis*@p7NFj9N=TMR zN?^c1>i-Tbfoa#l?JgS(1IO3}Xu42)Ic*pNWDIpccuOyY3)db&P$3m3_wd7y#*Y*q z6-j<1dALQWr5b?$;tzi8A=Ps{rFmSo0N+H%u}nlwRz+P&e0Y_daMU%3wUFwU(2<6wN^!4@bN!;&!fZXYRZBp57dG% ztbhM~dJyJ4&@NU&>VI`A@eZ^gP!`mLVD{kcx8HhOfdAtoW<79kl#v&-jP*7DJ@?%T zYgkL)enk@pFS&1)XhXd8;tMZ&Tf^#}E10U_o^B%qmrbl+1LeQMiQ&Ffe)7pDpLpU4 z%_CMGODs&tKU^}1SD;Y#5cobKs4^zZJani(1@)&5)ZYNqe{P^&1<&INy1# zGl2kP+>6=3j~@+^H*S&>#u<2TKp_CcF&|{kxX-eIq%L^U?D=NnoA@reojHCDy@slm zmiK&`wI^CzUY(5ZOml}GaQA1GAi09um@z=*11WAm`9O^Ut_W8@19LI%0_6h<;w!id za$O5)F(@AhYk~Q(u4=pb>L3tE%uq3+!9(csM5*3h01qI!juWh}A%NGYqjecf92f(< zqne_fUS#TkNyJ>gVeF!DOcffy1I+VBa{cDY*wq!N9E`KXfn3g^RG0Q%k!L|Fn<;yh zyLZJ0p;?VCuP&;(tjgNg#f596SrP5xDwP1p3;Vgqw`ZBA7#BxE+h3`uZrZ8mO87sA znLv)6$4np#*aNXbdruw#q+H5?r{4qARXx%erw6`2$dUlIt^bUf|9?I6kgPApqxB z%vpC?AH1IU+*)WKgzc(ym6#V$c#ylIe5K5S;FcG?7hXb~X&j)*%S`~8#A+81{gjm7 z!hOtS6yJTWS!YHd_->AZ=-vEg zGnU#p;TDgwd4ZJOi`@HVAJ!pWcO0bKAp+^g06Nj|cd@Uf;-fY$$htX*2KOp&GQKAY z?x*NZe@EeVDfI5PRw(o>sj=`zcSBP^cVqs7_x~Go57;i!Z+3%Y!5w%%7Tky32J{o$ z#jUcua28re;g~IPqb-kMEyRB{m>|o6m*Ie+^&TW>MG-M$ppHV5N)jtZG=^AQZaoEU zp*cE*=&x_3l_C=)c)x7eArUbf!Sf8#Tb4$$NPAtCeP2|YZ~lU<^WCA!LsihefCzn% z+!YO7|Nnfw2bi5@wf=qW*=1@PNr>3nUr+h;`;O96CY_Q{1JV+bnF%Tcl&(M^!`{#H z?lL942QiJ32I(CL5=tnBmKXvEp$RC83df_U|KGiyckdZI*Y#b~CzF}I_xtX5{nowi zwN|y|`il4M>k4a=#0IyfUZI{B<=bH}(Q1YXCRQ(8l_Nf|Ev_P+U&X>0VtN8& zg5I*kaAW}%$XHm{CK-KVaeXdXYeI8?*Q7y;btIkb>x%c$7FnROff%l+)_=441SRGD6_YnSBVcmuR{@wi}r4yZz89Am0nKT|7WJ}83Io*lqI^mVOD|5HponSaW z&1t^~qhJprB}uV%z%cI5FHfxSD|3`jM)3F$&P7mb)HX>BMp^;8lu44ETZXB79bUNS zh!$J7Z{4m}+p^pMq{TtdJh^It@HYdGMc z;*8Dl3=8<&`cDlYP)<*8W;c`Jhwk?Y0zHdd-+Ncf;mmCCrs6yuhR1070GT}yrbdIq zwU zNAEbV=e*K`xCKT!N_qXJjY{uDN_x$2Omk518E&lCV;UaXjUlmr*cjmD3Ij|ZJSX-V zn&D9I2;I7B8V1SgOmQ!{(vW`F&VltUNlWxfNvo;vtk7b7$C{WiGnDgf`C6~dzvE4vs zJ>sWpK01!XA(fJ-s?hKwcY-@ntK+SqQd0=NqEZ2s0v!4H4TxjPS4VfH`z%Xiny-te z`7&oOb~j#tWPjn&T<*z0$@Ir7q{aU5CfCxJfJ(BYD#7=yC;$oAv>PRLSHc2SS51+n z>ME@5)m)3Ox(Z$TDmNvIftr;%{FEVr5W=#W2FOBrmxc(S188P?kj5$W9>YzEN5qWd zx{L^5r2||Ek^z_-ppgNA58TMy2tT||U4T6Lvmwe1ultar7IRRg}T;$!ojyLqKTiOH_H7hjboyI6=2TiqgTQvnJ4$ zIbV1(zIP@6w?lBr_*no$fw#^}vg5T-w#Y|!NpFb+{HTNieR9dq#y(1Qw-3m=;O6pI8?k!hpXueVaUq?)IKBL&Uj~D}A0! zNe+Y=)^}hG5w{&+7;*SEVM|w8W>Zf+Mvg=Q1hUn5N6R4sh|DX9Fq6M!)qx-iaO(s) zYBeM_mT#I6$7%x*j=Q-Iewd2&kfJ@xx*$jR06F;fD2V`{j}rNII;fLSM3k!mfK(uD z_0xK*%x@9ds{A+KRhrbhQ&?hM+nLQ zUAi`Sxc}G%V^lNXiVQf&^ew}>>qxe%KQV1h-@%NK%SE;-M`H}ND5vTtH)+~}%`S*& zNvMq-2+{~@VH`9Jp7q)ZFOfhd1c$N~!43IxwcyT4eq*l0Lzg130mZ) zDlqufRnq(W1O-C12YX$IAP^x401pfh-jECVut@?M6$?4Iol5rz0gQHkNXu?M|0xUN zzkq{#A&0Gi;lVEr*5Cot`j4pjunQXS6~qhM=`Q$-1`nbHl$#53cIpreP453fNyH$3 zjamz4%nXe+vGxTrd=X-h3}Ewu>Gg*hG$D8ysrPc!c1K?(!-o8-9Nx>G1`HxJ3rLRA zx7(5uAGxhZ0|nc**^=^|J9lp9McM6+{LTb-ziRu=XnXCB9buF`5<#>%%ZmF5-|3fu z1QP=Es6r<3<1J3Z;z5nU-CcXvO49+BEpzMzz?1khx1)P>-;BV6hUh==n9MoXp1OA0?O7VXdFhJ5l?w1|$X}|z9z+Uk9<8Z-ak4o|P zzvu-QJY-xTC15wB{%eg2u(*?R3Zi%#&B+0hzoS4>Xa$3kc$HFHhnuU;trX3~(UqRCFPj6mwpuPjB8+RS4RN19=Kk6eZxvu4!wyFv&^Hyu+ARsGO9kz!>{qp6Ml#=kP#GHvW zNbu?e;8x+gRLpm0C5gapY|WTh6L5sxQ@|)Uvc?1f*6(_Dx^m||D~&iR93dN9)JHx{ zx(zW595>}yrGpXDe@1#hQxhHfins)%cu1kS%8JB(cTUyW^dHo5Xf$+z7sqy4sR9c5 zesr3@t$_&mH%EH50hnJv9S3cVHCP4gr8uOHW5J6KNPcjF#Xs{W%|#keXJN!_!cJKs zQT!(?=8kuaZ?FI^Ie-^`Nxgj*!n+v^BNGcGBXEOlft@{I{NH)wS>YCb)%fvq)s@gr zaiB>2S670coI|p~o*D`RA^w|=5aRze=Jbz+1jYYM5Z?1sYj3q6J8c>k#F1qkf%uAy zK-OzlNt6WAs#&p)V2ugoQ`+WQRdj^&g9#C_=b{0eUdELZj4O45fqyM6ZnFFSe|6Up zVh$){0C|3w(t!pb3YdyTAUDln5AZ4nsBEjoiJy_-xG3ehd_}pGu3oOSANRum00Mv@ zf`;HL!-0CrJHTTh>j2T!UHK)8|AbYYu$KvV%a|I<1B~V3SaHUN_-{QkpK3{TXQAw! zaSWw_G3FU40|4>Ab9#sAuBFJFh&3o4grTg}2fWn>GTgwMZvq3nnHz#dpj;wQA0|go zJ^_D4no$yT*Th}{btM+U9OFADrIa5PrH&Rh7BvOi6r)u*i zhrFL-#^86t5Fz4tcWHm`UU>u`la(yA3QF2H5ddM|O9HS-!tU_@`|>NVpaIxo9t{)F zUY^h``1{}gk&c3o5CM?(|4QMWc#bvX_F5D6WsZZXiYd<0Hkv{@lboe)W)Jjy`Uv8p zy|%V5T0|9`n!UU8sGrLiC?$V6O1_orqkH@FXb@xdP!V!LxtI^4SwKXHctqi0HHus(>H*3zX_p!RI(XMo1^1@7+rQp9TZ8eR6&G zP>u$J45Y^c7tvtg!J-_^1vD6J$|#y|+FaO_fP2y?Et@tKH`a1C8_aGBQT;)S>PJFU zf5W1B=irn=;H=mn$hdxm^AgQ}0|(8sfX)_pf`cjhdatOyjyFaP5Xx1mKT7|`Pw2-& z=s$VZz>FkTeNe&*CC&NcBCet42N3ndIZi4J-c_Mw7 zEm&>hsxl)@>6+)X#doFAabE8Ry1_jOCRW2&T0b1B z`0}Wb&v)tjAcd$xLN1qI3JPCE+^-~HaZb;*H{@Uz+PU`DDGSrZjy!_ko+J(*%=Q{$5h&ay8C{TYou#QTV%zSP!U`^cnIrx7rPML7JKCTCLa>{#94nc^d5O2p;}n5auRY$`WA`H3Ash$TPz<36f6=axN(wVqkOIq6_=FqMdbVtkcr5- z>X1)Rt* zM6o{j__&`?2NY?;D>&iGEdu_GFOOBhUV47qArJ-!@fcbT#Daxlj`Sy#?Xye^@YAxl zMN`%0sE8aE%HMFkjSh;Z3Ww=I!Mx|LNbwMA9~DO7)MjYMdb@(B__l9t485z4Ku=abdsg1n*B%XX(P z3ae_%-&{SHILX*^J?R2_4f+5yB1?!GE*71a>L zJR^_L5h7iq$=buvKury5;5ts$PL{@yIQP&u*up1+xS~DbK4|{x2~Z*bmt=oxAAIq} z=wL?OgD)L+uY4;c@3B!&ioe4B?=&{BtB@Z@`+pMc(-!SfdGZYfo&}l;z|(+uUmd7) zrkmYoj>UW022JW;v}BQ6GJyJhEcGkkuZ&CgbXD|Hz=w#|Dd1CfcN;#(;X!8(g$)Jp z9ou(o+sQlbs@vHM^Vu$G)ek-h<2=l%ySXiPBqT`tO z99AN);9qv6=1}@SPabch1pg+TpRPh{DpVrR%x3rduPcq`l}DbMz6t%N^UJ{}q5oB7 z^PbMa8iGIB{EG*u=s)kCtI}56+Gn1jS%97MPx^f|M19*14S$9G*Z#XZB6pvMC9;zAC=0d?FoWzf<}}8WV?s`H&OFL%&#FhD9@q= zEpGAlgR0dp00}G_R3A(H;sC7+TBMaeA-?1LAE>wXlWRk)x2!%pu;b*Od>vzeKAB~5 zz^p-Y$l~1K5?OtcsGql0w{Dnb1$hUb+jqQzVpP4nM38RbQ|{GU`sL zJ{1JuFS@bkTKIVuIEIAI~UYQ5T)bi(RUeh_}Ao5om6fn$@T+QS0D?kH9 zh7h~aHKUZ|j~Y2DPq!mPFq}l6?to!K9rgbN;~Ek7OIk$GF(ffK&xw&6QW%_{#C!v6 z+SQ7u5Y`+94QSsiF28x?`>h8U@zDXmhs5|L6Q+~9V+6n?h|&zt zG$&#i-;u^=N#lttSJX~XR3`We_3OV&S;7mmo6E-*pDL@Au;b z;@r{g_FZnb|9S$lD;zf&|WAzK$tURIXziDIXwb}<@9O0jm$}q z=wMR_sx)gTZMuWIy6VR~lbk(^RDGZY00W>P!ZA4`y38gLNZRiRjR0BJ_vTrIt31ha z{QSl$!t#bR5oN=MHoDUC_f@ac^qO^RXV|!63+Rrd--2AEP>)@pr^sQo1s-vL*V0`+ z&RpG#kKzbp2}FGlSJ-!8ha{gUQJue*+yUt*?^#tlD?B#c|2Ob#*&7&y3tlc+Qc z9WeR75~PCH!|VaH0;Ga>70P7u@1h5rJrGYG;Dn3MIMs}dAKFT7Z5{3H6wD1E$^$pP zDwF?03IB^1Em@)k0O%fSAQbI8ap+*?-=Z`=7llx->3c~NL91vFn`cVyd zTMEJ(2nb;&;j2av$zN$pQU4bY960d8b73SQ>H)Kefr#j-`X~22@x&990~kl>9_=OR z0Ej?2pdPRX>7XCg0DuejLO$TJ)ML8C#WM=eXgY=2f~}I7Z~j1e{fnj@bU+U61CKIQ05FL0fPh>ub}&{rNh1p*V+Z>Q zVa7ndAyXlr>U;L0&pY{j)D2W@m_BIs;7)l4^F|eIEGQ!D&C4?oe1nn_aGT>8jKGO7 zm>?x})tysIeves+97oIRHSV3+x?Glp6Pd|I6F9>0-!tU=gtU4A;E3;tBh*bPDM2KG zk`Vj>BMEl02LzHBGiJ=#u{L&?;YUXcT*i$fof1lz8%)`w8{Ys&RHOt)&pT1-XiFW5 z0+RlT0*X`+0;ANf_Sf{fjz((4*6Xgl{@QEFB;5_g>(ll*jbMCBS)X2*#`-xb2>f>< z-4%B2mY=IE$FhA%o<57Rmm=iLPxm<@Q-vqaC&HV|08m)3VTC3}p8`!Zj8sV1tU}Wm zYNavosKl)U43)r6sKS9et|ux3e-)OoIfbqzYC_$>F+dDQW$>YR5LbYUGz`?7jm#j7 z@mL4WV5Y-Z56UEgGl#2?-hl|Zs57|W0ax=tG@>6Ur(463&`r{GY$048xi zt|oOiP`s{hS+_TX;-`ruhdB`*;R4*nBUV$8j8V}sBx6wjskmfQVp?Y{2Q6JhJHC7- zR(K>>R05D(VZ20*%4`K@OzgT{-GC(K5rBl~ASD@NU)~q8I43<@YHB+mCV9j=B0A37 zI}06I_#_LTWJ0p#qNC%>B!Hr9D<%}ggVCxvpmO|#t^~qA=RUY*gkmKJo+W4;WzQny z93+mi#vz4+!=;LY5GBk;juj3+?mvR07TaT_07B3)r^MC+yR3sLDB`%iRpf=IWLiw+ z3{x`Pb$~2C6;9zOmYjj)n_s6CqhJuIe z3$YLwpQjv5Af^PuDF5#;h6xiwX3v^~(1raUBZ_2@#f#)#(3%7&W*H2#eAyS^n7i(x zNztZ6fPAZDcvSy_j*Q#zRe2pZZP~)T1!C|m1ccfB0Q!gIo(CRcbx=>mW)%L1N%kLp z^}Y_Ty6#So`e%G^;-cQ-3LGYtMrw7a(cTDSK}SnKAo_~{ z?9INw_@Fh)SvDso!4#E2R2I=#rSMV9keTemTZ55K%s=krdVYxn5`Ca4lHb-bs1||3 zR0^RKL3LK>hft$qm3A(=5lJGi8|lmo;hDD-G4U`PH$s^E@m#USxp~?kGzLyJ5^Y`d zm#S@!DZvId{s*p7&MT-?}k_domR6mvzg#@cpPB>`{V8}K;YAO? zB&paGMle*1qSUbA?MzPSY+Pi;l4!7Cp>|Re)djtq4Y_D&0{3;&^ocbxmI@%}UYa&~ zSssQm0wzHX!SzU;oxsPmEq&n2#Q4RktK6X-7uGY;t|80$rhIeBfTUXWAb2e(CG<^L zJKRc(p}Tz)9)8Hg;(weQ2ET*yLPHZ8C%B+eVJS~Vu#+iP z_awM+Lb(gZcUMcemsWD)V7Kt#m;JNm;|Vv>)RJTFEl$?HdGBmM+BvG+vw2+_HQ;ta7~ zo=GM)(TG>LzlKIUYsPc;)gx`l;K$3__H}(N;|5U_vf_7nNiBTEK%orEJ}<0=(APw? zH6Toax6E3jm*Sc%R>^v_lt3qIR+sou`_KG*(WW!wwh#<4oe_4k*k z$<^RMs3`RAXmKUTIv2#yR3CfC2P)(U&Y-I-TaKqilranN33P>1L)97y zEN=dnE2nwcbIB94qXSm6XC<9kh0!Y2#1cz*RwA*O=aO0t8q0rIdM^Q#4?h4=aB92{ zp=bo;+wZ*d)|)WOoA@ppRH}Ie>!psKf2sGcgeVeP!mI^aF#8#$JS|Gm9LRk*H8cjY z22wSfhJPgSumkCiiJLJV*tHv-MbxK<1wb*kMuhPakCC1&3A`G9bAmTq8hX5VA_YF# zWqk6R3ZKxoM}!)(XmB1ZSvaWHx-Y~fUcs9eXNt=lYA!Pd)|rxGp{!s4QZL>RbU+;i ze#8x|)~CF(M}e)9DgG6nF(W4w0`^cPXdgU(NV};krJ?j=I4GnzA`5{O5LRkVJ@r() z{HI~b^kb?hIzS>a{+WM5W%B|Y5?eLYk(p)rvukF4z-6@Nse(^PcPG?_Dh;=b(F5EW z5X5#sx?vNC4>%{12oQ;U0QI%3u z2Dd8?CXG5+=*qP5V-wsZd2Qcd!&H zp2pD8>6ylWCs0|SoE=HPC%Qd5Eu!5b6lT1QW5_X%$z4}tH5q6z`f;6X%|XP>)4voU zc;tSNw@HsM1!qI^ownsGBPo6>Vtfo3}(lhPyw>A7@7oQI3?V}-Wtfuj!SDV6G{nqc?VFVyP>?969zBUV z_43G51`RN+&OOexvLL8gr%X#!F-FxGbc{P}0JIiCFJHN05cbV5>N3WLb!+v2Qi@p* z%_%lfijiQ$edT`cM3Q)5ci;tv81CtVauGzEy&5`1>h2#aJf6h9((!opV_`Xx-}@Dt zlx)Qa$l*ciGrM`bcJ1c3DL|UtqZg^W0-N=|5jX8_IYrKAs_*Q9YJf@tgK6YQqhkyiJbg$njRB-& zVirtN?G8+zp5_h@OL+XAn%tB-y=ZC%Qw$_nlk&K8ivb}n!0(~C(dPD44%}R8T87p} z_{(bzB{cTYoyhV86Eo!YV2@Jh<8;HnIZ|eiGDuKRfFs7zo)EJNqRBXBMr&g9XM_>N z?(u;mLTKQ6O6ckrTpkJy6ljPHT1y#St-XF}DHk{7Z!9r|uQOifm$6oRoO%An)D8T* zyMClZ>+8&$XXZTRgk_Xaoy063|6>Jh*-&qdJDOZ5rjMdKfo>w@77}HaR`! z8$Y0?4VlxF7CJO7X8NPM)ZDJ}woIHKT%m+xXB4639MdVJ2y5v1@XQRK0ORQM)x6;t z1ui-!rGz1+CeN-gLS6)7_{(xO%}Iq7H>E})JkZ`(LtUjTVSH*U4Bw}*G% zP;sSOb;ZIswgpXo;8H5aSj6MfRb1)EDHIDB<)%%|bL!1K2#68n3+g_jRawzl6aYh3 zk1p}T03!w;lP=Mj2wW3+aWhBZ*wxk~{kfCe{A?$KOD zz7S)mnN!oGBZ(HCttm~-E1L2e7DUpe8T`6zl4~iT@veYgLH33JgOWHv2$it0ZnpY9 z^c$F9X#ZPN3&56j1^GPu{WZcHK~9m$lr>75QTEO9K}{aJsM|)fgki=`swH1UnXrP1 zNfS~gtX#tACxOO3_f+qvpLyn){qckdafbU<>Ltb%`@@4?e)W~t$}=L~3I&sQwR3{m zPk+GB7-m2HB}|Es>q7;TfEgT^d_9Pv9g{MRy3Pg=gVRjHgvLi7Js%eovcwXVN=%lZ zQnGZpTk(aJ*ge$a8M{4rpm>CJhY9i=l0Jbhpr|rLMc6wii$Du129aMs`lvXMb(5892@S%;os|t0C=*&x@p;Z*?WwdfVYg?RNfWO0jR5tLo@oxj zkkm!y4{9fLkd!gwznM7wWz|kpItjIt_uqf_Jz<7iq;J3d=G$+)NkiyspA8;Tgb5W- zfW=stQ0q^yk=8%+wE9O>J7E>|0QG|M%EKllM-QXQNk|iE%tE^v4VC1va679ZSJh6O zFhe$5(HGB>jGiE&d{Wqy-(1V1rL%DB*6yhB{WQ{(7<-1 zjTkr>I7zEuhXy?hGvJL9oKZB+P}L-3qC3MQqEj=d7KF}1Yzk=*1_(IdfO8{|gTYGF zPDC92xOUss8}Ye<9PaXr5P&A~6RJ(VPywZf#0$Zeb(y$fy^$|skE!H~)0kE9r7>fu zps0Rge@pQK=0Lp&E&dn#@!yyrO95g0x{j_jXn#Q-AZ!T()U?)m%H9Cf*46PRW3K`?I*D1=V6{SKS5~O2mh`a2Is0jqo zxNgqnTpC8)6hKRWJFgxMLsGOZnq)H zbs8nXA2kId2Yb{jcud3w`p{G+Ga^G z5A2lu=qe48h(`JmRl|XhDiu;98$liRRW2Jc8|Ouv?0<7?gyhdA-lxUZCQ?YK!1%+P zhDz#lt-OvV^p+8XkOqP9HJ|GrH(Xkr*e>W`K|xa$9@*w9ZK(E>BdEjwpqfLagB4v- zHzlYCphy148C6fNz1Ckhz!Zd7LMUq+Xb65lXn5i2^MrP|Eng*Y#)Qy`M6ounb>V{3R zAmfKU2AH-XNtz44ZkCh{uKnr{Fe$_lW<}-5vk~y%5;=DHa z{9DW-?Pb*?-{rFB3dsdhB!cMSrVb_Ko9!cbK8X07zQT|ocf=eLjM4_poVaBU0Yt{* z_s}GDYl{9}Sb0%XuB6zkv@=p_G4*r%aRt}S(}0O!-{T7IN=dHYDy76e4`)Lr{B4dp zN|t9A^FBC`GR&&Sw7dsfEP`juN+}+_LoA|!RIo_CxvHsoSyPG&EMp7ZX1sP>P&;*{ z6^pn{{lp`DLEJaVoDb_a%t3DO>+8@Th)&9b^Y|1KAOnq$r03#?(z*u24kD^h#OOkw z82RuUL1xSzqkt+R{|4DbBmE!&la7Rdcs(DHRq(X zfcYwwEH?K>*@L=l*)n-Ig6bhCA?))o4qUfRkF*(3H(9`oB@eJfT7?u3LMivpX}vt-pH48YG4V{{=?4Dc$+%+hghLsT0PyeVA;u{@Z0hld zF-2mCVTz(LuUq6@=&AF9GKw(@14345>)Bm*xfS)x)#31kR4z8o9i5Bux^Y=W;tWfS+C z9tJ0G;ZA*n4p;YD|1zGu%n=Pb$blEIc2qzA9PO>oJ?Hjkv@@IS=T9Y=T3IK5D(42! z>d-(E4|}|+b$|&_yBko;+q_D*EeRB|T-}JIN;IPJ)CMM-fs(XNLj<^hB->5>_-n9!F}8!3TmzzA-U0&!Fmz@^Mv9s#WDjWe>VXL=Av|4EGIFEYdnUVz@JAU2ug@*DyN+)C4^B{bUJ>|I$rRpma8fHbC+DAKNk3> ztCZ43BvUFxLISItjQB>)o7w!vBnahn{oP!3%gtU);-@BVov!6ZQ%%vfUB_V!LA`n9 z3{kFiSNFv9q02ni`75cjxF7zf(#_DjNK1?X3d8^|P+|#w4{KQ@`)2dNIY-A?=Gd`j z_po9Ib`Qs@?GaQsI0D10%A#|@7NMMc5`2dB0MoZaTg>d7{Mpi*lwsXoRdF03ER0dYdMS@Opd7RtJOTlLY3&$hEup1r|=^4 zM>MLQ+7>O(>W~?cmvS<^XbU)pVgf19yDNlUIwXNg&c-sBaE=xuO`LRRSi@=S%FO|C zA6zn9E)YOPjIve!j&`-elqOY+R0xa3rZ&TrDqJ%N5MefEbOqfou|A?=*k@pre^Ezl zqQxzQyxY>#U;!#H|D_5H*WIxBqHI2;Lal4AF1eIotQSV|h**~jOqO#www^YKP-5Ig z9Jz$EOQ%;{eu=wh?Og6&e7T03RVls%ZZc_Pn&Lnl1x)@nJc;4N&B)P+P#2R4*Fw!A zMgZs1SX@{|C*Y#YLT=>3MbSdPpznNz2_$1^#rjjo=iH318?8VCafwE-(!D@q?hkkC ze@>-BqZS(Tr$XhR%GFoL#gAAqDN81Nkgd{;Y)du_Lz>9|m1g8!qGDLC z&Ws&1e~g=(r8bjgjAkFMXh+6$bjRd8->e?acL&aY2VybP6@X#EU22v4HBD!n4(%ug125|iM+~%2)1lsUIwEX zRPEnDr3C*+O7zfie>G$giYTm#^em9P@BUJlp=GP0Ar3LeS9mY}KpPN_2uuRVh-~yF zf=Yu?PWU&veS1)*(0>lE1X3GEG!b zS;Ot_M+jE+W)D%`JgAEA?lJeoXKe81Q%@u4@8AF2a~h_7;Kfk8p|SIo!LPD3`t{f2 zJ{t3Sn4%J!JwAe8!raYIG)%j~FPu$ceOElC1Xu@r(NhVl$1IznJ$Jq~)W!6&q}+iE zysUs;R^D}&6>Y$m)iQeUAo%rPgA+I;fCJ)oJMO^zA$KZ+ zI?52klXCWKm2sv|pWfN&>D0B;US(4rJSi*^Sd>4w);|A0VELN_mj3}^{`=#PK6Zcl zKYwKPrPRuPBiPmmz% zjbFlZCcoKlsojd`A}{o(Fy_O6F)ta$l!mYhVF=`czLDf(-uPwCVAdkAaBJ`a!eM~SOsE(@RJQ4B0uB`f(Nb`s!b*cqJr&J{s2akG7|HV9^F=HQ zDOR^ZLm;H^$KV7s6#kkiD3WX})VUugkWbw8DNF`8pp5*a7D_R>{pS2F^;3Zp41>H* zYrCzlG;xyAX~ddo)A)>kbGNX?86~=j|Ap$J)D(>zX+_$K8U2h~u9$*9M8XP}eNFS8 z9JpoDq)R1p=!$=lZOjn204+gQ(WPGKFh;`4>F(5C;svT!Py*mGe7I*XH&8&oY-r!5 zqT^4jQ9Vc0;*aGLE>Xoz&e3U;nB*~LjK>q=84Z@a@FMgSe|~XXN~BUe+n?#rNW&;& zVHB`3FooEITlS+gials}&6M0~%*Zi-7jf4_>#AurnK-y2^hd=+Q^THXa-7#@nj5`CH z`Ix>j9dVDiZFVW9YLf&&T(LU75Q{*VJg()S>DzezAeVTPOR{iCJe1R4pXLAugEy^h zKk`>4uFRWaqQzZui1^8cAeY?H49DXi0C2;dHBs)E9qcT zFbIh@)>dM^+pq`%LBW`Df6`ndbz%cU1lt3}=Y{*Se9GoZrfc>yiU23z34LnF;TbYf zXON+P;Ad;?SLoNc`xEPJBIkTcHg02@8=%2qnpf$z*4c0dE7`c6{gDr-L6qqNjYM?e zA8nREVkH|B4$5{?DJ0-UrBBzwlKiA%44en$K9|@WqPoq8q0QwlD%;2$0%YLEmPq1T z#TbQxRc+eC$thab$vG#~GdVG_lhWUE#}W*fVamtSWy@BqFv!pfu6tI=aJzObj{#m% zp`HSnAVZWP8)*zq)Lhib^2lD|qxgV(w{JjzjHh7?{IUWJj1j!cKkJ?=KAU(hdbVai zLH3t~SqOw5Bh0#eeXWfZPN9Z@OhOGqEv$9m1%C|F2(z!g3twy}zH)MapzsC9ngb`F z$ZFbmnFI!2P{RQ*%w0-F3a7|-;0r6_Xc8Dk>L8P#81aOgVNGfg3X`~+A?P|{wqtB z26JiNFvE?k8bz%}m=QLLXNZQxDJD#u(Z?ijyO_t8K7XG7UcQ1EqKtqUX~li1B33w2 ze1S5oRCA(yrkZxbeRGYI#TbYpD%22Y(L_#_q17m3>=`6pQerG{Sfz#q=7J2#>Ocm6 ztCF?~GD1mR-5!O3%)a$na6{N3 z3b_THWNNwfQ4)zYKL*s0LK56{gefzlnt=q+m@I*W$07(MA+=Ou2`6!3x2#e*C7{9M zItFFJothx<*TNYRNCIaN=^2DRs6V7=@(BCTVh1X$;f}2j^_$E1YiJ}6d4!ejME+=e zjr~E=+314&`EFbth!!$gs(kxTL5k#C2 zh4*QG=+aAP26=?`7r7*hP3_HXF_u(w966FU%PqwtdnLnJc%(U={_4K!%N3kJd~l!2 zZU|hNGMunP>-N^HV1QThIxf0peS{cpnlvat5bZ`MWpcL8EvpB9x`rbkl7LDQNmmWW z&b2GVC*fSi+$M$OcI(LD=13-|e$y=gz$V0Tsy1&apx;X@sRmfc&Y8(rvq8~{ z3Xd62rc>pa&6|^4qJEjgeI@)Ld`djKuSolhi6{5pUu0;gP$U9c3d{yMI%XO3!rIUC z?*98b*EdM=koqAl#?#@F=C5tq*lyy-W*QK-)+=&T`rnBI!0j49NL2)<3Sku-=mc?| z8pUG?wvvC&oU2j*G;lPC9|sN|JftBa?r@GhVy6Z}$s458Z-rJDp~(jy#6!rs?`LbopmWxX$-P{A1sC2Vt z4YV+|h=lp}Mplr{7PgQb56_Lz{4zf}jktdbHJzO8C6P7~kfrP{ zAp=Dnsrnvs$~_}T@|Uo>6H6lrbhg<|?jxx}vWPlmg)GNwFG-3lA7n|RjEGp01VlGH zHG(MVMx{ry!{bzUdLOGDNo&UsaPB$dl;!q{t45c=D>9Y1N#8UjIflH+Z(9f za8V|vY2mg1X(r^{td9gmrrkzwXR4L?nZDI!t66ZD%iW&KXTPossi2q-x3}I#;eJ{x zS9+2@(1nG~TvRofvNqK3ub1we1Y6uy$8ql{>@ZWx$~rKM22ygl2U#fUT#OzrHC&f^ z<)SgNu+cTvMj)1>M^~f~@NJkXY#f$~Hlm7-r=o-7gnAAY9ZEXK9xJme<4>Aeh%OVG zD5l^*WlQ+@iy36@F3O<4^IAB+*Es&B-qe*!5*(dfb*8N{)tIxy>26F8f~kWP1u-0Q z3VEYaqeqQ22Z|q_;EagypJ>vVX(o-01-QC6q@EiHSJ_*sc^wwm#6+)+l=sB#ygUHY zL7Dc60|Lp2s01>6u=m_tyfS>DuO?pV`Pn-KGQ~-0h094DWXp-BsJXqRI5}^Il zgY{Ev?5w7XxT|XUp3qFP~Qp$4*6qdq*FJ_66 zL>{V5HtPg!rI*EtMM4)viaVm8xjQ?5o?Y7h^W2^8XV)Mqo2J~2VJP){T4y2W3$>K) zWgbrLY14QHfa2Iu5dAot<%v~=hZ2veeUx~3J_%st;kMJc*)@G808GGeozhm}0bta8 zGRw!P2${lc4Pa zP3Pv;Y7?Y&p-v!C*C?fw;$i?pN+~;n224i`VD*}w<~MwX&}*uT0f(?7{-kYvS`{D` zo+TIrlEvKmC8L_aHoRZ2Q5gz~L6x~5hl@lNr=hMQn)QK-)&n*DU>SZf;KZA~C!WGm zo6ud9?Ao9QZYjG#i8G#{+Y`be{1AhP#>^Fcp#Ospsz?!=N+BF<2=uBv@mXz0fd-^c z#N{0cFd`g(n91F*9{1X7L3<%yz6s&H!=SX7aI`P=qmQWX*p8G>tTRX0&2`fG8+GQ2 zyj9;ZT~Oz)PF@HH?w+d|t2%9i_R?*@Du^TD<=$0R-HGk8y89b9D#K@>h;$e37PXxR zB`Aq+9))iZU7qky)>iJ1+h1Qnn-^bjFQyJ0IQU}WV711;9XxO#e=zeRlQ<3@a4%+G zaL@Ndh7$g|NEzGgL7gBt^PIcPP5 z{S#Gq{#zBEk3VvM>h)*g&4;*Df&k;*`=;pT?YG|2_>ni>umTVAndk-u<}lpK5O#TJ z{Rm@Wgr#QSrWQR$RUZ~ETv0s*wn0tsC#GSW*gFejao;g!h;P0E-<0(jc~nB*uK-7S zOb9ZQk?|E_EWi+6^mm$xF0p>E=pw!m;NZSgQ9d< zZ~^YG*wDiDR-mJ(Fn&B8!tTNv%V_}}cTNwB24|qmNSLt-(5Fg3UKJowj#jkctMw;k zndshtYbE$ret0YmJr2h4O?@>hM3iu;07qNeFS^)Yl%NV!bw0-0Jg${-nvQaA{_Omj zNvubn_MVKaDyP%klVH@Em4n=<1a#8_Z3b9aJYnCX8G;f>zZhU z)m5vC8s`uRss1o>ZfVnUIanr5ikM)cx4&Se%`{O)nuIquNi1q-UvCS;Nb-}bE(2h^ z_3`AakH=k^(xIf;gHgH+u26xfryWfiwRJ3SHhl5Za_qD8|6-x#s*4&>cBde8D5ErV zu`^1AL_4V@@|pZ1c!}9%yg9N>eKB^a6o-W9fu6g>7qN?-Q@1w8@RAKukfpdKq!$w0 z7+tXQn(8u7vJ1DTLN2DiyPx}|ewkaI(vT^?Jh3cV?w9p83ENgwTZTvp=`7P^B*}m? zaU+5fL@uCRG?TZYQ6P2sYr*sGETaaWa_Q1d`Hoq_rN!`+E&FO?F~;y*^`gKsv8ebd zF-DVKGlnwr-P{^(l8Qw(o}{xwEj}t_6^Vxxm}$^cZ`y4%>Z;1C zj<(|5r=TW}Yen1g#!AR5(5xO7#GHDE+NJ+ z+7g0EY|JCZc-scgmUWsMgO{hH@}{OQy?CS zK-K6h5_#Ol6d(BgeL)kD2|n2r{yf3Eur<5QZLcSA>?C?Bh%?@sE>ORx=3#0b3grH= zFNVU9v={0E-L#ib8gfW4t>o*<+soFIiue)=L#hk?iG45TJ^351i1G|qPD>MCDx#pV zNqlm`CZ-9_n{Q>*@|kJk3q_&j%U7-l#uKEMZ>~~N2=N6{vrb`3LYNu00Vmuq0O0{b zCc{(QBYn*a{J6PI479jIZa=l3=iQ5m1MXn0CZiu>ar7nHPc%!^l(FQLIw*q=jk`idj)igJE*o9s!DiG>pRZc?IUpVN@D?vJPj_YU7ht z;0Zq3mCIMS_$+<<}BmUKXJUP!0lU z?uBm~qFB|;7zHj1DvV8fHAdmCLuaAWhqDMH3T|4hfY0Klt>-igLX?!K9>yqei5LaO zuM#UKd4SquLfLGD@|WO2IcR*6BeD+Yl#5DD8tpa5RlhIBM$KoO!!`_NgW(`kjB z5zeM%d5S|_Ad+SFh-yOukxVEJd0ewq--AS?u_UxOb3)n@<{-253Lv8Nlf3Q9sLMT{;Vi6_&eHmvB)> zbU6nTEEPXtS{$469(>c0D3 z0?GHmGA`4uDJ3R}aHY75X|TePQZBQ`4h>~o7}Ge73cv1&FxgLY#-CJ%}vdE{ML zV;MC{o9n0$2}O!xkm9hap@=OhP8M2?SryAU$r;+#xV$;ZkyzLSYc$=Z*=gXAo74_> zyg0F!ZiVnj-{f`rB-%tN10|Zhfk>NyNU^0bIY|tR7+NB?N)7Z1R8B!p$po_0U|uG} zT$@rwh(R$7kTK;fz=+H$F8d8#Y3;C;m6UEcqOwb{s<<=i1K%2rxN)uBU__^v%8uoB zp6-<(N>#Crf*2vvg^g66vJ;GRp{oo8is*L8384OAa#1;Ebgh>K04h@XM<5au6eVd& zMt{C^sauv_zI^$L zg)~W7B)=iAMPT}4EM|!|^|w!SI}A-?GV)uBTR*3pj&4E#2Tr6fD2$`)ll!_oJ%Y}l z3G;{o?uoDL+xH|x=40h#|Fdy%NYx=i*vlAK+$%{CC3^itTr2QNw?SyuZ;W>G=dyG{ z;X=(l5+HfnaMh!PS}3^EPutokp>~R$XNFcdowD%>8w5XDW0(GXDRfe{tlVRjA>ahZ z3e?6U3xJV~GlmN|(fxXWWIhNddmljwQWx<)-4_#qP(hx1);-^gGSGnoNI@!h9XfQ_ zzmz#F4dG??%F(<(%smVr^gZ4VzvK>GW8+PK^(+2c7#;TP{!lgoI)EH(+LxKB>DIcXn%%%HSC{ppX8${(#A`FGk)`yOr< zYex>Ca^#KI-@q;Vs!dAcfncYNx{(hWr}TLK`RAW~ju%aHea1bVqFVHn-`Ai!`xr`! zAjLgWjfMoIaWW+lQ=$h_VzdG-mfZH@Hun5(*_z*yz~+_PI(=K(o=8DB*<@Jq4>Xe( zj7f@(td(i(W#PJlC5<-rL*HAVMWWz@LB+hmZ{c9c59&*xvS=k8B>p_FIVA+KwlHzE zV`vu7!SrEy?WW0t9SrJ>Yde+JVLCgY4qqAn;8{#3;-EQ17i&$E&k=405MmYjCd(h9 z)=-HO_%+=LN5zf9C!H)((rx0d^dpD`)9VP?Fh`jm#huQ^HIT!db-IvaoDC|mmLQ2N z=0zcf5$hzae;<`a()yGuO!^4g2g=8FAy+PI>m1zHAXrc~WW5b+J7U9RK^A+6K$xAnMHDu~s45JB7xEgH~GBnsV{S7~Yl zaY`xW@ARv}NP7Bl_=pg8W9DzB69DcCeMaCTNq#7Pg^QXAu z^2gSESGg;Xx(7HM4ZoK%*CfM(MPZ3KGC)WAyz|c+N7~AY76c`*@l2KioJl+A*fa8D z*)M#09jpiMsKS#sQ!Fhzo*`}EhZ|9)g*GfF9$FpBPBeKrWHfR#5h7=gq|fUE5+g#7(RQM)b0X@8l=e#eBkd>__30nfPgmgKbSI z<+<(69WCvX3(yIRPVmyI(8IiwE;Q+Fr5>~r0f9~cESRCTf-Cd3EO;W&OhN@N{{@v+ z%I(HMD-jeJ5ddRnX6fT;tq3Kb(n)j{B9oW~#~p2H=|;bT>@Jx^x5N}U6KsIq+iv4( z9|}C`gD{ocG!no>^W5eHG674hveS>GjJZ`^iRkhbD^~cG(Op${-?iZG++A+v^?ZZt zVvHxcGD0VU6Vfl+NBRjt*>6DfWbFPiRTwRPH8_a5|&t zxu)I%%1dK5kv!rqOkCi;m*R1v)KlJUZ;NoEGx~9!q3;=*7@4T8!F9UWN}DusBr3P^ zq>#I*_N2H?6ny+m)d*fUqBJ`Cj)RZZGg>}tLtH&{;==ZuYL%mSjlN&9mY%BSmbt)* zH$W+DPi%{}CwAnwCkgdSww1Ql1#yIYa7*5{e#}K0i8l2Wj>J@AK*Bq3a*4LlNH$>; zYg~%y+>kLySzp+YUEjGO4Zm!_dD5T%qEC4Xzrk=P+Ef!XkxfkGE>W-{2Q4vxLgXQ{ z0NoS2)1nTBuR1glxn-$sxW~RBKdHjByc=<(-rofs(hs!P#!;~u^V(~#zy7+Q!&DKC zUyWOG!fG4B9l7~m{$_4j9_1{>Y*9y(+`QkFyn9o$>1)##4x+R4&8?vgQw?hjU!Cmw$S7zoVq%(K4)IS8THPF_49@9#l~ z1Bwz_ywd9xlpe_gzy9^BzgDyKtGQoCua44JzkWr&4eXZM466CpM{QlWw_;^K0&{?kft3fd}ZJiEG?b9zN~TjfEk( zi1Dhh2MH&wdo;1vgC5-DJ$tYbC%DsT&{oR^i#vOA&cVDAiBtr|9R(@ci|i^`R7%^D z{6yf8jm9DWoR)w@o;MOHHD;MMf(}AtLi<)Q7}D6L+6o^TNn!{hb%UwiLuRurhgG=5 z{N0ElT8&#AR5f^zgHGBZ5dlj{BvNeD%C=ZtFKWHbu%Xeg#BevPI6Q$0??>d3CL+eC z<=Al(l#m>kY9A{h=L$+Z1sN7?U!1;#US6mqOEAec`^hQE6Ylbw03;{ik98;ZQ#EEF zFd`b^hTHTsH(Uv~aD>WF#)>hJ&jqT)#QitaFDUni6m>$7%YhLE0a1^Q=~hsRJ+UD> zRT)Mwa!~rouW1DfRzc(O`V^F@UU)ZR<6{$9EcSVLO1>fZdS{Jq(GqPtsl*<2CQHHjvnbQ42KV3GhO6(6mg*}>B% zBEf+2zts{RTXo5EHY1kA?i1r{E7^z=D@f8X-Z)$O-UR_lSOQd$OVSeg&`XZ`UsQqv zCEY1Ta&6Ud`w^sA=909y1TayXap>aD-Wc6beLeCfyd);6=Jv^@?ygF6Bbk;&*#=6* zLaVZkyeQQiCC;dpSWE#HckC!^uMPt-w$HVh5MIE-^_iNE z)}WZfwmK*(w&7#urq2d&F+GJ(%L0pFMtwT^$ogO#Fl$&s;U-Dp#%-*(f#n21zRI(1 z2XK*jR)O3m+v|UBqN>9pKC}~GZYE~g>Sp<5L{N;RILeFwgcIUEksqen;diEXQH>zo zmC4rasSPbad-p;$DN&8vcMJi#tfYu(WJSfRf$-p7ItL|%AW!05!5V2Pq0_k1YWxT0 z%3HOEE}&1S_84CC49kV*m-$diZK2rXrVl{=o6QN%j+^-sQ{+Pt)wnzBP*UvdUU8SZ zrwJhi4nRmzod+$+poTEX;n}fc*RIf9th)oE$$hf#2}F*#VntsMq1k|jb|wUrL*N-W z1I_&U*Jc`4>+S2cM_zmV$ZJQA9C^L{$VfipP8!)jIz-D$WzaSOV3cW6o@AA5BK+)Pd@qNZz3A^@c=9N zXt3J{zyIKOzZKBDCnd$bQ>TiLMyIGPsBdtk7|y(;f%7J$^p0r;mSMLaWiJ0zozP7% z^VsA5(IkSEf20Qhw`Y$mDZzH@cIR-Uc%DIpZ5@awaQ=>fEE{5E$$>1-8M1U*k}3g( zaVP{Z*Vx!3s2}Y#2VT?){mLHx4YpO;tAf;;LhzPjx^!;WC zx#Z#AOto1|Cuy!%XAugrXS;LUxEeBf()shwci(dtRIh2k zE!c>5&|XM+i8ZnGg7Si=)|xVa9iyFFp&e_?Xw?(bxgMUJ!({m)vB#BqAhrmb;T+Oa zopK#qgykJ*_Z{pjX`}9#FV^Z56jM8&>&pok%IF9&{0)JR`^n@RZ;YLa)+?kyAtwr@ zeaSFbZV3^jtm7{MdsNVu4<*K);7SC03_VV>(oYa!q{7fM#bd=370wkmxQ}EQ3O`tG zt@6Vd-s5w}MaVGU{Vvoq`7+nyn`(@EE|n7FF3w-%X%5P8;Kq#`SA=#7XV&p3s~efu z^12*RKb{(dsDi~L9yn-eMI^z_bpdoN3JKqSEUvN>riA=rVH%A z*a&=-f;h1d)?>Xzuw{M}%Wppy*MOFWU?9+8-bCoSaO}0MTC;jO+gS2z-0EpK{qDW@ z9=oUlJTm(&i`y9_!f;7731%MZbnH`!dz;A+;rN(#IFEsyZU&VbZZMtzb~I0gQ@A3( z1gov-FM=I6u{NB`$b9aiUKfV3Z|8GD>m+mMGJ{6FLL!|$;jBKL8xkr*l!of$ISeIz zEzrr~v~@UbGlHDkSVOEfW`7fp-qY7vsxHZsvAnq1Yw;J3Es zv>^`W6wXY&>V!-Zm)duvc2Zv{?PvgU_&Ow@9%;sL+4e}`jtOhZNa>Qui*fwsKEXg@ zq{BO21t4&U+mzkB9Lc7LWCNZ6DSWVx`k{yxj*WZUm^;D8D{FNNhk@XMSt33f?o7&bL|-%E2RR0 zOfTdZPH@6cE~b}%GdbpyvK;dU)l7*fuTeI+rZh#C`ytH=|ZHef-iktaoTqt`aR%m)Nw2n*j>7M7tnnv`s14HXII zy}3qOR);b*h1MWJO*E`Z6VX#6h7TX!hF+sml4sn#T7<$*;@p{0*}1|fvGc~+h2B$2 z@)v7sj+@xP)r}-+vM%xTG`q`FSD0`V)DdVR>ts$7*s?1%L9|`x= zjks6_?OrO4;6w=qAALuSVw>I=@ZAwj_nnEhf)TXl_Ndn6ZnFeeet`I@f6Gm`;9gOa z1s8rQNGc(fFZ_lsmrdpp$`v2E9cwFBd&tFlg}Bhm0YJ=*O)H2d6mjHQi2(w17(RUH zu%M`MHpmE_7Q0}ir90dt8;@rt4Y_=WR#eSVG0BEM6^&1+f+TdoK-RxzqBerm;$&LhYzXTTs;q%0`9ZNdVIgtK}etS3i{b_)G~La%ba; zmIjV7kwNd9n_bKN<~p!46pxx$11eusl&gRXpYUaqz8Bsh*fcG`PHR6DO+wp|pJmca zx;sQdof2(Y1Tv+|^52ix@#ijQ^jBpCk2-@`xOi={BGxcC>?X{Z^aSPT2@<$?_kSuX zjV{6A3QVPj>#wyn11^wDr6y`a-_(oN+SLzqNo->=l}2~Cn@Y%OXCjSGI=F>`RZs{6 zwsg~I)K0T9qOhg4A2s49LpN1qq&P4;?vm*qPC((o|Xh-1^pSlb%LF4+@k9K z%o%=qZD%LPLC-m@=;2xAqu!R3=CV0GMZuTW2zt?`o|~*)NXA-!W0vYswEzb1FDon{ z7%e6)6HL_)u(m|sPjW?&zqTaZko}={lQqDu7!0@7x?1x#XJ>z|+C(e81(Y$I$?wRR z6K4BNs`^~f^R~zYs(@lN4vU7OE&mRFfE*Yz3~ltmm;@k!Z}eX8^s!JToy6uHMlTut zh!&wR8Pw6J6m3acNH4-max+FqMcZH(b!c!y{mx!U73lp|R>EtG29rXxz?xbcyIG!i z!teWPMS=;f&H@@H3PY5ou(Xc>w3=5J_~k`eSiqNX1mD@8Z3ED@GZ4 zTFlbIDxcmjX+NyHzwL4!;Z5h{TYc#w&?IORdo-LU^g=rvm`BH>x|eFqAe9s!9Z-Xjqa; zMt*o{L=i&C+l;qBC~~=ExuQF?mi)LB>|hn8^u?<8xJ#l5)lxtRLasS&IjH+VjoBop z9DjVC<$f`tAhXoNTKe-tiG3`ok;*bE7+hql)eu^D*0`8Z&imf^)<8g&0-b8*-86qTFg8U?kDPTeEzuHvF^JbIYl&7aeuFPwc*3wA* zCUBX>>pwTl1OU+;0$x}S6h5r2D%z{ZtSB*MW#DJvn8#aB|x1m_}Q zC=XO;vO6nzwx$xs!)FsLc4&=Td&bL6TcKa>My#KxSaju;SDJnob4c)N3D6W-j30a zi=jqW1s3VjQIMvW1fy+mvUIB%bub`~vsEQ_PSmVvC}v?%1@wQBNI(%-IwlbgixG9x zqy`CscE)nb{tJq@aoKa-IW^GrSwTfH7?F#`dVI`ZYa)uI%C?d(W+YFBTa-c`mp+b; zlAy)M-BQ(sBJRcvq{qQ_*JWw)k<+&7s#s1@xhRUeeDac0+Bo$WwJhHm?WjRHA*^rT zk*5Ju$_ZW;w2JLB}7Yr_2Yak61GW?e8);7@r0kZ%rmlh!12)pN#H2 z?`JB>F5$_w1l@!u*W7t?BvI1r6VF-^Wbg!&PFVmmybA##%QMY_!atBs{{9K`X8($l zPf#Z^#sC+e=N;;^9Z^L{%iWL_n;A}<|EQba!72Ek0^IXw7s+~i*83l@{Y98xC27U zb)frW$)pHpJY$@JUeP!-Lb_N4a4hC6YD_{Ik(Gs{l{65zC6tIQko&b{2a&}-TE~uv zLn4a)Y0cnTepV1N7~*I!wZ#BNrpTT$O32Y72EZ$6gYlt{g3*U(wQzo9h9Ed{6c8er zBr=&q)A6kaL(#{bl{?!5B8l@n^`7X$92$wAP#3B&%9q{b9wuYhbXoGrsA9Cm*CK0+ z?uSGgLYx~unFt7l#Kj&g7B*bAtIOCFcUfD^;5cz&T8pU|W(cH;O3%vjH))*7wb*xEE|=zy?zi$UcEUaJPypA%Rem5IO{i1B4a~g!13d zyS^EVoO4+tjYhJjt?yg+dY8+zP4 zOunOpX%={;k}pn)aeO>SH$#uVuFA>l6m*#vbm=SUzCSmKxymkqL^?-$Kx8ShWYN~>XXn*fCM)>*MeZe>(n?*x*2cjapv^IY$KQjNVJ)c z14%Mk(YjVg*49(mQ-uIOsb(U=%tVmH5p7A!ojWUpTgHu7I~7{NmByxxOZ>?mn+6+Inh9epAp9QQRcjIw+!~A?O2zk4m+_#V z1ocFYk40N#_uO;Oa7iboo?9m}N3gSikx+b~K(&gy|0kSd6&JL|n}Qdk7o-$h%CVBO zGwdo%pmGYAm>_3YTftS>#YVMsK<#&&0Cv(VZiotKjaDq--3Ei|eUtn1RcKBM%K2tx zT80aqlh^#}U>LhC7lH&vpNBJq<@#wrc6hBhA4$Jbp)>YWjN|^8`2&`af9~WVp%y4Xs)Kn#Z)!(E2`b5!gz|(!4Re4TC|v6R z8ry0#vkc&rdKkfR1WBfFEd*Ezlr=$j>ud;To$R1H@4WkNlDf%&PQ;Xl9^&POa5l3U zu{0u{lBJGW;_umQ?eUFph_XCwfMagfvt)85qM)LnkD#9bFn{^W8~gU{bAN3h^YNBi z;L&sbE&p~7@qrtnw{w4`tme%({a+8=_ZOvG`Hw+Yk(ct^v+hp^qpJM=>8GBe=Nvhg z$I(=N`)l{e7%%``XXnmPF+_RqmM!$a#UtYF=N)~3%+fFZ%lfV)3y3@Ky3%Egm7uc3>YD91C{H%wINdVPf3YrR1(X$X7OsJM}IT>K=3G{dtkYlR>D-)vM zZ_YHMU6J`iH6f|Hov3a`rBM#jQMx78;qmZ>-iL?jDA7OG0UKEdWOPIYHKj~BT~N-W zMmbTVw&gJZ@yFA(!ln_srEwk8i#vXlVM?O3n6Bc{Riv$Sqpd_g${GNvLGBVR#pHWO zua@{n_53V+sAWrmrYdO&DAF3<{#O_E%+;E@xXed&i5u&}Dx1l*DS~^_EXA$!ZLA*q z@d?#92XuC`z^$r|PjOamR51RD&Wzw6T6mCm@#oj-q-Sec`p8YmPjzj>O(qGGft4Dm zI7UVhyBH-6_D%L_Zgwqsim6lF&7_l0J!R~vS~4el6P|?xBh{X)f&F!68>X76ZSAUL zLV%eG`UJ85QnijV_K`z$4f+cPQ77P|2~WqTk6m%N#aVjrf>gt|z%9&jlv0wpxVR*< zlw&ns;+B4euVk$hw+dY&OyTQ^x+h6yKd`zD>~sBfbjPK5I+QwJ$uuFi>f%f0z&(Uq zW~kUmOrY7}!i0N})>ST=aF3=0rh~6SA-ux>i&5m%+(ZCt+#?~z!#yd&Emg+=K8GBA z^wHnOCIWr9n<-Nir1b);_37RWJ{oo?#vP8l|>|% zC`ORUAjOQ1DQcEWR3z7eHzY@~=lJ>rc{F|y?OK1uOp^rd5&u*h+Dt{7qY|3WsVSbzLVmwU)^h69pxARB>A z4JLu!VM4rhN;0W`&NbKgYYWzo-`)6s*=o}zbrYt@=wxi~^g<cL`*#)95=q+d{0wm@QDahv6L~yaf{gmNiI>aiKu)o6tP`hp@5Vo zcgTgxBBfj0)wR64z$>z*yW)_`>6j#Yi0I9wSi#E9)2d%3Mq$sOXnG06i5ZC1;IV|j zxJ@p;-(1TQoVkflU7{QCW}(i`o2j#4yID@w8_6hEZP-}aQ1vjY)zpS1)JKamJbmcw zioTJGBLw0LZVvpD75DI6it9)_@XoKo-ZDNYJ-P*~;g1BQFH;#hGGBAbz_6Kh$Bbae)0Q7Iv94Xrp8nFbD3FeT=HSU>1 z{v>mVQs?Ji1PNYw`DM97?)4wO@s~G-QrF=fDC0;t}cgLOj^9%q(zNm#v_{-4snKfZ8i|kg=I{D+P*z-84dYSYj_%> zF{N6bGE<01u8b}6xG%nd^ny}jB=ZIm&AvC^JoL@C0I|0;&A;=`JMX^x-aGI7?cI0$ zyQ#kw-*xX4P&wwPP#EliW?nOx!A;TMqE6?zXPNYIQ}BnL#3Dkv`3;#6WUswcK<}cV z9D4=8jjDd$f?Xn-0cJShIN0cuYYPhGP>!{`)`#`PI=9x}_J3lI-FnN-WsnK03X>ws zqD?u@MWT|T=bSgy#^?WCDDyca^C_iA(rgmNMl7SO3$;fXp^V%2O;k3_Fjxld3fC)S zUC?a)^vtsabuFsvp3d;Bo^ZeWcWE{}x8G=kB$asY-Ah>4{2>`cJ9a3n+pj0e;8OFv z;#N;*7P&)a2Vsf zaeU*Q%o_8LN1IVa>W@gL1whH z=psp6n!`&c;nGF9k=F*w>J;WrO_SJE_mv#y9_CZANls^_v%wSkubiL0VA2Ji5R02~ zi14AUjT0NnGjuZRn54sPjXWZ$GivE8i^w%z9*Uq*f|SH1{A&=T&MTD|i()cmK#@sg zEz+lQy5#S(6rQEl=;kOeV}$v_8o$lE7HrUBSbP%J!bMp_6sdL9u^^T(1EIJ@HDJh+ zC7`ie>X)UsWGNn9zN}~YC`K8R3hN6ib^}t}{KK?-q>{9PDU3GxMVwtPzt$k7(l^us zErJwEqGw2*X>DWDwm6F|V66bjAVunoR;|chp#Z52DT=e8leDy$I-|E=&K~N_50fBn zXbb0{6gfu2k2(rU5u^wY5|PGFiZF|+@!2$q__K=ifh(S_os~0sVD<5lgrgb)_X;4#85(bS+$DHVo0s% zoK9pVm_>pUMHW?calf&NE#sNcJXyFrXN#_fuVLC_`6osZq9ohHD$*iExib-A(7F*} zk{qrGMgCDx7khik=23#y7GuFWGKaG)z%cvIflrd^XW>b^Z#$g#XNpE|0w=6R$^wi# zr-t*uS&U-Rw*@jRX~uC>3E!T=0mLE3+1jd%IDFKWg$Rr4DhNoI%Zv&ZUlE>Uq;W=9 zWv>WsQP$Xm{ySt>YUW_Ra!^rXX5VnC_n` zGoWq;FcxrG`7j_N^q`iMO%xLfp>9cF6E6H0GLFbNp~(d@Pkuv0%?A6%aZlx~T{inI z^%ySZxqv3czBF9o2h-*vrA=ayjr3?)VL@LhD=ZdTc}6x;8ZL1!o{JL$mOv$cPBfN% z<=ib3ySU`T5BGok@h6|M$1-hJ!4f-ew1{KevI;XUu`VpKkpkHRCT`{TG=A5tVNS+J zT2~pu(pXGnA+f^fW$fyOfVQ9#mh|LR+&~K^5=zl-D;SbM^h78Y`lITEoYf(g|>ot0!#4$jIis`d+)jT-3O`nq7U-#`w!yx>zT;kd-t7p-}&2HZ@D)+@t6Mc z2DuiVG-RWkhvirP#2k(q@f2W!7?E%ZhSFa7NrPxC%+}hFIiV7XXLg7obpG7d06)9O zuq2UKFq4!RyG5qUUqb~9r1)Zu_$FsIW(g~8!x-P zhX5s(SrLE0a`(2x|90;2@Dgun$dwtan z36CsUm@s2u17@q1Zh0gcK0nBKL(Wy~r-5<7*SyMTS$2)E7aEGPUy) zVksp>)U;5iyGH)_g?ts!h-Q|l108?Fv=#n%Z1-J@sDi!2yr@`<(zl^lx?T%xK1MTn z`Y}Z~Mmr37w3YhAUji-&@2g1y)ib;i4&%r?v*6 z1(2CdCl?j2296n;iu}(+XGtV|9ikR1!(bYv^#dTYP>WzYP-6ki^5x6@iaeJzM{V~_ zc}(CVOaxrE%oIS}VOz2WyR+!y#>ko1WC302@;FVJ6*MW#rJOocQ`6jK`gG=lvfT1x zLNCk%%$k&&9?TR#D>;cR3CEm@$&@9AB8zEwLNT@_v+P9_s$-9he$bHA5`9lLQ)C>I z24j3{VQPfPQU@#XY7wj<`I5$F^5^Oe0|{M%GF7J`w$vytc`E;+lQX>dCzY&^oUT-p1yYI1yLp;T%eEuTNVwb=pqYg~-K+ONcQ|T>UE;2dHYx zmMxPY?oJy)7~Bf@jdRKdQ;1xdzl6{re<`6Hp5&KR80#~aBy^2(MAT4Do}n0`;LH@| z`-P%IA}1-!2=jw#GE9F7k;eZT#S|gN`6ZDHW(lSVrpBJP2S9F(z)02f}~T*G7SDsS1C3X23Mz(ohlg4Cc}gVbc|<-915Fr zOsk?=2^lcQwS80X8kl1asx%m34rwb5aLy47yR&Fws9+c4oL83M(P@WqPLT*B&Oy?| z&|N^A7jzg0=+rQmTDr_d1+*A<|#Hd*Bxan!mM@7=QrM3)QiWHMIJne1E0}v%@j+t+}wpMLHMX!T=^nv8zH+OBx z+Vv%y>Nw4t7P65=X=+2Xag?3=gT}5|U<0#)3X`(%&cl$(A$$q=!xd4DZdULB)kZ)> z=0*uzP}REN0Yc0ve6N4@>k8~R`f6y^o8m%k2X_+_*fqFfA&dsq^sRxAU-IkOe)mnNNvxyCi4}Dy5lqa98#CJg<)gPUT&7$h!07J$?W;l^TF|bGy zyaq!Acx}Jtib&&Wi!i(f$nA{_Z}!h@ZXx{`>F3dViB?^QKTjB=H83 zn^#_aiNwtdDz;X+Qc|k~Lp&x`14$#ePlFO{f?7kCm-mSS@<9&B`{@_setz)17G6_n zHS3P`)``ij{f40EHo7*6ia0QJWST~b@5CBFAsaV8rxkQJSzcKM#B8DvvoR=go$iaH zKK=A_QPD>dZ1(TxsU(r!cM|UjD%ytx#Vhk#60&hG9>hDXcDm0>v5{c&^zWl58v^es zL&PY-dqS=8dm(8;HVuLz!5>uAANR4F(Kf1+?5N3cyf6~Il~*TcCcZm}n^`evm7veG z@7odp>Ar-H7FFm7>*x5TC^iO0J}5Q;kz6BD8M~S9k8fNL-H_Imcmqa=h9Zc^|LBP1 z7X8G2#24|BeotLKbn(Y$xk2Ak{-i7V9KyfhKP_OvE;7^oL2KqjDGk%u7&kQ#0EL*i zv@~N&`OziJsF)m%KY4^?0R?1;$RNYe`p%o$6Q8XPGqo&^IV)ZuPI4Dfg(9s1E2^ya z%sM7eQZ5979eYF`cbv>I>v_i=wltH(A()!<*>$JR2wKk>T8guZG_40l;y%L6#Iy>8 z;YH01T91`mCrfWrdak*4-gPQfVii+h@$EvfD}cmdi^`+?4NepXuV0d7VqCsFGAeR6 zX(t)RsQ#_IY1QggZgn-w^OZNPWaD19@(_4QhAE35?Z##497gRl&gaAiShoU9(2_)c z(#UE+gPcxI;Ic9;%~b0dUYGW^vN`qRA44+W(nKlxJXdwz6)ssMXY8pmi)0ePO8`@v zcg8o3;JxGREJt$8oXV(z$y0i*OpZIswdQyaCS&|ecBF)J+I3pARCO+yoSfXfb4>TC zQX(fhJ#|`X>>>k?W^0q+R8j+?ttNuT^A?0)VE(^ReQ-g+bKsn@$0G^xuTW>5sQP$P za5*?+IG!w;HN=ACL(t}q^%yUU5ZeZa}LUcWH)4XdUnh)G*a@h#@e8a0(B1 zP3vx70iwIM8o1q%J!gu~*5bC*)}C$EXe%LKKpWDnTf3-lP7!LU)i=gT@#dR0H3*G1 z>B5ZdH>NffxmXfmBXUiii{Fr^OHG4Xq6n4rIoj||z70!gUExgvmyD9aXCo$MhV?sq z@JBKL?}p;WEcYV}%h}hBJ>~+q&2LgR6;7vby2|t+H;dTy7Xb1}e z8gh>gm)Rp_h0Fys+t1nAvNXlkX&2-ys#87U(gPj9{wrR>{0z)AGL+C=h z!aTceTl-x9=pB-U(1rHywT3v4J%+0FByJU=jk?E36-q>*%A>`hN;v2P80bUxJ^ZNn zas4M4ZCv>Lar{a803lT{sy+cU()mL7&=rJtx%pcW- zpV+ait3X14kSd!990NkzZIEnIp?0z|VHrc**xmOng>de^`)+~I`a87!v|>0yA*n+_ ziKWR5yJQ@q=|s|y0uR_$MnbM@WOuL=0tn?bJj%A9aXBb$e8wja{{K zM>LoQfl7UO77Zyn(+F>4FU54+6qsi-+>^*cKRX}`Ed_jbnk+=cD@7$- znpAVNf>k!(XyQ=w7hQTADco+nnZj*I21h|iql>;tb1ha!J#Ly`){FRwT7E3zvQWuT z`Qh(;-!(O6m0m^2e*!%F_So9b4s)bU6fVpY64jTaE#+_^ef%B+~V7PKHjVR&3D zSqU$M!KfA;ES)t;?!KBo8XPXO-r-WrqA>Rvh);M5Mofx_pP_g_n;ep%9$VRr7JEev@(wz}^YEbIt1c*w+>BeYa_|dLqWOEA~ssW=9 zi{TJKZfugSIKMH?H7c`0-2q3uQ&EZjZ$u&?F<}E! ziO>qmc9@y12^WnQ7X_K<+|X{%s3^fAWFig1?0!v~ zN?45PLLw0>XJ(4^szfn~NJwPz&;t(~Bz?$c3#LmJ&#a!~t%Ysz_PXG#lR}k6g2nE{ zM_VjXz{wfaD1-`>QchN>_uO@t&dh?NvNdKo0u6lycMOe6pb>$4p%F~~CB=wwFU1Hd zm7B}SUb(MB=1SE=4aK?B6r5FkHqX`Y_SWp&6-Dw2|YAyV|RFV;J6tc;c z=uQphm<~e%JiLhHcMy%#85qgPQ`;R~9bJ{-ZBO<~@|XHc@>EiJYrI!yK%{|#IR;v{ zFGa#kp*eaO=rGo~)I)<4%)a6wkp;#WYv25q;?}BdTRnk=XiJq6J!BR(|J0Jo>enGo zVQLT^xs3<$t-iC{DbC_+ys?%W>?)L0ZNkpRhuuc@NZ?j}QrtL9|0DU>v~dAqpK7O6 zuDyvUuI3g#m}i{~3Lexpzr7yd;jN}$OaDMLm_&3ACENlpSiU9LVXCQezv~Pd(C-uK zp&iR}&pr3Nf;z$;95ECXVk(JbkVE;lR3I5*kPj-*mvTCP zU^fMk4?+zO88__pzfeS_T#-3p_;OMm()eg3cf zhY~Lz!$$i*2;>0$D4+Z$+6ieFS!6h5FFpT4kbx|REQ3t!gHVEdWatw_pzURI>{let z6HzwNWL0W)mx(|;aknnN*4;Mp)?0Z!Oq$hvv|_niR?R>c`nZJ|CNK5}JBT$vh*89m z)+C&zJg%7QJm`xrL_SDB^2I*-@T2{IcOM)q@_~EcH{%{8Ah>5Z`j24`P9N!G_goFY zDC+s6`~AUBhxRm(@MG|ttg+wtNAu`E`90CDG~nY0a|5#e`lF!!Xf@zC3LLgrhQW;y zRwaLUBp_}h)7A+L%b@!FEKz-ySKucL_B1kW6xA+XSDS8TI$5N6XGC2sTtf%5oTfbM z1=6_K+SfD+ZMZb9;BqUM((x-`C#QPtrpBl#&pa8?R)z^HZYho~TD?@7Sxs6^bP7G} z$L3gSVYx&m(^Q>3fy!Ve#&gd(SGkah=s?L@z9H=ON8p^OLJ(WLd$KYPXeb;PfcTU-eR` z{el-M{h^vfK9=C6;$ulDAtQq{GiJ<~ufhi zHNb26z4X6nHfLl@qqq7bU7X@L!xQd6Cwum)dKwKXE1)_(UiJS#5Iv=y?oc*b(FxI}Fk zUF(HhZg0!lO};JP{s7nYTWciE@Z)J2%umud-RLtBiDA=cazUSQ?9n*HsbWHMS7ntN zHW0~RZ(K*{R4n3d9F~YQ7JZC;>0i2#Xn+w@<`Nj;eGe?+&Zw;cq?tXh5SN&?uKfczIrkE92+ZM%XvS+Ib%Ts}-_QT2tR{H*AvL+!FU~s24iQZE# zYdX1{1*RVBS@}#9G`*}x`&v+f0$~V;K4h;Z@x?zd#y^4n&6?igcIGMT&JGN6#)znPsx|f&>0)?po^R5heA*(T z{{UqC@`jr_(=6w{xM4S_F&K)R@CA%8IN{qlztLh1p8bq&V=m}v92JBY6JJb#0YNJ9 zO(k?+c!hHh~g)<&sxBWRbo3Zd*BofOfY36;336D zumXwPw9=ne3aF9-SBm3?LrSpHxG*r;UbORO4NmrdXIu(|H7dm{Bo!)dQbH`(DSBgi zixCS8Po4517OQlscu5xuSn!f;ky$1dAq#3tuy#ZbvXaJ#S5nO$C#O+cRsbu<9b5cC z_4l=V<9ELseJ6j6Ke|>WPLf)Vbggcxn;cy@+*Y$@CJ}(ZN=n0g{+z0_NZz>d>2c#} z=i3Fjlx!a*6?YdfkVf)8SbQ9O9L*RA;Twv)WhZG9$NB8@$)IamFs)u>5k98(fG7)T zxvOwP&$J-7+=sKoyx}RXZMP*Xwv((UyS{+0zP*M?#pV^?p0%$LH{a4;i&&$NY5dLZ z>BWu`;z>Mv+acFNxnA)PpvV+GDa+?6_I?3lA- ztctf|37dphLd1r_Chde3ze#;xN)i(&nH+$Hr<8~%NpRhOMVwrAl%$=Mfkj;er1vdo z6tQSFumvaUO)|s=EJ!E!s9l&%0+y=@Mv_GilsVAMxqb5F;uLDacx#umf-PiR1_HJ~ zErOO!n}WeFf1k7M&!wD%u+1H1*#se5Mcs0gOO)e?Zfc9Dam;_dt+(WC#O2q|mj-(eRh zPV+QVT4+xL3V@^jG@2aW?0lP8isg#s9+`@gglWJVR`#sPRIeuy zB~ektH|8J7ndKC^3O(> zKU6T97|mk=Z$gshPsD#;d>Op4hl=g<)?0*Y$q}Riu~S` zX)3CH$_#K~iTiRqPgX>wtr(da^9)pK0uRypi5rAG92RzJg7phSXy@)5?uB#)A)Nsu zofV2}x<+CLz9|$dxh82SEOM7X9}%EJ7TGuci{up}6TXUEpxP$50#2{t3blWAGmYzO++Vbfcz-PLLcxrgF^?pz5=Zth@jtpds?=Gph%i(9GTk%`$q!%Yuc{BV+;oOjZYFh| zzrNPqXcA1jaSd1xbaegKvp8>#=DI>xlieCBv|Nb;*Vic`Xg2 z7-_Eoei6HDNA~EO-yf_NUbjB>)IpQ!-JS**y7~%~j0lHn07=tfy0+%gVzjMZ)ix9q z3r!9SXLL^P0w1!*yzT;^>{cOYBp%W-SEW}*CpHnpn{%2DXfCsh;C` zgy2cR<*iI6U)98cY{Wkk;gk>V+MmrQVrKlyU;UfkqM}>DTj?Uqp^`-^ zfRmgoStzhh7{WIs2LrJ$mz=$7^%|%>=r^|`-~`XpdhdbmfIEICe6!)<4NR4Ky3%ie zG{9jGW*0eOItK>2VZ+EjKJ)Bz&q}?Kcq8rR&A-0+mb9CHdGEcyCr*|rH`*9V6k}Y| zT}Y8b&mik@evb<^dCt6yZbG-62sqHq$Di=z;2YrPZ-_T!WeCbxX!sS&$&eQg4Qqrp zrf=-ot0E&_bg|7gb~E5;18wBOs!t7QgHLqteLwqY@QKK%p@GsY>ULr>w#w`l>H!=PPQ@`&Qbvx^5y3H{>!6;T93y*%^yU-c{V-Qa*4O5`RWp=`6)ip`Wt=;)bs;2eFima0>U&k`NmP^BS_5A z6h;I;0ky1@DATL0 z30g*bQ)Wsg%ha5B!im&-F<}_5#(VMUX&}XqjoGF^ zfWl@JC#1)WAqA7so8d;6TDqEh02K5XHo0bqMC5Q&9ZSU~)2H1%{UJysp4NboRFP9+ zZi=R5L?Ea&wo#H}DoGKEY0#{qiC@3IPPI+Klai7v4)LV~p0Ih&C3%7?es0a>}1 z38hWitJ=UM5115iiwc~dlGKXUjK(C!pek;HNhG@&lLSlBikr&&50t57(j+xYQkC80 zpu8kdf>RV6N`#lo4Tb zOI+NRVOuxzPt3wkw{%O@*}ARAzHIM87^>>q-reW>vkGwxu*J>JotmhlU84*+9#I@O z@r?XqUuV{qqJp3jOryXY%BIlv_W2k6OZiv)tDU$D)(ns3c<_tf1vuWbT*^lQIE*;L zSx>7ovy4J8MNLM7qOy4D@?{K_pr|O9BIIDmqNpg3OC@swei_Pr@N}?Wxl6dr%#VWTyLhpjOB&jH( zqNXw=bKSn$H%QsMM%)O)=+Kv5CZB>`q?R(|a^VdG758+SmNNc#Ba}B*vmD!T;1S}v z!({S8B4+N3hh;NBpr_qYhB+yWjl|`bg+4sg*RM%XARLE=&>A-=CJ}dX1LeQcxC5@9Ie7 zGek4eG{66ziOc04Gd>-D?KUHiVl?eU0-zo4$jC?f34jv{)qZzu|Oey zdrn`rV0PX7!N~ z`AHSQ^Fi5><%6d4`0wOY{a%5VXP*nzLVtcuaTWrzQf=Uq5B?6HXq)WM;1fm)!iNqs z%zgR$#!_~)=XAvDT0OHqS2XXVm~@)X@WmIOE9Uaa{*RDIpcVN)YSKa}@@ucX`m&in zOz*${0}Xwxis&~4X;n^bu)>Jx{q4s?1nDYPmmA{u?MGfwIW9;9X(=@X&=SX8!;y zZ@ahZg_~$2YJlfnt21pxdltOlp3A71+Wqk`tRKuDb-#mR$Y-UIgl?@XR&W?{9J1K!VxR3^FvU;kIxEX$#-4{~RZjpPnB3fiuRtnf zV##%vTOQp6sVsI2=L(ovkZQ*aUyvpzF9%XFjRa0HP`M<4iZ#M(Z=)A~s2IY@vFiY;)LW@VO0Q*F=k|^jT(daHVbhOqn zi<;&)*9&R+(8WzpgDE$6WI>hb9X+91r>BEG^|oT|q^3vHasgUA(+Nh7ydDD;ep)YJ z(LW}eJM4Gm3*9umssq)ecSe^A_ ztIP*tVSMRiFCQmpa1e`fi|B8Xyl<=IRCH$l>V4%>P&0AZWyW}= $#Yk^RYM}}I8 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

x=IAs5N6gaBFyBaeCNnesfZ9`C+|( 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

>l@)t_`Q=w1ppSn_MSW#t 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
xqNWq+SbzQ$ul3mzKP7v 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

*cA_ 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 YEkCH`DCn~g~3q>GEp0Yfy1GY?U<@sqSKb8 zO3=r-$WTI?N?VC6p+Zz=0kE~HmMmhkkQ&iWz|?VScGcBVP|es~h-y$%NMl>|HC7@q zM3gB#C|t8kY6qlg5N*ftNG*-6NDP^Y!AjdRIty@@g_Mc1aukuO@`s*{X*c>bJL7 zGr1^&%BeOQTGA3yjDY1@V$B+l+kw>>tH~${t4hp8VVe|W8k$7m)YUfs@b_)s5gRE6 z35rHWH@39MTI=d|v3Cj7b`b|>axr<%raA|kZRIv^+g>T)iYv8zY(0*-UAR+W5b;TM zO-2A=1Z@m85Ra(k9w2h4L)Ze5dK_O%Y*PUHGYaIR0@l-_@N_eA)QZ*?3dKx9H8!fi5WbE}0fare9ZSce1QG?h9>k`wcHrxc zAnpTAYHK9m+sW8QBLd5dj%1#Q6Jw?R!K3YZE+ zyOYapC7_5%v7xy|D6J(nY^zdG!AHBYP0~~$__3yD2ZhvL1+^3Yw!ISF+=BQUp=MWg z!}glWojdA&q+uzzii)}#S{)kHrZ!7()wp_vfr4OQD%y9WIKp345g*HshW&w1%Jv27R^S$gCr7e3xXL;X<1sS!&qG-MpZYFKp}>W z1~p=9L4hh!g4x}IVAGm@{Nac1f0S}%+KNgOF#JK|s&^q;7>Xvzk4RD-ww>DsiZEG% zAUE#CgQs^Ew=>d&XhybRK)?*Pv96|8xMNpsZ9^5J0b6O(1sf3UX7Fr;)5vY6+Z1vq zK&cHC4Xq|?dpoMSrUpZ3tbzeZxmXVXj8qw9z~z2$dW{D!@iAh z0r>dM?)0C`09nCCG;nYuT&oB)pWw>=0&+dSk*@F&z@2*lq)piV^&7B*mxA{J7(@7K z$}q54hQ_cnQ5hP;g{C2}J@_~x<*hr*^OOPax6$QO41!g^iBY{a7#YIVl3;ysQBLqP zAWGpR5ZI&#-e8$^gfBP^#(vu$%+dY@jC24mR#+h%`2T5&;ma(C#lX_j4>wZTzC$05 z_ICzcJ)dKvXS%H;*gL^Y~U}-oC4VMo2X7)XczW%K@mVUb!x-q}J<_jL(T%0|9K3M4KKlkX- zug|~se7^Va!m|^nH|D=SgC^}OZpW>y2Uo^M-M>a%Jx5L*e0t*a<&}J9bT0h)+}pVm zrKE3kCDd8?u=(lM#_h%agZocTzkUAx*6&9K_6&`jI<&PoIMO-Z1HH)HyZu|TFADYC zy0&L^cBHs;bMwK6(As==Dhx`afOD&-=()Xg!- zkH&v-yiRtFb@g{HIR3bmOeG%NUmtgl Q*As=acT^zzy{Br{{aN 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 )W@xq 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

MS;Nv@*E69aq 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

-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 MQLoDcWd?Ztf4x1*MgRZ+ literal 0 HcmV?d00001 diff --git a/SuperMap iEarth/public/Resource/config/configToken.json b/SuperMap iEarth/public/Resource/config/configToken.json new file mode 100644 index 00000000..8157fb91 --- /dev/null +++ b/SuperMap iEarth/public/Resource/config/configToken.json @@ -0,0 +1,4 @@ +{ + "tiandituKey":"e90d56e5a09d1767899ad45846b0cefd", + "bingMapsKey":"Av63hPkCmH18oGGn5Qg3QhLBJvknZ97xbhyw3utDLRtFv7anHjXNOUQbyWBL5fK5" +} \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.js b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.js new file mode 100644 index 00000000..28b24840 --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.js @@ -0,0 +1,102289 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 550: +/***/ ((module) => { + +"use strict"; + + +module.exports = Point; + +/** + * A standalone point geometry with useful accessor, comparison, and + * modification methods. + * + * @class Point + * @param {Number} x the x-coordinate. this could be longitude or screen + * pixels, or any other sort of unit. + * @param {Number} y the y-coordinate. this could be latitude or screen + * pixels, or any other sort of unit. + * @example + * var point = new Point(-77, 38); + */ +function Point(x, y) { + this.x = x; + this.y = y; +} + +Point.prototype = { + + /** + * Clone this point, returning a new point that can be modified + * without affecting the old one. + * @return {Point} the clone + */ + clone: function() { return new Point(this.x, this.y); }, + + /** + * Add this point's x & y coordinates to another point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + add: function(p) { return this.clone()._add(p); }, + + /** + * Subtract this point's x & y coordinates to from point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + sub: function(p) { return this.clone()._sub(p); }, + + /** + * Multiply this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + multByPoint: function(p) { return this.clone()._multByPoint(p); }, + + /** + * Divide this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + divByPoint: function(p) { return this.clone()._divByPoint(p); }, + + /** + * Multiply this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + mult: function(k) { return this.clone()._mult(k); }, + + /** + * Divide this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + div: function(k) { return this.clone()._div(k); }, + + /** + * Rotate this point around the 0, 0 origin by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @return {Point} output point + */ + rotate: function(a) { return this.clone()._rotate(a); }, + + /** + * Rotate this point around p point by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @param {Point} p Point to rotate around + * @return {Point} output point + */ + rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); }, + + /** + * Multiply this point by a 4x1 transformation matrix + * @param {Array} m transformation matrix + * @return {Point} output point + */ + matMult: function(m) { return this.clone()._matMult(m); }, + + /** + * Calculate this point but as a unit vector from 0, 0, meaning + * that the distance from the resulting point to the 0, 0 + * coordinate will be equal to 1 and the angle from the resulting + * point to the 0, 0 coordinate will be the same as before. + * @return {Point} unit vector point + */ + unit: function() { return this.clone()._unit(); }, + + /** + * Compute a perpendicular point, where the new y coordinate + * is the old x coordinate and the new x coordinate is the old y + * coordinate multiplied by -1 + * @return {Point} perpendicular point + */ + perp: function() { return this.clone()._perp(); }, + + /** + * Return a version of this point with the x & y coordinates + * rounded to integers. + * @return {Point} rounded point + */ + round: function() { return this.clone()._round(); }, + + /** + * Return the magitude of this point: this is the Euclidean + * distance from the 0, 0 coordinate to this point's x and y + * coordinates. + * @return {Number} magnitude + */ + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + /** + * Judge whether this point is equal to another point, returning + * true or false. + * @param {Point} other the other point + * @return {boolean} whether the points are equal + */ + equals: function(other) { + return this.x === other.x && + this.y === other.y; + }, + + /** + * Calculate the distance from this point to another point + * @param {Point} p the other point + * @return {Number} distance + */ + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + + /** + * Calculate the distance from this point to another point, + * without the square root step. Useful if you're comparing + * relative distances. + * @param {Point} p the other point + * @return {Number} distance + */ + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + /** + * Get the angle from the 0, 0 coordinate to this point, in radians + * coordinates. + * @return {Number} angle + */ + angle: function() { + return Math.atan2(this.y, this.x); + }, + + /** + * Get the angle from this point to another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + /** + * Get the angle between this point and another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, + + /* + * Find the angle of the two vectors, solving the formula for + * the cross product a x b = |a||b|sin(θ) for θ. + * @param {Number} x the x-coordinate + * @param {Number} y the y-coordinate + * @return {Number} the angle in radians + */ + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, + + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, + + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, + + _multByPoint: function(p) { + this.x *= p.x; + this.y *= p.y; + return this; + }, + + _divByPoint: function(p) { + this.x /= p.x; + this.y /= p.y; + return this; + }, + + _unit: function() { + this._div(this.mag()); + return this; + }, + + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + + _rotateAround: function(angle, p) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), + y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y); + this.x = x; + this.y = y; + return this; + }, + + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; + +/** + * Construct a point from an array if necessary, otherwise if the input + * is already a Point, or an unknown type, return it unchanged + * @param {Array|Point|*} a any kind of input value + * @return {Point} constructed point, or passed-through value. + * @example + * // this + * var point = Point.convert([0, 1]); + * // is equivalent to + * var point = new Point(0, 1); + */ +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; + + +/***/ }), + +/***/ 929: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports.VectorTile = __webpack_require__(779); +/* unused reexport */ __webpack_require__(24); +/* unused reexport */ __webpack_require__(701); + + +/***/ }), + +/***/ 779: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var VectorTileLayer = __webpack_require__(701); + +module.exports = VectorTile; + +function VectorTile(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) layers[layer.name] = layer; + } +} + + + +/***/ }), + +/***/ 24: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var Point = __webpack_require__(550); + +module.exports = VectorTileFeature; + +function VectorTileFeature(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; + + // Private + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) feature.id = pbf.readVarint(); + else if (tag == 2) readTag(pbf, feature); + else if (tag == 3) feature.type = pbf.readVarint(); + else if (tag == 4) feature._geometry = pbf.pos; +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + feature.properties[key] = value; + } +} + +VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature.prototype.loadGeometry = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (length <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { // moveTo + if (line) lines.push(line); + line = []; + } + + line.push(new Point(x, y)); + + } else if (cmd === 7) { + + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) lines.push(line); + + return lines; +}; + +VectorTileFeature.prototype.bbox = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (length <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) x1 = x; + if (x > x2) x2 = x; + if (y < y1) y1 = y; + if (y > y2) y2 = y; + + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature.types[this.type], + i, j; + + function project(line) { + for (var j = 0; j < line.length; j++) { + var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [ + (p.x + x0) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + ]; + } + } + + switch (this.type) { + case 1: + var points = []; + for (i = 0; i < coords.length; i++) { + points[i] = coords[i][0]; + } + coords = points; + project(coords); + break; + + case 2: + for (i = 0; i < coords.length; i++) { + project(coords[i]); + } + break; + + case 3: + coords = classifyRings(coords); + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + project(coords[i][j]); + } + } + break; + } + + if (coords.length === 1) { + coords = coords[0]; + } else { + type = 'Multi' + type; + } + + var result = { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; + + if ('id' in this) { + result.id = this.id; + } + + return result; +}; + +// classifies an array of rings into polygons with outer rings and holes + +function classifyRings(rings) { + var len = rings.length; + + if (len <= 1) return [rings]; + + var polygons = [], + polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = signedArea(rings[i]); + if (area === 0) continue; + + if (ccw === undefined) ccw = area < 0; + + if (ccw === area < 0) { + if (polygon) polygons.push(polygon); + polygon = [rings[i]]; + + } else { + polygon.push(rings[i]); + } + } + if (polygon) polygons.push(polygon); + + return polygons; +} + +function signedArea(ring) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + return sum; +} + + +/***/ }), + +/***/ 701: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var VectorTileFeature = __webpack_require__(24); + +module.exports = VectorTileLayer; + +function VectorTileLayer(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + + // Private + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + + pbf.readFields(readLayer, this, end); + + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) layer.version = pbf.readVarint(); + else if (tag === 1) layer.name = pbf.readString(); + else if (tag === 5) layer.extent = pbf.readVarint(); + else if (tag === 2) layer._features.push(pbf.pos); + else if (tag === 3) layer._keys.push(pbf.readString()); + else if (tag === 4) layer._values.push(readValueMessage(pbf)); +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + + value = tag === 1 ? pbf.readString() : + tag === 2 ? pbf.readFloat() : + tag === 3 ? pbf.readDouble() : + tag === 4 ? pbf.readVarint64() : + tag === 5 ? pbf.readVarint() : + tag === 6 ? pbf.readSVarint() : + tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} + +// return feature `i` from this layer as a `VectorTileFeature` +VectorTileLayer.prototype.feature = function(i) { + if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); + + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); +}; + + +/***/ }), + +/***/ 693: +/***/ (function(module) { + +(function(self) { + 'use strict'; + + // if __disableNativeFetch is set to true, the it will always polyfill fetch + // with Ajax. + if (!self.__disableNativeFetch && self.fetch) { + return + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name) + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value) + } + return value + } + + function Headers(headers) { + this.map = {} + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value) + }, this) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var list = this.map[name] + if (!list) { + list = [] + this.map[name] = list + } + list.push(value) + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + var values = this.map[normalizeName(name)] + return values ? values[0] : null + } + + Headers.prototype.getAll = function(name) { + return this.map[normalizeName(name)] || [] + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)] + } + + Headers.prototype.forEach = function(callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function(name) { + this.map[name].forEach(function(value) { + callback.call(thisArg, value, name, this) + }, this) + }, this) + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + reader.readAsArrayBuffer(blob) + return fileReaderReady(reader) + } + + function readBlobAsText(blob, options) { + var reader = new FileReader() + var contentType = options.headers.map['content-type'] ? options.headers.map['content-type'].toString() : '' + var regex = /charset\=[0-9a-zA-Z\-\_]*;?/ + var _charset = blob.type.match(regex) || contentType.match(regex) + var args = [blob] + + if(_charset) { + args.push(_charset[0].replace(/^charset\=/, '').replace(/;$/, '')) + } + + reader.readAsText.apply(reader, args) + return fileReaderReady(reader) + } + + var support = { + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob(); + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + } + + function Body() { + this.bodyUsed = false + + + this._initBody = function(body, options) { + this._bodyInit = body + if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + this._options = options + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (!body) { + this._bodyText = '' + } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) { + // Only support ArrayBuffers for POST method. + // Receiving ArrayBuffers happens via Blobs, instead. + } else { + throw new Error('unsupported BodyInit type') + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + return this.blob().then(readBlobAsArrayBuffer) + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob, this._options) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + } else { + this.text = function() { + var rejected = consumed(this) + return rejected ? rejected : Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {} + var body = options.body + if (Request.prototype.isPrototypeOf(input)) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url + this.credentials = input.credentials + if (!options.headers) { + this.headers = new Headers(input.headers) + } + this.method = input.method + this.mode = input.mode + if (!body) { + body = input._bodyInit + input.bodyUsed = true + } + } else { + this.url = input + } + + this.credentials = options.credentials || this.credentials || 'omit' + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers) + } + this.method = normalizeMethod(options.method || this.method || 'GET') + this.mode = options.mode || this.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body, options) + } + + Request.prototype.clone = function() { + return new Request(this) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function headers(xhr) { + var head = new Headers() + var pairs = xhr.getAllResponseHeaders().trim().split('\n') + pairs.forEach(function(header) { + var split = header.trim().split(':') + var key = split.shift().trim() + var value = split.join(':').trim() + head.append(key, value) + }) + return head + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this._initBody(bodyInit, options) + this.type = 'default' + this.status = options.status + this.ok = this.status >= 200 && this.status < 300 + this.statusText = options.statusText + this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers) + this.url = options.url || '' + } + + Body.call(Response.prototype) + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + } + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}) + response.type = 'error' + return response + } + + var redirectStatuses = [301, 302, 303, 307, 308] + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + } + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input + } else { + request = new Request(input, init) + } + + var xhr = new XMLHttpRequest() + + function responseURL() { + if ('responseURL' in xhr) { + return xhr.responseURL + } + + // Avoid security warnings on getResponseHeader when not allowed by CORS + if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader('X-Request-URL') + } + + return; + } + + var __onLoadHandled = false; + + function onload() { + if (xhr.readyState !== 4) { + return + } + var status = (xhr.status === 1223) ? 204 : xhr.status + if (status < 100 || status > 599) { + if (__onLoadHandled) { return; } else { __onLoadHandled = true; } + reject(new TypeError('Network request failed')) + return + } + var options = { + status: status, + statusText: xhr.statusText, + headers: headers(xhr), + url: responseURL() + } + var body = 'response' in xhr ? xhr.response : xhr.responseText; + + if (__onLoadHandled) { return; } else { __onLoadHandled = true; } + resolve(new Response(body, options)) + } + xhr.onreadystatechange = onload; + xhr.onload = onload; + xhr.onerror = function() { + if (__onLoadHandled) { return; } else { __onLoadHandled = true; } + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + // `withCredentials` should be setted after calling `.open` in IE10 + // http://stackoverflow.com/a/19667959/1219343 + try { + if (request.credentials === 'include') { + if ('withCredentials' in xhr) { + xhr.withCredentials = true; + } else { + console && console.warn && console.warn('withCredentials is not supported, you can ignore this warning'); + } + } + } catch (e) { + console && console.warn && console.warn('set withCredentials error:' + e); + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true + + // Support CommonJS + if ( true && module.exports) { + module.exports = self.fetch; + } +})(typeof self !== 'undefined' ? self : this); + + +/***/ }), + +/***/ 144: +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var mod; } +})(this, function (exports, module) { + 'use strict'; + + var defaultOptions = { + timeout: 5000, + jsonpCallback: 'callback', + jsonpCallbackFunction: null + }; + + function generateCallbackFunction() { + return 'jsonp_' + Date.now() + '_' + Math.ceil(Math.random() * 100000); + } + + function clearFunction(functionName) { + // IE8 throws an exception when you try to delete a property on window + // http://stackoverflow.com/a/1824228/751089 + try { + delete window[functionName]; + } catch (e) { + window[functionName] = undefined; + } + } + + function removeScript(scriptId) { + var script = document.getElementById(scriptId); + if (script) { + document.getElementsByTagName('head')[0].removeChild(script); + } + } + + function fetchJsonp(_url) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // to avoid param reassign + var url = _url; + var timeout = options.timeout || defaultOptions.timeout; + var jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback; + + var timeoutId = undefined; + + return new Promise(function (resolve, reject) { + var callbackFunction = options.jsonpCallbackFunction || generateCallbackFunction(); + var scriptId = jsonpCallback + '_' + callbackFunction; + + window[callbackFunction] = function (response) { + resolve({ + ok: true, + // keep consistent with fetch API + json: function json() { + return Promise.resolve(response); + } + }); + + if (timeoutId) clearTimeout(timeoutId); + + removeScript(scriptId); + + clearFunction(callbackFunction); + }; + + // Check if the user set their own params, and if not add a ? to start a list of params + url += url.indexOf('?') === -1 ? '?' : '&'; + + var jsonpScript = document.createElement('script'); + jsonpScript.setAttribute('src', '' + url + jsonpCallback + '=' + callbackFunction); + if (options.charset) { + jsonpScript.setAttribute('charset', options.charset); + } + jsonpScript.id = scriptId; + document.getElementsByTagName('head')[0].appendChild(jsonpScript); + + timeoutId = setTimeout(function () { + reject(new Error('JSONP request to ' + _url + ' timed out')); + + clearFunction(callbackFunction); + removeScript(scriptId); + window[callbackFunction] = function () { + clearFunction(callbackFunction); + }; + }, timeout); + + // Caught if got 404/500 + jsonpScript.onerror = function () { + reject(new Error('JSONP request to ' + _url + ' failed')); + + clearFunction(callbackFunction); + removeScript(scriptId); + if (timeoutId) clearTimeout(timeoutId); + }; + }); + } + + // export as global function + /* + let local; + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + local.fetchJsonp = fetchJsonp; + */ + + module.exports = fetchJsonp; +}); + +/***/ }), + +/***/ 645: +/***/ ((__unused_webpack_module, exports) => { + +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + + +/***/ }), + +/***/ 545: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var utils = __webpack_require__(820) + +var AND = '&&' + , OR = '||' + , AND_STR = 'and' + , OR_STR = 'or' + , NOT = '!' + , EQUAL = '=' + , LIKE = '~' + , NOTEQUAL = NOT + EQUAL + , NOTLIKE = NOT + LIKE + , GT = '>' + , GE = '>=' + , LT = '<' + , LE = '<=' + , WILDCARD = '*' + , COMMA = ',' + , DELIMITER = '.' + , LEFT = '(' + , RIGHT = ')' + , WHERE = 'where' + , synopsis = { + pathway: [], + groups: {} +} + , AST = {} + , options = {}; + +var print = console.log; +// ------------------ splitter -------------------- // + +function Tokenize(query) { + var parts = __splitTrim(query, WHERE); + var pathway = parts[0]; + var where = parts[1]; + + synopsis.pathway = __splitTrim(pathway, COMMA); + for (var i = 0, len = synopsis.pathway.length; i < len; i++) { + synopsis.pathway[i] = __splitTrim(synopsis.pathway[i], DELIMITER); + if (synopsis.pathway[i][0] == WILDCARD) + synopsis.pathway[i].shift(); + if (synopsis.pathway[i].length === 0) + synopsis.pathway.splice(i, 1); + } + + var lastLeft = -1, + lastRight = -1, + current = 0; + while (current < where.length) { + if (where[current] === LEFT) { + lastLeft = current; + } else if (where[current] === RIGHT) { + lastRight = current; + if (lastRight > lastLeft && lastLeft !== -1) { + var k = 'gr' + '_' + new Date().getTime(); + synopsis.groups[k] = where.substring(lastLeft + 1, lastRight); + where = where.replace(LEFT + synopsis.groups[k] + RIGHT, k); + current = -1; + } + } + current += 1; + } + LogicalGrouping(AST, where); +} +function LogicalGrouping(current, where) { + var lastAnd = __findIndex(where, AND), + lastOr = __findIndex(where, OR); + + if (lastAnd !== Number.MAX_VALUE || lastOr !== Number.MAX_VALUE) { + if (lastAnd < lastOr) { + current.and = current.and || []; + var parts = __splitTrim(where, AND); + current.and.push(parts[0]); + LogicalGrouping(current.and, parts[1]); + } else { + current.or = current.or || []; + var parts = __splitTrim(where, OR); + current.or.push(parts[0]); + LogicalGrouping(current.or, parts[1]); + } + } else { + if (synopsis.groups[where]) { + where = synopsis.groups[where]; + LogicalGrouping(current, where); + } else { + if (Array.isArray(current)) + current.push(where); + else + current.or = [where]; + ExtractExpression(AST.or ? AST.or : AST.and) + } + } +} +function ExtractExpression(logicalGroup) { + for (var k in logicalGroup) { + if (logicalGroup.hasOwnProperty(k)) { + if (Array.isArray(logicalGroup[k])) { + ExtractExpression(logicalGroup[k]); + } + else if (typeof logicalGroup[k] === 'string') { + if (__contains(logicalGroup[k], NOTEQUAL)) { + var parts = __splitTrim(logicalGroup[k], NOTEQUAL); + logicalGroup[k] = { + ne: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], NOTLIKE)) { + var parts = __splitTrim(logicalGroup[k], NOTLIKE); + logicalGroup[k] = { + nreq: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], LIKE)) { + var parts = __splitTrim(logicalGroup[k], LIKE); + logicalGroup[k] = { // rough eq + req: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], GE)) { + var parts = __splitTrim(logicalGroup[k], GE); + logicalGroup[k] = { // greater than or equal + ge: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], GT)) { + var parts = __splitTrim(logicalGroup[k], GT); + logicalGroup[k] = { // greater than + gt: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], LE)) { + var parts = __splitTrim(logicalGroup[k], LE); + logicalGroup[k] = { // less than or equal + le: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], LT)) { + var parts = __splitTrim(logicalGroup[k], LT); + logicalGroup[k] = { // less than + lt: [ + parts[0], + parts[1] + ] + }; + } else if (__contains(logicalGroup[k], EQUAL)) { + var parts = __splitTrim(logicalGroup[k], EQUAL); + logicalGroup[k] = { + eq: [ + parts[0], + parts[1] + ] + }; + } + } + } + } +} + +function __findIndex(str, token) { + var index = str.indexOf(token); + return index === -1 ? Number.MAX_VALUE : index; +} +function __splitTrim(str, token) { + return str.split(token).map(function (p) { + return p.trim(); + }); +} +function __contains(a, b) { + return a.indexOf(b) > -1; +} +function __hierarchize(obj, dottedPath) { + var parts = __splitTrim(dottedPath, DELIMITER); + var res = obj; + for (var p in parts) { + if (res.hasOwnProperty(parts[p])) + res = res[parts[p]]; + else + return ''; + } + // support comparison for Date/DateString + if(utils.isDate(res)) res = res.valueOf() + else if(utils.isDateString(res)) res = utils.parseDateFromString(res) + else res = res.toString() + + return res +} + +function FilterOR(ASTNode, row) { + var res = false; + for (var k in ASTNode) { + var filterFunc = (k === AND_STR ? FilterAND : (k === OR_STR ? FilterOR : Filter)); + res = res || filterFunc(ASTNode[k], row); + if (options.trace) + print(synopsis.step, '======((( or', ASTNode[k], res); + if (res) return res; + } + return res; +} +function FilterAND(ASTNode, row) { + var res = true; + for (var k in ASTNode) { + var filterFunc = (k === AND_STR ? FilterAND : (k === OR_STR ? FilterOR : Filter)); + res = res && filterFunc(ASTNode[k], row); + if (options.trace) + print(synopsis.step, '======((( and', ASTNode[k], res); + if (!res) return res; + } + return res; +} +function Filter(ASTNode, row) { + synopsis.step += 1; + if (ASTNode.or) { + var res = FilterOR(ASTNode.or, row); + if (options.trace) + print(synopsis.step, 'OR', ASTNode, res); + return res; + } else if (ASTNode.and) { + var res = FilterAND(ASTNode.and, row); + if (options.trace) + print(synopsis.step, 'AND', ASTNode, res); + return res; + } else if (typeof ASTNode === 'object') { + if (ASTNode.eq) { // = + return __hierarchize(row, ASTNode.eq[0]) === ASTNode.eq[1]; + } else if (ASTNode.ne) { // != + return __hierarchize(row, ASTNode.ne[0]) !== ASTNode.ne[1]; + } else if (ASTNode.req) { // ~ + return __contains(__hierarchize(row, ASTNode.req[0]), ASTNode.req[1]); + } else if (ASTNode.nreq) { // ~ + return !__contains(__hierarchize(row, ASTNode.nreq[0]), ASTNode.nreq[1]); + } else if (ASTNode.gt) { // > + return __hierarchize(row, ASTNode.gt[0]) > ASTNode.gt[1]; + } else if (ASTNode.ge) { // >= + return __hierarchize(row, ASTNode.ge[0]) >= ASTNode.ge[1]; + } else if (ASTNode.lt) { // < + return __hierarchize(row, ASTNode.lt[0]) < ASTNode.lt[1]; + } else if (ASTNode.le) { // <= + return __hierarchize(row, ASTNode.le[0]) <= ASTNode.le[1]; + } else { + return Filter(ASTNode, row); + } + } +} +function Parse(dataSource) { + var result = []; + for (var k in dataSource) + if (Filter(AST, dataSource[k])) + result.push(dataSource[k]); + return result; +} +function Fields(result) { + if (result && synopsis.pathway.length > 0) { + //print(synopsis.pathway); + return result.map(function (ele) { + var res = {}; + for (var i = 0, len = synopsis.pathway.length; i < len; i++) { + var key = synopsis.pathway[i].join(DELIMITER); + res[key] = __hierarchize(ele, key); + } + return res; + }); + } + return result; +} +function Query(dataSource, query, opts) { + synopsis = { + pathway: [], + groups: {}, + step: 0 + }; + AST = {}; + opts = opts || { + trace: false + }; + options = opts; + Tokenize(query); + return Fields(Parse(dataSource)); +} + +if ( true && typeof(module.exports) != 'undefined') module.exports = Query; +if (typeof(window) != 'undefined') window.Query = Query; + +/***/ }), + +/***/ 820: +/***/ ((module) => { + +function getObjectType(obj) { + return Object.prototype.toString.call(obj); +} +function isDate(obj) { + return getObjectType(obj) === '[object Date]'; +} +function isString(obj) { + return getObjectType(obj) === '[object String]'; +} +function isDateString(obj) { + return isString(obj) && !isNaN(Date.parse(obj)) +} +function isNumber(obj) { + return typeof obj === 'number' +} +function parseDateFromString(str) { + return Date.parse(str) +} +module.exports = { + getObjectType: getObjectType, + isDate: isDate, + isString: isString, + isDateString: isDateString, + parseDateFromString: parseDateFromString, + isNumber: isNumber +} + + +/***/ }), + +/***/ 52: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; + +var dataViewTag = '[object DataView]'; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array ? array.length : 0, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ +function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); +} + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ +function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; +} + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = overArg(Object.keys, Object); + +/* Built-in method references that are verified to be native. */ +var DataView = getNative(root, 'DataView'), + Map = getNative(root, 'Map'), + Promise = getNative(root, 'Promise'), + Set = getNative(root, 'Set'), + WeakMap = getNative(root, 'WeakMap'); + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + // Safari 9 makes `arguments.length` enumerable in strict mode. + var result = (isArray(value) || isArguments(value)) + ? baseTimes(value.length, String) + : []; + + var length = result.length, + skipIndexes = !!length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && (key == 'length' || isIndex(key, length)))) { + result.push(key); + } + } + return result; +} + +/** + * The base implementation of `getTag`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + return objectToString.call(value); +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +/** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ +function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11, +// for data views in Edge < 14, and promises in Node.js. +if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = objectToString.call(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : undefined; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} + +/** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ +var toPairs = createToPairs(keys); + +module.exports = toPairs; + + +/***/ }), + +/***/ 614: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = Pbf; + +var ieee754 = __webpack_require__(645); + +function Pbf(buf) { + this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); + this.pos = 0; + this.type = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + +// Threshold chosen based on both benchmarking and knowledge about browser string +// data structures (which currently switch structure types at 12 bytes or more) +var TEXT_DECODER_MIN_LENGTH = 12; +var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8'); + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + end = end || this.length; + + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; + + this.type = val & 0x7; + readField(tag, result, this); + + if (this.pos === startPos) this.skip(val); + } + return result; + }, + + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + + readFixed32: function() { + var val = readUInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + readSFixed32: function() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readFloat: function() { + var val = ieee754.read(this.buf, this.pos, true, 23, 4); + this.pos += 4; + return val; + }, + + readDouble: function() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, + + readVarint: function(isSigned) { + var buf = this.buf, + val, b; + + b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val; + b = buf[this.pos]; val |= (b & 0x0f) << 28; + + return readVarintRemainder(val, isSigned, this); + }, + + readVarint64: function() { // for compatibility with v2.0.1 + return this.readVarint(true); + }, + + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + + readBoolean: function() { + return Boolean(this.readVarint()); + }, + + readString: function() { + var end = this.readVarint() + this.pos; + var pos = this.pos; + this.pos = end; + + if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) { + // longer strings are fast with the built-in browser TextDecoder API + return readUtf8TextDecoder(this.buf, pos, end); + } + // short strings are fast with our custom implementation + return readUtf8(this.buf, pos, end); + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + readPackedVarint: function(arr, isSigned) { + if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned)); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readVarint(isSigned)); + return arr; + }, + readPackedSVarint: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFloat()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readDouble()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, + + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) length *= 2; + + if (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, + + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.subarray(0, this.length); + }, + + writeFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeSFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeSFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeVarint: function(val) { + val = +val || 0; + + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + + this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = (val >>> 7) & 0x7f; + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + this.realloc(str.length * 4); + + this.pos++; // reserve 1 byte for short string length + + var startPos = this.pos; + // write the string directly to the buffer and see how much was written + this.pos = writeUtf8(this.buf, str, this.pos); + var len = this.pos - startPos; + + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeFloat: function(val) { + this.realloc(4); + ieee754.write(this.buf, val, this.pos, true, 23, 4); + this.pos += 4; + }, + + writeDouble: function(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, + + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, + + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length + + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + + writePackedVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); }, + + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function readVarintRemainder(l, s, p) { + var buf = p.buf, + h, b; + + b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s); + + throw new Error('Expected varint not more than 10 bytes'); +} + +function readPackedEnd(pbf) { + return pbf.type === Pbf.Bytes ? + pbf.readVarint() + pbf.pos : pbf.pos + 1; +} + +function toNum(low, high, isSigned) { + if (isSigned) { + return high * 0x100000000 + (low >>> 0); + } + + return ((high >>> 0) * 0x100000000) + (low >>> 0); +} + +function writeBigVarint(val, pbf) { + var low, high; + + if (val >= 0) { + low = (val % 0x100000000) | 0; + high = (val / 0x100000000) | 0; + } else { + low = ~(-val % 0x100000000); + high = ~(-val / 0x100000000); + + if (low ^ 0xffffffff) { + low = (low + 1) | 0; + } else { + low = 0; + high = (high + 1) | 0; + } + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +function writeBigVarintLow(low, high, pbf) { + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos] = low & 0x7f; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + + pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f; +} + +function makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = + len <= 0x3fff ? 1 : + len <= 0x1fffff ? 2 : + len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); + + // if 1 byte isn't enough for encoding message length, shift the data to the right + pbf.realloc(extraLen); + for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i]; +} + +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } + +// Buffer code below from https://github.com/feross/buffer, MIT-licensed + +function readUInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] * 0x1000000); +} + +function writeInt32(buf, val, pos) { + buf[pos] = val; + buf[pos + 1] = (val >>> 8); + buf[pos + 2] = (val >>> 16); + buf[pos + 3] = (val >>> 24); +} + +function readInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] << 24); +} + +function readUtf8(buf, pos, end) { + var str = ''; + var i = pos; + + while (i < end) { + var b0 = buf[i]; + var c = null; // codepoint + var bytesPerSequence = + b0 > 0xEF ? 4 : + b0 > 0xDF ? 3 : + b0 > 0xBF ? 2 : 1; + + if (i + bytesPerSequence > end) break; + + var b1, b2, b3; + + if (bytesPerSequence === 1) { + if (b0 < 0x80) { + c = b0; + } + } else if (bytesPerSequence === 2) { + b1 = buf[i + 1]; + if ((b1 & 0xC0) === 0x80) { + c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); + if (c <= 0x7F) { + c = null; + } + } + } else if (bytesPerSequence === 3) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); + if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { + c = null; + } + } + } else if (bytesPerSequence === 4) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + b3 = buf[i + 3]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); + if (c <= 0xFFFF || c >= 0x110000) { + c = null; + } + } + } + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; + } + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function readUtf8TextDecoder(buf, pos, end) { + return utf8TextDecoder.decode(buf.subarray(pos, end)); +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + if (lead) { + if (c < 0xDC00) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = c; + continue; + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + } else { + if (c > 0xDBFF || (i + 1 === str.length)) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + } else { + lead = c; + } + continue; + } + } else if (lead) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = null; + } + + if (c < 0x80) { + buf[pos++] = c; + } else { + if (c < 0x800) { + buf[pos++] = c >> 0x6 | 0xC0; + } else { + if (c < 0x10000) { + buf[pos++] = c >> 0xC | 0xE0; + } else { + buf[pos++] = c >> 0x12 | 0xF0; + buf[pos++] = c >> 0xC & 0x3F | 0x80; + } + buf[pos++] = c >> 0x6 & 0x3F | 0x80; + } + buf[pos++] = c & 0x3F | 0x80; + } + } + return pos; +} + + +/***/ }), + +/***/ 107: +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +(function (global, factory) { + true ? factory() : + 0; +}(this, (function () { 'use strict'; + +/** + * @this {Promise} + */ +function finallyConstructor(callback) { + var constructor = this.constructor; + return this.then( + function(value) { + // @ts-ignore + return constructor.resolve(callback()).then(function() { + return value; + }); + }, + function(reason) { + // @ts-ignore + return constructor.resolve(callback()).then(function() { + // @ts-ignore + return constructor.reject(reason); + }); + } + ); +} + +function allSettled(arr) { + var P = this; + return new P(function(resolve, reject) { + if (!(arr && typeof arr.length !== 'undefined')) { + return reject( + new TypeError( + typeof arr + + ' ' + + arr + + ' is not iterable(cannot read property Symbol(Symbol.iterator))' + ) + ); + } + var args = Array.prototype.slice.call(arr); + if (args.length === 0) return resolve([]); + var remaining = args.length; + + function res(i, val) { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call( + val, + function(val) { + res(i, val); + }, + function(e) { + args[i] = { status: 'rejected', reason: e }; + if (--remaining === 0) { + resolve(args); + } + } + ); + return; + } + } + args[i] = { status: 'fulfilled', value: val }; + if (--remaining === 0) { + resolve(args); + } + } + + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); +} + +// Store setTimeout reference so promise-polyfill will be unaffected by +// other code modifying setTimeout (like sinon.useFakeTimers()) +var setTimeoutFunc = setTimeout; +// @ts-ignore +var setImmediateFunc = typeof setImmediate !== 'undefined' ? setImmediate : null; + +function isArray(x) { + return Boolean(x && typeof x.length !== 'undefined'); +} + +function noop() {} + +// Polyfill for Function.prototype.bind +function bind(fn, thisArg) { + return function() { + fn.apply(thisArg, arguments); + }; +} + +/** + * @constructor + * @param {Function} fn + */ +function Promise(fn) { + if (!(this instanceof Promise)) + throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') throw new TypeError('not a function'); + /** @type {!number} */ + this._state = 0; + /** @type {!boolean} */ + this._handled = false; + /** @type {Promise|undefined} */ + this._value = undefined; + /** @type {!Array} */ + this._deferreds = []; + + doResolve(fn, this); +} + +function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + Promise._immediateFn(function() { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); +} + +function resolve(self, newValue) { + try { + // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure + if (newValue === self) + throw new TypeError('A promise cannot be resolved with itself.'); + if ( + newValue && + (typeof newValue === 'object' || typeof newValue === 'function') + ) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } +} + +function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); +} + +function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function() { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; +} + +/** + * @constructor + */ +function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; +} + +/** + * Take a potentially misbehaving resolver function and make sure + * onFulfilled and onRejected are only called once. + * + * Makes no guarantees about asynchrony. + */ +function doResolve(fn, self) { + var done = false; + try { + fn( + function(value) { + if (done) return; + done = true; + resolve(self, value); + }, + function(reason) { + if (done) return; + done = true; + reject(self, reason); + } + ); + } catch (ex) { + if (done) return; + done = true; + reject(self, ex); + } +} + +Promise.prototype['catch'] = function(onRejected) { + return this.then(null, onRejected); +}; + +Promise.prototype.then = function(onFulfilled, onRejected) { + // @ts-ignore + var prom = new this.constructor(noop); + + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; +}; + +Promise.prototype['finally'] = finallyConstructor; + +Promise.all = function(arr) { + return new Promise(function(resolve, reject) { + if (!isArray(arr)) { + return reject(new TypeError('Promise.all accepts an array')); + } + + var args = Array.prototype.slice.call(arr); + if (args.length === 0) return resolve([]); + var remaining = args.length; + + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call( + val, + function(val) { + res(i, val); + }, + reject + ); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); +}; + +Promise.allSettled = allSettled; + +Promise.resolve = function(value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + + return new Promise(function(resolve) { + resolve(value); + }); +}; + +Promise.reject = function(value) { + return new Promise(function(resolve, reject) { + reject(value); + }); +}; + +Promise.race = function(arr) { + return new Promise(function(resolve, reject) { + if (!isArray(arr)) { + return reject(new TypeError('Promise.race accepts an array')); + } + + for (var i = 0, len = arr.length; i < len; i++) { + Promise.resolve(arr[i]).then(resolve, reject); + } + }); +}; + +// Use polyfill for setImmediate for performance gains +Promise._immediateFn = + // @ts-ignore + (typeof setImmediateFunc === 'function' && + function(fn) { + // @ts-ignore + setImmediateFunc(fn); + }) || + function(fn) { + setTimeoutFunc(fn, 0); + }; + +Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console + } +}; + +/** @suppress {undefinedVars} */ +var globalNS = (function() { + // the only reliable means to get the global object is + // `Function('return this')()` + // However, this causes CSP violations in Chrome apps. + if (typeof self !== 'undefined') { + return self; + } + if (typeof window !== 'undefined') { + return window; + } + if (typeof __webpack_require__.g !== 'undefined') { + return __webpack_require__.g; + } + throw new Error('unable to locate global object'); +})(); + +// Expose the polyfill if Promise is undefined or set to a +// non-function value. The latter can be due to a named HTMLElement +// being exposed by browsers for legacy reasons. +// https://github.com/taylorhakes/promise-polyfill/issues/114 +if (typeof globalNS['Promise'] !== 'function') { + globalNS['Promise'] = Promise; +} else { + if (!globalNS.Promise.prototype['finally']) { + globalNS.Promise.prototype['finally'] = finallyConstructor; + } + if (!globalNS.Promise.allSettled) { + globalNS.Promise.allSettled = allSettled; + } +} + +}))); + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; + +// UNUSED EXPORTS: AddressMatchService, AggregationParameter, AggregationTypes, AlongLineDirection, AnalystAreaUnit, AnalystSizeUnit, AreaSolarRadiationParameters, ArrayStatistic, AttributesPopContainer, BaiduCRS, BaiduTileLayer, Bounds, Browser, BucketAggParameter, BucketAggType, BufferAnalystParameters, BufferDistance, BufferEndType, BufferRadiusUnit, BufferSetting, BuffersAnalystJobsParameter, BurstPipelineAnalystParameters, CRS, CartoCSS, ChangeTileVersion, ChartQueryFilterParameter, ChartQueryParameters, ChartService, ChartType, ChartView, ChartViewModel, CircleStyle, CityTabsPage, ClientComputationLayer, ClientComputationView, ClientComputationViewModel, ClientType, ClipAnalystMode, ClipParameter, CloudTileLayer, CloverStyle, ColorDictionary, ColorGradientType, ColorSpaceType, ColorsPickerUtil, CommonContainer, CommonServiceBase, CommonTheme, CommonUtil, CommontypesConversion, ComponentsUtil, ComponentsViewBase, ComputeWeightMatrixParameters, CreateDatasetParameters, Credential, DataFlowLayer, DataFlowService, DataFlowView, DataFlowViewModel, DataFormat, DataItemOrderBy, DataItemType, DataReturnMode, DataReturnOption, DataServiceQueryView, DataServiceQueryViewModel, DatasetBufferAnalystParameters, DatasetInfo, DatasetOverlayAnalystParameters, DatasetService, DatasetSurfaceAnalystParameters, DatasetThiessenAnalystParameters, DatasourceConnectionInfo, DatasourceService, DensityKernelAnalystParameters, DirectionType, DistributedAnalysisView, DistributedAnalysisViewModel, DropDownBox, EchartsLayer, EditFeaturesParameters, EditType, ElasticSearch, EngineType, EntityType, Event, Events, Exponent, FacilityAnalyst3DParameters, FacilityAnalystSinks3DParameters, FacilityAnalystSources3DParameters, FacilityAnalystStreamParameters, FacilityAnalystTracedown3DParameters, FacilityAnalystTraceup3DParameters, FacilityAnalystUpstream3DParameters, Feature, FeatureService, FeatureShapeFactory, FeatureTheme, FeatureThemeGraph, FeatureThemeRankSymbol, FeatureThemeVector, FeatureVector, FetchRequest, FieldParameters, FieldService, FieldStatisticsParameters, FieldsFilter, FileReaderUtil, FillGradientMode, FilterField, FilterParameter, FindClosestFacilitiesParameters, FindLocationParameters, FindMTSPPathsParameters, FindPathParameters, FindServiceAreasParameters, FindTSPPathsParameters, Format, GenerateSpatialDataParameters, GeoCodingParameter, GeoDecodingParameter, GeoFeatureThemeLayer, GeoHashGridAggParameter, GeoJSONFormat, GeoJSONLayerWithName, GeoJsonLayerDataModel, GeoRelationAnalystParameters, Geometry, GeometryBufferAnalystParameters, GeometryCollection, GeometryCurve, GeometryGeoText, GeometryLineString, GeometryLinearRing, GeometryMultiLineString, GeometryMultiPoint, GeometryMultiPolygon, GeometryOverlayAnalystParameters, GeometryPoint, GeometryPolygon, GeometryRectangle, GeometrySurfaceAnalystParameters, GeometryThiessenAnalystParameters, GeometryType, GeoprocessingService, GetFeatureMode, GetFeaturesByBoundsParameters, GetFeaturesByBufferParameters, GetFeaturesByGeometryParameters, GetFeaturesByIDsParameters, GetFeaturesBySQLParameters, GetFeaturesParametersBase, GetFeaturesServiceBase, GetGridCellInfosParameters, GetResolutionFromScaleDpi, GraduatedMode, GraphAxesTextDisplayMode, GraphThemeLayer, Graphic, GraphicLayer, Grid, GridCellInfosService, GridType, HeatMapFeature, HeatMapLayer, HillshadeParameter, IManager, IManagerCreateNodeParam, IManagerServiceBase, IPortal, IPortalAddDataParam, IPortalAddResourceParam, IPortalDataConnectionInfoParam, IPortalDataMetaInfoParam, IPortalDataStoreInfoParam, IPortalQueryParam, IPortalQueryResult, IPortalRegisterServiceParam, IPortalResource, IPortalServiceBase, IPortalShareEntity, IPortalShareParam, IPortalUser, ImageCollectionService, ImageGFAspect, ImageGFHillShade, ImageGFOrtho, ImageGFSlope, ImageMapLayer, ImageRenderingRule, ImageSearchParameter, ImageService, ImageStretchOption, ImageStyle, ImageTileLayer, IndexTabsPageContainer, InterpolationAlgorithmType, InterpolationAnalystParameters, InterpolationDensityAnalystParameters, InterpolationIDWAnalystParameters, InterpolationKrigingAnalystParameters, InterpolationRBFAnalystParameters, JSONFormat, JoinItem, JoinType, KernelDensityJobParameter, KeyServiceParameter, LabelBackShape, LabelImageCell, LabelMatrixCell, LabelMixedTextStyle, LabelOverLengthMode, LabelSymbolCell, LabelThemeCell, LabelThemeLayer, Lang, LayerInfoService, LayerStatus, LayerType, LinkItem, Logo, LonLat, MapService, MapVLayer, MapVRenderer, MappingParameters, MapvRenderer, MathExpressionAnalysisParameters, MeasureMode, MeasureParameters, MeasureService, MessageBox, MetricsAggParameter, MetricsAggType, NDVIParameter, NavTabsPage, NetworkAnalyst3DService, NetworkAnalystService, NetworkAnalystServiceBase, NonEarthCRS, NormalRenderer, NormalizeScale, Online, OnlineData, OnlineQueryDatasParameter, OnlineServiceBase, OpenFileView, OpenFileViewModel, OrderBy, OrderType, OutputSetting, OutputType, OverlapDisplayedOptions, OverlayAnalystParameters, OverlayGeoJobParameter, OverlayOperationType, PaginationContainer, PermissionType, Pixel, PixelFormat, PointWithMeasure, PopContainer, ProcessingService, ProcessingServiceBase, QueryByBoundsParameters, QueryByDistanceParameters, QueryByGeometryParameters, QueryBySQLParameters, QueryOption, QueryParameters, QueryService, RangeMode, RangeThemeLayer, RankSymbolThemeLayer, RasterFunctionParameter, RasterFunctionType, ResourceType, Route, RouteCalculateMeasureParameters, RouteLocatorParameters, SVGRenderer, SearchMode, SearchType, SearchView, SearchViewModel, SecurityManager, Select, ServerColor, ServerFeature, ServerGeometry, ServerInfo, ServerStyle, ServerTextStyle, ServerTheme, ServerType, ServiceBase, ServiceStatus, SetDatasourceParameters, SetLayerInfoParameters, SetLayerStatusParameters, SetLayersInfoParameters, ShapeParameters, ShapeParametersCircle, ShapeParametersImage, ShapeParametersLabel, ShapeParametersLine, ShapeParametersPoint, ShapeParametersPolygon, ShapeParametersRectangle, ShapeParametersSector, SideType, SingleObjectQueryJobsParameter, Size, SmoothMethod, Sortby, SpatialAnalystBase, SpatialAnalystService, SpatialQueryMode, SpatialRelationType, StatisticAnalystMode, StatisticMode, StopQueryParameters, SummaryAttributesJobsParameter, SummaryMeshJobParameter, SummaryRegionJobParameter, SummaryType, SuperMap, SupplyCenter, SupplyCenterType, SurfaceAnalystMethod, SurfaceAnalystParameters, SurfaceAnalystParametersSetting, TemplateBase, TerrainCurvatureCalculationParameters, TextAlignment, ThemeDotDensity, ThemeFeature, ThemeGraduatedSymbol, ThemeGraduatedSymbolStyle, ThemeGraph, ThemeGraphAxes, ThemeGraphItem, ThemeGraphSize, ThemeGraphText, ThemeGraphTextFormat, ThemeGraphType, ThemeGridRange, ThemeGridRangeItem, ThemeGridUnique, ThemeGridUniqueItem, ThemeLabel, ThemeLabelAlongLine, ThemeLabelBackground, ThemeLabelItem, ThemeLabelText, ThemeLabelUniqueItem, ThemeLayer, ThemeMemoryData, ThemeOffset, ThemeParameters, ThemeRange, ThemeRangeItem, ThemeService, ThemeStyle, ThemeType, ThemeUnique, ThemeUniqueItem, ThiessenAnalystParameters, TianDiTu_MercatorCRS, TianDiTu_WGS84CRS, TiandituTileLayer, TileVectorLayer, TiledMapLayer, TiledVectorLayer, TimeControlBase, TimeFlowControl, TokenServiceParameter, TopologyValidatorJobsParameter, TopologyValidatorRule, TrafficTransferAnalystService, TransferLine, TransferPathParameters, TransferPreference, TransferSolutionParameters, TransferTactic, TransportationAnalystParameter, TransportationAnalystResultSetting, TurfLayer, TurnType, UGCLayer, UGCLayerType, UGCMapLayer, UGCSubLayer, UnicodeMarker, UniqueThemeLayer, Unit, UpdateDatasetParameters, UpdateEdgeWeightParameters, UpdateTurnNodeWeightParameters, VariogramMode, Vector, VectorClipJobsParameter, VectorGrid, VectorTileFormat, WKTFormat, WMTSLayer, WebExportFormatType, WebMap, WebPrintingJobContent, WebPrintingJobCustomItems, WebPrintingJobExportOptions, WebPrintingJobImage, WebPrintingJobLayers, WebPrintingJobLayoutOptions, WebPrintingJobLegendOptions, WebPrintingJobLittleMapOptions, WebPrintingJobNorthArrowOptions, WebPrintingJobParameters, WebPrintingJobScaleBarOptions, WebPrintingJobService, WebScaleOrientationType, WebScaleType, WebScaleUnit, addressMatchService, baiduTileLayer, changeTileVersion, chartService, circleStyle, clientComputationLayer, clientComputationView, cloudTileLayer, cloverStyle, componentsViewBase, conversionDegree, crs, dataFlowLayer, dataFlowService, dataFlowView, dataFlowViewModel, dataServiceQueryView, dataServiceQueryViewModel, datasetService, datasourceService, distributedAnalysisView, echartsLayer, featureService, fieldService, geoJSONLayerWithName, geoprocessingService, getMeterPerMapUnit, getResolutionFromScaleDpi, getWrapNum, graphThemeLayer, graphic, graphicLayer, gridCellInfosService, heatMapFeature, heatMapLayer, imageMapLayer, imageStyle, imageTileLayer, isCORS, labelThemeLayer, layerInfoService, logo, mapService, mapVLayer, measureService, networkAnalyst3DService, networkAnalystService, nonEarthCRS, normalizeScale, openFileView, openFileViewModel, processingService, queryService, rangeThemeLayer, rankSymbolThemeLayer, resolutionToScale, scaleToResolution, searchView, searchViewModel, setCORS, spatialAnalystService, themeFeature, themeService, tiandituTileLayer, tiledMapLayer, tiledVectorLayer, toGeoJSON, toSuperMapGeometry, trafficTransferAnalystService, transform, turfLayer, unicodeMarker, uniqueThemeLayer, webMap, webPrintingJobService, wmtsLayer + +;// CONCATENATED MODULE: ./src/common/SuperMap.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var SuperMap = window.SuperMap = window.SuperMap || {}; +SuperMap.Components = window.SuperMap.Components || {}; + +;// CONCATENATED MODULE: ./src/common/REST.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + /** + * @enum DataFormat + * @description 服务请求返回结果数据类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataFormat } from '{npm}'; + * + * const result = DataFormat.GEOJSON; + * ``` + */ +var DataFormat = { + /** GEOJSON */ + GEOJSON: "GEOJSON", + /** ISERVER */ + ISERVER: "ISERVER" +}; + +/** + * @enum ServerType + * @description 服务器类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ServerType } from '{npm}'; + * + * const result = ServerType.ISERVER; + * ``` + */ +var ServerType = { + /** ISERVER */ + ISERVER: "ISERVER", + /** IPORTAL */ + IPORTAL: "IPORTAL", + /** ONLINE */ + ONLINE: "ONLINE" +}; + +/** + * @enum GeometryType + * @description 几何对象枚举,定义了一系列几何对象类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GeometryType } from '{npm}'; + * + * const result = GeometryType.LINE; + * ``` + */ +var GeometryType = { + /** LINE */ + LINE: "LINE", + /** LINEM */ + LINEM: "LINEM", + /** POINT */ + POINT: "POINT", + /** REGION */ + REGION: "REGION", + /** POINTEPS */ + POINTEPS: "POINTEPS", + /** LINEEPS */ + LINEEPS: "LINEEPS", + /** REGIONEPS */ + REGIONEPS: "REGIONEPS", + /** ELLIPSE */ + ELLIPSE: "ELLIPSE", + /** CIRCLE */ + CIRCLE: "CIRCLE", + /** TEXT */ + TEXT: "TEXT", + /** RECTANGLE */ + RECTANGLE: "RECTANGLE", + /** UNKNOWN */ + UNKNOWN: "UNKNOWN", + /** GEOCOMPOUND */ + GEOCOMPOUND:"GEOCOMPOUND" +}; + +/** + * @enum QueryOption + * @description 查询结果类型枚举,描述查询结果返回类型,包括只返回属性、只返回几何实体以及返回属性和几何实体。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { QueryOption } from '{npm}'; + * + * const result = QueryOption.ATTRIBUTE; + * ``` + */ +var QueryOption = { + /** 属性 */ + ATTRIBUTE: "ATTRIBUTE", + /** 属性和几何对象 */ + ATTRIBUTEANDGEOMETRY: "ATTRIBUTEANDGEOMETRY", + /** 几何对象 */ + GEOMETRY: "GEOMETRY" +}; + +/** + * @enum JoinType + * @description 关联查询时的关联类型常量。 + * 该类定义了两个表之间的连接类型常量,决定了对两个表之间进行连接查询时,查询结果中得到的记录的情况。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { JoinType } from '{npm}'; + * + * const result = JoinType.INNERJOIN; + * ``` + */ +var JoinType = { + /** 内连接 */ + INNERJOIN: "INNERJOIN", + /** 左连接 */ + LEFTJOIN: "LEFTJOIN" +}; + +/** + * @enum SpatialQueryMode + * @description 空间查询模式枚举。该类定义了空间查询操作模式常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SpatialQueryMode } from '{npm}'; + * + * const result = SpatialQueryMode.CONTAIN; + * ``` + */ +var SpatialQueryMode = { + /** 包含空间查询模式 */ + CONTAIN: "CONTAIN", + /** 交叉空间查询模式 */ + CROSS: "CROSS", + /** 分离空间查询模式 */ + DISJOINT: "DISJOINT", + /** 重合空间查询模式 */ + IDENTITY: "IDENTITY", + /** 相交空间查询模式 */ + INTERSECT: "INTERSECT", + /** 无空间查询 */ + NONE: "NONE", + /** 叠加空间查询模式 */ + OVERLAP: "OVERLAP", + /** 邻接空间查询模式 */ + TOUCH: "TOUCH", + /** 被包含空间查询模式 */ + WITHIN: "WITHIN" +}; + +/** + * @enum SpatialRelationType + * @description 数据集对象间的空间关系枚举。 + * 该类定义了数据集对象间的空间关系类型常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SpatialRelationType } from '{npm}'; + * + * const result = {namespace}.SpatialRelationType.CONTAIN; + * ``` + */ +var SpatialRelationType = { + /** 包含关系 */ + CONTAIN: "CONTAIN", + /** 相交关系 */ + INTERSECT: "INTERSECT", + /** 被包含关系 */ + WITHIN: "WITHIN" +}; + +/** + * @enum MeasureMode + * @type {string} + * @description 量算模式枚举。 + * @category BaseTypes Constant + * 该类定义了两种测量模式:距离测量和面积测量。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { MeasureMode } from '{npm}'; + * + * const result = MeasureMode.DISTANCE; + * ``` + */ +var MeasureMode = { + /** 距离测量 */ + DISTANCE: "DISTANCE", + /** 面积测量 */ + AREA: "AREA" +}; + +/** + * @enum Unit + * @description 距离单位枚举。 + * 该类定义了一系列距离单位类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Unit } from '{npm}'; + * + * const result = Unit.METER; + * ``` + */ +var Unit = { + /** 米 */ + METER: "METER", + /** 千米 */ + KILOMETER: "KILOMETER", + /** 英里 */ + MILE: "MILE", + /** 码 */ + YARD: "YARD", + /** 度 */ + DEGREE: "DEGREE", + /** 毫米 */ + MILLIMETER: "MILLIMETER", + /** 厘米 */ + CENTIMETER: "CENTIMETER", + /** 英寸 */ + INCH: "INCH", + /** 分米 */ + DECIMETER: "DECIMETER", + /** 英尺 */ + FOOT: "FOOT", + /** 秒 */ + SECOND: "SECOND", + /** 分 */ + MINUTE: "MINUTE", + /** 弧度 */ + RADIAN: "RADIAN" +}; + +/** + * @enum BufferRadiusUnit + * @description 缓冲区距离单位枚举。该类定义了一系列缓冲距离单位类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BufferRadiusUnit } from '{npm}'; + * + * const result = BufferRadiusUnit.CENTIMETER; + * ``` + */ +var BufferRadiusUnit = { + /** 厘米 */ + CENTIMETER: "CENTIMETER", + /** 分米 */ + DECIMETER: "DECIMETER", + /** 英尺 */ + FOOT: "FOOT", + /** 英寸 */ + INCH: "INCH", + /** 千米 */ + KILOMETER: "KILOMETER", + /** 米 */ + METER: "METER", + /** 英里 */ + MILE: "MILE", + /** 毫米 */ + MILLIMETER: "MILLIMETER", + /** 码 */ + YARD: "YARD" +} + +/** + * @enum EngineType + * @description 数据源引擎类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EngineType } from '{npm}'; + * + * const result = EngineType.IMAGEPLUGINS; + * ``` + */ +var EngineType = { + /** 影像只读引擎类型,文件引擎,针对通用影像格式如 BMP,JPG,TIFF 以及超图自定义影像格式 SIT 等。 */ + IMAGEPLUGINS: "IMAGEPLUGINS", + /** OGC 引擎类型,针对于 Web 数据源,Web 引擎,目前支持的类型有 WMS,WFS,WCS。 */ + OGC: "OGC", + /** Oracle 引擎类型,针对 Oracle 数据源,数据库引擎。 */ + ORACLEPLUS: "ORACLEPLUS", + /** SDB 引擎类型,文件引擎,即 SDB 数据源。 */ + SDBPLUS: "SDBPLUS", + /** SQL Server 引擎类型,针对 SQL Server 数据源,数据库引擎 */ + SQLPLUS: "SQLPLUS", + /** UDB 引擎类型,文件引擎。 */ + UDB: "UDB" +}; + +/** + * @enum ThemeGraphTextFormat + * @description 统计专题图文本显示格式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeGraphTextFormat } from '{npm}'; + * + * const result = ThemeGraphTextFormat.CAPTION; + * ``` + */ +var ThemeGraphTextFormat = { + /** 标题。以各子项的标题来进行标注。 */ + CAPTION: "CAPTION", + /** 标题 + 百分数。以各子项的标题和所占的百分比来进行标注。 */ + CAPTION_PERCENT: "CAPTION_PERCENT", + /** 标题 + 实际数值。以各子项的标题和真实数值来进行标注。 */ + CAPTION_VALUE: "CAPTION_VALUE", + /** 百分数。以各子项所占的百分比来进行标注。 */ + PERCENT: "PERCENT", + /** 实际数值。以各子项的真实数值来进行标注。 */ + VALUE: "VALUE" + +}; + +/** + * @enum ThemeGraphType + * @description 统计专题图类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeGraphType } from '{npm}'; + * + * const result = ThemeGraphType.AREA; + * ``` + */ +var ThemeGraphType = { + /** 面积图。 */ + AREA: "AREA", + /** 柱状图。 */ + BAR: "BAR", + /** 三维柱状图。 */ + BAR3D: "BAR3D", + /** 折线图。 */ + LINE: "LINE", + /** 饼图。 */ + PIE: "PIE", + /** 三维饼图。 */ + PIE3D: "PIE3D", + /** 点状图。 */ + POINT: "POINT", + /** 环状图。 */ + RING: "RING", + /** 玫瑰图。 */ + ROSE: "ROSE", + /** 三维玫瑰图。 */ + ROSE3D: "ROSE3D", + /** 堆叠柱状图。 */ + STACK_BAR: "STACK_BAR", + /** 三维堆叠柱状图。 */ + STACK_BAR3D: "STACK_BAR3D", + /** 阶梯图。 */ + STEP: "STEP" +}; + +/** + * @enum GraphAxesTextDisplayMode + * @description 统计专题图坐标轴文本显示模式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GraphAxesTextDisplayMode } from '{npm}'; + * + * const result = GraphAxesTextDisplayMode.ALL; + * ``` + */ +var GraphAxesTextDisplayMode = { + /** 显示全部文本。 */ + ALL: "ALL", + /** 不显示。 */ + NONE: "NONE", + /** 显示Y轴的文本。 */ + YAXES: "YAXES" +}; + +/** + * @enum GraduatedMode + * @description 专题图分级模式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GraduatedMode } from '{npm}'; + * + * const result = GraduatedMode.CONSTANT; + * ``` + */ +var GraduatedMode = { + /** 常量分级模式。 */ + CONSTANT: "CONSTANT", + /** 对数分级模式。 */ + LOGARITHM: "LOGARITHM", + /** 平方根分级模式。 */ + SQUAREROOT: "SQUAREROOT" +}; + +/** + * @enum RangeMode + * @description 范围分段专题图分段方式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { RangeMode } from '{npm}'; + * + * const result = RangeMode.CUSTOMINTERVAL; + * ``` + */ +var RangeMode = { + /** 自定义分段法。 */ + CUSTOMINTERVAL: "CUSTOMINTERVAL", + /** 等距离分段法。 */ + EQUALINTERVAL: "EQUALINTERVAL", + /** 对数分段法。 */ + LOGARITHM: "LOGARITHM", + /** 等计数分段法。 */ + QUANTILE: "QUANTILE", + /** 平方根分段法。 */ + SQUAREROOT: "SQUAREROOT", + /** 标准差分段法。 */ + STDDEVIATION: "STDDEVIATION" +}; + +/** + * @enum ThemeType + * @description 专题图类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeType } from '{npm}'; + * + * const result = ThemeType.DOTDENSITY; + * ``` + */ +var ThemeType = { + /** 点密度专题图。 */ + DOTDENSITY: "DOTDENSITY", + /** 等级符号专题图。 */ + GRADUATEDSYMBOL: "GRADUATEDSYMBOL", + /** 统计专题图。 */ + GRAPH: "GRAPH", + /** 标签专题图。 */ + LABEL: "LABEL", + /** 分段专题图。 */ + RANGE: "RANGE", + /** 単值专题图。 */ + UNIQUE: "UNIQUE" +}; + +/** + * @enum ColorGradientType + * @description 渐变颜色枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ColorGradientType } from '{npm}'; + * + * const result = ColorGradientType.BLACK_WHITE; + * ``` + */ +var ColorGradientType = { + /** 黑白渐变色。 */ + BLACK_WHITE: "BLACKWHITE", + /** 蓝黑渐变色。 */ + BLUE_BLACK: "BLUEBLACK", + /** 蓝红渐变色。 */ + BLUE_RED: "BLUERED", + /** 蓝白渐变色。 */ + BLUE_WHITE: "BLUEWHITE", + /** 青黑渐变色。 */ + CYAN_BLACK: "CYANBLACK", + /** 青蓝渐变色。 */ + CYAN_BLUE: "CYANBLUE", + /** 青绿渐变色。 */ + CYAN_GREEN: "CYANGREEN", + /** 青白渐变色。 */ + CYAN_WHITE: "CYANWHITE", + /** 绿黑渐变色。 */ + GREEN_BLACK: "GREENBLACK", + /** 绿蓝渐变色。 */ + GREEN_BLUE: "GREENBLUE", + /** 绿橙紫渐变色。 */ + GREEN_ORANGE_VIOLET: "GREENORANGEVIOLET", + /** 绿红渐变色。 */ + GREEN_RED: "GREENRED", + /** 蓝红渐变色。 */ + GREEN_WHITE: "GREENWHITE", + /** 粉黑渐变色。 */ + PINK_BLACK: "PINKBLACK", + /** 粉蓝渐变色。 */ + PINK_BLUE: "PINKBLUE", + /** 粉红渐变色。 */ + PINK_RED: "PINKRED", + /** 粉白渐变色。 */ + PINK_WHITE: "PINKWHITE", + /** 彩虹色。 */ + RAIN_BOW: "RAINBOW", + /** 红黑渐变色。 */ + RED_BLACK: "REDBLACK", + /** 红白渐变色。 */ + RED_WHITE: "REDWHITE", + /** 光谱渐变。 */ + SPECTRUM: "SPECTRUM", + /** 地形渐变,用于三维显示效果较好。 */ + TERRAIN: "TERRAIN", + /** 黄黑渐变色。 */ + YELLOW_BLACK: "YELLOWBLACK", + /** 黄蓝渐变色。 */ + YELLOW_BLUE: "YELLOWBLUE", + /** 黄绿渐变色。 */ + YELLOW_GREEN: "YELLOWGREEN", + /** 黄红渐变色。 */ + YELLOW_RED: "YELLOWRED", + /** 黄白渐变色。 */ + YELLOW_WHITE: "YELLOWWHITE" +}; + +/** + * @enum TextAlignment + * @description 文本对齐枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TextAlignment } from '{npm}'; + * + * const result = TextAlignment.TOPLEFT; + * ``` + */ +var TextAlignment = { + /** 左上角对齐。 */ + TOPLEFT: "TOPLEFT", + /** 顶部居中对齐。 */ + TOPCENTER: "TOPCENTER", + /** 右上角对齐。 */ + TOPRIGHT: "TOPRIGHT", + /** 基准线左对齐。 */ + BASELINELEFT: "BASELINELEFT", + /** 基准线居中对齐。 */ + BASELINECENTER: "BASELINECENTER", + /** 基准线右对齐。 */ + BASELINERIGHT: "BASELINERIGHT", + /** 左下角对齐。 */ + BOTTOMLEFT: "BOTTOMLEFT", + /** 底部居中对齐。 */ + BOTTOMCENTER: "BOTTOMCENTER", + /** 右下角对齐。 */ + BOTTOMRIGHT: "BOTTOMRIGHT", + /** 左中对齐。 */ + MIDDLELEFT: "MIDDLELEFT", + /** 中心对齐。 */ + MIDDLECENTER: "MIDDLECENTER", + /** 右中对齐。 */ + MIDDLERIGHT: "MIDDLERIGHT" +}; + +/** + * @enum FillGradientMode + * @description 渐变填充风格的渐变类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { FillGradientMode } from '{npm}'; + * + * const result = FillGradientMode.NONE; + * ``` + */ +var FillGradientMode = { + /** 无渐变。 */ + NONE: "NONE", + /** 线性渐变填充。 */ + LINEAR: "LINEAR", + /** 辐射渐变填充。 */ + RADIAL: "RADIAL", + /** 圆锥渐变填充。 */ + CONICAL: "CONICAL", + /** 四角渐变填充。 */ + SQUARE: "SQUARE" +}; + +/** + * @enum AlongLineDirection + * @description 标签沿线标注方向枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AlongLineDirection } from '{npm}'; + * + * const result = AlongLineDirection.NORMAL; + * ``` + */ +var AlongLineDirection = { + /** 沿线的法线方向放置标签。 */ + NORMAL: "ALONG_LINE_NORMAL", + /** 从下到上,从左到右放置。 */ + LB_TO_RT: "LEFT_BOTTOM_TO_RIGHT_TOP", + /** 从上到下,从左到右放置。 */ + LT_TO_RB: "LEFT_TOP_TO_RIGHT_BOTTOM", + /** 从下到上,从右到左放置。 */ + RB_TO_LT: "RIGHT_BOTTOM_TO_LEFT_TOP", + /** 从上到下,从右到左放置。 */ + RT_TO_LB: "RIGHT_TOP_TO_LEFT_BOTTOM" +}; + +/** + * @enum LabelBackShape + * @description 标签专题图中标签背景的形状枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LabelBackShape } from '{npm}'; + * + * const result = LabelBackShape.DIAMOND; + * ``` + */ +var LabelBackShape = { + /** 菱形背景,即标签背景的形状为菱形。 */ + DIAMOND: "DIAMOND", + /** 椭圆形背景,即标签背景的行状为椭圆形。 */ + ELLIPSE: "ELLIPSE", + /** 符号背景,即标签背景的形状为设定的符号。 */ + MARKER: "MARKER", + /** 空背景,即不使用任何形状作为标签的背景。 */ + NONE: "NONE", + /** 矩形背景,即标签背景的形状为矩形。 */ + RECT: "RECT", + /** 圆角矩形背景,即标签背景的形状为圆角矩形。 */ + ROUNDRECT: "ROUNDRECT", + /** 三角形背景,即标签背景的形状为三角形。 */ + TRIANGLE: "TRIANGLE" +}; + +/** + * @enum LabelOverLengthMode + * @description 标签专题图中超长标签的处理模式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LabelOverLengthMode } from '{npm}'; + * + * const result = LabelOverLengthMode.NEWLINE; + * ``` + */ +var LabelOverLengthMode = { + /** 换行显示。 */ + NEWLINE: "NEWLINE", + /** 对超长标签不进行处理。 */ + NONE: "NONE", + /** 省略超出部分。 */ + OMIT: "OMIT" +}; + +/** + * @enum DirectionType + * @description 网络分析中方向枚举。 + * 在行驶引导子项中使用。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DirectionType } from '{npm}'; + * + * const result = DirectionType.EAST; + * ``` + */ +var DirectionType = { + /** 东。 */ + EAST: "EAST", + /** 无方向。 */ + NONE: "NONE", + /** 北。 */ + NORTH: "NORTH", + /** 南。 */ + SOURTH: "SOURTH", + /** 西。 */ + WEST: "WEST" +}; + +/** + * @enum SideType + * @description 行驶位置枚举。 + * 表示在行驶在路的左边、右边或者路上的枚举,该类用在行驶导引子项类中。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SideType } from '{npm}'; + * + * const result = SideType.LEFT; + * ``` + */ +var SideType = { + /** 路的左侧。 */ + LEFT: "LEFT", + /** 在路上(即路的中间)。 */ + MIDDLE: "MIDDLE", + /** 无效值。 */ + NONE: "NONE", + /** 路的右侧。 */ + RIGHT: "RIGHT" +}; + +/** + * @enum SupplyCenterType + * @description 资源供给中心类型枚举。 + * 该枚举定义了网络分析中资源中心点的类型,主要用于资源分配和选址分区。 + * 资源供给中心点的类型包括非中心,固定中心和可选中心。固定中心用于资源分配分析; 固定中心和可选中心用于选址分析;非中心在两种网络分析时都不予考虑。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SupplyCenterType } from '{npm}'; + * + * const result = SupplyCenterType.FIXEDCENTER; + * ``` + */ +var SupplyCenterType = { + /** 固定中心点。 */ + FIXEDCENTER: "FIXEDCENTER", + /** 非中心点。 */ + NULL: "NULL", + /** 可选中心点。 */ + OPTIONALCENTER: "OPTIONALCENTER" +}; + +/** + * @enum TurnType + * @description 转弯方向枚举。 + * 用在行驶引导子项类中,表示转弯的方向。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TurnType } from '{npm}'; + * + * const result = TurnType.AHEAD; + * ``` + */ +var TurnType = { + /** 向前直行。 */ + AHEAD: "AHEAD", + /** 掉头。 */ + BACK: "BACK", + /** 终点,不拐弯。 */ + END: "END", + /** 左转弯。 */ + LEFT: "LEFT", + /** 无效值。 */ + NONE: "NONE", + /** 右转弯。 */ + RIGHT: "RIGHT" +}; + +/** + * @enum BufferEndType + * @description 缓冲区分析BufferEnd类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BufferEndType } from '{npm}'; + * + * const result = BufferEndType.FLAT; + * ``` + */ +var BufferEndType = { + /** FLAT */ + FLAT: "FLAT", + /** ROUND */ + ROUND: "ROUND" +}; +/** + * @enum OverlayOperationType + * @description 叠加分析类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OverlayOperationType } from '{npm}'; + * + * const result = OverlayOperationType.CLIP; + * ``` + */ + var OverlayOperationType = { + /** 操作数据集(几何对象)裁剪被操作数据集(几何对象)。 */ + CLIP: "CLIP", + /** 在被操作数据集(几何对象)上擦除掉与操作数据集(几何对象)相重合的部分。 */ + ERASE: "ERASE", + /**对被操作数据集(几何对象)进行同一操作,即操作执行后,被操作数据集(几何对象)包含来自操作数据集(几何对象)的几何形状。 */ + IDENTITY: "IDENTITY", + /** 对两个数据集(几何对象)求交,返回两个数据集(几何对象)的交集。 */ + INTERSECT: "INTERSECT", + /** 对两个面数据集(几何对象)进行合并操作。 */ + UNION: "UNION", + /** 对两个面数据集(几何对象)进行更新操作。 */ + UPDATE: "UPDATE", + /** 对两个面数据集(几何对象)进行对称差操作。 */ + XOR: "XOR" +}; + +/** + * @enum OutputType + * @description 分布式分析输出类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OutputType } from '{npm}'; + * + * const result = OutputType.INDEXEDHDFS; + * ``` + */ +var OutputType = { + /** INDEXEDHDFS */ + INDEXEDHDFS: "INDEXEDHDFS", + /** UDB */ + UDB: "UDB", + /** MONGODB */ + MONGODB: "MONGODB", + /** PG */ + PG: "PG" +}; + +/** + * @enum SmoothMethod + * @description 光滑方法枚举。 + * 用于从Grid 或DEM数据生成等值线或等值面时对等值线或者等值面的边界线进行平滑处理的方法。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SmoothMethod } from '{npm}'; + * + * const result = SmoothMethod.BSPLINE; + * ``` + */ + var SmoothMethod = { + /** B 样条法。 */ + BSPLINE: "BSPLINE", + /** 磨角法。 */ + POLISH: "POLISH" +}; + +/** + * @enum SurfaceAnalystMethod + * @description 表面分析方法枚举。 + * 通过对数据进行表面分析,能够挖掘原始数据所包含的信息,使某些细节明显化,易于分析。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SurfaceAnalystMethod } from '{npm}'; + * + * const result = SurfaceAnalystMethod.ISOLINE; + * ``` + */ +var SurfaceAnalystMethod = { + /** 等值线提取。 */ + ISOLINE: "ISOLINE", + /** 等值面提取。 */ + ISOREGION: "ISOREGION" +}; + +/** + * @enum DataReturnMode + * @description 数据返回模式枚举。 + * 该枚举用于指定空间分析返回结果模式,包含返回数据集标识和记录集、只返回数据集标识(数据集名称@数据源名称)及只返回记录集三种模式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataReturnMode } from '{npm}'; + * + * const result = DataReturnMode.DATASET_AND_RECORDSET; + * ``` + */ +var DataReturnMode = { + /** 返回结果数据集标识(数据集名称@数据源名称)和记录集(RecordSet)。 */ + DATASET_AND_RECORDSET: "DATASET_AND_RECORDSET", + /** 只返回数据集标识(数据集名称@数据源名称)。 */ + DATASET_ONLY: "DATASET_ONLY", + /** 只返回记录集(RecordSet)。 */ + RECORDSET_ONLY: "RECORDSET_ONLY" +}; + +/** + * @enum EditType + * @description 要素集更新模式枚举。 + * 该枚举用于指定数据服务中要素集更新模式,包含添加要素集、更新要素集和删除要素集。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EditType } from '{npm}'; + * + * const result = {namespace}.EditType.ADD; + * ``` + */ +var EditType = { + /** 增加操作。 */ + ADD: "add", + /** 修改操作。 */ + UPDATE: "update", + /** 删除操作。 */ + DELETE: "delete" +}; + +/** + * @enum TransferTactic + * @description 公交换乘策略枚举。 + * 该枚举用于指定公交服务中要素集更新模式,包含添加要素集、更新要素集和删除要素集。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TransferTactic } from '{npm}'; + * + * const result = TransferTactic.LESS_TIME; + * ``` + */ +var TransferTactic = { + /** 时间短。 */ + LESS_TIME: "LESS_TIME", + /** 少换乘。 */ + LESS_TRANSFER: "LESS_TRANSFER", + /** 少步行。 */ + LESS_WALK: "LESS_WALK", + /** 距离最短。 */ + MIN_DISTANCE: "MIN_DISTANCE" +}; + +/** + * @enum TransferPreference + * @description 公交换乘策略枚举。 + * 该枚举用于指定交通换乘服务中设置地铁优先、公交优先、不乘地铁、无偏好等偏好设置。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TransferPreference } from '{npm}'; + * + * const result = TransferPreference.BUS; + * ``` + */ +var TransferPreference = { + /** 公交汽车优先。 */ + BUS: "BUS", + /** 地铁优先。 */ + SUBWAY: "SUBWAY", + /** 不乘坐地铁。 */ + NO_SUBWAY: "NO_SUBWAY", + /** 无乘车偏好。 */ + NONE: "NONE" +}; + +/** + * @enum GridType + * @description 地图背景格网类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GridType } from '{npm}'; + * + * const result = GridType.CROSS; + * ``` + */ +var GridType = { + /** 十字叉丝。 */ + CROSS: "CROSS", + /** 网格线。 */ + GRID: "GRID", + /** 点。 */ + POINT: "POINT" +}; + +/** + * @enum ColorSpaceType + * @description 色彩空间枚举。 + * 由于成色原理的不同,决定了显示器、投影仪这类靠色光直接合成颜色的颜色设备和打印机、 + * 印刷机这类靠使用颜料的印刷设备在生成颜色方式上的区别。 + * 针对上述不同成色方式,SuperMap 提供两种色彩空间, + * 分别为 RGB 和 CMYK。RGB 主要用于显示系统中,CMYK 主要用于印刷系统中。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ColorSpaceType } from '{npm}'; + * + * const result = ColorSpaceType.CMYK; + * ``` + */ +var ColorSpaceType = { + /** 该类型主要在印刷系统使用。 */ + CMYK: "CMYK", + /** 该类型主要在显示系统中使用。 */ + RGB: "RGB" +}; + +/** + * @enum LayerType + * @description 图层类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LayerType } from '{npm}'; + * + * const result = LayerType.UGC; + * ``` + */ +var LayerType = { + /** SuperMap UGC 类型图层。如矢量图层、栅格(Grid)图层、影像图层。 */ + UGC: "UGC", + /** WMS 图层。 */ + WMS: "WMS", + /** WFS 图层。 */ + WFS: "WFS", + /** 自定义图层。 */ + CUSTOM: "CUSTOM" +}; + +/** + * @enum UGCLayerType + * @description SuperMap 图层类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { UGCLayerType } from '{npm}'; + * + * const result = UGCLayerType.THEME; + * ``` + */ +var UGCLayerType = { + /** 专题图层。 */ + THEME: "THEME", + /** 矢量图层。 */ + VECTOR: "VECTOR", + /** 栅格图层。。 */ + GRID: "GRID", + /** 影像图层。 */ + IMAGE: "IMAGE" +}; + +/** + * @enum StatisticMode + * @description 字段统计方法类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { StatisticMode } from '{npm}'; + * + * const result = StatisticMode.AVERAGE; + * ``` + */ +var StatisticMode = { + /** 统计所选字段的平均值。 */ + AVERAGE: "AVERAGE", + /** 统计所选字段的最大值。 */ + MAX: "MAX", + /** 统计所选字段的最小值。 */ + MIN: "MIN", + /** 统计所选字段的标准差 */ + STDDEVIATION: "STDDEVIATION", + /** 统计所选字段的总和。 */ + SUM: "SUM", + /** 统计所选字段的方差。 */ + VARIANCE: "VARIANCE" +}; + +/** + * @enum PixelFormat + * @description 栅格与影像数据存储的像素格式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { PixelFormat } from '{npm}'; + * + * const result = PixelFormat.BIT16; + * ``` + */ +var PixelFormat = { + /** 每个像元用16个比特(即2个字节)表示。 */ + BIT16: "BIT16", + /** 每个像元用32个比特(即4个字节)表示。 */ + BIT32: "BIT32", + /** 每个像元用64个比特(即8个字节)表示,只提供给栅格数据集使用。 */ + BIT64: "BIT64", + /** 每个像元用4个字节来表示,只提供给栅格数据集使用。 */ + SINGLE: "SINGLE", + /** 每个像元用8个字节来表示,只提供给栅格数据集使用。 */ + DOUBLE: "DOUBLE", + /** 每个像元用1个比特表示。 */ + UBIT1: "UBIT1", + /** 每个像元用4个比特来表示。 */ + UBIT4: "UBIT4", + /** 每个像元用8个比特(即1个字节)来表示。 */ + UBIT8: "UBIT8", + /** 每个像元用24个比特(即3个字节)来表示。 */ + UBIT24: "UBIT24", + /** 每个像元用32个比特(即4个字节)来表示。 */ + UBIT32: "UBIT32" +}; + +/** + * @enum SearchMode + * @description 内插时使用的样本点的查找方式枚举 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SearchMode } from '{npm}'; + * + * const result = SearchMode.KDTREE_FIXED_COUNT; + * ``` + */ +var SearchMode = { + /** 使用 KDTREE 的固定点数方式查找参与内插分析的点。 */ + KDTREE_FIXED_COUNT: "KDTREE_FIXED_COUNT", + /** 使用 KDTREE 的定长方式查找参与内插分析的点。 */ + KDTREE_FIXED_RADIUS: "KDTREE_FIXED_RADIUS", + /** 不进行查找,使用所有的输入点进行内插分析。 */ + NONE: "NONE", + /** 使用 QUADTREE 方式查找参与内插分析的点,仅对样条(RBF)插值和普通克吕金(Kriging)有用。 */ + QUADTREE: "QUADTREE" +}; + +/** + * @enum InterpolationAlgorithmType + * @description 插值分析的算法的类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { InterpolationAlgorithmType } from '{npm}'; + * + * const result = InterpolationAlgorithmType.KRIGING; + * ``` + */ +var InterpolationAlgorithmType = { + /** 普通克吕金插值法。 */ + KRIGING: "KRIGING", + /** 简单克吕金插值法。 */ + SimpleKriging: "SimpleKriging", + /** 泛克吕金插值法。 */ + UniversalKriging: "UniversalKriging" +}; + +/** + * @enum VariogramMode + * @description 克吕金(Kriging)插值时的半变函数类型枚举 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { VariogramMode } from '{npm}'; + * + * const result = VariogramMode.EXPONENTIAL; + * ``` + */ +var VariogramMode = { + /** 指数函数。 */ + EXPONENTIAL: "EXPONENTIAL", + /** 高斯函数。 */ + GAUSSIAN: "GAUSSIAN", + /** 球型函数。 */ + SPHERICAL: "SPHERICAL" +}; + +/** + * @enum Exponent + * @description 定义了泛克吕金(UniversalKriging)插值时样点数据中趋势面方程的阶数 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Exponent } from '{npm}'; + * + * const result = Exponent.EXP1; + * ``` + */ +var Exponent = { + /** 阶数为1。 */ + EXP1: "EXP1", + /** 阶数为2。 */ + EXP2: "EXP2" +}; + +/** + * @enum ClientType + * @description token申请的客户端标识类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ClientType } from '{npm}'; + * + * const result = ClientType.IP; + * ``` + */ +var ClientType = { + /** 指定的 IP 地址。 */ + IP: "IP", + /** 指定的 URL。 */ + REFERER: "Referer", + /** 发送申请令牌请求的客户端 IP。 */ + REQUESTIP: "RequestIP", + /** 不做任何验证。 */ + NONE: "NONE", + /** SERVER。 */ + SERVER: "SERVER", + /** WEB。 */ + WEB: "WEB" +}; + +/** + * @enum ChartType + * @description 客户端专题图图表类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ChartType } from '{npm}'; + * + * const result = ChartType.BAR; + * ``` + */ +var ChartType = { + /** 柱状图。 */ + BAR: "Bar", + /** 三维柱状图。 */ + BAR3D: "Bar3D", + /** 圆形图。 */ + CIRCLE: "Circle", + /** 饼图。 */ + PIE: "Pie", + /** 散点图。 */ + POINT: "Point", + /** 折线图。 */ + LINE: "Line", + /** 环状图。 */ + RING: "Ring" +}; + +/** + * @enum ClipAnalystMode + * @description 裁剪分析模式 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ClipAnalystMode } from '{npm}'; + * + * const result = ClipAnalystMode.CLIP; + * ``` + */ +var ClipAnalystMode = { + /** CLIP。 */ + CLIP: "clip", + /** INTERSECT。 */ + INTERSECT: "intersect" +}; + +/** + * @enum AnalystAreaUnit + * @description 分布式分析面积单位 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AnalystAreaUnit } from '{npm}'; + * + * const result = AnalystAreaUnit.SQUAREMETER; + * ``` + */ +var AnalystAreaUnit = { + /** 平方米。 */ + "SQUAREMETER": "SquareMeter", + /** 平方千米。 */ + "SQUAREKILOMETER": "SquareKiloMeter", + /** 公顷。 */ + "HECTARE": "Hectare", + /** 公亩。 */ + "ARE": "Are", + /** 英亩。 */ + "ACRE": "Acre", + /** 平方英尺。 */ + "SQUAREFOOT": "SquareFoot", + /** 平方码。 */ + "SQUAREYARD": "SquareYard", + /** 平方英里。 */ + "SQUAREMILE": "SquareMile" +}; + +/** + * @enum AnalystSizeUnit + * @description 分布式分析单位 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AnalystSizeUnit } from '{npm}'; + * + * const result = AnalystSizeUnit.METER; + * ``` + */ +var AnalystSizeUnit = { + /** 米。 */ + "METER": "Meter", + /** 千米。 */ + "KILOMETER": "Kilometer", + /** 码。 */ + "YARD": "Yard", + /** 英尺。 */ + "FOOT": "Foot", + /** 英里。 */ + "MILE": "Mile" +}; + +/** + * @enum StatisticAnalystMode + * @description 分布式分析统计模式 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { StatisticAnalystMode } from '{npm}'; + * + * const result = StatisticAnalystMode.MAX; + * ``` + */ +var StatisticAnalystMode = { + /** 统计所选字段的最大值。 */ + "MAX": "max", + /** 统计所选字段的最小值。 */ + "MIN": "min", + /** 统计所选字段的平均值。 */ + "AVERAGE": "average", + /** 统计所选字段的总和。 */ + "SUM": "sum", + /** 统计所选字段的方差。 */ + "VARIANCE": "variance", + /** 统计所选字段的标准差 */ + "STDDEVIATION": "stdDeviation" +}; + +/** + * @enum SummaryType + * @description 分布式分析聚合类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SummaryType } from '{npm}'; + * + * const result = SummaryType.SUMMARYMESH; + * ``` + */ +var SummaryType = { + /** 格网聚合。 */ + "SUMMARYMESH": "SUMMARYMESH", + /** 多边形聚合。 */ + "SUMMARYREGION": "SUMMARYREGION" +}; + +/** + * @enum TopologyValidatorRule + * @description 拓扑检查模式枚举。该类定义了拓扑检查操作模式常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TopologyValidatorRule } from '{npm}'; + * + * const result = TopologyValidatorRule.REGIONNOOVERLAP; + * ``` + */ +var TopologyValidatorRule = { + /** 面内无重叠,用于对面数据进行拓扑检查。 */ + REGIONNOOVERLAP: "REGIONNOOVERLAP", + /** 面与面无重叠,用于对面数据进行拓扑检查。 */ + REGIONNOOVERLAPWITH: "REGIONNOOVERLAPWITH", + /** 面被面包含,用于对面数据进行拓扑检查。 */ + REGIONCONTAINEDBYREGION: "REGIONCONTAINEDBYREGION", + /** 面被面覆盖,用于对面数据进行拓扑检查。 */ + REGIONCOVEREDBYREGION: "REGIONCOVEREDBYREGION", + /** 线与线无重叠,用于对线数据进行拓扑检查。 */ + LINENOOVERLAP: "LINENOOVERLAP", + /** 线内无重叠,用于对线数据进行拓扑检查。 */ + LINENOOVERLAPWITH: "LINENOOVERLAPWITH", + /** 点不相同,用于对点数据进行拓扑检查。 */ + POINTNOIDENTICAL: "POINTNOIDENTICAL" +}; + +/** + * @enum BucketAggType + * @description 格网聚合查询枚举类,该类定义了Elasticsearch数据服务中聚合查询模式常量 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BucketAggType } from '{npm}'; + * + * const result = BucketAggType.GEOHASH_GRID; + * ``` + */ +var BucketAggType = { + /** 格网聚合类型 */ + GEOHASH_GRID: "geohash_grid" +}; + +/** + * @enum MetricsAggType + * @description 指标聚合类型枚举类,该类定义了Elasticsearch数据服务中聚合查询模式常量 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { MetricsAggType } from '{npm}'; + * + * const result = MetricsAggType.AVG; + * ``` + */ +var MetricsAggType = { + /** 平均值聚合类型 */ + AVG:'avg', + /** 最大值聚合类型 */ + MAX:'max', + /** 最小值聚合类型 */ + MIN:'min', + /** 求和聚合类型 */ + SUM:'sum' +}; + +/** + * @enum GetFeatureMode + * @description feature 查询方式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.BOUNDS; + * ``` + */ +var GetFeatureMode = { + /** 通过范围查询来获取要素。 */ + BOUNDS: "BOUNDS", + /** 通过几何对象的缓冲区来获取要素。 */ + BUFFER: "BUFFER", + /** 通过 ID 来获取要素。 */ + ID: "ID", + /** 通过空间查询模式来获取要素。 */ + SPATIAL: "SPATIAL", + /** 通过 SQL 查询来获取要素。 */ + SQL: 'SQL' +} + +/** + * @enum RasterFunctionType + * @description 栅格分析方法。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.NDVI; + * ``` + */ +var RasterFunctionType = { + /** 归一化植被指数。 */ + NDVI: "NDVI", + /** 阴影面分析。 */ + HILLSHADE: "HILLSHADE" +} + +/** + * @enum ResourceType + * @description iportal资源类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.MAP; + * ``` + */ +var ResourceType = { + /** 地图。 */ + MAP: "MAP", + /** 服务。 */ + SERVICE: "SERVICE", + /** 场景。 */ + SCENE: "SCENE", + /** 数据。 */ + DATA: "DATA", + /** 洞察。 */ + INSIGHTS_WORKSPACE: "INSIGHTS_WORKSPACE", + /** 大屏。 */ + MAP_DASHBOARD: "MAP_DASHBOARD" +} + +/** + * @enum OrderBy + * @description iportal资源排序字段。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OrderBy } from '{npm}'; + * + * const result = OrderBy.UPDATETIME; + * ``` + */ +var OrderBy = { + /** 按更新时间排序 */ + UPDATETIME: "UPDATETIME", + /** 按热度(可能是访问量、下载量)排序 */ + HEATLEVEL: "HEATLEVEL", + /** 按相关性排序 */ + RELEVANCE: "RELEVANCE" +} + +/** + * @enum OrderType + * @description iportal资源升序还是降序过滤 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OrderType } from '{npm}'; + * + * const result = OrderType.ASC; + * ``` + */ +var OrderType = { + /** 升序 */ + ASC: "ASC", + /** 降序 */ + DESC: "DESC" +} + +/** + * @enum SearchType + * @description iportal资源查询的范围进行过滤 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SearchType } from '{npm}'; + * + * const result = SearchType.PUBLIC; + * ``` + */ +var SearchType = { + /** 公开资源。 */ + PUBLIC: "PUBLIC", + /** 我的资源。 */ + MY_RES: "MY_RES", + /** 我的群组资源。 */ + MYGROUP_RES: "MYGROUP_RES", + /** 我的部门资源。 */ + MYDEPARTMENT_RES: "MYDEPARTMENT_RES", + /** 分享给我的资源。 */ + SHARETOME_RES: "SHARETOME_RES" +} + +/** + * @enum AggregationTypes + * @description iportal资源聚合查询的类型 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AggregationTypes } from '{npm}'; + * + * const result = AggregationTypes.TAG; + * ``` + */ +var AggregationTypes = { + /** 标签 */ + TAG: "TAG", + /** 资源类型 */ + TYPE: "TYPE" +} + +/** + * @enum PermissionType + * @description iportal资源权限类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { PermissionType } from '{npm}'; + * + * const result = PermissionType.SEARCH; + * ``` + */ +var PermissionType = { + /** 可检索 */ + SEARCH:"SEARCH", + /** 可查看 */ + READ: "READ", + /** 可编辑 */ + READWRITE: "READWRITE", + /** 可删除 */ + DELETE: "DELETE", + /** 可下载,包括可读、可检索 */ + DOWNLOAD:"DOWNLOAD" +} + +/** + * @enum EntityType + * @description iportal资源实体类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EntityType } from '{npm}'; + * + * const result = EntityType.DEPARTMENT; + * ``` + */ +var EntityType = { + /** 部门 */ + DEPARTMENT: "DEPARTMENT", + /** 用户组 */ + GROUP: "GROUP", + /** 群组 */ + IPORTALGROUP: "IPORTALGROUP", + /** 角色 */ + ROLE: "ROLE", + /** 用户 */ + USER: "USER" +} + +/** + * @enum DataItemType + * @description iportal数据类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataItemType } from '{npm}'; + * + * const result = DataItemType.GEOJSON; + * ``` + */ +var DataItemType = { + /** geojson数据。 */ + GEOJSON: "GEOJSON", + /** UGCV5_MVT */ + UGCV5_MVT: "UGCV5_MVT", + /** json数据 */ + JSON: "JSON", + /** AUDIO */ + AUDIO: "AUDIO", + /** COLOR */ + COLOR: "COLOR", + /** COLORSCHEME */ + COLORSCHEME: "COLORSCHEME", + /** CSV */ + CSV: "CSV", + /** EXCEL */ + EXCEL: "EXCEL", + /** FILLSYMBOL */ + FILLSYMBOL: "FILLSYMBOL", + /** IMAGE */ + IMAGE: "IMAGE", + /** LAYERTEMPLATE */ + LAYERTEMPLATE: "LAYERTEMPLATE", + /** LAYOUTTEMPLATE */ + LAYOUTTEMPLATE: "LAYOUTTEMPLATE", + /** LINESYMBOL */ + LINESYMBOL: "LINESYMBOL", + /** MAPTEMPLATE */ + MAPTEMPLATE: "MAPTEMPLATE", + /** MARKERSYMBOL */ + MARKERSYMBOL: "MARKERSYMBOL", + /** MBTILES */ + MBTILES: "MBTILES", + /** PHOTOS */ + PHOTOS: "PHOTOS", + /** SHP */ + SHP: "SHP", + /** SMTILES */ + SMTILES: "SMTILES", + /** SVTILES */ + SVTILES: "SVTILES", + /** THEMETEMPLATE */ + THEMETEMPLATE: "THEMETEMPLATE", + /** TPK */ + TPK: "TPK", + /** UDB */ + UDB: "UDB", + /** UGCV5 */ + UGCV5: "UGCV5", + /** UNKNOWN */ + UNKNOWN: "UNKNOWN", + /** VIDEO */ + VIDEO: "VIDEO", + /** WORKENVIRONMENT */ + WORKENVIRONMENT: "WORKENVIRONMENT", + /** WORKSPACE */ + WORKSPACE: "WORKSPACE" +} + +/** + * @enum WebExportFormatType + * @description Web 打印输出的格式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebExportFormatType } from '{npm}'; + * + * const result = WebExportFormatType.PNG; + * ``` + */ +var WebExportFormatType = { + /** png */ + PNG: "PNG", + /** pdf */ + PDF: "PDF" +} + +/** + * @enum WebScaleOrientationType + * @description Web 比例尺的方位样式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleOrientationType } from '{npm}'; + * + * const result = WebScaleOrientationType.HORIZONTALLABELSBELOW; + * ``` + */ +var WebScaleOrientationType = { + /** horizontal labels below */ + HORIZONTALLABELSBELOW: "HORIZONTALLABELSBELOW", + /** horizontal labels above */ + HORIZONTALLABELSABOVE: "HORIZONTALLABELSABOVE", + /** vertical labels left */ + VERTICALLABELSLEFT: "VERTICALLABELSLEFT", + /** vertical labels right */ + VERTICALLABELSRIGHT: "VERTICALLABELSRIGHT" +} + +/** + * @enum WebScaleType + * @description Web 比例尺的样式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleType } from '{npm}'; + * + * const result = WebScaleType.LINE; + * ``` + */ +var WebScaleType = { + /** line */ + LINE: "LINE", + /** bar */ + BAR: "BAR", + /** bar sub */ + BAR_SUB: "BAR_SUB" +} + +/** + * @enum WebScaleUnit + * @description Web 比例尺的单位制。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleUnit } from '{npm}'; + * + * const result = WebScaleUnit.METER; + * ``` + */ +var WebScaleUnit = { + /** 米 */ + METER: "METER", + /** 英尺 */ + FOOT: "FOOT", + /** 度 */ + DEGREES: "DEGREES" +} + + +;// CONCATENATED MODULE: ./src/common/commontypes/Size.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Size + * @deprecatedclass SuperMap.Size + * @category BaseTypes Style + * @classdesc 此类描绘一对高宽值的实例。 + * @param {number} [w=0.0] - 宽度。 + * @param {number} [h=0.0] - 高度。 + * + * @example + * var size = new Size(31,46); + * @usage + */ +class Size { + + constructor(w, h) { + /** + * @member {number} [Size.prototype.w=0.0] + * @description 宽度。 + */ + this.w = w ? parseFloat(w) : 0.0; + + /** + * @member {number} [Size.prototype.h=0.0] + * @description 高度。 + */ + this.h = w ? parseFloat(h) : 0.0; + this.CLASS_NAME = "SuperMap.Size"; + } + + + /** + * @function Size.prototype.toString + * @description 返回字符串形式。 + * @example + * var size = new Size(10,5); + * var str = size.toString(); + * @returns {string} 例如:"w=10,h=5"。 + */ + toString() { + return ("w=" + this.w + ",h=" + this.h); + } + + + /** + * @function Size.prototype.clone + * @description 克隆当前size对象。 + * @example + * var size = new Size(31,46); + * var size2 = size.clone(); + * @returns {Size} 新的与当前 size 对象有相同宽、高的 Size 对象。 + */ + clone() { + return new Size(this.w, this.h); + } + + + /** + * + * @function Size.prototype.equals + * @description 比较两个 size 对象是否相等。 + * @example + * var size = new Size(31,46); + * var size2 = new Size(31,46); + * var isEquals = size.equals(size2); + * + * @param {Size} sz - 用于比较相等的 Size 对象。 + * @returns {boolean} 传入的 size 和当前 size 高宽相等,注意:如果传入的 size 为空则返回 false。 + * + */ + equals(sz) { + var equals = false; + if (sz != null) { + equals = ((this.w === sz.w && this.h === sz.h) || + (isNaN(this.w) && isNaN(this.h) && isNaN(sz.w) && isNaN(sz.h))); + } + return equals; + } + + /** + * + * @function Size.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var size = new Size(31,46); + * size.destroy(); + */ + destroy() { + this.w = null; + this.h = null; + } +} + +;// CONCATENATED MODULE: ./src/common/commontypes/Pixel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Pixel + * @deprecatedclass SuperMap.Pixel + * @category BaseTypes Geometry + * @classdesc 用 x,y 坐标描绘屏幕坐标(像素点)。 + * @param {number} [x=0.0] - x 坐标。 + * @param {number} [y=0.0] - y 坐标。 + * @param {Pixel.Mode} [mode=Pixel.Mode.LeftTop] - 坐标模式。 + * + * @example + * //单独创建一个对象 + * var pixcel = new Pixel(100,50); + * + * //依据 size 创建 + * var size = new Size(21,25); + * var offset = new Pixel(-(size.w/2), -size.h); + * @usage + */ +class Pixel { + constructor(x, y, mode) { + /** + * @member {number} [Pixel.prototype.x=0.0] + * @description x 坐标。 + */ + this.x = x ? parseFloat(x) : 0.0; + + /** + * @member {number} [Pixel.prototype.y=0.0] + * @description y 坐标。 + */ + this.y = y ? parseFloat(y) : 0.0; + + /** + * @member {Pixel.Mode} [Pixel.prototype.mode=Pixel.Mode.LeftTop] + * @description 坐标模式,有左上、右上、右下、左下这几种模式,分别表示相对于左上角、右上角、右下角、左下角的坐标。 + */ + this.mode = mode; + this.CLASS_NAME = 'SuperMap.Pixel'; + } + + /** + * @function Pixel.prototype.toString + * @description 返回此对象的字符串形式。 + * @example + * + * var pixcel = new Pixel(100,50); + * var str = pixcel.toString(); + * + * @returns {string} 例如: "x=200.4,y=242.2" + */ + toString() { + return 'x=' + this.x + ',y=' + this.y; + } + + /** + * @function Pixel.prototype.clone + * @description 克隆当前的 pixel 对象。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = pixcel.clone(); + * @returns {Pixel} 新的与当前 pixel 对象有相同 x、y 坐标的 pixel 对象。 + */ + clone() { + return new Pixel(this.x, this.y, this.mode); + } + + /** + * @function Pixel.prototype.equals + * @description 比较两 pixel 是否相等。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(100,50); + * var isEquals = pixcel.equals(pixcel2); + * + * @param {Pixel} px - 用于比较相等的 pixel 对象。 + * @returns {boolean} 如果传入的像素点和当前像素点相同返回 true,如果不同或传入参数为 NULL 则返回 false。 + */ + equals(px) { + var equals = false; + if (px != null) { + equals = (this.x == px.x && this.y == px.y) || (isNaN(this.x) && isNaN(this.y) && isNaN(px.x) && isNaN(px.y)); + } + return equals; + } + + /** + * @function Pixel.prototype.distanceTo + * @description 返回两个 pixel 的距离。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(110,30); + * var distance = pixcel.distanceTo(pixcel2); + * + * @param {Pixel} px - 需要计算的 pixel。 + * @returns {number} 作为参数传入的像素与当前像素点的距离。 + */ + distanceTo(px) { + return Math.sqrt(Math.pow(this.x - px.x, 2) + Math.pow(this.y - px.y, 2)); + } + + /** + * @function Pixel.prototype.add + * @description 在原来像素坐标基础上,x 值加上传入的 x 参数,y 值加上传入的 y 参数。 + * @example + * var pixcel = new Pixel(100,50); + * //pixcel2是新的对象 + * var pixcel2 = pixcel.add(20,30); + * + * @param {number} x - 传入的 x 值。 + * @param {number} y - 传入的 y 值。 + * @returns {Pixel} 新的 pixel 对象,该 pixel 是由当前的 pixel 与传入的 x,y 相加得到。 + */ + add(x, y) { + if (x == null || y == null) { + throw new TypeError('Pixel.add cannot receive null values'); + } + return new Pixel(this.x + x, this.y + y); + } + + /** + * @function Pixel.prototype.offset + * @description 通过传入的 {@link Pixel} 参数对原屏幕坐标进行偏移。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(130,20); + * //pixcel3 是新的对象 + * var pixcel3 = pixcel.offset(pixcel2); + * + * @param {Pixel} px - 传入的 {@link Pixel} 对象。 + * @returns {Pixel} 新的 pixel,该 pixel 是由当前的 pixel 对象的 x,y 值与传入的 Pixel 对象的 x,y 值相加得到。 + */ + offset(px) { + var newPx = this.clone(); + if (px) { + newPx = this.add(px.x, px.y); + } + return newPx; + } + + /** + * + * @function Pixel.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var pixcel = new Pixel(100,50); + * pixcel.destroy(); + */ + destroy() { + this.x = null; + this.y = null; + this.mode = null; + } +} +/** + * @enum Mode + * @memberOf Pixel + * @readonly + * @description 模式。 + * @type {string} + */ +Pixel.Mode = { + /** 左上模式。*/ + LeftTop: 'lefttop', + /** 右上模式。 */ + RightTop: 'righttop', + /** 右下模式。 */ + RightBottom: 'rightbottom', + /** 左下模式。 */ + LeftBottom: 'leftbottom' +}; + +;// CONCATENATED MODULE: ./src/common/commontypes/BaseTypes.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @function inherit + * @description 除了 C 和 P 两个必要参数外,可以传递任意数量的对象,这些对象都将继承C。 + * @param {Object} C - 继承的类。 + * @param {Object} P - 被继承的父类。 + * @private + */ +var inheritExt = function (C, P) { + var F = function () { + }; + F.prototype = P.prototype; + C.prototype = new F; + var i, l, o; + for (i = 2, l = arguments.length; i < l; i++) { + o = arguments[i]; + if (typeof o === "function") { + o = o.prototype; + } + Util.extend(C.prototype, o); + } +}; + + +/** + * @function mixinExt + * @description 实现多重继承。 + * @param {Class|Object} ...mixins - 继承的类。 + * @private + */ +var mixinExt = function (...mixins) { + + class Mix { + constructor(options) { + for (var index = 0; index < mixins.length; index++) { + copyProperties(this, new mixins[index](options)); + } + } + } + + for (var index = 0; index < mixins.length; index++) { + var mixin = mixins[index]; + copyProperties(Mix, mixin); + copyProperties(Mix.prototype, mixin.prototype); + copyProperties(Mix.prototype, new mixin()); + } + return Mix; + + function copyProperties(target, source) { + var ownKeys = Object.getOwnPropertyNames(source); + if (Object.getOwnPropertySymbols) { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source)); + } + for (var index = 0; index < ownKeys.length; index++) { + var key = ownKeys[index]; + if (key !== "constructor" + && key !== "prototype" + && key !== "name" && key !== "length") { + let desc = Object.getOwnPropertyDescriptor(source, key); + if (window["ActiveXObject"]) { + Object.defineProperty(target, key, desc || {}); + } else { + Object.defineProperty(target, key, desc); + } + } + } + } +}; + +/** + * @name String + * @namespace + * @category BaseTypes Util + * @description 字符串操作的一系列常用扩展函数。 + * @private + */ +var StringExt = { + + /** + * @function StringExt.startsWith + * @description 判断目标字符串是否以指定的子字符串开头。 + * @param {string} str - 目标字符串。 + * @param {string} sub - 查找的子字符串。 + * @returns {boolean} 目标字符串以指定的子字符串开头,则返回 true;否则返回 false。 + */ + startsWith: function (str, sub) { + return (str.indexOf(sub) == 0); + }, + + /** + * @function StringExt.contains + * @description 判断目标字符串是否包含指定的子字符串。 + * @param {string} str - 目标字符串。 + * @param {string} sub - 查找的子字符串。 + * @returns {boolean} 目标字符串中包含指定的子字符串,则返回 true;否则返回 false。 + */ + contains: function (str, sub) { + return (str.indexOf(sub) != -1); + }, + + /** + * @function StringExt.trim + * @description 删除一个字符串的开头和结尾处的所有空白字符。 + * @param {string} str - (可能)存在空白字符填塞的字符串。 + * @returns {string} 删除开头和结尾处空白字符后的字符串。 + */ + trim: function (str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + }, + + /** + * @function StringExt.camelize + * @description 骆驼式("-")连字符的字符串处理。 + * 例如:"chicken-head" becomes "chickenHead", + * "-chicken-head" becomes "ChickenHead"。 + * @param {string} str - 要处理的字符串,原始内容不应被修改。 + * @returns {string} + */ + camelize: function (str) { + var oStringList = str.split('-'); + var camelizedString = oStringList[0]; + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + return camelizedString; + }, + + /** + * @function StringExt.format + * @description 提供带 ${token} 标记的字符串, 返回 context 对象属性中指定标记的属性值。 + * @example + * 示例: + * (code) + * 1、template = "${value,getValue}"; + * context = {value: {getValue:function(){return Math.max.apply(null,argument);}}}; + * args = [2,23,12,36,21]; + * 返回值:36 + * (end) + * 示例: + * (code) + * 2、template = "$${{value,getValue}}"; + * context = {value: {getValue:function(){return Math.max.apply(null,argument);}}}; + * args = [2,23,12,36,21]; + * 返回值:"${36}" + * (end) + * 示例: + * (code) + * 3、template = "${a,b}"; + * context = {a: {b:"format"}}; + * args = null; + * 返回值:"format" + * (end) + * 示例: + * (code) + * 3、template = "${a,b}"; + * context = null; + * args = null; + * 返回值:"${a.b}" + * (end) + * @param {string} template - 带标记的字符串将要被替换。参数 template 格式为"${token}",此处的 token 标记会替换为 context["token"] 属性的值。 + * @param {Object} [context=window] - 带有属性的可选对象的属性用于匹配格式化字符串中的标记。如果该参数为空,将使用 window 对象。 + * @param {Array.} [args] - 可选参数传递给在 context 对象上找到的函数。 + * @returns {string} 从 context 对象属性中替换字符串标记位的字符串。 + */ + format: function (template, context, args) { + if (!context) { + context = window; + } + + // Example matching: + // str = ${foo.bar} + // match = foo.bar + var replacer = function (str, match) { + var replacement; + + // Loop through all subs. Example: ${a.b.c} + // 0 -> replacement = context[a]; + // 1 -> replacement = context[a][b]; + // 2 -> replacement = context[a][b][c]; + var subs = match.split(/\.+/); + for (var i = 0; i < subs.length; i++) { + if (i == 0) { + replacement = context; + } + + replacement = replacement[subs[i]]; + } + + if (typeof replacement === "function") { + replacement = args ? + replacement.apply(null, args) : + replacement(); + } + + // If replacement is undefined, return the string 'undefined'. + // This is a workaround for a bugs in browsers not properly + // dealing with non-participating groups in regular expressions: + // http://blog.stevenlevithan.com/archives/npcg-javascript + if (typeof replacement == 'undefined') { + return 'undefined'; + } else { + return replacement; + } + }; + + return template.replace(StringExt.tokenRegEx, replacer); + }, + + /** + * @member {RegExp} [StringExt.tokenRegEx] + * @description 寻找带 token 的字符串,默认为 tokenRegEx=/\$\{([\w.]+?)\}/g。 + * @example + * Examples: ${a}, ${a.b.c}, ${a-b}, ${5} + */ + tokenRegEx: /\$\{([\w.]+?)\}/g, + + /** + * @member {RegExp} [StringExt.numberRegEx] + * @description 判断一个字符串是否只包含一个数值,默认为 numberRegEx=/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/。 + */ + numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/, + + /** + * @function StringExt.isNumeric + * @description 判断一个字符串是否只包含一个数值。 + * @example + * (code) + * StringExt.isNumeric("6.02e23") // true + * StringExt.isNumeric("12 dozen") // false + * StringExt.isNumeric("4") // true + * StringExt.isNumeric(" 4 ") // false + * (end) + * @returns {boolean} 字符串包含唯一的数值,返回 true;否则返回 false。 + */ + isNumeric: function (value) { + return StringExt.numberRegEx.test(value); + }, + + /** + * @function StringExt.numericIf + * @description 把一个看似数值型的字符串转化为一个数值。 + * @returns {(number|string)} 如果能转换为数值则返回数值,否则返回字符串本身。 + */ + numericIf: function (value) { + return StringExt.isNumeric(value) ? parseFloat(value) : value; + } + +}; + +/** + * @name Number + * @namespace + * @category BaseTypes Util + * @description 数值操作的一系列常用扩展函数。 + * @private + */ +var NumberExt = { + + /** + * @member {string} [NumberExt.decimalSeparator='.'] + * @description 格式化数字时默认的小数点分隔符。 + * @constant + */ + decimalSeparator: ".", + + /** + * @member {string} [NumberExt.thousandsSeparator=','] + * @description 格式化数字时默认的千位分隔符。 + * @constant + */ + thousandsSeparator: ",", + + /** + * @function NumberExt.limitSigDigs + * @description 限制浮点数的有效数字位数。 + * @param {number} num - 浮点数。 + * @param {number} sig - 有效位数。 + * @returns {number} 将数字四舍五入到指定数量的有效位数。 + */ + limitSigDigs: function (num, sig) { + var fig = 0; + if (sig > 0) { + fig = parseFloat(num.toPrecision(sig)); + } + return fig; + }, + + /** + * @function NumberExt.format + * @description 数字格式化输出。 + * @param {number} num - 数字。 + * @param {number} [dec=0] - 数字的小数部分四舍五入到指定的位数。设置为 null 值时小数部分不变。 + * @param {string} [tsep=','] - 千位分隔符。 + * @param {string} [dsep='.'] - 小数点分隔符。 + * @returns {string} 数字格式化后的字符串。 + */ + format: function (num, dec, tsep, dsep) { + dec = (typeof dec != "undefined") ? dec : 0; + tsep = (typeof tsep != "undefined") ? tsep : + NumberExt.thousandsSeparator; + dsep = (typeof dsep != "undefined") ? dsep : + NumberExt.decimalSeparator; + + if (dec != null) { + num = parseFloat(num.toFixed(dec)); + } + + var parts = num.toString().split("."); + if (parts.length === 1 && dec == null) { + // integer where we do not want to touch the decimals + dec = 0; + } + + var integer = parts[0]; + if (tsep) { + var thousands = /(-?[0-9]+)([0-9]{3})/; + while (thousands.test(integer)) { + integer = integer.replace(thousands, "$1" + tsep + "$2"); + } + } + + var str; + if (dec == 0) { + str = integer; + } else { + var rem = parts.length > 1 ? parts[1] : "0"; + if (dec != null) { + rem = rem + new Array(dec - rem.length + 1).join("0"); + } + str = integer + dsep + rem; + } + return str; + } +}; + +if (!Number.prototype.limitSigDigs) { + /** + * APIMethod: Number.limitSigDigs + * 限制浮点数的有效数字位数. + * @param {number} sig -有效位数。 + * @returns {number} 将数字四舍五入到指定数量的有效位数。 + * 如果传入值 为 null、0、或者是负数, 返回值 0。 + */ + Number.prototype.limitSigDigs = function (sig) { + return NumberExt.limitSigDigs(this, sig); + }; +} + +/** + * @name Function + * @namespace + * @category BaseTypes Util + * @description 函数操作的一系列常用扩展函数。 + * @private + */ +var FunctionExt = { + /** + * @function FunctionExt.bind + * @description 绑定函数到对象。方便创建 this 的作用域。 + * @param {function} func - 输入函数。 + * @param {Object} object - 对象绑定到输入函数(作为输入函数的 this 对象)。 + * @returns {function} object 参数作为 func 函数的 this 对象。 + */ + bind: function (func, object) { + // create a reference to all arguments past the second one + var args = Array.prototype.slice.apply(arguments, [2]); + return function () { + // Push on any additional arguments from the actual function call. + // These will come after those sent to the bind call. + var newArgs = args.concat( + Array.prototype.slice.apply(arguments, [0]) + ); + return func.apply(object, newArgs); + }; + }, + + /** + * @function FunctionExt.bindAsEventListener + * @description 绑定函数到对象,在调用该函数时配置并使用事件对象作为第一个参数。 + * @param {function} func - 用于监听事件的函数。 + * @param {Object} object - this 对象的引用。 + * @returns {function} + */ + bindAsEventListener: function (func, object) { + return function (event) { + return func.call(object, event || window.event); + }; + }, + + /** + * @function FunctionExt.False + * @description 该函数仅仅返回 false。该函数主要是避免在 IE8 以下浏览中 DOM 事件句柄的匿名函数问题。 + * @example + * document.onclick = FunctionExt.False; + * @returns {boolean} + */ + False: function () { + return false; + }, + + /** + * @function FunctionExt.True + * @description 该函数仅仅返回 true。该函数主要是避免在 IE8 以下浏览中 DOM 事件句柄的匿名函数问题。 + * @example + * document.onclick = FunctionExt.True; + * @returns {boolean} + */ + True: function () { + return true; + }, + + /** + * @function FunctionExt.Void + * @description 可重用函数,仅仅返回 "undefined"。 + * @returns {undefined} + */ + Void: function () { + } + +}; + +/** + * @name Array + * @namespace + * @category BaseTypes Util + * @description 数组操作的一系列常用扩展函数。 + * @private + */ +var ArrayExt = { + + /** + * @function ArrayExt.filter + * @description 过滤数组,提供了 ECMA-262 标准中 Array.prototype.filter 函数的扩展。详见:{@link http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter} + * @param {Array} array - 要过滤的数组。 + * @param {function} callback - 数组中的每一个元素调用该函数。
+ * 如果函数的返回值为 true,该元素将包含在返回的数组中。该函数有三个参数: 数组中的元素,元素的索引,数组自身。
+ * 如果设置了可选参数 caller,在调用 callback 时,使用可选参数 caller 设置为 callback 的参数。
+ * @param {Object} [caller] - 在调用 callback 时,使用参数 caller 设置为 callback 的参数。 + * @returns {Array} callback 函数返回 true 时的元素将作为返回数组中的元素。 + */ + filter: function (array, callback, caller) { + var selected = []; + if (Array.prototype.filter) { + selected = array.filter(callback, caller); + } else { + var len = array.length; + if (typeof callback != "function") { + throw new TypeError(); + } + for (var i = 0; i < len; i++) { + if (i in array) { + var val = array[i]; + if (callback.call(caller, val, i, array)) { + selected.push(val); + } + } + } + } + return selected; + } + +}; + +;// CONCATENATED MODULE: ./src/common/commontypes/Geometry.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +// import {WKT} from '../format/WKT'; +// import {Vector} from './Vector'; + + +/** + * @class Geometry + * @deprecatedclass SuperMap.Geometry + * @category BaseTypes Geometry + * @classdesc 几何对象类,描述地理对象的几何图形。 + * @usage + */ +class Geometry { + + + constructor() { + this.CLASS_NAME = "SuperMap.Geometry"; + /** + * @member {string} Geometry.prototype.id + * @description 几何对象的唯一标示符。 + * + */ + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + + /** + * @member {Geometry} Geometry.prototype.parent + * @description 父类几何对象。 + */ + this.parent = null; + + /** + * @member {Bounds} Geometry.prototype.bounds + * @description 几何对象的范围。 + * + */ + this.bounds = null; + + /** + * @member {number} Geometry.prototype.SRID + * @description 投影坐标参数。通过该参数,服务器判断 Geometry 对象的坐标参考系是否与数据集相同,如果不同,则在数据入库前进行投影变换。 + * @example + * var geometry= new Geometry(); + * geometry. SRID=4326; + * + */ + this.SRID = null; + } + + + /** + * @function Geometry.prototype.destroy + * @description 解构 Geometry 类,释放资源。 + */ + destroy() { + this.id = null; + this.bounds = null; + this.SRID = null; + } + + + /** + * @function Geometry.prototype.clone + * @description 克隆几何图形。克隆的几何图形不设置非标准的属性。 + * @returns {Geometry} 克隆的几何图形。 + */ + clone() { + return new Geometry(); + } + + + /** + * @function Geometry.prototype.setBounds + * @description 设置几何对象的 bounds。 + * @param {Bounds} bounds - 范围。 + */ + setBounds(bounds) { + if (bounds) { + this.bounds = bounds.clone(); + } + } + + + /** + * @function Geometry.prototype.clearBounds + * @description 清除几何对象的 bounds。 + * 如果该对象有父类,也会清除父类几何对象的 bounds。 + */ + clearBounds() { + this.bounds = null; + if (this.parent) { + this.parent.clearBounds(); + } + } + + + /** + * @function Geometry.prototype.extendBounds + * @description 扩展现有边界以包含新边界。如果尚未设置几何边界,则设置新边界。 + * @param {Bounds} newBounds - 几何对象的 bounds。 + */ + extendBounds(newBounds) { + var bounds = this.getBounds(); + if (!bounds) { + this.setBounds(newBounds); + } else { + this.bounds.extend(newBounds); + } + } + + + /** + * @function Geometry.prototype.getBounds + * @description 获得几何图形的边界。如果没有设置边界,可通过计算获得。 + * @returns {Bounds} 几何对象的边界。 + */ + getBounds() { + if (this.bounds == null) { + this.calculateBounds(); + } + return this.bounds; + } + + + /** + * @function Geometry.prototype.calculateBounds + * @description 重新计算几何图形的边界(需要在子类中实现此方法)。 + */ + calculateBounds() { + // + // This should be overridden by subclasses. + // + } + + /** + * @function Geometry.prototype.getVertices + * @description 返回几何图形的所有顶点的列表(需要在子类中实现此方法)。 + * @param {boolean} [nodes] - 如果是 true,线则只返回线的末端点,如果 false,仅仅返回顶点,如果没有设置,则返回顶点。 + * @returns {Array} 几何图形的顶点列表。 + */ + getVertices(nodes) { // eslint-disable-line no-unused-vars + } + + /** + * @function Geometry.prototype.getArea + * @description 计算几何对象的面积 ,此方法需要在子类中定义。 + * @returns {number} 计算后的对象面积。 + */ + getArea() { + //to be overridden by geometries that actually have an area + // + return 0.0; + } + + + // /** + // * @function Geometry.prototype.toString + // * @description 返回geometry对象的字符串表述,需要引入{@link WKTFormat}。此方法只能在子类实现,在父类使用会报错。 + // * @returns {string} geometry对象的字符串表述(Well-Known Text) + // */ + // toString() { + // var string; + // if (WKT) { + // var wkt = new WKT(); + // string = wkt.write(new Vector(this)); + // } else { + // string = Object.prototype.toString.call(this); + // } + // return string; + // } +} + +;// CONCATENATED MODULE: ./src/common/commontypes/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @description 浏览器名称,依赖于 userAgent 属性,BROWSER_NAME 可以是空,或者以下浏览器: + * * "opera" -- Opera + * * "msie" -- Internet Explorer + * * "safari" -- Safari + * * "firefox" -- Firefox + * * "mozilla" -- Mozilla + * @category BaseTypes Constant + * @constant {Object} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Browser } from '{npm}'; + * + * const result = Browser.name; + * ``` + */ +const Browser = (function () { + var name = '', + version = '', + device = 'pc', + uaMatch; + //以下进行测试 + var ua = navigator.userAgent.toLowerCase(); + if (ua.indexOf('msie') > -1 || (ua.indexOf('trident') > -1 && ua.indexOf('rv') > -1)) { + name = 'msie'; + uaMatch = ua.match(/msie ([\d.]+)/) || ua.match(/rv:([\d.]+)/); + } else if (ua.indexOf('chrome') > -1) { + name = 'chrome'; + uaMatch = ua.match(/chrome\/([\d.]+)/); + } else if (ua.indexOf('firefox') > -1) { + name = 'firefox'; + uaMatch = ua.match(/firefox\/([\d.]+)/); + } else if (ua.indexOf('opera') > -1) { + name = 'opera'; + uaMatch = ua.match(/version\/([\d.]+)/); + } else if (ua.indexOf('safari') > -1) { + name = 'safari'; + uaMatch = ua.match(/version\/([\d.]+)/); + } + version = uaMatch ? uaMatch[1] : ''; + + if (ua.indexOf('ipad') > -1 || ua.indexOf('ipod') > -1 || ua.indexOf('iphone') > -1) { + device = 'apple'; + } else if (ua.indexOf('android') > -1) { + uaMatch = ua.match(/version\/([\d.]+)/); + version = uaMatch ? uaMatch[1] : ''; + device = 'android'; + } + return { name: name, version: version, device: device }; +})(); + +const isSupportCanvas = (function () { + var checkRes = true, + broz = Browser; + if (document.createElement('canvas').getContext) { + if (broz.name === 'firefox' && parseFloat(broz.version) < 5) { + checkRes = false; + } + if (broz.name === 'safari' && parseFloat(broz.version) < 4) { + checkRes = false; + } + if (broz.name === 'opera' && parseFloat(broz.version) < 10) { + checkRes = false; + } + if (broz.name === 'msie' && parseFloat(broz.version) < 9) { + checkRes = false; + } + } else { + checkRes = false; + } + return checkRes; +})(); + +/** + * @description 如果 userAgent 捕获到浏览器使用的是 Gecko 引擎则返回 true。 + * @constant {number} + * @private + */ +const IS_GECKO = (function () { + var ua = navigator.userAgent.toLowerCase(); + return ua.indexOf('webkit') === -1 && ua.indexOf('gecko') !== -1; +})(); + +/** + * @constant {number} + * @default + * @description 分辨率与比例尺之间转换的常量。 + * @private + */ +const DOTS_PER_INCH = 96; + +/** + * @name CommonUtil + * @namespace + * @category BaseTypes Util + * @description common 工具类。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { CommonUtil } from '{npm}'; + * + * const result = CommonUtil.getElement(); + * ``` + */ + +const Util = { + /** + * @memberOf CommonUtil + * @description 复制源对象的所有属性到目标对象上,源对象上的没有定义的属性在目标对象上也不会被设置。 + * @example + * 要复制 Size 对象的所有属性到自定义对象上,使用方法如下: + * var size = new Size(100, 100); + * var obj = {}; + * CommonUtil.extend(obj, size); + * @param {Object} [destination] - 目标对象。 + * @param {Object} source - 源对象,其属性将被设置到目标对象上。 + * @returns {Object} 目标对象。 + */ + + extend: function (destination, source) { + destination = destination || {}; + if (source) { + for (var property in source) { + var value = source[property]; + if (value !== undefined) { + destination[property] = value; + } + } + + /** + * IE doesn't include the toString property when iterating over an object's + * properties with the for(property in object) syntax. Explicitly check if + * the source has its own toString property. + */ + + /* + * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative + * prototype object" when calling hawOwnProperty if the source object + * is an instance of window.Event. + */ + + var sourceIsEvt = typeof window.Event === 'function' && source instanceof window.Event; + + if (!sourceIsEvt && source.hasOwnProperty && source.hasOwnProperty('toString')) { + destination.toString = source.toString; + } + } + return destination; + }, + /** + * @memberOf CommonUtil + * @description 对象拷贝。 + * @param {Object} [des] - 目标对象。 + * @param {Object} soc - 源对象。 + */ + copy: function (des, soc) { + des = des || {}; + var v; + if (soc) { + for (var p in des) { + v = soc[p]; + if (typeof v !== 'undefined') { + des[p] = v; + } + } + } + }, + /** + * @memberOf CommonUtil + * @description 销毁对象,将其属性置空。 + * @param {Object} [obj] - 目标对象。 + */ + reset: function (obj) { + obj = obj || {}; + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + if (typeof obj[p] === 'object' && obj[p] instanceof Array) { + for (var i in obj[p]) { + if (obj[p][i].destroy) { + obj[p][i].destroy(); + } + } + obj[p].length = 0; + } else if (typeof obj[p] === 'object' && obj[p] instanceof Object) { + if (obj[p].destroy) { + obj[p].destroy(); + } + } + obj[p] = null; + } + } + }, + + /** + * @memberOf CommonUtil + * @description 获取 HTML 元素数组。 + * @returns {Array.} HTML 元素数组。 + */ + getElement: function () { + var elements = []; + + for (var i = 0, len = arguments.length; i < len; i++) { + var element = arguments[i]; + if (typeof element === 'string') { + element = document.getElementById(element); + } + if (arguments.length === 1) { + return element; + } + elements.push(element); + } + return elements; + }, + + /** + * @memberOf CommonUtil + * @description instance of 的跨浏览器实现。 + * @param {Object} o - 对象。 + * @returns {boolean} 是否是页面元素。 + */ + isElement: function (o) { + return !!(o && o.nodeType === 1); + }, + + /** + * @memberOf CommonUtil + * @description 判断一个对象是否是数组。 + * @param {Object} a - 对象。 + * @returns {boolean} 是否是数组。 + */ + isArray: function (a) { + return Object.prototype.toString.call(a) === '[object Array]'; + }, + + /** + * @memberOf CommonUtil + * @description 从数组中删除某一项。 + * @param {Array} array - 数组。 + * @param {Object} item - 数组中要删除的一项。 + * @returns {Array} 执行删除操作后的数组。 + */ + removeItem: function (array, item) { + for (var i = array.length - 1; i >= 0; i--) { + if (array[i] === item) { + array.splice(i, 1); + //break;more than once?? + } + } + return array; + }, + + /** + * @memberOf CommonUtil + * @description 获取某对象在数组中的索引值。 + * @param {Array.} array - 数组。 + * @param {Object} obj - 对象。 + * @returns {number} 某对象在数组中的索引值。 + */ + indexOf: function (array, obj) { + if (array == null) { + return -1; + } else { + // use the build-in function if available. + if (typeof array.indexOf === 'function') { + return array.indexOf(obj); + } else { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === obj) { + return i; + } + } + return -1; + } + } + }, + + /** + * @memberOf CommonUtil + * @description 修改某 DOM 元素的许多属性。 + * @param {HTMLElement} element - 待修改的 DOM 元素。 + * @param {string} [id] - DOM 元素的 ID。 + * @param {Pixel} [px] - DOM 元素的 style 属性的 left 和 top 属性。 + * @param {Size} [sz] - DOM 元素的 width 和 height 属性。 + * @param {string} [position] - DOM 元素的 position 属性。 + * @param {string} [border] - DOM 元素的 style 属性的 border 属性。 + * @param {string} [overflow] - DOM 元素的 style 属性的 overflow 属性。 + * @param {number} [opacity] - 不透明度值。取值范围为(0.0 - 1.0)。 + */ + modifyDOMElement: function (element, id, px, sz, position, border, overflow, opacity) { + if (id) { + element.id = id; + } + if (px) { + element.style.left = px.x + 'px'; + element.style.top = px.y + 'px'; + } + if (sz) { + element.style.width = sz.w + 'px'; + element.style.height = sz.h + 'px'; + } + if (position) { + element.style.position = position; + } + if (border) { + element.style.border = border; + } + if (overflow) { + element.style.overflow = overflow; + } + if (parseFloat(opacity) >= 0.0 && parseFloat(opacity) < 1.0) { + element.style.filter = 'alpha(opacity=' + opacity * 100 + ')'; + element.style.opacity = opacity; + } else if (parseFloat(opacity) === 1.0) { + element.style.filter = ''; + element.style.opacity = ''; + } + }, + + /** + * @memberOf CommonUtil + * @description 比较两个对象并合并。 + * @param {Object} [to] - 目标对象。 + * @param {Object} from - 源对象。 + * @returns {Object} 返回合并后的对象。 + */ + applyDefaults: function (to, from) { + to = to || {}; + /* + * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative + * prototype object" when calling hawOwnProperty if the source object is an + * instance of window.Event. + */ + var fromIsEvt = typeof window.Event === 'function' && from instanceof window.Event; + + for (var key in from) { + if ( + to[key] === undefined || + (!fromIsEvt && from.hasOwnProperty && from.hasOwnProperty(key) && !to.hasOwnProperty(key)) + ) { + to[key] = from[key]; + } + } + /** + * IE doesn't include the toString property when iterating over an object's + * properties with the for(property in object) syntax. Explicitly check if + * the source has its own toString property. + */ + if ( + !fromIsEvt && + from && + from.hasOwnProperty && + from.hasOwnProperty('toString') && + !to.hasOwnProperty('toString') + ) { + to.toString = from.toString; + } + + return to; + }, + + /** + * @memberOf CommonUtil + * @description 将参数对象转换为 HTTP 的 GET 请求中的参数字符串。例如:"key1=value1&key2=value2&key3=value3"。 + * @param {Object} params - 参数对象。 + * @returns {string} HTTP 的 GET 请求中的参数字符串。 + */ + getParameterString: function (params) { + var paramsArray = []; + + for (var key in params) { + var value = params[key]; + if (value != null && typeof value !== 'function') { + var encodedValue; + if (Array.isArray(value) || value.toString() === '[object Object]') { + encodedValue = encodeURIComponent(JSON.stringify(value)); + } else { + /* value is a string; simply encode */ + encodedValue = encodeURIComponent(value); + } + paramsArray.push(encodeURIComponent(key) + '=' + encodedValue); + } + } + + return paramsArray.join('&'); + }, + + /** + * @memberOf CommonUtil + * @description 给 URL 追加查询参数。 + * @param {string} url - 待追加参数的 URL 字符串。 + * @param {string} paramStr - 待追加的查询参数。 + * @returns {string} 新的 URL。 + */ + urlAppend: function (url, paramStr) { + var newUrl = url; + if (paramStr) { + if (paramStr.indexOf('?') === 0) { + paramStr = paramStr.substring(1); + } + var parts = (url + ' ').split(/[?&]/); + newUrl += parts.pop() === ' ' ? paramStr : parts.length ? '&' + paramStr : '?' + paramStr; + } + return newUrl; + }, + + /** + * @memberOf CommonUtil + * @description 给 URL 追加 path 参数。 + * @param {string} url - 待追加参数的 URL 字符串。 + * @param {string} paramStr - 待追加的path参数。 + * @returns {string} 新的 URL。 + */ + urlPathAppend: function (url, pathStr) { + let newUrl = url; + if (!pathStr) { + return newUrl; + } + if (pathStr.indexOf('/') === 0) { + pathStr = pathStr.substring(1); + } + const parts = url.split('?'); + if (parts[0].indexOf('/', parts[0].length - 1) < 0) { + parts[0] += '/'; + } + newUrl = `${parts[0]}${pathStr}${parts.length > 1 ? `?${parts[1]}` : ''}`; + return newUrl; + }, + + /** + * @memberOf CommonUtil + * @description 为了避免浮点精度错误而保留的有效位数。 + * @type {number} + * @default 14 + */ + DEFAULT_PRECISION: 14, + + /** + * @memberOf CommonUtil + * @description 将字符串以接近的精度转换为数字。 + * @param {string} number - 字符串。 + * @param {number} [precision=14] - 精度。 + * @returns {number} 转化后的数字。 + */ + toFloat: function (number, precision) { + if (precision == null) { + precision = Util.DEFAULT_PRECISION; + } + if (typeof number !== 'number') { + number = parseFloat(number); + } + return precision === 0 ? number : parseFloat(number.toPrecision(precision)); + }, + + /** + * @memberOf CommonUtil + * @description 角度转弧度。 + * @param {number} x - 角度。 + * @returns {number} 转化后的弧度。 + */ + rad: function (x) { + return (x * Math.PI) / 180; + }, + + /** + * @memberOf CommonUtil + * @description 从 URL 字符串中解析出参数对象。 + * @param {string} url - URL。 + * @returns {Object} 解析出的参数对象。 + */ + getParameters: function (url) { + // if no url specified, take it from the location bar + url = url === null || url === undefined ? window.location.href : url; + + //parse out parameters portion of url string + var paramsString = ''; + if (StringExt.contains(url, '?')) { + var start = url.indexOf('?') + 1; + var end = StringExt.contains(url, '#') ? url.indexOf('#') : url.length; + paramsString = url.substring(start, end); + } + + var parameters = {}; + var pairs = paramsString.split(/[&;]/); + for (var i = 0, len = pairs.length; i < len; ++i) { + var keyValue = pairs[i].split('='); + if (keyValue[0]) { + var key = keyValue[0]; + try { + key = decodeURIComponent(key); + } catch (err) { + key = unescape(key); + } + + // being liberal by replacing "+" with " " + var value = (keyValue[1] || '').replace(/\+/g, ' '); + + try { + value = decodeURIComponent(value); + } catch (err) { + value = unescape(value); + } + + // follow OGC convention of comma delimited values + value = value.split(','); + + //if there's only one value, do not return as array + if (value.length == 1) { + value = value[0]; + } + + parameters[key] = value; + } + } + return parameters; + }, + + /** + * @memberOf CommonUtil + * @description 不断递增计数变量,用于生成唯一 ID。 + * @type {number} + * @default 0 + */ + lastSeqID: 0, + + /** + * @memberOf CommonUtil + * @description 创建唯一 ID 值。 + * @param {string} [prefix] - 前缀。 + * @returns {string} 唯一的 ID 值。 + */ + createUniqueID: function (prefix) { + if (prefix == null) { + prefix = 'id_'; + } + Util.lastSeqID += 1; + return prefix + Util.lastSeqID; + }, + + /** + * @memberOf CommonUtil + * @description 判断并转化比例尺。 + * @param {number} scale - 比例尺。 + * @returns {number} 正常的 scale 值。 + */ + normalizeScale: function (scale) { + var normScale = scale > 1.0 ? 1.0 / scale : scale; + return normScale; + }, + + /** + * @memberOf CommonUtil + * @description 比例尺转分辨率。 + * @param {number} scale - 比例尺。 + * @param {string} [units='degrees'] - 比例尺单位。 + * @returns {number} 转化后的分辨率。 + */ + getResolutionFromScale: function (scale, units) { + var resolution; + if (scale) { + if (units == null) { + units = 'degrees'; + } + var normScale = Util.normalizeScale(scale); + resolution = 1 / (normScale * INCHES_PER_UNIT[units] * DOTS_PER_INCH); + } + return resolution; + }, + + /** + * @memberOf CommonUtil + * @description 分辨率转比例尺。 + * @param {number} resolution - 分辨率。 + * @param {string} [units='degrees'] - 分辨率单位。 + * @returns {number} 转化后的比例尺。 + */ + getScaleFromResolution: function (resolution, units) { + if (units == null) { + units = 'degrees'; + } + + var scale = resolution * INCHES_PER_UNIT[units] * DOTS_PER_INCH; + return scale; + }, + + /** + * @memberOf CommonUtil + * @description 获取浏览器相关信息。支持的浏览器包括:Opera,Internet Explorer,Safari,Firefox。 + * @returns {Object} 浏览器名称、版本、设备名称。对应的属性分别为 name, version, device。 + */ + getBrowser: function () { + return Browser; + }, + + /** + * @memberOf CommonUtil + * @description 浏览器是否支持 Canvas。 + * @returns {boolean} 当前浏览器是否支持 HTML5 Canvas。 + */ + isSupportCanvas, + + /** + * @memberOf CommonUtil + * @description 判断;浏览器是否支持 Canvas。 + * @returns {boolean} 当前浏览器是否支持 HTML5 Canvas 。 + */ + supportCanvas: function () { + return Util.isSupportCanvas; + }, + + /** + * @memberOf CommonUtil + * @description 判断一个 URL 请求是否在当前域中。 + * @param {string} url - URL 请求字符串。 + * @returns {boolean} URL 请求是否在当前域中。 + */ + isInTheSameDomain: function (url) { + if (!url) { + return true; + } + var index = url.indexOf('//'); + var documentUrl = document.location.toString(); + var documentIndex = documentUrl.indexOf('//'); + if (index === -1) { + return true; + } else { + var protocol; + var substring = (protocol = url.substring(0, index)); + var documentSubString = documentUrl.substring(documentIndex + 2); + documentIndex = documentSubString.indexOf('/'); + var documentPortIndex = documentSubString.indexOf(':'); + var documentDomainWithPort = documentSubString.substring(0, documentIndex); + //var documentPort; + + var documentprotocol = document.location.protocol; + if (documentPortIndex !== -1) { + // documentPort = +documentSubString.substring(documentPortIndex, documentIndex); + } else { + documentDomainWithPort += ':' + (documentprotocol.toLowerCase() === 'http:' ? 80 : 443); + } + if (documentprotocol.toLowerCase() !== substring.toLowerCase()) { + return false; + } + substring = url.substring(index + 2); + var portIndex = substring.indexOf(':'); + index = substring.indexOf('/'); + var domainWithPort = substring.substring(0, index); + var domain; + if (portIndex !== -1) { + domain = substring.substring(0, portIndex); + } else { + domain = substring.substring(0, index); + domainWithPort += ':' + (protocol.toLowerCase() === 'http:' ? 80 : 443); + } + var documentDomain = document.domain; + if (domain === documentDomain && domainWithPort === documentDomainWithPort) { + return true; + } + } + return false; + }, + + /** + * @memberOf CommonUtil + * @description 计算 iServer 服务的 REST 图层的显示分辨率,需要从 iServer 的 REST 图层表述中获取 viewBounds、viewer、scale、coordUnit、datumAxis 五个参数,来进行计算。 + * @param {Bounds} viewBounds - 地图的参照可视范围,即地图初始化时默认的地图显示范围。 + * @param {Size} viewer - 地图初始化时默认的地图图片的尺寸。 + * @param {number} scale - 地图初始化时默认的显示比例尺。 + * @param {string} [coordUnit='degrees'] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则系统默认为 WGS84 参考系的椭球体长半轴 6378137。 + * @returns {number} 图层显示分辨率。 + */ + calculateDpi: function (viewBounds, viewer, scale, coordUnit, datumAxis) { + //10000 是 0.1毫米与米的转换。DPI的计算公式:Viewer / DPI * 0.0254 * 10000 = ViewBounds * scale ,公式中的10000是为了提高计算结果的精度,以下出现的ratio皆为如此。 + if (!viewBounds || !viewer || !scale) { + return; + } + var ratio = 10000, + rvbWidth = viewBounds.getWidth(), + rvbHeight = viewBounds.getHeight(), + rvWidth = viewer.w, + rvHeight = viewer.h; + //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || 'degrees'; + var dpi; + if ( + coordUnit.toLowerCase() === 'degree' || + coordUnit.toLowerCase() === 'degrees' || + coordUnit.toLowerCase() === 'dd' + ) { + let num1 = rvbWidth / rvWidth, + num2 = rvbHeight / rvHeight, + resolution = num1 > num2 ? num1 : num2; + dpi = (0.0254 * ratio) / resolution / scale / ((Math.PI * 2 * datumAxis) / 360) / ratio; + } else { + let resolution = rvbWidth / rvWidth; + dpi = (0.0254 * ratio) / resolution / scale / ratio; + } + return dpi; + }, + + /** + * @memberOf CommonUtil + * @description 将对象转换成 JSON 字符串。 + * @param {Object} obj - 要转换成 JSON 的 Object 对象。 + * @returns {string} 转换后的 JSON 对象。 + */ + toJSON: function (obj) { + var objInn = obj; + if (objInn == null) { + return null; + } + switch (objInn.constructor) { + case String: + //s = "'" + str.replace(/(["\\])/g, "\\$1") + "'"; string含有单引号出错 + objInn = '"' + objInn.replace(/(["\\])/g, '\\$1') + '"'; + objInn = objInn.replace(/\n/g, '\\n'); + objInn = objInn.replace(/\r/g, '\\r'); + objInn = objInn.replace('<', '<'); + objInn = objInn.replace('>', '>'); + objInn = objInn.replace(/%/g, '%25'); + objInn = objInn.replace(/&/g, '%26'); + return objInn; + case Array: + var arr = ''; + for (var i = 0, len = objInn.length; i < len; i++) { + arr += Util.toJSON(objInn[i]); + if (i !== objInn.length - 1) { + arr += ','; + } + } + return "[" + arr + "]"; + case Number: + return isFinite(objInn) ? String(objInn) : null; + case Boolean: + return String(objInn); + case Date: + var dateStr = + '{' + + '\'__type\':"System.DateTime",' + + "'Year':" + + objInn.getFullYear() + + ',' + + "'Month':" + + (objInn.getMonth() + 1) + + ',' + + "'Day':" + + objInn.getDate() + + ',' + + "'Hour':" + + objInn.getHours() + + ',' + + "'Minute':" + + objInn.getMinutes() + + ',' + + "'Second':" + + objInn.getSeconds() + + ',' + + "'Millisecond':" + + objInn.getMilliseconds() + + ',' + + "'TimezoneOffset':" + + objInn.getTimezoneOffset() + + '}'; + return dateStr; + default: + if (objInn['toJSON'] != null && typeof objInn['toJSON'] === 'function') { + return objInn.toJSON(); + } + if (typeof objInn === 'object') { + if (objInn.length) { + let arr = []; + for (let i = 0, len = objInn.length; i < len; i++) { + arr.push(Util.toJSON(objInn[i])); + } + return '[' + arr.join(',') + ']'; + } + let arr = []; + for (let attr in objInn) { + //为解决Geometry类型头json时堆栈溢出的问题,attr == "parent"时不进行json转换 + if (typeof objInn[attr] !== 'function' && attr !== 'CLASS_NAME' && attr !== 'parent') { + arr.push("'" + attr + "':" + Util.toJSON(objInn[attr])); + } + } + + if (arr.length > 0) { + return '{' + arr.join(',') + '}'; + } else { + return '{}'; + } + } + return objInn.toString(); + } + }, + + /** + * @memberOf CommonUtil + * @description 根据比例尺和 dpi 计算屏幕分辨率。 + * @category BaseTypes Util + * @param {number} scale - 比例尺。 + * @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 + * @param {string} [coordUnit] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 + * @returns {number} 当前比例尺下的屏幕分辨率。 + */ + getResolutionFromScaleDpi: function (scale, dpi, coordUnit, datumAxis) { + var resolution = null, + ratio = 10000; + //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + if (scale > 0 && dpi > 0) { + scale = Util.normalizeScale(scale); + if ( + coordUnit.toLowerCase() === 'degree' || + coordUnit.toLowerCase() === 'degrees' || + coordUnit.toLowerCase() === 'dd' + ) { + //scale = Util.normalizeScale(scale); + resolution = (0.0254 * ratio) / dpi / scale / ((Math.PI * 2 * datumAxis) / 360) / ratio; + return resolution; + } else { + resolution = (0.0254 * ratio) / dpi / scale / ratio; + return resolution; + } + } + return -1; + }, + + /** + * @memberOf CommonUtil + * @description 根据 resolution、dpi、coordUnit 和 datumAxis 计算比例尺。 + * @param {number} resolution - 用于计算比例尺的地图分辨率。 + * @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 + * @param {string} [coordUnit] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 + * @returns {number} 当前屏幕分辨率下的比例尺。 + */ + getScaleFromResolutionDpi: function (resolution, dpi, coordUnit, datumAxis) { + var scale = null, + ratio = 10000; + //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + if (resolution > 0 && dpi > 0) { + if ( + coordUnit.toLowerCase() === 'degree' || + coordUnit.toLowerCase() === 'degrees' || + coordUnit.toLowerCase() === 'dd' + ) { + scale = (0.0254 * ratio) / dpi / resolution / ((Math.PI * 2 * datumAxis) / 360) / ratio; + return scale; + } else { + scale = (0.0254 * ratio) / dpi / resolution / ratio; + return scale; + } + } + return -1; + }, + + /** + * @memberOf CommonUtil + * @description 转换查询结果。 + * @param {Object} result - 查询结果。 + * @returns {Object} 转换后的查询结果。 + */ + transformResult: function (result) { + if (result.responseText && typeof result.responseText === 'string') { + result = JSON.parse(result.responseText); + } + return result; + }, + + /** + * @memberOf CommonUtil + * @description 属性拷贝,不拷贝方法类名(CLASS_NAME)等。 + * @param {Object} [destination] - 拷贝目标。 + * @param {Object} source - 源对象。 + * + */ + copyAttributes: function (destination, source) { + destination = destination || {}; + if (source) { + for (var property in source) { + var value = source[property]; + if (value !== undefined && property !== 'CLASS_NAME' && typeof value !== 'function') { + destination[property] = value; + } + } + } + return destination; + }, + + /** + * @memberOf CommonUtil + * @description 将源对象上的属性拷贝到目标对象上。(不拷贝 CLASS_NAME 和方法) + * @param {Object} [destination] - 目标对象。 + * @param {Object} source - 源对象。 + * @param {Array.} clip - 源对象中禁止拷贝到目标对象的属性,目的是防止目标对象上不可修改的属性被篡改。 + * + */ + copyAttributesWithClip: function (destination, source, clip) { + destination = destination || {}; + if (source) { + for (var property in source) { + //去掉禁止拷贝的属性 + var isInClip = false; + if (clip && clip.length) { + for (var i = 0, len = clip.length; i < len; i++) { + if (property === clip[i]) { + isInClip = true; + break; + } + } + } + if (isInClip === true) { + continue; + } + + var value = source[property]; + if (value !== undefined && property !== 'CLASS_NAME' && typeof value !== 'function') { + destination[property] = value; + } + } + } + return destination; + }, + + /** + * @memberOf CommonUtil + * @description 克隆一个 Object 对象 + * @param {Object} obj - 需要克隆的对象。 + * @returns {Object} 对象的拷贝对象,注意是新的对象,不是指向。 + */ + cloneObject: function (obj) { + // Handle the 3 simple types, and null or undefined + if (null === obj || 'object' !== typeof obj) { + return obj; + } + + // Handle Date + if (obj instanceof Date) { + let copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } + + // Handle Array + if (obj instanceof Array) { + let copy = obj.slice(0); + return copy; + } + + // Handle Object + if (obj instanceof Object) { + let copy = {}; + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) { + copy[attr] = Util.cloneObject(obj[attr]); + } + } + return copy; + } + + throw new Error("Unable to copy obj! Its type isn't supported."); + }, + + /** + * @memberOf CommonUtil + * @description 判断两条线段是不是有交点。 + * @param {GeometryPoint} a1 - 第一条线段的起始节点。 + * @param {GeometryPoint} a2 - 第一条线段的结束节点。 + * @param {GeometryPoint} b1 - 第二条线段的起始节点。 + * @param {GeometryPoint} b2 - 第二条线段的结束节点。 + * @returns {Object} 如果相交返回交点,如果不相交返回两条线段的位置关系。 + */ + lineIntersection: function (a1, a2, b1, b2) { + var intersectValue = null; + var k1; + var k2; + var b = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var a = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var ab = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); + //ab==0代表两条线断的斜率一样 + if (ab != 0) { + k1 = b / ab; + k2 = a / ab; + + if (k1 >= 0 && k2 <= 1 && k1 <= 1 && k2 >= 0) { + intersectValue = new Geometry.Point(a1.x + k1 * (a2.x - a1.x), a1.y + k1 * (a2.y - a1.y)); + } else { + intersectValue = 'No Intersection'; + } + } else { + if (b == 0 && a == 0) { + var maxy = Math.max(a1.y, a2.y); + var miny = Math.min(a1.y, a2.y); + var maxx = Math.max(a1.x, a2.x); + var minx = Math.min(a1.x, a2.x); + if ( + (((b1.y >= miny && b1.y <= maxy) || (b2.y >= miny && b2.y <= maxy)) && b1.x >= minx && b1.x <= maxx) || + (b2.x >= minx && b2.x <= maxx) + ) { + intersectValue = 'Coincident'; //重合 + } else { + intersectValue = 'Parallel'; //平行 + } + } else { + intersectValue = 'Parallel'; //平行 + } + } + return intersectValue; + }, + + /** + * @memberOf CommonUtil + * @description 获取文本外接矩形宽度与高度。 + * @param {ThemeStyle} style - 文本样式。 + * @param {string} text - 文本内容。 + * @param {Object} element - DOM 元素。 + * @returns {Object} 裁剪后的宽度,高度信息。 + */ + getTextBounds: function (style, text, element) { + document.body.appendChild(element); + element.style.width = 'auto'; + element.style.height = 'auto'; + if (style.fontSize) { + element.style.fontSize = style.fontSize; + } + if (style.fontFamily) { + element.style.fontFamily = style.fontFamily; + } + if (style.fontWeight) { + element.style.fontWeight = style.fontWeight; + } + element.style.position = 'relative'; + element.style.visibility = 'hidden'; + //fix 在某些情况下,element内的文本变成竖起排列,导致宽度计算不正确的bug + element.style.display = 'inline-block'; + element.innerHTML = text; + var textWidth = element.clientWidth; + var textHeight = element.clientHeight; + document.body.removeChild(element); + return { + textWidth: textWidth, + textHeight: textHeight + }; + }, + /** + * @memberOf CommonUtil + * @description 获取转换后的path路径。 + * @param {string} path - 待转换的path, 包含`{param}`。 + * @param {Object} pathParams - path中待替换的参数。 + * @returns {string} 转换后的path路径 + */ + convertPath: function (path, pathParams) { + if (!pathParams) { + return path; + } + return path.replace(/\{([\w-\.]+)\}/g, (fullMatch, key) => { + var value; + if (pathParams.hasOwnProperty(key)) { + value = paramToString(pathParams[key]); + } else { + value = fullMatch; + } + return encodeURIComponent(value); + }); + } +}; + +/** + * @enum INCHES_PER_UNIT + * @description 每单位的英尺数。 + * @type {number} + * @private + */ +const INCHES_PER_UNIT = { + inches: 1.0, + ft: 12.0, + mi: 63360.0, + m: 39.3701, + km: 39370.1, + dd: 4374754, + yd: 36 +}; +INCHES_PER_UNIT['in'] = INCHES_PER_UNIT.inches; +INCHES_PER_UNIT['degrees'] = INCHES_PER_UNIT.dd; +INCHES_PER_UNIT['nmi'] = 1852 * INCHES_PER_UNIT.m; + +// Units from CS-Map +const METERS_PER_INCH = 0.0254000508001016002; +Util.extend(INCHES_PER_UNIT, { + Inch: INCHES_PER_UNIT.inches, + Meter: 1.0 / METERS_PER_INCH, //EPSG:9001 + Foot: 0.30480060960121920243 / METERS_PER_INCH, //EPSG:9003 + IFoot: 0.3048 / METERS_PER_INCH, //EPSG:9002 + ClarkeFoot: 0.3047972651151 / METERS_PER_INCH, //EPSG:9005 + SearsFoot: 0.30479947153867624624 / METERS_PER_INCH, //EPSG:9041 + GoldCoastFoot: 0.30479971018150881758 / METERS_PER_INCH, //EPSG:9094 + IInch: 0.0254 / METERS_PER_INCH, + MicroInch: 0.0000254 / METERS_PER_INCH, + Mil: 0.0000000254 / METERS_PER_INCH, + Centimeter: 0.01 / METERS_PER_INCH, + Kilometer: 1000.0 / METERS_PER_INCH, //EPSG:9036 + Yard: 0.91440182880365760731 / METERS_PER_INCH, + SearsYard: 0.914398414616029 / METERS_PER_INCH, //EPSG:9040 + IndianYard: 0.91439853074444079983 / METERS_PER_INCH, //EPSG:9084 + IndianYd37: 0.91439523 / METERS_PER_INCH, //EPSG:9085 + IndianYd62: 0.9143988 / METERS_PER_INCH, //EPSG:9086 + IndianYd75: 0.9143985 / METERS_PER_INCH, //EPSG:9087 + IndianFoot: 0.30479951 / METERS_PER_INCH, //EPSG:9080 + IndianFt37: 0.30479841 / METERS_PER_INCH, //EPSG:9081 + IndianFt62: 0.3047996 / METERS_PER_INCH, //EPSG:9082 + IndianFt75: 0.3047995 / METERS_PER_INCH, //EPSG:9083 + Mile: 1609.34721869443738887477 / METERS_PER_INCH, + IYard: 0.9144 / METERS_PER_INCH, //EPSG:9096 + IMile: 1609.344 / METERS_PER_INCH, //EPSG:9093 + NautM: 1852.0 / METERS_PER_INCH, //EPSG:9030 + 'Lat-66': 110943.316488932731 / METERS_PER_INCH, + 'Lat-83': 110946.25736872234125 / METERS_PER_INCH, + Decimeter: 0.1 / METERS_PER_INCH, + Millimeter: 0.001 / METERS_PER_INCH, + Dekameter: 10.0 / METERS_PER_INCH, + Decameter: 10.0 / METERS_PER_INCH, + Hectometer: 100.0 / METERS_PER_INCH, + GermanMeter: 1.0000135965 / METERS_PER_INCH, //EPSG:9031 + CaGrid: 0.999738 / METERS_PER_INCH, + ClarkeChain: 20.1166194976 / METERS_PER_INCH, //EPSG:9038 + GunterChain: 20.11684023368047 / METERS_PER_INCH, //EPSG:9033 + BenoitChain: 20.116782494375872 / METERS_PER_INCH, //EPSG:9062 + SearsChain: 20.11676512155 / METERS_PER_INCH, //EPSG:9042 + ClarkeLink: 0.201166194976 / METERS_PER_INCH, //EPSG:9039 + GunterLink: 0.2011684023368047 / METERS_PER_INCH, //EPSG:9034 + BenoitLink: 0.20116782494375872 / METERS_PER_INCH, //EPSG:9063 + SearsLink: 0.2011676512155 / METERS_PER_INCH, //EPSG:9043 + Rod: 5.02921005842012 / METERS_PER_INCH, + IntnlChain: 20.1168 / METERS_PER_INCH, //EPSG:9097 + IntnlLink: 0.201168 / METERS_PER_INCH, //EPSG:9098 + Perch: 5.02921005842012 / METERS_PER_INCH, + Pole: 5.02921005842012 / METERS_PER_INCH, + Furlong: 201.1684023368046 / METERS_PER_INCH, + Rood: 3.778266898 / METERS_PER_INCH, + CapeFoot: 0.3047972615 / METERS_PER_INCH, + Brealey: 375.0 / METERS_PER_INCH, + ModAmFt: 0.304812252984505969011938 / METERS_PER_INCH, + Fathom: 1.8288 / METERS_PER_INCH, + 'NautM-UK': 1853.184 / METERS_PER_INCH, + '50kilometers': 50000.0 / METERS_PER_INCH, + '150kilometers': 150000.0 / METERS_PER_INCH +}); + +//unit abbreviations supported by PROJ.4 +Util.extend(INCHES_PER_UNIT, { + mm: INCHES_PER_UNIT['Meter'] / 1000.0, + cm: INCHES_PER_UNIT['Meter'] / 100.0, + dm: INCHES_PER_UNIT['Meter'] * 100.0, + km: INCHES_PER_UNIT['Meter'] * 1000.0, + kmi: INCHES_PER_UNIT['nmi'], //International Nautical Mile + fath: INCHES_PER_UNIT['Fathom'], //International Fathom + ch: INCHES_PER_UNIT['IntnlChain'], //International Chain + link: INCHES_PER_UNIT['IntnlLink'], //International Link + 'us-in': INCHES_PER_UNIT['inches'], //U.S. Surveyor's Inch + 'us-ft': INCHES_PER_UNIT['Foot'], //U.S. Surveyor's Foot + 'us-yd': INCHES_PER_UNIT['Yard'], //U.S. Surveyor's Yard + 'us-ch': INCHES_PER_UNIT['GunterChain'], //U.S. Surveyor's Chain + 'us-mi': INCHES_PER_UNIT['Mile'], //U.S. Surveyor's Statute Mile + 'ind-yd': INCHES_PER_UNIT['IndianYd37'], //Indian Yard + 'ind-ft': INCHES_PER_UNIT['IndianFt37'], //Indian Foot + 'ind-ch': 20.11669506 / METERS_PER_INCH //Indian Chain +}); + +//将服务端的地图单位转成SuperMap的地图单位 +INCHES_PER_UNIT['degree'] = INCHES_PER_UNIT.dd; +INCHES_PER_UNIT['meter'] = INCHES_PER_UNIT.m; +INCHES_PER_UNIT['foot'] = INCHES_PER_UNIT.ft; +INCHES_PER_UNIT['inch'] = INCHES_PER_UNIT.inches; +INCHES_PER_UNIT['mile'] = INCHES_PER_UNIT.mi; +INCHES_PER_UNIT['kilometer'] = INCHES_PER_UNIT.km; +INCHES_PER_UNIT['yard'] = INCHES_PER_UNIT.yd; + +function paramToString(param) { + if (param == undefined || param == null) { + return ''; + } + if (param instanceof Date) { + return param.toJSON(); + } + if (canBeJsonified(param)) { + return JSON.stringify(param); + } + + return param.toString(); +} + +function canBeJsonified(str) { + if (typeof str !== 'string' && typeof str !== 'object') { + return false; + } + try { + const type = str.toString(); + return type === '[object Object]' || type === '[object Array]'; + } catch (err) { + return false; + } +} + + + +;// CONCATENATED MODULE: ./src/common/commontypes/LonLat.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LonLat + * @category BaseTypes Geometry + * @classdesc 这个类用来表示经度和纬度对。 + * @param {number|Array.} [lon=0.0] - 地图单位上的 X 轴坐标或者横纵坐标组成的数组;如果地图是地理投影,则此值是经度,否则,此值是地图地理位置的 x 坐标。 + * @param {number} [lat=0.0] - 地图单位上的 Y 轴坐标,如果地图是地理投影,则此值是纬度,否则,此值是地图地理位置的 y 坐标。 + * @example + * var lonLat = new LonLat(30,45); + * @usage + */ +class LonLat { + + + constructor(lon, lat) { + if (Util.isArray(lon)) { + lat = lon[1]; + lon = lon[0]; + } + /** + * @member {number} [LonLat.prototype.lon=0.0] + * @description 地图的单位的 X 轴(横轴)坐标。 + */ + this.lon = lon ? Util.toFloat(lon) : 0.0; + + /** + * @member {number} [LonLat.prototype.lat=0.0] + * @description 地图的单位的 Y 轴(纵轴)坐标。 + */ + this.lat = lat ? Util.toFloat(lat) : 0.0; + this.CLASS_NAME = "SuperMap.LonLat"; + } + + /** + * @function LonLat.prototype.toString + * @description 返回此对象的字符串形式 + * @example + * var lonLat = new LonLat(100,50); + * var str = lonLat.toString(); + * @returns {string} 例如: "lon=100,lat=50" + */ + toString() { + return ("lon=" + this.lon + ",lat=" + this.lat); + } + + /** + * @function LonLat.prototype.toShortString + * @description 将经度纬度转换成简单字符串。 + * @example + * var lonLat = new LonLat(100,50); + * var str = lonLat.toShortString(); + * @returns {string} 处理后的经纬度字符串。例如:"100,50" + */ + toShortString() { + return (this.lon + "," + this.lat); + } + + /** + * @function LonLat.prototype.clone + * @description 复制坐标对象,并返回复制后的新对象。 + * @example + * var lonLat1 = new LonLat(100,50); + * var lonLat2 = lonLat1.clone(); + * @returns {LonLat} 相同坐标值的新的坐标对象。 + */ + clone() { + return new LonLat(this.lon, this.lat); + } + + /** + * @function LonLat.prototype.add + * @description 在已有坐标对象的经纬度基础上加上新的坐标经纬度,并返回新的坐标对象。 + * @example + * var lonLat1 = new LonLat(100,50); + * //lonLat2 是新的对象 + * var lonLat2 = lonLat1.add(100,50); + * @param {number} lon - 经度参数。 + * @param {number} lat - 纬度参数。 + * @returns {LonLat} 新的 LonLat 对象,此对象的经纬度是由传入的经纬度与当前的经纬度相加所得。 + */ + add(lon, lat) { + if ((lon == null) || (lat == null)) { + throw new TypeError('LonLat.add cannot receive null values'); + } + return new LonLat(this.lon + Util.toFloat(lon), + this.lat + Util.toFloat(lat)); + } + + /** + * @function LonLat.prototype.equals + * @description 判断两个坐标对象是否相等。 + * @example + * var lonLat1 = new LonLat(100,50); + * var lonLat2 = new LonLat(100,50); + * var isEquals = lonLat1.equals(lonLat2); + * @param {LonLat} ll - 需要进行比较的坐标对象。 + * @returns {boolean} 如果LonLat对象的经纬度和传入的经纬度一致则返回true,不一 + * 致或传入的ll参数为NULL则返回false。 + */ + equals(ll) { + var equals = false; + if (ll != null) { + equals = ((this.lon === ll.lon && this.lat === ll.lat) || + (isNaN(this.lon) && isNaN(this.lat) && isNaN(ll.lon) && isNaN(ll.lat))); + } + return equals; + } + + /** + * @function LonLat.prototype.wrapDateLine + * @description 通过传入的范围对象对坐标对象转换到该范围内。 + * 如果经度小于给定范围最小精度,则在原经度基础上加上范围宽度,直到精度在范围内为止,如果经度大于给定范围则在原经度基础上减去范围宽度。 + * 即指将不在经度范围内的坐标转换到范围以内(只会转换 lon,不会转换 lat,主要用于转移到日界线以内)。 + * @example + * var lonLat1 = new LonLat(420,50); + * var lonLat2 = lonLat1.wrapDateLine( + * new Bounds(-180,-90,180,90) + * ); + * @param {Bounds} maxExtent - 最大边界的范围。 + * @returns {LonLat} 将坐标转换到范围对象以内,并返回新的坐标。 + */ + wrapDateLine(maxExtent) { + + var newLonLat = this.clone(); + + if (maxExtent) { + //shift right? + while (newLonLat.lon < maxExtent.left) { + newLonLat.lon += maxExtent.getWidth(); + } + + //shift left? + while (newLonLat.lon > maxExtent.right) { + newLonLat.lon -= maxExtent.getWidth(); + } + } + + return newLonLat; + } + + /** + * + * @function LonLat.prototype.destroy + * @description 销毁此对象。 + * 销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var lonLat = new LonLat(100,50); + * lonLat.destroy(); + */ + destroy() { + this.lon = null; + this.lat = null; + } + + /** + * @function LonLat.fromString + * @description 通过字符串生成一个 {@link LonLat} 对象。 + * @example + * var str = "100,50"; + * var lonLat = LonLat.fromString(str); + * @param {string} str - 字符串的格式:Lon+","+Lat。如:"100,50"。 + * @returns {LonLat} {@link LonLat} 对象。 + */ + static fromString(str) { + var pair = str.split(","); + return new LonLat(pair[0], pair[1]); + } + + /** + * @function LonLat.fromArray + * @description 通过数组生成一个 {@link LonLat} 对象。 + * @param {Array.} arr - 数组的格式,长度只能为2,:[Lon,Lat]。如:[5,-42]。 + * @returns {LonLat} {@link LonLat} 对象。 + */ + static fromArray(arr) { + var gotArr = Util.isArray(arr), + lon = gotArr && arr[0], + lat = gotArr && arr[1]; + return new LonLat(lon, lat); + } + + +} + + +;// CONCATENATED MODULE: ./src/common/commontypes/Bounds.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class Bounds + * @deprecatedclass SuperMap.Bounds + * @category BaseTypes Geometry + * @classdesc 表示边界类实例。使用 bounds 之前需要设置 left,bottom,right,top 四个属性,这些属性的初始值为 null。 + * @param {number|Array.} [left] - 如果是number,则表示左边界,注意考虑宽度,理论上小于 right 值。如果是数组,则表示 [left, bottom, right, top] 左下右上组成的数组。 + * @param {number} [bottom] - 下边界。考虑高度,理论上小于 top 值。 + * @param {number} [right] - 右边界。 + * @param {number} [top] - 上边界。 + * @example + * var bounds = new Bounds(); + * bounds.extend(new LonLat(4,5)); + * bounds.extend(new LonLat(5,6)); + * bounds.toBBOX(); // returns 4,5,5,6 + * @usage + */ +class Bounds { + + + constructor(left, bottom, right, top) { + if (Util.isArray(left)) { + top = left[3]; + right = left[2]; + bottom = left[1]; + left = left[0]; + } + /** + * @member {number} Bounds.prototype.left + * @description 最小的水平坐标系。 + */ + this.left = left != null ? Util.toFloat(left) : this.left; + + /** + * @member {number} Bounds.prototype.bottom + * @description 最小的垂直坐标系。 + */ + this.bottom = bottom != null ? Util.toFloat(bottom) : this.bottom; + + /** + * @member {number} Bounds.prototype.right + * @description 最大的水平坐标系。 + */ + this.right = right != null ? Util.toFloat(right) : this.right; + + /** + * @member {number} Bounds.prototype.top + * @description 最大的垂直坐标系。 + */ + this.top = top != null ? Util.toFloat(top) : this.top; + + /** + * @member {LonLat} Bounds.prototype.centerLonLat + * @description bounds 的地图空间的中心点。用 getCenterLonLat() 获得。 + */ + this.centerLonLat = null; + this.CLASS_NAME = "SuperMap.Bounds"; + } + + /** + * @function Bounds.prototype.clone + * @description 复制当前 bounds 对象。 + * @example + * var bounds1 = new Bounds(-180,-90,180,90); + * var bounds2 = bounds1.clone(); + * @returns {Bounds} 克隆后的 bounds。 + */ + clone() { + return new Bounds(this.left, this.bottom, + this.right, this.top); + } + + /** + * @function Bounds.prototype.equals + * @description 判断两个 bounds 对象是否相等。 + * @example + * var bounds1 = new Bounds(-180,-90,180,90); + * var bounds2 = new Bounds(-180,-90,180,90); + * var isEquals = bounds1.equals(bounds2); + * @param {Bounds} bounds - 需要进行计较的 bounds。 + * @returns {boolean} 如果 bounds 对象的边和传入的 bounds 一致则返回 true,不一致或传入的 bounds 参数为 NULL 则返回 false。 + */ + equals(bounds) { + var equals = false; + if (bounds != null) { + equals = ((this.left === bounds.left) && + (this.right === bounds.right) && + (this.top === bounds.top) && + (this.bottom === bounds.bottom)); + } + return equals; + } + + /** + * @function Bounds.prototype.toString + * @description 返回此对象的字符串形式。 + * @example + * var bounds = new Bounds(-180,-90,180,90); + * var str = bounds.toString(); + * @returns {string} 边界对象的字符串表示形式(left,bottom,right,top),例如: "-180,-90,180,90"。 + */ + toString() { + return [this.left, this.bottom, this.right, this.top].join(","); + } + + /** + * @function Bounds.prototype.toArray + * @description 边界对象的数组表示形式。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //array1 = [-180,-90,100,80]; + * var array1 = bounds.toArray(); + * //array1 = [-90,-180,80,100]; + * var array2 = bounds.toArray(true); + * @param {boolean} [reverseAxisOrder=false] - 是否反转轴顺序。 + * 如果设为 true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Array.} left, bottom, right, top 数组。 + */ + toArray(reverseAxisOrder) { + if (reverseAxisOrder === true) { + return [this.bottom, this.left, this.top, this.right]; + } else { + return [this.left, this.bottom, this.right, this.top]; + } + } + + /** + * @function Bounds.prototype.toBBOX + * @description 取小数点后 decimal 位数字进行四舍五入再转换为 BBOX 字符串。 + * @example + * var bounds = new Bounds(-1.1234567,-1.7654321,1.4444444,1.5555555); + * //str1 = "-1.123457,-1.765432,1.444444,1.555556"; + * var str1 = bounds.toBBOX(); + * //str2 = "-1.1,-1.8,1.4,1.6"; + * var str2 = bounds.toBBOX(1); + * //str2 = "-1.8,-1.1,1.6,1.4"; + * var str2 = bounds.toBBOX(1,true); + * @param {number} [decimal=6] - 边界方位坐标的有效数字个数。 + * @param {boolean} [reverseAxisOrder=false] - 是否是反转轴顺序。 + * 如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {string} 边界对象的字符串表示形式,如:"5,42,10,45"。 + */ + toBBOX(decimal, reverseAxisOrder) { + if (decimal == null) { + decimal = 6; + } + var mult = Math.pow(10, decimal); + var xmin = Math.round(this.left * mult) / mult; + var ymin = Math.round(this.bottom * mult) / mult; + var xmax = Math.round(this.right * mult) / mult; + var ymax = Math.round(this.top * mult) / mult; + if (reverseAxisOrder === true) { + return ymin + "," + xmin + "," + ymax + "," + xmax; + } else { + return xmin + "," + ymin + "," + xmax + "," + ymax; + } + } + + ///** + // * @function Bounds.prototype.toGeometry + // * @description 基于当前边界范围创建一个新的多边形对象。 + // * @example + // * var bounds = new Bounds(-180,-90,100,80); + // * // Polygon对象 + // * var geo = bounds.toGeometry(); + // * @returns {GeometryPolygon} 基于当前 bounds 坐标创建的新的多边形。 + // */ + // toGeometry() { + // return new Polygon([ + // new LinearRing([ + // new Point(this.left, this.bottom), + // new Point(this.right, this.bottom), + // new Point(this.right, this.top), + // new Point(this.left, this.top) + // ]) + // ]); + // } + + /** + * @function Bounds.prototype.getWidth + * @description 获取 bounds 的宽度。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //width = 280; + * var width = bounds.getWidth(); + * @returns {number} 获取当前 bounds 的宽度(right 减去 left)。 + */ + getWidth() { + return (this.right - this.left); + } + + /** + * @function Bounds.prototype.getHeight + * @description 获取 bounds 的高度。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //height = 170; + * var height = bounds.getHeight(); + * @returns {number} 边界高度(top 减去 bottom)。 + */ + getHeight() { + return (this.top - this.bottom); + } + + /** + * @function Bounds.prototype.getSize + * @description 获取边框大小。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var size = bounds.getSize(); + * @returns {Size} 边框大小。 + */ + getSize() { + return new Size(this.getWidth(), this.getHeight()); + } + + /** + * @function Bounds.prototype.getCenterPixel + * @description 获取像素格式的范围中心点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var pixel = bounds.getCenterPixel(); + * @returns {Pixel} 像素格式的当前范围的中心点。 + */ + getCenterPixel() { + return new Pixel((this.left + this.right) / 2, + (this.bottom + this.top) / 2); + } + + /** + * @function Bounds.prototype.getCenterLonLat + * @description 获取地理格式的范围中心点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var lonlat = bounds.getCenterLonLat(); + * @returns {LonLat} 当前地理范围的中心点。 + */ + getCenterLonLat() { + if (!this.centerLonLat) { + this.centerLonLat = new LonLat( + (this.left + this.right) / 2, (this.bottom + this.top) / 2 + ); + } + return this.centerLonLat; + } + + /** + * @function Bounds.prototype.scale + * @description 按照比例扩大/缩小出一个新的 bounds。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * var bounds2 = bounds.scale(2); + * @param {number} [ratio=1] - 需要扩大的比例。 + * @param {(Pixel|LonLat)} [origin] - 扩大时的基准点,默认为当前 bounds 的中心点。 + * @returns {Bounds} 通过 ratio、origin 计算得到的新的边界范围。 + */ + scale(ratio, origin) { + ratio = ratio ? ratio : 1; + if (origin == null) { + origin = this.getCenterLonLat(); + } + + var origx, origy; + + // get origin coordinates + if (origin.CLASS_NAME === "SuperMap.LonLat") { + origx = origin.lon; + origy = origin.lat; + } else { + origx = origin.x; + origy = origin.y; + } + + var left = (this.left - origx) * ratio + origx; + var bottom = (this.bottom - origy) * ratio + origy; + var right = (this.right - origx) * ratio + origx; + var top = (this.top - origy) * ratio + origy; + + return new Bounds(left, bottom, right, top); + } + + /** + * @function Bounds.prototype.add + * @description 在当前的 Bounds 上按照传入的坐标点进行平移,返回新的范围。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //bounds2 是新的 bounds + * var bounds2 = bounds.add(20,10); + * @param {number} x - 坐标点的 x 坐标。 + * @param {number} y - 坐标点的 y 坐标。 + * @returns {Bounds} 新的 bounds,此 bounds 的坐标是由传入的 x,y 参数与当前 bounds 坐标计算所得。 + */ + add(x, y) { + if ((x == null) || (y == null)) { + throw new TypeError('Bounds.add cannot receive null values'); + } + return new Bounds(this.left + x, this.bottom + y, + this.right + x, this.top + y); + } + + /** + * @function Bounds.prototype.extend + * @description 在当前 bounds 上扩展 bounds,支持 point,lanlat 和 bounds。扩展后的 bounds 的范围是两者的结合。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //bounds 改变 + * bounds.extend(new LonLat(50,60)); + * @param {GeometryPoint|LonLat|Bounds} object - 可以是 point、lonlat 和 bounds。 + */ + extend(object) { + var bounds = null; + if (object) { + // clear cached center location + switch (object.CLASS_NAME) { + case "SuperMap.LonLat": + bounds = new Bounds(object.lon, object.lat, + object.lon, object.lat); + break; + case "SuperMap.Geometry.Point": + bounds = new Bounds(object.x, object.y, + object.x, object.y); + break; + + case "SuperMap.Bounds": + bounds = object; + break; + } + + if (bounds) { + this.centerLonLat = null; + if ((this.left == null) || (bounds.left < this.left)) { + this.left = bounds.left; + } + if ((this.bottom == null) || (bounds.bottom < this.bottom)) { + this.bottom = bounds.bottom; + } + if ((this.right == null) || (bounds.right > this.right)) { + this.right = bounds.right; + } + if ((this.top == null) || (bounds.top > this.top)) { + this.top = bounds.top; + } + } + } + } + + /** + * @function Bounds.prototype.containsLonLat + * @description 判断传入的坐标是否在范围内。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //isContains1 = true + * //这里的第二个参数可以直接为 boolean 类型,也就是inclusive + * var isContains1 = bounds.containsLonLat(new LonLat(40,40),true); + * + * //(40,40)在范围内,同样(40+360,40)也在范围内 + * var bounds2 = new Bounds(-50,-50,40,40); + * //isContains2 = true; + * var isContains2 = bounds2.containsLonLat( + * new LonLat(400,40), + * { + * inclusive:true, + * //全球的范围 + * worldBounds: new Bounds(-180,-90,180,90) + * } + * ); + * @param {(LonLat|Object)} ll - 对象或者是一个包含 'lon' 与 'lat' 属性的对象。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.inclusive=true] - 是否包含边界。 + * @param {Bounds} [options.worldBounds] - 如果提供 worldBounds 参数, 如果 ll 参数提供的坐标超出了世界边界(worldBounds), + * 但是通过日界线的转化可以被包含, 它将被认为是包含在该范围内的。 + * @returns {boolean} 传入坐标是否包含在范围内。 + */ + containsLonLat(ll, options) { + if (typeof options === "boolean") { + options = {inclusive: options}; + } + options = options || {}; + var contains = this.contains(ll.lon, ll.lat, options.inclusive), + worldBounds = options.worldBounds; + //日界线以外的也有可能算包含, + if (worldBounds && !contains) { + var worldWidth = worldBounds.getWidth(); + var worldCenterX = (worldBounds.left + worldBounds.right) / 2; + //这一步很关键 + var worldsAway = Math.round((ll.lon - worldCenterX) / worldWidth); + contains = this.containsLonLat({ + lon: ll.lon - worldsAway * worldWidth, + lat: ll.lat + }, {inclusive: options.inclusive}); + } + return contains; + } + + /** + * @function Bounds.prototype.containsPixel + * @description 判断传入的像素是否在范围内。直接匹配大小,不涉及像素和地理转换。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * //isContains = true + * var isContains = bounds.containsPixel(new Pixel(40,40),true); + * @param {Pixel} px - 提供的像素参数。 + * @param {boolean} [inclusive=true] - 是否包含边界。 + * @returns {boolean} 传入的 pixel 在当前边界范围之内。 + */ + containsPixel(px, inclusive) { + return this.contains(px.x, px.y, inclusive); + } + + /** + * @function Bounds.prototype.contains + * @description 判断传入的 x,y 坐标值是否在范围内。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * //isContains = true + * var isContains = bounds.contains(40,40,true); + * @param {number} x - x 坐标值。 + * @param {number} y - y 坐标值。 + * @param {boolean} [inclusive=true] - 是否包含边界。 + * @returns {boolean} 传入的 x,y 坐标是否在当前范围内。 + */ + contains(x, y, inclusive) { + //set default + if (inclusive == null) { + inclusive = true; + } + + if (x == null || y == null) { + return false; + } + + //x = Util.toFloat(x); + //y = Util.toFloat(y); + + var contains = false; + if (inclusive) { + contains = ((x >= this.left) && (x <= this.right) && + (y >= this.bottom) && (y <= this.top)); + } else { + contains = ((x > this.left) && (x < this.right) && + (y > this.bottom) && (y < this.top)); + } + return contains; + } + + /** + * @function Bounds.prototype.intersectsBounds + * @description 判断目标边界范围是否与当前边界范围相交。如果两个边界范围中的任意 + * 边缘相交或者一个边界包含了另外一个就认为这两个边界相交。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var isIntersects = bounds.intersectsBounds( + * new Bounds(-170,-90,120,80) + * ); + * @param {Bounds} bounds - 目标边界。 + * @param {Object} options - 参数。 + * @param {boolean} [options.inclusive=true] - 边缘重合也看成相交。如果是false, + * 两个边界范围没有重叠部分仅仅是在边缘相接(重合), + * 这种情况被认为没有相交。 + * @param {Bounds} [options.worldBounds] - 提供了 worldBounds 参数, 如果他们相交时 + * 是在全球范围内, 两个边界将被视为相交。这仅适用于交叉或完全不在世界范围的边界。 + * @returns {boolean} 传入的 bounds 对象与当前 bounds 相交。 + */ + intersectsBounds(bounds, options) { + if (typeof options === "boolean") { + options = {inclusive: options}; + } + options = options || {}; + if (options.worldBounds) { + var self = this.wrapDateLine(options.worldBounds); + bounds = bounds.wrapDateLine(options.worldBounds); + } else { + self = this; + } + if (options.inclusive == null) { + options.inclusive = true; + } + var intersects = false; + var mightTouch = ( + self.left === bounds.right || + self.right === bounds.left || + self.top === bounds.bottom || + self.bottom === bounds.top + ); + + // if the two bounds only touch at an edge, and inclusive is false, + // then the bounds don't *really* intersect. + if (options.inclusive || !mightTouch) { + // otherwise, if one of the boundaries even partially contains another, + // inclusive of the edges, then they do intersect. + var inBottom = ( + ((bounds.bottom >= self.bottom) && (bounds.bottom <= self.top)) || + ((self.bottom >= bounds.bottom) && (self.bottom <= bounds.top)) + ); + var inTop = ( + ((bounds.top >= self.bottom) && (bounds.top <= self.top)) || + ((self.top > bounds.bottom) && (self.top < bounds.top)) + ); + var inLeft = ( + ((bounds.left >= self.left) && (bounds.left <= self.right)) || + ((self.left >= bounds.left) && (self.left <= bounds.right)) + ); + var inRight = ( + ((bounds.right >= self.left) && (bounds.right <= self.right)) || + ((self.right >= bounds.left) && (self.right <= bounds.right)) + ); + intersects = ((inBottom || inTop) && (inLeft || inRight)); + } + // document me + if (options.worldBounds && !intersects) { + var world = options.worldBounds; + var width = world.getWidth(); + var selfCrosses = !world.containsBounds(self); + var boundsCrosses = !world.containsBounds(bounds); + if (selfCrosses && !boundsCrosses) { + bounds = bounds.add(-width, 0); + intersects = self.intersectsBounds(bounds, {inclusive: options.inclusive}); + } else if (boundsCrosses && !selfCrosses) { + self = self.add(-width, 0); + intersects = bounds.intersectsBounds(self, {inclusive: options.inclusive}); + } + } + return intersects; + } + + /** + * @function Bounds.prototype.containsBounds + * @description 判断目标边界是否被当前边界包含在内。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var isContains = bounds.containsBounds( + * new Bounds(-170,-90,100,80),true,true + * ); + * @param {Bounds} bounds - 目标边界。 + * @param {boolean} [partial=false] - 目标边界的任意部分都包含在当前边界中则被认为是包含关系。 + * 如果设为 false,整个目标边界全部被包含在当前边界范围内。 + * @param {boolean} [inclusive=true] - 边缘共享是否被视为包含。 + * @returns {boolean} 传入的边界是否被当前边界包含。 + */ + containsBounds(bounds, partial, inclusive) { + if (partial == null) { + partial = false; + } + if (inclusive == null) { + inclusive = true; + } + var bottomLeft = this.contains(bounds.left, bounds.bottom, inclusive); + var bottomRight = this.contains(bounds.right, bounds.bottom, inclusive); + var topLeft = this.contains(bounds.left, bounds.top, inclusive); + var topRight = this.contains(bounds.right, bounds.top, inclusive); + + return (partial) ? (bottomLeft || bottomRight || topLeft || topRight) + : (bottomLeft && bottomRight && topLeft && topRight); + } + + /** + * @function Bounds.prototype.determineQuadrant + * @description 判断传入坐标是否在 bounds 范围内的象限。以 bounds 中心点为坐标原点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //str = "tr"; + * var str = bounds.determineQuadrant( + * new LonLat(20,20) + * ); + * @param {LonLat} lonlat - 传入的坐标对象。 + * @returns {string} 传入坐标所在的象限("br" "tr" "tl" "bl" 分别对应"右下","右上","左上" "左下")。 + */ + determineQuadrant(lonlat) { + + var quadrant = ""; + var center = this.getCenterLonLat(); + + quadrant += (lonlat.lat < center.lat) ? "b" : "t"; + quadrant += (lonlat.lon < center.lon) ? "l" : "r"; + + return quadrant; + } + + /** + * @function Bounds.prototype.wrapDateLine + * @description 将当前 bounds 移动到最大边界范围内部(所谓的内部是相交或者内部)。 + * @example + * var bounds = new Bounds(380,-40,400,-20); + * var maxExtent = new Bounds(-180,-90,100,80); + * //新的bounds + * var newBounds = bounds.wrapDateLine(maxExtent); + * @param {Bounds} maxExtent - 最大的边界范围(一般是全球范围)。 + * @param {Object} options - 可选选项参数。 + * @param {number} [options.leftTolerance=0] - left 允许的误差。 + * @param {number} [options.rightTolerance=0] - right 允许的误差。 + * @returns {Bounds} 克隆当前边界。如果当前边界完全在最大范围之外此函数则返回一个不同值的边界, + * 若落在最大边界的左边,则给当前的bounds值加上最大范围的宽度,即向右移动, + * 若落在右边,则向左移动,即给当前的bounds值加上负的最大范围的宽度。 + */ + wrapDateLine(maxExtent, options) { + options = options || {}; + + var leftTolerance = options.leftTolerance || 0; + var rightTolerance = options.rightTolerance || 0; + + var newBounds = this.clone(); + + if (maxExtent) { + var width = maxExtent.getWidth(); + //如果 newBounds 在 maxExtent 的左边,那么一直向右移动,直到相交或者包含为止,每次移动width + //shift right? + while (newBounds.left < maxExtent.left && + newBounds.right - rightTolerance <= maxExtent.left) { + newBounds = newBounds.add(width, 0); + } + //如果 newBounds 在 maxExtent 的右边,那么一直向左移动,直到相交或者包含为止,每次移动width + //shift left? + while (newBounds.left + leftTolerance >= maxExtent.right && + newBounds.right > maxExtent.right) { + newBounds = newBounds.add(-width, 0); + } + //如果和右边相交,左边又在内部,那么再次向左边移动一次 + // crosses right only? force left + var newLeft = newBounds.left + leftTolerance; + if (newLeft < maxExtent.right && newLeft > maxExtent.left && + newBounds.right - rightTolerance > maxExtent.right) { + newBounds = newBounds.add(-width, 0); + } + } + + return newBounds; + } + + /** + * @function Bounds.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var obj = bounds.toServerJSONObject(); + * @returns {Object} JSON 格式的 Object 对象。 + */ + toServerJSONObject() { + var jsonObject = { + rightTop: {x: this.right, y: this.top}, + leftBottom: {x: this.left, y: this.bottom}, + left: this.left, + right: this.right, + top: this.top, + bottom: this.bottom + } + return jsonObject; + } + + /** + * + * @function Bounds.prototype.destroy + * @description 销毁此对象。 + * 销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * bounds.destroy(); + */ + destroy() { + this.left = null; + this.right = null; + this.top = null; + this.bottom = null; + this.centerLonLat = null; + } + + /** + * @function Bounds.fromString + * @description 通过字符串参数创建新的 bounds 的构造函数。 + * @example + * var bounds = Bounds.fromString("-180,-90,100,80"); + * @param {string} str - 边界字符串,用逗号隔开(e.g. "5,42,10,45")。 + * @param {boolean} [reverseAxisOrder=false] - 是否反转轴顺序。 + * 如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Bounds} 给定的字符串创建的新的边界对象。 + */ + static fromString(str, reverseAxisOrder) { + var bounds = str.split(","); + return Bounds.fromArray(bounds, reverseAxisOrder); + } + + /** + * @function Bounds.fromArray + * @description 通过边界框数组创建 Bounds。 + * @example + * var bounds = Bounds.fromArray([-180,-90,100,80]); + * @param {Array.} bbox - 边界值数组。(e.g. [5,42,10,45])。 + * @param {boolean} [reverseAxisOrder=false] - 是否是反转轴顺序。如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Bounds} 根据传入的数组创建的新的边界对象。 + */ + static fromArray(bbox, reverseAxisOrder) { + return reverseAxisOrder === true ? + new Bounds(bbox[1], bbox[0], bbox[3], bbox[2]) : + new Bounds(bbox[0], bbox[1], bbox[2], bbox[3]); + } + + /** + * @function Bounds.fromSize + * @description 通过传入的边界大小来创建新的边界。 + * @example + * var bounds = Bounds.fromSize(new Size(20,10)); + * @param {Size} size - 边界大小。 + * @returns {Bounds} 根据传入的边界大小的创建新的边界。 + */ + static fromSize(size) { + return new Bounds(0, + size.h, + size.w, + 0); + } + + /** + * @function Bounds.oppositeQuadrant + * @description 反转象限。"t"和"b" 交换,"r"和"l"交换, 如:"tl"变为"br"。 + * @param {string} quadrant - 代表象限的字符串,如:"tl"。 + * @returns {string} 反转后的象限。 + */ + static oppositeQuadrant(quadrant) { + var opp = ""; + + opp += (quadrant.charAt(0) === 't') ? 'b' : 't'; + opp += (quadrant.charAt(1) === 'l') ? 'r' : 'l'; + + return opp; + } + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Collection.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryCollection + * @aliasclass Geometry.Collection + * @deprecatedclass SuperMap.Geometry.Collection + * @classdesc 几何对象集合类,存储在本地的 components 属性中(可作为参数传递给构造函数)。
+ * 随着新的几何图形添加到集合中,将不能被克隆,当移动几何图形时,需要指定参照物。
+ * getArea 和 getLength 函数只能通过遍历存储几何对象的 components 数组,总计所有几何图形的面积和长度。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {Array.} components - 几何对象数组。 + * @example + * var point1 = new GeometryPoint(10,20); + * var point2 = new GeometryPoint(30,40); + * var col = new GeometryCollection([point1,point2]); + * @usage + */ +class Collection extends Geometry { + + + constructor(components) { + super(); + + /** + * @description 存储几何对象的数组。 + * @member {Array.} GeometryCollection.prototype.components + */ + this.components = []; + + /** + * @member {Array.} GeometryCollection.prototype.componentTypes + * @description components 存储的的几何对象所支持的几何类型数组,为空表示类型不受限制。 + */ + this.componentTypes = null; + if (components != null) { + this.addComponents(components); + } + this.CLASS_NAME = "SuperMap.Geometry.Collection"; + this.geometryType = "Collection"; + } + + /** + * @function GeometryCollection.prototype.destroy + * @description 销毁几何图形。 + */ + destroy() { + this.components.length = 0; + this.components = null; + super.destroy(); + } + + /** + * @function GeometryCollection.prototype.clone + * @description 克隆当前几何对象。 + * @returns {GeometryCollection} 克隆的几何对象集合。 + */ + clone() { + var geometry = new Collection(); + for (var i = 0, len = this.components.length; i < len; i++) { + geometry.addComponent(this.components[i].clone()); + } + + // catch any randomly tagged-on properties + Util.applyDefaults(geometry, this); + + return geometry; + } + + /** + * @function GeometryCollection.prototype.getComponentsString + * @description 获取 components 字符串。 + * @returns {string} components 字符串。 + */ + getComponentsString() { + var strings = []; + for (var i = 0, len = this.components.length; i < len; i++) { + strings.push(this.components[i].toShortString()); + } + return strings.join(","); + } + + /** + * @function GeometryCollection.prototype.calculateBounds + * @description 通过遍历数组重新计算边界,在遍历每一子项中时调用 extend 方法。 + */ + calculateBounds() { + this.bounds = null; + var bounds = new Bounds(); + var components = this.components; + if (components) { + for (var i = 0, len = components.length; i < len; i++) { + bounds.extend(components[i].getBounds()); + } + } + // to preserve old behavior, we only set bounds if non-null + // in the future, we could add bounds.isEmpty() + if (bounds.left != null && bounds.bottom != null && + bounds.right != null && bounds.top != null) { + this.setBounds(bounds); + } + } + + /** + * @function GeometryCollection.prototype.addComponents + * @description 给几何图形对象添加元素。 + * @param {Array.} components - 几何对象组件。 + * @example + * var geometryCollection = new GeometryCollection(); + * geometryCollection.addComponents(new SuerpMap.Geometry.Point(10,10)); + */ + addComponents(components) { + if (!(Util.isArray(components))) { + components = [components]; + } + for (var i = 0, len = components.length; i < len; i++) { + this.addComponent(components[i]); + } + } + + /** + * @function GeometryCollection.prototype.addComponent + * @description 添加几何对象到集合中。如果设置了 componentTypes 类型,则添加的几何对象必须是 componentTypes 中的类型。 + * @param {Geometry} component - 待添加的几何对象。 + * @param {number} [index] - 几何对象插入的位置。 + * @returns {boolean} 是否添加成功。 + */ + addComponent(component, index) { + var added = false; + if (component) { + if (this.componentTypes == null || + (Util.indexOf(this.componentTypes, + component.CLASS_NAME) > -1)) { + + if (index != null && (index < this.components.length)) { + var components1 = this.components.slice(0, index); + var components2 = this.components.slice(index, + this.components.length); + components1.push(component); + this.components = components1.concat(components2); + } else { + this.components.push(component); + } + component.parent = this; + this.clearBounds(); + added = true; + } + } + return added; + } + + /** + * @function GeometryCollection.prototype.removeComponents + * @description 清除几何对象。 + * @param {Array.} components - 需要清除的几何对象。 + * @returns {boolean} 元素是否被删除。 + */ + removeComponents(components) { + var removed = false; + + if (!(Util.isArray(components))) { + components = [components]; + } + for (var i = components.length - 1; i >= 0; --i) { + removed = this.removeComponent(components[i]) || removed; + } + return removed; + } + + /** + * @function GeometryCollection.prototype.removeComponent + * @description 从集合中移除几何对象。 + * @param {Geometry} component - 要移除的几何对象。 + * @returns {boolean} 几何对象是否移除成功。 + */ + removeComponent(component) { + Util.removeItem(this.components, component); + + // clearBounds() so that it gets recalculated on the next call + // to this.getBounds(); + this.clearBounds(); + return true; + } + + /** + * @function GeometryCollection.prototype.getArea + * @description 计算几何对象的面积。注意,这个方法在 {@link GeometryPolygon} 类中需要重写。 + * @returns {number} 几何图形的面积,是几何对象中所有组成部分的面积之和。 + */ + getArea() { + var area = 0.0; + for (var i = 0, len = this.components.length; i < len; i++) { + area += this.components[i].getArea(); + } + return area; + } + + /** + * @function GeometryCollection.prototype.equals + * @description 判断两个几何图形是否相等。如果所有的 components 具有相同的坐标,则认为是相等的。 + * @param {Geometry} geometry - 需要判断的几何图形。 + * @returns {boolean} 输入的几何图形与当前几何图形是否相等。 + */ + equals(geometry) { + var equivalent = true; + if (!geometry || !geometry.CLASS_NAME || + (this.CLASS_NAME !== geometry.CLASS_NAME)) { + equivalent = false; + } else if (!(Util.isArray(geometry.components)) || + (geometry.components.length !== this.components.length)) { + equivalent = false; + } else { + for (var i = 0, len = this.components.length; i < len; ++i) { + if (!this.components[i].equals(geometry.components[i])) { + equivalent = false; + break; + } + } + } + return equivalent; + } + + + /** + * @function GeometryCollection.prototype.getVertices + * @description 返回几何对象的所有结点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false,则返回非端点的顶点如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何对象的顶点列表。 + */ + getVertices(nodes) { + var vertices = []; + for (var i = 0, len = this.components.length; i < len; ++i) { + Array.prototype.push.apply( + vertices, this.components[i].getVertices(nodes) + ); + } + return vertices; + } + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiPoint.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryMultiPoint + * @aliasclass Geometry.MultiPoint + * @deprecatedclass SuperMap.Geometry.MultiPoint + * @classdesc 几何对象多点类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 点对象数组。 + * @example + * var point1 = new GeometryPoint(5,6); + * var poine2 = new GeometryMultiPoint(7,8); + * var multiPoint = new MultiPoint([point1,point2]); + * @usage + */ +class MultiPoint extends Collection { + + + constructor(components) { + super(components); + /** + * @member {Array.} [GeometryMultiPoint.prototype.componentTypes=["SuperMap.Geometry.Point"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.Point"]; + this.CLASS_NAME = "SuperMap.Geometry.MultiPoint"; + this.geometryType = "MultiPoint"; + } + + /** + * @function GeometryMultiPoint.prototype.addPoint + * @description 添加点,封装了 {@link GeometryCollection|GeometryCollection.addComponent} 方法。 + * @param {GeometryPoint} point - 添加的点。 + * @param {number} [index] - 下标。 + */ + addPoint(point, index) { + this.addComponent(point, index); + } + + + /** + * @function GeometryMultiPoint.prototype.removePoint + * @description 移除点,封装了 {@link GeometryCollection|GeometryCollection.removeComponent} 方法。 + * @param {GeometryPoint} point - 移除的点对象。 + */ + removePoint(point) { + this.removeComponent(point); + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Curve.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryCurve + * @aliasclass Geometry.Curve + * @deprecatedclass SuperMap.Geometry.Curve + * @classdesc 几何对象曲线类。 + * @category BaseTypes Geometry + * @extends GeometryMultiPoint + * @param {Array.} components - 几何对象数组。 + * @example + * var point1 = new GeometryPoint(10,20); + * var point2 = new GeometryPoint(30,40); + * var curve = new Curve([point1,point2]); + * @usage + */ +class Curve extends MultiPoint { + + constructor(components) { + super(components); + /** + * @member {Array.} [GeometryCurve.prototype.componentTypes=["SuperMap.Geometry.Point", "SuperMap.PointWithMeasure"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.Point", "SuperMap.PointWithMeasure"]; + this.CLASS_NAME = "SuperMap.Geometry.Curve"; + this.geometryType = "Curve"; + + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Point.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryPoint + * @aliasclass Geometry.Point + * @deprecatedclass SuperMap.Geometry.Point + * @classdesc 点几何对象类。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {number} x - x 坐标。 + * @param {number} y - y 坐标。 + * @param {string} [type = 'Point'] - 点的类型。 + * @param {number} [tag] - 额外的属性,比如差值分析中的 Z 值。 + * @example + * var point = new GeometryPoint(-111.04, 45.68); + * @usage + */ +class Point extends Geometry { + + + constructor(x, y, type, tag) { + super(x, y, type, tag); + /** + * @member {number} GeometryPoint.prototype.x + * @description 横坐标。 + */ + this.x = parseFloat(x); + + /** + * @member {number} GeometryPoint.prototype.y + * @description 纵坐标。 + */ + this.y = parseFloat(y); + + /** + * @member {string} GeometryPoint.prototype.tag + * @description 用来存储额外的属性,比如差值分析中的 Z 值。 + */ + this.tag = (tag || tag == 0) ? parseFloat(tag) : null; + + /** + * @member {string} GeometryPoint.prototype.type + * @description 用来存储点的类型 + */ + this.type = type || "Point"; + this.CLASS_NAME = "SuperMap.Geometry.Point"; + this.geometryType = "Point"; + } + + /** + * @function GeometryPoint.prototype.clone + * @description 克隆点对象。 + * @returns {GeometryPoint} 克隆后的点对象。 + */ + clone(obj) { + if (obj == null) { + obj = new Point(this.x, this.y); + } + + // catch any randomly tagged-on properties + Util.applyDefaults(obj, this); + + return obj; + } + + /** + * @function GeometryPoint.prototype.calculateBounds + * @description 计算点对象的范围。 + */ + calculateBounds() { + this.bounds = new Bounds(this.x, this.y, + this.x, this.y); + } + + /** + * @function GeometryPoint.prototype.equals + * @description 判断两个点对象是否相等。如果两个点对象具有相同的坐标,则认为是相等的。 + * @example + * var point= new GeometryPoint(0,0); + * var point1={x:0,y:0}; + * var result= point.equals(point1); + * @param {GeometryPoint} geom - 需要判断的点对象。 + * @returns {boolean} 两个点对象是否相等(true 为相等,false 为不等)。 + */ + equals(geom) { + var equals = false; + if (geom != null) { + equals = ((this.x === geom.x && this.y === geom.y) || + (isNaN(this.x) && isNaN(this.y) && isNaN(geom.x) && isNaN(geom.y))); + } + return equals; + } + + + /** + * @function GeometryPoint.prototype.move + * @description 沿着 x、y 轴的正方向上按照给定的位移移动点对象,move 不仅改变了几何对象的位置并且清理了边界缓存。 + * @param {number} x - x 轴正方向上的偏移量。 + * @param {number} y - y 轴正方向上偏移量。 + */ + move(x, y) { + this.x = this.x + x; + this.y = this.y + y; + this.clearBounds(); + } + + /** + * @function GeometryPoint.prototype.toShortString + * @description 将 x/y 坐标转换成简单字符串。 + * @returns {string} 字符串代表点对象。(ex. "5, 42") + */ + toShortString() { + return (this.x + ", " + this.y); + } + + /** + * @function GeometryPoint.prototype.destroy + * @description 释放点对象的资源。 + */ + destroy() { + this.x = null; + this.y = null; + this.tag = null; + super.destroy(); + } + + /** + * @function GeometryPoint.prototype.getVertices + * @description 获取几何图形所有顶点的列表。 + * @returns {Array} 几何图形的顶点列表。 + */ + getVertices() { + return [this]; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/LineString.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryLineString + * @aliasclass Geometry.LineString + * @deprecatedclass SuperMap.Geometry.LineString + * @classdesc 几何对象线串类。 + * @category BaseTypes Geometry + * @param {Array.} points - 用来生成线串的点数组。 + * @extends GeometryCurve + * @example + * var points = [new GeometryPoint(4933.319287022352, -3337.3849141502124), + * new GeometryPoint(4960.9674060199022, -3349.3316322355736), + * new GeometryPoint(5006.0235999418364, -3358.8890067038628), + * new GeometryPoint(5075.3145648369318, -3378.0037556404409), + * new GeometryPoint(5305.19551436013, -3376.9669111768926)], + * var roadLine = new GeometryLineString(points); + * @usage + */ +class LineString extends Curve { + + constructor(points) { + super(points); + this.CLASS_NAME = "SuperMap.Geometry.LineString"; + this.geometryType = "LineString"; + } + + /** + * @function GeometryLineString.prototype.removeComponent + * @description 只有在线串上有三个或更多的点的时候,才会允许移除点(否则结果将会是单一的点)。 + * @param {GeometryPoint} point - 将被删除的点。 + * @returns {boolean} 删除的点。 + */ + removeComponent(point) { // eslint-disable-line no-unused-vars + var removed = this.components && (this.components.length > 2); + if (removed) { + super.removeComponent.apply(this, arguments); + } + return removed; + } + + /** + * @function GeometryLineString.prototype.getSortedSegments + * @description 获取升序排列的点坐标对象数组。 + * @returns {Array} 升序排列的点坐标对象数组。 + */ + getSortedSegments() { + var numSeg = this.components.length - 1; + var segments = new Array(numSeg), point1, point2; + for (var i = 0; i < numSeg; ++i) { + point1 = this.components[i]; + point2 = this.components[i + 1]; + if (point1.x < point2.x) { + segments[i] = { + x1: point1.x, + y1: point1.y, + x2: point2.x, + y2: point2.y + }; + } else { + segments[i] = { + x1: point2.x, + y1: point2.y, + x2: point1.x, + y2: point1.y + }; + } + } + + // more efficient to define this somewhere static + function byX1(seg1, seg2) { + return seg1.x1 - seg2.x1; + } + + return segments.sort(byX1); + } + + /** + * @function GeometryLineString.prototype.getVertices + * @description 返回几何图形的所有顶点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false,则返回非端点的顶点。如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何图形的顶点列表。 + */ + getVertices(nodes) { + var vertices; + if (nodes === true) { + vertices = [ + this.components[0], + this.components[this.components.length - 1] + ]; + } else if (nodes === false) { + vertices = this.components.slice(1, this.components.length - 1); + } else { + vertices = this.components.slice(); + } + return vertices; + } + + /** + * @function GeometryLineString.calculateCircle + * @description 三点画圆弧。 + * @param {Array.} points - 传入的待计算的初始点串。 + * @returns {Array.} 计算出相应的圆弧控制点。 + * @example + * var points = []; + * points.push(new GeometryPoint(-50,30)); + * points.push(new GeometryPoint(-30,50)); + * points.push(new GeometryPoint(2,60)); + * var circle = GeometryLineString.calculateCircle(points); + */ + static calculateCircle(points) { + if (points.length < 3) { + return points + } + var centerPoint = {}, + p1 = points[0], + p2 = points[1], + p3 = points[2]; + var R = 0, + dStep = 0, + direc = true, + dRotation = 0, + dRotationBegin = 0, + dRotationAngle = 0, + nSegmentCount = 72, + circlePoints = []; + + var KTan13 = (p3.y - p1.y) / (p3.x - p1.x); + var B13 = p3.y - KTan13 * p3.x; + if ((((p3.x != p1.x) && (p3.y != p1.y)) && (p2.y == KTan13 * p2.x + B13)) || + ((p3.x == p1.x) && (p2.x == p1.x)) || ((p3.y == p1.y) && (p2.y == p1.y)) || + ((p3.x == p1.x) && (p3.y == p1.y)) || ((p3.x == p2.x) && (p3.y == p2.y)) || ((p1.x == p2.x) && (p1.y == p2.y))) { + circlePoints.push(p1); + circlePoints.push(p2); + circlePoints.push(p3); + } else { + var D = ((p2.x * p2.x + p2.y * p2.y) - (p1.x * p1.x + p1.y * p1.y)) * (2 * (p3.y - p1.y)) - ((p3.x * p3.x + p3.y * p3.y) - + (p1.x * p1.x + p1.y * p1.y)) * (2 * (p2.y - p1.y)); + var E = (2 * (p2.x - p1.x)) * ((p3.x * p3.x + p3.y * p3.y) - (p1.x * p1.x + p1.y * p1.y)) - + (2 * (p3.x - p1.x)) * ((p2.x * p2.x + p2.y * p2.y) - (p1.x * p1.x + p1.y * p1.y)); + var F = 4 * ((p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y)); + centerPoint.x = D / F; + centerPoint.y = E / F; + R = Math.sqrt((p1.x - centerPoint.x) * (p1.x - centerPoint.x) + (p1.y - centerPoint.y) * (p1.y - centerPoint.y)); + + var dis = (p1.x - p3.x) * (p1.x - p3.x) + (p1.y - p3.y) * (p1.y - p3.y); + var cons = (2 * R * R - dis) / (2 * R * R); + cons = cons >= 1 ? 1 : cons; + cons = cons <= -1 ? -1 : cons; + dRotationAngle = Math.acos(cons) * 180 / Math.PI; + + if (p3.x == p1.x) { + dRotationAngle = ((centerPoint.x > p1.x && p2.x > p1.x) || (centerPoint.x < p1.x && p2.x < p1.x)) ? (360 - dRotationAngle) : dRotationAngle; + } else { + dRotationAngle = ((centerPoint.y > (KTan13 * centerPoint.x + B13) && p2.y > (KTan13 * p2.x + B13)) || + (centerPoint.y < (KTan13 * centerPoint.x + B13) && p2.y < (KTan13 * p2.x + B13))) ? (360 - dRotationAngle) : dRotationAngle; + } + dStep = dRotationAngle / 72; + + if (p3.y != p1.y) { + if (p3.x == p1.x) { + if (p3.y > p1.y) { + if (p2.x < p1.x) { + direc = false; + } + } else { + if (p2.x > p1.x) { + direc = false; + } + } + } else if (p3.x < p1.x) { + if (p2.y < KTan13 * p2.x + B13) { + direc = false; + } + } else { + if (p2.y > KTan13 * p2.x + B13) { + direc = false; + } + } + } else { + if (p3.x > p1.x) { + if (p2.y > p1.y) { + direc = false; + } + } else { + if (p2.y < p1.y) { + direc = false; + } + } + } + + var K10 = (p1.y - centerPoint.y) / (p1.x - centerPoint.x); + var atan10 = K10 >= 0 ? Math.atan(K10) * 180 / Math.PI : Math.abs(Math.atan(K10) * 180 / Math.PI) + 90; + + var CY = Math.abs(centerPoint.y); + if ((p1.y == CY) && (CY == p3.y)) { + if (p1.x < p3.x) { + atan10 = atan10 + 180; + } + } + + var newPY = p1.y - centerPoint.y; + circlePoints.push(p1); + for (var i = 1; i < nSegmentCount; i++) { + dRotation = dStep * i; + dRotationBegin = atan10; + + if (direc) { + if (newPY >= 0) { + if (K10 >= 0) { + dRotationBegin = dRotationBegin + dRotation; + } else { + dRotationBegin = (180 - (dRotationBegin - 90)) + dRotation; + } + } else { + if (K10 > 0) { + dRotationBegin = (dRotationBegin - 180) + dRotation; + } else { + dRotationBegin = (90 - dRotationBegin) + dRotation; + } + } + } else { + if (newPY >= 0) { + if (K10 >= 0) { + dRotationBegin = dRotationBegin - dRotation; + } else { + dRotationBegin = (180 - (dRotationBegin - 90)) - dRotation; + } + } else { + if (K10 >= 0) { + dRotationBegin = (dRotationBegin - 180) - dRotation; + } else { + dRotationBegin = (90 - dRotationBegin) - dRotation; + } + } + } + + dRotationBegin = dRotationBegin * Math.PI / 180; + var x = centerPoint.x + R * Math.cos(dRotationBegin); + var y = centerPoint.y + R * Math.sin(dRotationBegin); + circlePoints.push(new Point(x, y)); + } + circlePoints.push(p3); + } + return circlePoints; + } + + /** + * @function GeometryLineString.createLineEPS + * @description 根据点的类型画出不同类型的曲线。 + * 点的类型有三种:LTypeArc,LTypeCurve,NONE。 + * @param {Array.} points - 传入的待计算的初始点串。 + * @returns {Array.} 计算出相应的 lineEPS 控制点。 + * @example + * var points = []; + * points.push(new GeometryPoint(-50,30)); + * points.push(new GeometryPoint(-30,50,"LTypeArc")); + * points.push(new GeometryPoint(2,60)); + * points.push(new GeometryPoint(8,20)); + * var lineEPS = GeometryLineString.createLineEPS(points); + */ + static createLineEPS(points) { + var list = [], + len = points.length; + if (len < 2) { + return points; + } + for (var i = 0; i < len;) { + var type = points[i].type; + if (type == 'LTypeArc') { + var listObj = LineString.createLineArc(list, i, len, points); + list = listObj[0]; + i = listObj[1]; + } else { + list.push(points[i]); + i++; + } + } + return list; + } + + static createLineArc(list, i, len, points) { + if (i == 0) { + let bezierPtsObj = LineString.addPointEPS(points, i, len, 'LTypeArc'); + Array.prototype.push.apply(list, bezierPtsObj[0]); + i = bezierPtsObj[1] + 1; + } else if (i == len - 1) { + var bezierP = [points[i - 1], points[i]], + bezierPts = LineString.calculateCircle(bezierP); + Array.prototype.push.apply(list, bezierPts); + i++; + } else { + let bezierPtsObj = LineString.addPointEPS(points, i, len, 'LTypeArc'); + list.pop(); + Array.prototype.push.apply(list, bezierPtsObj[0]); + i = bezierPtsObj[1] + 1; + } + return [list, i]; + } + + static addPointEPS(points, i, len, type) { + var bezierP = [], j = i + 1; + if (i == 0) { + Array.prototype.push.apply(bezierP, [points[i], points[i + 1]]); + } else if (i == len - 1) { + Array.prototype.push.apply(bezierP, [points[i - 1], points[i]]); + } else { + Array.prototype.push.apply(bezierP, [points[i - 1], points[i], points[i + 1]]); + } + var bezierPts; + if (type == 'LTypeCurve') { + bezierPts = LineString.calculatePointsFBZN(bezierP); + } else if (type == 'LTypeArc') { + bezierPts = LineString.calculateCircle(bezierP); + } + return [bezierPts, j]; + } +} + + + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/GeoText.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class GeometryGeoText + * @aliasclass Geometry.GeoText + * @deprecatedclass SuperMap.Geometry.GeoText + * @classdesc 文本标签类。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {number} x - x 坐标。 + * @param {number} y - y 坐标。 + * @param {string} text - 标签中的文本内容。 + * @usage + */ +class GeoText extends Geometry { + + constructor(x, y, text) { + super(x, y, text); + /** + * @member {number} GeometryGeoText.prototype.x + * @description 横坐标。 + */ + this.x = parseFloat(x); + + /** + * @member {number} GeometryGeoText.prototype.y + * @description 纵坐标。 + */ + this.y = parseFloat(y); + + /** + * @member {string} GeometryGeoText.prototype.text + * @description 标签中的文本内容。 + */ + this.text = text.toString(); + + /** + * @member {Object} GeometryGeoText.prototype.bsInfo + * @description 标签范围的基础信息。 + * @property {number} w - bounds 的宽。 + * @property {number} h - bounds 的高度。 + */ + this.bsInfo = { + "h": null, + "w": null + }; + this.element = document.createElement('span'); + this.CLASS_NAME = "SuperMap.Geometry.GeoText"; + this.geometryType = "GeoText"; + } + + /** + * @function GeometryGeoText.prototype.destroy + * @description 销毁文本标签类。 + */ + destroy() { + super.destroy(); + this.x = null; + this.y = null; + this.text = null; + } + + /** + * @function GeometryGeoText.prototype.getCentroid + * @description 获取标签对象的质心。 + * @returns {GeometryPoint} 标签对象的质心。 + */ + getCentroid() { + return new Point(this.x, this.y); + } + + /** + * @function GeometryGeoText.prototype.clone + * @description 克隆标签对象。 + * @returns {GeometryGeoText} 克隆后的标签对象。 + */ + clone(obj) { + if (obj == null) { + obj = new GeoText(this.x, this.y, this.text); + } + Util.applyDefaults(obj, this); + return obj; + } + + /** + * @function GeometryGeoText.prototype.calculateBounds + * @description 计算标签对象的范围。 + */ + calculateBounds() { + this.bounds = new Bounds(this.x, this.y, + this.x, this.y); + } + + /** + * @function GeometryGeoText.prototype.getLabelPxBoundsByLabel + * @description 根据绘制好的标签获取文字标签的像素范围,参数的单位是像素;此方法相对于 getLabelPxBoundsByText 效率较低,但支持所有格式的文本。 + * @param {Object} locationPixel - 标签的位置点,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {string} labelWidth - 标签的宽度,如:“90px”。 + * @param {string} labelHeight - 标签的高度。 + * @param {Object} style - 标签的 style。 + * @returns {Bounds} 标签的像素范围。 + */ + getLabelPxBoundsByLabel(locationPixel, labelWidth, labelHeight, style) { + var labelPxBounds, left, bottom, top, right; + var locationPx = Util.cloneObject(locationPixel); + + //计算文本行数 + var theText = style.label || this.text; + var textRows = theText.split('\n'); + var laberRows = textRows.length; + + //处理文字对齐 + labelWidth = parseFloat(labelWidth); + labelHeight = parseFloat(labelHeight); + if (laberRows > 1) { + labelHeight = parseFloat(labelHeight) * laberRows; + } + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelWidth / 2; + locationPx.y += labelHeight / 2; + break; + case "lm": + locationPx.x += labelWidth / 2; + break; + case "lb": + locationPx.x += labelWidth / 2; + locationPx.y -= labelHeight / 2; + break; + case "ct": + locationPx.y += labelHeight / 2; + break; + case "cb": + locationPx.y -= labelHeight / 2; + break; + case "rt": + locationPx.x -= labelWidth / 2; + locationPx.y += labelHeight / 2; + break; + case "rm": + locationPx.x -= labelWidth / 2; + break; + case "rb": + locationPx.x -= labelWidth / 2; + locationPx.y -= labelHeight / 2; + break; + default: + break; + } + } + + this.bsInfo.h = labelHeight; + this.bsInfo.w = labelWidth; + + //bounds的四边 + left = locationPx.x - parseFloat(labelWidth) / 2; + bottom = locationPx.y + parseFloat(labelHeight) / 2; + right = locationPx.x + parseFloat(labelWidth) / 2; + top = locationPx.y - parseFloat(labelHeight) / 2; + + labelPxBounds = new Bounds(left, bottom, right, top); + + return labelPxBounds; + } + + /** + * @function GeometryGeoText.prototype.getLabelPxBoundsByText + * @description 根据文本内容获取文字标签的像素范围。 + * @param {Object} locationPixel - 标签的位置点,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Object} style - 标签的样式。 + * @returns {Bounds} 标签的像素范围。 + */ + getLabelPxBoundsByText(locationPixel, style) { + var labelPxBounds, left, bottom, top, right; + var labelSize = this.getLabelPxSize(style); + var locationPx = Util.cloneObject(locationPixel); + + //处理文字对齐 + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + case "lm": + locationPx.x += labelSize.w / 2; + break; + case "lb": + locationPx.x += labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + case "ct": + locationPx.y += labelSize.h / 2; + break; + case "cb": + locationPx.y -= labelSize.h / 2; + break; + case "rt": + locationPx.x -= labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + case "rm": + locationPx.x -= labelSize.w / 2; + break; + case "rb": + locationPx.x -= labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + default: + break; + } + } + + this.bsInfo.h = labelSize.h; + this.bsInfo.w = labelSize.w; + + + left = locationPx.x - labelSize.w / 2; + bottom = locationPx.y + labelSize.h / 2; + //处理斜体字 + if (style.fontStyle && style.fontStyle === "italic") { + right = locationPx.x + labelSize.w / 2 + parseInt(parseFloat(style.fontSize) / 2); + } else { + right = locationPx.x + labelSize.w / 2; + } + top = locationPx.y - labelSize.h / 2; + + labelPxBounds = new Bounds(left, bottom, right, top); + + return labelPxBounds; + } + + /** + * @function GeometryGeoText.prototype.getLabelPxSize + * @description 获取 label 的像素大小。 + * @param {Object} style - 标签样式。 + * @returns {Object} 标签大小对象,属性 w 表示标签的宽度,属性 h 表示标签的高度。 + */ + getLabelPxSize(style) { + var text,//文本内容 + fontSize,//字体大小 + spacing = 1,//两个字符间的间距(单位:px) + lineSpacing = 0.2, + bgstrokeWidth = parseFloat(style.strokeWidth);//标签背景框边框的宽度 + + text = style.label || this.text; + if (style.fontSize) { + fontSize = parseFloat(style.fontSize); + } else { + fontSize = parseFloat("12px"); + } + + //标签宽高 + var labelW, labelH; + + var textRows = text.split('\n'); + var numRows = textRows.length; + + if (numRows > 1) { + labelH = fontSize * numRows + numRows + bgstrokeWidth + lineSpacing * fontSize; + } else { + labelH = fontSize + bgstrokeWidth + lineSpacing * fontSize + 1; + } + + //取最大宽度 + labelW = 0; + if (this.labelWTmp && labelW < this.labelWTmp) { + labelW = this.labelWTmp; + } + for (var i = 0; i < numRows; i++) { + var textCharC = this.getTextCount(textRows[i]); + var labelWTmp = this.labelWTmp = Util.getTextBounds(style, textRows[i], this.element).textWidth + textCharC.textC * spacing + bgstrokeWidth; + if (labelW < labelWTmp) { + labelW = labelWTmp; + } + } + + var labelSize = new Object(); //标签大小 + labelSize.h = labelH; + labelSize.w = labelW; + + return labelSize; + } + + /** + * @function GeometryGeoText.prototype.getTextCount + * @description 获取 text 中的字符个数。 + * @param {string} text - 字符串。 + * @returns {Object} 字符个数统计结果,属性 cnC 表示中文字符个数,属性 enC 表示英文字符个数,属性 textC 表示字符总个数。 + */ + getTextCount(text) { + var textCharCount = {}; + + var cnCount = 0; + var enCount = 0; + + for (var i = 0; i < text.length; i++) { + if (text.charCodeAt(i) > 255) { //遍历判断字符串中每个字符的Unicode码,大于255则为中文 + cnCount++; + } else { + enCount++; + } + } + //中午字符个数 + textCharCount.cnC = cnCount; + //英文字符个数 + textCharCount.enC = enCount; + //字符总个数 + textCharCount.textC = text.length; + + return textCharCount; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/LinearRing.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryLinearRing + * @aliasclass Geometry.LinearRing + * @deprecatedclass SuperMap.Geometry.LinearRing + * @classdesc 几何对象线环类,是一个特殊的封闭的线串,在每次 addPoint/removePoint 之后会通过添加一个点(此点是复制的第一个点得到的) + * 作为最后的一个点来自动关闭线环。 + * @category BaseTypes Geometry + * @extends GeometryLineString + * @param {Array.} points - 组成线性环的点。 + * @example + * var points = [new GeometryPoint(4933.319287022352, -3337.3849141502124), + * new GeometryPoint(4960.9674060199022, -3349.3316322355736), + * new GeometryPoint(5006.0235999418364, -3358.8890067038628), + * new GeometryPoint(5075.3145648369318, -3378.0037556404409), + * new GeometryPoint(5305.19551436013, -3376.9669111768926)], + * var linearRing = new GeometryLinearRing(points); + * @usage + */ +class LinearRing extends LineString { + + + constructor(points) { + super(points); + /** + * @member {Array.} [GeometryLinearRing.prototype.componentTypes=["SuperMap.Geometry.Point"]] + * @description components 存储的的几何对象所支持的几何类型数组,为空表示类型不受限制。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.Point"]; + this.CLASS_NAME = "SuperMap.Geometry.LinearRing"; + this.geometryType = "LinearRing"; + } + + /** + * @function GeometryLinearRing.prototype.addComponent + * @description 添加一个点到几何图形数组中,如果这个点将要被添加到组件数组的末端,并且与数组中已经存在的最后一个点相同, + * 重复的点是不能被添加的。这将影响未关闭环的关闭。 + * 这个方法可以通过将非空索引(组件数组的下标)作为第二个参数重写。 + * @param {GeometryPoint} point - 点对象。 + * @param {number} [index] - 插入组件数组的下标。 + * @returns {boolean} 点对象是否添加成功。 + */ + addComponent(point, index) { + var added = false; + + //remove last point + var lastPoint = this.components.pop(); + + // given an index, add the point + // without an index only add non-duplicate points + if (index != null || !point.equals(lastPoint)) { + added = super.addComponent.apply(this, arguments); + } + + //append copy of first point + var firstPoint = this.components[0]; + super.addComponent.apply(this, [firstPoint]); + + return added; + } + + /** + * @function GeometryLinearRing.prototype.removeComponent + * @description 从几何组件中删除一个点。 + * @param {GeometryPoint} point - 点对象。 + * @returns {boolean} 点对象是否删除。 + */ + removeComponent(point) { // eslint-disable-line no-unused-vars + var removed = this.components && (this.components.length > 3); + if (removed) { + //remove last point + this.components.pop(); + + //remove our point + super.removeComponent.apply(this, arguments); + //append copy of first point + var firstPoint = this.components[0]; + super.addComponent.apply(this, [firstPoint]); + } + return removed; + } + + /** + * @function GeometryLinearRing.prototype.getArea + * @description 获得当前几何对象区域大小,如果是沿顺时针方向的环则是正值,否则为负值。 + * @returns {number} 环的面积。 + */ + getArea() { + var area = 0.0; + if (this.components && (this.components.length > 2)) { + var sum = 0.0; + for (var i = 0, len = this.components.length; i < len - 1; i++) { + var b = this.components[i]; + var c = this.components[i + 1]; + sum += (b.x + c.x) * (c.y - b.y); + } + area = -sum / 2.0; + } + return area; + } + + /** + * @function GeometryLinearRing.prototype.getVertices + * @description 返回几何图形的所有点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false ,则返回非端点的顶点,如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何对象所有点的列表。 + */ + getVertices(nodes) { + return (nodes === true) ? [] : this.components.slice(0, this.components.length - 1); + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiLineString.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryMultiLineString + * @aliasclass Geometry.MultiLineString + * @deprecatedclass SuperMap.Geometry.MultiLineString + * @classdesc 几何对象多线类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - GeometryLineString 数组。 + * @example + * var multi = new GeometryMultiLineString([ + * new GeometryLineString([ + * new GeometryPoint(1, 0), + * new GeometryPoint(0, 1) + * ]) + * ]); + * @usage + */ +class MultiLineString extends Collection { + + + constructor(components) { + super(components); + /** + * @member {Array.} [GeometryMultiLineString.prototype.componentTypes=["SuperMap.Geometry.LineString"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.LineString"]; + this.CLASS_NAME = "SuperMap.Geometry.MultiLineString"; + this.geometryType = "MultiLineString"; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiPolygon.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryMultiPolygon + * @aliasclass Geometry.MultiPolygon + * @deprecatedclass SuperMap.Geometry.MultiPolygon + * @classdesc 几何对象多多边形类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 形成 GeometryMultiPolygon 的多边形数组。 + * @example + * var points1 = [new GeometryPoint(10,10),new GeometryPoint(0,0)]; + * var points2 = [new GeometryPoint(10,10),new GeometryPoint(0,0),new GeometryPoint(3,3),new GeometryPoint(10,10)]; + * + * var linearRing1 = new GeometryLinearRing(points1); + * var linearRing2 = new GeometryLinearRing(points2); + * + * var polygon1 = new GeometryPolygon([linearRing1]); + * var polygon2 = new GeometryPolygon([linearRing2]); + * + * var multiPolygon1 = new GeometryMultiPolygon([polygon1,polygon2]); + * @usage + */ +class MultiPolygon extends Collection { + + + constructor(components) { + super(components); + /** + * @member {Array.} [GeometryMultiPolygon.prototype.componentTypes=["SuperMap.Geometry.Polygon"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.Polygon"]; + this.CLASS_NAME = "SuperMap.Geometry.MultiPolygon"; + this.geometryType = "MultiPolygon"; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Polygon.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GeometryPolygon + * @aliasclass Geometry.Polygon + * @deprecatedclass SuperMap.Geometry.Polygon + * @classdesc 多边形几何对象类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 多边形的线环数组。 + * @example + * var points =[new GeometryPoint(0,4010338), + * new GeometryPoint(1063524,4010338), + * new GeometryPoint(1063524,3150322), + * new GeometryPoint(0,3150322) + * ], + * var linearRings = new GeometryLinearRing(points), + * var region = new GeometryPolygon([linearRings]); + * @usage + */ +class Polygon extends Collection { + + + constructor(components) { + super(components); + /** + * @member {Array.} [GeometryPolygon.prototype.componentTypes=["SuperMap.Geometry.LinearRing"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + this.componentTypes = ["SuperMap.Geometry.LinearRing"]; + this.CLASS_NAME = "SuperMap.Geometry.Polygon"; + this.geometryType = "Polygon"; + } + + /** + * @function GeometryMultiPoint.prototype.getArea + * @description 获得区域面积,从区域的外部口径减去计此区域内部口径算所得的面积。 + * @returns {number} 几何对象的面积。 + */ + getArea() { + var area = 0.0; + if (this.components && (this.components.length > 0)) { + area += Math.abs(this.components[0].getArea()); + for (var i = 1, len = this.components.length; i < len; i++) { + area -= Math.abs(this.components[i].getArea()); + } + } + return area; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Rectangle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryRectangle + * @aliasclass Geometry.Rectangle + * @deprecatedclass SuperMap.Geometry.Rectangle + * @classdesc 矩形几何对象类。 + * @category BaseTypes Geometry + * @param {number} x - 矩形左下角点的横坐标。 + * @param {number} y - 矩形左下角点的纵坐标。 + * @param {number} width - 矩形的宽度。 + * @param {number} height - 矩形的高度。 + * @extends {Geometry} + * @example + * //x 为矩形左下角点的横坐标;y 为矩形左下角点的纵坐标;w 为矩形的宽度;h 为矩形的高度 + * var x = 1; + * var y = 2; + * var w = 10; + * var h = 20; + * var recttangle = new GeometryRectangle(x, y, w, h); + * @usage + */ + +class Rectangle extends Geometry { + + + constructor(x, y, width, height) { + super(x, y, width, height); + /** + * @member {number} GeometryRectangle.prototype.x + * @description 矩形左下角点的横坐标。 + */ + this.x = x; + + /** + * @member {number} GeometryRectangle.prototype.y + * @description 矩形左下角点的纵坐标。 + */ + this.y = y; + + /** + * @member {number} GeometryRectangle.prototype.width + * @description 矩形的宽度。 + */ + this.width = width; + + /** + * @member {number} GeometryRectangle.prototype.height + * @description 矩形的高度。 + */ + this.height = height; + + this.CLASS_NAME = "SuperMap.Geometry.Rectangle"; + this.geometryType = "Rectangle"; + } + + /** + * @function GeometryRectangle.prototype.calculateBounds + * @description 计算出此矩形对象的 bounds。 + */ + calculateBounds() { + this.bounds = new Bounds(this.x, this.y, + this.x + this.width, + this.y + this.height); + } + + + /** + * @function GeometryRectangle.prototype.getArea + * @description 获取矩形对象的面积。 + * @returns {number} 矩形对象面积。 + */ + getArea() { + var area = this.width * this.height; + return area; + } + + +} + +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/commontypes/Credential.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Credential + * @deprecatedclass SuperMap.Credential + * @category Security + * @classdesc SuperMap 的安全证书类,其中包括 token 等安全验证信息。
+ * 需要使用用户名和密码在:"http://localhost:8090/iserver/services/security/tokens" 下申请 value。
+ * 获得形如:"2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ.." 的 value。
+ * 目前支持的功能包括:地图服务、专题图、量算、查询、公交换乘、空间分析、网络分析,不支持轮询功能。
+ * @param {string} value - 访问受安全限制的服务时用于通过安全认证的验证信息。 + * @param {string} [name='token'] - 验证信息前缀,name=value 部分的 name 部分。 + * @example + * var pixcel = new Credential("valueString","token"); + * pixcel.destroy(); + * @usage + */ +class Credential { + + constructor(value, name) { + + /** + * @member {string} Credential.prototype.value + * @description 访问受安全限制的服务时用于通过安全认证的验证信息。 + */ + this.value = value ? value : ""; + + /** + * @member {string} [Credential.prototype.name='token'] + * @description 验证信息前缀,name=value 部分的 name 部分。 + */ + this.name = name ? name : "token"; + this.CLASS_NAME = "SuperMap.Credential"; + } + + /** + * @function Credential.prototype.getUrlParameters + * @description 获取 name=value 的表达式。 + * @example + * var credential = new Credential("valueString","token"); + * //这里 str = "token=valueString"; + * var str = credential.getUrlParameters(); + * @returns {string} 安全信息组成的 url 片段。 + */ + getUrlParameters() { + //当需要其他安全信息的时候,则需要return this.name + "=" + this.value + "&" + "...";的形式添加。 + return this.name + "=" + this.value; + } + + + /** + * @function Credential.prototype.getValue + * @description 获取 value。 + * @example + * var credential = new Credential("2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ..","token"); + * //这里 str = "2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ.."; + * var str = credential.getValue(); + * @returns {string} value 字符串,在 iServer 服务下该 value 值即为 token 值。 + */ + getValue() { + return this.value; + } + + /** + * + * @function Credential.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var credential = new Credential("valueString","token"); + * credential.destroy(); + */ + destroy() { + this.value = null; + this.name = null; + } + +} + +/** + * @member {Credential} Credential.CREDENTIAL + * @description 这个对象保存一个安全类的实例,在服务端需要安全验证的时候必须进行设置。 + * @example + * 代码实例: + * // 当iServer启用服务安全的时候,下边的代码是必须的。安全证书类能够接收一个value和一个name参数。 + * var value = "(以iServer为例,这里是申请的token值)"; + * var name = "token"; + * // 默认name参数为token,所以当使用iServer服务的时候可以不进行设置。 + * Credential.CREDENTIAL = new Credential(value, name); + * + */ + + Credential.CREDENTIAL = null; + +;// CONCATENATED MODULE: ./src/common/commontypes/Date.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @name Date + * @namespace + * @category BaseTypes Util + * @description 包含 parse、toISOString 方法的实现,两个方法用来解析 RFC 3339 日期,遵循 ECMAScript 5 规范。 + * @private + */ +var DateExt = { + + /** + * @description 生成代表一个具体的日期字符串,该日期遵循 ISO 8601 标准(详情查看{@link http://tools.ietf.org/html/rfc3339})。 + * @example + * var dateString = DateExt.toISOString(new Date()); + * @param {Date} date - 日期对象。 + * @returns {string} 一个代表日期的字符串。(例如 "2010-08-07T16:58:23.123Z")。 + */ + toISOString: (function () { + //标准的Date会存在toISOString方法,可以直接调用 + if ("toISOString" in Date.prototype) { + return function (date) { + return date.toISOString(); + }; + } else {// 部分浏览器没有,就得自己组合,组合后的字符串规则不变 + function pad(num, len) { + var str = num + ""; + while (str.length < len) { + str = "0" + str; + } + return str; + } + + return function (date) { + var str; + if (isNaN(date.getTime())) { + // ECMA-262 says throw RangeError, Firefox returns + // "Invalid Date" + str = "Invalid Date"; + } else { + str = + date.getUTCFullYear() + "-" + + pad(date.getUTCMonth() + 1, 2) + "-" + + pad(date.getUTCDate(), 2) + "T" + + pad(date.getUTCHours(), 2) + ":" + + pad(date.getUTCMinutes(), 2) + ":" + + pad(date.getUTCSeconds(), 2) + "." + + pad(date.getUTCMilliseconds(), 3) + "Z"; + } + return str; + }; + } + + })(), + + /** + * @description 从一个字符串生成一个日期对象。 + * @example + * var date = DateExt.parse("2010-08-07"); + * @param {string} str - 日期的字符串。(例如: "2010", "2010-08", "2010-08-07", "2010-08-07T16:58:23.123Z","2010-08-07T11:58:23.123-06")。 + * @returns {Date} 日期对象,如果字符串无法被解析,则返回一个无效的日期。(例如 isNaN(date.getTime()))。 + */ + parse: function (str) { + var date; + var match = str.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))|Z)?$/); + if (match && (match[1] || match[7])) { // must have at least year or time + var year = parseInt(match[1], 10) || 0; + var month = (parseInt(match[2], 10) - 1) || 0; + var day = parseInt(match[3], 10) || 1; + date = new Date(Date.UTC(year, month, day)); + // optional time + var type = match[7]; + if (type) { + var hours = parseInt(match[4], 10); + var minutes = parseInt(match[5], 10); + var secFrac = parseFloat(match[6]); + var seconds = secFrac | 0; + var milliseconds = Math.round(1000 * (secFrac - seconds)); + date.setUTCHours(hours, minutes, seconds, milliseconds); + // check offset + if (type !== "Z") { + var hoursOffset = parseInt(type, 10); + var minutesOffset = parseInt(match[8], 10) || 0; + var offset = -1000 * (60 * (hoursOffset * 60) + minutesOffset * 60); + date = new Date(date.getTime() + offset); + } + } + } else { + date = new Date("invalid"); + } + return date; + } +}; + +;// CONCATENATED MODULE: ./src/common/commontypes/Event.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @name Event + * @namespace + * @category BaseTypes Events + * @description 事件处理函数. + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { Event } from '{npm}'; + * + * const result = Event.element(); + * ``` + */ + var Event = { + + /** + * @description 事件观察者列表。 + * @type {Object} + * @default false + */ + observers: false, + + /** + * @description KEY_SPACE + * @type {number} + * @default 32 + */ + KEY_SPACE: 32, + + /** + * @description KEY_BACKSPACE + * @type {number} + * @default 8 + */ + KEY_BACKSPACE: 8, + + /** + * @description KEY_TAB + * @type {number} + * @default 9 + */ + KEY_TAB: 9, + + /** + * @description KEY_RETURN + * @type {number} + * @default 13 + */ + KEY_RETURN: 13, + + /** + * @description KEY_ESC + * @type {number} + * @default 27 + */ + KEY_ESC: 27, + + /** + * @description KEY_LEFT + * @type {number} + * @default 37 + */ + KEY_LEFT: 37, + + /** + * @description KEY_UP + * @type {number} + * @default 38 + */ + KEY_UP: 38, + + /** + * @description KEY_RIGHT + * @type {number} + * @default 39 + */ + KEY_RIGHT: 39, + + /** + * @description KEY_DOWN + * @type {number} + * @default 40 + */ + KEY_DOWN: 40, + + /** + * @description KEY_DELETE + * @type {number} + * @default 46 + */ + KEY_DELETE: 46, + + + /** + * @description 监听浏览器 DOM 事件。 + * @param {Event} event - Event 对象。 + * @returns {HTMLElement} 触发事件的 DOM 元素。 + */ + element: function (event) { + return event.target || event.srcElement; + }, + + /** + * @description 判断事件是否由单次触摸引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否有且只有一个当前在与触摸表面接触的 Touch 对象。 + */ + isSingleTouch: function (event) { + return event.touches && event.touches.length === 1; + }, + + /** + * @description 判断事件是否由多点触控引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否存在多个当前在与触摸表面接触的 Touch 对象。 + */ + isMultiTouch: function (event) { + return event.touches && event.touches.length > 1; + }, + + /** + * @description 确定事件是否由左键单击引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否点击鼠标左键。 + */ + isLeftClick: function (event) { + return (((event.which) && (event.which === 1)) || + ((event.button) && (event.button === 1))); + }, + + /** + * @description 确定事件是否由鼠标右键单击引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否点击鼠标右键。 + */ + isRightClick: function (event) { + return (((event.which) && (event.which === 3)) || + ((event.button) && (event.button === 2))); + }, + + /** + * @description 阻止事件冒泡。 + * @param {Event} event - Event 对象。 + * @param {boolean} allowDefault - 默认为 false,表示阻止事件的默认行为。 + */ + stop: function (event, allowDefault) { + + if (!allowDefault) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + + if (event.stopPropagation) { + event.stopPropagation(); + } else { + event.cancelBubble = true; + } + }, + + /** + * @description 查询触发指定事件的 DOM 元素。 + * @param {Event} event - Event 对象。 + * @param {string} tagName - html 标签名。 + * @returns {HTMLElement} DOM 元素。 + */ + findElement: function (event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) { + element = element.parentNode; + } + return element; + }, + + /** + * @description 监听事件,注册事件处理方法。 + * @param {(HTMLElement|string)} elementParam - 待监听的 DOM 对象或者其 ID 标识。 + * @param {string} name - 监听事件的类别名称。 + * @param {function} observer - 注册的事件处理方法。 + * @param {boolean} [useCapture=false] - 是否捕获。 + */ + observe: function (elementParam, name, observer, useCapture) { + var element = Util.getElement(elementParam); + useCapture = useCapture || false; + + if (name === 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) { + name = 'keydown'; + } + + //if observers cache has not yet been created, create it + if (!this.observers) { + this.observers = {}; + } + + //if not already assigned, make a new unique cache ID + if (!element._eventCacheID) { + var idPrefix = "eventCacheID_"; + if (element.id) { + idPrefix = element.id + "_" + idPrefix; + } + element._eventCacheID = Util.createUniqueID(idPrefix); + } + + var cacheID = element._eventCacheID; + + //if there is not yet a hash entry for this element, add one + if (!this.observers[cacheID]) { + this.observers[cacheID] = []; + } + + //add a new observer to this element's list + this.observers[cacheID].push({ + 'element': element, + 'name': name, + 'observer': observer, + 'useCapture': useCapture + }); + + //add the actual browser event listener + if (element.addEventListener) { + if(name === 'mousewheel'){ + // https://www.chromestatus.com/features/6662647093133312 + element.addEventListener(name, observer, {useCapture: useCapture, passive: false} ); + } else { + element.addEventListener(name, observer, useCapture); + } + } else if (element.attachEvent) { + element.attachEvent('on' + name, observer); + } + }, + + /** + * @description 移除给定 DOM 元素的监听事件。 + * @param {(HTMLElement|string)} elementParam - 待监听的 DOM 对象或者其 ID 标识。 + */ + stopObservingElement: function (elementParam) { + var element = Util.getElement(elementParam); + var cacheID = element._eventCacheID; + this._removeElementObservers(Event.observers[cacheID]); + }, + _removeElementObservers: function (elementObservers) { + if (elementObservers) { + for (var i = elementObservers.length - 1; i >= 0; i--) { + var entry = elementObservers[i]; + var args = new Array(entry.element, entry.name, entry.observer, entry.useCapture); + Event.stopObserving.apply(this, args); + } + } + }, + + /** + * @description 移除事件监听和注册的事件处理方法。注意:事件的移除和监听相对应,移除时的各属性信息必须监听时 + * 保持一致才能确保事件移除成功。 + * @param {(HTMLElement|string)} elementParam - 被监听的 DOM 元素或者其 ID。 + * @param {string} name - 需要移除的被监听事件名称。 + * @param {function} observer - 需要移除的事件处理方法。 + * @param {boolean} [useCapture=false] - 是否捕获。 + * @returns {boolean} 监听事件是否被移除。 + */ + stopObserving: function (elementParam, name, observer, useCapture) { + useCapture = useCapture || false; + + var element = Util.getElement(elementParam); + var cacheID = element._eventCacheID; + + if (name === 'keypress') { + if (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || + element.detachEvent) { + name = 'keydown'; + } + } + + // find element's entry in this.observers cache and remove it + var foundEntry = false; + var elementObservers = Event.observers[cacheID]; + if (elementObservers) { + + // find the specific event type in the element's list + var i = 0; + while (!foundEntry && i < elementObservers.length) { + var cacheEntry = elementObservers[i]; + + if ((cacheEntry.name === name) && + (cacheEntry.observer === observer) && + (cacheEntry.useCapture === useCapture)) { + + elementObservers.splice(i, 1); + if (elementObservers.length == 0) { + delete Event.observers[cacheID]; + } + foundEntry = true; + break; + } + i++; + } + } + + //actually remove the event listener from browser + if (foundEntry) { + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element && element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } + return foundEntry; + }, + + /** + * @description 移除缓存中的监听事件。 + */ + unloadCache: function () { + // check for Event before checking for observers, because + // Event may be undefined in IE if no map instance was + // created + if (Event && Event.observers) { + for (var cacheID in Event.observers) { + var elementObservers = Event.observers[cacheID]; + Event._removeElementObservers.apply(this, + [elementObservers]); + } + Event.observers = false; + } + }, + + CLASS_NAME: "SuperMap.Event" + }; + /* prevent memory leaks in IE */ + Event.observe(window, 'resize', Event.unloadCache, false); + +;// CONCATENATED MODULE: ./src/common/commontypes/Events.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class Events + * @deprecatedclass SuperMap.Events + * @classdesc 事件类。 + * @category BaseTypes Events + * @param {Object} object - 当前事件对象被添加到的 JS 对象。 + * @param {HTMLElement} element - 响应浏览器事件的 DOM 元素。 + * @param {Array.} eventTypes - 自定义应用事件的数组。 + * @param {boolean} [fallThrough=false] - 是否允许事件处理之后向上传递(冒泡),为 false 的时候阻止事件冒泡。 + * @param {Object} options - 事件对象选项。 + * @usage + */ +class Events { + + constructor(object, element, eventTypes, fallThrough, options) { + /** + * @member {Array.} Events.prototype.BROWSER_EVENTS + * @description 支持的事件。 + * @constant + * @default [ + "mouseover", "mouseout","mousedown", "mouseup", "mousemove", + "click", "dblclick", "rightclick", "dblrightclick","resize", + "focus", "blur","touchstart", "touchmove", "touchend","keydown", + "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", + "MSGestureStart", "MSGestureChange", "MSGestureEnd","contextmenu" + ] + */ + this.BROWSER_EVENTS = [ + "mouseover", "mouseout", + "mousedown", "mouseup", "mousemove", + "click", "dblclick", "rightclick", "dblrightclick", + "resize", "focus", "blur", + "touchstart", "touchmove", "touchend", + "keydown", "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", + "MSGestureStart", "MSGestureChange", "MSGestureEnd", + "contextmenu" + ]; + + /** + * @member {Object} Events.prototype.listeners + * @description 事件监听器函数 + */ + this.listeners = {}; + + /** + * @member {Object} Events.prototype.object + * @description 发布应用程序事件的对象。 + */ + this.object = object; + + /** + * @member {HTMLElement} Events.prototype.element + * @description 接受浏览器事件的 DOM 节点。 + */ + this.element = null; + + /** + * @member {Array.} Events.prototype.eventTypes + * @description 支持的事件类型列表。 + */ + this.eventTypes = []; + + /** + * @member {function} Events.prototype.eventHandler + * @description 绑定在元素上的事件处理器对象。 + */ + this.eventHandler = null; + + /** + * @member {boolean} [Events.prototype.fallThrough=false] + * @description 是否允许事件处理之后向上传递(冒泡),为 false 的时候阻止事件冒泡。 + */ + this.fallThrough = fallThrough; + + /** + * @member {boolean} [Events.prototype.includeXY=false] + * @description 判断是否让 xy 属性自动创建到浏览器上的鼠标事件,一般设置为 false,如果设置为 true,鼠标事件将会在事件传递过程中自动产生 xy 属性。 + * 可根据事件对象的 'evt.object' 属性在相关的事件句柄上调用 getMousePosition 函数。这个选项习惯默认为 false 的原因在于,当创建一个 + * 事件对象,其主要目的是管理。在一个 div 的相对定位的鼠标事件,将其设为 true 也是有意义的。这个选项也可以用来控制是否抵消缓存。如果 + * 设为 false 不抵消,如果设为 true,用 this.clearMouseCache() 清除缓存偏移(边界元素偏移,元素在页面的位置偏移)。 + * @example + * function named(evt) { + * this.xy = this.object.events.getMousePosition(evt); + * } + */ + this.includeXY = false; + + /** + * @member {Object} Events.prototype.extensions + * @description 事件扩展。Keys 代表事件类型,values 代表事件对象。 + */ + this.extensions = {}; + + /** + * @member {Object} Events.prototype.extensionCount + * @description 事件扩展数量。 + */ + this.extensionCount = {}; + /** + * @member {Object} Events.prototype.clearMouseListener + * @description 待移除的鼠标监听事件。 + */ + this.clearMouseListener = null; + + Util.extend(this, options); + + if (eventTypes != null) { + for (var i = 0, len = eventTypes.length; i < len; i++) { + this.addEventType(eventTypes[i]); + } + } + + if (element != null) { + this.attachToElement(element); + } + + this.CLASS_NAME = "SuperMap.Events"; + } + + /** + * @function Events.prototype.destroy + * @description 移除当前要素 element 上的所有事件监听和处理。 + */ + destroy() { + for (var e in this.extensions) { + if (typeof this.extensions[e] !== "boolean") { + this.extensions[e].destroy(); + } + } + this.extensions = null; + if (this.element) { + Event.stopObservingElement(this.element); + if (this.element.hasScrollEvent) { + Event.stopObserving( + window, "scroll", this.clearMouseListener + ); + } + } + this.element = null; + + this.listeners = null; + this.object = null; + this.eventTypes = null; + this.fallThrough = null; + this.eventHandler = null; + } + + /** + * @function Events.prototype.addEventType + * @description 在此事件对象中添加新的事件类型,如果这个事件类型已经添加过了,则不做任何事情。 + * @param {string} eventName - 事件名。 + */ + addEventType(eventName) { + if (!this.listeners[eventName]) { + this.eventTypes.push(eventName); + this.listeners[eventName] = []; + } + } + + /** + * @function Events.prototype.attachToElement + * @description 给 DOM 元素绑定浏览器事件。 + * @param {HTMLElement} element - 绑定浏览器事件的 DOM 元素。 + */ + attachToElement(element) { + if (this.element) { + Event.stopObservingElement(this.element); + } else { + // keep a bound copy of handleBrowserEvent() so that we can + // pass the same function to both Event.observe() and .stopObserving() + this.eventHandler = FunctionExt.bindAsEventListener( + this.handleBrowserEvent, this + ); + + // to be used with observe and stopObserving + this.clearMouseListener = FunctionExt.bind( + this.clearMouseCache, this + ); + } + this.element = element; + for (var i = 0, len = this.BROWSER_EVENTS.length; i < len; i++) { + var eventType = this.BROWSER_EVENTS[i]; + + // every browser event has a corresponding application event + // (whether it's listened for or not). + this.addEventType(eventType); + + // use Prototype to register the event cross-browser + Event.observe(element, eventType, this.eventHandler); + } + // disable dragstart in IE so that mousedown/move/up works normally + Event.observe(element, "dragstart", Event.stop); + } + + + /** + * @function Events.prototype.on + * @description 在一个相同的范围内注册监听器的方法,此方法调用 register 函数。 + * @example + * // 注册一个 "loadstart" 监听事件 + * events.on({"loadstart": loadStartListener}); + * + * // 同样注册一个 "loadstart" 监听事件 + * events.register("loadstart", undefined, loadStartListener); + * + * // 同时为对象注册多个监听事件 + * events.on({ + * "loadstart": loadStartListener, + * "loadend": loadEndListener, + * scope: object + * }); + * + * // 同时为对象注册多个监听事件,多次调用 register 方法 + * events.register("loadstart", object, loadStartListener); + * events.register("loadend", object, loadEndListener); + * + * + * @param {Object} object - 添加监听的对象。 + */ + on(object) { + for (var type in object) { + if (type !== "scope" && object.hasOwnProperty(type)) { + this.register(type, object.scope, object[type]); + } + } + } + + + /** + * @function Events.prototype.register + * @description 在事件对象上注册一个事件。当事件被触发时,'func' 函数被调用,假设我们触发一个事件, + * 指定 Bounds 作为 "obj",当事件被触发时,回调函数的上下文作为 Bounds 对象。 + * @param {string} type - 事件注册者的名字。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + * @param {(boolean|Object)} [priority] - 当为 true 时将新的监听加在事件队列的前面。 + */ + register(type, obj, func, priority) { + if (type in Events && !this.extensions[type]) { + this.extensions[type] = new Events[type](this); + } + if ((func != null) && + (Util.indexOf(this.eventTypes, type) !== -1)) { + + if (obj == null) { + obj = this.object; + } + var listeners = this.listeners[type]; + if (!listeners) { + listeners = []; + this.listeners[type] = listeners; + this.extensionCount[type] = 0; + } + var listener = {obj: obj, func: func}; + if (priority) { + listeners.splice(this.extensionCount[type], 0, listener); + if (typeof priority === "object" && priority.extension) { + this.extensionCount[type]++; + } + } else { + listeners.push(listener); + } + } + } + + /** + * @function Events.prototype.registerPriority + * @description 相同的注册方法,但是在前面增加新的监听者事件查询而代替到方法的结束。 + * @param {string} type - 事件注册者的名字。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + */ + registerPriority(type, obj, func) { + this.register(type, obj, func, true); + } + + + /** + * @function Events.prototype.un + * @description 在一个相同的范围内取消注册监听器的方法,此方法调用 unregister 函数。 + * @example + * // 移除 "loadstart" 事件监听 + * events.un({"loadstart": loadStartListener}); + * + * // 使用 "unregister" 方法移除 "loadstart" 事件监听 + * events.unregister("loadstart", undefined, loadStartListener); + * + * // 取消对象多个事件监听 + * events.un({ + * "loadstart": loadStartListener, + * "loadend": loadEndListener, + * scope: object + * }); + * + * // 取消对象多个事件监听,多次调用unregister方法。 + * events.unregister("loadstart", object, loadStartListener); + * events.unregister("loadend", object, loadEndListener); + * + * @param {Object} object - 移除监听的对象。 + */ + un(object) { + for (var type in object) { + if (type !== "scope" && object.hasOwnProperty(type)) { + this.unregister(type, object.scope, object[type]); + } + } + } + + /** + * @function Events.prototype.unregister + * @description 取消注册。 + * @param {string} type - 事件类型。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + */ + unregister(type, obj, func) { + if (obj == null) { + obj = this.object; + } + var listeners = this.listeners[type]; + if (listeners != null) { + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].obj === obj && listeners[i].func === func) { + listeners.splice(i, 1); + break; + } + } + } + } + + + /** + * @function Events.prototype.remove + * @description 删除某个事件类型的所有监听,如果该事件类型没有注册,则不做任何操作。 + * @param {string} type - 事件类型。 + */ + remove(type) { + if (this.listeners[type] != null) { + this.listeners[type] = []; + } + } + + /** + * @function Events.prototype.triggerEvent + * @description 触发一个特定的注册事件。 + * @param {string} type - 触发事件类型。 + * @param {Event} evt - 事件对象。 + * @returns {Event|boolean} 监听对象,如果返回是 false,则停止监听。 + */ + triggerEvent(type, evt) { + var listeners = this.listeners[type]; + + // fast path + if (!listeners || listeners.length == 0) { + return undefined; + } + + // prep evt object with object & div references + if (evt == null) { + evt = {}; + } + evt.object = this.object; + evt.element = this.element; + if (!evt.type) { + evt.type = type; + } + + // execute all callbacks registered for specified type + // get a clone of the listeners array to + // allow for splicing during callbacks + listeners = listeners.slice(); + var continueChain; + for (var i = 0, len = listeners.length; i < len; i++) { + var callback = listeners[i]; + // bind the context to callback.obj + continueChain = callback.func.apply(callback.obj, [evt]); + + if ((continueChain != undefined) && (continueChain === false)) { + // if callback returns false, execute no more callbacks. + break; + } + } + // don't fall through to other DOM elements + if (!this.fallThrough) { + Event.stop(evt, true); + } + return continueChain; + } + + + /** + * @function Events.prototype.handleBrowserEvent + * @description 对 triggerEvent 函数的包装,给事件对象设置了 xy 属性(即当前鼠标点的 xy 坐标)。 + * @param {Event} evt - 事件对象。 + */ + handleBrowserEvent(evt) { + var type = evt.type, listeners = this.listeners[type]; + if (!listeners || listeners.length == 0) { + // noone's listening, bail out + return; + } + // add clientX & clientY to all events - corresponds to average x, y + var touches = evt.touches; + if (touches && touches[0]) { + var x = 0; + var y = 0; + var num = touches.length; + var touch; + for (var i = 0; i < num; ++i) { + touch = touches[i]; + x += touch.clientX; + y += touch.clientY; + } + evt.clientX = x / num; + evt.clientY = y / num; + } + if (this.includeXY) { + evt.xy = this.getMousePosition(evt); + } + this.triggerEvent(type, evt); + } + + + /** + * @function Events.prototype.clearMouseCache + * @description 清除鼠标缓存。 + */ + clearMouseCache() { + this.element.scrolls = null; + this.element.lefttop = null; + var body = document.body; + if (body && !((body.scrollTop != 0 || body.scrollLeft != 0) && + navigator.userAgent.match(/iPhone/i))) { + this.element.offsets = null; + } + } + + /** + * @function Events.prototype.getMousePosition + * @description 获取当前鼠标的位置。 + * @param {Event} evt - 事件对象。 + * @returns {Pixel} 当前的鼠标的 xy 坐标点。 + */ + getMousePosition(evt) { + if (!this.includeXY) { + this.clearMouseCache(); + } else if (!this.element.hasScrollEvent) { + Event.observe(window, "scroll", this.clearMouseListener); + this.element.hasScrollEvent = true; + } + + if (!this.element.scrolls) { + var viewportElement = Util.getViewportElement(); + this.element.scrolls = [ + viewportElement.scrollLeft, + viewportElement.scrollTop + ]; + } + + if (!this.element.lefttop) { + this.element.lefttop = [ + (document.documentElement.clientLeft || 0), + (document.documentElement.clientTop || 0) + ]; + } + + if (!this.element.offsets) { + this.element.offsets = Util.pagePosition(this.element); + } + + return new Pixel( + (evt.clientX + this.element.scrolls[0]) - this.element.offsets[0] + - this.element.lefttop[0], + (evt.clientY + this.element.scrolls[1]) - this.element.offsets[1] + - this.element.lefttop[1] + ); + } + +} +Events.prototype.BROWSER_EVENTS = [ + "mouseover", "mouseout", + "mousedown", "mouseup", "mousemove", + "click", "dblclick", "rightclick", "dblrightclick", + "resize", "focus", "blur", + "touchstart", "touchmove", "touchend", + "keydown", "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", + "MSGestureStart", "MSGestureChange", "MSGestureEnd", + "contextmenu" +]; + +;// CONCATENATED MODULE: ./src/common/commontypes/Feature.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Feature + * @deprecatedclass SuperMap.Feature + * @category BaseTypes Geometry + * @classdesc 要素类组合了地理和属性,Feature 类同时具有 marker 和 lonlat 属性。 + * @param {SuperMap.Layer} layer - 图层。 + * @param {LonLat} lonlat - 经纬度。 + * @param {Object} data - 数据对象。 + * @usage + */ +class Feature { + + + constructor(layer, lonlat, data) { + this.CLASS_NAME = "SuperMap.Feature"; + /** + * @deprecated + * @member {SuperMap.Layer} Feature.prototype.layer + * @description 图层。 + */ + this.layer = layer; + + /** + * @member {string} Feature.prototype.id + * @description 要素 ID。 + */ + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + + /** + * @member {LonLat} Feature.prototype.lonlat + * @description 经纬度。 + * + */ + this.lonlat = lonlat; + + /** + * @member {Object} Feature.prototype.data + * @description 数据对象。 + */ + this.data = (data != null) ? data : {}; + + } + + /** + * @function Feature.prototype.destroy + * @description 释放相关资源。 + */ + destroy() { + this.id = null; + this.lonlat = null; + this.data = null; + } +} + +;// CONCATENATED MODULE: ./src/common/commontypes/Vector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FeatureVector + * @aliasclass Feature.Vector + * @deprecatedclass SuperMap.Feature.Vector + * @category BaseTypes Geometry + * @classdesc 矢量要素类。该类具有 Geometry 属性存放几何信息, + * attributes 属性存放非几何信息,另外还包含了 style 属性,用来定义矢量要素的样式, + * 其中,默认的样式在 {@link FeatureVector.style} 类中定义,如果没有特别的指定将使用默认的样式。 + * @extends {Feature} + * @param {Geometry} geometry - 要素的几何信息。 + * @param {Object} [attributes] - 描述要素的任意的可序列化属性,将要映射到 attributes 属性中的对象。 + * @param {Object} [style] - 样式对象。 + * @example + * var geometry = new GeometryPoint(-115,10); + * var style = { + * strokeColor:"#339933", + * strokeOpacity:1, + * strokeWidth:3, + * pointRadius:6 + * } + * var pointFeature = new FeatureVector(geometry,null,style); + * vectorLayer.addFeatures(pointFeature); + * @usage + */ +// TRASH THIS +const State = { + /** states */ + UNKNOWN: 'Unknown', + INSERT: 'Insert', + UPDATE: 'Update', + DELETE: 'Delete' +}; +class Vector extends Feature { + + + constructor(geometry, attributes, style) { + super(null, null, attributes); + /** + * @member {string} FeatureVector.prototype.fid + * @description fid + */ + this.fid = null; + + /** + * @member {Geometry} FeatureVector.prototype.geometry + * @description 存放几何信息。 + */ + this.geometry = geometry ? geometry : null; + + /** + * @member {Object} FeatureVector.prototype.attributes + * @description 描述要素的任意的可序列化属性。 + */ + this.attributes = {}; + + if (attributes) { + this.attributes = Util.extend(this.attributes, attributes); + } + + /** + * @member {Bounds} FeatureVector.prototype.bounds + * @description 限制要素几何的边界。 + */ + this.bounds = null; + + /** + * @member {string} FeatureVector.prototype.state + * @description state + */ + this.state = null; + + /** + * @member {Object} FeatureVector.prototype.style + * @description 要素的样式属性,地图查询返回的 feature 的 style,8C 变为null。 + */ + this.style = style ? style : null; + + /** + * @member {string} FeatureVector.prototype.url + * @description 如果设置了这个属性,在更新或者删除要素时需要考虑 {@link HTTP} 。 + */ + this.url = null; + + this.lonlat = null; + + this.CLASS_NAME = "SuperMap.Feature.Vector"; + + Vector.style = { + 'default': { + fillColor: "#ee9900", + fillOpacity: 0.4, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "#ee9900", + strokeOpacity: 1, + strokeWidth: 1, + strokeLinecap: "round", + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + cursor: "inherit", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + }, + 'select': { + fillColor: "blue", + fillOpacity: 0.4, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "blue", + strokeOpacity: 1, + strokeWidth: 2, + strokeLinecap: "round", + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + cursor: "pointer", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + + }, + 'temporary': { + fillColor: "#66cccc", + fillOpacity: 0.2, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "#66cccc", + strokeOpacity: 1, + strokeLinecap: "round", + strokeWidth: 2, + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + //cursor:"inherit", + cursor: "default", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + + }, + 'delete': { + display: "none" + } + }; + } + + /** + * @function FeatureVector.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + if (this.layer) { + this.layer.removeFeatures(this); + this.layer = null; + } + + this.geometry = null; + super.destroy(); + } + + /** + * @function FeatureVector.prototype.clone + * @description 复制矢量要素,并返回复制后的新对象。 + * @returns {FeatureVector} 相同要素的新的矢量要素。 + */ + clone() { + return new Vector( + this.geometry ? this.geometry.clone() : null, + this.attributes, + this.style); + } + + /** + * @function FeatureVector.prototype.toState + * @description 设置新状态。 + * @param {string} state - 状态。 + */ + toState(state) { + if (state === State.UPDATE) { + switch (this.state) { + case State.UNKNOWN: + case State.DELETE: + this.state = state; + break; + case State.UPDATE: + case State.INSERT: + break; + } + } else if (state === State.INSERT) { + switch (this.state) { + case State.UNKNOWN: + break; + default: + this.state = state; + break; + } + } else if (state === State.DELETE) { + switch (this.state) { + case State.INSERT: + // the feature should be destroyed + break; + case State.DELETE: + break; + case State.UNKNOWN: + case State.UPDATE: + this.state = state; + break; + } + } else if (state === State.UNKNOWN) { + this.state = state; + } + } +} +/** + * + * @typedef {Object} FeatureVector.style + * @description Feature 有大量的样式属性,如果没有特别的指定将使用默认的样式, + * 大部分样式通过 SVG 标准定义属性。 + * - fill properties 资料介绍:{@link http://www.w3.org/TR/SVG/painting.html#FillProperties} + * - stroke properties 资料介绍:{@link http://www.w3.org/TR/SVG/painting.html#StrokeProperties} + * @property {boolean} [fill] - 不需要填充则设置为 false。 + * @property {string} [fillColor='#ee9900'] - 十六进制填充颜色。 + * @property {number} [fillOpacity=0.4] - 填充不透明度。 + * @property {boolean} [stroke] - 不需要描边则设为 false。 + * @property {string} [strokeColor='#ee9900'] - 十六进制描边颜色。 + * @property {number} [strokeOpacity=0.4] - 描边的不透明度(0-1)。 + * @property {number} [strokeWidth=1] - 像素描边宽度。 + * @property {string} [strokeLinecap='round'] - strokeLinecap 有三种类型 butt,round,square。 + * @property {string} [strokeDashstyle='solid'] - 有 dot,dash,dashdot,longdash,longdashdot,solid 几种样式。 + * @property {boolean} [graphic] - 不需要则设置为 false。 + * @property {number} [pointRadius=6] - 像素点半径。 + * @property {string} [pointerEvents='visiblePainted'] - pointerEvents。 + * @property {string} [cursor] - cursor。 + * @property {boolean} [allowRotate='false'] - 是否允许图标随着运行方向旋转。用于时空数据图层。 + * @property {string} [externalGraphic] - 连接到用来渲染点的外部的图形。 + * @property {number} [graphicWidth] - 外部图表的像素宽度。 + * @property {number} [graphicHeight] - 外部图表的高宽度。 + * @property {number} [graphicOpacity] - 外部图表的不透明度(0-1)。 + * @property {number} [graphicXOffset] - 外部图表沿着x方向的偏移量。 + * @property {number} [graphicYOffset] - 外部图表沿着y方向的偏移量 Pixel。 + * @property {number} [rotation] - 一个图表沿着其中心点(或者偏移中心指定点)在顺时针方向旋转。 + * @property {number} [graphicZIndex] - 渲染时使用的索引值。 + * @property {string} [graphicName='circle'] - 渲染点时图标使用的名字。支持"circle" , "square", "star", "x", "cross", "triangle"。 + * @property {string} [graphicTitle] - 外部图表的提示框。 + * @property {string} [backgroundGraphic] - 外部图表的背景。 + * @property {number} [backgroundGraphicZIndex] - 背景图渲染时使用的索引值。 + * @property {number} [backgroundXOffset] - 背景图在 x 轴的偏移量。 + * @property {number} [backgroundYOffset] - 背景图在 y 轴的偏移量。 + * @property {number} [backgroundHeight] - 背景图的高度。如果没有设置,将用 graphicHeight。 + * @property {number} [backgroundWidth] - 背景图的宽度。如果没有设置,将用 graphicWidth。 + * @property {boolean} [isUnicode=false] - 这个属性要配合 label 属性来用,当为 true时,label 就可以使用 unicode 编码, + * 比如 "a" 的 unicode 十六进制编码为 61,则 label 属性可以为 "a",其中 "&#" 为前缀,标志这个为 unicode 编码, + * "x" 是指 16 进制,这时页面显示的是 "a";当此值为 false 的时候,label 的内容会被直接输出, + * 比如,label 为 "a",这时页面显示的也是 "a"。 + * @property {string} [label] - 可选的标签文本。 + * @property {string} [labelAlign='cm'] - 标签对齐,是由两个字符组成的字符串,如:"lt", "cm", "rb", + * 其中第一个字符代表水平方向上的对齐,"l"=left, "c"=center, "r"=right; + * 第二个字符代表垂直方向上的对齐,"t"=top, "m"=middle, "b"=bottom。 + * @property {number} [labelXOffset] - 标签在 x 轴方向的偏移量。 + * @property {number} [labelYOffset] - 标签在 y 轴方向的偏移量。 + * @property {boolean} [labelSelect=false] - 如果设为 true,标签可以选用 SelectFeature 或者 similar 控件。 + * @property {string} [fontColor='#000000'] - 标签字体颜色。 + * @property {number} [fontOpacity] - 标签透明度 (0-1)。 + * @property {string} [fontFamily] - 标签的字体类型。 + * @property {string} [fontSize] - 标签的字体大小。 + * @property {string} [fontStyle] - 标签的字体样式。 + * @property {string} [fontWeight] - 标签的字体粗细。 + * @property {string} [display] - 如果 display 属性设置为 “none”,符号将没有任何效果。 + * @example + * // label的用法如下: + * function addGeoTest(){ + * var geometry = new GeometryPoint(105, 35); + * var pointFeature = new FeatureVector(geometry); + * var styleTest = { + * label:"supermap", + * fontColor:"#0000ff", + * fontOpacity:"0.5", + * fontFamily:"隶书", + * fontSize:"8em", + * fontWeight:"bold", + * fontStyle:"italic", + * labelSelect:"true", + * } + * pointFeature.style = styleTest; + * vectorLayer.addFeatures([pointFeature]); + * } + */ + + + +;// CONCATENATED MODULE: ./src/common/commontypes/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/format/Format.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Format + * @deprecatedclass SuperMap.Format + * @classdesc 读写各种格式的格式类基类。其子类应该包含并实现 read 和 write 方法。 + * @category BaseTypes Format + * @param {Object} options - 可选参数。 + * @param {boolean} [options.keepData=false] - 如果设置为 true, data 属性会指向被解析的对象(例如 JSON 或 xml 数据对象)。 + * @param {Object} [options.data] - 当 keepData 属性设置为 true,这是传递给 read 操作的要被解析的字符串。 + * @usage + */ +class Format { + + + constructor(options) { + /** + * @member {Object} Format.prototype.data + * @description 当 keepData 属性设置为 true,这是传递给 read 操作的要被解析的字符串。 + */ + this.data = null; + + /** + * @member {Object} [Format.prototype.keepData=false] + * @description 保持最近读到的数据的引用(通过 data 属性)。 + */ + this.keepData = false; + + Util.extend(this, options); + this.options = options; + + this.CLASS_NAME = "SuperMap.Format"; + } + + /** + * @function Format.prototype.destroy + * @description 销毁该格式类,释放相关资源。 + */ + destroy() { + //用来销毁该格式类,释放相关资源 + } + + /** + * @function Format.prototype.read + * @description 来从字符串中读取数据。 + * @param {string} data - 读取的数据。 + */ + read(data) { // eslint-disable-line no-unused-vars + //用来从字符串中读取数据 + } + + /** + * @function Format.prototype.write + * @description 将对象写成字符串。 + * @param {Object} object - 可序列化的对象。 + * @returns {string} 对象转化后的字符串。 + */ + write(object) { // eslint-disable-line no-unused-vars + //用来写字符串 + } +} + +;// CONCATENATED MODULE: ./src/common/format/JSON.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class JSONFormat + * @aliasclass Format.JSON + * @deprecatedclass SuperMap.Format.JSON + * @classdesc 安全的读写 JSON 的解析类。使用 {@link JSONFormat} 构造函数创建新实例。 + * @category BaseTypes Format + * @param {Object} [options] - 可选参数。 + * @param {string} [options.indent=" "] - 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + * @param {string} [options.space=" "] - 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + * @param {string} [options.newline="\n"] - 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + * @param {number} [options.level=0] - 用于格式化输出, 表示的是缩进级别。 + * @param {boolean} [options.pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @param {boolean} [options.nativeJSON] - 需要被注册的监听器对象。 + * @extends {Format} + * @usage + */ +class JSONFormat extends Format { + + constructor(options) { + super(options); + /** + * @member {string} [JSONFormat.prototype.indent=" "] + * @description 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + */ + this.indent = " "; + + /** + * @member {string} [JSONFormat.prototype.space=" "] + * @description 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + */ + this.space = " "; + + /** + * @member {string} [JSONFormat.prototype.newline="\n"] + * @description 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + */ + this.newline = "\n"; + + /** + * @member {number} [JSONFormat.prototype.level=0] + * @description 用于格式化输出, 表示的是缩进级别。 + */ + this.level = 0; + + /** + * @member {boolean} [JSONFormat.prototype.pretty=false] + * @description 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + */ + this.pretty = false; + + /** + * @member {boolean} JSONFormat.prototype.nativeJSON + * @description 判断浏览器是否原生支持 JSON 格式数据。 + */ + this.nativeJSON = (function () { + return !!(window.JSON && typeof JSON.parse === "function" && typeof JSON.stringify === "function"); + })(); + + this.CLASS_NAME = "SuperMap.Format.JSON"; + /** + * @member JSONFormat.prototype.serialize + * @description 提供一些类型对象转 JSON 字符串的方法。 + */ + this.serialize = { + /** + * @function JSONFormat.serialize.object + * @description 把对象转换为 JSON 字符串。 + * @param {Object} object - 可序列化的对象。 + * @returns {string} JSON 字符串。 + */ + 'object': function (object) { + // three special objects that we want to treat differently + if (object == null) { + return "null"; + } + if (object.constructor === Date) { + return this.serialize.date.apply(this, [object]); + } + if (object.constructor === Array) { + return this.serialize.array.apply(this, [object]); + } + var pieces = ['{']; + this.level += 1; + var key, keyJSON, valueJSON; + + var addComma = false; + for (key in object) { + if (object.hasOwnProperty(key)) { + // recursive calls need to allow for sub-classing + keyJSON = this.write.apply(this, + [key, this.pretty]); + valueJSON = this.write.apply(this, + [object[key], this.pretty]); + if (keyJSON != null && valueJSON != null) { + if (addComma) { + pieces.push(','); + } + pieces.push(this.writeNewline(), this.writeIndent(), + keyJSON, ':', this.writeSpace(), valueJSON); + addComma = true; + } + } + } + + this.level -= 1; + pieces.push(this.writeNewline(), this.writeIndent(), '}'); + return pieces.join(''); + }, + + /** + * @function JSONFormat.serialize.array + * @description 把数组转换成 JSON 字符串。 + * @param {Array} array - 可序列化的数组。 + * @returns {string} JSON 字符串。 + */ + 'array': function (array) { + var json; + var pieces = ['[']; + this.level += 1; + + for (var i = 0, len = array.length; i < len; ++i) { + // recursive calls need to allow for sub-classing + json = this.write.apply(this, + [array[i], this.pretty]); + if (json != null) { + if (i > 0) { + pieces.push(','); + } + pieces.push(this.writeNewline(), this.writeIndent(), json); + } + } + + this.level -= 1; + pieces.push(this.writeNewline(), this.writeIndent(), ']'); + return pieces.join(''); + }, + + /** + * @function JSONFormat.serialize.string + * @description 把字符串转换成 JSON 字符串。 + * @param {string} string - 可序列化的字符串。 + * @returns {string} JSON 字符串。 + */ + 'string': function (string) { + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can simply slap some quotes around it. + // Otherwise we must also replace the offending characters with safe + // sequences. + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"': '\\"', + '\\': '\\\\' + }; + /*eslint-disable no-control-regex*/ + if (/["\\\x00-\x1f]/.test(string)) { + return '"' + string.replace(/([\x00-\x1f\\"])/g, function (a, b) { + var c = m[b]; + if (c) { + return c; + } + c = b.charCodeAt(); + return '\\u00' + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + '"'; + } + return '"' + string + '"'; + }, + + /** + * @function JSONFormat.serialize.number + * @description 把数字转换成 JSON 字符串。 + * @param {number} number - 可序列化的数字。 + * @returns {string} JSON 字符串。 + */ + 'number': function (number) { + return isFinite(number) ? String(number) : "null"; + }, + + /** + * @function JSONFormat.serialize.boolean + * @description Transform a boolean into a JSON string. + * @param {boolean} bool - The boolean to be serialized. + * @returns {string} A JSON string representing the boolean. + */ + 'boolean': function (bool) { + return String(bool); + }, + + /** + * @function JSONFormat.serialize.object + * @description 将日期对象转换成 JSON 字符串。 + * @param {Date} date - 可序列化的日期对象。 + * @returns {string} JSON 字符串。 + */ + 'date': function (date) { + function format(number) { + // Format integers to have at least two digits. + return (number < 10) ? '0' + number : number; + } + + return '"' + date.getFullYear() + '-' + + format(date.getMonth() + 1) + '-' + + format(date.getDate()) + 'T' + + format(date.getHours()) + ':' + + format(date.getMinutes()) + ':' + + format(date.getSeconds()) + '"'; + } + }; + } + + /** + * @function JSONFormat.prototype.read + * @description 将一个符合 JSON 结构的字符串进行解析。 + * @param {string} json - 符合 JSON 结构的字符串。 + * @param {function} filter - 过滤方法,最终结果的每一个键值对都会调用该过滤方法,并在对应的值的位置替换成该方法返回的值。 + * @returns {(Object|string|Array|number|boolean)} 对象,数组,字符串或数字。 + */ + read(json, filter) { + var object; + if (this.nativeJSON) { + try { + object = JSON.parse(json, filter); + } catch (e) { + // Fall through if the regexp test fails. + } + } + + if (this.keepData) { + this.data = object; + } + + return object; + } + + /** + * @function JSONFormat.prototype.write + * @description 序列化一个对象到一个符合 JSON 格式的字符串。 + * @param {Object|string|Array|number|boolean} value - 需要被序列化的对象,数组,字符串,数字,布尔值。 + * @param {boolean} [pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @returns {string} 符合 JSON 格式的字符串。 + * + */ + write(value, pretty) { + this.pretty = !!pretty; + var json = null; + var type = typeof value; + if (this.serialize[type]) { + try { + json = (!this.pretty && this.nativeJSON) ? + JSON.stringify(value) : + this.serialize[type].apply(this, [value]); + } catch (err) { + //console.error("Trouble serializing: " + err); + } + } + return json; + } + + /** + * @function JSONFormat.prototype.writeIndent + * @description 根据缩进级别输出一个缩进字符串。 + * @private + * @returns {string} 一个适当的缩进字符串。 + */ + writeIndent() { + var pieces = []; + if (this.pretty) { + for (var i = 0; i < this.level; ++i) { + pieces.push(this.indent); + } + } + return pieces.join(''); + } + + /** + * @function JSONFormat.prototype.writeNewline + * @description 在格式化输出模式情况下输出代表新一行的字符串。 + * @private + * @returns {string} 代表新的一行的字符串。 + */ + writeNewline() { + return (this.pretty) ? this.newline : ''; + } + + /** + * @function JSONFormat.prototype.writeSpace + * @private + * @description 在格式化输出模式情况下输出一个代表空格的字符串。 + * @returns {string} 空格字符串。 + */ + writeSpace() { + return (this.pretty) ? this.space : ''; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ServerColor.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ServerColor + * @deprecatedclass SuperMap.ServerColor + * @category iServer Map Theme + * @classdesc 颜色类。该类使用三原色( RGB )来表达颜色。 + * @param {Object} options - 可选参数。 + * @param {number} [options.red=255] - 获取或设置红色值。 + * @param {number} [options.green=0] - 获取或设置绿色值。 + * @param {number} [options.blue=0] - 获取或设置蓝色值。 + * @usage + */ +class ServerColor { + + constructor(red, green, blue) { + + /** + * @member {number} [ServerColor.prototype.red=255] + * @description 获取或设置红色值。 + */ + this.red = (!red && red != 0)?255:red; + + /** + * @member {number} [ServerColor.prototype.green=0] + * @description 获取或设置绿色值。 + */ + this.green = green||0; + + /** + * @member {number} [ServerColor.prototype.blue=0] + * @description 获取或设置蓝色值。 + */ + this.blue = blue||0; + + this.CLASS_NAME = "SuperMap.ServerColor"; + } + + /** + * @function ServerColor.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.red = null; + me.green = null; + me.blue = null; + } + + + /** + * @function ServerColor.formJson + * @description 将 JSON 对象转化为 ServerColor 对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerColor} 转化后的 ServerColor 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + var color = new ServerColor(); + var red = 255; + if (jsonObject.red !== null) { + red = Number(jsonObject.red); + } + color.red = red; + + var green = 0; + if (jsonObject.green !== null) { + green = Number(jsonObject.green); + } + color.green = green; + + var blue = 0; + if (jsonObject.blue !== null) { + blue = Number(jsonObject.blue); + } + color.blue = blue; + return color; + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ServerStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ServerStyle + * @deprecatedclass SuperMap.ServerStyle + * @category iServer Map Theme + * @classdesc 服务端矢量要素风格类。该类用于定义点状符号、线状符号、填充符号风格及其相关属性。 + * @param {Object} options - 参数。 + * @param {FillGradientMode} options.fillGradientMode - 渐变填充风格的渐变类型。 + * @param {ServerColor} [options.fillBackColor=[255,255,255]] - 填充背景颜色。 + * @param {boolean} [options.fillBackOpaque=false] - 背景是否不透明。 + * @param {ServerColor} [options.fillForeColor=[255,0,0]] - 填充颜色。 + * @param {number} [options.fillGradientAngle=0] - 渐变填充的旋转角度。 + * @param {number} [options.fillGradientOffsetRatioX=0] - 渐变填充中心点相对于填充区域范围中心点的水平偏移百分比。 + * @param {number} [options.fillGradientOffsetRatioY=0] - 填充中心点相对于填充区域范围中心点的垂直偏移百分比。 + * @param {number} [options.fillOpaqueRate=100] - 填充不透明度。 + * @param {number} [options.fillSymbolID=0] - 填充符号的编码。 + * @param {ServerColor} [options.lineColor] - 矢量要素的边线颜色。默认 lineColor = new ServerColor(0, 0, 0)。 + * @param {number} [options.lineSymbolID=0] - 线状符号的编码。 + * @param {number} [options.lineWidth=1] - 边线的宽度。 + * @param {number} [options.markerAngle=0] - 点状符号的旋转角度。 + * @param {number} [options.markerSize=1] - 点状符号的大小。 + * @param {number} [options.markerSymbolID=-1] - 点状符号的编码。 + * @usage + */ +class ServerStyle { + + constructor(options) { + /** + * @member {ServerColor} ServerStyle.prototype.fillBackColor + * @description 填充背景颜色。当填充模式为渐变填充时,该颜色为填充终止色。 + */ + this.fillBackColor = new ServerColor(255, 255, 255); + + /** + * @member {boolean} [ServerStyle.prototype.fillBackOpaque=false] + * @description 背景是否不透明。false 表示透明。 + */ + this.fillBackOpaque = false; + + /** + * @member {ServerColor} ServerStyle.prototype.fillForeColor + * @description 填充颜色。当填充模式为渐变填充时,该颜色为填充起始颜色。 + */ + this.fillForeColor = new ServerColor(255, 0, 0); + + /** + * @member {FillGradientMode} ServerStyle.prototype.fillGradientMode + * @description 渐变填充风格的渐变类型。 + */ + this.fillGradientMode = null; + + /** + * @member {number} ServerStyle.prototype.fillGradientAngle - + * @description 渐变填充的旋转角度。单位为度,精确到 0.1 度,逆时针方向为正方向。 + */ + this.fillGradientAngle = 0; + + /** + * @member {number} ServerStyle.prototype.fillGradientOffsetRatioX + * @description 渐变填充中心点相对于填充区域范围中心点的水平偏移百分比。它们的关系如下:设填充区域范围中心点的坐标为(x0, y0), + * 填充中心点的坐标为(x, y),填充区域范围的宽度为 a,水平偏移百分比为 dx,则 x=x0 + a*dx/100。 + */ + this.fillGradientOffsetRatioX = 0; + + /** + * @member {number} ServerStyle.prototype.fillGradientOffsetRatioY + * @description 填充中心点相对于填充区域范围中心点的垂直偏移百分比。它们的关系如下:
+ * 设填充区域范围中心点的坐标为(x0, y0),填充中心点的坐标为(x, y),填充区域范围的高度为 b,垂直偏移百分比为 dy,则 y=y0 + b*dx/100。 + */ + this.fillGradientOffsetRatioY = 0; + + /** + * @member {number} [ServerStyle.prototype.fillOpaqueRate=100] + * @description 填充不透明度。合法值为 0 - 100 的数值。其中为 0 表示完全透明; + * 100 表示完全不透明。赋值小于 0 时按照 0 处理,大于 100 时按照 100 处理。 + */ + this.fillOpaqueRate = 100; + + /** + * @member {number} ServerStyle.prototype.fillSymbolID + * @description 填充符号的编码。此编码用于唯一标识各普通填充风格的填充符号。 + * 关于填充符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + this.fillSymbolID = 0; + + /** + * @member {ServerColor} ServerStyle.prototype.lineColor + * @description 矢量要素的边线颜色。如果等级符号是点符号,点符号的颜色由 lineColor 控制。 + */ + this.lineColor = new ServerColor(0, 0, 0); + + /** + * @member {number} [ServerStyle.prototype.lineSymbolID=0] + * @description 线状符号的编码。此编码用于唯一标识各普通填充风格的填充符号。 + * 关于线状符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + this.lineSymbolID = 0; + + /** + * @member {number} [ServerStyle.prototype.lineWidth=1.0] + * @description 边线的宽度。单位为毫米,精度到 0.1。 + */ + this.lineWidth = 1; + + /** + * @member {number} [ServerStyle.prototype.markerAngle=0] + * @description 点状符号的旋转角度。以度为单位,精确到 0.1 度,逆时针方向为正方向。 + */ + this.markerAngle = 0; + + /** + * @member {number} [ServerStyle.prototype.markerSize=1.0] + * @description 点状符号的大小。单位为毫米,精度为 0.1。当该属性设置为0时,采用符号默认大小 1.0 显示。 + * 当该属性设置为非法值时,交由服务器默认处理。 + */ + this.markerSize = 1; + + /** + * @member {number} [ServerStyle.prototype.markerSymbolID=-1] + * @description 点状符号的编码。此编码用于唯一标识各点状符号。 + * 关于线状符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + this.markerSymbolID = -1; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerStyle"; + } + + /** + * @function ServerStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.fillBackColor) { + me.fillBackColor.destroy(); + me.fillBackColor = null; + } + me.fillBackOpaque = null; + + if (me.fillForeColor) { + me.fillForeColor.destroy(); + me.fillForeColor = null; + } + me.fillGradientMode = null; + me.fillGradientAngle = null; + me.fillGradientOffsetRatioX = null; + me.fillGradientOffsetRatioY = null; + me.fillOpaqueRate = null; + me.fillSymbolID = null; + if (me.lineColor) { + me.lineColor.destroy(); + me.lineColor = null; + } + me.lineSymbolID = null; + me.lineWidth = null; + me.markerAngle = null; + me.markerSize = null; + me.markerSymbolID = null; + } + + /** + * @function ServerStyle.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象. + */ + toServerJSONObject() { + var styleObj = {}; + styleObj = Util.copyAttributes(styleObj, this); + //暂时先忽略serverColor往Json的转换 + return styleObj; + } + + /** + * @function ServerStyle.fromJson + * @description 将JSON对象转换为 ServerStyle 对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerStyle} 转化后的 ServerStyle 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + return new ServerStyle({ + fillBackColor: ServerColor.fromJson(jsonObject.fillBackColor), + fillBackOpaque: jsonObject.fillBackOpaque, + fillForeColor: ServerColor.fromJson(jsonObject.fillForeColor), + fillGradientMode: jsonObject.fillGradientMode, + fillGradientAngle: jsonObject.fillGradientAngle, + fillGradientOffsetRatioX: jsonObject.fillGradientOffsetRatioX, + fillGradientOffsetRatioY: jsonObject.fillGradientOffsetRatioY, + fillOpaqueRate: jsonObject.fillOpaqueRate, + fillSymbolID: jsonObject.fillSymbolID, + lineColor: ServerColor.fromJson(jsonObject.lineColor), + lineSymbolID: jsonObject.lineSymbolID, + lineWidth: jsonObject.lineWidth, + markerAngle: jsonObject.markerAngle, + markerSize: jsonObject.markerSize, + markerSymbolID: jsonObject.markerSymbolID + }); + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/PointWithMeasure.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class PointWithMeasure + * @deprecatedclass SuperMap.PointWithMeasure + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由点类。路由点是指具有线性度量值 (Measure) 的二维地理坐标点。 + * @param {Object} options - 参数。 + * @param {number} options.measure - 度量值,即路由对象属性值 M。 + * @param {number} options.x - 地理坐标系下的 X 坐标值。 + * @param {number} options.y - 地理坐标系下的 Y 坐标值。 + * @extends {GeometryPoint} + * @usage + */ +class PointWithMeasure extends Point { + + constructor(options) { + super(options); + + /** + * @member {number} PointWithMeasure.prototype.measure + * @description 度量值,即路由对象属性值 M。 + */ + this.measure = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.PointWithMeasure"; + } + + /** + * @function PointWithMeasure.prototype.equals + * @description 判断两个路由点对象是否相等。如果两个路由点对象具有相同的坐标以及度量值,则认为是相等的。 + * @param {PointWithMeasure} geom - 需要判断的路由点对象。 + * @returns {boolean} 两个路由点对象是否相等(true 为相等,false 为不等)。 + */ + equals(geom) { + var equals = false; + if (geom != null) { + var isValueEquals = this.x === geom.x && this.y === geom.y && this.measure === geom.measure; + var isNaNValue = isNaN(this.x) && isNaN(this.y) && isNaN(this.measure); + var isNaNGeometry = isNaN(geom.x) && isNaN(geom.y) && isNaN(geom.measure); + equals = ( isValueEquals || ( isNaNValue && isNaNGeometry )); + } + return equals; + } + + + /** + * @function PointWithMeasure.prototype.toJson + * @description 转换为 JSON 对象。 + * */ + toJson() { + var result = "{"; + if (this.measure != null && this.measure != undefined) { + result += "\"measure\":" + this.measure + ","; + } + result += "\"x\":" + this.x + ","; + result += "\"y\":" + this.y; + result += "}"; + return result; + } + + + /** + * @function PointWithMeasure.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.measure = null; + me.x = null; + me.y = null; + } + + /** + * @function PointWithMeasure.fromJson + * @description 将 JSON 对象转换为{@link PointWithMeasure} 对象。 + * @param {Object} jsonObject - JSON 对象表示的路由点。 + * @returns {PointWithMeasure} 转化后的 PointWithMeasure 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + return new PointWithMeasure({ + x: jsonObject.x, + y: jsonObject.y, + measure: jsonObject.measure + }); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/Route.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class Route + * @deprecatedclass SuperMap.Route + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 路由对象类。路由对象为一系列有序的带有属性值 M 的 x,y 坐标对,其中 M 值为该结点的距离属性(到已知点的距离)。 + * @param {Array.} points - 形成路由对象的线数组。 + * @param {Object} options - 参数。 + * @param {number} options.id - 路由对象在数据库中的 id。 + * @param {number} options.length - 路由对象的长度。单位与数据集的单位相同。 + * @param {number} [options.maxM] - 最大线性度量值,即所有结点到起始点的量算距离中最大值。 + * @param {number} [options.minM] - 最小线性度量值,即所有结点到起始点的量算距离中最小值。 + * @param {string} [options.type] - 数据类型,如:"LINEM"。 + * @extends GeometryCollection + * @usage + */ +class Route extends Collection { + + constructor(points, options) { + super(points, options); + + /** + * @member {number} Route.prototype.id + * @description 路由对象在数据库中的 ID。 + */ + this.id = null; + + /** + * @member {number} Route.prototype.center + * @description 路由对象的中心点。 + */ + this.center = null; + + /** + * @member {string} Route.prototype.style + * @description 路由对象的样式。 + */ + this.style = null; + + /** + * @member {number} Route.prototype.length + * @description 路由对象的长度。单位与数据集的单位相同。 + */ + this.length = null; + + /** + * @member {number} Route.prototype.maxM + * @description 最大线性度量值,即所有结点到起始点的量算距离中最大值。 + */ + this.maxM = null; + + /** + * @member {number} Route.prototype.minM + * @description 最小线性度量值,即所有结点到起始点的量算距离中最小值。 + */ + this.minM = null; + + /** + * @member {Array.} Route.prototype.parts + * @description 服务端几何对象中各个子对象所包含的节点个数。 + */ + this.parts = null; + + /** + * @member {Array.} Route.prototype.points + * @description 路由对象的所有路由点。 + * @example + * (start code) + * [ + * { + * "measure": 0, + * "y": -4377.027184298267, + * "x": 4020.0045221720466 + * }, + * { + * "measure": 37.33288381391519, + * "y": -4381.569363260499, + * "x": 4057.0600591960642 + * } + * ] + * (end) + */ + this.points = null; + + /** + * @member {string} Route.prototype.type + * @description 服务端几何对象类型。 + */ + this.type = null; + + /** + * @member {Array.} [Route.prototype.componentTypes=LineString] + * @description components 存储的的几何对象所支持的几何类型数组。 + */ + this.componentTypes = ["SuperMap.Geometry.LinearRing", "SuperMap.Geometry.LineString"]; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.Route"; + this.geometryType = "LINEM"; + } + + /** + * + * @function Route.prototype.toJson + * @description 转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + toJson() { + var result = "{"; + if (this.id != null && this.id != undefined) { + result += "\"id\":" + this.id + ","; + } + if (this.center != null && this.center != undefined) { + result += "\"center\":" + this.center + ","; + } + if (this.style != null && this.style != undefined) { + result += "\"style\":" + this.style + ","; + } + if (this.length != null && this.length != undefined) { + result += "\"length\":" + this.length + ","; + } + if (this.maxM != null && this.maxM != undefined) { + result += "\"maxM\":" + this.maxM + ","; + } + if (this.minM != null && this.minM != undefined) { + result += "\"minM\":" + this.minM + ","; + } + if (this.type != null && this.type != undefined) { + result += "\"type\":\"" + this.type + "\","; + } + if (this.parts != null && this.parts != undefined) { + result += "\"parts\":[" + this.parts[0]; + + for (var i = 1; i < this.parts.length; i++) { + result += "," + this.parts[i]; + } + result += "],"; + } + if (this.components != null && this.components.length > 0) { + result += "\"points\":["; + for (var j = 0, len = this.components.length; j < len; j++) { + for (var k = 0, len2 = this.components[j].components.length; k < len2; k++) { + result += this.components[j].components[k].toJson() + ","; + } + } + result = result.replace(/,$/g, ''); + result += "]"; + } + result = result.replace(/,$/g, ''); + result += "}"; + return result; + } + + + /** + * @function Route.prototype.destroy + * @override + */ + destroy() { + var me = this; + me.id = null; + me.center = null; + me.style = null; + me.length = null; + me.maxM = null; + me.minM = null; + me.type = null; + me.parts = null; + me.components.length = 0; + me.components = null; + me.componentTypes = null; + } + + + /** + * @function Route.fromJson + * @description 将 JSON 对象转换为 Route 对象。 + * @param {Object} [jsonObject] - JSON 对象表示的路由对象。 + * @returns {Route} 转化后的 Route 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + var geoParts = jsonObject.parts || [], + geoPoints = jsonObject.points || [], + len = geoParts.length, + lineList = []; + if (len > 0) { + for (var i = 0, pointIndex = 0, pointList = []; i < len; i++) { + for (var j = 0; j < geoParts[i]; j++) { + pointList.push(PointWithMeasure.fromJson(geoPoints[pointIndex + j])); + } + pointIndex += geoParts[i]; + //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + if (pointList[0].equals(pointList[geoParts[i] - 1])) { + lineList.push(new LinearRing(pointList)); + } else { + lineList.push(new LineString(pointList)); + } + pointList = []; + } + + } else { + return null; + } + + return new Route(lineList, { + id: jsonObject.id, + center: jsonObject.center, + style: jsonObject.style, + length: jsonObject.length, + maxM: jsonObject.maxM, + minM: jsonObject.minM, + type: jsonObject.type, + parts: jsonObject.parts + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ServerGeometry.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +/** + * @class ServerGeometry + * @deprecatedclass SuperMap.ServerGeometry + * @category iServer Data Feature + * @classdesc 服务端几何对象类。该类描述几何对象(矢量)的特征数据(坐标点对、几何对象的类型等)。基于服务端的空间分析、空间关系运算、查询等 GIS 服务功能使用服务端几何对象。 + * @param {Object} options - 参数。 + * @param {string} options.id - 服务端几何对象唯一标识符。 + * @param {Array.} options.parts - 服务端几何对象中各个子对象所包含的节点个数。 + * @param {Array.} options.points - 组成几何对象的节点的坐标对数组。 + * @param {GeometryType} options.type - 几何对象的类型。 + * @param {ServerStyle} [options.style] - 服务端几何对象的风格。 + * @usage + */ +class ServerGeometry { + constructor(options) { + /** + * @member {string} ServerGeometry.prototype.id + * @description 服务端几何对象唯一标识符。 + */ + this.id = 0; + + /** + * @member {ServerStyle} [ServerGeometry.prototype.style] + * @description 服务端几何对象的风格(ServerStyle)。 + */ + this.style = null; + + /** + * @member {Array.} ServerGeometry.prototype.parts + * @description 服务端几何对象中各个子对象所包含的节点个数。
+ * 1.几何对象从结构上可以分为简单几何对象和复杂几何对象。 + * 简单几何对象与复杂几何对象的区别:简单的几何对象一般为单一对象, + * 而复杂的几何对象由多个简单对象组成或经过一定的空间运算之后产生, + * 如:矩形为简单的区域对象,而中空的矩形为复杂的区域对象。
+ * 2.通常情况,一个简单几何对象的子对象就是它本身, + * 因此对于简单对象来说的该字段为长度为1的整型数组, + * 该字段的值就是这个简单对象节点的个数。 + * 如果一个几何对象是由几个简单对象组合而成的, + * 例如,一个岛状几何对象由 3 个简单的多边形组成而成, + * 那么这个岛状的几何对象的 Parts 字段值就是一个长度为 3 的整型数组, + * 数组中每个成员的值分别代表这三个多边形所包含的节点个数。 + */ + this.parts = null; + + /** + * @member {Array.} ServerGeometry.prototype.points + * @description 组成几何对象的节点的坐标对数组。
+ * 1.所有几何对象(点、线、面)都是由一些简单的点坐标组成的, + * 该字段存放了组成几何对象的点坐标的数组。 + * 对于简单的面对象,他的起点和终点的坐标点相同。
+ * 2.对于复杂的几何对象,根据 Parts 属性来确定每一个组成复杂几何对象的简单对象所对应的节点的个数, + * 从而确定 Points 字段中坐标对的分配归属问题。 + */ + this.points = null; + + /** + * @member {GeometryType} ServerGeometry.prototype.type + * @description 几何对象的类型(GeometryType)。 + */ + this.type = null; + + /** + * @member {Object} ServerGeometry.prototype.prjCoordSys + * @description 投影坐标参数,现仅在缓冲区分析中有效。 + */ + this.prjCoordSys = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = 'SuperMap.ServerGeometry'; + } + + /** + * @function ServerGeometry.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.id = null; + me.style = null; + me.parts = null; + me.partTopo = null; + me.points = null; + me.type = null; + me.prjCoordSys = null; + } + + /** + * @function ServerGeometry.prototype.toGeometry + * @description 将服务端几何对象 ServerGeometry 转换为客户端几何对象 Geometry。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeometry() { + var me = this, + geoType = me.type; + switch (geoType.toUpperCase()) { + case GeometryType.POINT: + return me.toGeoPoint(); + case GeometryType.LINE: + return me.toGeoLine(); + case GeometryType.LINEM: + return me.toGeoLinem(); + case GeometryType.REGION: + return me.toGeoRegion(); + case GeometryType.POINTEPS: + return me.toGeoPoint(); + case GeometryType.LINEEPS: + return me.toGeoLineEPS(); + case GeometryType.REGIONEPS: + return me.toGeoRegionEPS(); + case GeometryType.GEOCOMPOUND: + return me.transformGeoCompound(); + } + } + + /** + * @function ServerGeometry.prototype.toGeoPoint + * @description 将服务端的点几何对象转换为客户端几何对象。包括 Point、MultiPoint。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoPoint() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + len = geoParts.length; + if (len > 0) { + if (len === 1) { + return new Point(geoPoints[0].x, geoPoints[0].y); + } else { + var pointList = []; + for (let i = 0; i < len; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + return new MultiPoint(pointList); + } + } else { + return null; + } + } + + /** + * @function ServerGeometry.prototype.toGeoLine + * @description 将服务端的线几何对象转换为客户端几何对象。包括 GeometryLinearRing、GeometryLineString、GeometryMultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoLine() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + len = geoParts.length; + if (len > 0) { + if (len === 1) { + let pointList = []; + for (let i = 0; i < geoParts[0]; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + if (pointList[0].equals(pointList[geoParts[0] - 1])) { + return new LinearRing(pointList); + } else { + return new LineString(pointList); + } + } else { + let lineList = []; + for (let i = 0; i < len; i++) { + let pointList = []; + for (let j = 0; j < geoParts[i]; j++) { + pointList.push(new Point(geoPoints[j].x, geoPoints[j].y)); + } + lineList.push(new LineString(pointList)); + geoPoints.splice(0, geoParts[i]); + } + return new MultiLineString(lineList); + } + } else { + return null; + } + } + + /** + * @function ServerGeometry.prototype.toGeoLineEPS + * @description 将服务端的线几何对象转换为客户端几何对象。包括 GeometryLinearRing、GeometryLineString、GeometryMultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoLineEPS() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + i, + j, + pointList, + lineList, + lineEPS, + len = geoParts.length; + if (len > 0) { + if (len === 1) { + for (i = 0, pointList = []; i < geoParts[0]; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y, geoPoints[i].type)); + } + //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + if (pointList[0].equals(pointList[geoParts[0] - 1])) { + lineEPS = LineString.createLineEPS(pointList); + return new LinearRing(lineEPS); + } else { + lineEPS = LineString.createLineEPS(pointList); + return new LineString(lineEPS); + } + } else { + for (i = 0, lineList = []; i < len; i++) { + for (j = 0, pointList = []; j < geoParts[i]; j++) { + pointList.push(new Point(geoPoints[j].x, geoPoints[j].y)); + } + lineEPS = LineString.createLineEPS(pointList); + lineList.push(new LineString(lineEPS)); + geoPoints.splice(0, geoParts[i]); + } + return new MultiLineString(lineList); + } + } else { + return null; + } + } + + /** + * @function ServerGeometry.prototype.toGeoLinem + * @description 将服务端的路由线几何对象转换为客户端几何对象。包括 LinearRing、LineString、MultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoLinem() { + var me = this; + return Route.fromJson(me); + } + + /** + * @function ServerGeometry.prototype.toGeoRegion + * @description 将服务端的面几何对象转换为客户端几何对象。类型为 GeometryPolygon。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoRegion() { + var me = this, + geoParts = me.parts || [], + geoTopo = me.partTopo || [], + geoPoints = me.points || [], + len = geoParts.length; + if (len <= 0) { + return null; + } + var polygonArray = []; + var pointList = []; + if (len == 1) { + for (let i = 0; i < geoPoints.length; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + polygonArray.push(new Polygon([new LinearRing(pointList)])); + return new MultiPolygon(polygonArray); + } + //处理复杂面 + var CCWArray = []; + var areaArray = []; + var polygonArrayTemp = []; + var polygonBounds = []; + //polyon岛洞标识数组,初始都是岛。 + var CCWIdent = []; + for (let i = 0, pointIndex = 0; i < len; i++) { + for (let j = 0; j < geoParts[i]; j++) { + pointList.push(new Point(geoPoints[pointIndex + j].x, geoPoints[pointIndex + j].y)); + } + pointIndex += geoParts[i]; + var polygon = new Polygon([new LinearRing(pointList)]); + pointList = []; + polygonArrayTemp.push(polygon); + if (geoTopo.length === 0) { + polygonBounds.push(polygon.getBounds()); + } + CCWIdent.push(1); + areaArray.push(polygon.getArea()); + } + //iServer 9D新增字段 + if (geoTopo.length === 0) { + //根据面积排序 + ServerGeometry.bubbleSort(areaArray, polygonArrayTemp, geoTopo, polygonBounds); + //岛洞底层判断原则:将所有的子对象按照面积排序,面积最大的直接判定为岛(1),从面积次大的开始处理, + // 如果发现该对象在某个面积大于它的对象之中(即被包含),则根据包含它的对象的标识(1 or -1),指定其标识(-1 or 1), + // 依次处理完所有对象,就得到了一个标识数组,1表示岛,-1表示洞 + //目标polygon索引列表 -1标示没有被任何polygon包含, + var targetArray = []; + for (let i = 1; i < polygonArrayTemp.length; i++) { + for (let j = i - 1; j >= 0; j--) { + targetArray[i] = -1; + if (polygonBounds[j].containsBounds(polygonBounds[i])) { + CCWIdent[i] = CCWIdent[j] * -1; + if (CCWIdent[i] < 0) { + targetArray[i] = j; + } + break; + } + } + } + for (let i = 0; i < polygonArrayTemp.length; i++) { + if (CCWIdent[i] > 0) { + polygonArray.push(polygonArrayTemp[i]); + } else { + polygonArray[targetArray[i]].components = polygonArray[targetArray[i]].components.concat( + polygonArrayTemp[i].components + ); + //占位 + polygonArray.push(''); + } + } + } else { + polygonArray = new Array(); + for (let i = 0; i < polygonArrayTemp.length; i++) { + if (geoTopo[i] && geoTopo[i] == -1) { + CCWArray = CCWArray.concat(polygonArrayTemp[i].components); + } else { + if (CCWArray.length > 0 && polygonArray.length > 0) { + polygonArray[polygonArray.length - 1].components = + polygonArray[polygonArray.length - 1].components.concat(CCWArray); + CCWArray = []; + } + polygonArray.push(polygonArrayTemp[i]); + } + if (i == len - 1) { + var polyLength = polygonArray.length; + if (polyLength) { + polygonArray[polyLength - 1].components = + polygonArray[polyLength - 1].components.concat(CCWArray); + } else { + for (let k = 0, length = CCWArray.length; k < length; k++) { + polygonArray.push(new Polygon(CCWArray)); + } + } + } + } + } + return new MultiPolygon(polygonArray); + } + + /** + * @function ServerGeometry.prototype.toGeoRegionEPS + * @description 将服务端的面几何对象转换为客户端几何对象。类型为 Polygon。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + toGeoRegionEPS() { + var me = this, + geoParts = me.parts || [], + geoTopo = me.partTopo || [], + geoPoints = me.points || [], + len = geoParts.length; + + if (len <= 0) { + return null; + } + var polygonArray = []; + var pointList = []; + var lineEPS; + if (len == 1) { + for (var i = 0; i < geoPoints.length; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + + lineEPS = LineString.createLineEPS(pointList); + polygonArray.push(new Polygon([new LinearRing(lineEPS)])); + return new MultiPolygon(polygonArray); + } + //处理复杂面 + var CCWArray = []; + var areaArray = []; + var polygonArrayTemp = []; + var polygonBounds = []; + //polyon岛洞标识数组,初始都是岛。 + var CCWIdent = []; + for (let i = 0, pointIndex = 0; i < len; i++) { + for (let j = 0; j < geoParts[i]; j++) { + pointList.push(new Point(geoPoints[pointIndex + j].x, geoPoints[pointIndex + j].y)); + } + pointIndex += geoParts[i]; + + lineEPS = LineString.createLineEPS(pointList); + var polygon = new Polygon([new LinearRing(lineEPS)]); + pointList = []; + polygonArrayTemp.push(polygon); + if (geoTopo.length === 0) { + polygonBounds.push(polygon.getBounds()); + } + CCWIdent.push(1); + areaArray.push(polygon.getArea()); + } + //iServer 9D新增字段 + if (geoTopo.length === 0) { + //根据面积排序 + ServerGeometry.bubbleSort(areaArray, polygonArrayTemp, geoTopo, polygonBounds); + //岛洞底层判断原则:将所有的子对象按照面积排序,面积最大的直接判定为岛(1),从面积次大的开始处理, + // 如果发现该对象在某个面积大于它的对象之中(即被包含),则根据包含它的对象的标识(1 or -1),指定其标识(-1 or 1), + // 依次处理完所有对象,就得到了一个标识数组,1表示岛,-1表示洞 + //目标polygon索引列表 -1标示没有被任何polygon包含, + var targetArray = []; + for (let i = 1; i < polygonArrayTemp.length; i++) { + for (let j = i - 1; j >= 0; j--) { + targetArray[i] = -1; + if (polygonBounds[j].containsBounds(polygonBounds[i])) { + CCWIdent[i] = CCWIdent[j] * -1; + if (CCWIdent[i] < 0) { + targetArray[i] = j; + } + break; + } + } + } + for (let i = 0; i < polygonArrayTemp.length; i++) { + if (CCWIdent[i] > 0) { + polygonArray.push(polygonArrayTemp[i]); + } else { + polygonArray[targetArray[i]].components = polygonArray[targetArray[i]].components.concat( + polygonArrayTemp[i].components + ); + //占位 + polygonArray.push(''); + } + } + } else { + polygonArray = new Array(); + for (let i = 0; i < polygonArrayTemp.length; i++) { + if (geoTopo[i] && geoTopo[i] == -1) { + CCWArray = CCWArray.concat(polygonArrayTemp[i].components); + } else { + if (CCWArray.length > 0 && polygonArray.length > 0) { + polygonArray[polygonArray.length - 1].components = + polygonArray[polygonArray.length - 1].components.concat(CCWArray); + CCWArray = []; + } + polygonArray.push(polygonArrayTemp[i]); + } + if (i == len - 1) { + var polyLength = polygonArray.length; + if (polyLength) { + polygonArray[polyLength - 1].components = + polygonArray[polyLength - 1].components.concat(CCWArray); + } else { + for (let k = 0, length = CCWArray.length; k < length; k++) { + polygonArray.push(new Polygon(CCWArray)); + } + } + } + } + } + return new MultiPolygon(polygonArray); + } + transformGeoCompound() { + const me = this, + geoParts = me.geoParts || [], + len = geoParts.length; + if (len <= 0) { + return null; + } + const geometryList = []; + for (let index = 0; index < len; index++) { + const geometry = geoParts[index]; + geometryList.push(new ServerGeometry(geometry).toGeometry()); + } + return new Collection(geometryList); + } + + /** + * @function ServerGeometry.prototype.fromJson + * @description 将 JSON 对象表示服务端几何对象转换为 ServerGeometry。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerGeometry} 转换后的 ServerGeometry 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + return new ServerGeometry({ + id: jsonObject.id, + style: ServerStyle.fromJson(jsonObject.style), + parts: jsonObject.parts, + partTopo: jsonObject.partTopo, + points: jsonObject.points, + center: jsonObject.center, + length: jsonObject.length, + maxM: jsonObject.maxM, + minM: jsonObject.minM, + type: jsonObject.type + }); + } + + /** + * @function ServerGeometry.prototype.fromGeometry + * @description 将客户端 Geometry 转换成服务端 ServerGeometry。 + * @param {Geometry} geometry - 要转换的客户端 Geometry 对象。 + * @returns {ServerGeometry} 转换后的 ServerGeometry 对象。 + */ + static fromGeometry(geometry) { + if (!geometry) { + return; + } + var id = 0, + parts = [], + points = [], + type = null, + icomponents = geometry.components, + className = geometry.CLASS_NAME, + prjCoordSys = { epsgCode: geometry.SRID }; + + if (!isNaN(geometry.id)) { + id = geometry.id; + } + //坑爹的改法,没法,为了支持态势标绘,有时间就得全改 + if ( + className != 'SuperMap.Geometry.LinearRing' && + className != 'SuperMap.Geometry.LineString' && + (geometry instanceof MultiPoint || geometry instanceof MultiLineString) + ) { + let ilen = icomponents.length; + for (let i = 0; i < ilen; i++) { + const vertices = icomponents[i].getVertices(); + let partPointsCount = vertices.length; + parts.push(partPointsCount); + for (let j = 0; j < partPointsCount; j++) { + points.push(new Point(vertices[j].x, vertices[j].y)); + } + } + //这里className不是多点就全部是算线 + type = className == 'SuperMap.Geometry.MultiPoint' ? GeometryType.POINT : GeometryType.LINE; + } else if (geometry instanceof MultiPolygon) { + let ilen = icomponents.length; + for (let i = 0; i < ilen; i++) { + let polygon = icomponents[i], + linearRingOfPolygon = polygon.components, + linearRingOfPolygonLen = linearRingOfPolygon.length; + for (let j = 0; j < linearRingOfPolygonLen; j++) { + const vertices = linearRingOfPolygon[j].getVertices(); + const partPointsCount = vertices.length + 1; + parts.push(partPointsCount); + for (let k = 0; k < partPointsCount - 1; k++) { + points.push(new Point(vertices[k].x, vertices[k].y)); + } + points.push( + new Point(vertices[0].x, vertices[0].y) + ); + } + } + type = GeometryType.REGION; + } else if (geometry instanceof Polygon) { + let ilen = icomponents.length; + for (let i = 0; i < ilen; i++) { + const vertices = icomponents[i].getVertices(); + let partPointsCount = vertices.length + 1; + parts.push(partPointsCount); + for (let j = 0; j < partPointsCount - 1; j++) { + points.push(new Point(vertices[j].x, vertices[j].y)); + } + points.push(new Point(vertices[0].x, vertices[0].y)); + } + type = GeometryType.REGION; + } else { + const vertices = geometry.getVertices(); + let geometryVerticesCount = vertices.length; + for (let j = 0; j < geometryVerticesCount; j++) { + points.push(new Point(vertices[j].x, vertices[j].y)); + } + if (geometry instanceof LinearRing) { + points.push(new Point(vertices[0].x, vertices[0].y)); + geometryVerticesCount++; + } + parts.push(geometryVerticesCount); + type = geometry instanceof Point ? GeometryType.POINT : GeometryType.LINE; + } + + return new ServerGeometry({ + id: id, + style: null, + parts: parts, + points: points, + type: type, + prjCoordSys: prjCoordSys + }); + } + + /** + * @function ServerGeometry.prototype.IsClockWise + * @description 判断 linearRing 中的点的顺序。返回值大于 0,逆时针;小于 0,顺时针。 + * @param {Geometry} geometry - 要转换的客户端 Geometry 对象。 + * @returns {number} 返回值大于 0,逆时针;小于 0,顺时针。 + */ + static IsClockWise(points) { + var length = points.length; + if (length < 3) { + return 0.0; + } + var s = points[0].y * (points[length - 1].x - points[1].x); + points.push(points[0]); + for (var i = 1; i < length; i++) { + s += points[i].y * (points[i - 1].x - points[i + 1].x); + } + return s * 0.5; + } + + static bubbleSort(areaArray, pointList, geoTopo, polygonBounds) { + for (var i = 0; i < areaArray.length; i++) { + for (var j = 0; j < areaArray.length; j++) { + if (areaArray[i] > areaArray[j]) { + var d = areaArray[j]; + areaArray[j] = areaArray[i]; + areaArray[i] = d; + var b = pointList[j]; + pointList[j] = pointList[i]; + pointList[i] = b; + if (geoTopo && geoTopo.length > 0) { + var c = geoTopo[j]; + geoTopo[j] = geoTopo[i]; + geoTopo[i] = c; + } + if (polygonBounds && polygonBounds.length > 0) { + var f = polygonBounds[j]; + polygonBounds[j] = polygonBounds[i]; + polygonBounds[i] = f; + } + } + } + } + } +} + + +;// CONCATENATED MODULE: ./src/common/format/GeoJSON.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + +/** + * @class GeoJSONFormat + * @aliasclass Format.GeoJSON + * @deprecatedclass SuperMap.Format.GeoJSON + * @classdesc GeoJSON 的读和写。使用 {@link GeoJSONObject} 构造器创建一个 GeoJSON 解析器。 + * @category BaseTypes Format + * @param {Object} [options] - 可选参数。 + * @param {string} [options.indent=" "] - 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + * @param {string} [options.space=" "] - 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + * @param {string} [options.newline="\n"] - 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + * @param {number} [options.level=0] - 用于格式化输出, 表示的是缩进级别。 + * @param {boolean} [options.pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @param {boolean} [options.nativeJSON] - 需要被注册的监听器对象。 + * @param {boolean} [options.ignoreExtraDims=true] - 忽略维度超过 2 的几何要素。 + * @extends {JSONFormat} + * @usage + */ +class GeoJSON extends JSONFormat { + + + constructor(options) { + super(options); + /** + * @member {boolean} [GeoJSONFormat.prototype.ignoreExtraDims=true] + * @description 忽略维度超过 2 的几何要素。 + */ + this.ignoreExtraDims = true; + + this.CLASS_NAME = "SuperMap.Format.GeoJSON"; + /** + * @member {Object} GeoJSONFormat.prototype.parseCoords + * @private + * @description 一个属性名对应着 GeoJSON 对象的几何类型的对象。每个属性其实都是一个实际上做解析用的方法。 + */ + this.parseCoords = { + /** + * @function GeoJSONFormat.parseCoords.point + * @description 将一组坐标转成一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的一组坐标。 + * @returns {Geometry} 一个几何对象。 + */ + "point": function (array) { + if (this.ignoreExtraDims === false && + array.length != 2) { + throw "Only 2D points are supported: " + array; + } + return new Point(array[0], array[1]); + }, + + /** + * @function GeoJSONFormat.parseCoords.multipoint + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multipoint": function (array) { + var points = []; + var p = null; + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + points.push(p); + } + return new MultiPoint(points); + }, + + /** + * @function GeoJSONFormat.parseCoords.linestring + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "linestring": function (array) { + var points = []; + var p = null; + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + points.push(p); + } + return new LineString(points); + }, + + /** + * @function GeoJSONFormat.parseCoords.multilinestring + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multilinestring": function (array) { + var lines = []; + var l = null; + for (var i = 0, len = array.length; i < len; ++i) { + try { + l = this.parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + lines.push(l); + } + return new MultiLineString(lines); + }, + + /** + * @function GeoJSONFormat.parseCoords.polygon + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @returns {Geometry} 一个几何对象。 + */ + "polygon": function (array) { + var rings = []; + var r, l; + for (var i = 0, len = array.length; i < len; ++i) { + try { + l = this.parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + r = new LinearRing(l.components); + rings.push(r); + } + return new Polygon(rings); + }, + + /** + * @function GeoJSONFormat.parseCoords.multipolygon + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multipolygon": function (array) { + var polys = []; + var p = null; + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["polygon"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + polys.push(p); + } + return new MultiPolygon(polys); + }, + + /** + * @function GeoJSONFormat.parseCoords.box + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Array} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "box": function (array) { + if (array.length != 2) { + throw "GeoJSON box coordinates must have 2 elements"; + } + return new Polygon([ + new LinearRing([ + new Point(array[0][0], array[0][1]), + new Point(array[1][0], array[0][1]), + new Point(array[1][0], array[1][1]), + new Point(array[0][0], array[1][1]), + new Point(array[0][0], array[0][1]) + ]) + ]); + } + + }; + /** + * @member {Object} GeoJSONFormat.prototype.extract + * @private + * @description 一个属性名对应着GeoJSON类型的对象。其值为相应的实际的解析方法。 + */ + this.extract = { + /** + * @function GeoJSONFormat.extract.feature + * @description 返回一个表示单个要素对象的 GeoJSON 的一部分。 + * @param {SuperMap.ServerFeature} feature - iServer 要素对象。 + * @returns {Object} 一个表示点的对象。 + */ + 'feature': function (feature) { + var geom = this.extract.geometry.apply(this, [feature.geometry]); + var json = { + "type": "Feature", + "properties": this.createAttributes(feature), + "geometry": geom + }; + + if (feature.geometry && feature.geometry.type === 'TEXT') { + json.properties.texts = feature.geometry.texts; + json.properties.textStyle = feature.geometry.textStyle; + } + if (feature.fid) { + json.id = feature.fid; + } + if (feature.ID) { + json.id = feature.ID; + } + return json; + }, + + + /** + * @function GeoJSONFormat.extract.geometry + * @description 返回一个表示单个几何对象的 GeoJSON 的一部分。 + * @param {Object} geometry - iServer 几何对象。 + * @returns {Object} 一个表示几何体的对象。 + */ + 'geometry': function (geometry) { + if (geometry == null) { + return null; + } + if (!geometry.parts && geometry.points) { + geometry.parts = [geometry.points.length]; + } + var geo = geometry.hasOwnProperty('geometryType') + ? geometry + : new ServerGeometry(geometry).toGeometry() || geometry; + var geometryType = geo.geometryType || geo.type; + var data; + if (geometryType === "LinearRing") { + geometryType = "LineString"; + } + if (geometryType === "LINEM") { + geometryType = "MultiLineString"; + } + data = this.extract[geometryType.toLowerCase()].apply(this, [geo]); + geometryType = geometryType === 'TEXT' ? 'Point' : geometryType; + var json; + if (geometryType === "Collection") { + json = { + "type": "GeometryCollection", + "geometries": data + }; + } else { + json = { + "type": geometryType, + "coordinates": data + }; + } + return json; + }, + + + /** + * @function GeoJSONFormat.extract.point + * @description 从一个点对象中返回一个坐标组。 + * @param {GeometryPoint} point - 一个点对象。 + * @returns {Array} 一个表示一个点的坐标组。 + */ + 'point': function (point) { + var p = [point.x, point.y]; + for (var name in point) { + if (name !== "x" && name !== "y" && point[name] !== null && !isNaN(point[name])) { + p.push(point[name]); + } + } + return p; + }, + + /** + * @function GeoJSONFormat.extract.point + * @description 从一个文本对象中返回一个坐标组。 + * @param {Object} geo - 一个文本对象。 + * @returns {Array} 一个表示一个点的坐标组。 + */ + 'text': function (geo) { + return [geo.points[0].x, geo.points[0].y]; + }, + + /** + * @function GeoJSONFormat.extract.multipoint + * @description 从一个多点对象中返一个坐标组数组。 + * @param {GeometryMultiPoint} multipoint - 多点对象。 + * @returns {Array} 一个表示多点的坐标组数组。 + */ + 'multipoint': function (multipoint) { + var array = []; + for (var i = 0, len = multipoint.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [multipoint.components[i]])); + } + return array; + }, + + /** + * @function GeoJSONFormat.extract.linestring + * @description 从一个线对象中返回一个坐标组数组。 + * @param {Linestring} linestring - 线对象。 + * @returns {Array} 一个表示线对象的坐标组数组。 + */ + 'linestring': function (linestring) { + var array = []; + for (var i = 0, len = linestring.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [linestring.components[i]])); + } + return array; + }, + + /** + * @function GeoJSONFormat.extract.multilinestring + * @description 从一个多线对象中返回一个线数组。 + * @param {GeometryMultiLineString} multilinestring - 多线对象。 + * + * @returns {Array} 一个表示多线的线数组。 + */ + 'multilinestring': function (multilinestring) { + var array = []; + for (var i = 0, len = multilinestring.components.length; i < len; ++i) { + array.push(this.extract.linestring.apply(this, [multilinestring.components[i]])); + } + return array; + }, + + /** + * @function GeoJSONFormat.extract.polygon + * @description 从一个面对象中返回一组线环。 + * @param {GeometryPolygon} polygon - 面对象。 + * @returns {Array} 一组表示面的线环。 + */ + 'polygon': function (polygon) { + var array = []; + for (var i = 0, len = polygon.components.length; i < len; ++i) { + array.push(this.extract.linestring.apply(this, [polygon.components[i]])); + } + return array; + }, + + /** + * @function GeoJSONFormat.extract.multipolygon + * @description 从一个多面对象中返回一组面。 + * @param {GeometryMultiPolygon} multipolygon - 多面对象。 + * @returns {Array} 一组表示多面的面。 + */ + 'multipolygon': function (multipolygon) { + var array = []; + for (var i = 0, len = multipolygon.components.length; i < len; ++i) { + array.push(this.extract.polygon.apply(this, [multipolygon.components[i]])); + } + return array; + }, + + /** + * @function GeoJSONFormat.extract.collection + * @description 从一个几何要素集合中一组几何要素数组。 + * @param {GeometryCollection} collection - 几何要素集合。 + * @returns {Array} 一组表示几何要素集合的几何要素数组。 + */ + 'collection': function (collection) { + var len = collection.components.length; + var array = new Array(len); + for (var i = 0; i < len; ++i) { + array[i] = this.extract.geometry.apply(this, [collection.components[i]]); + } + return array; + } + }; + } + + /** + * @function GeoJSONFormat.prototype.read + * @description 将 GeoJSON 对象或者GeoJSON 对象字符串转换为 SuperMap Feature 对象。 + * @param {GeoJSONObject} json - GeoJSON 对象。 + * @param {string} [type='FeaureCollection'] - 可选的字符串,它决定了输出的格式。支持的值有:"Geometry","Feature",和 "FeatureCollection",如果此值为null。 + * @param {function} filter - 对象中每个层次每个键值对都会调用此函数得出一个结果。每个值都会被 filter 函数的结果所替换掉。这个函数可被用来将某些对象转化成某个类相应的对象,或者将日期字符串转化成Date对象。 + * @returns {Object} 返回值依赖于 type 参数的值。 + * -如果 type 等于 "FeatureCollection",返回值将会是 {@link FeatureVector} 数组。 + * -如果 type 为 "Geometry",输入的 JSON 对象必须表示一个唯一的几何体,然后返回值就会是 {@link Geometry}。 + * -如果 type 为 "Feature",输入的 JSON 对象也必须表示的一个要素,这样返回值才会是 {@link FeatureVector}。 + */ + + read(json, type, filter) { + type = (type) ? type : "FeatureCollection"; + var results = null; + var obj = null; + if (typeof json == "string") { + obj = super.read(json, filter); + } else { + obj = json; + } + if (!obj) { + //console.error("Bad JSON: " + json); + } else if (typeof (obj.type) != "string") { + //console.error("Bad GeoJSON - no type: " + json); + } else if (this.isValidType(obj, type)) { + switch (type) { + case "Geometry": + try { + results = this.parseGeometry(obj); + } catch (err) { + //console.error(err); + } + break; + case "Feature": + try { + results = this.parseFeature(obj); + results.type = "Feature"; + } catch (err) { + //console.error(err); + } + break; + case "FeatureCollection": + // for type FeatureCollection, we allow input to be any type + results = []; + switch (obj.type) { + case "Feature": + try { + results.push(this.parseFeature(obj)); + } catch (err) { + results = null; + //console.error(err); + } + break; + case "FeatureCollection": + for (var i = 0, len = obj.features.length; i < len; ++i) { + try { + results.push(this.parseFeature(obj.features[i])); + } catch (err) { + results = null; + // console.error(err); + } + } + break; + default: + try { + var geom = this.parseGeometry(obj); + results.push(new Vector(geom)); + } catch (err) { + results = null; + //console.error(err); + } + } + break; + default: + break; + } + } + return results; + } + + /** + * @function GeoJSONFormat.prototype.write + * @description iServer Geometry JSON 对象 转 GeoJSON对象字符串。 + * @param {Object} obj - iServer Geometry JSON 对象。 + * @param {boolean} [pretty=false] - 是否使用换行和缩进来控制输出。 + * @returns {GeoJSONObject} 一个 GeoJSON 字符串,它表示了输入的几何对象,要素对象,或者要素对象数组。 + */ + write(obj, pretty) { + return super.write(this.toGeoJSON(obj), pretty); + } + /** + * @function GeoJSONFormat.prototype.fromGeoJSON + * @version 9.1.1 + * @description 将 GeoJSON 对象或者GeoJSON 对象字符串转换为iServer Feature JSON。 + * @param {GeoJSONObject} json - GeoJSON 对象。 + * @param {string} [type='FeaureCollection'] - 可选的字符串,它决定了输出的格式。支持的值有:"Geometry","Feature",和 "FeatureCollection",如果此值为null。 + * @param {function} filter - 对象中每个层次每个键值对都会调用此函数得出一个结果。每个值都会被 filter 函数的结果所替换掉。这个函数可被用来将某些对象转化成某个类相应的对象,或者将日期字符串转化成Date对象。 + * @returns {Object} iServer Feature JSON。 + */ + fromGeoJSON(json, type, filter) { + let feature = this.read(json, type, filter); + if (!Util.isArray(feature)) { + return this._toiSevrerFeature(feature); + } + return feature.map((element) => { + return this._toiSevrerFeature(element); + }) + } + + /** + * @function GeoJSONFormat.prototype.toGeoJSON + * @version 9.1.1 + * @description 将 iServer Feature JSON 对象转换为 GeoJSON 对象。 + * @param {Object} obj - iServer Feature JSON。 + * @returns {GeoJSONObject} GeoJSON 对象。 + */ + toGeoJSON(obj) { + var geojson = { + "type": null + }; + if (Util.isArray(obj)) { + geojson.type = "FeatureCollection"; + var numFeatures = obj.length; + geojson.features = new Array(numFeatures); + for (var i = 0; i < numFeatures; ++i) { + var element = obj[i]; + if (isGeometry(element)) { + let feature = {}; + feature.geometry = element; + geojson.features[i] = this.extract.feature.apply(this, [feature]); + } else { + geojson.features[i] = this.extract.feature.apply(this, [element]); + } + } + } else if (isGeometry(obj)) { + let feature = {}; + feature.geometry = obj; + geojson = this.extract.feature.apply(this, [feature]); + } else { + geojson = this.extract.feature.apply(this, [obj]); + } + + function isGeometry(input) { + return (input.hasOwnProperty("parts") && input.hasOwnProperty("points")) || input.hasOwnProperty("geoParts"); + } + + return geojson; + + } + /** + * @function GeoJSONFormat.prototype.isValidType + * @description 检查一个 GeoJSON 对象是否和给定的类型相符的合法的对象。 + * @returns {boolean} GeoJSON 是否是给定类型的合法对象。 + * @private + */ + isValidType(obj, type) { + var valid = false; + switch (type) { + case "Geometry": + if (Util.indexOf( + ["Point", "MultiPoint", "LineString", "MultiLineString", + "Polygon", "MultiPolygon", "Box", "GeometryCollection" + ], + obj.type) == -1) { + // unsupported geometry type + //console.error("Unsupported geometry type: " + + // obj.type); + } else { + valid = true; + } + break; + case "FeatureCollection": + // allow for any type to be converted to a feature collection + valid = true; + break; + default: + // for Feature types must match + if (obj.type == type) { + valid = true; + } else { + //console.error("Cannot convert types from " + + //obj.type + " to " + type); + } + } + return valid; + } + + /** + * @function GeoJSONFormat.prototype.parseFeature + * @description 将一个 GeoJSON 中的 feature 转化成 {@link FeatureVector}> 对象。 + * @private + * @param {GeoJSONObject} obj - 从 GeoJSON 对象中创建一个对象。 + * @returns {FeatureVector} 一个要素。 + */ + parseFeature(obj) { + var feature, geometry, attributes, bbox; + attributes = (obj.properties) ? obj.properties : {}; + bbox = (obj.geometry && obj.geometry.bbox) || obj.bbox; + try { + geometry = this.parseGeometry(obj.geometry); + } catch (err) { + // deal with bad geometries + throw err; + } + feature = new Vector(geometry, attributes); + if (bbox) { + feature.bounds = Bounds.fromArray(bbox); + } + if (obj.id) { + feature.fid = obj.id; + } + return feature; + } + + + /** + * @function GeoJSONFormat.prototype.parseGeometry + * @description 将一个 GeoJSON 中的几何要素转化成 {@link Geometry} 对象。 + * @param {GeoJSONObject} obj - 从 GeoJSON 对象中创建一个对象。 + * @returns {Geometry} 一个几何要素。 + * @private + */ + parseGeometry(obj) { + if (obj == null) { + return null; + } + var geometry; + if (obj.type == "GeometryCollection") { + if (!(Util.isArray(obj.geometries))) { + throw "GeometryCollection must have geometries array: " + obj; + } + var numGeom = obj.geometries.length; + var components = new Array(numGeom); + for (var i = 0; i < numGeom; ++i) { + components[i] = this.parseGeometry.apply( + this, [obj.geometries[i]] + ); + } + geometry = new Collection(components); + } else { + if (!(Util.isArray(obj.coordinates))) { + throw "Geometry must have coordinates array: " + obj; + } + if (!this.parseCoords[obj.type.toLowerCase()]) { + throw "Unsupported geometry type: " + obj.type; + } + try { + geometry = this.parseCoords[obj.type.toLowerCase()].apply( + this, [obj.coordinates] + ); + } catch (err) { + // deal with bad coordinates + throw err; + } + } + return geometry; + } + + + /** + * @function GeoJSONFormat.prototype.createCRSObject + * @description 从一个要素对象中创建一个坐标参考系对象。 + * @param {FeatureVector} object - 要素对象。 + * @private + * @returns {GeoJSONObject} 一个可作为 GeoJSON 对象的 CRS 属性使用的对象。 + */ + createCRSObject(object) { + var proj = object.layer.projection.toString(); + var crs = {}; + if (proj.match(/epsg:/i)) { + var code = parseInt(proj.substring(proj.indexOf(":") + 1)); + if (code == 4326) { + crs = { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }; + } else { + crs = { + "type": "name", + "properties": { + "name": "EPSG:" + code + } + }; + } + } + return crs; + } + _toiSevrerFeature(feature) { + const attributes = feature.attributes; + const attrNames = []; + const attrValues = []; + for (var attr in attributes) { + attrNames.push(attr); + attrValues.push(attributes[attr]); + } + const newFeature = { + fieldNames: attrNames, + fieldValues: attrValues, + geometry: ServerGeometry.fromGeometry(feature.geometry) + }; + newFeature.geometry.id = feature.fid; + return newFeature; + } + createAttributes(feature) { + if (!feature) { + return null; + } + var attr = {}; + processFieldsAttributes(feature, attr); + var exceptKeys = ["fieldNames", "fieldValues", "geometry", "stringID", "ID"]; + for (var key in feature) { + if (exceptKeys.indexOf(key) > -1) { + continue; + } + attr[key] = feature[key]; + } + + function processFieldsAttributes(feature, attributes) { + if (!(feature.hasOwnProperty("fieldNames") && feature.hasOwnProperty("fieldValues"))) { + return; + } + var names = feature.fieldNames, + values = feature.fieldValues; + for (var i in names) { + attributes[names[i]] = values[i]; + } + } + + return attr; + } +} + +;// CONCATENATED MODULE: ./src/common/format/WKT.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class WKTFormat + * @aliasclass Format.WKT + * @deprecatedclass SuperMap.Format.WKT + * @classdesc 用于读写常见文本的类。通过 {@link WKTFormat} 构造器来创建一个新的实例。 + * @category BaseTypes Format + * @extends {Format} + * @param {Object} options - 可选的选项对象,其属性将被设置到实例。option 具体配置项继承自 {@link Format}。 + * @usage + */ +class WKT extends Format { + + constructor(options) { + super(options); + this.regExes = { + 'typeStr': /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/, + 'spaces': /\s+/, + 'parenComma': /\)\s*,\s*\(/, + 'doubleParenComma': /\)\s*\)\s*,\s*\(\s*\(/, // can't use {2} here + 'trimParens': /^\s*\(?(.*?)\)?\s*$/ + }; + this.CLASS_NAME = "SuperMap.Format.WKT"; /** + * @private + * @description Object with properties corresponding to the geometry types. + * Property values are functions that do the actual data extraction. + */ + this.extract = { + /** + * @description Return a space delimited string of point coordinates. + * @param {GeometryPoint} point + * @returns {string} A string of coordinates representing the point + */ + 'point': function (point) { + return point.x + ' ' + point.y; + }, + + /** + * @description Return a comma delimited string of point coordinates from a multipoint. + * @param {GeometryMultiPoint} multipoint + * @returns {string} A string of point coordinate strings representing + * the multipoint + */ + 'multipoint'(multipoint) { + var array = []; + for (var i = 0, len = multipoint.components.length; i < len; ++i) { + array.push('(' + + this.extract.point.apply(this, [multipoint.components[i]]) + + ')'); + } + return array.join(','); + }, + + /** + * @description Return a comma delimited string of point coordinates from a line. + * @param {GeometryLineString} linestring + * @returns {string} A string of point coordinate strings representing + * the linestring + */ + 'linestring'(linestring) { + var array = []; + for (var i = 0, len = linestring.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [linestring.components[i]])); + } + return array.join(','); + }, + + /** + * @description Return a comma delimited string of linestring strings from a multilinestring. + * @param {GeometryMultiLineString} multilinestring + * @returns {string} A string of of linestring strings representing + * the multilinestring + */ + 'multilinestring'(multilinestring) { + var array = []; + for (var i = 0, len = multilinestring.components.length; i < len; ++i) { + array.push('(' + + this.extract.linestring.apply(this, [multilinestring.components[i]]) + + ')'); + } + return array.join(','); + }, + + /** + * @description Return a comma delimited string of linear ring arrays from a polygon. + * @param {GeometryPolygon} polygon + * @returns {string} An array of linear ring arrays representing the polygon + */ + 'polygon'(polygon) { + var array = []; + for (var i = 0, len = polygon.components.length; i < len; ++i) { + array.push('(' + + this.extract.linestring.apply(this, [polygon.components[i]]) + + ')'); + } + return array.join(','); + }, + + /** + * @description Return an array of polygon arrays from a multipolygon. + * @param {GeometryMultiPolygon} multipolygon + * @returns {string} An array of polygon arrays representing + * the multipolygon + */ + 'multipolygon'(multipolygon) { + var array = []; + for (var i = 0, len = multipolygon.components.length; i < len; ++i) { + array.push('(' + + this.extract.polygon.apply(this, [multipolygon.components[i]]) + + ')'); + } + return array.join(','); + }, + + /** + * @description Return the WKT portion between 'GEOMETRYCOLLECTION(' and ')' for an + * @param {GeometryCollection} collection + * @returns {string} internal WKT representation of the collection + */ + 'collection'(collection) { + var array = []; + for (var i = 0, len = collection.components.length; i < len; ++i) { + array.push(this.extractGeometry.apply(this, [collection.components[i]])); + } + return array.join(','); + } + + }; + + /** + * @private + * @description Object with properties corresponding to the geometry types. + * Property values are functions that do the actual parsing. + */ + this.parse = { + /** + * @private + * @description Return point feature given a point WKT fragment. + * @param {string} str A WKT fragment representing the point + * @returns {FeatureVector} A point feature + * + */ + 'point': function (str) { + var coords = StringExt.trim(str).split(this.regExes.spaces); + return new Vector(new Point(coords[0], coords[1]) + ); + }, + + /** + * @description Return a multipoint feature given a multipoint WKT fragment. + * @param {string} A WKT fragment representing the multipoint + * @returns {FeatureVector} A multipoint feature + * @private + */ + 'multipoint': function (str) { + var point; + var points = StringExt.trim(str).split(','); + var components = []; + for (var i = 0, len = points.length; i < len; ++i) { + point = points[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.point.apply(this, [point]).geometry); + } + return new Vector( + new MultiPoint(components) + ); + }, + + /** + * @description Return a linestring feature given a linestring WKT fragment. + * @param {string} A WKT fragment representing the linestring + * @returns {FeatureVector} A linestring feature + * @private + */ + 'linestring': function (str) { + var points = StringExt.trim(str).split(','); + var components = []; + for (var i = 0, len = points.length; i < len; ++i) { + components.push(this.parse.point.apply(this, [points[i]]).geometry); + } + return new Vector( + new LineString(components) + ); + }, + + /** + * @description Return a multilinestring feature given a multilinestring WKT fragment. + * @param {string} A WKT fragment representing the multilinestring + * @returns {FeatureVector} A multilinestring feature + * @private + */ + 'multilinestring': function (str) { + var line; + var lines = StringExt.trim(str).split(this.regExes.parenComma); + var components = []; + for (var i = 0, len = lines.length; i < len; ++i) { + line = lines[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.linestring.apply(this, [line]).geometry); + } + return new Vector( + new MultiLineString(components) + ); + }, + + /** + * @description Return a polygon feature given a polygon WKT fragment. + * @param {string} A WKT fragment representing the polygon + * @returns {FeatureVector} A polygon feature + * @private + */ + 'polygon': function (str) { + var ring, linestring, linearring; + var rings = StringExt.trim(str).split(this.regExes.parenComma); + var components = []; + for (var i = 0, len = rings.length; i < len; ++i) { + ring = rings[i].replace(this.regExes.trimParens, '$1'); + linestring = this.parse.linestring.apply(this, [ring]).geometry; + linearring = new LinearRing(linestring.components); + components.push(linearring); + } + return new Vector( + new Polygon(components) + ); + }, + + /** + * @private + * @description Return a multipolygon feature given a multipolygon WKT fragment. + * @param {string} A WKT fragment representing the multipolygon + * @returns {FeatureVector} A multipolygon feature + * + */ + 'multipolygon': function (str) { + var polygon; + var polygons = StringExt.trim(str).split(this.regExes.doubleParenComma); + var components = []; + for (var i = 0, len = polygons.length; i < len; ++i) { + polygon = polygons[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.polygon.apply(this, [polygon]).geometry); + } + return new Vector( + new MultiPolygon(components) + ); + }, + + + /** + * @description Return an array of features given a geometrycollection WKT fragment. + * @param {string} A WKT fragment representing the geometrycollection + * @returns {Array} An array of FeatureVector + * @private + */ + 'geometrycollection': function (str) { + // separate components of the collection with | + str = str.replace(/,\s*([A-Za-z])/g, '|$1'); + var wktArray = StringExt.trim(str).split('|'); + var components = []; + for (var i = 0, len = wktArray.length; i < len; ++i) { + components.push(this.read(wktArray[i])); + } + return components; + } + + }; + + } + + + /** + * @function WKTFormat.prototype.read + * @description 反序列化 WKT 字符串并返回向量特征或向量特征数组。 支持 POINT、MULTIPOINT、LINESTRING、MULTILINESTRING、POLYGON、MULTIPOLYGON 和 GEOMETRYCOLLECTION 的 WKT。 + * @param {string} wkt - WKT 字符串。 + * @returns {FeatureVector|Array} GEOMETRYCOLLECTION WKT 的矢量要素或者矢量要素数组。 + */ + read(wkt) { + var features, type, str; + wkt = wkt.replace(/[\n\r]/g, " "); + var matches = this.regExes.typeStr.exec(wkt); + if (matches) { + type = matches[1].toLowerCase(); + str = matches[2]; + if (this.parse[type]) { + features = this.parse[type].apply(this, [str]); + } + } + return features; + } + + + /** + * @function WKTFormat.prototype.write + * @description 将矢量要素或矢量要素数组序列化为 WKT 字符串。 + * @param {(FeatureVector|Array)} features - 矢量要素或矢量要素数组。 + * @returns {string} 表示几何的 WKT 字符串。 + */ + write(features) { + var collection, geometry, isCollection; + if (features.constructor === Array) { + collection = features; + isCollection = true; + } else { + collection = [features]; + isCollection = false; + } + var pieces = []; + if (isCollection) { + pieces.push('GEOMETRYCOLLECTION('); + } + for (var i = 0, len = collection.length; i < len; ++i) { + if (isCollection && i > 0) { + pieces.push(','); + } + geometry = collection[i].geometry; + pieces.push(this.extractGeometry(geometry)); + } + if (isCollection) { + pieces.push(')'); + } + return pieces.join(''); + } + + /** + * @function WKTFormat.prototype.extractGeometry + * @description 为单个 Geometry 对象构造 WKT 的入口点。 + * @param {Geometry} geometry - Geometry 对象。 + * @returns {string} 表示几何的 WKT 字符串。 + */ + extractGeometry(geometry) { + var type = geometry.CLASS_NAME.split('.')[2].toLowerCase(); + if (!this.extract[type]) { + return null; + } + var wktType = type === 'collection' ? 'GEOMETRYCOLLECTION' : type.toUpperCase(); + var data = wktType + '(' + this.extract[type].apply(this, [geometry]) + ')'; + return data; + } +} + +;// CONCATENATED MODULE: ./src/common/format/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/control/TimeControlBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TimeControlBase + * @deprecatedclass SuperMap.TimeControlBase + * @classdesc 时间控制基类类。 + * @category Control + * @param {Object} options - 可选参数。 + * @param {number} [options.speed=1] - 速度。不能小于 0,(每帧渲染的数据之间的间隔为1),设置越大速度越快。 + * @param {number} [options.frequency=1000] - 刷新频率(单位 ms),服务器刷新的时间间隔。 + * @param {number} [options.startTime=0] - 起始时间,必须为数字,且小于等于 endTime。如果不设置,初始化时为 0,建议设置。 + * @param {number} [options.endTime] - 结束时间,必须为数字,且大于等于 startTime。如果不设置,初始化时以当前时间进行设置,建议设置。 + * @param {boolean} [options.repeat=true] - 是否重复循环。 + * @param {boolean} [options.reverse=false] - 是否反向。 + * @usage + */ +class TimeControlBase { + + + constructor(options) { + //设置步长,刷新频率、开始结束时间、是否循环、是否反向 + var me = this; + options = options || {}; + + + /** + * @member {number} [TimeControlBase.prototype.speed=1] + * @description 步长,必须为非负数,默认为1(表示前后两次渲染的数据之间的间隔为1) + */ + this.speed = (options.speed && options.speed >= 0) ? options.speed : 1; + + /** + * @member {number} [TimeControlBase.prototype.frequency=1000] + * @description 刷新频率(单位ms),服务器刷新的时间间隔。 + */ + this.frequency = (options.speed && options.frequency >= 0) ? options.frequency : 1000; + + /** + * @member {number} [TimeControlBase.prototype.startTime=0] + * @description 记录的起始时间,必须为数字, + * 如果不设置,初始化时为0,建议设置 + */ + this.startTime = (options.startTime && options.startTime != null) ? options.startTime : 0; + + /** + * @member {number} TimeControlBase.prototype.endTime + * @description 记录的结束时间,必须为数字, + * 如果不设置,初始化时以当前时间进行设置,建议设置 + */ + this.endTime = (options.endTime && options.endTime != null && options.endTime >= me.startTime) ? options.endTime : +new Date(); + + /** + * @member {boolean} [TimeControlBase.prototype.repeat=true] + * @description 是否重复循环。 + */ + this.repeat = (options.repeat !== undefined) ? options.repeat : true; + + /** + * @member {boolean} [TimeControlBase.prototype.reverse=false] + * @description 是否反向。 + */ + this.reverse = (options.reverse !== undefined) ? options.reverse : false; + + /** + * @member {number} TimeControlBase.prototype.currentTime + * @description 记录近期的时间,也就是当前帧运行到的时间。 + */ + this.currentTime = null; + + /** + * @member {number} TimeControlBase.prototype.oldTime + * @description 记录上一帧的时间,也就是之前运行到的时间。 + */ + this.oldTime = null; + + /** + * @member {boolean} [TimeControlBase.prototype.running=false] + * @description 记录当前是否处于运行中。 + */ + this.running = false; + + + /** + * @private + * @member {Array.} TimeControlBase.prototype.EVENT_TYPES + * @description 此类支持的事件类型。 + * + */ + this.EVENT_TYPES = ["start", "pause", "stop"]; + + /** + * @private + * @member {Events} TimeControlBase.prototype.events + * @description 事件 + */ + me.events = new Events(this, null, this.EVENT_TYPES); + + me.speed = Number(me.speed); + me.frequency = Number(me.frequency); + me.startTime = Number(me.startTime); + me.endTime = Number(me.endTime); + + me.startTime = Date.parse(new Date(me.startTime)); + me.endTime = Date.parse(new Date(me.endTime)); + + //初始化当前时间 + me.currentTime = me.startTime; + + this.CLASS_NAME = "SuperMap.TimeControlBase"; + } + + + /** + * @function TimeControlBase.prototype.updateOptions + * @description 更新参数。 + * @param {Object} options - 设置参数得可选参数。设置步长,刷新频率、开始结束时间、是否循环、是否反向。 + */ + updateOptions(options) { + //设置步长,刷新频率、开始结束时间、是否循环、是否反向 + var me = this; + options = options || {}; + if (options.speed && options.speed >= 0) { + me.speed = options.speed; + me.speed = Number(me.speed); + } + + if (options.speed && options.frequency >= 0) { + me.frequency = options.frequency; + me.frequency = Number(me.frequency); + } + + if (options.startTime && options.startTime != null) { + me.startTime = options.startTime; + me.startTime = Date.parse(new Date(me.startTime)); + } + + if (options.endTime && options.endTime != null && options.endTime >= me.startTime) { + me.endTime = options.endTime; + me.endTime = Date.parse(new Date(me.endTime)); + } + + if (options.repeat != null) { + me.repeat = options.repeat; + } + + if (options.reverse != null) { + me.reverse = options.reverse; + } + } + + + /** + * @function TimeControlBase.prototype.start + * @description 开始。 + */ + start() { + var me = this; + + if (!me.running) { + me.running = true; + me.tick(); + me.events.triggerEvent('start', me.currentTime); + } + } + + + /** + * @function TimeControlBase.prototype.pause + * @description 暂停。 + */ + pause() { + var me = this; + me.running = false; + me.events.triggerEvent('pause', me.currentTime); + } + + + /** + * @function TimeControlBase.prototype.stop + * @description 停止,停止后返回起始状态。 + */ + stop() { + var me = this; + //停止时 时间设置为开始时间 + me.currentTime = me.startTime; + //如果正在运行,修改为初始时间即可绘制一帧 + if (me.running) { + me.running = false; + } + me.events.triggerEvent('stop', me.currentTime); + } + + + /** + * @function TimeControlBase.prototype.toggle + * @description 开关切换,切换的是开始和暂停。 + */ + toggle() { + var me = this; + + if (me.running) { + me.pause(); + } else { + me.start(); + } + } + + + /** + * @function TimeControlBase.prototype.setSpeed + * @description 设置步长。 + * @param {number} [speed=1] - 步长,必须为非负数。 + * @returns {boolean} true 代表设置成功,false 设置失败(speed 小于 0 时失败)。 + */ + setSpeed(speed) { + var me = this; + if (speed >= 0) { + me.speed = speed; + return true; + } + return false; + } + + + /** + * @function TimeControlBase.prototype.getSpeed + * @description 获取步长。 + * @returns {number} 返回当前的步长 + */ + getSpeed() { + return this.speed; + } + + + /** + * @function TimeControlBase.prototype.setFrequency + * @description 设置刷新频率。 + * @param {number} [frequency=1000] - 刷新频率,单位为 ms。 + * @returns {boolean} true 代表设置成功,false 设置失败(frequency 小于 0 时失败)。 + */ + setFrequency(frequency) { + var me = this; + if (frequency >= 0) { + me.frequency = frequency; + return true; + } + return false; + } + + + /** + * @function TimeControlBase.prototype.getFrequency + * @description 获取刷新频率。 + * @returns {number} 返回当前的刷新频率。 + */ + getFrequency() { + return this.frequency; + } + + + /** + * @function TimeControlBase.prototype.setStartTime + * @description 设置起始时间,设置完成后如果当前时间小于起始时间,则从起始时间开始。 + * @param {number} startTime - 需要设置的起始时间。 + * @returns {boolean} true 代表设置成功,false 设置失败(startTime 大于结束时间时失败)。 + */ + setStartTime(startTime) { + var me = this; + startTime = Date.parse(new Date(startTime)); + //起始时间不得大于结束时间 + if (startTime > me.endTime) { + return false; + } + me.startTime = startTime; + //如果当前时间小于了起始时间,则从当前起始时间开始 + if (me.currentTime < me.startTime) { + me.currentTime = me.startTime; + me.tick(); + } + return true; + } + + + /** + * @function TimeControlBase.prototype.getStartTime + * @description 获取起始时间。 + * @returns {number} 返回当前的起始时间。 + */ + getStartTime() { + return this.startTime; + } + + + /** + * @function TimeControlBase.prototype.setEndTime + * @description 设置结束时间,设置完成后如果当前时间大于结束,则从起始时间开始。 + * @param {number} endTime - 需要设置的结束时间。 + * @returns {boolean} true 代表设置成功,false 设置失败(endTime 小于开始时间时失败)。 + */ + setEndTime(endTime) { + var me = this; + me.endTime = Date.parse(new Date(me.endTime)); + //结束时间不得小于开始时间 + if (endTime < me.startTime) { + return false; + } + me.endTime = endTime; + //如果当前时间大于了结束时间,则从起始时间开始 + if (me.currentTime >= me.endTime) { + me.currentTime = me.startTime; + me.tick(); + } + return true; + } + + + /** + * @function TimeControlBase.prototype.getEndTime + * @description 获取结束时间。 + * @returns {number} 返回当前的结束时间。 + */ + getEndTime() { + return this.endTime; + } + + + /** + * @function TimeControlBase.prototype.setCurrentTime + * @description 设置当前时间。 + * @param {number} currentTime - 需要设置的当前时间。 + * @returns {boolean} true 代表设置成功,false 设置失败。 + */ + setCurrentTime(currentTime) { + var me = this; + me.currentTime = Date.parse(new Date(me.currentTime)); + //结束时间不得小于开始时间 + if (currentTime >= me.startTime && currentTime <= me.endTime) { + me.currentTime = currentTime; + me.startTime = me.currentTime; + me.tick(); + return true; + } + return false; + } + + + /** + * @function TimeControlBase.prototype.getCurrentTime + * @description 获取当前时间。 + * @returns {number} 返回当前时间。 + */ + getCurrentTime() { + return this.currentTime; + } + + + /** + * @function TimeControlBase.prototype.setRepeat + * @description 设置是否重复循环。 + * @param {boolean} [repeat=true] - 是否重复循环。 + */ + setRepeat(repeat) { + this.repeat = repeat; + } + + + /** + * @function TimeControlBase.prototype.getRepeat + * @description 获取是否重复循环,默认是 true。 + * @returns {boolean} 返回是否重复循环。 + */ + getRepeat() { + return this.repeat; + } + + + /** + * @function TimeControlBase.prototype.setReverse + * @description 设置是否反向。 + * @param {boolean} [reverse=false] - 是否反向。 + */ + setReverse(reverse) { + this.reverse = reverse; + } + + + /** + * @function TimeControlBase.prototype.getReverse + * @description 获取是否反向,默认是false。 + * @returns {boolean} 返回是否反向。 + */ + getReverse() { + return this.reverse; + } + + + /** + * @function TimeControlBase.prototype.getRunning + * @description 获取运行状态。 + * @returns {boolean} true 代表正在运行,false 发表没有运行。 + */ + getRunning() { + return this.running; + } + + + /** + * @function TimeControlBase.prototype.destroy + * @description 销毁 Animator 对象,释放资源。 + */ + destroy() { + var me = this; + me.speed = null; + me.frequency = null; + me.startTime = null; + me.endTime = null; + me.currentTime = null; + me.repeat = null; + me.running = false; + me.reverse = null; + } + + + tick() { + //TODO 每次刷新执行的操作。子类实现 + } + +} + + +;// CONCATENATED MODULE: ./src/common/control/TimeFlowControl.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TimeFlowControl + * @deprecatedclass SuperMap.TimeFlowControl + * @category Control + * @classdesc 时间管理类。此类只负责时间上的控制,具体执行的操作需要用户在初始化时的回调函数内部进行实现。 + * 如设置起始时间为 1000,结束时间是 2000,步长设置为 1, + * 那么表示按照每次1年(可以通过 setSpeed 进行修改)的变化从公元 1000 年开始到公元 2000 年为止,默认每 1 秒会 1 次(通过 setFrequency 修改) + * @extends {TimeControlBase} + * @param {function} callback - 每次刷新回调函数。具体的效果需要用户在此回调函数里面实现。 + * @param {Object} options - 可选参数。 + * @param {number} [options.speed=1] - 步长(单位 ms)。不能小于 0,(每次刷新的数据之间的间隔为 1ms)。 + * @param {number} [options.frequency=1000] - 刷新频率(单位 ms)。 + * @param {number} [options.startTime=0] - 起始时间,必须为数字,且小于等于 endTime。如果不设置,初始化时为 0,建议设置。 + * @param {number} [options.endTime] - 结束时间,必须为数字,且大于等于 startTime。如果不设置,初始化时使用 new Date() 以当前时间进行设置,建议设置。 + * @param {boolean} [options.repeat=true] - 是否重复循环。 + * @param {boolean} [options.reverse=false] - 是否反向。 + * @usage + */ +class TimeFlowControl extends TimeControlBase { + + + constructor(callback, options) { + super(options); + var me = this; + /** + * @member TimeFlowControl.prototype.callback -{function} + * @description 每次刷新执行的回调函数。 + */ + me.callback = callback; + + //先让IE下支持bind方法 + if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== "function") { + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + } + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function () { + //empty Function + }, + fBound = function () { + return fToBind.apply(this instanceof fNOP && oThis + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + return fBound; + }; + } + //保证 this.tick 的上下文还是 TimeControl 这个对象 + me.update = me.update.bind(me); + + me.oldTime = me.currentTime; + + me.CLASS_NAME = "SuperMap.TimeFlowControl"; + } + + + /** + * @function TimeFlowControl.prototype.updateOptions + * @override + */ + updateOptions(options) { + options = options || {}; + super.updateOptions(options); + } + + + /** + * @function TimeFlowControl.prototype.start + * @override + */ + start() { + var me = this; + if (me.running) { + return; + } + me.running = true; + if (me.reverse) { + if (me.currentTime === me.startTime) { + me.oldTime = me.endTime; + me.currentTime = me.oldTime; + } + } else { + if (me.oldTime === me.endTime) { + me.currentTime = me.startTime; + me.oldTime = me.currentTime; + } + } + me.tick(); + } + + + /** + * @function TimeFlowControl.prototype.stop + * @override + */ + stop() { + super.stop(); + var me = this; + me.oldTime = me.currentTime; + + if (me.running) { + me.running = false; + } + //清除定时tick + me.intervalId && window.clearTimeout(me.intervalId); + } + + + /** + * @function TimeFlowControl.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.oldTime = null; + me.callback = null; + } + + + /** + * @function TimeFlowControl.prototype.tick + * @description 定时刷新。 + */ + tick() { + var me = this; + me.intervalId && window.clearInterval(me.intervalId); + me.intervalId = null; + me.update(); + me.intervalId = window.setInterval(me.update, me.frequency); + } + + /** + * @function TimeFlowControl.prototype.update + * @description 更新控件。 + */ + update() { + var me = this; + + //判定是否还需要继续 + if (!me.running) { + return; + } + //调用回调函数 + me.callback && me.callback(me.currentTime); //destroy之后callback就为空,所以需要判定一下 + + if (!me.reverse) { + //如果相等,则代表上一帧已经运行到了最后,下一帧运行初始化的状态 + if (me.currentTime === me.endTime) { + //不循环时 + if (!me.repeat) { + me.running = false; + me.stop(); + return null; + } + me.stop(); + me.currentTime = me.startTime; + me.oldTime = me.currentTime; + me.start(); + } else {//否则时间递增 + me.oldTime = me.currentTime; + me.currentTime += me.speed; + } + + if (me.currentTime >= me.endTime) { + me.currentTime = me.endTime; + } + + } else { + //如果相等,则代表上一帧已经运行到了最前,下一帧运行结束的状态 + if (me.currentTime === me.startTime) { + //不循环时 + if (!me.repeat) { + me.running = false; + return null; + } + + me.oldTime = me.endTime; + me.currentTime = me.oldTime; + } else {//否则时间递减 + me.currentTime = me.oldTime; + me.oldTime -= me.speed; + } + + if (me.oldTime <= me.startTime) { + me.oldTime = me.startTime; + } + } + + } + + +} + + +;// CONCATENATED MODULE: ./src/common/control/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +// EXTERNAL MODULE: ./node_modules/promise-polyfill/dist/polyfill.js +var polyfill = __webpack_require__(107); +// EXTERNAL MODULE: ./node_modules/fetch-ie8/fetch.js +var fetch = __webpack_require__(693); +// EXTERNAL MODULE: ./node_modules/fetch-jsonp/build/fetch-jsonp.js +var fetch_jsonp = __webpack_require__(144); +var fetch_jsonp_default = /*#__PURE__*/__webpack_require__.n(fetch_jsonp); +;// CONCATENATED MODULE: ./src/common/util/FetchRequest.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +let FetchRequest_fetch = window.fetch; +var setFetch = function (newFetch) { + FetchRequest_fetch = newFetch; +} +var RequestJSONPPromise = { + limitLength: 1500, + queryKeys: [], + queryValues: [], + supermap_callbacks: {}, + addQueryStrings: function (values) { + var me = this; + for (var key in values) { + me.queryKeys.push(key); + if (typeof values[key] !== 'string') { + values[key] = Util.toJSON(values[key]); + } + var tempValue = encodeURIComponent(values[key]); + me.queryValues.push(tempValue); + } + }, + issue: function (config) { + var me = this, + uid = me.getUid(), + url = config.url, + splitQuestUrl = []; + var p = new Promise(function (resolve) { + me.supermap_callbacks[uid] = function (response) { + delete me.supermap_callbacks[uid]; + resolve(response); + }; + }); + + // me.addQueryStrings({ + // callback: "RequestJSONPPromise.supermap_callbacks[" + uid + "]" + // }); + var sectionURL = url, + keysCount = 0; //此次sectionURL中有多少个key + var length = me.queryKeys ? me.queryKeys.length : 0; + for (var i = 0; i < length; i++) { + if (sectionURL.length + me.queryKeys[i].length + 2 >= me.limitLength) { + //+2 for ("&"or"?")and"=" + if (keysCount == 0) { + return false; + } + splitQuestUrl.push(sectionURL); + sectionURL = url; + keysCount = 0; + i--; + } else { + if (sectionURL.length + me.queryKeys[i].length + 2 + me.queryValues[i].length > me.limitLength) { + var leftValue = me.queryValues[i]; + while (leftValue.length > 0) { + var leftLength = me.limitLength - sectionURL.length - me.queryKeys[i].length - 2; //+2 for ("&"or"?")and"=" + if (sectionURL.indexOf('?') > -1) { + sectionURL += '&'; + } else { + sectionURL += '?'; + } + var tempLeftValue = leftValue.substring(0, leftLength); + //避免 截断sectionURL时,将类似于%22这样的符号截成两半,从而导致服务端组装sectionURL时发生错误 + if (tempLeftValue.substring(leftLength - 1, leftLength) === '%') { + leftLength -= 1; + tempLeftValue = leftValue.substring(0, leftLength); + } else if (tempLeftValue.substring(leftLength - 2, leftLength - 1) === '%') { + leftLength -= 2; + tempLeftValue = leftValue.substring(0, leftLength); + } + + sectionURL += me.queryKeys[i] + '=' + tempLeftValue; + leftValue = leftValue.substring(leftLength); + if (tempLeftValue.length > 0) { + splitQuestUrl.push(sectionURL); + sectionURL = url; + keysCount = 0; + } + } + } else { + keysCount++; + if (sectionURL.indexOf('?') > -1) { + sectionURL += '&'; + } else { + sectionURL += '?'; + } + sectionURL += me.queryKeys[i] + '=' + me.queryValues[i]; + } + } + } + splitQuestUrl.push(sectionURL); + me.send( + splitQuestUrl, + 'RequestJSONPPromise.supermap_callbacks[' + uid + ']', + config && config.proxy + ); + return p; + }, + + getUid: function () { + var uid = new Date().getTime(), + random = Math.floor(Math.random() * 1e17); + return uid * 1000 + random; + }, + + send: function (splitQuestUrl, callback, proxy) { + var len = splitQuestUrl.length; + if (len > 0) { + var jsonpUserID = new Date().getTime(); + for (var i = 0; i < len; i++) { + var url = splitQuestUrl[i]; + if (url.indexOf('?') > -1) { + url += '&'; + } else { + url += '?'; + } + url += 'sectionCount=' + len; + url += '§ionIndex=' + i; + url += '&jsonpUserID=' + jsonpUserID; + if (proxy) { + url = decodeURIComponent(url); + url = proxy + encodeURIComponent(url); + } + fetch_jsonp_default()(url, { + jsonpCallbackFunction: callback, + timeout: 30000 + }); + } + } + }, + + GET: function (config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings(config.params); + return me.issue(config); + }, + + POST: function (config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + }, + + PUT: function (config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + }, + DELETE: function (config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + } +}; + +var CORS; +var RequestTimeout; +/** + * @function setCORS + * @description 设置是否允许跨域请求,全局配置,优先级低于 service 下的 crossOring 参数。 + * @category BaseTypes Util + * @param {boolean} cors - 是否允许跨域请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { setCORS } from '{npm}'; + * + * setCORS(cors); + * ``` + */ +var setCORS = function (cors) { + CORS = cors; +} +/** + * @function isCORS + * @description 是是否允许跨域请求。 + * @category BaseTypes Util + * @returns {boolean} 是否允许跨域请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { isCORS } from '{npm}'; + * + * const result = isCORS(); + * ``` + */ +var isCORS = function () { + if (CORS != undefined) { + return CORS; + } + return window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest(); +} +/** + * @function setRequestTimeout + * @description 设置请求超时时间。 + * @param {number} [timeout=45] - 请求超时时间,单位秒。 + * @private + * @usage + * ``` + * // 浏览器 + + + + // ES6 Import + import { setRequestTimeout } from '{npm}'; + + setRequestTimeout(timeout); + * ``` + */ +var setRequestTimeout = function (timeout) { + return RequestTimeout = timeout; +} +/** + * @function getRequestTimeout + * @description 获取请求超时时间。 + * @returns {number} 请求超时时间。 + * @private + * @usage + * ``` + * // 浏览器 + + + + // ES6 Import + import { getRequestTimeout } from '{npm}'; + + getRequestTimeout(); + * ``` + */ +var getRequestTimeout = function () { + return RequestTimeout || 45000; +} + +/** + * @name FetchRequest + * @namespace + * @category BaseTypes Util + * @description 获取请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { FetchRequest } from '{npm}'; + * + * const result = FetchRequest.commit(method, url, params, options); + * + * ``` + */ +var FetchRequest = { + /** + * @function FetchRequest.commit + * @description commit 请求。 + * @param {string} method - 请求方法。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + commit: function (method, url, params, options) { + method = method ? method.toUpperCase() : method; + switch (method) { + case 'GET': + return this.get(url, params, options); + case 'POST': + return this.post(url, params, options); + case 'PUT': + return this.put(url, params, options); + case 'DELETE': + return this.delete(url, params, options); + default: + return this.get(url, params, options); + } + }, + /** + * @function FetchRequest.supportDirectRequest + * @description supportDirectRequest 请求。 + * @param {string} url - 请求地址。 + * @param {Object} options - 请求的配置属性。 + * @returns {boolean} 是否允许跨域请求。 + */ + supportDirectRequest: function (url, options) { + if (Util.isInTheSameDomain(url)) { + return true; + } + if (options.crossOrigin != undefined) { + return options.crossOrigin; + } else { + return isCORS() || options.proxy; + } + }, + /** + * @function FetchRequest.get + * @description get 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + get: function (url, params, options) { + options = options || {}; + var type = 'GET'; + url = Util.urlAppend(url, this._getParameterString(params || {})); + url = this._processUrl(url, options); + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url, + data: params + }; + return RequestJSONPPromise.GET(config); + } + if (!this.urlIsLong(url)) { + return this._fetch(url, params, options, type); + } else { + return this._postSimulatie(type, url.substring(0, url.indexOf('?') - 1), params, options); + } + }, + /** + * @function FetchRequest.delete + * @description delete 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options -请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + delete: function (url, params, options) { + options = options || {}; + var type = 'DELETE'; + url = Util.urlAppend(url, this._getParameterString(params || {})); + url = this._processUrl(url, options); + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=DELETE", + data: params + }; + return RequestJSONPPromise.DELETE(config); + } + if (this.urlIsLong(url)) { + return this._postSimulatie(type, url.substring(0, url.indexOf('?') - 1), params, options); + } + return this._fetch(url, params, options, type); + }, + /** + * @function FetchRequest.post + * @description post 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + post: function (url, params, options) { + options = options || {}; + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=POST", + data: params + }; + return RequestJSONPPromise.POST(config); + } + return this._fetch(this._processUrl(url, options), params, options, 'POST'); + }, + /** + * @function FetchRequest.put + * @description put 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + put: function (url, params, options) { + options = options || {}; + url = this._processUrl(url, options); + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=PUT", + data: params + }; + return RequestJSONPPromise.PUT(config); + } + return this._fetch(url, params, options, 'PUT'); + }, + /** + * @function FetchRequest.urlIsLong + * @description url 的字节长度是否太长。 + * @param {string} url - 请求地址。 + * @returns {boolean} url 的字节长度是否太长。 + */ + urlIsLong: function (url) { + //当前url的字节长度。 + var totalLength = 0, + charCode = null; + for (var i = 0, len = url.length; i < len; i++) { + //转化为Unicode编码 + charCode = url.charCodeAt(i); + if (charCode < 0x007f) { + totalLength++; + } else if ((0x0080 <= charCode) && (charCode <= 0x07ff)) { + totalLength += 2; + } else if ((0x0800 <= charCode) && (charCode <= 0xffff)) { + totalLength += 3; + } + } + return totalLength < 2000 ? false : true; + }, + _postSimulatie: function (type, url, params, options) { + var separator = url.indexOf('?') > -1 ? '&' : '?'; + url += separator + '_method=' + type; + if (typeof params !== 'string') { + params = JSON.stringify(params); + } + return this.post(url, params, options); + }, + + _processUrl: function (url, options) { + if (this._isMVTRequest(url)) { + return url; + } + + if (url.indexOf('.json') === -1 && !options.withoutFormatSuffix) { + if (url.indexOf('?') < 0) { + url += '.json'; + } else { + var urlArrays = url.split('?'); + if (urlArrays.length === 2) { + url = urlArrays[0] + '.json?' + urlArrays[1]; + } + } + } + if (options && options.proxy) { + if (typeof options.proxy === 'function') { + url = options.proxy(url); + } else { + url = decodeURIComponent(url); + url = options.proxy + encodeURIComponent(url); + } + } + return url; + }, + + _fetch: function (url, params, options, type) { + options = options || {}; + options.headers = options.headers || {}; + if (!options.headers['Content-Type'] && !FormData.prototype.isPrototypeOf(params)) { + options.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; + } + if (options.timeout) { + return this._timeout( + options.timeout, + FetchRequest_fetch(url, { + method: type, + headers: options.headers, + body: type === 'PUT' || type === 'POST' ? params : undefined, + credentials: this._getWithCredentials(options), + mode: 'cors', + timeout: getRequestTimeout() + }).then(function (response) { + return response; + }) + ); + } + return FetchRequest_fetch(url, { + method: type, + body: type === 'PUT' || type === 'POST' ? params : undefined, + headers: options.headers, + credentials: this._getWithCredentials(options), + mode: 'cors', + timeout: getRequestTimeout() + }).then(function (response) { + return response; + }); + }, + + _getWithCredentials: function (options) { + if (options.withCredentials === true) { + return 'include'; + } + if (options.withCredentials === false) { + return 'omit'; + } + return 'same-origin'; + }, + + _fetchJsonp: function (url, options) { + options = options || {}; + return fetch_jsonp_default()(url, { + method: 'GET', + timeout: options.timeout + }).then(function (response) { + return response; + }); + }, + + _timeout: function (seconds, promise) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + reject(new Error('timeout')); + }, seconds); + promise.then(resolve, reject); + }); + }, + + _getParameterString: function (params) { + var paramsArray = []; + for (var key in params) { + var value = params[key]; + if (value != null && typeof value !== 'function') { + var encodedValue; + if (Array.isArray(value) || value.toString() === '[object Object]') { + encodedValue = encodeURIComponent(JSON.stringify(value)); + } else { + encodedValue = encodeURIComponent(value); + } + paramsArray.push(encodeURIComponent(key) + '=' + encodedValue); + } + } + return paramsArray.join('&'); + }, + + _isMVTRequest: function (url) { + return url.indexOf('.mvt') > -1 || url.indexOf('.pbf') > -1; + } +} + +;// CONCATENATED MODULE: ./src/common/security/SecurityManager.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SecurityManager + * @deprecatedclass SuperMap.SecurityManager + * @category Security + * @classdesc 安全管理中心,提供 iServer,iPortal,Online 统一权限认证管理。 + * > 使用说明: + * > 创建任何一个服务之前调用 {@link SecurityManager.registerToken}或 + * > {@link SecurityManager.registerKey}注册凭据。 + * > 发送请求时根据 url 或者服务 id 获取相应的 key 或者 token 并自动添加到服务地址中。 + * @usage + */ +class SecurityManager { + /** + * @description 从服务器获取一个token,在此之前要注册服务器信息。 + * @function SecurityManager.generateToken + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @param {TokenServiceParameter} tokenParam - token 申请参数。 + * @returns {Promise} 包含 token 信息的 Promise 对象。 + */ + + static generateToken(url, tokenParam) { + var serverInfo = this.servers[url]; + if (!serverInfo) { + return; + } + return FetchRequest.post(serverInfo.tokenServiceUrl, JSON.stringify(tokenParam.toJSON())).then(function( + response + ) { + return response.text(); + }); + } + + /** + * @description 注册安全服务器相关信息。 + * @function SecurityManager.registerServers + * @param {ServerInfo} serverInfos - 服务器信息。 + */ + static registerServers(serverInfos) { + this.servers = this.servers || {}; + if (!Util.isArray(serverInfos)) { + serverInfos = [serverInfos]; + } + for (var i = 0; i < serverInfos.length; i++) { + var serverInfo = serverInfos[i]; + this.servers[serverInfo.server] = serverInfo; + } + } + + /** + * @description 服务请求都会自动带上这个 token。 + * @function SecurityManager.registerToken + * @param {string} url -服务器域名+端口:如http://localhost:8090。 + * @param {string} token - token + */ + static registerToken(url, token) { + this.tokens = this.tokens || {}; + if (!url || !token) { + return; + } + var domain = this._getTokenStorageKey(url); + this.tokens[domain] = token; + } + + /** + * @description 注册 key,ids 为数组(存在一个 key 对应多个服务)。 + * @function SecurityManager.registerKey + * @param {Array} ids - 可以是服务 id 数组或者 url 地址数组或者 webAPI 类型数组。 + * @param {string} key - key + */ + static registerKey(ids, key) { + this.keys = this.keys || {}; + if (!ids || ids.length < 1 || !key) { + return; + } + + ids = Util.isArray(ids) ? ids : [ids]; + for (var i = 0; i < ids.length; i++) { + var id = this._getUrlRestString(ids[0]) || ids[0]; + this.keys[id] = key; + } + } + + /** + * @description 获取服务器信息。 + * @function SecurityManager.getServerInfo + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @returns {ServerInfo} 服务器信息。 + */ + static getServerInfo(url) { + this.servers = this.servers || {}; + return this.servers[url]; + } + + /** + * @description 根据 Url 获取token。 + * @function SecurityManager.getToken + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @returns {string} token + */ + static getToken(url) { + if (!url) { + return; + } + this.tokens = this.tokens || {}; + var domain = this._getTokenStorageKey(url); + return this.tokens[domain]; + } + + /** + * @description 根据 Url 获取 key。 + * @function SecurityManager.getKey + * @param {string} id - id + * @returns {string} key + */ + static getKey(id) { + this.keys = this.keys || {}; + var key = this._getUrlRestString(id) || id; + return this.keys[key]; + } + + /** + * @description iServer 登录验证。 + * @function SecurityManager.loginiServer + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + * @param {string} username - 用户名。 + * @param {string} password - 密码。 + * @param {boolean} [rememberme=false] - 是否记住。 + * @returns {Promise} 包含 iServer 登录请求结果的 Promise 对象。 + */ + static loginiServer(url, username, password, rememberme) { + url = Util.urlPathAppend(url, 'services/security/login'); + var loginInfo = { + username: username && username.toString(), + password: password && password.toString(), + rememberme: rememberme + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + } + }; + return FetchRequest.post(url, loginInfo, requestOptions).then(function(response) { + return response.json(); + }); + } + + /** + * @description iServer登出。 + * @function SecurityManager.logoutiServer + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + * @returns {Promise} 是否登出成功。 + */ + static logoutiServer(url) { + url = Util.urlPathAppend(url, 'services/security/logout'); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withoutFormatSuffix: true + }; + return FetchRequest.get(url, '', requestOptions) + .then(function() { + return true; + }) + .catch(function() { + return false; + }); + } + + /** + * @description Online 登录验证。 + * @function SecurityManager.loginOnline + * @param {string} callbackLocation - 跳转位置。 + * @param {boolean} [newTab=true] - 是否新窗口打开。 + */ + static loginOnline(callbackLocation, newTab) { + var loginUrl = SecurityManager.SSO + '/login?service=' + callbackLocation; + this._open(loginUrl, newTab); + } + + /** + * @description iPortal登录验证。 + * @function SecurityManager.loginiPortal + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + * @param {string} username - 用户名。 + * @param {string} password - 密码。 + * @returns {Promise} 包含 iPortal 登录请求结果的 Promise 对象。 + */ + static loginiPortal(url, username, password) { + url = Util.urlPathAppend(url, 'web/login'); + var loginInfo = { + username: username && username.toString(), + password: password && password.toString() + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withCredentials: true + }; + return FetchRequest.post(url, loginInfo, requestOptions).then(function(response) { + return response.json(); + }); + } + + /** + * @description iPortal 登出。 + * @function SecurityManager.logoutiPortal + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + * @returns {Promise} 如果登出成功,返回 true;否则返回 false。 + */ + static logoutiPortal(url) { + url = Util.urlPathAppend(url, 'services/security/logout'); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withCredentials: true, + withoutFormatSuffix: true + }; + return FetchRequest.get(url, '', requestOptions) + .then(function() { + return true; + }) + .catch(function() { + return false; + }); + } + + /** + * @description iManager 登录验证。 + * @function SecurityManager.loginManager + * @param {string} url - iManager 地址。地址参数为 iManager 首页地址,如: http://localhost:8390/imanager。 + * @param {Object} [loginInfoParams] - iManager 登录参数。 + * @param {string} loginInfoParams.userName - 用户名。 + * @param {string} loginInfoParams.password - 密码。 + * @param {Object} options + * @param {boolean} [options.isNewTab=true] - 不同域时是否在新窗口打开登录页面。 + * @returns {Promise} 包含 iManager 登录请求结果的 Promise 对象。 + */ + static loginManager(url, loginInfoParams, options) { + if (!Util.isInTheSameDomain(url)) { + var isNewTab = options ? options.isNewTab : true; + this._open(url, isNewTab); + return; + } + var requestUrl = Util.urlPathAppend(url, 'icloud/security/tokens'); + var params = loginInfoParams || {}; + var loginInfo = { + username: params.userName && params.userName.toString(), + password: params.password && params.password.toString() + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + Accept: '*/*', + 'Content-Type': 'application/json' + } + }; + var me = this; + return FetchRequest.post(requestUrl, loginInfo, requestOptions).then(function(response) { + response.text().then(function(result) { + me.imanagerToken = result; + return result; + }); + }); + } + + /** + * @description 清空全部验证信息。 + * @function SecurityManager.destroyAllCredentials + */ + static destroyAllCredentials() { + this.keys = null; + this.tokens = null; + this.servers = null; + } + + /** + * @description 清空令牌信息。 + * @function SecurityManager.destroyToken + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + */ + static destroyToken(url) { + if (!url) { + return; + } + var domain = this._getTokenStorageKey(url); + this.tokens = this.tokens || {}; + if (this.tokens[domain]) { + delete this.tokens[domain]; + } + } + + /** + * @description 清空服务授权码。 + * @function SecurityManager.destroyKey + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + */ + static destroyKey(url) { + if (!url) { + return; + } + this.keys = this.keys || {}; + var key = this._getUrlRestString(url) || url; + if (this.keys[key]) { + delete this.keys[key]; + } + } + + /** + * @description 服务URL追加授权信息,授权信息需先通过SecurityManager.registerKey或SecurityManager.registerToken注册。 + * @version 10.1.2 + * @function SecurityManager.appendCredential + * @param {string} url - 服务URL + * @returns {string} 绑定了token或者key的服务URL + */ + static appendCredential(url) { + var newUrl = url; + var value = this.getToken(url); + var credential = value ? new Credential(value, 'token') : null; + if (!credential) { + value = this.getKey(url); + credential = value ? new Credential(value, 'key') : null; + } + if (credential) { + newUrl = Util.urlAppend(newUrl, credential.getUrlParameters()); + } + return newUrl; + } + + static _open(url, newTab) { + newTab = newTab != null ? newTab : true; + var offsetX = window.screen.availWidth / 2 - this.INNER_WINDOW_WIDTH / 2; + var offsetY = window.screen.availHeight / 2 - this.INNER_WINDOW_HEIGHT / 2; + var options = + 'height=' + + this.INNER_WINDOW_HEIGHT + + ', width=' + + this.INNER_WINDOW_WIDTH + + ',top=' + + offsetY + + ', left=' + + offsetX + + ',toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no'; + if (newTab) { + window.open(url, 'login'); + } else { + window.open(url, 'login', options); + } + } + + static _getTokenStorageKey(url) { + var patten = /(.*?):\/\/([^\/]+)/i; + var result = url.match(patten); + if (!result) { + return url; + } + return result[0]; + } + + static _getUrlRestString(url) { + if (!url) { + return url; + } + // var patten = /http:\/\/(.*\/rest)/i; + var patten = /(http|https):\/\/(.*\/rest)/i; + var result = url.match(patten); + if (!result) { + return url; + } + return result[0]; + } +} +SecurityManager.INNER_WINDOW_WIDTH = 600; +SecurityManager.INNER_WINDOW_HEIGHT = 600; +SecurityManager.SSO = 'https://sso.supermap.com'; +SecurityManager.ONLINE = 'https://www.supermapol.com'; + +;// CONCATENATED MODULE: ./src/common/iManager/iManagerServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class IManagerServiceBase + * @aliasclass iManagerServiceBase + * @deprecatedclass SuperMap.iManagerServiceBase + * @classdesc iManager 服务基类(有权限限制的类需要实现此类)。 + * @category iManager + * @param {string} url - iManager 首页地址,如:http://localhost:8390/imanager。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class IManagerServiceBase { + + constructor(url,options) { + if (url) { + var end = url.substr(url.length - 1, 1); + this.serviceUrl = end === "/" ? url.substr(0, url.length - 2) : url; + } + this.options = options || {}; + this.CLASS_NAME = "SuperMap.iManagerServiceBase"; + } + + /** + * @function IManagerServiceBase.prototype.request + * @description 子类统一通过该方法发送请求。 + * @param {string} url - 请求 URL。 + * @param {string} [method='GET'] - 请求类型。 + * @param {Object} [requestOptions] - 请求选项。 + * @param {Object} param - 请求参数。 + * @description 发送请求。 + * @returns {Promise} Promise 对象。 + */ + request(method, url, param, requestOptions) { + requestOptions = requestOptions || { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json' + } + }; + if (!requestOptions.hasOwnProperty("withCredentials")) { + requestOptions['withCredentials'] = true; + } + requestOptions['crossOrigin'] = this.options.crossOrigin; + requestOptions['headers'] = this.options.headers; + var token = SecurityManager.imanagerToken; + if (token) { + if (!requestOptions.headers) { + requestOptions.headers = []; + } + requestOptions.headers['X-Auth-Token'] = token; + } + if (param) { + param = JSON.stringify(param); + } + return FetchRequest.commit(method, url, param, requestOptions).then(function (response) { + return response.json(); + }); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iManager/iManagerCreateNodeParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IManagerCreateNodeParam + * @aliasclass iManagerCreateNodeParam + * @deprecatedclass SuperMap.iManagerCreateNodeParam + * @classdesc iManager 创建节点参数。 + * @category iManager + * @param {Object} [params] - 节点参数。 + * @usage + */ +class IManagerCreateNodeParam { + + constructor(params) { + params = params || {}; + this.nodeSpec = 'SMALL'; //取值范围: ['SMALL','MEDIUM','LARGE'] 以及自定义的环境规格名称 + this.nodeCount = 1; //要创建vm的个数 + this.nodeName = ''; //vm名称 + this.password = ''; //vm的密码,空表示随机分配 + this.description = ''; //描述信息 + this.physicalMachineName = ''; //vm所属的物理机名称. + this.ips = []; //vm的ip,空数组表示随机分配 + this.userName = ''; //vm所属用户 + Util.extend(this, params); + } + +} + +;// CONCATENATED MODULE: ./src/common/iManager/iManager.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class IManager + * @aliasclass iManager + * @deprecatedclass SuperMap.iManager + * @classdesc iManager 服务类。 + * @category iManager + * @param {string} serviceUrl - iManager 首页地址。 + * @usage + */ +class IManager extends IManagerServiceBase { + + constructor(iManagerUrl) { + super(iManagerUrl); + } + + /** + * @function IManager.prototype.load + * @description 获取所有服务接口,验证是否已登录授权。 + * @returns {Promise} Promise 对象。 + */ + load() { + return this.request("GET", this.serviceUrl + '/web/api/service.json'); + } + + /** + * @function IManager.prototype.createIServer + * @param {IManagerCreateNodeParam} createParam - 创建参数。 + * @description 创建 iServer。 + * @returns {Promise} Promise 对象。 + */ + createIServer(createParam) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/server.json', new IManagerCreateNodeParam(createParam)); + } + + /** + * @function IManager.prototype.createIPortal + * @param {IManagerCreateNodeParam} createParam - 创建参数。 + * @description 创建 iPortal。 + * @returns {Promise} Promise 对象。 + */ + createIPortal(createParam) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/portal.json', new IManagerCreateNodeParam(createParam)); + } + + /** + * @function IManager.prototype.iServerList + * @description 获取所有创建的 iServer。 + * @returns {Promise} Promise 对象。 + */ + iServerList() { + return this.request("GET", this.serviceUrl + '/icloud/web/nodes/server.json'); + } + + /** + * @function IManager.prototype.iPortalList + * @description 获取所有创建的 iPortal。 + * @returns {Promise} Promise 对象。 + */ + iPortalList() { + return this.request("GET", this.serviceUrl + '/icloud/web/nodes/portal.json'); + } + + /** + * @function IManager.prototype.startNodes + * @param {Array.} ids - 需要启动节点的 ID 数组。e.g:['1']。 + * @description 启动节点。 + * @returns {Promise} Promise 对象。 + */ + startNodes(ids) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/started.json', ids); + } + + /** + * @function IManager.prototype.stopNodes + * @param {Array.} ids - 需要停止节点的 ID 数组。e.g:['1']。 + * @description 停止节点。 + * @returns {Promise} Promise 对象。 + */ + stopNodes(ids) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/stopped.json', ids); + } +} + + +;// CONCATENATED MODULE: ./src/common/iManager/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class IPortalServiceBase + * @aliasclass iPortalServiceBase + * @deprecatedclass SuperMap.iPortalServiceBase + * @classdesc iPortal 服务基类(有权限限制的类需要实现此类)。 + * @category iPortal/Online Core + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class IPortalServiceBase { + + constructor(url, options) { + options = options || {}; + this.serviceUrl = url; + this.CLASS_NAME = "SuperMap.iPortalServiceBase"; + this.withCredentials = options.withCredentials || false; + this.crossOrigin = options.crossOrigin + this.headers = options.headers + } + + /** + * @function IPortalServiceBase.prototype.request + * @description 子类统一通过该方法发送请求。 + * @param {string} [method='GET'] - 请求类型。 + * @param {string} url - 服务地址。 + * @param {Object} param - 请求参数。 + * @param {Object} [requestOptions] - fetch 请求配置项。 + * @returns {Promise} 返回包含请求结果的 Promise 对象。 + */ + + request(method, url, param, requestOptions = {headers: this.headers, crossOrigin: this.crossOrigin, withCredentials: this.withCredentials }) { + url = SecurityManager.appendCredential(url); + return FetchRequest.commit(method, url, param, requestOptions).then(function (response) { + return response.json(); + }); + } + + +} + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalQueryParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalQueryParam + * @aliasclass iPortalQueryParam + * @deprecatedclass SuperMap.iPortalQueryParam + * @classdesc iPortal 资源查询参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesQuery + * @param {Object} params - 可选参数。 + * @param {ResourceType} [params.resourceType] - 资源类型 + * @param {number} [params.pageSize] - 分页中每页大小。 + * @param {number} [params.currentPage] - 分页页码。 + * @param {OrderBy} [params.orderBy] - 排序字段。 + * @param {OrderType} [params.orderType] - 根据升序还是降序过滤。 + * @param {SearchType} [params.searchType] - 根据查询的范围进行过滤。 + * @param {Array} [params.tags] - 标签。 + * @param {Array} [params.dirIds] - 目录 id + * @param {Array} [params.resourceSubTypes] - 根据资源的子类型进行过滤。 + * @param {AggregationTypes} [params.aggregationTypes] - 聚合查询的类型。 + * @param {string} [params.text] - 搜索的关键词。 + * @param {Array} [params.groupIds] - 根据群组进行过滤。 + * @param {Array} [params.departmentIds] - 根据部门进行过滤。 + * @usage + */ +class IPortalQueryParam { + + constructor(params) { + params = params || {}; + this.resourceType = ""; // 空为全部 MAP SERVICE SCENE DATA INSIGHTS_WORKSPACE MAP_DASHBOARD + this.pageSize = 12; // 每页多少条 + this.currentPage = 1; // 第几页 + this.orderBy = "UPDATETIME"; // UPDATETIME HEATLEVEL + this.orderType = "DESC"; // DESC ASC + this.searchType = "PUBLIC"; // PUBLIC SHARETOME_RES MYDEPARTMENT_RES MYGROUP_RES MY_RES + this.tags = []; // 标签 + this.dirIds = []; // 类别 + this.resourceSubTypes = []; // 类型 + this.aggregationTypes = []; // TAG TYPE SUBTYPE + this.text = ""; // 搜索字段 + this.groupIds = []; // 群组Id过滤 + this.departmentIds = []; // 部门Id过滤 + Util.extend(this, params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalQueryResult.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalQueryResult + * @aliasclass iPortalQueryResult + * @deprecatedclass SuperMap.iPortalQueryResult + * @classdesc iPortal 资源结果集封装类。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesQuery + * @param {Object} queryResult - 可选参数。 + * @param {Array} [queryResult.content] - 页面内容。 + * @param {number} [queryResult.total] - 总记录数。 + * @param {number} [queryResult.currentPage] - 当前第几页。 + * @param {number} [queryResult.pageSize] - 每页大小。 + * @param {Object} [queryResult.aggregations] - 聚合查询的结果。 + * @usage + */ +class IPortalQueryResult { + constructor(queryResult) { + queryResult = queryResult || {}; + this.content = []; + this.total = 0; + this.currentPage = 1; + this.pageSize = 12; + this.aggregations = null; + Util.extend(this, queryResult); + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalResource.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalResource + * @aliasclass iPortalResource + * @deprecatedclass SuperMap.iPortalResource + * @classdesc iPortal 资源详情类。 + * @version 10.0.1 + * @category iPortal/Online Resources + * @param {string} portalUrl - 服务地址。 + * @param {Object} resourceInfo - 可选参数。 + * @param {Array} [resourceInfo.authorizeSetting] - 资源的授权信息 + * @param {string} [resourceInfo.bounds] - 资源的坐标范围 + * @param {string} [resourceInfo.bounds4326] - 资源的坐标范围,转换为EPSG 4326坐标系统后的地理范围。 + * @param {string} [resourceInfo.checkStatus] - 资源的审核状态,可以是:空,SUCCESSFUL,UNCHECKED,FAILED + * @param {Date} [resourceInfo.createTime] - 资源的创建时间 + * @param {string} [resourceInfo.description] - 资源描述 + * @param {number} [resourceInfo.dirId] - 资源所在的门户目录的id + * @param {number} [resourceInfo.epsgCode] - 门户资源基于的坐标系的EPSG值。 + * @param {number} [resourceInfo.heatLevel] - 记录资源的访问量或下载量。 + * @param {string} [resourceInfo.id] - 资源存储到ElasticSearch中的文档id + * @param {string} [resourceInfo.name] - 资源名称 + * @param {number} [resourceInfo.personalDirId] - 资源所在的个人目录的id + * @param {number} [resourceInfo.resourceId] - 资源表(maps,services等)里的id + * @param {string} [resourceInfo.resourceSubType] - 某类资源的具体子类型。 + * @param {ResourceType} [resourceInfo.resourceType] - 资源类型 + * @param {number} [resourceInfo.serviceRootUrlId] - 批量注册服务时,服务根地址的ID + * @param {Array} [resourceInfo.tags] - 资源的标签 + * @param {string} [resourceInfo.thumbnail] - 资源的缩略图 + * @param {Date} [resourceInfo.updateTime] - 资源的更新时间 + * @param {string} [resourceInfo.userName] - 搜索的关键词 + * @param {Object} [resourceInfo.sourceJSON] - 提供了门户项目返回的所有信息。 + * @extends {IPortalServiceBase} + * @usage + */ +class IPortalResource extends IPortalServiceBase { + constructor(portalUrl, resourceInfo) { + super(portalUrl); + resourceInfo = resourceInfo || {}; + this.authorizeSetting = []; + this.bounds = ""; + this.bounds4326 = ""; + this.checkStatus = ""; + this.createTime = 0; + this.description = null; + this.dirId = null; + this.epsgCode = 0; + this.heatLevel = 0; + this.id = 0; + this.name = ""; + this.personalDirId = null; + this.resourceId = 0; + this.resourceSubType = null; + this.resourceType = null; + this.serviceRootUrlId = null; + this.tags = null; + this.thumbnail = null; + this.updateTime = 0; + this.userName = ""; + this.sourceJSON = {};//返回门户资源详细信息 + Util.extend(this, resourceInfo); // INSIGHTS_WORKSPACE MAP_DASHBOARD + this.resourceUrl = portalUrl + "/web/"+this.resourceType.replace("_","").toLowerCase()+"s/" + this.resourceId; + if (this.withCredentials) { + this.resourceUrl = portalUrl + "/web/mycontent/"+this.resourceType.replace("_","").toLowerCase()+"s/" + this.resourceId; + } + // if (this.id) { + // this.mapUrl = mapUrl + "/" + this.id; + // } + } + + /** + * @function IPortalResource.prototype.load + * @description 加载资源信息。 + * @returns {Promise} 返回 Promise 对象。如果成功,Promise 没有返回值,请求返回结果自动填充到该类的属性中;如果失败,Promise 返回值包含错误信息。 + */ + load() { + var me = this; + return me.request("GET", me.resourceUrl + ".json") + .then(function (resourceInfo) { + if (resourceInfo.error) { + return resourceInfo; + } + me.sourceJSON = resourceInfo; + }); + } + + /** + * @function IPortalResource.prototype.update + * @description 更新资源属性信息。 + * @returns {Promise} 返回包含更新操作状态的 Promise 对象。 + */ + update() { + var resourceName = this.resourceType.replace("_","").toLowerCase(); + var options = { + headers: {'Content-Type': 'application/x-www-form-urlencoded'} + }; + if( resourceName === 'data') { + this.resourceUrl = this.resourceUrl + "/attributes.json"; + } + var entity = JSON.stringify(this.sourceJSON); + //对服务资源进行编辑时,请求体内容只留关键字字段(目前如果是全部字段 更新返回成功 但其实没有真正的更新) + if( resourceName === 'service') { + var serviceInfo = { + authorizeSetting:this.sourceJSON.authorizeSetting, + metadata:this.sourceJSON.metadata, + tags:this.sourceJSON.tags, + thumbnail:this.sourceJSON.thumbnail, + tokenRefreshUrl:this.sourceJSON.tokenRefreshUrl + }; + entity = JSON.stringify(serviceInfo); + } + return this.request("PUT", this.resourceUrl, entity, options); + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalShareParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalShareParam + * @aliasclass iPortalShareParam + * @deprecatedclass SuperMap.iPortalShareParam + * @classdesc iPortal 资源共享参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} params - 可选参数。 + * @param {ResourceType} [params.resourceType] - 资源类型。 + * @param {Array} [params.ids] - 资源的id数组。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @usage + */ +class IPortalShareParam { + + constructor(params) { + params = params || {}; + this.ids = []; + this.entities = []; + this.resourceType = ""; // MAP SERVICE SCENE DATA INSIGHTS_WORKSPACE MAP_DASHBOARD + Util.extend(this, params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortal.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class IPortal + * @aliasclass iPortal + * @deprecatedclass SuperMap.iPortal + * @classdesc 对接 SuperMap iPortal 基础服务。 + * @category iPortal/Online Resources + * @extends {IPortalServiceBase} + * @param {string} iportalUrl - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.withCredentials] - 请求是否携带 cookie。 + * @usage + */ +class IPortal extends IPortalServiceBase { + constructor(iportalUrl, options) { + super(iportalUrl, options); + this.iportalUrl = iportalUrl; + options = options || {}; + this.withCredentials = options.withCredentials || false; + } + + /** + * @function IPortal.prototype.load + * @description 加载页面。 + * @returns {Promise} 包含 iportal web 资源信息的 Promise 对象。 + */ + load() { + return FetchRequest.get(this.iportalUrl + "/web"); + } + + /** + * @function IPortal.prototype.queryResources + * @description 查询资源。 + * @version 10.0.1 + * @param {IPortalQueryParam} queryParams - 查询参数。 + * @returns {Promise} 包含所有资源结果的 Promise 对象。 + */ + queryResources(queryParams) { + if (!(queryParams instanceof IPortalQueryParam)) { + return new Promise( function(resolve){ + resolve( + "queryParams is not instanceof iPortalQueryParam !" + ); + }); + } + var me = this; + var resourceUrl = this.iportalUrl + "/gateway/catalog/resource/search.json"; + queryParams.t = new Date().getTime(); + return this.request("GET", resourceUrl, queryParams).then(function(result) { + var content = []; + result.content.forEach(function(item) { + content.push(new IPortalResource(me.iportalUrl, item)); + }); + let queryResult = new IPortalQueryResult(); + queryResult.content = content; + queryResult.total = result.total; + queryResult.currentPage = result.currentPage; + queryResult.pageSize = result.pageSize; + queryResult.aggregations = result.aggregations; + return queryResult; + }); + } + + + /** + * @function IPortal.prototype.updateResourcesShareSetting + * @description 更新共享设置。 + * @version 10.0.1 + * @param {IPortalShareParam} shareParams - 共享的参数。 + * @returns {Promise} 包含共享资源结果的 Promise 对象。 + */ + updateResourcesShareSetting(shareParams) { + if (!(shareParams instanceof IPortalShareParam)) { + return new Promise( function(resolve){ + resolve( + "shareParams is not instanceof iPortalShareParam !" + ); + }); + } + var resourceUrlName = shareParams.resourceType.replace("_","").toLowerCase()+"s"; + if(resourceUrlName === "datas"){ + resourceUrlName = "mycontent/"+resourceUrlName; + } + var cloneShareParams = { + ids: shareParams.ids, + entities: shareParams.entities + } + var shareUrl = this.iportalUrl + "/web/"+resourceUrlName+"/sharesetting.json"; + return this.request("PUT", shareUrl, JSON.stringify(cloneShareParams)).then(function(result) { + return result; + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalShareEntity.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalShareEntity + * @aliasclass iPortalShareEntity + * @deprecatedclass SuperMap.iPortalShareEntity + * @classdesc iPortal 资源共享实体参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} shareEntity - 可选参数。 + * @param {PermissionType} [shareEntity.permissionType] - 权限类型。 + * @param {EntityType} [shareEntity.entityType] - 实体类型。 + * @param {string} [shareEntity.entityName] - 实体 Name。对应的 USER(用户)、 ROLE(角色)、GROUP(用户组)、IPORTALGROUP(群组)的名称。 + * @param {number} [shareEntity.entityId] - 实体的 id。用于群组的授权。 + * @usage + */ +class IPortalShareEntity { + + constructor(shareEntity) { + shareEntity = shareEntity || {}; + this.permissionType = ""; // SEARCH READ READWRITE DOWNLOAD + this.entityType = ""; // USER DEPARTMENT IPORTALGROUP + this.entityName = "GUEST"; // GUEST or 具体用户 name + this.entityId = null; + Util.extend(this, shareEntity); + } +} + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalAddResourceParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class IPortalAddResourceParam + * @aliasclass iPortalAddResourceParam + * @deprecatedclass SuperMap.iPortalAddResourceParam + * @classdesc iPortal 添加资源参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} params - 可选参数。 + * @param {string} [params.rootUrl] - 服务地址。 + * @param {Array} [params.tags] - 标签。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @usage + */ + class IPortalAddResourceParam { + + constructor(params) { + params = params || {}; + this.rootUrl = ""; + this.tags = []; + this.entities = []; + Util.extend(this, params); + } + } + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalRegisterServiceParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalRegisterServiceParam + * @aliasclass iPortalRegisterServiceParam + * @deprecatedclass SuperMap.iPortalRegisterServiceParam + * @classdesc iPortal 注册服务参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 可选参数。 + * @param {string} [params.type] - 服务类型。 + * @param {Array} [params.tags] - 服务标签。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @param {Object} [params.metadata] - 服务元信息。 + * @param {Array} [params.addedMapNames] - 地图服务列表。 + * @param {Array} [params.addedSceneNames] - 场景服务列表。 + * @usage + */ +class IPortalRegisterServiceParam { + + constructor(params) { + params = params || {}; + this.type = ""; // SUPERMAP_REST ARCGIS_REST WMS WFS WCS WPS WMTS OTHERS + this.tags = []; + this.entities = []; + this.metadata = {}; + this.addedMapNames = []; + this.addedSceneNames = []; + Util.extend(this, params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalAddDataParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class IPortalAddDataParam + * @aliasclass iPortalAddDataParam + * @deprecatedclass SuperMap.iPortalAddDataParam + * @classdesc iPortal 上传/注册数据所需的参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.fileName - 文件名称 + * @param {DataItemType} params.type - 数据类型。 + * @param {Array} [params.tags] - 数据的标签 + * @param {IPortalDataMetaInfoParam} [params.dataMetaInfo] - 数据元信息 + * @usage + */ + class IPortalAddDataParam { + + constructor(params) { + params = params || {}; + this.fileName = ""; + this.type = ""; + this.tags = []; + this.dataMetaInfo = {}; + Util.extend(this, params); + } + } + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataMetaInfoParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class IPortalDataMetaInfoParam + * @aliasclass iPortalDataMetaInfoParam + * @deprecatedclass SuperMap.iPortalDataMetaInfoParam + * @classdesc iPortal 上传数据/注册数据元信息所需的参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.xField - X 坐标字段 + * @param {string} params.yField - Y 坐标字段 + * @param {number} params.xIndex - x所在列(关系型存储下CSV或EXCEL数据时必填) + * @param {number} params.yIndex - y所在列(关系型存储下CSV或EXCEL数据时必填) + * @param {Array.} [params.fieldTypes] - 设置字段类型(关系型存储下CSV或EXCEL数据时可选填)。默认类型为:WTEXT。该参数按照CSV文件字段顺序从左到右依次设置,其中默认字段类型可省略不设置。例如,CSV文件中有10个字段,如果只需设定第1,2,4个字段,可设置为['a','b',,'c']。 + * @param {string} params.separator - 分隔符(关系型存储下CSV数据时必填) + * @param {boolean} params.firstRowIsHead - 是否带表头(关系型存储下CSV数据时必填) + * @param {boolean} params.url - HDFS注册目录地址 + * @param {IPortalDataStoreInfoParam} params.dataStoreInfo - 注册数据时的数据存储信息 + * @usage + */ + class IPortalDataMetaInfoParam { + + constructor(params) { + params = params || {}; + this.xField = ""; + this.yField = ""; + this.fileEncoding = "UTF-8"; + + this.xIndex = 1; + this.yIndex = 1; + this.fieldTypes = []; + this.separator = ""; + this.firstRowIsHead = true; + + this.url = ""; + this.dataStoreInfo = {}; + Util.extend(this, params); + } + } + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataStoreInfoParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class IPortalDataStoreInfoParam + * @aliasclass iPortalDataStoreInfoParam + * @deprecatedclass SuperMap.iPortalDataStoreInfoParam + * @classdesc iPortal 注册一个HBASE HDFS数据存储类。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.type - 大数据文件共享类型和空间数据库类型,包括大数据文件共享HDFS 目录(HDFS)和空间数据库HBASE + * @param {string} params.url - HDFS数据存储目录地址 + * @param {IPortalDataConnectionInfoParam} [params.connectionInfo] - HBASE空间数据库服务的连接信息 + * @usage + */ + class IPortalDataStoreInfoParam { + + constructor(params) { + params = params || {}; + this.type = ""; + this.url = ""; + this.connectionInfo = {}; + Util.extend(this, params); + } + } + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataConnectionInfoParam.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class IPortalDataConnectionInfoParam + * @aliasclass iPortalDataConnectionInfoParam + * @deprecatedclass SuperMap.iPortalDataConnectionInfoParam + * @classdesc iPortal HBASE数据源连接信息类。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.dataBase - 数据源连接的数据库名。 + * @param {string} params.server - 服务地址。 + * @usage + */ + class IPortalDataConnectionInfoParam { + + constructor(params) { + params = params || {}; + this.dataBase = ""; + this.server = ""; + Util.extend(this, params); + } + } + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalUser.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class IPortalUser + * @aliasclass iPortalUser + * @deprecatedclass SuperMap.iPortalUser + * @classdesc iPortal 门户中用户信息的封装类。用于管理用户资源,包括可删除,添加资源。 + * @version 10.0.1 + * @category iPortal/Online Resources + * @param {string} iportalUrl - 服务地址。 + * @extends {IPortalServiceBase} + * @usage + */ +class IPortalUser extends IPortalServiceBase { + constructor(iportalUrl) { + super(iportalUrl); + this.iportalUrl = iportalUrl; + } + + /** + * @function IPortalUser.prototype.deleteResources + * @description 删除资源。 + * @param {Object} params - 删除资源所需的参数对象:{ids,resourceType}。 + * @returns {Promise} 返回包含删除操作状态的 Promise 对象。 + */ + deleteResources(params) { + var resourceName = params.resourceType.replace("_","").toLowerCase(); + var deleteResourceUrl = this.iportalUrl+"/web/" + resourceName +"s.json?ids=" + encodeURI(JSON.stringify(params.ids)); + if( resourceName === 'data') { + deleteResourceUrl = this.iportalUrl + "/web/mycontent/datas/delete.json"; + return this.request("POST", deleteResourceUrl, JSON.stringify(params.ids)); + } + return this.request("DELETE", deleteResourceUrl); + } + + /** + * @function IPortalUser.prototype.addMap + * @description 添加地图。 + * @version 10.1.0 + * @param {IPortalAddResourceParam} addMapParams - 添加地图的参数。 + * @returns {Promise} 返回包含添加地图结果的 Promise 对象。 + */ + addMap(addMapParams) { + if (!(addMapParams instanceof IPortalAddResourceParam)) { + return this.getErrMsgPromise("addMapParams is not instanceof IPortalAddResourceParam !"); + } + let cloneAddMapParams = { + rootUrl: addMapParams.rootUrl, + tags: addMapParams.tags, + authorizeSetting: addMapParams.entities + } + let addMapUrl = this.iportalUrl + "/web/maps/batchaddmaps.json"; + return this.request("POST", addMapUrl, JSON.stringify(cloneAddMapParams)).then(function(result) { + return result; + }); + } + + /** + * @function IPortalUser.prototype.addScene + * @description 添加场景。 + * @version 10.1.0 + * @param {IPortalAddResourceParam} addSceneParams - 添加场景的参数。 + * @returns {Promise} 返回包含添加场景结果的 Promise 对象。 + */ + addScene(addSceneParams) { + if (!(addSceneParams instanceof IPortalAddResourceParam)) { + return this.getErrMsgPromise("addSceneParams is not instanceof IPortalAddResourceParam !"); + } + let cloneAddSceneParams = { + rootUrl: addSceneParams.rootUrl, + tags: addSceneParams.tags, + authorizeSetting: addSceneParams.entities + } + let addSceneUrl = this.iportalUrl + "/web/scenes/batchaddscenes.json"; + return this.request("POST", addSceneUrl, JSON.stringify(cloneAddSceneParams)).then(function(result) { + return result; + }); + } + + /** + * @function IPortalUser.prototype.registerService + * @description 注册服务。 + * @version 10.1.0 + * @param {IPortalRegisterServiceParam} registerParams - 注册服务的参数。 + * @returns {Promise} 返回包含注册服务结果的 Promise 对象。 + */ + registerService(registerParams) { + if(!(registerParams instanceof IPortalRegisterServiceParam)) { + return this.getErrMsgPromise("registerParams is not instanceof IPortalRegisterServiceParam !"); + } + let cloneRegisterParams = { + type: registerParams.type, + tags: registerParams.tags, + authorizeSetting: registerParams.entities, + metadata: registerParams.metadata, + addedMapNames: registerParams.addedMapNames, + addedSceneNames: registerParams.addedSceneNames + } + let registerUrl = this.iportalUrl + "/web/services.json"; + return this.request("POST", registerUrl, JSON.stringify(cloneRegisterParams)).then(result => { + return result; + }); + } + + /** + * @function IPortalUser.prototype.getErrMsgPromise + * @description 获取包含错误信息的Promise对象。 + * @version 10.1.0 + * @param {string} errMsg - 传入的错误信息。 + * @returns {Promise} 返回包含错误信息的 Promise 对象。 + */ + getErrMsgPromise(errMsg) { + return new Promise(resolve => { + resolve(errMsg); + }) + } + + /** + * @function IPortalUser.prototype.uploadDataRequest + * @description 上传数据。 + * @version 10.1.0 + * @param {number} id - 上传数据的资源id。 + * @param {Object} formData - 请求体为文本数据流。 + * @returns {Promise} 返回包含上传数据操作的 Promise 对象。 + */ + uploadDataRequest(id,formData) { + var uploadDataUrl = this.iportalUrl + "/web/mycontent/datas/"+id+"/upload.json"; + return this.request("POST",uploadDataUrl,formData); + } + + /** + * @function IPortalUser.prototype.addData + * @description 上传/注册数据。 + * @version 10.1.0 + * @param {IPortalAddDataParam} params - 上传/注册数据所需的参数。 + * @param {Object} [formData] - 请求体为文本数据流(上传数据时传入)。 + * @returns {Promise} 返回上传/注册数据的 Promise 对象。 + */ + addData(params,formData) { + if(!(params instanceof IPortalAddDataParam)){ + return this.getErrMsgPromise("params is not instanceof iPortalAddDataParam !"); + } + var datasUrl = this.iportalUrl + "/web/mycontent/datas.json"; + var entity = { + fileName:params.fileName, + tags:params.tags, + type:params.type + }; + var type = params.type.toLowerCase(); + var dataMetaInfo; + if(type === "excel" || type === "csv"){ + if(!(params.dataMetaInfo instanceof IPortalDataMetaInfoParam)){ + return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !"); + } + dataMetaInfo = { + xField:params.dataMetaInfo.xField, + yField:params.dataMetaInfo.yField + } + if(type === 'csv') { + dataMetaInfo.fileEncoding = params.dataMetaInfo.fileEncoding + } + entity.coordType = "WGS84"; + entity.dataMetaInfo = dataMetaInfo; + }else if(type === "hdfs" || type === "hbase") { + if(!(params.dataMetaInfo instanceof IPortalDataMetaInfoParam)){ + return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !"); + } + if(!(params.dataMetaInfo.dataStoreInfo instanceof IPortalDataStoreInfoParam)){ + return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo is not instanceof iPortalDataStoreInfoParam !"); + } + var dataStoreInfo = { + type:params.dataMetaInfo.dataStoreInfo.type + } + switch (type) { + case "hdfs": + dataStoreInfo.url = params.dataMetaInfo.dataStoreInfo.url; + dataMetaInfo = { + url: params.dataMetaInfo.url, + dataStoreInfo:dataStoreInfo + } + break; + case "hbase": + if(!(params.dataMetaInfo.dataStoreInfo.connectionInfo instanceof IPortalDataConnectionInfoParam)){ + return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo.connectionInfo is not instanceof iPortalDataConnectionInfoParam !"); + } + dataStoreInfo.connectionInfo = { + dataBase:params.dataMetaInfo.dataStoreInfo.connectionInfo.dataBase, + server:params.dataMetaInfo.dataStoreInfo.connectionInfo.server, + engineType:'HBASE' + } + dataStoreInfo.datastoreType = "SPATIAL";//该字段SPATIAL表示HBASE注册 + dataMetaInfo = { + dataStoreInfo:dataStoreInfo + } + break; + } + entity.dataMetaInfo = dataMetaInfo; + } + return this.request("POST",datasUrl,JSON.stringify(entity)).then(res=>{ + if(type === "hdfs" || type === "hbase"){ + return res; + }else { + if(res.childID) { + return this.uploadDataRequest(res.childID,formData); + }else { + return res.customResult; + } + } + }) + } + + /** + * @function IPortalUser.prototype.publishOrUnpublish + * @description 发布/取消发布。 + * @version 10.1.0 + * @param {Object} options - 发布/取消发布数据服务所需的参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @param {boolean} forPublish - 是否取消发布。 + * @returns {Promise} 返回发布/取消发布数据服务的 Promise 对象。 + */ + publishOrUnpublish(option,forPublish){ + if(!option.dataId || !option.serviceType) { + return this.getErrMsgPromise("option.dataID and option.serviceType are Required!"); + } + var dataId = option.dataId; + var dataServiceId = option.dataServiceId; + var serviceType = option.serviceType; + var publishUrl = this.iportalUrl + "/web/mycontent/datas/" + dataId + "/publishstatus.json?serviceType=" + serviceType; + if (dataServiceId) { + publishUrl += "&dataServiceId=" + dataServiceId; + } + return this.request("PUT",publishUrl,JSON.stringify(forPublish)).then(res=>{ + // 发起服务状态查询 + if(forPublish) { + // 发布服务的结果异步处理 + // var publishStateUrl = this.iportalUrl + "web/mycontent/datas/" + dataId + "/publishstatus.rjson"; + if (!dataServiceId) { // 发布服务时会回传serviceIDs,发布服务之前serviceIDs为空 + dataServiceId = res.customResult; + } + return dataServiceId; + }else { + // 取消发布的结果同步处理 + return res; + } + }); + } + + /** + * @function IPortalUser.prototype.getDataPublishedStatus + * @description 查询服务状态,发起服务状态查询。 + * @version 10.1.0 + * @param {number} dataId - 查询服务状态的数据项id。 + * @param {string} dataServiceId - 发布的服务id。 + * @returns {Promise} 返回查询服务状态的 Promise 对象。 + */ + getDataPublishedStatus(dataId,dataServiceId){ + var publishStateUrl = this.iportalUrl + "/web/mycontent/datas/" + dataId + "/publishstatus.json?dataServiceId="+dataServiceId+"&forPublish=true"; + return this.request("GET",publishStateUrl); + } + + /** + * @function IPortalUser.prototype.unPublishedDataService + * @description 取消发布。 + * @version 10.1.0 + * @param {Object} options - 取消发布服务具体参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @returns {Promise} 返回取消发布数据服务的 Promise 对象。 + */ + unPublishDataService(option){ + return this.publishOrUnpublish(option,false); + } + + /** + * @function IPortalUser.prototype.publishedDataService + * @description 发布数据服务。 + * @version 10.1.0 + * @param {Object} options - 发布数据服务具体参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @returns {Promise} 返回发布数据服务的 Promise 对象。 + */ + publishDataService(option){ + return this.publishOrUnpublish(option,true); + } +} + +;// CONCATENATED MODULE: ./src/common/iPortal/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/CommonServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class CommonServiceBase + * @deprecatedclass SuperMap.CommonServiceBase + * @category iServer Core + * @classdesc 对接 iServer 各种服务的 Service 的基类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class CommonServiceBase { + constructor(url, options) { + let me = this; + + this.EVENT_TYPES = ['processCompleted', 'processFailed']; + + this.events = null; + + this.eventListeners = null; + + this.url = null; + + this.urls = null; + + this.proxy = null; + + this.index = null; + + this.length = null; + + this.options = null; + + this.totalTimes = null; + + this.POLLING_TIMES = 3; + + this._processSuccess = null; + + this._processFailed = null; + + this.isInTheSameDomain = null; + + this.withCredentials = false; + + if (Util.isArray(url)) { + me.urls = url; + me.length = url.length; + me.totalTimes = me.length; + if (me.length === 1) { + me.url = url[0]; + } else { + me.index = parseInt(Math.random() * me.length); + me.url = url[me.index]; + } + } else { + me.totalTimes = 1; + me.url = url; + } + + if (Util.isArray(url) && !me.isServiceSupportPolling()) { + me.url = url[0]; + me.totalTimes = 1; + } + + options = options || {}; + this.crossOrigin = options.crossOrigin; + this.headers = options.headers; + Util.extend(this, options); + + me.isInTheSameDomain = Util.isInTheSameDomain(me.url); + + me.events = new Events(me, null, me.EVENT_TYPES, true); + if (me.eventListeners instanceof Object) { + me.events.on(me.eventListeners); + } + + this.CLASS_NAME = 'SuperMap.CommonServiceBase'; + } + + /** + * @function CommonServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy() { + let me = this; + if (Util.isArray(me.urls)) { + me.urls = null; + me.index = null; + me.length = null; + me.totalTimes = null; + } + me.url = null; + me.options = null; + me._processSuccess = null; + me._processFailed = null; + me.isInTheSameDomain = null; + + me.EVENT_TYPES = null; + if (me.events) { + me.events.destroy(); + me.events = null; + } + if (me.eventListeners) { + me.eventListeners = null; + } + } + + /** + * @function CommonServiceBase.prototype.request + * @description: 该方法用于向服务发送请求。 + * @param {Object} options - 参数。 + * @param {string} [options.method='GET'] - 请求方式,包括 "GET","POST","PUT","DELETE"。 + * @param {string} [options.url] - 发送请求的地址。 + * @param {Object} [options.params] - 作为查询字符串添加到 URL 中的一组键值对,此参数只适用于 GET 方式发送的请求。 + * @param {string} [options.data] - 发送到服务器的数据。 + * @param {function} options.success - 请求成功后的回调函数。 + * @param {function} options.failure - 请求失败后的回调函数。 + * @param {Object} [options.scope] - 如果回调函数是对象的一个公共方法,设定该对象的范围。 + * @param {boolean} [options.isInTheSameDomain] - 请求是否在当前域中。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + */ + request(options) { + let me = this; + options.url = options.url || me.url; + options.proxy = options.proxy || me.proxy; + options.withCredentials = options.withCredentials != undefined ? options.withCredentials : me.withCredentials; + options.crossOrigin = options.crossOrigin != undefined ? options.crossOrigin : me.crossOrigin; + options.headers = options.headers || me.headers; + options.isInTheSameDomain = me.isInTheSameDomain; + //为url添加安全认证信息片段 + options.url = SecurityManager.appendCredential(options.url); + + me.calculatePollingTimes(); + me._processSuccess = options.success; + me._processFailed = options.failure; + options.scope = me; + options.success = me.getUrlCompleted; + options.failure = me.getUrlFailed; + me.options = options; + me._commit(me.options); + } + + /** + * @function CommonServiceBase.prototype.getUrlCompleted + * @description 请求成功后执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + getUrlCompleted(result) { + let me = this; + me._processSuccess(result); + } + + /** + * @function CommonServiceBase.prototype.getUrlFailed + * @description 请求失败后执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + getUrlFailed(result) { + let me = this; + if (me.totalTimes > 0) { + me.totalTimes--; + me.ajaxPolling(); + } else { + me._processFailed(result); + } + } + + /** + * + * @function CommonServiceBase.prototype.ajaxPolling + * @description 请求失败后,如果剩余请求失败次数不为 0,重新获取 URL 发送请求 + */ + ajaxPolling() { + let me = this, + url = me.options.url, + re = /^http:\/\/([a-z]{9}|(\d+\.){3}\d+):\d{0,4}/; + me.index = parseInt(Math.random() * me.length); + me.url = me.urls[me.index]; + url = url.replace(re, re.exec(me.url)[0]); + me.options.url = url; + me.options.isInTheSameDomain = Util.isInTheSameDomain(url); + me._commit(me.options); + } + + /** + * @function CommonServiceBase.prototype.calculatePollingTimes + * @description 计算剩余请求失败执行次数。 + */ + calculatePollingTimes() { + let me = this; + if (me.times) { + if (me.totalTimes > me.POLLING_TIMES) { + if (me.times > me.POLLING_TIMES) { + me.totalTimes = me.POLLING_TIMES; + } else { + me.totalTimes = me.times; + } + } else { + if (me.times < me.totalTimes) { + me.totalTimes = me.times; + } + } + } else { + if (me.totalTimes > me.POLLING_TIMES) { + me.totalTimes = me.POLLING_TIMES; + } + } + me.totalTimes--; + } + + /** + * @function CommonServiceBase.prototype.isServiceSupportPolling + * @description 判断服务是否支持轮询。 + */ + isServiceSupportPolling() { + let me = this; + return !( + me.CLASS_NAME === 'SuperMap.REST.ThemeService' || me.CLASS_NAME === 'SuperMap.REST.EditFeaturesService' + ); + } + + /** + * @function CommonServiceBase.prototype.serviceProcessCompleted + * @description 状态完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + result = Util.transformResult(result); + this.events.triggerEvent('processCompleted', { + result: result + }); + } + + /** + * @function CommonServiceBase.prototype.serviceProcessFailed + * @description 状态失败,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessFailed(result) { + result = Util.transformResult(result); + let error = result.error || result; + this.events.triggerEvent('processFailed', { + error: error + }); + } + + _commit(options) { + if (options.method === 'POST' || options.method === 'PUT' || options.method === 'PATCH') { + if (options.params) { + options.url = Util.urlAppend(options.url, Util.getParameterString(options.params || {})); + } + if (typeof options.data === 'object') { + try { + options.params = Util.toJSON(options.data); + } catch (e) { + console.log('不是json对象'); + } + } else { + options.params = options.data; + } + } + FetchRequest.commit(options.method, options.url, options.params, { + headers: options.headers, + withCredentials: options.withCredentials, + crossOrigin: options.crossOrigin, + timeout: options.async ? 0 : null, + proxy: options.proxy + }) + .then(function (response) { + if (response.text) { + return response.text(); + } + if (response.json) { + return response.json(); + } + return response; + }) + .then(function (text) { + let requestResult = text; + if (typeof text === 'string') { + requestResult = new JSONFormat().read(text); + } + if ( + !requestResult || + requestResult.error || + (requestResult.code >= 300 && requestResult.code !== 304) + ) { + if (requestResult && requestResult.error) { + requestResult = { + error: requestResult.error + }; + } else { + requestResult = { + error: requestResult + }; + } + } + return requestResult; + }) + .catch(function (e) { + return { error: e }; + }) + .then((requestResult) => { + if (requestResult.error) { + var failure = options.scope ? FunctionExt.bind(options.failure, options.scope) : options.failure; + failure(requestResult); + } else { + requestResult.succeed = requestResult.succeed == undefined ? true : requestResult.succeed; + var success = options.scope ? FunctionExt.bind(options.success, options.scope) : options.success; + success(requestResult); + } + }); + } +} + + +/** + * 服务器请求回调函数 + * @callback RequestCallback + * @category BaseTypes Util + * @example + * var requestCallback = function (serviceResult){ + * console.log(serviceResult.result); + * } + * new QueryService(url).queryByBounds(param, requestCallback); + * @param {Object} serviceResult + * @param {Object} serviceResult.result 服务器返回结果。 + * @param {Object} serviceResult.object 发布应用程序事件的对象。 + * @param {Object} serviceResult.type 事件类型。 + * @param {Object} serviceResult.element 接受浏览器事件的 DOM 节点。 + */ + +;// CONCATENATED MODULE: ./src/common/iServer/GeoCodingParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeoCodingParameter + * @deprecatedclass SuperMap.GeoCodingParameter + * @category iServer AddressMatch + * @classdesc 地理正向匹配参数类。 + * @param {Object} options - 参数。 + * @param {string} options.address - 地点关键词。 + * @param {number} [options.fromIndex] - 设置返回对象的起始索引值。 + * @param {number} [options.toIndex] - 设置返回对象的结束索引值。 + * @param {Array.} [options.filters] - 过滤字段,限定查询区域。 + * @param {string} [options.prjCoordSys] - 查询结果的坐标系。 + * @param {number} [options.maxReturn] - 最大返回结果数。 + * @usage + */ +class GeoCodingParameter { + constructor(options) { + if (options.filters && typeof(options.filters) === 'string') { + options.filters = options.filters.split(','); + } + /** + * @member {string} GeoCodingParameter.prototype.address + * @description 地点关键词。 + */ + this.address = null; + + /** + * @member {number} [GeoCodingParameter.prototype.fromIndex] + * @description 设置返回对象的起始索引值。 + */ + this.fromIndex = null; + + /** + * @member {number} [GeoCodingParameter.prototype.toIndex] + * @description 设置返回对象的结束索引值。 + */ + this.toIndex = null; + + /** + * @member {Array.} [GeoCodingParameter.prototype.filters] + * @description 过滤字段,限定查询区域。 + */ + this.filters = null; + + /** + * @member {string} [GeoCodingParameter.prototype.prjCoordSys] + * @description 查询结果的坐标系。 + */ + this.prjCoordSys = null; + + /** + * @member {number} [GeoCodingParameter.prototype.maxReturn] + * @description 最大返回结果数。 + */ + this.maxReturn = null; + Util.extend(this, options); + } + + /** + * @function GeoCodingParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.address = null; + this.fromIndex = null; + this.toIndex = null; + this.filters = null; + this.prjCoordSys = null; + this.maxReturn = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeoDecodingParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeoDecodingParameter + * @deprecatedclass SuperMap.GeoDecodingParameter + * @category iServer AddressMatch + * @classdesc 地理反向匹配参数类。 + * @param {Object} options - 参数。 + * @param {number} options.x - 查询位置的横坐标。 + * @param {number} options.y - 查询位置的纵坐标。 + * @param {number} [options.fromIndex] - 设置返回对象的起始索引值。 + * @param {Array.} [options.filters] - 过滤字段,限定查询区域。 + * @param {string} [options.prjCoordSys] - 查询结果的坐标系。 + * @param {number} [options.maxReturn] - 最大返回结果数。 + * @param {number} [options.geoDecodingRadius] - 查询半径。 + * @usage + */ +class GeoDecodingParameter { + + + constructor(options) { + + if (options.filters) { + options.filters = options.filters.split(','); + } + /** + * @member {number} GeoDecodingParameter.prototype.x + * @description 查询位置的横坐标。 + */ + this.x = null; + + /** + * @member {number} GeoDecodingParameter.prototype.y + * @description 查询位置的纵坐标。 + */ + this.y = null; + /** + * @member {number} [GeoDecodingParameter.prototype.fromIndex] + * @description 设置返回对象的起始索引值。 + */ + this.fromIndex = null; + + /** + * @member {number} [GeoDecodingParameter.prototype.toIndex] + * @description 设置返回对象的结束索引值。 + */ + this.toIndex = null; + + /** + * @member {Array.} [GeoDecodingParameter.prototype.filters] + * @description 过滤字段,限定查询区域。 + */ + this.filters = null; + + /** + * @member {string} [GeoDecodingParameter.prototype.prjCoordSys] + * @description 查询结果的坐标系。 + */ + this.prjCoordSys = null; + + /** + * @member {number} [GeoDecodingParameter.prototype.maxReturn] + * @description 最大返回结果数。 + */ + this.maxReturn = null; + + /** + * @member {number} GeoDecodingParameter.prototype.geoDecodingRadius + * @description 查询半径。 + */ + this.geoDecodingRadius = null; + Util.extend(this, options); + } + + /** + * @function GeoDecodingParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.x = null; + this.y = null; + this.fromIndex = null; + this.toIndex = null; + this.filters = null; + this.prjCoordSys = null; + this.maxReturn = null; + this.geoDecodingRadius = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/AddressMatchService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class AddressMatchService + * @deprecatedclass SuperMap.AddressMatchService + * @category iServer AddressMatch + * @classdesc 地址匹配服务,包括正向匹配和反向匹配。 + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class AddressMatchService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + this.options = options || {}; + this.CLASS_NAME = 'SuperMap.AddressMatchService'; + } + + /** + * @function AddressMatchService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function AddressMatchService.prototype.code + * @param {string} url - 正向地址匹配服务地址。 + * @param {GeoCodingParameter} params - 正向地址匹配服务参数。 + */ + code(url, params) { + if (!(params instanceof GeoCodingParameter)) { + return; + } + this.processAsync(url, params); + } + + /** + * @function AddressMatchService.prototype.decode + * @param {string} url - 反向地址匹配服务地址。 + * @param {GeoDecodingParameter} params - 反向地址匹配服务参数。 + */ + decode(url, params) { + if (!(params instanceof GeoDecodingParameter)) { + return; + } + this.processAsync(url, params); + } + + /** + * @function AddressMatchService.prototype.processAsync + * @description 负责将客户端的动态分段服务参数传递到服务端。 + * @param {string} url - 服务地址。 + * @param {Object} params - 参数。 + */ + + processAsync(url, params) { + this.request({ + method: 'GET', + url, + params, + scope: this, + success: this.serviceProcessCompleted, + failure: this.serviceProcessFailed + }); + } + + /** + * @function AddressMatchService.prototype.serviceProcessCompleted + * @param {Object} result - 服务器返回的结果对象。 + * @description 服务流程是否完成 + */ + serviceProcessCompleted(result) { + if (result.succeed) { + delete result.succeed; + } + super.serviceProcessCompleted(result); + } + + /** + * @function AddressMatchService.prototype.serviceProcessCompleted + * @param {Object} result - 服务器返回的结果对象。 + * @description 服务流程是否失败 + */ + serviceProcessFailed(result) { + super.serviceProcessFailed(result); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/AggregationParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class AggregationParameter + * @deprecatedclass SuperMap.AggregationParameter + * @classdesc 聚合查询参数设置,该参数仅支持数据来源 Elasticsearch 服务的数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 参数。 + * @param {string} options.aggName - 聚合名称。 + * @param {string} options.aggFieldName - 聚合字段。 + * @usage + */ +class AggregationParameter { + constructor(options) { + /** + * @member {string} AggregationParameter.prototype.aggName + * @description 聚合名称。 + */ + this.aggName = null; + /** + * @member {string} AggregationParameter.prototype.aggFieldName + * @description 聚合字段。 + */ + this.aggFieldName = null; + + this.CLASS_NAME = 'SuperMap.AggregationParameter'; + Util.extend(this, options); + } + + destroy() { + var me = this; + me.aggName = null; + me.aggFieldName = null; + me.aggType = null; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/BucketAggParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BucketAggParameter + * @deprecatedclass SuperMap.BucketAggParameter + * @classdesc 子聚合类查询参数设置,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 参数。 + * @param {Array.} options.subAggs - 子聚合类集合。 + * @extends {AggregationParameter} + * @usage + */ +class BucketAggParameter extends AggregationParameter { + constructor(options) { + super(); + /** + * @member {Array.} BucketAggParameter.prototype.subAggs + * @description 子聚合类集合。 + */ + this.subAggs = null; + this.aggType = null; + + this.CLASS_NAME = 'SuperMap.BucketAggParameter'; + Util.extend(this, options); + } + + destroy() { + var me = this; + if (me.subAggs) { + me.subAggs = null; + } + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/MetricsAggParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class MetricsAggParameter + * @deprecatedclass SuperMap.MetricsAggParameter + * @classdesc 指标聚合查询参数类,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 可选参数。 + * @param {MetricsAggType} [options.aggType = 'avg'] - 聚合类型。 + * @extends {AggregationParameter} + * @usage + */ +class MetricsAggParameter extends AggregationParameter { + constructor(option) { + super(); + /** + * @member {MetricsAggType} [MetricsAggParameter.prototype.aggType=MetricsAggType.AVG] + * @description 指标聚合类型。 + */ + this.aggType = MetricsAggType.AVG; + + Util.extend(this, option); + this.CLASS_NAME = 'SuperMap.MetricsAggParameter'; + } + + destroy() { + super.destroy(); + var me = this; + me.aggType = null; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/AreaSolarRadiationParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class AreaSolarRadiationParameters + * @deprecatedclass SuperMap.AreaSolarRadiationParameters + * @category iServer SpatialAnalyst SolarRadiationAnalyst + * @classdesc 地区太阳辐射参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做地区太阳辐射数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"的形式来表示,例如:JingjinTerrain@Jingjin。 + * @param {string} options.targetDatasourceName - 指定的存储结果数据集的数据源名称, 例如:"Jingjin"。 + * @param {string} options.totalGridName - 指定地区太阳辐射总辐射量数据集的名称。 + * @param {string} options.diffuseDatasetGridName - 指定地区太阳辐射散射辐射量数据集的名称。 + * @param {string} options.durationDatasetGridName - 指定地区太阳辐射太阳直射持续时间数据集的名称。 + * @param {string} options.directDatasetGridName - 指定地区太阳辐射直射辐射量数据集的名称。 + * @param {number} options.latitude - 待计算区域的纬度值。 + * @param {string} [options.timeMode = 'MULTIDAYS'] - 时间模式。可选值"WITHINDAY"(单日)或"MULTIDAYS"(多日)。 + * @param {number} options.dayStart - 起始日期(年内的第几天)。 + * @param {number} options.dayEnd - 结束日期(年内的第几天)。 + * @param {number} [options.hourStart] - 起始时间(一天中的第几个小时)。 + * @param {number} [options.hourEnd] - 结束时间(一天中的第几个小时)。 + * @param {number} [options.transmittance] - 太阳辐射穿过大气的透射率。 + * @param {number} [options.hourInterval=0.5] - 计算时的小时间隔(设置的越小计算量越大并且计算结果更精确,如果修改此参数,必须使用整数)。 + * @param {number} [options.dayInterval=5] - 计算时的天数间隔(设置的越小计算量越大并且计算结果更精确,必须使用整数)。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ +class AreaSolarRadiationParameters { + + constructor(options) { + /** + * @member {string} AreaSolarRadiationParameters.prototype.dataset + * @description 要用来做地区太阳辐射数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示,例如:JingjinTerrain@Jingjin。注:地区太阳辐射数据必须为栅格数据集。 + */ + this.dataset = null; + + /** + * @member {string} AreaSolarRadiationParameters.prototype.targetDatasourceName + * @description 指定的存储结果数据集的数据源名称,例如:"Jingjin"。 + */ + this.targetDatasourceName = null; + + /** + * @member {string} AreaSolarRadiationParameters.prototype.totalGridName + * @description 指定地区太阳辐射总辐射量数据集的名称。 + */ + this.totalGridName = null; + + /** + * @member {string} AreaSolarRadiationParameters.prototype.diffuseDatasetGridName + * @description 指定地区太阳辐射散射辐射量数据集的名称。 + */ + this.diffuseDatasetGridName = null; + + /** + * @member {string} AreaSolarRadiationParameters.prototype.durationDatasetGridName + * @description 指定地区太阳辐射太阳直射持续时间数据集的名称。 + */ + this.durationDatasetGridName = null; + + /** + * @member {string} AreaSolarRadiationParameters.prototype.directDatasetGridName + * @description 指定地区太阳辐射直射辐射量数据集的名称。 + */ + this.directDatasetGridName = null; + + /** + * @member {number} AreaSolarRadiationParameters.prototype.latitude + * @description 待计算区域的纬度值。 + */ + this.latitude = null; + + /** + * @member {string} [AreaSolarRadiationParameters.prototype.timeMode='MULTIDAYS'] + * @description 时间模式。可选值"WITHINDAY"(单日)或"MULTIDAYS"(多日)。 + */ + this.timeMode = "MULTIDAYS"; + + /** + * @member {number} AreaSolarRadiationParameters.prototype.dayStart + * @description 起始日期(年内的第几天)。 + */ + this.dayStart = null; + + /** + * @member {number} AreaSolarRadiationParameters.prototype.dayEnd + * @description 结束日期(年内的第几天)。 + */ + this.dayEnd = null; + + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourStart] + * @description 起始时间(一天中的第几个小时)。 + */ + this.hourStart = null; + + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourEnd] + * @description 结束时间(一天中的第几个小时)。 + */ + this.hourEnd = null; + + /** + * @member {number} [AreaSolarRadiationParameters.prototype.transmittance] + * @description 太阳辐射穿过大气的透射率。 + */ + this.transmittance = null; + + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourInterval=0.5] + * @description 计算时的小时间隔(设置的越小计算量越大并且计算结果更精确, 如果修改此参数,必须使用整数) + */ + this.hourInterval = null; + + /** + * @member {number} [AreaSolarRadiationParameters.prototype.dayInterval=5] + * @description 计算时的天数间隔(设置的越小计算量越大并且计算结果更精确, 必须使用整数) + */ + this.dayInterval = null; + + /** + * @member {boolean} [AreaSolarRadiationParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + this.deleteExistResultDataset = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.AreaSolarRadiationParameters"; + } + + /** + * @function AreaSolarRadiationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dataset = null; + me.zFactor = 1.0; + me.averageCurvatureName = null; + me.profileCurvatureName = null; + me.planCurvatureName = null; + me.deleteExistResultDataset = true; + } + + /** + * @function AreaSolarRadiationParameters.toObject + * @param {AreaSolarRadiationParameters} param - 地区太阳辐射参数类。 + * @param {AreaSolarRadiationParameters} tempObj - 地区太阳辐射参数对象。 + * @returns {Object} JSON对象。 + * @description 将AreaSolarRadiationParameters对象转换成JSON对象。 + */ + static toObject(param, tempObj) { + var parameter = {}; + for (var name in param) { + if (name !== "dataset") { + var name1 = (name === "latitude" || name === "timeMode" || name === "dayStart"); + var name2 = (name === "dayEnd" || name === "hourStart" || name === "hourEnd"); + var name3 = (name === "transmittance" || name === "hourInterval" || name === "dayInterval"); + if (name1 || name2 || name3) { + parameter[name] = param[name]; + } else { + tempObj[name] = param[name]; + } + } + } + tempObj["parameter"] = parameter; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/SpatialAnalystBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SpatialAnalystBase + * @deprecatedclass SuperMap.SpatialAnalystBase + * @category iServer Core + * @classdesc 空间分析服务基类。 + * @param {string} url - 地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ +class SpatialAnalystBase extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + /** + * @member {DataFormat} [SpatialAnalystBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为 "ISERVER","GEOJSON"。 + */ + this.format = DataFormat.GEOJSON; + this.CLASS_NAME = "SuperMap.SpatialAnalystBase"; + } + + /** + * @function SpatialAnalystBase.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + this.format = null; + } + + /** + * @function SpatialAnalystBase.prototype.serviceProcessCompleted + * @description 分析完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this, analystResult; + result = Util.transformResult(result); + if (result && me.format === DataFormat.GEOJSON && typeof me.toGeoJSONResult === 'function') { + //批量分析时会返回多个结果 + if (Util.isArray(result)) { + for (var i = 0; i < result.length; i++) { + result[i] = me.toGeoJSONResult(result[i]) + } + analystResult = result; + + } else { + analystResult = me.toGeoJSONResult(result); + } + } + if (!analystResult) { + analystResult = result; + } + me.events.triggerEvent("processCompleted", {result: analystResult}); + } + + /** + * @function SpatialAnalystBase.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + * + */ + toGeoJSONResult(result) { + if (!result) { + return null; + } + //批量叠加分析时结果这样处理 + if (result.result && result.result.resultGeometry) { + result = result.result + } + var geoJSONFormat = new GeoJSON(); + if (result.recordsets) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + } else if (result.recordset && result.recordset.features) { + result.recordset.features =geoJSONFormat.toGeoJSON(result.recordset.features); + } + if (result.resultGeometry) { + result.resultGeometry = geoJSONFormat.toGeoJSON(result.resultGeometry); + } + if (result.regions) { + result.regions = geoJSONFormat.toGeoJSON(result.regions); + } + + return result; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/AreaSolarRadiationService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class AreaSolarRadiationService + * @deprecatedclass SuperMap.AreaSolarRadiationService + * @category iServer SpatialAnalyst SolarRadiationAnalyst + * @classdesc 地区太阳辐射服务类。 + * @param {string} url - 服务的访问地址。如:
http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst。
+ * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myAreaSolarRadiationService = new AreaSolarRadiationService(url); + * myAreaSolarRadiationService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ +class AreaSolarRadiationService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.AreaSolarRadiationService"; + } + + /** + * @function AreaSolarRadiationService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function AreaSolarRadiationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {AreaSolarRadiationParameters} parameter - 地区太阳辐射参数。 + */ + processAsync(parameter) { + if (!(parameter instanceof AreaSolarRadiationParameters)) { + return; + } + var me = this; + var parameterObject = {}; + + if (parameter instanceof AreaSolarRadiationParameters) { + me.url = Util.urlPathAppend(me.url, `datasets/${parameter.dataset}/solarradiation`); + } + me.url = Util.urlAppend(me.url, 'returnContent=true'); + AreaSolarRadiationParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + + me.request({ + method: 'POST', + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/BufferDistance.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class BufferDistance + * @deprecatedclass SuperMap.BufferDistance + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析的缓冲距离类。通过该类可以设置缓冲区分析的缓冲距离,距离可以是数值也可以是数值型的字段表达式。 + * @param {Object} options - 可选参数。 + * @param {string} [options.exp] - 以数值型的字段表达式作为缓冲区分析的距离值。 + * @param {number} [options.value=100] - 以数值作为缓冲区分析的距离值。单位:米。 + * @usage + */ +class BufferDistance { + + + constructor(options) { + /** + * @member {string} [BufferDistance.prototype.exp] + * @description 以数值型的字段表达式作为缓冲区分析的距离值。 + */ + this.exp = null; + + /** + * @member {number} [BufferDistance.prototype.value=100] + * @description 以数值作为缓冲区分析的距离值。单位:米。 + */ + this.value = 100; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.BufferDistance"; + } + + /** + * @function BufferDistance.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.exp = null; + this.value = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/BufferSetting.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class BufferSetting + * @deprecatedclass SuperMap.BufferSetting + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析通用设置类。 + * @param {Object} options - 可选参数。 + * @param {BufferEndType} [options.endType=BufferEndType.FLAT] - 缓冲区端点枚举值。 + * @param {BufferDistance} [options.leftDistance=100] - 左侧缓冲距离。 + * @param {BufferDistance} [options.rightDistance=100] - 右侧缓冲距离。 + * @param {number} [options.semicircleLineSegment=4] - 圆头缓冲圆弧处线段的个数。 + * @param {BufferRadiusUnit} [options.radiusUnit=BufferRadiusUnit.METER] - 缓冲半径单位。 + * @usage + */ +class BufferSetting { + + + constructor(options) { + /** + * @member {BufferEndType} [BufferSetting.prototype.endType = BufferEndType.FLAT] + * @description 缓冲区端点枚举值。分为平头和圆头两种。 + */ + this.endType = BufferEndType.FLAT; + + /** + * @member {BufferDistance} [BufferSetting.prototype.leftDistance=100] + * @description 左侧缓冲距离。 + * 当为 GeometryBufferAnalyst 时,单位为默认地图的投影系的单位(如3857为米,4326为度), + * 当为 DatasetBufferAnalyst 时,单位通过{@link BufferSetting.radiusUnit}设置(默认全部为米)。 + */ + this.leftDistance = new BufferDistance(); + + /** + * @member {BufferDistance} [BufferSetting.prototype.rightDistance=100] + * @description 右侧缓冲距离。 + * 当为 GeometryBufferAnalyst 时,单位为默认地图的投影系的单位(如3857为米,4326为度), + * 当为 DatasetBufferAnalyst 时,单位通过{@link BufferSetting#radiusUnit}设置(默认全部为米)。 + */ + this.rightDistance = new BufferDistance(); + + /** + * @member {number} [BufferSetting.prototype.semicircleLineSegment=4] + * @description 圆头缓冲圆弧处线段的个数。即用多少个线段来模拟一个半圆。 + */ + this.semicircleLineSegment = 4; + + /** + * @member {BufferRadiusUnit} [BufferSetting.prototype.radiusUnit = BufferRadiusUnit.METER] + * @description 缓冲半径单位,可以是{@link BufferRadiusUnit.METER}、{@link BufferRadiusUnit.MILLIMETER}、 + * {@link BufferRadiusUnit.CENTIMETER}、{@link BufferRadiusUnit.DECIMETER}、{@link BufferRadiusUnit.KILOMETER}、 + * {@link BufferRadiusUnit.FOOT}、{@link BufferRadiusUnit.INCH}、{@link BufferRadiusUnit.MILE}、{@link BufferRadiusUnit.YARD}。 + * 仅对BufferAnalyst有效。 + */ + this.radiusUnit = BufferRadiusUnit.METER; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.BufferSetting"; + } + + + /** + * @function BufferSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + let me = this; + me.endType = null; + if (me.leftDistance) { + me.leftDistance.destroy(); + me.leftDistance = null; + } + if (me.rightDistance) { + me.rightDistance.destroy(); + me.rightDistance = null; + } + me.semicircleLineSegment = null; + me.radiusUnit = null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/BufferAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BufferAnalystParameters + * @deprecatedclass SuperMap.BufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析参数基类。 + * @param {Object} options - 参数。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。为缓冲区分析提供必要的参数信息,包括左缓冲距离、右缓冲距离、端点类型、圆头缓冲圆弧处线段的个数信息。 + * @usage + */ +class BufferAnalystParameters { + + + constructor(options) { + var me = this; + /** + * @member {BufferSetting} [BufferAnalystParameters.prototype.bufferSetting] + * @description 设置缓冲区通用参数。为缓冲区分析提供必要的参数信息,包括左缓冲距离、右缓冲距离、端点类型、圆头缓冲圆弧处线段的个数信息。 + */ + me.bufferSetting = new BufferSetting(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.BufferAnalystParameters"; + } + + + /** + * @function BufferAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.bufferSetting) { + me.bufferSetting.destroy(); + me.bufferSetting = null; + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DataReturnOption.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DataReturnOption + * @deprecatedclass SuperMap.DataReturnOption + * @category iServer Data Dataset + * @classdesc 数据返回设置类。 + * @param {Object} options - 参数。 + * @param {number} [options.expectCount=1000] - 设置返回的最大记录数,小于或者等于 0 时表示返回所有记录数。 + * @param {string} [options.dataset] - 设置结果数据集标识,当 dataReturnMode 为 {@link DataReturnMode.DATASET_ONLY}或{@link DataReturnMode.DATASET_AND_RECORDSET}时有效, + * 作为返回数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + * @param {DataReturnMode} [options.dataReturnMode=DataReturnMode.RECORDSET_ONLY] - 数据返回模式。 + * @param {boolean} [options.deleteExistResultDataset=true] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ +class DataReturnOption { + + + constructor(options) { + + /** + * @member {number} [DataReturnOption.prototype.expectCount=1000] + * @description 设置返回的最大记录数,小于或者等于0时表示返回所有记录数。 + */ + this.expectCount = 1000; + + /** + * @member {string} [DataReturnOption.prototype.dataset] + * @description 设置结果数据集标识,当dataReturnMode为 {@link DataReturnMode.DATASET_ONLY} + * 或{@link DataReturnMode.DATASET_AND_RECORDSET}时有效, + * 作为返回数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示。 + */ + this.dataset = null; + + /** + * @member {DataReturnMode} [DataReturnOption.prototype.dataReturnMode=DataReturnMode.RECORDSET_ONLY] + * @description 数据返回模式。 + */ + this.dataReturnMode = DataReturnMode.RECORDSET_ONLY; + + /** + * @member {boolean} [DataReturnOption.prototype.deleteExistResultDataset=true] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + this.deleteExistResultDataset = true; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.DataReturnOption"; + } + + /** + * @function DataReturnOption.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.expectCount = null; + me.dataset = null; + me.dataReturnMode = null; + me.deleteExistResultDataset = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FilterParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FilterParameter + * @deprecatedclass SuperMap.FilterParameter + * @category iServer Data FeatureResults + * @classdesc 查询过滤条件参数类。该类用于设置查询数据集的查询过滤参数。 + * @param {Object} options - 参数。 + * @param {string} options.attributeFilter - 属性过滤条件。 + * @param {string} options.name - 查询数据集名称或者图层名称。 + * @param {Array.} [options.joinItems] - 与外部表的连接信息 JoinItem 数组。 + * @param {Array.} [options.linkItems] - 与外部表的关联信息 LinkItem 数组。 + * @param {Array.} [options.ids] - 查询 id 数组,即属性表中的 SmID 值。 + * @param {string} [options.orderBy] - 查询排序的字段,orderBy 的字段须为数值型的。 + * @param {string} [options.groupBy] - 查询分组条件的字段。 + * @param {Array.} [options.fields] - 查询字段数组。 + * @usage + */ +class FilterParameter { + + + constructor(options) { + /** + * @member {string} FilterParameter.prototype.attributeFilter + * @description 属性过滤条件。 + * 相当于 SQL 语句中的 WHERE 子句,其格式为:WHERE <条件表达式>, + * attributeFilter 就是其中的“条件表达式”。 + * 该字段的用法为 attributeFilter = "过滤条件"。 + * 例如,要查询字段 fieldValue 小于100的记录,设置 attributeFilter = "fieldValue < 100"; + * 要查询字段 name 的值为“酒店”的记录,设置 attributeFilter = "name like '%酒店%'",等等。 + */ + this.attributeFilter = null; + + /** + * @member {string} FilterParameter.prototype.name + * @description 查询数据集名称或者图层名称,根据实际的查询对象而定。 + * 一般情况下该字段为数据集名称,但在进行与地图相关功能的操作时, + * 需要设置为图层名称(图层名称格式:数据集名称@数据源别名)。 + * 因为一个地图的图层可能是来自于不同数据源的数据集, + * 而不同的数据源中可能存在同名的数据集, + * 使用数据集名称不能唯一的确定数据集, + * 所以在进行与地图相关功能的操作时,该值需要设置为图层名称。 + */ + this.name = null; + + /** + * @member {Array.} [FilterParameter.prototype.joinItems] + * @description 与外部表的连接信息 JoinItem 数组。 + */ + this.joinItems = null; + + /** + * @member {Array.} [FilterParameter.prototype.linkItems] + * @description 与外部表的关联信息 LinkItem 数组。 + */ + this.linkItems = null; + + /** + * @member {Array.} [FilterParameter.prototype.ids] + * @description 查询 id 数组,即属性表中的 SmID 值。 + */ + this.ids = null; + + /** + * @member {string} [FilterParameter.prototype.orderBy] + * @description 查询排序的字段,orderBy的字段须为数值型的。 + * 相当于 SQL 语句中的 ORDER BY 子句,其格式为:ORDER BY <列名>, + * 列名即属性表中每一列的名称,列又可称为属性,在 SuperMap 中又称为字段。 + * 对单个字段排序时,该字段的用法为 orderBy = "字段名"; + * 对多个字段排序时,字段之间以英文逗号进行分割,用法为 orderBy = "字段名1, 字段名2"。 + * 例如,现有一个国家数据集,它有两个字段分别为“SmArea”和“pop_1994”, + * 分别表示国家的面积和1994年的各国人口数量。 + * 如果要按照各国人口数量对记录进行排序,则 orderBy = "pop_1994"; + * 如果要以面积和人口进行排序,则 orderBy = "SmArea, pop_1994"。 + */ + this.orderBy = null; + + + /** + * @member {string} [FilterParameter.prototype.groupBy] + * @description 查询分组条件的字段。 + * 相当于 SQL 语句中的 GROUP BY 子句,其格式为:GROUP BY <列名>, + * 列名即属性表中每一列的名称,列又可称为属性,在 SuperMap 中又称为字段。 + * 对单个字段分组时,该字段的用法为 groupBy = "字段名"; + * 对多个字段分组时,字段之间以英文逗号进行分割,用法为 groupBy = "字段名1, 字段名2"。 + * 例如,现有一个全球城市数据集,该数据集有两个字段分别为“Continent”和“Country”, + * 分别表示某个城市所属的洲和国家。 + * 如果要按照国家对全球的城市进行分组, 可以设置 groupBy = "Country"; + * 如果以洲和国家对城市进行分组,设置 groupBy = "Continent, Country"。 + */ + this.groupBy = null; + + /** + * @member {Array.} [FilterParameter.prototype.fields] + * @description 查询字段数组,如果不设置则使用系统返回的所有字段。 + */ + this.fields = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FilterParameter"; + } + + + /** + * @function FilterParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.attributeFilter = null; + me.name = null; + if (me.joinItems) { + for (let i = 0, joinItems = me.joinItems, len = joinItems.length; i < len; i++) { + joinItems[i].destroy(); + } + me.joinItems = null; + } + if (me.linkItems) { + for (let i = 0, linkItems = me.linkItems, len = linkItems.length; i < len; i++) { + linkItems[i].destroy(); + } + me.linkItems = null; + } + me.ids = null; + me.orderBy = null; + me.groupBy = null; + me.fields = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetBufferAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DatasetBufferAnalystParameters + * @deprecatedclass SuperMap.DatasetBufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 数据集缓冲区分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + * @param {FilterParameter} [options.filterQueryParameter] - 设置数据集中几何对象的过滤条件。只有满足此条件的几何对象才参与缓冲区分析。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {boolean} [options.isAttributeRetained=true] - 是否保留进行缓冲区分析的对象的字段属性。当 isUnion 字段为 false 时该字段有效。 + * @param {boolean} [options.isUnion=false] - 是否将缓冲区与源记录集中的对象合并后返回。对于面对象而言,要求源数据集中的面对象不相交。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。 + * + * @extends {BufferAnalystParameters} + * @usage + */ +class DatasetBufferAnalystParameters extends BufferAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {string} DatasetBufferAnalystParameters.prototype.dataset + * @description 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + */ + this.dataset = null; + + /** + * @member {FilterParameter} [DatasetBufferAnalystParameters.prototype.filterQueryParameter] + * @description 设置数据集中几何对象的过滤条件。只有满足此条件的几何对象才参与缓冲区分析。 + */ + this.filterQueryParameter = new FilterParameter(); + + /** + * @member {DataReturnOption} [DatasetBufferAnalystParameters.prototype.resultSetting] + * @description 结果返回设置类。 + */ + this.resultSetting = new DataReturnOption(); + + /** + * @member {boolean} [DatasetBufferAnalystParameters.prototype.isAttributeRetained=true] + * @description 是否保留进行缓冲区分析的对象的字段属性。当 isUnion 字段为 false 时该字段有效。 + */ + this.isAttributeRetained = true; + + /** + * @member {boolean} [DatasetBufferAnalystParameters.prototype.isUnion=false] + * @description 是否将缓冲区与源记录集中的对象合并后返回。对于面对象而言,要求源数据集中的面对象不相交。 + */ + this.isUnion = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.DatasetBufferAnalystParameters"; + } + + + /** + * @function DatasetBufferAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.dataset = null; + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + me.isAttributeRetained = null; + me.isUnion = null; + } + + /** + * @function DatasetBufferAnalystParameters.toObject + * @param {DatasetBufferAnalystParameters} datasetBufferAnalystParameters - 数据集缓冲区分析参数类。 + * @param {DatasetBufferAnalystParameters} tempObj - 数据集缓冲区分析参数对象。 + * @description 将数据集缓冲区分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + static toObject(datasetBufferAnalystParameters, tempObj) { + for (var name in datasetBufferAnalystParameters) { + if (name === "bufferSetting") { + datasetBufferAnalystParameters.bufferSetting.radiusUnit = datasetBufferAnalystParameters.bufferSetting.radiusUnit.toUpperCase(); + tempObj.bufferAnalystParameter = datasetBufferAnalystParameters.bufferSetting; + } else if (name === "resultSetting") { + tempObj.dataReturnOption = datasetBufferAnalystParameters.resultSetting; + } else if (name === "dataset") { + continue; + } else { + tempObj[name] = datasetBufferAnalystParameters[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GeometryBufferAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryBufferAnalystParameters + * @deprecatedclass SuperMap.GeometryBufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 几何对象缓冲区分析参数类 + * 对指定的某个几何对象做缓冲区分析。通过该类可以指定要做缓冲区分析的几何对象、缓冲区参数等。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.sourceGeometry - 要做缓冲区分析的几何对象。 + * @param {number} options.sourceGeometrySRID - 缓冲区几何对象投影坐标参数, 如 4326,3857。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。 + * @extends {BufferAnalystParameters} + * @usage + */ +class GeometryBufferAnalystParameters extends BufferAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {GeoJSONObject} GeometryBufferAnalystParameters.prototype.sourceGeometry + * @description 要做缓冲区分析的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}。 + */ + this.sourceGeometry = null; + + /** + * @member {number} GeometryBufferAnalystParameters.prototype.sourceGeometrySRID + * @description 缓冲区几何对象投影坐标参数, 如 4326,3857。 + */ + this.sourceGeometrySRID = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = " SuperMap.GeometryBufferAnalystParameters"; + } + + /** + * @function GeometryBufferAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + } + + /** + * @function GeometryBufferAnalystParameters.toObject + * @param {GeometryBufferAnalystParameters} geometryBufferAnalystParameters - 几何对象缓冲区分析参数类。 + * @param {GeometryBufferAnalystParameters} tempObj - 几何对象缓冲区分析参数对象。 + * @description 将几何对象缓冲区分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + static toObject(geometryBufferAnalystParameters, tempObj) { + for (var name in geometryBufferAnalystParameters) { + if (name === "bufferSetting") { + var tempBufferSetting = {}; + for (var key in geometryBufferAnalystParameters.bufferSetting) { + tempBufferSetting[key] = geometryBufferAnalystParameters.bufferSetting[key]; + } + tempObj.analystParameter = tempBufferSetting; + } else if (name === "sourceGeometry") { + tempObj.sourceGeometry = ServerGeometry.fromGeometry(geometryBufferAnalystParameters.sourceGeometry); + + } else { + tempObj[name] = geometryBufferAnalystParameters[name]; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/BufferAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class BufferAnalystService + * @deprecatedclass SuperMap.BufferAnalystService + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析服务类。 + * 该类负责将客户设置的缓冲区分析参数传递给服务端,并接收服务端返回的缓冲区分析结果数据。 + * 缓冲区分析结果通过该类支持的事件的监听函数参数获取。 + * @param {string} url - 服务的访问地址。如:http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myBufferAnalystService = new BufferAnalystService(url, { + * eventListeners: { + * "processCompleted": bufferCompleted, + * "processFailed": bufferFailed + * } + * }); + * (end) + * @usage + */ +class BufferAnalystService extends SpatialAnalystBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} BufferAnalystService.prototype.mode + * @description 缓冲区分析类型 + */ + this.mode = null; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.BufferAnalystService"; + } + + + /** + * @function BufferAnalystService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + this.mode = null; + } + + + /** + * @method BufferAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {BufferAnalystParameters} parameter - 缓冲区分析参数 + */ + processAsync(parameter) { + var parameterObject = {}; + var me = this; + if (parameter instanceof DatasetBufferAnalystParameters) { + me.mode = 'datasets'; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/buffer'); + DatasetBufferAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryBufferAnalystParameters) { + me.mode = 'geometry'; + me.url = Util.urlPathAppend(me.url, 'geometry/buffer'); + GeometryBufferAnalystParameters.toObject(parameter, parameterObject); + } + + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasourceConnectionInfo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + // eslint-disable-line no-unused-vars + +/** + * @class DatasourceConnectionInfo + * @deprecatedclass SuperMap.DatasourceConnectionInfo + * @category iServer Data Datasource + * @classdesc 数据源连接信息类。该类包括了进行数据源连接的所有信息,如所要连接的服务器名称、数据库名称、用户名以及密码等。 + * 当保存为工作空间时, 工作空间中的数据源的连接信息都将存储到工作空间文件中。对于不同类型的数据源,其连接信息有所区别。 + * 所以在使 用该类所包含的成员时,请注意该成员所适用的数据源类型。对于从数据源对象中返回的数据连接信息对象,只有 connect 方法可以被修改, + * 其他内容是不可以被修改的。对于用户创建的数据源连接信息对象,其内容都可以修改。 + * @param {Object} options - 参数。 + * @param {string} options.alias - 数据源别名。 + * @param {string} options.dataBase - 数据源连接的数据库名。 + * @param {boolean} [options.connect] - 数据源是否自动连接数据。 + * @param {string} [options.driver] - 使用 ODBC(Open Database Connectivity,开放数据库互连)的数据库的驱动程序名。 + * @param {EngineType} [options.engineType] - 数据源连接的引擎类型。 + * @param {boolean} [options.exclusive] - 是否以独占方式打开数据源。 + * @param {boolean} [options.OpenLinkTable] - 是否把数据库中的其他非 SuperMap 数据表作为 LinkTable 打开。 + * @param {string} [options.password] - 登录数据源连接的数据库或文件的密码。 + * @param {boolean} [options.readOnly] - 是否以只读方式打开数据源。 + * @param {string} [options.server] - 数据库服务器名或 SDB 文件名。 + * @param {string} [options.user] - 登录数据库的用户名。 + * @usage + */ +class DatasourceConnectionInfo { + + + constructor(options) { + + /** + * @member {string} DatasourceConnectionInfo.prototype.alias + * @description 数据源别名。 + */ + this.alias = null; + + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.connect] + * @description 数据源是否自动连接数据。 + */ + this.connect = null; + + /** + * @member {string} DatasourceConnectionInfo.prototype.dataBase + * @description 数据源连接的数据库名。 + */ + this.dataBase = null; + + /** + * @member {string} [DatasourceConnectionInfo.prototype.driver] + * @description 使用 ODBC(Open Database Connectivity,开放数据库互连) 的数据库的驱动程序名。 + * 其中,对于 SQL Server 数据库与 iServer 发布的 WMTS 服务,此为必设参数。 + * 对于 SQL Server 数据库,它使用 ODBC 连接,所设置的驱动程序名为 "SQL Server" 或 "SQL Native Client"; + * 对于 iServer 发布的 WMTS 服务,设置的驱动名称为 "WMTS"。 + */ + this.driver = null; + + /** + * @member {EngineType} [DatasourceConnectionInfo.prototype.engineType] + * @description 数据源连接的引擎类型。 + */ + this.engineType = null; + + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.exclusive] + * @description 是否以独占方式打开数据源。 + */ + this.exclusive = null; + + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.OpenLinkTable] + * @description 是否把数据库中的其他非 SuperMap 数据表作为 LinkTable 打开。 + */ + this.OpenLinkTable = null; + + /** + * @member {string} [DatasourceConnectionInfo.prototype.password] + * @description 登录数据源连接的数据库或文件的密码。 + */ + this.password = null; + + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.readOnly] + * @description 是否以只读方式打开数据源。 + */ + this.readOnly = null; + + /** + * @member {string} [DatasourceConnectionInfo.prototype.server] + * @description 数据库服务器名、文件名或服务地址。 + * 1.对于 SDB 和 UDB 文件,为其文件的绝对路径。注意:当绝对路径的长度超过 UTF-8 编码格式的 260 字节长度,该数据源无法打开。 + * 2.对于 Oracle 数据库,其服务器名为其 TNS 服务名称。 + * 3.对于 SQL Server 数据库,其服务器名为其系统的 DSN(Database Source Name) 名称。 + * 4.对于 PostgreSQL 数据库,其服务器名为 “IP:端口号”,默认的端口号是 5432。 + * 5.对于 DB2 数据库,已经进行了编目,所以不需要进行服务器的设置。 + * 6.对于 Kingbase 数据库,其服务器名为其 IP 地址。 + * 7.对于 GoogleMaps 数据源,其服务器地址,默认设置为 “{@link http://maps.google.com}”,且不可更改。 + * 8.对于 SuperMapCould 数据源,为其服务地址。 + * 9.对于 MAPWORLD 数据源,为其服务地址,默认设置为 “{@link http://www.tianditu.cn}”,且不可更改。 + * 10.对于 OGC 和 REST 数据源,为其服务地址。 + */ + this.server = null; + + /** + * @member {string} DatasourceConnectionInfo.prototype.user + * @description 登录数据库的用户名。 + */ + this.user = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.DatasourceConnectionInfo"; + } + + /** + * @function DatasourceConnectionInfo.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.alias = null; + me.connect = null; + me.dataBase = null; + me.driver = null; + me.engineType = null; + me.exclusive = null; + me.OpenLinkTable = null; + me.password = null; + me.readOnly = null; + me.server = null; + me.user = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/OutputSetting.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class OutputSetting + * @deprecatedclass SuperMap.OutputSetting + * @category iServer ProcessingService + * @classdesc 分布式分析输出类型设置类。 + * @param {Object} options - 参数。 + * @param {DatasourceConnectionInfo} options.datasourceInfo - 数据源连接信息。 + * @param {string} [options.datasetName='analystResult'] - 结果数据集名称。 + * @param {OutputType} [options.type=OutputType.UDB] - 输出类型。 + * @param {string} [options.outputPath] - 分析结果输出路径。 + * @usage + */ +class OutputSetting { + + constructor(options) { + + /** + * @member {OutputType} OutputSetting.prototype.type + * @description 分布式分析的输出类型。 + */ + this.type = OutputType.UDB; + + /** + * @member {string} [OutputSetting.prototype.datasetName='analystResult'] + * @description 分布式分析的输出结果数据集名称。 + */ + this.datasetName = "analystResult"; + + /** + * @member {DatasourceConnectionInfo} OutputSetting.prototype.datasourceInfo + * @description 分布式分析的输出结果数据源连接信息。 + */ + this.datasourceInfo = null; + + /** + * @member {string} [OutputSetting.prototype.outputPath] + * @description 分布式分析的分析结果输出路径。 + */ + this.outputPath = ""; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OutputSetting"; + } + + /** + * @function OutputSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.type = null; + me.datasetName = null; + me.outputPath = null; + if (me.datasourceInfo instanceof DatasourceConnectionInfo) { + me.datasourceInfo.destroy(); + me.datasourceInfo = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/MappingParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class MappingParameters + * @deprecatedclass SuperMap.MappingParameters + * @category iServer ProcessingService + * @classdesc 分析后结果可视化的参数类。 + * @param {Object} options - 参数。 + * @param {Array.} [options.items] - 栅格分段专题图子项数组。 + * @param {number} [options.numericPrecision=1] - 精度,此字段用于设置分析结果标签专题图中标签数值的精度,如“1”表示精确到小数点的后一位。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 专题图分段模式。 + * @param {number} [options.rangeCount] - 专题图分段个数。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 专题图颜色渐变模式。 + * @usage + */ +class MappingParameters { + + constructor(options) { + + /** + * @member {Array.} [MappingParameters.prototype.items] + * @description 栅格分段专题图子项数组。 + */ + this.items = null; + + /** + * @member {number} [MappingParameters.prototype.numericPrecision=1] + * @description 精度,此字段用于设置分析结果标签专题图中标签数值的精度,如“1”表示精确到小数点的后一位。 + */ + this.numericPrecision = 1; + + /** + * @member {RangeMode} [MappingParameters.prototype.RangeMode=RangeMode.EQUALINTERVAL] + * @description 专题图分段模式。 + */ + this.rangeMode = RangeMode.EQUALINTERVAL; + + /** + * @member {number} [MappingParameters.prototype.rangeCount] + * @description 专题图分段个数。 + */ + this.rangeCount = ""; + + /** + * @member {ColorGradientType} [MappingParameters.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 专题图颜色渐变模式。 + */ + this.colorGradientType = ColorGradientType.YELLOW_RED; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.MappingParameters"; + } + + /** + * @function MappingParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + me.items = null; + } + me.numericPrecision = null; + me.rangeMode = null; + me.rangeCount = null; + me.colorGradientType = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/BuffersAnalystJobsParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class BuffersAnalystJobsParameter + * @deprecatedclass SuperMap.BuffersAnalystJobsParameter + * @category iServer ProcessingService BufferAnalyst + * @classdesc 缓冲区分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.bounds] - 分析范围(默认为全图范围)。 + * @param {string} [options.distance='15'] - 缓冲距离,或缓冲区半径。 + * @param {string} [options.distanceField='pickup_latitude'] - 缓冲区分析距离字段。 + * @param {AnalystSizeUnit} [options.distanceUnit=AnalystSizeUnit.METER] - 缓冲距离单位单位。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class BuffersAnalystJobsParameter { + constructor(options) { + /** + * @member {string} BuffersAnalystJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ''; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} BuffersAnalystJobsParameter.prototype.bounds + * @description 分析范围。 + */ + this.bounds = ''; + + /** + * @member {string} [BuffersAnalystJobsParameter.prototype.distance='15'] + * @description 缓冲距离,或称为缓冲区半径。当缓冲距离字段位空时,此参数有效。 + */ + this.distance = ''; + + /** + * @member {string} [BuffersAnalystJobsParameter.prototype.distanceField='pickup_latitude'] + * @description 缓冲距离字段。 + */ + this.distanceField = ''; + + /** + * @member {AnalystSizeUnit} [BuffersAnalystJobsParameter.prototype.distanceUnit=AnalystSizeUnit.METER] + * @description 缓冲距离单位。 + */ + this.distanceUnit = AnalystSizeUnit.METER; + + /** + * @member {string} BuffersAnalystJobsParameter.prototype.dissolveField + * @description 融合字段,根据字段值对缓冲区结果面对象进行融合。 + */ + this.dissolveField = ''; + + /** + * @member {OutputSetting} [BuffersAnalystJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [BuffersAnalystJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + if (!options) { + return this; + } + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.BuffersAnalystJobsParameter'; + } + + /** + * @function BuffersAnalystJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.bounds = null; + this.distance = null; + this.distanceField = null; + this.distanceUnit = null; + this.dissolveField = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function BuffersAnalystJobsParameter.toObject + * @param {BuffersAnalystJobsParameter} BuffersAnalystJobsParameter - 缓冲区分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成缓冲区分析任务对象。 + */ + static toObject(BuffersAnalystJobsParameter, tempObj) { + for (var name in BuffersAnalystJobsParameter) { + if (name === 'datasetName') { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = BuffersAnalystJobsParameter[name]; + continue; + } + if (name === 'output') { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = BuffersAnalystJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + if (name === 'bounds' && BuffersAnalystJobsParameter[name]) { + tempObj['analyst'][name] = BuffersAnalystJobsParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = BuffersAnalystJobsParameter[name]; + } + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = BuffersAnalystJobsParameter[name]; + } + } + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ProcessingServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ProcessingServiceBase + * @deprecatedclass SuperMap.ProcessingServiceBase + * @category iServer Core + * @classdesc 分布式分析服务基类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {number} options.index - 服务访问地址在数组中的位置。 + * @param {number} options.length - 服务访问地址数组长度。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class ProcessingServiceBase extends CommonServiceBase { + + constructor(url, options) { + options = options || {}; + /* + * Constant: EVENT_TYPES + * {Array.} + * 此类支持的事件类型 + * - *processCompleted* 创建成功后触发的事件。 + * - *processFailed* 创建失败后触发的事件 。 + * - *processRunning* 创建过程的整个阶段都会触发的事件,用于获取创建过程的状态 。 + */ + options.EVENT_TYPES = ["processCompleted", "processFailed", "processRunning"]; + super(url, options); + + this.CLASS_NAME = "SuperMap.ProcessingServiceBase"; + } + + /** + * @function ProcessingServiceBase.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function ProcessingServiceBase.prototype.getJobs + * @description 获取分布式分析任务。 + * @param {string} url - 资源地址。 + */ + getJobs(url) { + var me = this; + FetchRequest.get(SecurityManager.appendCredential(url), null, { + proxy: me.proxy + }).then(function (response) { + return response.json(); + }).then(function (result) { + me.events.triggerEvent("processCompleted", { + result: result + }); + }).catch(function (e) { + me.eventListeners.processFailed({ + error: e + }); + }); + } + + /** + * @function ProcessingServiceBase.prototype.addJob + * @description 添加分布式分析任务。 + * @param {string} url - 资源根地址。 + * @param {Object} params - 创建一个空间分析的请求参数。 + * @param {string} paramType - 请求参数类型。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addJob(url, params, paramType, seconds) { + var me = this, + parameterObject = null; + if (params && params instanceof paramType) { + parameterObject = new Object(); + paramType.toObject(params, parameterObject); + } + let headers = Object.assign({ + 'Content-Type': 'application/x-www-form-urlencoded' + }, me.headers || {}) + var options = { + proxy: me.proxy, + headers, + withCredentials: me.withCredentials, + crossOrigin: me.crossOrigin, + isInTheSameDomain: me.isInTheSameDomain + }; + FetchRequest.post(SecurityManager.appendCredential(url), JSON.stringify(parameterObject), options).then(function (response) { + return response.json(); + }).then(function (result) { + if (result.succeed) { + me.serviceProcessCompleted(result, seconds); + } else { + me.serviceProcessFailed(result); + } + }).catch(function (e) { + me.serviceProcessFailed({ + error: e + }); + }); + } + + serviceProcessCompleted(result, seconds) { + result = Util.transformResult(result); + seconds = seconds || 1000; + var me = this; + if (result) { + var id = setInterval(function () { + FetchRequest.get(SecurityManager.appendCredential(result.newResourceLocation), { + _t: new Date().getTime() + }) + .then(function (response) { + return response.json(); + }).then(function (job) { + me.events.triggerEvent("processRunning", { + id: job.id, + state: job.state + }); + if (job.state.runState === 'LOST' || job.state.runState === 'KILLED' || job.state.runState === 'FAILED') { + clearInterval(id); + me.events.triggerEvent("processFailed", { + error: job.state.errorMsg, + state: job.state.runState + }); + } + if (job.state.runState === 'FINISHED' && job.setting.serviceInfo) { + clearInterval(id); + me.events.triggerEvent("processCompleted", { + result: job + }); + } + }).catch(function (e) { + clearInterval(id); + me.events.triggerEvent("processFailed", { + error: e + }); + }); + }, seconds); + } + } + + serviceProcessFailed(result) { + super.serviceProcessFailed(result); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/BuffersAnalystJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class BuffersAnalystJobsService + * @deprecatedclass SuperMap.BuffersAnalystJobsService + * @category iServer ProcessingService BufferAnalyst + * @classdesc 缓冲区分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class BuffersAnalystJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/buffers'); + this.CLASS_NAME = 'SuperMap.BuffersAnalystJobsService'; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function BuffersAnalystJobsService.prototype.getBufferJobs + * @description 获取缓冲区分析所有任务 + */ + getBuffersJobs() { + super.getJobs(this.url); + } + + /** + * @function BuffersAnalystJobsService.prototype.getBufferJob + * @description 获取指定id的缓冲区分析服务 + * @param {string} id - 指定要获取数据的id。 + */ + getBuffersJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function BuffersAnalystJobsService.prototype.addBufferJob + * @description 新建缓冲区分析服务 + * @param {BuffersAnalystJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addBuffersJob(params, seconds) { + super.addJob(this.url, params, BuffersAnalystJobsParameter, seconds); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/BurstPipelineAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class BurstPipelineAnalystParameters + * @deprecatedclass SuperMap.BurstPipelineAnalystParameters + * @category iServer NetworkAnalyst BurstAnalyse + * @classdesc 爆管分析参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} [options.edgeID] - 指定的弧段ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。 + * @usage + */ +class BurstPipelineAnalystParameters { + + + constructor(options) { + var me = this; + /** + * @member {Array.} BurstPipelineAnalystParameters.prototype.sourceNodeIDs + * @description 指定的设施点 ID 数组。 + */ + this.sourceNodeIDs = null; + + /** + * @member {number} [BurstPipelineAnalystParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.edgeID = null; + + /** + * @member {number} [BurstPipelineAnalystParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.nodeID = null; + + /** + * @member {boolean} [BurstPipelineAnalystParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。 + * 指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行。 + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + */ + this.isUncertainDirectionValid = false; + + Util.extend(me, options); + + this.CLASS_NAME = "SuperMap.BurstPipelineAnalystParameters"; + } + + /** + * @function BurstPipelineAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.sourceNodeIDs = null; + me.edgeID = null; + me.nodeID = null; + me.isUncertainDirectionValid = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/NetworkAnalystServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class NetworkAnalystServiceBase + * @deprecatedclass SuperMap.NetworkAnalystServiceBase + * @category iServer Core + * @classdesc 网络分析服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class NetworkAnalystServiceBase extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + /** + * @member {DataFormat} [NetworkAnalystServiceBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为 "ISERVER","GEOJSON" + */ + this.format = DataFormat.GEOJSON; + + this.CLASS_NAME = "SuperMap.NetworkAnalystServiceBase"; + } + + /** + * @function NetworkAnalystServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy() { + super.destroy(); + this.format = null; + } + + /** + * @function NetworkAnalystServiceBase.prototype.serviceProcessCompleted + * @description 分析完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this, analystResult; + result = Util.transformResult(result); + if (result && me.format === DataFormat.GEOJSON && typeof me.toGeoJSONResult === 'function') { + analystResult = me.toGeoJSONResult(result); + } + if (!analystResult) { + analystResult = result; + } + me.events.triggerEvent("processCompleted", {result: analystResult}); + } + + /** + * @function NetworkAnalystServiceBase.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。只处理结果中的路由,由子类实现。 + * @param {Object} result - 服务器返回的结果对象。 + * @returns {GeoJSONObject} GeoJSON 对象。 + */ + toGeoJSONResult(result) { // eslint-disable-line no-unused-vars + return null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/BurstPipelineAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class BurstPipelineAnalystService + * @deprecatedclass SuperMap.BurstPipelineAnalystService + * @category iServer NetworkAnalyst BurstAnalyse + * @classdesc 爆管分析服务类,即将给定弧段或节点作为爆管点来进行分析,返回关键结点 ID 数组、普通结点 ID 数组及其上下游弧段 ID 数组。 + * @extends {NetworkAnalystServiceBase} + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}, + * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class BurstPipelineAnalystService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.BurstPipelineAnalystService"; + } + + /** + * @function BurstPipelineAnalystService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function BurstPipelineAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @params {BurstPipelineAnalystParameters} params - 爆管分析参数类 + */ + processAsync(params) { + if (!(params instanceof BurstPipelineAnalystParameters)) { + return null; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'burstAnalyse'); + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + + //必传参数不正确,就终止 + if (params.edgeID !== null && params.nodeID !== null) { + throw new Error('edgeID and nodeID cannot be null at the same time.'); + } + if (params.edgeID === null && params.nodeID === null) { + throw new Error('edgeID and nodeID cannot be null at the same time.'); + } + if (params.edgeID !== null) { + jsonObject.edgeID = params.edgeID; + } else { + jsonObject.nodeID = params.nodeID; + } + + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ChartFeatureInfoSpecsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ChartFeatureInfoSpecsService + * @deprecatedclass SuperMap.ChartFeatureInfoSpecsService + * @category iServer Map Chart + * @classdesc 海图物标信息服务类,通过该服务类可以查询到服务端支持的所有海图物标信息。 + * 用户可以通过两种方式获取查询结果: + * 一种是通过监听 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE 事件; + * 另一种是使用 AsyncResponder 类实现异步处理。 + * @extends {CommonServiceBase} + * @param {string} url - 地图(特指海图)服务地址。 + * 如:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图"。 + * 发送请求格式类似于:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图/chartFeatureInfoSpecs.json"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class ChartFeatureInfoSpecsService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.ChartFeatureInfoSpecsService"; + } + + /** + * @function ChartFeatureInfoSpecsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function ChartFeatureInfoSpecsService.prototype.processAsync + * @description 根据地图(特指海图)服务地址与服务端完成异步通讯,获取物标信息。 + * 当查询物标信息成功时,将触发 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE + * 事件。用可以通过户两种方式获取图层信息: + * 1. 通过 AsyncResponder 类获取(推荐使用); + * 2. 通过监听 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE 事件获取。 + */ + processAsync() { + var me = this, method = "GET"; + if (!me.isTempLayers) { + Util.urlPathAppend(me.url,'chartFeatureInfoSpecs'); + } + me.request({ + method: method, + params: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryFilterParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ChartQueryFilterParameter + * @deprecatedclass SuperMap.ChartQueryFilterParameter + * @category iServer Map Chart + * @classdesc 海图查询过滤参数类,用于设置海图查询的过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + * @param {Object} options - 参数。 + * @param {string} options.attributeFilter - 属性字段过滤条件。 + * @param {number} options.chartFeatureInfoSpecCode - 查询的物标代号。 + * @param {boolean} [options.isQueryPoint] - 是否查询点。 + * @param {boolean} [options.isQueryLine] - 是否查询线。 + * @param {boolean} [options.isQueryRegion] - 是否查询面。 + * @usage + */ +class ChartQueryFilterParameter { + + + constructor(options) { + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryPoint] + * @description 是否查询点。 + */ + this.isQueryPoint = null; + + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryLine] + * @description 是否查询线。 + */ + this.isQueryLine = null; + + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryRegion] + * @description 是否查询面。 + */ + this.isQueryRegion = null; + + /** + * @member {string} ChartQueryFilterParameter.prototype.attributeFilter + * @description 属性字段过滤条件。 + */ + this.attributeFilter = null; + + /** + * @member {number} ChartQueryFilterParameter.prototype.chartFeatureInfoSpecCode + * @description 查询的物标代号。 + */ + this.chartFeatureInfoSpecCode = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.ChartQueryFilterParameter"; + } + + /** + * @function ChartQueryFilterParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isQueryPoint = null; + me.isQueryLine = null; + me.isQueryRegion = null; + me.attributeFilter = null; + me.chartFeatureInfoSpecCode = null; + } + + /** + * @function ChartQueryFilterParameter.prototype.toJson + * @description 将属性信息转化成 JSON 格式字符串。 + */ + toJson() { + var json = ""; + json += "\"isQueryPoint\":" + this.isQueryPoint + ","; + json += "\"isQueryLine\":" + this.isQueryLine + ","; + json += "\"isQueryRegion\":" + this.isQueryRegion + ","; + if (this.attributeFilter) { + json += "\"attributeFilter\": \"" + this.attributeFilter + "\","; + } + json += "\"chartFeatureInfoSpecCode\":" + this.chartFeatureInfoSpecCode; + json = "{" + json + "}"; + return json; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ChartQueryParameters + * @deprecatedclass SuperMap.ChartQueryParameters + * @category iServer Map Chart + * @classdesc 海图查询参数类,该类用于设置海图查询时的相关参数,海图查询分为海图属性查询和海图范围查询两类,通过属性 queryMode 指定查询模式。 + * 必设属性有:queryMode、chartLayerNames、chartQueryFilterParameters。当进行海图范围查询时,必设属性还包括 bounds。 + * @param {Object} options - 参数。 + * @param {string} options.queryMode - 海图查询模式类型,支持两种查询方式:海图属性查询("ChartAttributeQuery")和海图空间查询("ChartBoundsQuery")。 + * @param {Array.} options.chartLayerNames - 查询的海图图层的名称。 + * @param {Array.} options.chartQueryFilterParameters - 海图查询过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 海图查询范围。当进行海图范围查询时,此为必选参数。 + * @param {boolean} [options.returnContent=true] - 获取或设置是返回查询结果记录集 recordsets,还是返回查询结果的资源 resourceInfo。 + * @param {number} [options.startRecord=0] - 查询起始记录位置。 + * @param {number} [options.expectCount] - 期望查询结果返回的记录数,该值大于0。 + * @usage + */ +class ChartQueryParameters { + + + constructor(options) { + /** + * @member {string} ChartQueryParameters.prototype.queryMode + * @description 海图查询模式类型,支持两种查询方式:海图属性查询("ChartAttributeQuery")和海图空间查询("ChartBoundsQuery") 。 + */ + this.queryMode = null; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} ChartQueryParameters.prototype.bounds + * @description 海图查询范围。 + */ + this.bounds = null; + + /** + * @member {Array.} ChartQueryParameters.prototype.chartLayerNames + * @description 查询的海图图层的名称。 + */ + this.chartLayerNames = null; + + /** + * @member {Array.} ChartQueryParameters.prototype.chartQueryFilterParameters + * @description 海图查询过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + */ + this.chartQueryFilterParameters = null; + + /** + * @member {boolean} [ChartQueryParameters.prototype.returnContent=true] + * @description 获取或设置是返回查询结果记录集 recordsets,还是返回查询结果的资源 resourceInfo。 + */ + this.returnContent = true; + + /** + * @member {number} [ChartQueryParameters.prototype.startRecord=0] + * @description 查询起始记录位置。 + */ + this.startRecord = 0; + + /** + * @member {number} [ChartQueryParameters.prototype.expectCount] + * @description 期望查询结果返回的记录数,该值大于0。 + */ + this.expectCount = null; + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.ChartQueryParameters"; + } + + /** + * @function ChartQueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.queryMode = null; + me.bounds = null; + me.chartLayerNames = null; + me.chartQueryFilterParameters = null; + me.returnContent = true; + me.startRecord = 0; + me.expectCount = null; + } + + /** + * @function ChartQueryParameters.prototype.getVariablesJson + * @description 将属性信息转换成能够被服务识别的 JSON 格式字符串。 + * @returns {string} JSON 字符串。 + */ + getVariablesJson() { + var json = ""; + + json += "\"queryMode\":\"" + this.queryMode + "\","; + + if (this.chartLayerNames && this.chartLayerNames.length) { + var chartLayersArray = []; + var layerLength = this.chartLayerNames.length; + for (var i = 0; i < layerLength; i++) { + chartLayersArray.push("\"" + this.chartLayerNames[i] + "\""); + } + var layerNames = "[" + chartLayersArray.join(",") + "]"; + json += "\"chartLayerNames\":" + layerNames + ","; + } + + if (this.queryMode === "ChartBoundsQuery" && this.bounds) { + json += "\"bounds\":" + "{" + "\"leftBottom\":" + "{" + "\"x\":" + this.bounds.left + "," + + "\"y\":" + this.bounds.bottom + "}" + "," + "\"rightTop\":" + "{" + "\"x\":" + this.bounds.right + "," + + "\"y\":" + this.bounds.top + "}" + "},"; + } + + if (this.chartQueryFilterParameters && this.chartQueryFilterParameters.length) { + var chartParamArray = []; + var chartLength = this.chartQueryFilterParameters.length; + for (var j = 0; j < chartLength; j++) { + var chartQueryFilterParameter = this.chartQueryFilterParameters[j]; + if (!(chartQueryFilterParameter instanceof ChartQueryFilterParameter)) { + continue; + } + chartParamArray.push(chartQueryFilterParameter.toJson()); + } + var chartParamsJson = "[" + chartParamArray.join(",") + "]"; + chartParamsJson = "\"chartQueryParams\":" + chartParamsJson + ","; + chartParamsJson += "\"startRecord\":" + this.startRecord + ","; + chartParamsJson += "\"expectCount\":" + this.expectCount; + chartParamsJson = "{" + chartParamsJson + "}"; + json += "\"chartQueryParameters\":" + chartParamsJson; + } + json = "{" + json + "}"; + return json; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryParameters + * @deprecatedclass SuperMap.QueryParameters + * @category iServer Map QueryResults + * @classdesc 查询参数基类。距离查询、SQL 查询、几何地物查询等各自的参数均继承此类。 + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] - 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ +class QueryParameters { + + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} [QueryParameters.prototype.customParams] + * @description 自定义参数,供扩展使用。 + */ + this.customParams = null; + + /** + * @member {Object} [QueryParameters.prototype.prjCoordSys] + * @description 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857} + */ + this.prjCoordSys = null; + + /** + * @member {number} [QueryParameters.prototype.expectCount=100000] + * @description 期望返回结果记录个数,默认返回100000条查询记录, + * 如果实际不足100000条则返回实际记录条数。 + */ + this.expectCount = 100000; + + /** + * @member {GeometryType} [QueryParameters.prototype.networkType=GeometryType.LINE] + * @description 网络数据集对应的查询类型,分为点和线两种类型。 + */ + this.networkType = GeometryType.LINE; + + /** + * @member {QueryOption} [QueryParameters.prototype.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] + * @description 查询结果类型枚举类。 + * 该类描述查询结果返回类型,包括只返回属性、 + * 只返回几何实体以及返回属性和几何实体。 + */ + this.queryOption = QueryOption.ATTRIBUTEANDGEOMETRY; + + /** + * @member {Array.} QueryParameters.prototype.queryParams + * @description 查询过滤条件参数数组。 + * 该类用于设置查询数据集的查询过滤参数。 + */ + this.queryParams = null; + + /** + * @member {number} [QueryParameters.prototype.startRecord=0] + * @description 查询起始记录号。 + */ + this.startRecord = 0; + + /** + * @member {number} [QueryParameters.prototype.holdTime=10] + * @description 资源在服务端保存的时间,单位为分钟。 + */ + this.holdTime = 10; + + /** + * @member {boolean} [QueryParameters.prototype.returnCustomResult=false] + * @description 仅供三维使用。 + */ + this.returnCustomResult = false; + /** + * @member {boolean} [QueryParameters.prototype.returnFeatureWithFieldCaption=false] + * @description 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + */ + this.returnFeatureWithFieldCaption = false; + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.QueryParameters"; + } + + /** + * @function QueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.customParams = null; + me.expectCount = null; + me.networkType = null; + me.queryOption = null; + if (me.queryParams) { + for (var i = 0, qps = me.queryParams, len = qps.length; i < len; i++) { + qps[i].destroy(); + } + me.queryParams = null; + } + me.startRecord = null; + me.holdTime = null; + me.returnCustomResult = null; + me.prjCoordSys = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class ChartQueryService + * @deprecatedclass SuperMap.ChartQueryService + * @category iServer Map Chart + * @classdesc 海图查询服务类。该类负责将海图查询所需参数(ChartQueryParameters)传递至服务端,并获取服务端的返回结果。 + * 用户可以通过两种方式获取查询结果: + * 1.通过 AsyncResponder 类获取(推荐使用); + * 2.通过监听 QueryEvent.PROCESS_COMPLETE 事件获取。 + * @extends {CommonServiceBase} + * @param {string} url - 地图查询服务访问地址。如:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * 下面示例显示了如何进行海图属性查询: + * var nameArray = ["GB4X0000_52000"]; + * var chartQueryFilterParameter = new ChartQueryFilterParameter({ + * isQueryPoint:true, + * isQueryLine:true, + * isQueryRegion:true, + * attributeFilter:"SmID<10", + * chartFeatureInfoSpecCode:1 + * }); + * + * var chartQueryParameters = new ChartQueryParameters({ + * queryMode:"ChartAttributeQuery", + * chartLayerNames:nameArray, + * returnContent:true, + * chartQueryFilterParameters:[chartQueryFilterParameter] + * }); + * + * var chartQueryService = new ChartQueryService(url); + * + * chartQueryService.events.on({ + * "processCompleted":processCompleted, + * "processFailed":processFailed + * }); + * chartQueryService.processAsync(chartQueryParameters); + * @usage + */ +class ChartQueryService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + options = options || {}; + + /** + * @member {boolean} ChartQueryService.prototype.returnContent + * @description 是否立即返回新创建资源的表述还是返回新资源的URI。 + */ + this.returnContent = null; + + /** + * @member {DataFormat} ChartQueryService.prototype.format + * @description 查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式 + * 参数格式为"ISERVER","GEOJSON",GEOJSON + */ + this.format = DataFormat.GEOJSON; + + Util.extend(this, options); + var me = this; + if (options.format) { + me.format = options.format.toUpperCase(); + } + + if (!me.url) { + return; + } + me.url = Util.urlPathAppend(me.url, 'queryResults'); + + this.CLASS_NAME = "SuperMap.ChartQueryService"; + } + + + /** + * @function ChartQueryService.prototype.destroy + * @override + */ + destroy() { + var me = this; + CommonServiceBase.prototype.destroy.apply(this, arguments); + me.returnContent = null; + me.format = null; + } + + + /** + * @function ChartQueryService.prototype.processAsync + * @description 使用服务地址 URL 实例化 ChartQueryService 对象。 + * @param {ChartQueryParameters} params - 查询参数。 + */ + processAsync(params) { + //todo重点需要添加代码的地方 + if (!(params instanceof ChartQueryParameters)) { + return; + } + var me = this, jsonParameters; + me.returnContent = params.returnContent; + jsonParameters = params.getVariablesJson(); + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=true'); + } + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + + /** + * @function ChartQueryService.prototype.serviceProcessCompleted + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + if (result && result.recordsets && me.format === DataFormat.GEOJSON) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + var geoJSONFormat = new GeoJSON(); + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + + } + me.events.triggerEvent("processCompleted", {result: result}); + } + + /** + * @function ChartQueryService.prototype.getQueryParameters + * @description 将 JSON 对象表示的查询参数转化为 QueryParameters 对象。 + * @param {Object} params - JSON 字符串表示的查询参数。 + * @returns {QueryParameters} 返回查询结果 + */ + getQueryParameters(params) { + return new QueryParameters({ + queryMode: params.queryMode, + bounds: params.bounds, + chartLayerNames: params.chartLayerNames, + chartQueryFilterParameters: params.chartQueryFilterParameters, + returnContent: params.returnContent + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/ClipParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ClipParameter + * @deprecatedclass SuperMap.ClipParameter + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 用于裁剪的参数。优先使用用户指定的裁剪区域多边形进行裁剪,也可以通过指定数据源和数据集名,从而使用指定数据集的边界多边形进行裁剪。 + * @param {Object} options - 可选参数。 + * @param {string} [options.clipDatasetName] - 裁剪的数据集名。 + * @param {string} [options.clipDatasourceName] - 裁剪的数据集所在数据源的名字。 + * @param {GeometryPolygon|L.Polygon|L.GeoJSON|ol.geom.Polygon|ol.format.GeoJSON|GeoJSONObject}} [options.clipRegion] - 用户指定的裁剪区域。 + * @param {boolean} [options.isClipInRegion=true] - 是否对裁剪区内的数据集进行裁剪。 + * @param {boolean} [options.isExactClip=true] - 是否使用精确裁剪。 + * @usage + */ +class ClipParameter { + + + constructor(options) { + /** + * @member {string} ClipParameter.prototype.clipDatasetName + * @description 用于裁剪的数据集名,clipDatasetName 与 clipRegion 必须设置一个。 + */ + this.clipDatasetName = null; + + /** + * @member {string} ClipParameter.prototype.clipDatasourceName + * @description 用于裁剪的数据集所在数据源的名字。当 clipRegion 不设置时起作用。 + */ + this.clipDatasourceName = null; + + /** + * @member {GeometryPolygon|L.Polygon|L.GeoJSON|ol.geom.Polygon|ol.format.GeoJSON|GeoJSONObject} ClipParameter.prototype.clipRegion + * @description 用户指定的裁剪区域,优先使用,clipDatasetName 与 clipRegion 必须设置一个。 + */ + this.clipRegion = null; + + /** + * @member {boolean} [ClipParameter.prototype.isClipInRegion=true] + * @description 是否对裁剪区内的数据集进行裁剪。若为 true,则对裁剪区域内的结果进行裁剪,若为 false,则对裁剪区域外的结果进行裁剪。 + */ + this.isClipInRegion = true; + + /** + * @member {boolean} [ClipParameter.prototype.isExactClip=true] + * @description 是否使用精确裁剪。 + */ + this.isExactClip = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ClipParameter"; + } + + + /** + * @function ClipParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.clipDatasetName = null; + me.clipDatasourceName = null; + me.clipRegion = null; + me.isClipInRegion = null; + me.isExactClip = null; + } + + + /** + * @function ClipParameter.prototype.toJSON + * @description 将 ClipParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return Util.toJSON({ + isClipInRegion: this.isClipInRegion, + clipDatasetName: this.clipDatasetName, + clipDatasourceName: this.clipDatasourceName, + isExactClip: this.isExactClip, + clipRegion: ServerGeometry.fromGeometry(this.clipRegion) + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ColorDictionary.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ColorDictionary + * @deprecatedclass SuperMap.ColorDictionary + * @category iServer Map Theme + * @classdesc 颜色对照表类。颜色对照表中的键名为具体的高程值,键值表示该高程值要显示的颜色。 + * 对于栅格图层中高程值小于颜色对照表中高程最小值的点使用颜色对照表中高程最小值对应的颜色, + * 对于栅格图层中高程值大于颜色对照表中高程最大值的点使用颜色对照表中高程最大值对应的颜色, + * 对于栅格图层中高程值在颜色对照表中没有对应颜色的点,则查找颜色对照表中与当前高程值相邻的两个高程对应的颜色, + * 然后通过渐变运算要显示的颜色。如果设置了颜色对照表的话,则颜色表设置无效。 + * @param {Object} options - 参数。 + * @param {number} options.elevation - 高程值。 + * @param {ServerColor} options.color - 服务端颜色类。 + * @usage + */ +class ColorDictionary { + + + constructor(options) { + options = options || {}; + + /** + * @member {number} ColorDictionary.prototype.elevation + * @description 高程值。 + */ + this.elevation = null; + + /** + * @member {ServerColor} ColorDictionary.prototype.color + * @description 服务端颜色类。 + */ + this.color = null; + + Util.extend(this, options); + + var me = this, + c = me.color; + if (c) { + me.color = new ServerColor(c.red, c.green, c.blue); + } + + this.CLASS_NAME = "SuperMap.ColorDictionary"; + } + + /** + * @function ColorDictionary.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + /** + * @function ColorDictionary.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} JSON 对象。 + */ + toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); + return dataObj; + } +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/TransportationAnalystResultSetting.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TransportationAnalystResultSetting + * @deprecatedclass SuperMap.TransportationAnalystResultSetting + * @category iServer NetworkAnalyst + * @classdesc 交通网络分析结果参数类。通过该类设置交通网络分析返回的结果,包括是否返回图片、是否返回弧段空间信息、是否返回结点空间信息等。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.returnEdgeFeatures=false] - 是否在分析结果中包含弧段要素集合。 + * @param {boolean} [options.returnEdgeGeometry=false] - 返回的弧段要素集合中是否包含几何对象信息。 + * @param {boolean} [options.returnEdgeIDs=false] - 返回结果中是否包含经过弧段 ID 集合。 + * @param {boolean} [options.returnNodeFeatures=false] - 是否在分析结果中包含结点要素集合。 + * @param {boolean} [options.returnNodeGeometry=false] - 返回的结点要素集合中是否包含几何对象信息。 + * @param {boolean} [options.returnNodeIDs=false] - 返回结果中是否包含经过结点 ID 集合。 + * @param {boolean} [options.returnPathGuides=false] - 返回分析结果中是否包含行驶导引集合。 + * @param {boolean} [options.returnRoutes=false] - 返回分析结果中是否包含路由对象的集合。 + * @usage + */ +class TransportationAnalystResultSetting { + + constructor(options) { + if (!options) { + return; + } + + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnEdgeFeatures + * @description 是否在分析结果中包含弧段要素集合。弧段要素包括弧段的空间信息和属性信息。 + */ + this.returnEdgeFeatures = false; + + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnEdgeGeometry=false] + * @description 返回的弧段要素集合中是否包含几何对象信息。 + */ + this.returnEdgeGeometry = false; + + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnEdgeIDs=false] + * @description 返回结果中是否包含经过弧段 ID 集合。 + */ + this.returnEdgeIDs = false; + + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeFeatures=false] + * @description 是否在分析结果中包含结点要素集合。 + * 结点要素包括结点的空间信息和属性信息。其中返回的结点要素是否包含空间信息可通过 returnNodeGeometry 字段设置。 + */ + this.returnNodeFeatures = false; + + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeGeometry=false] + * @description 返回的结点要素集合中是否包含几何对象信息。 + */ + this.returnNodeGeometry = false; + + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeIDs=false] + * @description 返回结果中是否包含经过结点 ID 集合。 + */ + this.returnNodeIDs = false; + + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnPathGuides + * @description 返回分析结果中是否包含行驶导引集合。 + */ + this.returnPathGuides = false; + + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnRoutes + * @description 返回分析结果中是否包含路由对象的集合。 + */ + this.returnRoutes = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TransportationAnalystResultSetting"; + } + + /** + * @function TransportationAnalystResultSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.returnEdgeFeatures = null; + me.returnEdgeGeometry = null; + me.returnEdgeIDs = null; + me.returnNodeFeatures = null; + me.returnNodeGeometry = null; + me.returnNodeIDs = null; + me.returnPathGuides = null; + me.returnRoutes = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/TransportationAnalystParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TransportationAnalystParameter + * @deprecatedclass SuperMap.TransportationAnalystParameter + * @category iServer NetworkAnalyst + * @classdesc 交通网络分析通用参数类。该类主要用来提供交通网络分析所需的通用参数。 + * 通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息,还可以对分析结果包含的内容进行一些设置。 + * @param {Object} options - 参数。 + * @param {Array.} options.barrierEdgeIDs - 网络分析中障碍弧段的 ID 数组。 + * @param {Array.} options.barrierNodeIDs - 网络分析中障碍点的 ID 数组。 + * @param {string} options.turnWeightField - 转向权重字段的名称。 + * @param {TransportationAnalystResultSetting} options.resultSetting - 分析结果返回内容。 + * @param {Array.>} [options.barrierPoints] - 网络分析中 Point2D 类型的障碍点数组。 + * @param {string} [options.weightFieldName] - 阻力字段的名称。 + * @usage + */ +class TransportationAnalystParameter { + + constructor(options) { + + if (!options) { + return; + } + /** + * @member {Array.} TransportationAnalystParameter.prototype.barrierEdgeIDs + * @description 网络分析中障碍弧段的 ID 数组。弧段设置为障碍边之后,表示双向都不通。 + */ + this.barrierEdgeIDs = null; + + /** + * @member {Array.} TransportationAnalystParameter.prototype.barrierNodeIDs + * @description 网络分析中障碍点的 ID 数组。结点设置为障碍点之后,表示任何方向都不能通过此结点。 + */ + this.barrierNodeIDs = null; + + /** + * @member {Array.>} TransportationAnalystParameter.prototype.barrierPoints + * @description 网络分析中 Point2D 类型的障碍点数组。障碍点表示任何方向都不能通过此点。
+ * 当各网络分析参数类中的 isAnalyzeById 属性设置为 false 时,该属性才生效。 + */ + this.barrierPoints = null; + + /** + * @member {string} [TransportationAnalystParameter.prototype.weightFieldName] + * @description 阻力字段的名称,标识了进行网络分析时所使用的阻力字段,例如表示时间、长度等的字段都可以用作阻力字段。 + * 该字段默值为服务器发布的所有耗费字段的第一个字段。 + */ + this.weightFieldName = null; + + /** + * @member {string} TransportationAnalystParameter.prototype.turnWeightField + * @description 转向权重字段的名称。 + */ + this.turnWeightField = null; + + /** + * @member {TransportationAnalystResultSetting} TransportationAnalystParameter.prototype.resultSetting + * @description 分析结果返回内容。 + */ + this.resultSetting = new TransportationAnalystResultSetting(); + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TransportationAnalystParameter"; + } + + /** + * @function TransportationAnalystParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.barrierEdgeIDs = null; + me.barrierNodeIDs = null; + me.weightFieldName = null; + me.turnWeightField = null; + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + if (me.barrierPoints && me.barrierPoints.length) { + for (var i in me.barrierPoints) { + me.barrierPoints[i].destroy(); + } + } + me.barrierPoints = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ComputeWeightMatrixParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ComputeWeightMatrixParameters + * @deprecatedclass SuperMap.ComputeWeightMatrixParameters + * @category iServer NetworkAnalyst WeightMatrix + * @classdesc 耗费矩阵分析参数类。根据交通网络分析参数中的耗费字段返回一个耗费矩阵。该矩阵是一个二维数组,用来存储任意两点间的资源消耗。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {Array.>} options.nodes - 要计算耗费矩阵的点数组。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class ComputeWeightMatrixParameters { + + + constructor(options) { + /** + * @member {boolean} [ComputeWeightMatrixParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点,即通过坐标点指定。 + */ + this.isAnalyzeById = false; + + /** + * @member {Array.>} ComputeWeightMatrixParameters.prototype.nodes + * @description 要计算耗费矩阵的点数组。 + * 当 {@link ComputeWeightMatrixParameters.isAnalyzeById} = false 时,nodes 应为点的坐标数组; + * 当 {@link ComputeWeightMatrixParameters.isAnalyzeById} = true 时,nodes 应为点的 ID 数组。 + */ + this.nodes = null; + + /** + * @member {TransportationAnalystParameter} ComputeWeightMatrixParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + this.parameter = new TransportationAnalystParameter(); + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.ComputeWeightMatrixParameters"; + } + + /** + * @function ComputeWeightMatrixParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isAnalyzeById = null; + me.nodes = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/ComputeWeightMatrixService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ComputeWeightMatrixService + * @deprecatedclass SuperMap.ComputeWeightMatrixService + * @category iServer NetworkAnalyst WeightMatrix + * @classdesc 耗费矩阵分析服务类。 + * 耗费矩阵是根据交通网络分析参数中的耗费字段来计算一个二维数组, + * 用来存储指定的任意两点间的资源消耗。 + * 耗费矩阵分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var mycomputeWeightMatrixService = new ComputeWeightMatrixService(url,{ + * eventListeners: { + * "processCompleted": computeWeightMatrixCompleted, + * "processFailed": computeWeightMatrixnError + * } + * }); + * @param {string} url - 耗费矩阵分析服务地址。请求服务的URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class ComputeWeightMatrixService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.ComputeWeightMatrixService"; + } + + + /** + * @function ComputeWeightMatrixService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + + /** + * @function ComputeWeightMatrixService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {ComputeWeightMatrixParameters} params - 耗费矩阵分析参数类 + */ + processAsync(params) { + if (!(params instanceof ComputeWeightMatrixParameters)) { + return; + } + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'weightmatrix'); + jsonObject = { + parameter: Util.toJSON(params.parameter), + nodes: me.getJson(params.isAnalyzeById, params.nodes) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ComputeWeightMatrixService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array.} params - 分析参数数组 + * @returns {string} 转化后的JSON字符串。 + */ + getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += params[i]; + } + } + jsonString += ']'; + return jsonString; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/DataFlowService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DataFlowService + * @deprecatedclass SuperMap.DataFlowService + * @category iServer DataFlow + * @classdesc 数据流服务类 + * @extends {CommonServiceBase} + * @param {string} url - 数据流服务地址 + * @param {Object} options - 参数。 + * @param {function} options.style - 设置数据加载样式。 + * @param {function} [options.onEachFeature] - 设置每个数据加载popup等。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.excludeField] - -排除字段。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class DataFlowService extends CommonServiceBase { + + + constructor(url, options) { + options = options || {}; + /* + * @constant EVENT_TYPES + * {Array.} + * 此类支持的事件类型 + */ + options.EVENT_TYPES = ["broadcastSocketConnected", "broadcastSocketError", "broadcastFailed", "broadcastSucceeded", "subscribeSocketConnected", "subscribeSocketError", "messageSucceeded", "setFilterParamSucceeded"] + super(url, options); + + /** + * @member {GeoJSONObject} DataFlowService.prototype.geometry + * @description 指定几何范围,该范围内的要素才能被订阅。 + */ + this.geometry = null; + + /** + * @member {Object} DataFlowService.prototype.prjCoordSys + * @description 动态投影参数 + */ + this.prjCoordSys = null; + + /** + * @member {Object} DataFlowService.prototype.excludeField + * @description 排除字段 + */ + this.excludeField = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.DataFlowService"; + } + + /** + * @function DataFlowService.prototype.initBroadcast + * @description 初始化广播 + * @returns {DataFlowService} + */ + initBroadcast() { + var me = this; + this.broadcastWebSocket = this._connect(Util.urlPathAppend(me.url, 'broadcast')); + this.broadcastWebSocket.onopen = function (e) { + me.broadcastWebSocket.isOpen = true; + e.eventType = 'broadcastSocketConnected'; + me.events.triggerEvent('broadcastSocketConnected', e); + }; + this.broadcastWebSocket.onclose = function (e) { + me.broadcastWebSocket.isOpen = false; + e.eventType = 'broadcastSocketConnected'; + me.events.triggerEvent('broadcastSocketConnected', e); + }; + this.broadcastWebSocket.onerror = function (e) { + e.eventType = 'broadcastSocketError'; + me.events.triggerEvent('broadcastSocketError', e); + }; + return this; + } + + /** + * @function DataFlowService.prototype.broadcast + * @description 加载广播数据。 + * @param {GeoJSONObject} geoJSONFeature - JSON 格式的要素数据。 + */ + broadcast(geoJSONFeature) { + if (!this.broadcastWebSocket||!this.broadcastWebSocket.isOpen) { + this.events.triggerEvent('broadcastFailed'); + return; + } + this.broadcastWebSocket.send(JSON.stringify(geoJSONFeature)); + this.events.triggerEvent('broadcastSucceeded'); + + } + + /** + * @function DataFlowService.prototype.initSubscribe + * @description 初始化订阅数据 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + initSubscribe() { + var me = this; + this.subscribeWebSocket = this._connect(Util.urlPathAppend(me.url, 'subscribe')); + this.subscribeWebSocket.onopen = function (e) { + me.subscribeWebSocket.send(me._getFilterParams()); + e.eventType = 'subscribeSocketConnected'; + me.events.triggerEvent('subscribeSocketConnected', e); + }; + this.subscribeWebSocket.onerror = function (e) { + e.eventType = 'subscribeSocketError'; + me.events.triggerEvent('subscribeSocketError', e); + }; + this.subscribeWebSocket.onmessage = function (e) { + me._onMessage(e); + }; + return this; + } + + + /** + * @function DataFlowService.prototype.setExcludeField + * @description 设置排除字段 + * @param {Object} excludeField - 排除字段 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + setExcludeField(excludeField) { + this.excludeField = excludeField; + this.subscribeWebSocket.send(this._getFilterParams()); + return this; + } + + /** + * @function DataFlowService.prototype.setGeometry + * @description 设置添加的几何要素数据 + * @param {GeoJSONObject} geometry - 指定几何范围,该范围内的要素才能被订阅。 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + setGeometry(geometry) { + this.geometry = geometry; + this.subscribeWebSocket.send(this._getFilterParams()); + return this; + } + + /** + * @function DataFlowService.prototype.unSubscribe + * @description 结束订阅数据 + */ + unSubscribe() { + if (!this.subscribeWebSocket) { + return; + } + this.subscribeWebSocket.close(); + this.subscribeWebSocket = null; + } + + /** + * @function DataFlowService.prototype.unBroadcast + * @description 结束加载广播 + */ + unBroadcast() { + if (!this.broadcastWebSocket) { + return; + } + this.broadcastWebSocket.close(); + this.broadcastWebSocket = null; + } + + /** + * @function DataFlowService.prototype.destroy + * @override + */ + destroy() { + CommonServiceBase.prototype.destroy.apply(this, arguments); + var me = this; + me.geometry = null; + me.prjCoordSys = null; + me.excludeField = null; + this.unBroadcast(); + this.unSubscribe(); + + } + + + _getFilterParams() { + var filter = { + filterParam: { + prjCoordSys: this.prjCoordSys, + excludeField: this.excludeField, + geometry: this.geometry + } + }; + return Util.toJSON(filter); + } + + + _onMessage(e) { + if (e.data && e.data.indexOf("filterParam") >= 0) { + var filterParam = JSON.parse(e.data); + e.filterParam = filterParam; + e.eventType = 'setFilterParamSucceeded'; + this.events.triggerEvent('setFilterParamSucceeded', e); + return; + } + var feature = JSON.parse(e.data); + e.featureResult = feature; + e.eventType = 'messageSucceeded'; + this.events.triggerEvent('messageSucceeded', e); + } + + + _connect(url) { + url = SecurityManager.appendCredential(url); + if ("WebSocket" in window) { + return new WebSocket(url); + } else if ("MozWebSocket" in window) { + var mozWebSocket = window.MozWebSocket; + return new mozWebSocket(url); + } else { + console.log("no WebSocket"); + return null; + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetInfo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DatasetInfo + * @deprecatedclass SuperMap.DatasetInfo + * @category iServer Data Dataset + * @classdesc 数据集信息类。 + * 数据集一般为存储在一起的相关数据的集合;根据数据类型的不同,分为矢量数据集、栅格数据集(griddataset)和 + * 影像数据集(image dataset),以及为了处理特定问题而设计的数据集,如拓扑数据集,网络数据集等。 + * 数据集是 GIS 数据组织的最小单位。其中矢量数据集是由同种类型空间要素组成的集合, + * 所以也可以称为要素集。根据要素的空间特征的不同,矢量数据集又分为点数据集, + * 线数据集,面数据集等,各矢量数据集是空间特征和性质相同的数据组织起来的集合。 + * 目前版本支持的数据集主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、 + * 网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + * @param {Object} options - 参数。 + * @param {Bounds} [options.bounds] - 数据集范围。 + * @param {string} [options.dataSourceName] - 数据源名称。 + * @param {string} [options.description] - 数据集的描述信息。 + * @param {string} [options.encodeType] - 数据集存储时的压缩编码方式。 + * @param {boolean} [options.isReadOnly] - 数据集是否为只读。 + * @param {string} options.name - 数据集名称。 + * @param {Object} [options.prjCoordSys] - 数据集的投影信息。如:prjCoordSys={"epsgCode":3857}。 + * @param {string} [options.tableName] - 表名。 + * @param {string} options.type - 数据集类型。主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + * @usage + */ +class DatasetInfo { + + + constructor(options) { + options = options || {}; + + /** + * @member {Bounds} [DatasetInfo.prototype.bounds] + * @description 数据集范围,该字段只读。 + */ + this.bounds = null; + + /** + * @member {string} [DatasetInfo.prototype.dataSourceName] + * @description 数据源名称,该字段只读。 + */ + this.dataSourceName = null; + + /** + * @member {string} [DatasetInfo.prototype.description] + * @description 数据集的描述信息。 + */ + this.description = null; + + /** + * @member {string} [DatasetInfo.prototype.encodeType] + * @description 数据集存储时的压缩编码方式,该字段只读。 + */ + this.encodeType = null; + + /** + * @member {boolean} [DatasetInfo.prototype.isReadOnly] + * @description 数据集是否为只读。 + */ + this.isReadOnly = null; + + /** + * @member {string} DatasetInfo.prototype.name + * @description 数据集名称,该字段必须且只读。 + */ + this.name = null; + + /** + * @member {Object} [DatasetInfo.prototype.prjCoordSys] + * @description 数据集的投影信息。 + */ + this.prjCoordSys = null; + + /** + * @member {string} [DatasetInfo.prototype.tableName] + * @description 表名,该字段只读。 + */ + this.tableName = null; + + /** + * @member {string} DatasetInfo.prototype.type + * @description 数据集类型,该字段必设。主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + */ + this.type = null; + + Util.extend(this, options); + + var b = this.bounds; + if (b) { + this.bounds = new Bounds(b.leftBottom.x, b.leftBottom.y, b.rightTop.x, b.rightTop.y); + } + this.CLASS_NAME = "SuperMap.DatasetInfo"; + } + + /** + * @function DatasetInfo.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + /** + * @function DatasetInfo.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} JSON 对象。 + */ + toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); + if (dataObj.bounds) { + if (dataObj.bounds.toServerJSONObject) { + dataObj.bounds = dataObj.bounds.toServerJSONObject(); + } + } + return dataObj; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/OverlayAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OverlayAnalystParameters + * @deprecatedclass SuperMap.OverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 叠加分析参数基类。数据集叠加分析参数和几何对象叠加分析参数均继承此基类。 + * @param {Object} options - 参数。 + * @usage + */ +class OverlayAnalystParameters { + + + constructor(options) { + /** + * @member {OverlayOperationType} [OverlayAnalystParameters.prototype.operation=OverlayOperationType.UNION] + * @description 指定叠加分析操作类型。 + */ + this.operation = OverlayOperationType.UNION; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.OverlayAnalystParameters"; + } + + /** + * @function OverlayAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.operation = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetOverlayAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class DatasetOverlayAnalystParameters + * @deprecatedclass SuperMap.DatasetOverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 数据集叠加分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.operateDataset -数据集名称。 + * @param {string} options.sourceDataset - 源数据集名称。 + * @param {Array.} [options.operateDatasetFields] - 叠加分析中操作数据集保留在结果数据集中的字段名列表。 + * @param {FilterParameter} [options.operateDatasetFilter] - 设置操作数据集中空间对象过滤条件。 + * @param {Array.} [options.operateRegions] - 操作面对象集合,表示与这些面对象进行叠加分析。与 operateDataset 参数互斥,冲突时以 operateDataset 为准。 + * @param {Array.} [options.sourceDatasetFields] - 叠加分析中源数据集保留在结果数据集中的字段名列表。 + * @param {FilterParameter} [options.sourceDatasetFilter] - 设置源数据集中空间对象过滤条件。 + * @param {number} [options.tolerance=0] - 容限。 + * @param {OverlayOperationType} options.operation - 叠加操作枚举值。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @extends {GetFeaturesParametersBase} + * @usage + */ +class DatasetOverlayAnalystParameters extends OverlayAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {string} DatasetOverlayAnalystParameters.prototype.operateDataset + * @description 叠加分析中操作数据集的名称。 + */ + this.operateDataset = null; + + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.operateDatasetFields] + * @description 叠加分析中操作数据集保留在结果数据集中的字段名列表。 + */ + this.operateDatasetFields = []; + + /** + * @member {FilterParameter} DatasetOverlayAnalystParameters.prototype.operateDatasetFilter + * @description 设置操作数据集中空间对象过滤条件。 + */ + this.operateDatasetFilter = new FilterParameter(); + + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.operateRegions] + * @description 操作面对象集合,表示与这些面对象进行叠加分析。与 operateDataset 参数互斥,冲突时以 operateDataset 为准。 + */ + this.operateRegions = []; + + + /** + * @member {string} DatasetOverlayAnalystParameters.prototype.sourceDataset + * @description 叠加分析中源数据集的名称。 + */ + this.sourceDataset = null; + + + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.sourceDatasetFields] + * @description 叠加分析中源数据集保留在结果数据集中的字段名列表。 + */ + this.sourceDatasetFields = []; + + + /** + * @member {FilterParameter} [DatasetOverlayAnalystParameters.prototype.filterQueryParameter] + * @description 设置源数据集中空间对象过滤条件。 + */ + this.sourceDatasetFilter = new FilterParameter(); + + /** + * @member {number} [DatasetOverlayAnalystParameters.prototype.tolerance=0] + * @description 容限。 + */ + this.tolerance = 0; + + /** + * @member {DataReturnOption} [DatasetOverlayAnalystParameters.prototype.resultSetting] + * @description 结果返回设置类。 + */ + this.resultSetting = new DataReturnOption(); + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.DatasetOverlayAnalystParameters"; + } + + + /** + * @function DatasetOverlayAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + + var me = this; + me.operateDataset = null; + me.operateDatasetFields = null; + if (me.operateDatasetFilter) { + me.operateDatasetFilter.destroy(); + me.operateDatasetFilter = null; + } + if (me.operateRegions) { + for (var i = 0, opRegions = me.operateRegions, len = opRegions.length; i < len; i++) { + opRegions[i].destroy(); + } + me.operateRegions = null; + } + me.sourceDataset = null; + me.sourceDatasetFields = null; + if (me.sourceDatasetFilter) { + me.sourceDatasetFilter.destroy(); + me.sourceDatasetFilter = null; + } + me.tolerance = null; + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + } + + /** + * @function DatasetOverlayAnalystParameters.toObject + * @param {DatasetOverlayAnalystParameters} datasetOverlayAnalystParameters - 数据集叠加分析参数类。 + * @param {DatasetOverlayAnalystParameters} tempObj - 数据集叠加分析参数对象。 + * @description 将数据集叠加分析参数类转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + static toObject(datasetOverlayAnalystParameters, tempObj) { + for (var name in datasetOverlayAnalystParameters) { + if (name === "sourceDataset") { + continue; + } else if (name === "operateRegions") { + tempObj.operateRegions = []; + var ors = datasetOverlayAnalystParameters.operateRegions; + for (var index in ors) { + if (ors.hasOwnProperty(index)) { //icl542 + tempObj.operateRegions[index] = ServerGeometry.fromGeometry(ors[index]); + } + } + } else if (name === "resultSetting") { + tempObj.dataReturnOption = datasetOverlayAnalystParameters.resultSetting; + } else { + tempObj[name] = datasetOverlayAnalystParameters[name]; + } + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystParametersSetting.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SurfaceAnalystParametersSetting + * @deprecatedclass SuperMap.SurfaceAnalystParametersSetting + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析参数设置类。 + * 通过该类可以设置表面分析提取等值线、提取等值面的一些参数,包括基准值、等值距、光滑度、光滑方法等。 + * @param {Object} options - 参数。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.clipRegion] - 裁剪面对象,如果不需要对操作结果进行裁剪,可以使用 null 值取代该参数。 + * @param {number} [options.datumValue=0] - 提取等值线、提取等值面的基准值。 + * @param {Array.} options.expectedZValues - 期望分析结果的 Z 值集合。 + * @param {number} [options.interval=0] - 等值距。等值距是两条等值线之间的间隔值。 + * @param {number} [options.resampleTolerance=0] - 重采样容限。 + * @param {SmoothMethod} [options.smoothMethod=SmoothMethod.BSPLINE] - 光滑处理所使用的方法。 + * @param {number} [options.smoothness=0] - 等值线或等值面的边界线的光滑度。 + * @usage + */ +class SurfaceAnalystParametersSetting { + + constructor(options) { + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [SurfaceAnalystParametersSetting.prototype.clipRegion] + * @description 获取或设置裁剪面对象,如果不需要对操作结果进行裁剪,可以使用 null 值取代该参数。 + */ + this.clipRegion = null; + + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.datumValue=0] + * @description 获取或设置表面分析中提取等值线、提取等值面的基准值。 + * 基准值是作为一个生成等值线的初始起算值,并不一定是最小等值线的值。 例如,高程范围为 220 -1550 的 DEM 栅格数据, + * 如果设基准值为 0, 等值距为 50,则提取等值线时,以基准值 0 为起点,等值距 50 为间隔提取等值线, + * 因为给定高程的最小值是 220,所以,在给定范围内提取等值线的最小高程是 250。 + * 提取等值线的结果是:最小等值线值为 250,最大等值线值为 1550。 + */ + this.datumValue = 0; + /** + * @member {Array.} SurfaceAnalystParametersSetting.prototype.expectedZValues + * @description 获取或设置期望分析结果的 Z 值集合。 + * Z 值集合存储一系列数值,该数值为待提取等值线的值。即仅高程值在 Z 值集合中的等值线会被提取。 + */ + this.expectedZValues = null; + + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.interval=0] + * @description 获取或设置等值距。等值距是两条等值线之间的间隔值。 + */ + this.interval = 0; + + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.resampleTolerance=0] + * @description 获取或设置重采样容限。 + * 容限值越大,采样结果数据越简化。当分析结果出现交叉时,可通过调整重采样容限为较小的值来处理。 + */ + this.resampleTolerance = 0; + + /** + * @member {SmoothMethod} [SurfaceAnalystParametersSetting.prototype.smoothMethod=SmoothMethod.BSPLINE] + * @description 获取或设置光滑处理所使用的方法。 + */ + this.smoothMethod = SmoothMethod.BSPLINE; + + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.smoothness=0] + * @description 获取或设置表面分析中等值线或等值面的边界线的光滑度。 + * 以为 0-5 为例,光滑度为 0 表示不进行光滑操作,值越大表示光滑度越高。 + * 随着光滑度的增加,提取的等值线越光滑.当然光滑度越大, + * 计算所需的时间和占用的内存也就越大。而且,当等值距较小时, + * 光滑度太高会出现等值线相交的问题。 + */ + this.smoothness = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SurfaceAnalystParametersSetting"; + } + + + /** + * @function SurfaceAnalystParametersSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.clipRegion) { + me.clipRegion.destroy(); + me.clipRegion = null; + } + + me.datumValue = null; + me.expectedZValues = null; + me.interval = null; + me.resampleTolerance = null; + me.smoothMethod = null; + me.smoothness = null; + } + /** + * @function SurfaceAnalystParametersSetting.prototype.toJSON + * @description 将对象转化为 JSON 字符串。 + * @returns {string} 对象 JSON 字符串。 + */ + toJSON() { + let json = "'datumValue':" + Util.toJSON(this.datumValue); + json += ",'interval':" + Util.toJSON(this.interval); + json += ",'resampleTolerance':" + Util.toJSON(this.resampleTolerance); + json += ",'smoothMethod':" + Util.toJSON(this.smoothMethod); + json += ",'smoothness':" + Util.toJSON(this.smoothness); + if (this.expectedZValues != null) { + json += "," + "'expectedZValues':" + Util.toJSON(this.expectedZValues); + } + if (this.clipRegion != null) { + var serverGeometry = this.clipRegion; + if (this.clipRegion instanceof Geometry && this.clipRegion.components) { + serverGeometry = ServerGeometry.fromGeometry(this.clipRegion) + } + json += ",'clipRegion':" + Util.toJSON(serverGeometry); + } + return "{" + json + "}"; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SurfaceAnalystParameters + * @deprecatedclass SuperMap.SurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析提取操作参数类。通过该类可以为进行表面分析提供参数信息,包括表面分析的方法提取等值线、提取等值面和中间结果的分辨率, + * {@link DatasetSurfaceAnalystParameters} 和 {@link GeometrySurfaceAnalystParameters} 继承自该类。 + * @param {Object} options - 参数。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 表面分析参数设置类。 + * @param {number} options.resolution - 指定中间结果(栅格数据集)的分辨率。 + * @param {DataReturnOption} options.resultSetting - 结果返回设置类。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] - 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + * @usage + */ +class SurfaceAnalystParameters { + + constructor(options) { + /** + * @member {number} SurfaceAnalystParameters.prototype.resolution + * @description 获取或设置指定中间结果(栅格数据集)的分辨率。 + */ + this.resolution = 0; + + /** + * @member {SurfaceAnalystParametersSetting} SurfaceAnalystParameters.prototype.extractParameter + * @description 获取或设置表面分析参数。 + * 在进行点数据集进行提取等值面分析时,暂时不支持 SurfaceAnalystParametersSetting 类中的 expectedZValues 字段。 + */ + this.extractParameter = new SurfaceAnalystParametersSetting(); + + /** + * @member {DataReturnOption} SurfaceAnalystParameters.prototype.resultSetting + * @description 结果返回设置类。 + */ + this.resultSetting = new DataReturnOption(); + + /** + * @member {SurfaceAnalystMethod} [SurfaceAnalystParameters.prototype.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] + * @description 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + */ + this.surfaceAnalystMethod = SurfaceAnalystMethod.ISOLINE; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SurfaceAnalystParameters"; + } + + /** + * @function SurfaceAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.resolution = null; + if (me.extractParameter) { + me.extractParameter.destroy(); + me.extractParameter = null; + } + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + me.surfaceAnalystMethod = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetSurfaceAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class DatasetSurfaceAnalystParameters + * @deprecatedclass SuperMap.DatasetSurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 数据集表面分析参数类。该类对数据集表面分析所用到的参数进行设置。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.zValueFieldName - 字段名称。 + * @param {number} options.resolution - 指定中间结果(栅格数据集)的分辨率。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 表面分析参数设置类。获取或设置表面分析参数。 + * @param {FilterParameter} [options.filterQueryParameter] - 查询过滤条件参数。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] - 表面分析的提取方法,提取等值线和提取等值面。 + * @extends {SurfaceAnalystParameters} + * @usage + */ +class DatasetSurfaceAnalystParameters extends SurfaceAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {string} DatasetSurfaceAnalystParameters.prototype.dataset + * @description 要用来做数据集表面分析的数据源中数据集的名称。该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:Country@World。 + */ + this.dataset = null; + + /** + * @member {FilterParameter} DatasetSurfaceAnalystParameters.prototype.filterQueryParameter + * @description 获取或设置查询过滤条件参数。 + */ + this.filterQueryParameter = new FilterParameter(); + + /** + * @member {string} DatasetSurfaceAnalystParameters.prototype.zValueFieldName + * @description 获取或设置用于提取操作的字段名称。提取等值线时,将使用该字段中的值,对点记录集中的点数据进行插值分析,得到栅格数据集(中间结果),接着从栅格数据集提取等值线。 + */ + this.zValueFieldName = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.DatasetSurfaceAnalystParameters"; + } + + /** + * @function DatasetSurfaceAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.dataset = null; + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + me.zValueFieldName = null; + } + + /** + * @function DatasetSurfaceAnalystParameters.toObject + * @param {DatasetSurfaceAnalystParameters} datasetSurfaceAnalystParameters - 数据集表面分析参数类。 + * @param {DatasetSurfaceAnalystParameters} tempObj - 数据集表面分析参数对象。 + * @description 将数据集表面分析参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(datasetSurfaceAnalystParameters, tempObj) { + for (var name in datasetSurfaceAnalystParameters) { + if (name === "filterQueryParameter") { + tempObj.filterQueryParameter = datasetSurfaceAnalystParameters.filterQueryParameter; + } + if (name === "extractParameter") { + if (datasetSurfaceAnalystParameters.extractParameter.clipRegion instanceof Geometry && datasetSurfaceAnalystParameters.extractParameter.clipRegion.components) { + datasetSurfaceAnalystParameters.extractParameter.clipRegion = ServerGeometry.fromGeometry(datasetSurfaceAnalystParameters.extractParameter.clipRegion); + } + tempObj.extractParameter = datasetSurfaceAnalystParameters.extractParameter; + } else if (name === "dataset") { + continue; + } else if (name === "surfaceAnalystMethod") { + continue; + } else { + tempObj[name] = datasetSurfaceAnalystParameters[name]; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThiessenAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThiessenAnalystParameters + * @deprecatedclass SuperMap.ThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc 泰森多边形分析参数基类。 + * @param {Object} options - 可选参数。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.clipRegion] - 结果数据裁剪区域,可以为 null,表示不对结果进行裁剪。 + * @param {boolean} [options.createResultDataset=false] - 是否返回结果数据集。 + * @param {string} [options.resultDatasetName] - 指定结果数据集名称。 + * @param {string} [options.resultDatasourceName] - 指定结果数据集所在数据源,默认为当前数据源。 + * @param {boolean} [options.returnResultRegion=true] - 是否返回分析得到的多边形面数组。 + * @usage + */ +class ThiessenAnalystParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [ThiessenAnalystParameters.prototype.clipRegion] + * @description 结果数据裁剪区域,可以为 null,表示不对结果进行裁剪。 + */ + this.clipRegion = null; + + /** + * @member {boolean} [ThiessenAnalystParameters.prototype.createResultDataset=false] + * @description 是否返回结果数据集。如果为 true,则必须设置属性 resultDatasetName 和 resultDatasourceName。 + */ + this.createResultDataset = false; + + /** + * @member {string} ThiessenAnalystParameters.prototype.resultDatasetName + * @description 指定结果数据集名称。 + */ + this.resultDatasetName = null; + + /** + * @member {string} ThiessenAnalystParameters.prototype.resultDatasourceName + * @description 指定结果数据集所在数据源。 + */ + this.resultDatasourceName = null; + + /** + * @member {boolean} ThiessenAnalystParameters.prototype.returnResultRegion + * @description 是否返回分析得到的多边形面数组。 + */ + this.returnResultRegion = true; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.ThiessenAnalystParameters"; + } + + /** + * @function ThiessenAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.clipRegion) { + me.clipRegion.destroy(); + me.clipRegion = null; + } + me.createResultDataset = null; + me.resultDatasetName = null; + me.resultDatasourceName = null; + me.returnResultRegion = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetThiessenAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DatasetThiessenAnalystParameters + * @deprecatedclass SuperMap.DatasetThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenAnalyst + * @classdesc 数据集泰森多边形分析参数类。 + * @param {Object} options - 参数。 + * @param {FilterParameter} [options.filterQueryParameter] - 过滤参数类,即对数据集中的所有点进行分析。 + * @extends {ThiessenAnalystParameters} + * @usage + */ +class DatasetThiessenAnalystParameters extends ThiessenAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {FilterParameter} [DatasetThiessenAnalystParameters.prototype.filterQueryParameter] + * @description 过滤条件,对待分析数据集中的点进行过滤,即对数据集中的所有点进行分析。 + * @example + * var filterQueryParameter = new FilterParameter({ + * name: "Countries@World", + * attributeFilter: "SmID>100" + * }); + */ + this.filterQueryParameter = null; + + /** + * @member {string} DatasetThiessenAnalystParameters.prototype.dataset + * @description 数据集名称待分析的数据集名称,请使用 "datasetName@datasourceName" 格式来表示。 + */ + this.dataset = null; + + if (options) { + Util.extend(this, options); + } + + + this.CLASS_NAME = "SuperMap.DatasetThiessenAnalystParameters"; + } + + /** + * @function DatasetThiessenAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + } + + /** + * @function DatasetThiessenAnalystParameters.toObject + * @param {DatasetThiessenAnalystParameters} datasetThiessenAnalystParameters - 泰森多边形分析服务参数类。 + * @param {DatasetThiessenAnalystParameters} tempObj - 泰森多边形分析服务参数对象。 + * @description 将泰森多边形分析服务参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(datasetThiessenAnalystParameters, tempObj) { + for (var name in datasetThiessenAnalystParameters) { + if (name === "clipRegion") { + tempObj.clipRegion = ServerGeometry.fromGeometry(datasetThiessenAnalystParameters.clipRegion); + } else { + tempObj[name] = datasetThiessenAnalystParameters[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/DatasourceService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DatasourceService + * @deprecatedclass SuperMap.DatasourceService + * @category iServer Data Datasource + * @classdesc 数据源查询服务。 + * @param {string} url - 服务地址。如访问World Data服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string} options.datasource - 要查询的数据集所在的数据源名称。 + * @param {string} options.dataset - 要查询的数据集名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ + +class DatasourceService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.DatasourceService"; + } + + + /** + * @function DatasourceService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + + /** + * @function DatasourceService.prototype.getDatasourceService + * @description 获取指定数据源信息。 + */ + getDatasourceService(datasourceName) { + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources/name/${datasourceName}`); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function DatasourceService.prototype.getDatasourcesService + * @description 获取所有数据源信息。 + */ + getDatasourcesService() { + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources`); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasourceService.prototype.setDatasourceService + * @description 更新数据源信息。 + */ + setDatasourceService(params) { + if (!params) { + return; + } + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/DensityKernelAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DensityKernelAnalystParameters + * @deprecatedclass SuperMap.DensityKernelAnalystParameters + * @category iServer SpatialAnalyst DensityAnalyst + * @classdesc 核密度分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做核密度分析数据源中数据集的名称。该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:BaseMap_P@Jingjin。 + * @param {string} options.fieldName - 用于进行核密度分析的测量值的字段名称,核密度分析不支持文本类型的字段。 + * @param {string} options.resultGridName - 指定结果数据集名称。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.bounds] - 核密度分析的范围,用于确定结果栅格数据集的范围。如果缺省,则默认为原数据集的范围。 + * @param {number} [options.searchRadius] - 栅格邻域内用于计算密度的查找半径,单位与当前数据集相同。默认值为当前数据集的长宽中的最大值除30。 + * @param {number} [options.resultGridDatasetResolution] - 密度分析结果栅格数据的分辨率,单位与当前数据集相同。默认值为当前数据集的长宽中的最小值除500。 + * @param {string} [options.targetDatasource] - 指定的存储结果数据集的数据源,默认为当前分析的数据集所在的数据源。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ +class DensityKernelAnalystParameters { + + + constructor(options) { + /** + * @member {string} DensityKernelAnalystParameters.prototype.dataset + * @description 要用来做核密度分析数据源中数据集的名称。 + * 该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:Railway@Changchun。 + * 注:核密度分析支持点数据集和线数据集。 + */ + this.dataset = null; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [DensityKernelAnalystParameters.prototype.bounds] + * @description 核密度分析的范围,用于确定结果栅格数据集的范围。 + * 如果缺省,则默认为原数据集的范围。 + */ + this.bounds = null; + + /** + * @member {string} DensityKernelAnalystParameters.prototype.fieldName + * @description 用于进行核密度分析的测量值的字段名称,核密度分析不支持文本类型的字段。 + */ + this.fieldName = null; + + /** + * @member {number} [DensityKernelAnalystParameters.prototype.resultGridDatasetResolution] + * @description 密度分析结果栅格数据的分辨率,单位与当前数据集相同。默认值为当前数据集的长宽中的最小值除500。 + */ + this.resultGridDatasetResolution = null; + + /** + * @member {number} [DensityKernelAnalystParameters.prototype.searchRadius] + * @description 栅格邻域内用于计算密度的查找半径,单位与当前数据集相同。默认值为当前数据集的长宽中的最大值除30。 + */ + this.searchRadius = null; + + /** + * @member {string} [DensityKernelAnalystParameters.prototype.targetDatasource] + * @description 指定的存储结果数据集的数据源,默认为当前分析的数据集所在的数据源。 + */ + this.targetDatasource = null; + + /** + * @member {string} DensityKernelAnalystParameters.prototype.resultGridName + * @description 指定结果数据集名称。 + */ + this.resultGridName = null; + + /** + * @member {boolean} [DensityKernelAnalystParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + this.deleteExistResultDataset = false; + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.DensityKernelAnalystParameters"; + + } + + + /** + * @function DensityKernelAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dataset = null; + me.bounds = null; + me.fieldName = null; + me.resultGridDatasetResolution = null; + me.searchRadius = null; + + me.targetDatasource = null; + me.resultGridName = null; + me.deleteExistResultDataset = null; + } + + /** + * @function DensityKernelAnalystParameters.toObject + * @param {DensityKernelAnalystParameters} densityKernelAnalystParameters -核密度分析参数类。 + * @param {DensityKernelAnalystParameters} tempObj - 核密度分析参数对象。 + * @description 将核密度分析参数对象转换成 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(densityKernelAnalystParameters, tempObj) { + for (var name in densityKernelAnalystParameters) { + if (name !== "dataset") { + tempObj[name] = densityKernelAnalystParameters[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/DensityAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DensityAnalystService + * @deprecatedclass SuperMap.DensityAnalystService + * @category iServer SpatialAnalyst DensityAnalyst + * @classdesc + * 密度分析服务类,密度分析可计算每个输出栅格像元周围圆形邻域内输入的点或线对象的密度。 + * 密度分析,在某种意义上来说,相当于在表面上将输入的点线对象的测量值散开来,将每个点或线对象的测量量分布在整个研究区域,并计算输出栅格中每个像元的密度值。目前提供1种密度分析:核密度分析(Kernel)。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * var myDensityAnalystService = new DensityAnalystService(url); + * myDensityAnalystService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * @usage + */ +class DensityAnalystService extends SpatialAnalystBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} DensityAnalystService.prototype.mode + * @description 密度分析类型。 + */ + this.mode = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.DensityAnalystService"; + } + + /** + * @function DensityAnalystService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + this.mode = null; + } + + /** + * @function DensityAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {DensityKernelAnalystParameters} parameter - 核密度分析参数。 + */ + processAsync(parameter) { + var me = this; + var parameterObject = new Object(); + + if (parameter instanceof DensityKernelAnalystParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/densityanalyst/kernel'); + me.mode = "kernel"; + } + + DensityKernelAnalystParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/EditFeaturesParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class EditFeaturesParameters + * @deprecatedclass SuperMap.EditFeaturesParameters + * @category iServer Data Feature + * @classdesc 数据集添加、修改、删除参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.features - 当前需要创建或者是修改的要素集。 + * @param {boolean} [options.returnContent=false] - 是否返回要素内容。如果为true则返回创建要素的 ID 数组,否则返回 featureResult 资源的 URI。 + * @param {EditType} [options.editType=EditType.ADD] - POST 动作类型 (ADD、UPDATE、DELETE)。 + * @param {Array.} [options.IDs] - 删除要素时的要素的 ID 数组。 + * @usage + */ +class EditFeaturesParameters { + + + constructor(options) { + /** + * @member {string} EditFeaturesParameters.prototype.dataSourceName + * @description 当前需要创建或者是修改的要素的数据源。 + */ + this.dataSourceName = null; + + /** + * @member {string} EditFeaturesParameters.prototype.dataSetName + * @description 当前需要创建或者是修改的要素的数据集。 + */ + this.dataSetName = null; + + /** + * @member {Array.} EditFeaturesParameters.prototype.features + * @description 当前需要创建或者是修改的要素集。 + */ + this.features = null; + + /** + * @member {EditType} [EditFeaturesParameters.prototype.editType=EditType.ADD] + * @description 要素集更新类型 (add、update、delete)。 + */ + this.editType = EditType.ADD; + + /** + * @member {Array.} [EditFeaturesParameters.prototype.IDs] + * @description 执行删除时要素集 ID 集合。 + */ + this.IDs = null; + + /** + * @member {boolean} [EditFeaturesParameters.prototype.returnContent=false] + * @description 要素添加时,isUseBatch 不传或传为 false 的情况下有效。 + * true 表示直接返回新创建的要素的 ID 数组;false 表示返回创建的 featureResult 资源的 URI。 + */ + this.returnContent = false; + + /** + * @member {boolean} [EditFeaturesParameters.prototype.isUseBatch=false] + * @description 是否使用批量添加要素功能,要素添加时有效。批量添加能够提高要素编辑效率。true 表示批量添加;false 表示不使用批量添加。 + */ + this.isUseBatch = false; + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.EditFeaturesParameters"; + } + + + /** + * @function EditFeaturesParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dataSourceName = null; + me.dataSetName = null; + me.features = null; + me.editType = null; + me.IDs = null; + me.returnContent = null; + } + + /** + * @function EditFeaturesParameters.prototype.toJsonParameters + * @description 将 EditFeaturesParameters 对象参数转换为 JSON 字符串。 + * @param {EditFeaturesParameters} params - 地物编辑参数。 + * @returns {string} JSON 字符串。 + */ + static toJsonParameters(params) { + var feature, + len, + features, + editType = params.editType; + + if (editType === EditType.DELETE) { + if (params.IDs === null) { + return; + } + + features = {ids: params.IDs}; + } else { + features = []; + if (params.features) { + len = params.features.length; + for (var i = 0; i < len; i++) { + feature = params.features[i]; + feature.geometry = ServerGeometry.fromGeometry(feature.geometry); + features.push(feature); + } + } + } + + return Util.toJSON(features); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/EditFeaturesService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class EditFeaturesService + * @deprecatedclass SuperMap.EditFeaturesService + * @category iServer Data Feature + * @classdesc 数据服务中数据集添加、更新、删除服务类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务端的数据服务资源地址。请求数据服务中数据集编辑服务,URL 应为:
+ * http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/datasources/name/{数据源名}/datasets/name/{数据集名} 。
+ * 例如:http://localhost:8090/iserver/services/data-jingjin/rest/data/datasources/name/Jingjin/datasets/name/Landuse_R + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [format] -查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式。参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new EditFeaturesService(url, {eventListeners: { + * "processCompleted": editFeatureCompleted, + * "processFailed": editFeatureError + * } + * }; + * @usage + */ +class EditFeaturesService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {boolean} [EditFeaturesService.prototype.returnContent=false] + * @description要素添加时,isUseBatch 不传或传为 false 的情况下有效。true 表示直接返回新创建的要素的 ID 数组;false 表示返回创建的 featureResult 资源的 URI。 + */ + this.returnContent = false; + + /** + * @member {boolean} [EditFeaturesService.prototype.isUseBatch=false] + * @description 是否使用批量添加要素功能,要素添加时有效。 + * 批量添加能够提高要素编辑效率。 + * true 表示批量添加;false 表示不使用批量添加。 + */ + this.isUseBatch = false; + + if (options) { + Util.extend(this, options); + } + this.url = Util.urlPathAppend(this.url, 'features'); + + this.CLASS_NAME = "SuperMap.EditFeaturesService"; + } + + + /** + * @function EditFeaturesService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + me.isUseBatch = null; + me.fromIndex = null; + me.toIndex = null; + } + + + /** + * @function EditFeaturesService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {EditFeaturesParameters} params - 编辑要素参数。 + */ + processAsync(params) { + if (!(params instanceof EditFeaturesParameters)) { + return; + } + var me = this, + method = "POST", + ids = "", + editType = params.editType, + jsonParameters = null; + + me.returnContent = params.returnContent; + me.isUseBatch = params.isUseBatch; + jsonParameters = EditFeaturesParameters.toJsonParameters(params); + if (editType === EditType.DELETE) { + ids = Util.toJSON(params.IDs); + me.url = Util.urlAppend(me.url, Util.getParameterString({ids})); + method = "DELETE"; + jsonParameters = ids; + } else if (editType === EditType.UPDATE) { + method = "PUT"; + } else { + if (me.isUseBatch) { + me.url = Util.urlAppend(me.url, `isUseBatch=${me.isUseBatch}`); + me.returnContent = false; + } + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=true'); + method = "POST"; + } + } + + me.request({ + method: method, + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalyst3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalyst3DParameters + * @deprecatedclass SuperMap.FacilityAnalyst3DParameters + * @category iServer FacilityAnalyst3D + * @classdesc 最近设施分析参数基类。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在 10 分钟内能到达的最近医院, + * 超过 10 分钟能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起 + * 作用的障碍边、障碍点、转向表、耗费等属性在最近设施分析时同样可设置。 + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalyst3DParameters { + + + constructor(options) { + /** + * @member {number} [FacilityAnalyst3DParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.edgeID = null; + + /** + * @member {number} [FacilityAnalyst3DParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.nodeID = null; + + /** + * @member {string} FacilityAnalyst3DParameters.prototype.weightName + * @description 指定的权值字段信息对象的名称。 + */ + this.weightName = null; + + /** + * @member {boolean} [FacilityAnalyst3DParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找 + */ + this.isUncertainDirectionValid = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FacilityAnalyst3DParameters"; + + } + + /** + * @function FacilityAnalyst3DParameters.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + var me = this; + me.edgeID = null; + me.nodeID = null; + me.weightName = null; + me.isUncertainDirectionValid = null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSinks3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystSinks3DParameters + * @deprecatedclass SuperMap.FacilityAnalystSinks3DParameters + * @category iServer FacilityAnalyst3D Sinks + * @classdesc 最近设施分析参数类(汇查找资源)。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在10分钟内能到达的最近医院,超过10分钟 + * 能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起作用的障碍边、障碍点、 + * 转向表、耗费等属性在最近设施分析时同样可设置。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalystSinks3DParameters extends FacilityAnalyst3DParameters { + + constructor(options) { + super(options); + this.CLASS_NAME = "SuperMap.FacilityAnalystSinks3DParameters"; + } + + + /** + * @function FacilityAnalystSinks3DParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSinks3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystSinks3DService + * @deprecatedclass SuperMap.FacilityAnalystSinks3DService + * @category iServer FacilityAnalyst3D Sinks + * @classdesc 最近设施分析服务类(汇查找资源)
+ * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @example + * var myFacilityAnalystSinks3DService = new FacilityAnalystSinks3DService(url, { + * eventListeners: { + * "processCompleted": facilityAnalystSinks3DCompleted, + * "processFailed": facilityAnalystSinks3DError + * } + * }); + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为:
+ * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源};
+ * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。
+ * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystSinks3DService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystSinks3DService"; + } + + + /** + * @function FacilityAnalystSinks3DService.prototype.destroy + * @override + */ + destroy() { + CommonServiceBase.prototype.destroy.apply(this, arguments); + } + + + /** + * @function FacilityAnalystSinks3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystSinks3DParameters} params - 最近设施分析参数类(汇查找资源) + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystSinks3DParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'sinks'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSources3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystSources3DParameters + * @deprecatedclass SuperMap.FacilityAnalystSources3DParameters + * @category iServer FacilityAnalyst3D Sources + * @classdesc 最近设施分析参数类(源查找资源)。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在10分钟内能到达的最近医院,超过10分 + * 钟能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起作用的障碍边、障碍 + * 点、转向表、耗费等属性在最近设施分析时同样可设置。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalystSources3DParameters extends FacilityAnalyst3DParameters { + + + constructor(options) { + super(options); + this.CLASS_NAME = "SuperMap.FacilityAnalystSources3DParameters"; + } + + /** + * @function FacilityAnalystSources3DParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSources3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystSources3DService + * @deprecatedclass SuperMap.FacilityAnalystSources3DService + * @category iServer FacilityAnalyst3D Sources + * @classdesc 最近设施分析服务类(源查找资源) + * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystSources3DService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FacilityAnalystSources3DService"; + } + + + /** + * @function FacilityAnalystSources3DService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + + /** + * @function FacilityAnalystSources3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystSources3DParameters} params - 最近设施分析参数类(源查找资源) + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystSources3DParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'sources'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystStreamParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystStreamParameters + * @deprecatedclass SuperMap.FacilityAnalystStreamParameters + * @category iServer NetworkAnalyst UpstreamCirticalFaclilities + * @classdesc 上游/下游关键设施查找资源参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} options.queryType - 分析类型,只能是 0 (上游关键设施查询) 或者是 1(下游关键设施查询)。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。 + * @usage + */ +class FacilityAnalystStreamParameters { + + + constructor(options) { + /** + * @member {Array.} [FacilityAnalystStreamParameters.prototype.sourceNodeIDs] + * @description 指定的设施点 ID 数组。 + */ + this.sourceNodeIDs = null; + + /** + * @member {number} [FacilityAnalystStreamParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.edgeID = null; + + /** + * @member {number} [FacilityAnalystStreamParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.nodeID = null; + + /** + * @member {boolean} [FacilityAnalystStreamParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + */ + this.isUncertainDirectionValid = false; + + /** + * @member {number} FacilityAnalystStreamParameters.prototype.queryType + * @description 分析类型,只能是 0 (上游关键设施查询) 或者是 1(下游关键设施查询)。 + */ + this.queryType = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystStreamParameters"; + } + + + /** + * @function FacilityAnalystStreamParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.edgeID = null; + me.nodeID = null; + me.weightName = null; + me.isUncertainDirectionValid = null; + me.type = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystStreamService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystStreamService + * @deprecatedclass SuperMap.FacilityAnalystStreamService + * @category iServer NetworkAnalyst UpstreamCirticalFaclilities + * @classdesc 上游/下游 关键设施查找资源服务类;即查找给定弧段或节点的上游/下游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。 + * @extends NetworkAnalystServiceBase + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystStreamService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystStreamService"; + } + + + /** + * @function FacilityAnalystStreamService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + + /** + * @function FacilityAnalystStreamService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystStreamParameters} params - 上游/下游关键设施查找资源参数类。 + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystStreamParameters)) { + return; + } + var me = this, + jsonObject; + //URL 通过参数类型来判断是 上游 还是下游 查询 + if (params.queryType === 0) { + me.url = Util.urlPathAppend(me.url, 'upstreamcirticalfaclilities'); + } else if (params.queryType === 1) { + me.url = Util.urlPathAppend(me.url, 'downstreamcirticalfaclilities'); + } else { + return; + } + + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + + if (params.edgeID !== null && params.nodeID !== null) { + return; + } + if (params.edgeID === null && params.nodeID === null) { + return; + } + if (params.edgeID !== null) { + jsonObject.edgeID = params.edgeID; + } else { + jsonObject.nodeID = params.nodeID; + } + + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTracedown3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystTracedown3DParameters + * @deprecatedclass SuperMap.FacilityAnalystTracedown3DParameters + * @category iServer FacilityAnalyst3D TraceDownResult + * @classdesc 下游追踪资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalystTracedown3DParameters extends FacilityAnalyst3DParameters { + + constructor(options) { + super(options); + this.CLASS_NAME = "SuperMap.FacilityAnalystTracedown3DParameters"; + } + + /** + * @function FacilityAnalystTracedown3DParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTracedown3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystTracedown3DService + * @deprecatedclass SuperMap.FacilityAnalystTracedown3DService + * @category iServer FacilityAnalyst3D TraceDownResult + * @classdesc 下游追踪资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystTracedown3DService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystTracedown3DService"; + } + + /** + * @function FacilityAnalystTracedown3DService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FacilityAnalystTracedown3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystTracedown3DParameters} params - 下游追踪资源参数类。 + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystTracedown3DParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'tracedownresult'); + + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTraceup3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystTraceup3DParameters + * @deprecatedclass SuperMap.FacilityAnalystTraceup3DParameters + * @category iServer FacilityAnalyst3D TraceUpResult + * @classdesc 上游追踪资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalystTraceup3DParameters extends FacilityAnalyst3DParameters { + + constructor(options) { + super(options); + this.CLASS_NAME = "SuperMap.FacilityAnalystTraceup3DParameters"; + } + + /** + * @function FacilityAnalystTraceup3DParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTraceup3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystTraceup3DService + * @deprecatedclass SuperMap.FacilityAnalystTraceup3DService + * @category iServer FacilityAnalyst3D TraceUpResult + * @classdesc 上游追踪资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystTraceup3DService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystTraceup3DService"; + } + + /** + * @function FacilityAnalystTraceup3DService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FacilityAnalystTraceup3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystTraceup3DParameters} params - 上游追踪资源参数类 + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystTraceup3DParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'traceupresult'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystUpstream3DParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystUpstream3DParameters + * @deprecatedclass SuperMap.FacilityAnalystUpstream3DParameters + * @category iServer FacilityAnalyst3D UpstreamCirticalFaclilities + * @classdesc 上游关键设施查找资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} [options.edgeID] - 指定的弧段ID。edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID。edgeID 与 edgeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ +class FacilityAnalystUpstream3DParameters extends FacilityAnalyst3DParameters { + + + constructor(options) { + super(options); + options = options || {}; + this.sourceNodeIDs = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystUpstream3DParameters"; + } + + + /** + * @function FacilityAnalystUpstream3DParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + this.sourceNodeIDs = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystUpstream3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FacilityAnalystUpstream3DService + * @deprecatedclass SuperMap.FacilityAnalystUpstream3DService + * @category iServer FacilityAnalyst3D UpstreamCirticalFaclilities + * @classdesc 上游关键设施查找资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FacilityAnalystUpstream3DService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystUpstream3DService"; + } + + /** + * @function FacilityAnalystUpstream3DService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FacilityAnalystUpstream3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystUpstream3DParameters} params - 上游关键设施查找资源参数类 + */ + processAsync(params) { + if (!(params instanceof FacilityAnalystUpstream3DParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'upstreamcirticalfaclilities'); + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + edgeID: params.edgeID, + nodeID: params.nodeID, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/FieldParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FieldParameters + * @deprecatedclass SuperMap.FieldParameters + * @category iServer Data Field + * @classdesc 字段信息查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasource - 数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @usage + */ +class FieldParameters { + + + constructor(options) { + /** + * @member {string} FieldParameters.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + this.datasource = null; + + /** + * @member {string} FieldParameters.prototype.dataset + * @description 要查询的数据集名称。 + */ + this.dataset = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FieldParameters"; + } + + /** + * @function FieldParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasource = null; + me.dataset = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/FieldStatisticsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FieldStatisticsParameters + * @deprecatedclass SuperMap.FieldStatisticsParameters + * @category iServer Data Field + * @classdesc 字段统计信息查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasource - 数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.fieldName - 字段名。 + * @param {(string.|Array.>)} statisticMode - 字段统计方法类型。 + * @extends {FieldParameters} + * @usage + */ +class FieldStatisticsParameters extends FieldParameters { + + + constructor(options) { + super(options); + /** + * @member {string} FieldStatisticsParameters.prototype.fieldName + * @description 字段名 + */ + this.fieldName = null; + + /** + * @member {(string.|Array.>)} FieldStatisticsParameters.prototype.statisticMode + * @description 字段统计方法类型 + */ + this.statisticMode = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FieldStatisticsParameters"; + } + + /** + * @function FieldStatisticsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.fieldName = null; + me.statisticMode = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/FieldStatisticService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FieldStatisticService + * @deprecatedclass SuperMap.FieldStatisticService + * @category iServer Data Field + * @classdesc 字段查询统计服务类。用来完成对指定数据集指定字段的查询统计分析,即求平均值,最大值等。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。如访问 World Map 服务,只需将 url 设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string} options.datasource - 数据集所在的数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.field - 查询统计的目标字段名称。 + * @param {StatisticMode} options.statisticMode - 字段查询统计的方法类型。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new FieldStatisticService(url, {eventListeners: { + * "processCompleted": fieldStatisticCompleted, + * "processFailed": fieldStatisticError + * }, + * datasource: "World", + * dataset: "Countries", + * field: "SmID", + * statisticMode: StatisticMode.AVERAGE + * }; + * @usage + */ + + +class FieldStatisticService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} FieldStatisticService.prototype.datasource + * @description 数据集所在的数据源名称。 + */ + this.datasource = null; + + + /** + * @member {string} FieldStatisticService.prototype.dataset + * @description 数据集名称。 + */ + this.dataset = null; + + /** + * @member {string} FieldStatisticService.prototype.field + * @description 查询统计的目标字段名称。 + */ + this.field = null; + + /** + * @member {StatisticMode} FieldStatisticService.prototype.statisticMode + * @description 字段查询统计的方法类型。 + */ + this.statisticMode = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FieldStatisticService"; + } + + + /** + * @function FieldStatisticService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.datasource = null; + me.dataset = null; + me.field = null; + me.statisticMode = null; + } + + + /** + * @function FieldStatisticService.prototype.processAsync + * @description 执行服务,进行指定字段的查询统计。 + */ + processAsync() { + var me = this, + fieldStatisticURL = "datasources/" + me.datasource + "/datasets/" + me.dataset + "/fields/" + me.field + "/" + me.statisticMode; + me.url = Util.urlPathAppend(me.url, fieldStatisticURL); + + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindClosestFacilitiesParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FindClosestFacilitiesParameters + * @deprecatedclass SuperMap.FindClosestFacilitiesParameters + * @category iServer NetworkAnalyst ClosestFacility + * @classdesc 最近设施分析参数类。 + * @param {Object} options - 参数。 + * @param {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} options.event - 事件点,一般为需要获得服务设施服务的事件位置。 + * @param {Array.>} options.facilities - 设施点集合,一般为提供服务的服务设施位置。 + * @param {number} [options.expectFacilityCount=1] - 要查找的设施点数量。 + * @param {boolean} [options.fromEvent=false] - 是否从事件点到设施点进行查找。 + * @param {boolean} [options.isAnalyzeById=false] - 事件点和设施点是否通过节点 ID 号来指定。 + * @param {number} [options.maxWeight=0] - 查找半径。单位与该类中 parameter 字段(交通网络分析通用参数)中设置的耗费字段一致。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class FindClosestFacilitiesParameters { + + + constructor(options) { + /** + * @member {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} FindClosestFacilitiesParameters.prototype.event + * @description 事件点,一般为需要获得服务设施服务的事件位置。 + * 可以通过两种方式赋予事件点:当该类中字段 isAnalyzeById = true 时,应输入事件点 ID 号;当 isAnalyzeById = false 时,应输入事件点坐标。 + */ + this.event = null; + + /** + * @member {number} [FindClosestFacilitiesParameters.prototype.expectFacilityCount=1] + * @description 要查找的设施点数量。 + */ + this.expectFacilityCount = 1; + + /** + * @member {Array.>} [FindClosestFacilitiesParameters.prototype.facilities=false] + * @description 设施点集合,一般为提供服务的服务设施位置。 + * 可以通过两种方式赋予设施点:当该类中字段 isAnalyzeById = true 时,应输入设施点 ID 号;当 isAnalyzeById = false 时,应输入设施点坐标。 + */ + this.facilities = null; + + /** + * @member {boolean} [FindClosestFacilitiesParameters.prototype.fromEvent=false] + * @description 是否从事件点到设施点进行查找。最近设施分析主要是通过设施点和事件点之间最优的路线来分析在一定范围内哪个或哪些设施与事件点有最优路线的关系。 + * 这个行走线路是通过网络图层进行网络分析算法计算出来的两点间的最优路线。由于存在从 A 点到 B 点与从 B 点到 A 点的耗费不一样的情况,因此起止点 + * 不同可能会得到不同的最优路线。因此在进行最近设施分析之前,需要设置获取的最优路线的方向,即是以事件点作为起点到最近设施点的方向分析,还是以最 + * 近设施点为起点到事件点的方向分析。如果需要以事件点作为起点到设施点方向进行查找,设置该字段值为 true;设置为 false,表示从设施点到事件点进行查找。 + */ + this.fromEvent = false; + + /** + * @member {boolean} [FindClosestFacilitiesParameters.prototype.isAnalyzeById=false] + * @description 事件点和设施点是否通过节点 ID 号来指定,设置为 false,表示通过坐标点指定事件点和设施点。 + */ + this.isAnalyzeById = false; + + /** + * @member {number} [FindClosestFacilitiesParameters.prototype.maxWeight=0] + * @description 查找半径。单位与该类中 parameter 字段(交通网络分析通用参数)中设置的耗费字段一致。 + * 例如事件发生点是一起交通事故,要求查找在 10 分钟内能到达的最近医院,超过 10 分钟能到达的都不予考虑。 + * 那么需要将网络分析参数中 parameter.weightFieldName 设置为表示时间的字段,然后设置查找范围的半径值为10。 + */ + this.maxWeight = 0; + + /** + * @member {TransportationAnalystParameter} [FindClosestFacilitiesParameters.prototype.parameter] + * @description 交通网络分析通用参数。通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * 它为 TransportationAnalystParameter 类型,虽然为可选参数,但是如果不设置其中的 resultSetting 字段, + * 则返回结果空间信息等都为空。 + */ + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.FindClosestFacilitiesParameters"; + } + + /** + * @function FindClosestFacilitiesParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.event = null; + me.expectFacilityCount = null; + me.facilities = null; + me.fromEvent = null; + me.isAnalyzeById = null; + me.maxWeight = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindClosestFacilitiesService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindClosestFacilitiesService + * @deprecatedclass SuperMap.FindClosestFacilitiesService + * @category iServer NetworkAnalyst ClosestFacility + * @classdesc 最近设施分析服务类。 + * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myfindClosestFacilitiesService = new FindClosestFacilitiesService(url, { + * eventListeners: { + * "processCompleted": findClosestFacilitiesCompleted, + * "processFailed": findClosestFacilitiesError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindClosestFacilitiesService extends NetworkAnalystServiceBase { + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindClosestFacilitiesService"; + } + + /** + * @function FindClosestFacilitiesService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindClosestFacilitiesService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindClosestFacilitiesParameters} params - 最近设施分析服务参数类 + */ + processAsync(params) { + if (!(params instanceof FindClosestFacilitiesParameters)) { + return; + } + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'closestfacility'); + jsonObject = { + expectFacilityCount: params.expectFacilityCount, + fromEvent: params.fromEvent, + maxWeight: params.maxWeight, + parameter: Util.toJSON(params.parameter), + event: Util.toJSON(params.event), + facilities: me.getJson(params.isAnalyzeById, params.facilities) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindClosestFacilitiesService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过ID来分析 + * @param {Array.} params - 分析参数数组 + * @returns {Object} 转化后的JSON字符串。 + */ + getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += params[i]; + } + } + jsonString += ']'; + return jsonString; + } + + /** + * @function FindClosestFacilitiesService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + toGeoJSONResult(result) { + if (!result || !result.facilityPathList) { + return result; + } + + var geoJSONFormat = new GeoJSON(); + result.facilityPathList.map(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + + } + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + return path; + }); + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindLocationParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindLocationParameters + * @deprecatedclass SuperMap.FindLocationParameters + * @category iServer NetworkAnalyst Location + * @classdesc 选址分区分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.turnWeightField - 转向权值字段的名称。 + * @param {string} options.weightName - 阻力字段的名称,标识了进行网络分析时所使用的阻力字段。 + * @param {Array.} options.supplyCenters - 资源供给中心集合。 + * @param {number} [options.expectedSupplyCenterCount=1] - 期望用于最终设施选址的资源供给中心数量。 + * @param {boolean} [options.isFromCenter=false] - 是否从中心点开始分配资源。 + * @usage + */ +class FindLocationParameters { + + + constructor(options) { + /** + * @member {number} [FindLocationParameters.prototype.expectedSupplyCenterCount=1] + * @description 期望用于最终设施选址的资源供给中心数量。 + * 当输入值为 0 时,最终设施选址的资源供给中心数量默认为覆盖分析区域内的所需最少的供给中心数。 + */ + this.expectedSupplyCenterCount = null; + + /** + * @member {boolean} [FindLocationParameters.prototype.isFromCenter=false] + * @description 是否从中心点开始分配资源。 + * 由于网路数据中的弧段具有正反阻力,即弧段的正向阻力值与其反向阻力值可能不同, + * 因此,在进行分析时,从资源供给中心开始分配资源到需求点与从需求点向资源供给中心分配这两种分配形式下,所得的分析结果会不同。 + */ + this.isFromCenter = false; + + + /** + * @member {Array.} FindLocationParameters.prototype.supplyCenters + * @description 资源供给中心集合。 + * 资源供给中心是提供资源和服务的设施,对应于网络结点, + * 资源供给中心的相关信息包括资源量、最大阻力值、资源供给中心类型,资源供给中心在网络中所处结点的 ID 等,以便在进行选址分区分析时使用。 + */ + this.supplyCenters = null; + + /** + * @member {string} FindLocationParameters.prototype.turnWeightField + * @description 转向权值字段的名称。 + */ + this.turnWeightField = null; + + /** + * @member {string} FindLocationParameters.prototype.weightName + * @description 阻力字段的名称,标识了进行网络分析时所使用的阻力字段。 + */ + this.weightName = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindLocationParameters"; + } + + /** + * @function FindLocationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.expectedSupplyCenterCount = null; + me.isFromCenter = null; + me.turnWeightField = null; + me.weightName = null; + if (me.supplyCenters) { + for (var i = 0, supplyCenters = me.supplyCenters, len = supplyCenters.length; i < len; i++) { + supplyCenters[i].destroy(); + } + me.supplyCenters = null; + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindLocationService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindLocationService + * @deprecatedclass SuperMap.FindLocationService + * @category iServer NetworkAnalyst Location + * @classdesc 选址分区分析服务类。 + * 选址分区分析是为了确定一个或多个待建设施的最佳或最优位置,使得设施可以用一种最经济有效的方式为需求方提供服务或者商品。 + * 选址分区不仅仅是一个选址过程,还要将需求点的需求分配到相应的新建设施的服务区中,因此称之为选址与分区。 + * 选址分区分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * (start code) + * var findLocationService = new FindLocationService(url, { + * eventListeners: { + * "processCompleted": findLocationCompleted, + * "processFailed": findLocationError + * } + * }); + * (end) + * @param {string} url - 服务地址。 + * 如 http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindLocationService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindLocationService"; + } + + /** + * @function FindLocationService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindLocationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindLocationParameters} params - 选址分区分析服务参数类 + */ + processAsync(params) { + if (!(params instanceof FindLocationParameters)) { + return; + } + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'location'); + jsonObject = { + isFromCenter: params.isFromCenter, + expectedSupplyCenterCount: params.expectedSupplyCenterCount, + weightName: params.weightName, + turnWeightField: params.turnWeightField, + returnEdgeFeature: true, + returnEdgeGeometry: true, + returnNodeFeature: true, + mapParameter: Util.toJSON(params.mapParameter), + supplyCenters: me.getCentersJson(params.supplyCenters) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindLocationService.prototype.getCentersJson + * @description 将数组对象转化为JSON字符串。 + * @param {Array} params - 需要转换的参数 + * @returns {string} 转化后的JSON字符串。 + */ + getCentersJson(params) { + var json = "[", + len = params ? params.length : 0; + for (var i = 0; i < len; i++) { + if (i > 0) { + json += ","; + } + json += Util.toJSON(params[i]); + } + json += "]"; + return json; + } + + /** + * @function FindLocationService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + toGeoJSONResult(result) { + if (!result) { + return null; + } + var geoJSONFormat = new GeoJSON(); + if (result.demandResults) { + result.demandResults = geoJSONFormat.toGeoJSON(result.demandResults); + } + if (result.supplyResults) { + result.supplyResults = geoJSONFormat.toGeoJSON(result.supplyResults); + } + + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindMTSPPathsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FindMTSPPathsParameters + * @deprecatedclass SuperMap.FindMTSPPathsParameters + * @category iServer NetworkAnalyst MTSPPath + * @classdesc 多旅行商分析参数类 + * @param {Object} options - 参数。 + * @param {Array.>} options.centers - 配送中心集合。 + * @param {Array.>} options.nodes - 配送目标集合。 + * @param {boolean} [options.hasLeastTotalCost=false] - 配送模式是否为总花费最小方案。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 号来指定配送中心点和配送目的点,即通过坐标点指定。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class FindMTSPPathsParameters { + + + constructor(options) { + /** + * @member {Array.>} FindMTSPPathsParameters.prototype.centers + * @description 配送中心集合。 + * 当 FindMTSPPathsParameters.isAnalyzeById = false 时,centers 应为点的坐标数组; + * 当 FindMTSPPathsParameters.isAnalyzeById = true 时,centers 应为点的 ID 数组。 + */ + this.centers = null; + + /** + * @member {boolean} [FindMTSPPathsParameters.prototype.hasLeastTotalCost=false] + * @description 配送模式是否为总花费最小方案。 + * 若为 true,则按照总花费最小的模式进行配送,此时可能会出现某几个配送中心点配送的花费较多而其他配送中心点的花费很少的情况。 + * 若为 false,则为局部最优,此方案会控制每个配送中心点的花费,使各个中心点花费相对平均,此时总花费不一定最小。 + */ + this.hasLeastTotalCost = false; + + /** + * @member {boolean} [FindMTSPPathsParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 号来指定配送中心点和配送目的点,即通过坐标点指定。 + */ + this.isAnalyzeById = false; + + /** + * @member {Array.>} FindMTSPPathsParameters.prototype.nodes + * @description 配送目标集合。 + * 当 FindMTSPPathsParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindMTSPPathsParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + this.nodes = null; + + /** + * @member {TransportationAnalystParameter} [FindMTSPPathsParameters.prototype.parameter] + * @description 交通网络分析通用参数。 + * 通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * TransportationAnalystParameter 类型,它虽然为可选参数,但是如果不设置其中的 resultSetting 字段,则返回结果空间信息等都为空。 + */ + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.FindMTSPPathsParameters"; + } + + /** + * @function FindMTSPPathsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.centers = null; + me.hasLeastTotalCost = null; + me.isAnalyzeById = null; + me.nodes = null; + me.maxWeight = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindMTSPPathsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindMTSPPathsService + * @deprecatedclass SuperMap.FindMTSPPathsService + * @category iServer NetworkAnalyst MTSPPath + * @classdesc 多旅行商分析服务类 + * 多旅行商分析也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数)。 + * 查找经济有效的配送路径,并给出相应的行走路线。 + * 物流配送功能就是解决如何合理分配配送次序和送货路线,使配送总花费达到最小或每个配送中心的花费达到最小。 + * 该类负责将客户端指定的多旅行商分析参数传递给服务端,并接收服务端返回的结果数据。 + * 多旅行商分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindMTSPPathsService = new FindMTSPPathsService(url, { + * eventListeners: { + * "processCompleted": findMTSPPathsCompleted, + * "processFailed": findMTSPPathsError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 互服务时所需可选参数。如: + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindMTSPPathsService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindMTSPPathsService"; + } + + /** + * @function FindMTSPPathsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindMTSPPathsService..prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindMTSPPathsParameters} params - 多旅行商分析服务参数类 + */ + processAsync(params) { + if (!(params instanceof FindMTSPPathsParameters)) { + return; + } + var me = this, + jsonObject, + //end = me.url.substr(me.url.length - 1, 1), + centers = me.getJson(params.isAnalyzeById, params.centers), + nodes = me.getJson(params.isAnalyzeById, params.nodes); + me.url = Util.urlPathAppend(me.url, 'mtsppath'); + jsonObject = { + centers: centers, + nodes: nodes, + parameter: Util.toJSON(params.parameter), + hasLeastTotalCost: params.hasLeastTotalCost + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindMTSPPathsService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += params[i]; + } + } + jsonString += ']'; + return jsonString; + } + + /** + * @function FindMTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + toGeoJSONResult(result) { + if (!result || !result.pathList) { + return null; + } + var geoJSONFormat = new GeoJSON(); + result.pathList.map(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + return path; + }); + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindPathParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FindPathParameters + * @deprecatedclass SuperMap.FindPathParameters + * @category iServer NetworkAnalyst Path + * @classdesc 最佳路径分析参数类。最佳路径是在网络数据集中指定一些结点,按照顺序访问结点从而求解起止点之间阻抗最小的路径。 + * 例如如果要顺序访问 1、2、3、4 四个结点,则需要分别找到1、2结点间的最佳路径 R1—2,2、3 间的最佳路径 R2—3 和 3、4 结点间的最佳路径 R3—4, + * 顺序访问 1、2、3、4 四个结点的最佳路径就是 R = R1—2 + R2—3 + R3—4。 + * 阻抗就是指从一点到另一点的耗费,在实际应用中我们可以将距离、时间、花费等作为阻抗条件。 + * 阻抗最小也就可以理解为从一点到另一点距离最短、时间最少、花费最低等。当两点间距离最短时为最短路径,它是最佳路径问题的一个特例。 + * 阻抗值通过 {@link TransportationAnalystParameter#weightFieldName}设置。 + * 计算最佳路径除了受阻抗影响外,还受转向字段的影响。转向值通过 {@link TransportationAnalystParameter#turnWeightField} 设置。 + * + * @param {Object} options - 参数。 + * @param {Array.>} options.nodes - 最佳路径分析经过的结点或设施点数组。该字段至少包含两个点。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {boolean} [options.hasLeastEdgeCount=false] - 是否按照弧段数最少的进行最佳路径分析。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class FindPathParameters { + + constructor(options) { + + /** + * @member {boolean} [FindPathParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点。 + * 指定路径分析经过的结点或设施点有两种方式:输入结点 ID 号或直接输入点坐标。 + * 当该字段为 true 时,表示通过结点 ID 指定途经点,即 FindPathParameters.nodes = [ID1,ID2,...]; + * 反之表示通过结点坐标指定途经点,即 FindPathParameters.nodes = [{x1,y1},{x2,y2},...] 。 + */ + this.isAnalyzeById = false; + + /** + * @member {boolean} [FindPathParameters.prototype.hasLeastEdgeCount=false] + * @description 是否按照弧段数最少的进行最佳路径分析。 + * true 表示按照弧段数最少进行分析,返回弧段数最少的路径中一个阻抗最小的最佳路径; + * false 表示直接返回阻抗最小的路径,而不考虑弧段的多少。 + */ + this.hasLeastEdgeCount = null; + + /** + * @member {Array.>} FindPathParameters.prototype.nodes + * @description 最佳路径分析经过的结点或设施点数组,必设字段。该字段至少包含两个点。 + * 当 FindPathParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindPathParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + this.nodes = null; + + /** + * @member {TransportationAnalystParameter} FindPathParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.FindPathParameters"; + } + + + /** + * @function FindPathParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isAnalyzeById = null; + me.hasLeastEdgeCount = null; + me.nodes = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindPathService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindPathService + * @deprecatedclass SuperMap.FindPathService + * @category iServer NetworkAnalyst Path + * @classdesc 最佳路径分析服务类。 + * 最佳路径是在网络数据集中指定一些节点,按照节点的选择顺序, + * 顺序访问这些节点从而求解起止点之间阻抗最小的路经。 + * 该类负责将客户端指定的最佳路径分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最佳路径分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindPathService = new FindPathService(url, { + * eventListeners: { + * "processCompleted": findPathCompleted, + * "processFailed": findPathError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindPathService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindPathService"; + } + + /** + * @function FindPathService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindPathService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindPathParameters} params - 最佳路径分析服务参数类 + */ + processAsync(params) { + if (!(params instanceof FindPathParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'path'); + jsonObject = { + hasLeastEdgeCount: params.hasLeastEdgeCount, + parameter: Util.toJSON(params.parameter), + nodes: me.getJson(params.isAnalyzeById, params.nodes) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindPathService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += params[i]; + } + } + jsonString += ']'; + return jsonString; + } + + /** + * @function FindMTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + toGeoJSONResult(result) { + if (!result || !result.pathList || result.pathList.length < 1) { + return null; + } + var geoJSONFormat = new GeoJSON(); + result.pathList.forEach(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + + } + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + }); + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindServiceAreasParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FindServiceAreasParameters + * @deprecatedclass SuperMap.FindServiceAreasParameters + * @category iServer NetworkAnalyst ServiceArea + * @classdesc 服务区分析参数类。 + * 服务区分析是以指定服务站点为中心,在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * 例如:计算某快餐店能够在30分钟内送达快餐的区域。 + * @param {Object} options - 参数。 + * @param {Array.} options.weights - 每个服务站点提供服务的阻力半径,超过这个阻力半径的区域不予考虑,其单位与阻力字段一致。 + * @param {Array.>} options.centers - 服务站点数组。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {boolean} [options.isCenterMutuallyExclusive=false] - 是否中心点互斥。 + * @param {boolean} [options.isFromCenter=false] - 是否从中心点开始分析。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class FindServiceAreasParameters { + + + constructor(options) { + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点。 + * 指定路径分析经过的结点或设施点有两种方式:输入结点 ID 号或直接输入点坐标。 + * 当该字段为 true 时,表示通过结点 ID 指定途经点,即 FindServiceAreasParameters.centers = [ID1,ID2,...]; + * 反之表示通过结点坐标指定途经点,即 FindServiceAreasParameters.centers = [{x1,y1},{x2,y2},...]。 + */ + this.isAnalyzeById = false; + + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isCenterMutuallyExclusive=false] + * @description 是否中心点互斥,即按照中心点的距离进行判断是否要进行互斥处理。 + * 若分析出的服务区有重叠的部分,则通过设置该参数进行互斥处理。 + */ + this.isCenterMutuallyExclusive = false; + + /** + * @member {Array.>} FindServiceAreasParameters.prototype.centers + * @description 服务站点数组。 + * 当该类的 iSAnalyzeById = true 时,通过结点 ID 号指定服务站点;当 iSAnalyzeById = false 时,通过点坐标指定服务站点。 + */ + this.centers = null; + + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isFromCenter=false] + * @description 是否从中心点开始分析。 + * 从中心点开始分析和不从中心点开始分析,体现了服务中心和需要该服务的需求地的关系模式。 + * 从中心点开始分析,是一个服务中心向服务需求地提供服务; + * 而不从中心点开始分析,是一个服务需求地主动到服务中心获得服务。 + */ + this.isFromCenter = false; + + /** + * APIProperty: weights + * @member {Array.} FindServiceAreasParameters.prototype.weights + * @description 每个服务站点提供服务的阻力半径,即超过这个阻力半径的区域不予考虑,其单位与阻力字段一致。 + * 该字段为一个数组,数组长度跟服务中心个数一致,按照索引顺序与站点一一对应,每个元素表示了在对每个服务中心进行服务区分析时,所用的服务半径。 + */ + this.weights = null; + + /** + * @member {TransportationAnalystParameter} FindServiceAreasParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + this.parameter = new TransportationAnalystParameter(); + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.FindServiceAreasParameters"; + } + + /** + * @function FindServiceAreasParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isAnalyzeById = null; + me.isCenterMutuallyExclusive = null; + me.centers = null; + me.isFromCenter = null; + me.weights = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindServiceAreasService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindServiceAreasService + * @deprecatedclass SuperMap.FindServiceAreasService + * @category iServer NetworkAnalyst ServiceArea + * @classdesc 服务区分析服务类。 + * 服务区分析是以指定服务站点为中心, + * 在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * 该类负责将客户端指定的服务区分析参数传递给服务端,并接收服务端返回的结果数据。 + * 服务区分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindServiceAreasService = new FindServiceAreasService(url, { + * eventListeners: { + * "processCompleted": findServiceAreasCompleted, + * "processFailed": findServiceAreasError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 互服务时所需可选参数。如: + * @param {Object} options.eventListeners - 需要被注册的监听器对象 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindServiceAreasService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindServiceAreasService"; + } + + /** + * @function FindServiceAreasService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindServiceAreasService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindServiceAreasParameters} params - 服务区分析服务参数类 + */ + processAsync(params) { + if (!(params instanceof FindServiceAreasParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'servicearea'); + jsonObject = { + isFromCenter: params.isFromCenter, + isCenterMutuallyExclusive: params.isCenterMutuallyExclusive, + parameter: Util.toJSON(params.parameter), + centers: me.getJson(params.isAnalyzeById, params.centers), + weights: me.getJson(true, params.weights) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindServiceAreasService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (let i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + jsonString += params[i]; + } + } + jsonString += ']'; + return jsonString; + } + + /** + * @function FindServiceAreasService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。。 + */ + toGeoJSONResult(result) { + if (!result || !result.serviceAreaList) { + return result; + } + var geoJSONFormat = new GeoJSON(); + result.serviceAreaList.map(function (serviceArea) { + if (serviceArea.serviceRegion) { + serviceArea.serviceRegion = geoJSONFormat.toGeoJSON(serviceArea.serviceRegion); + } + if (serviceArea.edgeFeatures) { + serviceArea.edgeFeatures = geoJSONFormat.toGeoJSON(serviceArea.edgeFeatures); + } + if (serviceArea.nodeFeatures) { + serviceArea.nodeFeatures = geoJSONFormat.toGeoJSON(serviceArea.nodeFeatures); + } + if (serviceArea.routes) { + serviceArea.routes = geoJSONFormat.toGeoJSON(serviceArea.routes); + } + return serviceArea; + }); + + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindTSPPathsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FindTSPPathsParameters + * @deprecatedclass SuperMap.FindTSPPathsParameters + * @category iServer NetworkAnalyst TSPPath + * @classdesc 旅行商分析参数类。 + * 旅行商分析是路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * 旅行商分析也可以指定到达的终点,这时查找从起点能够遍历所有途经点最后到达终点,且花费最小的路径。 + * 旅行商分析和最佳路径分析都是在网络中寻找遍历所有站点的最经济的路径,区别是在遍历网络所有站点的过程中对结点访问顺序不同 + * 最佳路径分析必须按照指定顺序对站点进行访问,而旅行商分析是无序的路径分析。 + * @param {Object} options - 参数。 + * @param {boolean} [options.endNodeAssigned=false] - 是否指定终止点,将指定的途经点的最后一个点作为终止点。true 表示指定终止点,则旅行商必须最后一个访问终止点。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 号来指定配送中心点和配送目的点。 + * @param {Array.>} options.nodes - 配送目标集合。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ +class FindTSPPathsParameters { + + + constructor(options) { + /** + * @member {boolean} [FindTSPPathsParameters.prototype.endNodeAssigned=false] + * @description 是否指定终止点,将指定的途经点的最后一个点作为终止点。 + * true 表示指定终止点,则旅行商必须最后一个访问终止点。 + */ + this.endNodeAssigned = false; + + /** + * @member {boolean} [FindTSPPathsParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 号来指定途经点。 + */ + this.isAnalyzeById = false; + + /** + * @member {Array.>} FindTSPPathsParameters.prototype.nodes + * @description 旅行商分析途经点数组。 + * 当 FindTSPPathsParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindTSPPathsParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + this.nodes = null; + + /** + * @member {TransportationAnalystParameter} [FindTSPPathsParameters.prototype.parameter] + * @description 交通网络分析通用参数。通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * TransportationAnalystParameter 类型,它虽然为可选参数,但是如果不设置其中的 resultSetting + * 字段,则返回结果空间信息等都为空。 + */ + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.FindTSPPathsParameters"; + } + + /** + * @function FindTSPPathsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.endNodeAssigned = null; + me.isAnalyzeById = null; + me.nodes = null; + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/FindTSPPathsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FindTSPPathsService + * @deprecatedclass SuperMap.FindTSPPathsService + * @category iServer NetworkAnalyst TSPPath + * @classdesc 旅行商分析服务类 + * 旅行商分析是路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * 旅行商分析也可以指定到达的终点,这时查找从起点能够遍历所有途经点最后到达终点,且花费最小的路径。 + * 该类负责将客户端指定的旅行商分析参数传递给服务端,并接收服务端返回的结果数据。 + * 旅行商分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * (start code) + * var myFindTSPPathsService = new FindTSPPathsService(url, { + * eventListeners: { + * "processCompleted": findTSPPathsCompleted, + * "processFailed": findTSPPathsError + * } + * }); + * (end) + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class FindTSPPathsService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.FindTSPPathsService"; + } + + /** + * @function FindTSPPathsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FindTSPPathsService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + */ + processAsync(params) { + if (!(params instanceof FindTSPPathsParameters)) { + return; + } + var me = this, jsonObject; + me.url = Util.urlPathAppend(me.url, 'tsppath'); + jsonObject = { + parameter: Util.toJSON(params.parameter), + endNodeAssigned: params.endNodeAssigned, + nodes: me.getNodesJson(params) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function FindTSPPathsService.prototype.getNodesJson + * @description 将节点对象转化为JSON字符串。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + * @returns {string} 转化后的JSON字符串。 + */ + getNodesJson(params) { + var jsonParameters = "", nodesString, i, len, nodes; + if (params.isAnalyzeById === false) { + for (nodesString = "[", i = 0, nodes = params.nodes, len = nodes.length; i < len; i++) { + if (i > 0) { + nodesString += ","; + } + nodesString += '{"x":' + nodes[i].x + ',"y":' + nodes[i].y + '}'; + } + nodesString += ']'; + jsonParameters += nodesString; + } else if (params.isAnalyzeById === true) { + let nodeIDsString = "[", nodes = params.nodes, len = nodes.length; + for (let i = 0; i < len; i++) { + if (i > 0) { + nodeIDsString += ","; + } + nodeIDsString += nodes[i]; + } + nodeIDsString += ']'; + jsonParameters += nodeIDsString; + } + return jsonParameters; + } + + /** + * @function FindTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + toGeoJSONResult(result) { + if (!result || !result.tspPathList) { + return null; + } + var geoJSONFormat = new GeoJSON(); + result.tspPathList.forEach(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + }); + return result; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GenerateSpatialDataParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GenerateSpatialDataParameters + * @deprecatedclass SuperMap.GenerateSpatialDataParameters + * @category iServer SpatialAnalyst GenerateSpatialData + * @classdesc 动态分段操作参数类。通过该类可以为动态分段提供参数信息。 + * @param {Object} options - 参数。 + * @param {string} options.routeTable - 路由数据集。 + * @param {string} options.routeIDField - 路由数据集的标识字段。 + * @param {string} options.eventTable - 用于生成空间数据的事件表名。 + * @param {DataReturnOption} options.dataReturnOption - 设置数据返回选项。 + * @param {string} [options.attributeFilter] - 属性过滤条件。 + * @param {string} options.eventRouteIDField - 用于生成空间数据的事件表的路由标识字段。 + * @param {string} [options.measureField] - 用于生成空间数据的事件表的刻度字段,只有当事件为点事件的时候该属性才有意义。 + * @param {string} [options.measureStartField] - 用于生成空间数据的事件表的起始刻度字段,只有当事件为线事件的时候该属性才有意义。 + * @param {string} [options.measureEndField] - 用于生成空间数据的事件表的终止刻度字段,只有当事件为线事件的时候该属性才有意义。 + * @param {string} [options.measureOffsetField] - 刻度偏移量字段。 + * @param {string} [options.errorInfoField] - 错误信息字段,直接写入原事件表,用于描述事件未能生成对应的点或线时的错误信息。 + * @param {Array.} [options.retainedFields] - 欲保留到结果空间数据中的字段集合(系统字段除外)。 + * @usage + */ +class GenerateSpatialDataParameters { + + + constructor(options) { + /** + * @member {string} GenerateSpatialDataParameters.prototype.routeTable + * @description 路由数据集。 + */ + this.routeTable = null; + + /** + * @member {string} GenerateSpatialDataParameters.prototype.routeIDField + * @description 路由数据集的标识字段。 + */ + this.routeIDField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.attributeFilter] + * @description 属性过滤条件。 + * 当 {@link GenerateSpatialDataParameters.prototype.dataReturnOption.dataReturnMode} 为 {@link DataReturnMode.DATASET_AND_RECORDSET} 或 {@link DataReturnMode.RECORDSET_ONLY} 时有效。 + */ + this.attributeFilter = null; + /** + * @member {string} GenerateSpatialDataParameters.prototype.eventTable + * @description 用于生成空间数据的事件表名。 + */ + this.eventTable = null; + + /** + * @member {string} GenerateSpatialDataParameters.prototype.eventRouteIDField + * @description 用于生成空间数据的事件表的路由标识字段。 + */ + this.eventRouteIDField = null; + + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureField] + * @description 用于生成空间数据的事件表的刻度字段,只有当事件为点事件的时候该属性才有意义 + */ + this.measureField = null; + + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureStartField] + * @description 用于生成空间数据的事件表的起始刻度字段,只有当事件为线事件的时候该属性才有意义。 + */ + this.measureStartField = null; + + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureEndField] + * @description 用于生成空间数据的事件表的终止刻度字段,只有当事件为线事件的时候该属性才有意义。 + */ + this.measureEndField = null; + + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureOffsetField] + * @description 刻度偏移量字段。 + */ + this.measureOffsetField = null; + + /** + * @member {string} [GenerateSpatialDataParameters.prototype.errorInfoField] + * @description 错误信息字段,直接写入原事件表,用于描述事件未能生成对应的点或线时的错误信息。 + */ + this.errorInfoField = null; + + /** + * @member {Array.} [GenerateSpatialDataParameters.prototype.retainedFields] + * @description 欲保留到结果空间数据中的字段集合(系统字段除外)。 + * 生成空间数据时,无论是否指定保留字段,路由 ID 字段、刻度偏移量字段、刻度值字段(点事件为刻度字段,线事件是起始和终止刻度字段)都会保留到结果空间数据中; + * 如果没有指定 retainedFields 参数或者 retainedFields 参数数组长度为 0,则返回所有用户字段。 + */ + this.retainedFields = null; + + /** + * @member {DataReturnOption} GenerateSpatialDataParameters.prototype.dataReturnOption + * @description 设置数据返回的选项。 + */ + this.dataReturnOption = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GenerateSpatialDataParameters"; + } + + + /** + * @function GenerateSpatialDataParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.routeTable) { + me.routeTable = null; + } + me.routeIDField = null; + me.attributeFilter = null; + me.eventTable = null; + me.eventRouteIDField = null; + me.measureField = null; + me.measureStartField = null; + me.measureEndField = null; + me.measureOffsetField = null; + me.errorInfoField = null; + if (me.dataReturnOption) { + me.dataReturnOption.destroy(); + me.dataReturnOption = null; + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GenerateSpatialDataService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GenerateSpatialDataService + * @deprecatedclass SuperMap.GenerateSpatialDataService + * @category iServer SpatialAnalyst GenerateSpatialData + * @classdesc 动态分段分析服务类。该类负责将客户设置的动态分段分析服务参数传递给服务端,并接收服务端返回的动态分段分析结果数据。 + * 获取的结果数据包括 originResult 、result 两种,其中,originResult 为服务端返回的用 JSON 对象表示的动态分段分析结果数据,result 为服务端返回的动态分段分析结果数据。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 实例化该类如下例所示: + * (start code) + * function GenerateSpatialData(){ + * + * //配置数据返回选项(option) + * var option = new DataReturnOption({ + * expectCount: 1000, + * dataset: "generateSpatialData", + * deleteExistResultDataset: true, + * dataReturnMode: DataReturnMode.DATASET_ONLY + * }), + * //配置动态分段参数(Parameters) + * parameters = new GenerateSpatialDataParameters({ + * routeTable: "RouteDT_road@Changchun", + * routeIDField: "RouteID", + * eventTable: "LinearEventTabDT@Changchun", + * eventRouteIDField: "RouteID", + * measureField: "", + * measureStartField: "LineMeasureFrom", + * measureEndField: "LineMeasureTo", + * measureOffsetField: "", + * errorInfoField: "", + * retainedFields:[], + * dataReturnOption: option + * }), + * //配置动态分段iService + * iService = new GenerateSpatialDataService(Changchun_spatialanalyst, { + * eventListeners: { + * processCompleted: generateCompleted, + * processFailed: generateFailded + * } + * }); + * //执行 + * iService.processAsync(parameters); + * function Completed(generateSpatialDataEventArgs){//todo}; + * function Error(generateSpatialDataEventArgs){//todo}; + * (end) + * @usage + */ +class GenerateSpatialDataService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.GenerateSpatialDataService"; + } + + /** + * @function GenerateSpatialDataService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + + /** + * @function GenerateSpatialDataService.prototype.processAsync + * @description 负责将客户端的动态分段服务参数传递到服务端。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + */ + processAsync(params) { + if (!(params instanceof GenerateSpatialDataParameters)) { + return; + } + var me = this, + jsonParameters; + + jsonParameters = me.getJsonParameters(params); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + + /** + * @function GenerateSpatialDataService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + * @returns {string}转化后的JSON字符串。 + */ + getJsonParameters(params) { + var jsonParameters = "", + jsonStr = "datasets/" + params.routeTable + "/linearreferencing/generatespatialdata", + me = this; + + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeoHashGridAggParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeoHashGridAggParameter + * @deprecatedclass SuperMap.GeoHashGridAggParameter + * @classdesc 格网聚合查询参数类,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 可选参数。 + * @param {number} [options.precision=5] - 精度。 + * @extends {BucketAggParameter} + * @usage + */ +class GeoHashGridAggParameter extends BucketAggParameter { + constructor(options) { + super(); + /** + * @member {number} [GeoHashGridAggParameter.prototype.precision=5] + * @description 网格中数字的精度。 + */ + this.precision = 5; + Util.extend(this, options); + /** + * @member {BucketAggType} [GeoHashGridAggParameter.prototype.aggType=BucketAggType.GEOHASH_GRID] + * @description 格网聚合类型。 + */ + this.aggType = BucketAggType.GEOHASH_GRID; + + this.CLASS_NAME = 'SuperMap.GeoHashGridAggParameter'; + } + + destroy() { + super.destroy(); + this.aggType = null; + this.precision = null; + } + + /** + * @function GeoHashGridAggParameter.toJsonParameters + * @description 将对象转为 JSON 格式。 + * @param param 转换对象。 + * @returns {Object} + */ + static toJsonParameters(param) { + var parameters = { + aggName: param.aggName, + aggFieldName: param.aggFieldName, + aggType: param.aggType, + precision: param.precision + }; + return Util.toJson(parameters); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GeometryOverlayAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryOverlayAnalystParameters + * @deprecatedclass SuperMap.GeometryOverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc + * 几何对象叠加分析参数类。对指定的某两个几何对象做叠加分析。通过该类可以指定要做叠加分析的几何对象、叠加操作类型。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.operateGeometry - 叠加分析的操作几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link GeoJSONObject}。
+ * @param {GeoJSONObject} options.sourceGeometry - 叠加分析的源几何对象。 + * @param {Array.} [options.operateGeometries] - 批量叠加分析的操作几何对象数组。 + * @param {Array.} [options.sourceGeometries] -批量叠加分析的源几何对象数组。 + * @param {OverlayOperationType} [options.operation] - 叠加操作枚举值。 + * @extends {OverlayAnalystParameters} + * @usage + */ +class GeometryOverlayAnalystParameters extends OverlayAnalystParameters { + + constructor(options) { + super(options); + if (options && options.operateGeometry) { + this.operateGeometry = options.operateGeometry; + } + if (options && options.sourceGeometry) { + this.sourceGeometry = options.sourceGeometry; + } + if (options && options.operateGeometries) { + this.operateGeometries = options.operateGeometries; + } + if (options && options.sourceGeometries) { + this.sourceGeometries = options.sourceGeometries; + } + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.GeometryOverlayAnalystParameters"; + } + + /** + * @function GeometryOverlayAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + + if (me.sourceGeometries) { + me.sourceGeometries.destroy(); + me.sourceGeometries = null; + } + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + + if (me.operateGeometries) { + me.operateGeometries.destroy(); + me.operateGeometries = null; + } + } + + /** + * @function GeometryOverlayAnalystParameters.toObject + * @param {GeometryOverlayAnalystParameters} geometryOverlayAnalystParameters - 几何对象叠加分析参数类。 + * @param {GeometryOverlayAnalystParameters} tempObj - 几何对象叠加分析参数对象。 + * @description 将几何对象叠加分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + static toObject(geometryOverlayAnalystParameters, tempObj) { + for (var name in geometryOverlayAnalystParameters) { + if (name === "sourceGeometry") { + tempObj.sourceGeometry = ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.sourceGeometry); + + } else if (name === "sourceGeometries") { + var sourceGeometries = []; + for (var i = 0; i < geometryOverlayAnalystParameters.sourceGeometries.length; i++) { + sourceGeometries.push(ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.sourceGeometries[i])); + } + tempObj.sourceGeometries = sourceGeometries; + + } else if (name === "operateGeometry") { + tempObj.operateGeometry = ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.operateGeometry); + + } else if (name === "operateGeometries") { + var operateGeometries = []; + for (var j = 0; j < geometryOverlayAnalystParameters.operateGeometries.length; j++) { + operateGeometries.push(ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.operateGeometries[j])); + } + tempObj.operateGeometries = operateGeometries; + + } else { + tempObj[name] = geometryOverlayAnalystParameters[name]; + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeometrySurfaceAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometrySurfaceAnalystParameters + * @deprecatedclass SuperMap.GeometrySurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 几何对象表面分析参数类。该类对几何对象表面分析所用到的参数进行设置。 + * @param {Object} options - 参数。 + * @param {Array.>} options.points - 表面分析的坐标点数组。 + * @param {Array.} options.zValues - 表面分析的坐标点的 Z 值数组。 + * @param {number} [options.resolution] - 获取或设置指定中间结果(栅格数据集)的分辨率。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 获取或设置表面分析参数。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod = SurfaceAnalystMethod.ISOLINE] - 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + * @extends {SurfaceAnalystParameters} + * @usage + */ +class GeometrySurfaceAnalystParameters extends SurfaceAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {Array.>} GeometrySurfaceAnalystParameters.prototype.points + * @description 获取或设置用于表面分析的坐标点数组。 + */ + this.points = null; + + /** + * @member {Array.} GeometrySurfaceAnalystParameters.prototype.zValues + * @description 获取或设置用于提取操作的值。提取等值线时,将使用该数组中的值, + * 对几何对象中的坐标点数组进行插值分析,得到栅格数据集(中间结果),接着从栅格数据集提取等值线。 + */ + this.zValues = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GeometrySurfaceAnalystParameters"; + } + + /** + * @function GeometrySurfaceAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.points) { + for (var i = 0, points = me.points, len = points.length; i < len; i++) { + points[i].destroy(); + } + me.points = null; + } + me.zValues = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GeometryThiessenAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryThiessenAnalystParameters + * @deprecatedclass SuperMap.GeometryThiessenAnalystParameters + * @constructs GeometryThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc 几何对象泰森多边形分析参数类。对指定的某个几何对象做泰森多边形分析。通过该类可以指定要做泰森多边形分析的几何对象、返回数据集名称等。 + * @param {Object} options - 参数。 + * @param {Array.>} options.points - 使用点数组进行分析时使用的几何对象。 + * @extends {ThiessenAnalystParameters} + * @usage + */ + +class GeometryThiessenAnalystParameters extends ThiessenAnalystParameters { + + + constructor(options) { + super(options); + /** + * @member {Array.>} GeometryThiessenAnalystParameters.prototype.points + * @description 使用点数组进行分析时使用的几何对象。 + */ + this.points = null; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.GeometryThiessenAnalystParameters"; + } + + /** + * @function GeometryThiessenAnalystParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.points) { + for (var i = me.points.length - 1; i >= 0; i--) { + me.points[i].destroy(); + } + me.points = null; + } + } + + /** + * @function GeometryThiessenAnalystParameters.toObject + * @param {GeometryThiessenAnalystParameters} geometryThiessenAnalystParameters - 几何对象泰森多边形分析参数类。 + * @param {GeometryThiessenAnalystParameters} tempObj - 几何对象泰森多边形分析参数对象。 + * @description 将几何对象泰森多边形分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + static toObject(geometryThiessenAnalystParameters, tempObj) { + for (var name in geometryThiessenAnalystParameters) { + if (name === "clipRegion") { + tempObj.clipRegion = ServerGeometry.fromGeometry(geometryThiessenAnalystParameters.clipRegion); + } else { + tempObj[name] = geometryThiessenAnalystParameters[name]; + } + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeoprocessingService.js + + +/** + * @class GeoprocessingService + * @deprecatedclass SuperMap.GeoprocessingService + * @category iServer ProcessingAutomationService + * @classdesc 处理自动化服务接口的基类。 + * @version 10.1.0 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @usage + */ +class GeoprocessingService extends CommonServiceBase { + constructor(url, options) { + options = options || {}; + options.EVENT_TYPES = ['processCompleted', 'processFailed', 'processRunning']; + super(url, options); + this.CLASS_NAME = 'SuperMap.GeoprocessingService'; + this.headers = {}; + this.crossOrigin = true; + } + /** + * @function GeoprocessingService.prototype.getTools + * @description 获取处理自动化工具列表。 + */ + getTools() { + this._get(`${this.url}/list`); + } + /** + * @function GeoprocessingService.prototype.getTool + * @description 获取处理自动化工具的ID、名称、描述、输入参数、环境参数和输出结果等相关参数。 + * @param {string} identifier - 处理自动化工具ID。 + */ + getTool(identifier) { + this._get(`${this.url}/${identifier}`); + } + /** + * @function GeoprocessingService.prototype.execute + * @description 同步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + */ + execute(identifier, parameter, environment) { + parameter = parameter ? parameter : null; + environment = environment ? environment : null; + const executeParamter = { parameter, environment }; + this._get(`${this.url}/${identifier}/execute`, executeParamter); + } + /** + * @function GeoprocessingService.prototype.submitJob + * @description 异步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environments - 处理自动化工具的环境参数。 + */ + submitJob(identifier, parameter, environments) { + parameter = parameter ? parameter : null; + environments = environments ? environments : null; + const asyncParamter = { parameter: parameter, environments: environments }; + this.request({ + url: `${this.url}/${identifier}/jobs`, + headers: { 'Content-type': 'application/json' }, + method: 'POST', + data: JSON.stringify(asyncParamter), + scope: this, + success: this.serviceProcessCompleted, + failure: this.serviceProcessFailed + }); + } + + /** + * @function GeoprocessingService.prototype.waitForJobCompletion + * @description 获取处理自动化异步执行状态信息。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} options - 状态信息参数。 + * @param {number} options.interval - 定时器时间间隔。 + * @param {function} options.statusCallback - 任务状态的回调函数。 + */ + waitForJobCompletion(jobId, identifier, options) { + const me = this; + const timer = setInterval(function () { + const serviceProcessCompleted = function (serverResult) { + const state = serverResult.state.runState; + if (options.statusCallback) { + options.statusCallback(state); + } + switch (state) { + case 'FINISHED': + clearInterval(timer); + me.events.triggerEvent('processCompleted', { + result: serverResult + }); + break; + case 'FAILED': + clearInterval(timer); + me.events.triggerEvent('processFailed', { + result: serverResult + }); + break; + case 'CANCELED': + clearInterval(timer); + me.events.triggerEvent('processFailed', { + result: serverResult + }); + break; + } + }; + me._get(`${me.url}/${identifier}/jobs/${jobId}`, null, serviceProcessCompleted); + }, options.interval); + } + + /** + * @function GeoprocessingService.prototype.getJobInfo + * @description 获取处理自动化任务的执行信息。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + */ + getJobInfo(identifier, jobId) { + this._get(`${this.url}/${identifier}/jobs/${jobId}`); + } + + /** + * @function GeoprocessingService.prototype.cancelJob + * @description 取消处理自动化任务的异步执行。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + */ + cancelJob(identifier, jobId) { + this._get(`${this.url}/${identifier}/jobs/${jobId}/cancel`); + } + /** + * @function GeoprocessingService.prototype.getJobs + * @description 获取处理自动化服务任务列表。 + * @param {string} identifier - 处理自动化工具ID。(传参代表identifier算子的任务列表,不传参代表所有任务的列表) + */ + getJobs(identifier) { + let url = `${this.url}/jobs`; + if (identifier) { + url = `${this.url}/${identifier}/jobs`; + } + this._get(url); + } + /** + * @function GeoprocessingService.prototype.getResults + * @description 处理自动化工具执行的结果等,支持结果过滤。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} filter - 输出异步结果的id。(可选,传入filter参数时对该处理自动化工具执行的结果进行过滤获取,不填参时显示所有的执行结果) + */ + getResults(identifier, jobId, filter) { + let url = `${this.url}/${identifier}/jobs/${jobId}/results`; + if (filter) { + url = `${url}/${filter}`; + } + this._get(url); + } + _get(url, paramter, serviceProcessCompleted, serviceProcessFailed) { + this.request({ + url: url, + method: 'GET', + params: paramter, + headers: { 'Content-type': 'application/json' }, + scope: this, + success: serviceProcessCompleted ? serviceProcessCompleted : this.serviceProcessCompleted, + failure: serviceProcessFailed ? serviceProcessFailed : this.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeoRelationAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeoRelationAnalystParameters + * @deprecatedclass SuperMap.GeoRelationAnalystParameters + * @category iServer SpatialAnalyst GeoRelationAnalyst + * @classdesc 空间关系分析服务参数类。使用该类可以为空间关系分析服务提供所需的参数信息。 + * @param {Object} options - 参数。 + * @param {FilterParameter} options.sourceFilter - 空间关系分析中的源数据集查询参数。仅 name, ids, attributeFilter 和 fields 字段有效。 + * @param {FilterParameter} options.referenceFilter - 空间关系分析中的参考数据集查询参数。仅 name, ids, attributeFilter 和 fields 字段有效。 + * @param {SpatialRelationType} options.spatialRelationType - 指定的空间关系类型。 + * @param {boolean} [options.isBorderInside] - 边界处理方式,即位于面边线上的点是否被面包含。此参数仅用于空间关系为包含或被包含的情况。 + * @param {boolean} [options.returnFeature] - 是否返回 Feature 信息。 + * @param {boolean} [options.returnGeoRelatedOnly=true] - 仅返回满足指定空间关系的空间对象。 + * @param {number} [options.startRecord=0] - 分析结果起始记录位置。 + * @param {number} [options.expectCount=500] - 空间关系分析期望返回结果记录数,如果实际不足500条结果则返回所有分析结果。 + * @usage + */ +class GeoRelationAnalystParameters { + + + constructor(options) { + /** + * @member {string} GeoRelationAnalystParameters.prototype.dataset + * @description 源数据集名称。 + */ + this.dataset = null; + + /** + * @member {FilterParameter} GeoRelationAnalystParameters.prototype.sourceFilter + * @description 空间关系分析中的源数据集查询参数。仅 ids、attributeFilter 和 fields 字段有效。 + */ + this.sourceFilter = null; + + /** + * @member {FilterParameter} GeoRelationAnalystParameters.prototype.referenceFilter + * @description 空间关系分析中的参考数据集查询参数。仅 name,ids,attributeFilter 和 fields 字段有效。 + */ + this.referenceFilter = null; + + /** + * @member {SpatialRelationType} GeoRelationAnalystParameters.prototype.spatialRelationType + * @description 指定的空间关系类型。 + */ + this.spatialRelationType = null; + + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.isBorderInside] + * @description 边界处理方式,即位于面边线上的点是否被面包含。此参数仅用于空间关系为包含或被包含的情况。 + */ + this.isBorderInside = null; + + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.returnFeature] + * @description 是否返回 Feature 信息。 + */ + this.returnFeature = null; + + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.returnGeoRelatedOnly=true] + * @description 是否仅返回满足指定空间关系的空间对象。 + */ + this.returnGeoRelatedOnly = null; + + /** + * @member {number} [GeoRelationAnalystParameters.prototype.returnGeoRelatedOnly=0] + * @description 分析结果起始记录位置。 + */ + this.startRecord = 0; + + /** + * @member {number} [GeoRelationAnalystParameters.prototype.expectCount=500] + * @description 空间关系分析期望返回结果记录数,如果实际不足 500 条结果则返回所有分析结果。 + */ + this.expectCount = 500; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GeoRelationAnalystParameters"; + } + + /** + * @function GeoRelationAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.sourceFilter) { + me.sourceFilter.destroy(); + } + me.sourceFilter = null; + + if (me.referenceFilter) { + me.referenceFilter.destroy(); + } + me.referenceFilter = null; + + me.dataset = null; + me.spatialRelationType = null; + me.isBorderInside = null; + me.returnFeature = null; + me.returnGeoRelatedOnly = null; + me.startRecord = null; + me.expectCount = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeoRelationAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeoRelationAnalystService + * @deprecatedclass SuperMap.GeoRelationAnalystService + * @category iServer SpatialAnalyst GeoRelationAnalyst + * @classdesc 空间关系分析服务类。该类负责将客户设置的空间关系分析服务参数传递给服务端,并接收服务端返回的空间关系分析结果数据。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 实例化该类如下例所示: + * (start code) + * function datasetGeoRelationAnalystProcess() { + * var referenceFilter = new FilterParameter({ + * name:"Frame_R@Changchun", + * attributeFilter:"SmID>0"}); + * var sourceFilter = new FilterParameter({ + * attributeFilter:"SmID>0"}); + * //初始化服务类 + * var datasetGeoRelationService = new GeoRelationAnalystService( + * "http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst/"), + * //构建参数类 + * datasetGeoRelationParameters = new GeoRelationAnalystParameters({ + * dataset: "Park@Changchun", + * startRecord: 0, + * expectCount: 20, + * sourceFilter: sourceFilter, + * referenceFilter: referenceFilter, + * spatialRelationType: SpatialRelationType.INTERSECT, + * isBorderInside: true, + * returnFeature: true, + * returnGeoRelatedOnly: true + * }); + * datasetGeoRelationService.events.on({ + * "processCompleted": datasetGeoRelationAnalystCompleted, + * "processFailed": datasetGeoRelationAnalystFailed}); + * //执行 + * datasetGeoRelationService.processAsync(datasetGeoRelationParameters); + * } + * function Completed(datasetGeoRelationAnalystCompleted){//todo}; + * function Error(datasetGeoRelationAnalystFailed){//todo}; + * (end) + * @usage + */ +class GeoRelationAnalystService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.GeoRelationAnalystService"; + } + + /** + * @function GeoRelationAnalystService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function GeoRelationAnalystService.prototype.processAsync + * @description 负责将客户端的空间关系分析参数传递到服务端 + * @param {GeoRelationAnalystParameters} parameter - 空间关系分析所需的参数信息。 + */ + processAsync(parameter) { + if (!(parameter instanceof GeoRelationAnalystParameters)) { + return; + } + var me = this; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/georelation'); + var jsonParameters = Util.toJSON(parameter); + + me.url = Util.urlAppend(me.url, 'returnContent=true'); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/DatasetService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DatasetService + * @deprecatedclass SuperMap.DatasetService + * @category iServer Data Dataset + * @classdesc 数据集查询服务。 + * @param {string} url - 服务的访问地址。如访问World Data服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string}options.datasource - 数据源名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class DatasetService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + if(!options){ + return; + } + /** + * @member {string} DatasetService.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + this.datasource = null; + + /** + * @member {string} DatasetService.prototype.dataset + * @description 要查询的数据集名称。 + */ + this.dataset = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.DatasetService"; + } + + /** + * @function DatasetService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.datasource = null; + me.dataset = null; + } + + /** + * @function DatasetService.prototype.getDatasetsService + * @description 执行服务,查询数据集服务。 + */ + getDatasetsService(params) { + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources/name/${params}/datasets`); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function DatasetService.prototype.getDatasetService + * @description 执行服务,查询数据集信息服务。 + */ + getDatasetService(datasourceName, datasetName) { + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources/name/${datasourceName}/datasets/name/${datasetName}`); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function DatasetService.prototype.setDatasetService + * @description 执行服务,更改数据集信息服务。 + */ + setDatasetService(params) { + if (!params) { + return; + } + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function DatasetService.prototype.deleteDatasetService + * @description 执行服务,删除数据集信息服务。 + */ + deleteDatasetService() { + var me = this; + me.request({ + method: "DELETE", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesParametersBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesParametersBase + * @deprecatedclass SuperMap.GetFeaturesParametersBase + * @category iServer Data FeatureResults + * @classdesc 要素查询参数基类。 + * @param {Object} options - 参数。 + * @param {Array.} options.datasetNames - 数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @usage + */ +class GetFeaturesParametersBase { + constructor(options) { + /** + * @member {Array.} GetFeaturesParametersBase.prototype.datasetName + * @description 数据集集合中的数据集名称列表。 + */ + this.datasetNames = null; + + /** + * @member {string} GetFeaturesParametersBase.prototype.targetEpsgCode + * @description 动态投影的目标坐标系对应的 EPSG Code,使用时需设置 returnContent 参数为 true。 + */ + this.targetEpsgCode = null; + + /** + * @member {Object} GetFeaturesParametersBase.prototype.targetPrj + * @description 动态投影的目标坐标系。使用时需设置 returnContent 参数为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + */ + this.targetPrj = null; + + /** + * @member {boolean} [GetFeaturesParametersBase.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 如果为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + /** + * @member {number} [GetFeaturesParametersBase.prototype.fromIndex=0] + * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 + */ + this.fromIndex = 0; + + /** + * @member {number} [GetFeaturesParametersBase.prototype.toIndex=19] + * @description 查询结果的最大索引号。如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 + */ + this.toIndex = 19; + + /** + * @member {boolean} [GetFeaturesParametersBase.prototype.returnCountOnly=false] + * @description 只返回查询结果的总数。 + */ + this.returnCountOnly = false; + + /** + * @member {number} [GetFeaturesParametersBase.prototype.maxFeatures=1000] + * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 + */ + this.maxFeatures = null; + + /** + * @member {number} [GetFeaturesParametersBase.prototype.hasGeometry=true] + * @description 返回结果是否包含Geometry + */ + this.hasGeometry = true; + + /** + * @member {MetricsAggParameter|GeoHashGridAggParameter} GetFeaturesParametersBase.prototype.aggregations + * @description 聚合查询参数,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + */ + this.aggregations = null; + + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.GetFeaturesParametersBase'; + } + + /** + * + * @function GetFeaturesParametersBase.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasetNames = null; + me.returnContent = null; + me.fromIndex = null; + me.toIndex = null; + me.hasGeometry = null; + me.maxFeatures = null; + me.targetEpsgCode = null; + me.targetPrj = null; + if (me.aggregation) { + me.aggregation = null; + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBoundsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GetFeaturesByBoundsParameters + * @deprecatedclass SuperMap.GetFeaturesByBoundsParameters + * @category iServer Data FeatureResults + * @classdesc 数据集范围查询参数类,该类用于设置数据集范围查询的相关参数。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 查询的范围对象。 + * @param {Array.} options.datasetNames - 数据集名称列表。 + * @param {string} [options.attributeFilter] - 范围查询属性过滤条件。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {SpatialQueryMode} [options.spatialQueryMode=SpatialQueryMode.CONTAIN] - 空间查询模式常量。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +class GetFeaturesByBoundsParameters extends GetFeaturesParametersBase { + constructor(options) { + super(options); + /** + * @member {string} GetFeaturesByBoundsParameters.prototype.getFeatureMode + * @description 数据集查询模式。范围查询有 "BOUNDS","BOUNDS_ATTRIBUTEFILTER" 两种,当用户设置 attributeFilter 时会自动切换到 BOUNDS_ATTRIBUTEFILTER 访问服务。 + */ + this.getFeatureMode = GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} GetFeaturesByBoundsParameters.prototype.bounds + * @description 用于查询的范围对象。 + * + */ + this.bounds = null; + + /** + * @member {Array.} GetFeaturesByBoundsParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + this.fields = null; + + /** + * @member {string} GetFeaturesByBoundsParameters.prototype.attributeFilter + * @description 范围查询属性过滤条件。 + */ + this.attributeFilter = null; + + /** + * @member {SpatialQueryMode} [GetFeaturesByBoundsParameters.prototype.spatialQueryMode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式常量。 + */ + this.spatialQueryMode = SpatialQueryMode.CONTAIN; + + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.GetFeaturesByBoundsParameters'; + } + + /** + * @function GetFeaturesByBoundsParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.bounds) { + me.bounds.destroy(); + me.bounds = null; + } + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + me.fields = null; + } + me.attributeFilter = null; + me.spatialQueryMode = null; + me.getFeatureMode = null; + } + + /** + * @function GetFeaturesByBoundsParameters.toJsonParameters + * @description 将 {@link GetFeaturesByBoundsParameters} 对象参数转换为 JSON 字符串。 + * @param {GetFeaturesByBoundsParameters} params - 范围查询参数。 + * @returns {string} 转化后的 JSON 字符串。 + * + */ + static toJsonParameters(params) { + var filterParameter, bounds, parasByBounds; + + bounds = { + leftBottom: { x: params.bounds.left, y: params.bounds.bottom }, + rightTop: { x: params.bounds.right, y: params.bounds.top } + }; + parasByBounds = { + datasetNames: params.datasetNames, + getFeatureMode: GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS, + bounds: bounds, + spatialQueryMode: params.spatialQueryMode + }; + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByBounds.queryParameter = filterParameter; + } + if (params.attributeFilter) { + parasByBounds.attributeFilter = params.attributeFilter; + parasByBounds.getFeatureMode = GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS_ATTRIBUTEFILTER; + } + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + parasByBounds.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByBounds.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + parasByBounds.targetEpsgCode = params.targetEpsgCode; + } + if (!params.targetEpsgCode && params.targetPrj) { + parasByBounds.targetPrj = params.targetPrj; + } + if (params.aggregations) { + parasByBounds.aggregations = params.aggregations; + } + + return Util.toJSON(parasByBounds); + } +} + +GetFeaturesByBoundsParameters.getFeatureMode = { + BOUNDS: 'BOUNDS', + BOUNDS_ATTRIBUTEFILTER: 'BOUNDS_ATTRIBUTEFILTER' +}; + + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GetFeaturesServiceBase + * @deprecatedclass SuperMap.GetFeaturesServiceBase + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集查询服务基类。获取结果数据类型为 Object。包含 result 属性,result 的数据格式根据 format 参数决定为 GeoJSON 或者 iServerJSON。 + * @extends CommonServiceBase + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/ + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new GetFeaturesServiceBase(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * @usage + */ +class GetFeaturesServiceBase extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + options = options || {}; + + /** + * @member {boolean} [GetFeaturesServiceBase.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 如果为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.fromIndex=0] + * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 + */ + this.fromIndex = 0; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.toIndex=19] + * @description 查询结果的最大索引号。 + * 如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 + */ + this.toIndex = 19; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.hasGeometry=true] + * @description 返回结果是否包含Geometry + */ + this.hasGeometry = true; + + /** + * @member {number} [GetFeaturesServiceBase.prototype.maxFeatures=1000] + * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 + */ + this.maxFeatures = null; + + /** + * @member {string} [GetFeaturesServiceBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。 + * 参数格式为 "ISERVER","GEOJSON"。 + */ + this.format = DataFormat.GEOJSON; + + Util.extend(this, options); + this.url = Util.urlPathAppend(this.url, 'featureResults'); + + this.CLASS_NAME = "SuperMap.GetFeaturesServiceBase"; + } + + /** + * @function GetFeaturesServiceBase.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + me.fromIndex = null; + me.toIndex = null; + me.maxFeatures = null; + me.format = null; + me.hasGeometry = null; + } + + /** + * @function GetFeaturesServiceBase.prototype.processAsync + * @description 将客户端的查询参数传递到服务端。 + * @param {Object} params - 查询参数。 + */ + processAsync(params) { + if (!params) { + return; + } + var me = this, + jsonParameters = null, + firstPara = true; + + me.returnContent = params.returnContent; + me.fromIndex = params.fromIndex; + me.toIndex = params.toIndex; + me.maxFeatures = params.maxFeatures; + me.hasGeometry = params.hasGeometry; + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=' + me.returnContent); + firstPara = false; + } + var isValidNumber = me.fromIndex != null && me.toIndex != null && !isNaN(me.fromIndex) && !isNaN(me.toIndex); + if (isValidNumber && me.fromIndex >= 0 && me.toIndex >= 0 && !firstPara) { + me.url = Util.urlAppend(me.url, `fromIndex=${me.fromIndex}&toIndex=${me.toIndex}`); + } + + if (params.returnCountOnly) { + me.url = Util.urlAppend(me.url, "&returnCountOnly=" + params.returnContent) + } + + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function GetFeaturesServiceBase.prototype.getFeatureComplete + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + if (me.format === DataFormat.GEOJSON && result.features) { + var geoJSONFormat = new GeoJSON(); + result.features = geoJSONFormat.toGeoJSON(result.features); + } + me.events.triggerEvent("processCompleted", {result: result}); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBoundsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesByBoundsService + * @deprecatedclass SuperMap.GetFeaturesByBoundsService + * @category iServer Data FeatureResults + * @classdesc 数据集范围查询服务类,查询与指定范围对象符合一定空间关系的矢量要素。 + * @description 数据集范围查询服务类构造函数。 + * @extends {GetFeaturesServiceBase} + * @param {string} url - 服务地址。请求数据服务中数据集查询服务,URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myGetFeaturesByBoundsService = new SuperMa.GetFeaturesByBoundsService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ + +class GetFeaturesByBoundsService extends GetFeaturesServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.GetFeaturesByBoundsService"; + } + + /** + * @function GetFeaturesByBoundsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function GetFeaturesByBoundsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry,Bounds等)。 + * @param params {GetFeaturesByBoundsParameters} + * @returns {string} 转化后的 JSON 字符串。 + * + */ + getJsonParameters(params) { + return GetFeaturesByBoundsParameters.toJsonParameters(params); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBufferParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GetFeaturesByBufferParameters + * @deprecatedclass SuperMap.GetFeaturesByBufferParameters + * @category iServer Data FeatureResults + * @classdesc 数据集缓冲区查询参数类。 + * @param {Object} options - 参数。 + * @param {number} options.bufferDistance - buffer 距离,单位与所查询图层对应的数据集单位相同。 + * @param {GeoJSONObject} options.geometry - 空间查询条件。 + * @param {Array.} options.dataSetNames - 数据集集合中的数据集名称列表。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {string} [options.attributeFilter] - 属性查询条件。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @extends {GetFeaturesParametersBase} + * @usage + */ +class GetFeaturesByBufferParameters extends GetFeaturesParametersBase { + constructor(options) { + super(options); + /** + * @member {number} GetFeaturesByBufferParameters.prototype.bufferDistance + * @description buffer 距离,单位与所查询图层对应的数据集单位相同。 + */ + this.bufferDistance = null; + + /** + * @member {string} GetFeaturesByBufferParameters.prototype.attributeFilter + * @description 属性查询条件。 + */ + this.attributeFilter = null; + + /** + * @member {GeoJSONObject} GetFeaturesByBufferParameters.prototype.geometry + * @description 空间查询条件。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + this.geometry = null; + + /** + * @member {Array.} GetFeaturesByBufferParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + this.fields = null; + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.GetFeaturesByBufferParameters'; + } + + /** + * @function GetFeaturesByBufferParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.bufferDistance = null; + me.attributeFilter = null; + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + me.fields = null; + } + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + + /** + * @function GetFeaturesByBufferParameters.toJsonParameters + * @description 将 GetFeaturesByBufferParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJsonParameters(params) { + var filterParameter, paramsByBuffer, geometry; + geometry = ServerGeometry.fromGeometry(params.geometry); + paramsByBuffer = { + datasetNames: params.datasetNames, + getFeatureMode: 'BUFFER', + bufferDistance: params.bufferDistance, + geometry: geometry + }; + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + paramsByBuffer.queryParameter = filterParameter; + } + if (params.attributeFilter) { + paramsByBuffer.attributeFilter = params.attributeFilter; + paramsByBuffer.getFeatureMode = 'BUFFER_ATTRIBUTEFILTER'; + } + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + paramsByBuffer.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + paramsByBuffer.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + paramsByBuffer.targetEpsgCode = params.targetEpsgCode; + } + if (!params.targetEpsgCode && params.targetPrj) { + paramsByBuffer.targetPrj = params.targetPrj; + } + return Util.toJSON(paramsByBuffer); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBufferService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesByBufferService + * @deprecatedclass SuperMap.GetFeaturesByBufferService + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集缓冲区查询服务类。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesByBufferService = new GetFeaturesByBufferService(url, { + * eventListeners: { + * "processCompleted": GetFeaturesCompleted, + * "processFailed": GetFeaturesError + * } + * }); + * function GetFeaturesCompleted(object){//todo}; + * function GetFeaturesError(object){//todo}; + * @usage + */ + +class GetFeaturesByBufferService extends GetFeaturesServiceBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.GetFeaturesByBufferService"; + } + + /** + * @function GetFeaturesByBufferService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function GetFeaturesByBufferService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。在本类中重写此方法,可以实现不同种类的查询(IDs, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + if (!(params instanceof GetFeaturesByBufferParameters)) { + return; + } + return GetFeaturesByBufferParameters.toJsonParameters(params); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByGeometryParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class GetFeaturesByGeometryParameters + * @deprecatedclass SuperMap.GetFeaturesByGeometryParameters + * @category iServer Data FeatureResults + * @classdesc 数据集几何查询参数类。该类用于设置数据集几何查询的相关参数。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.geometry - 查询的几何对象。 + * @param {Array.} options.datasetNames - 数据集集合中的数据集名称列表。 + * @param {string} [options.attributeFilter] - 几何查询属性过滤条件。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {SpatialQueryMode} [options.spatialQueryMode=SpatialQueryMode.CONTAIN] - 空间查询模式常量。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ +class GetFeaturesByGeometryParameters extends GetFeaturesParametersBase { + constructor(options) { + super(options); + /** + * @member {string} GetFeaturesByGeometryParameters.prototype.getFeatureMode + * @description 数据集查询模式。几何查询有 "SPATIAL","SPATIAL_ATTRIBUTEFILTER" 两种,当用户设置 attributeFilter 时会自动切换到 SPATIAL_ATTRIBUTEFILTER 访问服务。 + */ + this.getFeatureMode = 'SPATIAL'; + + /** + * @member {GeoJSONObject} GetFeaturesByGeometryParameters.prototype.geometry + * @description 用于查询的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + this.geometry = null; + + /** + * @member {Array.} GetFeaturesByGeometryParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + this.fields = null; + + /** + * @member {string} GetFeaturesByGeometryParameters.prototype.attributeFilter + * @description 几何查询属性过滤条件。 + */ + this.attributeFilter = null; + + /** + * @member {SpatialQueryMode} [GetFeaturesByGeometryParameters.prototype.spatialQueryMode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式常量。 + */ + this.spatialQueryMode = SpatialQueryMode.CONTAIN; + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.GetFeaturesByGeometryParameters'; + } + + /** + * @function GetFeaturesByGeometryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + me.fields = null; + } + me.attributeFilter = null; + me.spatialQueryMode = null; + me.getFeatureMode = null; + } + + /** + * @function GetFeaturesByGeometryParameters.toJsonParameters + * @description 将 GetFeaturesByGeometryParameters 对象参数转换为 JSON 字符串。 + * @param {GetFeaturesByGeometryParameters} params - 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJsonParameters(params) { + var filterParameter, geometry, parasByGeometry; + + geometry = ServerGeometry.fromGeometry(params.geometry); + parasByGeometry = { + datasetNames: params.datasetNames, + getFeatureMode: 'SPATIAL', + geometry: geometry, + spatialQueryMode: params.spatialQueryMode + }; + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByGeometry.queryParameter = filterParameter; + } + if (params.attributeFilter) { + parasByGeometry.attributeFilter = params.attributeFilter; + parasByGeometry.getFeatureMode = 'SPATIAL_ATTRIBUTEFILTER'; + } + + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + parasByGeometry.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByGeometry.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + parasByGeometry.targetEpsgCode = params.targetEpsgCode; + } + if (!params.targetEpsgCode && params.targetPrj) { + parasByGeometry.targetPrj = params.targetPrj; + } + if (params.aggregations) { + parasByGeometry.aggregations = params.aggregations; + } + + return Util.toJSON(parasByGeometry); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByGeometryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesByGeometryService + * @deprecatedclass SuperMap.GetFeaturesByGeometryService + * @category iServer Data FeatureResults + * @classdesc 数据集几何查询服务类,查询与指定几何对象符合一定空间关系的矢量要素。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务。 + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myService = new GetFeaturesByGeometryService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ +class GetFeaturesByGeometryService extends GetFeaturesServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.GetFeaturesByGeometryService"; + } + + /** + * @function GetFeaturesByGeometryService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function GetFeaturesByGeometryService.prototype.getJsonParameters + * @param {GetFeaturesByGeometryParameters} params - 数据集几何查询参数类。 + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + return GetFeaturesByGeometryParameters.toJsonParameters(params); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByIDsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GetFeaturesByIDsParameters + * @deprecatedclass SuperMap.GetFeaturesByIDsParameters + * @category iServer Data FeatureResults + * @classdesc ID 查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.IDs - 指定查询的元素 ID 信息。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {Array.} options.dataSetNames - 数据集集合中的数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ +class GetFeaturesByIDsParameters extends GetFeaturesParametersBase { + constructor(options) { + super(options); + /** + * @member {string} GetFeaturesByIDsParameters.prototype.getFeatureMode + * @description 数据集查询模式。 + */ + this.getFeatureMode = 'ID'; + + /** + * @member {Array.} GetFeaturesByIDsParameters.prototype.IDs + * @description 所要查询指定的元素 ID 信息。 + */ + this.IDs = null; + + /** + * @member {Array.} GetFeaturesByIDsParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + this.fields = null; + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.GetFeaturesByIDsParameters'; + } + + /** + * @function GetFeaturesByIDsParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.IDs = null; + me.getFeatureMode = null; + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + me.fields = null; + } + } + + /** + * @function GetFeaturesByIDsParameters.toJsonParameters + * @description 将 GetFeaturesByIDsParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesByIDsParameters} params - ID 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJsonParameters(params) { + var parasByIDs, filterParameter; + + parasByIDs = { + datasetNames: params.datasetNames, + getFeatureMode: 'ID', + ids: params.IDs + }; + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByIDs.queryParameter = filterParameter; + } + if (params.targetEpsgCode) { + parasByIDs.targetEpsgCode = params.targetEpsgCode; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByIDs.hasGeometry = params.hasGeometry; + } + + if (!params.targetEpsgCode && params.targetPrj) { + parasByIDs.targetPrj = params.targetPrj; + } + if (params.aggregations) { + parasByIDs.aggregations = params.aggregations; + } + + return Util.toJSON(parasByIDs); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByIDsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesByIDsService + * @deprecatedclass SuperMap.GetFeaturesByIDsService + * @category iServer Data FeatureResults + * @classdesc 数据集ID查询服务类。在数据集集合中查找指定 ID 号对应的空间地物要素。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务。 + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/;
+ * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesByIDsService = new GetFeaturesByIDsService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ +class GetFeaturesByIDsService extends GetFeaturesServiceBase { + + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.GetFeaturesByIDsService"; + } + + /** + * @function GetFeaturesByIDsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function GetFeaturesByIDsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesByIDsParameters} params - ID查询参数类。 + * @returns {string} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + return GetFeaturesByIDsParameters.toJsonParameters(params); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesBySQLParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesBySQLParameters + * @deprecatedclass SuperMap.GetFeaturesBySQLParameters + * @category iServer Data FeatureResults + * @classdesc 数据集 SQL 查询参数类。 + * @param {Object} options - 参数。 + * @param {FilterParameter} options.queryParameter - 查询过滤条件参数。 + * @param {Array.} options.datasetNames - 数据集集合中的数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ +class GetFeaturesBySQLParameters extends GetFeaturesParametersBase { + constructor(options) { + super(options); + /** + * @member {string} GetFeaturesBySQLParameters.prototype.getFeatureMode + * @description 数据集查询模式。 + */ + this.getFeatureMode = 'SQL'; + + /** + * @member {FilterParameter} GetFeaturesBySQLParameters.prototype.queryParameter + * @description 查询过滤条件参数类。 + */ + this.queryParameter = null; + + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.GetFeaturesBySQLParameters'; + } + + /** + * @function GetFeaturesBySQLParameters.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.getFeatureMode = null; + if (me.queryParameter) { + me.queryParameter.destroy(); + me.queryParameter = null; + } + } + + /** + * @function GetFeaturesBySQLParameters.prototype.toJsonParameters + * @description 将 GetFeaturesBySQLParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesBySQLParameters} params - 数据集 SQL 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJsonParameters(params) { + var paramsBySql = { + datasetNames: params.datasetNames, + getFeatureMode: 'SQL', + queryParameter: params.queryParameter + }; + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + paramsBySql.maxFeatures = params.maxFeatures; + } + if (typeof params.hasGeometry === 'boolean') { + paramsBySql.hasGeometry = params.hasGeometry; + } + if (params.aggregations) { + paramsBySql.aggregations = params.aggregations; + } + if (params.targetEpsgCode) { + paramsBySql.targetEpsgCode = params.targetEpsgCode; + } + if (!params.targetEpsgCode && params.targetPrj) { + paramsBySql.targetPrj = params.targetPrj; + } + if (params.aggregations) { + paramsBySql.aggregations = params.aggregations; + } + return Util.toJSON(paramsBySql); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesBySQLService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesBySQLService + * @deprecatedclass SuperMap.GetFeaturesBySQLService + * @constructs GetFeaturesBySQLService + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集 SQL 查询服务类。在一个或多个指定的图层上查询符合 SQL 条件的空间地物信息。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/;
+ * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesBySQLService = new GetFeaturesBySQLService(url, { + * eventListeners: { + * "processCompleted": GetFeaturesCompleted, + * "processFailed": GetFeaturesError + * } + * }); + * function getFeaturesCompleted(object){//todo}; + * function getFeaturesError(object){//todo}; + * @usage + */ +class GetFeaturesBySQLService extends GetFeaturesServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.GetFeaturesBySQLService"; + } + + /** + * @function GetFeaturesBySQLService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /* + * @function GetFeaturesBySQLService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesBySQLParameters} params - 数据集SQL查询参数类。 + * @returns {string} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + return GetFeaturesBySQLParameters.toJsonParameters(params); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetFieldsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFieldsService + * @deprecatedclass SuperMap.GetFieldsService + * @category iServer Data Field + * @classdesc 字段查询服务,支持查询指定数据集的中所有属性字段(field)的集合。 + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string}options.datasource - 数据源名称。 + * @param {string}options.dataset - 数据集名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example + * var myService = new GetFieldsService(url, {eventListeners: { + * "processCompleted": getFieldsCompleted, + * "processFailed": getFieldsError + * }, + * datasource: "World", + * dataset: "Countries" + * }; + * @usage + */ +class GetFieldsService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} GetFieldsService.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + this.datasource = null; + + /** + * @member {string} GetFieldsService.prototype.dataset + * @description 要查询的数据集名称。 + */ + this.dataset = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GetFieldsService"; + } + + + /** + * @function GetFieldsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.datasource = null; + me.dataset = null; + } + + + /** + * @function GetFieldsService.prototype.processAsync + * @description 执行服务,查询指定数据集的字段信息。 + */ + processAsync() { + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources/${me.datasource}/datasets/${me.dataset}/fields`); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/GetGridCellInfosParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetGridCellInfosParameters + * @deprecatedclass SuperMap.GetGridCellInfosParameters + * @category iServer Data Grid + * @classdesc 数据服务栅格查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名称。 + * @param {string} options.dataSourceName - 数据源名称。 + * @param {number} options.X - 地理位置 X 轴。 + * @param {number} options.Y - 地理位置 Y 轴。 + * @usage + */ +class GetGridCellInfosParameters { + + + constructor(options) { + /** + * @member {string} GetGridCellInfosParameters.prototype.datasetName + * @description 数据集名称。 + */ + this.datasetName = null; + + /** + * @member {string} GetGridCellInfosParameters.prototype.dataSourceName + * @description 数据源名称。 + */ + this.dataSourceName = null; + + /** + * @member {number} GetGridCellInfosParameters.prototype.X + * @description 要查询的地理位置 X 轴。 + */ + this.X = null; + + /** + * @member {number} GetGridCellInfosParameters.prototype.Y + * @description 要查询的地理位置 Y 轴。 + */ + this.Y = null; + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.GetGridCellInfosParameters"; + } + + + /** + * @function GetGridCellInfosParameters.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy() { + var me = this; + me.datasetName = null; + me.dataSourceName = null; + me.X = null; + me.Y = null; + } + + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetGridCellInfosService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GetGridCellInfosService + * @deprecatedclass SuperMap.GetGridCellInfosService + * @category iServer Data Grid + * @classdesc 数据栅格查询服务,支持查询指定地理位置的栅格信息。 + * @param {string} url - 服务地址。例如: http://localhost:8090/iserver/services/data-jingjin/rest/data + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。
+ * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example + * var myService = new GetGridCellInfosService(url, {eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * @usage + */ +class GetGridCellInfosService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} GetGridCellInfosService.prototype.datasetName + * @description 数据集名称。 + */ + this.datasetName = null; + + /** + * @member {string} GetGridCellInfosService.prototype.dataSourceName + * @description 数据源名称。 + */ + this.dataSourceName = null; + + /** + * @member {string} GetGridCellInfosService.prototype.datasetType + * @description 数据集类型。 + */ + this.datasetType = null; + + /** + * @member {number} GetGridCellInfosService.prototype.X + * @description 要查询的地理位置X轴 + */ + this.X = null; + + /** + * @member {number} GetGridCellInfosService.prototype.Y + * @description 要查询的地理位置Y轴 + */ + this.Y = null; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.GetGridCellInfosService"; + } + + /** + * @function GetGridCellInfosService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.X = null; + me.Y = null; + me.datasetName = null; + me.dataSourceName = null; + me.datasetType = null; + } + + /** + * @function GetGridCellInfosService.prototype.processAsync + * @description 执行服务,查询数据集信息。 + * @param {GetGridCellInfosParameters} params - 查询参数。 + */ + processAsync(params) { + if (!(params instanceof GetGridCellInfosParameters)) { + return; + } + Util.extend(this, params); + var me = this; + me.url = Util.urlPathAppend(me.url,`datasources/${me.dataSourceName}/datasets/${me.datasetName}`); + me.queryRequest(me.getDatasetInfoCompleted, me.getDatasetInfoFailed); + } + + /** + * @function GetGridCellInfosService.prototype.queryRequest + * @description 执行服务,查询。 + * @callback {function} successFun - 成功后执行的函数。 + * @callback {function} failedFunc - 失败后执行的函数。 + */ + queryRequest(successFun, failedFunc) { + var me = this; + me.request({ + method: "GET", + data: null, + scope: me, + success: successFun, + failure: failedFunc + }); + } + + /** + * @function GetGridCellInfosService.prototype.getDatasetInfoCompleted + * @description 数据集查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + getDatasetInfoCompleted(result) { + var me = this; + result = Util.transformResult(result); + me.datasetType = result.datasetInfo.type; + me.queryGridInfos(); + } + + /** + * @function GetGridCellInfosService.prototype.queryGridInfos + * @description 执行服务,查询数据集栅格信息信息。 + */ + queryGridInfos() { + var me = this; + me.url = Util.urlPathAppend(me.url, me.datasetType == 'GRID' ? 'gridValue' : 'imageValue'); + if (me.X != null && me.Y != null) { + me.url = Util.urlAppend(me.url, `x=${me.X}&y=${me.Y}`); + } + me.queryRequest(me.serviceProcessCompleted, me.serviceProcessFailed); + } + + + /** + * @function GetGridCellInfosService.prototype.getDatasetInfoFailed + * @description 数据集查询失败,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + getDatasetInfoFailed(result) { + var me = this; + me.serviceProcessFailed(result); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/Theme.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CommonTheme + * @aliasclass Theme + * @deprecatedclass SuperMap.Theme + * @category iServer Map Theme + * @classdesc 专题图基类。 + * @param {string} type - 专题图类型。 + * @param {Object} options - 可选参数。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class Theme { + + constructor(type, options) { + if (!type) { + return this; + } + /** + * @member {ThemeMemoryData} CommonTheme.prototype.memoryData + * @description 专题图内存数据。
+ * 用内存数据制作专题图的方式与表达式制作专题图的方式互斥,前者优先级较高。 + * 第一个参数代表专题值,即数据集中用来做专题图的字段或表达式的值;第二个参数代表外部值。在制作专题图时,会用外部值代替专题值来制作相应的专题图。 + */ + this.memoryData = null; + + /** + * @member {string} CommonTheme.prototype.type + * @description 专题图类型。 + */ + this.type = type; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.Theme"; + } + + /** + * @function CommonTheme.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.memoryData) { + me.memoryData.destroy(); + me.memoryData = null; + } + me.type = null; + } + + /** + * @function CommonTheme.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + //return 子类实现 + return; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ServerTextStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ServerTextStyle + * @deprecatedclass SuperMap.ServerTextStyle + * @category iServer Map Theme + * @classdesc 服务端文本风格类。该类用于定义文本风格的相关属性。 + * @param {Object} options - 可选参数。 + * @param {TextAlignment} [options.align=TextAlignment.BASELINECENTER] - 文本的对齐方式。 + * @param {ServerColor} [options.backColor] - 文本的背景色。默认 backColor = new ServerColor(255, 255, 255)。 + * @param {ServerColor} [options.foreColor] - 文本的前景色。默认 foreColor = new ServerColor(0, 0, 0)。 + * @param {boolean} [options.backOpaque=false] - 文本背景是否不透明。 + * @param {boolean} [options.sizeFixed=true] - 文本大小是否固定。 + * @param {number} [options.fontHeight=6] - 文本字体的高度。 + * @param {number} [options.fontWidth=0] - 文本字体的宽度。 + * @param {number} [options.fontWeight=400] - 文本字体的磅数。 + * @param {string} [options.fontName='Times New Roman'] - 文本字体的名称。 + * @param {boolean} [options.bold=false] - 文本是否为粗体字。 + * @param {boolean} [options.italic=false] - 文本是否采用斜体。 + * @param {number} [options.italicAngle=0] - 字体倾斜角度。 + * @param {boolean} [options.shadow=false] - 文本是否有阴影。 + * @param {boolean} [options.strikeout=false] - 文本字体是否加删除线。 + * @param {boolean} [options.outline=false] - 是否以轮廓的方式来显示文本的背景。 + * @param {number} [options.opaqueRate=0] - 注记文字的不透明度。 + * @param {boolean} [options.underline=false] - 文本字体是否加下划线。 + * @param {number} [options.rotation=0.0] - 文本旋转的角度。 + * @usage + */ +class ServerTextStyle { + + + constructor(options) { + /** + * @member {TextAlignment} [ServerTextStyle.prototype.align= TextAlignment.BASELINECENTER] + * @description 文本的对齐方式。 + */ + this.align = TextAlignment.BASELINECENTER; + + /** + * @member {ServerColor} [ServerTextStyle.prototype.backColor=(255, 255, 255)] + * @description 文本的背景色。 + */ + this.backColor = new ServerColor(255, 255, 255); + + /** + * @member {ServerColor} [ServerTextStyle.prototype.foreColor=(0, 0, 0)] + * @description 文本的前景色。 + */ + this.foreColor = new ServerColor(0, 0, 0); + + /** + * @member {boolean} [ServerTextStyle.prototype.backOpaque=false] + * @description 文本背景是否不透明。true 表示文本背景不透明。 + */ + this.backOpaque = false; + + /** + * @member {boolean} [ServerTextStyle.prototype.sizeFixed=true] + * @description 文本大小是否固定。设置为 true,表示图片为固定像素大小,具体大小请参考 fontHeight。当设为 false 时,图片会随着地图缩放而缩放。 + */ + this.sizeFixed = true; + + /** + * @member {number} [ServerTextStyle.prototype.fontHeight=6] + * @description 文本字体的高度,单位与 sizeFixed 有关,当 sizeFixed 为 False 时,即非固定文本大小时使用地图坐标单位, + * 如地理坐标系下的地图中单位为度;当 sizeFixed 为 True 时,单位为毫米(mm)。 + */ + this.fontHeight = 6; + + /** + * @member {number} [ServerTextStyle.prototype.fontWidth=0] + * @description 文本字体的宽度。字体的宽度以英文字符为标准,由于一个中文字符相当于两个英文字符。 + */ + this.fontWidth = 0; + + /** + * @member {number} [ServerTextStyle.prototype.fontWeight=400] + * @description 文本字体的磅数。表示粗体的具体数值。取值范围为从0-900之间的整百数。 + */ + this.fontWeight = 400; + + /** + * @member {string} [ServerTextStyle.prototype.fontName="Times New Roman"] + * @description 文本字体的名称。 + */ + this.fontName = "Times New Roman"; + + /** + * @member {boolean} [ServerTextStyle.prototype.bold=false] + * @description 文本是否为粗体字。true 表示为粗体。false 表示文本不是粗体字。 + */ + this.bold = false; + + /** + * @member {boolean} [ServerTextStyle.prototype.italic=false] + * @description 文本是否采用斜体。true 表示采用斜体。 + */ + this.italic = false; + + /** + * @member {number} [ServerTextStyle.prototype.italicAngle=0] + * @description 字体倾斜角度。正负度之间,以度为单位,精确到0.1度。当倾斜角度为0度,为系统默认的字体倾斜样式。 + * 正负度是指以纵轴为起始零度线,其纵轴左侧为正,右侧为负。允许的最大角度为60,最小-60。大于60按照60处理,小于-60按照-60处理。目前只对标签专题图有效。 + */ + this.italicAngle = 0; + + /** + * @member {boolean} [ServerTextStyle.prototype.shadow=false] + * @description 文本是否有阴影。true 表示给文本增加阴影。false 表示文本没有阴影。 + */ + this.shadow = false; + + /** + * @member {boolean} [ServerTextStyle.prototype.strikeout=false] + * @description 文本字体是否加删除线。true 表示加删除线。false 表示文本字体不加删除线。 + */ + this.strikeout = false; + + /** + * @member {boolean} [ServerTextStyle.prototype.outline=false] + * @description 是否以轮廓的方式来显示文本的背景。true 表示以轮廓的方式来显示文本的背景。false 表示不以轮廓的方式来显示文本的背景。 + */ + this.outline = false; + + /** + * @member {number} [ServerTextStyle.prototype.opaqueRate=0] + * @description 注记文字的不透明度。不透明度的范围为0-100。0表示透明。 + */ + this.opaqueRate = 0; + + /** + * @member {boolean} [ServerTextStyle.prototype.underline=false] + * @description 文本字体是否加下划线。true 表示加下划线。 + */ + this.underline = false; + + /** + * @member {number} [ServerTextStyle.prototype.rotation=0.0] + * @description 文本旋转的角度。逆时针方向为正方向,单位为度,精确到0.1度。 + */ + this.rotation = 0.0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerTextStyle"; + } + + + /** + * @function ServerTextStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.align = null; + if (me.backColor) { + me.backColor.destroy(); + me.backColor = null; + } + if (me.foreColor) { + me.foreColor.destroy(); + me.foreColor = null; + } + me.backOpaque = null; + me.sizeFixed = null; + me.fontHeight = null; + me.fontWidth = null; + me.fontWeight = null; + me.fontName = null; + me.bold = null; + me.italic = null; + me.italicAngle = null; + me.shadow = null; + me.strikeout = null; + me.outline = null; + me.opaqueRate = null; + me.underline = null; + me.rotation = null; + } + + /** + * @function ServerTextStyle.fromObj + * @description 从传入对象获服务端文本风格类。 + * @param {Object} obj - 传入对象 + * @returns {ServerTextStyle} 返回服务端文本风格对象 + */ + static fromObj(obj) { + var res = new ServerTextStyle(obj); + Util.copy(res, obj); + res.backColor = ServerColor.fromJson(obj.backColor); + res.foreColor = ServerColor.fromJson(obj.foreColor); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeLabelItem + * @deprecatedclass SuperMap.ThemeLabelItem + * @category iServer Map Theme + * @classdesc 分段标签专题图的子项。标签专题图用专题值对点、线、面等对象做标注。 + * 值得注意的是,分段标签专题图允许用户通过 rangeExpression 字段指定用于分段的数值型字段, + * 同一范围段内的标签具有相同的显示风格,其中每一个范围段就是一个专题图子项, + * 每一个子项都具有其名称、风格、起始值和终止值。注意:每个分段所表示的范围为 [Start, End)。例如:标签专题图的分段点有两个子项, + * 他们所代表的分段区间分别为[0,5),[5,10)。那么需要分别设置 ThemeLabelItem[0].start=0, + * ThemeLabelItem[0].end=5,SuperMap.ThemeLabelItem[1].start=5,SuperMap.ThemeLabelItem[1].end=10。 + * @param {Object} options - 可选参数。 + * @param {string} [options.caption] - 子项的名称。 + * @param {number} [options.end=0] - 子项的终止值。 + * @param {number} [options.start=0] - 子项的分段起始值。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @param {ServerTextStyle} [options.style] - 子项文本的显示风格。 + * @usage + */ +class ThemeLabelItem { + + constructor(options) { + /** + * @member {string} [ThemeLabelItem.prototype.caption] + * @description 标签专题子项的标题。 + */ + this.caption = null; + + /** + * @member {number} [ThemeLabelItem.prototype.end=0] + * @description 标签专题图子项的终止值。如果该子项是分段中最后一个子项,那么该终止值就是分段的最大值; + * 如果不是最后一项,该终止值必须与其下一子项的起始值相同,否则系统抛出异常。 + */ + this.end = 0; + + /** + * @member {number} [ThemeLabelItem.prototype.start=0] + * @description 标签专题图子项的分段起始值。如果该子项是分段中第一项,那么该起始值就是分段的最小值; + * 如果该子项的序号大于等于 1 的时候,该起始值必须与前一子项的终止值相同,否则系统会抛出异常。 + */ + this.start = 0; + + /** + * @member {boolean} [ThemeLabelItem.prototype.visible=true] + * @description 标签专题图子项是否可见。如果标签专题图子项可见,则为 true,否则为 false。 + */ + this.visible = true; + + /** + * @member {ServerTextStyle} ThemeLabelItem.prototype.style + * @description 标签专题图子项文本的显示风格。各种风格的优先级从高到低为:
+ * uniformMixedStyle(标签文本的复合风格),ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + this.style = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeLabelItem"; + + } + + + /** + * @function ThemeLabelItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; + if (me.style) { + me.style.destroy(); + me.style = null; + } + me.visible = null; + } + + /** + * @function ThemeLabelItem.fromObj + * @description 从传入对象获取分段标签专题图的子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelItem} ThemeLabelItem 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var t = new ThemeLabelItem(); + Util.copy(t, obj); + return t; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeUniqueItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeUniqueItem + * @deprecatedclass SuperMap.ThemeUniqueItem + * @category iServer Map Theme + * @classdesc 单值专题图子项类。单值专题图是将专题值相同的要素归为一类,为每一类设定一种渲染风格,其中每一类就是一个专题图子项。比如,利用单值专题图制作行政区划图,Name 字段代表 + * 省/直辖市名,该字段用来做专题变量,如果该字段的字段值总共有 5 种不同值,则该行政区划图有 5 个专题图子项。 + * @param {Object} options - 参数。 + * @param {string} options.unique - 子项的单值字段。 + * @param {string} [options.caption] - 子项的标题。 + * @param {ServerStyle} [options.style] - 子项的风格。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ +class ThemeUniqueItem { + + constructor(options) { + /** + * @member {string} [ThemeUniqueItem.prototype.caption] + * @description 单值专题图子项的标题。 + */ + this.caption = null; + + /** + * @member {ServerStyle} [ThemeUniqueItem.prototype.style] + * @description 单值专题图子项的显示风格。 + */ + this.style = new ServerStyle(); + + /** + * @member {string} ThemeUniqueItem.prototype.unique + * @description 单值专题图子项的值,可以为数字、字符串等。 + */ + this.unique = null; + + /** + * @member {boolean} [ThemeUniqueItem.prototype.visible=true] + * @description 单值专题图子项的可见性。 + */ + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeUniqueItem"; + } + + /** + * @function ThemeUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.unique = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + me.visible = null; + } + + /** + * @function ThemeUniqueItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + return obj; + } + + /** + * @function ThemeUniqueItem.fromObj + * @description 从传入对象获取单值专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeUniqueItem} ThemeUniqueItem 对象。 + */ + static fromObj(obj) { + var res = new ThemeUniqueItem(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeOffset.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeOffset + * @deprecatedclass SuperMap.ThemeOffset + * @category iServer Map Theme + * @classdesc 专题图中文本或符号相对于要素内点的偏移量设置类。 + * 通过该类可以设置专题图中标记文本或符号的偏移量以及偏移量是否随地图缩放而改变。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.offsetFixed=false] - 当前专题图是否固定标记文本或符号的偏移量。 + * @param {string} [options.offsetX='0.0'] - 专题图中文本或符号相对于要素内点的水平偏移量。 + * @param {string} [options.offsetY='0.0'] - 专题图中文本或符号相对于要素内点的垂直偏移量。 + * @usage + */ +class ThemeOffset { + + constructor(options) { + /** + * @member {boolean} [ThemeOffset.prototype.offsetFixed=false] + * @description 当前专题图是否固定标记文本或符号的偏移量。所谓固定偏移量,则文本或符号的偏移量不随地图的缩放而变化。 + */ + this.offsetFixed = false; + + /** + * @member {string} [ThemeOffset.prototype.offsetX=0.0] + * @description 专题图中文本或符号相对于要素内点的水平偏移量。偏移量的单位为地图单位。 + * 该偏移量的值为一个常量值或者字段表达式所表示的值,即如果字段表达式为 SmID,其中 SmID = 2,那么水平偏移量为2。 + */ + this.offsetX = "0.0"; + + /** + * @member {string} [ThemeOffset.prototype.offsetY=0.0] + * @description 专题图中文本或符号相对于要素内点的垂直偏移量。偏移量的单位为地图单位。 + * 该偏移量的值为一个常量值或者字段表达式所表示的值,即如果字段表达式为 SmID,其中 SmID = 2,那么垂直偏移量为2。 + */ + this.offsetY = "0.0"; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeOffset"; + } + + /** + * @function ThemeOffset.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.offsetFixed = null; + me.offsetX = null; + me.offsetY = null; + } + + /** + * @function ThemeOffset.fromObj + * @description 从传入对象获取专题图中文本或符号相对于要素内点的偏移量设置类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeOffset} ThemeOffset 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeOffset(); + Util.copy(res, obj); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/LabelMixedTextStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LabelMixedTextStyle + * @deprecatedclass SuperMap.LabelMixedTextStyle + * @category iServer Map Theme + * @classdesc 标签文本复合风格类。 + * 该类主要用于对标签专题图中标签的文本内容进行风格设置。通过该类用户可以使标签的文字显示不同的风格,比如文本 “喜马拉雅山”,通过本类可以将前三个字用红色显示,后两个字用蓝色显示。对同一文本设置不同的风格实质上是对文本的字符进行分段,同一分段内的字符具有相同的显示风格。对字符分段有两种方式,一种是利用分隔符对文本进行分段;另一种是根据分段索引值进行分段:
+ * 1.利用分隔符对文本进行分段: 比如文本 “5&109” 被分隔符 “&” 分为 “5” 和 “109” 两部分, + * 在显示时,“5” 和分隔符 “&” 使用同一个风格,字符串 “109” 使用相同的风格。
+ * 2.利用分段索引值进行分段: 文本中字符的索引值是以0开始的整数,比如文本 “珠穆朗玛峰”, + * 第一个字符(“珠”)的索引值为 0,第二个字符(“穆”)的索引值为 1,以此类推;当设置分段索引值为 1,3,4,9 时, + * 字符分段范围相应的就是 (-∞,1),[1,3),[3,4),[4,9),[9,+∞),可以看出索引号为 0 的字符(即“珠” )在第一个分段内, + * 索引号为 1,2 的字符(即“穆”、“朗”)位于第二个分段内,索引号为 3 的字符(“玛”)在第三个分段内,索引号为 4 的字符(“峰”)在第四个分段内,其余分段中没有字符。 + * @param {Object} options - 可选参数。 + * @param {ServerTextStyle} [options.defaultStyle] - 默认的文本复合风格。 + * @param {string} [options.separator] - 文本的分隔符。 + * @param {boolean} [options.separatorEnabled=false] - 文本的分隔符是否有效。 + * @param {Array.} [options.splitIndexes] - 分段索引值,分段索引值用来对文本中的字符进行分段。 + * @param {Array.} [options.styles] - 文本样式集合。 + * @usage + */ +class LabelMixedTextStyle { + + constructor(options) { + /** + * @member {ServerTextStyle} LabelMixedTextStyle.prototype.defaultStyle + * @description 默认的文本复合风格,即 ServerTextStyle 各字段的默认值。 + */ + this.defaultStyle = null; + + /** + * @member {string} LabelMixedTextStyle.prototype.separator + * @description 文本的分隔符,分隔符的风格与前一个字符的风格一样。文本的分隔符是一个将文本分割开的符号, + * 比如文本 “5_109” 被 “ _ ” 分隔为 “5” 和 “109” 两部分,假设有风格数组:style1、style2。 + * 在显示时,“5” 和分隔符 “ _ ” 使用 Style1 风格渲染,字符串 “109” 使用 Style2 的风格。 + */ + this.separator = null; + + /** + * @member {boolean} [LabelMixedTextStyle.prototype.separatorEnabled=false] + * @description 文本的分隔符是否有效。分隔符有效时利用分隔符对文本进行分段;无效时根据文本中字符的位置进行分段。 + * 分段后,同一分段内的字符具有相同的显示风格。 + */ + this.separatorEnabled = false; + + /** + * @member {Array.} LabelMixedTextStyle.prototype.splitIndexes + * @description 分段索引值,分段索引值用来对文本中的字符进行分段。 + * 文本中字符的索引值是以 0 开始的整数,比如文本“珠穆朗玛峰”,第一个字符(“珠”)的索引值为0,第二个字符(“穆”)的索引值为 1, + * 以此类推;当设置分段索引值数组为 [1,3,4,9] 时,字符分段范围相应的就是 (-∞,1),[1,3),[3,4),[4,9),[9,+∞), + * 可以看出索引号为 0 的字符(即 “珠”)在第一个分段内,索引号为 1,2 的字符(即 “穆”、“朗”)位于第二个分段内, + * 索引号为 3 的字符(“玛”)在第三个分段内,索引号为 4 的字符(“峰”)在第四个分段内,其余分段中没有字符。 + */ + this.splitIndexes = null; + + /** + * @member {Array.} LabelMixedTextStyle.prototype.styles + * @description 文本样式集合。文本样式集合中的样式根据索引与不同分段一一对应, + * 如果有分段没有风格对应则使用 defaultStyle。 + */ + this.styles = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.LabelMixedTextStyle" + } + + /** + * @function LabelMixedTextStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.defaultStyle) { + me.defaultStyle.destroy(); + me.defaultStyle = null; + } + me.separator = null; + me.separatorEnabled = null; + if (me.splitIndexes) { + me.splitIndexes = null; + } + if (me.styles) { + for (var i = 0, styles = me.styles, len = styles.length; i < len; i++) { + styles[i].destroy(); + } + me.styles = null; + } + } + + /** + * @function LabelMixedTextStyle.fromObj + * @description 从传入对象获取标签文本复合风格类。 + * @param {Object} obj - 传入对象。 + * @returns {LabelMixedTextStyle} 返回新的 LabelMixedTextStyle 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new LabelMixedTextStyle(); + var stys = obj.styles; + Util.copy(res, obj); + res.defaultStyle = new ServerTextStyle(obj.defaultStyle); + if (stys) { + res.styles = []; + for (var i = 0, len = stys.length; i < len; i++) { + res.styles.push(new ServerTextStyle(stys[i])); + } + } + return res; + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelText.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeLabelText + * @deprecatedclass SuperMap.ThemeLabelText + * @category iServer Map Theme + * @classdesc 标签中文本风格类。 + * 通过该类可以设置标签中的文本字体大小和显示风格。 + * @param {Object} options - 参数。 + * @param {number} [options.maxTextHeight=0] - 标签中文本的最大高度。 + * @param {number} [options.maxTextWidth=0] - 标签中文本的最大宽度。 + * @param {number} [options.minTextHeight=0] - 标签中文本的最小高度。 + * @param {number} [options.minTextWidth=0] - 标签中文本的最小宽度。 + * @param {ServerTextStyle} [options.uniformStyle] - 统一文本风格。 + * @param {LabelMixedTextStyle} [options.uniformMixedStyle] - 标签专题图统一的文本复合风格。 + * @usage + */ +class ThemeLabelText { + + constructor(options) { + /** + * @member {number} [ThemeLabelText.prototype.maxTextHeight=0] + * @description 标签中文本的最大高度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当放大后的文本高度超过最大高度之后就不再放大。高度单位为毫米。 + */ + this.maxTextHeight = 0; + + /** + * @member {number} [ThemeLabelText.prototype.maxTextWidth=0] + * @description 标签中文本的最大宽度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当放大后的文本宽度超过最大高度之后就不再放大。宽度单位为毫米。 + */ + this.maxTextWidth = 0; + + /** + * @member {number} [ThemeLabelText.prototype.minTextHeight=0] + * @description 标签中文本的最小高度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当缩小后的文本高度小于最小高度之后就不再缩小。高度单位为毫米。 + */ + this.minTextHeight = 0; + + /** + * @member {number} [ThemeLabelText.prototype.minTextWidth=0] + * @description 标签中文本的最小宽度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当缩小后的文本宽度小于最小宽度之后就不再缩小。宽度单位为毫米。 + */ + this.minTextWidth = 0; + + /** + * @member {ServerTextStyle} [ThemeLabelText.prototype.uniformStyle] + * @description 统一文本风格。当标签专题图子项的个数大于等于1时, + * uniformStyle 不起作用,各标签的风格使用子项中设置的风格。各种风格的优先级从高到低为:uniformMixedStyle(标签文本的复合风格), + * ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + this.uniformStyle = new ServerTextStyle(); + + /** + *@member {LabelMixedTextStyle} [ThemeLabelText.prototype.uniformMixedStyle] + *@description 标签专题图统一的文本复合风格。通过该类可以使同一个标 + * 签中的文字使用多种风格显示。各种风格的优先级从高到低为:uniformMixedStyle(标签文本的复合风格), + * ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + this.uniformMixedStyle = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeLabelText"; + } + + /** + * @function ThemeLabelText.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.maxTextHeight = null; + me.maxTextWidth = null; + me.minTextHeight = null; + me.minTextWidth = null; + if (me.uniformStyle) { + me.uniformStyle.destroy(); + me.uniformStyle = null; + } + if (me.uniformMixedStyle) { + me.uniformMixedStyle.destroy(); + me.uniformMixedStyle = null; + } + } + + /** + * @function ThemeLabelText.fromObj + * @description 从传入对象获取标签中文本风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelText} ThemeLabelText 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeLabelText(); + Util.copy(res, obj); + res.uniformStyle = ServerTextStyle.fromObj(obj.uniformStyle); + res.uniformMixedStyle = LabelMixedTextStyle.fromObj(obj.uniformMixedStyle); + return res; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelAlongLine.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeLabelAlongLine + * @deprecatedclass SuperMap.ThemeLabelAlongLine + * @category iServer Map Theme + * @classdesc 标签沿线标注样式类。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.isAlongLine=true] - 是否沿线显示文本。 + * @param {AlongLineDirection} [options.alongLineDirection=AlongLineDirection.LB_TO_RT] - 标签沿线标注方向。 + * @param {boolean} [options.angleFixed=false] - 当沿线显示文本时,是否将文本角度固定。 + * @param {boolean} [options.repeatedLabelAvoided=false] - 沿线循环标注时是否避免标签重复标注。 + * @param {boolean} [options.repeatIntervalFixed=false] - 循环标注间隔是否固定。 + * @param {number} [options.labelRepeatInterval=0] - 沿线且循环标注时循环标注的间隔。 + * @usage + */ +class ThemeLabelAlongLine { + + + constructor(options) { + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.isAlongLine=true] + * @description 是否沿线显示文本。true 表示沿线显示文本,false 表示正常显示文本。 + */ + this.isAlongLine = true; + + /** + * @member {AlongLineDirection} [ThemeLabelAlongLine.prototype.alongLineDirection=AlongLineDirection.LB_TO_RT] + * @description 标签沿线标注方向。 + */ + this.alongLineDirection = AlongLineDirection.LB_TO_RT; + + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.angleFixed=false] + * @description 当沿线显示文本时,是否将文本角度固定。true 表示按固定文本角度显示文本,false 表示按照沿线角度显示文本。 + * 如果固定角度,则所有标签均按所设置的文本风格中字体的旋转角度来显示,不考虑沿线标注的方向; + * 如果不固定角度,在显示标签时会同时考虑字体的旋转角度和沿线标注的方向。 + */ + this.angleFixed = false; + + /** + * @member {boolean} ThemeLabelAlongLine.prototype.repeatedLabelAvoided + * @description 沿线循环标注时是否避免标签重复标注。 + */ + this.repeatedLabelAvoided = false; + + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.repeatIntervalFixed=false] + * @description 循环标注间隔是否固定。true 表示使用固定循环标注间隔,即使用逻辑坐标来显示循环标注间隔; + * false 表示循环标注间隔随地图的缩放而变化,即使用地理坐标来显示循环标注间隔。 + */ + this.repeatIntervalFixed = false; + + /** + * @member {number} [ThemeLabelAlongLine.prototype.labelRepeatInterval=0] + * @description 沿线且循环标注时循环标注的间隔。长度的单位与地图的地理单位一致。只有设定 RepeatedLabelAvoided 为 true + * 的时候,labelRepeatInterval 属性才有效。 + */ + this.labelRepeatInterval = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelAlongLine"; + } + + + /** + * @function ThemeLabelAlongLine.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isAlongLine = null; + me.alongLineDirection = null; + me.angleFixed = null; + me.repeatedLabelAvoided = null; + me.repeatIntervalFixed = null; + me.labelRepeatInterval = null; + } + + /** + * @function ThemeLabelAlongLine.fromObj + * @description 从传入对象获取标签沿线标注样式类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelAlongLine} ThemeLabelAlongLine 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var t = new ThemeLabelAlongLine(); + Util.copy(t, obj); + return t; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelBackground.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeLabelBackground + * @deprecatedclass SuperMap.ThemeLabelBackground + * @category iServer Map Theme + * @classdesc 标签背景风格类。通过该类可以设置标签的背景形状和风格。 + * @param {Object} options - 可选参数。 + * @param {LabelBackShape} [options.labelBackShape=LabelBackShape.NONE] - 标签专题图中标签背景的形状枚举类。 + * @param {ServerStyle} [options.backStyle] - 标签专题图中标签背景风格。 + * @usage + */ +class ThemeLabelBackground { + + constructor(options) { + /** + * @member {LabelBackShape} [ThemeLabelBackground.prototype.labelBackShape=LabelBackShape.NONE] + * @description 标签专题图中标签背景风格。当背景形状 + * labelBackShape 属性设为 NONE(即无背景形状) 时,backStyle 属性无效。 + */ + this.labelBackShape = LabelBackShape.NONE; + + /** + * @member {ServerStyle} [ThemeLabelBackground.prototype.backStyle] + * @description 标签专题图中标签背景的形状枚举类。背景类型可 + * 以是矩形、圆角矩形、菱形、椭圆形、三角形和符号等,即不使用任何的形状作为标签的背景。 + */ + this.backStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelBackground"; + } + + /** + * @function ThemeLabelBackground.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.labelBackShape = null; + if (me.backStyle) { + me.backStyle.destroy(); + me.backStyle = null; + } + } + + /** + * @function ThemeLabelBackground.fromObj + * @description 从传入对象获取标签背景风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelBackground} ThemeLabelBackground 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var t = new ThemeLabelBackground(); + t.labelBackShape = obj.labelBackShape; + t.backStyle = ServerStyle.fromJson(obj.backStyle); + + return t; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class ThemeLabel + * @deprecatedclass SuperMap.ThemeLabel + * @category iServer Map Theme + * @classdesc 标签专题图类。 + * @extends CommonTheme + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项数组。 + * @param {string} options.labelExpression - 标注字段表达式。 + * @param {Array.} options.matrixCells - 矩阵标签元素数组。 + * @param {ThemeLabelAlongLine} [options.alongLine] - 标签沿线标注方向样式类。 + * @param {ThemeLabelBackground} [options.background] - 标签的背景风格类。 + * @param {LabelOverLengthMode} [options.labelOverLengthMode=LabelOverLengthMode.NONE] - 超长标签的处理模式枚举类。 + * @param {number} [options.maxLabelLength=256] - 标签在每一行显示的最大长度。 + * @param {number} [options.numericPrecision=0] - 通过该字段设置其显示的精度。 + * @param {ThemeOffset} [options.offset] - 指定标签专题图中标记文本相对于要素内点的偏移量对象。 + * @param {boolean} [options.overlapAvoided=true] - 是否允许以文本避让方式显示文本。 + * @param {string} [options.rangeExpression] - 制作分段标签专题的分段字段或字段表达式。 + * @param {boolean} [options.smallGeometryLabeled=false] - 是否显示长度大于被标注对象本身长度的标签。 + * @param {ThemeLabelText} options.text - 标签中文本风格。 + * @param {number} [options.textSpace=0] - 沿线标注,相邻两个文字之间的间距,单位当前设置的字高。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class ThemeLabel extends Theme { + + + constructor(options) { + super("LABEL", options); + /** + * @member {ThemeLabelAlongLine} [ThemeLabel.prototype.alongLine] + * @description 标签沿线标注方向样式类。 + * 在该类中可以设置标签是否沿线标注以及沿线标注的多种方式。沿线标注属性只适用于线数据集专题图。 + */ + this.alongLine = new ThemeLabelAlongLine(); + + /** + * @member {ThemeLabelBackground} [ThemeLabel.prototype.background] + * @description 标签专题图中标签的背景风格类。通过该字段可以设置标签的背景形状和风格。 + */ + this.background = new ThemeLabelBackground(); + + /** + * @member {Array.} [ThemeLabel.prototype.items] + * @description 分段标签专题图的子项数组。分段标签专题图使用 rangeExpression + * 指定数字型的字段作为分段数据,items 中的每个子对象的 [start,end) 分段值必须来源于属性 rangeExpression 的字段值。每个子项拥有自己的风格。 + */ + this.items = null; + + /** + * @member {Array.} ThemeLabel.prototype.uniqueItems + * @description 单值标签专题图子项数组。单值标签专题图使用 uniqueExpression单值标签专题图子项集合。 + */ + this.uniqueItems = null; + + /** + * @member {string} ThemeLabel.prototype.labelExpression + * @description 标注字段表达式。系统将 labelExpression 对应的字段或字段表达式的值以标签的形式显示在图层中。 + */ + this.labelExpression = null; + + /** + * @member {LabelOverLengthMode} [ThemeLabel.prototype.labelOverLengthMode=LabelOverLengthMode.NONE] - 标签专题图中超长标签的处理模式枚举类。 + * @description 对于标签的长度超过设置的标签最大长度 maxLabelLength 时称为超长标签。 + */ + this.labelOverLengthMode = LabelOverLengthMode.NONE; + + /** + * @member {Array.} ThemeLabel.prototype.matrixCells + * @description 矩阵标签元素数组,用于制作矩阵标签专题图。 + * 数组中可以放置符号类型的矩阵标签元素和图片类型的矩阵标签元素。 + */ + this.matrixCells = null; + + /** + * @member {number} [ThemeLabel.prototype.maxLabelLength=256] + * @description 标签在每一行显示的最大长度,一个中文为两个字符。 + * 如果超过最大长度,可以采用两种方式来处理,一种是换行的模式进行显示,另一种是以省略号方式显示。单位为字符。 + */ + this.maxLabelLength = 256; + + /** + * @member {number} [ThemeLabel.prototype.numericPrecision=0] + * @description 如果显示的标签内容为数字,通过该字段设置其显示的精度。例如标签对应的数字是8071.64529347, + * 如果该属性为0时,显示8071;为1时,显示8071.6;为3时,则是8071.645。 + */ + this.numericPrecision = 0; + + /** + * @member {ThemeOffset} [ThemeLabel.prototype.offset] + * @description 用于设置标签专题图中标记文本相对于要素内点的偏移量对象。 + */ + this.offset = new ThemeOffset(); + + /** + * @member {boolean} [ThemeLabel.prototype.overlapAvoided=true] + * @description 是否允许以文本避让方式显示文本。true 表示自动避免文本叠盖。只针对该标签专题图层中的文本数据。 + * 在标签重叠度很大的情况下,即使使用自动避让功能,可能也无法完全避免标签重叠现象。 + */ + this.overlapAvoided = true; + + /** + * @member {string} ThemeLabel.prototype.rangeExpression + * @description 制作分段标签专题的分段字段或字段表达式。该表达式对应的字段(或者字段表达式)的值应该为数值型。 + * 该字段与 items 分段子项联合使用,每个子项的起始值 [start,end)来源于 rangeExpression 字段值。 + * 最后 labelExpression 指定的标签字段(标签专题图要显示的具体内容)会根据分段子项的风格进行分段显示。 + */ + this.rangeExpression = null; + + /** + * @member {string} ThemeLabel.prototype.uniqueExpression + * @description 用于制作单值专题图的字段或字段表达式。 + * 该字段值的数据类型可以为数值型或字符型。如果设置字段表达式,只能是相同数据类型字段间的运算。必须与labelExpression一起使用。 + */ + this.uniqueExpression = null; + + /** + * @member {boolean} [ThemeLabel.prototype.smallGeometryLabeled=false] + * @description 是否显示长度大于被标注对象本身长度的标签。在标签的长度大于线或者面对象本身的长度时, + * 如果该值为 true,则标签文字会叠加在一起显示,为了清楚完整的显示该标签, + * 可以采用换行模式来显示标签,但必须保证每行的长度小于对象本身的长度。 + */ + this.smallGeometryLabeled = false; + + /** + * @member {ThemeLabelText} ThemeLabel.prototype.text + * @description 标签中文本风格。 + */ + this.text = new ThemeLabelText(); + + /** + * @member {number} [ThemeLabel.prototype.textSpace=0] + * @description 沿线标注,相邻两个文字之间的间距,单位当前设置的字高。 + */ + this.textSpace = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabel"; + } + + + /** + * @function ThemeLabel.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.alongLine = null; + if (me.background) { + me.background.destroy(); + me.background = null; + } + if (me.items) { + for (var i = 0, items = me.items, len = items.length; i < len; i++) { + items[i].destroy(); + } + me.items = null; + } + if (me.uniqueItems) { + for (var j = 0, uniqueItems = me.uniqueItems, uniqueLen = uniqueItems.length; j < uniqueLen; j++) { + uniqueItems[j].destory(); + } + me.uniqueItems = null; + } + me.labelExpression = null; + me.labelOverLengthMode = null; + me.matrixCells = null; + me.maxLabelLength = null; + me.numericPrecision = null; + me.overlapAvoided = null; + me.rangeExpression = null; + me.uniqueExpression = null; + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + me.overlapAvoided = null; + me.smallGeometryLabeled = null; + if (me.text) { + me.text.destroy(); + me.text = null; + } + me.textSpace = null; + } + + /** + * @function ThemeLabel.prototype.toJSON + * @description 将themeLabel对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + + /** + * @function ThemeLabel.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj.type = this.type; + obj.memoryData = this.memoryData; + if (this.alongLine) { + obj.alongLine = this.alongLine.isAlongLine; + obj.alongLineDirection = this.alongLine.alongLineDirection; + obj.angleFixed = this.alongLine.angleFixed; + obj.isLabelRepeated = this.alongLine.isLabelRepeated; + obj.labelRepeatInterval = this.alongLine.labelRepeatInterval; + obj.repeatedLabelAvoided = this.alongLine.repeatedLabelAvoided; + obj.repeatIntervalFixed = this.alongLine.repeatIntervalFixed; + } + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + if (this.text) { + obj.maxTextHeight = this.text.maxTextHeight; + obj.maxTextWidth = this.text.maxTextWidth; + obj.minTextHeight = this.text.minTextHeight; + obj.minTextWidth = this.text.minTextWidth; + obj.uniformStyle = this.text.uniformStyle; + obj.uniformMixedStyle = this.text.uniformMixedStyle; + } + if (this.background) { + obj.labelBackShape = this.background.labelBackShape; + obj.backStyle = this.background.backStyle; + } + obj.labelOverLengthMode = this.labelOverLengthMode; + obj.maxLabelLength = this.maxLabelLength; + obj.smallGeometryLabeled = this.smallGeometryLabeled; + obj.rangeExpression = this.rangeExpression; + obj.uniqueExpression = this.uniqueExpression; + obj.numericPrecision = this.numericPrecision; + obj.items = this.items; + obj.uniqueItems = this.uniqueItems; + obj.labelExpression = this.labelExpression; + obj.overlapAvoided = this.overlapAvoided; + obj.matrixCells = this.matrixCells; + obj.textSpace = this.textSpace; + return obj; + } + + /** + * @function ThemeLabel.fromObj + * @description 从传入对象获取标签专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabel} ThemeLabel 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var lab = new ThemeLabel(); + var itemsL = obj.items, itemsU = obj.uniqueItems, cells = obj.matrixCells; + obj.matrixCells = null; + Util.copy(lab, obj); + lab.alongLine = ThemeLabelAlongLine.fromObj(obj); + lab.background = ThemeLabelBackground.fromObj(obj); + if (itemsL) { + lab.items = []; + for (var i = 0, len = itemsL.length; i < len; i++) { + lab.items.push(ThemeLabelItem.fromObj(itemsL[i])); + } + } + if (itemsU) { + lab.uniqueItems = []; + for (let j = 0, uniqueLen = itemsU.length; j < uniqueLen; j++) { + lab.uniqueItems.push(ThemeUniqueItem.fromObj(itemsU[j])); + } + } + if (cells) { + lab.matrixCells = []; + for (let i = 0, len = cells.length; i < len; i++) { + //TODO + //lab.matrixCells.push(LabelMatrixCell.fromObj(cells[i])); + } + } + lab.offset = ThemeOffset.fromObj(obj); + lab.text = ThemeLabelText.fromObj(obj); + return lab; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeUnique.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class ThemeUnique + * @deprecatedclass SuperMap.ThemeUnique + * @category iServer Map Theme + * @classdesc 单值专题图。单值专题图是利用不同的颜色或符号(线型、填充)表示图层中某一属性信息的不同属性值,属性值相同的要素具有相同的渲染风格。单值专题图多用于具有分类属性的地图上, + * 比如土壤类型分布图、土地利用图、行政区划图等。单值专题图着重表示现象质的差别,一般不表示数量的特征。尤其是有交叉或重叠现象时,此类不推荐使用,例如:民族分布区等。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项类数组。 + * @param {string} options.uniqueExpression - 指定单值专题图的字段或字段表达式。 + * @param {ServerStyle} [options.defaultStyle] - 未参与单值专题图制作的对象的显示风格。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class ThemeUnique extends Theme { + + constructor(options) { + super("UNIQUE", options); + /** + * @member {ServerStyle} ThemeUnique.prototype.defaultStyle + * @description 未参与单值专题图制作的对象的显示风格。 + * 通过单值专题图子项数组 (items)可以指定某些要素参与单值专题图制作,对于那些没有被包含的要素,即不参加单值专题表达的要素,使用该风格显示。 + */ + this.defaultStyle = new ServerStyle(); + + /** + * @member {Array.} ThemeUnique.prototype.items + * @description 单值专题图子项类数组。 + * 单值专题图是将专题值相同的要素归为一类,为每一类设定一种渲染风格,其中每一类就是一个专题图子项。比如,利用单值专题图制作行政区划图, + * Name 字段代表省/直辖市名,该字段用来做专题变量,如果该字段的字段值总共有5种不同值,则该行政区划图有 5 个专题图子项。 + */ + this.items = null; + + /** + * @member {string} ThemeUnique.prototype.uniqueExpression + * @description 用于制作单值专题图的字段或字段表达式。 + * 该字段值的数据类型可以为数值型或字符型。如果设置字段表达式,只能是相同数据类型字段间的运算。 + */ + this.uniqueExpression = null; + + /** + * @member {ColorGradientType} [ThemeUnique.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。 + * 渐变色是由起始色根据一定算法逐渐过渡到终止色的一种混合型颜色。 + * 该类作为单值专题图参数类、分段专题图参数类的属性,负责设置单值专题图、分段专题图的配色方案,在默认情况下专题图所有子项会根据这个配色方案完成填充。 + * 但如果为某几个子项的风格进行单独设置后(设置了 ThemeUniqueItem 或 ThemeRangeItem 类中Style属性), + * 该配色方案对于这几个子项将不起作用。 + */ + this.colorGradientType = ColorGradientType.YELLOW_RED; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeUnique"; + } + + /** + * @function ThemeUnique.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.uniqueExpression = null; + me.colorGradientType = null; + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + me.items = null; + } + + if (me.defaultStyle) { + me.defaultStyle.destroy(); + me.defaultStyle = null; + } + } + + + /** + * @function ThemeUnique.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.defaultStyle) { + if (obj.defaultStyle.toServerJSONObject) { + obj.defaultStyle = obj.defaultStyle.toServerJSONObject(); + } + } + if (obj.items) { + var items = [], + len = obj.items.length; + for (var i = 0; i < len; i++) { + items.push(obj.items[i].toServerJSONObject()); + } + obj.items = items; + } + return obj; + } + + /** + * @function ThemeUnique.fromObj + * @description 从传入对象获取单值专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeUnique} ThemeUnique 对象。 + */ + static fromObj(obj) { + var res = new ThemeUnique(); + var uItems = obj.items; + var len = uItems ? uItems.length : 0; + Util.extend(res, obj); + res.items = []; + res.defaultStyle = ServerStyle.fromJson(obj.defaultStyle); + for (var i = 0; i < len; i++) { + res.items.push(ThemeUniqueItem.fromObj(uItems[i])); + } + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphAxes.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeGraphAxes + * @deprecatedclass SuperMap.ThemeGraphAxes + * @category iServer Map Theme + * @classdesc 统计专题图坐标轴样式类。 + * @param {Object} options - 参数。 + * @param {ServerColor} [options.axesColor=(0, 0, 0)] - 坐标轴颜色。 + * @param {boolean} [options.axesDisplayed=false] - 是否显示坐标轴。 + * @param {boolean} [options.axesGridDisplayed=false] - 是否在统计图坐标轴上显示网格。 + * @param {boolean} [options.axesTextDisplayed=false] - 是否显示坐标轴的文本标注。 + * @param {ServerTextStyle} [options.axesTextStyle] - 统计符号的最大最小尺寸。 + * @usage + */ +class ThemeGraphAxes { + + constructor(options) { + + /** + * @member {ServerColor} [ThemeGraphAxes.prototype.axesColor=(0, 0, 0)] + * @description 坐标轴颜色。当 axesDisplayed = true 时有效。 + */ + this.axesColor = new ServerColor(0, 0, 0); + + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesDisplayed=false] + * @description 是否显示坐标轴。
+ * 由于饼状图和环状图无坐标轴,故该属性以及所有与坐标轴设置相关的属性都不适用于它们。并且只有当该值为 true 时,其它设置坐标轴的属性才起作用。 + */ + this.axesDisplayed = false; + + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesGridDisplayed=false] + * @description 是否在统计图坐标轴上显示网格。 + */ + this.axesGridDisplayed = false; + + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesTextDisplayed=false] + * @description 是否显示坐标轴的文本标注。 + */ + this.axesTextDisplayed = false; + + /** + * @member {ServerTextStyle} ThemeGraphAxes.prototype.axesTextStyle + * @description 坐标轴文本风格。当 axesTextDisplayed = true 时有效。 + */ + this.axesTextStyle = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphAxes"; + } + + /** + * @function ThemeGraphAxes.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.axesColor) { + me.axesColor.destroy(); + me.axesColor = null; + } + me.axesDisplayed = null; + me.axesGridDisplayed = null; + me.axesTextDisplayed = null; + if (me.axesTextStyle) { + me.axesTextStyle.destroy(); + me.axesTextStyle = null; + } + } + + /** + * @function ThemeGraphAxes.fromObj + * @description 从传入对象获取统计专题图坐标轴样式类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphAxes} ThemeGraphAxes 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGraphAxes(); + Util.copy(res, obj); + res.axesColor = ServerColor.fromJson(obj.axesColor); + res.axesTextStyle = ServerTextStyle.fromObj(obj.axesTextStyle); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphSize.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeGraphSize + * @deprecatedclass SuperMap.ThemeGraphSize + * @category iServer Map Theme + * @classdesc 统计专题图符号尺寸类。 + * @param {Object} options - 参数。 + * @param {number} [options.maxGraphSize=0] - 统计图中显示的最大图表尺寸基准值。 + * @param {number} [options.minGraphSize=0] - 统计图中显示的最小图表尺寸基准值。 + * @usage + */ +class ThemeGraphSize { + + constructor(options) { + /** + * @member {number} [ThemeGraphSize.prototype.maxGraphSize=0] + * @description 获取或设置统计图中显示的最大图表尺寸基准值,单位为像素。 + */ + this.maxGraphSize = 0; + + /** + * @member {number} [ThemeGraphSize.prototype.minGraphSize=0] + * @description 获取或设置统计图中显示的最小图表尺寸基准值,单位为像素。 + */ + this.minGraphSize = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphSize"; + } + + /** + * @function ThemeGraphSize.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.maxGraphSize = null; + me.minGraphSize = null; + } + + /** + * @function ThemeGraphSize.fromObj + * @description 从传入对象获统计专题图符号尺寸类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphSize} ThemeGraphSize 对象。 + */ + static fromObj(obj) { + var res = new ThemeGraphSize(); + Util.copy(res, obj); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphText.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeGraphText + * @deprecatedclass SuperMap.ThemeGraphText + * @category iServer Map Theme + * @classdesc 统计图文字标注风格类。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.graphTextDisplayed=false] - 是否显示统计图上的文字标注。 + * @param {ThemeGraphTextFormat} [options.graphTextFormat=ThemeGraphTextFormat.CAPTION] - 统计专题图文本显示格式。 + * @param {ServerTextStyle} [options.graphTextStyle] - 统计图上的文字标注风格。 + * @usage + */ +class ThemeGraphText { + + constructor(options) { + + /** + * @member {boolean} [ThemeGraphText.prototype.graphTextDisplayed=false] + * @description 是否显示统计图上的文字标注。 + */ + this.graphTextDisplayed = false; + + /** + * @member {ThemeGraphTextFormat} [ThemeGraphText.prototype.graphTextFormat=ThemeGraphTextFormat.CAPTION] + * @description 统计专题图文本显示格式。 + * 文本显示格式包括百分数、真实数值、标题、标题+百分数、标题+真实数值。 + */ + this.graphTextFormat = ThemeGraphTextFormat.CAPTION; + + /** + * @member {ServerTextStyle} ThemeGraphText.prototype.graphTextStyle + * @description 统计图上的文字标注风格。 + */ + this.graphTextStyle = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphText"; + } + + /** + * @function ThemeGraphText.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.graphTextDisplayed = null; + me.graphTextFormat = null; + if (me.graphTextStyle) { + me.graphTextStyle.destroy(); + me.graphTextStyle = null; + } + } + + /** + * @function ThemeGraphText.fromObj + * @description 从传入对象获取统计图文字标注风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphText} ThemeGraphText 对象。 + */ + static fromObj(obj) { + var res = new ThemeGraphText(); + Util.copy(res, obj); + res.graphTextStyle = ServerTextStyle.fromObj(obj.graphTextStyle); + return res; + + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGraphItem + * @deprecatedclass SuperMap.ThemeGraphItem + * @category iServer Map Theme + * @classdesc 统计专题图子项类。 + * @param {Object} options - 参数。 + * @param {string} [options.caption] - 专题图子项的名称。 + * @param {string} options.graphExpression - 统计专题图的专题变量。 + * @param {Array.} [options.memoryDoubleValues] - 内存数组方式制作专题图时的值数组。 + * @param {ServerStyle} [options.uniformStyle] - 统计专题图子项的显示风格 + * @usage + */ +class ThemeGraphItem { + + constructor(options) { + + /** + * @member {string} [ThemeGraphItem.prototype.caption] + * @description 专题图子项的名称。 + */ + this.caption = null; + + /** + * @member {string} ThemeGraphItem.prototype.graphExpression + * @description 统计专题图的专题变量。专题变量可以是一个字段或字段表达式。字段必须为数值型;表达式只能为数值型的字段间的运算。 + */ + this.graphExpression = null; + + /** + * @member {Array.} [ThemeGraphItem.prototype.memoryDoubleValues] + * @description 内存数组方式制作专题图时的值数组。
+ * 内存数组方式制作专题图时,只对 SmID 值在键数组({@link ThemeGraph#memoryKeys})中的记录制作专题图。 + * 值数组的数值个数必须与键数组中数值的个数一致。 值数组中的值将代替原来的专题值来制作统计专题图。 + * 比如:利用面积字段和周长字段(即有两个统计专题图子项 )作为专题变量制作统计专题图。 + */ + this.memoryDoubleValues = null; + + /** + * @member {ServerStyle} [ThemeGraphItem.prototype.uniformStyle] + * @description 统计专题图子项的显示风格。 + * 每一个统计专题图子项都对应一种显示风格。 + */ + this.uniformStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphItem"; + } + + /** + * @function ThemeGraphItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.graphExpression = null; + me.memoryDoubleValues = null; + me.uniformStyle = null; + } + + /** + * @function ThemeGraphItem.fromObj + * @description 从传入对象获取统计专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphItem} ThemeGraphItem 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGraphItem(); + Util.copy(res, obj); + res.uniformStyle = ServerStyle.fromJson(obj.uniformStyle); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraph.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class ThemeGraph + * @deprecatedclass SuperMap.ThemeGraph + * @category iServer Map Theme + * @classdesc 统计专题图类。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 统计专题图子项集合。 + * @param {number} [options.barWidth=0] - 柱状专题图中每一个柱的宽度。 + * @param {GraduatedMode} [options.graduatedMode=GraduatedMode.CONSTANT] - 统计图中地理要素的值与图表尺寸间的映射关系。 + * @param {ThemeGraphAxes} [options.graphAxes] - 统计图中坐标轴样式相关信息。 + * @param {ThemeGraphSize} [options.graphSize=0] - 统计符号的最大最小尺寸。 + * @param {boolean} [options.graphSizeFixed=false] - 缩放地图时统计图符号是否固定大小。 + * @param {ThemeGraphText} [options.graphText] - 统计图上的文字是否可以见以及文字标注风格。 + * @param {GraphAxesTextDisplayMode} [options.graphAxesTextDisplayMode=GraphAxesTextDisplayMode.NONE] - 统计专题图坐标轴文本显示模式。 + * @param {ThemeGraphType} [options.graphType=ThemeGraphType.AREA] - 统计专题图类型。 + * @param {Array.} [options.memoryKeys] - 以内存数组方式制作专题图时的键数组。 + * @param {boolean} [options.negativeDisplayed=false] - 专题图中是否显示属性为负值的数据。 + * @param {ThemeOffset} [options.offset] - 统计图相对于要素内点的偏移量。 + * @param {boolean} [options.overlapAvoided=true] - 统计图是否采用避让方式显示。 + * @param {number} [options.roseAngle=0] - 统计图中玫瑰图或三维玫瑰图用于等分的角度。 + * @param {number} [options.startAngle=0] - 饼状统计图扇形的起始角度。 + * @usage + */ +class ThemeGraph extends Theme { + + constructor(options) { + super("GRAPH", options); + /** + * @member {number} [ThemeGraph.prototype.barWidth=0] + * @description 柱状专题图中每一个柱的宽度。使用地图坐标单位。 + * 只有选择的统计图类型为柱状图(柱状图、三维柱状图、堆叠柱状图、三维堆叠柱状图)时,此项才可设置。 + */ + this.barWidth = 0; + + /** + * @member {GraduatedMode} [ThemeGraph.prototype.graduatedMode=GraduatedMode.CONSTANT] + * @description 统计图中地理要素的值与图表尺寸间的映射关系(常数、对数、平方根),即分级方式。 + * 分级主要是为了减少制作统计专题图中数据大小之间的差异,使得统计图的视觉效果比较好,同时不同类别之间的比较也还是有意义的。 + * 提供三种分级模式:常数、对数和平方根,对于有值为负数的字段,不可以采用对数和平方根的分级方式。不同的等级方式用于确定符号大小的数值是不相同的。 + */ + this.graduatedMode = GraduatedMode.CONSTANT; + + /** + * @member {ThemeGraphAxes} ThemeGraph.prototype.graphAxes + * @description 用于设置统计图中坐标轴样式相关信息,如坐标轴颜色、是否显示、坐标文本样式等。 + */ + this.graphAxes = new ThemeGraphAxes(); + + /** + * @member {ThemeGraphSize} [ThemeGraph.prototype.graphSize=0] + * @description 用于设置统计符号的最大最小尺寸。 + */ + this.graphSize = new ThemeGraphSize(); + + /** + * @member {boolean} [ThemeGraph.prototype.graphSizeFixed=false] + * @description 缩放地图时统计图符号是否固定大小。即统计图符号将随地图缩放。 + */ + this.graphSizeFixed = false; + + /** + * @member {ThemeGraphText} ThemeGraph.prototype.graphText + * @description 统计图上的文字是否可以见以及文字标注风格。 + */ + this.graphText = new ThemeGraphText(); + + /** + * @member {ThemeGraphType} [ThemeGraph.prototype.graphType=ThemeGraphType.AREA] + * @description 统计专题图类型。SuperMap 提供了多种类型的统计图, + * 分别为面积图、阶梯图、折线图、点状图、柱状图、三维柱状图、饼图、三维饼图、玫瑰图、三维玫瑰图、堆叠柱状图、三维堆叠柱状图、环状图。默认为面积图。 + */ + this.graphType = ThemeGraphType.AREA; + + /** + * @member {GraphAxesTextDisplayMode} [ThemeGraph.prototype.graphAxesTextDisplayMode=GraphAxesTextDisplayMode.NONE] + * @description 统计专题图坐标轴文本显示模式。 + */ + this.graphAxesTextDisplayMode = GraphAxesTextDisplayMode.NONE; + + /** + * @member {Array.} ThemeGraph.prototype.items + * @description 统计专题图子项集合。 + * 统计专题图可以基于多个变量,反映多种属性,即可以将多个专题变量的值绘制在一个统计图上。每一个专题变量对应的统计图即为一个专题图子项。 + * 对于每个专题图子项可以为其设置标题、风格,甚至可以将该子项再制作成范围分段专题图。 + */ + this.items = null; + + /** + * @member {Array.} ThemeGraph.prototype.memoryKeys + * @description 以内存数组方式制作专题图时的键数组。 + * 键数组内的数值代表 SmID 值,它与 {@link ThemeGraphItem} 类中的值数组({@link ThemeGraphItem#memoryDoubleValues})要关联起来应用。 + * 键数组中数值的个数必须要与值数组的数值个数一致。值数组中的值将代替原来的专题值来制作统计专题图。 + * 目前所有的专题图都支持以内存数组的方式制作专题图,但统计专题图与其他专题图指定内存数组的方式不同, + * 统计专题图使用 memoryKeys 指定内存数组,而其他专题图则使用 memoryData 来指定内存数组。 + * @example + * memoryKeys 的使用方法如下: + * function addThemeGraph() { + * removeTheme(); + * //创建统计专题图对象,ThemeGraph 必设 items。 + * //专题图参数 ThemeParameters 必设 theme(即以设置好的分段专题图对象)、dataSourceName 和 datasetName + * var style1 = new ServerStyle({ + * fillForeColor: new ServerColor(92,73,234), + * lineWidth: 0.1 + * }), + * style2 = new ServerStyle({ + * fillForeColor: new ServerColor(211,111,240), + * lineWidth: 0.1 + * }), + * item1 = new ThemeGraphItem({ + * memoryDoubleValues:[1.18,0.95,0.37,1.31,0.8,1.5], + * caption: "1992-1995人口增长率", + * graphExpression: "Pop_Rate95", + * uniformStyle: style1 + * }), + * item2 = new ThemeGraphItem({ + * //以内存数组方式制作专题图时的值数组 + * memoryDoubleValues:[2.71,0,0.74,3.1,2.2,3.5], + * caption: "1995-1999人口增长率", //专题图子项的名称 + * graphExpression: "Pop_Rate99", //统计专题图的专题变量 + * uniformStyle: style2 //统计专题图子项的显示风格 + * }), + * themeGraph = new ThemeGraph({ + * //以内存数组方式制作专题图时的键数组,键数组内的数值代表 SmID 值 + * memoryKeys:[1,2,4,8,10,12], + * items: new Array(item1,item2), + * barWidth: 0.03, + * //统计图中地理要素的值与图表尺寸间的映射关系为平方根 + * graduatedMode: GraduatedMode.SQUAREROOT, + * //graphAxes用于设置统计图中坐标轴样式相关信息 + * graphAxes: new ThemeGraphAxes({ + * axesDisplayed: true + * }), + * graphSize: new ThemeGraphSize({ + * maxGraphSize: 1, + * minGraphSize: 0.35 + * }), + * //统计图上的文字是否可以见以及文字标注风格 + * graphText: new ThemeGraphText({ + * graphTextDisplayed: true, + * graphTextFormat: ThemeGraphTextFormat.VALUE, + * graphTextStyle: new ServerTextStyle({ + * sizeFixed: true, + * fontHeight: 9, + * fontWidth: 5 + * }) + * }), + * //统计专题图类型为三维柱状图 + * graphType: ThemeGraphType.BAR3D + * }), + * //专题图参数对象 + * themeParameters = new ThemeParameters({ + * themes: [themeGraph], + * dataSourceNames: ["Jingjin"], + * datasetNames: ["BaseMap_R"] + * }), + * //与服务端交互 + * themeService=new ThemeService(url, { + * eventListeners: { + * "processCompleted": ThemeCompleted, + * "processFailed": themeFailed + * } + * }); + * themeService.processAsync(themeParameters); + * } + */ + this.memoryKeys = null; + + /** + * @member {boolean} [ThemeGraph.prototype.negativeDisplayed=false] + * @description 专题图中是否显示属性为负值的数据。true 表示显示;falese 不显示。 + */ + this.negativeDisplayed = false; + + /** + * @member {ThemeOffset} ThemeGraph.prototype.offset + * @description 用于设置统计图相对于要素内点的偏移量。 + */ + this.offset = new ThemeOffset(); + + /** + * @member {boolean} ThemeGraph.prototype.overlapAvoided + * @description 统计图是否采用避让方式显示。
+ * 1.对数据集制作统计专题图:当统计图采用避让方式显示时,如果 overlapAvoided 为 true,则在统计图重叠度很大的情况下, + * 会出现无法完全避免统计图重叠的现象;如果 overlapAvoided 为 false,会过滤掉一些统计图,从而保证所有的统计图均不重叠。
+ * 2.对数据集同时制作统计专题图和标签专题图:当统计图不显示子项文本时,标签专题图的标签即使和统计图重叠,两者也都可正常显示; + * 当统计图显示子项文本时,如果统计图中的子项文本和标签专题图中的标签不重叠,则两者均正常显示;如果重叠,则会过滤掉统计图的子项文本,只显示标签。 + */ + this.overlapAvoided = true; + + /** + * @member {number} [ThemeGraph.prototype.roseAngle=0] + * @description 统计图中玫瑰图或三维玫瑰图用于等分的角度,默认为 0 度,精确到 0.1 度。在角度为0或者大于 360 度的情况下均使用 360 度来等分制作统计图的字段数。 + */ + this.roseAngle = 0; + + /** + * @member {number} [ThemeGraph.prototype.startAngle=0] + * @description 饼状统计图扇形的起始角度。精确到 0.1 度,以水平方向为正向。只有选择的统计图类型为饼状图(饼图、三维饼图、玫瑰图、三维玫瑰图)时,此项才可设置。 + */ + this.startAngle = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraph"; + } + + + /** + * @function ThemeGraph.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.barWidth = null; + me.graduatedMode = null; + if (me.graphAxes) { + me.graphAxes.destroy(); + me.graphAxes = null; + } + if (me.graphSize) { + me.graphSize.destroy(); + me.graphSize = null; + } + me.graphSizeFixed = null; + if (me.graphText) { + me.graphText.destroy(); + me.graphText = null; + } + me.graphType = null; + if (me.items) { + for (var i = 0, items = me.items, len = items.length; i < len; i++) { + items[i].destroy(); + } + me.items = null; + } + me.memoryKeys = null; + me.negativeDisplayed = null; + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + me.overlapAvoided = null; + me.roseAngle = null; + me.startAngle = null; + me.graphAxesTextDisplayMode = null; + } + + /** + * @function ThemeGraph.prototype.toJSON + * @description 将 ThemeGraph 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + + /** + * @function ThemeGraph.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj.type = this.type; + if (this.graphText) { + obj.graphTextDisplayed = this.graphText.graphTextDisplayed; + obj.graphTextFormat = this.graphText.graphTextFormat; + obj.graphTextStyle = this.graphText.graphTextStyle; + } + if (this.graphAxes) { + obj.axesColor = this.graphAxes.axesColor; + obj.axesDisplayed = this.graphAxes.axesDisplayed; + obj.axesGridDisplayed = this.graphAxes.axesGridDisplayed; + obj.axesTextDisplayed = this.graphAxes.axesTextDisplayed; + obj.axesTextStyle = this.graphAxes.axesTextStyle; + } + if (this.graphSize) { + obj.maxGraphSize = this.graphSize.maxGraphSize; + obj.minGraphSize = this.graphSize.minGraphSize; + } + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + obj.barWidth = this.barWidth; + obj.graduatedMode = this.graduatedMode; + obj.graphSizeFixed = this.graphSizeFixed; + obj.graphType = this.graphType; + obj.graphAxesTextDisplayMode = this.graphAxesTextDisplayMode; + obj.items = this.items; + obj.memoryKeys = this.memoryKeys; + obj.negativeDisplayed = this.negativeDisplayed; + obj.overlapAvoided = this.overlapAvoided; + obj.roseAngle = this.roseAngle; + obj.startAngle = this.startAngle; + return obj; + } + + /** + * @function ThemeGraph.fromObj + * @description 从传入对象获取统计专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraph} ThemeGraph 对象。 + */ + static fromObj(obj) { + var res = new ThemeGraph(); + var itemsG = obj.items; + var len = itemsG ? itemsG.length : 0; + Util.copy(res, obj); + res.items = []; + res.graphAxes = ThemeGraphAxes.fromObj(obj); + res.graphSize = ThemeGraphSize.fromObj(obj); + res.graphText = ThemeGraphText.fromObj(obj); + res.offset = ThemeOffset.fromObj(obj); + for (var i = 0; i < len; i++) { + res.items.push(ThemeGraphItem.fromObj(itemsG[i])); + } + return res; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeDotDensity.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeDotDensity + * @deprecatedclass SuperMap.ThemeDotDensity + * @category iServer Map Theme + * @classdesc 点密度专题图。点密度专题图用一定大小、形状相同的点表示现象分布范围、数量特征和分布密度。点的多少和所代表的意义由地图的内容确定。 + * 点密度专题图利用图层的某一数值属性信息(专题值)映射为不同等级,每一级别使用不同数量或表现为密度的点符号来表示。 + * 该专题值在各个分区内的分布情况,体现不同区域的相对数量差异。多用于具有数量特征的地图上, + * 比如表示不同地区的粮食产量、GDP、人口等的分级,主要针对区域或面状的要素,因而,点密度专题图适用于面数据集。 + * 注意:点密度专题图中点的分布是随机的,并不代表实际的分布位置。即使在相关设置完全相同的情况下, + * 每次制作出的专题图,点的数量相同,但点的位置都有差异。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {string} options.dotExpression - 创建点密度专题图的字段或字段表达式。 + * @param {ServerStyle} [options.style] - 点密度专题图中点的风格。 + * @param {number} [options.value] - 专题图中每一个点所代表的数值。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class ThemeDotDensity extends Theme { + + constructor(options) { + super("DOTDENSITY", options); + /** + * @member {string} ThemeDotDensity.prototype.dotExpression + * @description 创建点密度专题图的字段或字段表达式。点的数目或密集程度的来源。 + */ + this.dotExpression = null; + + /** + * @member {ServerStyle} ThemeDotDensity.prototype.style + * @description 点密度专题图中点的风格。 + */ + this.style = new ServerStyle(); + + /** + * @member {number} ThemeDotDensity.prototype.value + * @description 专题图中每一个点所代表的数值。
+ * 点值的确定与地图比例尺以及点的大小有关。地图比例尺越大,相应的图面范围也越大, + * 点相应就可以越多,此时点值就可以设置相对小一些。点形状越大, + * 点值相应就应该设置的小一些。点值过大或过小都是不合适的。 + */ + this.value = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeDotDensity"; + } + + /** + * @function ThemeDotDensity.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dotExpression = null; + me.value = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + } + + + /** + * @function ThemeDotDensity.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + return obj; + } + + /** + * @function ThemeDotDensity.fromObj + * @description 从传入对象获取点密度专题图中点的风格。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeDotDensity} ThemeDotDensity 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeDotDensity(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + } + + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraduatedSymbolStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGraduatedSymbolStyle + * @deprecatedclass SuperMap.ThemeGraduatedSymbolStyle + * @category iServer Map Theme + * @classdesc 等级符号专题图正负零值显示风格类。 + * @param {Object} options - 参数。 + * @param {boolean} [options.negativeDisplayed=false] - 是否显示负值。 + * @param {ServerStyle} [options.negativeStyle] - 负值的等级符号风格。 + * @param {ServerStyle} [options.positiveStyle] - 正值的等级符号风格。 + * @param {boolean} [options.zeroDisplayed=false] - 是否显示 0 值。 + * @param {ServerStyle} [options.zeroStyle] - 0 值的等级符号风格。 + * @usage + */ +class ThemeGraduatedSymbolStyle { + + constructor(options) { + /** + * @member {boolean} [ThemeGraduatedSymbolStyle.prototype.negativeDisplayed=false] + * @description 是否显示负值。 + */ + this.negativeDisplayed = false; + + /** + * @member {ServerStyle} [ThemeGraduatedSymbolStyle.prototype.negativeStyle] + * @description 负值的等级符号风格。 + */ + this.negativeStyle = new ServerStyle(); + + /** + * @member {ServerStyle} [ThemeGraduatedSymbolStyle.prototype.positiveStyle] + * @description 正值的等级符号风格。 + */ + this.positiveStyle = new ServerStyle(); + + /** + * @member {boolean} [ThemeGraduatedSymbolStyle.prototype.zeroDisplayed=false] + * @description 是否显示 0 值。 + */ + this.zeroDisplayed = false; + + /** + * @member {ServerStyle} ThemeGraduatedSymbolStyle.prototype.zeroStyle + * @description 0 值的等级符号风格。 + */ + this.zeroStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraduatedSymbolStyle"; + } + + /** + * @function ThemeGraduatedSymbolStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.negativeDisplayed = null; + me.negativeStyle = null; + me.positiveStyle = null; + me.zeroDisplayed = null; + me.zeroStyle = null; + } + + /** + * @function ThemeGraduatedSymbolStyle.fromObj + * @description 从传入对象获取等级符号专题图正负零值显示风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraduatedSymbolStyle} ThemeGraduatedSymbolStyle 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGraduatedSymbolStyle(); + Util.copy(res, obj); + res.negativeStyle = ServerStyle.fromJson(obj.negativeStyle); + res.positiveStyle = ServerStyle.fromJson(obj.positiveStyle); + res.zeroStyle = ServerStyle.fromJson(obj.zeroStyle); + return res; + } + +} + + + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraduatedSymbol.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class ThemeGraduatedSymbol + * @deprecatedclass SuperMap.ThemeGraduatedSymbol + * @category iServer Map Theme + * @classdesc 等级符号专题图。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {ThemeGraduatedSymbolStyle} options.style - 等级符号专题图正负零值显示风格类。 + * @param {string} options.expression - 等级符号专题图的字段或字段表达式。 + * @param {number} [options.baseValue=0] - 等级符号专题图的基准值,单位同专题变量的单位。 + * @param {GraduatedMode} [options.graduatedMode=GraduatedMode.CONSTANT] - 等级符号专题图分级模式。 + * @param {ThemeOffset} [options.offset] - 指定标签专题图中标记文本相对于要素内点的偏移量对象。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class ThemeGraduatedSymbol extends Theme { + + constructor(options) { + super("GRADUATEDSYMBOL", options); + /** + * @member {number} [ThemeGraduatedSymbol.prototype.baseValue=0] + * @description 等级符号专题图的基准值,单位同专题变量的单位。
+ * 依据此值系统会自动根据分级方式计算其余值对应的符号大小,每个符号的显示大小等于 + * ThemeValueSection.positiveStyle(或 zeroStyle,negativeStyle).markerSize * value / basevalue, + * 其中 value 是 expression 所指定字段对应的值经过分级计算之后的值。默认值为0,建议通过多次尝试设置该值才能达到较好的显示效果。 + */ + this.baseValue = 0; + + /** + * @member {string} ThemeGraduatedSymbol.prototype.expression + * @description 用于创建等级符号专题图的字段或字段表达式,字段或字段表达式应为数值型。 + */ + this.expression = null; + + /** + * @member {GraduatedMode} [ThemeGraduatedSymbol.prototype.graduatedMode=GraduatedMode.CONSTANT] + * @description 等级符号专题图分级模式。
+ * 分级主要是为了减少制作等级符号专题图中数据大小之间的差异。如果数据之间差距较大,则可以采用对数或者平方根的分级方式来进行, + * 这样就减少了数据之间的绝对大小的差异,使得等级符号图的视觉效果比较好,同时不同类别之间的比较也是有意义的。 + * 有三种分级模式:常数、对数和平方根,对于有值为负数的字段,在用对数或平方根方式分级时,默认对负数取正。 + * 不同的分级模式用于确定符号大小的数值是不相同的:常数按照字段的原始数据进行;对数则是对每条记录对应的专题变量取自然对数; + * 平方根则是对其取平方根,然后用最终得到的结果来确定其等级符号的大小。 + */ + this.graduatedMode = GraduatedMode.CONSTAN; + + /** + * @member {ThemeOffset} [ThemeGraduatedSymbol.prototype.offset] + * @description 用于设置等级符号图相对于要素内点的偏移量。 + */ + this.offset = new ThemeOffset(); + + /** + * @member {ThemeGraduatedSymbolStyle} ThemeGraduatedSymbol.prototype.style + * @description 用于设置等级符号图正负和零值显示风格。 + */ + this.style = new ThemeGraduatedSymbolStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraduatedSymbol"; + } + + /** + * @function ThemeGraduatedSymbol.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.expression = null; + me.graduatedMode = GraduatedMode.CONSTANT; + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + if (me.style) { + me.style.destroy(); + me.style = null; + } + } + + + /** + * @function ThemeGraduatedSymbol.prototype.toJSON + * @description 将 themeLabel 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + + + /** + * @function ThemeGraduatedSymbol.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj.type = this.type; + obj.memoryData = this.memoryData; + obj.baseValue = this.baseValue; + obj.expression = this.expression; + obj.graduatedMode = this.graduatedMode; + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + if (this.style) { + obj.negativeStyle = this.style.negativeStyle; + obj.negativeDisplayed = this.style.negativeDisplayed; + obj.positiveStyle = this.style.positiveStyle; + obj.zeroDisplayed = this.style.zeroDisplayed; + obj.zeroStyle = this.style.zeroStyle; + } + return obj; + } + + /** + * @function ThemeGraduatedSymbol.fromObj + * @description 从传入对象获取等级符号专题图。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraduatedSymbol} 等级符号专题图对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGraduatedSymbol(); + Util.copy(res, obj); + res.offset = ThemeOffset.fromObj(obj); + res.style = ThemeGraduatedSymbolStyle.fromObj(obj); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeRangeItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeRangeItem + * @deprecatedclass SuperMap.ThemeRangeItem + * @category iServer Map Theme + * @classdesc 范围分段专题图子项类。在分段专题图中,字段值按照某种分段模式被分成多个范围段, + * 每个范围段即为一个子项,同一范围段的要素属于同一个分段专题图子项。 + * 每个子项都有其分段起始值、终止值、名称和风格等。每个分段所表示的范围为[start, end)。 + * @param {Object} options - 参数。 + * @param {string} [options.caption] - 子项的标题。 + * @param {number} [options.end=0] - 子项的终止值。 + * @param {number} [options.start=0] - 子项的起始值。 + * @param {ServerStyle} options.style - 子项的风格。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ +class ThemeRangeItem { + + constructor(options) { + /** + * @member {string} [ThemeRangeItem.prototype.caption] + * @description 分段专题图子项的标题。 + */ + this.caption = null; + + /** + * @member {number} [ThemeRangeItem.prototype.end=0] + * @description 分段专题图子项的终止值,即该段专题值范围的最大值。
+ * 如果该子项是分段中最后一个子项,则该终止值应大于分段字段(ThemeRange 类的 rangeExpression 属性)的最大值,若该终止值小于分段字段最大值, + * 则剩余部分由内部随机定义其颜色;如果不是最后一项,该终止值必须与其下一子项的起始值相同,否则系统抛出异常; + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按您设置的值对分段结果进行调整。 + */ + this.end = 0; + + /** + * @member {number} [ThemeRangeItem.prototype.start=0] + * @description 分段专题图子项的起始值,即该段专题值范围的最小值。
+ * 如果该子项是分段中第一个子项,那么该起始值就是分段的最小值;如果子项的序号大于等于 1 的时候,该起始值必须与前一子项的终止值相同,否则系统会抛出异常。 + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按您设置的值对分段结果进行调整。 + */ + this.start = 0; + + /** + * @member {ServerStyle} ThemeRangeItem.prototype.style + * @description 分段专题图子项的风格。 + * 每一个分段专题图子项都对应一种显示风格。 + */ + this.style = new ServerStyle(); + + /** + * @member {boolean} [ThemeRangeItem.prototype.visible=true] + * @description 分段专题图子项是否可见。 + */ + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeRangeItem"; + } + + /** + * @function ThemeRangeItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + me.visible = null; + } + + /** + * @function ThemeRangeItem.prototypetoServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + return obj; + } + + /** + * @function ThemeRangeItem.fromObj + * @description 从传入对象获取范围分段专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeRangeItem} ThemeRangeItem 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeRangeItem(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeRange.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThemeRange + * @deprecatedclass SuperMap.ThemeRange + * @category iServer Map Theme + * @classdesc 范围分段专题图。 + * 范围分段专题图是按照指定的分段方法(如:等距离分段法)对字段的属性值进行分段,使用不同的颜色或符号(线型、填充)表示不同范围段落的属性值在整体上的分布情况,体现区域的差异。 + * 在分段专题图中,专题值按照某种分段方式被分成多个范围段,要素根据各自的专题值被分配到其中一个范围段中,在同一个范围段中的要素使用相同的颜色,填充,符号等风格进行显示。 + * 分段专题图所基于的专题变量必须为数值型,分段专题图一般用来反映连续分布现象的数量或程度特征,如降水量的分布,土壤侵蚀强度的分布等。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项数组。 + * @param {string} options.rangeExpression - 分段字段表达式。 + * @param {number} options.rangeParameter - 分段参数。 + * @param {number} options.rangeParameter - 分段参数。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 分段模式。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ +class ThemeRange extends Theme { + + constructor(options) { + super("RANGE", options); + /** + * @member {string} ThemeRange.prototype.precision + * @description 精准度 + */ + this.precision = '1.0E-12'; + + /** + * @member {Array.} ThemeRange.prototype.items + * @description 分段专题图子项数组。
+ * 在分段专题图中,字段值按照某种分段模式被分成多个范围段,每个范围段即为一个子项,同一范围段的要素属于同一个分段专题图子项。 + * 每个子项都有其分段起始值、终止值、名称和风格等。每个分段所表示的范围为 [start, end)。 + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按照您设置的值对分段结果进行调整。 + */ + this.items = null; + + /** + * @member {string} ThemeRange.prototype.rangeExpression + * @description 分段字段表达式。
+ * 由于范围分段专题图基于各种分段方法根据一定的距离进行分段,因而范围分段专题图所基于的字段值的数据类型必须为数值型。对于字段表达式,只能为数值型的字段间的运算。 + */ + this.rangeExpression = null; + + /** + * @member {RangeMode} [ThemeRange.prototype.rangeMode=RangeMode.EQUALINTERVAL] + * @description 分段专题图的分段模式。
+ * 在分段专题图中,作为专题变量的字段或表达式的值按照某种分段方式被分成多个范围段。 + * 目前 SuperMap 提供的分段方式包括:等距离分段法、平方根分段法、标准差分段法、对数分段法、等计数分段法和自定义距离法, + * 显然这些分段方法根据一定的距离进行分段,因而范围分段专题图所基于的专题变量必须为数值型。 + */ + this.rangeMode = RangeMode.EQUALINTERVAL; + + /** + * @member {number} ThemeRange.prototype.rangeParameter + * @description 分段参数。 + * 当分段模式为等距离分段法,平方根分段,对数分段法,计数分段法其中一种模式时,该参数用于设置分段个数;当分段模式为标准差分段法时, + * 该参数不起作用;当分段模式为自定义距离时,该参数用于设置自定义距离。 + */ + this.rangeParameter = 0; + + /** + * @member {ColorGradientType} [ThemeRange.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。
+ * 渐变色是由起始色根据一定算法逐渐过渡到终止色的一种混合型颜色。 + * 该类作为单值专题图参数类、分段专题图参数类的属性,负责设置单值专题图、分段专题图的配色方案,在默认情况下专题图所有子项会根据这个配色 + * 方案完成填*充。但如果为某几个子项的风格进行单独设置后(设置了 {@link ThemeUniqueItem} 或 {@link ThemeRangeItem} 类中Style属性), + * 该配色方案对于这几个子项将不起作用。 + */ + this.colorGradientType = ColorGradientType.YELLOW_RED; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeRange"; + } + + + /** + * @function ThemeRange.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + me.items = null; + } + me.rangeExpression = null; + me.rangeMode = null; + me.rangeParameter = null; + me.colorGradientType = null; + } + + /** + * @function ThemeRange.fromObj + * @description 从传入对象获取范围分段专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeRange} ThemeRange 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeRange(); + Util.copy(res, obj); + var itemsR = obj.items; + var len = itemsR ? itemsR.length : 0; + res.items = []; + for (var i = 0; i < len; i++) { + res.items.push(ThemeRangeItem.fromObj(itemsR[i])); + } + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/UGCLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UGCLayer + * @deprecatedclass SuperMap.UGCLayer + * @category iServer Map Layer + * @classdesc SuperMap 图层类。 + * @param {Object} options - 参数。 + * @param {Bounds} options.bounds - 图层范围。 + * @param {string} options.name - 图层的名称。 + * @param {UGCLayerType} options.type - 图层类型 + * @param {string} [options.caption] - 图层的标题。 + * @param {string} [options.description] - 图层的描述信息。 + * @param {boolean} [options.queryable] - 图层中的对象是否可以查询。 + * @param {boolean} [options.subUGCLayers] - 是否允许图层的符号大小随图缩放。 + * @param {boolean} [options.visible=false] - 地图对象在同一范围内时,是否重叠显示。 + * @usage + */ +class UGCLayer { + + constructor(options) { + options = options || {}; + /** + * @member {Bounds} UGCLayer.prototype.bounds + * @description 图层范围。 + */ + this.bounds = null; + + /** + * @member {string} [UGCLayer.prototype.caption] + * @description 图层的标题。默认情况下图层的标题与图层的名称一致。在图例、图层控制列表中显示的图层名称就是该图层的标题值。 + */ + this.caption = null; + + /** + * @member {string} UGCLayer.prototype.description + * @description 图层的描述信息。 + */ + this.description = null; + + /** + * @member {string} UGCLayer.prototype.name + * @description 图层的名称。图层的名称在图层所在的地图中唯一标识此图层。该属性区分大小写。 + */ + this.name = null; + + /** + * @member {boolean} UGCLayer.prototype.queryable + * @description 图层中的对象是否可以查询。 + */ + this.queryable = null; + + /** + * @member {Array} UGCLayer.prototype.subLayers + * @description 子图层集。 + */ + this.subLayers = null; + + /** + * @member {UGCLayerType} UGCLayer.prototype.type + * @description 图层类型。 + */ + this.type = null; + + /** + * @member {boolean} UGCLayer.prototype.visible + * @description 地图对象在同一范围内时,是否重叠显示。 + */ + this.visible = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.UGCLayer"; + } + + /** + * @function UGCLayer.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + Util.reset(me); + } + + /** + * @function UGCLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + jsonObject = jsonObject ? jsonObject : {}; + Util.extend(this, jsonObject); + var b = this.bounds; + if (b) { + this.bounds = new Bounds(b.leftBottom.x, b.leftBottom.y, b.rightTop.x, b.rightTop.y); + } + } + + + /** + * @function UGCLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var jsonObject = {}; + jsonObject = Util.copyAttributes(jsonObject, this); + if (jsonObject.bounds) { + if (jsonObject.bounds.toServerJSONObject) { + jsonObject.bounds = jsonObject.bounds.toServerJSONObject(); + } + } + return jsonObject; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/UGCMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UGCMapLayer + * @deprecatedclass SuperMap.UGCMapLayer + * @category iServer Map Layer + * @classdesc SuperMap 地图图层类。 + * @extends {UGCLayer} + * @param {Object} options - 可选参数。 + * @param {boolean} [options.completeLineSymbolDisplayed] - 是否显示完整线型。 + * @param {number} [options.maxScale] - 地图最大比例尺。 + * @param {number} [options.minScale] - 地图最小比例尺。 + * @param {number} [options.minVisibleGeometrySize] - 几何对象的最小可见大小,以像素为单位。 + * @param {number} [options.opaqueRate] - 图层的不透明度。 + * @param {boolean} [options.symbolScalable] - 是否允许图层的符号大小随图缩放。 + * @param {number} [options.symbolScale] - 图层的符号缩放基准比例尺。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内时,是否重叠显示。 + * @param {OverlapDisplayedOptions} [options.overlapDisplayedOptions] - 地图的压盖过滤显示选项,当overlapDisplayed 为 false 时有效。 + * @usage + */ +class UGCMapLayer extends UGCLayer { + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {boolean} UGCMapLayer.prototype.completeLineSymbolDisplayed + * @description 是否显示完整线型。 + */ + this.completeLineSymbolDisplayed = null; + + /** + * @member {number} UGCMapLayer.prototype.maxScale + * @description 地图最大比例尺。 + */ + this.maxScale = null; + + /** + * @member {number} UGCMapLayer.prototype.minScale + * @description 地图最小比例尺。 + */ + this.minScale = null; + + /** + * @member {number} UGCMapLayer.prototype.minVisibleGeometrySize + * @description 几何对象的最小可见大小,以像素为单位。 + */ + this.minVisibleGeometrySize = null; + + /** + * @member {number} UGCMapLayer.prototype.opaqueRate + * @description 图层的不透明度。 + */ + this.opaqueRate = null; + /** + * @member {boolean} UGCMapLayer.prototype.symbolScalable + * @description 是否允许图层的符号大小随图缩放。 + */ + this.symbolScalable = null; + + /** + * @member {number} UGCMapLayer.prototype.symbolScale + * @description 图层的符号缩放基准比例尺。 + */ + this.symbolScale = null; + + /** + * @member {boolean} [UGCMapLayer.prototype.overlapDisplayed=false] + * @description 地图对象在同一范围内时,是否重叠显示。 + */ + this.overlapDisplayed = null; + + /** + * @member {OverlapDisplayedOptions} UGCMapLayer.prototype.overlapDisplayedOptions + * @description 地图的压盖过滤显示选项,当 overlapDisplayed 为 false 时有效。 + */ + this.overlapDisplayedOptions = null; + + this.CLASS_NAME = "SuperMap.UGCMapLayer"; + } + + /** + * @function UGCMapLayer.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + + /** + * @function UGCMapLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + } + + + /** + * @function UGCMapLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + return super.toServerJSONObject(); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/JoinItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class JoinItem + * @deprecatedclass SuperMap.JoinItem + * @category iServer Data FeatureResults + * @classdesc 连接信息类。 + * 该类用于矢量数据集与外部表的连接。外部表可以为另一个矢量数据集(其中纯属性数据集中没有空间几何信息)所对应的 DBMS 表,也可以是用户自建的业务表。 + * 需要注意的是,矢量数据集与外部表必须属于同一数据源。表之间的联系的建立有两种方式,一种是连接(join),一种是关联(link)。 + * 连接,实际上是依据相同的字段将一个外部表追加到指定的表;而关联是基于一个相同的字段定义了两个表格之间的联系,但不是实际的追加。 + * 用于连接两个表的字段的名称不一定相同,但类型必须一致。当两个表格之间建立了连接,通过对主表进行操作,可以对外部表进行查询,制作专题图以及分析等。 + * 当两个表格之间是一对一或多对一的关系时,可以使用 join 连接。当为多对一的关系时,允许指定多个字段之间的关联。 + *(注意:JoinItem 目前支持左连接和内连接,不支持全连接和右连接,UDB 引擎不支持内连接。并且用于建立连接的两个表必须在同一个数据源下。) + * @param {Object} options - 参数。 + * @param {string} options.foreignTableName - 外部表的名称。 + * @param {string} options.joinFilter - 矢量数据集与外部表之间的连接表达式,即设定两个表之间关联的字段。 + * @param {JoinType} options.joinType - 两个表之间连接类型。 + * @example 下面以 SQL 查询说明 joinItem 的使用方法: + *(start code) + * function queryBySQL() { + * // 设置与外部表的连接信息 + * var joinItem = new JoinItem({ + * foreignTableName: "foreignTable", + * joinFilter: "foreignTable.CONTINENT = Countries.CONTINENT", + * joinType: "LEFTJOIN" + * }) + * var queryParam, queryBySQLParams, queryBySQLService; + * // 设置查询参数,在查询参数中添加joinItem关联条件信息 + * queryParam = new FilterParameter({ + * name: "Countries@World", + * joinItems: [joinItem] + * }), + * queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }), + * queryBySQLService = new QueryBySQLService(url, { + * eventListeners: { "processCompleted": processCompleted, "processFailed": processFailed} + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * } + * function processCompleted(queryEventArgs) {//todo} + * function processFailed(e) {//todo} + * (end) + * @usage + */ +class JoinItem { + + constructor(options) { + /** + * @member {string} JoinItem.prototype.foreignTableName + * @description 外部表的名称。 + * 如果外部表的名称是以 “表名@数据源名” 命名方式,则该属性只需赋值表名。 + * 例如:外部表 Name@changchun,Name 为表名,changchun 为数据源名称,则该属性的赋值应为:Name。 + */ + this.foreignTableName = null; + + /** + * @member {string} JoinItem.prototype.joinFilter + * @description 矢量数据集与外部表之间的连接表达式,即设定两个表之间关联的字段。 + * 例如,将房屋面数据集(Building)的 district 字段与房屋拥有者的纯属性数据集(Owner)的 region 字段相连接, + * 两个数据集对应的表名称分别为 Table_Building 和 Table_Owner, + * 则连接表达式为 Table_Building.district = Table_Owner.region。 + * 当有多个字段相连接时,用 AND 将多个表达式相连。 + */ + this.joinFilter = null; + + /** + * @member {JoinType} JoinItem.prototype.joinType + * @description 两个表之间连接类型。 + * 连接类型决定了对两个表进行连接查询后返回的记录的情况。 + */ + this.joinType = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.JoinItem"; + } + + + /** + * @function JoinItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.foreignTableName = null; + me.joinFilter = null; + me.joinType = null; + } + + /** + * @function JoinItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); + //joinFilter基本是个纯属性对象,这里不再做转换 + return dataObj; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/UGCSubLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class UGCSubLayer + * @deprecatedclass SuperMap.UGCSubLayer + * @category iServer Map Layer + * @classdesc 地图服务图层属性信息类。影像图层(Image)、专题图层(ServerTheme)、栅格图层(Grid)、矢量图层(Vector)等图层均继承该类。 + * @extends {UGCMapLayer} + * @param {Object} options - 参数。 + * @param {DatasetInfo} options.datasetInfo - 数据集信息。 + * @param {string} [options.displayFilter] - 图层显示过滤条件。 + * @param {JoinItem} [options.joinItems] - 连接信息类。 + * @param {string} [options.representationField] - 存储制图表达信息的字段。 + * @param {LayerType} [options.ugcLayerType] - 图层类型。 + * @usage + */ +class UGCSubLayer extends UGCMapLayer { + + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {DatasetInfo} UGCSubLayer.prototype.datasetInfo + * @description 数据集信息。 + */ + this.datasetInfo = null; + + /** + * @member {string} UGCSubLayer.prototype.displayFilter + * @description 图层显示过滤条件。 + */ + this.displayFilter = null; + + /** + * @member {JoinItem} UGCSubLayer.prototype.joinItems + * @description 连接信息类。 + */ + this.joinItems = null; + + /** + * @member {string} UGCSubLayer.prototype.representationField + * @description 存储制图表达信息的字段。 + */ + this.representationField = null; + + /** + * @member {LayerType} UGCSubLayer.prototype.ugcLayerType + * @description 图层类型。 + */ + this.ugcLayerType = null; + + this.CLASS_NAME = "SuperMap.UGCSubLayer"; + } + + + /** + * @function UGCSubLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + if (this.datasetInfo) { + this.datasetInfo = new DatasetInfo(this.datasetInfo); + } + if (this.joinItems && this.joinItems.length) { + var newJoinItems = []; + for (var i = 0; i < this.joinItems.length; i++) { + newJoinItems[i] = new JoinItem(this.joinItems[i]); + } + this.joinItems = newJoinItems; + } + } + + /** + * @function UGCSubLayer.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + + /** + * @function UGCSubLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var jsonObject = super.toServerJSONObject(); + if (jsonObject.joinItems) { + var joinItems = []; + for (var i = 0; i < jsonObject.joinItems.length; i++) { + if (jsonObject.joinItems[i].toServerJSONObject) { + joinItems[i] = jsonObject.joinItems[i].toServerJSONObject(); + } + + } + jsonObject.joinItems = joinItems; + } + if (jsonObject.datasetInfo) { + if (jsonObject.datasetInfo.toServerJSONObject) { + jsonObject.datasetInfo = jsonObject.datasetInfo.toServerJSONObject(); + } + } + return jsonObject; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ServerTheme.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class ServerTheme + * @deprecatedclass SuperMap.ServerTheme + * @category iServer Map Theme + * @classdesc SuperMap 专题图图层类。 + * @extends {UGCSubLayer} + * @param {CommonTheme} theme - 专题图对象。 + * @param {LonLat} themeElementPosition - 专题图元素位置。 + * @usage + */ +class ServerTheme extends UGCSubLayer { + + constructor(options) { + options = options || {}; + super(options); + + /** + * @member {CommonTheme} ServerTheme.prototype.theme + * @description 专题图对象。 + */ + this.theme = null; + + /** + * @member {LonLat} ServerTheme.prototype.themeElementPosition + * @description 专题图元素位置。 + */ + this.themeElementPosition = null; + + this.CLASS_NAME = "SuperMap.ServerTheme"; + + } + + + /** + * @function ServerTheme.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + + /** + * @function ServerTheme.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + var themeObj = this.theme; + var themeT = themeObj && themeObj.type; + switch (themeT) { + case 'LABEL': + this.theme = ThemeLabel.fromObj(themeObj); + break; + case 'UNIQUE': + this.theme = ThemeUnique.fromObj(themeObj); + break; + case 'GRAPH': + this.theme = ThemeGraph.fromObj(themeObj); + break; + case 'DOTDENSITY': + this.theme = ThemeDotDensity.fromObj(themeObj); + break; + case 'GRADUATEDSYMBOL': + this.theme = ThemeGraduatedSymbol.fromObj(themeObj); + break; + case 'RANGE': + this.theme = ThemeRange.fromObj(themeObj); + break; + default: + break; + } + if (this.themeElementPosition) { + //待测试 + this.themeElementPosition = new LonLat(this.themeElementPosition.x, this.themeElementPosition.y); + } + } + + /** + * @function ServerTheme.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + toServerJSONObject() { + //普通属性直接赋值 + var jsonObject = super.toServerJSONObject(); + + if (jsonObject.themeElementPosition) { + if (jsonObject.themeElementPosition.toServerJSONObject) { + jsonObject.themeElementPosition = jsonObject.themeElementPosition.toServerJSONObject(); + } + } + if (jsonObject.theme) { + if (jsonObject.theme.toServerJSONObject) { + jsonObject.theme = jsonObject.theme.toServerJSONObject(); + } + } + return jsonObject; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/Grid.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class Grid + * @deprecatedclass SuperMap.Grid + * @category iServer Map Layer + * @classdesc SuperMap 栅格图层类。 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {Array.} [options.colorDictionary] - 颜色对照表对象。 + * @param {number} [options.brightness] - Grid 图层的亮度。 + * @param {ColorGradientType} [options.colorGradientType] - 颜色渐变枚举。 + * @param {ServerColor} [options.colors] - 颜色表对象。 + * @param {number} [options.contrast] - Grid 图层的对比度。 + * @param {GridType} [options.gridType] - 格网类型。 + * @param {number} [options.horizontalSpacing] - 格网水平间隔大小。 + * @param {boolean} [options.sizeFixed] - 格网是否固定大小,如果不固定大小,则格网随着地图缩放。 + * @param {ServerStyle} [options.solidStyle] - 格网实线的样式。 + * @param {ServerColor} [options.specialColor] - 栅格数据集无值数据的颜色。 + * @param {number} [options.specialValue] - 图层的特殊值。 + * @param {boolean} [options.specialValueTransparent] - 图层的特殊值(specialValue)所处区域是否透明。 + * @param {number} [options.verticalSpacing] - 格网垂直间隔大小。 + * @usage + */ +class Grid extends UGCSubLayer { + + + constructor(options) { + options = options || {}; + super(options); + + /** + * @member {Array.} Grid.prototype.colorDictionarys + * @description 颜色对照表对象。 + */ + this.colorDictionarys = null; + + /** + * @member {number} Grid.prototype.brightness + * @description Grid 图层的亮度。 + */ + this.brightness = null; + + /** + * @member {ColorGradientType} Grid.prototype.colorGradientType + * @description 渐变颜色枚举值。 + */ + this.colorGradientType = null; + + /** + * @member {ServerColor} Grid.prototype.colors + * @description 颜色表对象。 + */ + this.colors = null; + + /** + * @member {number} Grid.prototype.contrast + * @description Grid 图层的对比度。 + */ + this.contrast = null; + + /** + * @member {ServerStyle} Grid.prototype.dashStyle + * @description 栅格数据集特殊值数据的颜色。 + */ + this.dashStyle = null; + + /** + * @member {GridType} Grid.prototype.gridType + * @description 格网类型。 + */ + this.gridType = null; + + /** + * @member {number} Grid.prototype.horizontalSpacing + * @description 格网水平间隔大小。 + */ + this.horizontalSpacing = null; + + /** + * @member {boolean} Grid.prototype.sizeFixed + * @description 格网是否固定大小,如果不固定大小,则格网随着地图缩放。 + */ + this.sizeFixed = null; + + /** + * @member {ServerStyle} Grid.prototype.solidStyle + * @description 格网实线的样式。 + */ + this.solidStyle = null; + + /** + * @member {ServerColor} Grid.prototype.specialColor + * @description 栅格数据集无值数据的颜色。 + */ + this.specialColor = null; + + /** + * @member {number} Grid.prototype.specialValue + * @description 图层的特殊值。 + */ + this.specialValue = null; + + /** + * @member {boolean} Grid.prototype.specialValueTransparent + * @description 图层的特殊值(specialValue)所处区域是否透明。 + */ + this.specialValueTransparent = null; + + /** + * @member {number} Grid.prototype.verticalSpacing + * @description 格网垂直间隔大小。 + */ + this.verticalSpacing = null; + + + this.CLASS_NAME = "SuperMap.Grid"; + } + + /** + * @function Grid.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function Grid.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + if (this.specialColor) { + this.specialColor = new ServerColor(this.specialColor.red, + this.specialColor.green, + this.specialColor.blue); + } + if (this.colors) { + var colors = [], + color; + for (var i in this.colors) { + color = this.colors[i]; + colors.push(new ServerColor(color.red, color.green, color.blue)); + } + this.colors = colors; + } + if (this.dashStyle) { + this.dashStyle = new ServerStyle(this.dashStyle); + } + if (this.solidStyle) { + this.solidStyle = new ServerStyle(this.solidStyle); + } + if (this.colorDictionary) { + var colorDics = [], + colorDic; + for (var key in this.colorDictionary) { + colorDic = this.colorDictionary[key]; + colorDics.push(new ColorDictionary({elevation: key, color: colorDic})); + } + this.colorDictionarys = colorDics; + } + delete this.colorDictionary; + } + + /** + * @function Grid.prototype.toServerJSONObject + * @description 转换成对应的 JSON 对象。 + * @returns JSON 对象。 + */ + toServerJSONObject() { + var jsonObject = super.toServerJSONObject(); + + if (jsonObject.dashStyle) { + if (jsonObject.dashStyle.toServerJSONObject) { + jsonObject.dashStyle = jsonObject.dashStyle.toServerJSONObject(); + } + } + if (jsonObject.solidStyle) { + if (jsonObject.solidStyle.toServerJSONObject) { + jsonObject.solidStyle = jsonObject.solidStyle.toServerJSONObject(); + } + } + return jsonObject; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/Image.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class UGCImage + * @deprecatedclass SuperMap.Image + * @category iServer Map Layer + * @classdesc SuperMap 影像图层类 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {ColorSpaceType} [options.colorSpaceType] - 返回影像图层的色彩显示模式。 + * @param {number} [options.brightness] - 影像图层的亮度。 + * @param {Array.} [options.displayBandIndexes] - 返回当前影像图层显示的波段索引。 + * @param {number} [options.contrast] - 影像图层的对比度。 + * @param {boolean} [options.transparent] - 是否背景透明。 + * @param {ServerColor} [options.transparentColor] - 返回背景透明色。 + * @param {number} [options.transparentColorTolerance] - 背景透明色容限。 + * @usage + * @private + */ +class UGCImage extends UGCSubLayer { + + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {number} UGCImage.prototype.brightness + * @description 影像图层的亮度。 + */ + this.brightness = null; + + /** + * @member {ColorSpaceType} UGCImage.prototype.colorSpaceType + * @description 返回影像图层的色彩显示模式。 + */ + this.colorSpaceType = null; + + /** + * @member {number} UGCImage.prototype.contrast + * @description 影像图层的对比度。 + */ + this.contrast = null; + + /** + * @member {Array.} UGCImage.prototype.displayBandIndexes + * @description 返回当前影像图层显示的波段索引。 + */ + this.displayBandIndexes = null; + + /** + * @member {boolean} UGCImage.prototype.transparent + * @description 是否背景透明。 + */ + this.transparent = null; + + /** + * @member {ServerColor} UGCImage.prototype.transparentColor + * @description 返回背景透明色。 + */ + this.transparentColor = null; + + /** + * @member {number} UGCImage.prototype.transparentColorTolerance + * @description 背景透明色容限。 + */ + this.transparentColorTolerance = null; + + this.CLASS_NAME = "SuperMap.Image"; + } + + /** + * @function UGCImage.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function UGCImage.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + if (this.transparentColor) { + this.transparentColor = new ServerColor(this.transparentColor.red, + this.transparentColor.green, + this.transparentColor.blue); + } + } + + /** + * @function UGCImage.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + toServerJSONObject() { + return super.toServerJSONObject(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/Vector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class Vector + * @deprecatedclass SuperMap.Vector + * @category iServer Map Layer + * @classdesc SuperMap 矢量图层类。 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {ServerStyle} [options.style] - 矢量图层的风格。 + * @usage + */ + +class Vector_Vector extends UGCSubLayer { + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {ServerStyle} Vector.prototype.style + * @description 矢量图层的风格。 + */ + this.style = null; + + this.CLASS_NAME = "SuperMap.Vector"; + } + + /** + * @function Vector.prototype.destroy + * @description 销毁对象,将其属性置空。 + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function Vector.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + super.fromJson(jsonObject); + var sty = this.style; + if (sty) { + this.style = new ServerStyle(sty); + } + } + + /** + * @function Vector.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象 + */ + toServerJSONObject() { + var jsonObject = super.toServerJSONObject(); + if (jsonObject.style) { + if (jsonObject.style.toServerJSONObject) { + jsonObject.style = jsonObject.style.toServerJSONObject(); + } + } + return jsonObject; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/GetLayersInfoService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class GetLayersInfoService + * @deprecatedclass SuperMap.GetLayersInfoService + * @category iServer Map Layer + * @classdesc 获取图层信息服务类构造函数。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * 如 http://localhost:8090/iserver/services/map-world/rest/maps/World 。 + * 如果查询临时图层的信息,请指定完成的url,包含临时图层ID信息,如: + * http://localhost:8090/iserver/services/map-world/rest/maps/World/tempLayersSet/resourceID + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @param {boolean} options.isTempLayers - 当前url对应的图层是否是临时图层。 + * @usage + */ +class GetLayersInfoService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {boolean} GetLayersInfoService.prototype.isTempLayers + * @description 当前url对应的图层是否是临时图层。 + */ + this.isTempLayers = false; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.GetLayersInfoService"; + } + + /** + * @function GetLayersInfoService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function GetLayersInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + */ + processAsync() { + var me = this, + method = "GET"; + if (!me.isTempLayers) { + me.url = Util.urlPathAppend(me.url, 'layers'); + } + me.request({ + method: method, + params: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function GetLayersInfoService.prototype.serviceProcessCompleted + * @description 编辑完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this, existRes, layers, len; + result = Util.transformResult(result); + + existRes = !!result && result.length > 0; + layers = existRes ? result[0].subLayers.layers : null; + len = layers ? layers.length : 0; + me.handleLayers(len, layers); + me.events.triggerEvent("processCompleted", {result: result[0]}); + } + + /** + * TODO 专题图时候可能会用到 + * @function GetLayersInfoService.prototype.handleLayers + * @description 处理 iServer 新增图层组数据 (subLayers.layers 中可能还会含有 subLayers.layers) + * @param {number} len - subLayers.layers的长度 + * @param {Array.} layers - subLayers.layers的长度数组 + */ + handleLayers(len, layers) { + var me = this, tempLayer; + if (len) { + for (var i = 0; i < len; i++) { + if (layers[i].subLayers && layers[i].subLayers.layers && layers[i].subLayers.layers.length > 0) { + me.handleLayers(layers[i].subLayers.layers.length, layers[i].subLayers.layers); + } else { + var type = layers[i].ugcLayerType; + switch (type) { + case 'THEME': + tempLayer = new ServerTheme(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + case 'GRID': + tempLayer = new Grid(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + case 'IMAGE': + tempLayer = new UGCImage(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + case 'VECTOR': + tempLayer = new Vector_Vector(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + default: + break; + } + } + + } + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class InterpolationAnalystParameters + * @deprecatedclass SuperMap.InterpolationAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 插值分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。 + * @param {string} [options.dataset] - 待分析的数据集名称。当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystType)为 geometry 时,此参数为必设参数。 + * @param {number} [options.searchRadius=0] - 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {number} [options.zValueScale=1] - 进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {PixelFormat} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.InterpolationAnalystType="dataset"] - 插值分析类型("dataset" 或 "geometry")。 + * @usage + */ +class InterpolationAnalystParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} InterpolationAnalystParameters.prototype.bounds + * @description 插值分析的范围,用于确定结果栅格数据集的范围。 + * 如果缺省,则默认为原数据集的范围。鉴于此插值方法为内插方法,原数据集的范围内的插值结果才相对有参考价值, + * 因此建议此参数不大于原数据集范围。 + */ + this.bounds = null; + + /** + * @member {number} [InterpolationAnalystParameters.prototype.searchRadius=0] + * @description 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * 计算某个位置的Z 值时,会以该位置为圆心,以查找范围的值为半径,落在这个范围内的采样点都将参与运算。 + * 该值需要根据待插值点数据的分布状况和点数据集范围进行设置。 + */ + this.searchRadius = 0; + + /** + * @member {string} InterpolationAnalystParameters.prototype.zValueFieldName + * @description 数据集插值分析中,用于指定进行插值分析的目标字段名,插值分析不支持文本类型的字段。 + * 含义为每个插值点在插值过程中的权重,可以将所有点此字段值设置为 1,即所有点在整体插值中权重相同。 + * 当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + */ + this.zValueFieldName = null; + + /** + * @member {number} [InterpolationAnalystParameters.prototype.zValueScale=1] + * @description 用于进行插值分析值的缩放比率。 + * 参加插值分析的值将乘以该参数值后再进行插值,也就是对进行插值分析的值进行统一的扩大或缩小。 + */ + this.zValueScale = 1; + + /** + * @member {number} InterpolationAnalystParameters.prototype.resolution + * @description 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * 该值不能超过待分析数据集的范围边长。 + * 且该值设置时,应该考虑点数据集范围大小来取值,一般为结果栅格行列值(即结果栅格数据集范围除以分辨率),在 500 以内可以较好地体现密度走势。 + */ + this.resolution = null; + + /** + * @member {FilterParameter} [InterpolationAnalystParameters.prototype.filterQueryParameter] + * @description 过滤条件,对分析数据集中的点进行过滤,设置为 null 表示对数据集中的所有点进行分析。 + */ + this.filterQueryParameter = null; + + /** + * @member {string} InterpolationAnalystParameters.prototype.outputDatasetName + * @description 插值分析结果数据集的名称。 + */ + this.outputDatasetName = null; + + /** + * @member {string} InterpolationAnalystParameters.prototype.outputDatasourceName + * @description 插值分析结果数据源的名称。 + */ + this.outputDatasourceName = null; + + /** + * @member {PixelFormat} [InterpolationAnalystParameters.prototype.pixelFormat] + * @description 指定结果栅格数据集存储的像素格式。支持存储的像素格式有 BIT16、BIT32、DOUBLE、SINGLE、UBIT1、UBIT4、UBIT8、UBIT24、UBIT32。 + */ + this.pixelFormat = null; + + /** + * @member {string} [InterpolationAnalystParameters.prototype.dataset] + * @description 用来做插值分析的数据源中数据集的名称,该名称用形如 "数据集名称@数据源别名" 形式来表示。 + * 当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + */ + this.dataset = null; + + /** + * @member {Array.>} [InterpolationAnalystParameters.prototype.inputPoints] + * @description 用于做插值分析的离散点(离散点包括Z值)集合。 + * 当插值分析类型(InterpolationAnalystType)为 geometry 时,此参数为必设参数。 + * 通过离散点直接进行插值分析不需要指定输入数据集inputDatasourceName,inputDatasetName以及zValueFieldName。 + */ + this.inputPoints = null; + + /** + * @member {string} [InterpolationAnalystParameters.prototype.InterpolationAnalystType="dataset"] + * @description 插值分析类型。差值分析包括数据集插值分析和几何插值分析两类, + * "dataset" 表示对数据集进行插值分析,"geometry" 表示对离散点数组进行插值分析。 + */ + this.InterpolationAnalystType = "dataset"; + + /** + * @member {ClipParameter} InterpolationAnalystParameters.prototype.clipParam + * @description 对插值分析结果进行裁剪的参数。 + */ + this.clipParam = null; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.InterpolationAnalystParameters"; + } + + /** + * @function InterpolationAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.bounds = null; + me.searchRadius = null; + me.zValueFieldName = null; + me.zValueScale = null; + + me.resolution = null; + me.filterQueryParameter = null; + me.outputDatasetName = null; + me.pixelFormat = null; + } + + /** + * @function InterpolationAnalystParameters.toObject + * @param {InterpolationAnalystParameters} interpolationAnalystParameters - 插值分析参数类。 + * @param {InterpolationAnalystParameters} tempObj - 插值分析参数对象。 + * @description 将插值分析参数对象转换成 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(interpolationAnalystParameters, tempObj) { + for (var name in interpolationAnalystParameters) { + if (name === "inputPoints" && interpolationAnalystParameters.InterpolationAnalystType === "geometry") { + var objs = []; + for (var i = 0; i < interpolationAnalystParameters.inputPoints.length; i++) { + var item = interpolationAnalystParameters.inputPoints[i]; + var obj = { + x: item.x, + y: item.y, + z: item.tag + }; + objs.push(obj); + } + tempObj[name] = objs; + } else { + tempObj[name] = interpolationAnalystParameters[name]; + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationRBFAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class InterpolationRBFAnalystParameters + * @deprecatedclass SuperMap.InterpolationRBFAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 样条插值(径向基函数插值法)分析参数类。 + * @extends {InterpolationAnalystParameters} + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 存储用于进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.smooth=0.1] - 光滑系数,该值表示插值函数曲线与点的逼近程度,值域为0到1。 + * @param {number} [options.tension=40] - 张力系数,用于调整结果栅格数据表面的特性。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置参与差值运算的点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置参与运算点的查找范围。 + * @param {number} [options.maxPointCountForInterpolation=200] - 【块查找】方式下,设置最多参与插值的点数。 + * @param {number} [options.maxPointCountInNode=50] - 【块查找】方式下,设置单个块内最多参与运算点数。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如”数据集名称@数据源别名”形式来表示。当插值分析类型(InterpolationAnalystType)为 dataset 时。此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystType)为 geometry 时。此为必选参数。 + * @example + * var myInterpolationRBFAnalystParameters = new InterpolationRBFAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * smooth: 0.1, + * tension: 40, + * searchMode: "QUADTREE", + * maxPointCountForInterpolation: 20, + * maxPointCountInNode: 5, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myRBF" + * }); + * @usage + */ +class InterpolationRBFAnalystParameters extends InterpolationAnalystParameters { + + constructor(options) { + super(options); + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.smooth=0.1] + * @description 光滑系数,值域为 0 到 1,常用取值如 0、0.001、0.01、0.1、和 0.5。 + * 该值表示插值函数曲线与点的逼近程度,此数值越大,函数曲线与点的偏差越大,反之越小。 + */ + this.smooth = 0.1; + + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.tension=40] + * @description 张力系数,常用取值如 0、1、5 和 10。 + * 用于调整结果栅格数据表面的特性,张力越大,插值时每个点对计算结果影响越小,反之越大。 + */ + this.tension = 40; + + /** + * @member {SearchMode} InterpolationRBFAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。必设参数。 + * 具体如下: + * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。 + * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。 + * {QUADTREE} 使用 QUADTREE 方式查找参与内插分析的点(块查找)。 + */ + this.searchMode = null; + + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + */ + this.expectedCount = 12; + + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.maxPointCountForInterpolation=200] + * @description 【块查找】方式下,最多参与插值的点数。 + */ + this.maxPointCountForInterpolation = 200; + + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.maxPointCountInNode=50] + * @description 【块查找】方式下,单个块内最多参与运算点数。 + */ + this.maxPointCountInNode = 50; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.InterpolationRBFAnalystParameters"; + + } + + + /** + * @function InterpolationRBFAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.smooth = null; + me.tension = null; + me.searchMode = null; + me.expectedCount = null; + me.maxPointCountForInterpolation = null; + me.maxPointCountInNode = null; + } + + /** + * @function InterpolationRBFAnalystParameters.toObject + * @param {InterpolationRBFAnalystParameters} datasetInterpolationRBFAnalystParameters - 样条插值(径向基函数插值法)分析参数类 + * @param {InterpolationRBFAnalystParameters} tempObj - 样条插值(径向基函数插值法)分析参数对象 + * @description 将样条插值(径向基函数插值法)分析参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(datasetInterpolationRBFAnalystParameters, tempObj) { + for (var name in datasetInterpolationRBFAnalystParameters) { + tempObj[name] = datasetInterpolationRBFAnalystParameters[name]; + + } + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationDensityAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class InterpolationDensityAnalystParameters + * @deprecatedclass SuperMap.InterpolationDensityAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 点密度差值分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {number} [options.searchRadius=0] - 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时。此为必选参数。 + * @param {number} [options.zValueScale=1] - 进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 用来做插值分析的数据源中数据集的名称,该名称用形如 "数据集名称@数据源别名" 形式来表示。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 geometry 时,此为必选参数。 + * @extends {InterpolationAnalystParameters} + * @example + * var myInterpolationDensityAnalystParameters = new InterpolationDensityAnalystParameters({ + * dataset: "SamplesP@Interpolation", + * searchRadius: "100000", + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myDensity" + * }); + * @usage + */ +class InterpolationDensityAnalystParameters extends InterpolationAnalystParameters { + + + constructor(options) { + super(options); + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.InterpolationDensityAnalystParameters"; + } + + /** + * @function InterpolationDensityAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationIDWAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class InterpolationIDWAnalystParameters + * @deprecatedclass SuperMap.InterpolationIDWAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 反距离加权插值(IDW)分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,支持固定点数查找、定长查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {number} [options.power=2] - 距离权重计算的幂次。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如”数据集名称@数据源别名”形式来表示。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(SuperMap.InterpolationAnalystType)为 geometry 时,此为必选参数。 + * @extends {InterpolationAnalystParameters} + * @example 例如: + * var myInterpolationIDWAnalystParameters = new InterpolationIDWAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * power: 2, + * searchMode: "KDTREE_FIXED_COUNT", + * expectedCount: 12, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myIDW" + * }); + * @usage + */ +class InterpolationIDWAnalystParameters extends InterpolationAnalystParameters { + + + + constructor(options) { + super(options); + /** + * @member {number} [InterpolationIDWAnalystParameters.prototype.power=2] + * @description 距离权重计算的幂次。 + * 该值决定了权值下降的速度,幂次越大,随距离的增大权值下降越快,距离预测点越远的点的权值也越小。 + * 理论上,参数值必须大于0,但是0.5到3之间时运算结果更合理,因此推荐值为0.5~3。 + */ + this.power = 2; + + /** + * @member {SearchMode} InterpolationIDWAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,支持固定点数查找、定长查找。 + * 具体如下: + * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。 + * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。 + */ + this.searchMode = null; + + /** + * @member {number} [InterpolationIDWAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + */ + this.expectedCount = 12; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.InterpolationIDWAnalystParameters"; + } + + /** + * @function InterpolationIDWAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.power = null; + me.searchMode = null; + me.expectedCount = null; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationKrigingAnalystParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class InterpolationKrigingAnalystParameters + * @deprecatedclass SuperMap.InterpolationKrigingAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 克吕金插值分析参数类。通过该类可以设置克吕金插值分析所需的参数。 + * 克吕金(Kriging)法为地统计学上一种空间数据内插处理方法,主要的目的是利用各数据点间变异数(variance)的大小来推求某一未知点与各已知点的权重关系, + * 再由各数据点的值和其与未知点的权重关系推求未知点的值。Kriging 法最大的特色不仅是提供一个最小估计误差的预测值,并且可明确的指出误差值的大小。 + * 一般而言,许多地质参数,如地形面,本身即具有连续性,故在一段距离内的任两点必有空间上的关系。反之,在一不规则面上的两点若相距甚远, + * 则在统计意义上可视为互为独立 (stastically indepedent)。这种随距离而改变的空间上连续性,可用半变异图 (semivariogram) 来表现。 + * 因此,若想由已知的散乱点来推求某一未知点的值,则可利用半变异图推求各已知点与未知点的空间关系,即以下四个参数:
+ * 1.块金值(nugget):当采样点间距为0时,理论上半变异函数值为0,但时间上两采样点非常接近时半变异函数值并不为0,即产生了上图所示的块金效应, + * 对应的半变异函数值为块金值。块金值可能由于测量误差或者空间变异产生。
+ * 2.基台值(sill):随着采样点间距的不断增大,半变异函数的值趋向一个稳定的常数,该常数成为基台值。到达基台值后,半变异函数的值不再随采样点间距而改变, + * 即大于此间距的采样点不再具有空间相关性。
+ * 3.偏基台值:基台值与块金值的差值。
+ * 4.自相关阈值(range):也称变程,是半变异函数值达到基台值时,采样点的间距。超过自相关阈值的采样点不再具有空间相关性,将不对预测结果产生影响。
+ * 然后,由此空间参数推求半变异数,由各数据点间的半变异数可推求未知点与已知点间的权重关系,进而推求出未知点的值。 + * 克吕金法的优点是以空间统计学作为其坚实的理论基础,物理含义明确;不但能估计测定参数的空间变异分布,而且还可以估算参数的方差分布。克吕金法的缺点是计算步骤较烦琐, + * 计算量大,且变异函数有时需要根据经验人为选定。 + * + * 由上述可知,半变异函数是克吕金插值的关键,因此选择合适的半变异函数模型非常重要,SuperMap 提供了以下三种半变异函数模型:
+ * 1.指数型(EXPONENTIAL):适用于空间相关关系随样本间距的增加成指数递减的情况,其空间自相关关系在样本间距的无穷远处完全消失。
+ * 2.球型(SPHERICAL):适用于空间自相关关系随样本间距的增加而逐渐减少,直到超出一定的距离时空间自相关关系消失的情况。
+ * 3.高斯型(GAUSSIAN):适用于半变异函数值渐进地逼近基台值的情况。
+ * + * 半变异函数中,有一个关键参数即插值的字段值的期望(平均值),由于对于此参数的不同处理方法而衍生出了不同的 Kriging 方法。SuperMap的差值功能基于以下三种常用 Kriging 算法:
+ * 1.简单克吕金(Simple Kriging):该方法假定用于插值的字段值的期望(平均值)已知的某一常数。
+ * 2.普通克吕金(Kriging):该方法假定用于插值的字段值的期望(平均值)未知且恒定。它利用一定的数学函数,通过对给定的空间点进行拟合来估算单元格的值, + * 生成格网数据集。它不仅可以生成一个表面,还可以给出预测结果的精度或者确定性的度量。因此,此方法计算精度较高,常用于地学领域。 + * 3.泛克吕金(Universal Kriging):该方法假定用于插值的字段值的期望(平均值)是未知的变量。在样点数据中存在某种主导趋势且该趋势可以通过某一个确定 + * 的函数或者多项式进行拟合的情况下,适用泛克吕金插值法。
+ * @param {Object} options - 参数。 + * @param {string} options.type - 克吕金插值的类型。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 存储用于进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.mean] - 【简单克吕金】类型下,插值字段的平均值。 + * @param {number} [options.angle=0] - 克吕金算法中旋转角度值。 + * @param {number} [options.nugget=0] - 克吕金算法中块金效应值。 + * @param {number} [options.range=0] - 克吕金算法中自相关阈值,单位与原数据集单位相同。 + * @param {number} [options.sill=0] - 克吕金算法中基台值。 + * @param {string} [options.variogramMode="SPHERICAL"] - 克吕金插值时的半变函数类型。 + * @param {string} [options.exponent='exp1'] - 【泛克吕金】类型下,用于插值的样点数据中趋势面方程的阶数,可选值为 exp1、exp2。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置待查找的点数;【定长查找】方式下,设置查找的最小点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置参与运算点的查找范围。 + * @param {number} [options.maxPointCountForInterpolation=200] - 【块查找】方式下,设置最多参与插值的点数。 + * @param {number} [options.maxPointCountInNode=50] - 【块查找】方式下,设置单个块内最多参与运算点数。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如 ”数据集名称@数据源别名” 形式来表示。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 geometry 时。 + * @extends {InterpolationAnalystParameters} + * @example 例如: + * var myInterpolationKrigingAnalystParameters = new InterpolationKrigingAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * type: "KRIGING", + * angle: 0, + * mean: 5, + * nugget: 30, + * range: 50, + * sill: 300, + * variogramMode: "EXPONENTIAL", + * searchMode: "QUADTREE", + * maxPointCountForInterpolation: 20, + * maxPointCountInNode: 5, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 30000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myKriging" + * }); + * @usage + */ +class InterpolationKrigingAnalystParameters extends InterpolationAnalystParameters { + + constructor(options) { + super(options); + /** + * @member {InterpolationAlgorithmType} InterpolationKrigingAnalystParameters.prototype.type + * @description 克吕金插值的类型。 + * 具体如下:
+ * {KRIGING} 普通克吕金插值法。 + * {SimpleKriging} 简单克吕金插值法。 + * {UniversalKriging} 泛克吕金插值法。 + */ + this.type = null; + + /** + * @member {number} InterpolationKrigingAnalystParameters.prototype.mean + * @description 【简单克吕金】方式下,插值字段的平均值。 + * 即采样点插值字段值总和除以采样点数目。 + */ + this.mean = null; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.angle=0] + * @description 克吕金算法中旋转角度值。 + * 此角度值指示了每个查找邻域相对于水平方向逆时针旋转的角度。 + */ + this.angle = 0; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.nugget=0] + * @description 克吕金算法中块金效应值。 + */ + this.nugget = 0; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.range=0] + * @description 克吕金算法中自相关阈值,单位与原数据集单位相同。 + */ + this.range = 0; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.sill=0] + * @description 克吕金算法中基台值。 + */ + this.sill = 0; + + /** + * @member {VariogramMode} [InterpolationKrigingAnalystParameters.prototype.variogramMode=VariogramMode.SPHERICAL] + * @description 克吕金插值时的半变函数类型。 + * 用户所选择的半变函数类型会影响未知点的预测,特别是曲线在原点处的不同形状有重要意义。 + * 曲线在原点处越陡,则较近领域对该预测值的影响就越大,因此输出表面就会越不光滑。 + */ + this.variogramMode = VariogramMode.SPHERICAL; + + /** + * @member {Exponent} [InterpolationKrigingAnalystParameters.prototype.exponent=Exponent.EXP1] + * @description 【泛克吕金】类型下,用于插值的样点数据中趋势面方程的阶数。 + */ + this.exponent = Exponent.EXP1; + + /** + * @member {SearchMode} InterpolationKrigingAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。此为必选参数。 + * 简单克吕金和泛克吕金不支持块查找。 + * 具体如下:
+ * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。
+ * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。
+ * {QUADTREE} 使用 QUADTREE 方式查找参与内插分析的点(块查找)。 + */ + this.searchMode = null; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数,默认值为12。 + * 【定长查找】方式下,设置查找的最小点数,默认值为12。 + */ + this.expectedCount = 12; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.maxPointCountForInterpolation=200] + * @description 【块查找】方式下,最多参与插值的点数。 + * 仅用于普通克吕金插值,简单克吕金和泛克吕金不支持块查找。 + */ + this.maxPointCountForInterpolation = 200; + + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.maxPointCountInNode=50] + * @description 【块查找】方式下,设置单个块内最多参与运算点数。 + * 仅用于普通克吕金插值,简单克吕金和泛克吕金不支持块查找。 + */ + this.maxPointCountInNode = 50; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.InterpolationKrigingAnalystParameters"; + } + + /** + * @function InterpolationKrigingAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.type = null; + me.mean = null; + me.angle = null; + me.nugget = null; + me.range = null; + me.sill = null; + me.variogramMode = null; + me.exponent = null; + me.searchMode = null; + me.expectedCount = null; + me.maxPointCountForInterpolation = null; + me.maxPointCountInNode = null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class InterpolationAnalystService + * @deprecatedclass SuperMap.InterpolationAnalystService + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 插值分析服务类。 + * 插值分析可以将有限的采样点数据,通过插值算法对采样点周围的数值情况进行预测,可以掌握研究区域内数据的总体分布状况,从而使采样的离散点不仅仅反映其所在位置的数值情况, + * 还可以反映区域的数值分布。目前SuperMap iServer的插值功能提供从点数据集插值得到栅格数据集的功能,支持以下常用的内插方法, + * 包括:反距离加权插值、克吕金(Kriging)插值法、样条(径向基函数,Radial Basis Function)插值、点密度插值。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myTInterpolationAnalystService = new InterpolationAnalystService(url); + * myTInterpolationAnalystService.events.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ +class InterpolationAnalystService extends SpatialAnalystBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} InterpolationAnalystService.prototype.mode + * @description 插值分析类型。 + */ + + this.mode = null; + if (options) { + Util.extend(this, options); + } + } + + /** + * @function InterpolationAnalystService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + this.mode = null; + this.CLASS_NAME = "SuperMap.InterpolationAnalystService"; + } + + /** + * @function InterpolationAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {InterpolationDensityAnalystParameters|InterpolationIDWAnalystParameters|InterpolationRBFAnalystParameters|InterpolationKrigingAnalystParameters} parameter - 插值分析参数类。 + */ + processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof InterpolationDensityAnalystParameters) { + me.mode = 'Density'; + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/density'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/density'); + } + } else if (parameter instanceof InterpolationIDWAnalystParameters) { + me.mode = 'IDW'; + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/idw'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/idw'); + } + } else if (parameter instanceof InterpolationRBFAnalystParameters) { + me.mode = 'RBF'; + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/rbf'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/rbf'); + } + } else if (parameter instanceof InterpolationKrigingAnalystParameters) { + me.mode = 'Kriging'; + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/kriging'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/kriging'); + } + } + InterpolationAnalystParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/KernelDensityJobParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class KernelDensityJobParameter + * @deprecatedclass SuperMap.KernelDensityJobParameter + * @category iServer ProcessingService DensityAnalyst + * @classdesc 核密度分析服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.fields - 权重索引。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {number} [options.resolution=80] - 分辨率。 + * @param {number} [options.method=0] - 分析方法。 + * @param {number} [options.meshType=0] - 分析类型。 + * @param {number} [options.radius=300] - 分析的影响半径。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class KernelDensityJobParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} KernelDensityJobParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject} [KernelDensityJobParameter.prototype.query] + * @description 分析范围。 + */ + this.query = ""; + + /** + * @member {number} [KernelDensityJobParameter.prototype.resolution=80] + * @description 网格大小。 + */ + this.resolution = 80; + + /** + * @member {number} [KernelDensityJobParameter.prototype.method=0] + * @description 分析方法。 + */ + this.method = 0; + + /** + * @member {number} [KernelDensityJobParameter.prototype.meshType=0] + * @description 分析类型。 + */ + this.meshType = 0; + + /** + * @member {string} KernelDensityJobParameter.prototype.fields + * @description 权重索引。 + */ + this.fields = ""; + + /** + * @member {number} [KernelDensityJobParameter.prototype.radius=300] + * @description 分析的影响半径。 + */ + this.radius = 300; + + /** + * @member {AnalystSizeUnit} [KernelDensityJobParameter.prototype.meshSizeUnit=AnalystSizeUnit.METER] + * @description 网格大小单位。 + */ + this.meshSizeUnit = AnalystSizeUnit.METER; + + /** + * @member {AnalystSizeUnit} [KernelDensityJobParameter.prototype.radiusUnit=AnalystSizeUnit.METER] + * @description 搜索半径单位。 + */ + this.radiusUnit = AnalystSizeUnit.METER; + + /** + * @member {AnalystAreaUnit} [KernelDensityJobParameter.prototype.areaUnit=AnalystAreaUnit.SQUAREMILE] + * @description 面积单位。 + */ + this.areaUnit = AnalystAreaUnit.SQUAREMILE; + + /** + * @member {OutputSetting} KernelDensityJobParameter.prototype.output + * @description 输出参数设置类 + */ + this.output = null; + + /** + * @member {MappingParameters} [KernelDensityJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.KernelDensityJobParameter"; + } + + /** + * @function KernelDensityJobParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.query = null; + this.resolution = null; + this.method = null; + this.radius = null; + this.meshType = null; + this.fields = null; + this.meshSizeUnit = null; + this.radiusUnit = null; + this.areaUnit = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function KernelDensityJobParameter.toObject + * @param {KernelDensityJobParameter} kernelDensityJobParameter - 核密度分析服务参数类。 + * @param {KernelDensityJobParameter} tempObj - 核密度分析服务参数对象。 + * @description 将核密度分析服务参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + static toObject(kernelDensityJobParameter, tempObj) { + for (var name in kernelDensityJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = kernelDensityJobParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = kernelDensityJobParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + if (name === 'query' && kernelDensityJobParameter[name]) { + tempObj['analyst'][name] = kernelDensityJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = kernelDensityJobParameter[name]; + } + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = kernelDensityJobParameter[name]; + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/KernelDensityJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class KernelDensityJobsService + * @deprecatedclass SuperMap.KernelDensityJobsService + * @category iServer ProcessingService DensityAnalyst + * @classdesc 核密度分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class KernelDensityJobsService extends ProcessingServiceBase { + + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/density'); + this.CLASS_NAME = "SuperMap.KernelDensityJobsService"; + } + + /** + * @function KernelDensityJobsService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function KernelDensityJobsService.prototype.getKernelDensityJobs + * @description 获取核密度分析任务 + */ + getKernelDensityJobs() { + super.getJobs(this.url); + } + + /** + * @function KernelDensityJobsService.prototype.getKernelDensityJobs + * @description 获取指定id的核密度分析服务 + * @param {string} id - 指定要获取数据的id + */ + getKernelDensityJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function KernelDensityJobsService.prototype.addKernelDensityJob + * @description 新建核密度分析服务 + * @param {KernelDensityJobParameter} params - 核密度分析服务参数类。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addKernelDensityJob(params, seconds) { + super.addJob(this.url, params, KernelDensityJobParameter, seconds); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/LabelMatrixCell.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LabelMatrixCell + * @deprecatedclass SuperMap.LabelMatrixCell + * @category iServer Map Theme + * @classdesc 矩阵标签元素抽象类。该类可以包含 n*n 个矩阵标签元素,矩阵标签元素的类型可以是图片,符号,标签专题图等。 + * 符号类型的矩阵标签元素类、图片类型的矩阵标签元素类和专题图类型的矩阵标签元素类均继承自该类。 + * @usage + */ +class LabelMatrixCell { + constructor() { + this.CLASS_NAME = "LabelMatrixCell"; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/LabelImageCell.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LabelImageCell + * @deprecatedclass SuperMap.LabelImageCell + * @category iServer Map Theme + * @classdesc 图片类型的矩阵标签元素类。该类继承自 {@link LabelMatrixCell}类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图(ThemeLabel)的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options - 可选参数。 + * @param {number} [options.height=0] - 设置图片的高度,单位为毫米。 + * @param {string} [options.pathField] - 设置矩阵标签元素所使用图片的路径。 + * @param {number} [options.rotation=0.0] - 图片的旋转角度。逆时针方向为正方向,单位为度,精确到0.1度。 + * @param {number} [options.width=0] - 设置图片的宽度,单位为毫米。 + * @param {boolean} [options.sizeFixed=false] - 是否固定图片的大小。 + * @usage + */ +class LabelImageCell extends LabelMatrixCell { + + constructor(options) { + super(options); + /** + * @member {number} LabelImageCell.prototype.height + * @description 设置图片的高度,单位为毫米。 + */ + this.height = 0; + + /** + * @member {string} LabelImageCell.prototype.pathField + * @description 设置矩阵标签元素所使用的图片路径对应的字段名。 + */ + this.pathField = null; + + /** + * @member {number} [LabelImageCell.prototype.rotation=0.0] + * @description 图片的旋转角度。逆时针方向为正方向,单位为度,精确到0.1度。 + */ + this.rotation = 0.0; + + /** + * @member {number} LabelImageCell.prototype.width + * @description 设置图片的宽度,单位为毫米。 + */ + this.width = 0; + + /** + * @member {boolean} [LabelImageCell.prototype.sizeFixed=false] + * @description 是否固定图片的大小。 + */ + this.sizeFixed = false; + + /** + * @member {string} LabelImageCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + this.type = "IMAGE"; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LabelImageCell"; + } + + /** + * @function LabelImageCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.height = null; + me.pathField = null; + me.rotation = null; + me.width = null; + me.sizeFixed = null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/LabelSymbolCell.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class LabelSymbolCell + * @deprecatedclass SuperMap.LabelSymbolCell + * @category iServer Map Theme + * @classdesc 符号类型的矩阵标签元素类。 + * 该类继承自 {@link LabelMatrixCell}类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图({@link ThemeLabel})的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 属是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options - 参数。 + * @param {ServerStyle} options.style - 获取或设置符号样式。 + * @param {string} options.symbolIDField - 符号 ID 或符号 ID 所对应的字段名称。 + * @usage + */ +class LabelSymbolCell extends LabelMatrixCell { + + constructor(options) { + super(options); + /** + * @member {ServerStyle} LabelSymbolCell.prototype.style + * @description 获取或设置符号样式—— {@link ServerStyle} 对象,包括符号大小({@link ServerStyle#markerSize}) + * 和符号旋转({@link ServerStyle#markerAngle})角度,其中用于设置符号 ID 的属性({@link ServerStyle#markerSymbolID})在此处不起作用。 + */ + this.style = new ServerStyle(); + + /** + * @member {string} LabelSymbolCell.prototype.symbolIDField + * @description 获取或设置符号 ID 或符号 ID 所对应的字段名称。 + */ + this.symbolIDField = null; + + /** + * @member {string} LabelSymbolCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + this.type = "SYMBOL"; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LabelSymbolCell"; + } + + /** + * @function LabelSymbolCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.style) { + me.style.destroy(); + me.style = null; + } + me.symbolIDField = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/LabelThemeCell.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class LabelThemeCell + * @deprecatedclass SuperMap.LabelThemeCell + * @category iServer Map Theme + * @classdesc 专题图类型的矩阵标签元素类。 + * 该类继承自 {@link LabelMatrixCell} 类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图({@link ThemeLabel})的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 属是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options -参数。 + * @param {ThemeLabel} options.themeLabel - 作为矩阵标签元素的标签专题图类。 + * @usage + */ +class LabelThemeCell extends LabelMatrixCell { + + + constructor(options) { + super(options); + /** + * @member {ThemeLabel} LabelThemeCell.prototype.themeLabel + * @description 使用专题图对象作为矩阵标签的一个元素。 + */ + this.themeLabel = new ThemeLabel(); + + /** + * @member {string} LabelThemeCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + this.type = "THEME"; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = " SuperMap.LabelThemeCell"; + } + + /** + * @function LabelThemeCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.themeLabel) { + me.themeLabel.destroy(); + me.themeLabel = null; + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/LayerStatus.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LayerStatus + * @deprecatedclass SuperMap.LayerStatus + * @category iServer Map TempLayersSet + * @classdesc 子图层显示参数类。该类存储了各个子图层的名字和是否可见的状态。 + * @param {Object} options - 参数。 + * @param {string} options.layerName - 图层名称。 + * @param {boolean} [options.isVisible=true] - 图层是否可见,true 表示可见。 + * @param {string} [options.displayFilter] - 图层显示 SQL 过滤条件。 + * @usage + */ +class LayerStatus { + + constructor(options) { + /** + * @member {string} LayerStatus.prototype.layerName + * @description 获取或设置图层名称。 + */ + this.layerName = null; + + /** + * @member {boolean} LayerStatus.prototype.isVisible + * @description 获取或设置图层是否可见,true 表示可见。 + */ + this.isVisible = null; + + /** + * @member {string} [LayerStatus.prototype.displayFilter] + * @description 图层显示 SQL 过滤条件,如 layerStatus.displayFilter = "smid < 10",表示仅显示 smid 值小于 10 的对象。 + */ + this.displayFilter = null; + + /** + * @member {Object} [LayerStatus.prototype.fieldValuesDisplayFilter] + * @property {Array.} values - 要过滤的值。 + * @property {string} fieldName - 要过滤的字段名称只支持数字类型的字段。 + * @property {string} fieldValuesDisplayMode - 目前有两个 DISPLAY/DISABLE。当为 DISPLAY 时,表示只显示以上设置的相应属性值的要素,否则表示不显示以上设置的相应属性值的要素。 + */ + + this.fieldValuesDisplayFilter = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.LayerStatus"; + } + + /** + * @function LayerStatus.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.layerName = null; + me.isVisible = null; + me.displayFilter = null; + } + + + /** + * @function LayerStatus.prototype.toJSON + * @description 生成对应的 JSON。 + * @returns {Object} 对应的 JSON。 + */ + toJSON() { + var json = '{'; + json += '"type":"UGC",'; + var v = []; + if (this.layerName) { + v.push('"name":"' + this.layerName + '"'); + v.push('"visible":' + this.isVisible); + } + + if (this.displayFilter) { + v.push('"displayFilter":"' + this.displayFilter + '"'); + } + + if (this.minScale || this.minScale == 0) { + v.push('"minScale":' + this.minScale); + } + + if (this.maxScale || this.maxScale == 0) { + v.push('"maxScale":' + this.maxScale); + } + + if (this.fieldValuesDisplayFilter) { + v.push('"fieldValuesDisplayFilter":' + Util.toJSON(this.fieldValuesDisplayFilter)); + } + + json += v; + json += '}'; + + return json; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/LinkItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LinkItem + * @deprecatedclass SuperMap.LinkItem + * @constructs LinkItem + * @category iServer Data FeatureResults + * @classdesc 关联信息类。该类用于矢量数据集与外部表的关联。 外部表是另一个数据集(其中纯属性数据集中没有空间几何信息)中的 DBMS 表, + * 矢量数据集与外部表可以属于不同的数据源,但数据源类型目前只支持 SQL Server 和 Oracle 类型。使用 LinkItem 时, + * 空间数据和属性数据必须满足关联条件,即主空间数据集与外部属性表之间存在关联字段。{@link LinkItem} + * 只支持左连接,UDB、PostgreSQL 和 DB2 数据源不支持 {@link LinkItem};另外,用于建立关联关系的两个表可以不在同一个数据源下。注意:
+ * 1.使用 {@link LinkItem} 的约束条件为:空间数据和属性数据必须有关联条件,即主空间数据集与外部属性表之间存在关联字段;
+ * 2.使用外关联表制作专题图时,所关联的字段必须设置表名,例如,如果所关联的字段为 BaseMap_R 数据集的 SmID,就要写成 BaseMap_R.SMID。 + * @param {Object} options - 参数。 + * @param {DatasourceConnectionInfo} options.datasourceConnectionInfo - 关联的外部数据源信息。 + * @param {Array.} options.foreignKeys - 主空间数据集的外键。 + * @param {string} options.foreignTable - 关联的外部属性表的名称。 + * @param {Array.} options.linkFields - 欲保留的外部属性表的字段。 + * @param {string} options.linkFilter - 与外部属性表的连接条件。 + * @param {string} options.name - 此关联信息对象的名称。 + * @param {Array.} options.primaryKeys - 关联的外部属性表的主键。 + * @example 下面以 SQL 查询说明 linkitem 的使用方法: + * function queryBySQL() { + * // 设置关联的外部数据库信息,alias表示数据库别名 + * var dc = new DatasourceConnectionInfo({ + * dataBase: "RelQuery", + * server: "{ip}:{port}", + * user: "sa", + * password: "map", + * driver: "SQL Server", + * connect: true, + * OpenLinkTable: false, + * alias: "RelQuery", + * engineType: EngineType.SQLPLUS, + * readOnly: false, + * exclusive: false + * }); + * // 设置关联信息 + * var linkItem = new LinkItem({ + * datasourceConnectionInfo: dc, + * foreignKeys: ["name"], + * foreignTable: "Pop_2011", + * linkFields: ["SmID as Pid","pop"], + * name: "link", + * primatryKeys: ["name"], + * }); + * // 设置查询参数,在查询参数中添加linkItem关联条件信息 + * var queryParam, queryBySQLParams, queryBySQLService; + * queryParam = new FilterParameter({ + * name: "Province@RelQuery", + * fields: ["SmID","name"], + * attributeFilter: "SmID<7", + * linkItems: [linkItem] + * }), + * queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }), + * queryBySQLService = new QueryBySQLService(url, { + * eventListeners: { + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * } + * function processCompleted(queryEventArgs) {//todo} + * function processFailed(e) {//todo} + * @usage + */ +class LinkItem { + + + constructor(options) { + + /** + * @member {DatasourceConnectionInfo} LinkItem.prototype.datasourceConnectionInfo + * @description 关联的外部数据源信息。 + */ + this.datasourceConnectionInfo = null; + + /** + * @member {Array.} LinkItem.prototype.foreignKeys + * @description 主空间数据集的外键。 + */ + this.foreignKeys = null; + + /** + * @member {string} LinkItem.prototype.foreignTable + * @description 关联的外部属性表的名称,目前仅支持 Supermap 管理的表,即另一个矢量数据集所对应的 DBMS 表。 + */ + this.foreignTable = null; + + /** + * @member {Array.} LinkItem.prototype.linkFields + * @description 欲保留的外部属性表的字段。如果不设置字段或者设置的字段在外部属性表中不存在的话则不返 + * 回任何外部属性表的属性信息。如果欲保留的外部表字段与主表字段存在同名,则还需要指定一个不存在字段名作为外部表的字段别名。 + */ + this.linkFields = null; + + /** + * @member {string} LinkItem.prototype.linkFilter + * @description 与外部属性表的连接条件。 + */ + this.linkFilter = null; + + /** + * @member {string} LinkItem.prototype.name + * @description 此关联信息对象的名称。 + */ + this.name = null; + + /** + * @member {Array.} LinkItem.prototype.primaryKeys + * @description 需要关联的外部属性表的主键。 + */ + this.primaryKeys = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LinkItem"; + } + + /** + * @function LinkItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + if (me.datasourceConnectionInfo instanceof DatasourceConnectionInfo) { + me.datasourceConnectionInfo.destroy(); + me.datasourceConnectionInfo = null; + } + me.foreignKeys = null; + me.foreignTable = null; + me.linkFields = null; + me.linkFilter = null; + me.name = null; + me.primaryKeys = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/MapService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class MapService + * @deprecatedclass SuperMap.MapService + * @category iServer Map + * @classdesc 地图信息服务类。 + * @extends {CommonServiceBase} + * @example + * var myMapService = new MapService(url, { + * eventListeners:{ + * "processCompleted": MapServiceCompleted, + * "processFailed": MapServiceFailed + * } + * }); + * + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class MapService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} MapService.prototype.projection + * @description 根据投影参数获取地图状态信息。如"EPSG:4326" + */ + this.projection = null; + + this.CLASS_NAME = "SuperMap.MapService"; + if (options) { + Util.extend(this, options); + } + var me = this; + + if (me.projection) { + var arr = me.projection.split(":"); + if (arr instanceof Array) { + if (arr.length === 2) { + me.url = Util.urlAppend(me.url,`prjCoordSys=${encodeURIComponent(`{\"epsgCode\":"${arr[1]}"}`)}`) + } + if (arr.length === 1) { + me.url = Util.urlAppend(me.url,`prjCoordSys=${encodeURIComponent(`{\"epsgCode\":"${arr[0]}"}`)}`) + } + } + } + } + + /** + * @function destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + if (me.events) { + me.events.un(me.eventListeners); + me.events.listeners = null; + me.events.destroy(); + me.events = null; + me.eventListeners = null; + } + } + + /** + * @function MapService.prototype.processAsync + * @description 负责将客户端的设置的参数传递到服务端,与服务端完成异步通讯。 + */ + processAsync() { + var me = this; + me.request({ + method: "GET", + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /* + * Method: getMapStatusCompleted + * 获取地图状态完成,执行此方法。 + * + * Parameters: + * {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + var codeStatus = (result.code >= 200 && result.code < 300) || result.code == 0 || result.code === 304; + var isCodeValid = result.code && codeStatus; + if (!result.code || isCodeValid) { + me.events && me.events.triggerEvent("processCompleted", {result: result}); + } else { + ////在没有token是返回的是200,但是其实是没有权限,所以这里也应该是触发失败事件 + me.events.triggerEvent("processFailed", {error: result}); + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/MathExpressionAnalysisParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class MathExpressionAnalysisParameters + * @deprecatedclass SuperMap.MathExpressionAnalysisParameters + * @category iServer SpatialAnalyst GridMathAnalyst + * @classdesc 栅格代数运算参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 指定栅格代数运算数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示,例如:BaseMap_P@Jingjin。 + * @param {string} options.resultGridName - 指定结果数据集名称。 + * @param {string} options.expression - 指定的栅格运算表达式。如:[DatasourceAlias1.Raster1]*2-10。 + * @param {string} options.targetDatasource - 指定存储结果数据集的数据源。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.extractRegion] - 栅格代数运算的范围,指定数据集中参与栅格代数运算的区域。 + * 如果缺省,则计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域 。 + * @param {boolean} [options.isZip=false] - 是否对结果数据集进行压缩处理。 + * @param {boolean} [options.ignoreNoValue=false] - 是否忽略无值栅格数据。true 表示忽略无值数据,即无值栅格不参与运算。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ +class MathExpressionAnalysisParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} MathExpressionAnalysisParameters.prototype.dataset + * @description 要用来做栅格代数运算数据源中数据集的名称。 + * 该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * + */ + this.dataset = null; + + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [MathExpressionAnalysisParameters.prototype.extractRegion] + * @description 栅格代数运算的范围,指定数据集中参与栅格代数运算的区域。 + * 如果缺省,则计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域 。 + */ + this.extractRegion = null; + + /** + * @member {string} MathExpressionAnalysisParameters.prototype.expression + * @description 指定的栅格运算表达式。如:"[DatasourceAlias1.Raster1]*2-10"。 + */ + this.expression = null; + + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.isZip=false] + * @description 是否对结果数据集进行压缩处理。 + */ + this.isZip = false; + + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.ignoreNoValue=false] + * @description 是否忽略无值栅格数据。 + */ + this.ignoreNoValue = false; + + /** + * @member {string} MathExpressionAnalysisParameters.prototype.targetDatasource + * @description 指定存储结果数据集的数据源。 + */ + this.targetDatasource = null; + + /** + * @member {string} MathExpressionAnalysisParameters.prototype.resultGridName + * @description 指定结果数据集名称。 + */ + this.resultGridName = null; + + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + this.deleteExistResultDataset = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.MathExpressionAnalysisParameters" + } + + + /** + * @function MathExpressionAnalysisParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dataset = null; + me.bounds = null; + me.expression = null; + me.isZip = true; + me.ignoreNoValue = true; + me.targetDatasource = null; + me.resultGridName = null; + me.deleteExistResultDataset = null; + } + + /** + * @function MathExpressionAnalysisParameters.toObject + * @param {Object} mathExpressionAnalysisParameters - 栅格代数运算参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成栅格代数运算对象。 + */ + static toObject(mathExpressionAnalysisParameters, tempObj) { + for (var name in mathExpressionAnalysisParameters) { + if (name !== "dataset") { + tempObj[name] = mathExpressionAnalysisParameters[name]; + } + + if (name === "extractRegion") { + if (mathExpressionAnalysisParameters[name]) { + var bs = mathExpressionAnalysisParameters[name].components[0].components; + var region = {}, + points = [], + type = "REGION"; + + var len = bs.length; + for (var i = 0; i < len - 1; i++) { + var poi = {}; + poi["x"] = bs[i].x; + poi["y"] = bs[i].y; + points.push(poi); + } + + + region["points"] = points; + region["type"] = type; + + tempObj[name] = region; + } + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/MathExpressionAnalysisService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class MathExpressionAnalysisService + * @deprecatedclass SuperMap.MathExpressionAnalysisService + * @category iServer SpatialAnalyst GridMathAnalyst + * @classdesc 栅格代数运算服务类。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myMathExpressionAnalysisService = new MathExpressionAnalysisService(url); + * myMathExpressionAnalysisService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ +class MathExpressionAnalysisService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + + this.CLASS_NAME = "SuperMap.MathExpressionAnalysisService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function MathExpressionAnalysisService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {MathExpressionAnalysisParameters} parameter - 栅格代数运算参数类。 + */ + processAsync(parameter) { + var me = this; + var parameterObject = {}; + + if (parameter instanceof MathExpressionAnalysisParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/mathanalyst'); + } + + MathExpressionAnalysisParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/MeasureParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class MeasureParameters + * @deprecatedclass SuperMap.MeasureParameters + * @category iServer Map Measure + * @classdesc 量算参数类。 + * @param {GeoJSONObject} geometry - 要量算的几何对象。 + * @param {Object} options - 可选参数。 + * @param {Unit} [options.unit=Unit.METER] - 量算单位。 + * @param {string} [options.prjCoordSys] - 用来指定该量算操作所使用的投影。 + * @param {string} [options.distanceMode="Geodesic"] - 用来指定量算的方式为按球面长度 'Geodesic' 或者平面长度 'Planar' 来计算。 + * @usage + */ +class MeasureParameters { + + + + constructor(geometry, options) { + if (!geometry) { + return; + } + /** + * @member {GeoJSONObject} MeasureParameters.prototype.geometry + * @description 要量算的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。 + */ + this.geometry = geometry; + + /** + * @member {Unit} [MeasureParameters.prototype.unit=Unit.METER] + * @description 量算单位。即量算结果以米为单位。 + */ + this.unit = Unit.METER; + + /** + * @member {string} [MeasureParameters.prototype.prjCoordSys] + * @description 用来指定该量算操作所使用的投影。 + */ + this.prjCoordSys = null; + + /** + * @member {string} [MeasureParameters.prototype.distanceMode="Geodesic"] + * @description 用来指定量算的方式为按球面长度 'Geodesic' 或者平面长度 'Planar' 来计算。 + * @example + * var param = new MeasureParameters(getmetry,{distanceMode:'Planar'}); + */ + this.distanceMode = null; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.MeasureParameters"; + } + + /** + * @function MeasureParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.geometry = null; + me.unit = null; + me.prjCoordSys = null; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/MeasureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class MeasureService + * @deprecatedclass SuperMap.MeasureService + * @category iServer Map Measure + * @classdesc 量算服务类。 + * 该类负责将量算参数传递到服务端,并获取服务端返回的量算结果。 + * @extends {CommonServiceBase} + * @example + * var myMeasuerService = new MeasureService(url, { + * measureMode: MeasureMode.DISTANCE, + * eventListeners:{ + * "processCompleted": measureCompleted + * } + * }); + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @param {MeasureMode} options.measureMode - 量算模式,包括距离量算模式和面积量算模式。 + * @usage + */ +class MeasureService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {MeasureMode} [MeasureService.prototype.measureMode=MeasureMode.DISTANCE] + * @description 量算模式,包括距离量算模式和面积量算模式。 + */ + this.measureMode = MeasureMode.DISTANCE; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.MeasureService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + var me = this; + me.measureMode = null; + } + + /** + * @function MeasureService.prototype.processAsync + * @description 负责将客户端的量算参数传递到服务端。 + * @param {MeasureParameters} params - 量算参数。 + */ + processAsync(params) { + if (!(params instanceof MeasureParameters)) { + return; + } + var me = this, + geometry = params.geometry, + pointsCount = 0, + point2ds = null; + if (!geometry) { + return; + } + me.url = Util.urlPathAppend(me.url, me.measureMode === MeasureMode.AREA ? 'area' : 'distance'); + var serverGeometry = ServerGeometry.fromGeometry(geometry); + if (!serverGeometry) { + return; + } + pointsCount = serverGeometry.parts[0]; + point2ds = serverGeometry.points.splice(0, pointsCount); + + var prjCoordSysTemp, prjCodeTemp, paramsTemp; + if (params.prjCoordSys) { + if (typeof (params.prjCoordSys) === "object") { + prjCodeTemp = params.prjCoordSys.projCode; + prjCoordSysTemp = '{"epsgCode"' + prjCodeTemp.substring(prjCodeTemp.indexOf(":"), prjCodeTemp.length) + "}"; + } else if (typeof (params.prjCoordSys) === "string") { + prjCoordSysTemp = '{"epsgCode"' + params.prjCoordSys.substring(params.prjCoordSys.indexOf(":"), params.prjCoordSys.length) + "}"; + } + paramsTemp = { + "point2Ds": Util.toJSON(point2ds), + "unit": params.unit, + "prjCoordSys": prjCoordSysTemp, + "distanceMode": params.distanceMode || 'Geodesic' + }; + } else { + paramsTemp = {"point2Ds": Util.toJSON(point2ds), "unit": params.unit, "distanceMode": params.distanceMode || 'Geodesic'}; + } + + me.request({ + method: "GET", + params: paramsTemp, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/OverlapDisplayedOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OverlapDisplayedOptions + * @deprecatedclass SuperMap.OverlapDisplayedOptions + * @category iServer Map Layer + * @classdesc 地图压盖过滤显示选项。在文本或专题图元素显示较密集的区域,文本之间或专题元素之间会发生相互压盖的现象, + * 该类可以分别控制各种类型的对象的压盖显示情况,进而很好地处理地图中各种类型对象的压盖显示问题。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.allowPointOverlap=true] - 点和点压盖时是否显示压盖的点对象。 + * @param {boolean} [options.allowPointWithTextDisplay=true] - 标签和相应普通图层上的点是否一起过滤显示,如果过滤显示, + * 只以图层集合中对应数据集的索引最小的图层的点风格来绘制点。 + * @param {boolean} [options.allowTextOverlap=false] - 文本压盖时是否显示压盖的文本对象。 + * @param {boolean} [options.allowTextAndPointOverlap=true] - 文本和点压盖时是否显示压盖的文本或点对象(此属性不处理文本之间的压盖和点之间的压盖)。 + * @param {boolean} [options.allowThemeGraduatedSymbolOverlap=false] - 等级符号元素压盖时是否显示压盖的等级符号元素。 + * @param {boolean} [options.allowThemeGraphOverlap=false] - 统计专题图元素压盖时是否显示压盖的统计专题图元素。 + * @param {number} [options.horizontalOverlappedSpaceSize=0] - 两个对象之间的横向压盖间距,单位为 0.1 毫米,跟 verticalOverlappedSpaceSize 结合使用, + * 当两个对象的横向间距小于该值,且纵向间距小于 verticalOverlappedSpaceSize 时认为压盖。 + * @param {number} [options.verticalOverlappedSpaceSize=0] - 两个对象之间的纵向压盖间距,单位为 0.1 毫米,跟 horizontalOverlappedSpaceSize 结合使用, + * 当两个对象的纵向间距小于该值,且横向间距小于 horizontalOverlappedSpaceSize 时认为压盖。 + * @usage + */ +class OverlapDisplayedOptions { + + constructor(options) { + options = options || {}; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowPointOverlap=true] + * @description 点和点压盖时是否显示压盖的点对象。 + */ + this.allowPointOverlap = true; + + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowPointWithTextDisplay=true] + * @description 标签和相应普通图层上的点是否一起过滤显示,如果过滤显示, + * 只以图层集合中对应数据集的索引最小的图层的点风格来绘制点。 + */ + this.allowPointWithTextDisplay = true; + + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowTextOverlap=false] + * @description 文本压盖时是否显示压盖的文本对象。 + */ + this.allowTextOverlap = false; + + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowTextAndPointOverlap=true] + * @description 文本和点压盖时是否显示压盖的文本或点对象(此属性不处理文本之间的压盖和点之间的压盖)。 + */ + this.allowTextAndPointOverlap = true; + + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowThemeGraduatedSymbolOverlap=false] + * @description 等级符号元素压盖时是否显示压盖的等级符号元素。 + */ + this.allowThemeGraduatedSymbolOverlap = false; + + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowThemeGraphOverlap=false] + * @description 统计专题图元素压盖时是否显示压盖的统计专题图元素。 + */ + this.allowThemeGraphOverlap = false; + + /** + * @member {number} [OverlapDisplayedOptions.prototype.horizontalOverlappedSpaceSize=0] + * @description 两个对象之间的横向压盖间距,单位为0.1毫米,跟 verticalOverlappedSpaceSize 结合使用, + * 当两个对象的横向间距小于该值,且纵向间距小于 verticalOverlappedSpaceSize 时认为压盖。 + */ + this.horizontalOverlappedSpaceSize = 0; + + /** + * @member {number} [OverlapDisplayedOptions.prototype.verticalOverlappedSpaceSize=0] + * @description 两个对象之间的纵向压盖间距,单位为0.1毫米,跟 horizontalOverlappedSpaceSize 结合使用, + * 当两个对象的纵向间距小于该值,且横向间距小于 horizontalOverlappedSpaceSize 时认为压盖。 + */ + this.verticalOverlappedSpaceSize = 0; + + Util.extend(this, options); + this.ugcLayer = new UGCLayer(options); + + this.CLASS_NAME = "SuperMap.OverlapDisplayedOptions"; + } + + /** + * @function OverlapDisplayedOptions.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + + /** + * @function OverlapDisplayedOptions.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + fromJson(jsonObject) { + this.ugcLayer.fromJson.apply(this, [jsonObject]); + } + + + /** + * @function OverlapDisplayedOptions.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var jsonObject = this.ugcLayer.toServerJSONObject.apply(this, arguments); + return jsonObject; + } + + + /** + * @function OverlapDisplayedOptions.prototype.toString + * @description 转换成对应的 tileLayer 请求瓦片时 overlapDisplayedOptions 参数。 + * @returns {string} 对应的 tileLayer 请求瓦片时 overlapDisplayedOptions 参数。 + */ + + toString() { + var jsonObject = this.ugcLayer.toServerJSONObject.apply(this, arguments); + var str = "{"; + for (var attr in jsonObject) { + if (jsonObject.hasOwnProperty(attr)) { + str += "'" + attr + "':" + jsonObject[attr] + ","; + } + } + str = str.substr(0, str.length - 1); + str += "}"; + return str; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/OverlayAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class OverlayAnalystService + * @deprecatedclass SuperMap.OverlayAnalystService + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 叠加分析服务类。 + * 该类负责将客户设置的叠加分析参数传递给服务端,并接收服务端返回的叠加分析结果数据。 + * 叠加分析结果通过该类支持的事件的监听函数参数获取 + * @param {string} url - 服务地址。如http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example 例如: + * (start code) + * var myOverlayAnalystService = new OverlayAnalystService(url, { + * eventListeners: { + * "processCompleted": OverlayCompleted, + * "processFailed": OverlayFailed + * } + * }); + * (end) + * @usage + */ + +class OverlayAnalystService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + + /** + * @member {string} OverlayAnalystService.prototype.mode + * @description 叠加分析类型 + */ + this.mode = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.OverlayAnalystService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + this.mode = null; + } + + /** + * @function OverlayAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {OverlayAnalystParameters} parameter - 叠加分析参数类。 + */ + processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof DatasetOverlayAnalystParameters) { + me.mode = "datasets"; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.sourceDataset + '/overlay'); + DatasetOverlayAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryOverlayAnalystParameters) { + me.mode = "geometry"; + //支持传入多个几何要素进行叠加分析 + if(parameter.operateGeometries && parameter.sourceGeometries){ + me.url = Util.urlPathAppend(me.url, 'geometry/overlay/batch'); + me.url = Util.urlAppend(me.url, 'ignoreAnalystParam=true'); + }else { + me.url = Util.urlPathAppend(me.url, 'geometry/overlay'); + } + GeometryOverlayAnalystParameters.toObject(parameter, parameterObject); + } + me.url = Util.urlAppend(me.url, 'returnContent=true'); + var jsonParameters = Util.toJSON(parameterObject); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/OverlayGeoJobParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class OverlayGeoJobParameter + * @deprecatedclass SuperMap.OverlayGeoJobParameter + * @category iServer ProcessingService OverlayAnalyst + * @classdesc 叠加分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetOverlay - 叠加对象所在的数据集名称。 + * @param {string} options.srcFields - 输入数据需要保留的字段。 + * @param {string} [options.overlayFields] - 叠加数据需要保留的字段。对分析模式为 clip、update、erase 时,此参数无效。 + * @param {string} [options.mode] - 叠加分析模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class OverlayGeoJobParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} OverlayGeoJobParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} OverlayGeoJobParameter.prototype.datasetOverlay + * @description 叠加对象所在的数据集名称。 + */ + this.datasetOverlay = ""; + + /** + * @member {string} [OverlayGeoJobParameter.prototype.mode] + * @description 叠加分析模式。 + */ + this.mode = ""; + + /** + * @member {string} OverlayGeoJobParameter.prototype.srcFields + * @description 输入数据需要保留的字段。 + */ + this.srcFields = ""; + + /** + * @member {string} OverlayGeoJobParameter.prototype.overlayFields + * @description 叠加数据需要保留的字段,对分析模式为 clip、update、erase 时,此参数无效。 + */ + this.overlayFields = ""; + + /** + * @member {OutputSetting} [OverlayGeoJobParameter.prototype.output] + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [OverlayGeoJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OverlayGeoJobParameter"; + } + + /** + * @function OverlayGeoJobParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.datasetOverlay = null; + this.mode = null; + this.srcFields = null; + this.overlayFields = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function OverlayGeoJobParameter.toObject + * @param {Object} OverlayGeoJobParameter - 点聚合分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成点聚合分析任务对象。 + */ + static toObject(OverlayGeoJobParameter, tempObj) { + for (var name in OverlayGeoJobParameter) { + if (name == "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = OverlayGeoJobParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = OverlayGeoJobParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = OverlayGeoJobParameter[name]; + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = OverlayGeoJobParameter[name]; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/OverlayGeoJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class OverlayGeoJobsService + * @deprecatedclass SuperMap.OverlayGeoJobsService + * @category iServer ProcessingService OverlayAnalyst + * @classdesc 叠加分析任务类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {number} options.index - 服务访问地址在数组中的位置。 + * @param {number} options.length - 服务访问地址数组长度。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class OverlayGeoJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/overlay'); + this.CLASS_NAME = 'SuperMap.OverlayGeoJobsService'; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function OverlayGeoJobsService.prototype.getOverlayGeoJobs + * @description 获取叠加分析任务 + */ + getOverlayGeoJobs() { + super.getJobs(this.url); + } + + /** + * @function OverlayGeoJobsService.prototype.getOverlayGeoJob + * @description 获取指定id的叠加分析任务 + * @param {string} id - 指定要获取数据的id + */ + getOverlayGeoJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function OverlayGeoJobsService.prototype.addOverlayGeoJob + * @description 新建点叠加析服务 + * @param {OverlayGeoJobParameter} params - 创建一个叠加分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addOverlayGeoJob(params, seconds) { + super.addJob(this.url, params, OverlayGeoJobParameter, seconds); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByBoundsParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryByBoundsParameters + * @deprecatedclass SuperMap.QueryByBoundsParameters + * @category iServer Map QueryResults + * @classdesc Bounds 查询参数类。该类用于设置 Bounds 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 指定的查询范围。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] -自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ +class QueryByBoundsParameters extends QueryParameters { + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {boolean} [QueryByBoundsParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} QueryByBoundsParameters.prototype.bounds + * @description 指定的查询范围。 + */ + this.bounds = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.QueryByBoundsParameters"; + } + + /** + * @function QueryByBoundsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + if (me.bounds) { + me.bounds = null; + } + + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class QueryService + * @deprecatedclass SuperMap.QueryService + * @category iServer Map QueryResults + * @classdesc 查询服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图查询服务的 URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new QueryService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }; + * @usage + */ +class QueryService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + + /** + * @member {boolean} QueryService.prototype.returnContent + * @description 是否立即返回新创建资源的表述还是返回新资源的URI。 + */ + this.returnContent = false; + + /** + * @member {string} QueryService.prototype.format + * @description 查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式。参数格式为"ISERVER","GEOJSON"。 + */ + this.format = DataFormat.GEOJSON; + + this.returnFeatureWithFieldCaption = false; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.QueryService"; + if (!this.url) { + return; + } + if (options && options.format) { + this.format = options.format.toUpperCase(); + } + this.url = Util.urlPathAppend(this.url,'queryResults'); + } + + /** + * @function QueryService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + me.format = null; + } + + /** + * @function QueryService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {QueryParameters} params - 查询参数。 + */ + processAsync(params) { + if (!(params instanceof QueryParameters)) { + return; + } + var me = this, + returnCustomResult = null, + jsonParameters = null; + me.returnContent = params.returnContent; + + jsonParameters = me.getJsonParameters(params); + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=' + me.returnContent); + } else { + //仅供三维使用 获取高亮图片的bounds + returnCustomResult = params.returnCustomResult; + if (returnCustomResult) { + me.url = Util.urlAppend(me.url, 'returnCustomResult=' + returnCustomResult); + } + } + me.returnFeatureWithFieldCaption = params.returnFeatureWithFieldCaption; + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function QueryService.prototype.serviceProcessCompleted + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + var geoJSONFormat = new GeoJSON(); + if (result && result.recordsets) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + if (me.returnFeatureWithFieldCaption === true) { + recordsets[i].features.map((feature) => { + feature.fieldNames = recordsets[i].fieldCaptions; + return feature; + }) + } + if (me.format === DataFormat.GEOJSON) { + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + } + } + + me.events.triggerEvent("processCompleted", { + result: result + }); + } + + /** + * @function QueryService.prototype.getQueryParameters + * @description 将 JSON 对象表示的查询参数转化为 QueryParameters 对象。 + * @param {Object} params - JSON 字符串表示的查询参数。 + * @returns {QueryParameters} 返回转化后的 QueryParameters 对象。 + */ + getQueryParameters(params) { + return new QueryParameters({ + customParams: params.customParams, + expectCount: params.expectCount, + networkType: params.networkType, + queryOption: params.queryOption, + queryParams: params.queryParams, + startRecord: params.startRecord, + prjCoordSys: params.prjCoordSys, + holdTime: params.holdTime + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByBoundsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class QueryByBoundsService + * @deprecatedclass SuperMap.QueryByBoundsService + * @category iServer Map QueryResults + * @classdesc Bounds 查询服务类。 + * @augments {QueryService} + * @example + * (start end) + * var myQueryByBoundsService = new QueryByBoundsService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * (end) + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。
+ * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class QueryByBoundsService extends QueryService { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.QueryByBoundsService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function QueryByBoundsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds 等)。 + * @param {QueryByBoundsParameters} params - Bounds 查询参数。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + if (!(params instanceof QueryByBoundsParameters)) { + return null; + } + var me = this, + jsonParameters = "", + qp = null, + bounds = params.bounds; + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'BoundsQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters += ",'bounds': {'rightTop':{'y':" + bounds.top + ",'x':" + + bounds.right + "},'leftBottom':{'y':" + bounds.bottom + ",'x':" + bounds.left + "}}"; + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByDistanceParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryByDistanceParameters + * @deprecatedclass SuperMap.QueryByDistanceParameters + * @category iServer Map QueryResults + * @classdesc Distance 查询参数类。 + * 该类用于设置 Distance 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.geometry - 用于查询的几何对象。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {number} options.distance - 查询距离,单位与所查询图层对应的数据集单位相同。距离查询时,表示距离地物的距离。最近地物查询时,表示搜索的范围。此为必选参数。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] -自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] -仅供三维使用。 + * @param {boolean} [options.isNearest=false] - 是否为最近距离查询。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ +class QueryByDistanceParameters extends QueryParameters { + + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {number} [QueryByDistanceParameters.prototype.distance=0] + * @description 查询距离,单位与所查询图层对应的数据集单位相同。 + * 距离查询时,表示距离地物的距离。最近地物查询时,表示搜索的范围。 + */ + + /** + * @member {GeoJSONObject} QueryByDistanceParameters.prototype.geometry + * @description 用于查询的地理对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + this.geometry = null; + + /** + * @member {boolean} [QueryByDistanceParameters.prototype.isNearest=false] + * @description 是否为最近距离查询。
+ * 建议该属性与 expectCount(继承自 {@link QueryParameters})属性联合使用。 + * 当该属性为 true 时,即表示查找最近地物,如果查询结果数大于期望返回的结果记录数(expectCount), + * 则查找结果为查询总记录中距离中心最近的 expectCount 个地物。 + * 当该属性为不为 true 时,如果查询结果数大于期望返回的结果记录数(expectCount), + * 则查找结果为从查询总记录中随机抽取的 expectCount 个地物。 + * 目前查询结果不支持按远近距离排序。 + */ + this.isNearest = null; + + /** + * @member {boolean} [QueryByDistanceParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.QueryByDistanceParameters"; + } + + /** + * @function QueryByDistanceParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + me.distance = null; + me.isNearest = null; + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByDistanceService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class QueryByDistanceService + * @deprecatedclass SuperMap.QueryByDistanceService + * @category iServer Map QueryResults + * @classdesc Distance查询服务类。 + * @extends {QueryService} + * @example + * var myQueryByDistService = new QueryByDistanceService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class QueryByDistanceService extends QueryService { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.QueryByDistanceService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function QueryByDistanceService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryByDistanceParameters} params - Distance 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + if (!(params instanceof QueryByDistanceParameters)) { + return; + } + var me = this, + jsonParameters = "", + qp = me.getQueryParameters(params); + var sg = ServerGeometry.fromGeometry(params.geometry); + + jsonParameters += params.isNearest ? "'queryMode':'FindNearest','queryParameters':" : "'queryMode':'DistanceQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters += ",'geometry':" + Util.toJSON(sg) + ",'distance':" + params.distance; + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByGeometryParameters.js + /* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class QueryByGeometryParameters + * @deprecatedclass SuperMap.QueryByGeometryParameters + * @category iServer Map QueryResults + * @classdesc Geometry 查询参数类。 + * 该类用于设置 Geometry查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {GeoJSONObject} options.geometry - 查询的几何对象。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {Object} [options.prjCoordSys] -自定义参数,供SuperMap Online提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {boolean} [options.returnCustomResult=false] -仅供三维使用。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @param {SpatialQueryMode} [spatialQueryMode=SpatialQueryMode.INTERSECT] - 空间查询模式。 + * @usage + */ +class QueryByGeometryParameters extends QueryParameters { + + + constructor(options) { + options = options || {}; + super(options); + + /** + * @member {boolean} [QueryByGeometryParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。
+ * 如果为 true,则直接返回新创建资源,即查询结果的表述。
+ * 为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + + /** + * @member {GeoJSONObject} QueryByGeometryParameters.prototype.geometry + * @description 用于查询的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + this.geometry = null; + + /** + * @member {SpatialQueryMode} [QueryByGeometryParameters.prototype.spatialQueryMode=SpatialQueryMode.INTERSECT] + * @description 空间查询模式。 + */ + this.spatialQueryMode = SpatialQueryMode.INTERSECT; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.QueryByGeometryParameters"; + } + + /** + * @function QueryByGeometryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + me.geometry = null; + me.spatialQueryMode = null; + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryByGeometryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class QueryByGeometryService + * @deprecatedclass SuperMap.QueryByGeometryService + * @category iServer Map QueryResults + * @classdesc Geometry查询服务类。 + * @extends {QueryService} + * @example + * var myQueryByGeometryService = new QueryByGeometryService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class QueryByGeometryService extends QueryService { + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.QueryByGeometryService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function QueryByGeometryService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryByGeometryParameters} params - Geometry 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + if (!(params instanceof QueryByGeometryParameters)) { + return; + } + var me = this, + jsonParameters = "", + qp = null, + geometry = params.geometry, + sg = ServerGeometry.fromGeometry(geometry); + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'SpatialQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp) + ",'geometry':" + Util.toJSON(sg) + + ",'spatialQueryMode':" + Util.toJSON(params.spatialQueryMode); + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/QueryBySQLParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryBySQLParameters + * @deprecatedclass SuperMap.QueryBySQLParameters + * @category iServer Map QueryResults + * @classdesc SQL 查询参数类。 + * 该类用于设置 SQL 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] - 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ +class QueryBySQLParameters extends QueryParameters { + + constructor(options) { + options = options || {}; + super(options); + /** + * @member {boolean} [QueryBySQLParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + this.returnContent = true; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.QueryBySQLParameters"; + } + + /** + * @function QueryBySQLParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + var me = this; + me.returnContent = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/QueryBySQLService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class QueryBySQLService + * @deprecatedclass SuperMap.QueryBySQLService + * @category iServer Map QueryResults + * @classdesc SQL 查询服务类。在一个或多个指定的图层上查询符合 SQL 条件的空间地物信息。 + * @extends {QueryService} + * @example + * var queryParam = new FilterParameter({ + * name: "Countries@World.1", + * attributeFilter: "Pop_1994>1000000000 and SmArea>900" + * }); + * var queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }); + * var myQueryBySQLService = new QueryBySQLService(url, {eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class QueryBySQLService extends QueryService { + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.QueryBySQLService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function QueryBySQLService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryBySQLParameters} params - SQL 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + if (!(params instanceof QueryBySQLParameters)) { + return; + } + var me = this, + jsonParameters = "", + qp = null; + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'SqlQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/RouteCalculateMeasureParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class RouteCalculateMeasureParameters + * @deprecatedclass SuperMap.RouteCalculateMeasureParameters + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 基于路由对象计算指定点 M 值操作的参数类。通过该类提供参数信息。 + * @param {Object} options - 参数。 + * @param {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} options.sourceRoute - 路由对象。该对象可以是用户自己生成或在数据源中查询得到的符合标准的路由对象。 + * @param {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|Array.} options.point - 二维地理坐标点对象,包含 x,y 坐标值属性的对象。 + * @param {number} [options.tolerance] - 容限值。 + * @param {boolean} [options.isIgnoreGap=false] - 是否忽略子对象之间的距离。 + * @usage + */ +class RouteCalculateMeasureParameters { + + constructor(options) { + if (!options) { + return this; + } + /** + * @member {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} RouteCalculateMeasureParameters.prototype.sourceRoute + * @description 路由对象。该对象可以是用户自己生成或在数据源中查询得到的符合标准的路由对象。 + */ + this.sourceRoute = null; + + /** + * @member {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|Array.} RouteCalculateMeasureParameters.prototype.point + * @description 二维地理坐标点对象,包含 x,y 坐标值属性的对象。 + */ + this.point = null; + + /** + * @member {number} [RouteCalculateMeasureParameters.prototype.tolerance] + * @description 容限值。 + */ + this.tolerance = null; + + /** + * @member {boolean} [RouteCalculateMeasureParameters.prototype.isIgnoreGap=false] + * @description 是否忽略子对象之间的距离。 + */ + this.isIgnoreGap = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.RouteCalculateMeasureParameters"; + } + + /** + * @function RouteCalculateMeasureParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.sourceRoute = null; + me.point = null; + if (me.tolerance) { + me.tolerance = null; + } + if (me.isIgnoreGap) { + me.isIgnoreGap = false; + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/RouteCalculateMeasureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class RouteCalculateMeasureService + * @deprecatedclass SuperMap.RouteCalculateMeasureService + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 基于路由对象计算指定点 M 值操作的服务类。 + * 该类负责将客户设置的计算指定点的 M 值参数传递给服务端,并接收服务端返回的 + * 指定点的 M 值。通过该类支持的事件的监听函数参数获取。 + * @extends {SpatialAnalystBase} + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 实例化该类如下例所示: + * (start code) + * var parameters = new RouteCalculateMeasureParameters({ + * "sourceRoute":{ + * "type":"LINEM", + * "parts":[4], + * "points":[ + * { + * "measure":0, + * "y":-6674.466867067764, + * "x":3817.3527876130133 + * }, + * { + * "measure":199.57954019411724, + * "y":-6670.830929417594, + * "x":3617.806369901496 + * }, + * { + * "measure":609.3656478634477, + * "y":-6877.837541432356, + * "x":3264.1498746678444 + * }, + * { + * "measure":936.0174126282958, + * "y":-7038.687780615184, + * "x":2979.846206068903 + * } + * ] + * }, + * "tolerance":1, + * "point":{ + * "x":3330.7754269417, + * "y":-6838.8394457216 + * }, + * "isIgnoreGap":false + * }); + * + * var routeCalculateMeasureService = new RouteCalculateMeasureService(spatialAnalystURL, { + * eventListeners:{ + * processCompleted:calculateCompleted, + * processFailed:calculateFailded + * } + * ); + * routeCalculateMeasureService.processAsync(parameters); + * + * //执行 + * function calculateCompleted(){todo} + * function calculateFailded(){todo} + * (end) + * @usage + */ +class RouteCalculateMeasureService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.RouteCalculateMeasureService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function RouteCalculateMeasureService.prototype.processAsync + * @description 负责将客户端的基于路由对象计算指定点 M 值操作的参数传递到服务端。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + */ + processAsync(params) { + if (!(params instanceof RouteCalculateMeasureParameters)) { + return; + } + var me = this, jsonParameters; + + jsonParameters = me.getJsonParameters(params); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function RouteCalculateMeasureService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + getJsonParameters(params) { + var jsonParameters, jsonStr = "geometry/calculatemeasure", me = this; + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/RouteLocatorParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RouteLocatorParameters + * @deprecatedclass SuperMap.RouteLocatorParameters + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由对象定位空间对象的参数类。 + * 参数有两种方式,分别为 Geometry 和 Dataset 两种,前者需要指定 sourceRoute 对象作为参数,后者需要 dataset,routeIDField,routeID 三个参数 + * 如果用户两种参数均设置,优先选择 Dataset 方式。 + * @param {Object} options - 参数。 + * @param {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} options.sourceRoute - 路由对象。 + * @param {number} options.measure - 定位点的 M 值。只当路由对象定位点时有意义。 + * @param {string} [options.type] - 类型:点 or 线。 + * @param {number} [options.offset=0] - 定位点偏移量。只当路由对象定位点时有意义。 + * @param {boolean} [options.isIgnoreGap=false] - 是否忽略子对象之间的距离。即不忽略子对象之间的距离。 + * @param {number} [options.startMeasure] - 定位线的起始 M 值。只当路由对象定位线时有意义。 + * @param {number} [options.endMeasure] - 定位线的终止 M 值。只当路由对象定位线时有意义。 + * @usage + */ +class RouteLocatorParameters { + + constructor(options) { + if (!options) { + return this; + } + /** + * @member {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} RouteLocatorParameters.prototype.sourceRoute + * @description 路由对象。 + */ + this.sourceRoute = null; + + /** + * @member {string} RouteLocatorParameters.prototype.dataset + * @description 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示。 + */ + this.dataset = null; + + /** + * @member {string} RouteLocatorParameters.prototype.routeIDField + * @description 路由对象所在的字段名称。 + * + */ + this.routeIDField = null; + + /** + * @member {number} RouteLocatorParameters.prototype.routeID + * @description 路由对象标识。 + * + */ + this.routeID = null; + + /** + * @member {string} [RouteLocatorParameters.prototype.type] + * @description 类型:点 or 线。 + * 可选值为: + * LINE :根据起始 M 值及终止 M 值定位线对象。 + * POINT : 根据 M 值定位点对象。 + */ + this.type = null; + + /** + * @member {number} RouteLocatorParameters.prototype.measure + * @description 定位点的 M 值。只当路由对象定位点时有意义。 + */ + this.measure = null; + + /** + * @member {number} [RouteLocatorParameters.prototype.offset=0] + * @description 定位点偏移量。只当路由对象定位点时有意义。 + */ + this.offset = 0; + + /** + * @member {boolean} [RouteLocatorParameters.prototype.isIgnoreGap=false] + * @description 是否忽略子对象之间的距离。 + */ + this.isIgnoreGap = false; + + /** + * @member {number} [RouteLocatorParameters.prototype.startMeasure] + * @description 定位线的起始 M 值。只当路由对象定位线时有意义。 + */ + this.startMeasure = null; + + /** + * @member {number} [RouteLocatorParameters.prototype.endMeasure] + * @description 定位线的终止 M 值。只当路由对象定位线时有意义。 + */ + this.endMeasure = null; + + var routeFromClient = options.sourceRoute; + var routeHandle = {}; + if (routeFromClient && routeFromClient instanceof Geometry && routeFromClient.components) { + routeHandle.type = routeFromClient.type; + routeHandle.parts = routeFromClient.parts; + var parts = []; + for (var i = 0, len = routeFromClient.components.length; i < len; i++) { + parts = parts.concat(routeFromClient.components[i].components); + } + routeHandle.points = parts; + options.sourceRoute = routeHandle; + } + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.RouteLocatorParameters"; + } + + + /** + * @function RouteLocatorParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.sourceRoute = null; + me.type = null; + me.measure = null; + me.offset = 0; + me.isIgnoreGap = false; + me.startMeasure = null; + me.endMeasure = null; + me.dataset = null; + me.routeID = null; + me.routeIDField = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/RouteLocatorService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class RouteLocatorService + * @deprecatedclass SuperMap.RouteLocatorService + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由对象定位空间对象的服务类。 + * @extends {SpatialAnalystBase} + * @param {string} url -服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 实例化该类如下例所示: + * (start code) + * var routeLocatorParameters_point = new RouteLocatorParameters({ + * "sourceRoute":{ + * "type":"LINEM", + * "parts":[4], + * "points":[ + * { + * "measure":0, + * "y":-6674.466867067764, + * "x":3817.3527876130133 + * }, + * { + * "measure":199.57954019411724, + * "y":-6670.830929417594, + * "x":3617.806369901496 + * }, + * { + * "measure":609.3656478634477, + * "y":-6877.837541432356, + * "x":3264.1498746678444 + * }, + * { + * "measure":936.0174126282958, + * "y":-7038.687780615184, + * "x":2979.846206068903 + * } + * ] + * }, + * "type":"POINT", + * "measure":10, + * "offset":3, + * "isIgnoreGap":true + * }); + * var routeLocatorService = new RouteLocatorService(spatialAnalystURL, { + * eventListeners:{ + * processCompleted:routeLocatorCompleted, + * processFailed:routeLocatorFailded + * } + * ); + * routeLocatorService.processAsync(routeLocatorParameters_point); + * + * //执行 + * function routeLocatorCompleted(){todo} + * function routeLocatorFailded(){todo} + * (end) + * @usage + */ +class RouteLocatorService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.RouteLocatorService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function RouteLocatorService.prototype.processAsync + * @description 负责将客户端的基于路由对象计算指定点 M 值操作的参数传递到服务端。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + */ + processAsync(params) { + if (!(params instanceof RouteLocatorParameters)) { + return; + } + var me = this, jsonParameters; + + jsonParameters = me.getJsonParameters(params); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function RouteLocatorService.prototype.processAsync + * @description 将参数转化为 JSON 字符串。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + getJsonParameters(params) { + var jsonParameters, jsonStr = "geometry/routelocator", me = this; + + if (params.dataset) { + jsonStr = "datasets/" + params.dataset + "/linearreferencing/routelocator"; + params.sourceRoute = null; + } + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ServerFeature.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ServerFeature + * @deprecatedclass SuperMap.ServerFeature + * @category iServer Data Feature + * @classdesc 服务端矢量要素类。该类描述了服务端返回的矢量要素的相关信息,包括字段和几何信息。 + * @param {ServerGeometry} geometry - 矢量要素的几何信息。 + * @param {Object} options - 参数。 + * @param {Array.} [options.fieldNames] - 矢量要素的属性字段名集合。 + * @param {Array.} [options.fieldValues] - 矢量要素的属性字段值集合。 + * @usage + */ +class ServerFeature { + + constructor(options) { + + /** + * @member {Array.} [ServerFeature.prototype.fieldNames] + * @description 矢量要素的属性字段名集合。 + */ + this.fieldNames = null; + + /** + * @member {Array.} [ServerFeature.prototype.fieldValues] + * @description 矢量要素的属性字段值集合。 + */ + this.fieldValues = null; + + /** + * @member {ServerGeometry} ServerFeature.prototype.geometry + * @description 矢量要素的几何信息。 + */ + this.geometry = null; + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerFeature"; + } + + /** + * @function ServerFeature.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.fieldNames = null; + me.fieldValues = null; + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + + /** + * @function ServerFeature.prototype.toFeature + * @description 将服务端矢量要素 ServerFeature 转换为客户端矢量要素 Feature。 + * @returns {Vector} 转换后的客户端矢量要素。 + */ + toFeature() { + var names, values, geo, + attr = {}, + me = this, + feature; + + names = me.fieldNames; + values = me.fieldValues; + for (var i in names) { + attr[names[i]] = values[i]; + } + if (me.geometry) { + geo = me.geometry.toGeometry(); + } + feature = new Vector(geo, attr); + if (me.geometry && me.geometry.id) { + feature.fid = me.geometry.id; + } + + return feature; + } + + /** + * @function ServerFeature.prototype.fromJson + * @description 将 JSON 对象表示服务端矢量要素转换为 ServerFeature。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerFeature} 转化后的 ServerFeature 对象。 + */ + static fromJson(jsonObject) { + var geo = null; + if (!jsonObject) { + return; + } + geo = jsonObject.geometry; + if (geo) { + geo = ServerGeometry.fromJson(geo); + } + return new ServerFeature({ + fieldNames: jsonObject.fieldNames, + fieldValues: jsonObject.fieldValues, + geometry: geo + }); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetDatasourceParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetDatasourceParameters + * @deprecatedclass SuperMap.SetDatasourceParameters + * @category iServer Data Datasource + * @classdesc 设置数据源信息参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称。 + * @param {string} options.description - 数据源描述信息。 + * @param {string} options.coordUnit - 坐标单位。 + * @param {string} options.distanceUnit - 距离单位。 + * @usage + */ +class SetDatasourceParameters { + + constructor(options) { + if (!options) { + return; + } + + /** + * @member {string} SetDatasourceParameters.prototype.datasourceName + * @description 数据源名称。 + */ + this.datasourceName = null; + + /** + * @member {string} SetDatasourceParameters.prototype.description + * @description 数据源描述信息。 + */ + this.description = null; + + /** + * @member {string} SetDatasourceParameters.prototype.coordUnit + * @description 坐标单位。 + */ + this.coordUnit = null; + + /** + * @member {string} SetDatasourceParameters.prototype.distanceUnit + * @description 距离单位。 + */ + this.distanceUnit = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.SetDatasourceParameters"; + } + + /** + * @function SetDatasourceParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasourceName = null; + me.description = null; + me.coordUnit = null; + me.distanceUnit = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerInfoParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetLayerInfoParameters + * @deprecatedclass SuperMap.SetLayerInfoParameters + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息参数类。 + * @param {Object} options - 参数。 + * @param {string} options.resourceID - 临时图层的资源 ID。 + * @param {string} options.tempLayerName - 临时图层下的子图层名。 + * @param {string} options.layerInfo - 要更新的图层信息。 + * @usage + */ +class SetLayerInfoParameters { + + constructor(options) { + options = options || {}; + /** + * @member {string} SetLayerInfoParameters.prototype.resourceID + * @description 临时图层的资源 ID。 + */ + this.resourceID = null; + + /** + * @member {string} SetLayerInfoParameters.prototype.tempLayerName + * @description 临时图层下子图层(或者其子图层)名,如:Countries@World.3@@World。 + */ + this.tempLayerName = null; + + /** + * @member {Object} SetLayerInfoParameters.prototype.layerInfo + * @description 要更新的图层信息(包含修改和未修改的所有字段)。该参数可以通过图层信息服务获取,然后对返回值中 subLayers.layers[i] 图层信息属性进行修改。 + */ + this.layerInfo = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.SetLayerInfoParameters"; + } + + /** + * @function SetLayerInfoParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.resourceID = null; + me.tempLayerName = null; + me.layerInfo = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerInfoService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SetLayerInfoService + * @deprecatedclass SuperMap.SetLayerInfoService + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息服务类。可以实现临时图层中子图层的修改 + * 该类负责将图层设置参数传递到服务端,并获取服务端返回的结果信息。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}/tempLayersSet/{tempLayerID}/Rivers@World@@World"; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SetLayerInfoService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.SetLayerInfoService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function SetLayerInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。 + * 该参数可以使用获取图层信息服务<{@link GetLayersInfoService}>返回图层信息,解析结果result.subLayers.layers[i],然后对其属性进行修改来获取。 + */ + processAsync(params) { + if (!params) { + return; + } + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayersInfoParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetLayersInfoParameters + * @deprecatedclass SuperMap.SetLayersInfoParameters + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息参数类。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isTempLayers=false] - 是否是临时图层。 + * @param {string} options.resourceID - 临时图层资源 ID。 + * @param {Object} options.layersInfo - 要更新的图层信息。 + * @usage + */ +class SetLayersInfoParameters { + + constructor(options) { + options = options || {}; + /** + * @member {boolean} [SetLayersInfoParameters.prototype.isTempLayers=false] + * @description 是否是临时图层。 + */ + this.isTempLayers = null; + /** + * @member {string} SetLayersInfoParameters.prototype.resourceID + * @description 临时图层资源 ID, + */ + this.resourceID = null; + + /** + * @member {Object} SetLayersInfoParameters.prototype.layersInfo + * @description 要更新的图层信息(包含修改和未修改的所有字段)。该参数可以通过图层信息服务获取,然后对返回值中 subLayers.layers[i] 图层信息属性进行修改。 + */ + this.layersInfo = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.SetLayersInfoParameters"; + } + + + /** + * @function SetLayersInfoParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.isTempLayers = null; + me.resourceID = null; + me.layersInfo = null; + } + + + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayersInfoService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SetLayersInfoService + * @deprecatedclass SuperMap.SetLayersInfoService + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息服务类。可以实现创建新的临时图层和对现有临时图层的修改, + * 当 isTempLayers 为 false的时候执行创建临时图层。当 isTempLayers 为 ture 并且临时图层资源 resourceID 被设置有效时执行对临时图层的编辑。 + * 该类负责将图层设置参数传递到服务端,并获取服务端返回的结果信息。 + * @extends {CommonServiceBase} + * @param url - {string} 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {string} options.resourceID - 图层资源ID,临时图层的资源ID标记。 + * @param {boolean} options.isTempLayers - 当前url对应的图层是否是临时图层。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SetLayersInfoService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} SetLayersInfoService.prototype.resourceID + * @description 图层资源ID,临时图层的资源ID标记。 + */ + this.resourceID = null; + + /** + * @function {boolean} SetLayersInfoService.prototype.isTempLayers + * @description 当前url对应的图层是否是临时图层。 + */ + this.isTempLayers = false; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SetLayersInfoService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function SetLayersInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。该参数可以使用获取图层信息服务 <{@link GetLayersInfoService}>返回图层信息,然后对其属性进行修改来获取。 + */ + processAsync(params) { + if (!params) { + return; + } + var jsonParams, + subLayers = [], + me = this, + method = ""; + + + //创建临时图层和设置修改临时图层信息对应不同的资源URL + if (me.isTempLayers) { + me.url = Util.urlPathAppend(me.url, "tempLayersSet/" + me.resourceID); + method = "PUT"; + } else { + me.url = Util.urlPathAppend(me.url, "tempLayersSet"); + method = "POST"; + } + if (!params.subLayers) { + params.subLayers = {layers: []} + } + if (!params.subLayers.layers) { + params.subLayers.layers = []; + } + var layers = params.subLayers.layers, + len = layers.length; + for (let i in layers) { + if (layers[i].ugcLayerType === "GRID") { + var colorDictionary = {}; + var colorDics = layers[i].colorDictionarys; + for (var j in colorDics) { + var key = colorDics[j].elevation; + colorDictionary[key] = colorDics[j].color; + } + } + layers[i].colorDictionary = colorDictionary; + delete layers[i].colorDictionarys; + } + + for (let i = 0; i < len; i++) { + if (layers[i].toJsonObject) { + //将图层信息转换成服务端能识别的简单json对象 + subLayers.push(layers[i].toJsonObject()); + } else { + subLayers.push(layers[i]); + } + } + jsonParams = Util.extend(jsonParams, params); + jsonParams.subLayers = {"layers": subLayers}; + jsonParams.object = null; + var jsonParamsStr = Util.toJSON([jsonParams]); + me.request({ + method: method, + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerStatusParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetLayerStatusParameters + * @deprecatedclass SuperMap.SetLayerStatusParameters + * @category iServer Map TempLayersSet + * @classdesc 子图层显示控制参数类,该类存储了各子图层是否可见的状态。 + * 注意在 SuperMap iClient 系列产品中所说的图层与 SuperMap Deskpro 的地图对应,子图层与 SuperMap Deskpro 的图层对应。 + * @param {Object} options - 参数。 + * @param {Array.} options.layerStatusList - 获取或设置图层可见状态({@link LayerStatus})集合, + * 集合中的每个 {@link LayerStatus} 对象代表一个子图层的可视状态。 + * @param {number} [options.holdTime=15] - 获取或设置资源在服务端保存的时间。 + * @param {string} [options.resourceID] - 获取或设置资源服务 ID。 + * @usage + */ +class SetLayerStatusParameters { + + constructor(options) { + /** + * @member {Array.} SetLayerStatusParameters.prototype.layerStatusList + * @description 获取或设置图层可见状态({@link LayerStatus})集合,集合中的每个 {@link LayerStatus} 对象代表一个子图层的可视状态。 + */ + this.layerStatusList = []; + + /** + * @member {number} [SetLayerStatusParameters.prototype.holdTime=15] + * @description 获取或设置资源在服务端保存的时间。单位为分钟。 + */ + this.holdTime = 15; + + /** + * @member {string} SetLayerStatusParameters.prototype.resourceID + * @description 获取或设置资源服务ID。如果设置该参数则会在指定的 TempLayer 进行图层的显示控制; + * 如果不设置该参数,则会首先创建一个 TempLayer ,然后在新创建的 TempLayer 进行图层的显示控制。 + */ + this.resourceID = null; + + if (options) { + Util.extend(this, options); + } + + + } + + /** + * @function SetLayerStatusParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.layerStatusList = null; + me.holdTime = null; + me.resourceID = null; + } + + /** + * @function SetLayerStatusParameters.prototype.toJSON + * @description 生成 JSON。 + * @returns {Object} 对应的 JSON 对象。 + */ + toJSON() { + var json = '{'; + json += '"layers":['; + var v = []; + for (var i = 0, len = this.layerStatusList.length; i < len; i++) { + v.push(this.layerStatusList[i].toJSON()); + } + + json += v; + json += ']'; + json += '}'; + + return json; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerStatusService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SetLayerStatusService + * @deprecatedclass SuperMap.SetLayerStatusService + * @category iServer Map TempLayersSet + * @classdesc 子图层显示控制服务类。该类负责将子图层显示控制参数传递到服务端,并获取服务端返回的图层显示状态。 + * 用户获取服务端返回的各子图层显示状态有两种方式: + * 一种是通过监听 SetLayerEvent.PROCESS_COMPLETE 事件; + * 一种是使用 AsyncResponder 类实现异步处理。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SetLayerStatusService extends CommonServiceBase { + + + + constructor(url, options) { + super(url, options); + this.lastparams = null; + + this.mapUrl = url; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.SetLayerStatusService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + + /** + * @function SetLayerStatusService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。该参数可以使用获取图层信息服务{@link SetLayerStatusParameters} + * 返回图层信息,然后对其属性进行修改来获取。 + */ + processAsync(params) { + if (!(params instanceof SetLayerStatusParameters)) { + return; + } + var me = this, + method = "POST"; + me.url = me.mapUrl; + + if (params.resourceID == null) { + me.url = Util.urlPathAppend(me.url, 'tempLayersSet'); + me.lastparams = params; + + me.request({ + method: method, + scope: me, + success: me.createTempLayerComplete, + failure: me.serviceProcessFailed + }); + } else { + me.url = Util.urlPathAppend(me.url, "tempLayersSet/" + params.resourceID); + me.url = Util.urlAppend(me.url, "elementRemain=true&reference=" + params.resourceID + "&holdTime=" + params.holdTime.toString()); + + var jsonParameters = '[{'; + + jsonParameters += '"type":"UGC",'; + if (params.layerStatusList != null && params.layerStatusList.length > 0) { + jsonParameters += '"subLayers":' + params.toJSON(); + } + jsonParameters += ',"visible":' + true + ','; + jsonParameters += '"name":"' + this.getMapName(this.mapUrl) + '"'; + + jsonParameters += '}]'; + + me.request({ + method: "PUT", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + } + + /** + * @function SetLayerStatusService.prototype.createTempLayerComplete + * @description 设置完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象,记录设置操作是否成功。 + */ + createTempLayerComplete(result) { + var me = this; + result = Util.transformResult(result); + if (result.succeed) { + me.lastparams.resourceID = result.newResourceID; + } + + me.processAsync(me.lastparams); + } + + /** + * @function SetLayerStatusService.prototype.getMapName + * @description 获取地图名称。 + * @param {Object} url - 服务地址。 + */ + getMapName(url) { + var mapUrl = url; + if (mapUrl.charAt(mapUrl.length - 1) === "/") { + mapUrl = mapUrl.substr(0, mapUrl.length - 1); + } + var index = mapUrl.lastIndexOf("/"); + var mapName = mapUrl.substring(index + 1, mapUrl.length); + return mapName; + } + + /** + * @function SetLayerStatusService.prototype.setLayerCompleted + * @description 设置完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象,记录设置操作是否成功。 + */ + serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + if (result != null && me.lastparams != null) { + result.newResourceID = me.lastparams.resourceID; + } + me.events.triggerEvent("processCompleted", {result: result}); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SingleObjectQueryJobsParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SingleObjectQueryJobsParameter + * @deprecatedclass SuperMap.SingleObjectQueryJobsParameter + * @category iServer ProcessingService Query + * @classdesc 单对象空间查询分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetQuery - 查询对象所在的数据集名称。 + * @param {SpatialQueryMode} [options.mode=SpatialQueryMode.CONTAIN] - 空间查询模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class SingleObjectQueryJobsParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.datasetQuery + * @description 查询对象所在的数据集名称。 + */ + this.datasetQuery = ""; + + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.geometryQuery + * @description 查询对象所在的几何对象。 + */ + this.geometryQuery = ""; + + /** + * @member {SpatialQueryMode} [SingleObjectQueryJobsParameter.prototype.mode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式 。 + */ + this.mode = SpatialQueryMode.CONTAIN; + + /** + * @member {OutputSetting} [SingleObjectQueryJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [SingleObjectQueryJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.SingleObjectQueryJobsParameter"; + } + + /** + * @function SingleObjectQueryJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.datasetQuery = null; + this.geometryQuery = null; + this.mode = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters){ + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function SingleObjectQueryJobsParameter.toObject + * @param {Object} singleObjectQueryJobsParameter - 单对象空间查询分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成单对象空间查询分析任务对象。 + */ + static toObject(singleObjectQueryJobsParameter, tempObj) { + for (var name in singleObjectQueryJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = singleObjectQueryJobsParameter[name]; + continue; + } + if (name === "output"){ + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = singleObjectQueryJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = singleObjectQueryJobsParameter[name]; + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = singleObjectQueryJobsParameter[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SingleObjectQueryJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SingleObjectQueryJobsService + * @deprecatedclass SuperMap.SingleObjectQueryJobsService + * @category iServer ProcessingService Query + * @classdesc 单对象查询分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SingleObjectQueryJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/query'); + this.CLASS_NAME = 'SuperMap.SingleObjectQueryJobsService'; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function SingleObjectQueryJobsService.protitype.getQueryJobs + * @description 获取单对象空间查询分析所有任务 + */ + getQueryJobs() { + super.getJobs(this.url); + } + + /** + * @function KernelDensityJobsService.protitype.getQueryJob + * @description 获取指定id的单对象空间查询分析服务 + * @param {string} id - 指定要获取数据的id + */ + getQueryJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function SingleObjectQueryJobsService.protitype.addQueryJob + * @description 新建单对象空间查询分析服务 + * @param {SingleObjectQueryJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addQueryJob(params, seconds) { + super.addJob(this.url, params, SingleObjectQueryJobsParameter, seconds); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/StopQueryParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class StopQueryParameters + * @deprecatedclass SuperMap.StopQueryParameters + * @category iServer TrafficTransferAnalyst TransferStops + * @classdesc 站点查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.keyWord - 站点名称关键字。 + * @param {boolean} [options.returnPosition=false] - 是否返回站点坐标信息。 + * @usage + */ +class StopQueryParameters { + + constructor(options) { + options = options || {}; + /** + * @member {string} StopQueryParameters.prototype.keyWord + * @description 站点名称关键字。 + */ + this.keyWord = null; + + /** + * @member {boolean} [StopQueryParameters.prototype.returnPosition=false] + * @description 是否返回站点坐标信息。 + */ + this.returnPosition = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.StopQueryParameters"; + } + + /** + * @function StopQueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/StopQueryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class StopQueryService + * @deprecatedclass SuperMap.StopQueryService + * @category iServer TrafficTransferAnalyst TransferStops + * @classdesc 站点查询服务类。 + * 返回结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 例如: + * (start code) + * var myService = new StopQueryService(url, {eventListeners: { + * "processCompleted": StopQueryCompleted, + * "processFailed": StopQueryError + * } + * }; + * (end) + * @usage + * + */ + +class StopQueryService extends CommonServiceBase { + + + constructor(url, options) { + super(url, options); + options = options || {}; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.StopQueryService"; + } + + /** + *@override + */ + destroy() { + super.destroy(); + Util.reset(this); + } + + /** + * @function StopQueryService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {StopQueryParameters} params - 交通换乘参数。 + */ + processAsync(params) { + if (!(params instanceof StopQueryParameters)) { + return; + } + var me = this; + me.url = Util.urlPathAppend(me.url, 'stops/keyword/' + params.keyWord); + me.request({ + method: "GET", + params: {returnPosition: params.returnPosition}, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryAttributesJobsParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryAttributesJobsParameter + * @deprecatedclass SuperMap.SummaryAttributesJobsParameter + * @category iServer ProcessingService SummaryAttributes + * @classdesc 属性汇总分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.groupField - 分组字段。 + * @param {string} options.attributeField - 属性字段。 + * @param {string} options.statisticModes - 统计模式。 + * @param {OutputSetting} [options.output] -输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class SummaryAttributesJobsParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} SummaryAttributesJobsParameter.prototype.datasetName + * @description 汇总数据集名称。 + */ + this.datasetName = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.groupField + * @description 分组字段。 + */ + this.groupField = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.attributeField + * @description 属性字段。 + */ + this.attributeField = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.statisticModes + * @description 属性汇总统计模式。 + */ + this.statisticModes = ""; + /** + * @member {OutputSetting} SummaryAttributesJobsParameter.prototype.output + * @description 输出参数设置类。 + */ + this.output = null; + /** + * @member {MappingParameters} [SummaryAttributesJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SummaryAttributesJobsParameter"; + } + + /** + * @function SummaryAttributesJobsParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.groupField = null; + this.attributeField = null; + this.statisticModes = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters){ + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function SummaryAttributesJobsParameter.toObject + * @param {Object} SummaryAttributesJobsParameter - 属性汇总任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成属性汇总分析任务对象。 + */ + static toObject(SummaryAttributesJobsParameter, tempObj) { + for (var name in SummaryAttributesJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = SummaryAttributesJobsParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = SummaryAttributesJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = SummaryAttributesJobsParameter[name]; + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = SummaryAttributesJobsParameter[name]; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryAttributesJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryAttributesJobsService + * @deprecatedclass SuperMap.SummaryAttributesJobsService + * @category iServer ProcessingService SummaryAttributes + * @classdesc 属性汇总分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SummaryAttributesJobsService extends ProcessingServiceBase { + + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/summaryattributes'); + this.CLASS_NAME = "SuperMap.SummaryAttributesJobsService"; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function SummaryAttributesJobsService.protitype.getSummaryAttributesJobs + * @description 获取属性汇总分析所有任务 + */ + getSummaryAttributesJobs (){ + super.getJobs(this.url); + } + + /** + * @function SummaryAttributesJobsService.protitype.getSummaryAttributesJob + * @description 获取指定id的属性汇总分析服务 + * @param {string} id - 指定要获取数据的id + */ + getSummaryAttributesJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function SummaryAttributesJobsService.protitype.addSummaryAttributesJob + * @description 新建属性汇总分析服务 + * @param {SummaryAttributesJobsParameter} params - 属性汇总分析任务参数类。 + * @param {number} seconds - 创建成功结果的时间间隔。 + */ + addSummaryAttributesJob(params, seconds) { + super.addJob(this.url, params, SummaryAttributesJobsParameter, seconds); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryMeshJobParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class SummaryMeshJobParameter + * @deprecatedclass SuperMap.SummaryMeshJobParameter + * @category iServer ProcessingService AggregatePoints + * @classdesc 点聚合分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {number} options.fields - 权重索引。 + * @param {number} [options.resolution=100] - 分辨率。 + * @param {StatisticAnalystMode} [options.statisticModes=StatisticAnalystMode.AVERAGE] - 分析模式。 + * @param {number} [options.meshType=0] - 分析类型。 + * @param {SummaryType} [options.type=SummaryType.SUMMARYMESH] - 聚合类型。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class SummaryMeshJobParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} SummaryMeshJobParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} SummaryMeshJobParameter.prototype.regionDataset + * @description 聚合面数据集(聚合类型为多边形聚合时使用的参数)。 + */ + this.regionDataset = ""; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} SummaryMeshJobParameter.prototype.query + * @description 分析范围(聚合类型为网格面聚合时使用的参数)。 + */ + this.query = ""; + + /** + * @member {number} [SummaryMeshJobParameter.prototype.resolution=100] + * @description 分辨率(聚合类型为网格面聚合时使用的参数)。 + */ + this.resolution = 100; + + /** + * @member {number} [SummaryMeshJobParameter.prototype.meshType=0] + * @description 网格面类型(聚合类型为网格面聚合时使用的参数),取值:0 或 1。 + */ + this.meshType = 0; + + /** + * @member {StatisticAnalystMode} [SummaryMeshJobParameter.prototype.statisticModes=StatisticAnalystMode.AVERAGE] + * @description 统计模式。 + */ + this.statisticModes = StatisticAnalystMode.AVERAGE; + + /** + * @member {number} SummaryMeshJobParameter.prototype.fields + * @description 权重字段。 + */ + this.fields = ""; + + /** + * @member {SummaryType} [SummaryMeshJobParameter.prototype.type=SummaryType.SUMMARYMESH] + * @description 聚合类型。 + */ + this.type = SummaryType.SUMMARYMESH; + + /** + * @member {OutputSetting} [SummaryMeshJobParameter.prototype.output] + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [SummaryMeshJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.SummaryMeshJobParameter"; + } + + + /** + * @function SummaryMeshJobParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.query = null; + this.resolution = null; + this.statisticModes = null; + this.meshType = null; + this.fields = null; + this.regionDataset = null; + this.type = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters){ + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function SummaryMeshJobParameter.toObject + * @param {Object} summaryMeshJobParameter - 点聚合分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成点聚合分析任务对象。 + */ + static toObject(summaryMeshJobParameter, tempObj) { + for (var name in summaryMeshJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = summaryMeshJobParameter[name]; + continue; + } + if (name === "type") { + tempObj['type'] = summaryMeshJobParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = summaryMeshJobParameter[name]; + continue; + } + if (summaryMeshJobParameter.type === 'SUMMARYMESH' && name !== 'regionDataset' || summaryMeshJobParameter.type === 'SUMMARYREGION' && !contains(['meshType', 'resolution', 'query'], name)) { + tempObj['analyst'] = tempObj['analyst'] || {}; + if (name === 'query' && summaryMeshJobParameter[name]) { + tempObj['analyst'][name] = summaryMeshJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = summaryMeshJobParameter[name]; + } + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = summaryMeshJobParameter[name]; + } + } + + } + + function contains(arr, obj) { + var i = arr.length; + while (i--) { + if (arr[i] === obj) { + return true; + } + } + return false; + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryMeshJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryMeshJobsService + * @deprecatedclass SuperMap.SummaryMeshJobsService + * @category iServer ProcessingService AggregatePoints + * @classdesc 点聚合分析任务类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {number} options.index - 服务地址在数组中的位置。 + * @param {number} options.length - 服务地址数组长度。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SummaryMeshJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/aggregatepoints'); + this.CLASS_NAME = 'SuperMap.SummaryMeshJobsService'; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function SummaryMeshJobsService.prototype.getSummaryMeshJobs + * @description 获取点聚合分析任务 + */ + getSummaryMeshJobs() { + super.getJobs(this.url); + } + + /** + * @function SummaryMeshJobsService.prototype.getSummaryMeshJob + * @description 获取指定ip的点聚合分析任务 + * @param {string} id - 指定要获取数据的id + */ + getSummaryMeshJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function SummaryMeshJobsService.prototype.addSummaryMeshJob + * @description 新建点聚合分析服务 + * @param {SummaryMeshJobParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addSummaryMeshJob(params, seconds) { + super.addJob(this.url, params, SummaryMeshJobParameter, seconds); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryRegionJobParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SummaryRegionJobParameter + * @deprecatedclass SuperMap.SummaryRegionJobParameter + * @category iServer ProcessingService SummaryRegion + * @classdesc 区域汇总分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {string} [options.standardFields] - 标准属性字段名称。 + * @param {string} [options.weightedFields] - 权重字段名称。 + * @param {StatisticAnalystMode} [options.standardStatisticModes] - 标准属性字段的统计模式。standardSummaryFields 为 true 时必填。 + * @param {StatisticAnalystMode} [options.weightedStatisticModes] - 权重字段的统计模式。weightedSummaryFields 为 true 时必填。 + * @param {boolean} [options.sumShape=true] - 是否统计长度或面积。 + * @param {boolean} [options.standardSummaryFields=false] - 是否以标准属字段统计。 + * @param {boolean} [options.weightedSummaryFields=false] - 是否以权重字段统计。 + * @param {number} [options.resolution=100] - 网格大小。 + * @param {number} [options.meshType=0] - 网格面汇总类型。 + * @param {AnalystSizeUnit} [options.meshSizeUnit=AnalystSizeUnit.METER] - 网格大小单位。 + * @param {SummaryType} [options.type=SummaryType.SUMMARYMESH] - 汇总类型。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class SummaryRegionJobParameter { + + constructor(options) { + if (!options) { + return; + } + + /** + * @member {string} SummaryRegionJobParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} SummaryRegionJobParameter.prototype.regionDataset + * @description 汇总数据源(多边形汇总时用到的参数)。 + */ + this.regionDataset = ""; + + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.sumShape=true] + * @description 是否统计长度或面积。 + */ + this.sumShape = true; + + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} SummaryRegionJobParameter.prototype.query + * @description 分析范围。 + */ + this.query = ""; + + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.standardSummaryFields=false] + * @description 是否以标准属字段统计。 + */ + this.standardSummaryFields = false; + + /** + * @member {string} SummaryRegionJobParameter.prototype.standardFields + * @description 标准属性字段名称。仅支持系统字段以外的整形、长整形、浮点型的字段的名称。standardSummaryFields 为 true 时必填。 + */ + this.standardFields = ""; + + /** + * @member {StatisticAnalystMode} SummaryRegionJobParameter.prototype.standardStatisticModes + * @description 标准属性字段的统计模式。standardSummaryFields 为 true 时必填。 + */ + this.standardStatisticModes = ""; + + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.weightedSummaryFields=false] + * @description 是否以权重字段统计。 + */ + this.weightedSummaryFields = false; + + /** + * @member {string} SummaryRegionJobParameter.prototype.weightedFields + * @description 权重字段名称。仅支持系统字段以外的整形、长整形、浮点型的字段的名称。weightedSummaryFields 为 true 时必填。 + */ + this.weightedFields = ""; + + /** + * @member {StatisticAnalystMode} SummaryRegionJobParameter.prototype.weightedStatisticModes + * @description 以权重字段统计的统计模式。权重字段的统计模式。weightedSummaryFields 为 true 时必填。 + */ + this.weightedStatisticModes = ""; + + /** + * @member {number} [SummaryRegionJobParameter.prototype.meshType=0] + * @description 网格面汇总类型。 + */ + this.meshType = 0; + + /** + * @member {number} [SummaryRegionJobParameter.prototype.resolution=100] + * @description 网格大小。 + */ + this.resolution = 100; + + /** + * @member {AnalystSizeUnit} [SummaryRegionJobParameter.prototype.meshSizeUnit=AnalystSizeUnit.METER] + * @description 网格大小单位。 + */ + this.meshSizeUnit = AnalystSizeUnit.METER; + + /** + * @member {SummaryType} [SummaryRegionJobParameter.prototype.type=SummaryType.SUMMARYMESH] + * @description 汇总类型。 + */ + this.type = SummaryType.SUMMARYMESH; + + /** + * @member {OutputSetting} SummaryRegionJobParameter.prototype.output + * @description 输出参数设置类 + */ + this.output = null; + + /** + * @member {MappingParameters} [SummaryRegionJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.SummaryRegionJobParameter"; + } + + /** + * @function SummaryRegionJobParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.sumShape = null; + this.regionDataset = null; + this.query = null; + this.standardSummaryFields = null; + this.standardFields = null; + this.standardStatisticModes = null; + this.weightedSummaryFields = null; + this.weightedFields = null; + this.weightedStatisticModes = null; + this.meshType = null; + this.resolution = null; + this.meshSizeUnit = null; + this.type = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters){ + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function SummaryRegionJobParameter.toObject + * @param {Object} summaryRegionJobParameter - 矢量裁剪分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成区域汇总分析服务对象。 + */ + static toObject(summaryRegionJobParameter, tempObj) { + for (var name in summaryRegionJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = summaryRegionJobParameter[name]; + continue; + } + if (name === "type") { + tempObj['type'] = summaryRegionJobParameter[name]; + continue; + } + if (name === "type") { + tempObj['type'] = summaryRegionJobParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = summaryRegionJobParameter[name]; + continue; + } + if (summaryRegionJobParameter.type === "SUMMARYREGION" || summaryRegionJobParameter.type === "SUMMARYMESH" && name !== "regionDataset") { + tempObj['analyst'] = tempObj['analyst'] || {}; + if (name === 'query' && summaryRegionJobParameter[name]) { + tempObj['analyst'][name] = summaryRegionJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = summaryRegionJobParameter[name]; + } + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = summaryRegionJobParameter[name]; + } + + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SummaryRegionJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryRegionJobsService + * @deprecatedclass SuperMap.SummaryRegionJobsService + * @category iServer ProcessingService SummaryRegion + * @classdesc 区域汇总分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class SummaryRegionJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/summaryregion'); + this.CLASS_NAME = 'SuperMap.SummaryRegionJobsService'; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function SummaryRegionJobsService.prototype.getSummaryRegionJobs + * @description 获取区域汇总分析任务集合。 + */ + getSummaryRegionJobs() { + super.getJobs(this.url); + } + + /** + * @function SummaryRegionJobsService.prototype.getSummaryRegionJob + * @description 获取指定id的区域汇总分析任务。 + * @param {string} id -要获取区域汇总分析任务的id + */ + getSummaryRegionJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function SummaryRegionJobsService.prototype.addSummaryRegionJob + * @description 新建区域汇总任务。 + * @param {SummaryRegionJobParameter} params - 区域汇总分析任务参数类。 + * @param {number} seconds - 创建成功结果的时间间隔。 + */ + addSummaryRegionJob(params, seconds) { + super.addJob(this.url, params, SummaryRegionJobParameter, seconds); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/SupplyCenter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SupplyCenter + * @deprecatedclass SuperMap.SupplyCenter + * @category iServer NetworkAnalyst Location + * @classdesc 资源供给中心类。在资源分配和选址分区分析两个功能中使用。 + * @param {Object} options - 参数。 + * @param {number} options.maxWeight - 最大耗费值。 + * @param {number} options.nodeID - 结点 ID 号。资源供给中心必须是结点。 + * @param {number} options.resourceValue - 能提供的最大服务量或商品数量。 + * @param {SupplyCenterType} [options.type] - 资源供给中心点的类型常量。 + * @usage + */ +class SupplyCenter { + + constructor(options) { + /** + * @member {number} SupplyCenter.prototype.maxWeight + * @description 资源供给中心的最大耗费值。中心点最大阻值设置越小,表示中心点所提供的资源可影响范围越大。 + * 最大阻力值是用来限制需求点到中心点的花费。 + * 如果需求点(弧段或结点)到此中心的花费大于最大阻力值,则该需求点不属于该资源供给中心提供资源的范围。 + */ + this.maxWeight = null; + + /** + * @member {number} SupplyCenter.prototype.nodeID + * @description 资源供给中心点的结点 ID 号,资源供给中心必须是结点。 + */ + this.nodeID = null; + + /** + * @member {number} SupplyCenter.prototype.resourceValue + * @description 资源供给中心能提供的最大服务量或商品数量。例如资源中心为学校,资源中心资源量表示该学校能够接纳多少学生。 + */ + this.resourceValue = null; + + /** + * @member {SupplyCenterType} [SupplyCenter.prototype.type] + * @description 资源供给中心点的类型常量。资源供给中心点的类型包括非中心,固定中心和可选中心。 + * 固定中心用于资源分配分析;固定中心和可选中心用于选址分析;非中心在两种网络分析时都不予考虑。 + */ + this.type = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SupplyCenter"; + } + + /** + * @function SupplyCenter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.maxWeight = null; + me.nodeID = null; + me.resourceValue = null; + me.type = null; + } + + /** + * @function SupplyCenter.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {SupplyCenter} SupplyCenter 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + return new SupplyCenter({ + maxWeight: jsonObject.maxWeight, + nodeID: jsonObject.nodeID, + resourceValue: jsonObject.resourceValue, + type: jsonObject.type + }); + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class SurfaceAnalystService + * @deprecatedclass SuperMap.SurfaceAnalystService + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析服务类。 + * 该类负责将客户设置的表面分析服务参数传递给服务端,并接收服务端返回的表面分析服务分析结果数据。 + * 表面分析结果通过该类支持的事件的监听函数参数获取 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var mySurfaceAnalystService = new SurfaceAnalystService(url, { + * eventListeners: { + * "processCompleted": surfaceAnalysCompleted, + * "processFailed": surfaceAnalysFailed + * } + * }); + * (end) + * @usage + */ +class SurfaceAnalystService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.SurfaceAnalystService"; + } + + /** + * @function SurfaceAnalystService.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy() { + super.destroy(); + } + + /** + * @function SurfaceAnalystService.prototype.processAsync + * @description 负责将客户端的表面分析服务参数传递到服务端。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + */ + processAsync(params) { + if (!(params instanceof SurfaceAnalystParameters)) { + return; + } + var me = this, jsonParameters; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function SurfaceAnalystService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + getJsonParameters(params) { + var jsonParameters = ''; + var parameterObject = {}; + var me = this; + if (params instanceof DatasetSurfaceAnalystParameters) { + me.url = Util.urlPathAppend( + me.url, + 'datasets/' + params.dataset + '/' + params.surfaceAnalystMethod.toLowerCase() + ); + DatasetSurfaceAnalystParameters.toObject(params, parameterObject); + jsonParameters = Util.toJSON(parameterObject); + } else if (params instanceof GeometrySurfaceAnalystParameters) { + me.url = Util.urlPathAppend(me.url, 'geometry/' + params.surfaceAnalystMethod.toLowerCase()); + jsonParameters = Util.toJSON(params); + } else { + return; + } + me.url = Util.urlAppend(me.url, 'returnContent=true'); + return jsonParameters; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/TerrainCurvatureCalculationParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TerrainCurvatureCalculationParameters + * @deprecatedclass SuperMap.TerrainCurvatureCalculationParameters + * @category iServer SpatialAnalyst TerrainCalculation + * @classdesc 地形曲率计算参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 地形曲率计算数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * @param {string} options.averageCurvatureName - 结果数据集:平均曲率数据集的名称。 + * @param {string} options.profileCurvatureName - 结果数据集:剖面曲率数据集的名称。 + * @param {string} options.planCurvatureName - 结果数据集:平面曲率数据集的名称。 + * @param {number} [options.zFactor=1.0] - 指定的高程缩放系数。1.0 表示不缩放。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ +class TerrainCurvatureCalculationParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.dataset + * @description 要用来做地形曲率计算数据源中数据集的名称。 + * 该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * 注:地形曲率计算必须为栅格数据集。 + */ + this.dataset = null; + + /** + * @member {number} [TerrainCurvatureCalculationParameters.prototype.zFactor=1.0] + * @description 指定的高程缩放系数。1.0 表示不缩放。 + * 该值是指在 DEM 栅格数据中,栅格值( Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。 + * 通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。 + * 例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。 + */ + this.zFactor = 1.0; + + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.averageCurvatureName + * @description 结果数据集:平均曲率数据集的名称。 + */ + this.averageCurvatureName = null; + + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.profileCurvatureName + * @description 结果数据集:剖面曲率数据集的名称。 + */ + this.profileCurvatureName = ""; + + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.planCurvatureName + * @description 结果数据集:平面曲率数据集的名称。 + */ + this.planCurvatureName = ""; + + /** + * @member {boolean} [TerrainCurvatureCalculationParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + this.deleteExistResultDataset = false; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TerrainCurvatureCalculationParameters"; + } + + + /** + * @function TerrainCurvatureCalculationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.dataset = null; + me.zFactor = 1.0; + me.averageCurvatureName = null; + me.profileCurvatureName = null; + me.planCurvatureName = null; + me.deleteExistResultDataset = true; + } + + /** + * @function TerrainCurvatureCalculationParameters.toObject + * @param {Object} derrainCurvatureCalculationParameters - 地形曲率计算参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成地形曲率计算对象。 + */ + static toObject(derrainCurvatureCalculationParameters, tempObj) { + for (var name in derrainCurvatureCalculationParameters) { + if (name !== "dataset") { + tempObj[name] = derrainCurvatureCalculationParameters[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/TerrainCurvatureCalculationService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TerrainCurvatureCalculationService + * @deprecatedclass SuperMap.TerrainCurvatureCalculationService + * @category iServer SpatialAnalyst TerrainCalculation + * @classdesc 地形曲率计算服务类。 + * @extends {SpatialAnalystBase} + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {string} options.url - 服务的访问地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst 。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 例如: + * (start code) + * var myTerrainCurvatureCalculationService = new TerrainCurvatureCalculationService(url); + * myTerrainCurvatureCalculationService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ +class TerrainCurvatureCalculationService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.TerrainCurvatureCalculationService"; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function TerrainCurvatureCalculationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {TerrainCurvatureCalculationParameters} parameter - 地形曲率计算参数类。 + */ + processAsync(parameter) { + var me = this; + var parameterObject = {}; + + if (parameter instanceof TerrainCurvatureCalculationParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/terraincalculation/curvature'); + } + + TerrainCurvatureCalculationParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeFlow.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeFlow + * @deprecatedclass SuperMap.ThemeFlow + * @private + * @category iServer Map Theme + * @classdesc 标签或符号流动显示和牵引线风格设置类。 + * 通过该类可以设置专题图中符号是否流动显示、是否使用牵引线以及牵引线风格。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.flowEnabled=false] - 是否流动显示标签或符号。 + * @param {boolean} [options.leaderLineDisplayed=false] - 是否显示标签或符号和它标注的对象之间的牵引线。 + * @param {ServerStyle} [options.leaderLineStyle] - 标签或符号与其标注对象之间牵引线的风格。 + * @usage + */ +class ThemeFlow { + + constructor(options) { + /** + * @member {boolean} [ThemeFlow.prototype.flowEnabled=false] + * @description 是否流动显示标签或符号。
+ * 对于标签专题图而言,对于跨越比较大的区域和线条状的几何对象,在一个地图窗口中不能完全显示的情况下,如果其标签位置比较固定, + * 在当前地图窗口中该对象的标签不可见,则需要通过平移地图来查看对象的标签信息。如果采用了流动显示的效果,在当前地图窗口中,对象即使是部分显示, + * 其标签也会显示在当前地图窗口中。当平移地图时,对象的标签会随之移动,以保证在当前地图窗口中部分或全部显示的对象其标签都可见,从而可以方便地查看各要素的标签信息。 + */ + this.flowEnabled = false; + + /** + * @member {boolean} [ThemeFlow.prototype.leaderLineDisplayed=false] + * @description 是否显示标签或符号和它标注的对象之间的牵引线。false表示不显示标签或符号和它标注的对象之间的牵引线。
+ * 只有当 flowEnabled 为 true 时,牵引线才起作用。在当标签流动显示时,其位置不固定,由于牵引线始终指向要素的内点, + * 因而通过牵引线显示功能可以找到流动的标签或符号实际对应的要素。或者渲染符号偏移它所指向的对象时,图与对象之间可以采用牵引线进行连接。 + */ + this.leaderLineDisplayed = false; + + /** + * @member {ServerStyle} ThemeFlow.prototype.leaderLineStyle + * @description 标签或符号与其标注对象之间牵引线的风格。 + */ + this.leaderLineStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeFlow"; + } + + /** + * @function ThemeFlow.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.flowEnabled = null; + me.leaderLineDisplayed = null; + if (me.leaderLineStyle) { + me.leaderLineStyle.destroy(); + me.leaderLineStyle = null; + } + } + + /** + * @function ThemeFlow.fromObj + * @description 从传入对象获取标签或符号流动显示和牵引线风格设置类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeFlow} ThemeFlow 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeFlow(); + Util.copy(res, obj); + res.leaderLineStyle = ServerStyle.fromJson(obj.leaderLineStyle); + return res; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridRangeItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGridRangeItem + * @deprecatedclass SuperMap.ThemeGridRangeItem + * @category iServer Map Theme + * @classdesc 栅格分段专题图子项类。在栅格分段专题图中,将栅格值按照某种分段模式被分成多个范围段。 + * 本类用来设置每个范围段的分段起始值、终止值、名称和颜色等。每个分段所表示的范围为 [Start,End)。 + * @param {Object} options - 参数。 + * @param {ServerColor} options.color - 栅格分段专题图中每一个分段专题图子项的对应的颜色。 + * @param {string} [options.caption] - 栅格分段专题图子项的标题。 + * @param {number} [options.end=0] - 栅格分段专题图子项的终止值。 + * @param {number} [options.start=0] - 栅格分段专题图子项的起始值。 + * @param {boolean} [options.visible=true] - 栅格分段专题图子项是否可见。 + * @usage + */ +class ThemeGridRangeItem { + + constructor(options) { + /** + * @member {string} [ThemeGridRangeItem.prototype.caption] + * @description 栅格分段专题图子项的标题。 + */ + this.caption = null; + + /** + * @member {ServerColor} ThemeGridRangeItem.prototype.color + * @description 栅格分段专题图中每一个分段专题图子项的对应的颜色。 + */ + this.color = new ServerColor(); + + /** + * @member {number} [ThemeGridRangeItem.prototype.end=0] + * @description 栅格分段专题图子项的终止值,即该段专题值范围的最大值。 + */ + this.end = 0; + + /** + * @member {number} [ThemeGridRangeItem.prototype.start=0] + * @description 栅格分段专题图子项的起始值,即该段专题值范围的最小值。 + */ + this.start = 0; + + + /** + * @member {boolean} [ThemeGridRangeItem.prototype.visible=true] + * @description 栅格分段专题图子项是否可见。 + */ + this.visible = true; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeGridRangeItem"; + } + + /** + * @function ThemeGridRangeItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; + //需要验证是够存在destroy方法 + if (me.color) { + me.color.destroy(); + me.color = null; + } + me.visible = null; + } + + /** + * @function ThemeGridRangeItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.color) { + if (obj.color.toServerJSONObject) { + obj.color = obj.color.toServerJSONObject(); + } + } + return obj; + } + + /** + * @function ThemeGridRangeItem.fromObj + * @description 从传入对象获取栅格分段专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridRangeItem} ThemeGridRangeItem 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGridRangeItem(); + Util.copy(res, obj); + res.color = ServerColor.fromJson(obj.color); + return res; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridRange.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThemeGridRange + * @deprecatedclass SuperMap.ThemeGridRange + * @category iServer Map Theme + * @classdesc 栅格分段专题图。栅格分段专题图,是将所有单元格的值按照某种分段方式分成多个范围段,值在同一个范围段中的单元格使用相同的颜色进行显示。一般用来反映连续分布现象的数量或程度特征。 + * 比如某年的全国降水量分布图,将各气象站点的观测值经过内插之后生成的栅格数据进行分段显示。 + * 该类类似于分段专题图类,不同点在于分段专题图的操作对象是矢量数据,而栅格分段专题图的操作对象是栅格数据。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 栅格分段专题图子项数组。 + * @param {boolean} [options.reverseColor=false] - 是否对栅格分段专题图中分段的颜色风格进行反序显示。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 分段专题图的分段模式。 + * @param {number} [options.rangeParameter=0] - 分段参数。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @usage + */ +class ThemeGridRange extends Theme { + + constructor(options) { + super("GRIDRANGE", options); + /** + * @member {Array.} ThemeGridRange.prototype.items + * @description 栅格分段专题图子项数组。
+ * 在栅格分段专题图中,将栅格值按照某种分段模式被分成多个范围段。 + * 本类用来设置每个栅格范围段的分段起始值、终止值、名称和颜色等。每个分段所表示的范围为 [Start,End)。 + */ + this.items = null; + + /** + * @member {RangeMode} [ThemeGridRange.prototype.rangeMode=RangeMode.EQUALINTERVAL] + * @description 分段专题图的分段模式。
+ * 在栅格分段专题图中,作为专题变量的字段或表达式的值按照某种分段方式被分成多个范围段。 + * 目前 SuperMap 提供的分段方式包括:等距离分段法、平方根分段法、标准差分段法、对数分段法、等计数分段法和自定义距离法, + * 显然这些分段方法根据一定的距离进行分段,因而范围分段专题图所基于的专题变量必须为数值型。 + */ + this.rangeMode = RangeMode.EQUALINTERVAL; + + /** + * @member {number} [ThemeGridRange.prototype.rangeParameter=0] + * @description 分段参数。
+ * 当分段模式为等距离分段法,平方根分段,对数分段法,计数分段法其中一种模式时,该参数用于设置分段个数,必设;当分段模式为标准差分段法时, + * 该参数不起作用;当分段模式为自定义距离时,该参数用于设置自定义距离。 + */ + this.rangeParameter = 0; + + /** + * @member {ColorGradientType} [ThemeGridRange.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。 + * + */ + this.colorGradientType = ColorGradientType.YELLOW_RED; + + /** + * @member {boolean} ThemeGridRange.prototype.reverseColor + * @description 是否对栅格分段专题图中分段的颜色风格进行反序显示。 + */ + this.reverseColor = false; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGridRange"; + } + + /** + * @function ThemeGridRange.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + me.items = null; + } + me.reverseColor = null; + me.rangeMode = null; + me.rangeParameter = null; + me.colorGradientType = null; + } + + /** + * @function ThemeGridRange.fromObj + * @description 从传入对象获取栅格分段专题图。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridRange} ThemeGridRange 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var res = new ThemeGridRange(); + Util.copy(res, obj); + var itemsR = obj.items; + var len = itemsR ? itemsR.length : 0; + res.items = []; + for (var i = 0; i < len; i++) { + res.items.push(ThemeGridRangeItem.fromObj(itemsR[i])); + } + return res; + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridUniqueItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGridUniqueItem + * @deprecatedclass SuperMap.ThemeGridUniqueItem + * @category iServer Map Theme + * @classdesc 栅格单值专题图子项类。 + * 栅格单值专题图是将值相同的单元格归为一类,每一类是一个专题图子项。 + * @param {Object} options - 可选参数。 + * @param {string} [options.caption] - 子项的名称。 + * @param {ServerColor} [options.color] - 子项的显示颜色。 + * @param {number} options.unique - 子项的专题值,即单元格的值,值相同的单元格位于一个子项内。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ +class ThemeGridUniqueItem { + + constructor(options) { + /** + * @member {string} [ThemeGridUniqueItem.prototype.caption] + * @description 栅格单值专题图子项的名称。 + */ + this.caption = null; + + /** + * @member {ServerColor} [ThemeGridUniqueItem.prototype.color] + * @description 栅格单值专题图子项的显示颜色。 + */ + this.color = new ServerColor(); + + /** + * @member {number} ThemeGridUniqueItem.prototype.unique + * @description 栅格单值专题图子项的专题值,即单元格的值,值相同的单元格位于一个子项内。 + */ + this.unique = null; + + /** + * @member {boolean} [ThemeGridUniqueItem.prototype.visible=true] + * @description 栅格单值专题图子项是否可见。 + */ + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGridUniqueItem"; + } + + /** + * @function ThemeGridUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.caption = null; + me.unique = null; + + if (me.color) { + me.color.destroy(); + me.color = null; + } + me.visible = null; + } + + /** + * @function ThemeGridUniqueItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.color) { + if (obj.color.toServerJSONObject) { + obj.color = obj.color.toServerJSONObject(); + } + } + return obj; + } + + /** + * @function ThemeGridUniqueItem.fromObj + * @description 从传入对象获取栅格单值专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridUniqueItem} ThemeGridUniqueItem 对象。 + */ + static fromObj(obj) { + var res = new ThemeGridUniqueItem(); + Util.copy(res, obj); + res.color = ServerColor.fromJson(obj.color); + return res; + + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridUnique.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThemeGridUnique + * @deprecatedclass SuperMap.ThemeGridUnique + * @category iServer Map Theme + * @classdesc 栅格单值专题图类。栅格单值专题图是将单元格值相同的归为一类,为每一类设定一种颜色,从而用来区分不同的类别。 + * 适用于离散栅格数据和部分连续栅格数据,对于单元格值各不相同的那些连续栅格数据,使用栅格单值专题图不具有任何意义。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 栅格单值专题图子项数组。 + * @param {ServerColor} [options.defaultcolor] - 栅格单值专题图的默认颜色。 + * @usage + */ +class ThemeGridUnique extends Theme { + + constructor(options) { + super("GRIDUNIQUE", options); + /** + * @member {ServerColor} ThemeGridUnique.prototype.defaultcolor + * @description 栅格单值专题图的默认颜色。 + * 对于那些未在格网单值专题图子项之列的要素使用该颜色显示。 + */ + this.defaultcolor = new ServerColor(); + + /** + * @member {Array.} ThemeGridUnique.prototype.items + * @description 栅格单值专题图子项数组。 + * 栅格单值专题图将值相同的单元格归为一类,每一类是一个专题图子项。 + */ + this.items = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGridUnique"; + } + + /** + * @function ThemeGridUnique.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + var me = this; + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + me.items = null; + } + + if (me.defaultcolor) { + me.defaultcolor.destroy(); + me.defaultcolor = null; + } + } + + /** + * @function ThemeGridUnique.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象 + */ + toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + if (obj.defaultcolor) { + if (obj.defaultcolor.toServerJSONObject) { + obj.defaultcolor = obj.defaultcolor.toServerJSONObject(); + } + } + if (obj.items) { + var items = [], + len = obj.items.length; + for (var i = 0; i < len; i++) { + items.push(obj.items[i].toServerJSONObject()); + } + obj.items = items; + } + return obj; + } + + /** + * @function ThemeGridUnique.fromObj + * @description 从传入对象获取栅格单值专题图类。 + * @param {Object} obj - 传入对象 + * @returns {ThemeGridUnique} ThemeGridUnique 对象 + */ + static fromObj(obj) { + var res = new ThemeGridUnique(); + var uItems = obj.items; + var len = uItems ? uItems.length : 0; + Util.extend(res, obj); + res.items = []; + res.defaultcolor = ServerColor.fromJson(obj.defaultcolor); + for (var i = 0; i < len; i++) { + res.items.push(ThemeGridUniqueItem.fromObj(uItems[i])); + } + return res; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelUniqueItem.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeLabelUniqueItem + * @deprecatedclass SuperMap.ThemeLabelUniqueItem + * @category iServer Map Theme + * @classdesc 单值标签专题图的子项。标签专题图用专题值对点、线、面等对象做标注,值得注意的是,单值标签专题图允许用户通过 uniqueExpression + * 字段指定用于单值的字段,同一值的标签具有相同的显示风格,其中每一个值就是一个专题图子项, + * 每一个子项都具有其名称、风格、指定的单值、X 方向偏移量和 Y 方向偏移量。 + * @param {Object} options - 参数。 + * @param {string} options.unique - 子项的值,可以为数字、字符串等。 + * @param {string} [options.caption] - 子项的名称。 + * @param {number} [options.offsetX=0] - 标签在 X 方向偏移量。 + * @param {number} [options.offsetY=0] - 标签在 Y 方向偏移量。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @param {ServerTextStyle} [options.style] - 子项文本的显示风格。 + * @usage + */ +class ThemeLabelUniqueItem { + + constructor(options) { + /** + * @member {string} [ThemeLabelUniqueItem.prototype.caption] + * @description 标签专题子项的标题。 + */ + this.caption = null; + + /** + * @member {string} ThemeLabelUniqueItem.prototype.unique + * @description 单值专题图子项的值,可以为数字、字符串等。 + */ + this.unique = null; + + /** + * @member {number} [ThemeLabelUniqueItem.prototype.offsetX=0] + * @description 标签在 X 方向偏移量。 + */ + this.offsetX = 0; + + /** + * @member {number} [ThemeLabelUniqueItem.prototype.offsetY=0] + * @description 标签在 Y 方向偏移量。 + */ + this.offsetY = 0; + + /** + * @member {boolean} [ThemeLabelUniqueItem.prototype.visible=true] + * @description 标签专题图子项是否可见。如果标签专题图子项可见,则为 true,否则为 false。 + */ + this.visible = true; + + /** + * @member {ServerTextStyle} ThemeLabelUniqueItem.prototype.style + * @description 标签专题图子项文本的显示风格。各种风格的优先级从高到低为:
+ * uniformMixedStyle(标签文本的复合风格),ThemeLabelUniqueItem.style(单值子项的文本风格),uniformStyle(统一文本风格)。 + */ + this.style = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThemeLabelUniqueItem"; + } + + /** + * @function ThemeLabelUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.unique = null; + me.caption = null; + me.offsetX = null; + me.offsetY = null; + if (me.style) { + me.style.destroy(); + me.style = null; + } + me.visible = null; + } + + /** + * @function ThemeLabelUniqueItem.fromObj + * @description 从传入对象获取单值标签专题图的子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelUniqueItem} ThemeLabelUniqueItem 对象。 + */ + static fromObj(obj) { + if (!obj) { + return; + } + var t = new ThemeLabelUniqueItem(); + Util.copy(t, obj); + return t; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeMemoryData.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeMemoryData + * @deprecatedclass SuperMap.ThemeMemoryData + * @category iServer Map Theme + * @classdesc 专题图内存数据类。 + * @param {Array} srcData - 原始值数组。 + * @param {Array} targetData - 外部值数组。 + * @usage + */ +class ThemeMemoryData { + + constructor(srcData, targetData) { + /** + * @member {Array} ThemeMemoryData.prototype.srcData + * @description 原始值数组,该属性值将被 targetData 属性所指定的值替换掉,然后制作专题图,但数据库中的值并不会改变。 + */ + this.srcData = srcData; + + /** + * @member {Array} ThemeMemoryData.prototype.targetData + * @description 外部值数组,即用于制作专题图的内存数据,设定该属性值后,会将 srcData 属性所指定的原始值替换掉制作专题图,但数据库中的值并不会改变。 + */ + this.targetData = targetData; + + this.CLASS_NAME = "SuperMap.ThemeMemoryData"; + } + + /** + * @function ThemeMemoryData.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.srcData = null; + me.targetData = null; + } + + + /** + * @function ThemeMemoryData.prototype.toJSON + * @description 将 ThemeMemoryData 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + if (this.srcData && this.targetData) { + var memoryDataStr = ""; + var count = Math.min(this.srcData.length, this.targetData.length); + for (var i = 0; i < count; i++) { + memoryDataStr += "\'" + this.srcData[i] + "\':\'" + this.targetData[i] + "\',"; + } + //去除多余的逗号 + if (i > 0) { + memoryDataStr = memoryDataStr.substring(0, memoryDataStr.length - 1); + } + return "{" + memoryDataStr + "}"; + } else { + return null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeParameters + * @deprecatedclass SuperMap.ThemeParameters + * @category iServer Map Theme + * @classdesc 专题图参数类。 + * 该类存储了制作专题所需的参数,包括数据源、数据集名称和专题图对象。 + * @param {Object} options - 参数。 + * @param {Array.} options.datasetNames - 数据集数组。 + * @param {Array.} options.dataSourceNames - 数据源数组。 + * @param {Array.} [options.joinItems] - 专题图外部表的连接信息 JoinItem 数组。 + * @param {Array.} options.themes - 专题图对象列表。 + * @param {Array.} [options.displayFilters] - 专题图属性过滤条件。 + * @param {Array.} [options.displayOrderBys] - 专题图对象生成符号叠加次序排序字段。 + * @param {Object} [options.fieldValuesDisplayFilter] - 图层要素的显示和隐藏的过滤属性,其带有三个属性,分别是:values、fieldName、fieldValuesDisplayMode。 + * @usage + */ +class ThemeParameters { + + constructor(options) { + /** + * @member {Array.} ThemeParameters.prototype.datasetNames + * @description 要制作专题图的数据集数组。 + */ + this.datasetNames = null; + + /** + * @member {Array.} ThemeParameters.prototype.dataSourceNames + * @description 要制作专题图的数据集所在的数据源数组。 + */ + this.dataSourceNames = null; + + /** + * @member {Array.} [ThemeParameters.prototype.joinItems] + * @description 设置与外部表的连接信息 JoinItem 数组。 + * 使用此属性可以制作与外部表连接的专题图。 + */ + this.joinItems = null; + + /** + * @member {Array.} ThemeParameters.prototype.themes + * @description 专题图对象列表。 + * 该参数为实例化的各类专题图对象的集合。 + */ + this.themes = null; + + /** + * @member {Array.} [ThemeParameters.prototype.displayFilters] + * @description 专题图属性过滤条件。 + */ + this.displayFilters = null; + + /** + * @member {Array.} [ThemeParameters.prototype.displayOrderBys] + * @description 专题图对象生成符号叠加次序排序字段。 + */ + this.displayOrderBys = null; + + /** + * @member {Object} [ThemeParameters.prototype.fieldValuesDisplayFilter] + * @property {Array.} values - 待过滤的值。 + * @property {string} fieldName - 待过滤的字段名称只支持数字类型的字段。 + * @property {string} fieldValuesDisplayMode - 目前为 DISPLAY/DISABLE。当为 DISPLAY 时,表示只显示以上设置的相应属性值的要素,否则表示不显示以上设置的相应属性值的要素。 + */ + this.fieldValuesDisplayFilter = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeParameters"; + } + + + /** + * @function ThemeParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasetNames = null; + me.dataSourceNames = null; + if (me.joinItems) { + for (let i = 0, joinItems = me.joinItems, len = joinItems.length; i < len; i++) { + joinItems[i].destroy(); + } + me.joinItems = null; + } + if (me.themes) { + for (let i = 0, themes = me.themes, len = themes.length; i < len; i++) { + themes[i].destroy(); + } + me.themes = null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThemeService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeService + * @deprecatedclass SuperMap.ThemeService + * @category iServer Map Theme + * @classdesc 专题图服务类。 + * @extends {CommonServiceBase} + * @example + * var myThemeService = new ThemeService(url, { + * eventListeners: { + * "processCompleted": themeCompleted, + * "processFailed": themeFailed + * } + * }); + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class ThemeService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + if (options) { + Util.extend(this, options); + } + this.url = Util.urlPathAppend(this.url, 'tempLayersSet'); + this.CLASS_NAME = 'SuperMap.ThemeService'; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function ThemeService.prototype.processAsync + * @description 负责将客户端的专题图参数传递到服务端。 + * @param {ThemeParameters} params - 专题图参数类。 + */ + processAsync(params) { + if (!(params instanceof ThemeParameters)) { + return; + } + var me = this, + jsonParameters = null; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ThemeService.prototype.getJsonParameters + * @description 将专题图参数参数转化为 JSON 字符串。 + * @param {ThemeParameters} parameter - 专题图参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + getJsonParameters(parameter) { + var jsonParameters = "", + themeObj = null, + filters = null, + orderBys = null, + fieldValuesDisplayFilter; + jsonParameters += "[{'type': 'UGC','subLayers': {'layers': ["; + + for (var i = 0; i < parameter.themes.length; i++) { + themeObj = parameter.themes[i]; + var jsonTheme = Util.toJSON(themeObj); + jsonTheme = jsonTheme.slice(0, -1); + + jsonParameters += "{'theme': " + jsonTheme + "},'type': 'UGC','ugcLayerType': 'THEME',"; + filters = parameter.displayFilters; + if (filters && filters.length > 0) { + if (filters.length === 1) { + jsonParameters += "'displayFilter':\"" + filters[0] + "\","; + } else { + jsonParameters += "'displayFilter':\"" + filters[i] + "\","; + } + } + orderBys = parameter.displayOrderBy; + if (orderBys && orderBys.length > 0) { + if (orderBys.length === 1) { + jsonParameters += "'displayOrderBy':'" + orderBys[0] + "',"; + } else { + jsonParameters += "'displayOrderBy':'" + orderBys[i] + "',"; + } + } + + fieldValuesDisplayFilter = parameter.fieldValuesDisplayFilter; + if (fieldValuesDisplayFilter) { + jsonParameters += "'fieldValuesDisplayFilter':" + Util.toJSON(fieldValuesDisplayFilter) + ","; + } + + if (parameter.joinItems && parameter.joinItems.length > 0 && parameter.joinItems[i]) { + jsonParameters += "'joinItems':[" + Util.toJSON(parameter.joinItems[i]) + "],"; + } + if (parameter.datasetNames && parameter.dataSourceNames) { + var datasetID = parameter.datasetNames[i] ? i : (parameter.datasetNames.length - 1); + var dataSourceID = parameter.dataSourceNames[i] ? i : (parameter.dataSourceNames.length - 1); + jsonParameters += "'datasetInfo': {'name': '" + parameter.datasetNames[datasetID] + + "','dataSourceName': '" + parameter.dataSourceNames[dataSourceID] + "'}},"; + } else { + jsonParameters += "},"; + } + } + //去除多余的逗号 + if (parameter.themes && parameter.themes.length > 0) { + jsonParameters = jsonParameters.substring(0, jsonParameters.length - 1); + } + jsonParameters += "]},"; + var urlArray = this.url.split("/"); + var jsonMapName = urlArray[urlArray.length - 2]; + + jsonParameters += "'name': '" + jsonMapName + "'}]"; + return jsonParameters; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/ThiessenAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThiessenAnalystService + * @deprecatedclass SuperMap.ThiessenAnalystService + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc + * 泰森多边形分析服务类 + * 该类负责将客户设置的泰森多边形分析参数传递给服务端,并接收服务端返回的分析结果数据。 + * 泰森多边形分析结果通过该类支持的事件的监听函数参数获取 + * 泰森多边形分析的参数支持两种,当参数为 {@link DatasetThiessenAnalystParameters} 类型 + * 时,执行数据集泰森多边形分析,当参数为 {@link GeometryThiessenAnalystParameters} 类型时, + * 执行几何对象泰森多边形分析。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myThiessenAnalystService = new ThiessenAnalystService(url, { + * eventListeners: { + * "processCompleted": bufferCompleted, + * "processFailed": bufferFailed + * } + * }); + * (end) + * @usage + */ +class ThiessenAnalystService extends SpatialAnalystBase { + + + constructor(url, options) { + super(url, options); + /** + * @member {string} ThiessenAnalystService.prototype.mode + * @description 缓冲区分析类型 + */ + this.mode = null; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.ThiessenAnalystService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + this.mode = null; + } + + /** + * @function ThiessenAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {DatasetThiessenAnalystParameters|GeometryThiessenAnalystParameters} parameter - 泰森多边形分析参数基类。 + */ + processAsync(parameter) { + var parameterObject = {}; + var me = this; + if (parameter instanceof DatasetThiessenAnalystParameters) { + me.mode = "datasets"; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/thiessenpolygon'); + DatasetThiessenAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryThiessenAnalystParameters) { + me.mode = "geometry"; + me.url = Util.urlPathAppend(me.url, 'geometry/thiessenpolygon'); + GeometryThiessenAnalystParameters.toObject(parameter, parameterObject); + } + + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/GeometryBatchAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class GeometryBatchAnalystService + * @deprecatedclass SuperMap.GeometryBatchAnalystService + * @category iServer SpatialAnalyst BatchAnalyst + * @classdesc 批量空间分析服务类 + * @description 该类负责将客户设置的叠加分析参数传递给服务端,并接收服务端返回的叠加分析结果数据。 + * 获取的结果数据包括 originResult 、result 两种, + * 其中,originResult 为服务端返回的用 JSON 对象表示的量算结果数据,result 为服务端返回的量算结果数据。 + * @extends {SpatialAnalystBase} + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myOverlayAnalystService = new GeometryBatchAnalystService(url, { + * eventListeners: { + * "processCompleted": OverlayCompleted, + * "processFailed": OverlayFailed + * } + * }); + * @usage + */ +class GeometryBatchAnalystService extends SpatialAnalystBase { + + constructor(url, options) { + super(url, options); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GeometryBatchAnalystService"; + } + + /** + * @function GeometryBatchAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {GeometryOverlayAnalystParameter} parameter - 批量几何对象叠加分析参数类 + * + */ + processAsync(parameters) { + var me = this; + me.url = Util.urlPathAppend(me.url, 'geometry/batchanalyst'); + me.url = Util.urlAppend(me.url, 'returnContent=true&ignoreAnalystParam=true'); + var parameterObjects = me._processParams(parameters); + var jsonParameters = Util.toJSON(parameterObjects); + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + _processParams(parameters) { + var me = this; + if (!Util.isArray(parameters)) { + return; + } + var processParams = []; + parameters.map(function (item) { + processParams.push(me._toJSON(item)); + return item; + }); + + return processParams; + } + + _toJSON(parameter) { + var tempObj = {}; + if(parameter.analystName ==="buffer"){ + tempObj.analystName = "buffer"; + tempObj.param = {}; + //几何对象的批量空间分析, + GeometryBufferAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="overlay"){ + tempObj.analystName = "overlay"; + tempObj.param = {}; + GeometryOverlayAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="interpolationDensity"){ + tempObj.analystName = "interpolationDensity"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="interpolationidw"){ + tempObj.analystName = "interpolationidw"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="interpolationRBF"){ + tempObj.analystName = "interpolationRBF"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="interpolationKriging"){ + tempObj.analystName = "interpolationKriging"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + + }else if(parameter.analystName ==="thiessenpolygon"){ + tempObj.analystName = "thiessenpolygon"; + tempObj.param = {}; + GeometryThiessenAnalystParameters.toObject(parameter.param, tempObj.param); + + }else { + //isoline; isoregion; calculatemeasure; routelocator 四种分析不需要再处理参数 + return parameter; + } + return tempObj; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/iServer/TilesetsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TilesetsService + * @deprecatedclass SuperMap.TilesetsService + * @category iServer Map Tilesets + * @classdesc 切片列表信息查询服务类;即查询切片地图服务的切片列表,返回切片集名称、地图切片元数据信息、切片版本集信息。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{服务名}/rest/maps/map; + * 例如: "http://localhost:8090/iserver/services/test/rest/maps/tianlocal"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class TilesetsService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.TilesetsService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function TilesetsService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + */ + processAsync() { + if (!this.url) { + return; + } + var me = this; + me.url = Util.urlPathAppend(me.url, 'tilesets'); + me.request({ + method: "GET", + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/TopologyValidatorJobsParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class TopologyValidatorJobsParameter + * @deprecatedclass SuperMap.TopologyValidatorJobsParameter + * @category iServer ProcessingService TopologyValidator + * @classdesc 拓扑检查分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetTopology -检查对象所在的数据集名称。 + * @param {TopologyValidatorRule} [options.rule=TopologyValidatorRule.REGIONNOOVERLAP] - 拓扑检查规则。 + * @param {string} [options.tolerance] - 容限。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class TopologyValidatorJobsParameter { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} TopologyValidatorJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} TopologyValidatorJobsParameter.prototype.datasetTopology + * @description 拓扑检查对象所在的数据集名称。 + */ + this.datasetTopology = ""; + + /** + * @member {string} [TopologyValidatorJobsParameter.prototype.tolerance] + * @description 容限,指定的拓扑错误检查时使用的容限。 + */ + this.tolerance = ""; + + /** + * @member {TopologyValidatorRule} [TopologyValidatorJobsParameter.prototype.rule=TopologyValidatorRule.REGIONNOOVERLAP] + * @description 拓扑检查模式。 + */ + this.rule = TopologyValidatorRule.REGIONNOOVERLAP; + + /** + * @member {OutputSetting} [TopologyValidatorJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [TopologyValidatorJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TopologyValidatorJobsParameter"; + } + + /** + * @function TopologyValidatorJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.datasetTopology = null; + this.tolerance = null; + this.rule = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function TopologyValidatorJobsParameter.toObject + * @param {Object} TopologyValidatorJobsParameter -拓扑检查分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成拓扑检查分析任务对象。 + */ + static toObject(TopologyValidatorJobsParameter, tempObj) { + for (var name in TopologyValidatorJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = TopologyValidatorJobsParameter[name]; + continue; + } + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = TopologyValidatorJobsParameter[name]; + continue; + } + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = TopologyValidatorJobsParameter[name]; + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = TopologyValidatorJobsParameter[name]; + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/TopologyValidatorJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TopologyValidatorJobsService + * @deprecatedclass SuperMap.TopologyValidatorJobsService + * @category iServer ProcessingService TopologyValidator + * @classdesc 拓扑检查分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class TopologyValidatorJobsService extends ProcessingServiceBase { + + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/topologyvalidator'); + this.CLASS_NAME = "SuperMap.TopologyValidatorJobsService"; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function TopologyValidatorJobsService.protitype.getTopologyValidatorJobs + * @description 获取拓扑检查分析所有任务 + */ + getTopologyValidatorJobs() { + super.getJobs(this.url); + } + + /** + * @function TopologyValidatorJobsService.protitype.getTopologyValidatorJob + * @description 获取指定id的拓扑检查分析服务 + * @param {string} id - 指定要获取数据的id + */ + getTopologyValidatorJob(id) { + super.getJobs( Util.urlPathAppend(this.url, id)); + } + + /** + * @function TopologyValidatorJobsService.protitype.addTopologyValidatorJob + * @description 新建拓扑检查分析服务 + * @param {TopologyValidatorJobsParameter} params - 拓扑检查分析任务参数类。 + * @param {number} seconds -创建成功结果的时间间隔。 + */ + addTopologyValidatorJob(params, seconds) { + super.addJob(this.url, params, TopologyValidatorJobsParameter, seconds); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/TransferLine.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TransferLine + * @deprecatedclass SuperMap.TransferLine + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 换乘路线信息类。 + * @param {Object} options - 参数。 + * @param {number} options.lineID - 乘车路线 ID。 + * @param {string} options.lineName - 乘车路线名称。 + * @param {string} options.lineAliasName - 乘车路线别名。 + * @param {number} options.startStopIndex - 上车站点在本公交路线中的索引。 + * @param {string} options.startStopName - 上车站点名称。 + * @param {string} options.startStopAliasName - 上车站点别名。 + * @param {number} options.endStopIndex - 下车站点在本公交路线中的索引。 + * @param {string} options.endStopName - 下车站点名称。 + * @param {string} options.endStopAliasName - 下车站点别名。 + * @usage + */ +class TransferLine { + + constructor(options) { + options = options || {}; + /** + * @member {number} TransferLine.prototype.lineID + * @description 乘车路线 ID。 + */ + this.lineID = null; + + /** + * @member {string} TransferLine.prototype.lineName + * @description 乘车路线名称。 + */ + this.lineName = null; + + /** + * @member {string} TransferLine.prototype.lineAliasName + * @description 乘车路线别名。 + */ + this.lineAliasName = null; + + /** + * @member {number} TransferLine.prototype.startStopIndex + * @description 上车站点在本公交路线中的索引。 + */ + this.startStopIndex = null; + + /** + * @member {string} TransferLine.prototype.startStopName + * @description 上车站点名称。 + */ + this.startStopName = null; + + /** + * @member {string} TransferLine.prototype.startStopAliasName + * @description 上车站点别名。 + */ + this.startStopAliasName = null; + + /** + * @member {number} TransferLine.prototype.endStopIndex + * @description 下车站点在本公交路线中的索引。 + */ + this.endStopIndex = null; + + /** + * @member {string} TransferLine.prototype.endStopName + * @description 下车站点名称。 + */ + this.endStopName = null; + + /** + * @member {string} TransferLine.prototype.endStopAliasName + * @description 下车站点别名。 + */ + this.endStopAliasName = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TransferLine"; + } + + + /** + * @function TransferLine.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + /** + * @function TransferLine.fromJson + * @description 将返回结果转化为 {@link TransferLine} 对象。 + * @param {Object} jsonObject - 新的返回结果。 + * @returns {TransferLine} 转化后的 {@link TransferLine} 对象。 + */ + static fromJson(jsonObject) { + if (!jsonObject) { + return; + } + return new TransferLine({ + lineID: jsonObject['lineID'], + lineName: jsonObject['lineName'], + lineAliasName: jsonObject['lineAliasName'], + startStopIndex: jsonObject['startStopIndex'], + startStopName: jsonObject['startStopName'], + startStopAliasName: jsonObject['startStopAliasName'], + endStopIndex: jsonObject['endStopIndex'], + endStopName: jsonObject['endStopName'], + endStopAliasName: jsonObject['endStopAliasName'] + }); + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/TransferPathParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TransferPathParameters + * @deprecatedclass SuperMap.TransferPathParameters + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 交通换乘线路查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.transferLines - 本换乘分段内可乘车的路线集合。 + * @param {Array.|number>} options.points - 两种查询方式:按照公交站点的起止 ID 进行查询和按照起止点的坐标进行查询。 + * @usage + */ +class TransferPathParameters { + + constructor(options) { + options = options || {}; + /** + * @member {Array.} TransferPathParameters.prototype.transferLines + * @description 本换乘分段内可乘车的路线集合,通过交通换乘方案查询得到。 + */ + this.transferLines = null; + + + /** + * @member {Array.|number>} TransferPathParameters.prototype.points + * @description 两种查询方式:
+ * 1. 按照公交站点的起止ID进行查询,则 points 参数的类型为 int[],形如:[起点ID、终点ID],公交站点的 ID 对应服务提供者配置中的站点 ID 字段; + * 2. 按照起止点的坐标进行查询,则 points 参数的类型为 Point2D[],形如:[{"x":44,"y":39},{"x":45,"y":40}]。 + */ + this.points = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TransferPathParameters"; + } + + /** + * @function TransferPathParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + /** + * @function TransferPathParameters.toJson + * @description 将 {@link TransferPathParameters} 对象参数转换为 JSON 字符串。 + * @param {TransferPathParameters} params - 交通换乘参数。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJson(params) { + if (params) { + return Util.toJSON(params); + } + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/TransferPathService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TransferPathService + * @deprecatedclass SuperMap.TransferPathService + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 交通换乘线路查询服务类,根据交通换乘分析结果(TransferSolutionResult),获取某一条乘车路线的详细信息。 + * 返回结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @example 例如: + * var myService = new TransferPathService(url, {eventListeners: { + * "processCompleted": TrafficTransferCompleted, + * "processFailed": TrafficTransferError + * } + * }; + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class TransferPathService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.TransferPathService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function TransferPathService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {TransferPathParameters} params - 交通换乘参数。 + */ + processAsync(params) { + if (!(params instanceof TransferPathParameters)) { + return; + } + var me = this, + method = "GET", + jsonParameters; + + me.url = Util.urlPathAppend(me.url, 'path'); + jsonParameters = { + points: Util.toJSON(params.points), + transferLines: Util.toJSON(params['transferLines']) + }; + + me.request({ + method: method, + params: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/TransferSolutionParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TransferSolutionParameters + * @deprecatedclass SuperMap.TransferSolutionParameters + * @category iServer TrafficTransferAnalyst TransferSolutions + * @classdesc 交通换乘方案查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.|number>} options.points - 两种查询方式:按照公交站点的起止ID进行查询和按照起止点的坐标进行查询。 + * @param {number} [options.solutionCount=6] - 乘车方案的数量。 + * @param {TransferTactic} [options.transferTactic=TransferTactic.LESS_TIME] - 交通换乘策略类型,包括时间最短、距离最短、最少换乘、最少步行四种选择。 + * @param {TransferPreference} [options.transferPreference=TransferPreference.NONE] - 乘车偏好枚举。 + * @param {number} [options.walkingRatio=10] - 步行与公交的消耗权重比。 + * @param {Array.} [options.evadeLines] - 避让路线的 ID。 + * @param {Array.} [options.evadeStops] - 避让站点的 ID。 + * @param {Array.} [options.priorLines] - 优先路线的 ID。 + * @param {Array.} [options.priorStops] - 优先站点的 ID。 + * @param {string} [options.travelTime] - 出行的时间。 + * @usage + */ +class TransferSolutionParameters { + + constructor(options) { + options = options || {}; + /** + * @member {number} [TransferSolutionParameters.prototype.solutionCount=6] + * @description 乘车方案的数量。 + */ + this.solutionCount = 6; + /** + * @member {TransferPreference} [TransferSolutionParameters.prototype.transferPreference=TransferPreference.NONE] + * @description 乘车偏好枚举。 + */ + this.transferPreference = TransferPreference.NONE; + + /** + * @member {TransferTactic} [TransferSolutionParameters.prototype.transferTactic=TransferTactic|TransferTactic.LESS_TIME] + * @description 交通换乘策略类型,包括时间最短、距离最短、最少换乘、最少步行四种选择。 + */ + this.transferTactic = TransferTactic.LESS_TIME; + + /** + * @member {number} [TransferSolutionParameters.prototype.walkingRatio=10] + * @description 步行与公交的消耗权重比。此值越大,则步行因素对于方案选择的影响越大。例如:
+ * 例如现在有两种换乘方案(在仅考虑消耗因素的情况下):
+ * 方案1:坐车 10 公里,走路 1 公里;
+ * 方案2:坐车 15 公里,走路 0.5 公里;
+ * 1. 假设权重比为 15:
+ * •方案 1 的总消耗为:10 + 1*15 = 25
+ * •方案 2 的总消耗为:15 + 0.5*15 = 22.5
+ * 此时方案 2 消耗更低。
+ * 2. 假设权重比为2:
+ * •方案 1 的总消耗为:10+1*2 = 12
+ * •方案 2 的总消耗为:15+0.5*2 = 17
+ * 此时方案 1 消耗更低。
+ */ + + this.walkingRatio = null; + + /** + * @member {Array.|number>} TransferSolutionParameters.prototype.points + * @description 两种查询方式:
+ * 1. 按照公交站点的起止 ID 进行查询,则 points 参数的类型为 int[],形如:[起点 ID、终点 ID],公交站点的 ID 对应服务提供者配置中的站点 ID 字段; + * 2. 按照起止点的坐标进行查询,则 points 参数的类型为 Point2D[],形如:[{"x":44,"y":39},{"x":45,"y":40}]。 + */ + this.points = false; + + /** + * @member {Array.} [TransferSolutionParameters.prototype.evadeLinesnull] + * @description 避让路线 ID。 + * */ + this.evadeLines = null; + + /** + * @member {Array.} [TransferSolutionParameters.prototype.evadeStops=TransferLine] + * @description 避让站点 ID。 + * */ + this.evadeStops = null; + + /** + * @member {Array.} [TransferSolutionParameters.prototype.priorLines] + * @description 优先路线 ID。 + * */ + this.priorLines = null; + + /** + * @member {Array.} [TransferSolutionParameters.prototype.priorStops] + * @description 优先站点 ID。 + * */ + this.priorStops = null; + + /** + * @member {string} TransferSolutionParameters.prototype.travelTime + * @description 出行的时间; 格式是:"小时:分钟",如:"08:30"。如果设置了该参数,在分析时,则会考虑线路的首末班车时间的限制,即在返回的结果中会提示公交的首末班发车时间。 + */ + this.travelTime = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TransferSolutionParameters"; + } + + /** + * @function TransferSolutionParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + Util.reset(this); + } + + + /** + * @function TransferSolutionParameters.toJsonParameters + * @description 将 {@link TransferSolutionParameters} 对象参数转换为 JSON 字符串。 + * @param {TransferSolutionParameters} params - 交通换乘参数。 + * @returns {string} 转化后的 JSON 字符串。 + */ + static toJson(params) { + if (params) { + return Util.toJSON(params); + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/TransferSolutionService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TransferSolutionService + * @deprecatedclass SuperMap.TransferSolutionService + * @category iServer TrafficTransferAnalyst TransferSolutions + * @classdesc 交通换乘方案查询服务类。 + * 返回结果通过该类支持的事件的监听函数参数获取。 + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。
+ * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example 例如: + * (start code) + * var myService = new TransferSolutionService(url, {eventListeners: { + * "processCompleted": trafficTransferCompleted, + * "processFailed": trafficTransferError + * } + * }; + * (end) + * @usage + */ +class TransferSolutionService extends CommonServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.TransferSolutionService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function TransferSolutionService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {TransferSolutionParameters} params - 交通换乘参数。 + */ + processAsync(params) { + if (!(params instanceof TransferSolutionParameters)) { + return; + } + var me = this, + method = "GET", + jsonParameters; + + me.url = Util.urlPathAppend(me.url, 'solutions'); + jsonParameters = { + points: Util.toJSON(params.points), + walkingRatio: params['walkingRatio'], + transferTactic: params['transferTactic'], + solutionCount: params['solutionCount'], + transferPreference: params["transferPreference"] + }; + if (params.evadeLines) { + jsonParameters["evadeLines"] = Util.toJSON(params.evadeLines); + } + if (params.evadeStops) { + jsonParameters["evadeStops"] = Util.toJSON(params.evadeStops); + } + if (params.priorLines) { + jsonParameters["priorLines"] = Util.toJSON(params.priorLines); + } + if (params.priorStops) { + jsonParameters["priorStops"] = Util.toJSON(params.priorStops); + } + if (params.travelTime) { + jsonParameters["travelTime"] = params.travelTime; + } + + me.request({ + method: method, + params: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/UpdateEdgeWeightParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UpdateEdgeWeightParameters + * @deprecatedclass SuperMap.UpdateEdgeWeightParameters + * @category iServer NetworkAnalyst EdgeWeight + * @classdesc 边的耗费权重更新服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.edgeId - 所在边的 ID。 + * @param {string} options.fromNodeId - 起始转向点的 ID。 + * @param {string} options.toNodeId - 终止转向点的 ID。 + * @param {string} options.weightField - 边的耗费字段。 + * @param {string} options.edgeWeight - 耗费权重。 + * @usage + */ +class UpdateEdgeWeightParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} UpdateEdgeWeightParameters.prototype.edgeId + * @description 所在边的 ID。 + */ + this.edgeId = ""; + + /** + * @member {string} UpdateEdgeWeightParameters.prototype.fromNodeId + * @description 起始转向点的 ID。 + */ + this.fromNodeId = ""; + + /** + * @member {string} UpdateEdgeWeightParameters.prototype.toNodeId + * @description 终止转向点的 ID。 + */ + this.toNodeId = ""; + + /** + * @member {string} UpdateEdgeWeightParameters.prototype.weightField + * @description 边的耗费字段。 + */ + this.weightField = ""; + + /** + * @member {string} UpdateEdgeWeightParameters.prototype.edgeWeight + * @description 耗费权重。 + */ + this.edgeWeight = ""; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.UpdateEdgeWeightParameters"; + } + + + /** + * @function UpdateEdgeWeightParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.edgeId = null; + this.fromNodeId = null; + this.toNodeId = null; + this.weightField = null; + this.edgeWeight = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/CreateDatasetParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CreateDatasetParameters + * @deprecatedclass SuperMap.CreateDatasetParameters + * @category iServer Data Dataset + * @classdesc 数据集创建参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称,此为必选参数。 + * @param {string} options.datasetName - 数据集名称,此为必选参数。 + * @param {string} options.datasetType - 数据集类型。目前支持创建的出聚集类型有:点、线、面、文本、复合(CAD)和属性数据集。 + * @usage + */ +class CreateDatasetParameters { + + constructor(options) { + if (!options) { + return; + } + + /** + * @member {string} CreateDatasetParameters.prototype.datasourceName + * @description 数据源名称,此为必选参数。 + */ + this.datasourceName = null; + + /** + * @member {string} CreateDatasetParameters.prototype.datasetName + * @description 数据集名称,此为必选参数。 + */ + this.datasetName = null; + + /** + * @member {string} CreateDatasetParameters.prototype.datasetType + * @description 数据集类型。目前支持创建的出聚集类型有:点、线、面、文本、复合(CAD)和属性数据集。 + */ + this.datasetType = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.CreateDatasetParameters"; + } + /** + * @function CreateDatasetParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasourceName = null; + me.datasetName = null; + me.datasetType = null; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/UpdateEdgeWeightService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class UpdateEdgeWeightService + * @deprecatedclass SuperMap.UpdateEdgeWeightService + * @category iServer NetworkAnalyst EdgeWeight + * @classdesc 更新边的边的耗费权重服务 + * @extends {NetworkAnalystServiceBase} + * @example + *(start code) + * var updateEdgeWeightService = new UpdateEdgeWeightService(url, { + * eventListeners: { + * "processCompleted": UpdateEdgeWeightCompleted, + * "processFailed": UpdateEdgeWeightError + * } + * }); + * (end) + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class UpdateEdgeWeightService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.UpdateEdgeWeightService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function UpdateEdgeWeightService.prototype.processAsync + * @description 开始异步执行边的边的耗费权重的更新 + * @param {UpdateEdgeWeightParameters} params - 边的耗费权重更新服务参数类 + * @example + * (code) + * var updateEdgeWeightParam=new SuperMapUpdateEdgeWeightParameters({ + * edgeId:"20", + * fromNodeId:"26", + * toNodeId:"109", + * weightField:"time", + * edgeWeight:"25" + * }); + * updateEdgeWeightService.processAsync(updateEdgeWeightParam); + * (end) + */ + processAsync(params) { + if (!(params instanceof UpdateEdgeWeightParameters)) { + return; + } + + var me = this; + var paramStr = me.parse(params); + me.url = Util.urlPathAppend(me.url, paramStr); + var data = params.edgeWeight ? params.edgeWeight : null; + me.request({ + method: "PUT", + scope: me, + data: data, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function UpdateEdgeWeightService.prototype.parse + * @description 将更新服务参数解析为用‘/’做分隔的字符串 + */ + parse(params) { + if (!params) { + return; + } + var paramStr = ""; + for (var attr in params) { + if (params[attr] === "" || params[attr] === "edgeWeight") { + continue; + } + switch (attr) { + case "edgeId": + paramStr += "/edgeweight/" + params[attr]; + break; + case "fromNodeId": + paramStr += "/fromnode/" + params[attr]; + break; + case "toNodeId": + paramStr += "/tonode/" + params[attr]; + break; + case "weightField": + paramStr += "/weightfield/" + params[attr]; + break; + default : + break; + } + } + return paramStr; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/UpdateTurnNodeWeightParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UpdateTurnNodeWeightParameters + * @deprecatedclass SuperMap.UpdateTurnNodeWeightParameters + * @category iServer NetworkAnalyst TurnNodeWeight + * @classdesc 转向耗费权重更新服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.nodeId - 转向结点的 ID。 + * @param {string} options.fromEdgeId - 起始边的 ID。 + * @param {string} options.toEdgeId - 终止边的 ID。 + * @param {string} options.weightField - 转向结点的耗费字段。 + * @param {string} options.turnNodeWeight - 耗费权重。 + * @usage + */ +class UpdateTurnNodeWeightParameters { + + constructor(options) { + if (!options) { + return; + } + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.nodeId + * @description 转向结点的 ID。 + */ + this.nodeId = ""; + + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.fromEdgeId + * @description 起始边的 ID。 + */ + this.fromEdgeId = ""; + + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.toEdgeId + * @description 终止边的 ID。 + */ + this.toEdgeId = ""; + + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.weightField + * @description 转向结点的耗费字段。 + */ + this.weightField = ""; + + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.turnNodeWeight + * @description 耗费权重。 + */ + this.turnNodeWeight = ""; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.UpdateTurnNodeWeightParameters"; + } + + /** + * @function UpdateTurnNodeWeightParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.nodeId = null; + this.fromEdgeId = null; + this.toEdgeId = null; + this.weightField = null; + this.turnNodeWeight = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/UpdateTurnNodeWeightService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class UpdateTurnNodeWeightService + * @deprecatedclass SuperMap.UpdateTurnNodeWeightService + * @category iServer NetworkAnalyst TurnNodeWeight + * @classdesc 转向耗费权重更新服务类 + * @extends {NetworkAnalystServiceBase} + * @example + * var UpdateTurnNodeWeightService = new UpdateTurnNodeWeightService(url, { + * eventListeners: { + * "processCompleted": UpdateTurnNodeWeightCompleted, + * "processFailed": UpdateTurnNodeWeightError + * } + * }); + * @param {string} url - 服务地址。如: + * http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class UpdateTurnNodeWeightService extends NetworkAnalystServiceBase { + + constructor(url, options) { + super(url, options); + this.CLASS_NAME = "SuperMap.UpdateTurnNodeWeightService"; + } + + /** + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function UpdateTurnNodeWeightService.prototype.processAsync + * @description 开始异步执行转向耗费权重的更新 + * @param {UpdateTurnNodeWeightParameters} params - 转向耗费权重更新服务参数类 + * @example + * (code) + * var updateTurnNodeWeightParam=new UpdateTurnNodeWeightParameters({ + * nodeId:"106", + * fromEdgeId:"6508", + * toEdgeId:"6504", + * weightField:"TurnCost", + * turnNodeWeight:"50" + * }); + * updateTurnNodeWeightService.processAsync(updateTurnNodeWeightParam); + * (end) + **/ + processAsync(params) { + if (!(params instanceof UpdateTurnNodeWeightParameters)) { + return; + } + var me = this; + var paramStr = me.parse(params); + me.url = Util.urlPathAppend(me.url, paramStr); + var data = params.turnNodeWeight ? params.turnNodeWeight : null; + me.request({ + method: "PUT", + scope: me, + data: data, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function UpdateTurnNodeWeightService.prototype.parse + * @description 将更新服务参数解析为用‘/’做分隔的字符串 + */ + parse(params) { + if (!params) { + return; + } + var paramStr = ""; + for (var attr in params) { + if (params[attr] === "" || params[attr] === "turnNodeWeight") { + continue; + } + switch (attr) { + case "nodeId": + paramStr += "/turnnodeweight/" + params[attr]; + break; + case "fromEdgeId": + paramStr += "/fromedge/" + params[attr]; + break; + case "toEdgeId": + paramStr += "/toedge/" + params[attr]; + break; + case "weightField": + paramStr += "/weightfield/" + params[attr]; + break; + default : + break; + } + } + return paramStr; + } + +} + +;// CONCATENATED MODULE: ./src/common/iServer/UpdateDatasetParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UpdateDatasetParameters + * @deprecatedclass SuperMap.UpdateDatasetParameters + * @category iServer Data Dataset + * @classdesc 数据集信息更改参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称。 + * @param {string} options.datasetName - 数据集名称。 + * @param {boolean} options.isFileCache - 是否使用文件形式的缓存。仅对数据库型数据源中的矢量数据集有效。 + * @param {string} options.description - 数据集描述信息。 + * @param {string} options.prjCoordSys - 投影坐标系。 + * @param {Object} options.charset - 矢量数据集的字符集。当数据集类型为矢量数据集时,可以传递此参数。如果用户传递空值,则编码方式保持不变。 + * @param {Array.} options.palette - 影像数据的颜色调色板。当数据集类型为影像数据集时,可以传递此参数。 + * @param {number} options.noValue - 栅格数据集中没有数据的像元的栅格值。当数据集类型为栅格数据集时,可以传递此参数。 + * @usage + */ +class UpdateDatasetParameters { + + constructor(options) { + if (!options) { + return; + } + + /** + * @member {string} UpdateDatasetParameters.prototype.datasourceName + * @description 数据源名称。 + */ + this.datasourceName = null; + + /** + * @member {string} UpdateDatasetParameters.prototype.datasetName + * @description 数据集名称。 + */ + this.datasetName = null; + + /** + * @member {boolean} UpdateDatasetParameters.prototype.isFileCache + * @description 是否使用文件形式的缓存。仅对数据库型数据源中的矢量数据集有效。 + */ + this.isFileCache = null; + + /** + * @member {string} UpdateDatasetParameters.prototype.description + * @description 数据集描述信息。 + */ + this.description = null; + + /** + * @member {string} UpdateDatasetParameters.prototype.prjCoordSys + * @description 投影坐标系。 + */ + this.prjCoordSys = null; + + /** + * @member {Object} UpdateDatasetParameters.prototype.charset + * @description 矢量数据集的字符集。 + */ + this.charset = null; + + /** + * @member {Array.} UpdateDatasetParameters.prototype.palette + * @description 影像数据的颜色调色板。 + */ + this.palette = null; + + /** + * @member {number} UpdateDatasetParameters.prototype.noValue + * @description 栅格数据集中没有数据的像元的栅格值。 + */ + this.noValue = null; + + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = "SuperMap.UpdateDatasetParameters"; + } + + /** + * @function UpdateDatasetParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.datasourceName = null; + me.datasetName = null; + me.isFileCache = null; + me.prjCoordSys = null; + me.charset = null; + me.palette = null; + me.noValue = null; + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/VectorClipJobsParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class VectorClipJobsParameter + * @deprecatedclass SuperMap.VectorClipJobsParameter + * @category iServer ProcessingService VectorClip + * @classdesc 矢量裁剪分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetOverlay - 裁剪对象数据集。 + * @param {ClipAnalystMode} [options.mode=ClipAnalystMode.CLIP] - 裁剪分析模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ +class VectorClipJobsParameter { + + constructor(options) { + options = options || {}; + + /** + * @member {string} VectorClipJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ""; + + /** + * @member {string} VectorClipJobsParameter.prototype.datasetOverlay + * @description 裁剪对象数据集。 + */ + this.datasetVectorClip = ""; + + /** + * @member {string} VectorClipJobsParameter.prototype.geometryClip + * @description 裁剪几何对象。 + */ + this.geometryClip = ""; + + /** + * @member {ClipAnalystMode} [VectorClipJobsParameter.prototype.mode=ClipAnalystMode.CLIP] + * @description 裁剪分析模式 。 + */ + this.mode = ClipAnalystMode.CLIP; + + /** + * @member {OutputSetting} VectorClipJobsParameter.prototype.output + * @description 输出参数设置类。 + */ + this.output = null; + + /** + * @member {MappingParameters} [VectorClipJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + this.mappingParameters = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.VectorClipJobsParameter"; + } + + /** + * @function VectorClipJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.datasetName = null; + this.datasetVectorClip = null; + this.geometryClip = null; + this.mode = null; + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + + /** + * @function VectorClipJobsParameter.toObject + * @param {Object} vectorClipJobsParameter - 区域汇总分析服务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 矢量裁剪分析任务对象。 + */ + static toObject(vectorClipJobsParameter, tempObj) { + for (var name in vectorClipJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = vectorClipJobsParameter[name]; + continue; + } + if (name === "output"){ + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = vectorClipJobsParameter[name]; + continue; + } + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = vectorClipJobsParameter[name]; + if(name === 'mappingParameters'){ + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = vectorClipJobsParameter[name]; + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/iServer/VectorClipJobsService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class VectorClipJobsService + * @deprecatedclass SuperMap.VectorClipJobsService + * @category iServer ProcessingService VectorClip + * @classdesc 矢量裁剪分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url -服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class VectorClipJobsService extends ProcessingServiceBase { + constructor(url, options) { + super(url, options); + this.url = Util.urlPathAppend(this.url, 'spatialanalyst/vectorclip'); + this.CLASS_NAME = 'SuperMap.VectorClipJobsService'; + } + + /** + *@override + */ + destroy() { + super.destroy(); + } + + /** + * @function VectorClipJobsService.protitype.getVectorClipJobs + * @description 获取矢量裁剪分析所有任务 + */ + getVectorClipJobs() { + super.getJobs(this.url); + } + + /** + * @function KernelDensityJobsService.protitype.getVectorClipJob + * @description 获取指定id的矢量裁剪分析服务 + * @param {string} id - 指定要获取数据的id + */ + getVectorClipJob(id) { + super.getJobs(Util.urlPathAppend(this.url, id)); + } + + /** + * @function VectorClipJobsService.protitype.addVectorClipJob + * @description 新建矢量裁剪分析服务 + * @param {VectorClipJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + addVectorClipJob(params, seconds) { + super.addJob(this.url, params, VectorClipJobsParameter, seconds); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/RasterFunctionParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class RasterFunctionParameter + * @deprecatedclass SuperMap.RasterFunctionParameter + * @category iServer Map Tile + * @classdesc iServer 地图服务栅格分析参数基类 + * @param {Object} options - 参数。 + * @param {RasterFunctionType} options.type - 栅格分析方法。 + * @usage + */ +class RasterFunctionParameter { + constructor(options) { + options = options || {}; + + /** + * @member {RasterFunctionType} [RasterFunctionParameter.prototype.type] + * @description 栅格分析方法。 + */ + this.type = null; + + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.RasterFunctionParameter'; + } + + /** + * @function RasterFunctionParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + destroy() { + this.type = null; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/NDVIParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class NDVIParameter + * @deprecatedclass SuperMap.NDVIParameter + * @category iServer Map Tile + * @classdesc 归一化植被指数参数类 + * @param {Object} options - 参数。 + * @param {number} [options.redIndex=0] - 红光谱波段索引。 + * @param {number} [options.nirIndex=1] - 近红外光谱波段索引。 + * @param {string} [options.colorMap="0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff"] - 颜色表。由栅格的中断值和颜色停止之间的映射组成的,如0.3->d9f0a3ff 指的是[0,0.3)显示d9f0a3ff。仅单波段数据时设定。 + * @extends {RasterFunctionParameter} + * @usage + */ +class NDVIParameter extends RasterFunctionParameter { + constructor(options) { + super(options); + /** + * @member {number} [NDVIParameter.prototype.redIndex=0] + * @description 红光谱波段索引。 + */ + this.redIndex = 0; + + /** + * @member {number} [NDVIParameter.prototype.nirIndex=1] + * @description 近红外光谱波段索引。 + */ + this.nirIndex = 1; + + /** + * @member {string} [NDVIParameter.prototype.colorMap="0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff"] + * @description 颜色表。由栅格的中断值和颜色停止之间的映射组成的,如0.3->d9f0a3ff 指的是[0,0.3)显示d9f0a3ff。仅单波段数据时设定。 + */ + this.colorMap = + '0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff'; + + /** + * @member {RasterFunctionType} [NDVIParameter.prototype.type] + * @description 栅格分析方法。 + */ + this.type = RasterFunctionType.NDVI; + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.NDVIParameter'; + } + + /** + * @function NDVIParameter.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + this.redIndex = null; + this.nirIndex = null; + this.colorMap = null; + } + /** + * @function NDVIParameter.prototype.toJSON + * @description 将 NDVIParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return { + redIndex: this.redIndex, + nirIndex: this.nirIndex, + colorMap: this.colorMap, + type: this.type + }; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/HillshadeParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class HillshadeParameter + * @deprecatedclass SuperMap.HillshadeParameter + * @category iServer Map Tile + * @classdesc 阴影面分析参数类 + * @param {Object} options - 可选参数。 + * @param {number} [options.altitude=45] - 高于地平线的光源高度角。高度角由正度数表示,0 度代表地平线,而 90 度代表头顶正上方。 + * @param {number} [options.azimuth=315] - 光源的方位角。方位角由0到360度之间的正度数表示,以北为基准方向按顺时针进行测量。 + * @param {number} [options.zFactor=1] - 一个表面 z 单位中地面 x,y 单位的数量。z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + * z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + * 如果 x,y 单位和 z 单位采用相同的测量单位,则 z 因子为 1。这是默认设置。 + * 如果 x,y 单位和 z 单位采用不同的测量单位,则必须将 z 因子设置为适当的因子,否则会得到错误的结果。例如,如果 z 单位是英尺而 x,y 单位是米,则应使用 z 因子 0.3048 将 z 单位从英尺转换为米(1 英尺 = 0.3048 米)。 + * 如果输入栅格位于球面坐标系中(如十进制度球面坐标系),则生成的山体阴影可能看起来很独特。这是因为水平地面单位与高程 z 单位之间的测量值存在差异。由于经度的长度随着纬度而变化,因此需要为该纬度指定一个适当的 z 因子。如果 x,y 单位是十进制度而 Z 单位是米,特定纬度的一些合适的 Z 因子为: + * Latitude Z-factor + * 0 0.00000898 + * 10 0.00000912 + * 20 0.00000956 + * 30 0.00001036 + * 40 0.00001171 + * 50 0.00001395 + * 60 0.00001792 + * 70 0.00002619 + * 80 0.00005156 + * @extends {RasterFunctionParameter} + * @usage + */ +class HillshadeParameter extends RasterFunctionParameter { + constructor(options) { + super(options); + /** + * @member {number} [HillshadeParameter.prototype.altitude = 45] + * @description 高于地平线的光源高度角。高度角由正度数表示,0 度代表地平线,而 90 度代表头顶正上方。 + */ + this.altitude = 45; + + /** + * @member {number} [HillshadeParameter.prototype.azimuth = 315] + * @description 光源的方位角。方位角由0到360度之间的正度数表示,以北为基准方向按顺时针进行测量。 + */ + this.azimuth = 315; + + /** + * @member {number} [HillshadeParameter.prototype.zFactor = 1] + * @description 一个表面 z 单位中地面 x,y 单位的数量。z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + */ + this.zFactor = 1; + + /** + * @member {RasterFunctionType} HillshadeParameter.prototype.type + * @description 栅格分析方法。 + */ + this.type = RasterFunctionType.HILLSHADE; + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.HillshadeParameter'; + } + + /** + * @function HillshadeParameter.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + this.altitude = null; + this.azimuth = null; + this.zFactor = null; + } + /** + * @function HillshadeParameter.prototype.toJSON + * @description 将 HillshadeParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + toJSON() { + return { + altitude: this.altitude, + azimuth: this.azimuth, + zFactor: this.zFactor, + type: this.type + }; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobCustomItems.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobCustomItems + * @deprecatedclass SuperMap.WebPrintingJobCustomItems + * @classdesc Web 打印图例元素参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.name - 图例元素的名称。 + * @param {string} option.picAsUrl - 图例元素 Base64 格式图片。 + * @param {string} [option.picAsBase64] - 图例元素图片的获取地址。如果已填了 url 参数,此参数可不传 + * @usage + */ +class WebPrintingJobCustomItems { + constructor(option) { + /** + * @member {string} WebPrintingJobCustomItems.prototype.name + * @description 图例元素的名称。 + */ + this.name = null; + /** + * @member {string} [WebPrintingJobCustomItems.prototype.picAsUrl] + * @description 图例元素 Base64 格式图片。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobCustomItems.prototype.picAsBase64] + * @description 图例元素图片的获取地址。 + */ + this.picAsBase64 = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobCustomItems'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobCustomItems.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.name = null; + me.picAsUrl = null; + me.picAsBase64 = null; + } + + /** + * @function WebPrintingJobCustomItems.prototype.toJSON + * @description 将 WebPrintingJobCustomItems 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + name: this.name + }; + if (this.title) { + params.title = this.title; + } + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobImage.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobImage + * @deprecatedclass SuperMap.WebPrintingJobImage + * @classdesc 表达小地图的静态图片参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.picAsUrl - 小地图的图片 url 地址。 + * @param {string} [option.picAsBase64] - 小地图的base64位图片信息。如果已填了 url 参数,此参数可不传 + * @usage + */ +class WebPrintingJobImage { + constructor(option) { + /** + * @member {string} [WebPrintingJobImage.prototype.picAsUrl] + * @description 小地图的图片 url 地址。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobImage.prototype.picAsBase64] + * @description 小地图的base64位图片信息。 + */ + this.picAsBase64 = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobImage'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobImage.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.picAsUrl = null; + this.picAsBase64 = null; + } + + /** + * @function WebPrintingJobImage.prototype.toJSON + * @description 将 WebPrintingJobImage 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = {}; + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } + if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLayers.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + /** + * @class WebPrintingJobLayers + * @deprecatedclass SuperMap.WebPrintingJobLayers + * @classdesc 将图例添加到布局的业务图层参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.name - 图层 name 的字符串。此 name 必须唯一,并且必须与定义业务图层的 LegendOptions_layers 元素中的图层 name 匹配。 + * @usage + */ + class WebPrintingJobLayers { + constructor(option) { + /** + * @member {string} WebPrintingJobLayers.prototype.name + * @description 图层 name。 + */ + this.name = null; + /** + * @member {string} WebPrintingJobLayers.prototype.layerType + * @description 图层 type。 + */ + this.layerType = null; + /** + * @member {string} WebPrintingJobLayers.prototype.url + * @description 图层 url。 + */ + this.url = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobLayers'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobLayers.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.name = null; + this.layerType = null; + this.url = null; + } + } + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLegendOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class WebPrintingJobLegendOptions + * @deprecatedclass SuperMap.WebPrintingJobLegendOptions + * @classdesc Web 打印图例参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} [option.title] - 图例名称。 + * @param {string} [option.picAsUrl] - 图例的图片 url 地址。 + * @param {string} [option.picAsBase64] - 图例的 base64 位图片信息。 + * @param {WebPrintingJobLayers} [option.layers] - 图例的布局业务图层参数类。 + * @param {WebPrintingJobCustomItems} [option.customItems] - 自定义图例元素参数类。 + * @usage + */ +class WebPrintingJobLegendOptions { + constructor(option) { + /** + * @member {string} WebPrintingJobLegendOptions.prototype.title + * @description 图例名称。 + */ + this.title = null; + /** + * @member {string} [WebPrintingJobLegendOptions.prototype.picAsUrl] + * @description 图例的图片 url 地址。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobLegendOptions.prototype.picAsBase64] + * @description 图例的 base64 位图片信息。 + */ + this.picAsBase64 = null; + /** + * @member {WebPrintingJobLayers} [WebPrintingJobLegendOptions.prototype.layers] + * @description 图例的布局业务图层参数类。 + */ + this.layers = null; + /** + * @member {WebPrintingJobCustomItems} [WebPrintingJobLegendOptions.prototype.customItems] + * @description 自定义图例元素参数类。 + */ + this.customItems = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobLegendOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobLegendOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.title = null; + this.picAsUrl = null; + this.picAsBase64 = null; + if (this.layers instanceof WebPrintingJobLayers) { + this.layers.destroy(); + this.layers = null; + } + if (this.customItems instanceof WebPrintingJobCustomItems) { + this.customItems.destroy(); + this.customItems = null; + } + } + + /** + * @function WebPrintingJobLegendOptions.prototype.toJSON + * @description 将 WebPrintingJobLegendOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + title: this.title || "" + }; + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } else if (this.customItems) { + params.customItems = this.customItems; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLittleMapOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class WebPrintingJobLittleMapOptions + * @deprecatedclass SuperMap.WebPrintingJobLittleMapOptions + * @classdesc Web 打印小地图参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} option.center - 小地图的中心点。 + * @param {number} [option.scale] - 小地图的比例尺。 + * @param {Array.} [option.layerNames] - 指定 WebMap中图层名称的列表,用于渲染小地图。 + * @param {WebPrintingJobImage} [option.image] - 表达小地图的静态图类。 + * @param {WebPrintingJobLayers} [option.layers] - 指定 WebMap 中的 layers 图层类。 + * @usage + */ + +class WebPrintingJobLittleMapOptions { + constructor(option) { + /** + * @member {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} WebPrintingJobLittleMapOptions.prototype.center + * @description 小地图的中心点。 + */ + this.center = null; + /** + * @member {number} [WebPrintingJobLittleMapOptions.prototype.scale] + * @description 小地图的比例尺。 + */ + this.scale = null; + /** + * @member {Array.} WebPrintingJobLittleMapOptions.prototype.layerNames + * @description 指定 WebMap中图层名称的列表,用于渲染小地图。 + */ + this.layerNames = null; + /** + * @member {WebPrintingJobImage} [WebPrintingJobLittleMapOptions.prototype.image] + * @description 表达小地图的静态图类。暂不支持 + */ + this.image = null; + /** + * @member {WebPrintingJobLayers} [WebPrintingJobLittleMapOptions.prototype.layers] + * @description 指定 WebMap 中的 layers 图层类。 + */ + this.layers = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobLittleMapOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobLittleMapOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.center = null; + this.scale = null; + this.layerNames = null; + if (this.image instanceof WebPrintingJobImage) { + this.image.destroy(); + this.image = null; + } + if (this.layers instanceof WebPrintingJobLayers) { + this.layers.destroy(); + this.layers = null; + } + } + + /** + * @function WebPrintingJobLittleMapOptions.prototype.toJSON + * @description 将 WebPrintingJobLittleMapOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + scale: this.scale, + center: this.center + }; + if (this.layerNames) { + params.layerNames = this.layerNames; + } else if (this.layers) { + params.layers = this.layers; + } + if (this.image) { + params.image = this.image; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobNorthArrowOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobNorthArrowOptions + * @deprecatedclass SuperMap.WebPrintingJobNorthArrowOptions + * @classdesc Web 打印地图指北针参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.picAsUrl - 指北针的图片 url 地址。 + * @param {string} [option.picAsBase64] - 指北针的base64位图片信息。 + * @usage + */ +class WebPrintingJobNorthArrowOptions { + constructor(option) { + /** + * @member {string} WebPrintingJobNorthArrowOptions.prototype.picAsUrl + * @description 指北针的图片 url 地址。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobNorthArrowOptions.prototype.picAsBase64] + * @description 指北针的base64位图片信息。 + */ + this.picAsBase64 = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobNorthArrowOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobNorthArrowOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.picAsUrl = null; + this.picAsBase64 = null; + } + + /** + * @function WebPrintingJobNorthArrowOptions.prototype.toJSON + * @description 将 WebPrintingJobNorthArrowOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = {}; + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobScaleBarOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobScaleBarOptions + * @deprecatedclass SuperMap.WebPrintingJobScaleBarOptions + * @classdesc Web 打印比例尺参数类。 + * @category iServer WebPrintingJob + * @version 10.1.0 + * @param {Object} option - 参数。 + * @param {string} [option.scaleText] - 比例尺文本信息。例如:1:1000000 + * @param {WebScaleOrientationType} [option.orientation] - 比例尺的方位样式。 + * @param {WebScaleType} [option.type] - 比例尺的样式。 + * @param {number} [option.intervals] - 比例尺条的段数。 + * @param {WebScaleUnit} [option.unit] - 比例尺的单位制。 + * @usage + */ +class WebPrintingJobScaleBarOptions { + constructor(option) { + /** + * @member {string} WebPrintingJobScaleBarOptions.prototype.scaleText + * @description 比例尺文本信息。 + */ + this.scaleText = null; + /** + * @member {WebScaleOrientationType} [WebPrintingJobScaleBarOptions.prototype.orientation] + * @description 比例尺的方位样式。 + */ + this.orientation = null; + /** + * @member {WebScaleType} [WebPrintingJobScaleBarOptions.prototype.type] + * @description 比例尺的样式。 + */ + this.type = null; + /** + * @member {Object} [WebPrintingJobScaleBarOptions.prototype.intervals] + * @description 比例尺条的段数。 + */ + this.intervals = null; + /** + * @member {WebScaleUnit} [WebPrintingJobScaleBarOptions.prototype.unit] + * @description 比例尺的单位制。 + */ + this.unit = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobScaleBarOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobScaleBarOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.scaleText = null; + this.orientation = null; + this.type = null; + this.intervals = null; + this.unit = null; + } + + /** + * @function WebPrintingJobScaleBarOptions.prototype.toJSON + * @description 将 WebPrintingJobScaleBarOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + scaleText: this.scaleText || "", + type: this.type || "BAR", + intervals: this.intervals || "", + unit: this.unit || "METER" + }; + if (this.orientation) { + params.orientation = this.orientation; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobContent.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobContent + * @deprecatedclass SuperMap.WebPrintingJobContent + * @classdesc Web 打印内容参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.type - Web 打印内容支持的类型。目前支持的类型:WEBMAP + * @param {string} [option.url] - 待打印的 SuperMap iPortal WebMap 的 url 地址。例如:http://supermapiportal:8190/iportal/web/maps/{mapid}/map.rjson + * @param {string} [option.token] - 如果待打印的是 SuperMap iPortal 用户私有的 WebMap,需要提供 SuperMap iPortal 用户的 token。 + * @param {WebMapSummaryObject} [option.value] - 传递的是一个符合 SuperMap WebMap 规范的 WebMap 的 JSON 表达,也可以是一个完整的 SuperMap iPortal 数据上图制作的 WebMap 的 json 表达。如果已填了 url 参数,此参数可不传 + * @usage + */ +class WebPrintingJobContent { + constructor(option) { + /** + * @member {string} WebPrintingJobContent.prototype.type + * @description Web 打印内容支持的类型。 + */ + this.type = null; + /** + * @member {string} [WebPrintingJobContent.prototype.url] + * @description 待打印的 SuperMap iPortal WebMap 的 url 地址。 + */ + this.url = null; + /** + * @member {string} [WebPrintingJobContent.prototype.token] + * @description 如果待打印的是 SuperMap iPortal 用户私有的 WebMap,需要提供 SuperMap iPortal 用户的 token。 + */ + this.token = null; + /** + * @member {WebMapSummaryObject} [WebPrintingJobContent.prototype.value] + * @description 传递的是一个符合 SuperMap WebMap 规范的 WebMap 的 JSON 表达,也可以是一个完整的 SuperMap iPortal 数据上图制作的 WebMap 的 json 表达。 + */ + this.value = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobContent'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobContent.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.type = false || "WEBMAP"; + this.url = null; + this.token = null; + this.value = null; + } + + /** + * @function WebPrintingJobContent.prototype.toJSON + * @description 将 WebPrintingJobContent 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + type: this.type + }; + if (this.token) { + params.token = this.token; + } + if (this.url) { + params.url = this.url; + } else if (this.value) { + params.value = this.value; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLayoutOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class WebPrintingJobLayoutOptions + * @deprecatedclass SuperMap.WebPrintingJobLayoutOptions + * @classdesc Web 打印的布局参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.templateName - 布局模板的名称。 + * @param {string} option.title - 地图主标题名称。 + * @param {string} option.subTitle - 地图副标题名称。 + * @param {string} option.author - 作者名称。 + * @param {string} option.copyright - 版权信息。 + * @param {WebPrintingJobLittleMapOptions} option.littleMapOptions - 小地图参数类。 + * @param {WebPrintingJobLegendOptions} option.legendOptions - 图例参数类。 + * @param {WebPrintingJobScaleBarOptions} [option.scaleBarOptions] - 地图比例尺参数类。 + * @param {WebPrintingJobNorthArrowOptions} [option.northArrowOptions] - 地图指北针参数类。 + * @usage + */ +class WebPrintingJobLayoutOptions { + constructor(option) { + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.templateName + * @description 布局模板的名称。 + */ + this.templateName = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.title + * @description 地图主标题名称。 + */ + this.title = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.subTitle + * @description 地图副标题名称。 + */ + this.subTitle = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.author + * @description 地图作者名称。 + */ + this.author = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.copyright + * @description 地图版权信息。 + */ + this.copyright = null; + /** + * @member {WebPrintingJobScaleBarOptions} [WebPrintingJobLayoutOptions.prototype.scaleBarOptions] + * @description 地图比例尺参数类。 + */ + this.scaleBarOptions = null; + /** + * @member {WebPrintingJobNorthArrowOptions} [WebPrintingJobLayoutOptions.prototype.northArrowOptions] + * @description 地图指北针参数类。 + */ + this.northArrowOptions = null; + /** + * @member {WebPrintingJobLittleMapOptions} WebPrintingJobLayoutOptions.prototype.littleMapOptions + * @description 小地图参数类。 + */ + this.littleMapOptions = null; + /** + * @member {WebPrintingJobLegendOptions} WebPrintingJobLayoutOptions.prototype.legendOptions + * @description 图例参数类。 + */ + this.legendOptions = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobLayoutOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobLayoutOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.templateName = null; + this.title = null; + this.subTitle = null; + this.author = null; + this.copyright = null; + if (this.scaleBarOptions instanceof WebPrintingJobScaleBarOptions) { + this.scaleBarOptions.destroy(); + this.scaleBarOptions = null; + } + if (this.northArrowOptions instanceof WebPrintingJobNorthArrowOptions) { + this.northArrowOptions.destroy(); + this.northArrowOptions = null; + } + if (this.littleMapOptions instanceof WebPrintingJobLittleMapOptions) { + this.littleMapOptions.destroy(); + this.littleMapOptions = null; + } + if (this.legendOptions instanceof WebPrintingJobLegendOptions) { + this.legendOptions.destroy(); + this.legendOptions = null; + } + } + + /** + * @function WebPrintingJobLayoutOptions.prototype.toJSON + * @description 将 WebPrintingJobLayoutOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + templateName: this.templateName, + title: this.title, + subTitle: this.subTitle, + author: this.author, + copyright: this.copyright + }; + if (this.scaleBarOptions) { + params.scaleBarOptions = this.scaleBarOptions; + } + if (this.northArrowOptions) { + params.northArrowOptions = this.northArrowOptions; + } + if (this.littleMapOptions) { + params.littleMapOptions = this.littleMapOptions; + } + if (this.legendOptions) { + params.legendOptions = this.legendOptions; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobExportOptions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingJobExportOptions + * @deprecatedclass SuperMap.WebPrintingJobExportOptions + * @classdesc Web 打印的输出参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {WebExportFormatType} option.format - Web 打印输出的格式,目前支持:PNG、PDF。 + * @param {number} [option.dpi=96] - Web 打印输出的分辨率,单位为每英寸点数。默认值为 96 dpi。 + * @param {number} [option.scale] - Web 打印输出的地图比例尺。 + * @param {number} [option.rotation] - Web 打印输出的地图角度。 + * @param {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} [option.center] - Web 打印输出的地图中心点。 + * @usage + */ +class WebPrintingJobExportOptions { + constructor(option) { + /** + * @member {WebExportFormatType} WebPrintingJobExportOptions.prototype.format + * @description Web 打印输出的格式。 + */ + this.format = null; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.dpi=96] + * @description Web 打印输出的分辨率,单位为每英寸点数。 + */ + this.dpi = 96; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.scale] + * @description Web 打印输出的地图比例尺。 + */ + this.scale = null; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.rotation] + * @description Web 打印输出的地图角度。 + */ + this.rotation = null; + /** + * @member {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} [WebPrintingJobExportOptions.prototype.center] + * @description Web 打印输出的地图中心点。 + */ + this.center = null; + + this.CLASS_NAME = 'SuperMap.WebPrintingJobExportOptions'; + Util.extend(this, option); + } + + /** + * @function WebPrintingJobExportOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + this.format = null; + this.dpi = null; + this.scale = null; + this.rotation = null; + this.center = null; + this.outputSize = null; + } + + /** + * @function WebPrintingJobExportOptions.prototype.toJSON + * @description 将 WebPrintingJobExportOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + toJSON() { + var params = { + format: this.format || "PDF", + dpi: this.dpi, + scale: this.scale, + center: this.center + }; + if (this.rotation) { + params.rotation = this.rotation; + } + if (this.outputSize) { + params.outputSize = this.outputSize; + } + return Util.toJSON(params); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class WebPrintingJobParameters + * @deprecatedclass SuperMap.WebPrintingJobParameters + * @category iServer WebPrintingJob + * @version 10.1.0 + * @classdesc Web 打印参数类。 + * @param {Object} options - 参数。 + * @param {WebPrintingJobContent} options.content - Web 打印的内容类。 + * @param {WebPrintingJobLayoutOptions} options.layoutOptions - Web 打印的布局类,包含各种布局元素的设置。 + * @param {WebPrintingJobExportOptions} options.exportOptions - Web 打印的输出类,包含 DPI、页面大小等。 + * @usage + */ +class WebPrintingJobParameters { + constructor(options) { + if (!options) { + return; + } + /** + * @member {WebPrintingJobContent} WebPrintingJobParameters.prototype.content + * @description Web 打印的内容类。 + */ + this.content = null; + + /** + * @member {WebPrintingJobLayoutOptions} WebPrintingJobParameters.prototype.layoutOptions + * @description Web 打印的布局类,包含各种布局元素的设置。 + */ + this.layoutOptions = null; + + /** + * @member {WebPrintingJobExportOptions} WebPrintingJobParameters.prototype.exportOptions + * @description Web 打印的输出类,包含 DPI、页面大小等。 + */ + this.exportOptions = null; + + Util.extend(this, options); + + this.CLASS_NAME = 'SuperMap.WebPrintingJobParameters'; + } + + /** + * @function WebPrintingJobParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + if (this.content instanceof WebPrintingJobContent) { + this.content.destroy(); + this.content = null; + } + if (this.layoutOptions instanceof WebPrintingJobLayoutOptions) { + this.layoutOptions.destroy(); + this.layoutOptions = null; + } + if (this.exportOptions instanceof WebPrintingJobExportOptions) { + this.exportOptions.destroy(); + this.exportOptions = null; + } + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class WebPrintingService + * @deprecatedclass SuperMap.WebPrintingService + * @category iServer WebPrintingJob + * @version 10.1.0 + * @classdesc 打印地图服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求打印地图服务的 URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/webprinting/rest/webprinting/v1。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class WebPrintingService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = 'SuperMap.WebPrintingService'; + if (!this.url) { + return; + } + } + + /** + * @function WebPrintingService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + super.destroy(); + } + + /** + * @function WebPrintingService.prototype.createWebPrintingJob + * @description 创建 Web 打印任务。 + * @param {WebPrintingJobParameters} params - Web 打印的请求参数。 + */ + createWebPrintingJob(params) { + if (!params) { + return; + } + if (params.layoutOptions) { + if (params.layoutOptions.legendOptions) { + !params.layoutOptions.legendOptions.title && (params.layoutOptions.legendOptions.title = ''); + params.layoutOptions.legendOptions.picAsBase64 = + params.layoutOptions.legendOptions.picAsBase64 && + params.layoutOptions.legendOptions.picAsBase64.replace(/^data:.+;base64,/, ''); + if ( + params.layoutOptions.legendOptions.customItems && + params.layoutOptions.legendOptions.customItems.hasOwnProperty('picAsBase64') + ) { + params.layoutOptions.legendOptions.customItems.picAsBase64 = params.layoutOptions.legendOptions.customItems.picAsBase64.replace( + /^data:.+;base64,/, + '' + ); + } + } + } + var me = this; + me.request({ + url: me._processUrl('jobs'), + method: 'POST', + data: Util.toJSON(params), + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function WebPrintingService.prototype.getPrintingJob + * @description 获取 Web 打印输出文档任务。 + * @param {string} jobId - Web 打印任务 ID + */ + getPrintingJob(jobId) { + var me = this; + var url = me._processUrl(`jobs/${jobId}`); + me.request({ + url, + method: 'GET', + scope: me, + success: function (result) { + me.rollingProcess(result, url); + }, + failure: me.serviceProcessFailed + }); + } + + /** + * @function WebPrintingService.prototype.getPrintingJobResult + * @description 获取 Web 打印任务的输出文档。 + * @param {string} jobId - Web 打印输入文档任务 ID。 + */ + getPrintingJobResult(jobId) { + var me = this; + me.request({ + url: me._processUrl(`jobs/${jobId}/result`), + method: 'GET', + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function WebPrintingService.prototype.getLayoutTemplates + * @description 查询 Web 打印服务所有可用的模板信息。 + */ + getLayoutTemplates() { + var me = this; + me.request({ + url: me._processUrl('layouts'), + method: 'GET', + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function WebPrintingService.prototype.rollingProcess + * @description 轮询查询 Web 打印任务。 + * @param {Object} result - 服务器返回的结果对象。 + */ + rollingProcess(result, url) { + var me = this; + if (!result) { + return; + } + var id = setInterval(function () { + me.request({ + url, + method: 'GET', + scope: me, + success: function (result) { + switch (result.status) { + case 'FINISHED': + clearInterval(id); + me.serviceProcessCompleted(result); + break; + case 'ERROR': + clearInterval(id); + me.serviceProcessFailed(result); + break; + case 'RUNNING': + me.events.triggerEvent('processRunning', result); + break; + } + }, + failure: me.serviceProcessFailed + }); + }, 1000); + } + + _processUrl(appendContent) { + if (appendContent) { + return Util.urlPathAppend(this.url, appendContent); + } + return this.url; + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageCollectionService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageCollectionService + * @deprecatedclass SuperMap.ImageCollectionService + * @classdesc 影像集合服务类 + * @version 10.2.0 + * @category iServer Image + * @param {string} url - 服务地址。例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 参数。 + * @param {string} options.collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ +class ImageCollectionService_ImageCollectionService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + this.options = options || {}; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = 'SuperMap.ImageCollectionService'; + } + + /** + * @function ImageCollectionService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function ImageCollectionService.prototype.getLegend + * @description 返回当前影像集合的图例信息。默认为服务发布所配置的风格,支持根据风格参数生成新的图例。 + * @param {Object} queryParams query参数 + * @param {ImageRenderingRule} [queryParams.renderingRule] renderingRule 对象,用来指定影像的渲染风格,从而确定图例内容。影像的渲染风格包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。该参数未设置时,将使用发布服务时所配置的风格。 + */ + getLegend(queryParams) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/legend', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + params: queryParams, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageCollectionService.prototype.getStatistics + * @description 返回当前影像集合的统计信息。包括文件数量,文件大小等信息。 + */ + getStatistics() { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/statistics', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageCollectionService.prototype.getTileInfo + * @description 返回影像集合所提供的服务瓦片的信息,包括:每层瓦片的分辨率,比例尺等信息,方便前端进行图层叠加。 + + */ + getTileInfo() { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/tileInfo', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageCollectionService.prototype.deleteItemByID + * @description 删除影像集合中指定 ID 的 Item,即从影像集合中删除指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + */ + deleteItemByID(featureId) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId, + featureId: featureId + }; + var path = Util.convertPath('/collections/{collectionId}/items/{featureId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'DELETE', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageCollectionService.prototype.getItemByID + * @description 返回指定ID(`collectionId`)的影像集合中的指定ID(`featureId`)的Item对象,即返回影像集合中指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + */ + getItemByID(featureId) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId, + featureId: featureId + }; + var path = Util.convertPath('/collections/{collectionId}/items/{featureId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageService + * @deprecatedclass SuperMap.ImageService + * @classdesc 影像服务类 + * @version 10.2.0 + * @category iServer Image + * @param {string} url - 服务地址。例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ +class ImageService_ImageService extends CommonServiceBase { + constructor(url, options) { + super(url, options); + this.options = options || {}; + if (options) { + Util.extend(this, options); + } + this.CLASS_NAME = 'SuperMap.ImageService'; + } + + /** + * @function ImageService.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function ImageService.prototype.getCollections + * @description 返回当前影像服务中的影像集合列表(Collections)。 + */ + getCollections() { + var me = this; + var path = Util.convertPath('/collections'); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageService.prototype.getCollectionByID + * @description ID值等于`collectionId`参数值的影像集合(Collection)。 ID值用于在服务中唯一标识该影像集合。 + * @param {string} collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + */ + getCollectionByID(collectionId) { + var pathParams = { + collectionId: collectionId + }; + var me = this; + var path = Util.convertPath('/collections/{collectionId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + + /** + * @function ImageSearchService.prototype.search + * @description 查询与过滤条件匹配的影像数据。 + * @param {ImageSearchParameter} [imageSearchParameter] 查询参数 + */ + search(imageSearchParameter) { + var postBody = { ...(imageSearchParameter || {}) }; + var me = this; + var path = Util.convertPath('/search'); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'POST', + url, + data: postBody, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } +} + + +;// CONCATENATED MODULE: ./src/common/iServer/FieldsFilter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FieldsFilter + * @deprecatedclass SuperMap.FieldsFilter + * @category iServer Data Field + * @classdesc 指定返回的用于描述 Feature 的字段。 + * @param {Object} options - 可选参数。 + * @param {Array.} [options.include] 对返回的字段内容进行过滤,需保留的字段列表 + * @param {Array.} [options.exclude] 对返回的字段内容进行过滤,需排除的字段列表 + * @usage + */ +class FieldsFilter { + constructor(options) { + /** + * @description 对返回的字段内容进行过滤,需保留的字段列表 + * @member {Array.} FieldsFilter.prototype.include + */ + this.include = undefined; + /** + * @description 对返回的字段内容进行过滤,需排除的字段列表 + * @member {Array.} FieldsFilter.prototype.exclude + */ + this.exclude = undefined; + + this.CLASS_NAME = 'SuperMap.FieldsFilter'; + Util.extend(this, options); + + } + + /** + * @function FieldsFilter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.include = undefined; + me.exclude = undefined; + } + + /** + * @function FieldsFilter.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {FieldsFilter} obj 返回的模型. + * @return {FieldsFilter} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new FieldsFilter(); + if (data.hasOwnProperty('include')) { + obj.include = data.include + } + if (data.hasOwnProperty('exclude')) { + obj.exclude = data.exclude + } + } + return obj; + } +} + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/Sortby.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Sortby + * @deprecatedclass SuperMap.Sortby + * @classdesc 通过指定字段进行排序的方法类。 + * @category BaseTypes Util + * @param {Object} options - 参数。 + * @param {string} options.field 属性名称。 + * @param {Sortby.Direction} options.direction 排序规则, 默认升序。 + * @usage + */ +class Sortby { + constructor(options) { + /** + * @description 属性名称 + * @member {string} Sortby.prototype.field + */ + this.field = undefined; + /** + * @description 排序规则 + * @member {Sortby.Direction} Sortby.prototype.direction + * @default Sortby.Direction.ASC + */ + this.direction = Sortby.Direction.ASC; + + this.CLASS_NAME = 'SuperMap.Sortby'; + Util.extend(this, options); + } + + /** + * @function Sortby.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.field = undefined; + me.direction = 'ASC'; + } + + /** + * @function Sortby.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据。 + * @param {Sortby} obj 返回的模型。 + * @return {Sortby} 返回结果。 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new Sortby(); + if (data.hasOwnProperty('field')) { + obj.field = data.field; + } + if (data.hasOwnProperty('direction')) { + obj.direction = data.direction; + } + } + return obj; + } +} +/** + * @enum Direction + * @description 排序的类型枚举。 + * @memberOf Sortby + * @readonly + * @type {string} + */ +Sortby.Direction = { + ASC: 'ASC', + DESC: 'DESC' +}; + +;// CONCATENATED MODULE: ./src/common/iServer/ImageSearchParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ImageSearchParameter + * @deprecatedclass SuperMap.ImageSearchParameter + * @classdesc 影像服务查询参数类 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {Array.} [options.bbox] 指定查询范围。只有具有几何对象(geometry)属性的Features,并且该几何对象与该参数指定的范围相交的 Features 才会被选择出来。 该参数可以包含4个数值或者6个数值,这取决于使用的坐标参考系统是否包含高程值: * 左下角坐标轴 1 的值 * 左下角坐标轴 2 的值 * 坐标轴 3 的最小值(可选) * 右上角坐标轴 1 的值 * 右上角坐标轴 2 的值 * 坐标轴 3 的最大值(可选) 坐标参考系统为 WGS 84 经度/纬度 (http://www.opengis.net/def/crs/OGC/1.3/CRS84). 对于 “WGS 84 经度/纬度” 坐标参考系统, 该参数值的格式通常为:最小经度,最小纬度,最大经度,最大纬度。 如果包含了高程值,该参数的格式为:最小经度,最小纬度,最小高程值,最大经度,最大纬度,最大高程值。 如果一个 Feature 具有多个空间几何对象(geometry)属性, 由服务器决定是否使用单一的空间几何对象属性,还是使用所有相关的几何对象作为最终的查询空间范围。 + * @param {Array.} [options.collections] 影像集合的ID数组,将在该指定的Collection中搜索Items。 + * @param {Array.} [options.ids] 只返回指定 Item 的 ID 数组中的Item。返回的 Item 的 ID 值数组。 设置了该参数,所有其他过滤器参数(除了next和limit)将被忽略。 + * @param {number} [options.limit] 返回的最大结果数,即响应文档包含的 Item 的数目。 + * @param {FieldsFilter} [options.fields] 通过‘include’和‘exclude’属性分别指定哪些字段包含在查询结果的 Feature 描述中,哪些需要排除。返回结果中的stac_version,id,bbox,assets,links,geometry,type,properties这些字段为必须字段,若要返回结果中不含这种字段信息,需要显示地进行排除设置,如:排除geometry和bbox字段;在POST请求中,则需要将这些字段添加到“exclude”字段中,例如: "fields": { "exclude": ["geometry","bbox"] } } 。而对于返回的“properties”对象中的扩展字段内容,可以将字段前添加到‘include’字段中,如: "fields": { "include": ["properties.SmFileName","properties.SmHighPS"] } } ,表示properties.SmFileName和properties.SmHighPS 属性都包含在查询结果中。 + * @param {Object} [options.query] 定义查询哪些属性,查询运算符将应用于这些属性。运算符包括:eq、neq、gt、lt、gte、lte、startsWith、endsWith、 contains、in。 其中in是Array.类型 例如:{ "SmFileName": { "eq":"B49C001002.tif" }} + * @param {Array.} [options.sortby] 由包含属性名称和排序规则的对象构成的数组。 + * @usage + */ +class ImageSearchParameter { + constructor(options) { + /** + * @description 指定查询范围。只有具有几何对象(geometry)属性的Features,并且该几何对象与该参数指定的范围相交的 Features 才会被选择出来。 该参数可以包含4个数值或者6个数值,这取决于使用的坐标参考系统是否包含高程值: * 左下角坐标轴 1 的值 * 左下角坐标轴 2 的值 * 坐标轴 3 的最小值(可选) * 右上角坐标轴 1 的值 * 右上角坐标轴 2 的值 * 坐标轴 3 的最大值(可选) 坐标参考系统为 WGS 84 经度/纬度 (http://www.opengis.net/def/crs/OGC/1.3/CRS84). 对于 “WGS 84 经度/纬度” 坐标参考系统, 该参数值的格式通常为:最小经度,最小纬度,最大经度,最大纬度。 如果包含了高程值,该参数的格式为:最小经度,最小纬度,最小高程值,最大经度,最大纬度,最大高程值。 如果一个 Feature 具有多个空间几何对象(geometry)属性, 由服务器决定是否使用单一的空间几何对象属性,还是使用所有相关的几何对象作为最终的查询空间范围。 + * @member {Array.} ImageSearchParameter.prototype.bbox + */ + this.bbox = undefined; + /** + * @description 影像集合的ID数组,将在该指定的Collection中搜索Items。 + * @member {Array.} ImageSearchParameter.prototype.collections + */ + this.collections = undefined; + /** + * @description 返回的 Item 的 ID 值数组。 设置了该参数,所有其他过滤器参数(除了next和limit)将被忽略。 + * @member {Array.} ImageSearchParameter.prototype.ids + */ + this.ids = undefined; + /** + * @description 单页返回的最大结果数。 最小值为1最大值为10000 + * @member {number} ImageSearchParameter.prototype.limit + */ + this.limit = undefined; + /** + * @description 通过‘include’和‘exclude’属性分别指定哪些字段包含在查询结果的 Feature 描述中,哪些需要排除。返回结果中的stac_version,id,bbox,assets,links,geometry,type,properties这些字段为必须字段,若要返回结果中不含这种字段信息,需要显示地进行排除设置,如:排除geometry和bbox字段;在POST请求中,则需要将这些字段添加到“exclude”字段中,例如: "fields": { "exclude": ["geometry","bbox"] } } 。而对于返回的“properties”对象中的扩展字段内容,可以将字段前添加到‘include’字段中,如: "fields": { "include": ["properties.SmFileName","properties.SmHighPS"] } } ,表示properties.SmFileName和properties.SmHighPS 属性都包含在查询结果中。 + * @member {FieldsFilter} ImageSearchParameter.prototype.fields + */ + this.fields = undefined; + /** + * @description 定义查询哪些属性,查询运算符将应用于这些属性。 + * @member {Object} ImageSearchParameter.prototype.query + */ + this.query = undefined; + /** + * @description 由包含属性名称和排序规则的对象构成的数组。 + * @member {Array.} ImageSearchParameter.prototype.sortby + */ + this.sortby = undefined; + + this.CLASS_NAME = 'SuperMap.ImageSearchParameter'; + Util.extend(this, options); + } + + /** + * @function ImageSearchParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.bbox = undefined; + me.collections = undefined; + me.ids = undefined; + me.limit = undefined; + me.fields = undefined; + me.query = undefined; + me.sortby = undefined; + } + + /** + * @function ImageSearchParameter.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageSearchParameter} obj 返回的模型. + * @return {ImageSearchParameter} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageSearchParameter(); + if (data.hasOwnProperty('bbox')) { + obj.bbox = data.bbox; + } + if (data.hasOwnProperty('collections')) { + obj.collections = data.collections; + } + if (data.hasOwnProperty('ids')) { + obj.ids = data.ids; + } + if (data.hasOwnProperty('limit')) { + obj.limit = data.limit; + } + if (data.hasOwnProperty('fields')) { + obj.fields = (FieldsFilter.constructFromObject && FieldsFilter.constructFromObject(data.fields, {})) || data.fields; + } + if (data.hasOwnProperty('query')) { + obj.query = data.query; + } + if (data.hasOwnProperty('sortby')) { + obj.sortby = data.sortby; + if (data.sortby) { + obj.sortby = data.sortby.map((item) => { + return (Sortby.constructFromObject && Sortby.constructFromObject(item, {})) || item; + }); + } + } + } + return obj; + } +} + +;// CONCATENATED MODULE: ./src/common/iServer/ImageStretchOption.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ImageStretchOption + * @deprecatedclass SuperMap.ImageStretchOption + * @classdesc 影像拉伸类。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {ImageStretchOption.StretchType} [options.stretchType] 影像拉伸类型。该属性的值有以下几种情况:NONE,无拉伸;GAUSSIAN,高斯拉伸;PERCENTCLIP,百分比截断拉伸;MINIMUMMAXIMUM,最值拉伸;STANDARDDEVIATION,标准差拉伸。 + * @param {number} [options.stdevCoefficient] 标准差系数。 + * @param {number} [options.gaussianCoefficient] 高斯系数。 + * @param {boolean} [options.useMedianValue] 高斯拉伸时,是否使用中间值,若该属性值为true,表示使用中间值;false,表示使用平均值。 + * @param {number} [options.minPercent] 使用百分比截断拉伸时,排除影像直方图最低值区域的像元,该参数值为这部分像元占总像元百分比。 + * @param {number} [options.maxPercent] 使用百分比截断拉伸时,排除影像直方图最高值区域的像元,该参数值为这部分像元占总像元百分比。 + * @usage + */ +class ImageStretchOption { + constructor(options) { + /** + * @description 影像拉伸类型。该属性的值有以下几种情况:NONE,无拉伸;GAUSSIAN,高斯拉伸;PERCENTCLIP,百分比截断拉伸;MINIMUMMAXIMUM,最值拉伸;STANDARDDEVIATION,标准差拉伸。 + * @member {ImageStretchOption.StretchType} ImageStretchOption.prototype.stretchType + */ + this.stretchType = undefined; + /** + * @description 标准差系数。 + * @member {number} ImageStretchOption.prototype.stdevCoefficient + */ + this.stdevCoefficient = undefined; + /** + * @description 高斯系数。 + * @member {number} ImageStretchOption.prototype.gaussianCoefficient + */ + this.gaussianCoefficient = undefined; + /** + * @description 高斯拉伸时,是否使用中间值,若该属性值为true,表示使用中间值;false,表示使用平均值。 + * @member {boolean} ImageStretchOption.prototype.useMedianValue + */ + this.useMedianValue = undefined; + /** + * @description 使用百分比截断拉伸时,排除影像直方图最低值区域的像元,该参数值为这部分像元占总像元百分比。 + * @member {number} ImageStretchOption.prototype.minPercent + */ + this.minPercent = undefined; + /** + * @description 使用百分比截断拉伸时,排除影像直方图最高值区域的像元,该参数值为这部分像元占总像元百分比。 + * @member {number} ImageStretchOption.prototype.maxPercent + */ + this.maxPercent = undefined; + + this.CLASS_NAME = 'SuperMap.ImageStretchOption'; + Util.extend(this, options); + } + + /** + * @function ImageStretchOption.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.stretchType = undefined; + me.stdevCoefficient = undefined; + me.gaussianCoefficient = undefined; + me.useMedianValue = undefined; + me.minPercent = undefined; + me.maxPercent = undefined; + } + + /** + * @function ImageStretchOption.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageStretchOption} obj 返回的模型. + * @return {ImageStretchOption} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageStretchOption(); + if (data.hasOwnProperty('stretchType')) { + obj.stretchType = data.stretchType; + } + if (data.hasOwnProperty('stdevCoefficient')) { + obj.stdevCoefficient = data.stdevCoefficient; + } + if (data.hasOwnProperty('gaussianCoefficient')) { + obj.gaussianCoefficient = data.gaussianCoefficient; + } + if (data.hasOwnProperty('useMedianValue')) { + obj.useMedianValue = data.useMedianValue; + } + if (data.hasOwnProperty('minPercent')) { + obj.minPercent = data.minPercent; + } + if (data.hasOwnProperty('maxPercent')) { + obj.maxPercent = data.maxPercent; + } + } + return obj; + } +} +/** + * @enum StretchType + * @description 影像拉伸类型枚举。 + * @memberOf ImageStretchOption + * @readonly + * @type {string} + */ +ImageStretchOption.StretchType = { + NONE: 'NONE', + GAUSSIAN: 'GAUSSIAN', + PERCENTCLIP: 'PERCENTCLIP', + MINIMUMMAXIMUM: 'MINIMUMMAXIMUM', + STANDARDDEVIATION: 'STANDARDDEVIATION' +}; + +;// CONCATENATED MODULE: ./src/common/iServer/ImageRenderingRule.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageRenderingRule + * @deprecatedclass SuperMap.ImageRenderingRule + * @classdesc 定义请求的影像如何进行渲染或者处理,如:影像的拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {ImageRenderingRule.DisplayMode} [options.displayMode] 影像显示模式,其中:Composite表示多波段组合显示;Stretched表示单波段拉伸显示。 + * @param {string} [options.displayBands] 影像显示的波段或者波段组合。若影像的显示模式为STRETCHED,该属性指定一个波段的索引号(波段索引号从0开始计数);若影像的显示模式为COMPOSITE,该属性为组合的波段索引号,例如:属性值3,2,1表示采用4波段、3波段、2波段分别对应 R、G、B颜色通道进行组合显示。 + * @param {ImageStretchOption} [options.stretchOption] 影像的拉伸参数。 + * @param {ImageRenderingRule.InterpolationMode} [options.interpolationMode] 影像显示时使用的插值算法。 + * @param {Array.} [options.colorScheme] 影像拉伸显示的颜色方案。颜色方案为RGBA颜色数组。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 例如:"255,0,0","0,255,0","0,0,255" 表示由红色、绿色、蓝色三种颜色构成的色带。 + * @param {Array.} [options.colorTable] 影像的颜色表。颜色表为栅格值与RGBA颜色值的对照表。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 以下示例表示该颜色对照表由三组构成,第一组高程值为500,对应的颜色为红色;第二组高程值为700,对应的颜色为绿色;第三组高程值为700,对应的颜色为蓝色。 示例:"500: 255,0,0", "700: 0,255,0" , "900: 0,0,255" + * @param {number} [options.brightness] 影像显示的亮度。数值范围为-100到100,增加亮度为正,降低亮度为负。 + * @param {number} [options.contrast] 影像显示的对比度。数值范围为-100到100,增加对比度为正,降低对比度为负。 + * @param {string} [options.noData] 影像的无值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的无值。 + * @param {string} [options.noDataColor] 影像的无值的显示颜色,支持RGB颜色,例如:255,0,0(红色),那么无值将以指定的红色显示。 + * @param {boolean} [options.noDataTransparent] 无值是否透明显示,true表示透明显示无值;否则为false。 + * @param {string} [options.backgroundValue] 影像的背景值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的背景值。 + * @param {string} [options.backgroundColor] 指定背景值的颜色。支持指定RGB颜色,例如:255,0,0(红色),那么背景值将以指定的红色显示。 + * @param {boolean} [options.backgroundTransparent] 背景值是否透明显示,true表示透明显示背景值;否则为false。 + * @param {Array.} [options.gridFunctions] 栅格函数链。 + * @usage + */ +class ImageRenderingRule { + constructor(options) { + /** + * @description 影像显示模式,其中:Composite表示多波段组合显示;Stretched表示单波段拉伸显示。 + * @member {ImageRenderingRule.DisplayMode} ImageRenderingRule.prototype.displayMode + */ + this.displayMode = undefined; + /** + * @description 影像显示的波段或者波段组合。该参数为一个数组,数组元素为波段索引号。若影像的显示模式为Stretched,该属性指定一个显示的波段;若影像的显示模式为Composite,该属性为组合的波段索引号,例如:属性值4,3,2表示采用4波段、3波段、2波段分别对应 R、G、B颜色通道进行组合显示。 + * @member {string} ImageRenderingRule.prototype.displayBands + */ + this.displayBands = undefined; + /** + * @description 影像的拉伸参数。 + * @member {ImageStretchOption} ImageRenderingRule.prototype.stretchOption + */ + this.stretchOption = undefined; + /** + * @description 影像显示时使用的插值算法。 + * @member {ImageRenderingRule.InterpolationMode} ImageRenderingRule.prototype.interpolationMode + */ + this.interpolationMode = undefined; + /** + * @description 影像拉伸显示的颜色方案。颜色方案为RGBA颜色数组。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 例如:"255,0,0","0,255,0","0,0,255" 表示由红色、绿色、蓝色三种颜色构成的色带。 + * @member {Array.} ImageRenderingRule.prototype.colorScheme + */ + this.colorScheme = undefined; + /** + * @description 影像的颜色表。颜色表为栅格值与RGBA颜色值的对照表。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 以下示例表示该颜色对照表由三组构成,第一组高程值为500,对应的颜色为红色;第二组高程值为700,对应的颜色为绿色;第三组高程值为700,对应的颜色为蓝色。 示例:"500: 255,0,0", "700: 0,255,0" , "900: 0,0,255" + * @member {Array.} ImageRenderingRule.prototype.colorTable + */ + this.colorTable = undefined; + /** + * @description 影像显示的亮度。数值范围为-100到100,增加亮度为正,降低亮度为负。 + * @member {number} ImageRenderingRule.prototype.brightness + */ + this.brightness = undefined; + /** + * @description 影像显示的对比度。数值范围为-100到100,增加对比度为正,降低对比度为负。 + * @member {number} ImageRenderingRule.prototype.contrast + */ + this.contrast = undefined; + /** + * @description 影像的无值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的无值。 + * @member {string} ImageRenderingRule.prototype.noData + */ + this.noData = undefined; + /** + * @description 影像的无值的显示颜色,支持RGB颜色,例如:255,0,0(红色),那么无值将以指定的红色显示。 + * @member {string} ImageRenderingRule.prototype.noDataColor + */ + this.noDataColor = undefined; + /** + * @description 无值是否透明显示,true表示透明显示无值;否则为false。 + * @member {boolean} ImageRenderingRule.prototype.noDataTransparent + */ + this.noDataTransparent = undefined; + + /** + * @description 影像的背景值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的背景值。 + * @member {string} ImageRenderingRule.prototype.backgroundValue + */ + this.backgroundValue = undefined; + /** + * @description 指定背景值的颜色。支持指定RGB颜色,例如:255,0,0(红色),那么背景值将以指定的红色显示。 + * @member {string} ImageRenderingRule.prototype.backgroundColor + */ + this.backgroundColor = undefined; + /** + * @description 背景值是否透明显示,true表示透明显示背景值;否则为false。 + * @member {boolean} ImageRenderingRule.prototype.backgroundTransparent + */ + this.backgroundTransparent = undefined; + /** + * @description 栅格函数选项,通过应用栅格函数,可以对影像进行快速显示处理。 + * @member {Array.} ImageRenderingRule.prototype.gridFunctions + */ + this.gridFunctions = undefined; + + this.CLASS_NAME = 'SuperMap.ImageRenderingRule'; + Util.extend(this, options); + } + + /** + * @function ImageRenderingRule.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.displayMode = undefined; + me.displayBands = undefined; + me.stretchOption = undefined; + me.interpolationMode = undefined; + me.colorScheme = undefined; + me.colorTable = undefined; + me.brightness = undefined; + me.contrast = undefined; + me.noData = undefined; + me.noDataColor = undefined; + me.noDataTransparent = undefined; + me.backgroundValue = undefined; + me.backgroundColor = undefined; + me.backgroundTransparent = undefined; + me.gridFuncOptions = undefined; + } + + /** + * @function ImageRenderingRule.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageRenderingRule} obj 返回的模型. + * @return {ImageRenderingRule} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageRenderingRule(); + if (data.hasOwnProperty('displayMode')) { + obj.displayMode = data.displayMode; + } + if (data.hasOwnProperty('displayBands')) { + obj.displayBands = data.displayBands; + } + if (data.hasOwnProperty('stretchOption')) { + obj.stretchOption = + (ImageStretchOption.constructFromObject && ImageStretchOption.constructFromObject(data.stretchOption, {})) || + data.stretchOption; + } + if (data.hasOwnProperty('interpolationMode')) { + obj.interpolationMode = data.interpolationMode; + } + if (data.hasOwnProperty('colorScheme')) { + obj.colorScheme = data.colorScheme; + } + if (data.hasOwnProperty('colorTable')) { + obj.colorTable = data.colorTable; + } + if (data.hasOwnProperty('brightness')) { + obj.brightness = data.brightness; + } + if (data.hasOwnProperty('contrast')) { + obj.contrast = data.contrast; + } + if (data.hasOwnProperty('noData')) { + obj.noData = data.noData; + } + if (data.hasOwnProperty('noDataColor')) { + obj.noDataColor = data.noDataColor; + } + if (data.hasOwnProperty('backgroundValue')) { + obj.backgroundValue = data.backgroundValue; + } + if (data.hasOwnProperty('noDataTransparent')) { + obj.noDataTransparent = data.noDataTransparent; + } + if (data.hasOwnProperty('backgroundColor')) { + obj.backgroundColor = data.backgroundColor; + } + if (data.hasOwnProperty('backgroundTransparent')) { + obj.backgroundTransparent = data.backgroundTransparent; + } + if (data.hasOwnProperty('gridFunctions')) { + obj.gridFunctions = data.gridFunctions; + } + } + return obj; + } +} + +/** + * @enum DisplayMode + * @description 影像显示模式。 + * @memberOf ImageRenderingRule + * @readonly + * @type {string} + */ +ImageRenderingRule.DisplayMode = { + COMPOSITE: 'COMPOSITE', + STRETCHED: 'Stretched' +}; + +/** + * @enum InterpolationMode + * @description 影像显示时使用的插值算法枚举。 + * @memberOf ImageRenderingRule + * @readonly + * @type {string} + */ +ImageRenderingRule.InterpolationMode = { + NEARESTNEIGHBOR: 'NEARESTNEIGHBOR', + HIGHQUALITYBILINEAR: 'HIGHQUALITYBILINEAR', + DEFAULT: 'DEFAULT' +}; + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFHillShade.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageGFHillShade + * @deprecatedclass SuperMap.ImageGFHillShade + * @classdesc 栅格函数对象:对DEM数据生成三维晕渲图。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFHillShade'] 栅格函数名称,参数值为:GFHillShade。 + * @param {number} [options.Azimuth = 315] 光源方位角。用于确定光源的方向,是从光源所在位置的正北方向线起,依顺时针方向到光源与目标方向线的夹角,范围为 0-360 度,以正北方向为 0 度,依顺时针方向递增。默认值为:315。 + * @param {number} [options.Altitude = 45] 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @param {number} [options.ZFactor = 1] 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @usage +*/ +class ImageGFHillShade { + constructor(options) { + /** + * @description 栅格函数名称,参数值为:GFHillShade。 + * @member {string} ImageGFHillShade.prototype.girdFuncName + * @default 'GFHillShade' + */ + this.girdFuncName = 'GFHillShade'; + /** + * @description 光源方位角。用于确定光源的方向,是从光源所在位置的正北方向线起,依顺时针方向到光源与目标方向线的夹角,范围为 0-360 度,以正北方向为 0 度,依顺时针方向递增。默认值为:315。 + * @member {number} ImageGFHillShade.prototype.Azimuth + */ + this.Azimuth = 315; + /** + * @description 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @member {number} ImageGFHillShade.prototype.Altitude + */ + this.Altitude = 45; + /** + * @description 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @member {number} ImageGFHillShade.prototype.ZFactor + */ + this.ZFactor = 1; + + this.CLASS_NAME = 'SuperMap.ImageGFHillShade'; + Util.extend(this, options); + + } + + /** + * @function ImageGFHillShade.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.girdFuncName = 'GFHillShade'; + me.Azimuth = 315; + me.Altitude = 45; + me.ZFactor = 1; + } + + /** + * @function ImageGFHillShade.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFHillShade} obj 返回的模型. + * @return {ImageGFHillShade} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFHillShade(); + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName + } + if (data.hasOwnProperty('Azimuth')) { + obj.Azimuth = data.Azimuth + } + if (data.hasOwnProperty('Altitude')) { + obj.Altitude = data.Altitude + } + if (data.hasOwnProperty('ZFactor')) { + obj.ZFactor = data.ZFactor + } + } + return obj; + } +} + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFAspect.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageGFAspect + * @deprecatedclass SuperMap.ImageGFAspect + * @classdesc 栅格函数对象:对DEM数据生成坡向渲图。 + * @category iServer Image + * @param {Object} options -可选参数。 + * @param {string} [options.girdFuncName='GFAspect'] 栅格函数名称,参数值为:GFAspect。 + * @param {number} [options.Azimuth] 光源方位角,固定为360度。 + * @usage +*/ +class ImageGFAspect { + constructor(options) { + /** + * @description 栅格函数名称,参数值为:GFAspect。 + * @member {string} ImageGFAspect.prototype.girdFuncName + * @default 'GFAspect' + */ + this.girdFuncName = 'GFAspect'; + /** + * @description 光源方位角,固定为360度。 + * @member {number} ImageGFAspect.prototype.Azimuth + */ + this.Azimuth = undefined; + + this.CLASS_NAME = 'SuperMap.ImageGFAspect'; + Util.extend(this, options); + + } + + /** + * @function ImageGFAspect.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.girdFuncName = 'GFAspect'; + me.Azimuth = undefined; + } + + /** + * @function ImageGFAspect.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFAspect} obj 返回的模型. + * @return {ImageGFAspect} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFAspect(); + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName + } + if (data.hasOwnProperty('Azimuth')) { + obj.Azimuth = data.Azimuth + } + } + return obj; + } +} + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFOrtho.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageGFOrtho + * @deprecatedclass SuperMap.ImageGFOrtho + * @classdesc 栅格函数对象:对DEM数据生成三维晕渲图。该栅格函数不需要输入参数,采用系统默认设置。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFOrtho'] 栅格函数名称,参数值为:GFOrtho。 + * @usage +*/ +class ImageGFOrtho { + constructor(options) { + /** + * @description 栅格函数名称,参数值为:GFOrtho。 + * @member {string} ImageGFOrtho.prototype.girdFuncName + * @default 'GFOrtho' + */ + this.girdFuncName = 'GFOrtho'; + + this.CLASS_NAME = 'SuperMap.ImageGFOrtho'; + Util.extend(this, options); + + } + + /** + * @function ImageGFOrtho.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.girdFuncName = 'GFOrtho'; + } + + /** + * @function ImageGFOrtho.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFOrtho} obj 返回的模型. + * @return {ImageGFOrtho} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFOrtho(); + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName + } + } + return obj; + } +} + + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFSlope.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageGFSlope + * @deprecatedclass SuperMap.ImageGFSlope + * @classdesc 栅格函数对象:对DEM数据生成坡度图。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFSlope'] 栅格函数名称,参数值为:GFSlope。 + * @param {number} [options.Altitude = 45] 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @param {number} [options.ZFactor = 1] 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @usage +*/ +class ImageGFSlope { + constructor(options) { + /** + * @description 栅格函数名称,参数值为:GFSlope。 + * @member {string} ImageGFSlope.prototype.girdFuncName + * @default 'GFSlope' + */ + this.girdFuncName = 'GFSlope'; + /** + * @description 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @member {number} ImageGFSlope.prototype.Altitude + */ + this.Altitude = 45; + /** + * @description 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @member {number} ImageGFSlope.prototype.ZFactor + */ + this.ZFactor = 1; + + this.CLASS_NAME = 'SuperMap.ImageGFSlope'; + Util.extend(this, options); + + } + + /** + * @function ImageGFSlope.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + destroy() { + var me = this; + me.girdFuncName = 'GFSlope'; + me.Altitude = 45; + me.ZFactor = 1; + } + + /** + * @function ImageGFSlope.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFSlope} obj 返回的模型. + * @return {ImageGFSlope} 返回结果 + */ + static constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFSlope(); + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName + } + if (data.hasOwnProperty('Altitude')) { + obj.Altitude = data.Altitude + } + if (data.hasOwnProperty('ZFactor')) { + obj.ZFactor = data.ZFactor + } + } + return obj; + } +} + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/online/OnlineResources.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @enum ServiceStatus + * @category BaseTypes Constant + * @description 服务发布状态。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ServiceStatus } from '{npm}'; + * + * const result = ServiceStatus.DOES_NOT_INVOLVE; + * ``` + */ +var ServiceStatus = { + /** 不涉及,不可发布。 */ + DOES_NOT_INVOLVE: "DOES_NOT_INVOLVE", + /** 发布失败。 */ + PUBLISH_FAILED: "PUBLISH_FAILED", + /** 已发布。 */ + PUBLISHED: "PUBLISHED", + /** 正在发布。 */ + PUBLISHING: "PUBLISHING", + /** 未发布。 */ + UNPUBLISHED: "UNPUBLISHED", + /** 取消服务失败。 */ + UNPUBLISHED_FAILED: "UNPUBLISHED_FAILED" +}; + + +/** + * @enum DataItemOrderBy + * @category BaseTypes Constant + * @description 数据排序字段。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataItemOrderBy } from '{npm}'; + * + * const result = DataItemOrderBy.FILENAME; + * ``` + */ +var DataItemOrderBy = { + /** FILENAME */ + FILENAME: "FILENAME", + /** ID */ + ID: "ID", + /** LASTMODIFIEDTIME */ + LASTMODIFIEDTIME: "LASTMODIFIEDTIME", + /** NICKNAME */ + NICKNAME: "NICKNAME", + /** SERVICESTATUS */ + SERVICESTATUS: "SERVICESTATUS", + /** SIZE */ + SIZE: "SIZE", + /** STATUS */ + STATUS: "STATUS", + /** TYPE */ + TYPE: "TYPE", + /** UPDATETIME */ + UPDATETIME: "UPDATETIME", + /** USERNAME */ + USERNAME: "USERNAME" +}; + +/** + * @enum FilterField {number} + * @category BaseTypes Constant + * @description 关键字查询时的过滤字段。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { FilterField } from '{npm}'; + * + * const result = FilterField.LINKPAGE; + * ``` + */ +var FilterField = { + /** LINKPAGE */ + LINKPAGE: "LINKPAGE", + /** MAPTITLE */ + MAPTITLE: "MAPTITLE", + /** NICKNAME */ + NICKNAME: "NICKNAME", + /** RESTITLE */ + RESTITLE: "RESTITLE", + /** USERNAME */ + USERNAME: "USERNAME" +}; + + +;// CONCATENATED MODULE: ./src/common/online/OnlineServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class OnlineServiceBase + * @deprecatedclass SuperMap.OnlineServiceBase + * @classdesc Online 服务基类(使用 key 作为权限限制的类需要实现此类)。 + * @category iPortal/Online Core + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +class OnlineServiceBase { + + constructor(options) { + options = options || {}; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OnlineServiceBase"; + } + + /** + * @function OnlineServiceBase.prototype.request + * @description 请求 online 服务 + * @param {string} [method='GET'] - 请求方式, 'GET', 'PUT', 'POST', 'DELETE'。 + * @param {string} url - 服务地址。 + * @param {Object} param - URL 查询参数。 + * @param {Object} [requestOptions] - http 请求参数, 比如请求头,超时时间等。 + * @returns {Promise} 包含请求结果的 Promise 对象。 + */ + request(method, url, param, requestOptions = {}) { + url = SecurityManager.appendCredential(url); + requestOptions['crossOrigin'] = this.options.crossOrigin; + requestOptions['headers'] = this.options.headers; + return FetchRequest.commit(method, url, param, requestOptions).then(function(response) { + return response.json(); + }); + } + + +} + + +;// CONCATENATED MODULE: ./src/common/online/OnlineData.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OnlineData + * @deprecatedclass SuperMap.OnlineData + * @classdesc Online myData 服务。 + * @category iPortal/Online Resources Data + * @param {string} serviceRootUrl - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + * @extends OnlineServiceBase + */ +class OnlineData extends OnlineServiceBase { + + //TODO 目前并没有对接服务支持的所有操作,日后需要补充完整 + constructor(serviceRootUrl, options) { + super(serviceRootUrl); + options = options || {}; + //MD5 + this.MD5 = null; + //文件类型。 + this.type = null; + //数据上传者名称。 + this.userName = null; + //文件名称。 + this.fileName = null; + //文件大小,单位为 B 。 + this.size = null; + //服务发布状态。 + this.serviceStatus = null; + //服务 id 。 + this.serviceId = null; + //数据项 id 。 + this.id = null; + //最后修改时间。 + this.lastModfiedTime = null; + //文件状态。 + this.status = null; + //数据文件存储 id 。 + this.storageId = null; + //数据的发布信息。 + this.publishInfo = null; + //数据的权限信息。 + this.authorizeSetting = null; + //用户的昵称。 + this.nickname = null; + //数据的标签。 + this.tags = []; + //数据的描述信息。 + this.description = null; + //数据发布的服务信息集合。 + this.dataItemServices = null; + //数据坐标类型。 + this.coordType = null; + //数据审核信息 + this.dataCheckResult = null; + //数据元数据信息 + this.dataMetaInfo = null; + //数据的缩略图路径。 + this.thumbnail = null; + + Util.extend(this, options); + if (this.id) { + this.serviceUrl = serviceRootUrl + "/" + this.id; + } + this.CLASS_NAME = "SuperMap.OnlineData"; + } + + /** + * @function OnlineData.prototype.load + * @description 通过 URL 请求获取该服务完整信息。 + * @returns {Promise} 不包含请求结果的 Promise 对象,请求返回结果自动填充到该类属性中。 + */ + load() { + if (!this.serviceUrl) { + return; + } + var me = this; + return me.request("GET", this.serviceUrl).then(function (result) { + Util.extend(me, result); + }); + } + + /** + * @function OnlineData.prototype.getPublishedServices + * @description 获取数据发布的所有服务。 + * @returns {Object} 数据发布的所有服务。 + */ + getPublishedServices() { + return this.dataItemServices; + } + + /** + * @function OnlineData.prototype.getAuthorizeSetting + * @description 获取数据的权限信息。 + * @returns {Object} 权限信息。 + */ + getAuthorizeSetting() { + return this.authorizeSetting; + } + + +} + + +;// CONCATENATED MODULE: ./src/common/online/Online.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class Online + * @deprecatedclass SuperMap.Online + * @classdesc 对接 SuperMap Online 所有基础服务。 + * @category iPortal/Online Resources + * @example + * var online=new Online(); + * var services = online.queryDatas(param); + * service.then(function(services){ + * var service= services[0]; + * service.updateDataInfo(); + * }) + * @usage + */ +class Online { + + //TODO 目前并没有对接Online的所有操作,需要补充完整 + //所有查询返回的是一个Promise,在外部使用的时候通过Promise的then方法获取异步结果 + constructor() { + this.rootUrl = "https://www.supermapol.com"; + this.webUrl = this.rootUrl + "/web"; + + var mContentUrl = this.webUrl + "/mycontent"; + this.mDatasUrl = mContentUrl + "/datas"; + + this.CLASS_NAME = "SuperMap.Online"; + } + + /** + * @function Online.prototype.load + * @description 加载 online,验证 online 是否可用。 + * @returns {Promise} 包含网络请求结果的 Promise 对象。 + */ + load() { + return FetchRequest.get(this.rootUrl).then(function (response) { + return response; + }); + } + + /** + * @function Online.prototype.login + * @description 登录Online + */ + login() { + SecurityManager.loginOnline(this.rootUrl, true); + } + + /** + * @function Online.prototype.queryDatas + * @description 查询 Online “我的内容” 下 “我的数据” 服务(需要登录状态获取),并返回可操作的服务对象。 + * @param {OnlineQueryDatasParameter} parameter - myDatas 服务资源查询参数。 + * @returns {Promise} 包含所有数据服务信息的 Promise 对象。 + */ + queryDatas(parameter) { + var me = this, url = me.mDatasUrl; + if (parameter) { + parameter = parameter.toJSON(); + } + return FetchRequest.get(url, parameter).then(function (json) { + if (!json || !json.content || json.content.length < 1) { + return; + } + var services = [], contents = json.content, len = contents.length; + for (var i = 0; i < len; i++) { + var content = contents[i]; + var service = new OnlineData(me.mDatasUrl, content); + services.push(service); + } + return services; + }); + } +} + +;// CONCATENATED MODULE: ./src/common/online/OnlineQueryDatasParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OnlineQueryDatasParameter + * @deprecatedclass SuperMap.OnlineQueryDatasParameter + * @classdesc myDatas 服务资源查询参数。 + * @category iPortal/Online Resources Data + * @param {Object} options - 参数。 + * @usage + */ +class OnlineQueryDatasParameter { + constructor(options) { + options = options || {}; + + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.userNames + * @description 数据作者名。可以根据数据作者名查询,默认查询全部。 + */ + this.userNames = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.types + * @description 数据类型。 + */ + this.types = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.fileName + * @description 文件名称。 + */ + this.fileName = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.serviceStatuses + * @description 服务发布状态。 + */ + this.serviceStatuses = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.serviceId + * @description 服务 ID。 + */ + this.serviceId = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.ids + * @description 由数据项 ID 组成的整型数组。 + */ + this.ids = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.keywords + * @description 关键字。 + */ + this.keywords = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.orderBy + * @description 排序字段。 + */ + this.orderBy = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.tags + * @description 数据的标签。 + */ + this.tags = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.filterFields + * @description 用于关键字查询时的过滤字段。 + */ + this.filterFields = null; + + Util.extend(this, options) + + this.CLASS_NAME = "SuperMap.OnlineQueryDatasParameter"; + } + + + /** + * @function OnlineQueryDatasParameter.prototype.toJSON + * @description 返回对应的 JSON 对象。 + * @returns {Object} 对应的 JSON 对象。 + */ + toJSON() { + var me = this; + var jsonObj = { + "types": me.types, + "fileName": me.fileName, + "serviceStatuses": me.serviceStatuses, + "serviceId": me.serviceId, + "ids": me.ids, + "keywords": me.keywords, + "orderBy": me.orderBy, + "tags": me.tags, + "filterFields": me.filterFields + }; + for (var key in jsonObj) { + if (jsonObj[key] == null) { + delete jsonObj[key] + } + } + return jsonObj; + } + +} + +;// CONCATENATED MODULE: ./src/common/online/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/security/KeyServiceParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class KeyServiceParameter + * @deprecatedclass SuperMap.KeyServiceParameter + * @classdesc key申请参数 + * @category Security + * @param {Object} options - 参数。 + * @param {string} options.name - 申请服务名称。 + * @param {number} options.serviceIds - 服务 ID。 + * @param {ClientType} [options.clientType=ClientType.SERVER] - 服务端类型。 + * @param {number} options.limitation - 有效期 + * @usage + */ +class KeyServiceParameter { + + constructor(options) { + this.name = null; + this.serviceIds = null; + this.clientType = ClientType.SERVER; + this.limitation = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.KeyServiceParameter"; + } + + /** + * @function KeyServiceParameter.prototype.toJSON + * @description 转换成 JSON 对象 + * @returns {Object} 参数的 JSON 对象 + */ + toJSON() { + return { + name: this.name, + serviceIds: this.serviceIds, + clientType: this.clientType, + limitation: this.limitation + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/security/ServerInfo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ServerInfo + * @deprecatedclass SuperMap.ServerInfo + * @classdesc 服务器信息(安全相关),包含服务器类型,服务地址,token服务地址等 + * @category Security + * @param {string} type - 服务器类型 + * @param {Object} options - 参数。 + * @param {string} options.server - 服务器地址,如:http://supermapiserver:8090/iserver + * @param {string} [options.tokenServiceUrl] - 如:http://supermapiserver:8090/iserver/services/security/tokens.json + * @param {string} [options.keyServiceUrl] - 如:http://supermapiserver:8092/web/mycontent/keys/register.json + * @usage + */ +class ServerInfo { + constructor(type, options) { + /** + * @member {ServerType} ServerInfo.prototype.type + * @description 服务器类型 + */ + this.type = type; + + /** + * @member {string} ServerInfo.prototype.server + * @description 服务器地址 + */ + this.server = null; + + /** + * @member {string} [ServerInfo.prototype.tokenServiceUrl] + * @description 如:http://supermapiserver:8090/iserver/services/security/tokens.json + */ + this.tokenServiceUrl = null; + + /** + * @member {string} [ServerInfo.prototype.keyServiceUrl] + * @description 如:http://supermapiserver:8092/web/mycontent/keys/register.json + */ + this.keyServiceUrl = null; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.ServerInfo"; + this.type = this.type || ServerType.ISERVER; + if (!this.server) { + console.error('server url require is not undefined') + } + // var patten = /http:\/\/([^\/]+)/i; + //this.server = this.server.match(patten)[0]; + + var tokenServiceSuffix = "/services/security/tokens"; + if (this.type === ServerType.ISERVER && this.server.indexOf("iserver") < 0) { + tokenServiceSuffix = "/iserver" + tokenServiceSuffix; + } + + if (!this.tokenServiceUrl) { + this.tokenServiceUrl = Util.urlPathAppend(this.server, tokenServiceSuffix); + } + + if (!this.keyServiceUrl) { + if (this.type === ServerType.IPORTAL) { + this.keyServiceUrl = Util.urlPathAppend(this.server, "/web/mycontent/keys/register"); + } else if (this.type === ServerType.ONLINE) { + this.keyServiceUrl = Util.urlPathAppend(this.server, "/web/mycontent/keys"); + } + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/security/TokenServiceParameter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TokenServiceParameter + * @deprecatedclass SuperMap.TokenServiceParameter + * @classdesc token 申请参数。 + * @category Security + * @param {Object} options - 参数。 + * @param {string} options.username - 用户名。 + * @param {string} options.password - 密码。 + * @param {ClientType} [options.clientType='ClientType.NONE'] - token 申请的客户端标识类型。 + * @param {string} [options.ip] - clientType=IP 时,此为必选参数。 + * @param {string} [options.referer] -clientType=Referer 时,此为必选参数。如果按照指定 URL 的方式申请令牌,则设置相应的 URL。 + * @param {number} [options.expiration=60] - 申请令牌的有效期,从发布令牌的时间开始计算,单位为分钟。 + * @usage + * + */ +class TokenServiceParameter { + constructor(options) { + /** + * @member {string} TokenServiceParameter.prototype.userName + * @description 用户名。 + */ + this.userName = null; + + /** + * @member {string} TokenServiceParameter.prototype.password + * @description 密码。 + */ + this.password = null; + + /** + * @member {ClientType} TokenServiceParameter.prototype.clientType + * @description token 申请的客户端标识类型。 + */ + this.clientType = ClientType.NONE; + + /** + * @member {string} [TokenServiceParameter.prototype.ip] + * @description clientType=IP 时,此为必选参数。 + */ + + this.ip = null; + /** + * @member {string} [TokenServiceParameter.prototype.referer] + * @description clientType=Referer 时,此为必选参数。如果按照指定 URL 的方式申请令牌,则设置相应的 URL。 + */ + this.referer = null; + + /** + * @member {number} TokenServiceParameter.prototype.expiration + * @description 申请令牌的有效期,从发布令牌的时间开始计算,单位为分钟。 + */ + this.expiration = 60; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.TokenServiceParameter"; + } + + /** + * @function TokenServiceParameter.prototype.toJSON + * @description 将所有信息转成 JSON 字符串 + * @returns {string} 参数的 JSON 字符串 + */ + toJSON() { + return { + userName: this.userName, + password: this.password, + clientType: this.clientType, + ip: this.ip, + referer: this.referer, + expiration: this.expiration + } + } + +} + + +;// CONCATENATED MODULE: ./src/common/security/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +;// CONCATENATED MODULE: external "function(){try{return elasticsearch}catch(e){return {}}}()" +const external_function_try_return_elasticsearch_catch_e_return_namespaceObject = function(){try{return elasticsearch}catch(e){return {}}}(); +var external_function_try_return_elasticsearch_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_elasticsearch_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/thirdparty/elasticsearch/ElasticSearch.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ElasticSearch + * @deprecatedclass SuperMap.ElasticSearch + * @classdesc ElasticSearch服务类。 + * @category ElasticSearch + * @param {string} url - ElasticSearch服务地址。 + * @param {Object} options - 参数。 + * @param {function} [options.change] - 服务器返回数据后执行的函数。废弃,不建议使用。使用search或msearch方法。 + * @param {boolean} [options.openGeoFence=false] - 是否开启地理围栏验证,默认为不开启。 + * @param {function} [options.outOfGeoFence] - 数据超出地理围栏后执行的函数。 + * @param {Object} [options.geoFence] - 地理围栏。 + * @usage + */ + +class ElasticSearch { + + constructor(url, options) { + options = options || {}; + /** + * @member {string} ElasticSearch.prototype.url + * @description ElasticSearch服务地址 + */ + this.url = url; + /** + * @member {Object} ElasticSearch.prototype.client + * @description client ES客户端 + */ + this.client = new (external_function_try_return_elasticsearch_catch_e_return_default()).Client({ + host: this.url + }); + /** + * @deprecated + * @member {function} [ElasticSearch.prototype.change] + * @description 服务器返回数据后执行的函数。废弃,不建议使用。使用search或msearch方法。 + */ + this.change = null; + /** + * @member {boolean} [ElasticSearch.prototype.openGeoFence=false] + * @description 是否开启地理围栏验证,默认为不开启。 + */ + this.openGeoFence = false; + /** + * @member {function} [ElasticSearch.prototype.outOfGeoFence] + * @description 数据超出地理围栏后执行的函数 + */ + this.outOfGeoFence = null; + + /** + * @member {Object} [ElasticSearch.prototype.geoFence] + * @description 地理围栏 + * @example { + * radius: 1000,//单位是m + * center: [104.40, 30.43], + * unit: 'meter|degree' + * } + */ + this.geoFence = null; + + /* + * Constant: EVENT_TYPES + * {Array.} + * 此类支持的事件类型。 + * + */ + this.EVENT_TYPES = ['change', 'error', 'outOfGeoFence']; + + /** + * @member {Events} ElasticSearch.prototype.events + * @description 事件 + */ + this.events = new Events(this, null, this.EVENT_TYPES); + + /** + * @member {Object} ElasticSearch.prototype.eventListeners + * @description 听器对象,在构造函数中设置此参数(可选),对 MapService 支持的两个事件 processCompleted 、processFailed 进行监听, + * 相当于调用 Events.on(eventListeners)。 + */ + this.eventListeners = null; + Util.extend(this, options); + if (this.eventListeners instanceof Object) { + this.events.on(this.eventListeners); + } + } + + /** + * @function ElasticSearch.prototype.setGeoFence + * @description 设置地理围栏,openGeoFence参数为true的时候,设置的地理围栏才生效。 + * @param {Geometry} geoFence - 地理围栏。 + */ + + setGeoFence(geoFence) { + this.geoFence = geoFence; + } + + /** + * @function ElasticSearch.prototype.bulk + * @description 批量操作API,允许执行多个索引/删除操作。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-bulk}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + bulk(params, callback) { + return this.client.bulk(params, callback); + } + + /** + * @function ElasticSearch.prototype.clearScroll + * @description 通过指定scroll参数进行查询来清除已经创建的scroll请求。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-clearscroll}
+ *更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + clearScroll(params, callback) { + return this.client.clearScroll(params, callback); + } + + /** + * @function ElasticSearch.prototype.count + * @description 获取集群、索引、类型或查询的文档个数。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-count}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + count(params, callback) { + return this.client.count(params, callback); + } + + /** + * @function ElasticSearch.prototype.create + * @description 在特定索引中添加一个类型化的JSON文档,使其可搜索。如果具有相同index,type且id已经存在的文档将发生错误。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-create} + * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html} + * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + create(params, callback) { + return this.client.create(params, callback); + } + + /** + * @function ElasticSearch.prototype.delete + * @description 根据其ID从特定索引中删除键入的JSON文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-delete}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + delete(params, callback) { + return this.client.delete(params, callback); + } + + /** + * @function ElasticSearch.prototype.deleteByQuery + * @description 根据其ID从特定索引中删除键入的JSON文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletebyquery}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + deleteByQuery(params, callback) { + return this.client.deleteByQuery(params, callback); + } + + /** + * @function ElasticSearch.prototype.deleteScript + * @description 根据其ID删除脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletescript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + deleteScript(params, callback) { + return this.client.deleteScript(params, callback); + } + + /** + * @function ElasticSearch.prototype.deleteTemplate + * @description 根据其ID删除模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletetemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + deleteTemplate(params, callback) { + return this.client.deleteTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.exists + * @description 检查给定文档是否存在。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-exists}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + exists(params, callback) { + return this.client.exists(params, callback); + } + + /** + * @function ElasticSearch.prototype.existsSource + * @description 检查资源是否存在。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-existssource}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + existsSource(params, callback) { + return this.client.existsSource(params, callback); + } + + /** + * @function ElasticSearch.prototype.explain + * @description 提供与特定查询相关的特定文档分数的详细信息。它还会告诉您文档是否与指定的查询匹配。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-explain}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + explain(params, callback) { + return this.client.explain(params, callback); + } + + /** + * @function ElasticSearch.prototype.fieldCaps + * @description 允许检索多个索引之间的字段的功能。(实验性API,可能会在未来版本中删除)
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-fieldcaps}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + fieldCaps(params, callback) { + return this.client.fieldCaps(params, callback); + } + + + /** + * @function ElasticSearch.prototype.get + * @description 从索引获取一个基于其id的类型的JSON文档。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-get}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + get(params, callback) { + return this.client.get(params, callback); + } + + /** + * @function ElasticSearch.prototype.getScript + * @description 获取脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-getscript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + getScript(params, callback) { + return this.client.getScript(params, callback); + } + + /** + * @function ElasticSearch.prototype.getSource + * @description 通过索引,类型和ID获取文档的源。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-getsource}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + getSource(params, callback) { + return this.client.getSource(params, callback); + } + + /** + * @function ElasticSearch.prototype.getTemplate + * @description 获取模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-gettemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + getTemplate(params, callback) { + return this.client.getTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.index + * @description 在索引中存储一个键入的JSON文档,使其可搜索。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-index}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + index(params, callback) { + return this.client.index(params, callback); + } + + /** + * @function ElasticSearch.prototype.info + * @description 从当前集群获取基本信息。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-info}
+ * 更多信息参考 {@link https://www.elastic.co/guide/index.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + info(params, callback) { + return this.client.info(params, callback); + } + + /** + * @function ElasticSearch.prototype.mget + * @description 根据索引,类型(可选)和ids来获取多个文档。mget所需的主体可以采用两种形式:文档位置数组或文档ID数组。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-mget}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + mget(params, callback) { + return this.client.mget(params, callback); + } + + /** + * @function ElasticSearch.prototype.msearch + * @description 在同一请求中执行多个搜索请求。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-msearch}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 请求返回的回调函数。也可以使用then表达式获取返回结果。 + * 回调参数:error,response。结果存储在response.responses中 + */ + msearch(params, callback) { + let me = this; + + return me.client.msearch(params) + .then(function (resp) { + me._update(resp.responses, callback); + return resp; + }, function (err) { + callback(err); + me.events.triggerEvent('error', {error: err}); + return err; + }); + } + + /** + * @function ElasticSearch.prototype.msearchTemplate + * @description 在同一请求中执行多个搜索模板请求。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-msearchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + msearchTemplate(params, callback) { + return this.client.msearchTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.mtermvectors + * @description 多termvectors API允许一次获得多个termvectors。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-mtermvectors}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-termvectors.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + mtermvectors(params, callback) { + return this.client.mtermvectors(params, callback); + } + + /** + * @function ElasticSearch.prototype.ping + * @description 测试连接。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-ping}
+ * 更多信息参考 {@link https://www.elastic.co/guide/index.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + ping(params, callback) { + return this.client.ping(params, callback); + } + + /** + * @function ElasticSearch.prototype.putScript + * @description 添加脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-putscript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + putScript(params, callback) { + return this.client.putScript(params, callback); + } + + /** + * @function ElasticSearch.prototype.putTemplate + * @description 添加模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-puttemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + putTemplate(params, callback) { + return this.client.putTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.reindex + * @description 重新索引。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-reindex}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + reindex(params, callback) { + return this.client.reindex(params, callback); + } + + /** + * @function ElasticSearch.prototype.reindexRessrottle + * @description 重新索引。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-reindexrethrottle}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + reindexRessrottle(params, callback) { + return this.client.reindexRessrottle(params, callback); + } + + /** + * @function ElasticSearch.prototype.renderSearchTemplate + * @description 搜索模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-rendersearchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + renderSearchTemplate(params, callback) { + return this.client.renderSearchTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.scroll + * @description 在search()调用中指定滚动参数之后,滚动搜索请求(检索下一组结果)。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-scroll}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + scroll(params, callback) { + return this.client.scroll(params, callback); + } + + /** + * @function ElasticSearch.prototype.search + * @description 在search()调用中指定滚动参数之后,滚动搜索请求(检索下一组结果)。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-search}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 请求返回的回调函数。也可以使用then表达式获取返回结果。 + * 回调参数:error,response,结果存储在response.responses中 + */ + search(params, callback) { + let me = this; + return me.client.search(params) + .then(function (resp) { + me._update(resp.responses, callback); + return resp; + }, function (err) { + callback(err); + me.events.triggerEvent('error', {error: err}); + return err; + }); + } + + /** + * @function ElasticSearch.prototype.searchShards + * @description 返回要执行搜索请求的索引和分片。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-searchshards}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + searchShards(params, callback) { + return this.client.searchShards(params, callback); + } + + /** + * @function ElasticSearch.prototype.searchTemplate + * @description 搜索模板。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-searchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + searchTemplate(params, callback) { + return this.client.searchTemplate(params, callback); + } + + /** + * @function ElasticSearch.prototype.suggest + * @description 该建议功能通过使用特定的建议者,基于所提供的文本来建议类似的术语。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-suggest}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + suggest(params, callback) { + return this.client.suggest(params, callback); + } + + /** + * @function ElasticSearch.prototype.termvectors + * @description 返回有关特定文档字段中的术语的信息和统计信息。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-termvectors}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + termvectors(params, callback) { + return this.client.termvectors(params, callback); + } + + /** + * @function ElasticSearch.prototype.update + * @description 更新文档的部分。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-update}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + update(params, callback) { + return this.client.update(params, callback); + } + + /** + * @function ElasticSearch.prototype.updateByQuery + * @description 通过查询API来更新文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-updatebyquery}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + updateByQuery(params, callback) { + return this.client.updateByQuery(params, callback); + } + + _update(data, callback) { + let me = this; + if (!data) { + return; + } + me.data = data; + if (me.openGeoFence && me.geoFence) { + me._validateDatas(data); + } + me.events.triggerEvent('change', {data: me.data}); + //change方法已废弃,不建议使用。建议使用search方法的第二个参数传入请求成功的回调 + if (me.change) { + me.change && me.change(data); + } else { + //加responses是为了保持跟原来es自身的数据结构一致 + callback && callback(undefined, {responses: data}); + } + } + + _validateDatas(datas) { + if (!datas) { + return; + } + if (!(datas instanceof Array)) { + datas = [datas]; + } + var i, len = datas.length; + for (i = 0; i < len; i++) { + this._validateData(datas[i]); + } + } + + _validateData(data) { + let me = this; + data.hits.hits.map(function (source) { + let content = source._source; + let meterUnit = me._getMeterPerMapUnit(me.geoFence.unit); + let geoFenceCX = me.geoFence.center[0] * meterUnit; + let geoFenceCY = me.geoFence.center[1] * meterUnit; + let contentX = content.x * meterUnit; + let contentY = content.y * meterUnit; + let distance = me._distance(contentX, contentY, geoFenceCX, geoFenceCY); + let radius = me.geoFence.radius; + if (distance > radius) { + me.outOfGeoFence && me.outOfGeoFence(data); + me.events.triggerEvent('outOfGeoFence', {data: data}); + } + return source; + }); + } + + _distance(x1, y1, x2, y2) { + return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + } + + _getMeterPerMapUnit(mapUnit) { + let earchRadiusInMeters = 6378137; + let meterPerMapUnit; + if (mapUnit === 'meter') { + meterPerMapUnit = 1; + } else if (mapUnit === 'degree') { + // 每度表示多少米。 + meterPerMapUnit = Math.PI * 2 * earchRadiusInMeters / 360; + } + return meterPerMapUnit; + } + +} + + +;// CONCATENATED MODULE: ./src/common/thirdparty/elasticsearch/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +;// CONCATENATED MODULE: ./src/common/thirdparty/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @private + * @class LevelRenderer.Tool.Util + * @category Visualization Theme + * LevelRenderer 基础工具类 + * + */ +class Util_Util { + constructor() { + /** + * @member {Object} LevelRenderer.Tool.Util.prototype.BUILTIN_OBJECT + * @description 用于处理merge时无法遍历Date等对象的问题 + */ + this.BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1 + }; + + /** + * @member {Object} LevelRenderer.Tool.Util.prototype._ctx + */ + this._ctx = null; + + /** + * Property: _canvas + * {Object} + */ + this._canvas = null; + + /** + * Property: _pixelCtx + * {Object} + */ + this._pixelCtx = null; + + /** + * Property: _width + * {Object} + */ + this._width = null; + + /** + * Property: _height + * {Object} + */ + this._height = null; + + /** + * Property: _offsetX + * {Object} + */ + this._offsetX = 0; + + /** + * Property: _offsetY + * {Object} + */ + this._offsetY = 0; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Util"; + + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.clone + * @description 对一个object进行深度拷贝。 + * + * @param {Object} source - 需要进行拷贝的对象。 + * @return {Object} 拷贝后的新对象。 + */ + clone(source) { + var BUILTIN_OBJECT = this.BUILTIN_OBJECT; + if (typeof source == 'object' && source !== null) { + var result = source; + if (source instanceof Array) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = this.clone(source[i]); + } + } else if (!BUILTIN_OBJECT[Object.prototype.toString.call(source)]) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = this.clone(source[key]); + } + } + } + + return result; + } + + return source; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.mergeItem + * @description 合并源对象的单个属性到目标对象。 + * + * @param {Object} target - 目标对象。 + * @param {Object} source - 源对象。 + * @param {string} key - 键。 + * @param {boolean} overwrite - 是否覆盖。 + * @return {Object} 目标对象 + */ + mergeItem(target, source, key, overwrite) { + var BUILTIN_OBJECT = this.BUILTIN_OBJECT; + if (source.hasOwnProperty(key)) { + if (typeof target[key] == 'object' + && !BUILTIN_OBJECT[Object.prototype.toString.call(target[key])] + ) { + // 如果需要递归覆盖,就递归调用merge + this.merge( + target[key], + source[key], + overwrite + ); + } else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + target[key] = source[key]; + } + } + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.merge + * @description 合并源对象的属性到目标对象。 + * + * @param {Object} target - 目标对象。 + * @param {Object} source - 源对象。 + * @param {boolean} overwrite - 是否覆盖。 + * @return {Object} 目标对象。 + */ + merge(target, source, overwrite) { + for (var i in source) { + this.mergeItem(target, source, i, overwrite); + } + + return target; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.getContext + * @description 获取 Canvas 上下文。 + * @return {Object} 上下文。 + */ + getContext() { + if (!this._ctx) { + this._ctx = document.createElement('canvas').getContext('2d'); + } + return this._ctx; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.getPixelContext + * @description 获取像素拾取专用的上下文。 + * @return {Object} 像素拾取专用的上下文。 + */ + getPixelContext() { + if (!this._pixelCtx) { + this._canvas = document.createElement('canvas'); + this._width = this._canvas.width; + this._height = this._canvas.height; + this._pixelCtx = this._canvas.getContext('2d'); + } + return this._pixelCtx; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.adjustCanvasSize + * @description 如果坐标处在_canvas外部,改变_canvas的大小,修改canvas的大小 需要重新设置translate + * + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * + */ + adjustCanvasSize(x, y) { + var _canvas = this._canvas; + var _pixelCtx = this._pixelCtx; + var _width = this._width; + var _height = this._height; + var _offsetX = this._offsetX; + var _offsetY = this._offsetY; + + // 每次加的长度 + var _v = 100; + var _flag; + + if (x + _offsetX > _width) { + _width = x + _offsetX + _v; + _canvas.width = _width; + _flag = true; + } + + if (y + _offsetY > _height) { + _height = y + _offsetY + _v; + _canvas.height = _height; + _flag = true; + } + + if (x < -_offsetX) { + _offsetX = Math.ceil(-x / _v) * _v; + _width += _offsetX; + _canvas.width = _width; + _flag = true; + } + + if (y < -_offsetY) { + _offsetY = Math.ceil(-y / _v) * _v; + _height += _offsetY; + _canvas.height = _height; + _flag = true; + } + + if (_flag) { + _pixelCtx.translate(_offsetX, _offsetY); + } + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.getPixelOffset + * @description 获取像素canvas的偏移量。 + * @return {Object} 偏移量。 + */ + getPixelOffset() { + return { + x: this._offsetX, + y: this._offsetY + }; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.indexOf + * @description 查询数组中元素的index + * @return {Object} 偏移量。 + */ + indexOf(array, value) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + + /** + * @function LevelRenderer.Tool.Util.prototype.inherits + * @description 构造类继承关系 + * + * @param {function} clazz - 源类。 + * @param {function} baseClazz - 基类。 + * @return {Object} 偏移量。 + */ + inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + + function F() { + } + + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + clazz.constructor = clazz; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Color.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer.Tool.Color + * @category Visualization Theme + * @classdesc LevelRenderer 工具-颜色辅助类 + * @private + */ +class Color { + + + + constructor() { + /** + * @member {LevelRenderer.Tool.Util} LevelRenderer.Tool.Color.prototype.util + * @description LevelRenderer 基础工具对象。 + */ + this.util = new Util_Util(); + + /** + * @member {Object} LevelRenderer.Tool.Color.prototype._ctx + * @description _ctx。 + */ + this._ctx = null; + + /** + * @member {Array.} LevelRenderer.Tool.Color.prototype.palette + * @description 默认色板。色板是一个包含图表默认颜色系列的数组,当色板中所有颜色被使用过后,又将从新回到色板中的第一个颜色。 + */ + this.palette = [ + '#ff9277', ' #dddd00', ' #ffc877', ' #bbe3ff', ' #d5ffbb', + '#bbbbff', ' #ddb000', ' #b0dd00', ' #e2bbff', ' #ffbbe3', + '#ff7777', ' #ff9900', ' #83dd00', ' #77e3ff', ' #778fff', + '#c877ff', ' #ff77ab', ' #ff6600', ' #aa8800', ' #77c7ff', + '#ad77ff', ' #ff77ff', ' #dd0083', ' #777700', ' #00aa00', + '#0088aa', ' #8400dd', ' #aa0088', ' #dd0000', ' #772e00' + ]; + + /** + * @member {Array.} LevelRenderer.Tool.Color.prototype._palette + * @description 复位色板,用于复位 palette + */ + this._palette = this.palette; + + /** + * @member {string} LevelRenderer.Tool.Color.prototype.highlightColor + * @description 高亮色 + */ + this.highlightColor = 'rgba(0,0,255,1)'; + + /** + * @member {string} LevelRenderer.Tool.Color.prototype._highlightColor + * @description 复位高亮色 + */ + this._highlightColor = this.highlightColor; + + /** + * @member {string} LevelRenderer.Tool.Color.prototype.colorRegExp + * @description 颜色格式,正则表达式。 + */ + this.colorRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i; + + /** + * @member {string} LevelRenderer.Tool.Color.prototype._nameColors + * @description 颜色名。 + */ + this._nameColors = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#0ff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000', + blanchedalmond: '#ffebcd', + blue: '#00f', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#0ff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgrey: '#a9a9a9', + darkgreen: '#006400', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkslategrey: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#f0f', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + grey: '#808080', + green: '#008000', + greenyellow: '#adff2f', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgrey: '#d3d3d3', + lightgreen: '#90ee90', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#789', + lightslategrey: '#789', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#0f0', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#f0f', + maroon: '#800000', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370d8', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#d87093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + red: '#f00', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + slategrey: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#fff', + whitesmoke: '#f5f5f5', + yellow: '#ff0', + yellowgreen: '#9acd32' + }; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Color"; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.customPalette + * @description 自定义调色板。 + * @param {Array.} userPalete - 颜色板。 + */ + customPalette(userPalete) { + this.palette = userPalete; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.resetPalette + * @description 复位默认色板。 + */ + resetPalette() { + this.palette = this._palette; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getColor + * @description 获取色板颜色。 + * @param {number} idx - 色板位置。 + * @param {Array.} userPalete - 色板。 + * @returns {string} 颜色值。 + */ + getColor(idx, userPalete) { + idx = idx | 0; + userPalete = userPalete || this.palette; + return userPalete[idx % userPalete.length]; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.customHighlight + * @description 自定义默认高亮颜色。 + * @param {string} userHighlightColor - 自定义高亮色。 + */ + customHighlight(userHighlightColor) { + this.highlightColor = userHighlightColor; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.resetHighlight + * @description 重置默认高亮颜色。将当前的高亮色作为默认高亮颜色 + */ + resetHighlight() { + this.highlightColor = this._highlightColor; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getHighlightColor + * @description 获取默认高亮颜色 + * @returns {string} 颜色值。 + */ + getHighlightColor() { + return this.highlightColor; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getRadialGradient + * @description 径向渐变。 + * @param {number} x0 - 渐变起点横坐标。 + * @param {number} y0 - 渐变起点纵坐标。 + * @param {number} r0 - 半径 + * @param {number} x1 - 渐变终点横坐标。 + * @param {number} y1 - 渐变终点纵坐标。 + * @param {number} r1 - 半径 + * @param {Array} colorList - 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + getRadialGradient(x0, y0, r0, x1, y1, r1, colorList) { + var util = this.util; + + if (!this._ctx) { + this._ctx = util.getContext(); + } + var gradient = this._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1); + for (var i = 0, l = colorList.length; i < l; i++) { + + gradient.addColorStop(colorList[i][0], colorList[i][1]); + } + gradient.__nonRecursion = true; + return gradient; + } + + + /** + * @function LevelRenderer.Tool.Color.prototype.getLinearGradient + * @description 线性渐变。 + * @param {number} x0 - 渐变起点横坐标。 + * @param {number} y0 - 渐变起点纵坐标。 + * @param {number} x1 - 渐变终点横坐标。 + * @param {number} y1 - 渐变终点纵坐标。 + * @param {Array} colorList - 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + getLinearGradient(x0, y0, x1, y1, colorList) { + var util = this.util; + + if (!this._ctx) { + this._ctx = util.getContext(); + } + var gradient = this._ctx.createLinearGradient(x0, y0, x1, y1); + for (var i = 0, l = colorList.length; i < l; i++) { + gradient.addColorStop(colorList[i][0], colorList[i][1]); + } + gradient.__nonRecursion = true; + return gradient; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getStepColors + * @description 获取两种颜色之间渐变颜色数组。 + * @param {Object} start - 起始颜色对象。 + * @param {Object} end - 结束颜色对象。 + * @param {number} step - 渐变级数。 + * @returns {Array} 颜色数组。 + */ + getStepColors(start, end, step) { + start = this.toRGBA(start); + end = this.toRGBA(end); + start = this.getData(start); + end = this.getData(end); + + var colors = []; + var stepR = (end[0] - start[0]) / step; + var stepG = (end[1] - start[1]) / step; + var stepB = (end[2] - start[2]) / step; + var stepA = (end[3] - start[3]) / step; + // 生成颜色集合 + // fix by linfeng 颜色堆积 + for (var i = 0, r = start[0], g = start[1], b = start[2], a = start[3]; i < step; i++) { + colors[i] = this.toColor([ + this.adjust(Math.floor(r), [0, 255]), + this.adjust(Math.floor(g), [0, 255]), + this.adjust(Math.floor(b), [0, 255]), + a.toFixed(4) - 0 + ], 'rgba'); + r += stepR; + g += stepG; + b += stepB; + a += stepA; + } + r = end[0]; + g = end[1]; + b = end[2]; + a = end[3]; + colors[i] = this.toColor([r, g, b, a], 'rgba'); + return colors; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getGradientColors + * @description 获取指定级数的渐变颜色数组。 + * @param {Array.} colors - 颜色数组。 + * @param {number} [step=20] - 渐变级数。 + * @returns {Array.} 颜色数组。 + */ + getGradientColors(colors, step) { + var ret = []; + var len = colors.length; + if (step === undefined) { + step = 20; + } + if (len === 1) { + ret = this.getStepColors(colors[0], colors[0], step); + } else if (len > 1) { + for (var i = 0, n = len - 1; i < n; i++) { + var steps = this.getStepColors(colors[i], colors[i + 1], step); + if (i < n - 1) { + steps.pop(); + } + ret = ret.concat(steps); + } + } + return ret; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toColor + * @description 颜色值数组转为指定格式颜色。 + * @param {Array} data - 颜色值数组。 + * @param {string} format - 格式,默认'rgb' + * @returns {string} 颜色。 + */ + toColor(data, format) { + format = format || 'rgb'; + if (data && (data.length === 3 || data.length === 4)) { + data = this.map(data, + function (c) { + return c > 1 ? Math.ceil(c) : c; + } + ); + + if (format.indexOf('hex') > -1) { + return '#' + ((1 << 24) + (data[0] << 16) + (data[1] << 8) + (+data[2])).toString(16).slice(1); + } else if (format.indexOf('hs') > -1) { + var sx = this.map(data.slice(1, 3), + function (c) { + return c + '%'; + } + ); + data[1] = sx[0]; + data[2] = sx[1]; + } + + if (format.indexOf('a') > -1) { + if (data.length === 3) { + data.push(1); + } + data[3] = this.adjust(data[3], [0, 1]); + return format + '(' + data.slice(0, 4).join(',') + ')'; + } + + return format + '(' + data.slice(0, 3).join(',') + ')'; + } + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toArray + * @description 颜色字符串转换为rgba数组。 + * @param {string} color - 颜色。 + * @returns {Array.} 颜色值数组。 + */ + toArray(color) { + color = this.trim(color); + if (color.indexOf('rgba') < 0) { + color = this.toRGBA(color); + } + + var data = []; + var i = 0; + color.replace(/[\d.]+/g, function (n) { + if (i < 3) { + n = n | 0; + } else { + // Alpha + n = +n; + } + data[i++] = n; + }); + return data; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.convert + * @description 颜色格式转化。 + * @param {Array} data - 颜色值数组。 + * @param {string} format - 格式,默认'rgb' + * @returns {string} 颜色。 + */ + convert(color, format) { + if (!this.isCalculableColor(color)) { + return color; + } + var data = this.getData(color); + var alpha = data[3]; + if (typeof alpha === 'undefined') { + alpha = 1; + } + + if (color.indexOf('hsb') > -1) { + data = this._HSV_2_RGB(data); + } else if (color.indexOf('hsl') > -1) { + data = this._HSL_2_RGB(data); + } + + if (format.indexOf('hsb') > -1 || format.indexOf('hsv') > -1) { + data = this._RGB_2_HSB(data); + } else if (format.indexOf('hsl') > -1) { + data = this._RGB_2_HSL(data); + } + + data[3] = alpha; + + return this.toColor(data, format); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toRGBA + * @description 转换为rgba格式的颜色。 + * @param {string} color - 颜色。 + * @returns {string} 颜色。 + */ + toRGBA(color) { + return this.convert(color, 'rgba'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toRGB + * @description 转换为rgb数字格式的颜色。 + * @param {string} color - 颜色。 + * @returns {string} 颜色。 + */ + toRGB(color) { + return this.convert(color, 'rgb'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHex + * @description 转换为16进制颜色。 + * @param {string} color - 颜色。 + * @returns {string} 16进制颜色,#rrggbb格式 + */ + toHex(color) { + return this.convert(color, 'hex'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSVA + * @description 转换为HSV颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSVA颜色,hsva(h,s,v,a) + */ + toHSVA(color) { + return this.convert(color, 'hsva'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSV + * @description 转换为HSV颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSV颜色,hsv(h,s,v) + */ + toHSV(color) { + return this.convert(color, 'hsv'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSBA + * @description 转换为HSBA颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSBA颜色,hsba(h,s,b,a) + */ + toHSBA(color) { + return this.convert(color, 'hsba'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSB + * @description 转换为HSB颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSB颜色,hsb(h,s,b) + */ + toHSB(color) { + return this.convert(color, 'hsb'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSLA + * @description 转换为HSLA颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSLA颜色,hsla(h,s,l,a) + */ + toHSLA(color) { + return this.convert(color, 'hsla'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toHSL + * @description 转换为HSL颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSL颜色,hsl(h,s,l) + */ + toHSL(color) { + return this.convert(color, 'hsl'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.toName + * @description 转换颜色名。 + * @param {string} color - 颜色。 + * @returns {string} 颜色名 + */ + toName(color) { + for (var key in this._nameColors) { + if (this.toHex(this._nameColors[key]) === this.toHex(color)) { + return key; + } + } + return null; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.trim + * @description 移除颜色中多余空格。 + * @param {string} color - 颜色。 + * @returns {string} 无空格颜色 + */ + trim(color) { + return String(color).replace(/\s+/g, ''); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.normalize + * @description 颜色规范化。 + * @param {string} color - 颜色。 + * @returns {string} 规范化后的颜色 + */ + normalize(color) { + // 颜色名 + if (this._nameColors[color]) { + color = this._nameColors[color]; + } + // 去掉空格 + color = this.trim(color); + // hsv与hsb等价 + color = color.replace(/hsv/i, 'hsb'); + // rgb转为rrggbb + if (/^#[\da-f]{3}$/i.test(color)) { + color = parseInt(color.slice(1), 16); + var r = (color & 0xf00) << 8; + var g = (color & 0xf0) << 4; + var b = color & 0xf; + + color = '#' + ((1 << 24) + (r << 4) + r + (g << 4) + g + (b << 4) + b).toString(16).slice(1); + } + // 或者使用以下正则替换,不过 chrome 下性能相对差点 + // color = color.replace(/^#([\da-f])([\da-f])([\da-f])$/i, '#$1$1$2$2$3$3'); + return color; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.lift + * @description 颜色加深或减淡,当level>0加深,当level<0减淡。 + * @param {string} color - 颜色。 + * @param {number} level - 升降程度,取值区间[-1,1]。 + * @returns {string} 加深或减淡后颜色值 + */ + lift(color, level) { + if (!this.isCalculableColor(color)) { + return color; + } + var direct = level > 0 ? 1 : -1; + if (typeof level === 'undefined') { + level = 0; + } + level = Math.abs(level) > 1 ? 1 : Math.abs(level); + color = this.toRGB(color); + var data = this.getData(color); + for (var i = 0; i < 3; i++) { + if (direct === 1) { + data[i] = data[i] * (1 - level) | 0; + } else { + data[i] = ((255 - data[i]) * level + data[i]) | 0; + } + } + return 'rgb(' + data.join(',') + ')'; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.reverse + * @description 颜色翻转。[255-r,255-g,255-b,1-a] + * @param {string} color - 颜色。 + * @returns {string} 翻转颜色 + */ + reverse(color) { + if (!this.isCalculableColor(color)) { + return color; + } + var data = this.getData(this.toRGBA(color)); + data = this.map(data, + function (c) { + return 255 - c; + } + ); + return this.toColor(data, 'rgb'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.mix + * @description 简单两种颜色混合 + * @param {string} color1 - 第一种颜色。 + * @param {string} color2 - 第二种颜色。 + * @param {number} weight - 混合权重[0-1]。 + * @returns {string} 结果色。rgb(r,g,b)或rgba(r,g,b,a) + */ + mix(color1, color2, weight) { + if (!this.isCalculableColor(color1) || !this.isCalculableColor(color2)) { + return color1; + } + + if (typeof weight === 'undefined') { + weight = 0.5; + } + weight = 1 - this.adjust(weight, [0, 1]); + + var w = weight * 2 - 1; + var data1 = this.getData(this.toRGBA(color1)); + var data2 = this.getData(this.toRGBA(color2)); + + var d = data1[3] - data2[3]; + + var weight1 = (((w * d === -1) ? w : (w + d) / (1 + w * d)) + 1) / 2; + var weight2 = 1 - weight1; + + var data = []; + + for (var i = 0; i < 3; i++) { + data[i] = data1[i] * weight1 + data2[i] * weight2; + } + + var alpha = data1[3] * weight + data2[3] * (1 - weight); + alpha = Math.max(0, Math.min(1, alpha)); + + if (data1[3] === 1 && data2[3] === 1) {// 不考虑透明度 + return this.toColor(data, 'rgb'); + } + data[3] = alpha; + return this.toColor(data, 'rgba'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.random + * @description 随机颜色 + * @returns {string} 颜色值,#rrggbb格式 + */ + random() { + return '#' + Math.random().toString(16).slice(2, 8); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.getData + * @description 获取颜色值数组,返回值范围。 + * RGB 范围[0-255] + * HSL/HSV/HSB 范围[0-1] + * A透明度范围[0-1] + * 支持格式: + * #rgb + * #rrggbb + * rgb(r,g,b) + * rgb(r%,g%,b%) + * rgba(r,g,b,a) + * hsb(h,s,b) // hsv与hsb等价 + * hsb(h%,s%,b%) + * hsba(h,s,b,a) + * hsl(h,s,l) + * hsl(h%,s%,l%) + * hsla(h,s,l,a) + * @param {string} color - 颜色。 + * @returns {Array.} 颜色值数组或null + */ + getData(color) { + color = this.normalize(color); + var r = color.match(this.colorRegExp); + if (r === null) { + throw new Error('The color format error'); // 颜色格式错误 + } + var d; + var a; + var data = []; + var rgb; + + if (r[2]) { + // #rrggbb + d = r[2].replace('#', '').split(''); + rgb = [d[0] + d[1], d[2] + d[3], d[4] + d[5]]; + data = this.map(rgb, + function (c) { + return Color.prototype.adjust.call(this, parseInt(c, 16), [0, 255]); + } + ); + + } else if (r[4]) { + // rgb rgba + var rgba = (r[4]).split(','); + a = rgba[3]; + rgb = rgba.slice(0, 3); + data = this.map( + rgb, + function (c) { + c = Math.floor( + c.indexOf('%') > 0 ? parseInt(c, 0) * 2.55 : c + ); + return Color.prototype.adjust.call(this, c, [0, 255]); + } + ); + + if (typeof a !== 'undefined') { + data.push(this.adjust(parseFloat(a), [0, 1])); + } + } else if (r[5] || r[6]) { + // hsb hsba hsl hsla + var hsxa = (r[5] || r[6]).split(','); + var h = parseInt(hsxa[0], 0) / 360; + var s = hsxa[1]; + var x = hsxa[2]; + a = hsxa[3]; + data = this.map([s, x], + function (c) { + return Color.prototype.adjust.call(this, parseFloat(c) / 100, [0, 1]); + } + ); + data.unshift(h); + if (typeof a !== 'undefined') { + data.push(this.adjust(parseFloat(a), [0, 1])); + } + } + return data; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.alpha + * @description 设置颜色透明度 + * @param {string} color - 颜色。 + * @param {number} a - 透明度,区间[0,1]。 + * @returns {string} rgba颜色值 + */ + alpha(color, a) { + if (!this.isCalculableColor(color)) { + return color; + } + if (a === null) { + a = 1; + } + var data = this.getData(this.toRGBA(color)); + data[3] = this.adjust(Number(a).toFixed(4), [0, 1]); + + return this.toColor(data, 'rgba'); + } + + /** + * @function LevelRenderer.Tool.Color.prototype.map + * @description 数组映射 + * @param {Array} array - 数组。 + * @param {function} fun - 函数。 + * @returns {string} 数组映射结果 + */ + map(array, fun) { + if (typeof fun !== 'function') { + throw new TypeError(); + } + var len = array ? array.length : 0; + for (var i = 0; i < len; i++) { + array[i] = fun(array[i]); + } + return array; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.adjust + * @description 调整值区间 + * @param {Array.} value - 数组。 + * @param {Array.} region - 区间。 + * @returns {number} 调整后的值 + */ + adjust(value, region) { + // < to <= & > to >= + // modify by linzhifeng 2014-05-25 because -0 == 0 + if (value <= region[0]) { + value = region[0]; + } else if (value >= region[1]) { + value = region[1]; + } + return value; + } + + /** + * @function LevelRenderer.Tool.Color.prototype.isCalculableColor + * @description 判断是否是可计算的颜色 + * @param {string} color - 颜色。 + * @returns {boolean} 是否是可计算的颜色 + */ + isCalculableColor(color) { + return color instanceof Array || typeof color === 'string'; + } + + /** + * @function LevelRenderer.Tool.Color.prototype._HSV_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + _HSV_2_RGB(data) { + var H = data[0]; + var S = data[1]; + var V = data[2]; + // HSV from 0 to 1 + var R; + var G; + var B; + if (S === 0) { + R = V * 255; + G = V * 255; + B = V * 255; + } else { + var h = H * 6; + if (h === 6) { + h = 0; + } + var i = h | 0; + var v1 = V * (1 - S); + var v2 = V * (1 - S * (h - i)); + var v3 = V * (1 - S * (1 - (h - i))); + var r = 0; + var g = 0; + var b = 0; + + if (i === 0) { + r = V; + g = v3; + b = v1; + } else if (i === 1) { + r = v2; + g = V; + b = v1; + } else if (i === 2) { + r = v1; + g = V; + b = v3; + } else if (i === 3) { + r = v1; + g = v2; + b = V; + } else if (i === 4) { + r = v3; + g = v1; + b = V; + } else { + r = V; + g = v1; + b = v2; + } + + // RGB results from 0 to 255 + R = r * 255; + G = g * 255; + B = b * 255; + } + return [R, G, B]; + } + + /** + * @function LevelRenderer.Tool.Color.prototype._HSL_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + _HSL_2_RGB(data) { + var H = data[0]; + var S = data[1]; + var L = data[2]; + // HSL from 0 to 1 + var R; + var G; + var B; + if (S === 0) { + R = L * 255; + G = L * 255; + B = L * 255; + } else { + var v2; + if (L < 0.5) { + v2 = L * (1 + S); + } else { + v2 = (L + S) - (S * L); + } + + var v1 = 2 * L - v2; + + R = 255 * this._HUE_2_RGB(v1, v2, H + (1 / 3)); + G = 255 * this._HUE_2_RGB(v1, v2, H); + B = 255 * this._HUE_2_RGB(v1, v2, H - (1 / 3)); + } + return [R, G, B]; + } + + /** + * @function LevelRenderer.Tool.Color.prototype._HUE_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + _HUE_2_RGB(v1, v2, vH) { + if (vH < 0) { + vH += 1; + } + if (vH > 1) { + vH -= 1; + } + if ((6 * vH) < 1) { + return (v1 + (v2 - v1) * 6 * vH); + } + if ((2 * vH) < 1) { + return (v2); + } + if ((3 * vH) < 2) { + return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6); + } + return v1; + } + + /** + * @function LevelRenderer.Tool.Color.prototype._RGB_2_HSB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + _RGB_2_HSB(data) { + // RGB from 0 to 255 + var R = (data[0] / 255); + var G = (data[1] / 255); + var B = (data[2] / 255); + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + var V = vMax; + var H; + var S; + + // HSV results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } else { + S = delta / vMax; + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + if (H > 1) { + H -= 1; + } + } + H = H * 360; + S = S * 100; + V = V * 100; + return [H, S, V]; + } + + /** + * @function LevelRenderer.Tool.Color.prototype._RGB_2_HSL。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + _RGB_2_HSL(data) { + + // RGB from 0 to 255 + var R = (data[0] / 255); + var G = (data[1] / 255); + var B = (data[2] / 255); + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; + // HSL results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + H = H * 360; + S = S * 100; + L = L * 100; + + return [H, S, L]; + } + +} + +;// CONCATENATED MODULE: ./src/common/util/ColorsPickerUtil.js + + +var ColorRender = new Color(); +// let "http://www.qzu.zj.cn": "#bd10e0" +// "www.qzct.net": "#7ed321" = new LevelRenderer.Tool.Color(); + +/** + * @class ColorsPickerUtil + * @category BaseTypes Util + * @classdesc 色带选择器工具类 用于1、创建canvas对象,2、从几种颜色中获取一定数量的渐变色 + * @usage + */ +class ColorsPickerUtil { + /** + * @function ColorsPickerUtil.createCanvas + * @description 创建DOM canvas + * @param {number} height - canvas 高度。 + * @param {number} width - canvas 宽度。 + */ + + static createCanvas (height, width){ + var canvas = document.createElement("canvas"); + canvas.height = height; + canvas.width = width; + + return canvas.getContext("2d"); + } + + /** + * @function ColorsPickerUtil.getLinearGradient + * @description 线性渐变。 + * @param {number} x0 - 渐变起点 x 坐标。 + * @param {number} y0 - 渐变起点 y 坐标。 + * @param {number} x1 - 渐变终点 x 坐标。 + * @param {number} y1 - 渐变终点 y 坐标。 + * @param {Array} colorList 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + + static getLinearGradient (x0, y0, x1, y1, colorList){ + if (!this._ctx) { + this._ctx = this.getContext(); + } + var gradient = this._ctx.createLinearGradient(x0, y0, x1, y1); + var leng = colorList.length; + var add = 1/(leng -1); + var offset = 0; + for (var i = 0; i < leng; i++) { + gradient.addColorStop(offset, colorList[i]); + offset += add; + } + gradient.__nonRecursion = true; + return gradient; + } + + /** + * @function ColorsPickerUtil.getContext + * @description 获取 Cavans 上下文。 + * @returns {Object} Cavans 上下文。 + */ + + static getContext () { + if (!this._ctx) { + this._ctx = document.createElement('canvas').getContext('2d'); + } + return this._ctx; + } + + /** + * @function ColorsPickerUtil.getStepColors + * @description 获取两种颜色之间渐变颜色数组。 + * @param {string} start - 起始颜色。 + * @param {string} end - 结束颜色。 + * @param {number} step - 渐变级数。 + * @returns {Array} 颜色数组。 + */ + + static getStepColors (start, end, step){ + start = ColorRender.toRGBA(start); + end = ColorRender.toRGBA(end); + start = ColorRender.getData(start); + end = ColorRender.getData(end); + + var colors = []; + var stepR = (end[0] - start[0]) / step; + var stepG = (end[1] - start[1]) / step; + var stepB = (end[2] - start[2]) / step; + var stepA = (end[3] - start[3]) / step; + // 生成颜色集合 + // fix by linfeng 颜色堆积 + for (var i = 0, r = start[0], g = start[1], b = start[2], a = start[3]; i < step; i++) { + colors[i] = ColorRender.toColor([ + ColorRender.adjust(Math.floor(r), [ 0, 255 ]), + ColorRender.adjust(Math.floor(g), [ 0, 255 ]), + ColorRender.adjust(Math.floor(b), [ 0, 255 ]), + a.toFixed(4) - 0 + ],'hex'); + r += stepR; + g += stepG; + b += stepB; + a += stepA; + } + r = end[0]; + g = end[1]; + b = end[2]; + a = end[3]; + colors[i] = ColorRender.toColor([r, g, b, a], 'hex'); + return colors; + } + + /** + * @function ColorsPickerUtil.getGradientColors + * @description 获取指定级数的渐变颜色数组。 + * @param {Array.} colors - 颜色组。 + * @param {number} total - 颜色总数。 + * @param {string} themeType - 专题类型。 + * @returns {Array.} 颜色数组。 + */ + + static getGradientColors (colors, total, themeType){ + var ret = [], step; + var i, n, len = colors.length; + if (total === undefined) { + return; + } + if(len >= total){ + if(themeType === 'RANGE'){ + for(i = 0; i + * + * // ES6 Import + * import { ArrayStatistic } from '{npm}'; + * + * new ArrayStatistic(); + * ``` + */ +class ArrayStatistic { + + // geostatsInstance: null, + + /** + * @function ArrayStatistic.newInstance + * @description 初始化插件实例。 + */ + static newInstance() { + // if(!this.geostatsInstance) { + // // this.geostatsInstance = new geostats(); + // // } + // window.dataList = []; + if(!this.geostatsInstance) { + + this.geostatsInstance = new window.geostats(); + + } + return this.geostatsInstance; + } + + /** + * @function ArrayStatistic.getInstance + * @description 设置需要被处理的数组。 + * @param {Array} array - 数组。 + */ + static getInstance(array) { + let instance = this.newInstance(); + instance.setSerie(array); + return instance; + } + + /** + * @function ArrayStatistic.getArrayStatistic + * @description 获取数组统计的值。 + * @param {Array.} array - 需要统计的数组。 + * @param {string} type - 统计方法。 + */ + static getArrayStatistic(array, type){ + if(!array.length) { + return 0; + } + if(type === "Sum" || type === "求和"){ + return this.getSum(array); + } else if(type === "Maximum" || type === "最大值"){ + return this.getMax(array); + } else if(type === "Minimum" || type === "最小值"){ + return this.getMin(array); + } else if(type === "Average" || type === "平均值"){ + return this.getMean(array); + } else if(type === "Median" || type === "中位数"){ + return this.getMedian(array); + } else if(type === "times" || type === "计数"){ + return this.getTimes(array); + } + } + + /** + * @function ArrayStatistic.getArraySegments + * @description 获取数组分段后的数值。 + * @param {Array.} array - 需要分段的数组。 + * @param {string} type - 分段方法。 + * @param {number} segNum - 分段个数。 + */ + static getArraySegments(array, type, segNum) { + if(type === "offset") { + return this.getEqInterval(array, segNum); + } else if(type === "jenks") { + return this.getJenks(array, segNum); + } else if(type === "square") { + // 数据都必须 >= 0 + let minValue = this.getMin(array); + if(minValue >= 0){ + return this.getSqrtInterval(array, segNum); + }else { + //console.log('数据都必须 >= 0'); + // Util.showMessage(Language.hasNegValue + Language.noSupportRange, 'ERROR'); + return false; + } + + } else if(type === "logarithm") { + // 数据都必须 > 0 + let minValue = this.getMin(array); + if(minValue > 0){ + return this.getGeometricProgression(array, segNum); + }else { + //console.log('数据都必须 > 0'); + // Util.showMessage(Language.hasZeroNegValue + Language.noSupportRange, 'ERROR'); + return false; + } + } + } + + /** + * @function ArrayStatistic.getSum + * @description 求和。 + * @param {Array.} array 需要求和的参数。 + * @returns {number} 返回求和结果。 + */ + static getSum(array){ + return this.getInstance(array).sum(); + } + + /** + * @function ArrayStatistic.getMax + * @description 最大值。 + * @param {Array.} array 需要求最大值的参数。 + * @returns {number} 返回最大值。 + */ + static getMax(array){ + return this.getInstance(array).max(); + } + + /** + * @function ArrayStatistic.getMin + * @description 最小值。 + * @param {Array.} array 需要求最小值的参数。 + * @returns {number} 返回最小值。 + */ + static getMin(array){ + return this.getInstance(array).min(); + } + + /** + * @function ArrayStatistic.getMean + * @description 求平均数。 + * @param {Array.} array 需要求平均数的参数。 + * @returns {number} 返回平均数。 + */ + static getMean(array){ + return this.getInstance(array).mean(); + } + + /** + * @function ArrayStatistic.getMedian + * @description 求中位数。 + * @param {Array.} array 需要求中位数的参数。 + * @returns {number} 返回中位数。 + */ + static getMedian(array) { + return this.getInstance(array).median(); + } + + /** + * @function ArrayStatistic.getTimes + * @description 计数。 + * @param {Array.} array 需要计数的参数。 + * @returns {number} 返回计数结果。 + */ + static getTimes(array) { + return array.length; + } + + /** + * @function ArrayStatistic.getEqInterval + * @description 等距分段法。 + * @param {Array} array 需要进行等距分段的数组。 + * @param {number} segNum 分段个数。 + */ + static getEqInterval(array, segNum) { + return this.getInstance(array).getClassEqInterval(segNum); + } + + /** + * @function ArrayStatistic.getJenks + * @description 自然断裂法。 + * @param {Array} array 需要进行自然断裂的参数。 + * @param {number} segNum 分段个数。 + */ + static getJenks(array, segNum) { + return this.getInstance(array).getClassJenks(segNum); + } + + /** + * @function ArrayStatistic.getSqrtInterval + * @description 平方根分段法。 + * @param {Array} array 需要进行平方根分段的参数。 + * @param {number} segNum 分段个数。 + */ + static getSqrtInterval(array, segNum) { + array = array.map(function(value) { + return Math.sqrt(value); + }); + let breaks = this.getInstance(array).getClassEqInterval(segNum); + return ( + breaks.map(function(value) { + return value * value; + }) + ) + } + + /** + * @function ArrayStatistic.getGeometricProgression + * @description 对数分段法。 + * @param {Array} array 需要进行对数分段的参数。 + * @param {number} segNum 分段个数。 + */ + static getGeometricProgression(array, segNum) { + return this.getInstance(array).getClassGeometricProgression(segNum); + } + +} +;// CONCATENATED MODULE: ./src/common/util/MapCalculateUtil.js + + +/** + * @function getMeterPerMapUnit + * @description 单位换算,把米|度|千米|英寸|英尺换成米。 + * @category BaseTypes Util + * @param {string} mapUnit 地图单位。 + * @returns {number} 返回地图的距离单位。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { getMeterPerMapUnit } from '{npm}'; + * + * const result = getMeterPerMapUnit(mapUnit); + * ``` + */ +var getMeterPerMapUnit = function(mapUnit) { + var earchRadiusInMeters = 6378137; + var meterPerMapUnit; + if (mapUnit === Unit.METER) { + meterPerMapUnit = 1; + } else if (mapUnit === Unit.DEGREE) { + // 每度表示多少米。 + meterPerMapUnit = (Math.PI * 2 * earchRadiusInMeters) / 360; + } else if (mapUnit === Unit.KILOMETER) { + meterPerMapUnit = 1.0e-3; + } else if (mapUnit === Unit.INCH) { + meterPerMapUnit = 1 / 2.5399999918e-2; + } else if (mapUnit === Unit.FOOT) { + meterPerMapUnit = 0.3048; + } else { + return meterPerMapUnit; + } + return meterPerMapUnit; +}; + +/** + * @function getWrapNum + * @description 获取该坐标系的经纬度范围的经度或纬度。 + * @category BaseTypes Util + * @param {number} x 经度或纬度。 + * @param {boolean} includeMax 是否获取经度或纬度的最大值。 + * @param {boolean} includeMin 是否获取经度或纬度的最小值。 + * @param {number} range 坐标系的经纬度范围。 + * @returns {number} 返回经度或纬度的值。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { getWrapNum } from '{npm}'; + * + * const result = getWrapNum(x, includeMax, includeMin, range); + * ``` + */ +function getWrapNum(x, includeMax = true, includeMin = true, range = [-180, 180]) { + var max = range[1], + min = range[0], + d = max - min; + if (x === max && includeMax) { + return x; + } + if (x === min && includeMin) { + return x; + } + var tmp = (((x - min) % d) + d) % d; + if (tmp === 0 && includeMax) { + return max; + } + return ((((x - min) % d) + d) % d) + min; +} + +/** + * @function conversionDegree + * @description 转换经纬度。 + * @category BaseTypes Util + * @param {number} degrees 经度或纬度。 + * @returns {string} 返回度分秒。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { conversionDegree } from '{npm}'; + * + * const result = conversionDegree(degrees); + * ``` + */ +function conversionDegree(degrees) { + const degree = parseInt(degrees); + let fraction = parseInt((degrees - degree) * 60); + let second = parseInt(((degrees - degree) * 60 - fraction) * 60); + fraction = parseInt(fraction / 10) === 0 ? `0${fraction}` : fraction; + second = parseInt(second / 10) === 0 ? `0${second}` : second; + return `${degree}°${fraction}'${second}`; +} + +;// CONCATENATED MODULE: ./src/common/util/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +// EXTERNAL MODULE: ./node_modules/lodash.topairs/index.js +var lodash_topairs = __webpack_require__(52); +var lodash_topairs_default = /*#__PURE__*/__webpack_require__.n(lodash_topairs); +;// CONCATENATED MODULE: ./src/common/style/CartoCSS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class CartoCSS + * @deprecatedclass SuperMap.CartoCSS + * @classdesc CartoCSS 解析类,其主要功能为将 CartoCSS 字符串解析为 CartoCSS 的 shader 属性风格对象。 + * @category BaseTypes Style + * @param {string} cartoStr - 样式表字符串 + * @example + * var cartocss = "@provinceLineColor:#ddd; + * #China_Provinces_L___China400{ + * line-dasharray:10,10; + * line-color:@provinceLineColor; + * line-width:1; + * }"; + * new CartoCSS(cartocss); + * @usage + */ +/*eslint no-useless-escape: "off"*/ +class CartoCSS { + + constructor(cartoStr) { + this.env = null; + + /** + * @member CartoCSS.prototype.parser + * @description 解析器 + */ + this.parser = null; + + /** + * @member CartoCSS.prototype.ruleSet + * @description CartoCSS 规则对象 + */ + this.ruleSet = null; + + /** + * @member CartoCSS.prototype.cartoStr + * @description CartoCSS 样式表字符串 + */ + this.cartoStr = ""; + + /** + * @member CartoCSS.prototype.shaders + * @description Carto 着色器集 + */ + this.shaders = null; + + if (typeof cartoStr === "string") { + this.cartoStr = cartoStr; + this.env = { + frames: [], + errors: [], + error: function (obj) { + this.errors.push(obj); + } + }; + this.parser = this.getParser(this.env); + this.parse(cartoStr); + this.shaders = this.toShaders(); + } + } + + /** + * @function CartoCSS.prototype.getParser + * @description 获取 CartoCSS 解析器 + */ + getParser(env) { + var input, // LeSS input string + i, // current index in `input` + j, // current chunk + temp, // temporarily holds a chunk's state, for backtracking + memo, // temporarily holds `i`, when backtracking + furthest, // furthest index the parser has gone to + chunks, // chunkified input + current, // index of current chunk, in `input` + parser; + + var that = this; + + // This function is called after all files + // have been imported through `@import`. + var finish = function () {//NOSONAR + //所有文件导入完成之后调用 + }; + + function save() { + temp = chunks[j]; + memo = i; + current = i; + } + + function restore() { + chunks[j] = temp; + i = memo; + current = i; + } + + function sync() { + if (i > current) { + chunks[j] = chunks[j].slice(i - current); + current = i; + } + } + + // + // Parse from a token, regexp or string, and move forward if match + // + function _match(tok) { + var match, length, c, endIndex; + + // Non-terminal + if (tok instanceof Function) { + return tok.call(parser.parsers); + // Terminal + // Either match a single character in the input, + // or match a regexp in the current chunk (chunk[j]). + } else if (typeof(tok) === 'string') { + match = input.charAt(i) === tok ? tok : null; + length = 1; + sync(); + } else { + sync(); + + match = tok.exec(chunks[j]); + if (match) { + length = match[0].length; + } else { + return null; + } + } + + // The match is confirmed, add the match length to `i`, + // and consume any extra white-space characters (' ' || '\n') + // which come after that. The reason for this is that LeSS's + // grammar is mostly white-space insensitive. + if (match) { + var mem = i += length; + endIndex = i + chunks[j].length - length; + + while (i < endIndex) { + c = input.charCodeAt(i); + if (!(c === 32 || c === 10 || c === 9)) { + break; + } + i++; + } + chunks[j] = chunks[j].slice(length + (i - mem)); + current = i; + + if (chunks[j].length === 0 && j < chunks.length - 1) { + j++; + } + + if (typeof(match) === 'string') { + return match; + } else { + return match.length === 1 ? match[0] : match; + } + } + } + + // Same as _match(), but don't change the state of the parser, + // just return the match. + function peek(tok) { + if (typeof(tok) === 'string') { + return input.charAt(i) === tok; + } else { + return !!tok.test(chunks[j]); + } + } + + // Make an error object from a passed set of properties. + // Accepted properties: + // - `message`: Text of the error message. + // - `filename`: Filename where the error occurred. + // - `index`: Char. index where the error occurred. + function makeError(err) { + var einput; + + var defautls = { + index: furthest, + filename: env.filename, + message: 'Parse error.', + line: 0, + column: -1 + }; + for (var prop in defautls) { + if (err[prop] === 0) { + err[prop] = defautls[prop]; + } + } + + if (err.filename && that.env.inputs && that.env.inputs[err.filename]) { + einput = that.env.inputs[err.filename]; + } else { + einput = input; + } + + err.line = (einput.slice(0, err.index).match(/\n/g) || '').length + 1; + for (var n = err.index; n >= 0 && einput.charAt(n) !== '\n'; n--) { + err.column++; + } + return new Error([err.filename, err.line, err.column, err.message].join(";")); + } + + this.env = env = env || {}; + this.env.filename = this.env.filename || null; + this.env.inputs = this.env.inputs || {}; + + // The Parser + parser = { + + // Parse an input string into an abstract syntax tree. + // Throws an error on parse errors. + parse: function (str) { + var root, error = null; + + i = j = current = furthest = 0; + chunks = []; + input = str.replace(/\r\n/g, '\n'); + if (env.filename) { + that.env.inputs[env.filename] = input; + } + + // Split the input into chunks. + chunks = (function (chunks) { + var j = 0, + skip = /(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g, + comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, + string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g, + level = 0, + match, + chunk = chunks[0], + inParam; + + for (var i = 0, c, cc; i < input.length;) { + skip.lastIndex = i; + if (match = skip.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + } + } + c = input.charAt(i); + comment.lastIndex = string.lastIndex = i; + + if (match = string.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + continue; + } + } + + if (!inParam && c === '/') { + cc = input.charAt(i + 1); + if (cc === '/' || cc === '*') { + if (match = comment.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + continue; + } + } + } + } + + switch (c) { + case '{'://NOSONAR + if (!inParam) { + level++; + chunk.push(c); + break; + } + case '}'://NOSONAR + if (!inParam) { + level--; + chunk.push(c); + chunks[++j] = chunk = []; + break; + } + case '('://NOSONAR + if (!inParam) { + inParam = true; + chunk.push(c); + break; + } + case ')'://NOSONAR + if (inParam) { + inParam = false; + chunk.push(c); + break; + } + default: + chunk.push(c); + break; + } + + i++; + } + if (level !== 0) { + error = { + index: i - 1, + type: 'Parse', + message: (level > 0) ? "missing closing `}`" : "missing opening `{`" + }; + } + + return chunks.map(function (c) { + return c.join(''); + }); + })([[]]); + + if (error) { + throw makeError(error); + } + + // Sort rules by specificity: this function expects selectors to be + // split already. + // + // Written to be used as a .sort(Function); + // argument. + // + // [1, 0, 0, 467] > [0, 0, 1, 520] + var specificitySort = function (a, b) { + var as = a.specificity; + var bs = b.specificity; + + if (as[0] != bs[0]) {return bs[0] - as[0];} + if (as[1] != bs[1]) {return bs[1] - as[1];} + if (as[2] != bs[2]) {return bs[2] - as[2];} + return bs[3] - as[3]; + }; + + // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. + root = new CartoCSS.Tree.Ruleset([], _match(this.parsers.primary)); + root.root = true; + + // Get an array of Ruleset objects, flattened + // and sorted according to specificitySort + root.toList = (function () { + return function (env) { + env.error = function (e) { + if (!env.errors) {env.errors = new Error('');} + if (env.errors.message) { + env.errors.message += '\n' + makeError(e).message; + } else { + env.errors.message = makeError(e).message; + } + }; + env.frames = env.frames || []; + + + // call populates Invalid-caused errors + var definitions = this.flatten([], [], env); + definitions.sort(specificitySort); + return definitions; + }; + })(); + + return root; + }, + + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Rule -> Value -> Expression -> Entity + // + // In general, most rules will try to parse a token with the `_match()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + parsers: { + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | rule)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + primary: function () { + var node, root = []; + + while ((node = _match(this.rule) || _match(this.ruleset) || + _match(this.comment)) || + _match(/^[\s\n]+/) || (node = _match(this.invalid))) { + if (node) {root.push(node);} + } + return root; + }, + + invalid: function () { + var chunk = _match(/^[^;\n]*[;\n]/); + + // To fail gracefully, match everything until a semicolon or linebreak. + if (chunk) { + return new CartoCSS.Tree.Invalid(chunk, memo); + } + }, + + // We create a Comment node for CSS comments `/* */`, + // but keep the LeSS comments `//` silent, by just skipping + // over them. + comment: function () { + var comment; + + if (input.charAt(i) !== '/') {return;} + + if (input.charAt(i + 1) === '/') { + return new CartoCSS.Tree.Comment(_match(/^\/\/.*/), true); + } else if (comment = _match(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { + return new CartoCSS.Tree.Comment(comment); + } + }, + + // Entities are tokens which can be found inside an Expression + entities: { + + // A string, which supports escaping " and ' "milky way" 'he\'s the one!' + quoted: function () { + if (input.charAt(i) !== '"' && input.charAt(i) !== "'") {return;} + var str = _match(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/); + if (str) { + return new CartoCSS.Tree.Quoted(str[1] || str[2]); + } + }, + + // A reference to a Mapnik field, like [NAME] + // Behind the scenes, this has the same representation, but Carto + // needs to be careful to warn when unsupported operations are used. + field: function () { + var l = '[', r = ']'; + if (!_match(l)) {return;} + var field_name = _match(/(^[^\]]+)/); + if (!_match(r)) {return;} + if (field_name) {return new CartoCSS.Tree.Field(field_name[1]);} + }, + + // This is a comparison operator + comparison: function () { + var str = _match(/^=~|=|!=|<=|>=|<|>/); + if (str) { + return str; + } + }, + + // A catch-all word, such as: hard-light + // These can start with either a letter or a dash (-), + // and then contain numbers, underscores, and letters. + keyword: function () { + var k = _match(/^[A-Za-z\u4e00-\u9fa5-]+[A-Za-z-0-9\u4e00-\u9fa5_]*/); + if (k) { + return new CartoCSS.Tree.Keyword(k); + } + }, + + // A function call like rgb(255, 0, 255) + // The arguments are parsed with the `entities.arguments` parser. + call: function () { + var name, args; + + if (!(name = /^([\w\-]+|%)\(/.exec(chunks[j]))) {return;} + + name = name[1]; + + if (name === 'url') { + // url() is handled by the url parser instead + return null; + } else { + i += name.length; + } + + var l = '(', r = ')'; + _match(l); // Parse the '(' and consume whitespace. + + args = _match(this.entities['arguments']); + + if (!_match(r)) {return;} + + if (name) { + return new CartoCSS.Tree.Call(name, args, i); + } + }, + // Arguments are comma-separated expressions + 'arguments': function () { + var args = [], arg; + + while (arg = _match(this.expression)) { + args.push(arg); + var q = ','; + if (!_match(q)) { + break; + } + } + + return args; + }, + literal: function () { + return _match(this.entities.dimension) || + _match(this.entities.keywordcolor) || + _match(this.entities.hexcolor) || + _match(this.entities.quoted); + }, + + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + url: function () { + var value; + + if (input.charAt(i) !== 'u' || !_match(/^url\(/)) {return;} + value = _match(this.entities.quoted) || _match(this.entities.variable) || + _match(/^[\-\w%@_match\/.&=:;#+?~]+/) || ''; + var r = ')'; + if (!_match(r)) { + return new CartoCSS.Tree.Invalid(value, memo, 'Missing closing ) in URL.'); + } else { + return new CartoCSS.Tree.URL((typeof value.value !== 'undefined' || + value instanceof CartoCSS.Tree.Variable) ? + value : new CartoCSS.Tree.Quoted(value)); + } + }, + + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + variable: function () { + var name, index = i; + + if (input.charAt(i) === '@' && (name = _match(/^@[\w-]+/))) { + return new CartoCSS.Tree.Variable(name, index, env.filename); + } + }, + + hexcolor: function () { + var rgb; + if (input.charAt(i) === '#' && (rgb = _match(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { + return new CartoCSS.Tree.Color(rgb[1]); + } + }, + + keywordcolor: function () { + var rgb = chunks[j].match(/^[a-z]+/); + if (rgb && rgb[0] in CartoCSS.Tree.Reference.data.colors) { + return new CartoCSS.Tree.Color(CartoCSS.Tree.Reference.data.colors[_match(/^[a-z]+/)]); + } + }, + + // A Dimension, that is, a number and a unit. The only + // unit that has an effect is % + dimension: function () { + var c = input.charCodeAt(i); + if ((c > 57 || c < 45) || c === 47) {return;} + var value = _match(/^(-?\d*\.?\d+(?:[eE][-+]?\d+)?)(\%|\w+)?/); + if (value) { + return new CartoCSS.Tree.Dimension(value[1], value[2], memo); + } + } + }, + + // The variable part of a variable definition. + // Used in the `rule` parser. Like @fink: + variable: function () { + var name; + + if (input.charAt(i) === '@' && (name = _match(/^(@[\w-]+)\s*:/))) { + return name[1]; + } + }, + + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + entity: function () { + var property1 = _match(this.entities.call) || _match(this.entities.literal); + var property2 = _match(this.entities.field) || _match(this.entities.variable); + var property3 = _match(this.entities.url) || _match(this.entities.keyword); + return property1 || property2 || property3; + }, + + // A Rule terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was ommitted. + end: function () { + var q = ';'; + return _match(q) || peek('}'); + }, + + // Elements are the building blocks for Selectors. They consist of + // an element name, such as a tag a class, or `*`. + //增加对中文的支持,[\u4e00-\u9fa5] + element: function () { + var e = _match(/^(?:[.#][\w\u4e00-\u9fa5\-]+|\*|Map)/); + if (e) {return new CartoCSS.Tree.Element(e);} + }, + + // Attachments allow adding multiple lines, polygons etc. to an + // object. There can only be one attachment per selector. + attachment: function () { + var s = _match(/^::([\w\-]+(?:\/[\w\-]+)*)/); + if (s) {return s[1];} + }, + + // Selectors are made out of one or more Elements, see above. + selector: function () { + var a, attachment, + e, elements = [], + f, filters = new CartoCSS.Tree.Filterset(), + z, zooms = [], + segments = 0, conditions = 0; + + while ( + (e = _match(this.element)) || + (z = _match(this.zoom)) || + (f = _match(this.filter)) || + (a = _match(this.attachment)) + ) { + segments++; + if (e) { + elements.push(e); + } else if (z) { + zooms.push(z); + conditions++; + } else if (f) { + var err = filters.add(f); + if (err) { + throw makeError({ + message: err, + index: i - 1 + }); + } + conditions++; + } else if (attachment) { + throw makeError({ + message: 'Encountered second attachment name.', + index: i - 1 + }); + } else { + attachment = a; + } + + var c = input.charAt(i); + if (c === '{' || c === '}' || c === ';' || c === ',') { + break; + } + } + + if (segments) { + return new CartoCSS.Tree.Selector(filters, zooms, elements, attachment, conditions, memo); + } + }, + + filter: function () { + save(); + var key, op, val, l = '[', r = ']'; + if (!_match(l)) {return;} + if (key = _match(/^[a-zA-Z0-9\-_]+/) || + _match(this.entities.quoted) || + _match(this.entities.variable) || + _match(this.entities.keyword) || + _match(this.entities.field)) { + if (key instanceof CartoCSS.Tree.Quoted) { + key = new CartoCSS.Tree.Field(key.toString()); + } + if ((op = _match(this.entities.comparison)) && + (val = _match(this.entities.quoted) || + _match(this.entities.variable) || + _match(this.entities.dimension) || + _match(this.entities.keyword) || + _match(this.entities.field))) { + if (!_match(r)) { + throw makeError({ + message: 'Missing closing ] of filter.', + index: memo - 1 + }); + } + if (!key.is) {key = new CartoCSS.Tree.Field(key);} + return new CartoCSS.Tree.Filter(key, op, val, memo, env.filename); + } + } + }, + + zoom: function () { + save(); + var op, val, r = ']'; + if (_match(/^\[\s*zoom/g) && + (op = _match(this.entities.comparison)) && + (val = _match(this.entities.variable) || _match(this.entities.dimension)) && _match(r)) { + return new CartoCSS.Tree.Zoom(op, val, memo); + } else { + // backtrack + restore(); + } + }, + + // The `block` rule is used by `ruleset` + // It's a wrapper around the `primary` rule, with added `{}`. + block: function () { + var content, l = '{', r = '}'; + + if (_match(l) && (content = _match(this.primary)) && _match(r)) { + return content; + } + }, + + // div, .class, body > p {...} + ruleset: function () { + var selectors = [], s, rules, q = ','; + save(); + + while (s = _match(this.selector)) { + selectors.push(s); + while (_match(this.comment)) {//NOSONAR + } + if (!_match(q)) { + break; + } + while (_match(this.comment)) {//NOSONAR + } + } + if (s) { + while (_match(this.comment)) {//NOSONAR + } + } + + if (selectors.length > 0 && (rules = _match(this.block))) { + if (selectors.length === 1 && + selectors[0].elements.length && + selectors[0].elements[0].value === 'Map') { + var rs = new CartoCSS.Tree.Ruleset(selectors, rules); + rs.isMap = true; + return rs; + } + return new CartoCSS.Tree.Ruleset(selectors, rules); + } else { + // Backtrack + restore(); + } + }, + + rule: function () { + var name, value, c = input.charAt(i); + save(); + + if (c === '.' || c === '#') { + return; + } + + if (name = _match(this.variable) || _match(this.property)) { + value = _match(this.value); + + if (value && _match(this.end)) { + return new CartoCSS.Tree.Rule(name, value, memo, env.filename); + } else { + furthest = i; + restore(); + } + } + }, + + font: function () { + var value = [], expression = [], e, q = ','; + + while (e = _match(this.entity)) { + expression.push(e); + } + + value.push(new CartoCSS.Tree.Expression(expression)); + + if (_match(q)) { + while (e = _match(this.expression)) { + value.push(e); + if (!_match(q)) { + break; + } + } + } + return new CartoCSS.Tree.Value(value); + }, + + // A Value is a comma-delimited list of Expressions + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + value: function () { + var e, expressions = [], q = ','; + + while (e = _match(this.expression)) { + expressions.push(e); + if (!_match(q)) { + break; + } + } + + if (expressions.length > 1) { + return new CartoCSS.Tree.Value(expressions.map(function (e) { + return e.value[0]; + })); + } else if (expressions.length === 1) { + return new CartoCSS.Tree.Value(expressions); + } + }, + // A sub-expression, contained by parenthensis + sub: function () { + var e, l = '(', r = ")"; + if (_match(l) && (e = _match(this.expression)) && _match(r)) { + return e; + } + }, + // This is a misnomer because it actually handles multiplication + // and division. + multiplication: function () { + var m, a, op, operation, q = '/'; + if (m = _match(this.operand)) { + while ((op = (_match(q) || _match('*') || _match('%'))) && (a = _match(this.operand))) { + operation = new CartoCSS.Tree.Operation(op, [operation || m, a], memo); + } + return operation || m; + } + }, + addition: function () { + var m, a, op, operation, plus = '+'; + if (m = _match(this.multiplication)) { + while ((op = _match(/^[-+]\s+/) || (input.charAt(i - 1) != ' ' && (_match(plus) || _match('-')))) && + (a = _match(this.multiplication))) { + operation = new CartoCSS.Tree.Operation(op, [operation || m, a], memo); + } + return operation || m; + } + }, + + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + operand: function () { + return _match(this.sub) || _match(this.entity); + }, + + // Expressions either represent mathematical operations, + // or white-space delimited Entities. @var * 2 + expression: function () { + var e, entities = []; + + while (e = _match(this.addition) || _match(this.entity)) { + entities.push(e); + } + + if (entities.length > 0) { + return new CartoCSS.Tree.Expression(entities); + } + }, + property: function () { + var name = _match(/^(([a-z][-a-z_0-9]*\/)?\*?-?[-a-z_0-9]+)\s*:/); + if (name) {return name[1];} + } + } + }; + return parser; + } + + + /** + * @function CartoCSS.prototype.parse + * @description 利用CartoCSS解析器里面的parse方法,将CartoCSS样式表字符串转化为CartoCSS规则集 + * @returns {Object} CartoCSS规则集 + */ + parse(str) { + var parser = this.parser; + var ruleSet = this.ruleSet = parser.parse(str); + return ruleSet; + } + + + /** + * @function CartoCSS.prototype.toShaders + * @description 将CartoCSS规则集转化为着色器 + * @returns {Array} CartoCSS着色器集 + */ + toShaders() { + if (this.ruleSet) { + var ruleset = this.ruleSet; + if (ruleset) { + var defs = ruleset.toList(this.env); + defs.reverse(); + + var shaders = {}; + var keys = []; + this._toShaders(shaders,keys,defs); + + var ordered_shaders = []; + + var done = {}; + for (var i = 0, len0 = defs.length; i < len0; ++i) { + var def = defs[i]; + var k = def.attachment; + var shader = shaders[keys[i]]; + var shaderArray = []; + if (!done[k]) { + var j = 0; + for (var prop in shader) { + if (prop !== 'zoom' && prop !== 'frames' && prop !== "attachment" && prop != "elements") { + //对layer-index作特殊处理以实现图层的控制 + if (prop === "layer-index") { + /*var getLayerIndex = Function("attributes", "zoom", "var _value = null;" + shader[prop].join('\n') + "; return _value; ");*/ + var getLayerIndex = function (attributes, zoom) {//NOSONAR + var _value = null; + shader[prop].join('\n'); + return _value; + }; + var layerIndex = getLayerIndex(); + Object.defineProperty(shaderArray, "layerIndex", { + configurable: true, + enumerable: false, + value: layerIndex + }); + } else { + shaderArray[j++] = function (ops, shaderArray) {//NOSONAR + if (!Array.isArray(ops)) { + return ops; + } + var body = ops.join('\n'); + var myKeyword = 'attributes["FEATUREID"]&&attributes["FEATUREID"]'; + var index = body.indexOf(myKeyword); + if (index >= 0) { + //对featureID作一些特殊处理,以将featureID提取出来 + if (!shaderArray.featureFilter) { + var featureFilterStart = index + myKeyword.length; + var featureFilterEnd = body.indexOf(")", featureFilterStart + 1); + var featureFilterStr = "featureId&&(featureId" + body.substring(featureFilterStart, featureFilterEnd) + ")"; + /*var featureFilter = Function("featureId", "if(" + featureFilterStr + "){return true;}return false;");*/ + var featureFilter = function (featureId) { + if (featureFilterStr) { + return true; + } + return false; + } + Object.defineProperty(shaderArray, "featureFilter", { + configurable: true, + enumerable: false, + value: featureFilter + }); + } + return { + "property": prop, + "getValue": Function("attributes", "zoom", "seftFilter", "var _value = null; var isExcute=typeof seftFilter=='function'?sefgFilter():seftFilter;if(isExcute){" + body + ";} return _value; ")//NOSONAR + }; + } else { + return { + "property": prop, + "getValue": Function("attributes", "zoom", "var _value = null;" + body + "; return _value; ")//NOSONAR + }; + } + }(shader[prop], shaderArray); + } + } + } + Object.defineProperty(shaderArray, "attachment", { + configurable: true, + enumerable: false, + value: k + }); + Object.defineProperty(shaderArray, "elements", { + configurable: true, + enumerable: false, + value: def.elements + }); + ordered_shaders.push(shaderArray); + done[keys[i]] = true; + } + Object.defineProperty(shaderArray, "zoom", { + configurable: true, + enumerable: false, + value: def.zoom + }); + //shader.frames.push(def.frame_offset); + } + return ordered_shaders; + } + } + return null; + } + + _toShaders(shaders, keys,defs) { + for (let i = 0, len0 = defs.length; i < len0; ++i) { + let def = defs[i]; + let element_str = []; + for (let j = 0, len1 = def.elements.length; j < len1; j++) { + element_str.push(def.elements[j]); + } + let filters = def.filters.filters; + let filterStr = []; + for (let attr in filters) { + filterStr.push(filters[attr].id); + } + let key = element_str.join("/") + "::" + def.attachment + "_" + filterStr.join("_"); + keys.push(key); + let shader = shaders[key] = (shaders[key] || {}); + //shader.frames = []; + shader.zoom = CartoCSS.Tree.Zoom.all; + let props = def.toJS(this.env); + for (let v in props) { + (shader[v] = (shader[v] || [])).push(props[v].join('\n')) + } + } + } + /** + * @function CartoCSS.prototype.getShaders + * @description 获取CartoCSS着色器 + * @returns {Array} 着色器集 + * @example + * //shaders的结构大概如下: + * var shaders=[ + * { + * attachment:"one", + * elements:[], + * zoom:23, + * length:2, + * 0:{property:"line-color",value:function(attribute,zoom){var _value=null;if(zoom){_value="#123456"}return _vlaue;}}, + * 1:{preoperty:"line-width",value:function(attribute,zoom){var _value=null;if(zoom){_value=3}return _vlaue;}} + * }, + * { + * attachment:"two", + * elements:[], + * zoom:23, + * length:2, + * 0:{property:"polygon-color",value:function(attribute,zoom){var _value=null;if(zoom){_value="#123456"}return _vlaue;}}, + * 1:{property:"line-width",value:function(attribute,zoom){var _value=null;if(zoom){_value=3}return _vlaue;}} + * } + * ]; + */ + getShaders() { + return this.shaders; + } + + /** + * @function CartoCSS.prototype.destroy + * @description CartoCSS解析对象的析构函数,用于销毁CartoCSS解析对象 + */ + destroy() { + this.cartoStr = null; + this.env = null; + this.ruleSet = null; + this.parser = null; + this.shaders = null; + } + +} + +var _mapnik_reference_latest = { + "version": "2.1.1", + "style": { + "filter-mode": { + "type": [ + "all", + "first" + ], + "doc": "Control the processing behavior of Rule filters within a Style. If 'all' is used then all Rules are processed sequentially independent of whether any previous filters matched. If 'first' is used then it means processing ends after the first match (a positive filter evaluation) and no further Rules in the Style are processed ('first' is usually the default for CSS implementations on top of Mapnik to simplify translation from CSS to Mapnik XML)", + "default-value": "all", + "default-meaning": "All Rules in a Style are processed whether they have filters or not and whether or not the filter conditions evaluate to true." + }, + "image-filters": { + "css": "image-filters", + "default-value": "none", + "default-meaning": "no filters", + "type": "functions", + "functions": [ + ["agg-stack-blur", 2], + ["emboss", 0], + ["blur", 0], + ["gray", 0], + ["sobel", 0], + ["edge-detect", 0], + ["x-gradient", 0], + ["y-gradient", 0], + ["invert", 0], + ["sharpen", 0] + ], + "doc": "A list of image filters." + }, + "comp-op": { + "css": "comp-op", + "default-value": "src-over", + "default-meaning": "add the current layer on top of other layers", + "doc": "Composite operation. This defines how this layer should behave relative to layers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + }, + "opacity": { + "css": "opacity", + "type": "float", + "doc": "An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)", + "default-value": 1, + "default-meaning": "no separate buffer will be used and no alpha will be applied to the style after rendering" + } + }, + "layer": { + "name": { + "default-value": "", + "type": "string", + "required": true, + "default-meaning": "No layer name has been provided", + "doc": "The name of a layer. Can be anything you wish and is not strictly validated, but ideally unique in the map" + }, + "srs": { + "default-value": "", + "type": "string", + "default-meaning": "No srs value is provided and the value will be inherited from the Map's srs", + "doc": "The spatial reference system definition for the layer, aka the projection. Can either be a proj4 literal string like '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' or, if the proper proj4 epsg/nad/etc identifier files are installed, a string that uses an id like: '+init=epsg:4326'" + }, + "status": { + "default-value": true, + "type": "boolean", + "default-meaning": "This layer will be marked as active and available for processing", + "doc": "A property that can be set to false to disable this layer from being processed" + }, + "minzoom": { + "default-value": "0", + "type": "float", + "default-meaning": "The layer will be visible at the minimum possible scale", + "doc": "The minimum scale denominator that this layer will be visible at. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6" + }, + "maxzoom": { + "default-value": "1.79769e+308", + "type": "float", + "default-meaning": "The layer will be visible at the maximum possible scale", + "doc": "The maximum scale denominator that this layer will be visible at. The default is the numeric limit of the C++ double type, which may vary slightly by system, but is likely a massive number like 1.79769e+308 and ensures that this layer will always be visible unless the value is reduced. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6" + }, + "queryable": { + "default-value": false, + "type": "boolean", + "default-meaning": "The layer will not be available for the direct querying of data values", + "doc": "This property was added for GetFeatureInfo/WMS compatibility and is rarely used. It is off by default meaning that in a WMS context the layer will not be able to be queried unless the property is explicitly set to true" + }, + "clear-label-cache": { + "default-value": false, + "type": "boolean", + "default-meaning": "The renderer's collision detector cache (used for avoiding duplicate labels and overlapping markers) will not be cleared immediately before processing this layer", + "doc": "This property, by default off, can be enabled to allow a user to clear the collision detector cache before a given layer is processed. This may be desirable to ensure that a given layers data shows up on the map even if it normally would not because of collisions with previously rendered labels or markers" + }, + "group-by": { + "default-value": "", + "type": "string", + "default-meaning": "No special layer grouping will be used during rendering", + "doc": "https://github.com/mapnik/mapnik/wiki/Grouped-rendering" + }, + "buffer-size": { + "default-value": "0", + "type": "float", + "default-meaning": "No buffer will be used", + "doc": "Extra tolerance around the Layer extent (in pixels) used to when querying and (potentially) clipping the layer data during rendering" + }, + "maximum-extent": { + "default-value": "none", + "type": "bbox", + "default-meaning": "No clipping extent will be used", + "doc": "An extent to be used to limit the bounds used to query this specific layer data during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Layer." + } + }, + "symbolizers": { + "*": { + "image-filters": { + "css": "image-filters", + "default-value": "none", + "default-meaning": "no filters", + "type": "functions", + "functions": [ + ["agg-stack-blur", 2], + ["emboss", 0], + ["blur", 0], + ["gray", 0], + ["sobel", 0], + ["edge-detect", 0], + ["x-gradient", 0], + ["y-gradient", 0], + ["invert", 0], + ["sharpen", 0] + ], + "doc": "A list of image filters." + }, + "comp-op": { + "css": "comp-op", + "default-value": "src-over", + "default-meaning": "add the current layer on top of other layers", + "doc": "Composite operation. This defines how this layer should behave relative to layers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + }, + "opacity": { + "css": "opacity", + "type": "float", + "doc": "An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)", + "default-value": 1, + "default-meaning": "no separate buffer will be used and no alpha will be applied to the style after rendering" + } + }, + "map": { + "background-color": { + "css": "background-color", + "default-value": "none", + "default-meaning": "transparent", + "type": "color", + "doc": "Map Background color" + }, + "background-image": { + "css": "background-image", + "type": "uri", + "default-value": "", + "default-meaning": "transparent", + "doc": "An image that is repeated below all features on a map as a background.", + "description": "Map Background image" + }, + "srs": { + "css": "srs", + "type": "string", + "default-value": "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs", + "default-meaning": "The proj4 literal of EPSG:4326 is assumed to be the Map's spatial reference and all data from layers within this map will be plotted using this coordinate system. If any layers do not declare an srs value then they will be assumed to be in the same srs as the Map and not transformations will be needed to plot them in the Map's coordinate space", + "doc": "Map spatial reference (proj4 string)" + }, + "buffer-size": { + "css": "buffer-size", + "default-value": "0", + "type": "float", + "default-meaning": "No buffer will be used", + "doc": "Extra tolerance around the map (in pixels) used to ensure labels crossing tile boundaries are equally rendered in each tile (e.g. cut in each tile). Not intended to be used in combination with \"avoid-edges\"." + }, + "maximum-extent": { + "css": "", + "default-value": "none", + "type": "bbox", + "default-meaning": "No clipping extent will be used", + "doc": "An extent to be used to limit the bounds used to query all layers during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Map." + }, + "base": { + "css": "base", + "default-value": "", + "default-meaning": "This base path defaults to an empty string meaning that any relative paths to files referenced in styles or layers will be interpreted relative to the application process.", + "type": "string", + "doc": "Any relative paths used to reference files will be understood as relative to this directory path if the map is loaded from an in memory object rather than from the filesystem. If the map is loaded from the filesystem and this option is not provided it will be set to the directory of the stylesheet." + }, + "paths-from-xml": { + "css": "", + "default-value": true, + "default-meaning": "Paths read from XML will be interpreted from the location of the XML", + "type": "boolean", + "doc": "value to control whether paths in the XML will be interpreted from the location of the XML or from the working directory of the program that calls load_map()" + }, + "minimum-version": { + "css": "", + "default-value": "none", + "default-meaning": "Mapnik version will not be detected and no error will be thrown about compatibility", + "type": "string", + "doc": "The minumum Mapnik version (e.g. 0.7.2) needed to use certain functionality in the stylesheet" + }, + "font-directory": { + "css": "font-directory", + "type": "uri", + "default-value": "none", + "default-meaning": "No map-specific fonts will be registered", + "doc": "Path to a directory which holds fonts which should be registered when the Map is loaded (in addition to any fonts that may be automatically registered)." + } + }, + "polygon": { + "fill": { + "css": "polygon-fill", + "type": "color", + "default-value": "rgba(128,128,128,1)", + "default-meaning": "gray and fully opaque (alpha = 1), same as rgb(128,128,128)", + "doc": "Fill color to assign to a polygon" + }, + "fill-opacity": { + "css": "polygon-opacity", + "type": "float", + "doc": "The opacity of the polygon", + "default-value": 1, + "default-meaning": "opaque" + }, + "gamma": { + "css": "polygon-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of polygon edges" + }, + "gamma-method": { + "css": "polygon-gamma-method", + "type": [ + "power", + "linear", + "none", + "threshold", + "multiply" + ], + "default-value": "power", + "default-meaning": "pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA", + "doc": "An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h" + }, + "clip": { + "css": "polygon-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "polygon-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "polygon-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ] + }, + "comp-op": { + "css": "polygon-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "line": { + "stroke": { + "css": "line-color", + "default-value": "rgba(0,0,0,1)", + "type": "color", + "default-meaning": "black and fully opaque (alpha = 1), same as rgb(0,0,0)", + "doc": "The color of a drawn line" + }, + "stroke-width": { + "css": "line-width", + "default-value": 1, + "type": "float", + "doc": "The width of a line in pixels" + }, + "stroke-opacity": { + "css": "line-opacity", + "default-value": 1, + "type": "float", + "default-meaning": "opaque", + "doc": "The opacity of a line" + }, + "stroke-linejoin": { + "css": "line-join", + "default-value": "miter", + "type": [ + "miter", + "round", + "bevel" + ], + "doc": "The behavior of lines when joining" + }, + "stroke-linecap": { + "css": "line-cap", + "default-value": "butt", + "type": [ + "butt", + "round", + "square" + ], + "doc": "The display of line endings" + }, + "stroke-gamma": { + "css": "line-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of stroke line" + }, + "stroke-gamma-method": { + "css": "line-gamma-method", + "type": [ + "power", + "linear", + "none", + "threshold", + "multiply" + ], + "default-value": "power", + "default-meaning": "pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA", + "doc": "An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h" + }, + "stroke-dasharray": { + "css": "line-dasharray", + "type": "numbers", + "doc": "A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.", + "default-value": "none", + "default-meaning": "solid line" + }, + "stroke-dashoffset": { + "css": "line-dash-offset", + "type": "numbers", + "doc": "valid parameter but not currently used in renderers (only exists for experimental svg support in Mapnik which is not yet enabled)", + "default-value": "none", + "default-meaning": "solid line" + }, + "stroke-miterlimit": { + "css": "line-miterlimit", + "type": "float", + "doc": "The limit on the ratio of the miter length to the stroke-width. Used to automatically convert miter joins to bevel joins for sharp angles to avoid the miter extending beyond the thickness of the stroking path. Normally will not need to be set, but a larger value can sometimes help avoid jaggy artifacts.", + "default-value": 4.0, + "default-meaning": "Will auto-convert miters to bevel line joins when theta is less than 29 degrees as per the SVG spec: 'miterLength / stroke-width = 1 / sin ( theta / 2 )'" + }, + "clip": { + "css": "line-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "line-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "offset": { + "css": "line-offset", + "type": "float", + "default-value": 0, + "default-meaning": "no offset", + "doc": "Offsets a line a number of pixels parallel to its actual path. Postive values move the line left, negative values move it right (relative to the directionality of the line)." + }, + "rasterizer": { + "css": "line-rasterizer", + "type": [ + "full", + "fast" + ], + "default-value": "full", + "doc": "Exposes an alternate AGG rendering method that sacrifices some accuracy for speed." + }, + "geometry-transform": { + "css": "line-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ] + }, + "comp-op": { + "css": "line-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "markers": { + "file": { + "css": "marker-file", + "doc": "An SVG file that this marker shows at each placement. If no file is given, the marker will show an ellipse.", + "default-value": "", + "default-meaning": "An ellipse or circle, if width equals height", + "type": "uri" + }, + "opacity": { + "css": "marker-opacity", + "doc": "The overall opacity of the marker, if set, overrides both the opacity of both the fill and stroke", + "default-value": 1, + "default-meaning": "The stroke-opacity and fill-opacity will be used", + "type": "float" + }, + "fill-opacity": { + "css": "marker-fill-opacity", + "doc": "The fill opacity of the marker", + "default-value": 1, + "default-meaning": "opaque", + "type": "float" + }, + "stroke": { + "css": "marker-line-color", + "doc": "The color of the stroke around a marker shape.", + "default-value": "black", + "type": "color" + }, + "stroke-width": { + "css": "marker-line-width", + "doc": "The width of the stroke around a marker shape, in pixels. This is positioned on the boundary, so high values can cover the area itself.", + "type": "float" + }, + "stroke-opacity": { + "css": "marker-line-opacity", + "default-value": 1, + "default-meaning": "opaque", + "doc": "The opacity of a line", + "type": "float" + }, + "placement": { + "css": "marker-placement", + "type": [ + "point", + "line", + "interior" + ], + "default-value": "point", + "default-meaning": "Place markers at the center point (centroid) of the geometry", + "doc": "Attempt to place markers on a point, in the center of a polygon, or if markers-placement:line, then multiple times along a line. 'interior' placement can be used to ensure that points placed on polygons are forced to be inside the polygon interior" + }, + "multi-policy": { + "css": "marker-multi-policy", + "type": [ + "each", + "whole", + "largest" + ], + "default-value": "each", + "default-meaning": "If a feature contains multiple geometries and the placement type is either point or interior then a marker will be rendered for each", + "doc": "A special setting to allow the user to control rendering behavior for 'multi-geometries' (when a feature contains multiple geometries). This setting does not apply to markers placed along lines. The 'each' policy is default and means all geometries will get a marker. The 'whole' policy means that the aggregate centroid between all geometries will be used. The 'largest' policy means that only the largest (by bounding box areas) feature will get a rendered marker (this is how text labeling behaves by default)." + }, + "marker-type": { + "css": "marker-type", + "type": [ + "arrow", + "ellipse" + ], + "default-value": "ellipse", + "doc": "The default marker-type. If a SVG file is not given as the marker-file parameter, the renderer provides either an arrow or an ellipse (a circle if height is equal to width)" + }, + "width": { + "css": "marker-width", + "default-value": 10, + "doc": "The width of the marker, if using one of the default types.", + "type": "expression" + }, + "height": { + "css": "marker-height", + "default-value": 10, + "doc": "The height of the marker, if using one of the default types.", + "type": "expression" + }, + "fill": { + "css": "marker-fill", + "default-value": "blue", + "doc": "The color of the area of the marker.", + "type": "color" + }, + "allow-overlap": { + "css": "marker-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping markers are shown or hidden.", + "default-meaning": "Do not allow makers to overlap with each other - overlapping markers will not be shown." + }, + "ignore-placement": { + "css": "marker-ignore-placement", + "type": "boolean", + "default-value": false, + "default-meaning": "do not store the bbox of this geometry in the collision detector cache", + "doc": "value to control whether the placement of the feature will prevent the placement of other features" + }, + "spacing": { + "css": "marker-spacing", + "doc": "Space between repeated labels", + "default-value": 100, + "type": "float" + }, + "max-error": { + "css": "marker-max-error", + "type": "float", + "default-value": 0.2, + "doc": "The maximum difference between actual marker placement and the marker-spacing parameter. Setting a high value can allow the renderer to try to resolve placement conflicts with other symbolizers." + }, + "transform": { + "css": "marker-transform", + "type": "functions", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ], + "default-value": "", + "default-meaning": "No transformation", + "doc": "SVG transformation definition" + }, + "clip": { + "css": "marker-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "marker-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "marker-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ] + }, + "comp-op": { + "css": "marker-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "shield": { + "name": { + "css": "shield-name", + "type": "expression", + "serialization": "content", + "doc": "Value to use for a shield\"s text label. Data columns are specified using brackets like [column_name]" + }, + "file": { + "css": "shield-file", + "required": true, + "type": "uri", + "default-value": "none", + "doc": "Image file to render behind the shield text" + }, + "face-name": { + "css": "shield-face-name", + "type": "string", + "validate": "font", + "doc": "Font name and style to use for the shield text", + "default-value": "", + "required": true + }, + "unlock-image": { + "css": "shield-unlock-image", + "type": "boolean", + "doc": "This parameter should be set to true if you are trying to position text beside rather than on top of the shield image", + "default-value": false, + "default-meaning": "text alignment relative to the shield image uses the center of the image as the anchor for text positioning." + }, + "size": { + "css": "shield-size", + "type": "float", + "doc": "The size of the shield text in pixels" + }, + "fill": { + "css": "shield-fill", + "type": "color", + "doc": "The color of the shield text" + }, + "placement": { + "css": "shield-placement", + "type": [ + "point", + "line", + "vertex", + "interior" + ], + "default-value": "point", + "doc": "How this shield should be placed. Point placement attempts to place it on top of points, line places along lines multiple times per feature, vertex places on the vertexes of polygons, and interior attempts to place inside of polygons." + }, + "avoid-edges": { + "css": "shield-avoid-edges", + "doc": "Tell positioning algorithm to avoid labeling near intersection edges.", + "type": "boolean", + "default-value": false + }, + "allow-overlap": { + "css": "shield-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping shields are shown or hidden.", + "default-meaning": "Do not allow shields to overlap with other map elements already placed." + }, + "minimum-distance": { + "css": "shield-min-distance", + "type": "float", + "default-value": 0, + "doc": "Minimum distance to the next shield symbol, not necessarily the same shield." + }, + "spacing": { + "css": "shield-spacing", + "type": "float", + "default-value": 0, + "doc": "The spacing between repeated occurrences of the same shield on a line" + }, + "minimum-padding": { + "css": "shield-min-padding", + "default-value": 0, + "doc": "Determines the minimum amount of padding that a shield gets relative to other shields", + "type": "float" + }, + "wrap-width": { + "css": "shield-wrap-width", + "type": "unsigned", + "default-value": 0, + "doc": "Length of a chunk of text in characters before wrapping text" + }, + "wrap-before": { + "css": "shield-wrap-before", + "type": "boolean", + "default-value": false, + "doc": "Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width." + }, + "wrap-character": { + "css": "shield-wrap-character", + "type": "string", + "default-value": " ", + "doc": "Use this character instead of a space to wrap long names." + }, + "halo-fill": { + "css": "shield-halo-fill", + "type": "color", + "default-value": "#FFFFFF", + "default-meaning": "white", + "doc": "Specifies the color of the halo around the text." + }, + "halo-radius": { + "css": "shield-halo-radius", + "doc": "Specify the radius of the halo in pixels", + "default-value": 0, + "default-meaning": "no halo", + "type": "float" + }, + "character-spacing": { + "css": "shield-character-spacing", + "type": "unsigned", + "default-value": 0, + "doc": "Horizontal spacing between characters (in pixels). Currently works for point placement only, not line placement." + }, + "line-spacing": { + "css": "shield-line-spacing", + "doc": "Vertical spacing between lines of multiline labels (in pixels)", + "type": "unsigned" + }, + "dx": { + "css": "shield-text-dx", + "type": "float", + "doc": "Displace text within shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "dy": { + "css": "shield-text-dy", + "type": "float", + "doc": "Displace text within shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "shield-dx": { + "css": "shield-dx", + "type": "float", + "doc": "Displace shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "shield-dy": { + "css": "shield-dy", + "type": "float", + "doc": "Displace shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "opacity": { + "css": "shield-opacity", + "type": "float", + "doc": "(Default 1.0) - opacity of the image used for the shield", + "default-value": 1 + }, + "text-opacity": { + "css": "shield-text-opacity", + "type": "float", + "doc": "(Default 1.0) - opacity of the text placed on top of the shield", + "default-value": 1 + }, + "horizontal-alignment": { + "css": "shield-horizontal-alignment", + "type": [ + "left", + "middle", + "right", + "auto" + ], + "doc": "The shield's horizontal alignment from its centerpoint", + "default-value": "auto" + }, + "vertical-alignment": { + "css": "shield-vertical-alignment", + "type": [ + "top", + "middle", + "bottom", + "auto" + ], + "doc": "The shield's vertical alignment from its centerpoint", + "default-value": "middle" + }, + "text-transform": { + "css": "shield-text-transform", + "type": [ + "none", + "uppercase", + "lowercase", + "capitalize" + ], + "doc": "Transform the case of the characters", + "default-value": "none" + }, + "justify-alignment": { + "css": "shield-justify-alignment", + "type": [ + "left", + "center", + "right", + "auto" + ], + "doc": "Define how text in a shield's label is justified", + "default-value": "auto" + }, + "clip": { + "css": "shield-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "comp-op": { + "css": "shield-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "line-pattern": { + "file": { + "css": "line-pattern-file", + "type": "uri", + "default-value": "none", + "required": true, + "doc": "An image file to be repeated and warped along a line" + }, + "clip": { + "css": "line-pattern-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "line-pattern-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "line-pattern-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ] + }, + "comp-op": { + "css": "line-pattern-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "polygon-pattern": { + "file": { + "css": "polygon-pattern-file", + "type": "uri", + "default-value": "none", + "required": true, + "doc": "Image to use as a repeated pattern fill within a polygon" + }, + "alignment": { + "css": "polygon-pattern-alignment", + "type": [ + "local", + "global" + ], + "default-value": "local", + "doc": "Specify whether to align pattern fills to the layer or to the map." + }, + "gamma": { + "css": "polygon-pattern-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of polygon pattern edges" + }, + "opacity": { + "css": "polygon-pattern-opacity", + "type": "float", + "doc": "(Default 1.0) - Apply an opacity level to the image used for the pattern", + "default-value": 1, + "default-meaning": "The image is rendered without modifications" + }, + "clip": { + "css": "polygon-pattern-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "polygon-pattern-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "polygon-pattern-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ] + }, + "comp-op": { + "css": "polygon-pattern-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "raster": { + "opacity": { + "css": "raster-opacity", + "default-value": 1, + "default-meaning": "opaque", + "type": "float", + "doc": "The opacity of the raster symbolizer on top of other symbolizers." + }, + "filter-factor": { + "css": "raster-filter-factor", + "default-value": -1, + "default-meaning": "Allow the datasource to choose appropriate downscaling.", + "type": "float", + "doc": "This is used by the Raster or Gdal datasources to pre-downscale images using overviews. Higher numbers can sometimes cause much better scaled image output, at the cost of speed." + }, + "scaling": { + "css": "raster-scaling", + "type": [ + "near", + "fast", + "bilinear", + "bilinear8", + "bicubic", + "spline16", + "spline36", + "hanning", + "hamming", + "hermite", + "kaiser", + "quadric", + "catrom", + "gaussian", + "bessel", + "mitchell", + "sinc", + "lanczos", + "blackman" + ], + "default-value": "near", + "doc": "The scaling algorithm used to making different resolution versions of this raster layer. Bilinear is a good compromise between speed and accuracy, while lanczos gives the highest quality." + }, + "mesh-size": { + "css": "raster-mesh-size", + "default-value": 16, + "default-meaning": "Reprojection mesh will be 1/16 of the resolution of the source image", + "type": "unsigned", + "doc": "A reduced resolution mesh is used for raster reprojection, and the total image size is divided by the mesh-size to determine the quality of that mesh. Values for mesh-size larger than the default will result in faster reprojection but might lead to distortion." + }, + "comp-op": { + "css": "raster-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "point": { + "file": { + "css": "point-file", + "type": "uri", + "required": false, + "default-value": "none", + "doc": "Image file to represent a point" + }, + "allow-overlap": { + "css": "point-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping points are shown or hidden.", + "default-meaning": "Do not allow points to overlap with each other - overlapping markers will not be shown." + }, + "ignore-placement": { + "css": "point-ignore-placement", + "type": "boolean", + "default-value": false, + "default-meaning": "do not store the bbox of this geometry in the collision detector cache", + "doc": "value to control whether the placement of the feature will prevent the placement of other features" + }, + "opacity": { + "css": "point-opacity", + "type": "float", + "default-value": 1.0, + "default-meaning": "Fully opaque", + "doc": "A value from 0 to 1 to control the opacity of the point" + }, + "placement": { + "css": "point-placement", + "type": [ + "centroid", + "interior" + ], + "doc": "How this point should be placed. Centroid calculates the geometric center of a polygon, which can be outside of it, while interior always places inside of a polygon.", + "default-value": "centroid" + }, + "transform": { + "css": "point-transform", + "type": "functions", + "functions": [ + ["matrix", 6], + ["translate", 2], + ["scale", 2], + ["rotate", 3], + ["skewX", 1], + ["skewY", 1] + ], + "default-value": "", + "default-meaning": "No transformation", + "doc": "SVG transformation definition" + }, + "comp-op": { + "css": "point-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "text": { + "name": { + "css": "text-name", + "type": "expression", + "required": true, + "default-value": "", + "serialization": "content", + "doc": "Value to use for a text label. Data columns are specified using brackets like [column_name]" + }, + "face-name": { + "css": "text-face-name", + "type": "string", + "validate": "font", + "doc": "Font name and style to render a label in", + "required": true + }, + "size": { + "css": "text-size", + "type": "float", + "default-value": 10, + "doc": "Text size in pixels" + }, + "text-ratio": { + "css": "text-ratio", + "doc": "Define the amount of text (of the total) present on successive lines when wrapping occurs", + "default-value": 0, + "type": "unsigned" + }, + "wrap-width": { + "css": "text-wrap-width", + "doc": "Length of a chunk of text in characters before wrapping text", + "default-value": 0, + "type": "unsigned" + }, + "wrap-before": { + "css": "text-wrap-before", + "type": "boolean", + "default-value": false, + "doc": "Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width." + }, + "wrap-character": { + "css": "text-wrap-character", + "type": "string", + "default-value": " ", + "doc": "Use this character instead of a space to wrap long text." + }, + "spacing": { + "css": "text-spacing", + "type": "unsigned", + "doc": "Distance between repeated text labels on a line (aka. label-spacing)" + }, + "character-spacing": { + "css": "text-character-spacing", + "type": "float", + "default-value": 0, + "doc": "Horizontal spacing adjustment between characters in pixels" + }, + "line-spacing": { + "css": "text-line-spacing", + "default-value": 0, + "type": "unsigned", + "doc": "Vertical spacing adjustment between lines in pixels" + }, + "label-position-tolerance": { + "css": "text-label-position-tolerance", + "default-value": 0, + "type": "unsigned", + "doc": "Allows the label to be displaced from its ideal position by a number of pixels (only works with placement:line)" + }, + "max-char-angle-delta": { + "css": "text-max-char-angle-delta", + "type": "float", + "default-value": "22.5", + "doc": "The maximum angle change, in degrees, allowed between adjacent characters in a label. This value internally is converted to radians to the default is 22.5*math.pi/180.0. The higher the value the fewer labels will be placed around around sharp corners." + }, + "fill": { + "css": "text-fill", + "doc": "Specifies the color for the text", + "default-value": "#000000", + "type": "color" + }, + "opacity": { + "css": "text-opacity", + "doc": "A number from 0 to 1 specifying the opacity for the text", + "default-value": 1.0, + "default-meaning": "Fully opaque", + "type": "float" + }, + "halo-fill": { + "css": "text-halo-fill", + "type": "color", + "default-value": "#FFFFFF", + "default-meaning": "white", + "doc": "Specifies the color of the halo around the text." + }, + "halo-radius": { + "css": "text-halo-radius", + "doc": "Specify the radius of the halo in pixels", + "default-value": 0, + "default-meaning": "no halo", + "type": "float" + }, + "dx": { + "css": "text-dx", + "type": "float", + "doc": "Displace text by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "dy": { + "css": "text-dy", + "type": "float", + "doc": "Displace text by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "vertical-alignment": { + "css": "text-vertical-alignment", + "type": [ + "top", + "middle", + "bottom", + "auto" + ], + "doc": "Position of label relative to point position.", + "default-value": "auto", + "default-meaning": "Default affected by value of dy; \"bottom\" for dy>0, \"top\" for dy<0." + }, + "avoid-edges": { + "css": "text-avoid-edges", + "doc": "Tell positioning algorithm to avoid labeling near intersection edges.", + "default-value": false, + "type": "boolean" + }, + "minimum-distance": { + "css": "text-min-distance", + "doc": "Minimum permitted distance to the next text symbolizer.", + "type": "float" + }, + "minimum-padding": { + "css": "text-min-padding", + "doc": "Determines the minimum amount of padding that a text symbolizer gets relative to other text", + "type": "float" + }, + "minimum-path-length": { + "css": "text-min-path-length", + "type": "float", + "default-value": 0, + "default-meaning": "place labels on all paths", + "doc": "Place labels only on paths longer than this value." + }, + "allow-overlap": { + "css": "text-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping text is shown or hidden.", + "default-meaning": "Do not allow text to overlap with other text - overlapping markers will not be shown." + }, + "orientation": { + "css": "text-orientation", + "type": "expression", + "doc": "Rotate the text." + }, + "placement": { + "css": "text-placement", + "type": [ + "point", + "line", + "vertex", + "interior" + ], + "default-value": "point", + "doc": "Control the style of placement of a point versus the geometry it is attached to." + }, + "placement-type": { + "css": "text-placement-type", + "doc": "Re-position and/or re-size text to avoid overlaps. \"simple\" for basic algorithm (using text-placements string,) \"dummy\" to turn this feature off.", + "type": [ + "dummy", + "simple" + ], + "default-value": "dummy" + }, + "placements": { + "css": "text-placements", + "type": "string", + "default-value": "", + "doc": "If \"placement-type\" is set to \"simple\", use this \"POSITIONS,[SIZES]\" string. An example is `text-placements: \"E,NE,SE,W,NW,SW\";` " + }, + "text-transform": { + "css": "text-transform", + "type": [ + "none", + "uppercase", + "lowercase", + "capitalize" + ], + "doc": "Transform the case of the characters", + "default-value": "none" + }, + "horizontal-alignment": { + "css": "text-horizontal-alignment", + "type": [ + "left", + "middle", + "right", + "auto" + ], + "doc": "The text's horizontal alignment from its centerpoint", + "default-value": "auto" + }, + "justify-alignment": { + "css": "text-align", + "type": [ + "left", + "right", + "center", + "auto" + ], + "doc": "Define how text is justified", + "default-value": "auto", + "default-meaning": "Auto alignment means that text will be centered by default except when using the `placement-type` parameter - in that case either right or left justification will be used automatically depending on where the text could be fit given the `text-placements` directives" + }, + "clip": { + "css": "text-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "comp-op": { + "css": "text-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", + "src", + "dst", + "src-over", + "dst-over", + "src-in", + "dst-in", + "src-out", + "dst-out", + "src-atop", + "dst-atop", + "xor", + "plus", + "minus", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "contrast", + "invert", + "invert-rgb", + "grain-merge", + "grain-extract", + "hue", + "saturation", + "color", + "value" + ] + } + }, + "building": { + "fill": { + "css": "building-fill", + "default-value": "#FFFFFF", + "doc": "The color of the buildings walls.", + "type": "color" + }, + "fill-opacity": { + "css": "building-fill-opacity", + "type": "float", + "doc": "The opacity of the building as a whole, including all walls.", + "default-value": 1 + }, + "height": { + "css": "building-height", + "doc": "The height of the building in pixels.", + "type": "expression", + "default-value": "0" + } + } + }, + "colors": { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "grey": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50], + "transparent": [0, 0, 0, 0] + }, + "filter": { + "value": [ + "true", + "false", + "null", + "point", + "linestring", + "polygon", + "collection" + ] + } +}; + +CartoCSS['mapnik_reference'] = { + version: { + latest: _mapnik_reference_latest, + '2.1.1': _mapnik_reference_latest + } +}; + +CartoCSS.Tree = {}; +CartoCSS.Tree.operate = function(op, a, b) { + switch (op) { + case '+': return a + b; + case '-': return a - b; + case '*': return a * b; + case '%': return a % b; + case '/': return a / b; + } +}; +CartoCSS.Tree.functions = { + rgb: function (r, g, b) { + return this.rgba(r, g, b, 1.0); + }, + rgba: function (r, g, b, a) { + var me = this; + var rgb = [r, g, b].map(function (c) { + return me.number(c); + }); + a = me.number(a); + if (rgb.some(isNaN) || isNaN(a)) {return null;} + return new CartoCSS.Tree.Color(rgb, a); + }, + // Only require val + stop: function (val) { + var color, mode; + if (arguments.length > 1) {color = arguments[1];} + if (arguments.length > 2) {mode = arguments[2];} + + return { + is: 'tag', + val: val, + color: color, + mode: mode, + toString(env) { + return '\n\t'; + } + }; + }, + hsl: function (h, s, l) { + return this.hsla(h, s, l, 1.0); + }, + hsla: function (h, s, l, a) { + h = (this.number(h) % 360) / 360; + s = this.number(s); + l = this.number(l); + a = this.number(a); + if ([h, s, l, a].some(isNaN)) {return null;} + + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s, + m1 = l * 2 - m2; + + return this.rgba(hue(h + 1 / 3) * 255, + hue(h) * 255, + hue(h - 1 / 3) * 255, + a); + + function hue(h) { + h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); + if (h * 6 < 1) {return m1 + (m2 - m1) * h * 6;} else if (h * 2 < 1) {return m2;} else if (h * 3 < 2) {return m1 + (m2 - m1) * (2 / 3 - h) * 6;} else {return m1;} + } + }, + hue: function (color) { + if (!('toHSL' in color)) {return null;} + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().h)); + }, + saturation: function (color) { + if (!('toHSL' in color)) {return null;} + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().s * 100), '%'); + }, + lightness: function (color) { + if (!('toHSL' in color)) {return null;} + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().l * 100), '%'); + }, + alpha: function (color) { + if (!('toHSL' in color)) {return null;} + return new CartoCSS.Tree.Dimension(color.toHSL().a); + }, + saturate: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.s += amount.value / 100; + hsl.s = this.clamp(hsl.s); + return this.hsla_simple(hsl); + }, + desaturate: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.s -= amount.value / 100; + hsl.s = this.clamp(hsl.s); + return this.hsla_simple(hsl); + }, + lighten: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.l += amount.value / 100; + hsl.l = this.clamp(hsl.l); + return this.hsla_simple(hsl); + }, + darken: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.l -= amount.value / 100; + hsl.l = this.clamp(hsl.l); + return this.hsla_simple(hsl); + }, + fadein: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.a += amount.value / 100; + hsl.a = this.clamp(hsl.a); + return this.hsla_simple(hsl); + }, + fadeout: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + + hsl.a -= amount.value / 100; + hsl.a = this.clamp(hsl.a); + return this.hsla_simple(hsl); + }, + spin: function (color, amount) { + if (!('toHSL' in color)) {return null;} + var hsl = color.toHSL(); + var hue = (hsl.h + amount.value) % 360; + + hsl.h = hue < 0 ? 360 + hue : hue; + + return this.hsla_simple(hsl); + }, + replace: function (entity, a, b) { + if (entity.is === 'field') { + return entity.toString + '.replace(' + a.toString() + ', ' + b.toString() + ')'; + } else { + return entity.replace(a, b); + } + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function (color1, color2, weight) { + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = color1.toHSL().a - color2.toHSL().a; + + var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, + color1.rgb[1] * w1 + color2.rgb[1] * w2, + color1.rgb[2] * w1 + color2.rgb[2] * w2]; + + var alpha = color1.alpha * p + color2.alpha * (1 - p); + + return new CartoCSS.Tree.Color(rgb, alpha); + }, + greyscale: function (color) { + return this.desaturate(color, new CartoCSS.Tree.Dimension(100)); + }, + '%': function (quoted /* arg, arg, ...*/) { + var args = Array.prototype.slice.call(arguments, 1), + str = quoted.value; + + for (var i = 0; i < args.length; i++) { + str = str.replace(/%s/, args[i].value) + .replace(/%[da]/, args[i].toString()); + } + str = str.replace(/%%/g, '%'); + return new CartoCSS.Tree.Quoted(str); + }, + + hsla_simple: function (h) { + return this.hsla(h.h, h.s, h.l, h.a); + }, + + number: function (n) { + if (n instanceof CartoCSS.Tree.Dimension) { + return parseFloat(n.unit === '%' ? n.value / 100 : n.value); + } else if (typeof(n) === 'number') { + return n; + } else { + return NaN; + } + }, + + clamp: function (val) { + return Math.min(1, Math.max(0, val)); + } +}; + +CartoCSS.Tree.Call = class Call { + + constructor(name, args, index) { + this.is = 'call'; + this.name = name; + this.args = args; + this.index = index; + } + + // When evuating a function call, + // we either find the function in `tree.functions` [1], + // in which case we call it, passing the evaluated arguments, + // or we simply print it out as it appeared originally [2]. + // The *functions.js* file contains the built-in functions. + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + 'ev'(env) { + var args = this.args.map(function (a) { + return a.ev(env); + }); + + for (var i = 0; i < args.length; i++) { + if (args[i].is === 'undefined') { + return { + is: 'undefined', + value: 'undefined' + }; + } + } + + if (this.name in CartoCSS.Tree.functions) { + if (CartoCSS.Tree.functions[this.name].length <= args.length) { + var val = CartoCSS.Tree.functions[this.name].apply(CartoCSS.Tree.functions, args); + if (val === null) { + env.error({ + message: 'incorrect arguments given to ' + this.name + '()', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return {is: 'undefined', value: 'undefined'}; + } + return val; + } else { + env.error({ + message: 'incorrect number of arguments for ' + this.name + + '(). ' + CartoCSS.Tree.functions[this.name].length + ' expected.', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + } else { + var fn = CartoCSS.Tree.Reference.mapnikFunctions[this.name]; + if (fn === undefined) { + var functions = lodash_topairs_default()(CartoCSS.Tree.Reference.mapnikFunctions); + // cheap closest, needs improvement. + var name = this.name; + var mean = functions.map(function (f) { + return [f[0], CartoCSS.Tree.Reference.editDistance(name, f[0]), f[1]]; + }).sort(function (a, b) { + return a[1] - b[1]; + }); + env.error({ + message: 'unknown function ' + this.name + '(), did you mean ' + + mean[0][0] + '(' + mean[0][2] + ')', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + if (fn !== args.length && + // support variable-arg functions like `colorize-alpha` + fn !== -1) { + env.error({ + message: 'function ' + this.name + '() takes ' + + fn + ' arguments and was given ' + args.length, + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } else { + // Save the evaluated versions of arguments + this.args = args; + return this; + } + } + } + + toString(env, format) { + if (this.args.length) { + return this.name + '(' + this.args.join(',') + ')'; + } else { + return this.name; + } + } +}; + +CartoCSS.Tree.Color = class Color { + + constructor(rgb, a) { + this.is = 'color'; + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + if (Array.isArray(rgb)) { + this.rgb = rgb.slice(0, 3); + } else if (rgb.length == 6) { + this.rgb = rgb.match(/.{2}/g).map(function (c) { + return parseInt(c, 16); + }); + } else { + this.rgb = rgb.split('').map(function (c) { + return parseInt(c + c, 16); + }); + } + + if (typeof(a) === 'number') { + this.alpha = a; + } else if (rgb.length === 4) { + this.alpha = rgb[3]; + } else { + this.alpha = 1; + } + } + + 'ev'() { + return this; + } + + // If we have some transparency, the only way to represent it + // is via `rgba`. Otherwise, we use the hex representation, + // which has better compatibility with older browsers. + // Values are capped between `0` and `255`, rounded and zero-padded. + toString() { + /* if (this.alpha < 1.0) {*/ + return 'rgba(' + this.rgb.map(function (c) { + return Math.round(c); + }).concat(this.alpha).join(', ') + ')'; + /*} else { + return '#' + this.rgb.map(function(i) { + i = Math.round(i); + i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); + return i.length === 1 ? '0' + i : i; + }).join(''); + }*/ + } + + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + operate(env, op, other) { + var result = []; + + if (!(other instanceof CartoCSS.Tree.Color)) { + other = other.toColor(); + } + + for (var c = 0; c < 3; c++) { + result[c] = CartoCSS.Tree.operate(op, this.rgb[c], other.rgb[c]); + } + return new CartoCSS.Tree.Color(result); + } + + toHSL() { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2, d = max - min; + + if (max === min) { + h = s = 0; + } else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + default: + break; + } + h /= 6; + } + return {h: h * 360, s: s, l: l, a: a}; + } +}; + +CartoCSS.Tree.Comment = class Comment { + constructor(value, silent) { + this.value = value; + this.silent = !!silent; + } + + toString(env) { + return ''; + } + + 'ev'() { + return this; + } +}; + +CartoCSS.Tree.Definition = class Definition { + constructor(selector, rules) { + this.elements = selector.elements; + //assert.ok(selector.filters instanceof CartoCSS.Tree.Filterset); + this.rules = rules; + this.ruleIndex = {}; + for (var i = 0; i < this.rules.length; i++) { + if ('zoom' in this.rules[i]) {this.rules[i] = this.rules[i].clone();} + this.rules[i].zoom = selector.zoom; + this.ruleIndex[this.rules[i].updateID()] = true; + } + this.filters = selector.filters; + this.zoom = selector.zoom; + this.attachment = selector.attachment || '__default__'; + this.specificity = selector.specificity(); + } + + toString() { + var str = this.filters.toString(); + for (var i = 0; i < this.rules.length; i++) { + str += '\n ' + this.rules[i]; + } + return str; + } + + toJS(env) { + var shaderAttrs = {}; + + // merge conditions from filters with zoom condition of the + // definition + var zoom = this.zoom; + //var frame_offset = this.frame_offset; + var _if = this.filters.toJS(env); + var filters = [zoom]; + if (_if) {filters.push(_if);} + //if(frame_offset) filters.push('ctx["frame-offset"] === ' + frame_offset); + _if = filters.join(" && "); + + function eachRule(rule) { + if (rule instanceof CartoCSS.Tree.Rule) { + shaderAttrs[rule.name] = shaderAttrs[rule.name] || []; + if (_if) { + shaderAttrs[rule.name].push( + "if(" + _if + "){" + rule.value.toJS(env) + "}" + ); + } else { + shaderAttrs[rule.name].push(rule.value.toJS(env)); + } + } else { + if (rule instanceof CartoCSS.Tree.Ruleset) { + var sh = rule.toJS(env); + for (var v in sh) { + shaderAttrs[v] = shaderAttrs[v] || []; + for (var attr in sh[v]) { + shaderAttrs[v].push(sh[v][attr]); + } + } + } + } + } + for (var id in this.rules) { + eachRule(this.rules[id]); + } + return shaderAttrs; + } +}; + +CartoCSS.Tree.Dimension = class Dimension { + + + constructor(value, unit, index) { + this.is = 'float'; + this.physical_units = ['m', 'cm', 'in', 'mm', 'pt', 'pc']; + this.screen_units = ['px', '%']; + this.all_units = ['m', 'cm', 'in', 'mm', 'pt', 'pc', 'px', '%']; + this.densities = { + m: 0.0254, + mm: 25.4, + cm: 2.54, + pt: 72, + pc: 6 + }; + this.value = parseFloat(value); + this.unit = unit || null; + this.index = index; + } + + ev(env) { + if (this.unit && this.all_units.indexOf(this.unit)<0) { + env.error({ + message: "Invalid unit: '" + this.unit + "'", + index: this.index + }); + return {is: 'undefined', value: 'undefined'}; + } + + // normalize units which are not px or % + if (this.unit && this.physical_units.indexOf(this.unit)>=0) { + if (!env.ppi) { + env.error({ + message: "ppi is not set, so metric units can't be used", + index: this.index + }); + return {is: 'undefined', value: 'undefined'}; + } + // convert all units to inch + // convert inch to px using ppi + this.value = (this.value / this.densities[this.unit]) * env.ppi; + this.unit = 'px'; + } + + return this; + } + + toColor() { + return new CartoCSS.Tree.Color([this.value, this.value, this.value]); + } + + round() { + this.value = Math.round(this.value); + return this; + } + + toString() { + return this.value.toString(); + } + + operate(env, op, other) { + if (this.unit === '%' && other.unit !== '%') { + env.error({ + message: 'If two operands differ, the first must not be %', + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + if (this.unit !== '%' && other.unit === '%') { + if (op === '*' || op === '/' || op === '%') { + env.error({ + message: 'Percent values can only be added or subtracted from other values', + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + return new CartoCSS.Tree.Dimension(CartoCSS.Tree.operate(op, + this.value, this.value * other.value * 0.01), + this.unit); + } + + //here the operands are either the same (% or undefined or px), or one is undefined and the other is px + return new CartoCSS.Tree.Dimension(CartoCSS.Tree.operate(op, this.value, other.value), + this.unit || other.unit); + } +}; + +CartoCSS.Tree.Element = class Element { + constructor(value) { + this.value = value.trim(); + if (this.value[0] === '#') { + this.type = 'id'; + this.clean = this.value.replace(/^#/, ''); + } + if (this.value[0] === '.') { + this.type = 'class'; + this.clean = this.value.replace(/^\./, ''); + } + if (this.value.indexOf('*') !== -1) { + this.type = 'wildcard'; + } + } + + specificity() { + return [ + (this.type === 'id') ? 1 : 0, // a + (this.type === 'class') ? 1 : 0 // b + ]; + } + + toString() { + return this.value; + } +}; + +CartoCSS.Tree.Expression = class Expression { + + + constructor(value) { + this.is = 'expression'; + this.value = value; + } + + ev(env) { + if (this.value.length > 1) { + return new CartoCSS.Tree.Expression(this.value.map(function (e) { + return e.ev(env); + })); + } else { + return this.value[0].ev(env); + } + } + + toString(env) { + return this.value.map(function (e) { + return e.toString(env); + }).join(' '); + } +}; + +CartoCSS.Tree.Field = class Field { + + constructor(content) { + this.is = 'field'; + this.value = content || ''; + } + + toString() { + return '["' + this.value.toUpperCase() + '"]'; + } + + 'ev'() { + return this; + } +}; + +CartoCSS.Tree.Filter = class Filter { + + constructor(key, op, val, index, filename) { + this.ops = { + '<': [' < ', 'numeric'], + '>': [' > ', 'numeric'], + '=': [' = ', 'both'], + '!=': [' != ', 'both'], + '<=': [' <= ', 'numeric'], + '>=': [' >= ', 'numeric'], + '=~': ['.match(', 'string', ')'] + }; + + this.key = key; + this.op = op; + this.val = val; + this.index = index; + this.filename = filename; + + this.id = this.key + this.op + this.val; + } + + ev(env) { + this.key = this.key.ev(env); + this.val = this.val.ev(env); + return this; + } + + toString() { + return '[' + this.id + ']'; + } +}; + +CartoCSS.Tree.Filterset = class Filterset { + constructor() { + this.filters = {}; + } + + toJS(env) { + function eachFilter(filter) { + var op = filter.op; + if (op === "=") { + op = "=="; + } + var val = filter.val; + if (filter._val !== undefined) { + val = filter._val.toString(true); + } + + //对scale进行特殊处理,将值转换成数值 + if (filter.key && filter.key.value === 'scale') { + val = +val; + } else if (typeof val === 'string' || typeof val === 'object') { + val = "'" + val + "'"; + } + var attrs = "attributes"; + return attrs + "&&" + attrs + filter.key + "&&" + attrs + filter.key + " " + op + val; + } + var results = []; + for (var id in this.filters) { + results.push(eachFilter(this.filters[id])); + } + return results.join(' && '); + } + + toString() { + var arr = []; + for (var id in this.filters) {arr.push(this.filters[id].id);} + return arr.sort().join('\t'); + } + + ev(env) { + for (var i in this.filters) { + this.filters[i].ev(env); + } + return this; + } + + clone() { + var clone = new CartoCSS.Tree.Filterset(); + for (var id in this.filters) { + clone.filters[id] = this.filters[id]; + } + return clone; + } + + cloneWith(other) { + var additions = []; + for (var id in other.filters) { + var status = this.addable(other.filters[id]); + // status is true, false or null. if it's null we don't fail this + // clone nor do we add the filter. + if (status === false) { + return false; + } + if (status === true) { + // Adding the filter will override another value. + additions.push(other.filters[id]); + } + } + + // Adding the other filters doesn't make this filterset invalid, but it + // doesn't add anything to it either. + if (!additions.length) { + return null; + } + + // We can successfully add all filters. Now clone the filterset and add the + // new rules. + var clone = new CartoCSS.Tree.Filterset(); + + // We can add the rules that are already present without going through the + // add function as a Filterset is always in it's simplest canonical form. + for (id in this.filters) { + clone.filters[id] = this.filters[id]; + } + + // Only add new filters that actually change the filter. + while (id = additions.shift()) { + clone.add(id); + } + + return clone; + } + + addable(filter) { + var key = filter.key.toString(), + value = filter.val.toString(); + + if (value.match(/^[0-9]+(\.[0-9]*)?_match/)) {value = parseFloat(value);} + + switch (filter.op) { + case '=': + // if there is already foo= and we're adding foo= + if (this.filters[key + '='] !== undefined) { + if (this.filters[key + '='].val.toString() != value) { + return false; + } else { + return null; + } + } + if (this.filters[key + '!=' + value] !== undefined) {return false;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return false;} + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return false;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) {return false;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) {return false;} + return true; + + case '=~': + return true; + + case '!=': + if (this.filters[key + '='] !== undefined) {return (this.filters[key + '='].val === value) ? false : null;} + if (this.filters[key + '!=' + value] !== undefined) {return null;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return null;} + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return null;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) {return null;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) {return null;} + return true; + + case '>': + if (key + '=' in this.filters) { + if (this.filters[key + '='].val <= value) { + return false; + } else { + return null; + } + } + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return false;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val <= value) {return false;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return null;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) {return null;} + return true; + + case '>=': + if (this.filters[key + '='] !== undefined) {return (this.filters[key + '='].val < value) ? false : null;} + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return false;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) {return false;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return null;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val >= value) {return null;} + return true; + + case '<': + if (this.filters[key + '='] !== undefined) {return (this.filters[key + '='].val >= value) ? false : null;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return false;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val >= value) {return false;} + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return null;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) {return null;} + return true; + + case '<=': + if (this.filters[key + '='] !== undefined) {return (this.filters[key + '='].val > value) ? false : null;} + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) {return false;} + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) {return false;} + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) {return null;} + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val <= value) {return null;} + return true; + + default: + break; + } + } + + conflict(filter) { + var key = filter.key.toString(), + value = filter.val.toString(); + + if (!isNaN(parseFloat(value))) {value = parseFloat(value);} + + // if (a=b) && (a=c) + // if (a=b) && (a!=b) + // or (a!=b) && (a=b) + if ((filter.op === '=' && this.filters[key + '='] !== undefined && + value != this.filters[key + '='].val.toString()) || + (filter.op === '!=' && this.filters[key + '='] !== undefined && + value == this.filters[key + '='].val.toString()) || + (filter.op === '=' && this.filters[key + '!='] !== undefined && + value === this.filters[key + '!='].val.toString())) { + return filter.toString() + ' added to ' + this.toString() + ' produces an invalid filter'; + } + + return false; + } + + add(filter, env) { + var key = filter.key.toString(), + op = filter.op, + conflict = this.conflict(filter), + numval; + if (conflict) {return conflict;} + + if (op === '=') { + for (var i in this.filters) { + if (this.filters[i].key === key) {delete this.filters[i];} + } + this.filters[key + '='] = filter; + } else if (op === '!=') { + this.filters[key + '!=' + filter.val] = filter; + } else if (op === '=~') { + this.filters[key + '=~' + filter.val] = filter; + } else if (op === '>') { + // If there are other filters that are also > + // but are less than this one, they don't matter, so + // remove them. + for (var j in this.filters) { + if (this.filters[j].key === key && this.filters[j].val <= filter.val) { + delete this.filters[j]; + } + } + this.filters[key + '>'] = filter; + } else if (op === '>=') { + for (var k in this.filters) { + numval = (+this.filters[k].val.toString()); + if (this.filters[k].key === key && numval < filter.val) { + delete this.filters[k]; + } + } + if (this.filters[key + '!=' + filter.val] !== undefined) { + delete this.filters[key + '!=' + filter.val]; + filter.op = '>'; + this.filters[key + '>'] = filter; + } else { + this.filters[key + '>='] = filter; + } + } else if (op === '<') { + for (var l in this.filters) { + numval = (+this.filters[l].val.toString()); + if (this.filters[l].key === key && numval >= filter.val) { + delete this.filters[l]; + } + } + this.filters[key + '<'] = filter; + } else if (op === '<=') { + for (var m in this.filters) { + numval = (+this.filters[m].val.toString()); + if (this.filters[m].key === key && numval > filter.val) { + delete this.filters[m]; + } + } + if (this.filters[key + '!=' + filter.val] !== undefined) { + delete this.filters[key + '!=' + filter.val]; + filter.op = '<'; + this.filters[key + '<'] = filter; + } else { + this.filters[key + '<='] = filter; + } + } + } +}; + +CartoCSS.Tree.Fontset = class Fontset { + constructor(env, fonts) { + this.fonts = fonts; + this.name = 'fontset-' + env.effects.length; + } +}; +CartoCSS.Tree.Invalid = class Invalid { + + constructor(chunk, index, message) { + this.is = 'invalid'; + this.chunk = chunk; + this.index = index; + this.type = 'syntax'; + this.message = message || "Invalid code: " + this.chunk; + } + + ev(env) { + env.error({ + chunk: this.chunk, + index: this.index, + type: 'syntax', + message: this.message || "Invalid code: " + this.chunk + }); + return { + is: 'undefined' + }; + } +}; + +CartoCSS.Tree.Keyword = class Keyword { + ev() { + return this; + } + + constructor(value) { + this.value = value; + var special = { + 'transparent': 'color', + 'true': 'boolean', + 'false': 'boolean' + }; + this.is = special[value] ? special[value] : 'keyword'; + } + + toString() { + return this.value; + } +}; + +/*Layer:class Invalid ),*/ + +CartoCSS.Tree.Literal = class Literal { + constructor(content) { + this.value = content || ''; + this.is = 'field'; + } + + toString() { + return this.value; + } + + 'ev'() { + return this; + } +}; + +CartoCSS.Tree.Operation = class Operation { + + constructor(op, operands, index) { + this.is = 'operation'; + this.op = op.trim(); + this.operands = operands; + this.index = index; + } + + ev(env) { + var a = this.operands[0].ev(env), + b = this.operands[1].ev(env), + temp; + + if (a.is === 'undefined' || b.is === 'undefined') { + return { + is: 'undefined', + value: 'undefined' + }; + } + + if (a instanceof CartoCSS.Tree.Dimension && b instanceof CartoCSS.Tree.Color) { + if (this.op === '*' || this.op === '+') { + temp = b; + b = a; + a = temp; + } else { + env.error({ + name: "OperationError", + message: "Can't substract or divide a color from a number", + index: this.index + }); + } + } + + // Only concatenate plain strings, because this is easily + // pre-processed + if (a instanceof CartoCSS.Tree.Quoted && b instanceof CartoCSS.Tree.Quoted && this.op !== '+') { + env.error({ + message: "Can't subtract, divide, or multiply strings.", + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + // Fields, literals, dimensions, and quoted strings can be combined. + if (a instanceof CartoCSS.Tree.Field || b instanceof CartoCSS.Tree.Field || + a instanceof CartoCSS.Tree.Literal || b instanceof CartoCSS.Tree.Literal) { + if (a.is === 'color' || b.is === 'color') { + env.error({ + message: "Can't subtract, divide, or multiply colors in expressions.", + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } else { + return new CartoCSS.Tree.Literal(a.ev(env).toString(true) + this.op + b.ev(env).toString(true)); + } + } + + if (a.operate === undefined) { + env.error({ + message: 'Cannot do math with type ' + a.is + '.', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + return a.operate(env, this.op, b); + } +}; + +CartoCSS.Tree.Quoted = class Quoted { + + constructor(content) { + this.is = 'string'; + this.value = content || ''; + } + + toString(quotes) { + var escapedValue = this.value + .replace(/&/g, '&') + var xmlvalue = escapedValue + .replace(/\'/g, '\\\'') + .replace(/\"/g, '"') + .replace(//g, '>'); + return (quotes === true) ? "'" + xmlvalue + "'" : escapedValue; + } + + ev() { + return this; + } + + operate(env, op, other) { + return new CartoCSS.Tree.Quoted(CartoCSS.Tree.operate(op, this.toString(), other.toString(this.contains_field))); + } +}; + +CartoCSS.Tree.Reference = { + _validateValue: { + 'font': function (env, value) { + if (env.validation_data && env.validation_data.fonts) { + return env.validation_data.fonts.indexOf(value) != -1; + } else { + return true; + } + } + }, + setData: function (data) { + this.data = data; + this.selector_cache = generateSelectorCache(data); + this.mapnikFunctions = generateMapnikFunctions(data); + this.required_cache = generateRequiredProperties(data); + + function generateSelectorCache(data) { + var index = {}; + for (var i in data.symbolizers) { + for (var j in data.symbolizers[i]) { + if (data.symbolizers[i][j].hasOwnProperty('css')) { + index[data.symbolizers[i][j].css] = [data.symbolizers[i][j], i, j]; + } + } + } + return index; + } + + function generateMapnikFunctions(data) { + var functions = {}; + for (var i in data.symbolizers) { + for (var j in data.symbolizers[i]) { + if (data.symbolizers[i][j].type === 'functions') { + for (var k = 0; k < data.symbolizers[i][j].functions.length; k++) { + var fn = data.symbolizers[i][j].functions[k]; + functions[fn[0]] = fn[1]; + } + } + } + } + return functions; + } + + function generateRequiredProperties(data) { + var cache = {}; + for (var symbolizer_name in data.symbolizers) { + cache[symbolizer_name] = []; + for (var j in data.symbolizers[symbolizer_name]) { + if (data.symbolizers[symbolizer_name][j].required) { + cache[symbolizer_name].push(data.symbolizers[symbolizer_name][j].css); + } + } + } + return cache; + } + }, + setVersion: function (version) { + if (CartoCSS.mapnik_reference.version.hasOwnProperty(version)) { + this.setData(CartoCSS.mapnik_reference.version[version]); + return true; + } + return false; + }, + selectorData: function (selector, i) { + if (this.selector_cache && this.selector_cache[selector]) {return this.selector_cache[selector][i];} + }, + validSelector: function (selector) { + return !!this.selector_cache[selector]; + }, + selectorName: function (selector) { + return this.selectorData(selector, 2); + }, + selector: function (selector) { + return this.selectorData(selector, 0); + }, + symbolizer: function (selector) { + return this.selectorData(selector, 1); + }, + requiredProperties: function (symbolizer_name, rules) { + var req = this.required_cache[symbolizer_name]; + for (var i in req) { + if (!(req[i] in rules)) { + return 'Property ' + req[i] + ' required for defining ' + + symbolizer_name + ' styles.'; + } + } + }, + isFont: function (selector) { + return this.selector(selector).validate === 'font'; + }, + editDistance: function (a, b) { + if (a.length === 0) {return b.length;} + if (b.length === 0) {return a.length;} + var matrix = []; + for (var i = 0; i <= b.length; i++) { + matrix[i] = [i]; + } + for (var j = 0; j <= a.length; j++) { + matrix[0][j] = j; + } + for (i = 1; i <= b.length; i++) { + for (j = 1; j <= a.length; j++) { + if (b.charAt(i - 1) === a.charAt(j - 1)) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution + Math.min(matrix[i][j - 1] + 1, // insertion + matrix[i - 1][j] + 1)); // deletion + } + } + } + return matrix[b.length][a.length]; + }, + validValue: function (env, selector, value) { + function validateFunctions(value, selector) { + if (value.value[0].is === 'string') {return true;} + for (var i in value.value) { + for (var j in value.value[i].value) { + if (value.value[i].value[j].is !== 'call') {return false;} + var f = find(this.selector(selector).functions, function (x) {//NOSONAR + return x[0] === value.value[i].value[j].name; + }); + if (!(f && f[1] === -1)) { + // This filter is unknown or given an incorrect number of arguments + if (!f || f[1] !== value.value[i].value[j].args.length) {return false;} + } + } + } + return true; + } + + function validateKeyword(value, selector) { + if (typeof this.selector(selector).type === 'object') { + return this.selector(selector).type + .indexOf(value.value[0].value) !== -1; + } else { + // allow unquoted keywords as strings + return this.selector(selector).type === 'string'; + } + } + + var i; + if (!this.selector(selector)) { + return false; + } else if (value.value[0].is === 'keyword') { + return validateKeyword(value, selector); + } else if (value.value[0].is === 'undefined') { + // caught earlier in the chain - ignore here so that + // error is not overridden + return true; + } else if (this.selector(selector).type === 'numbers') { + for (i in value.value) { + if (value.value[i].is !== 'float') { + return false; + } + } + return true; + } else if (this.selector(selector).type === 'tags') { + if (!value.value) {return false;} + if (!value.value[0].value) { + return value.value[0].is === 'tag'; + } + for (i = 0; i < value.value[0].value.length; i++) { + if (value.value[0].value[i].is !== 'tag') {return false;} + } + return true; + } else if (this.selector(selector).type == 'functions') { + // For backwards compatibility, you can specify a string for `functions`-compatible + // values, though they will not be validated. + return validateFunctions(value, selector); + } else if (this.selector(selector).type === 'expression') { + return true; + } else if (this.selector(selector).type === 'unsigned') { + if (value.value[0].is === 'float') { + value.value[0].round(); + return true; + } else { + return false; + } + } else { + if (this.selector(selector).validate) { + var valid = false; + for (i = 0; i < value.value.length; i++) { + if (this.selector(selector).type === value.value[i].is && + this._validateValue[this.selector(selector).validate](env, value.value[i].value)) { + return true; + } + } + return valid; + } else { + return this.selector(selector).type === value.value[0].is; + } + } + } +}; +CartoCSS.Tree.Reference.setVersion("latest"); + +CartoCSS.Tree.Rule = class Rule { + + constructor(name, value, index, filename) { + this.is = 'rule'; + var parts = name.split('/'); + this.name = parts.pop(); + this.instance = parts.length ? parts[0] : '__default__'; + this.value = (value instanceof CartoCSS.Tree.Value) ? + value : new CartoCSS.Tree.Value([value]); + this.index = index; + this.symbolizer = CartoCSS.Tree.Reference.symbolizer(this.name); + this.filename = filename; + this.variable = (name.charAt(0) === '@'); + } + + clone() { + var clone = Object.create(CartoCSS.Tree.Rule.prototype); + clone.name = this.name; + clone.value = this.value; + clone.index = this.index; + clone.instance = this.instance; + clone.symbolizer = this.symbolizer; + clone.filename = this.filename; + clone.variable = this.variable; + return clone; + } + + updateID() { + return this.id = this.zoom + '#' + this.instance + '#' + this.name; + } + + toString() { + return '[' + CartoCSS.Tree.Zoom.toString(this.zoom) + '] ' + this.name + ': ' + this.value; + } + ev(context) { + return new CartoCSS.Tree.Rule(this.name, + this.value.ev(context), + this.index, + this.filename); + } +}; + +CartoCSS.Tree.Ruleset = class Ruleset { + + constructor(selectors, rules) { + this.is = 'ruleset'; + this.selectors = selectors; + this.rules = rules; + // static cache of find() function + this._lookups = {}; + } + + ev(env) { + var i, + rule, + ruleset = new CartoCSS.Tree.Ruleset(this.selectors, this.rules.slice(0)); + ruleset.root = this.root; + + // push the current ruleset to the frames stack + env.frames.unshift(ruleset); + + // Evaluate everything else + for (i = 0, rule; i < ruleset.rules.length; i++) { + rule = ruleset.rules[i]; + ruleset.rules[i] = rule.ev ? rule.ev(env) : rule; + } + + // Pop the stack + env.frames.shift(); + + return ruleset; + } + + match(args) { + return !args || args.length === 0; + } + + variables() { + if (this._variables) { + return this._variables; + } else { + return this._variables = this.rules.reduce(function (hash, r) { + if (r instanceof CartoCSS.Tree.Rule && r.variable === true) { + hash[r.name] = r; + } + return hash; + }, {}); + } + } + + variable(name) { + return this.variables()[name]; + } + + rulesets() { + if (this._rulesets) { + return this._rulesets; + } else { + return this._rulesets = this.rules.filter(function (r) { + return (r instanceof CartoCSS.Tree.Ruleset); + }); + } + } + + find(selector, self) { + self = self || this; + var rules = [], match, + key = selector.toString(); + + if (key in this._lookups) { + return this._lookups[key]; + } + + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + if (match) { + if (selector.elements.length > 1) { + Array.prototype.push.apply(rules, rule.find( + new CartoCSS.Tree.Selector(null, null, selector.elements.slice(1)), self)); + } else { + rules.push(rule); + } + break; + } + } + } + }); + return this._lookups[key] = rules; + } + + // Zooms can use variables. This replaces CartoCSS.Tree.Zoom objects on selectors + // with simple bit-arrays that we can compare easily. + evZooms(env) { + for (var i = 0; i < this.selectors.length; i++) { + var zval = CartoCSS.Tree.Zoom.all; + for (var z = 0; z < this.selectors[i].zoom.length; z++) { + zval = this.selectors[i].zoom[z].ev(env).zoom; + } + this.selectors[i].zoom = zval; + } + } + + flatten(result, parents, env) { + var selectors = [], i, j; + if (this.selectors.length === 0) { + env.frames = env.frames.concat(this.rules); + } + // evaluate zoom variables on this object. + this.evZooms(env); + for (i = 0; i < this.selectors.length; i++) { + var child = this.selectors[i]; + + if (!child.filters) { + // This is an invalid filterset. + continue; + } + + if (parents.length) { + for (j = 0; j < parents.length; j++) { + var parent = parents[j]; + + var mergedFilters = parent.filters.cloneWith(child.filters); + if (mergedFilters === null) { + // Filters could be added, but they didn't change the + // filters. This means that we only have to clone when + // the zoom levels or the attachment is different too. + if (parent.zoom === child.zoom && + parent.attachment === child.attachment && + parent.elements.join() === child.elements.join()) { + selectors.push(parent); + continue; + } else { + mergedFilters = parent.filters; + } + } else if (!mergedFilters) { + // The merged filters are invalid, that means we don't + // have to clone. + continue; + } + + var clone = Object.create(CartoCSS.Tree.Selector.prototype); + clone.filters = mergedFilters; + clone.zoom = child.zoom; + clone.elements = parent.elements.concat(child.elements); + if (parent.attachment && child.attachment) { + clone.attachment = parent.attachment + '/' + child.attachment; + } else {clone.attachment = child.attachment || parent.attachment;} + clone.conditions = parent.conditions + child.conditions; + clone.index = child.index; + selectors.push(clone); + } + } else { + selectors.push(child); + } + } + + var rules = []; + for (i = 0; i < this.rules.length; i++) { + var rule = this.rules[i]; + + // Recursively flatten any nested rulesets + if (rule instanceof CartoCSS.Tree.Ruleset) { + rule.flatten(result, selectors, env); + } else if (rule instanceof CartoCSS.Tree.Rule) { + rules.push(rule); + } else if (rule instanceof CartoCSS.Tree.Invalid) { + env.error(rule); + } + } + + var index = rules.length ? rules[0].index : false; + for (i = 0; i < selectors.length; i++) { + // For specificity sort, use the position of the first rule to allow + // defining attachments that are under current element as a descendant + // selector. + if (index !== false) { + selectors[i].index = index; + } + result.push(new CartoCSS.Tree.Definition(selectors[i], rules.slice())); + } + + return result; + } +}; + +CartoCSS.Tree.Selector = class Selector { + constructor(filters, zoom, elements, attachment, conditions, index) { + this.elements = elements || []; + this.attachment = attachment; + this.filters = filters || {}; + this.zoom = typeof zoom !== 'undefined' ? zoom : CartoCSS.Tree.Zoom.all; + this.conditions = conditions; + this.index = index; + } + + specificity() { + return this.elements.reduce(function (memo, e) { + var spec = e.specificity(); + memo[0] += spec[0]; + memo[1] += spec[1]; + return memo; + }, [0, 0, this.conditions, this.index]); + } +}; + +/*style:class Invalid ),*/ + +CartoCSS.Tree.URL = class URL { + + constructor(val, paths) { + this.is = 'uri'; + this.value = val; + this.paths = paths; + } + + toString() { + return this.value.toString(); + } + + ev(ctx) { + return new CartoCSS.Tree.URL(this.value.ev(ctx), this.paths); + } +}; + +CartoCSS.Tree.Value = class Value { + + constructor(value) { + this.is = 'value'; + this.value = value; + } + + ev(env) { + if (this.value.length === 1) { + return this.value[0].ev(env); + } else { + return new CartoCSS.Tree.Value(this.value.map(function (v) { + return v.ev(env); + })); + } + } + + toJS(env) { + //var v = this.value[0].value[0]; + var val = this.ev(env); + var v = val.toString(); + if (val.is === "color" || val.is === 'uri' || val.is === 'string' || val.is === 'keyword') { + v = "'" + v + "'"; + } else if (val.is === 'field') { + // replace [varuable] by ctx['variable'] + v = v.replace(/\[(.*)\]/g, "attributes['\_match1']") + } else if (val.value && typeof val.value === "object") { + v = "[" + v + "]"; + } + + return "_value = " + v + ";"; + } + + toString(env, selector, sep, format) { + return this.value.map(function (e) { + return e.toString(env, format); + }).join(sep || ', '); + } + + clone() { + var obj = Object.create(CartoCSS.Tree.Value.prototype); + if (Array.isArray(obj)) {obj.value = this.value.slice();} else {obj.value = this.value;} + obj.is = this.is; + return obj; + } +}; + +CartoCSS.Tree.Variable = class Variable { + constructor(name, index, filename) { + this.is = 'variable'; + this.name = name; + this.index = index; + this.filename = filename; + } + + toString() { + return this.name; + } + + ev(env) { + if (this._css) {return this._css;} + + var thisframe = env.frames.filter(function (f) { + return f.name === this.name; + }.bind(this)); + if (thisframe.length) { + return thisframe[0].value.ev(env); + } else { + env.error({ + message: 'variable ' + this.name + ' is undefined', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + } +}; + +CartoCSS.Tree.Zoom = class Zoom { + constructor(op, value, index) { + this.op = op; + this.value = value; + this.index = index; + } + + setZoom(zoom) { + this.zoom = zoom; + return this; + } + + ev(env) { + var value = parseInt(this.value.ev(env).toString(), 10); + + + if (value > CartoCSS.Tree.Zoom.maxZoom || value < 0) { + env.error({ + message: 'Only zoom levels between 0 and ' + + CartoCSS.Tree.Zoom.maxZoom + ' supported.', + index: this.index + }); + } + + switch (this.op) { + case '=': + this.zoom = "zoom && zoom === " + value; + return this; + case '>': + this.zoom = "zoom && zoom > " + value; + break; + case '>=': + this.zoom = "zoom && zoom >= " + value; + break; + case '<': + this.zoom = "zoom && zoom < " + value; + break; + case '<=': + this.zoom = "zoom && zoom <= " + value; + break; + default: + break; + } + /* + for (var i = 0; i <= CartoCSS.Tree.Zoom.maxZoom; i++) { + if (i >= start && i <= end) { + zoom |= (1 << i); + } + } + this.zoom = zoom; + this.zoom=value+this.op+"zoom";*/ + return this; + } + + toString() { + var str = ''; + for (var i = 0; i <= CartoCSS.Tree.Zoom.maxZoom; i++) { + str += (this.zoom & (1 << i)) ? 'X' : '.'; + } + return str; + } +}; + +// Covers all zoomlevels from 0 to 22 +CartoCSS.Tree.Zoom.all = 23; + +CartoCSS.Tree.Zoom.maxZoom = 22; + +CartoCSS.Tree.Zoom.ranges = { + 0: 1000000000, + 1: 500000000, + 2: 200000000, + 3: 100000000, + 4: 50000000, + 5: 25000000, + 6: 12500000, + 7: 6500000, + 8: 3000000, + 9: 1500000, + 10: 750000, + 11: 400000, + 12: 200000, + 13: 100000, + 14: 50000, + 15: 25000, + 16: 12500, + 17: 5000, + 18: 2500, + 19: 1500, + 20: 750, + 21: 500, + 22: 250, + 23: 100 +}; + +;// CONCATENATED MODULE: ./src/common/style/ThemeStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeStyle + * @deprecatedclass SuperMap.ThemeStyle + * @classdesc 客户端专题图风格类。 + * @category Visualization Theme + * @param {Object} options - 可选参数。 + * @param {boolean} [options.fill=true] - 是否填充,不需要填充则设置为 false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + * @param {string} [options.fillColor='#000000'] - 十六进制填充颜色。 + * @param {number} [options.fillOpacity=1] - 填充不透明度。取值范围[0, 1]。 + * @param {boolean} [options.stroke=false] - 是否描边,不需要描边则设置为false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + * @param {string} [options.strokeColor='#000000'] - 十六进制描边颜色。 + * @param {number} [options.strokeOpacity=1] - 描边的不透明度。取值范围[0, 1]。 + * @param {number} [options.strokeWidth=1] - 线宽度/描边宽度。 + * @param {string} [options.strokeLinecap='butt'] - 线帽样式。strokeLinecap 有三种类型 “butt", "round", "square"。 + * @param {string} [options.strokeLineJoin='iter'] - 线段连接样式。strokeLineJoin 有三种类型 “miter", "round", "bevel"。 + * @param {string} [options.strokeDashstyle='solid'] - 虚线类型。strokeDashstyle 有八种类型 “dot",“dash",“dashdot",“longdash",“longdashdot",“solid", "dashed", "dotted"。solid 表示实线。 + * @param {number} [options.pointRadius=6] - 点半径,单位为像素。 + * @param {number} [options.shadowBlur=0] - 阴影模糊度,(大于 0 有效;)。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + * @param {string} [options.shadowColor='#000000'] - 阴影颜色。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + * @param {number} [options.shadowOffsetX=0] - 阴影 X 方向偏移值。 + * @param {number} [options.shadowOffsetY=0] - 阴影 Y 方向偏移值。 + * @param {string} options.label - 专题要素附加文本标签内容。 + * @param {string} [options.fontColor] - 附加文本字体颜色。 + * @param {number} [options.fontSize=12] - 附加文本字体大小,单位是像素。 + * @param {string} [options.fontStyle='normal'] - 附加文本字体样式。可设值:"normal", "italic", "oblique"。 + * @param {string} [options.fontVariant='normal'] - 附加文本字体变体。可设值:"normal", "small-caps"。 + * @param {string} [options.fontWeight='normal'] - 附加文本字体粗细。可设值:"normal", "bold", "bolder", "lighter"。 + * @param {string} [options.fontFamily='arial,sans-serif'] - 附加文本字体系列。fontFamily 值是字体族名称或/及类族名称的一个优先表,每个值逗号分割, + * 浏览器会使用它可识别的第一个可以使用具体的字体名称("times"、"courier"、"arial")或字体系列名称 + * ("serif"、"sans-serif"、"cursive"、"fantasy"、"monospace")。 + * @param {string} [options.labelPosition='top'] - 附加文本位置, 可以是 'inside', 'left', 'right', 'top', 'bottom'。 + * @param {string} [options.labelAlign='center'] - 附加文本水平对齐。可以是 'left', 'right', 'center'。 + * @param {string} [options.labelBaseline='middle'] - 附加文本垂直对齐。 可以是 'top', 'bottom', 'middle' 。 + * @param {number} [options.labelXOffset=0] - 附加文本在x轴方向的偏移量。 + * @param {number} [options.labelYOffset=0] - 附加文本在y轴方向的偏移量。 + * @usage + */ +class ThemeStyle { + + + constructor(options) { + options = options || {}; + /** + * @member {boolean} [ThemeStyle.prototype.fill=true] + * @description 是否填充,不需要填充则设置为 false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + */ + this.fill = true; + /** + * @member {string} [ThemeStyle.prototype.fillColor="#000000"] + * @description 十六进制填充颜色。 + */ + this.fillColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.fillOpacity=1] + * @description 填充不透明度。取值范围[0, 1]。 + */ + this.fillOpacity = 1; + /** + * @member {boolean} [ThemeStyle.prototype.stroke=false] + * @description 是否描边,不需要描边则设置为false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + */ + this.stroke = false; + /** + * @member {string} [ThemeStyle.prototype.strokeColor="#000000"] + * @description 十六进制描边颜色。 + */ + this.strokeColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.strokeOpacity=1] + * @description 描边的不透明度。取值范围[0, 1]。 + */ + this.strokeOpacity = 1; + /** + * @member {number} [ThemeStyle.prototype.strokeWidth=1] + * @description 线宽度/描边宽度。 + */ + this.strokeWidth = 1; + /** + * @member {string} [ThemeStyle.prototype.strokeLinecap="butt"] + * @description 线帽样式;strokeLinecap 有三种类型 “butt", "round", "square" 。 + */ + this.strokeLinecap = "butt"; + /** + * @member {string} [ThemeStyle.prototype.strokeLineJoin="miter"] + * @description 线段连接样式;strokeLineJoin 有三种类型 “miter", "round", "bevel"。 + */ + this.strokeLineJoin = "miter"; + /** + * @member {string} [ThemeStyle.prototype.strokeDashstyle="solid"] + * @description 虚线类型; strokeDashstyle 有八种类型 “dot",“dash",“dashdot",“longdash",“longdashdot",“solid", "dashed", "dotted"; + * solid 表示实线。 + */ + this.strokeDashstyle = "solid"; + /** + * @member {number} [ThemeStyle.prototype.pointRadius=6] + * @description 点半径。单位为像素。 + */ + this.pointRadius = 6; + /** + * @member {number} [ThemeStyle.prototype.shadowBlur=0] + * @description 阴影模糊度,(大于 0 有效)。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + */ + this.shadowBlur = 0; + /** + * @member {string} [ThemeStyle.prototype.shadowColor='#000000'] + * @description 阴影颜色。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + */ + this.shadowColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.shadowOffsetX=0] + * @description 阴影 X 方向偏移值。 + */ + this.shadowOffsetX = 0; + /** + * @member {number} ThemeStyle.prototype.shadowOffsetY + * @description Y 方向偏移值。 + */ + this.shadowOffsetY = 0; + /** + * @member {string} [ThemeStyle.prototype.label] + * @description 专题要素附加文本标签内容。 + */ + this.label = ""; + /** + * @member {boolean} [ThemeStyle.prototype.labelRect=false] + * @description 是否显示文本标签矩形背景。 + */ + this.labelRect = false; + /** + * @member {string} [ThemeStyle.prototype.fontColor] + * @description 附加文本字体颜色。 + */ + this.fontColor = ""; + /** + * @member {number} [ThemeStyle.prototype.fontSize=12] + * @description 附加文本字体大小,单位是像素。 + */ + this.fontSize = 12; + /** + * @member {string} [ThemeStyle.prototype.fontStyle="normal"] + * @description 附加文本字体样式。可设值:"normal", "italic", "oblique"。 + */ + this.fontStyle = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontVariant="normal"] + * @description 附加文本字体变体。可设值:"normal", "small-caps"。 + */ + this.fontVariant = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontWeight="normal"] + * @description 附加文本字体粗细。可设值:"normal", "bold", "bolder", "lighter"。 + */ + this.fontWeight = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontFamily="arial,sans-serif"] + * @description 附加文本字体系列。fontFamily 值是字体族名称或/及类族名称的一个优先表,每个值逗号分割,浏览器会使用它可识别的第一个 + * 可以使用具体的字体名称("times"、"courier"、"arial")或字体系列名称("serif"、"sans-serif"、"cursive"、"fantasy"、"monospace")。 + */ + this.fontFamily = "arial,sans-serif"; + /** + * @member {string} [ThemeStyle.prototype.labelPosition='top'] + * @description 附加文本位置, 可以是 'inside', 'left', 'right', 'top', 'bottom'。 + */ + this.labelPosition = "top"; + /** + * @member {string} [ThemeStyle.prototype.labelAlign='center'] + * @description 附加文本水平对齐。可以是 'left', 'right', 'center'。 + */ + this.labelAlign = "center"; + /** + * @member {string} [ThemeStyle.prototype.labelBaseline='middle'] + * @description 附加文本垂直对齐。 可以是 'top', 'bottom', 'middle'。 + */ + this.labelBaseline = "middle"; + /** + * @member {number} [ThemeStyle.prototype.labelXOffset=0] + * @description 附加文本在 X 轴方向的偏移量。 + */ + this.labelXOffset = 0; + /** + * @member {number} [ThemeStyle.prototype.labelYOffset=0] + * @description 附加文本在 Y 轴方向的偏移量。 + */ + this.labelYOffset = 0; + + Util.extend(this, options); + } +} + + +;// CONCATENATED MODULE: ./src/common/style/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +;// CONCATENATED MODULE: ./src/common/overlay/feature/ShapeParameters.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @class ShapeParameters + * @aliasclass Feature.ShapeParameters + * @deprecatedclass SuperMap.Feature.ShapeParameters + * @category Visualization Theme + * @classdesc 图形参数基类 + * @usage + */ +class ShapeParameters { + constructor() { + /** + * @member {Array.} [ShapeParameters.prototype.refOriginalPosition=[0,0]] + * @description 图形参考原点位置,图形的参考中心位置。 + * refOriginalPosition 是长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + * refOriginalPosition 表示图形的参考中心,通常情况下,图形是使用 canvas 的原点位置作为位置参考, + * 但 refOriginalPosition 可以改变图形的参考位置,例如: refOriginalPosition = [80, 80], + * 图形圆的 style.x = 20, style.y = 20,那么圆在 canvas 中的实际位置是 [100, 100]。 + * 图形(Shape) 的所有位置相关属性都是以 refOriginalPosition 为参考中心, + * 也就是说图形的所有位置信息在 canvas 中都是以 refOriginalPosition 为参考的相对位置,只有 + * refOriginalPosition 的值为 [0, 0] 时,图形的位置信息才是 canvas 绝对位置。 + * 图形的位置信息通常有:style.pointList,style.x,style.y。 + */ + this.refOriginalPosition = [0, 0]; + + /** + * @member {string} ShapeParameters.prototype.refDataID + * @description 图形所关联数据的 ID(<{@link FeatureVector}> 的 id)。 + */ + this.refDataID = null; + + /** + * @member {boolean} ShapeParameters.prototype.isHoverByRefDataID + * @description 是否根据 refDataID 进行高亮。用于同时高亮所有 refDataID 相同的图形。 + */ + this.isHoverByRefDataID = false; + + /** + * @member {string} ShapeParameters.prototype.refDataHoverGroup + * @description 高亮图形组的组名。此属性在 refDataID 有效且 isHoverByRefDataID 为 true 时生效。 + * 一旦设置此属性,且属性值有效,只有关联同一个数据的图形且此属性相同的图形才会高亮。 + */ + this.refDataHoverGroup = null; + + /** + * @member {Object} ShapeParameters.prototype.dataInfo + * @description 图形携带的附加数据。 + */ + this.dataInfo = null; + + /** + * @member {boolean} ShapeParameters.prototype.clickable + * @description 是否可点击。 + */ + this.clickable = true; + + /** + * @member {boolean} ShapeParameters.prototype.hoverable + * @description 是否可点击。 + */ + this.hoverable = true; + + /** + * @member {Object} ShapeParameters.prototype.style + * @description 图形样式对象,可设样式属性在子类中确定。 + */ + this.style = null; + + /** + * @member {Object} ShapeParameters.prototype.highlightStyle + * @description 高亮样式对象,可设样式属性与 style 的可设样式属性相同。 + */ + this.highlightStyle = {}; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters"; + } + + + /** + * @function ShapeParameters.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.refOriginalPosition = null; + this.refDataID = null; + this.isHoverByRefDataID = null; + this.refDataHoverGroup = null; + this.dataInfo = null; + this.clickable = null; + this.hoverable = null; + this.style = null; + this.highlightStyle = null; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Point.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersPoint + * @aliasclass Feature.ShapeParameters.Point + * @deprecatedclass SuperMap.Feature.ShapeParameters.Point + * @category Visualization Theme + * @classdesc 点参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 点 x 坐标。 + * @param {number} y - 点 y 坐标。 + * @usage + */ + +class Point_Point extends ShapeParameters { + constructor(x, y) { + super(x, y); + /** + * @member {number} ShapeParametersPoint.prototype.x + * @description 点 x 坐标。 + */ + this.x = !isNaN(x) ? x : 0; + + /** + * @member {number} ShapeParametersPoint.prototype.y + * @description 点 y 坐标。 + */ + this.y = !isNaN(y) ? y : 0; + + /** + * @member {number} ShapeParametersPoint.prototype.r + * @description 点的半径。 + */ + this.r = 6; + + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Point"; + } + + + /** + * @function ShapeParametersPoint.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.r = null; + + super.destroy(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Line.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersLine + * @aliasclass Feature.ShapeParameters.Line + * @deprecatedclass SuperMap.Feature.ShapeParameters.Line + * @category Visualization Theme + * @classdesc 线参数对象。 + * @extends {ShapeParameters} + * @param {Array} pointList - 线要素节点数组,二维数组。 + * @usage + */ +class Line_Line extends ShapeParameters { + constructor(pointList) { + super(pointList); + /** + * @member {Array} ShapeParametersLine.prototype.pointList + * @description 线要素节点数组,二维数组。 + * 数组形如: + * (start code) + * [ + * [10, 20], //节点 + * [30, 40], + * [25, 30] //最后一个节点和第一个节点不必相同,绘制时自动封闭 + * ] + * (end) + */ + this.pointList = pointList; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Line"; + + } + + /** + * @function ShapeParametersLine.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.pointList = null; + super.destroy(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Polygon.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersPolygon + * @aliasclass Feature.ShapeParameters.Polygon + * @deprecatedclass SuperMap.Feature.ShapeParameters.Polygon + * @category Visualization Theme + * @classdesc 面参数对象。 + * @extends {ShapeParameters} + * @param {Array} pointList - 横坐标。 + * @usage + */ + +class Polygon_Polygon extends ShapeParameters { + constructor(pointList) { + super(pointList); + /** + * @member {Array} ShapeParametersPolygon.prototype.pointList + * @description 面要素节点数组,二维数组。 + * 数组形如: + * (start code) + * [ + * [10, 20], //节点 + * [30, 40], + * [25, 30] //最后一个节点和第一个节点不必相同,绘制时自动封闭 + * ] + * (end) + */ + this.pointList = pointList; + + /** + * @member {Array} ShapeParametersPolygon.prototype.holePolygonPointLists + * @description 岛洞面多边形顶点数组(三维数组) + */ + this.holePolygonPointLists = null; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Polygon"; + } + + /** + * @function ShapeParametersPolygon.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.pointList = null; + this.holePolygonPointLists = null; + super.destroy(); + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Rectangle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersRectangle + * @aliasclass Feature.ShapeParameters.Rectangle + * @deprecatedclass SuperMap.Feature.ShapeParameters.Rectangle + * @category Visualization Theme + * @classdesc 矩形参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 矩形 x 坐标。 + * @param {number} y - 矩形 y 坐标。 + * @param {number} width - 矩形 width 宽度。 + * @param {number} height - 矩形 height 高度。 + * @usage + */ + +class Rectangle_Rectangle extends ShapeParameters { + constructor(x, y, width, height) { + super(x, y, width, height); + /** + * @member {number} ShapeParametersRectangle.prototype.x + * @description 左上角 x 坐标。 + */ + this.x = !isNaN(x) ? x : 0; + + /** + * @member {number} ShapeParametersRectangle.prototype.y + * @description 左上角 y 坐标。 + */ + this.y = !isNaN(x) ? y : 0; + + /** + * @member {number} ShapeParametersRectangle.prototype.width + * @description 宽度。 + */ + this.width = !isNaN(width) ? width : 0; + + /** + * @member {number} ShapeParametersRectangle.prototype.height + * @description 高度。 + */ + this.height = !isNaN(height) ? height : 0; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Rectangle"; + } + + + /** + * @function ShapeParametersRectangle.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.width = null; + this.height = null; + + super.destroy(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Sector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersSector + * @aliasclass Feature.ShapeParameters.Sector + * @deprecatedclass SuperMap.Feature.ShapeParameters.Sector + * @category Visualization Theme + * @classdesc 扇形参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 圆心 x 坐标。 + * @param {number} y - 圆心 y 坐标。 + * @param {number} r - 外圆半径。 + * @param {number} startAngle - 起始角度。取值范围[0, 360)。 + * @param {number} endAngle - 结束角度。取值范围(0, 360]。 + * @param {number} [r0=0] - 内圆半径,指定后将出现内弧,同时扇边长度为'r - r0'。取值范围[0, r)。 + * @usage + */ + +class Sector extends ShapeParameters { + constructor(x, y, r, startAngle, endAngle, r0, clockWise) { + super(x, y, r, startAngle, endAngle, r0, clockWise); + /** + * @member {number} ShapeParametersSector.prototype.x + * @description 圆心 x 坐标。 + */ + this.x = !isNaN(x) ? x : 0; + + /** + * @member {number} ShapeParametersSector.prototype.Y + * @description 圆心 Y 坐标。 + */ + this.y = !isNaN(y) ? y : 0; + + /** + * @member {number} ShapeParametersSector.prototype.r + * @description 外圆半径。 + */ + this.r = !isNaN(r) ? r : 0; + + /** + * @member {number} ShapeParametersSector.prototype.startAngle + * @description 起始角度。取值范围[0, 360),默认值:null。 + */ + this.startAngle = !isNaN(startAngle) ? startAngle : 0; + + /** + * @member {number} ShapeParametersSector.prototype.endAngle + * @description 结束角度。取值范围(0, 360],默认值:null。 + */ + this.endAngle = !isNaN(endAngle) ? endAngle : 0; + + /** + * @member {number} [ShapeParametersSector.prototype.r0=0] + * @description 内圆半径,指定后将出现内弧,同时扇边长度为 r 减 r0。取值范围[0, r)。 + */ + this.r0 = !isNaN(r0) ? r0 : 0; + + /** + * @member {number} [ShapeParametersSector.prototype.clockWise=false] + * @description 是否是顺时针。默认值:false。 + */ + this.clockWise = clockWise; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Sector"; + } + + /** + * @function ShapeParametersSector.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.r = null; + this.startAngle = null; + this.endAngle = null; + this.r0 = null; + this.clockWise = null; + + super.destroy(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Label.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersLabel + * @aliasclass Feature.ShapeParameters.Label + * @deprecatedclass SuperMap.Feature.ShapeParameters.Label + * @category Visualization Theme + * @classdesc 标签参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @param {string} text - 图形中的附加文本。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ShapeParametersLabel } from '{npm}'; + * new ShapeParametersLabel(x, y, text); + * + * // 弃用的写法 + * import { Label } from '{npm}'; + * new Label(x, y, text); + * + * ``` + */ + +class Label extends ShapeParameters { + constructor(x, y, text) { + super(x, y, text); + /** + * @member {number} ShapeParametersLabel.prototype.x + * @description 标签 x 坐标。 + */ + this.x = x; + + /** + * @member {number} ShapeParametersLabel.prototype.y + * @description 标签 y 坐标。 + */ + this.y = y; + + /** + * @member {number} ShapeParametersLabel.prototype.text + * @description 标签的文本内容。 + */ + this.text = text; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Label"; + } + + + /** + * @function ShapeParametersLabel.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.text = null; + + super.destroy(); + } + + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Image.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersImage + * @aliasclass Feature.ShapeParameters.Image + * @deprecatedclass SuperMap.Feature.ShapeParameters.Image + * @category Visualization Theme + * @classdesc 图片参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 左上角横坐标。 + * @param {number} y - 左上角纵坐标。 + * @param {(string|Object)} image - 图片地址或Cavans对象。 + * @param {number} width - 绘制到画布上的宽度,默认为图片高度。 + * @param {number} height - 绘制到画布上的高度,默认为图片高度。 + * @param {number} sx - 从图片中裁剪的左上角横坐标。 + * @param {number} sy - 从图片中裁剪的左上角纵坐标。 + * @param {number} sWidth - 从图片中裁剪的宽度,默认为图片高度。 + * @param {number} sHeight - 绘制到画布上的高度,默认为图片高度。 + * @usage + */ +class Image_Image extends ShapeParameters { + constructor(x, y, image, width, height, sx, sy, sWidth, sHeight) { + super(x, y, image, width, height, sx, sy, sWidth, sHeight); + /** + * @member {number} ShapeParametersImage.prototype.x + * @description 左上角横坐标,必设参数。 + */ + this.x = x; + + /** + * @member {number} ShapeParametersImage.prototype.y + * @description 左上角纵坐标,必设参数。 + */ + this.y = y; + + /** + * @member {(string|Object)} ShapeParametersImage.prototype.image + * @description 图片地址。 + */ + this.image = image; + + /** + * @member {number} ShapeParametersImage.prototype.width + * @description 绘制到画布上的宽度,默认为图片高度。 + */ + this.width = width; + + /** + * @member {number} ShapeParametersImage.prototype.height + * @description 绘制到画布上的高度,默认为图片高度。 + */ + this.height = height; + + /** + * @member {number} ShapeParametersImage.prototype.sx + * @description 从图片中裁剪的左上角横坐标。 + */ + this.sx = sx; + + /** + * @member {number} ShapeParametersImage.prototype.sy + * @description 从图片中裁剪的左上角纵坐标。 + */ + this.sy = sy; + + /** + * @member {number} ShapeParametersImage.prototype.sWidth + * @description 从图片中裁剪的宽度,默认为图片高度。 + */ + this.sWidth = sWidth; + + /** + * @member {number} ShapeParametersImage.prototype.sHeight + * @description 绘制到画布上的高度,默认为图片高度。 + */ + this.sHeight = sHeight; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Image"; + + } + + + /** + * @function ShapeParametersImage.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.image = null; + this.width = null; + this.height = null; + this.sx = null; + this.sy = null; + this.sWidth = null; + this.sHeight = null; + super.destroy(); + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Circle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ShapeParametersCircle + * @aliasclass Feature.ShapeParameters.Circle + * @deprecatedclass SuperMap.Feature.ShapeParameters.Circle + * @classdesc 圆形参数对象。 + * @category Visualization Theme + * @extends {ShapeParameters} + * @param {number} x - 圆心 x 坐标。 + * @param {number} y - 圆心 y 坐标。 + * @param {number} r - 圆半径。 + * @usage + */ + +class Circle_Circle extends ShapeParameters { + constructor(x, y, r) { + super(x, y, r); + /** + * @member {number} ShapeParametersCircle.prototype.x + * @description 圆心 x 坐标。 + */ + this.x = !isNaN(x) ? x : 0; + + /** + * @member {number} ShapeParametersCircle.prototype.y + * @description 圆心 y 坐标。 + */ + this.y = !isNaN(y) ? y : 0; + + /** + * @member {number} ShapeParametersCircle.prototype.r + * @description 圆半径。 + */ + this.r = !isNaN(r) ? r : 0; + + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Circle"; + + } + + + /** + * @function ShapeParametersCircle.prototype.destroy + * @description 销毁对象。 + */ + destroy() { + this.x = null; + this.y = null; + this.r = null; + super.destroy(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Eventful.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @class LevelRenderer.Eventful + * @category Visualization Theme + * @classdesc 事件分发器超类,所有支持事件处理的类均是此类的子类。 + * 此类不可实例化。 + * 支持的事件: + * Symbolizer properties: + * onclick - {function} 默认值:null。 + * onmouseover - {function} 默认值:null。 + * onmouseout - {function} 默认值:null。 + * onmousemove - {function} 默认值:null。 + * onmousewheel - {function} 默认值:null。 + * onmousedown - {function} 默认值:null。 + * onmouseup - {function} 默认值:null。 + * ondragstart - {function} 默认值:null。 + * ondragend - {function} 默认值:null。 + * ondragenter - {function} 默认值:null。 + * ondragleave - {function} 默认值:null。 + * ondragover - {function} 默认值:null。 + * ondrop - {function} 默认值:null。 + * @private + */ +class Eventful { + constructor() { + /** + * @member {Object} LevelRenderer.Eventful.prototype._handlers + * @description 事件处理对象(事件分发器)。 + */ + this._handlers = {}; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Eventful"; + } + + + /** + * @function {Object} LevelRenderer.Eventful.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this._handlers = null; + } + + + /** + * @function LevelRenderer.Eventful.prototype.one + * @description 单次触发绑定,dispatch后销毁。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @param {Object} context - context。 + * @returns {LevelRenderer.Eventful} this + */ + one(event, handler, context) { + var _h = this._handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + } + + + /** + * @function LevelRenderer.Eventful.prototype.bind + * @description 绑定事件。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @param {Object} context - context。 + * @returns {LevelRenderer.Eventful} this + */ + bind(event, handler, context) { + var _h = this._handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + } + + + /** + * @function LevelRenderer.Eventful.prototype.unbind + * @description 解绑事件。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @returns {LevelRenderer.Eventful} this + */ + unbind(event, handler) { + var _h = this._handlers; + + if (!event) { + this._handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } else { + delete _h[event]; + } + + return this; + } + + + /** + * @function LevelRenderer.Eventful.prototype.dispatch + * @description 事件分发。 + * @param {string} type - 事件类型。 + * @returns {LevelRenderer.Eventful} this + */ + dispatch(type) { + if (this._handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = Array.prototype.slice.call(args, 1); + } + + var _h = this._handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + break; + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + break; + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } else { + i++; + } + } + } + + return this; + } + + + /** + * @function LevelRenderer.Eventful.prototype.dispatchWithContext + * @description 带有context的事件分发,最后一个参数是事件回调的 context。 + * @param {string} type - 事件类型。 + * @returns {LevelRenderer.Eventful} this + */ + dispatchWithContext(type) { + if (this._handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = Array.prototype.slice.call(args, 1, args.length - 1); + } + var ctx = args[args.length - 1]; + + var _h = this._handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + break; + case 2: + _h[i]['h'].call(ctx, args[1]); + break; + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } else { + i++; + } + } + } + + return this; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Vector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @private + * @class LevelRenderer.Tool.Vector + * @category Visualization Theme + * @classdesc LevelRenderer 二维向量类 + * + */ +class levelRenderer_Vector_Vector { + constructor() { + this.ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Vector"; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.create + * @description 创建一个向量。 + * + * @param {number} x - x坐标 + * @param {number} y - Y坐标 + * @return {Vector2} 向量。 + */ + create(x, y) { + var ArrayCtor = this.ArrayCtor; + + var out = new ArrayCtor(2); + out[0] = x || 0; + out[1] = y || 0; + + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.copy + * @description 复制一个向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量。 + * @return {Vector2} 克隆向量。 + */ + copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.set + * @description 设置向量的两个项。 + * + * @param {Vector2} out - 基础向量。 + * @param {number} a - 项 a。 + * @param {number} b - 项 b。 + * @return {Vector2} 结果。 + */ + set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.add + * @description 向量相加。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.scaleAndAdd + * @description 向量缩放后相加。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2(缩放向量)。 + * @param {number} a - 缩放参数。 + * @return {Vector2} 结果。 + */ + scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.sub + * @description 向量相减。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.len + * @description 向量长度。 + * @param {Vector2} v - 向量。 + * @return {number} 向量长度。 + */ + len(v) { + return Math.sqrt(this.lenSquare(v)); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.lenSquare + * @description 向量长度平方。 + * @param {Vector2} v - 向量。 + * @return {number} 向量长度平方。 + */ + lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.mul + * @description 向量乘法。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.div + * @description 向量除法。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.dot + * @description 向量点乘。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量点乘。 + */ + dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.scale + * @description 向量缩放。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量v。 + * @param {number} s -缩放参数。 + * @return {Vector2} 结果。 + */ + scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.normalize + * @description 向量归一化。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量 v。 + * @return {Vector2} 结果。 + */ + normalize(out, v) { + var d = this.len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.distance + * @description 计算向量间距离。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量间距离。 + */ + distance(v1, v2) { + return Math.sqrt( + (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]) + ); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.distanceSquare + * @description 向量距离平方。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量距离平方。 + */ + distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.negate + * @description 求负向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量 v。 + * @return {Vector2} 负向量。 + */ + negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.lerp + * @description 两点之间线性插值。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @param {number} t + * @return {Vector2} 结果。 + */ + lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.applyTransform + * @description 矩阵左乘向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.min + * @description 求两个向量最小值。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.max + * @description 求两个向量最大值。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + + + /** + * @function LevelRenderer.Tool.Vector.prototype.length + * @description 向量长度。 + * + * @param {Vector2} v - 向量。 + * @return {number} 向量长度。 + */ + length(v) { + return this.len(v); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.lengthSquare + * @description 向量长度平方。 + * + * @param {Vector2} v - 向量。 + * @return {number} 向量长度平方。 + */ + lengthSquare(v) { + return this.lenSquare(v); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.dist + * @description 计算向量间距离。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量间距离。 + */ + dist(v1, v2) { + return this.distance(v1, v2); + } + + /** + * @function LevelRenderer.Tool.Vector.prototype.distSquare + * @description 向量距离平方。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量距离平方 + */ + distSquare(v1, v2) { + return this.distanceSquare(v1, v2); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Curve.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer.Tool.Curve + * @category Visualization Theme + * @classdesc LevelRenderer 工具-曲线 + * @private + */ +class Curve_Curve { + constructor() { + /** + * @member {LevelRenderer.Tool.Vector} LevelRenderer.Tool.Curve.prototype.vector + * @description 矢量工具。 + */ + this.vector = new levelRenderer_Vector_Vector(); + + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.EPSILON + * @description e。 + */ + this.EPSILON = 1e-4; + + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.THREE_SQRT + * @description 3 的平方根。 + */ + this.THREE_SQRT = Math.sqrt(3); + + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.ONE_THIRD + * @description 1/3。 + */ + this.ONE_THIRD = 1 / 3; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Curve"; + } + + + /* + * Method: evalCubicCoeff + * + * Parameters: + * a - {number} 值。 + * b - {number} 值。 + * c - {number} 值。 + * d - {number} 值。 + * t - {number} 值。 + * + * Returns: + * {number} + */ + + /* + evalCubicCoeff: function(a, b, c, d, t){ + return ((a * t + b) * t + c) * t + d; + }, + */ + + /** + * @function LevelRenderer.Tool.Curve.prototype.isAroundZero + * @description 判断一个值是否趋于0,判断参考值:1e-4。 + * @param {number} val - 值。 + * @returns {boolean} 值是否趋于0。 + */ + isAroundZero(val) { + return val > -this.EPSILON && val < this.EPSILON; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.isNotAroundZero + * @description 判断一个值是否不趋于0,判断参考值:1e-4。 + * @param {number} val - 值。 + * @returns {boolean} 值是否不趋于0。 + */ + isNotAroundZero(val) { + return val > this.EPSILON || val < -this.EPSILON; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicAt + * @description 计算三次贝塞尔值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @returns {number} 三次贝塞尔值。 + */ + cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicDerivativeAt + * @description 计算三次贝塞尔导数值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @returns {number} 三次贝塞尔导数值。 + */ + cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * ( + ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t + ); + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicRootAt + * @description 计算三次贝塞尔方程根,使用盛金公式 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} val - 值。 + * @param {Array.} roots - 有效根数目。 + * @returns {number} 有效根。 + */ + cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + + var n = 0; + + if (this.isAroundZero(A) && this.isAroundZero(B)) { + if (this.isAroundZero(b)) { + roots[0] = 0; + } else { + let t1 = -c / b; //t1, t2, t3, b is not zero + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = B * B - 4 * A * C; + + if (this.isAroundZero(disc)) { + var K = B / A; + let t1 = -b / a + K; // t1, a is not zero + let t2 = -K / 2; // t2, t3 + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } else if (disc > 0) { + let discSqrt = Math.sqrt(disc); + let Y1 = A * b + 1.5 * a * (-B + discSqrt); + let Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -Math.pow(-Y1, this.ONE_THIRD); + } else { + Y1 = Math.pow(Y1, this.ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -Math.pow(-Y2, this.ONE_THIRD); + } else { + Y2 = Math.pow(Y2, this.ONE_THIRD); + } + let t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } else { + var T = (2 * A * b - 3 * a * B) / (2 * Math.sqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = Math.sqrt(A); + var tmp = Math.cos(theta); + + let t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + let t2 = (-b + ASqrt * (tmp + this.THREE_SQRT * Math.sin(theta))) / (3 * a); + let t3 = (-b + ASqrt * (tmp - this.THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicRootAt + * @description 计算三次贝塞尔方程极限值的位置 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {Array.} extrema - 值。 + * @returns {number} 有效数目。 + */ + cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + + var n = 0; + if (this.isAroundZero(a)) { + if (this.isNotAroundZero(b)) { + let t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + if (this.isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } else if (disc > 0) { + let discSqrt = Math.sqrt(disc); + let t1 = (-b + discSqrt) / (2 * a); + let t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicSubdivide + * @description 细分三次贝塞尔曲线 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射点。 + */ + cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + + var p0123 = (p123 - p012) * t + p012; + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + // Seg1 + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicProjectPoint + * @description 投射点到三次贝塞尔曲线上,返回投射距离。投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 - 点p0横坐标。 + * @param {number} y0 - 点p0纵坐标。 + * @param {number} x1 - 点p1横坐标。 + * @param {number} y1 - 点p1纵坐标。 + * @param {number} x2 - 点p2横坐标。 + * @param {number} y2 - 点p2纵坐标。 + * @param {number} x3 - 点p3横坐标。 + * @param {number} y3 - 点p3纵坐标。 + * @param {number} x - 点p横坐标。 + * @param {number} y - 点p纵坐标。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射点。 + */ + cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + // 临时变量 + var _v0 = this.vector.create(); + var _v1 = this.vector.create(); + var _v2 = this.vector.create(); + // var _v3 = vector.create(); + + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (let _t = 0; _t < 1; _t += 0.05) { + _v1[0] = this.cubicAt(x0, x1, x2, x3, _t); + _v1[1] = this.cubicAt(y0, y1, y2, y3, _t); + let d1 = this.vector.distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (let i = 0; i < 32; i++) { + if (interval < this.EPSILON) { + break; + } + let prev = t - interval; + let next = t + interval; + // t - interval + _v1[0] = this.cubicAt(x0, x1, x2, x3, prev); + _v1[1] = this.cubicAt(y0, y1, y2, y3, prev); + + let d1 = this.vector.distSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } else { + // t + interval + _v2[0] = this.cubicAt(x0, x1, x2, x3, next); + _v2[1] = this.cubicAt(y0, y1, y2, y3, next); + let d2 = this.vector.distSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = this.cubicAt(x0, x1, x2, x3, t); + out[1] = this.cubicAt(y0, y1, y2, y3, t); + } + // console.log(interval, i); + return Math.sqrt(d); + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticAt + * @description 计算二次方贝塞尔值。 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} t - t值。 + * @returns {number} 二次方贝塞尔值。 + */ + quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticAt + * @description 计算二次方贝塞尔导数值。 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} t - t值。 + * @returns {number} 二次方贝塞尔导数值。 + */ + quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticRootAt + * @description 计算二次方贝塞尔方程根 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} val - 值。 + * @param {Array.} roots - 有效根数目。 + * @returns {number} 有效根数目。 + */ + quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + + var n = 0; + if (this.isAroundZero(a)) { + if (this.isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + if (this.isAroundZero(disc)) { + let t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } else if (disc > 0) { + let discSqrt = Math.sqrt(disc); + let t1 = (-b + discSqrt) / (2 * a); + let t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticExtremum + * @description 计算二次贝塞尔方程极限值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @returns {number} 二次贝塞尔方程极限值。 + */ + quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } else { + return (p0 - p1) / divider; + } + } + + + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticProjectPoint + * @description 投射点到二次贝塞尔曲线上,返回投射距离。投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 - 点p0横坐标。 + * @param {number} y0 - 点p0纵坐标。 + * @param {number} x1 - 点p1横坐标。 + * @param {number} y1 - 点p1纵坐标。 + * @param {number} x2 - 点p2横坐标。 + * @param {number} y2 - 点p2纵坐标。 + * @param {number} x - 点p横坐标。 + * @param {number} y - 点p纵坐标。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射距离。 + */ + quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + // 临时变量 + var _v0 = this.vector.create(); + var _v1 = this.vector.create(); + var _v2 = this.vector.create(); + + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (let _t = 0; _t < 1; _t += 0.05) { + _v1[0] = this.quadraticAt(x0, x1, x2, _t); + _v1[1] = this.quadraticAt(y0, y1, y2, _t); + let d1 = this.vector.distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (let i = 0; i < 32; i++) { + if (interval < this.EPSILON) { + break; + } + let prev = t - interval; + let next = t + interval; + // t - interval + _v1[0] = this.quadraticAt(x0, x1, x2, prev); + _v1[1] = this.quadraticAt(y0, y1, y2, prev); + + let d1 = this.vector.distSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } else { + // t + interval + _v2[0] = this.quadraticAt(x0, x1, x2, next); + _v2[1] = this.quadraticAt(y0, y1, y2, next); + let d2 = this.vector.distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = this.quadraticAt(x0, x1, x2, t); + out[1] = this.quadraticAt(y0, y1, y2, t); + } + // console.log(interval, i); + return Math.sqrt(d); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Area.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LevelRenderer.Tool.Area + * @category Visualization Theme + * @classdesc LevelRenderer 工具-图形范围判断 + * @private + */ +class Area { + constructor() { + /** + * @member {LevelRenderer.Tool.Util} LevelRenderer.Tool.Areal.prototype.util + * @description 基础工具对象。 + */ + this.util = new Util_Util(); + + /** + * @member {LevelRenderer.Tool.Curve} LevelRenderer.Tool.Areal.prototype.curve + * @description 曲线工具对象 + */ + this.curve = new Curve_Curve(); + + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._ctx + * @description Cavans2D 渲染上下文 + */ + this._ctx = null; + + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._textWidthCache + * @description 文本宽度缓存 + */ + this._textWidthCache = {}; + + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._textHeightCache + * @description 文本高度缓存 + */ + this._textHeightCache = {}; + + /** + * @member {number} LevelRenderer.Tool.Areal.prototype._textWidthCacheCounter + * @description 文本宽度缓存数量 + */ + this._textWidthCacheCounter = 0; + + /** + * @member {number} LevelRenderer.Tool.Areal.prototype._textHeightCacheCounter + * @description 文本高度缓存数量 + */ + this._textHeightCacheCounter = 0; + + /** + * @member {number} LevelRenderer.Tool.Areal.prototype.TEXT_CACHE_MAX + * @description 文本最大缓存数量 + */ + this.TEXT_CACHE_MAX = 5000; + + /** + * @member {number} LevelRenderer.Tool.Areal.prototype.PI2 + * @description 2*PI 的值 + */ + this.PI2 = Math.PI * 2; + + /** + * @member {Array.} LevelRenderer.Tool.Areal.prototype.roots + * @description 临时数组 + */ + this.roots = [-1, -1, -1]; + + /** + * @member {Array.} LevelRenderer.Tool.Areal.prototype.extrema + * @description 临时数组 + */ + this.extrema = [-1, -1]; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Area"; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.normalizeRadian + * @description 弧度标准化函数。 + * @param {number} angle - 弧度值。 + * @returns {number} 标准化后的弧度值。 + */ + normalizeRadian(angle) { + angle %= this.PI2; + if (angle < 0) { + angle += this.PI2; + } + return angle; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInside + * @description 包含判断。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置。 + */ + isInside(shape, area, x, y) { + if (!area || !shape) { + // 无参数或不支持类型 + return false; + } + var zoneType = shape.type; + + this._ctx = this._ctx || this.util.getContext(); + + // 未实现或不可用时则数学运算,主要是line,brokenLine,ring + var _mathReturn = this._mathMethod(shape, area, x, y); + if (typeof _mathReturn != 'undefined') { + return _mathReturn; + } + + if (shape.buildPath && this._ctx.isPointInPath) { + return this._buildPathMethod(shape, this._ctx, area, x, y); + } + + // 上面的方法都行不通时 + switch (zoneType) { + case 'ellipse': // Todo,不精确 + case 'smicellipse': // Todo,不精确 + return true; + // 旋轮曲线 不准确 + case 'trochoid': + var _r = area.location == 'out' + ? area.r1 + area.r2 + area.d + : area.r1 - area.r2 + area.d; + return this.isInsideCircle(area, x, y, _r); + // 玫瑰线 不准确 + case 'rose' : + return this.isInsideCircle(area, x, y, area.maxr); + // 路径,椭圆,曲线等-----------------13 + default: + return false; // Todo,暂不支持 + } + } + + /** + * @function LevelRenderer.Tool.Areal.prototype._mathMethod + * @description 包含判断。用数学方法判断,三个方法中最快,但是支持的shape少。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形中。 + */ + _mathMethod(shape, area, x, y) { + var zoneType = shape.type; + // 在矩形内则部分图形需要进一步判断 + switch (zoneType) { + // 贝塞尔曲线 + case 'bezier-curve': + if (typeof(area.cpX2) === 'undefined') { + return this.isInsideQuadraticStroke( + area.xStart, area.yStart, + area.cpX1, area.cpY1, + area.xEnd, area.yEnd, + area.lineWidth, x, y + ); + } + return this.isInsideCubicStroke( + area.xStart, area.yStart, + area.cpX1, area.cpY1, + area.cpX2, area.cpY2, + area.xEnd, area.yEnd, + area.lineWidth, x, y + ); + // 线 + case 'line': + return this.isInsideLine( + area.xStart, area.yStart, + area.xEnd, area.yEnd, + area.lineWidth, x, y + ); + // 折线 + case 'broken-line': + return this.isInsideBrokenLine( + area.pointList, area.lineWidth, x, y + ); + // 扩展折线 + case 'smicbroken-line': { + // SMIC-修改 - start + let icX = x; + let icY = y; + if (shape.refOriginalPosition) { + icX = x - shape.refOriginalPosition[0]; + icY = y - shape.refOriginalPosition[1]; + } + return this.isInsideBrokenLine( + area.pointList, area.lineWidth, icX, icY + ); + } + //初始代码: + // return isInsideBrokenLine( + // area.pointList, area.lineWidth, x, y + // ); + // SMIC-修改 - end + // 圆环 + case 'ring': + return this.isInsideRing( + area.x, area.y, area.r0, area.r, x, y + ); + case 'smicring': { + let areaX = area.x; + let areaY = area.y; + if (shape.refOriginalPosition) { + areaX = area.x + shape.refOriginalPosition[0]; + areaY = area.y + shape.refOriginalPosition[1]; + } + return this.isInsideRing( + areaX, areaY, area.r0, area.r, x, y + ); + } + // 圆形 + case 'circle': + return this.isInsideCircle( + area.x, area.y, area.r, x, y + ); + // 扩展-点 + case 'smicpoint': { + // SMIC-修改 - start + let icX = x; + let icY = y; + if (shape.refOriginalPosition) { + icX = x - shape.refOriginalPosition[0]; + icY = y - shape.refOriginalPosition[1]; + } + return this.isInsideCircle( + area.x, area.y, area.r, icX, icY + ); + } + //初始代码: + // 无 + // SMIC-修改 - end + // 扇形 + case 'sector': { + let startAngle = area.startAngle * Math.PI / 180; + let endAngle = area.endAngle * Math.PI / 180; + if (!area.clockWise) { + startAngle = -startAngle; + endAngle = -endAngle; + } + return this.isInsideSector( + area.x, area.y, area.r0, area.r, + startAngle, endAngle, + !area.clockWise, + x, y + ); + } + //初始代码: + // 无 + // SMIC-增加 - end + // 扇形 + case 'smicsector': { + let startAngle = area.startAngle * Math.PI / 180; + let endAngle = area.endAngle * Math.PI / 180; + if (!area.clockWise) { + startAngle = -startAngle; + endAngle = -endAngle; + } + + let areaX = area.x; + let areaY = area.y; + if (shape.refOriginalPosition) { + areaX = area.x + shape.refOriginalPosition[0]; + areaY = area.y + shape.refOriginalPosition[1]; + } + + return this.isInsideSector( + areaX, areaY, area.r0, area.r, + startAngle, endAngle, + !area.clockWise, + x, y + ); + } + // 多边形 + case 'path': + return this.isInsidePath( + area.pathArray, Math.max(area.lineWidth, 5), + area.brushType, x, y + ); + case 'polygon': + case 'star': + case 'smicstar': + case 'isogon': + case 'smicisogon': + return this.isInsidePolygon(area.pointList, x, y); + // 扩展多边形 + case 'smicpolygon': { + // SMIC-修改 - start + let icX = x; + let icY = y; + if (shape.refOriginalPosition) { + icX = x - shape.refOriginalPosition[0]; + icY = y - shape.refOriginalPosition[1]; + } + + //岛洞面 + if (shape.holePolygonPointLists && shape.holePolygonPointLists.length > 0) { + var isOnBase = this.isInsidePolygon(area.pointList, icX, icY); + + // 遍历岛洞子面 + var holePLS = shape.holePolygonPointLists; + var isOnHole = false; + for (var i = 0, holePLSen = holePLS.length; i < holePLSen; i++) { + var holePL = holePLS[i]; + var isOnSubHole = this.isInsidePolygon(holePL, icX, icY); + if (isOnSubHole === true) { + isOnHole = true; + } + } + + // 捕获判断 + return isOnBase === true && isOnHole === false; + } else { + return this.isInsidePolygon(area.pointList, icX, icY); + } + } + // 初始代码: + // 无 + // SMIC-修改 - end + // 文本 + case 'text': + var rect = area.__rect || shape.getRect(area); + return this.isInsideRect( + rect.x, rect.y, rect.width, rect.height, x, y + ); + // 扩展文本 + case 'smictext': + //用文本背景矩形判断 + var textBg = shape.getTextBackground(area); + return this.isInsidePolygon(textBg, x, y); + //初始代码: + // 无 + // SMIC-修改 - end + // 矩形 + case 'rectangle': + case 'image': + // 图片 + return this.isInsideRect( + area.x, area.y, area.width, area.height, x, y + ); + case 'smicimage': { + let areaX = area.x; + let areaY = area.y; + if (shape.refOriginalPosition) { + areaX = area.x + shape.refOriginalPosition[0]; + areaY = area.y + shape.refOriginalPosition[1]; + } + return this.isInsideRect( + areaX, areaY, area.width, area.height, x, y + ); + } + //// 扩展矩形 + //case 'smicpolygon': + // // SMIC-修改 - start + // var icX = x; + // var icY = y; + // if(shape.refOriginalPosition) { + // icX = x - shape.refOriginalPosition[0]; + // icY = y - shape.refOriginalPosition[1]; + // } + // return this.isInsideRect( + // area.x, area.y, area.width, area.height, icX, icY + // ); + //初始代码: + // 无 + // SMIC-修改 - end + } + } + + /** + * @function LevelRenderer.Tool.Areal.prototype._buildPathMethod + * @description 包含判断。通过buildPath方法来判断,三个方法中较快,但是不支持线条类型的 shape。 + * @param {Object} shape - 图形。 + * @param {Object} context - 上下文。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形中。 + */ + _buildPathMethod(shape, context, area, x, y) { + // 图形类实现路径创建了则用类的path + context.beginPath(); + shape.buildPath(context, area); + context.closePath(); + return context.isPointInPath(x, y); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isOutside + * @description 图形是否不包含鼠标位置。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否不包含鼠标位置, true表示坐标处在图形外。 + */ + isOutside(shape, area, x, y) { + return !this.isInside(shape, area, x, y); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideLine + * @description 线段包含判断。 + * @param {number} x0 - 线起始点横坐标。 + * @param {number} y0 - 线起始点纵坐标。 + * @param {number} x1 - 线终点横坐标。 + * @param {number} y1 - 线终点纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形内。 + */ + isInsideLine(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = Math.max(lineWidth, 5); + var _a = 0; + var _b = 0; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l) + ) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideCubicStroke + * @description 三次贝塞尔曲线描边包含判断。 + * @param {number} x0 - 点1横坐标。 + * @param {number} y0 - 点1纵坐标。 + * @param {number} x1 - 点2横坐标。 + * @param {number} y1 - 点2纵坐标。 + * @param {number} x2 - 点3纵坐标。 + * @param {number} y2 - 点3纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideCubicStroke(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = Math.max(lineWidth, 5); + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) + ) { + return false; + } + var d = this.curve.cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, null + ); + return d <= _l / 2; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideQuadraticStroke + * @description 二次贝塞尔曲线描边包含判断。 + * @param {number} x0 - 点1横坐标。 + * @param {number} y0 - 点1纵坐标。 + * @param {number} x1 - 点2横坐标。 + * @param {number} y1 - 点2纵坐标。 + * @param {number} x2 - 点3纵坐标。 + * @param {number} y2 - 点3纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideQuadraticStroke(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = Math.max(lineWidth, 5); + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l) + ) { + return false; + } + var d = this.curve.quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, null + ); + return d <= _l / 2; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideArcStroke + * @description 圆弧描边包含判断。 + * @param {number} cx - 圆心横坐标。 + * @param {number} cy - 圆心纵坐标。 + * @param {number} r - 圆半径。 + * @param {number} startAngle - 起始角度。 + * @param {number} endAngle - 终止角度。 + * @param {number} anticlockwise - 顺时针还是逆时针。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideArcStroke(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + var PI2 = this.PI2; + + if (lineWidth === 0) { + return false; + } + var _l = Math.max(lineWidth, 5); + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) >= PI2) { + // Is a circle + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = this.normalizeRadian(endAngle); + endAngle = this.normalizeRadian(tmp); + } else { + startAngle = this.normalizeRadian(startAngle); + endAngle = this.normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideBrokenLine + * @description 图形 BrokenLine 是否包含鼠标位置, true表示坐标处在图形内。 + * @param {Array} points - 曲线点对象。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideBrokenLine(points, lineWidth, x, y) { + var _lineWidth = Math.max(lineWidth, 10); + for (var i = 0, l = points.length - 1; i < l; i++) { + var x0 = points[i][0]; + var y0 = points[i][1]; + var x1 = points[i + 1][0]; + var y1 = points[i + 1][1]; + + if (this.isInsideLine(x0, y0, x1, y1, _lineWidth, x, y)) { + return true; + } + } + + return false; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideRing + * @description 图形 Ring 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideRing(cx, cy, r0, r, x, y) { + var d = (x - cx) * (x - cx) + (y - cy) * (y - cy); + return (d < r * r) && (d > r0 * r0); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideRect + * @description 图形 Rect 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideRect(x0, y0, width, height, x, y) { + return x >= x0 && x <= (x0 + width) && y >= y0 && y <= (y0 + height); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideCircle + * @description 图形 Circle 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideCircle(x0, y0, r, x, y) { + return (x - x0) * (x - x0) + (y - y0) * (y - y0) < r * r; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideSector + * @description 图形 Sector 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsideSector(cx, cy, r0, r, startAngle, endAngle, anticlockwise, x, y) { + return this.isInsideArcStroke(cx, cy, (r0 + r) / 2, startAngle, endAngle, anticlockwise, r - r0, x, y); + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsidePolygon + * @description 图形 Polygon 是否包含鼠标位置, true表示坐标处在图形内。与 canvas 一样采用 non-zero winding rule + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + isInsidePolygon(points, x, y) { + var N = points.length; + var w = 0; + + for (var i = 0, j = N - 1; i < N; i++) { + var x0 = points[j][0]; + var y0 = points[j][1]; + var x1 = points[i][0]; + var y1 = points[i][1]; + w += this.windingLine(x0, y0, x1, y1, x, y); + j = i; + } + return w !== 0; + } + + + /** + * @function LevelRenderer.Tool.Areal.prototype.windingLine + */ + windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 == y0) { + return 0; + } + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + var x_ = t * (x1 - x0) + x0; + + return x_ > x ? dir : 0; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.swapExtrema + */ + swapExtrema() { + var tmp = this.extrema[0]; + this.extrema[0] = this.extrema[1]; + this.extrema[1] = tmp; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.windingCubic + */ + windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + var curve = this.curve; + var roots = this.roots; + var extrema = this.extrema; + + // Quick reject + if ( + (y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3) + ) { + return 0; + } + var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var x_ = curve.cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { // Quick reject + continue; + } + if (nExtrema < 0) { + nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + this.swapExtrema(); + } + y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } else if (t < extrema[1]) { + w += y1_ < y0_ ? 1 : -1; + } else { + w += y3 < y1_ ? 1 : -1; + } + } else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } else { + w += y3 < y0_ ? 1 : -1; + } + } + } + return w; + } + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.windingQuadratic + */ + windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + var curve = this.curve; + var roots = this.roots; + + // Quick reject + if ( + (y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2) + ) { + return 0; + } + var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } else { + var t = curve.quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = curve.quadraticAt(y0, y1, y2, t); + for (let i = 0; i < nRoots; i++) { + let x_ = curve.quadraticAt(x0, x1, x2, roots[i]); + if (x_ > x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? 1 : -1; + } else { + w += y2 < y_ ? 1 : -1; + } + } + return w; + } else { + let x_ = curve.quadraticAt(x0, x1, x2, roots[0]); + if (x_ > x) { + return 0; + } + return y2 < y0 ? 1 : -1; + } + } + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.windingArc + * // TODO Arc 旋转 + */ + windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + var roots = this.roots; + var PI2 = this.PI2; + + y -= cy; + if (y > r || y < -r) { + return 0; + } + let tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + if (Math.abs(startAngle - endAngle) >= PI2) { + // Is a circle + startAngle = 0; + endAngle = PI2; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + let tmp = startAngle; + startAngle = this.normalizeRadian(endAngle); + endAngle = this.normalizeRadian(tmp); + } else { + startAngle = this.normalizeRadian(startAngle); + endAngle = this.normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var w = 0; + for (let i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + let angle = Math.atan2(y, x_); + let dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2 + angle; + } + if ( + (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle) + ) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + + + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsidePath + * @description 与 canvas 一样采用 non-zero winding rule + */ + isInsidePath(pathArray, lineWidth, brushType, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var beginSubpath = true; + var firstCmd = true; + + brushType = brushType || 'fill'; + + var hasStroke = brushType === 'stroke' || brushType === 'both'; + var hasFill = brushType === 'fill' || brushType === 'both'; + + // var roots = [-1, -1, -1]; + for (var i = 0; i < pathArray.length; i++) { + var seg = pathArray[i]; + var p = seg.points; + // Begin a new subpath + if (beginSubpath || seg.command === 'M') { + if (i > 0) { + // Close previous subpath + if (hasFill) { + w += this.windingLine(xi, yi, x0, y0, x, y); + } + if (w !== 0) { + return true; + } + } + x0 = p[p.length - 2]; + y0 = p[p.length - 1]; + beginSubpath = false; + if (firstCmd && seg.command !== 'A') { + // 如果第一个命令不是M, 是lineTo, bezierCurveTo + // 等绘制命令的话,是会从该绘制的起点开始算的 + // Arc 会在之后做单独处理所以这里忽略 + firstCmd = false; + xi = x0; + yi = y0; + } + } + switch (seg.command) { + case 'M': + xi = p[0]; + yi = p[1]; + break; + case 'L': + if (hasStroke) { + if (this.isInsideLine( + xi, yi, p[0], p[1], lineWidth, x, y + )) { + return true; + } + } + if (hasFill) { + w += this.windingLine(xi, yi, p[0], p[1], x, y); + } + xi = p[0]; + yi = p[1]; + break; + case 'C': + if (hasStroke) { + if (this.isInsideCubicStroke( + xi, yi, p[0], p[1], p[2], p[3], p[4], p[5], + lineWidth, x, y + )) { + return true; + } + } + if (hasFill) { + w += this.windingCubic( + xi, yi, p[0], p[1], p[2], p[3], p[4], p[5], x, y + ); + } + xi = p[4]; + yi = p[5]; + break; + case 'Q': + if (hasStroke) { + if (this.isInsideQuadraticStroke( + xi, yi, p[0], p[1], p[2], p[3], + lineWidth, x, y + )) { + return true; + } + } + if (hasFill) { + w += this.windingQuadratic( + xi, yi, p[0], p[1], p[2], p[3], x, y + ); + } + xi = p[2]; + yi = p[3]; + break; + case 'A': + // TODO Arc 旋转 + // TODO Arc 判断的开销比较大 + var cx = p[0]; + var cy = p[1]; + var rx = p[2]; + var ry = p[3]; + var theta = p[4]; + var dTheta = p[5]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; + // 不是直接使用 arc 命令 + if (!firstCmd) { + w += this.windingLine(xi, yi, x1, y1); + } else { + firstCmd = false; + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } + // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + var _x = (x - cx) * ry / rx + cx; + if (hasStroke) { + if (this.isInsideArcStroke( + cx, cy, ry, theta, theta + dTheta, 1 - p[7], + lineWidth, _x, y + )) { + return true; + } + } + if (hasFill) { + w += this.windingArc( + cx, cy, ry, theta, theta + dTheta, 1 - p[7], + _x, y + ); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case 'z': + if (hasStroke) { + if (this.isInsideLine( + xi, yi, x0, y0, lineWidth, x, y + )) { + return true; + } + } + beginSubpath = true; + break; + } + } + if (hasFill) { + w += this.windingLine(xi, yi, x0, y0, x, y); + } + return w !== 0; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.getTextWidth + * @description 测算多行文本宽度 + */ + getTextWidth(text, textFont) { + var key = text + ':' + textFont; + if (this._textWidthCache[key]) { + return this._textWidthCache[key]; + } + this._ctx = this._ctx || this.util.getContext(); + this._ctx.save(); + + if (textFont) { + this._ctx.font = textFont; + } + + text = (text + '').split('\n'); + var width = 0; + for (var i = 0, l = text.length; i < l; i++) { + width = Math.max( + this._ctx.measureText(text[i]).width, + width + ); + } + this._ctx.restore(); + + this._textWidthCache[key] = width; + if (++this._textWidthCacheCounter > this.TEXT_CACHE_MAX) { + // 内存释放 + this._textWidthCacheCounter = 0; + this._textWidthCache = {}; + } + + return width; + } + + /** + * @function LevelRenderer.Tool.Areal.prototype.getTextHeight + * @description 测算多行文本高度 + */ + getTextHeight(text, textFont) { + var key = text + ':' + textFont; + if (this._textHeightCache[key]) { + return this._textHeightCache[key]; + } + + this._ctx = this._ctx || this.util.getContext(); + + this._ctx.save(); + if (textFont) { + this._ctx.font = textFont; + } + + text = (text + '').split('\n'); + // 比较粗暴 + //var height = (this._ctx.measureText('国').width + 2) * text.length; //打包不支持中文,替换掉 + var height = (this._ctx.measureText('ZH').width + 2) * text.length; + + this._ctx.restore(); + + this._textHeightCache[key] = height; + if (++this._textHeightCacheCounter > this.TEXT_CACHE_MAX) { + // 内存释放 + this._textHeightCacheCounter = 0; + this._textHeightCache = {}; + } + return height; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/ComputeBoundingBox.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LevelRenderer.Tool.ComputeBoundingBox + * @category Visualization Theme + * @classdesc LevelRenderer 工具-图形 Bounds 计算 + * @private + */ +class ComputeBoundingBox { + constructor() { + if (arguments.length === 3) { + this.computeBoundingBox(arguments); + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.ComputeBoundingBox"; + } + + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.computeBoundingBox + * @description 从顶点数组中计算出最小包围盒,写入'min'和'max'中。 + * @param {Array.} points - 顶点数组。 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + computeBoundingBox(points, min, max) { + if (points.length === 0) { + return; + } + var left = points[0][0]; + var right = points[0][0]; + var top = points[0][1]; + var bottom = points[0][1]; + + for (var i = 1; i < points.length; i++) { + var p = points[i]; + if (p[0] < left) { + left = p[0]; + } + if (p[0] > right) { + right = p[0]; + } + if (p[1] < top) { + top = p[1]; + } + if (p[1] > bottom) { + bottom = p[1]; + } + } + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.cubeBezier + * @description 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入'min'和'max'中。原:computeCubeBezierBoundingBox。 + * @param {Array.} p0 - 三阶贝塞尔曲线p0点 + * @param {Array.} p1 - 三阶贝塞尔曲线p1点 + * @param {Array.} p2 - 三阶贝塞尔曲线p2点 + * @param {Array.} p3 - 三阶贝塞尔曲线p3点 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + cubeBezier(p0, p1, p2, p3, min, max) { + var curve = new Curve_Curve(); + + var xDim = []; + curve.cubicExtrema(p0[0], p1[0], p2[0], p3[0], xDim); + for (let i = 0; i < xDim.length; i++) { + xDim[i] = curve.cubicAt(p0[0], p1[0], p2[0], p3[0], xDim[i]); + } + var yDim = []; + curve.cubicExtrema(p0[1], p1[1], p2[1], p3[1], yDim); + for (let i = 0; i < yDim.length; i++) { + yDim[i] = curve.cubicAt(p0[1], p1[1], p2[1], p3[1], yDim[i]); + } + + xDim.push(p0[0], p3[0]); + yDim.push(p0[1], p3[1]); + + var left = Math.min.apply(null, xDim); + var right = Math.max.apply(null, xDim); + var top = Math.min.apply(null, yDim); + var bottom = Math.max.apply(null, yDim); + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.quadraticBezier + * @description 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入'min'和'max'中。原:computeQuadraticBezierBoundingBox。 + * @param {Array.} p0 - 二阶贝塞尔曲线p0点 + * @param {Array.} p1 - 二阶贝塞尔曲线p1点 + * @param {Array.} p2 - 二阶贝塞尔曲线p2点 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + quadraticBezier(p0, p1, p2, min, max) { + var curve = new Curve_Curve(); + + // Find extremities, where derivative in x dim or y dim is zero + var t1 = curve.quadraticExtremum(p0[0], p1[0], p2[0]); + var t2 = curve.quadraticExtremum(p0[1], p1[1], p2[1]); + + t1 = Math.max(Math.min(t1, 1), 0); + t2 = Math.max(Math.min(t2, 1), 0); + + var ct1 = 1 - t1; + var ct2 = 1 - t2; + + var x1 = ct1 * ct1 * p0[0] + + 2 * ct1 * t1 * p1[0] + + t1 * t1 * p2[0]; + var y1 = ct1 * ct1 * p0[1] + + 2 * ct1 * t1 * p1[1] + + t1 * t1 * p2[1]; + + var x2 = ct2 * ct2 * p0[0] + + 2 * ct2 * t2 * p1[0] + + t2 * t2 * p2[0]; + var y2 = ct2 * ct2 * p0[1] + + 2 * ct2 * t2 * p1[1] + + t2 * t2 * p2[1]; + min[0] = Math.min(p0[0], p2[0], x1, x2); + min[1] = Math.min(p0[1], p2[1], y1, y2); + max[0] = Math.max(p0[0], p2[0], x1, x2); + max[1] = Math.max(p0[1], p2[1], y1, y2); + } + + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.arc + * @description 从圆弧中计算出最小包围盒,写入'min'和'max'中。原:computeArcBoundingBox。 + * @param {number} x - 圆弧中心点 x + * @param {number} y - 圆弧中心点 y + * @param {number} r - 圆弧半径 + * @param {number} startAngle - 圆弧开始角度 + * @param {number} endAngle - 圆弧结束角度 + * @param {number} anticlockwise - 是否是顺时针 + * @param {number} min - 最小 + * @param {number} max - 最大 + */ + arc(x, y, r, startAngle, endAngle, anticlockwise, min, max) { + var vec2 = new levelRenderer_Vector_Vector(); + + var start = vec2.create(); + var end = vec2.create(); + var extremity = vec2.create(); + + start[0] = Math.cos(startAngle) * r + x; + start[1] = Math.sin(startAngle) * r + y; + + end[0] = Math.cos(endAngle) * r + x; + end[1] = Math.sin(endAngle) * r + y; + + vec2.min(min, start, end); + vec2.max(max, start, end); + + // Thresh to [0, Math.PI * 2] + startAngle = startAngle % (Math.PI * 2); + if (startAngle < 0) { + startAngle = startAngle + Math.PI * 2; + } + endAngle = endAngle % (Math.PI * 2); + if (endAngle < 0) { + endAngle = endAngle + Math.PI * 2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += Math.PI * 2; + } else if (startAngle < endAngle && anticlockwise) { + startAngle += Math.PI * 2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + + // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = Math.cos(angle) * r + x; + extremity[1] = Math.sin(angle) * r + y; + + vec2.min(min, extremity, min); + vec2.max(max, extremity, max); + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Env.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @class LevelRenderer.Tool.Env + * @category Visualization Theme + * @classdesc 环境识别 + * @private + */ +class Env { + constructor() { + // Zepto.js + // (c) 2010-2013 Thomas Fuchs + // Zepto.js may be freely distributed under the MIT license. + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Env"; + var me = this; + + function detect(ua) { + var os = me.os = {}; + var browser = me.browser = {}; + var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + var touchpad = webos && ua.match(/TouchPad/); + var kindle = ua.match(/Kindle\/([\d.]+)/); + var silk = ua.match(/Silk\/([\d._]+)/); + var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + var playbook = ua.match(/PlayBook/); + var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE ([\d.]+)/); + var safari = webkit && ua.match(/Mobile\//) && !chrome; + var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; + + // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + /*eslint-disable*/ + if (browser.webkit = !!webkit) { + browser.version = webkit[1]; + } + + if (android) { + os.android = true; + os.version = android[2]; + } + if (iphone && !ipod) { + os.ios = os.iphone = true; + os.version = iphone[2].replace(/_/g, '.'); + } + if (ipad) { + os.ios = os.ipad = true; + os.version = ipad[2].replace(/_/g, '.'); + } + if (ipod) { + os.ios = os.ipod = true; + os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + } + if (webos) { + os.webos = true; + os.version = webos[2]; + } + if (touchpad) { + os.touchpad = true; + } + if (blackberry) { + os.blackberry = true; + os.version = blackberry[2]; + } + if (bb10) { + os.bb10 = true; + os.version = bb10[2]; + } + if (rimtabletos) { + os.rimtabletos = true; + os.version = rimtabletos[2]; + } + if (playbook) { + browser.playbook = true; + } + if (kindle) { + os.kindle = true; + os.version = kindle[1]; + } + if (silk) { + browser.silk = true; + browser.version = silk[1]; + } + if (!silk && os.android && ua.match(/Kindle Fire/)) { + browser.silk = true; + } + if (chrome) { + browser.chrome = true; + browser.version = chrome[1]; + } + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (safari && (ua.match(/Safari/) || !!os.ios)) { + browser.safari = true; + } + if (webview) { + browser.webview = true; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + + os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || + (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); + os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || + (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || + (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); + + return { + browser: browser, + os: os, + // 原生canvas支持 + canvasSupported: document.createElement('canvas').getContext ? true : false + }; + } + + return detect(navigator.userAgent); + } + destory() { + return true; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Event.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @class LevelRenderer.Tool.Event + * @category Visualization Theme + * @classdesc LevelRenderer 工具-事件辅助类 + * @private + */ +class Event_Event { + constructor() { + /** + * @member {function} LevelRenderer.Tool.Event.prototype.stop + * @description 停止冒泡和阻止默认行为 + */ + this.stop = typeof window.addEventListener === 'function' + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Event"; + } + + + /** + * @function LevelRenderer.Tool.Event.prototype.getX + * @description 提取鼠标(手指)x坐标。 + * @param {Event} e - 事件。 + * @returns {number} 鼠标(手指)x坐标。 + */ + getX(e) { + return typeof e.zrenderX != 'undefined' && e.zrenderX + || typeof e.offsetX != 'undefined' && e.offsetX + || typeof e.layerX != 'undefined' && e.layerX + || typeof e.clientX != 'undefined' && e.clientX; + } + + + /** + * @function LevelRenderer.Tool.Event.prototype.getY + * @description 提取鼠标(手指)y坐标。 + * @param {Event} e - 事件。 + * @returns {number} 鼠标(手指)y坐标。 + */ + getY(e) { + return typeof e.zrenderY != 'undefined' && e.zrenderY + || typeof e.offsetY != 'undefined' && e.offsetY + || typeof e.layerY != 'undefined' && e.layerY + || typeof e.clientY != 'undefined' && e.clientY; + } + + + /** + * @function LevelRenderer.Tool.Event.prototype.getDelta + * @description 提取鼠标滚轮变化。 + * @param {Event} e - 事件。 + * @returns {number} 滚轮变化,正值说明滚轮是向上滚动,如果是负值说明滚轮是向下滚动。 + */ + getDelta(e) { + return typeof e.zrenderDelta != 'undefined' && e.zrenderDelta + || typeof e.wheelDelta != 'undefined' && e.wheelDelta + || typeof e.detail != 'undefined' && -e.detail; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Http.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @private + * @class LevelRenderer.Tool.Http + * @category Visualization Theme + * @classdesc LevelRenderer 工具-Http + */ +class Http { + constructor() { + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Http" + } + + /** + * @function LevelRenderer.Tool.Http.prototype.get + * @description get请求。 + * @param {(string|IHTTPGetOption)} url - 请求url + * @param {function} onsuccess - 请求成功函数 + * @param {function} onerror - 请求失败函数 + * @param {Object} opts - 额外参数 + * @returns {number} cos值 + */ + get(url, onsuccess, onerror) { + if (typeof(url) === 'object') { + var obj = url; + url = obj.url; + onsuccess = obj.onsuccess; + onerror = obj.onerror; + + } + var xhr = window.XMLHttpRequest + ? new XMLHttpRequest() + : new window.ActiveXObject('Microsoft.XMLHTTP'); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { + onsuccess && onsuccess(xhr.responseText); + } else { + onerror && onerror(); + } + xhr.onreadystatechange = new Function(); + xhr = null; + } + }; + + xhr.send(null); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Config.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Config { + +} +/** + * @enum EVENT + * @description 事件 + * @type {Object} + * @private + */ +Config.EVENT = { + //窗口大小变化 + RESIZE: 'resize', + + //鼠标按钮被(手指)按下,事件对象是:目标图形元素或空 + CLICK: 'click', + + //双击事件 + DBLCLICK: 'dblclick', + + //鼠标滚轮变化,事件对象是:目标图形元素或空 + MOUSEWHEEL: 'mousewheel', + + //鼠标(手指)被移动,事件对象是:目标图形元素或空 + MOUSEMOVE: 'mousemove', + + //鼠标移到某图形元素之上,事件对象是:目标图形元素 + MOUSEOVER: 'mouseover', + + //鼠标从某图形元素移开,事件对象是:目标图形元素 + MOUSEOUT: 'mouseout', + + //鼠标按钮(手指)被按下,事件对象是:目标图形元素或空 + MOUSEDOWN: 'mousedown', + + //鼠标按键(手指)被松开,事件对象是:目标图形元素或空 + MOUSEUP: 'mouseup', + + //全局离开,MOUSEOUT触发比较频繁,一次离开优化绑定 + GLOBALOUT: 'globalout', + + // 一次成功元素拖拽的行为事件过程是: + // dragstart > dragenter > dragover [> dragleave] > drop > dragend + + //开始拖拽时触发,事件对象是:被拖拽图形元素 + DRAGSTART: 'dragstart', + + //拖拽完毕时触发(在drop之后触发),事件对象是:被拖拽图形元素 + DRAGEND: 'dragend', + + //拖拽图形元素进入目标图形元素时触发,事件对象是:目标图形元素 + DRAGENTER: 'dragenter', + + //拖拽图形元素在目标图形元素上移动时触发,事件对象是:目标图形元素 + DRAGOVER: 'dragover', + + //拖拽图形元素离开目标图形元素时触发,事件对象是:目标图形元素 + DRAGLEAVE: 'dragleave', + + //拖拽图形元素放在目标图形元素内时触发,事件对象是:目标图形元素 + DROP: 'drop', + + //touch end - start < delay is click + touchClickDelay: 300 +}; + +/** + * @enum catchBrushException + * @description 是否异常捕获 + * @type {boolean} + * @private + */ +Config.catchBrushException = false; + +/** + * @enum debugMode + * @description debug 日志选项:catchBrushException 为 true 下有效。 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + * @type {boolean} + * @private + */ +Config.debugMode = 0; +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Log.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Tool.Log + * @category Visualization Theme + * @classdesc LevelRenderer 工具-日志 + */ +class Log { + constructor() { + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Log"; + return function () { + if (+Config.debugMode === 0) { + return; + } else if (+Config.debugMode === 1) { + for (let k in arguments) { + throw new Error(arguments[k]); + } + } else if (+Config.debugMode > 1) { + for (let k in arguments) { + console.log(arguments[k]); + } + } + }; + + /* for debug + return function(mes) { + document.getElementById('wrong-message').innerHTML = + mes + ' ' + (new Date() - 0) + + '
' + + document.getElementById('wrong-message').innerHTML; + }; + */ + } + + destory() { + return true; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Math.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @private + * @class LevelRenderer.Tool.Math + * @category Visualization Theme + * @classdesc LevelRenderer 工具-数学辅助类 + */ +class MathTool { + + constructor() { + + /** + * @member {number} LevelRenderer.Tool.Math._radians + * @description 角度与弧度转化参数 + */ + this._radians = window.Math.PI / 180; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Math"; + } + + /** + * @function LevelRenderer.Tool.Math.prototype.sin + * @description 正弦函数。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} sin 值。 + */ + sin(angle, isDegrees) { + return window.Math.sin(isDegrees ? angle * this._radians : angle); + } + + /** + * @function LevelRenderer.Tool.Math.prototype.cos + * @description 余弦函数。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} cos 值。 + */ + cos(angle, isDegrees) { + return window.Math.cos(isDegrees ? angle * this._radians : angle); + } + + /** + * @function LevelRenderer.Tool.Math.prototype.degreeToRadian + * @description 角度转弧度。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} 弧度值。 + */ + degreeToRadian(angle) { + return angle * this._radians; + } + + /** + * @function LevelRenderer.Tool.Math.prototype.radianToDegree + * @description 弧度转角度。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} 角度。 + */ + + radianToDegree(angle) { + return angle / this._radians; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Matrix.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @private + * @class LevelRenderer.Tool.Matrix + * @category Visualization Theme + * @classdesc LevelRenderer 工具-3x2矩阵操作类 + */ +class Matrix { + + constructor() { + /** + * @member {Object} LevelRenderer.Tool.Matrix.prototype.ArrayCtor + * @description 数组类型控制 + */ + this.ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Matrix"; + } + + + /** + * @function LevelRenderer.Tool.Matrix.prototype.create + * @description 创建一个单位矩阵。 + * @returns {(Float32Array|Array.)} 单位矩阵。 + */ + create() { + var ArrayCtor = this.ArrayCtor; + + var out = new ArrayCtor(6); + this.identity(out); + + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.identity + * @description 设置矩阵为单位矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @returns {(Float32Array|Array.)} 单位矩阵。 + */ + identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + + + /** + * @function LevelRenderer.Tool.Matrix.prototype.copy + * @description 复制矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @returns {(Float32Array|Array.)} 克隆矩阵。 + */ + copy(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.mul + * @description 矩阵相乘。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} m1 - 矩阵m1。 + * @param {(Float32Array|Array.)} m2- 矩阵m2。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + mul(out, m1, m2) { + out[0] = m1[0] * m2[0] + m1[2] * m2[1]; + out[1] = m1[1] * m2[0] + m1[3] * m2[1]; + out[2] = m1[0] * m2[2] + m1[2] * m2[3]; + out[3] = m1[1] * m2[2] + m1[3] * m2[3]; + out[4] = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + out[5] = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.mul + * @description 平移变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v- 平移参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.rotate + * @description 平移变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} rad - 旋转参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.scale + * @description 缩放变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v - 缩放参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + scale(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.invert + * @description 求逆矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + + /** + * @function LevelRenderer.Tool.Matrix.prototype.mulVector + * @description 矩阵左乘向量。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v - 缩放参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + mulVector(out, a, v) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + out[0] = v[0] * aa + v[1] * ac + atx; + out[1] = v[0] * ab + v[1] * ad + aty; + + return out; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SUtil.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +class SUtil_SUtil { + /** + * @function LevelRenderer.SUtil.SUtil_smoothBezier + * @description 贝塞尔平滑曲线。 + * @private + * @param {Array} points - 线段顶点数组。 + * @param {number} smooth - 平滑等级, 0-1。 + * @param {boolean} isLoop - isLoop。 + * @param {Array} constraint - 将计算出来的控制点约束在一个包围盒内,比如 [[0, 0], [100, 100]], 这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array.} [originalPosition=[0, 0]] - 参考原点。 + * @return {Array} 生成的平滑节点数组。 + */ + static SUtil_smoothBezier(points, smooth, isLoop, constraint, originalPosition) { + if (!originalPosition || originalPosition.length !== 2) { + originalPosition = [0, 0]; + } + var __OP = originalPosition; + + var cps = []; + + var v = []; + var v1 = []; + var v2 = []; + + var hasConstraint = !!constraint; + var min, max; + if (hasConstraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + let len = points.length; + for (let i = 0; i < len; i++) { + SUtil_SUtil.Util_vector.min(min, min, [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + SUtil_SUtil.Util_vector.max(max, max, [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + } + // 与指定的包围盒做并集 + SUtil_SUtil.Util_vector.min(min, min, constraint[0]); + SUtil_SUtil.Util_vector.max(max, max, constraint[1]); + } + + let len = points.length; + for (let i = 0; i < len; i++) { + let point = [points[i][0] + __OP[0], points[i][1] + __OP[1]]; + let prevPoint; + let nextPoint; + + if (isLoop) { + prevPoint = [points[i ? i - 1 : len - 1][0] + __OP[0], points[i ? i - 1 : len - 1][1] + __OP[1]]; + nextPoint = [points[(i + 1) % len][0] + __OP[0], points[(i + 1) % len][1] + __OP[1]]; + } else { + if (i === 0 || i === len - 1) { + cps.push([points[i][0] + __OP[0], points[i][1] + __OP[1]]); + continue; + } else { + prevPoint = [points[i - 1][0] + __OP[0], points[i - 1][1] + __OP[1]]; + nextPoint = [points[i + 1][0] + __OP[0], points[i + 1][1] + __OP[1]]; + } + } + + SUtil_SUtil.Util_vector.sub(v, nextPoint, prevPoint); + + // use degree to scale the handle length + SUtil_SUtil.Util_vector.scale(v, v, smooth); + + let d0 = SUtil_SUtil.Util_vector.distance(point, prevPoint); + let d1 = SUtil_SUtil.Util_vector.distance(point, nextPoint); + let sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + SUtil_SUtil.Util_vector.scale(v1, v, -d0); + SUtil_SUtil.Util_vector.scale(v2, v, d1); + let cp0 = SUtil_SUtil.Util_vector.add([], point, v1); + let cp1 = SUtil_SUtil.Util_vector.add([], point, v2); + if (hasConstraint) { + SUtil_SUtil.Util_vector.max(cp0, cp0, min); + SUtil_SUtil.Util_vector.min(cp0, cp0, max); + SUtil_SUtil.Util_vector.max(cp1, cp1, min); + SUtil_SUtil.Util_vector.min(cp1, cp1, max); + } + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; + } + + /** + * @function LevelRenderer.SUtil.SUtil_smoothSpline + * @description 插值折线。 + * @private + * @param {Array} points - 线段顶点数组。 + * @param {boolean} isLoop - isLoop。 + * @param {Array} constraint - 将计算出来的控制点约束在一个包围盒内,比如 [[0, 0], [100, 100]], 这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array.} originalPosition - 参考原点。默认值:[0, 0]。 + * @return {Array} 生成的平滑节点数组。 + */ + static SUtil_smoothSpline(points, isLoop, constraint, originalPosition) { + if (!originalPosition || originalPosition.length !== 2) { + originalPosition = [0, 0]; + } + var __OP = originalPosition; + + var len = points.length; + var ret = []; + + var distance = 0; + for (let i = 1; i < len; i++) { + distance += SUtil_SUtil.Util_vector.distance([points[i - 1][0] + __OP[0], points[i - 1][1] + __OP[1]], [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + } + + var segs = distance / 5; + segs = segs < len ? len : segs; + for (let i = 0; i < segs; i++) { + let pos = i / (segs - 1) * (isLoop ? len : len - 1); + let idx = Math.floor(pos); + + let w = pos - idx; + + let p0; + let p1 = [points[idx % len][0] + __OP[0], points[idx % len][1] + __OP[1]]; + let p2; + let p3; + if (!isLoop) { + p0 = [points[idx === 0 ? idx : idx - 1][0] + __OP[0], points[idx === 0 ? idx : idx - 1][1] + __OP[1]]; + p2 = [points[idx > len - 2 ? len - 1 : idx + 1][0] + __OP[0], points[idx > len - 2 ? len - 1 : idx + 1][1] + __OP[1]]; + p3 = [points[idx > len - 3 ? len - 1 : idx + 2][0] + __OP[0], points[idx > len - 3 ? len - 1 : idx + 2][1] + __OP[1]]; + } else { + + p0 = [points[(idx - 1 + len) % len][0] + __OP[0], points[(idx - 1 + len) % len][1] + __OP[1]]; + p2 = [points[(idx + 1) % len][0] + __OP[0], points[(idx + 1) % len][1] + __OP[1]]; + p3 = [points[(idx + 2) % len][0] + __OP[0], points[(idx + 2) % len][1] + __OP[1]]; + } + + let w2 = w * w; + let w3 = w * w2; + + ret.push([ + interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), + interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3) + ]); + } + return ret; + + // inner Function + function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + } + + /** + * @function LevelRenderer.SUtil.SUtil_dashedLineTo + * @description 虚线 lineTo。 + */ + static SUtil_dashedLineTo(ctx, x1, y1, x2, y2, dashLength, customDashPattern) { + // http://msdn.microsoft.com/en-us/library/ie/dn265063(v=vs.85).aspx + var dashPattern = [5, 5]; + dashLength = typeof dashLength != 'number' + ? 5 + : dashLength; + + if (ctx.setLineDash) { + dashPattern[0] = dashLength; + dashPattern[1] = dashLength; + + if (customDashPattern && (customDashPattern instanceof Array)) { + ctx.setLineDash(customDashPattern); + } else { + ctx.setLineDash(dashPattern); + } + // ctx.setLineDash(dashPattern); + + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + return; + } + + var dx = x2 - x1; + var dy = y2 - y1; + var numDashes = Math.floor( + Math.sqrt(dx * dx + dy * dy) / dashLength + ); + dx = dx / numDashes; + dy = dy / numDashes; + var flag = true; + for (var i = 0; i < numDashes; ++i) { + if (flag) { + ctx.moveTo(x1, y1); + } else { + ctx.lineTo(x1, y1); + } + flag = !flag; + x1 += dx; + y1 += dy; + } + ctx.lineTo(x2, y2); + } +} +// 把所有工具对象放到全局静态变量上,以便直接调用工具方法, +// 避免使用工具时频繁的创建工具对象带来的性能消耗。 +SUtil_SUtil.Util_area = new Area(); +SUtil_SUtil.Util_color = new Color(); +SUtil_SUtil.Util_computeBoundingBox = new ComputeBoundingBox(); +SUtil_SUtil.Util_curve = new Curve_Curve(); +SUtil_SUtil.Util_env = new Env(); +SUtil_SUtil.Util_event = new Event_Event(); +SUtil_SUtil.Util_http = new Http(); +SUtil_SUtil.Util_log = new Log(); +SUtil_SUtil.Util_math = new MathTool(); +SUtil_SUtil.Util_matrix = new Matrix(); +SUtil_SUtil.Util = new Util_Util(); +SUtil_SUtil.Util_vector = new levelRenderer_Vector_Vector(); + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Transformable.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Transformable + * @category Visualization Theme + * @classdesc 可变换超类,所有支持 Canvas Transform 变换操作的类均是此类的子类。此类不可实例化。 + */ +class Transformable { + constructor() { + /** + * @member {Array.} LevelRenderer.Transformable.prototype.position + * @description 平移, 默认值:[0, 0]。 + */ + this.position = [0, 0]; + + /** + * @member {Array.} LevelRenderer.Transformable.prototype.rotation + * @description 旋转,可以通过数组二三项指定旋转的原点, 默认值:[0, 0, 0]。 + */ + this.rotation = [0, 0, 0]; + + /** + * @member {Array.} LevelRenderer.Transformable.prototype.scale + * @description 缩放,可以通过数组三四项指定缩放的原点, 默认值:[1, 1, 0, 0]。 + */ + this.scale = [1, 1, 0, 0]; + + /** + * @member {boolean} LevelRenderer.Transformable.prototype.needLocalTransform + * @description 是否变换。默认值:false。 + */ + this.needLocalTransform = false; + + /** + * @member {boolean} LevelRenderer.Transformable.prototype.needTransform + * @description 是否有坐标变换。默认值:false。 + */ + this.needTransform = false; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Transformable"; + /** + * @function LevelRenderer.Transformable.prototype.lookAt + * @description 设置图形的朝向。 + */ + this.lookAt = (function () { + var v = SUtil_SUtil.Util_vector.create(); + // {Array.|Float32Array} target + return function (target) { + if (!this.transform) { + this.transform = SUtil_SUtil.Util_matrix.create(); + } + var m = this.transform; + SUtil_SUtil.Util_vector.sub(v, target, this.position); + if (isAroundZero(v[0]) && isAroundZero(v[1])) { + return; + } + SUtil_SUtil.Util_vector.normalize(v, v); + // Y Axis + // TODO Scale origin ? + m[2] = v[0] * this.scale[1]; + m[3] = v[1] * this.scale[1]; + // X Axis + m[0] = v[1] * this.scale[0]; + m[1] = -v[0] * this.scale[0]; + // Position + m[4] = this.position[0]; + m[5] = this.position[1]; + + this.decomposeTransform(); + + function isAroundZero(val) { + var EPSILON = 5e-5; + return val > -EPSILON && val < EPSILON; + } + }; + })(); + } + + /** + * @function LevelRenderer.Transformable.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.position = null; + this.rotation = null; + this.scale = null; + this.needLocalTransform = null; + this.needTransform = null; + } + + + /** + * @function LevelRenderer.Transformable.prototype.updateNeedTransform + * @description 更新 needLocalTransform + */ + updateNeedTransform() { + this.needLocalTransform = isNotAroundZero(this.rotation[0]) + || isNotAroundZero(this.position[0]) + || isNotAroundZero(this.position[1]) + || isNotAroundZero(this.scale[0] - 1) + || isNotAroundZero(this.scale[1] - 1); + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + + + /** + * @function LevelRenderer.Transformable.prototype.updateTransform + * @description 判断是否需要有坐标变换,更新 needTransform 属性。如果有坐标变换, 则从 position, rotation, scale 以及父节点的 transform 计算出自身的 transform 矩阵 + */ + updateTransform() { + this.updateNeedTransform(); + + if (this.parent) { + this.needTransform = this.needLocalTransform || this.parent.needTransform; + } else { + this.needTransform = this.needLocalTransform; + } + + if (!this.needTransform) { + return; + } + + var origin = [0, 0]; + + var m = this.transform || SUtil_SUtil.Util_matrix.create(); + SUtil_SUtil.Util_matrix.identity(m); + + if (this.needLocalTransform) { + if ( + isNotAroundZero(this.scale[0]) + || isNotAroundZero(this.scale[1]) + ) { + origin[0] = -this.scale[2] || 0; + origin[1] = -this.scale[3] || 0; + let haveOrigin = isNotAroundZero(origin[0]) + || isNotAroundZero(origin[1]); + if (haveOrigin) { + SUtil_SUtil.Util_matrix.translate( + m, m, origin + ); + } + SUtil_SUtil.Util_matrix.scale(m, m, this.scale); + if (haveOrigin) { + origin[0] = -origin[0]; + origin[1] = -origin[1]; + SUtil_SUtil.Util_matrix.translate( + m, m, origin + ); + } + } + + if (this.rotation instanceof Array) { + if (this.rotation[0] !== 0) { + origin[0] = -this.rotation[1] || 0; + origin[1] = -this.rotation[2] || 0; + let haveOrigin = isNotAroundZero(origin[0]) + || isNotAroundZero(origin[1]); + if (haveOrigin) { + SUtil_SUtil.Util_matrix.translate( + m, m, origin + ); + } + SUtil_SUtil.Util_matrix.rotate(m, m, this.rotation[0]); + if (haveOrigin) { + origin[0] = -origin[0]; + origin[1] = -origin[1]; + SUtil_SUtil.Util_matrix.translate( + m, m, origin + ); + } + } + } else { + if (+this.rotation !== 0) { + SUtil_SUtil.Util_matrix.rotate(m, m, this.rotation); + } + } + + if ( + isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1]) + ) { + SUtil_SUtil.Util_matrix.translate(m, m, this.position); + } + } + + // 保存这个变换矩阵 + this.transform = m; + + // 应用父节点变换 + if (this.parent && this.parent.needTransform) { + if (this.needLocalTransform) { + SUtil_SUtil.Util_matrix.mul(this.transform, this.parent.transform, this.transform); + } else { + SUtil_SUtil.Util_matrix.copy(this.transform, this.parent.transform); + } + } + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + + + /** + * @function LevelRenderer.Transformable.prototype.setTransform + * @description 将自己的 transform 应用到 context 上。 + * + * @param {Context2D} ctx - Context2D 上下文。 + */ + setTransform(ctx) { + if (this.needTransform) { + var m = this.transform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + + + + /** + * @function LevelRenderer.Transformable.prototype.decomposeTransform + * @description 分解`transform`矩阵到`position`, `rotation`, `scale` 。 + */ + decomposeTransform() { + if (!this.transform) { + return; + } + var m = this.transform; + var sx = m[0] * m[0] + m[1] * m[1]; + var position = this.position; + var scale = this.scale; + var rotation = this.rotation; + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + var sy = m[2] * m[2] + m[3] * m[3]; + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + position[0] = m[4]; + position[1] = m[5]; + scale[0] = sx; + scale[1] = sy; + scale[2] = scale[3] = 0; + rotation[0] = Math.atan2(-m[1] / sy, m[0] / sx); + rotation[1] = rotation[2] = 0; + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Shape.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @private + * @class LevelRenderer.Shape + * @category Visualization Theme + * @classdesc 图形(shape)基类。 + * @extends LevelRenderer.Eventful + * @extends LevelRenderer.Transformable + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class Shape_Shape extends mixinExt(Eventful, Transformable) { + constructor(options) { + super(options); + + options = options || {}; + /** + * @member {string} LevelRenderer.Shape.prototype.id + * @description 唯一标识。 + */ + this.id = null; + + /** + * @member {Object} LevelRenderer.Shape.prototype.style + * @description 基础绘制样式。 + * @param {string} style.brushType - 画笔类型。可设值:"fill", "stroke", "both"。默认值:"fill"。 + * @param {string} style.color - 填充颜色。默认值:"#000000'"。 + * @param {string} style.strokeColor - 描边颜色。默认值:"#000000'"。 + * @param {string} style.lineCape - 线帽样式。可设值:"butt", "round", "square"。默认值:"butt"。 + * @param {number} style.lineWidth - 描边宽度。默认值:1。 + * @param {number} style.opacity - 绘制透明度。默认值:1。 + * @param {number} style.shadowBlur - 阴影模糊度,大于0有效。默认值:0。 + * @param {number} style.shadowColor - 阴影颜色。默认值:"#000000'"。 + * @param {number} style.shadowOffsetX - 阴影横向偏移。默认值:0。 + * @param {number} style.shadowOffsetY - 阴影纵向偏移。默认值:0。 + * @param {string} style.text - 图形中的附加文本。默认值:""。 + * @param {string} style.textColor - 文本颜色。默认值:"#000000'"。 + * @param {string} style.textFont - 附加文本样式。示例:'bold 18px verdana'。 + * @param {string} style.textPosition - 附加文本位置。可设值:"inside", "left", "right", top", "bottom", "end"。默认值:"end"。 + * @param {string} style.textAlign - 附加文本水平对齐。可设值:"start", "end", "left", "right", "center"。默认根据 textPosition 自动设置。 + * @param {string} style.textBaseline - 附加文本垂直对齐。可设值:"top", "bottom", "middle", "alphabetic", "hanging", "ideographic"。默认根据 textPosition 自动设置。 + * + */ + this.style = {}; + + /** + * @member {Object} LevelRenderer.Shape.prototype.style.__rect + * @description 包围图形的最小矩形盒子。 + * + * @param {number} x - 左上角顶点x轴坐标。 + * @param {number} y - 左上角顶点y轴坐标。 + * @param {number} width - 包围盒矩形宽度。 + * @param {number} height - 包围盒矩形高度。 + */ + + /** + * @member {Object} LevelRenderer.Shape.prototype.highlightStyle + * @description 高亮样式。 + * + * @param {string} highlightStyle.brushType - 画笔类型。可设值:"fill", "stroke", "both"。默认值:"fill"。 + * @param {string} highlightStyle.color - 填充颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.strokeColor - 描边颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.lineCape - 线帽样式。可设值:"butt", "round", "square"。默认值:"butt"。 + * @param {number} highlightStyle.lineWidth - 描边宽度。默认值:1。 + * @param {number} highlightStyle.opacity - 绘制透明度。默认值:1。 + * @param {number} highlightStyle.shadowBlur - 阴影模糊度,大于0有效。默认值:0。 + * @param {number} highlightStyle.shadowColor - 阴影颜色。默认值:"#000000'"。 + * @param {number} highlightStyle.shadowOffsetX - 阴影横向偏移。默认值:0。 + * @param {number} highlightStyle.shadowOffsetY - 阴影纵向偏移。默认值:0。 + * @param {string} highlightStyle.text - 图形中的附加文本。默认值:""。 + * @param {string} highlightStyle.textColor - 文本颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.textFont - 附加文本样式。示例:'bold 18px verdana'。 + * @param {string} highlightStyle.textPosition - 附加文本位置。可设值:"inside", "left", "right", top", "bottom", "end"。默认值:"end"。 + * @param {string} highlightStyle.textAlign - 附加文本水平对齐。可设值:"start", "end", "left", "right", "center"。默认根据 textPosition 自动设置。 + * @param {string} highlightStyle.textBaseline - 附加文本垂直对齐。可设值:"top", "bottom", "middle", "alphabetic", "hanging", "ideographic"。默认根据 textPosition 自动设置。 + */ + this.highlightStyle = null; + + /** + * @member {Object} LevelRenderer.Shape.prototype.parent + * @description 父节点,只读属性。 + */ + this.parent = null; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.__dirty + * @description {boolean} + */ + this.__dirty = true; + + /** + * @member {Array} LevelRenderer.Shape.prototype.__clipShapes + * @description {Array} + * + */ + this.__clipShapes = []; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.invisible + * @description 图形是否可见,为 true 时不绘制图形,但是仍能触发鼠标事件。默认值:false。 + */ + this.invisible = false; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.ignore + * @description 图形是否忽略,为 true 时忽略图形的绘制以及事件触发。默认值:false。 + */ + this.ignore = false; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.zlevel + * @description z 层 level,决定绘画在哪层 canvas 中。默认值:0。 + */ + this.zlevel = 0; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.draggable + * @description 是否可拖拽。默认值:false。 + */ + this.draggable = false; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.clickable + * @description 是否可点击。默认值:false。 + */ + this.clickable = false; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.hoverable + * @description 是否可以 hover。默认值:true。 + */ + this.hoverable = true; + + /** + * @member {number} LevelRenderer.Shape.prototype.z + * @description z值,跟zlevel一样影响shape绘制的前后顺序,z值大的shape会覆盖在z值小的上面,但是并不会创建新的canvas,所以优先级低于zlevel,而且频繁改动的开销比zlevel小很多。默认值:0。 + */ + this.z = 0; + + //地理扩展 + /** + * @member {Array.} LevelRenderer.Shape.prototype.refOriginalPosition + * @description 图形参考原点位置,图形的参考中心位置。 + * refOriginalPosition 是长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + * + * refOriginalPosition 表示图形的参考中心,通常情况下,图形是使用 canvas 的原点位置作为位置参考, + * 但 refOriginalPosition 可以改变图形的参考位置,例如: refOriginalPosition = [80, 80], + * 图形圆的 style.x = 20, style.y = 20,那么圆在 canvas 中的实际位置是 [100, 100]。 + * + * 图形(Shape) 的所有位置相关属性都是以 refOriginalPosition 为参考中心, + * 也就是说图形的所有位置信息在 canvas 中都是以 refOriginalPosition 为参考的相对位置,只有 + * refOriginalPosition 的值为 [0, 0] 时,形的位置信息才是 canvas 绝对位置。 + * + * 图形的位置信息通常有:style.pointList,style.x,style.y。 + * + * refOriginalPosition。默认值是: [0, 0]。 + */ + this.refOriginalPosition = [0, 0]; + + /** + * @member {string} LevelRenderer.Shape.prototype.refDataID + * @description 图形所关联数据的 ID。 + * + */ + this.refDataID = null; + + /** + * @member {boolean} LevelRenderer.Shape.prototype.isHoverByRefDataID + * @description 是否根据 refDataID 进行高亮。用于同时高亮所有 refDataID 相同的图形。 + * + */ + this.isHoverByRefDataID = false; + + /** + * @member {string} LevelRenderer.Shape.prototype.refDataHoverGroup + * @description 高亮图形组的组名。此属性在 refDataID 有效且 isHoverByRefDataID 为 true 时生效。 + * 一旦设置此属性,且属性值有效,只有关联同一个数据的图形且此属性相同的图形才会高亮。 + * + */ + this.refDataHoverGroup = null; + + /** + * @member {Object} LevelRenderer.Shape.prototype.dataInfo + * @description 图形的数据信息。 + * + */ + this.dataInfo = null; + Util.extend(this, options); + this.id = this.id || Util.createUniqueID("smShape_"); + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape"; + /** + * @function LevelRenderer.Shape.prototype.getTansform + * @description 变换鼠标位置到 shape 的局部坐标空间 + * + */ + this.getTansform = (function () { + var invTransform = []; + + return function (x, y) { + var originPos = [x, y]; + // 对鼠标的坐标也做相同的变换 + if (this.needTransform && this.transform) { + SUtil_SUtil.Util_matrix.invert(invTransform, this.transform); + + SUtil_SUtil.Util_matrix.mulVector(originPos, invTransform, [x, y, 1]); + + if (x == originPos[0] && y == originPos[1]) { + // 避免外部修改导致的 needTransform 不准确 + this.updateNeedTransform(); + } + } + return originPos; + }; + })(); + + } + + + /** + * @function LevelRenderer.Shape.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.id = null; + this.style = null; + this.highlightStyle = null; + this.parent = null; + this.__dirty = null; + this.__clipShapes = null; + this.invisible = null; + this.ignore = null; + this.zlevel = null; + this.draggable = null; + this.clickable = null; + this.hoverable = null; + this.z = null; + + this.refOriginalPosition = null; + this.refDataID = null; + this.refDataHoverGroup = null; + this.isHoverByRefDataID = null; + this.dataInfo = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.prototype.brush + * @description 绘制图形。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * @param {function} updateCallback - 需要异步加载资源的 shape 可以通过这个 callback(e),让painter更新视图,base.brush 没用,需要的话重载 brush。 + */ + brush(ctx, isHighlight) { + + var style = this.beforeBrush(ctx, isHighlight); + + ctx.beginPath(); + this.buildPath(ctx, style); + + switch (style.brushType) { + /* jshint ignore:start */ + case 'both': + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + if (style.lineWidth > 0) { + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.stroke(); + } + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + case 'stroke': + this.setCtxGlobalAlpha(ctx, "stroke", style); + style.lineWidth > 0 && ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + /* jshint ignore:end */ + default: + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + } + + this.drawText(ctx, style, this.style); + + this.afterBrush(ctx); + } + + + /** + * @function LevelRenderer.Shape.prototype.beforeBrush + * @description 具体绘制操作前的一些公共操作。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * @return {Object} 处理后的样式。 + */ + beforeBrush(ctx, isHighlight) { + var style = this.style; + + if (this.brushTypeOnly) { + style.brushType = this.brushTypeOnly; + } + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle( + style, + this.highlightStyle || {}, + this.brushTypeOnly + ); + } + + if (this.brushTypeOnly == 'stroke') { + style.strokeColor = style.strokeColor || style.color; + } + + ctx.save(); + + this.doClip(ctx); + + this.setContext(ctx, style); + + // 设置transform + this.setTransform(ctx); + + return style; + } + + + /** + * @function LevelRenderer.Shape.prototype.afterBrush + * @description 绘制后的处理。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * + */ + afterBrush(ctx) { + ctx.restore(); + } + + + /** + * @function LevelRenderer.Shape.prototype.setContext + * @description 设置 fillStyle, strokeStyle, shadow 等通用绘制样式。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - 样式。 + * + */ + setContext(ctx, style) { + var STYLE_CTX_MAP = [ + ['color', 'fillStyle'], + ['strokeColor', 'strokeStyle'], + ['opacity', 'globalAlpha'], + ['lineCap', 'lineCap'], + ['lineJoin', 'lineJoin'], + ['miterLimit', 'miterLimit'], + ['lineWidth', 'lineWidth'], + ['shadowBlur', 'shadowBlur'], + ['shadowColor', 'shadowColor'], + ['shadowOffsetX', 'shadowOffsetX'], + ['shadowOffsetY', 'shadowOffsetY'] + ]; + + for (var i = 0, len = STYLE_CTX_MAP.length; i < len; i++) { + var styleProp = STYLE_CTX_MAP[i][0]; + var styleValue = style[styleProp]; + var ctxProp = STYLE_CTX_MAP[i][1]; + + if (typeof styleValue != 'undefined') { + ctx[ctxProp] = styleValue; + } + } + } + + + /** + * @function LevelRenderer.Shape.prototype.doClip + * + */ + doClip(ctx) { + var clipShapeInvTransform = SUtil_SUtil.Util_matrix.create(); + + if (this.__clipShapes) { + for (var i = 0; i < this.__clipShapes.length; i++) { + var clipShape = this.__clipShapes[i]; + if (clipShape.needTransform) { + let m = clipShape.transform; + SUtil_SUtil.Util_matrix.invert(clipShapeInvTransform, m); + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + ctx.beginPath(); + clipShape.buildPath(ctx, clipShape.style); + ctx.clip(); + // Transform back + if (clipShape.needTransform) { + let m = clipShapeInvTransform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + } + } + + + /** + * @function LevelRenderer.Shape.prototype.getHighlightStyle + * @description 根据默认样式扩展高亮样式 + * + * @param {Object} style - 样式。 + * @param {Object} highlightStyle - 高亮样式。 + * @param {string} brushTypeOnly - brushTypeOnly。 + * + */ + getHighlightStyle(style, highlightStyle, brushTypeOnly) { + var newStyle = {}; + for (let k in style) { + newStyle[k] = style[k]; + } + + var highlightColor = SUtil_SUtil.Util_color.getHighlightColor(); + // 根据highlightStyle扩展 + if (style.brushType != 'stroke') { + // 带填充则用高亮色加粗边线 + newStyle.strokeColor = highlightColor; + // SMIC-方法修改 - start + newStyle.lineWidth = (style.lineWidth || 1); + // 原始代码 + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // 修改代码1 + // if(!style.lineType || style.lineType === "solid"){ + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // } + // else{ + // newStyle.lineWidth = (style.lineWidth || 1); + // } + // SMIC-方法修改 - end + newStyle.brushType = 'both'; + } else { + if (brushTypeOnly != 'stroke') { + // 描边型的则用原色加工高亮 + newStyle.strokeColor = highlightColor; + // SMIC-方法修改 - start + newStyle.lineWidth = (style.lineWidth || 1); + // 原始代码 + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // 修改代码1 + // if(!style.lineType || style.lineType === "solid"){ + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // } + // else{ + // newStyle.lineWidth = (style.lineWidth || 1); + // } + // SMIC-方法修改 - end + } else { + // 线型的则用原色加工高亮 + newStyle.strokeColor = highlightStyle.strokeColor + || SUtil_SUtil.Util_color.mix( + style.strokeColor, + SUtil_SUtil.Util_color.toRGB(highlightColor) + ); + } + } + + // 可自定义覆盖默认值 + for (let k in highlightStyle) { + if (typeof highlightStyle[k] != 'undefined') { + newStyle[k] = highlightStyle[k]; + } + } + + return newStyle; + } + + + /** + * @function LevelRenderer.Shape.prototype.getHighlightZoom + * @description 高亮放大效果参数,当前统一设置为6,如有需要差异设置,通过 this.type 判断实例类型 + * + */ + getHighlightZoom() { + return this.type != 'text' ? 6 : 2; + } + + + /** + * @function LevelRenderer.Shape.prototype.drift + * @description 移动位置 + * + * @param {Object} dx - 横坐标变化。 + * @param {Object} dy - 纵坐标变化。 + * + */ + drift(dx, dy) { + this.position[0] += dx; + this.position[1] += dy; + } + + + + + /** + * @function LevelRenderer.Shape.prototype.buildPath + * @description 构建绘制的Path。子类必须重新实现此方法。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - 样式。 + */ + buildPath(ctx, style) { // eslint-disable-line no-unused-vars + SUtil_SUtil.Util_log('buildPath not implemented in ' + this.type); + } + + + /** + * @function LevelRenderer.Shape.prototype.getRect + * @description 计算返回包围盒矩形。子类必须重新实现此方法。 + * + * @param {Object} style - 样式。 + */ + getRect(style) { // eslint-disable-line no-unused-vars + SUtil_SUtil.Util_log('getRect not implemented in ' + this.type); + } + + + /** + * @function LevelRenderer.Shape.prototype.isCover + * @description 判断鼠标位置是否在图形内。 + * + * @param {number} x - x。 + * @param {number} y - y。 + */ + isCover(x, y) { + var originPos = this.getTansform(x, y); + x = originPos[0]; + y = originPos[1]; + + // 快速预判并保留判断矩形 + var rect = this.style.__rect; + if (!rect) { + rect = this.style.__rect = this.getRect(this.style); + } + + if (x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height) + ) { + // 矩形内 + return SUtil_SUtil.Util_area.isInside(this, this.style, x, y); + } + + return false; + } + + + /** + * @function LevelRenderer.Shape.prototype.drawText + * @description 绘制附加文本。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {string} style - 样式。 + * @param {string} normalStyle - normalStyle 默认样式,用于定位文字显示。 + */ + drawText(ctx, style, normalStyle) { + if (typeof(style.text) == 'undefined' || style.text === false) { + return; + } + // 字体颜色策略 + var textColor = style.textColor || style.color || style.strokeColor; + ctx.fillStyle = textColor; + + // 文本与图形间空白间隙 + var dd = 10; + var al; // 文本水平对齐 + var bl; // 文本垂直对齐 + var tx; // 文本横坐标 + var ty; // 文本纵坐标 + + var textPosition = style.textPosition // 用户定义 + || this.textPosition // shape默认 + || 'top'; // 全局默认 + + // Smic 方法修改 -start + var __OP = []; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + __OP = [0, 0]; + } else { + __OP = this.refOriginalPosition; + } + //原代码: + // Smic 方法修改 -end + + switch (textPosition) { + case 'inside': + case 'top': + case 'bottom': + case 'left': + case 'right': + if (this.getRect) { + var rect = (normalStyle || style).__rect + || this.getRect(normalStyle || style); + + switch (textPosition) { + case 'inside': + tx = rect.x + rect.width / 2; + ty = rect.y + rect.height / 2; + al = 'center'; + bl = 'middle'; + if (style.brushType != 'stroke' + && textColor == style.color + ) { + ctx.fillStyle = '#fff'; + } + break; + case 'left': + tx = rect.x - dd; + ty = rect.y + rect.height / 2; + al = 'end'; + bl = 'middle'; + break; + case 'right': + tx = rect.x + rect.width + dd; + ty = rect.y + rect.height / 2; + al = 'start'; + bl = 'middle'; + break; + case 'top': + tx = rect.x + rect.width / 2; + ty = rect.y - dd; + al = 'center'; + bl = 'bottom'; + break; + case 'bottom': + tx = rect.x + rect.width / 2; + ty = rect.y + rect.height + dd; + al = 'center'; + bl = 'top'; + break; + } + } + break; + case 'start': + case 'end': + var xStart = 0; + var xEnd = 0; + var yStart = 0; + var yEnd = 0; + if (typeof style.pointList != 'undefined') { + var pointList = style.pointList; + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + var length = pointList.length; + switch (textPosition) { + // Smic 方法修改 -start + case 'start': + xStart = pointList[0][0] + __OP[0]; + xEnd = pointList[1][0] + __OP[0]; + yStart = pointList[0][1] + __OP[1]; + yEnd = pointList[1][1] + __OP[1]; + break; + case 'end': + xStart = pointList[length - 2][0] + __OP[0]; + xEnd = pointList[length - 1][0] + __OP[0]; + yStart = pointList[length - 2][1] + __OP[1]; + yEnd = pointList[length - 1][1] + __OP[1]; + break; + //原代码: + /* + case 'start': + xStart = pointList[0][0]; + xEnd = pointList[1][0]; + yStart = pointList[0][1]; + yEnd = pointList[1][1]; + break; + case 'end': + xStart = pointList[length - 2][0]; + xEnd = pointList[length - 1][0]; + yStart = pointList[length - 2][1]; + yEnd = pointList[length - 1][1]; + break; + */ + // Smic 方法修改 -end + } + } else { + // Smic 方法修改 -start + xStart = (style.xStart + __OP[0]) || 0; + xEnd = (style.xEnd + __OP[0]) || 0; + yStart = (style.yStart + __OP[1]) || 0; + yEnd = (style.yEnd + __OP[1]) || 0; + //原代码: + /* + xStart = style.xStart || 0; + xEnd = style.xEnd || 0; + yStart = style.yStart || 0; + yEnd = style.yEnd || 0; + */ + // Smic 方法修改 -end + } + + switch (textPosition) { + case 'start': + al = xStart < xEnd ? 'end' : 'start'; + bl = yStart < yEnd ? 'bottom' : 'top'; + tx = xStart; + ty = yStart; + break; + case 'end': + al = xStart < xEnd ? 'start' : 'end'; + bl = yStart < yEnd ? 'top' : 'bottom'; + tx = xEnd; + ty = yEnd; + break; + } + dd -= 4; + if (xStart && xEnd && xStart != xEnd) { + tx -= (al == 'end' ? dd : -dd); + } else { + al = 'center'; + } + + if (yStart != yEnd) { + ty -= (bl == 'bottom' ? dd : -dd); + } else { + bl = 'middle'; + } + break; + case 'specific': + tx = style.textX || 0; + ty = style.textY || 0; + al = 'start'; + bl = 'middle'; + break; + } + + // Smic 方法修改 -start + if (style.labelXOffset && !isNaN(style.labelXOffset)) { + tx += style.labelXOffset; + } + if (style.labelYOffset && !isNaN(style.labelYOffset)) { + ty += style.labelYOffset; + } + //原代码: + // Smic 方法修改 -end + + if (tx != null && ty != null) { + Shape_Shape._fillText( + ctx, + style.text, + tx, ty, + style.textFont, + style.textAlign || al, + style.textBaseline || bl + ); + } + } + + + /** + * @function LevelRenderer.Shape.prototype.modSelf + * @description 图形发生改变 + */ + modSelf() { + this.__dirty = true; + if (this.style) { + this.style.__rect = null; + } + if (this.highlightStyle) { + this.highlightStyle.__rect = null; + } + } + + + /** + * @function LevelRenderer.Shape.prototype.isSilent + * @description 图形是否会触发事件,通过 bind 绑定的事件 + */ + isSilent() { + return !( + this.hoverable || this.draggable || this.clickable + || this.onmousemove || this.onmouseover || this.onmouseout + || this.onmousedown || this.onmouseup || this.onclick + || this.ondragenter || this.ondragover || this.ondragleave + || this.ondrop + ); + } + + + /** + * @function LevelRenderer.Shape.prototype.setCtxGlobalAlpha + * @description 设置 Cavans 上下文全局透明度 + * + * @param {Object} _ctx - Cavans 上下文 + * @param {string} type - one of 'stroke', 'fill', or 'reset' + * @param {Object} style - Symbolizer hash + */ + setCtxGlobalAlpha(_ctx, type, style) { + if (type === "fill") { + _ctx.globalAlpha = typeof(style["fillOpacity"]) === "undefined" ? (typeof(style["opacity"]) === "undefined" ? 1 : style['opacity']) : style['fillOpacity']; + } else if (type === "stroke") { + _ctx.globalAlpha = typeof(style["strokeOpacity"]) === "undefined" ? (typeof(style["opacity"]) === "undefined" ? 1 : style['opacity']) : style['strokeOpacity']; + } else { + _ctx.globalAlpha = typeof(style["opacity"]) === "undefined" ? 1 : style['opacity']; + } + } + + /** + * @function LevelRenderer.Shape.prototype._fillText + * @description 填充文本 + */ + static _fillText(ctx, text, x, y, textFont, textAlign, textBaseline) { + if (textFont) { + ctx.font = textFont; + } + ctx.textAlign = textAlign; + ctx.textBaseline = textBaseline; + var rect = Shape_Shape._getTextRect( + text, x, y, textFont, textAlign, textBaseline + ); + + text = (text + '').split('\n'); + + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', textFont); + + switch (textBaseline) { + case 'top': + y = rect.y; + break; + case 'bottom': + y = rect.y + lineHeight; + break; + default: + y = rect.y + lineHeight / 2; + } + + for (var i = 0, l = text.length; i < l; i++) { + ctx.fillText(text[i], x, y); + y += lineHeight; + } + } + + /** + * @function LevelRenderer.Shape._getTextRect + * @description 返回矩形区域,用于局部刷新和文字定位 + * + * @param {string} text - text。 + * @param {number} x - x。 + * @param {number} y - y。 + * @param {string} textFont - textFont。 + * @param {string} textAlign - textAlign。 + * @param {string} textBaseline - textBaseline。 + * @return {Object} 矩形区域。 + */ + static _getTextRect(text, x, y, textFont, textAlign, textBaseline) { + var width = SUtil_SUtil.Util_area.getTextWidth(text, textFont); + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', textFont); + + text = (text + '').split('\n'); + + switch (textAlign) { + case 'end': + case 'right': + x -= width; + break; + case 'center': + x -= (width / 2); + break; + } + + switch (textBaseline) { + case 'top': + break; + case 'bottom': + y -= lineHeight * text.length; + break; + default: + y -= lineHeight * text.length / 2; + } + + return { + x: x, + y: y, + width: width, + height: lineHeight * text.length + }; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicPoint.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicPoint + * @category Visualization Theme + * @classdesc 点。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicPoint({ + * style: { + * x: 100, + * y: 100, + * r: 40, + * brushType: 'both', + * color: 'blue', + * strokeColor: 'red', + * lineWidth: 3, + * text: 'point' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicPoint extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicPoint.prototype.type + * @description 图形类型。 + */ + this.type = 'smicpoint'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicPoint"; + } + + + /** + * @function cdestroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicPoint.prototype.buildPath + * @description 创建点触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r, 0, Math.PI * 2, true); + return; + } + + + /** + * @function LevelRenderer.Shape.SmicPoint.prototype.getRect + * @description 计算返回点的包围盒矩形。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + if (style.__rect) { + return style.__rect; + } + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - style.r - lineWidth / 2), + y: Math.round((style.y + __OP[1]) - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicText.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicText + * @category Visualization Theme + * @extends {LevelRenderer.Shape} + * @example + * var shape = new LevelRenderer.Shape.SmicText({ + * style: { + * text: 'Label', + * x: 100, + * y: 100, + * textFont: '14px Arial' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class SmicText extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicText.prototype.type + * @description 图形类型. + */ + this.type = 'smictext'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicText"; + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.brush + * @description 笔触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * + */ + brush(ctx, isHighlight) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var style = this.style; + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle( + style, this.highlightStyle || {} + ); + } + + if (typeof(style.text) == 'undefined' || style.text === false) { + return; + } + + ctx.save(); + this.doClip(ctx); + + this.setContext(ctx, style); + + // 设置transform + this.setTransform(ctx); + + if (style.textFont) { + ctx.font = style.textFont; + } + ctx.textAlign = style.textAlign || 'start'; + ctx.textBaseline = style.textBaseline || 'middle'; + + var text = (style.text + '').split('\n'); + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', style.textFont); + var rect = this.getRectNoRotation(style); + // var x = style.x; + var x = style.x + __OP[0]; + var y; + if (style.textBaseline == 'top') { + y = rect.y; + } else if (style.textBaseline == 'bottom') { + y = rect.y + lineHeight; + } else { + y = rect.y + lineHeight / 2; + } + var ox = style.x + __OP[0]; + var oy = style.y + __OP[1]; + + //文本绘制 + for (var i = 0, l = text.length; i < l; i++) { + //是否渲染矩形背景及颜色 + if (style.labelRect) { + //+4,-2是为了让文字距边框左右边缘有点间隔 + ctx.fillRect(rect.x - 2, rect.y, rect.width + 4, rect.height); + ctx.fillStyle = style.strokeColor; + ctx.strokeRect(rect.x - 2, rect.y, rect.width + 4, rect.height); + ctx.fillStyle = style.textColor; + } + + switch (style.brushType) { + case 'stroke': + this.setCtxGlobalAlpha(ctx, "stroke", style); + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + if (style.textBaseline == 'top') { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * i, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * i); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height); + } + } else { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + } + } + ctx.restore(); + } else { + if (style.maxWidth) { + ctx.strokeText(text[i], x, y, style.maxWidth); + } else { + ctx.strokeText(text[i], x, y); + } + } + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + case 'both': + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + if (style.textBaseline == 'top') { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * i, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * i, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * i); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * i); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } else { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } + ctx.restore(); + } else { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], x, y, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], x, y, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], x, y); + this.setCtxGlobalAlpha(ctx, "reset", style); + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], x, y); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } + break; + default: + //fill or others + this.setCtxGlobalAlpha(ctx, "fill", style); + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + if (style.textBaseline == 'top') { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * i, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * i); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height); + } + } else { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + } + } + ctx.restore(); + } else { + if (style.maxWidth) { + ctx.fillText(text[i], x, y, style.maxWidth); + } else { + ctx.fillText(text[i], x, y); + } + } + this.setCtxGlobalAlpha(ctx, "reset", style); + } + y += lineHeight; + } + + ctx.restore(); + return; + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRect + * @description 返回文字包围盒矩形 + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + var left, top, right, bottom + var tbg = this.getTextBackground(style, true); + for (var i = 0, len = tbg.length; i < len; i++) { + var poi = tbg[i]; + + //用第一个点初始化 + if (i == 0) { + left = poi[0]; + right = poi[0]; + top = poi[1]; + bottom = poi[1]; + } else { + if (poi[0] < left) { + left = poi[0] + } + if (poi[0] > right) { + right = poi[0] + } + if (poi[1] < top) { + top = poi[1] + } + if (poi[1] > bottom) { + bottom = poi[1] + } + } + } + + style.__rect = { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + + return style.__rect; + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRectNoRotation + * @description 返回忽略旋转和maxWidth时文字包围盒矩形 + */ + getRectNoRotation(style) { + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', style.textFont); + + var width = SUtil_SUtil.Util_area.getTextWidth(style.text, style.textFont); + var height = SUtil_SUtil.Util_area.getTextHeight(style.text, style.textFont); + + //处理文字位置,注:文本的绘制是由此 rect 决定 + var textX = style.x + __OP[0]; // 默认start == left + if (style.textAlign == 'end' || style.textAlign == 'right') { + textX -= width; + } else if (style.textAlign == 'center') { + textX -= (width / 2); + } + + var textY; + if (style.textBaseline == 'top') { + // textY = style.y; + textY = style.y + __OP[1]; + } else if (style.textBaseline == 'bottom') { + textY = (style.y + __OP[1]) - height; + } else { + // middle + textY = (style.y + __OP[1]) - height / 2; + } + + var isWidthChangeByMaxWidth = false; + var widthBeforeChangeByMaxWidth; + + //处理 maxWidth + if (style.maxWidth) { + var maxWidth = parseInt(style.maxWidth); + if (maxWidth < width) { + widthBeforeChangeByMaxWidth = width; + isWidthChangeByMaxWidth = true; + width = maxWidth; + } + + textX = style.x + __OP[0]; + if (style.textAlign == 'end' || style.textAlign == 'right') { + textX -= width; + } else if (style.textAlign == 'center') { + textX -= (width / 2); + } + } + + //处理斜体字 + if (style.textFont) { + var textFont = style.textFont; + var textFontStr = textFont.toLowerCase() + if (textFontStr.indexOf("italic") > -1) { + if (isWidthChangeByMaxWidth === true) { + width += (lineHeight / 3) * (width / widthBeforeChangeByMaxWidth); + } else { + width += lineHeight / 3; + } + } + } + + var rect = { + x: textX, + y: textY, + width: width, + height: height + }; + + return rect; + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.getTextBackground + * @description 获取文本背景框范围 + * + * @param {Object} style - 样式。 + * @param {boolean} redo - 是否强制重新计算 textBackground。 + */ + getTextBackground(style, redo) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + if ((!redo) && style.__textBackground) { + return style.__textBackground; + } + + //不旋转时矩形框 + var rect = this.getRectNoRotation(style); + + //旋转中心点 + var ox = style.x + __OP[0]; + var oy = style.y + __OP[1]; + + //背景框 + var background = []; + + if (style.textRotation && style.textRotation !== 0) { + let textRotation = style.textRotation; + let ltPoi = this.getRotatedLocation(rect.x, rect.y, ox, oy, textRotation); + let rtPoi = this.getRotatedLocation(rect.x + rect.width, rect.y, ox, oy, textRotation); + let rbPoi = this.getRotatedLocation(rect.x + rect.width, rect.y + rect.height, ox, oy, textRotation); + let lbPoi = this.getRotatedLocation(rect.x, rect.y + rect.height, ox, oy, textRotation); + + background.push(ltPoi); + background.push(rtPoi); + background.push(rbPoi); + background.push(lbPoi); + } else { + let ltPoi = [rect.x, rect.y]; + let rtPoi = [rect.x + rect.width, rect.y]; + let rbPoi = [rect.x + rect.width, rect.y + rect.height]; + let lbPoi = [rect.x, rect.y + rect.height]; + + background.push(ltPoi); + background.push(rtPoi); + background.push(rbPoi); + background.push(lbPoi); + } + + style.__textBackground = background; + + return style.__textBackground; + } + + + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRotatedLocation + * @description 获取一个点绕旋转中心顺时针旋转后的位置。(此方法用于屏幕坐标) + * + * @param {number} x - 旋转点横坐标。 + * @param {number} y - 旋转点纵坐标。 + * @param {number} rx - 旋转中心点横坐标。 + * @param {number} ry - 旋转中心点纵坐标。 + * @param {number} angle - 旋转角度(度)。 + * @return {Array.} 旋转后的坐标位置,长度为 2 的一维数组,数组第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + getRotatedLocation(x, y, rx, ry, angle) { + var loc = new Array(), x0, y0; + + y = -y; + ry = -ry; + angle = -angle;//顺时针旋转 + x0 = (x - rx) * Math.cos((angle / 180) * Math.PI) - (y - ry) * Math.sin((angle / 180) * Math.PI) + rx; + y0 = (x - rx) * Math.sin((angle / 180) * Math.PI) + (y - ry) * Math.cos((angle / 180) * Math.PI) + ry; + + loc[0] = x0; + loc[1] = -y0; + return loc; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicCircle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicCircle + * @category Visualization Theme + * @classdesc 圆形 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicCircle({ + * style: { + * x: 100, + * y: 100, + * r: 60, + * brushType: "both", + * color: "blue", + * strokeColor: "red", + * lineWidth: 3, + * text: "Circle" + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicCircle extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicCircle.prototype.type + * @description 图形类型。 + */ + this.type = 'smiccircle'; + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicCircle"; + } + + + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.buildPath + * @description 创建图形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var x = style.x + __OP[0]; // 圆心x + var y = style.y + __OP[1]; // 圆心y + + ctx.moveTo(x + style.r, y); + ctx.arc(x, y, style.r, 0, Math.PI * 2, true); + + return true; + } + + + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.getRect + * @description 返回圆形包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var x = style.x + __OP[0]; // 圆心x + var y = style.y + __OP[1]; // 圆心y + var r = style.r; // 圆r + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round(x - r - lineWidth / 2), + y: Math.round(y - r - lineWidth / 2), + width: r * 2 + lineWidth, + height: r * 2 + lineWidth + }; + + return style.__rect; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicPolygon.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @private + * @class LevelRenderer.Shape.SmicPolygon + * @category Visualization Theme + * @classdesc 多边形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicPolygon({ + * style: { + * // 100x100 的正方形 + * pointList: [[0, 0], [100, 0], [100, 100], [0, 100]], + * color: 'blue' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class SmicPolygon extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicPolygon.prototype.type + * @description 图形类型. + */ + this.type = 'smicpolygon'; + + /** + * @member {Array} LevelRenderer.Shape.SmicPolygon.prototype._holePolygonPointList + * @description 岛洞面多边形顶点数组(三维数组) + * + */ + this.holePolygonPointLists = null; + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicPolygon"; + } + + + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + this.holePolygonPointLists = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.brush + * @description 笔触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * + */ + brush(ctx, isHighlight) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var style = this.style; + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle( + style, + this.highlightStyle || {} + ); + } + + ctx.save(); + this.setContext(ctx, style); + + // 设置 transform + this.setTransform(ctx); + + // 先 fill 再stroke + var hasPath = false; + if (style.brushType == 'fill' || style.brushType == 'both' || typeof style.brushType == 'undefined') { // 默认为fill + ctx.beginPath(); + if (style.lineType == 'dashed' + || style.lineType == 'dotted' + || style.lineType == 'dot' + || style.lineType == 'dash' + || style.lineType == 'dashdot' + || style.lineType == 'longdash' + || style.lineType == 'longdashdot' + ) { + // 特殊处理,虚线围不成path,实线再build一次 + this.buildPath(ctx, { + lineType: 'solid', + lineWidth: style.lineWidth, + pointList: style.pointList + } + ); + } else { + this.buildPath(ctx, style); + hasPath = true; // 这个path能用 + } + ctx.closePath(); + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + + if (style.lineWidth > 0 && (style.brushType == 'stroke' || style.brushType == 'both')) { + if (!hasPath) { + ctx.beginPath(); + this.buildPath(ctx, style); + } + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + + this.drawText(ctx, style, this.style); + + //岛洞 + var hpStyle = Util.cloneObject(style); + + if (hpStyle.pointList) { + if (this.holePolygonPointLists && this.holePolygonPointLists.length > 0) { + var holePLS = this.holePolygonPointLists; + var holePLSen = holePLS.length; + for (var i = 0; i < holePLSen; i++) { + var holePL = holePLS[i]; + //岛洞面 + hpStyle.pointList = holePL; + + ctx.globalCompositeOperation = "destination-out"; + // 先 fill 再stroke + hasPath = false; + if (hpStyle.brushType == 'fill' || hpStyle.brushType == 'both' || typeof hpStyle.brushType == 'undefined') { // 默认为fill + ctx.beginPath(); + if (hpStyle.lineType == 'dashed' + || hpStyle.lineType == 'dotted' + || hpStyle.lineType == 'dot' + || hpStyle.lineType == 'dash' + || hpStyle.lineType == 'dashdot' + || hpStyle.lineType == 'longdash' + || hpStyle.lineType == 'longdashdot' + ) { + // 特殊处理,虚线围不成path,实线再build一次 + this.buildPath(ctx, { + lineType: 'solid', + lineWidth: hpStyle.lineWidth, + pointList: hpStyle.pointList + } + ); + } else { + this.buildPath(ctx, hpStyle); + hasPath = true; // 这个path能用 + } + ctx.closePath(); + this.setCtxGlobalAlpha(ctx, "fill", hpStyle); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", hpStyle); + } + + if (hpStyle.lineWidth > 0 && (hpStyle.brushType == 'stroke' || hpStyle.brushType == 'both')) { + if (!hasPath) { + ctx.beginPath(); + this.buildPath(ctx, hpStyle); + } + //如果描边,先回复 globalCompositeOperation 默认值再描边。 + ctx.globalCompositeOperation = "source-over"; + this.setCtxGlobalAlpha(ctx, "stroke", hpStyle); + ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", hpStyle); + } else { + ctx.globalCompositeOperation = "source-over"; + } + } + } + + } + ctx.restore(); + return; + } + + + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.buildPath + * @description 创建多边形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (style.showShadow) { + ctx.shadowBlur = style.shadowBlur; + ctx.shadowColor = style.shadowColor; + ctx.shadowOffsetX = style.shadowOffsetX; + ctx.shadowOffsetY = style.shadowOffsetY; + } + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + // 虽然能重用 brokenLine,但底层图形基于性能考虑,重复代码减少调用吧 + var pointList = style.pointList; + + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + + if (style.smooth && style.smooth !== 'spline') { + var controlPoints = SUtil_SUtil.SUtil_smoothBezier(pointList, style.smooth, true, style.smoothConstraint, __OP); + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + var cp1; + var cp2; + var p; + var len = pointList.length; + for (var i = 0; i < len; i++) { + cp1 = controlPoints[i * 2]; + cp2 = controlPoints[i * 2 + 1]; + p = [pointList[(i + 1) % len][0] + __OP[0], pointList[(i + 1) % len][1] + __OP[1]]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } else { + if (style.smooth === 'spline') { + pointList = SUtil_SUtil.SUtil_smoothSpline(pointList, true, null, __OP); + } + + if (!style.lineType || style.lineType == 'solid') { + // 默认为实线 + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (let i = 1; i < pointList.length; i++) { + ctx.lineTo(pointList[i][0] + __OP[0], pointList[i][1] + __OP[1]); + } + ctx.lineTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + } else if (style.lineType === 'dashed' + || style.lineType === 'dotted' + || style.lineType === 'dot' + || style.lineType === 'dash' + || style.lineType === 'longdash' + ) { + // SMIC-方法修改 - start + let dashLengthForStyle = style._dashLength || (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1); + style._dashLength = dashLengthForStyle; + + let dashLength = (style.lineWidth || 1); + let pattern1 = dashLength; + let pattern2 = dashLength; + + //dashed + if (style.lineType === 'dashed') { + pattern1 *= 5; + pattern2 *= 5; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + //dotted + if (style.lineType === 'dotted') { + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } + + //dot + if (style.lineType === 'dot') { + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } + + //dash + if (style.lineType === 'dash') { + pattern1 *= 4; + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + //longdash + if (style.lineType === 'longdash') { + pattern1 *= 8; + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (let i = 1; i < pointList.length; i++) { + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[i - 1][0] + __OP[0], + pointList[i - 1][1] + __OP[1], + pointList[i][0] + __OP[0], + pointList[i][1] + __OP[1], + dashLength, + [pattern1, pattern2] + ); + } + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[pointList.length - 1][0] + __OP[0], + pointList[pointList.length - 1][1] + __OP[1], + pointList[0][0] + __OP[0], + pointList[0][1] + __OP[1], + dashLength, + [pattern1, pattern2] + ); + } else if (style.lineType === 'dashdot' + || style.lineType === 'longdashdot' + ) { + let dashLengthForStyle = style._dashLength || (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1); + style._dashLength = dashLengthForStyle; + + let dashLength = (style.lineWidth || 1); + let pattern1 = dashLength; + let pattern2 = dashLength; + let pattern3 = dashLength; + let pattern4 = dashLength; + + //dashdot + if (style.lineType === 'dashdot') { + pattern1 *= 4; + pattern2 *= 4; + pattern4 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + pattern3 = 1; + pattern4 += dashLength; + } + } + + //longdashdot + if (style.lineType === 'longdashdot') { + pattern1 *= 8; + pattern2 *= 4; + pattern4 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + pattern3 = 1; + pattern4 += dashLength; + } + } + + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (let i = 1; i < pointList.length; i++) { + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[i - 1][0] + __OP[0], + pointList[i - 1][1] + __OP[1], + pointList[i][0] + __OP[0], + pointList[i][1] + __OP[1], + dashLength, + [pattern1, pattern2, pattern3, pattern4] + ); + } + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[pointList.length - 1][0] + __OP[0], + pointList[pointList.length - 1][1] + __OP[1], + pointList[0][0] + __OP[0], + pointList[0][1] + __OP[1], + dashLength, + [pattern1, pattern2, pattern3, pattern4] + ); + } + + } + return; + } + + + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.getRect + * @description 计算返回多边形包围盒矩阵。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + getRect(style, refOriginalPosition) { + var __OP; + if (!refOriginalPosition) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + __OP = this.refOriginalPosition; + } else { + __OP = refOriginalPosition; + } + + if (style.__rect) { + return style.__rect; + } + + var minX = Number.MAX_VALUE; + var maxX = Number.MIN_VALUE; + var minY = Number.MAX_VALUE; + var maxY = Number.MIN_VALUE; + + var pointList = style.pointList; + for (var i = 0, l = pointList.length; i < l; i++) { + if (pointList[i][0] + __OP[0] < minX) { + minX = pointList[i][0] + __OP[0]; + } + if (pointList[i][0] + __OP[0] > maxX) { + maxX = pointList[i][0] + __OP[0]; + } + if (pointList[i][1] + __OP[1] < minY) { + minY = pointList[i][1] + __OP[1]; + } + if (pointList[i][1] + __OP[1] > maxY) { + maxY = pointList[i][1] + __OP[1]; + } + } + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(minX - lineWidth / 2), + y: Math.round(minY - lineWidth / 2), + width: maxX - minX + lineWidth, + height: maxY - minY + lineWidth + }; + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicBrokenLine.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @private + * @class LevelRenderer.Shape.SmicBrokenLine + * @category Visualization Theme + * @classdesc 折线(ic)。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicBrokenLine({ + * style: { + * pointList: [[0, 0], [100, 100], [100, 0]], + * smooth: 'bezier', + * strokeColor: 'purple' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicBrokenLine extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.brushTypeOnly + * @description 线条只能描边。 + */ + this.brushTypeOnly = 'stroke'; + + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.textPosition + * @description 文本位置。 + */ + this.textPosition = 'end'; + + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.type + * @description 图形类型. + */ + this.type = 'smicbroken-line'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicBrokenLine"; + } + + + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.brushTypeOnly = null; + this.textPosition = null; + this.type = null; + + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.buildPath + * @description 创建折线路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + + var pointList = style.pointList; + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + + var len = Math.min(style.pointList.length, Math.round(style.pointListLength || style.pointList.length)); + + if (style.smooth && style.smooth !== 'spline') { + var controlPoints = SUtil_SUtil.SUtil_smoothBezier(pointList, style.smooth, false, style.smoothConstraint, __OP); + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + var cp1; + var cp2; + var p; + for (let i = 0; i < len - 1; i++) { + cp1 = controlPoints[i * 2]; + cp2 = controlPoints[i * 2 + 1]; + p = [pointList[i + 1][0] + __OP[0], pointList[i + 1][1] + __OP[1]]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } else { + if (style.smooth === 'spline') { + pointList = SUtil_SUtil.SUtil_smoothSpline(pointList, null, null, __OP); + len = pointList.length; + } + if (!style.lineType || style.lineType === 'solid') { + // 默认为实线 + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (let i = 1; i < len; i++) { + ctx.lineTo(pointList[i][0] + __OP[0], pointList[i][1] + __OP[1]); + } + } else if (style.lineType === 'dashed' + || style.lineType === 'dotted' + || style.lineType === 'dot' + || style.lineType === 'dash' + || style.lineType === 'longdash' + ) { + let dashLength = (style.lineWidth || 1); + let pattern1 = dashLength; + let pattern2 = dashLength; + + //dashed + if (style.lineType === 'dashed') { + pattern1 *= 5; + pattern2 *= 5; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + //dotted + if (style.lineType === 'dotted') { + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } + + //dot + if (style.lineType === 'dot') { + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } + + //dash + if (style.lineType === 'dash') { + pattern1 *= 4; + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + //longdash + if (style.lineType === 'longdash') { + pattern1 *= 8; + pattern2 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (var i = 1; i < len; i++) { + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[i - 1][0] + __OP[0], pointList[i - 1][1] + __OP[1], + pointList[i][0] + __OP[0], pointList[i][1] + __OP[1], + dashLength, + [pattern1, pattern2] + ); + } + } else if (style.lineType === 'dashdot' + || style.lineType === 'longdashdot' + ) { + let dashLength = (style.lineWidth || 1); + let pattern1 = dashLength; + let pattern2 = dashLength; + let pattern3 = dashLength; + let pattern4 = dashLength; + + //dashdot + if (style.lineType === 'dashdot') { + pattern1 *= 4; + pattern2 *= 4; + pattern4 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + pattern3 = 1; + pattern4 += dashLength; + } + } + + //longdashdot + if (style.lineType === 'longdashdot') { + pattern1 *= 8; + pattern2 *= 4; + pattern4 *= 4; + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + pattern3 = 1; + pattern4 += dashLength; + } + } + + dashLength = (style.lineWidth || 1) + * (style.lineType === 'dashed' ? 5 : 1); + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + for (let i = 1; i < len; i++) { + SUtil_SUtil.SUtil_dashedLineTo( + ctx, + pointList[i - 1][0] + __OP[0], pointList[i - 1][1] + __OP[1], + pointList[i][0] + __OP[0], pointList[i][1] + __OP[1], + dashLength, + [pattern1, pattern2, pattern3, pattern4] + ); + } + } + + } + return; + } + + + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.getRect + * @description 计算返回折线包围盒矩形。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + return SmicPolygon.prototype.getRect.apply(this, [style, __OP]); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicImage.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicImage + * @category Visualization Theme + * @classdesc 图片绘制。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicImage({ + * style: { + * image: 'test.jpg', + * x: 100, + * y: 100 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicImage extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicImage.prototype.type + * @description 图形类型。 + */ + this.type = 'smicimage'; + + /** + * @member {string} LevelRenderer.Shape.SmicImage.prototype._imageCache + * @description 图片缓存。 + */ + this._imageCache = {}; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicImage"; + } + + + /** + * @function LevelRenderer.Shape.SmicImage.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + this._imageCache = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicImage.prototype.buildPath + * @description 创建图片。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + brush(ctx, isHighlight, refresh) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var style = this.style || {}; + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle( + style, this.highlightStyle || {} + ); + } + + var image = style.image; + var me = this; + + if (typeof(image) === 'string') { + var src = image; + if (this._imageCache[src]) { + image = this._imageCache[src]; + } else { + image = new Image(); + image.onload = function () { + image.onload = null; + clearTimeout(SmicImage._refreshTimeout); + SmicImage._needsRefresh.push(me); + // 防止因为缓存短时间内触发多次onload事件 + SmicImage._refreshTimeout = setTimeout(function () { + refresh && refresh(SmicImage._needsRefresh); + // 清空 needsRefresh + SmicImage._needsRefresh = []; + }, 10); + }; + + image.src = src; + this._imageCache[src] = image; + } + } + if (image) { + // 图片已经加载完成 + if (image.nodeName.toUpperCase() == 'IMG') { + if (window.ActiveXObject) { + if (image.readyState != 'complete') { + return; + } + } else { + if (!image.complete) { + return; + } + } + } + // Else is canvas + var width = style.width || image.width; + var height = style.height || image.height; + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + + // 图片加载失败 + if (!image.width || !image.height) { + return; + } + + ctx.save(); + + this.doClip(ctx); + + this.setContext(ctx, style); + + // 设置transform + this.setTransform(ctx); + + if (style.sWidth && style.sHeight) { + let sx = (style.sx + __OP[0]) || 0; + let sy = (style.sy + __OP[1]) || 0; + ctx.drawImage( + image, + sx, sy, style.sWidth, style.sHeight, + x, y, width, height + ); + } else if (style.sx && style.sy) { + let sx = style.sx + __OP[0]; + let sy = style.sy + __OP[1]; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage( + image, + sx, sy, sWidth, sHeight, + x, y, width, height + ); + } else { + ctx.drawImage(image, x, y, width, height); + } + // 如果没设置宽和高的话自动根据图片宽高设置 + if (!style.width) { + style.width = width; + } + if (!style.height) { + style.height = height; + } + if (!this.style.width) { + this.style.width = width; + } + if (!this.style.height) { + this.style.height = height; + } + + this.drawText(ctx, style, this.style); + + ctx.restore(); + } + } + + + /** + * @function LevelRenderer.Shape.SmicImage.prototype.getRect + * @description 计算返回图片的包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + return { + x: style.x + __OP[0], + y: style.y + __OP[1], + width: style.width, + height: style.height + }; + } + + + /** + * @function LevelRenderer.Shape.SmicImage.prototype.clearCache + * @description 清除图片缓存。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + clearCache() { + this._imageCache = {}; + } + +} +SmicImage._needsRefresh = []; +SmicImage._refreshTimeout = null; + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicRectangle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicRectangle + * @category Visualization Theme + * @classdesc 矩形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicRectangle({ + * style: { + * x: 0, + * y: 0, + * width: 100, + * height: 100, + * radius: 20 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class SmicRectangle extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicRectangle.prototype.type + * @description 图形类型. + */ + this.type = 'smicrectangle'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicRectangle"; + } + + + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * APIMethod: _buildRadiusPath + * 创建矩形的圆角路径。 + * + * Parameters: + * ctx - {CanvasRenderingContext2D} Context2D 上下文。 + * style - {Object} style。 + * + */ + _buildRadiusPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var width = style.width; + var height = style.height; + var r = style.radius; + var r1; + var r2; + var r3; + var r4; + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.quadraticCurveTo( + x + width, y, x + width, y + r2 + ); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.quadraticCurveTo( + x + width, y + height, x + width - r3, y + height + ); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.quadraticCurveTo( + x, y + height, x, y + height - r4 + ); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y); + } + + + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.buildPath + * @description 创建矩形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + if (!style.radius) { + ctx.moveTo(style.x + __OP[0], style.y + __OP[1]); + ctx.lineTo((style.x + __OP[0]) + style.width, (style.y + __OP[1])); + ctx.lineTo((style.x + __OP[0]) + style.width, (style.y + __OP[1]) + style.height); + ctx.lineTo((style.x + __OP[0]), (style.y + __OP[1]) + style.height); + ctx.lineTo(style.x + __OP[0], style.y + __OP[1]); + // ctx.rect(style.x, style.y, style.width, style.height); + } else { + this._buildRadiusPath(ctx, style); + } + ctx.closePath(); + return; + } + + + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.getRect + * @description 计算返回矩形包围盒矩阵。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + if (style.__rect) { + return style.__rect; + } + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - lineWidth / 2), + y: Math.round((style.y + __OP[1]) - lineWidth / 2), + width: style.width + lineWidth, + height: style.height + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicSector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicSector + * @category Visualization Theme + * @classdesc 扇形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicSector({ + * style: { + * x: 100, + * y: 100, + * r: 60, + * r0: 30, + * startAngle: 0, + * endEngle: 180 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicSector extends Shape_Shape { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicSector.protptype.type + * @description 图形类型。 + */ + this.type = 'smicsector'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicSector"; + } + + /** + * @function LevelRenderer.Shape.SmicSector.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + /** + * @function LevelRenderer.Shape.SmicSector.prototype.buildPath + * @description 创建扇形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var x = style.x + __OP[0]; // 圆心x + var y = style.y + __OP[1]; // 圆心y + var r0 = style.r0 || 0; // 形内半径[0,r) + var r = style.r; // 扇形外半径(0,r] + var startAngle = style.startAngle; // 起始角度[0,360) + var endAngle = style.endAngle; // 结束角度(0,360] + var clockWise = style.clockWise || false; + + startAngle = SUtil_SUtil.Util_math.degreeToRadian(startAngle); + endAngle = SUtil_SUtil.Util_math.degreeToRadian(endAngle); + + if (!clockWise) { + // 扇形默认是逆时针方向,Y轴向上 + // 这个跟arc的标准不一样,为了兼容echarts + startAngle = -startAngle; + endAngle = -endAngle; + } + + var unitX = SUtil_SUtil.Util_math.cos(startAngle); + var unitY = SUtil_SUtil.Util_math.sin(startAngle); + ctx.moveTo( + unitX * r0 + x, + unitY * r0 + y + ); + + ctx.lineTo( + unitX * r + x, + unitY * r + y + ); + + ctx.arc(x, y, r, startAngle, endAngle, !clockWise); + + ctx.lineTo( + SUtil_SUtil.Util_math.cos(endAngle) * r0 + x, + SUtil_SUtil.Util_math.sin(endAngle) * r0 + y + ); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockWise); + } + + ctx.closePath(); + + return; + } + + /** + * @function LevelRenderer.Shape.SmicSector.prototype.getRect + * @description 返回扇形包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var min0 = SUtil_SUtil.Util_vector.create(); + var min1 = SUtil_SUtil.Util_vector.create(); + var max0 = SUtil_SUtil.Util_vector.create(); + var max1 = SUtil_SUtil.Util_vector.create(); + + var x = style.x + __OP[0]; // 圆心x + var y = style.y + __OP[1]; // 圆心y + var r0 = style.r0 || 0; // 形内半径[0,r) + var r = style.r; // 扇形外半径(0,r] + var startAngle = SUtil_SUtil.Util_math.degreeToRadian(style.startAngle); + var endAngle = SUtil_SUtil.Util_math.degreeToRadian(style.endAngle); + var clockWise = style.clockWise; + + if (!clockWise) { + startAngle = -startAngle; + endAngle = -endAngle; + } + + if (r0 > 1) { + SUtil_SUtil.Util_computeBoundingBox.arc( + x, y, r0, startAngle, endAngle, !clockWise, min0, max0 + ); + } else { + min0[0] = max0[0] = x; + min0[1] = max0[1] = y; + } + SUtil_SUtil.Util_computeBoundingBox.arc( + x, y, r, startAngle, endAngle, !clockWise, min1, max1 + ); + + SUtil_SUtil.Util_vector.min(min0, min0, min1); + SUtil_SUtil.Util_vector.max(max0, max0, max1); + style.__rect = { + x: min0[0], + y: min0[1], + width: max0[0] - min0[0], + height: max0[1] - min0[1] + }; + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/ShapeFactory.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + +/** + * @class FeatureShapeFactory + * @aliasclass Feature.ShapeFactory + * @deprecatedclass SuperMap.Feature.ShapeFactory + * @category Visualization Theme + * @classdesc 图形工厂类。 + * 目前支持创建的图形有:
+ * 用于统计专题图:
+ * 点 - 参数对象 <{@link ShapeParametersPoint}>
+ * 线 - 参数对象 <{@link ShapeParametersLine}>
+ * 面 - 参数对象 <{@link ShapeParametersPolygon}>
+ * 矩形 - 参数对象 <{@link ShapeParametersPolygon}>
+ * 扇形 - 参数对象 <{@link ShapeParametersSector}>
+ * 标签 - 参数对象 <{@link ShapeParametersLabel}>
+ * 图片 - 参数对象 <{@link ShapeParametersImage}>
+ * 用于符号专题图:
+ * 圆形 - 参数对象:<{@link ShapeParametersCircle}> + * @param {Object} [shapeParameters] - 图形参数对象,<{@link ShapeParameters}> 子类对象。 + * @usage + */ +class ShapeFactory { + constructor(shapeParameters) { + /** + * @member {Object} FeatureShapeFactory.prototype.shapeParameters + * @description 图形参数对象,<{@link ShapeParameters}> 子类对象。必设参数,默认值 null。 + */ + this.shapeParameters = shapeParameters; + + this.CLASS_NAME = "SuperMap.Feature.ShapeFactory"; + } + + + /** + * @function FeatureShapeFactory.prototype.destroy + * @description 销毁图形工厂类对象。 + */ + destroy() { + this.shapeParameters = null; + } + + + /** + * @function FeatureShapeFactory.prototype.createShape + * @description 创建一个图形。具体图形由 shapeParameters 决定。 + * @param {Object} shapeParameters - 图形参数对象,<{@link ShapeParameters}> 子类对象。 + * 此参数可选,如果使用此参数(不为 null),shapeParameters 属性值将被修改为参数的值,然后再使用 shapeParameters 属性值创建图形; + * 如果不使用此参数,createShape 方法将直接使用 shapeParameters 属性创建图形。 + * @returns {Object} 图形对象(或 null - 图形创建失败)。 + */ + createShape(shapeParameters) { + if (shapeParameters) { + this.shapeParameters = shapeParameters; + } + + if (!this.shapeParameters) { + return null; + } + + var sps = this.shapeParameters; + + + if (sps instanceof Point_Point) { // 点 + //设置style + let style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + style["r"] = sps.r; + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y']); + + //创建图形 + let shape = new SmicPoint(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Line_Line) { // 线 + //检查参数 pointList 是否存在 + if (!sps.pointList) { + return null; + } + + // 设置style + let style = new Object(); + style["pointList"] = sps.pointList; + style = Util.copyAttributesWithClip(style, sps.style, ['pointList']); + + // 创建图形 + let shape = new SmicBrokenLine(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['pointList', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Polygon_Polygon) { // 面 + //检查参数 pointList 是否存在 + if (!sps.pointList) { + return null; + } + + //设置style + let style = new Object(); + style["pointList"] = sps.pointList; + style = Util.copyAttributesWithClip(style, sps.style, ['pointList']); + + //创建图形 + let shape = new SmicPolygon(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['pointList', 'style', "highlightStyle"]); + + return shape; + } else if (sps instanceof Rectangle_Rectangle) { // 矩形 + //检查参数 pointList 是否存在 + if (!sps.x && !sps.y & !sps.width & !sps.height) { + return null; + } + + //设置style + let style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + style["width"] = sps.width; + style["height"] = sps.height; + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y', 'width', 'height']); + + //创建图形 + let shape = new SmicRectangle(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'width', 'height', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Sector) { // 扇形 + //设置style + let style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + style["r"] = sps.r; + style["startAngle"] = sps.startAngle; + style["endAngle"] = sps.endAngle; + if (sps["r0"]) { + style["r0"] = sps.r0 + } + + if (sps["clockWise"]) { + style["clockWise"] = sps.clockWise + } + + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y', 'r', 'startAngle', 'endAngle', 'r0', 'endAngle']); + + //创建图形 + let shape = new SmicSector(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'r', 'startAngle', 'endAngle', 'r0', 'endAngle', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Label) { // 标签 + //设置style + let style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + style["text"] = sps.text; + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y', 'text']); + + //创建图形 + let shape = new SmicText(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'text', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Image_Image) { // 图片 + //设置style + let style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + if (sps["image"]) { + style["image"] = sps.image; + } + if (sps["width"]) { + style["width"] = sps.width; + } + if (sps["height"]) { + style["height"] = sps.height; + } + if (sps["sx"]) { + style["sx"] = sps.sx; + } + if (sps["sy"]) { + style["sy"] = sps.sy; + } + if (sps["sWidth"]) { + style["sWidth"] = sps.sWidth + } + if (sps["sHeight"]) { + style["sHeight"] = sps.sHeight + } + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y', 'image', 'width', 'height', 'sx', 'sy', 'sWidth', 'sHeight']); + + //创建图形 + let shape = new SmicImage(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'image', 'width', 'height', 'style', 'highlightStyle']); + + return shape; + } else if (sps instanceof Circle_Circle) { //圆形 用于符号专题图 + //设置stytle + let style = new Object(); + style["x"] = sps.x; + style["r"] = sps.r; + style["y"] = sps.y; + + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y', 'r']); + + //创建图形 + let shape = new SmicCircle(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'r', 'style', 'highlightStyle', 'lineWidth', 'text', 'textPosition']); + + return shape; + } + + return null + } + + + /** + * @function FeatureShapeFactory.prototype.transformStyle + * @description 将用户 feature.style (类 Svg style 标准) 的样式,转换为 levelRenderer 的样式标准(类 CSS-Canvas 样式) + * @param {Object} style - 用户 style。 + * @returns {Object} 符合 levelRenderer 的 style。 + */ + static transformStyle(style) { + var newStyle = {}; + + //字体 ["font-style", "font-variant", "font-weight", "font-size / line-height", "font-family"]; + var fontStr = ["normal", "normal", "normal", "12", "arial,sans-serif"]; + + //画笔类型 ["fill", "stroke"]; + var brushType = [true, false]; + + for (var ss in style) { + switch (ss) { + case "fill": + brushType[0] = style[ss]; + break; + case "fillColor": + newStyle["color"] = style[ss]; + break; + case "stroke": + brushType[1] = style[ss]; + break; + case "strokeWidth": + newStyle["lineWidth"] = style[ss]; + break; + case "strokeLinecap": + newStyle["lineCap"] = style[ss]; + break; + case "strokeLineJoin": + newStyle["lineJoin"] = style[ss]; + break; + case "strokeDashstyle": + newStyle["lineType"] = style[ss]; + break; + case "pointRadius": + newStyle["r"] = style[ss]; + break; + case "label": + newStyle["text"] = style[ss]; + break; + case "labelRect": + newStyle["labelRect"] = style[ss]; + break; + case "fontColor": + newStyle["textColor"] = style[ss]; + break; + case "fontStyle": + fontStr[0] = style[ss]; + break; + case "fontVariant": + fontStr[1] = style[ss]; + break; + case "fontWeight": + fontStr[2] = style[ss]; + break; + case "fontSize": + var unit = ""; + if (style[ss] && style[ss].toString().indexOf("px") < 0) { + unit = "px"; + } + fontStr[3] = style[ss] + unit; + break; + case "fontFamily": + fontStr[4] = style[ss]; + break; + case "fontOpacity": + newStyle["opacity"] = style[ss]; + break; + case "labelPosition": + newStyle["textPosition"] = style[ss]; + break; + case "labelAlign": + newStyle["textAlign"] = style[ss]; + break; + case "labelBaseline": + newStyle["textBaseline"] = style[ss]; + break; + case "labelRotation": + newStyle["textRotation"] = style[ss]; + break; + + default: + newStyle[ss] = style[ss]; + break; + } + } + + //拼接字体字符串 + newStyle["textFont"] = fontStr.join(" "); + + //画笔类型 + if (brushType[0] === true && brushType[1] === false) { + newStyle["brushType"] = "fill"; + } else if (brushType[0] === false && brushType[1] === true) { + newStyle["brushType"] = "stroke"; + } else if (brushType[0] === true && brushType[1] === true) { + newStyle["brushType"] = "both"; + } else { + newStyle["brushType"] = "fill"; + } + + //默认线宽 1 + if (newStyle["lineWidth"] == null) { + newStyle["lineWidth"] = 1; + } + + return newStyle; + } + + /** + * @function FeatureShapeFactory.prototype.Background + * @description 创建一个矩形背景框图形对象。 + * @param {FeatureShapeFactory} shapeFactory - 图形工厂对象。 + * @param {Array.} box - 框区域,长度为 4 的一维数组,像素坐标,[left, bottom, right, top]。 + * @param {Object} setting - 图表配置参数。本函数中图形配置对象 setting 可设属性: + * @param {Object} setting.backgroundStyle - 背景样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.backgroundRadius=[0,0,0,0]] - 背景框矩形圆角半径,可以用数组分别指定四个角的圆角半径,设:左上、右上、右下、左下角的半径依次为 r1、r2、r3、r4,则 backgroundRadius 为 [r1、r2、r3、r4 ]。 + * @returns {Object} 背景框图形,一个可视化图形(矩形)对象。 + */ + static Background(shapeFactory, box, setting) { + var sets = setting ? setting : {}; + + // 背景框图形参数对象 + var bgSP = new Rectangle_Rectangle(box[0], box[3], Math.abs(box[2] - box[0]), Math.abs(box[3] - box[1])); + + // 默认样式 + bgSP.style = { + fillColor: "#f3f3f3" + }; + + // 设置用户 style + if (sets.backgroundStyle) { + Util.copyAttributesWithClip(bgSP.style, sets.backgroundStyle); + } + + // 设置背景框圆角参数 + if (sets.backgroundRadius) { + bgSP.style["radius"] = sets.backgroundRadius; + } + + // 禁止背景框响应事件 + bgSP.clickable = false; + bgSP.hoverable = false; + + return shapeFactory.createShape(bgSP); + } + + /** + * @function FeatureShapeFactory.prototype.GraphAxis + * @description 创建一个统计图表坐标轴图形对象组。 + * @param {FeatureShapeFactory} shapeFactory - 图形工厂对象。 + * @param {Array.} dataViewBox - 统计图表模型的数据视图框,长度为 4 的一维数组,像素坐标,[left, bottom, right, top]。 + * @param {Object} setting - 图表配置参数。 + * @param {Object} setting.axisStyle - 坐标轴样式,此样式对象对象可设属性:。 + * @param {boolean} [setting.axisUseArrow=false] - 坐标轴是否使用箭头。 + * @param {number} [setting.axisYTick=0] - y 轴刻度数量,0表示不使用箭头。 + * @param {Array.} setting.axisYLabels - y 轴上的标签组内容,标签顺序沿着数据视图框左面条边自上而下,等距排布。例如:["1000", "750", "500", "250", "0"]。 + * @param {Object} setting.axisYLabelsStyle - y 轴上的标签组样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.axisYLabelsOffset=[0,0]] - y 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 y 轴标签组横向上的偏移量,向左为正,默认值:0;数组第二项表示 y 轴标签组纵向上的偏移量,向下为正,默认值:0。 + * @param {Array.} setting.axisXLabels - x 轴上的标签组内容,标签顺序沿着数据视图框下面条边自左向右排布,例如:["92年", "95年", "99年"]。 + * 标签排布规则:当标签数量与 xShapeInfo 中的属性 xPositions 数量相同(即标签个数与数据个数相等时), 按照 xPositions 提供的位置在水平方向上排布标签,否则沿数据视图框下面条边等距排布标签。 + * @param {Object} setting.axisXLabelsStyle - x 轴上的标签组样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.axisXLabelsOffset=[0,0]] - x 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 x 轴标签组横向上的偏移量,向左为正,默认值:0;数组第二项表示 x 轴标签组纵向上的偏移量,向下为正,默认值:0。 + * @param {boolean} setting.useXReferenceLine - 是否使用水平参考线,如果为 true,在 axisYTick 大于 0 时有效,水平参考线是 y 轴刻度在数据视图框里的延伸。 + * @param {Object} setting.xReferenceLineStyle - 水平参考线样式,此样式对象对象可设属性:。 + * @param {number} [setting.axis3DParameter=0] - 3D 坐标轴参数,此属性值在大于等于 15 时有效。 + * @param {Object} xShapeInfo - X 方向上的图形信息对象,包含两个属性。 + * @param {Array.} xShapeInfo.xPositions - 图形在 x 轴方向上的像素坐标值,是一个一维数组,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * @param {number} xShapeInfo.width - 图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * @returns {Array.} 统计图表坐标轴图形对象数组。 + */ + static GraphAxis(shapeFactory, dataViewBox, setting, xShapeInfo) { + var dvb = dataViewBox; + var sets = setting ? setting : {}; + + // 参考线图形对象组 + var refLines = []; + //坐标轴箭头对象组 + var arrows = []; + // 是否使用参水平考线,默认不使用 + var isAddRefLine = sets.useXReferenceLine ? sets.useXReferenceLine : false; + // y 轴上的刻度 + var axisytick = (sets.axisYTick && !isNaN(sets.axisYTick)) ? sets.axisYTick : 0; + // 坐标轴节点数组 + var pois = []; + //z 轴箭头数组 + var zArrowPois = []; + // x,y 轴主干节点数组 + var xMainPois = []; + if (axisytick == 0) { + xMainPois.push([dvb[0], dvb[3] - 5]); + xMainPois.push([dvb[0], dvb[1]]); + + // 3D 坐标轴 第三象限平分线 + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + let axis3DParameter = parseInt(sets.axis3DParameter); + let axis3DPoi = [dvb[0] - axis3DParameter, dvb[1] + axis3DParameter]; + + // 添加 3D 轴节点 + if (sets.axisUseArrow) { // 添加 3D 轴箭头节点坐标 + //箭头坐标 + zArrowPois.push([axis3DPoi[0] + 1.5, axis3DPoi[1] - 7.5]); + zArrowPois.push([axis3DPoi[0] - 1, axis3DPoi[1] + 1]); + zArrowPois.push([axis3DPoi[0] + 7.5, axis3DPoi[1] - 1.5]); + //3D轴 + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } else { + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + + xMainPois.push([dvb[0], dvb[1]]); + } + xMainPois.push([dvb[2] + 5, dvb[1]]); + } else { + // 单位刻度长度 + var unitTick = Math.abs(dvb[1] - dvb[3]) / axisytick; + // 刻度 y 坐标 + var thckY = dvb[3]; + + xMainPois.push([dvb[0], thckY - 5]); + + for (var i = 0; i < axisytick; i++) { + xMainPois.push([dvb[0], thckY]); + xMainPois.push([dvb[0] - 5, thckY]); + xMainPois.push([dvb[0], thckY]); + + // 参考线 + if (isAddRefLine) { + // 参考线参数对象 + var refLineSP = new Line_Line([ + [dvb[0], thckY], + [dvb[2], thckY] + ]); + // 参考线默认样式对象 + refLineSP.style = { + strokeColor: "#cfcfcf", + strokeLinecap: "butt", + strokeLineJoin: "round", + strokeWidth: 1 + }; + // 禁止事件 + refLineSP.clickable = false; + refLineSP.hoverable = false; + // 用户style + if (sets.xReferenceLineStyle) { + Util.copyAttributesWithClip(refLineSP.style, sets.xReferenceLineStyle); + } + // 生成参考线图形对象 + refLines.push(shapeFactory.createShape(refLineSP)) + } + + // y 刻度增量 + thckY += unitTick; + } + + xMainPois.push([dvb[0], dvb[1]]); + + // 3D 坐标轴 第三象限平分线 + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + let axis3DParameter = parseInt(sets.axis3DParameter); + let axis3DPoi = [dvb[0] - axis3DParameter, dvb[1] + axis3DParameter]; + + /* + // 箭头计算过程 + var axis3DPoiRef = [axis3DPoi[0] + 7, axis3DPoi[1] - 7]; // 7 是 10 为斜边 cos(45度)时邻边的值 + var axis3DPoiLT = [axis3DPoiRef[0] - 4, axis3DPoiRef[1] - 4]; + var axis3DPoiRB = [axis3DPoiRef[0] + 4, axis3DPoiRef[1] + 4]; + if(sets.axisUseArrow){ + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + xMainPois.push([axis3DPoiLT[0], axis3DPoiLT[1]]); + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + xMainPois.push([axis3DPoiRB[0], axis3DPoiRB[1]]); + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + else{ + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + */ + + // 添加 3D 轴节点 + if (sets.axisUseArrow) { // 添加 3D 轴和箭头坐标 + //箭头坐标 + zArrowPois.push([axis3DPoi[0] + 1.5, axis3DPoi[1] - 7.5]); + zArrowPois.push([axis3DPoi[0] - 1, axis3DPoi[1] + 1]); + zArrowPois.push([axis3DPoi[0] + 7.5, axis3DPoi[1] - 1.5]); + //3D轴 + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } else { + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + + xMainPois.push([dvb[0], dvb[1]]); + } + + xMainPois.push([dvb[2] + 5, dvb[1]]); + } + // 坐标轴箭头 + if (sets.axisUseArrow) { + // x 轴箭头节点数组 + var xArrowPois = [ + [dvb[2] + 5, dvb[1] + 4], + [dvb[2] + 13, dvb[1]], + [dvb[2] + 5, dvb[1] - 4] + ]; + + // y 轴箭头节点数组 + var yArrowPois = [ + [dvb[0] - 4, dvb[3] - 5], + [dvb[0], dvb[3] - 13], + [dvb[0] + 4, dvb[3] - 5] + ]; + + //x轴箭头 + var xSP = new Polygon_Polygon(xArrowPois); + xSP.style = {fillColor: "#008acd"}; + Util.copyAttributesWithClip(xSP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(xSP)); + + //y轴箭头 + var ySP = new Polygon_Polygon(yArrowPois); + ySP.style = {fillColor: "#008acd"}; + Util.copyAttributesWithClip(ySP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(ySP)); + + // z轴箭头 坐标轴箭头是否要使用 + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + var zSP = new Polygon_Polygon(zArrowPois); + zSP.style = {fillColor: "#008acd"}; + Util.copyAttributesWithClip(zSP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(zSP)); + } + + } + //不带箭头的坐标轴 + pois = xMainPois; + + // 坐标轴参数对象 + var axisSP = new Line_Line(pois); + // 坐标轴默认style + axisSP.style = { + strokeLinecap: "butt", + strokeLineJoin: "round", + strokeColor: "#008acd", + strokeWidth: 1 + }; + // 用户 style + if (sets.axisStyle) { + Util.copyAttributesWithClip(axisSP.style, sets.axisStyle); + } + // 禁止事件 + axisSP.clickable = false; + axisSP.hoverable = false; + // 创建坐标轴图形对象 + var axisMain = [shapeFactory.createShape(axisSP)]; + + // Y 轴标签 + var yLabels = []; + if (sets.axisYLabels && sets.axisYLabels.length && sets.axisYLabels.length > 0) { + var axisYLabels = sets.axisYLabels; + let len = axisYLabels.length; + + // 标签偏移量 + var ylOffset = [0, 0]; + if (sets.axisYLabelsOffset && sets.axisYLabelsOffset.length) { + ylOffset = sets.axisYLabelsOffset; + } + + if (len == 1) { + // 标签参数对象 + let labelYSP = new Label(dvb[0] - 5 + ylOffset[0], dvb[3] + ylOffset[1], axisYLabels[0]); + labelYSP.style = { + labelAlign: "right" + }; + // 用户 style + if (sets.axisYLabelsStyle) { + Util.copyAttributesWithClip(labelYSP.style, sets.axisYLabelsStyle); + } + // 禁止事件 + labelYSP.clickable = false; + labelYSP.hoverable = false; + // 制作标签 + yLabels.push(shapeFactory.createShape(labelYSP)); + } else { + var labelY = dvb[3]; + // y 轴标签单位距离 + var yUnit = Math.abs(dvb[1] - dvb[3]) / (len - 1); + + for (var j = 0; j < len; j++) { + // 标签参数对象 + let labelYSP = new Label(dvb[0] - 5 + ylOffset[0], labelY + ylOffset[1], axisYLabels[j]); + labelYSP.style = { + labelAlign: "right" + }; + // 用户 style + if (sets.axisYLabelsStyle) { + Util.copyAttributesWithClip(labelYSP.style, sets.axisYLabelsStyle); + } + // 禁止事件 + labelYSP.clickable = false; + labelYSP.hoverable = false; + // 制作标签 + yLabels.push(shapeFactory.createShape(labelYSP)); + // y 轴标签 y 方向增量 + labelY += yUnit; + } + } + } + + // X 轴标签 + var xLabels = []; + if (sets.axisXLabels && sets.axisXLabels.length && sets.axisXLabels.length > 0) { + let axisXLabels = sets.axisXLabels; + let len = axisXLabels.length; + + // 标签偏移量 + let xlOffset = [0, 0]; + if (sets.axisXLabelsOffset && sets.axisXLabelsOffset.length) { + xlOffset = sets.axisXLabelsOffset; + } + + // 标签个数与数据字段个数相等等时,标签在 x 轴均匀排列 + if (xShapeInfo && xShapeInfo.xPositions && xShapeInfo.xPositions.length && xShapeInfo.xPositions.length == len) { + let xsCenter = xShapeInfo.xPositions; + for (let K = 0; K < len; K++) { + // 标签参数对象 + let labelXSP = new Label(xsCenter[K] + xlOffset[0], dvb[1] + xlOffset[1], axisXLabels[K]); + // 默认 style + labelXSP.style = { + labelAlign: "center", + labelBaseline: "top" + }; + // 用户 style + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(labelXSP.style, sets.axisXLabelsStyle); + } + // 禁止事件 + labelXSP.clickable = false; + labelXSP.hoverable = false; + // 创建标签对象 + xLabels.push(shapeFactory.createShape(labelXSP)); + } + } else { + if (len == 1) { + // 标签参数对象 + let labelXSP = new Label(dvb[0] - 5 + xlOffset[0], dvb[1] + xlOffset[0], axisXLabels[0]); + // 默认 style + labelXSP.style = { + labelAlign: "center", + labelBaseline: "top" + }; + // 用户 style + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(labelXSP.style, sets.axisXLabelsStyle); + } + // 禁止事件 + labelXSP.clickable = false; + labelXSP.hoverable = false; + // 创建标签对象 + xLabels.push(shapeFactory.createShape(labelXSP)); + } else { + let labelX = dvb[0]; + // x 轴标签单位距离 + let xUnit = Math.abs(dvb[2] - dvb[0]) / (len - 1); + + for (let m = 0; m < len; m++) { + // 标签参数对象 + let labelXSP = new Label(labelX + xlOffset[0], dvb[1] + xlOffset[1], axisXLabels[m]); + // 默认 style + labelXSP.style = { + labelAlign: "center", + labelBaseline: "top" + }; + // 用户 style + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(labelXSP.style, sets.axisXLabelsStyle); + } + // 禁止事件 + labelXSP.clickable = false; + labelXSP.hoverable = false; + // 创建标签对象 + xLabels.push(shapeFactory.createShape(labelXSP)); + // x 轴标签 x 方向增量 + labelX += xUnit; + } + } + } + } + + // 组装并返回构成坐标轴的图形 + return ((refLines.concat(axisMain)).concat(yLabels)).concat(xLabels).concat(arrows); + } + + /** + * @function FeatureShapeFactory.prototype.ShapeStyleTool + * @description 一个图形 style 处理工具。此工具将指定的默认 style,通用 style,按 styleGroup 取得的 style 和按数据值 value 范围取得的 style 进行合并,得到图形最终的 style。 + * @param {Object} defaultStyle - 默认style,此样式对象可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。 + * @param {Object} style - 图形对象基础 style,此参数控制图形的基础样式,可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。优先级低于 styleGroup,styleByCodomain。 + * @param {Array.} styleGroup - 一个 style 数组,优先级低于 styleByCodomain,高于 style。此数组每个元素是样式对象, + * 其可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。通过 index 参数从 styleGroup 中取 style。 + * @param {Array.} styleByCodomain - 按数据(参数 value)所在值域范围控制数据的可视化对象样式。 + * (start code) + * // styleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,其可设属性根据图形类型参考 子类对象的 style 属性。。 + * // dataStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * (end) + * @param {number} index - styleGroup 的索引值,用于取出 styleGroup 指定的 style。 + * @param {number} value - 数据值,用于取出 styleByCodomain 指定的 style。 + * @returns {Object} 合并后的样式 (style) 对象。 + */ + static ShapeStyleTool(defaultStyle, style, styleGroup, styleByCodomain, index, value) { + // 用 defaultStyle 初始化 style 对象 + var finalStyle = defaultStyle ? defaultStyle : {}; + + // 基础 style + if (style) { + Util.copyAttributesWithClip(finalStyle, style); + } + + // 按索引赋 style + if (styleGroup && styleGroup.length && typeof(index) !== "undefined" && !isNaN(index) && index >= 0) { + if (styleGroup[index]) { + Util.copyAttributesWithClip(finalStyle, styleGroup[index]); + } + } + + // 按值域赋 style + if (styleByCodomain && styleByCodomain.length && typeof(value) !== "undefined") { + var dsc = styleByCodomain; + var dscLen = dsc.length; + var v = parseFloat(value); + for (var i = 0; i < dscLen; i++) { + if (dsc[i].start <= v && v < dsc[i].end) { + Util.copyAttributesWithClip(finalStyle, dsc[i].style); + break; + } + } + } + + return finalStyle; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/Theme.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FeatureTheme + * @aliasclass Feature.Theme + * @deprecatedclass SuperMap.Feature.Theme + * @category Visualization Theme + * @classdesc 专题要素基类。 + * @param {Object} data - 用户数据,用于生成可视化 shape。 + * @param {SuperMap.Layer.Theme} layer - 此专题要素所在图层。 + * @usage + */ +class Theme_Theme { + constructor(data, layer) { + + if (!data) { + return; + } + // layer 必须已经添加到地图, 且已初始化渲染器 + if (!layer || !layer.map || !layer.renderer) { + return; + } + + /** + * @member {string} FeatureTheme.prototype.id + * @description 专题要素唯一标识。 + */ + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + + /** + * @member {LonLat} FeatureTheme.prototype.lonlat + * @description 专题要素地理参考位置。子类中必须根据用户数据(或地理位置参数)对其赋值。 + */ + this.lonlat = null; + + /** + * @member {Array.} FeatureTheme.prototype.location + * @description 专题要素像素参考位置。通常由地理参考位置决定。长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + this.location = []; + + /** + * @readonly + * @member {Object} FeatureTheme.prototype.data + * @description 用户数据,用于生成可视化 shape,可在子类中规定数据格式或类型,如:<{@link FeatureVector}>。 + */ + this.data = data; + + /** + * @readonly + * @member {Array.} FeatureTheme.prototype.shapes + * @description 构成此专题要素的可视化图形对象数组,数组顺序控制渲染。 + */ + this.shapes = []; + + /** + * @readonly + * @member {SuperMap.Layer.Theme} FeatureTheme.prototype.layer + * @description 此专题要素所在专题图层。 + */ + this.layer = layer; + + this.CLASS_NAME = "SuperMap.Feature.Theme"; + + } + + + /** + * @function FeatureTheme.prototype.destroy + * @description 销毁专题要素。 + */ + destroy() { + this.data = null; + this.id = null; + this.lonlat = null; + this.location = null; + this.shapes = null; + this.layer = null; + } + + + /** + * @function FeatureTheme.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {GeometryPoint|GeometryGeoText|LonLat} coordinate - 地理坐标点。 + * @returns {Array.} 长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + getLocalXY(coordinate) { + var resolution = this.layer.map.getResolution(); + var extent = this.layer.map.getExtent(); + + if (coordinate instanceof Point || coordinate instanceof GeoText) { + let x = (coordinate.x / resolution + (-extent.left / resolution)); + let y = ((extent.top / resolution) - coordinate.y / resolution); + return [x, y]; + } else if (coordinate instanceof LonLat) { + let x = (coordinate.lon / resolution + (-extent.left / resolution)); + let y = ((extent.top / resolution) - coordinate.lat / resolution); + return [x, y]; + } else { + return null; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Graph.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemeGraph + * @aliasclass Feature.Theme.Graph + * @deprecatedclass SuperMap.Feature.Theme.Graph + * @category Visualization Theme + * @classdesc 统计专题要素基类。 + * 此类定义了统计专题要素基础模型,具体的图表模型通过继承此类,在子类中实现 assembleShapes 方法。 + * 统计专题要素模型采用了可视化图形大小自适应策略,用较少的参数控制着图表诸多图形,图表配置对象 的基础属性只有 7 个, + * 它们控制着图表结构、值域范围、数据小数位等基础图表形态。构成图表的图形必须在图表结构里自适应大小。 + * 此类不可实例化,此类的可实例化子类必须实现 assembleShapes() 方法。 + * @extends FeatureTheme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Theme} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {Object} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + */ +class Graph extends Theme_Theme { + + + constructor(data, layer, fields, setting, lonlat, options) { + super(data, layer, fields, setting, lonlat, options); + + /** + * @member {FeatureShapeFactory} FeatureThemeGraph.prototype.shapeFactory + * @description 内置的图形工厂对象,调用其 createShape 方法创建图形。 + */ + this.shapeFactory = new ShapeFactory(); + + /** + * @member {Object} FeatureThemeGraph.prototype.shapeParameters + * @description 当前图形参数对象,<{@link ShapeParameters}> 的子类对象。 + */ + this.shapeParameters = null; + + /** + * @member {boolean} [FeatureThemeGraph.prototype.RelativeCoordinate] + * @description 图形是否已经计算了相对坐标。 + */ + this.RelativeCoordinate = false; + + /** + * @member {Object} FeatureThemeGraph.prototype.setting + * @description 图表配置对象,该对象控制着图表的可视化显示。 + * @param {number} width - 专题要素(图表)宽度。 + * @param {number} height - 专题要素(图表)高度。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox + * (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。 + * 如果不设置此参数,在取数据值时不对数据做小数位处理。 + * + */ + this.setting = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.origonPoint + * @description 专题要素(图表)原点,图表左上角点像素坐标,是长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + this.origonPoint = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.chartBox + * @description 专题要素(图表)区域,即图表框,长度为 4 的一维数组,数组的 4 个元素依次表示图表框左端 x 坐标值、 + * 下端 y坐标值、 右端 x坐标值、 上端 y 坐标值;[left, bottom, right, top]。 + */ + this.chartBox = null; + + /** + * @readonly + * @member {Bounds} FeatureThemeGraph.prototype.chartBounds + * @description 图表 Bounds 随着 lonlat、XOffset、YOffset 更新,注意 chartBounds 是图表像素范围,不是地理范围。 + */ + this.chartBounds = null; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.width + * @description 专题要素(图表)宽度 。 + */ + this.width = null; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.height + * @description 专题要素(图表)高度 。 + */ + this.height = null; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.XOffset + * @description 专题要素(图表)在 X 方向上的偏移值,单位像素。 + */ + this.XOffset = 0; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.YOffset + * @description 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + */ + this.YOffset = 0; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBParameter + * @description 数据视图框参数,长度为 4 的一维数组(数组元素值 >= 0),[leftOffset, bottomOffset, rightOffset, topOffset],chartBox 内偏距值。 + * 此属性用于指定数据视图框 dataViewBox 的范围。 + */ + this.DVBParameter = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.dataViewBox + * @description 数据视图框,长度为 4 的一维数组,[left, bottom, right, top]。 + * dataViewBox 是统计专题要素最核心的内容,它负责解释数据在一个像素区域里的数据可视化含义, + * 这种含义用可视化图形表达出来,这些表示数据的图形和一些辅助图形组合在一起构成统计专题图表。 + */ + this.dataViewBox = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBCodomain + * @description 数据视图框的内允许展示的数据值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * dataViewBox 中允许的数据范围,对数据溢出值域范围情况的处理需要在 assembleShapes 中进行。 + */ + this.DVBCodomain = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBCenterPoint + * @description 数据视图框中心点,长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + this.DVBCenterPoint = null; + + /** + * @readonly + * @member {string} FeatureThemeGraph.prototype.DVBUnitValue + * @description 单位值。在 assembleShapes() 中初始化其具体意义,例如:饼图的 DVBUnitValue 可以定义为"360/数据总和", + * 折线图的 DVBUnitValue 可以定义为 "DVBCodomain/DVBHeight"。 + */ + this.DVBUnitValue = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBOrigonPoint + * @description 数据视图框原点,数据视图框左上角点,长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + this.DVBOrigonPoint = null; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.DVBWidth + * @description 数据视图框宽度。 + */ + this.DVBWidth = null; + + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.DVBHeight + * @description 数据视图框高度。 + */ + this.DVBHeight = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.origonPointOffset + * @description 数据视图框原点相对于图表框的原点偏移量,长度为 2 的一维数组,第一个元素表示 x 偏移量,第二个元素表示 y 偏移量。 + */ + this.origonPointOffset = null; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.fields + * @description 数据{FeatureVector}属性字段。 + */ + this.fields = fields || []; + + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.dataValues + * @description 图表展示的数据值,通过 fields 从数据 feature 属性中获得。 + */ + this.dataValues = null; + // 图表位置 + if (lonlat) { + this.lonlat = lonlat; + } else { + // 默认使用 bounds 中心 + this.lonlat = this.data.geometry.getBounds().getCenterLonLat(); + } + + // 配置项检测与赋值 + if (setting && setting.width && setting.height && setting.codomain) { + this.setting = setting; + } + this.CLASS_NAME = "SuperMap.Feature.Theme.Graph"; + + } + + /** + * @function FeatureThemeGraph.prototype.destroy + * @description 销毁专题要素。 + */ + destroy() { + this.shapeFactory = null; + this.shapeParameters = null; + this.width = null; + this.height = null; + this.origonPoint = null; + this.chartBox = null; + this.dataViewBox = null; + this.chartBounds = null; + this.DVBParameter = null; + this.DVBOrigonPoint = null; + this.DVBCenterPoint = null; + this.DVBWidth = null; + this.DVBHeight = null; + this.DVBCodomain = null; + this.DVBUnitValue = null; + this.origonPointOffset = null; + this.XOffset = null; + this.YOffset = null; + this.fields = null; + this.dataValues = null; + this.setting = null; + super.destroy(); + } + + + /** + * @function FeatureThemeGraph.prototype.initBaseParameter + * @description 初始化专题要素(图表)基础参数。在调用此方法前,此类的图表模型相关属性都是不可用的 ,此方法在 assembleShapes 函数中调用。 + * 调用此函数关系到 setting 对象的以下属性。 + * @param {number} width - 专题要素(图表)宽度。 + * @param {number} height - 专题要素(图表)高度。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox。 + * (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @returns {boolean} 初始化参数是否成功。 + */ + initBaseParameter() { + // 参数初始化是否成功 + var isSuccess = true; + + // setting 属性是否已成功赋值 + if (!this.setting) { + return false; + } + var sets = this.setting; + // 检测 setting 的必设参数 + if (!(sets.width && sets.height && sets.codomain)) { + return false; + } + + // 数据 + var decimalNumber = (typeof(sets.decimalNumber) !== "undefined" && !isNaN(sets.decimalNumber)) ? sets.decimalNumber : -1; + var dataEffective = Theme_Theme.getDataValues(this.data, this.fields, decimalNumber); + this.dataValues = dataEffective ? dataEffective : []; + + // 基础参数 width, height, codomain + this.width = parseFloat(sets.width); + this.height = parseFloat(sets.height); + this.DVBCodomain = sets.codomain; + + // 图表偏移 + // if(sets.XOffset) {this.XOffset = sets.XOffset}; + // if(sets.YOffset) {this.YOffset = sets.YOffset}; + this.XOffset = sets.XOffset ? sets.XOffset : 0; + this.YOffset = sets.YOffset ? sets.YOffset : 0; + + // 其他默认值 + this.origonPoint = []; + this.chartBox = []; + this.dataViewBox = []; + + this.DVBParameter = sets.dataViewBoxParameter ? sets.dataViewBoxParameter : [0, 0, 0, 0]; + + this.DVBOrigonPoint = []; + this.DVBCenterPoint = []; + this.origonPointOffset = []; + + // 图表位置 + this.resetLocation(); + + // 专题要素宽度 w + var w = this.width; + // 专题要素高度 h + var h = this.height; + // 专题要素像素位置 loc + var loc = this.location; + + // 专题要素像素位置 loc + this.origonPoint = [loc[0] - w / 2, loc[1] - h / 2]; + // 专题要素原点(左上角) + var op = this.origonPoint; + + // 图表框([left, bottom, right, top]) + this.chartBox = [op[0], op[1] + h, op[0] + w, op[1]]; + // 图表框 + var cb = this.chartBox; + + // 数据视图框参数,它是图表框各方向对应的内偏距 + var dbbP = this.DVBParameter; + // 数据视图框 ([left, bottom, right, top]) + this.dataViewBox = [cb[0] + dbbP[0], cb[1] - dbbP[1], cb[2] - dbbP[2], cb[3] + dbbP[3]]; + // 数据视图框 + var dvb = this.dataViewBox; + //检查数据视图框是否合法 + if (dvb[0] >= dvb[2] || dvb[1] <= dvb[3]) { + return false; + } + + // 数据视图框原点 + this.DVBOrigonPoint = [dvb[0], dvb[3]]; + // 数据视图框宽度 + this.DVBWidth = Math.abs(dvb[2] - dvb[0]); + // 数据视图框高度 + this.DVBHeight = Math.abs(dvb[1] - dvb[3]); + // 数据视图框中心点 + this.DVBCenterPoint = [this.DVBOrigonPoint[0] + this.DVBWidth / 2, this.DVBOrigonPoint[1] + this.DVBHeight / 2] + + // 数据视图框原点与图表框的原点偏移量 + this.origonPointOffset = [this.DVBOrigonPoint[0] - op[0], this.DVBOrigonPoint[1] - op[1]]; + + return isSuccess; + } + + /** + * @function FeatureThemeGraph.prototype.resetLocation + * @description 根据地理位置 lonlat 重置专题要素(图表)位置。 + * @param {LonLat} lonlat - 专题要素新的像素中心位置。 + * @returns {Array.} 新专题要素像素参考位置。长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + resetLocation(lonlat) { + if (lonlat) { + this.lonlat = lonlat; + } + + // 获取地理位置对应的像素坐标 newLocalLX + var newLocalLX = this.getLocalXY(this.lonlat); + // 处理偏移量 XOffset, YOffset + newLocalLX[0] += this.XOffset; + newLocalLX[1] += this.YOffset; + // 将图形位置赋予 location 属性(注意 location 属性表示的是专题要素中心位置) + this.location = newLocalLX; + + // 更新图表像素 Bounds + var w = this.width; + var h = this.height; + var loc = this.location; + this.chartBounds = new Bounds(loc[0] - w / 2, loc[1] + h / 2, loc[0] + w / 2, loc[1] - h / 2); + + //重新计算当前渐变色 + this.resetLinearGradient(); + + return loc; + } + + /** + * @function FeatureThemeGraph.prototype.resetLinearGradient + * @description resetLocation 中调用 图表的相对坐标存在的时候,重新计算渐变的颜色(目前用于二维柱状图渐变色 所以子类实现此方法)。 + */ + resetLinearGradient() { + //子类实现此方法 + } + + /** + * @function FeatureThemeGraph.prototype.shapesConvertToRelativeCoordinate + * @description 将(构成图表)图形的节点转为相对坐标表示,此函数必须且只能在 assembleShapes() 结束时调用。 + */ + shapesConvertToRelativeCoordinate() { + var shapes = this.shapes; + var shapeROP = this.location; + for (var i = 0, len = shapes.length; i < len; i++) { + shapes[i].refOriginalPosition = shapeROP; + + var style = shapes[i].style; + + for (var sty in style) { + switch (sty) { + case "pointList": + var pl = style[sty]; + for (var j = 0, len2 = pl.length; j < len2; j++) { + pl[j][0] -= shapeROP[0]; + pl[j][1] -= shapeROP[1]; + } + break; + case "x": + style[sty] -= shapeROP[0]; + break; + case "y": + style[sty] -= shapeROP[1]; + break; + default: + break; + } + } + } + this.RelativeCoordinate = true; + } + + + /** + * @function FeatureThemeGraph.prototype.assembleShapes + * @description 图形装配函数。抽象方法,可视化子类必须实现此方法。
+ * 重写此方法的步骤:
+ * 1. 图表的某些特殊配置项(setting)处理,例如多数图表模型需要重新指定 dataViewBoxParameter 的默认值。
+ * 2. 调用 initBaseParameter() 方法初始化模型属性值,此步骤必须执行,只有当 initBaseParameter 返回 true 时才可以允许进行后续步骤。
+ * 3. 计算图形参数,制作图形,图形组合。在组装图表过程中,应该特别注意数据视图框单位值的定义、数据值溢出值域范围的处理和图形大小自适应。
+ * 4. 调用 shapesConvertToRelativeCoordinate() 方法,将图形的坐标值转为相对坐标,此步骤必须执行。 + * @example + * //子类实现 assembleShapes() 接口的步骤示例: + * assembleShapes: function(){ + * // 第一步:图表的某些特殊配置项(setting)处理,例如多数图表模型需要重新指定 dataViewBoxParameter 的默认值。此步骤是非必须过程。 + * + * // 图表配置对象 + * var sets = this.setting; + * // 默认数据视图框,这里展示在使用坐标轴和不使用坐标轴情况下对数据视图框参数赋予不同的默认值 + * if(!sets.dataViewBoxParameter){ + * if(typeof(sets.useAxis) === "undefined" || sets.useAxis){ + * sets.dataViewBoxParameter = [45, 15, 15, 15]; + * } + * else{ + * sets.dataViewBoxParameter = [5, 5, 5, 5]; + * } + * } + * + * // 第二步:初始化图表模型基本参数,只有在图表模型基本参数初始化成功时才可模型相关属性,如 this.dataViewBox、 this.DVBCodomain等。此步骤是必须过程。 + * if(!this.initBaseParameter()) return; + * + * // 第三步:用图形组装图表,在组装图表过程中,应该特别注意数据视图框单位值的定义、数据值溢出值域范围的处理和图形大小自适应。 + * // 定义图表数据视图框中单位值的含义,下面行代码表示将数据视图框单位值定义为数据视图框高度上每像素代表的数据值 + * this.DVBUnitValue = (this.codomain[1] - this.codomain[0])/this.DVBHeight; + * var uv = this.DVBUnitValue; + * + * // 图形参数计算代码...... + * + * // 关于图形装配,实际上就是利用图形工程对象 this.shapeFactory 的 createShape() 方法通过图形参数对象创建可视化的图形对象,并把这些图形对象按序添加到模型的图形库(his.shapes)中。下面的代码演示创建一个面图形参数对象,并允许通过图形配置对象设置图形的 style 和 highlightStyle, + * var barParams = new ShapeParametersPolygon(poiLists); + * barParams.style = sets.barStyle? sets.barStyle:{fillColor: "lightblue"}; + * barParams.highlightStyle = sets.barHoverStyle? sets.barHoverStyle:{fillColor: "blue"}; + * // 图形携带数据ID信息 + * barParams.refDataID = this.data.id; + * // 创建图形并添加到图表图形数组中 + * this.shapes.push(this.shapeFactory.createShape(barParams)); + * + * // 第四步:调用 shapesConvertToRelativeCoordinate() 方法,将图形库(his.shapes)中的图形转为由相对坐标表示的图形,客户端统计专题图模块从结构上要求可视化图形使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数。此步骤是必须过程。 + * this.shapesConvertToRelativeCoordinate(); + * }, + */ + assembleShapes() { + //子类必须实现此方法 + } + + /** + * @function FeatureThemeGraph.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {LonLat} lonlat - 带转换的地理坐标。 + * @returns 屏幕像素坐标。 + */ + getLocalXY(lonlat) { + return this.layer.getLocalXY(lonlat); + } + +} + +/** + * @function FeatureTheme.getDataValues + * @description 根据字段名数组获取指定数据(feature)的属性值数组。属性值类型必须为 Number。 + * @param {FeatureVector} data - 数据。 + * @param {Array.} [fields] - 字段名数组。 + * @param {number} [decimalNumber] - 小数位处理参数,对获取到的属性数据值进行小数位处理。 + * @returns {Array.} 字段名数组对应的属性数据值数组。 + */ +Theme_Theme.getDataValues = function (data, fields, decimalNumber) { + if (!data.attributes) { + return false; + } + + var fieldsValue = []; + + var attrs = data.attributes; + for (var i = 0; i < fields.length; i++) { + for (var field in attrs) { + if (field !== fields[i]) { + continue + } + // 数字转换判断 + try { + if (!isNaN(decimalNumber) && decimalNumber >= 0) { + fieldsValue.push(parseFloat(attrs[field].toString()).toFixed(decimalNumber)); + } else { + fieldsValue.push(parseFloat(attrs[field].toString())); + } + } catch (e) { + throw new Error("not a number") + } + } + } + + if (fieldsValue.length === fields.length) { + return fieldsValue; + } else { + return false; + } +}; + +;// CONCATENATED MODULE: ./src/common/overlay/Bar.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class FeatureThemeBar + * @aliasclass Feature.Theme.Bar + * @deprecatedclass SuperMap.Feature.Theme.Bar + * @classdesc 柱状图 。 + * @category Visualization Theme + * @example + * // barStyleByCodomain参数用法如下: + * // barStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 属性中的参与此图表生成的属性字段名称。 + * @param {FeatureThemeBar.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ +class Bar extends Graph { + + constructor(data, layer, fields, setting, lonlat) { + super(data, layer, fields, setting, lonlat); + this.CLASS_NAME = "SuperMap.Feature.Theme.Bar"; + } + + /** + * @function FeatureThemeBar.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemeBar.prototype.assembleShapes + * @description 图表图形装配函数。 + */ + assembleShapes() { + //默认渐变颜色数组 + var deafaultColors = [["#00FF00", "#00CD00"], ["#00CCFF", "#5E87A2"], ["#00FF66", "#669985"], ["#CCFF00", "#94A25E"], ["#FF9900", "#A2945E"]]; + + //默认阴影 + var deafaultShawdow = { + showShadow: true, + shadowBlur: 8, + shadowColor: "rgba(100,100,100,0.8)", + shadowOffsetX: 2, + shadowOffsetY: 2 + }; + + // 图表配置对象 + var sets = this.setting; + + if (!sets.barLinearGradient) { + sets.barLinearGradient = deafaultColors; + } + + // 默认数据视图框 + if (!sets.dataViewBoxParameter) { + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + // 值域 + var codomain = this.DVBCodomain; + // 重要步骤:定义图表 BaFeatureThemeBarr 数据视图框中单位值的含义 + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + + // 数据视图域 + var dvb = this.dataViewBox; + // 用户数据值 + var fv = this.dataValues; + if (fv.length < 1) { + return; + } // 没有数据 + + // 数据溢出值域范围处理 + for (let i = 0, fvLen = fv.length; i < fvLen; i++) { + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + return; + } + } + + // 获取 x 轴上的图形信息 + var xShapeInfo = this.calculateXShapeInfo(); + if (!xShapeInfo) { + return; + } + // 每个柱条 x 位置 + var xsLoc = xShapeInfo.xPositions; + // 柱条宽度 + var xsWdith = xShapeInfo.width; + + // 背景框,默认启用 + if (typeof(sets.useBackground) === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 坐标轴, 默认启用 + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + // 添加坐标轴图形数组 + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + } + + for (var i = 0; i < fv.length; i++) { + // 计算柱条 top 边的 y 轴坐标值 + var yPx = dvb[1] - (fv[i] - codomain[0]) / this.DVBUnitValue; + + // 柱条节点数组 + var poiLists = [ + [xsLoc[i] - xsWdith / 2, dvb[1] - 1], + [xsLoc[i] + xsWdith / 2, dvb[1] - 1], + [xsLoc[i] + xsWdith / 2, yPx], + [xsLoc[i] - xsWdith / 2, yPx] + ]; + + // 柱条参数对象(一个面参数对象) + var barParams = new Polygon_Polygon(poiLists); + + // 柱条 阴影 style + if (typeof(sets.showShadow) === "undefined" || sets.showShadow) { + if (sets.barShadowStyle) { + var sss = sets.barShadowStyle; + if (sss.shadowBlur) { + deafaultShawdow.shadowBlur = sss.shadowBlur; + } + if (sss.shadowColor) { + deafaultShawdow.shadowColor = sss.shadowColor; + } + if (sss.shadowOffsetX) { + deafaultShawdow.shadowOffsetX = sss.shadowOffsetX; + } + if (sss.shadowOffsetY) { + deafaultShawdow.shadowOffsetY = sss.shadowOffsetY; + } + } + barParams.style = {}; + Util.copyAttributesWithClip(barParams.style, deafaultShawdow); + } + + // 图形携带的数据信息 + barParams.refDataID = this.data.id; + barParams.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 柱条 hover click + if (typeof(sets.barHoverAble) !== "undefined") { + barParams.hoverable = sets.barHoverAble; + } + if (typeof(sets.barClickAble) !== "undefined") { + barParams.clickable = sets.barClickAble; + } + + // 创建柱条并添加到图表图形数组中 + this.shapes.push(this.shapeFactory.createShape(barParams)); + } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + + /** + * @function FeatureThemeBar.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性: + * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距, + * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性: + * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * + */ + calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + var sets = this.setting; // 图表配置对象 + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + var xShapePositions = []; // x 轴上图形的位置 + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + + // x 轴空白间隔参数处理 + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 3) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[2] + (fvc - 1) * xBlank[1]); + if (xsLen <= fvc) { + return null; + } + xShapeWidth = xsLen / fvc + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + xShapeWidth = dvbWidth / (2 * fvc + 1); + xBlank = [xShapeWidth, xShapeWidth, xShapeWidth]; + } + + // 图形 x 轴上的位置计算 + var xOffset = 0 + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0] + xShapeWidth / 2; + } else { + xOffset += (xShapeWidth + xBlank[1]); + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + + /** + * @function FeatureThemeBar.prototype.resetLinearGradient + * @description 图表的相对坐标存在的时候,重新计算渐变的颜色(目前用于二维柱状图 所以子类实现此方法)。 + */ + resetLinearGradient() { + if (this.RelativeCoordinate) { + var shpelength = this.shapes.length; + var barLinearGradient = this.setting.barLinearGradient; + var index = -1; + for (var i = 0; i < shpelength; i++) { + var shape = this.shapes[i]; + if (shape.CLASS_NAME === "SuperMap.LevelRenderer.Shape.SmicPolygon") { + var style = shape.style; + //计算出当前的绝对 x y + var x1 = this.location[0] + style.pointList[0][0]; + var x2 = this.location[0] + style.pointList[1][0]; + + //渐变颜色 + index++; + //以防定义的颜色数组不够用 + if (index >= barLinearGradient.length) { + index = index % barLinearGradient.length; + } + var color1 = barLinearGradient[index][0]; + var color2 = barLinearGradient[index][1]; + + //颜色 + var zcolor = new Color(); + var linearGradient = zcolor.getLinearGradient(x1, 0, x2, 0, + [[0, color1], [1, color2]]); + + //赋值 + shape.style.color = linearGradient; + } + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Bar3D.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FeatureThemeBar3D + * @aliasclass Feature.Theme.Bar3D + * @deprecatedclass SuperMap.Feature.Theme.Bar3D + * @classdesc 三维柱状图 。 + * @category Visualization Theme + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeBar3D.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置,默认为 data 指代的地理要素 Bounds 中心。 + * + + * + * @example + * // barFaceStyleByCodomain 用法示例如下: + * // barFaceStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barFaceStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @example + * // barSideStyleByCodomain 用法示例如下: + * // barSideStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barSideStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @example + * // barTopStyleByCodomain 用法示例如下: + * // barTopStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barTopStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @usage + * @private + */ + +class Bar3D extends Graph { + + constructor(data, layer, fields, setting, lonlat) { + super(data, layer, fields, setting, lonlat); + this.CLASS_NAME = "SuperMap.Feature.Theme.Bar3D"; + } + + /** + * @function FeatureThemeBar3D.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemeBar3D.prototype.assembleShapes + * @description 图形装配实现(扩展接口)。 + */ + assembleShapes() { + // 图表配置对象 + var sets = this.setting; + + // 默认数据视图框 + if (!sets.dataViewBoxParameter) { + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 25, 20, 20]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } + + // 3d 柱图的坐标轴默认使用坐标轴箭头 + sets.axisUseArrow = (typeof(sets.axisUseArrow) !== "undefined") ? sets.axisUseArrow : true; + sets.axisXLabelsOffset = (typeof(sets.axisXLabelsOffset) !== "undefined") ? sets.axisXLabelsOffset : [-10, 10]; + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + // 值域 + var codomain = this.DVBCodomain; + // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + // 数据视图域 + var dvb = this.dataViewBox; + // 用户数据值 + var fv = this.dataValues; + if (fv.length < 1) { + return; + } // 没有数据 + + // 数据溢出值域范围处理 + for (let i = 0, fvLen = fv.length; i < fvLen; i++) { + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + return; + } + } + + // 获取 x 轴上的图形信息 + var xShapeInfo = this.calculateXShapeInfo(); + if (!xShapeInfo) { + return; + } + // 每个柱条 x 位置 + var xsLoc = xShapeInfo.xPositions; + // 柱条宽度 + var xsWdith = xShapeInfo.width; + + // 坐标轴, 默认启用 + if (typeof(sets.useBackground) === "undefined" || sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 坐标轴 + if (!sets.axis3DParameter || isNaN(sets.axis3DParameter) || sets.axis3DParameter < 15) { + sets.axis3DParameter = 20; + } + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + } + + // 3d 偏移量, 默认值 10; + var offset3d = (sets.bar3DParameter && !isNaN(sets.bar3DParameter)) ? sets.bar3DParameter : 10; + + for (let i = 0; i < fv.length; i++) { + // 无 3d 偏移量时的柱面顶部 y 坐标 + var yPx = dvb[1] - (fv[i] - codomain[0]) / this.DVBUnitValue; + // 无 3d 偏移量时的柱面的左、右端 x 坐标 + var iPoiL = xsLoc[i] - xsWdith / 2; + var iPoiR = xsLoc[i] + xsWdith / 2; + + // 3d 柱顶面节点 + var bar3DTopPois = [ + [iPoiL, yPx], + [iPoiR, yPx], + [iPoiR - offset3d, yPx + offset3d], + [iPoiL - offset3d, yPx + offset3d] + ]; + + // 3d 柱侧面节点 + var bar3DSidePois = [ + [iPoiR, yPx], + [iPoiR - offset3d, yPx + offset3d], + [iPoiR - offset3d, dvb[1] + offset3d], + [iPoiR, dvb[1]] + ]; + + // 3d 柱正面节点 + var bar3DFacePois = [ + [iPoiL - offset3d, dvb[1] + offset3d], + [iPoiR - offset3d, dvb[1] + offset3d], + [iPoiR - offset3d, yPx + offset3d], + [iPoiL - offset3d, yPx + offset3d] + ]; + if (offset3d <= 0) { // offset3d <= 0 时正面不偏移 + bar3DFacePois = [ + [iPoiL, dvb[1]], + [iPoiR, dvb[1]], + [iPoiR, yPx], + [iPoiL, yPx] + ]; + } + + // 新建 3d 柱面顶面、侧面、正面图形参数对象 + var polyTopSP = new Polygon_Polygon(bar3DTopPois); + var polySideSP = new Polygon_Polygon(bar3DSidePois); + var polyFaceSP = new Polygon_Polygon(bar3DFacePois); + + + // 侧面、正面图形 style 默认值 + sets.barSideStyle = sets.barSideStyle ? sets.barSideStyle : sets.barFaceStyle; + sets.barSideStyleByFields = sets.barSideStyleByFields ? sets.barSideStyleByFields : sets.barFaceStyleByFields; + sets.barSideStyleByCodomain = sets.barSideStyleByCodomain ? sets.barSideStyleByCodomain : sets.barFaceStyleByCodomain; + sets.barTopStyle = sets.barTopStyle ? sets.barTopStyle : sets.barFaceStyle; + sets.barTopStyleByFields = sets.barTopStyleByFields ? sets.barTopStyleByFields : sets.barFaceStyleByFields; + sets.barTopStyleByCodomain = sets.barTopStyleByCodomain ? sets.barTopStyleByCodomain : sets.barFaceStyleByCodomain; + // 顶面、侧面、正面图形 style + polyFaceSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, + sets.barFaceStyle, sets.barFaceStyleByFields, sets.barFaceStyleByCodomain, i, fv[i]); + polySideSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, + sets.barSideStyle, sets.barSideStyleByFields, sets.barSideStyleByCodomain, i, fv[i]); + polyTopSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, + sets.barTopStyle, sets.barTopStyleByFields, sets.barTopStyleByCodomain, i, fv[i]); + + // 3d 柱条高亮样式 + sets.barSideHoverStyle = sets.barSideHoverStyle ? sets.barSideHoverStyle : sets.barFaceHoverStyle; + sets.barTopHoverStyle = sets.barTopHoverStyle ? sets.barTopHoverStyle : sets.barFaceHoverStyle; + polyFaceSP.highlightStyle = ShapeFactory.ShapeStyleTool({stroke: true}, sets.barFaceHoverStyle); + polySideSP.highlightStyle = ShapeFactory.ShapeStyleTool({stroke: true}, sets.barSideHoverStyle); + polyTopSP.highlightStyle = ShapeFactory.ShapeStyleTool({stroke: true}, sets.barTopHoverStyle); + + // 图形携带的数据 id 信息 & 高亮模式 + polyTopSP.refDataID = polySideSP.refDataID = polyFaceSP.refDataID = this.data.id; + // hover 模式(组合) + polyTopSP.isHoverByRefDataID = polySideSP.isHoverByRefDataID = polyFaceSP.isHoverByRefDataID = true; + // 高亮组(当鼠标 hover 到组内任何一个图形,整个组的图形都会高亮。refDataHoverGroup 在 isHoverByRefDataID 为 true 时有效) + polyTopSP.refDataHoverGroup = polySideSP.refDataHoverGroup = polyFaceSP.refDataHoverGroup = Util.createUniqueID("lr_shg"); + // 图形携带的数据信息 + polyTopSP.dataInfo = polySideSP.dataInfo = polyFaceSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 3d 柱条顶面、侧面、正面图形 hover click 设置 + if (typeof(sets.barHoverAble) !== "undefined") { + polyTopSP.hoverable = polySideSP.hoverable = polyFaceSP.hoverable = sets.barHoverAble; + } + if (typeof(sets.barClickAble) !== "undefined") { + polyTopSP.clickable = polySideSP.clickable = polyFaceSP.clickable = sets.barClickAble; + } + + // 创建3d 柱条的顶面、侧面、正面图形并添加到图表的图形列表数组 + this.shapes.push(this.shapeFactory.createShape(polySideSP)); + this.shapes.push(this.shapeFactory.createShape(polyTopSP)); + this.shapes.push(this.shapeFactory.createShape(polyFaceSP)); + } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + + /** + * @function FeatureThemeBar3D.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性: + * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距, + * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性: + * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + var sets = this.setting; // 图表配置对象 + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + var xShapePositions = []; // x 轴上图形的位置 + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + + // x 轴空白间隔参数处理 + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 3) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[2] + (fvc - 1) * xBlank[1]) + if (xsLen <= fvc) { + return null; + } + xShapeWidth = xsLen / fvc + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + xShapeWidth = dvbWidth / (2 * fvc + 1); + xBlank = [xShapeWidth, xShapeWidth, xShapeWidth]; + } + + // 图形 x 轴上的位置计算 + var xOffset = 0 + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0] + xShapeWidth / 2; + } else { + xOffset += (xShapeWidth + xBlank[1]); + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/RankSymbol.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FeatureThemeRankSymbol + * @aliasclass Feature.Theme.RankSymbol + * @deprecatedclass SuperMap.Feature.Theme.RankSymbol + * @category Visualization Theme + * @classdesc 符号专题要素基类。此类定义了符号专题要素基础模型,具体的图表模型通过继承此类,在子类中实现 assembleShapes 方法。 + * 符号专题要素模型采用了可视化图形大小自适应策略,用较少的参数控制着图表诸多图形,图表配置对象 的基础属性只有 5 个, + * 它们控制着图表结构、值域范围、数据小数位等基础图表形态。构成图表的图形必须在图表结构里自适应大小。 + * 此类不可实例化,此类的可实例化子类必须实现 assembleShapes() 方法。 + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.RankSymbol} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @param {Object} setting - 图表配置对象。除了以下 5 个基础属性,此对象的可设属性在不同子类中有较大差异,不同子类中对同一属性的解释也可能不同,请在此类的子类中查看 setting 对象的可设属性和属性含义。 + * @param {Array.} setting.codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [setting.XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [setting.YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [setting.dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [setting.decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @extends FeatureThemeGraph + * @usage + */ +class RankSymbol extends Graph { + + constructor(data, layer, fields, setting, lonlat, options) { + super(data, layer, fields, setting, lonlat, options); + /** + * @member {Object} FeatureThemeRankSymbol.prototype.setting + * @description 符号配置对象,该对象控制着图表的可视化显示。 + */ + this.setting = null; + // 配置项检测与赋值 + if (setting && setting.codomain) { + this.setting = setting; + this.DVBCodomain = this.setting.codomain; + } + this.CLASS_NAME = "SuperMap.Feature.Theme.RankSymbol"; + } + + /** + * @function FeatureThemeRankSymbol.prototype.destroy + * @description 销毁专题要素。 + */ + destroy() { + this.setting = null; + super.destroy(); + } + + + /** + * @function FeatureThemeRankSymbol.prototype.initBaseParameter + * @description 初始化专题要素(图形)基础参数。 + * 在调用此方法前,此类的图表模型相关属性都是不可用的 ,此方法在 assembleShapes 函数中调用。 + * 调用此函数关系到 setting 对象的以下属性。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图形)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图形)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图形框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @returns {boolean} 初始化参数是否成功。 + */ + initBaseParameter() { + // 参数初始化是否成功 + var isSuccess = true; + + // setting 属性是否已成功赋值 + if (!this.setting) { + return false; + } + var sets = this.setting; + + // 图表偏移 + if (sets.XOffset) { + this.XOffset = sets.XOffset; + } + if (sets.YOffset) { + this.YOffset = sets.YOffset; + } + this.XOffset = sets.XOffset ? sets.XOffset : 0; + this.YOffset = sets.YOffset ? sets.YOffset : 0; + + // 其他默认值 + this.origonPoint = []; + this.chartBox = []; + this.dataViewBox = []; + + this.DVBParameter = sets.dataViewBoxParameter ? sets.dataViewBoxParameter : [0, 0, 0, 0]; + + this.DVBOrigonPoint = []; + this.DVBCenterPoint = []; + this.origonPointOffset = []; + + // 图表位置 + this.resetLocation(); + + // 专题要素宽度 w + var w = this.width; + // 专题要素高度 h + var h = this.height; + // 专题要素像素位置 loc + var loc = this.location; + + // 专题要素像素位置 loc + this.origonPoint = [loc[0] - w / 2, loc[1] - h / 2]; + // 专题要素原点(左上角) + var op = this.origonPoint; + + // 图表框([left, bottom, right, top]) + this.chartBox = [op[0], op[1] + h, op[0] + w, op[1]]; + // 图表框 + var cb = this.chartBox; + + // 数据视图框参数,它是图表框各方向对应的内偏距 + var dbbP = this.DVBParameter; + // 数据视图框 ([left, bottom, right, top]) + this.dataViewBox = [cb[0] + dbbP[0], cb[1] - dbbP[1], cb[2] - dbbP[2], cb[3] + dbbP[3]]; + // 数据视图框 + var dvb = this.dataViewBox; + //检查数据视图框是否合法 + if (dvb[0] >= dvb[2] || dvb[1] <= dvb[3]) { + return false; + } + + // 数据视图框原点 + this.DVBOrigonPoint = [dvb[0], dvb[3]]; + // 数据视图框宽度 + this.DVBWidth = Math.abs(dvb[2] - dvb[0]); + // 数据视图框高度 + this.DVBHeight = Math.abs(dvb[1] - dvb[3]); + // 数据视图框中心点 + this.DVBCenterPoint = [this.DVBOrigonPoint[0] + this.DVBWidth / 2, this.DVBOrigonPoint[1] + this.DVBHeight / 2]; + + // 数据视图框原点与图表框的原点偏移量 + this.origonPointOffset = [this.DVBOrigonPoint[0] - op[0], this.DVBOrigonPoint[1] - op[1]]; + + return isSuccess; + } +} + +;// CONCATENATED MODULE: ./src/common/overlay/Circle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FeatureThemeCircle + * @aliasclass Feature.Theme.Circle + * @deprecatedclass SuperMap.Feature.Theme.Circle + * @classdesc 圆类。 + * @category Visualization Theme + * @extends FeatureThemeRankSymbol + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.RankSymbol} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeCircle.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置,默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ +class Circle extends RankSymbol { + + constructor(data, layer, fields, setting, lonlat) { + super(data, layer, fields, setting, lonlat); + this.CLASS_NAME = "SuperMap.Feature.Theme.Circle"; + } + + /** + * @function FeatureThemeCircle.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemeCircle.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + assembleShapes() { + //默认填充颜色 + var defaultFillColor = "#ff9277"; + + // setting 属性是否已成功赋值 + if (!this.setting) { + return false; + } + var sets = this.setting; + // 检测 setting 的必设参数 + if (!(sets.codomain)) { + return false; + } + + // 数据 + var decimalNumber = (typeof(sets.decimalNumber) !== "undefined" && !isNaN(sets.decimalNumber)) ? sets.decimalNumber : -1; + var dataEffective = Theme_Theme.getDataValues(this.data, this.fields, decimalNumber); + this.dataValues = dataEffective ? dataEffective : []; + + // 数据值数组 + var fv = this.dataValues; + //if(fv.length != 1) return; // 没有数据 或者数据不唯一 + //if(fv[0] < 0) return; //数据为负值 + + //用户应该定义最大 最小半径 默认最大半径MaxR:100 最小半径MinR:0; + if (!sets.maxR) { + sets.maxR = 100; + } + if (!sets.minR) { + sets.minR = 0; + } + + // 值域范围 + var codomain = this.DVBCodomain; + + // 重要步骤:定义Circle数据视图框中单位值的含义,单位值:1所代表的长度 + // 用户定义了值域范围 + if (codomain && codomain[1] - codomain[0] > 0) { + this.DVBUnitValue = sets.maxR / (codomain[1] - codomain[0]); + } else { + //this.DVBUnitValue = sets.maxR / maxValue; + this.DVBUnitValue = sets.maxR; + } + + var uv = this.DVBUnitValue; + //圆半径 + var r = fv[0] * uv + sets.minR; + this.width = 2 * r; + this.height = 2 * r; + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + //假如用户设置了值域范围 没有在值域范围直接返回 + if (codomain) { + if (fv[0] < codomain[0] || fv[0] > codomain[1]) { + return; + } + } + + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为圆心 + + //圆形对象参数 + var circleSP = new Circle_Circle(dvbCenter[0], dvbCenter[1], r); + + //circleSP.sytle 初始化 + circleSP.style = ShapeFactory.ShapeStyleTool(null, sets.circleStyle, null, null, 0); + //图形的填充颜色 + if (typeof (sets.fillColor) !== "undefined") { + //用户自定义 + circleSP.style.fillColor = sets.fillColor; + } else { + //当前默认 + circleSP.style.fillColor = defaultFillColor; + } + //圆形 Hover样式 + circleSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.circleHoverStyle); + //圆形 Hover 与 click 设置 + if (typeof(sets.circleHoverAble) !== "undefined") { + circleSP.hoverable = sets.circleHoverAble; + } + if (typeof(sets.circleClickAble) !== "undefined") { + circleSP.clickable = sets.circleClickAble; + } + + //图形携带的数据信息 + circleSP.refDataID = this.data.id; + circleSP.dataInfo = { + field: this.fields[0], + r: r, + value: fv[0] + }; + + // 创建扇形并把此扇形添加到图表图形数组 + this.shapes.push(this.shapeFactory.createShape(circleSP)); + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Line.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class FeatureThemeLine + * @aliasclass Feature.Theme.Line + * @deprecatedclass SuperMap.Feature.Theme.Line + * @classdesc 折线图。 + * @category Visualization Theme + * @example + * // pointStyleByCodomain 参数用法示例 + * // pointStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // pointStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeLine.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ +class Line extends Graph { + + constructor(data, layer, fields, setting, lonlat, options) { + super(data, layer, fields, setting, lonlat, options); + this.CLASS_NAME = "SuperMap.Feature.Theme.Line"; + } + + /** + * @function FeatureThemeLine.prototype.destroy + * @override + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemeLine.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + assembleShapes() { + // 图表配置对象 + var sets = this.setting; + + // 默认数据视图框 + if (!sets.dataViewBoxParameter) { + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + var dvb = this.dataViewBox; + + // 值域 + var codomain = this.DVBCodomain; + // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + var uv = this.DVBUnitValue; + // 数据值数组 + var fv = this.dataValues; + if (fv.length < 1) { + return; + } // 没有数据 + + // 获取 x 轴上的图形信息 + var xShapeInfo = this.calculateXShapeInfo(); + if (!xShapeInfo) { + return; + } + // 折线每个节点的 x 位置 + var xsLoc = xShapeInfo.xPositions; + + // 背景框,默认启用 + if (typeof(sets.useBackground) === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 折线图必须使用坐标轴 + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + + // var isDataEffective = true; + + var xPx; // 折线节点 x 坐标 + var yPx; // 折线节点 y 坐标 + var poiLists = []; // 折线节点数组 + + var shapePois = []; // 折线节点图形数组 + for (var i = 0, len = fv.length; i < len; i++) { + // 数据溢出值域检查 + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + // isDataEffective = false; + return null; + } + + xPx = xsLoc[i]; + yPx = dvb[1] - (fv[i] - codomain[0]) / uv; + + // 折线节点参数对象 + var poiSP = new Point_Point(xPx, yPx); + // 折线节点 style + poiSP.style = ShapeFactory.ShapeStyleTool({fillColor: "#ee9900"}, sets.pointStyle, sets.pointStyleByFields, sets.pointStyleByCodomain, i, fv[i]); + // 折线节点 hover 样式 + poiSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.pointHoverStyle); + + // 折线节点 hover click + if (typeof(sets.pointHoverAble) !== "undefined") { + poiSP.hoverable = sets.pointHoverAble; + } + if (typeof(sets.pointClickAble) !== "undefined") { + poiSP.clickable = sets.pointClickAble; + } + + // 图形携带的数据信息 + poiSP.refDataID = this.data.id; + poiSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 创建图形并把此图形添加到折线节点图形数组 + shapePois.push(this.shapeFactory.createShape(poiSP)); + + // 添加折线节点到折线节点数组 + var poi = [xPx, yPx]; + poiLists.push(poi); + } + + // 折线参数对象 + var lineSP = new Line_Line(poiLists); + lineSP.style = ShapeFactory.ShapeStyleTool({strokeColor: "#ee9900"}, sets.lineStyle); + // 禁止事件响应 + lineSP.clickable = false; + lineSP.hoverable = false; + var shapeLine = this.shapeFactory.createShape(lineSP); + this.shapes.push(shapeLine); + + // 添加节点到图表图形数组 + this.shapes = this.shapes.concat(shapePois); + + // // 数据范围检测未通过,清空图形 + // if (isDataEffective === false) { + // this.shapes = []; + // } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + + /** + * @function FeatureThemeLine.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性:
+ * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 2 的数组,第一元素表示第折线左端点与数据视图框左端的空白间距,第二个元素表示折线右端点右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性:
+ * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。
+ * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + var sets = this.setting; // 图表配置对象 + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + var xShapePositions = []; // x 轴上图形的位置 + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + var unitOffset = 0; // 单位偏移量 + + // x 轴空白间隔参数处理 + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 2) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[1]); + if (xsLen <= fvc) { + return null; + } + unitOffset = xsLen / (fvc - 1); + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + unitOffset = dvbWidth / (fvc + 1); + xBlank = [unitOffset, unitOffset, unitOffset]; + } + + // 图形 x 轴上的位置计算 + var xOffset = 0 + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0]; + } else { + xOffset += unitOffset; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Pie.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemePie + * @aliasclass Feature.Theme.Pie + * @deprecatedclass SuperMap.Feature.Theme.Pie + * @classdesc 饼图。 + * @category Visualization Theme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemePoint.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @extends FeatureThemeGraph + * @example + * // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // sectorStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @usage + * @private + */ +class Pie extends Graph { + + constructor(data, layer, fields, setting, lonlat) { + super(data, layer, fields, setting, lonlat); + this.CLASS_NAME = "SuperMap.Feature.Theme.Pie"; + } + + /** + * @function FeatureThemePie.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemePie.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + assembleShapes() { + // 图表配置对象 + var sets = this.setting; + + // 一个默认 style 组 + var defaultStyleGroup = [ + {fillColor: "#ff9277"}, {fillColor: "#dddd00"}, {fillColor: "#ffc877"}, {fillColor: "#bbe3ff"}, {fillColor: "#d5ffbb"}, + {fillColor: "#bbbbff"}, {fillColor: "#ddb000"}, {fillColor: "#b0dd00"}, {fillColor: "#e2bbff"}, {fillColor: "#ffbbe3"}, + {fillColor: "#ff7777"}, {fillColor: "#ff9900"}, {fillColor: "#83dd00"}, {fillColor: "#77e3ff"}, {fillColor: "#778fff"}, + {fillColor: "#c877ff"}, {fillColor: "#ff77ab"}, {fillColor: "#ff6600"}, {fillColor: "#aa8800"}, {fillColor: "#77c7ff"}, + {fillColor: "#ad77ff"}, {fillColor: "#ff77ff"}, {fillColor: "#dd0083"}, {fillColor: "#777700"}, {fillColor: "#00aa00"}, + {fillColor: "#0088aa"}, {fillColor: "#8400dd"}, {fillColor: "#aa0088"}, {fillColor: "#dd0000"}, {fillColor: "#772e00"} + ]; + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + // 背景框,默认不启用 + if (sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 数据值数组 + var fv = this.dataValues; + if (fv.length < 1) { + return; + } // 没有数据 + + // 值域范围 + var codomain = this.DVBCodomain; + // 值域范围检测 + for (let i = 0; i < fv.length; i++) { + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + return; + } + } + + // 值的绝对值总和 + var valueSum = 0; + for (let i = 0; i < fv.length; i++) { + valueSum += Math.abs(fv[i]); + } + + // 重要步骤:定义图表 FeatureThemePie 数据视图框中单位值的含义,单位值:每度代表的数值 + this.DVBUnitValue = 360 / valueSum; + var uv = this.DVBUnitValue; + + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心 + + var startAngle = 0; // 扇形起始边角度 + var endAngle = 0; // 扇形终止边角度 + var startAngleTmp = startAngle; // 扇形临时起始边角度 + // 扇形(自适应)半径 + var r = this.DVBHeight < this.DVBWidth ? this.DVBHeight / 2 : this.DVBWidth / 2; + + for (var i = 0; i < fv.length; i++) { + var fvi = Math.abs(fv[i]); + //计算终止角 + if (i === 0) { + endAngle = startAngle + fvi * uv; + } else if (i === fvi.length - 1) { + endAngle = startAngleTmp; + } else { + endAngle = startAngle + fvi * uv; + } + //矫正误差计算 + if ((endAngle - startAngle) >= 360) { + endAngle = 359.9999999; + } + + // 扇形参数对象 + var sectorSP = new Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle); + // 扇形样式 + if (typeof(sets.sectorStyleByFields) === "undefined") { + // 使用默认 style 组 + var colorIndex = i % defaultStyleGroup.length; + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex); + } else { + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]); + } + + // 扇形 hover 样式 + sectorSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle); + // 扇形 hover 与 click 设置 + if (typeof(sets.sectorHoverAble) !== "undefined") { + sectorSP.hoverable = sets.sectorHoverAble; + } + if (typeof(sets.sectorClickAble) !== "undefined") { + sectorSP.clickable = sets.sectorClickAble; + } + // 图形携带的数据信息 + sectorSP.refDataID = this.data.id; + sectorSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 创建扇形并把此扇形添加到图表图形数组 + this.shapes.push(this.shapeFactory.createShape(sectorSP)); + + // 把上一次的结束角度作为下一次的起始角度 + startAngle = endAngle; + } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Point.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemePoint + * @aliasclass Feature.Theme.Point + * @deprecatedclass SuperMap.Feature.Theme.Point + * @classdesc 点状图。 + * @category Visualization Theme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemePoint.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @example + * // pointStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // pointStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @extends FeatureThemeGraph + * @usage + * @private + */ +class overlay_Point_Point extends Graph { + + constructor(data, layer, fields, setting, lonlat, options) { + super(data, layer, fields, setting, lonlat, options); + this.CLASS_NAME = "SuperMap.Feature.Theme.Point"; + } + + /** + * @function FeatureThemePoint.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemePoint.prototype.Point.assembleShapes + * @description 装配图形(扩展接口)。 + */ + assembleShapes() { + // 图表配置对象 + var sets = this.setting; + + // 默认数据视图框 + if (!sets.dataViewBoxParameter) { + if (typeof(sets.useAxis) === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } + + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + var dvb = this.dataViewBox; + + // 值域 + var codomain = this.DVBCodomain; + // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + var uv = this.DVBUnitValue; + var fv = this.dataValues; + + // 获取 x 轴上的图形信息 + var xShapeInfo = this.calculateXShapeInfo(); + if (!xShapeInfo) { + return; + } + // 折线每个节点的 x 位置 + var xsLoc = xShapeInfo.xPositions; + + // 背景框,默认启用 + if (typeof(sets.useBackground) === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 点状图必须使用坐标轴 + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + + var xPx; // 图形点 x 坐标 + var yPx; // 图形点 y 坐标 + for (var i = 0, len = fv.length; i < len; i++) { + // 数据溢出值域检查 + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + //isDataEffective = false; + return null; + } + + xPx = xsLoc[i]; + yPx = dvb[1] - (fv[i] - codomain[0]) / uv; + + // 图形点参数对象 + var poiSP = new Point_Point(xPx, yPx); + // 图形点 style + poiSP.style = ShapeFactory.ShapeStyleTool({fillColor: "#ee9900"}, sets.pointStyle, sets.pointStyleByFields, sets.pointStyleByCodomain, i, fv[i]); + // 图形点 hover 样式 + poiSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.pointHoverStyle); + + // 图形点 hover click + if (typeof(sets.pointHoverAble) !== "undefined") { + poiSP.hoverable = sets.pointHoverAble; + } + if (typeof(sets.pointClickAble) !== "undefined") { + poiSP.clickable = sets.pointClickAble; + } + + // 图形携带的数据信息 + poiSP.refDataID = this.data.id; + poiSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 创建图形点并把此图形添加到图表图形数组 + this.shapes.push(this.shapeFactory.createShape(poiSP)); + } + + // 数据范围检测未通过,清空图形 + // if (isDataEffective === false) { + // this.shapes = []; + // } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + + /** + * @function FeatureThemePoint.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性:
+ * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 2 的数组,第一元素表示第折线左端点与数据视图框左端的空白间距,第二个元素表示折线右端点右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性:
+ * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number}表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + var sets = this.setting; // 图表配置对象 + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + var xShapePositions = []; // x 轴上图形的位置 + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + var unitOffset = 0; // 单位偏移量 + + // x 轴空白间隔参数处理 + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 2) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[1]); + if (xsLen <= fvc) { + return null; + } + unitOffset = xsLen / (fvc - 1); + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + unitOffset = dvbWidth / (fvc + 1); + xBlank = [unitOffset, unitOffset, unitOffset]; + } + + // 图形 x 轴上的位置计算 + var xOffset = 0 + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0]; + } else { + xOffset += unitOffset; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/Ring.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemeRing + * @aliasclass Feature.Theme.Ring + * @deprecatedclass SuperMap.Feature.Theme.Ring + * @classdesc 环状图。 + * @category Visualization Theme + * @description 基于路由对象计算指定点 M 值操作的参数类。通过该类提供参数信息。 + + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeRing.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @example + * // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // sectorStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @param {Object} [sectorHoverStyle=true] - 环状图扇形 hover 状态时的样式,sectorHoverAble 为 true 时有效。 + * @param {boolean} [sectorHoverAble=true] - 是否允许环状图扇形使用 hover 状态。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽环状图扇形对专题图层事件的响应。 + * @param {boolean} [sectorClickAble=true] - 是否允许环状图扇形被点击。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽环状图扇形对专题图层事件的响应。 + * + * @extends FeatureThemeGraph + * @usage + * @private + */ +class Ring extends Graph { + + constructor(data, layer, fields, setting, lonlat) { + super(data, layer, fields, setting, lonlat); + this.CLASS_NAME = "SuperMap.Feature.Theme.Ring"; + } + + /** + * @function FeatureThemeRing.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + destroy() { + super.destroy(); + } + + /** + * @function FeatureThemeRing.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + assembleShapes() { + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } + + // 一个默认 style 组 + var defaultStyleGroup = [ + {fillColor: "#ff9277"}, {fillColor: "#dddd00"}, {fillColor: "#ffc877"}, {fillColor: "#bbe3ff"}, {fillColor: "#d5ffbb"}, + {fillColor: "#bbbbff"}, {fillColor: "#ddb000"}, {fillColor: "#b0dd00"}, {fillColor: "#e2bbff"}, {fillColor: "#ffbbe3"}, + {fillColor: "#ff7777"}, {fillColor: "#ff9900"}, {fillColor: "#83dd00"}, {fillColor: "#77e3ff"}, {fillColor: "#778fff"}, + {fillColor: "#c877ff"}, {fillColor: "#ff77ab"}, {fillColor: "#ff6600"}, {fillColor: "#aa8800"}, {fillColor: "#77c7ff"}, + {fillColor: "#ad77ff"}, {fillColor: "#ff77ff"}, {fillColor: "#dd0083"}, {fillColor: "#777700"}, {fillColor: "#00aa00"}, + {fillColor: "#0088aa"}, {fillColor: "#8400dd"}, {fillColor: "#aa0088"}, {fillColor: "#dd0000"}, {fillColor: "#772e00"} + ]; + + // 图表配置对象 + var sets = this.setting; + + // 背景框,默认不启用 + if (sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } + + // 数据值数组 + var fv = this.dataValues; + if (fv.length < 1) { + return; + } // 没有数据 + + // 值域范围 + var codomain = this.DVBCodomain; + // 值域范围检测 + for (let i = 0; i < fv.length; i++) { + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + return; + } + } + + // 值的绝对值总和 + var valueSum = 0; + for (let i = 0; i < fv.length; i++) { + valueSum += Math.abs(fv[i]); + } + + // 重要步骤:定义图表 FeatureThemeRing 数据视图框中单位值的含义,单位值:每度代表的数值 + this.DVBUnitValue = 360 / valueSum; + var uv = this.DVBUnitValue; + + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心 + + var startAngle = 0; // 扇形起始边角度 + var endAngle = 0; // 扇形终止边角度 + var startAngleTmp = startAngle; // 扇形临时起始边角度 + // 扇形外环(自适应)半径 + var r = this.DVBHeight < this.DVBWidth ? this.DVBHeight / 2 : this.DVBWidth / 2; + + // 扇形内环(自适应)半径 + var isInRange = sets.innerRingRadius >= 0 && sets.innerRingRadius < r; + var r0 = ( + typeof(sets.innerRingRadius) !== "undefined" + && !isNaN(sets.innerRingRadius) + && isInRange + ) ? sets.innerRingRadius : 0; + + for (var i = 0; i < fv.length; i++) { + var fvi = Math.abs(fv[i]); + + // 计算结束角度 + if (i === 0) { + endAngle = startAngle + fvi * uv; + } else if (i === fvi.length - 1) { + endAngle = startAngleTmp; + } else { + endAngle = startAngle + fvi * uv; + } + + // 扇形参数对象 + var sectorSP = new Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle, r0); + // 扇形样式 + if (typeof(sets.sectorStyleByFields) === "undefined") { + // 使用默认 style 组 + var colorIndex = i % defaultStyleGroup.length; + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex); + } else { + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]); + } + // 扇形 hover 样式 + sectorSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle); + // 扇形 hover 与 click 设置 + if (typeof(sets.sectorHoverAble) !== "undefined") { + sectorSP.hoverable = sets.sectorHoverAble; + } + if (typeof(sets.sectorClickAble) !== "undefined") { + sectorSP.clickable = sets.sectorClickAble; + } + // 图形携带的数据信息 + sectorSP.refDataID = this.data.id; + sectorSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; + + // 创建扇形并把此扇形添加到图表图形数组 + this.shapes.push(this.shapeFactory.createShape(sectorSP)); + + // 把上一次的结束角度作为下一次的起始角度 + startAngle = endAngle; + } + + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + this.shapesConvertToRelativeCoordinate(); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/ThemeVector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + +/** + * @class FeatureThemeVector + * @aliasclass Feature.Theme.ThemeVector + * @deprecatedclass SuperMap.Feature.Theme.ThemeVector + * @classdesc 矢量专题要素类。 + * @category Visualization Theme + * @extends FeatureTheme + * @param {FeatureVector} data - 用户数据,的类型为矢量数据 feature。 + * @param {SuperMap.Layer} layer - 此专题要素所在图层。 + * @param {Object} style - 样式。 + * @param {Object} options - 创建专题要素时的可选参数。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离, 单位:像素。 + * @param {boolean} [options.isHoverAble=true] - 图形是否可 hover。 + * @param {boolean} [options.isMultiHover=true] - 是否使用多图形高亮,isHoverAble 为 true 时生效。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {Object} [options.highlightStyle] - 高亮样式。 + * @usage + */ +class ThemeVector extends Theme_Theme { + + constructor(data, layer, style, options, shapeOptions) { + super(data, layer); + //数据的 geometry 属性必须存在且类型是 Geometry 或其子类的类型 + if (!data.geometry) { + return; + } + if (!(data.geometry instanceof Geometry)) { + return; + } + + /** + * @member {Bounds} [FeatureThemeVector.prototype.dataBounds] + * @description 用户数据的(feature.geometry)地理范围。 + */ + this.dataBounds = data.geometry.getBounds(); + + /** + * @member {number} [FeatureThemeVector.prototype.nodesClipPixel=2] + * @description 节点抽稀像素距离。 + */ + this.nodesClipPixel = 2; + + /** + * @member {boolean} [FeatureThemeVector.prototype.isHoverAble=true] + * @description 图形是否可 hover。 + */ + this.isHoverAble = true; + + /** + * @member {boolean} [FeatureThemeVector.prototype.isMultiHover=true] + * @description 是否使用多图形高亮,isHoverAble 为 true 时生效。 + */ + this.isMultiHover = true; + + /** + * @member {boolean} [FeatureThemeVector.prototype.isClickAble=true] + * @description 图形是否可点击。 + */ + this.isClickAble = true; + + /** + * @member {Object} [FeatureThemeVector.prototype.highlightStyle] + * @description 高亮样式。 + */ + this.highlightStyle = null; + + /** + * @member {Object} [FeatureThemeVector.prototype.shapeOptions] + * @description 添加到渲染器前修改 shape 的一些属性,非特殊情况通常不允许这么做。 + */ + this.shapeOptions = {}; + + /** + * @member {Object} [FeatureThemeVector.prototype.style] + * @description 可视化图形的 style。在子类中规定其对象结构和默认属性值。 + */ + this.style = style || {}; + + + this.CLASS_NAME = "SuperMap.Feature.Theme.Vector"; + this.style = style ? style : {}; + if (options) { + Util.copyAttributesWithClip(this, options, ["shapeOptions", "dataBounds"]) + } + if (shapeOptions) { + Util.copyAttributesWithClip(this.shapeOptions, shapeOptions); + } + + //设置基础参数 dataBounds、lonlat、location + var geometry = data.geometry; + this.lonlat = this.dataBounds.getCenterLonLat(); + this.location = this.getLocalXY(this.lonlat); + + //将地理要素转为专题要素 + if (geometry instanceof LinearRing) { + this.lineToTF(geometry); + } else if (geometry instanceof LineString) { + this.lineToTF(geometry); + } else if (geometry instanceof Curve) { + //独立几何体 + } else if (geometry instanceof MultiPoint) { + this.multiPointToTF(geometry); + } else if (geometry instanceof MultiLineString) { + + this.multiLineStringToTF(geometry); + } else if (geometry instanceof MultiPolygon) { + this.multiPolygonToTF(geometry); + } else if (geometry instanceof Polygon) { + this.polygonToTF(geometry); + } else if (geometry instanceof Collection) { + //独立几何体 + } else if (geometry instanceof Point) { + this.pointToTF(geometry); + } else if (geometry instanceof Rectangle) { + this.rectangleToTF(geometry); + } else if (geometry instanceof GeoText) { + this.geoTextToTF(geometry); + } + + } + + /** + * @function FeatureThemeVector.prototype.destroy + * @override + */ + destroy() { + this.style = null; + this.dataBounds = null; + this.nodesClipPixel = null; + this.isHoverAble = null; + this.isMultiHover = null; + this.isClickAble = null; + this.highlightStyle = null; + this.shapeOptions = null; + super.destroy(); + } + + + /** + * @function FeatureThemeVector.prototype.lineToTF + * @description 转换线和线环要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 GeometryLineString 或 GeometryLineRing。 + */ + lineToTF(geometry) { + var components = geometry.components; + + //节点像素坐标 + var localLX = []; + //参考位置,参考中心为 + var refLocal = []; + var location = this.location; + var pointList = []; + + //节点抽稀距离 + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + refLocal = []; + localLX = this.getLocalXY(components_i); + + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; + + //抽稀 - 2 px + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + if ((Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx) && (Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx)) { + continue; + } + } + + //使用参考点 + pointList.push(refLocal); + } + + if (pointList.length < 2) { + return null; + } + + //赋 style + var style = new Object(); + style = Util.copyAttributesWithClip(style, this.style, ['pointList']); + style.pointList = pointList; + + //创建图形 + var shape = new SmicBrokenLine({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = this.location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //添加到渲染器前修改 shape 的一些属性,非特殊情况通常不允许这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + + + /** + * @function FeatureThemeVector.prototype.multiPointToTF + * @description 转多点要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiPoint。 + */ + multiPointToTF(geometry) { + /* //-- 不抽稀 + var components = geometry.components; + + for(var i = 0; i < components.length; i++){ + var components_i = components[i]; + this.pointToTF(components_i); + } + */ + + var components = geometry.components; + + //节点像素坐标 + var localLX = []; + //参考位置,参考中心为 + var refLocal = []; + var location = this.location; + var pointList = []; + + //节点抽稀距离 + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + refLocal = []; + localLX = this.getLocalXY(components_i); + + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; + + //抽稀 + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + if ((Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx) && (Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx)) { + continue; + } + } + + //使用参考点 + pointList.push(refLocal); + + //赋 style + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + style = Util.copyAttributesWithClip(style, this.style); + style.x = refLocal[0]; + style.y = refLocal[1]; + + //创建图形 + var shape = new SmicPoint({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //修改一些 shape 可选属性,通常不需要这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + } + + + /** + * @function FeatureThemeVector.prototype.multiLineStringToTF + * @description 转换多线要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiLineString。 + */ + multiLineStringToTF(geometry) { + var components = geometry.components; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + this.lineToTF(components_i); + } + } + + + /** + * @function FeatureThemeVector.prototype.multiPolygonToTF + * @description 转换多面要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiPolygon。 + */ + multiPolygonToTF(geometry) { + var components = geometry.components; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + this.polygonToTF(components_i); + } + } + + + /** + * @function FeatureThemeVector.prototype.pointToTF + * @description 转换点要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Point。 + */ + pointToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; + //geometry 像素坐标 + var localLX = this.getLocalXY(geometry); + + //赋 style + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + style = Util.copyAttributesWithClip(style, this.style); + style.x = localLX[0] - location[0]; + style.y = localLX[1] - location[1]; + + //创建图形 + var shape = new SmicPoint({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //修改一些 shape 可选属性,通常不需要这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + + + /** + * @function FeatureThemeVector.prototype.polygonToThemeFeature + * @description 转换面要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Polygon。 + */ + polygonToTF(geometry) { + var components = geometry.components; + + + //节点像素坐标 + var localLX = []; + //参考位置,参考中心为 + var refLocal = []; + var location = this.location; + var pointList = []; + //岛洞 + var holePolygonPointList = []; + var holePolygonPointLists = []; + + //节点抽稀距离 + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i].components; + + + if (i === 0) { + // 第一个 component 正常绘制 + pointList = []; + + for (var j = 0; j < components_i.length; j++) { + refLocal = []; + localLX = this.getLocalXY(components_i[j]); + + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; + + //抽稀 - 2 px + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + if ((Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx) && (Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx)) { + continue; + } + } + + //使用参考点 + pointList.push(refLocal); + } + } else { + // 其它 component 作为岛洞 + holePolygonPointList = []; + + for (var k = 0; k < components_i.length; k++) { + refLocal = []; + localLX = this.getLocalXY(components_i[k]); + + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; + + //抽稀 - 2 px + if (holePolygonPointList.length > 0) { + var lastXY = holePolygonPointList[holePolygonPointList.length - 1]; + if ((Math.abs(lastXY[0] - refLocal[0]) <= nCPx) && (Math.abs(lastXY[1] - refLocal[1]) <= nCPx)) { + continue; + } + } + + //使用参考点 + holePolygonPointList.push(refLocal); + } + } + + if (holePolygonPointList.length < 2) { + continue; + } + + holePolygonPointLists.push(holePolygonPointList); + } + + if (pointList.length < 2) { + return; + } + + //赋 style + var style = {}; + style = Util.copyAttributesWithClip(style, this.style, ['pointList']); + style.pointList = pointList; + + //创建图形 + var shape = new SmicPolygon({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = this.location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //岛洞面 + if (holePolygonPointLists.length > 0) { + shape.holePolygonPointLists = holePolygonPointLists; + } + + //修改一些 shape 可选属性,通常不需要这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + + + /** + * @function FeatureThemeVector.prototype.rectangleToTF + * @description 转换矩形要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Rectangle。 + */ + rectangleToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; + var ll = new LonLat(geometry.x, geometry.y); + + //地图分辨率 + var res = this.layer.map.getResolution(); + + //geometry 像素坐标 + var localLX = this.getLocalXY(ll); + + //赋 style + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + style = Util.copyAttributesWithClip(style, this.style); + style.x = localLX[0] - location[0]; + // Rectangle 使用左下角定位, SmicRectangle 使用左上角定位,需要转换 + style.y = (localLX[1] - location[1]) - 2 * geometry.width / res; + style.width = geometry.width / res; + style.height = geometry.height / res; + + //创建图形 + var shape = new SmicRectangle({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //修改一些 shape 可选属性,通常不需要这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + + + /** + * @function FeatureThemeVector.prototype.geoTextToTF + * @description 转换文本要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 GeoText。 + */ + geoTextToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; + //geometry 像素坐标 + var localLX = this.getLocalXY(geometry); + + //赋 style + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + style = Util.copyAttributesWithClip(style, this.style, ["x", "y", "text"]); + style.x = localLX[0] - location[0]; + style.y = localLX[1] - location[1]; + style.text = geometry.text; + + //创建图形 + var shape = new SmicText({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); + + //设置高亮样式 + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } + + //设置参考中心,指定图形位置 + shape.refOriginalPosition = location; + + //储存数据 id 属性,用于事件 + shape.refDataID = this.data.id; + + //储存数据 id 属性,用于事件-多图形同时高亮 + shape.isHoverByRefDataID = this.isMultiHover; + + //修改一些 shape 可选属性,通常不需要这么做 + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + + + /** + * @function FeatureThemeVector.prototype.updateAndAddShapes + * @description 修改位置,针对地图平移操作,地图漫游操作后调用此函数。 + */ + updateAndAddShapes() { + var newLocalLX = this.getLocalXY(this.lonlat); + this.location = newLocalLX; + + var render = this.layer.renderer; + for (var i = 0, len = this.shapes.length; i < len; i++) { + var shape = this.shapes[i]; + //设置参考中心,指定图形位置 + shape.refOriginalPosition = newLocalLX; + render.addShape(shape); + } + } + + + /** + * @function FeatureThemeVector.prototype.getShapesCount + * @description 获得专题要素中可视化图形的数量。 + * @returns {number} 可视化图形的数量。 + */ + getShapesCount() { + return this.shapes.length; + } + + + /** + * @function FeatureThemeVector.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {LonLat} lonlat - 专题要素地理位置。 + */ + getLocalXY(lonlat) { + return this.layer.getLocalXY(lonlat); + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/feature/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Group.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class LevelRenderer.Group + * @category Visualization Theme + * @private + * @classdesc Group 是一个容器,可以插入子节点,Group 的变换也会被应用到子节点上。 + * @extends {LevelRenderer.Transformable} + * (code) + * var g = new LevelRenderer.Group(); + * var Circle = new LevelRenderer.Shape.Circle(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.addChild(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * brushType: 'fill' + * } + * })); + * LR.addGroup(g); + * (end) + * @param {Array} options - Group 的配置(options)项,可以是 Group 的自有属性,也可以是自定义的属性。 + */ + +class Group extends mixinExt(Eventful, Transformable) { + constructor(options) { + super(options) + options = options || {}; + /** + * @member {string} LevelRenderer.Group.prototype.id + * @description Group 的唯一标识。 + */ + this.id = null; + + /** + * @readonly + * @member {string} [LevelRenderer.Group.prototype.type='group'] + * @description 类型。 + */ + this.type = 'group'; + + //http://www.w3.org/TR/2dcontext/#clipping-region + /** + * @member {string} LevelRenderer.Group.prototype.clipShape + * @description 用于裁剪的图形(shape),所有 Group 内的图形在绘制时都会被这个图形裁剪,该图形会继承 Group 的变换。 + */ + this.clipShape = null; + + /** + * @member {Array} LevelRenderer.Group.prototype._children + * @description _children。 + */ + this._children = []; + + /** + * @member {Array} LevelRenderer.Group.prototype._storage + * @description _storage。 + */ + this._storage = null; + + /** + * @member {boolean} [LevelRenderer.Group.prototype.__dirty=true] + * @description __dirty。 + */ + this.__dirty = true; + + /** + * @member {boolean} [LevelRenderer.Group.prototype.ignore=false] + * @description 是否忽略该 Group 及其所有子节点。 + */ + this.ignore = false; + Util.extend(this, options); + this.id = this.id || Util.createUniqueID("smShapeGroup_"); + this.CLASS_NAME = "SuperMap.LevelRenderer.Group"; + } + + + /** + * @function LevelRenderer.Group.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.id = null; + this.type = null; + this.clipShape = null; + this._children = null; + this._storage = null; + this.__dirty = null; + this.ignore = null; + + super.destroy(); + } + + + /** + * @function LevelRenderer.Group.prototype.children + * @description 复制并返回一份新的包含所有儿子节点的数组。 + * @returns {Array.} 图形数组。 + */ + children() { + return this._children.slice(); + } + + + /** + * @function LevelRenderer.Group.prototype.childAt + * @description 获取指定 index 的儿子节点 + * @param {number} idx - 节点索引。 + * @returns {LevelRenderer.Shape} 图形。 + */ + childAt(idx) { + return this._children[idx]; + } + + + /** + * @function LevelRenderer.Group.prototype.addChild + * @description 添加子节点,可以是 Shape 或者 Group。 + * @param {(LevelRenderer.Shape|LevelRenderer.Group)} child - 节点图形。 + */ + // TODO Type Check + addChild(child) { + if (child == this) { + return; + } + + if (child.parent == this) { + return; + } + if (child.parent) { + child.parent.removeChild(child); + } + + this._children.push(child); + child.parent = this; + + if (this._storage && this._storage !== child._storage) { + + this._storage.addToMap(child); + + if (child instanceof Group) { + child.addChildrenToStorage(this._storage); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.removeChild + * @description 移除子节点。 + * @param {LevelRenderer.Shape} child - 需要移除的子节点图形。 + */ + removeChild(child) { + var idx = Util.indexOf(this._children, child); + + this._children.splice(idx, 1); + child.parent = null; + + if (this._storage) { + + this._storage.delFromMap(child.id); + + if (child instanceof Group) { + child.delChildrenFromStorage(this._storage); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.eachChild + * @description 遍历所有子节点。 + * @param {function} cb - 回调函数。 + * @param {Object} context - 上下文。 + */ + eachChild(cb, context) { + var haveContext = !!context; + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + if (haveContext) { + cb.call(context, child); + } else { + cb(child); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.traverse + * @description 深度优先遍历所有子孙节点。 + * @param {function} cb - 回调函数。 + * @param {Object} context - 上下文。 + */ + traverse(cb, context) { + var haveContext = !!context; + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + if (haveContext) { + cb.call(context, child); + } else { + cb(child); + } + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.addChildrenToStorage + * @description 把子图形添加到仓库。 + * @param {LevelRenderer.Storage} storage - 图形仓库。 + */ + addChildrenToStorage(storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToMap(child); + if (child.type === 'group') { + child.addChildrenToStorage(storage); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.delChildrenFromStorage + * @description 从仓库把子图形删除。 + * @param {LevelRenderer.Storage} storage - 图形仓库。 + */ + delChildrenFromStorage(storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromMap(child.id); + if (child.type === 'group') { + child.delChildrenFromStorage(storage); + } + } + } + + + /** + * @function LevelRenderer.Group.prototype.modSelf + * @description 是否修改。 + */ + modSelf() { + this.__dirty = true; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Storage.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Storage + * @category Visualization Theme + * @classdesc 内容(图像)仓库 (M) 。 + */ +class Storage { + constructor() { + /** + * @member {Object} LevelRenderer.Storage.prototype._elements + * @description 所有常规形状,id 索引的 map。 + */ + this._elements = {}; + + /** + * @member {Array} LevelRenderer.Storage.prototype._hoverElements + * @description 高亮层形状,不稳定,动态增删,数组位置也是 z 轴方向,靠前显示在下方。 + * + */ + this._hoverElements = []; + + /** + * @member {Array} LevelRenderer.Storage.prototype._roots + * @description _roots。 + * + */ + this._roots = []; + + /** + * @member {Array} LevelRenderer.Storage.prototype._shapeList + * @description _shapeList。 + * + */ + this._shapeList = []; + + /** + * @member {number} LevelRenderer.Storage.prototype._shapeListOffset + * @description _shapeListOffset。默认值:0。 + * + */ + this._shapeListOffset = 0; + + this.CLASS_NAME = "SuperMap.LevelRenderer.Storage"; + } + + /** + * @function LevelRenderer.Storage.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.dispose(); + this._shapeList = null; + this._shapeListOffset = null; + } + + /** + * @function LevelRenderer.Storage.prototype.iterShape + * @description 遍历迭代器。 + * + * @param {function} fun - 迭代回调函数,return true终止迭代。 + * @param {Object} option - 迭代参数,缺省为仅降序遍历普通层图形。 + * @param {boolean} [hover=true] - 是否是高亮层图形。 + * @param {string} [normal='down'] - 是否是普通层图形,迭代时是否指定及z轴顺序。可设值:'down' ,'up'。 + * @param {boolean} [update=false] - 是否在迭代前更新形状列表。 + * @return {LevelRenderer.Storage} this。 + */ + iterShape(fun, option) { + if (!option) { + var defaultIterateOption = { + hover: false, + normal: 'down', + update: false + }; + option = defaultIterateOption; + } + + if (option.hover) { + // 高亮层数据遍历 + for (var i = 0, l = this._hoverElements.length; i < l; i++) { + var el = this._hoverElements[i]; + el.updateTransform(); + if (fun(el)) { + return this; + } + } + } + + if (option.update) { + this.updateShapeList(); + } + + // 遍历: 'down' | 'up' + switch (option.normal) { + case 'down': + { + // 降序遍历,高层优先 + let l = this._shapeList.length; + while (l--) { + if (fun(this._shapeList[l])) { + return this; + } + } + break; + } + // case 'up': + default: + { + // 升序遍历,底层优先 + for (let i = 0, l = this._shapeList.length; i < l; i++) { + if (fun(this._shapeList[i])) { + return this; + } + } + break; + } + } + + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.getHoverShapes + * @param {boolean} [update=false] - 是否在返回前更新图形的变换。 + * @return {Array.} 图形数组。 + */ + getHoverShapes(update) { + // hoverConnect + var hoverElements = [], len = this._hoverElements.length; + for (let i = 0; i < len; i++) { + hoverElements.push(this._hoverElements[i]); + var target = this._hoverElements[i].hoverConnect; + if (target) { + var shape; + target = target instanceof Array ? target : [target]; + for (var j = 0, k = target.length; j < k; j++) { + shape = target[j].id ? target[j] : this.get(target[j]); + if (shape) { + hoverElements.push(shape); + } + } + } + } + hoverElements.sort(Storage.shapeCompareFunc); + if (update) { + for (let i = 0, l = hoverElements.length; i < l; i++) { + hoverElements[i].updateTransform(); + } + } + return hoverElements; + } + + /** + * @function LevelRenderer.Storage.prototype.getShapeList + * @description 返回所有图形的绘制队列。 + * + * @param {boolean} [update=false] - 是否在返回前更新该数组。 详见: updateShapeList。 + * @return {LevelRenderer.Shape} 图形。 + */ + getShapeList(update) { + if (update) { + this.updateShapeList(); + } + return this._shapeList; + } + + /** + * @function LevelRenderer.Storage.prototype.updateShapeList + * @description 更新图形的绘制队列。每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中,最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列。 + */ + updateShapeList() { + this._shapeListOffset = 0; + var rootsLen = this._roots.length; + for (let i = 0; i < rootsLen; i++) { + let root = this._roots[i]; + this._updateAndAddShape(root); + } + this._shapeList.length = this._shapeListOffset; + + var shapeListLen = this._shapeList.length; + for (let i = 0; i < shapeListLen; i++) { + this._shapeList[i].__renderidx = i; + } + + this._shapeList.sort(Storage.shapeCompareFunc); + } + + /** + * @function LevelRenderer.Storage.prototype._updateAndAddShape + * @description 更新并添加图形。 + * + */ + _updateAndAddShape(el, clipShapes) { + if (el.ignore) { + return; + } + + el.updateTransform(); + + if (el.type == 'group') { + + if (el.clipShape) { + // clipShape 的变换是基于 group 的变换 + el.clipShape.parent = el; + el.clipShape.updateTransform(); + + // PENDING 效率影响 + if (clipShapes) { + clipShapes = clipShapes.slice(); + clipShapes.push(el.clipShape); + } else { + clipShapes = [el.clipShape]; + } + } + + for (var i = 0; i < el._children.length; i++) { + var child = el._children[i]; + + // Force to mark as dirty if group is dirty + child.__dirty = el.__dirty || child.__dirty; + + this._updateAndAddShape(child, clipShapes); + } + + // Mark group clean here + el.__dirty = false; + + } else { + el.__clipShapes = clipShapes; + + this._shapeList[this._shapeListOffset++] = el; + } + } + + /** + * @function LevelRenderer.Storage.prototype.mod + * @description 修改图形(Shape)或者组(Group)。 + * + * @param {string} elId - 唯一标识。 + * @param {Object} params - 参数。 + * @return {LevelRenderer.Storage} this。 + */ + mod(elId, params) { + var el = this._elements[elId]; + if (el) { + + el.modSelf(); + + if (params) { + // 如果第二个参数直接使用 shape + // parent, _storage, __startClip 三个属性会有循环引用 + // 主要为了向 1.x 版本兼容,2.x 版本不建议使用第二个参数 + if (params.parent || params._storage || params.__startClip) { + var target = {}; + for (var name in params) { + if ( + name == 'parent' + || name == '_storage' + || name == '__startClip' + ) { + continue; + } + if (params.hasOwnProperty(name)) { + target[name] = params[name]; + } + } + new Util_Util().merge(el, target, true); + } else { + new Util_Util().merge(el, params, true); + } + } + } + + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.drift + * @description 移动指定的图形(Shape)的位置。 + * @param {string} shapeId - 唯一标识。 + * @param {number} dx + * @param {number} dy + * @return {LevelRenderer.Storage} this。 + */ + drift(shapeId, dx, dy) { + var shape = this._elements[shapeId]; + if (shape) { + shape.needTransform = true; + if (shape.draggable === 'horizontal') { + dy = 0; + } else if (shape.draggable === 'vertical') { + dx = 0; + } + if (!shape.ondrift // ondrift + // 有onbrush并且调用执行返回false或undefined则继续 + || (shape.ondrift && !shape.ondrift(dx, dy)) + ) { + shape.drift(dx, dy); + } + } + + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.addHover + * @description 添加高亮层数据。 + * @param {LevelRenderer.Shape} shape - 图形。 + * @return {LevelRenderer.Storage} this。 + */ + addHover(shape) { + shape.updateNeedTransform(); + this._hoverElements.push(shape); + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.delHover + * @description 清空高亮层数据。 + * @return {LevelRenderer.Storage} this。 + */ + delHover() { + this._hoverElements = []; + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.hasHoverShape + * @description 是否有图形在高亮层里。 + * @return {boolean} 是否有图形在高亮层里。 + */ + hasHoverShape() { + return this._hoverElements.length > 0; + } + + /** + * @function LevelRenderer.Storage.prototype.addRoot + * @description 添加图形(Shape)或者组(Group)到根节点。 + * + * @param {(LevelRenderer.Shape/LevelRenderer.Group)} el - 图形。 + * + */ + addRoot(el) { + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToMap(el); + this._roots.push(el); + } + + /** + * @function LevelRenderer.Storage.prototype.delRoot + * @description 删除指定的图形(Shape)或者组(Group)。 + * + * @param {Array.} elId - 删除图形(Shape)或者组(Group)的 id 数组。如果为空清空整个Storage。 + * + */ + delRoot(elId) { + if (typeof(elId) == 'undefined') { + // 不指定elId清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._elements = {}; + this._hoverElements = []; + this._roots = []; + + return; + } + + if (elId instanceof Array) { + var elIdLen = elId.length; + for (let i = 0; i < elIdLen; i++) { + this.delRoot(elId[i]); + } + return; + } + + var el; + if (typeof(elId) == 'string') { + el = this._elements[elId]; + } else { + el = elId; + } + + var idx = new Util_Util().indexOf(this._roots, el); + if (idx >= 0) { + this.delFromMap(el.id); + this._roots.splice(idx, 1); + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + } + + /** + * @function LevelRenderer.Storage.prototype.addToMap + * @description 添加图形到 map。 + * + * @param {LevelRenderer.Shape} el - 图形。 + * @return {LevelRenderer.Storage} this。 + */ + addToMap(el) { + if (el instanceof Group) { + el._storage = this; + } + el.modSelf(); + + this._elements[el.id] = el; + + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.get + * @description 获取指定图形。 + * + * @param {string} elId - 图形 id。 + * @return {LevelRenderer.Shape} 图形。 + */ + get(elId) { + return this._elements[elId]; + } + + /** + * @function LevelRenderer.Storage.prototype.delFromMap + * @description 从 map 中删除指定图形。 + * + * @param {string} elId - 图形id。 + * @return {LevelRenderer.Storage} this。 + */ + delFromMap(elId) { + var el = this._elements[elId]; + if (el) { + delete this._elements[elId]; + + if (el instanceof Group) { + el._storage = null; + } + } + + return this; + } + + /** + * @function LevelRenderer.Storage.prototype.dispose + * @description 清空并且释放 Storage。 + */ + dispose() { + this._elements = null; + // this._renderList = null; + this._roots = null; + this._hoverElements = null; + } + + static shapeCompareFunc(a, b) { + if (a.zlevel == b.zlevel) { + if (a.z == b.z) { + return a.__renderidx - b.__renderidx; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Painter.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @private + * @class LevelRenderer.Painter + * @category Visualization Theme + * @classdesc Painter 绘图模块。 + * @param {HTMLElement} root - 绘图区域(DIV)。 + * @param {LevelRenderer.Storage} storage - Storage 实例。 + */ +class Painter { + constructor(root, storage) { + /** + * @member {HTMLElement} LevelRenderer.Painter.prototype.root + * @description 绘图容器。 + * + */ + this.root = root; + + /** + * @member {Array} LevelRenderer.Painter.prototype.storage + * @description 图形仓库。 + * + */ + this.storage = storage; + + /** + * @member {HTMLElement} LevelRenderer.Painter.prototype._domRoot + * @description 容器根 dom 对象。 + * + */ + this._domRoot = null; + + /** + * @member {Object} LevelRenderer.Painter.prototype._layers + * @description 绘制层对象。 + * + */ + this._layers = {}; + + /** + * @member {Array} LevelRenderer.Painter.prototype._zlevelList + * @description 层列表。 + * + */ + this._zlevelList = []; + + /** + * @member {Object} LevelRenderer.Painter.prototype._layerConfig + * @description 绘制层配置对象。 + * + */ + this._layerConfig = {}; + + /** + * @member {Object} LevelRenderer.Painter.prototype._bgDom + * @description 背景层 Canvas (Dom)。 + * + */ + this._bgDom = null; + + /** + * @member {function} LevelRenderer.Painter.prototype.shapeToImage + * @description 形状转图像函数。 + * + */ + this.shapeToImage = null; + // retina 屏幕优化 + Painter.devicePixelRatio = Math.max((window.devicePixelRatio || 1), 1); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Painter"; + this.root.innerHTML = ''; + this._width = this._getWidth(); // 宽,缓存记录 + this._height = this._getHeight(); // 高,缓存记录 + + var domRoot = document.createElement('div'); + this._domRoot = domRoot; + + // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + domRoot.style.position = 'relative'; + domRoot.style.overflow = 'hidden'; + domRoot.style.width = this._width + 'px'; + domRoot.style.height = this._height + 'px'; + this.root.appendChild(domRoot); + + this.shapeToImage = this._createShapeToImageProcessor(); + + // 创建各层canvas + // 背景 + //this._bgDom = Painter.createDom('bg', 'div', this); + this._bgDom = Painter.createDom(Util.createUniqueID("SuperMap.Theme_background_"), 'div', this); + domRoot.appendChild(this._bgDom); + this._bgDom.onselectstart = returnFalse; + this._bgDom.style['-webkit-user-select'] = 'none'; + this._bgDom.style['user-select'] = 'none'; + this._bgDom.style['-webkit-touch-callout'] = 'none'; + + // 高亮 + //var hoverLayer = new PaintLayer('_hoverLayer_', this); + var hoverLayer = new PaintLayer(Util.createUniqueID("_highLightLayer_"), this); + this._layers['hover'] = hoverLayer; + domRoot.appendChild(hoverLayer.dom); + hoverLayer.initContext(); + + hoverLayer.dom.onselectstart = returnFalse; + hoverLayer.dom.style['-webkit-user-select'] = 'none'; + hoverLayer.dom.style['user-select'] = 'none'; + hoverLayer.dom.style['-webkit-touch-callout'] = 'none'; + + var me = this; + this.updatePainter = function (shapeList, callback) { + me.refreshShapes(shapeList, callback); + }; + + // 返回false的方法,用于避免页面被选中 + function returnFalse() { + return false; + } + + /* eslint-disable */ + // 什么都不干的空方法 + function doNothing() { //NOSONAR + } + /* eslint-enable */ + } + + + /** + * @function LevelRenderer.Painter.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.dispose(); + this._zlevelList = null; + this._layerConfig = null; + this._bgDom = null; + this.shapeToImage = null; + } + + + /** + * @function LevelRenderer.Painter.prototype.render + * @description 渲染。首次绘图,创建各种 dom 和 context。 + * + * @param {function} callback - 绘画结束后的回调函数。 + * @return {LevelRenderer.Painter} this。 + */ + render(callback) { + // TODO + this.refresh(callback, true); + + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.refresh + * @description 刷新。 + * + * @param {function} callback - 刷新结束后的回调函数。 + * @param {boolean} paintAll - 强制绘制所有 shape。 + * @return {LevelRenderer.Painter} this。 + */ + refresh(callback, paintAll) { + var list = this.storage.getShapeList(true); + this._paintList(list, paintAll); + + if (typeof callback == 'function') { + callback(); + } + + return this; + } + + + /** + * Method: _paintList + * 按列表绘制图形。 + */ + _paintList(list, paintAll) { + if (typeof(paintAll) == 'undefined') { + paintAll = false; + } + + this._updateLayerStatus(list); + + var currentLayer; + var currentZLevel; + var ctx; + + for (var id in this._layers) { + if (id !== 'hover') { + this._layers[id].unusedCount++; + this._layers[id].updateTransform(); + } + } + + var invTransform = []; + + for (var i = 0, l = list.length; i < l; i++) { + var shape = list[i]; + + if (currentZLevel !== shape.zlevel) { + if (currentLayer && currentLayer.needTransform) { + ctx.restore(); + } + + currentLayer = this.getLayer(shape.zlevel); + ctx = currentLayer.ctx; + currentZLevel = shape.zlevel; + + // Reset the count + currentLayer.unusedCount = 0; + + if (currentLayer.dirty || paintAll) { + currentLayer.clear(); + } + + if (currentLayer.needTransform) { + ctx.save(); + currentLayer.setTransform(ctx); + } + } + + // Start group clipping + if (ctx && shape.__startClip) { + var clipShape = shape.__startClip; + ctx.save(); + // Set transform + if (clipShape.needTransform) { + let m = clipShape.transform; + SUtil_SUtil.Util_matrix.invert(invTransform, m); + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + + ctx.beginPath(); + clipShape.buildPath(ctx, clipShape.style); + ctx.clip(); + + // Transform back + if (clipShape.needTransform) { + let m = invTransform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + + if (((currentLayer && currentLayer.dirty) || paintAll) && !shape.invisible) { + if ( + !shape.onbrush + || (shape.onbrush && !shape.onbrush(ctx, false)) + ) { + if (Config.catchBrushException) { + try { + shape.brush(ctx, false, this.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log( + error, + 'brush error of ' + shape.type, + shape + ); + } + } else { + shape.brush(ctx, false, this.updatePainter); + } + } + } + + // Stop group clipping + if (ctx && shape.__stopClip) { + ctx.restore(); + } + + shape.__dirty = false; + } + + if (ctx && currentLayer && currentLayer.needTransform) { + ctx.restore(); + } + + for (let id in this._layers) { + if (id !== 'hover') { + var layer = this._layers[id]; + layer.dirty = false; + // 删除过期的层 + // PENDING + // if (layer.unusedCount >= 500) { + // this.delLayer(id); + // } + if (layer.unusedCount == 1) { + layer.clear(); + } + } + } + + } + + + /** + * @function LevelRenderer.Painter.prototype.getLayer + * @description 获取 zlevel 所在层,如果不存在则会创建一个新的层。 + * + * @param {number} zlevel - zlevel。 + * @return {LevelRenderer.Painter} this。 + */ + getLayer(zlevel) { + // Change draw layer + var currentLayer = this._layers[zlevel]; + if (!currentLayer) { + var len = this._zlevelList.length; + var prevLayer = null; + var i = -1; + if (len > 0 && zlevel > this._zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if ( + this._zlevelList[i] < zlevel + && this._zlevelList[i + 1] > zlevel + ) { + break; + } + } + prevLayer = this._layers[this._zlevelList[i]]; + } + this._zlevelList.splice(i + 1, 0, zlevel); + + // Create a new layer + //currentLayer = new PaintLayer(zlevel, this); + currentLayer = new PaintLayer(Util.createUniqueID("_levelLayer_" + zlevel), this); + var prevDom = prevLayer ? prevLayer.dom : this._bgDom; + if (prevDom.nextSibling) { + prevDom.parentNode.insertBefore( + currentLayer.dom, + prevDom.nextSibling + ); + } else { + prevDom.parentNode.appendChild( + currentLayer.dom + ); + } + currentLayer.initContext(); + + this._layers[zlevel] = currentLayer; + + if (this._layerConfig[zlevel]) { + new Util_Util().merge(currentLayer, this._layerConfig[zlevel], true); + } + + currentLayer.updateTransform(); + } + + return currentLayer; + } + + + /** + * @function LevelRenderer.Painter.prototype.getLayers + * @description 获取所有已创建的层。 + * @return {Array.} 已创建的层 + */ + getLayers() { + return this._layers; + } + + + /** + * Method: _updateLayerStatus + * 更新绘制层状态。 + */ + _updateLayerStatus(list) { + var layers = this._layers; + + var elCounts = {}; + for (let z in layers) { + if (z !== 'hover') { + elCounts[z] = layers[z].elCount; + layers[z].elCount = 0; + } + } + + for (let i = 0; i < list.length; i++) { + var shape = list[i]; + var zlevel = shape.zlevel; + var layer = layers[zlevel]; + if (layer) { + layer.elCount++; + // 已经被标记为需要刷新 + if (layer.dirty) { + continue; + } + layer.dirty = shape.__dirty; + } + } + + // 层中的元素数量有发生变化 + for (let z in layers) { + if (z !== 'hover') { + if (elCounts[z] !== layers[z].elCount) { + layers[z].dirty = true; + } + } + } + } + + + /** + * @function LevelRenderer.Painter.prototype.refreshShapes + * @description 更新的图形元素列表。 + * + * @param {number} shapeList - 需要更新的图形元素列表。 + * @param {number} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Painter} this。 + */ + refreshShapes(shapeList, callback) { + for (var i = 0, l = shapeList.length; i < l; i++) { + var shape = shapeList[i]; + this.storage.mod(shape.id); + } + + this.refresh(callback); + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.clear + * @description 清除 hover 层外所有内容。 + * @return {LevelRenderer.Painter} this。 + */ + clear() { + for (var k in this._layers) { + if (k == 'hover') { + continue; + } + this._layers[k].clear(); + } + + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.modLayer + * @description 修改指定 zlevel 的绘制参数。 + * + * @param {string} zlevel - zlevel。 + * @param {Object} config - 配置对象。 + * @param {string} [config.clearColor=0] - 每次清空画布的颜色。 + * @param {boolean} [config.motionBlur=false] - 是否开启动态模糊。 + * @param {number} [config.lastFrameAlpha=0.7] - 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显。默认值:0.7。 + * @param {Array.} config.position - 层的平移。 + * @param {Array.} config.rotation - 层的旋转。 + * @param {Array.} config.scale - 层的缩放。 + * @param {boolean} config.zoomable - 层是否支持鼠标缩放操作。默认值:false。 + * @param {boolean} config.panable - 层是否支持鼠标平移操作。默认值:false。 + * + */ + modLayer(zlevel, config) { + if (config) { + if (!this._layerConfig[zlevel]) { + this._layerConfig[zlevel] = config; + } else { + new Util_Util().merge(this._layerConfig[zlevel], config, true); + } + + var layer = this._layers[zlevel]; + + if (layer) { + new Util_Util().merge(layer, this._layerConfig[zlevel], true); + } + } + } + + + /** + * @function LevelRenderer.Painter.prototype.delLayer + * @description 删除指定层。 + * + * @param {string} zlevel - 层所在的 zlevel。 + */ + delLayer(zlevel) { + var layer = this._layers[zlevel]; + if (!layer) { + return; + } + // Save config + this.modLayer(zlevel, { + position: layer.position, + rotation: layer.rotation, + scale: layer.scale + }); + layer.dom.parentNode.removeChild(layer.dom); + delete this._layers[zlevel]; + + this._zlevelList.splice(new Util_Util().indexOf(this._zlevelList, zlevel), 1); + } + + + /** + * @function LevelRenderer.Painter.prototype.refreshHover + * @description 刷新 hover 层。 + * @return {LevelRenderer.Painter} this。 + */ + refreshHover() { + this.clearHover(); + var list = this.storage.getHoverShapes(true); + for (var i = 0, l = list.length; i < l; i++) { + this._brushHover(list[i]); + } + this.storage.delHover(); + + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.clearHover + * @description 清除 hover 层所有内容。 + * @return {LevelRenderer.Painter} this。 + */ + clearHover() { + var hover = this._layers.hover; + hover && hover.clear(); + + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.resize + * @description 区域大小变化后重绘。 + * @return {LevelRenderer.Painter} this。 + */ + resize() { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + + var width = this._getWidth(); + var height = this._getHeight(); + + domRoot.style.display = ''; + + // 优化没有实际改变的resize + if (this._width != width || height != this._height) { + this._width = width; + this._height = height; + + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + + this._layers[id].resize(width, height); + } + + this.refresh(null, true); + } + + return this; + } + + + /** + * @function LevelRenderer.Painter.prototype.clearLayer + * @description 清除指定的一个层。 + * @param {number} zLevel - 层。 + */ + clearLayer(zLevel) { + var layer = this._layers[zLevel]; + if (layer) { + layer.clear(); + } + } + + + /** + * @function LevelRenderer.Painter.prototype.dispose + * @description 释放。 + * + */ + dispose() { + this.root.innerHTML = ''; + + this.root = null; + this.storage = null; + this._domRoot = null; + this._layers = null; + } + + + /** + * @function LevelRenderer.Painter.prototype.getDomHover + * @description 获取 Hover 层的 Dom。 + */ + getDomHover() { + return this._layers.hover.dom; + } + + + /** + * @function LevelRenderer.Painter.prototype.toDataURL + * @description 图像导出。 + * @param {string} type - 图片类型。 + * @param {string} backgroundColor - 背景色。默认值:'#fff'。 + * @param {Object} args + * @return {string} 图片的Base64 url。 + */ + toDataURL(type, backgroundColor, args) { + //var imageDom = Painter.createDom('image', 'canvas', this); + var imageDom = Painter.createDom(Util.createUniqueID("SuperMap.Theme.image_"), 'canvas', this); + this._bgDom.appendChild(imageDom); + var ctx = imageDom.getContext('2d'); + Painter.devicePixelRatio != 1 + && ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + + ctx.fillStyle = backgroundColor || '#fff'; + ctx.rect( + 0, 0, + this._width * Painter.devicePixelRatio, + this._height * Painter.devicePixelRatio + ); + ctx.fill(); + + var self = this; + // 升序遍历,shape上的zlevel指定绘画图层的z轴层叠 + + this.storage.iterShape( + function (shape) { + if (!shape.invisible) { + if (!shape.onbrush // 没有onbrush + // 有onbrush并且调用执行返回false或undefined则继续粉刷 + || (shape.onbrush && !shape.onbrush(ctx, false)) + ) { + if (Config.catchBrushException) { + try { + shape.brush(ctx, false, self.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log( + error, + 'brush error of ' + shape.type, + shape + ); + } + } else { + shape.brush(ctx, false, self.updatePainter); + } + } + } + }, + {normal: 'up', update: true} + ); + var image = imageDom.toDataURL(type, args); + ctx = null; + this._bgDom.removeChild(imageDom); + return image; + } + + + /** + * @function LevelRenderer.Painter.prototype.getWidth + * @description 获取绘图区域宽度。 + * @return {number} 绘图区域宽度。 + */ + getWidth() { + return this._width; + } + + + /** + * @function LevelRenderer.Painter.prototype.getHeight + * @description 获取绘图区域高度。 + * @return {number} 绘图区域高度。 + */ + getHeight() { + return this._height; + } + + + /** + * Method: _getWidth + * + */ + _getWidth() { + var root = this.root; + var stl = root.currentStyle + || document.defaultView.getComputedStyle(root); + + return ((root.clientWidth || parseInt(stl.width, 10)) + - parseInt(stl.paddingLeft, 10) // 请原谅我这比较粗暴 + - parseInt(stl.paddingRight, 10)).toFixed(0) - 0; + } + + + /** + * Method: _getHeight + * + */ + _getHeight() { + var root = this.root; + var stl = root.currentStyle + || document.defaultView.getComputedStyle(root); + + return ((root.clientHeight || parseInt(stl.height, 10)) + - parseInt(stl.paddingTop, 10) // 请原谅我这比较粗暴 + - parseInt(stl.paddingBottom, 10)).toFixed(0) - 0; + } + + + /** + * Method: _brushHover + * + */ + _brushHover(shape) { + var ctx = this._layers.hover.ctx; + + if (!shape.onbrush // 没有onbrush + // 有onbrush并且调用执行返回false或undefined则继续粉刷 + || (shape.onbrush && !shape.onbrush(ctx, true)) + ) { + var layer = this.getLayer(shape.zlevel); + if (layer.needTransform) { + ctx.save(); + layer.setTransform(ctx); + } + // Retina 优化 + if (Config.catchBrushException) { + try { + shape.brush(ctx, true, this.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log( + error, 'hoverBrush error of ' + shape.type, shape + ); + } + } else { + shape.brush(ctx, true, this.updatePainter); + } + if (layer.needTransform) { + ctx.restore(); + } + } + + } + + + /** + * Method: _shapeToImage + * + */ + _shapeToImage(id, shape, width, height, devicePixelRatio) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + var _devicePixelRatio = devicePixelRatio || window.devicePixelRatio || 1; + + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + canvas.setAttribute('width', width * _devicePixelRatio); + canvas.setAttribute('height', height * _devicePixelRatio); + + ctx.clearRect(0, 0, width * _devicePixelRatio, height * _devicePixelRatio); + + var shapeTransform = { + position: shape.position, + rotation: shape.rotation, + scale: shape.scale + }; + shape.position = [0, 0, 0]; + shape.rotation = 0; + shape.scale = [1, 1]; + if (shape) { + shape.brush(ctx, false); + } + + var imgShape = new SmicImage({ + id: id, + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (shapeTransform.position != null) { + imgShape.position = shape.position = shapeTransform.position; + } + + if (shapeTransform.rotation != null) { + imgShape.rotation = shape.rotation = shapeTransform.rotation; + } + + if (shapeTransform.scale != null) { + imgShape.scale = shape.scale = shapeTransform.scale; + } + + return imgShape; + } + + + /** + * Method: _createShapeToImageProcessor + * + */ + _createShapeToImageProcessor() { + var me = this; + + return function (id, e, width, height) { + return me._shapeToImage( + id, e, width, height, Painter.devicePixelRatio + ); + }; + } + + + // SMIC-方法扩展 - start + /** + * @function LevelRenderer.Painter.prototype.updateHoverLayer + * @description 更新设置显示高亮图层。 + * @param {Array} shapes - 图形数组。 + */ + updateHoverLayer(shapes) { + if (!(shapes instanceof Array)) { + return this; + } + + //清除高亮 + this.clearHover(); + this.storage.delHover(); + + for (var i = 0; i < shapes.length; i++) { + this.storage.addHover(shapes[i]); + this._brushHover(shapes[i]); + } + } + + + /** + * @function LevelRenderer.Painter.prototype.createDom + * @description 创建 Dom。 + * + * @param {string} id - Dom id + * @param {string} type - Dom type + * @param {LevelRenderer.Painter} painter - Painter 实例。 + * @return {Object} Dom + */ + static createDom(id, type, painter) { + var newDom = document.createElement(type); + var width = painter._width; + var height = painter._height; + + // 没append呢,请原谅我这样写,清晰~ + newDom.style.position = 'absolute'; + newDom.style.left = 0; + newDom.style.top = 0; + newDom.style.width = width + 'px'; + newDom.style.height = height + 'px'; + newDom.setAttribute('width', width * Painter.devicePixelRatio); + newDom.setAttribute('height', height * Painter.devicePixelRatio); + + // id不作为索引用,避免可能造成的重名,定义为私有属性 + //newDom.setAttribute('data-zr-dom-id', id); + newDom.setAttribute('id', id); + return newDom; + } +} + +/** + * @private + * @class Painter.Layer + * @classdesc 绘制层类。 + * @extends LevelRenderer.Transformable + */ +class PaintLayer extends Transformable { + + /** + * @function Painter.Layer.constructor + * @description 构造函数。 + * + * @param {string} id - id。 + * @param {LevelRenderer.Painter} painter - Painter 实例。 + * + */ + constructor(id, painter) { + super(id, painter); + /** + * @member {Object} Painter.Layer.prototype.dom + * @description dom。 + */ + this.dom = null; + + /** + * @member {Object} Painter.Layer.prototype.domBack + * @description domBack。 + */ + this.domBack = null; + + /** + * @member {Object} Painter.Layer.prototype.ctxBack + * @description ctxBack。 + */ + this.ctxBack = null; + + /** + * @member {LevelRenderer.Painter} Painter.Layer.prototype.painter + * @description painter。 + */ + this.painter = painter; + + /** + * @member {number} Painter.Layer.prototype.unusedCount + * @description unusedCount。 + */ + this.unusedCount = 0; + + /** + * @member {Object} Painter.Layer.prototype.config + * @description config。 + */ + this.config = null; + + /** + * @member {boolean} Painter.Layer.prototype.dirty + * @description dirty。 + */ + this.dirty = true; + + /** + * @member {number} Painter.Layer.prototype.elCount + * @description elCount。 + */ + this.elCount = 0; + + // Configs + /** + * @member {string} Painter.Layer.prototype.clearColor + * @description 每次清空画布的颜色。默认值:0; + */ + this.clearColor = 0; + + /** + * @member {boolean} Painter.Layer.prototype.motionBlur + * @description 是否开启动态模糊。默认值:false; + */ + this.motionBlur = false; + + /** + * @member {number} Painter.Layer.prototype.lastFrameAlpha + * @description 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + this.lastFrameAlpha = 0.7; + + /** + * @member {boolean} Painter.Layer.prototype.zoomable + * @description 层是否支持鼠标平移操作。默认值:false; + */ + this.zoomable = false; + + /** + * @member {boolean} Painter.Layer.prototype.panable + * @description 层是否支持鼠标缩放操作。默认值:false; + */ + this.panable = false; + + /** + * @member {number} Painter.Layer.prototype.maxZoom + * @description maxZoom。默认值:Infinity。 + */ + this.maxZoom = Infinity; + + /** + * @member {number} Painter.Layer.prototype.minZoom + * @description minZoom。默认值:0。 + */ + this.minZoom = 0; + + /** + * @member {number} Painter.Layer.prototype.ctx + * @description Canvas 上下文。 + */ + this.ctx = null; + this.dom = Painter.createDom(Util.createUniqueID("SuperMap.Theme" + id), 'canvas', painter); + this.dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + this.dom.style['-webkit-user-select'] = 'none'; + this.dom.style['user-select'] = 'none'; + this.dom.style['-webkit-touch-callout'] = 'none'; + // Function + // 返回false的方法,用于避免页面被选中 + function returnFalse() { + return false; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Painter.Layer"; + } + + /** + * @function Painter.Layer.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.dom = null; + this.domBack = null; + this.ctxBack = null; + this.painter = null; + this.unusedCount = null; + this.config = null; + this.dirty = null; + this.elCount = null; + this.clearColor = null; + this.motionBlur = null; + this.lastFrameAlpha = null; + this.zoomable = null; + this.panable = null; + this.maxZoom = null; + this.minZoom = null; + this.ctx = null; + + Transformable.destroy.apply(this, arguments); + } + + /** + * @function Painter.Layer.prototype.initContext + * @description 初始化 Canvan 2D 上下文。 + */ + initContext() { + this.ctx = this.dom.getContext('2d'); + if (Painter.devicePixelRatio != 1) { + this.ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + + /** + * @function Painter.Layer.prototype.createBackBuffer + * @description 创建备份缓冲。 + */ + createBackBuffer() { + this.domBack = Painter.createDom(Util.createUniqueID("SuperMap.Theme.back-" + this.id), 'canvas', this.painter); + this.ctxBack = this.domBack.getContext('2d'); + + if (Painter.devicePixelRatio != 1) { + this.ctxBack.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + + /** + * @function Painter.Layer.prototype.resize + * @description 改变大小。 + * + * @param {number} width - 宽。 + * @param {number} height - 高。 + */ + resize(width, height) { + this.dom.style.width = width + 'px'; + this.dom.style.height = height + 'px'; + + this.dom.setAttribute('width', width * Painter.devicePixelRatio); + this.dom.setAttribute('height', height * Painter.devicePixelRatio); + + if (Painter.devicePixelRatio != 1) { + this.ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + + if (this.domBack) { + this.domBack.setAttribute('width', width * Painter.devicePixelRatio); + this.domBack.setAttribute('height', height * Painter.devicePixelRatio); + + if (Painter.devicePixelRatio != 1) { + this.ctxBack.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + } + + /** + * @function Painter.Layer.prototype.clear + * @description 清空该层画布。 + */ + clear() { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + + var haveClearColor = this.clearColor; + var haveMotionBLur = this.motionBlur; + var lastFrameAlpha = this.lastFrameAlpha; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage( + dom, 0, 0, + width / Painter.devicePixelRatio, + height / Painter.devicePixelRatio + ); + } + + if (haveClearColor) { + ctx.save(); + ctx.fillStyle = this.config.clearColor; + ctx.fillRect( + 0, 0, + width / Painter.devicePixelRatio, + height / Painter.devicePixelRatio + ); + ctx.restore(); + } else { + ctx.clearRect( + 0, 0, + width / Painter.devicePixelRatio, + height / Painter.devicePixelRatio + ); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage( + domBack, 0, 0, + width / Painter.devicePixelRatio, + height / Painter.devicePixelRatio + ); + ctx.restore(); + } + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Handler.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @private + * @class LevelRenderer.Handler + * @category Visualization Theme + * @classdesc Handler控制模块。 + * @extends {LevelRenderer.Eventful} + * @param {HTMLElement} root - 绘图区域。 + * @param {LevelRenderer.Storage} storage - Storage 实例。 + * @param {LevelRenderer.Painter} painter - Painter 实例。 + */ +class Handler extends Eventful { + constructor(root, storage, painter) { + super(root, storage, painter); + /** + * @member {HTMLElement} LevelRenderer.Handler.prototype.root + * @description 绘图区域 + */ + this.root = root; + /** + * @member {LevelRenderer.Storage} LevelRenderer.Handler.prototype.storage + * @description Storage 实例 + */ + this.storage = storage; + /** + * @member {LevelRenderer.Painter} LevelRenderer.Handler.prototype.Painter + * @description Painter 实例 + */ + this.painter = painter; + /** + * @member {number} [LevelRenderer.Handler.prototype._lastX=0] + * @description 上一次鼠标位置x坐标值 + */ + this._lastX = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._lastY=0] + * @description 上一次鼠标位置y坐标值 + */ + this._lastY = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._mouseX=0] + * @description 当前鼠标位置x坐标值 + */ + this._mouseX = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._mouseY=0] + * @description 当前鼠标位置y坐标值 + */ + this._mouseY = 0; + /** + * @member {function} LevelRenderer.Handler.prototype._findHover + * @description 查找 Hover 图形 + */ + this._findHover = null; + /** + * @member {Object} LevelRenderer.Handler.prototype._domHover + * @description 高亮 DOM + */ + this._domHover = null; + + // 各种事件标识的私有变量 + // this._hasfound = false; // 是否找到 hover 图形元素 + // this._lastHover = null; // 最后一个 hover 图形元素 + // this._mouseDownTarget = null; + // this._draggingTarget = null; // 当前被拖拽的图形元素 + // this._isMouseDown = false; + // this._isDragging = false; + // this._lastMouseDownMoment; + // this._lastTouchMoment; + // this._lastDownButton; + + this._findHover = bind3Arg(findHover, this); + this._domHover = painter.getDomHover(); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Handler"; + var domHandlers = { + /** + * Method: resize + * 窗口大小改变响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + resize: function (event) { + event = event || window.event; + this._lastHover = null; + this._isMouseDown = 0; + + // 分发SuperMap.LevelRenderer.Config.EVENT.RESIZE事件,global + this.dispatch(Config.EVENT.RESIZE, event); + }, + + /** + * Method: click + * 点击响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + click: function (event) { + event = this._zrenderEventFixed(event); + + // 分发SuperMap.LevelRenderer.Config.EVENT.CLICK事件 + var _lastHover = this._lastHover; + if ((_lastHover && _lastHover.clickable) + || !_lastHover + ) { + + // 判断没有发生拖拽才触发click事件 + if (this._clickThreshold < 10) { + this._dispatchAgency(_lastHover, Config.EVENT.CLICK, event); + } + } + + this._mousemoveHandler(event); + }, + + /** + * Method: dblclick + * 双击响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + dblclick: function (event) { + event = event || window.event; + event = this._zrenderEventFixed(event); + + // 分发SuperMap.LevelRenderer.Config.EVENT.DBLCLICK事件 + var _lastHover = this._lastHover; + if ((_lastHover && _lastHover.clickable) + || !_lastHover + ) { + + // 判断没有发生拖拽才触发dblclick事件 + if (this._clickThreshold < 5) { + this._dispatchAgency(_lastHover, Config.EVENT.DBLCLICK, event); + } + } + + this._mousemoveHandler(event); + }, + + /** + * Method: mousewheel + * 鼠标滚轮响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousewheel: function (event) { + event = this._zrenderEventFixed(event); + + // http://www.sitepoint.com/html5-javascript-mouse-wheel/ + // https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/mousewheel + var delta = event.wheelDelta // Webkit + || -event.detail; // Firefox + var scale = delta > 0 ? 1.1 : 1 / 1.1; + + var layers = this.painter.getLayers(); + + var needsRefresh = false; + for (var z in layers) { + if (z !== 'hover') { + var layer = layers[z]; + var pos = layer.position; + if (layer.zoomable) { + layer.__zoom = layer.__zoom || 1; + var newZoom = layer.__zoom; + newZoom *= scale; + newZoom = Math.max( + Math.min(layer.maxZoom, newZoom), + layer.minZoom + ); + scale = newZoom / layer.__zoom; + layer.__zoom = newZoom; + // Keep the mouse center when scaling + pos[0] -= (this._mouseX - pos[0]) * (scale - 1); + pos[1] -= (this._mouseY - pos[1]) * (scale - 1); + layer.scale[0] *= scale; + layer.scale[1] *= scale; + layer.dirty = true; + needsRefresh = true; + } + } + } + if (needsRefresh) { + this.painter.refresh(); + } + + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEWHEEL事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEWHEEL, event); + this._mousemoveHandler(event); + }, + + /** + * Method: mousemove + * 鼠标(手指)移动响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousemove: function (event) { + // 拖拽不触发click事件 + this._clickThreshold++; + + event = this._zrenderEventFixed(event); + this._lastX = this._mouseX; + this._lastY = this._mouseY; + this._mouseX = SUtil_SUtil.Util_event.getX(event); + this._mouseY = SUtil_SUtil.Util_event.getY(event); + var dx = this._mouseX - this._lastX; + var dy = this._mouseY - this._lastY; + + // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGSTART事件 + // 避免手抖点击误认为拖拽 + // if (this._mouseX - this._lastX > 1 || this._mouseY - this._lastY > 1) { + this._processDragStart(event); + // } + this._hasfound = 0; + this._event = event; + + this._iterateAndFindHover(); + + // 找到的在迭代函数里做了处理,没找到得在迭代完后处理 + if (!this._hasfound) { + // 过滤首次拖拽产生的mouseout和dragLeave + if (!this._draggingTarget + || (this._lastHover && this._lastHover != this._draggingTarget) + ) { + // 可能出现SuperMap.LevelRenderer.Config.EVENT.MOUSEOUT事件 + this._processOutShape(event); + + // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + this._processDragLeave(event); + } + + this._lastHover = null; + this.storage.delHover(); + this.painter.clearHover(); + } + + // set cursor for root element + var cursor = ''; + + // 如果存在拖拽中元素,被拖拽的图形元素最后addHover + if (this._draggingTarget) { + this.storage.drift(this._draggingTarget.id, dx, dy); + this._draggingTarget.modSelf(); + this.storage.addHover(this._draggingTarget); + } else if (this._isMouseDown) { + // Layer dragging + var layers = this.painter.getLayers(); + + var needsRefresh = false; + for (var z in layers) { + if (z !== 'hover') { + var layer = layers[z]; + if (layer.panable) { + // PENDING + cursor = 'move'; + // Keep the mouse center when scaling + layer.position[0] += dx; + layer.position[1] += dy; + needsRefresh = true; + layer.dirty = true; + } + } + } + if (needsRefresh) { + this.painter.refresh(); + } + } + + if (this._draggingTarget || (this._hasfound && this._lastHover.draggable)) { + cursor = 'move'; + } else if (this._hasfound && this._lastHover.clickable) { + cursor = 'pointer'; + } + this.root.style.cursor = cursor; + + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEMOVE事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEMOVE, event); + + if (this._draggingTarget || this._hasfound || this.storage.hasHoverShape()) { + this.painter.refreshHover(); + } + }, + + /** + * Method: mouseout + * 鼠标(手指)离开响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mouseout: function (event) { + event = this._zrenderEventFixed(event); + + var element = event.toElement || event.relatedTarget; + if (element != this.root) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element == this.root) { + this._mousemoveHandler(event); + return; + } + + element = element.parentNode; + } + } + + event.zrenderX = this._lastX; + event.zrenderY = this._lastY; + this.root.style.cursor = ''; + this._isMouseDown = 0; + + this._processOutShape(event); + this._processDrop(event); + this._processDragEnd(event); + + this.painter.refreshHover(); + + this.dispatch(Config.EVENT.GLOBALOUT, event); + }, + + /** + * Method: mousedown + * 鼠标(手指)按下响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousedown: function (event) { + // 重置 clickThreshold + this._clickThreshold = 0; + + if (this._lastDownButton == 2) { + this._lastDownButton = event.button; + this._mouseDownTarget = null; + // 仅作为关闭右键菜单使用 + return; + } + + this._lastMouseDownMoment = new Date(); + event = this._zrenderEventFixed(event); + this._isMouseDown = 1; + + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEDOWN事件 + this._mouseDownTarget = this._lastHover; + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEDOWN, event); + this._lastDownButton = event.button; + }, + + /** + * Method: mouseup + * 鼠标(手指)抬起响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mouseup: function (event) { + event = this._zrenderEventFixed(event); + this.root.style.cursor = ''; + this._isMouseDown = 0; + this._mouseDownTarget = null; + + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEUP事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEUP, event); + this._processDrop(event); + this._processDragEnd(event); + }, + + /** + * Method: touchstart + * Touch 开始响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchstart: function (event) { + // SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + event = this._zrenderEventFixed(event, true); + this._lastTouchMoment = new Date(); + + // 平板补充一次findHover + this._mobildFindFixed(event); + this._mousedownHandler(event); + }, + + /** + * Method: touchmove + * Touch 移动响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchmove: function (event) { + event = this._zrenderEventFixed(event, true); + this._mousemoveHandler(event); + if (this._isDragging) { + SUtil_SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + } + }, + + /** + * Method: touchend + * Touch 结束响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchend: function (event) { + // SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + event = this._zrenderEventFixed(event, true); + this._mouseupHandler(event); + + var now = new Date(); + if (now - this._lastTouchMoment < Config.EVENT.touchClickDelay) { + this._mobildFindFixed(event); + this._clickHandler(event); + if (now - this._lastClickMoment < Config.EVENT.touchClickDelay / 2) { + this._dblclickHandler(event); + if (this._lastHover && this._lastHover.clickable) { + SUtil_SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + } + } + this._lastClickMoment = now; + } + this.painter.clearHover(); + } + }; + + initDomHandler(this); + + // 初始化,事件绑定,支持的所有事件都由如下原生事件计算得来 + if (window.addEventListener) { + window.addEventListener('resize', this._resizeHandler); + + if (SUtil_SUtil.Util_env.os.tablet || SUtil_SUtil.Util_env.os.phone) { + // mobile支持 + root.addEventListener('touchstart', this._touchstartHandler); + root.addEventListener('touchmove', this._touchmoveHandler); + root.addEventListener('touchend', this._touchendHandler); + } else { + // mobile的click/move/up/down自己模拟 + root.addEventListener('click', this._clickHandler); + root.addEventListener('dblclick', this._dblclickHandler); + root.addEventListener('mousewheel', this._mousewheelHandler); + root.addEventListener('mousemove', this._mousemoveHandler); + root.addEventListener('mousedown', this._mousedownHandler); + root.addEventListener('mouseup', this._mouseupHandler); + } + root.addEventListener('DOMMouseScroll', this._mousewheelHandler); + root.addEventListener('mouseout', this._mouseoutHandler); + } else { + window.attachEvent('onresize', this._resizeHandler); + + root.attachEvent('onclick', this._clickHandler); + //root.attachEvent('ondblclick ', this._dblclickHandler); + root.ondblclick = this._dblclickHandler; + root.attachEvent('onmousewheel', this._mousewheelHandler); + root.attachEvent('onmousemove', this._mousemoveHandler); + root.attachEvent('onmouseout', this._mouseoutHandler); + root.attachEvent('onmousedown', this._mousedownHandler); + root.attachEvent('onmouseup', this._mouseupHandler); + } + + // 辅助函数 start + /** + * Method: bind1Arg + * bind 一个参数的 function。 + * + * Parameters: + * handler - {function} 要 bind 的 function。 + * context - {Object} 运行时 this 环境。 + * + * Returns: + * {function} + */ + function bind1Arg(handler, context) { + return function (e) { + return handler.call(context, e); + }; + } + + /* + // bind 两个参数的 function + function bind2Arg(handler, context) { + return function (arg1, arg2) { + return handler.call(context, arg1, arg2); + }; + } + */ + + // bind 三个参数的 function + function bind3Arg(handler, context) { + return function (arg1, arg2, arg3) { + return handler.call(context, arg1, arg2, arg3); + }; + } + + /** + * Method: initDomHandler + * 为控制类实例初始化 dom 事件处理函数。 + * + * Parameters: + * instance - {} 控制类实例 。 + * + * Returns: + * {function} + */ + function initDomHandler(instance) { + var domHandlerNames = [ + 'resize', 'click', 'dblclick', + 'mousewheel', 'mousemove', 'mouseout', 'mouseup', 'mousedown', + 'touchstart', 'touchend', 'touchmove' + ]; + + var len = domHandlerNames.length; + while (len--) { + var name = domHandlerNames[len]; + instance['_' + name + 'Handler'] = bind1Arg(domHandlers[name], instance); + } + } + + /** + * Method: findHover + * 迭代函数,查找 hover 到的图形元素并即时做些事件分发。 + * + * Parameters: + * shape - {Object} 图形。 + * x - {number} 鼠标 x。 + * y - {number} 鼠标 y。 + * + * Returns: + * {boolean} 是否找到图形。 + * + */ + function findHover(shape, x, y) { + var me = this; + if ( + (me._draggingTarget && me._draggingTarget.id == shape.id) // 迭代到当前拖拽的图形上 + || shape.isSilent() // 打酱油的路过,啥都不响应的shape~ + ) { + return false; + } + + var event = me._event; + if (shape.isCover(x, y)) { + if (shape.hoverable) { + // SMIC-修改 - start + if (shape.isHoverByRefDataID && shape.isHoverByRefDataID === true) { + if (shape.refDataID) { + var fid = shape.refDataID; + //me.painter.clearHover(); + //me.storage.delHover(); + + var hoverGroup = null; + if (shape.refDataHoverGroup) { + hoverGroup = shape.refDataHoverGroup; + } + + //查找同一个用户数据 feature 的所有图形 + var shapeList = me.storage._shapeList; + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + if (si.refDataID && fid === si.refDataID) { + if (hoverGroup) { + if (si.refDataHoverGroup && hoverGroup === si.refDataHoverGroup) { + me.storage.addHover(si); + } + } else { + me.storage.addHover(si); + } + } + } + } + } else { + me.storage.addHover(shape); + } + //初始代码: + // me.storage.addHover(shape); + // SMIC-修改 - end + } + // 查找是否在 clipShape 中 + var p = shape.parent; + while (p) { + if (p.clipShape && !p.clipShape.isCover(me._mouseX, me._mouseY)) { + // 已经被祖先 clip 掉了 + return false; + } + p = p.parent; + } + + if (me._lastHover != shape) { + me._processOutShape(event); + + // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + me._processDragLeave(event); + + me._lastHover = shape; + + // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGENTER事件 + me._processDragEnter(event); + } + + me._processOverShape(event); + + // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGOVER + me._processDragOver(event); + + me._hasfound = 1; + + return true; // 找到则中断迭代查找 + } + + return false; + } + + // 辅助函数 end + } + + /** + * @function LevelRenderer.Handler.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为null。 + */ + destroy() { + this.dispose(); + this._lastX = null; + this._lastY = null; + this._mouseX = null; + this._mouseY = null; + this._findHover = null; + + Eventful.prototype.destroy.apply(this, arguments); + } + + + /** + * @function LevelRenderer.Handler.prototype.on + * @description 自定义事件绑定。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {function} handler - 响应函数。 + * @returns {LevelRenderer.Handler} this。 + */ + on(eventName, handler) { + this.bind(eventName, handler); + return this; + } + + /** + * @function LevelRenderer.Handler.prototype.un + * @description 自定义事件解除绑定。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {function} handler - 响应函数。 + * @returns {LevelRenderer.Handler} this。 + */ + un(eventName, handler) { + this.unbind(eventName, handler); + return this; + } + + /** + * @function LevelRenderer.Handler.prototype.trigger + * @description 事件触发。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {event} eventArgs - dom事件对象。 + */ + trigger(eventName, eventArgs) { + var EVENT = Config.EVENT; + switch (eventName) { + case EVENT.RESIZE: + case EVENT.CLICK: + case EVENT.DBLCLICK: + case EVENT.MOUSEWHEEL: + case EVENT.MOUSEMOVE: + case EVENT.MOUSEDOWN: + case EVENT.MOUSEUP: + case EVENT.MOUSEOUT: + this['_' + eventName + 'Handler'](eventArgs); + break; + } + } + + /** + * @function LevelRenderer.Handler.prototype.dispose + * @description 释放,解绑所有事件。 + */ + dispose() { + var root = this.root; + + if (window.removeEventListener) { + window.removeEventListener('resize', this._resizeHandler); + + if (SUtil_SUtil.Util_env.os.tablet || SUtil_SUtil.Util_env.os.phone) { + // mobile支持 + root.removeEventListener('touchstart', this._touchstartHandler); + root.removeEventListener('touchmove', this._touchmoveHandler); + root.removeEventListener('touchend', this._touchendHandler); + } else { + // mobile的click自己模拟 + root.removeEventListener('click', this._clickHandler); + root.removeEventListener('dblclick', this._dblclickHandler); + root.removeEventListener('mousewheel', this._mousewheelHandler); + root.removeEventListener('mousemove', this._mousemoveHandler); + root.removeEventListener('mousedown', this._mousedownHandler); + root.removeEventListener('mouseup', this._mouseupHandler); + } + root.removeEventListener('DOMMouseScroll', this._mousewheelHandler); + root.removeEventListener('mouseout', this._mouseoutHandler); + } else { + window.detachEvent('onresize', this._resizeHandler); + + root.detachEvent('onclick', this._clickHandler); + root.detachEvent('dblclick', this._dblclickHandler); + root.detachEvent('onmousewheel', this._mousewheelHandler); + root.detachEvent('onmousemove', this._mousemoveHandler); + root.detachEvent('onmouseout', this._mouseoutHandler); + root.detachEvent('onmousedown', this._mousedownHandler); + root.detachEvent('onmouseup', this._mouseupHandler); + } + + this.root = null; + this._domHover = null; + this.storage = null; + this.painter = null; + + this.un(); + } + + + /** + * Method: _processDragStart + * 拖拽开始。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDragStart(event) { + var _lastHover = this._lastHover; + + if (this._isMouseDown + && _lastHover + && _lastHover.draggable + && !this._draggingTarget + && this._mouseDownTarget == _lastHover + ) { + // 拖拽点击生效时长阀门,某些场景需要降低拖拽敏感度 + if (_lastHover.dragEnableTime && + new Date() - this._lastMouseDownMoment < _lastHover.dragEnableTime + ) { + return; + } + + var _draggingTarget = _lastHover; + this._draggingTarget = _draggingTarget; + this._isDragging = 1; + + _draggingTarget.invisible = true; + this.storage.mod(_draggingTarget.id); + + // 分发 Config.EVENT.DRAGSTART事件 + this._dispatchAgency( + _draggingTarget, + Config.EVENT.DRAGSTART, + event + ); + this.painter.refresh(); + } + } + + + /** + * Method: _processDragEnter + * 拖拽进入目标元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDragEnter(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGENTER事件 + this._dispatchAgency( + this._lastHover, + Config.EVENT.DRAGENTER, + event, + this._draggingTarget + ); + } + } + + + /** + * Method: _processDragOver + * 拖拽在目标元素上移动。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDragOver(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGOVER事件 + this._dispatchAgency( + this._lastHover, + Config.EVENT.DRAGOVER, + event, + this._draggingTarget + ); + } + } + + + /** + * Method: _processDragLeave + * 拖拽离开目标元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDragLeave(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + this._dispatchAgency( + this._lastHover, + Config.EVENT.DRAGLEAVE, + event, + this._draggingTarget + ); + } + } + + + /** + * Method: _processDrop + * 拖拽在目标元素上完成。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDrop(event) { + if (this._draggingTarget) { + this._draggingTarget.invisible = false; + this.storage.mod(this._draggingTarget.id); + this.painter.refresh(); + + // 分发SuperMap.LevelRenderer.Config.EVENT.DROP事件 + this._dispatchAgency( + this._lastHover, + Config.EVENT.DROP, + event, + this._draggingTarget + ); + } + } + + + /** + * Method: _processDragEnd + * 拖拽结束。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processDragEnd(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGEND事件 + this._dispatchAgency( + this._draggingTarget, + Config.EVENT.DRAGEND, + event + ); + + this._lastHover = null; + } + + this._isDragging = 0; + this._draggingTarget = null; + } + + + /** + * Method: _processOverShape + * 鼠标在某个图形元素上移动。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processOverShape(event) { + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEOVER事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEOVER, event); + } + + + /** + * Method: _processOutShape + * 鼠标离开某个图形元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _processOutShape(event) { + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEOUT事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEOUT, event); + } + + + /** + * Method: _dispatchAgency + * 鼠标离开某个图形元素。 + * + * Parameters: + * targetShape - {Object} 目标图形元素。 + * eventName - {Object} 事件名称。 + * event - {Object} 事件对象。 + * draggedShape - {Object} 拖拽事件特有,当前被拖拽图形元素。 + * + */ + _dispatchAgency(targetShape, eventName, event, draggedShape) { + var eventHandler = 'on' + eventName; + var eventPacket = { + type: eventName, + event: event, + target: targetShape, + cancelBubble: false + }; + + var el = targetShape; + + if (draggedShape) { + eventPacket.dragged = draggedShape; + } + + while (el) { + el[eventHandler] + && (eventPacket.cancelBubble = el[eventHandler](eventPacket)); + el.dispatch(eventName, eventPacket); + + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (targetShape) { + // 冒泡到顶级 zrender 对象 + if (!eventPacket.cancelBubble) { + this.dispatch(eventName, eventPacket); + } + } else if (!draggedShape) { + // 无hover目标,无拖拽对象,原生事件分发 + this.dispatch(eventName, { + type: eventName, + event: event + }); + } + } + + + /** + * Method: _iterateAndFindHover + * 迭代寻找 hover shape。 + * + */ + _iterateAndFindHover() { + var invTransform = SUtil_SUtil.Util_matrix.create(); + + var list = this.storage.getShapeList(); + var currentZLevel; + var currentLayer; + var tmp = [0, 0]; + for (var i = list.length - 1; i >= 0; i--) { + var shape = list[i]; + + if (currentZLevel !== shape.zlevel) { + currentLayer = this.painter.getLayer(shape.zlevel, currentLayer); + tmp[0] = this._mouseX; + tmp[1] = this._mouseY; + + if (currentLayer.needTransform) { + SUtil_SUtil.Util_matrix.invert(invTransform, currentLayer.transform); + SUtil_SUtil.Util_vector.applyTransform(tmp, tmp, invTransform); + } + } + + if (this._findHover(shape, tmp[0], tmp[1])) { + break; + } + } + } + + + /** + * Method: _mobildFindFixed + * touch 有指尖错觉,四向尝试,让touch上的点击更好触发事件。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + _mobildFindFixed(event) { + // touch指尖错觉的尝试偏移量配置 + var MOBILE_TOUCH_OFFSETS = [ + {x: 10}, + {x: -20}, + {x: 10, y: 10}, + {y: -20} + ]; + + this._lastHover = null; + this._mouseX = event.zrenderX; + this._mouseY = event.zrenderY; + + this._event = event; + + this._iterateAndFindHover(); + + for (var i = 0; !this._lastHover && i < MOBILE_TOUCH_OFFSETS.length; i++) { + var offset = MOBILE_TOUCH_OFFSETS[i]; + offset.x && (this._mouseX += offset.x); + offset.y && (this._mouseX += offset.y); + + this._iterateAndFindHover(); + } + + if (this._lastHover) { + event.zrenderX = this._mouseX; + event.zrenderY = this._mouseY; + } + } + + + /** + * Method: _zrenderEventFixed + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标 。 + * + * Parameters: + * event - {Object} 事件。 + * isTouch - {boolean} 是否触摸。 + * + */ + _zrenderEventFixed(event, isTouch) { + if (event.zrenderFixed) { + return event; + } + + if (!isTouch) { + event = event || window.event; + // 进入对象优先~ + var target = event.toElement + || event.relatedTarget + || event.srcElement + || event.target; + + if (target && target != this._domHover) { + event.zrenderX = (typeof event.offsetX != 'undefined' + ? event.offsetX + : event.layerX) + + target.offsetLeft; + event.zrenderY = (typeof event.offsetY != 'undefined' + ? event.offsetY + : event.layerY) + + target.offsetTop; + } + } else { + var touch = event.type != 'touchend' + ? event.targetTouches[0] + : event.changedTouches[0]; + if (touch) { + var rBounding = this.root.getBoundingClientRect(); + // touch事件坐标是全屏的~ + event.zrenderX = touch.clientX - rBounding.left; + event.zrenderY = touch.clientY - rBounding.top; + } + } + + event.zrenderFixed = 1; + return event; + } + + + // SMIC-方法扩展 - start + + /** + * @function LevelRenderer.Handler.prototype.getLastHoverOne + * @description 获取单个高亮图形 + */ + getLastHoverOne() { + if (this._lastHover) { + return this._lastHover; + } + return null; + } + + // SMIC-方法扩展 - end + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Easing.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @class LevelRenderer.Animation.easing + * @category Visualization Theme + * @classdesc 缓动 + * @private + */ +// 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js +// http://sole.github.io/tween.js/examples/03_graphs.html +class Easing { + constructor() { + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.easing"; + } + + + /** + * @function LevelRenderer.Animation.easing.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + + } + + + /** + * @function LevelRenderer.Animation.easing.Linear + * @description 线性缓动 + * @param {number} k - 参数 + * @return {number} 输入值 + */ + Linear(k) { + return k; + } + + + /** + * @function LevelRenderer.Animation.easing.QuadraticIn + * @description 二次方的缓动(t^2) + * @param {number} k - 参数 + * @return {number} 二次方的缓动的值 + */ + QuadraticIn(k) { + return k * k; + } + + /** + * @function LevelRenderer.Animation.easing.QuadraticOut + * @description 返回按二次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按二次方缓动退出的值 + */ + QuadraticOut(k) { + return k * (2 - k); + } + + /** + * @function LevelRenderer.Animation.easing.QuadraticInOut + * @description 返回按二次方缓动进入和退出的值 + * @param {number} k - 参数 + * @return {number} 按二次方缓动进入和退出的值 + */ + QuadraticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + } + + + /** + * @function LevelRenderer.Animation.easing.CubicIn + * @description 三次方的缓动(t^3) + * @param {number} k - 参数 + * @return {number} 按三次方缓动的值 + */ + CubicIn(k) { + return k * k * k; + } + + /** + * @function LevelRenderer.Animation.easing.CubicOut + * @description 返回按三次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按三次方缓动退出的值 + */ + CubicOut(k) { + return --k * k * k + 1; + } + + /** + * @function LevelRenderer.Animation.easing.CubicInOut + * @description 返回按三次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按三次方缓动进入退出的值 + */ + CubicInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + } + + + /** + * @function LevelRenderer.Animation.easing.QuarticIn + * @description 返回按四次方缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动进入的值 + */ + QuarticIn(k) { + return k * k * k * k; + } + + /** + * @function LevelRenderer.Animation.easing.QuarticOut + * @description 返回按四次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动退出的值 + */ + QuarticOut(k) { + return 1 - (--k * k * k * k); + } + + /** + * @function LevelRenderer.Animation.easing.QuarticInOut + * @description 返回按四次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动进入退出的值 + */ + QuarticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + } + + + // 五次方的缓动(t^5) + /** + * @function LevelRenderer.Animation.easing.QuinticIn + * @description 返回按五次方缓动的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动的值 + */ + QuinticIn(k) { + return k * k * k * k * k; + } + + /** + * @function LevelRenderer.Animation.easing.QuinticOut + * @description 返回按五次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动退出的值 + */ + QuinticOut(k) { + return --k * k * k * k * k + 1; + } + + /** + * @function LevelRenderer.Animation.easing.QuinticInOut + * @description 返回按五次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动进入退出的值 + */ + QuinticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + } + + + // 正弦曲线的缓动(sin(t)) + /** + * @function LevelRenderer.Animation.easing.SinusoidalIn + * @description 返回按正弦曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动进入的值 + */ + SinusoidalIn(k) { + return 1 - Math.cos(k * Math.PI / 2); + } + + /** + * @function LevelRenderer.Animation.easing.SinusoidalOut + * @description 返回按正弦曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动退出的值 + */ + SinusoidalOut(k) { + return Math.sin(k * Math.PI / 2); + } + + /** + * @function LevelRenderer.Animation.easing.SinusoidalInOut + * @description 返回按正弦曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动进入退出的值 + */ + SinusoidalInOut(k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + } + + + // 指数曲线的缓动(2^t) + /** + * @function LevelRenderer.Animation.easing.ExponentialIn + * @description 返回按指数曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动进入的值 + */ + ExponentialIn(k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + } + + /** + * @function LevelRenderer.Animation.easing.ExponentialOut + * @description 返回按指数曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动退出的值 + */ + ExponentialOut(k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + } + + /** + * @function LevelRenderer.Animation.easing.ExponentialInOut + * @description 返回按指数曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动进入退出的值 + */ + ExponentialInOut(k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + } + + + // 圆形曲线的缓动(sqrt(1-t^2)) + /** + * @function LevelRenderer.Animation.easing.CircularIn + * @description 返回按圆形曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动进入的值 + */ + CircularIn(k) { + return 1 - Math.sqrt(1 - k * k); + } + + /** + * @function LevelRenderer.Animation.easing.CircularOut + * @description 返回按圆形曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动退出的值 + */ + CircularOut(k) { + return Math.sqrt(1 - (--k * k)); + } + + /** + * @function LevelRenderer.Animation.easing.CircularInOut + * @description 返回按圆形曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动进入退出的值 + */ + CircularInOut(k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + } + + + // 创建类似于弹簧在停止前来回振荡的动画 + /** + * @function LevelRenderer.Animation.easing.ElasticIn + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动进入的值 + */ + ElasticIn(k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * + Math.sin((k - s) * (2 * Math.PI) / p)); + } + + /** + * @function LevelRenderer.Animation.easing.ElasticOut + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动退出的值 + */ + ElasticOut(k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * + Math.sin((k - s) * (2 * Math.PI) / p) + 1); + } + + /** + * @function LevelRenderer.Animation.easing.ElasticInOut + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动进入退出的值 + */ + ElasticInOut(k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + + } + + + // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + /** + * @function LevelRenderer.Animation.easing.BackIn + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入的值 + */ + BackIn(k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + } + + /** + * @function LevelRenderer.Animation.easing.BackOut + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动退出的值 + */ + BackOut(k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + } + + /** + * @function LevelRenderer.Animation.easing.BackInOut + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入退出的值 + */ + BackInOut(k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + } + + + // 创建弹跳效果 + /** + * @function LevelRenderer.Animation.easing.BounceIn + * @description 返回按弹跳效果的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动进入的值 + */ + BounceIn(k) { + return 1 - this.BounceOut(1 - k); + } + + /** + * @function LevelRenderer.Animation.easing.BounceOut + * @description 返回按弹跳效果的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动退出的值 + */ + BounceOut(k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + } + + /** + * @function LevelRenderer.Animation.easing.BounceInOut + * @description 返回按弹跳效果的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动进入退出的值 + */ + BounceInOut(k) { + if (k < 0.5) { + return this.BounceIn(k * 2) * 0.5; + } + return this.BounceOut(k * 2 - 1) * 0.5 + 0.5; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Clip.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer.Animation.Clip + * @category Visualization Theme + * @classdesc 动画片段 + * @param {Object} options - 参数。 + * @param {Object} options.target - 动画对象,可以是数组,如果是数组的话会批量分发 onframe 等事件。 + * @param {number} [options.life=1000] - 动画时长。 + * @param {number} [options.delay=0] - 动画延迟时间。 + * @param {boolean} [options.loop=true] - 是否循环。 + * @param {number} [options.gap=0] - 循环的间隔时间。 + * @param {Object} options.onframe - 帧。 + * @param {boolean} options.easing - 是否消除。 + * @param {boolean} options.ondestroy - 是否销毁。 + * @param {boolean} options.onrestart - 是否重播。 + * @private + */ +class Clip { + constructor(options) { + this._targetPool = options.target || {}; + if (!(this._targetPool instanceof Array)) { + this._targetPool = [this._targetPool]; + } + + // 生命周期 + this._life = options.life || 1000; + // 延时 + this._delay = options.delay || 0; + // 开始时间 + this._startTime = new Date().getTime() + this._delay;// 单位毫秒 + + // 结束时间 + this._endTime = this._startTime + this._life * 1000; + + // 是否循环 + this.loop = typeof options.loop == 'undefined' + ? false : options.loop; + + this.gap = options.gap || 0; + + this.easing = options.easing || 'Linear'; + + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.Clip"; + } + + /** + * @function LevelRenderer.Animation.Clip.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + + } + + step(time) { + var easing = new Easing(); + var percent = (time - this._startTime) / this._life; + + // 还没开始 + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + + var easingFunc = typeof this.easing == 'string' + ? easing[this.easing] + : this.easing; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + + this.fire('frame', schedule); + + // 结束 + if (percent == 1) { + if (this.loop) { + this.restart(); + // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + return 'restart'; + + } + + // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + this._needsRemove = true; + return 'destroy'; + } + + return null; + } + + restart() { + var time = new Date().getTime(); + var remainder = (time - this._startTime) % this._life; + this._startTime = new Date().getTime() - remainder + this.gap; + } + + fire(eventType, arg) { + for (var i = 0, len = this._targetPool.length; i < len; i++) { + if (this['on' + eventType]) { + this['on' + eventType](this._targetPool[i], arg); + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Animation.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class LevelRenderer.Animation + * @classdesc 动画主类, 调度和管理所有动画控制器 + * @category Visualization Theme + * @extends {LevelRenderer.Eventful} + * @param {Object} options - 动画参数。 + * @param {Object} options.onframe - onframe。 + * @param {Object} options.stage - stage。 + * @example 例如: + * (start code) + * var animation = new LevelRenderer.Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + * (end) + * @private + */ +class Animation extends Eventful { + constructor(options) { + super(options); + + options = options || {}; + /** + * @member {Object} LevelRenderer.Animation.prototype.stage + * @description stage。 + */ + this.stage = {}; + + /** + * @member {Object} LevelRenderer.Animation.prototype.onframe + * @description onframe。 + */ + this.onframe = function () { + }; + + /** + * @member {Array} LevelRenderer.Animation.prototype._clips + * @description _clips。 + */ + this._clips = []; + + /** + * @member {boolean} LevelRenderer.Animation.prototype._running + * @description _running。 + */ + this._running = false; + + /** + * @member {number} LevelRenderer.Animation.prototype._time + * @description _time。 + */ + this._time = 0; + + Util.extend(this, options); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation"; + + } + + + /** + * @function LevelRenderer.Animation.prototype.add + * @description 添加动画片段。 + * @param {LevelRenderer.Animation.Clip} clip - 动画片段。 + */ + add(clip) { + this._clips.push(clip); + } + + + /** + * @function LevelRenderer.Animation.prototype.remove + * @description 删除动画片段。 + * @param {LevelRenderer.Animation.Clip} clip - 动画片段。 + */ + remove(clip) { + var idx = new Util_Util().indexOf(this._clips, clip); + if (idx >= 0) { + this._clips.splice(idx, 1); + } + } + + + /** + * @function LevelRenderer.Animation.prototype.update + * @description 更新动画片段。 + */ + _update() { + var time = new Date().getTime(); + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + + var deferredEvents = []; + var deferredClips = []; + for (let i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time); + // Throw out the events need to be called after + // stage.update, like destroy + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + if (this.stage.update) { + this.stage.update(); + } + + // Remove the finished clip + for (let i = 0; i < len;) { + if (clips[i]._needsRemove) { + clips[i] = clips[len - 1]; + clips.pop(); + len--; + } else { + i++; + } + } + + len = deferredEvents.length; + for (let i = 0; i < len; i++) { + deferredClips[i].fire(deferredEvents[i]); + } + + this._time = time; + + this.onframe(delta); + + this.dispatch('frame', delta); + } + + + /** + * @function LevelRenderer.Animation.prototype.start + * @description 开始运行动画。 + */ + start() { + var requestAnimationFrame = window.requestAnimationFrame + || window.msRequestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + || function (func) { + setTimeout(func, 16); + }; + + var self = this; + + this._running = true; + + function step() { + if (self._running) { + self._update(); + requestAnimationFrame(step); + } + } + + this._time = new Date().getTime(); + requestAnimationFrame(step); + } + + + /** + * @function LevelRenderer.Animation.prototype.stop + * @description 停止运行动画。 + */ + stop() { + this._running = false; + } + + + /** + * @function LevelRenderer.Animation.prototype.clear + * @description 清除所有动画片段。 + */ + clear() { + this._clips = []; + } + + + /** + * @function LevelRenderer.Animation.prototype.animate + * @description 对一个目标创建一个animator对象,可以指定目标中的属性使用动画。 + * @param {Object} target - 目标对象。 + * @param {Object} options - 动画参数选项。 + * @param {boolean} [options.loop=false] - 是否循环播放动画。 + * @param {function} [options.getter] - 如果指定getter函数,会通过getter函数取属性值。 + * @param {function} [options.setter] - 如果指定setter函数,会通过setter函数设置属性值。 + * @returns {LevelRenderer.Animation.Animator} Animator。 + */ + animate(target, options) { + options = options || {}; + var deferred = new Animator( + target, + options.loop, + options.getter, + options.setter + ); + deferred.animation = this; + return deferred; + } + + static _interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + static _interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (let i = 0; i < len; i++) { + out[i] = Animation._interpolateNumber(p0[i], p1[i], percent); + } + } else { + var len2 = p0[0].length; + for (let i = 0; i < len; i++) { + for (let j = 0; j < len2; j++) { + out[i][j] = Animation._interpolateNumber( + p0[i][j], p1[i][j], percent + ); + } + } + } + } + + static _isArrayLike(data) { + switch (typeof data) { + case 'undefined': + case 'string': + return false; + } + + return typeof data.length !== 'undefined'; + } + + static _catmullRomInterpolateArray(p0, p1, p2, p3, t, t2, t3, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (let i = 0; i < len; i++) { + out[i] = Animation._catmullRomInterpolate( + p0[i], p1[i], p2[i], p3[i], t, t2, t3 + ); + } + } else { + var len2 = p0[0].length; + for (let i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = Animation._catmullRomInterpolate( + p0[i][j], p1[i][j], p2[i][j], p3[i][j], + t, t2, t3 + ); + } + } + } + } + + static _catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + static _cloneValue(value) { + var arraySlice = Array.prototype.slice; + + if (Animation._isArrayLike(value)) { + var len = value.length; + if (Animation._isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } else { + return arraySlice.call(value); + } + } else { + return value; + } + } + + static rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + + return 'rgba(' + rgba.join(',') + ')'; + } +} + +/** + * @class LevelRenderer.Animation.Animator + */ +class Animator { + + /** + * @function LevelRenderer.Animation.Animator.prototype.animate + * @description 构造函数 + * @param {Object} target - 目标对象。 + * @param {Object} options - 动画参数选项。 + * @param {boolean} [loop=false] - 是否循环播放动画。 + * @param {function} [getterl] - 如果指定getter函数,会通过getter函数取属性值。 + * @param {function} [setter] - 如果指定setter函数,会通过setter函数设置属性值。 + */ + constructor(target, loop, getter, setter) { + /** + * @member {Object} LevelRenderer.Animation.Animator.prototype._tracks + * @description _tracks。 + */ + this._tracks = {}; + + /** + * @member {Object} LevelRenderer.Animation.Animator.prototype._target + * @description _target。 + */ + this._target = target; + + /** + * @member {boolean} LevelRenderer.Animation.Animator.prototype._loop + * @description _loop。 + */ + this._loop = loop || false; + + /** + * @member {function} LevelRenderer.Animation.Animator.prototype._getter + * @description _getter。 + */ + this._getter = getter || _defaultGetter; + + /** + * @member {function} LevelRenderer.Animation.Animator.prototype._setter + * @description _setter。 + */ + this._setter = setter || _defaultSetter; + + /** + * @member {number} LevelRenderer.Animation.Animator.prototype._clipCount + * @description _clipCount。 + */ + this._clipCount = 0; + + /** + * @member {number} LevelRenderer.Animation.Animator.prototype._delay + * @description _delay。 + */ + this._delay = 0; + + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._doneList + * @description _doneList。 + */ + this._doneList = []; + + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._onframeList + * @description _onframeList。 + */ + this._onframeList = []; + + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._clipList + * @description _clipList。 + */ + this._clipList = []; + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.Animator"; + //Function + function _defaultGetter(target, key) { + return target[key]; + } + + function _defaultSetter(target, key, value) { + target[key] = value; + } + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.when + * @description 设置动画关键帧 + * @param {number} time - 关键帧时间,单位是ms + * @param {Object} props - 关键帧的属性值,key-value表示 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + when(time /* ms */, props) { + for (var propName in props) { + if (!this._tracks[propName]) { + this._tracks[propName] = []; + // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + if (time !== 0) { + this._tracks[propName].push({ + time: 0, + value: Animation._cloneValue( + this._getter(this._target, propName) + ) + }); + } + } + this._tracks[propName].push({ + time: parseInt(time, 10), + value: props[propName] + }); + } + return this; + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.during + * @description 添加动画每一帧的回调函数 + * @param {RequestCallback} callback - 回调函数 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + during(callback) { + this._onframeList.push(callback); + return this; + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.start + * @description 开始执行动画 + * @param {(string|function)} easing - 动画缓动函数。详见:<{@link LevelRenderer.Animation.easing}>。 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + start(easing) { + var self = this; + var setter = this._setter; + var getter = this._getter; + var onFrameListLen = self._onframeList.length; + var useSpline = easing === 'spline'; + + var ondestroy = function () { + self._clipCount--; + if (self._clipCount === 0) { + // Clear all tracks + self._tracks = {}; + + var len = self._doneList.length; + for (var i = 0; i < len; i++) { + self._doneList[i].call(self); + } + } + }; + + var createTrackClip = function (keyframes, propName) { + var trackLen = keyframes.length; + if (!trackLen) { + return; + } + // Guess data type + var firstVal = keyframes[0].value; + var isValueArray = Animation._isArrayLike(firstVal); + var isValueColor = false; + + // For vertices morphing + var arrDim = ( + isValueArray + && Animation._isArrayLike(firstVal[0]) + ) + ? 2 : 1; + // Sort keyframe as ascending + keyframes.sort(function (a, b) { + return a.time - b.time; + }); + var trackMaxTime = keyframes[trackLen - 1].time; + // Percents of each keyframe + var kfPercents = []; + // Value of each keyframe + var kfValues = []; + for (let i = 0; i < trackLen; i++) { + kfPercents.push(keyframes[i].time / trackMaxTime); + // Assume value is a color when it is a string + var value = keyframes[i].value; + if (typeof(value) == 'string') { + value = SUtil_SUtil.Util_color.toArray(value); + if (value.length === 0) { // Invalid color + value[0] = value[1] = value[2] = 0; + value[3] = 1; + } + isValueColor = true; + } + kfValues.push(value); + } + + // Cache the key of last frame to speed up when + // animation playback is sequency + var cacheKey = 0; + var cachePercent = 0; + var start; + var i; + var w; + var p0; + var p1; + var p2; + var p3; + + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function (target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + if (percent < cachePercent) { + // Start from next key + start = Math.min(cacheKey + 1, trackLen - 1); + for (i = start; i >= 0; i--) { + if (kfPercents[i] <= percent) { + break; + } + } + i = Math.min(i, trackLen - 2); + } else { + for (i = cacheKey; i < trackLen; i++) { + if (kfPercents[i] > percent) { + break; + } + } + i = Math.min(i - 1, trackLen - 2); + } + cacheKey = i; + cachePercent = percent; + + var range = (kfPercents[i + 1] - kfPercents[i]); + if (range === 0) { + return; + } else { + w = (percent - kfPercents[i]) / range; + } + if (useSpline) { + p1 = kfValues[i]; + p0 = kfValues[i === 0 ? i : i - 1]; + p2 = kfValues[i > trackLen - 2 ? trackLen - 1 : i + 1]; + p3 = kfValues[i > trackLen - 3 ? trackLen - 1 : i + 2]; + if (isValueArray) { + Animation._catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + getter(target, propName), + arrDim + ); + } else { + let value; + if (isValueColor) { + // value = LevelRenderer.Animation._catmullRomInterpolateArray( + // p0, p1, p2, p3, w, w * w, w * w * w, + // rgba, 1 + // ); + value = Animation.rgba2String(rgba); + } else { + value = Animation._catmullRomInterpolate( + p0, p1, p2, p3, w, w * w, w * w * w + ); + } + setter( + target, + propName, + value + ); + } + } else { + if (isValueArray) { + Animation._interpolateArray( + kfValues[i], kfValues[i + 1], w, + getter(target, propName), + arrDim + ); + } else { + let value; + if (isValueColor) { + Animation._interpolateArray( + kfValues[i], kfValues[i + 1], w, + rgba, 1 + ); + value = Animation.rgba2String(rgba); + } else { + value = Animation._interpolateNumber(kfValues[i], kfValues[i + 1], w); + } + setter( + target, + propName, + value + ); + } + } + + for (i = 0; i < onFrameListLen; i++) { + self._onframeList[i](target, percent); + } + }; + + var clip = new Clip({ + target: self._target, + life: trackMaxTime, + loop: self._loop, + delay: self._delay, + onframe: onframe, + ondestroy: ondestroy + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + self._clipList.push(clip); + self._clipCount++; + self.animation.add(clip); + }; + + for (var propName in this._tracks) { + createTrackClip(this._tracks[propName], propName); + } + return this; + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.stop + * @description 停止动画 + */ + stop() { + for (var i = 0; i < this._clipList.length; i++) { + var clip = this._clipList[i]; + this.animation.remove(clip); + } + this._clipList = []; + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.delay + * @description 设置动画延迟开始的时间 + * @param {number} time - 时间,单位ms + * @returns {LevelRenderer.Animation.Animator} Animator + */ + delay(time) { + this._delay = time; + return this; + } + + + /** + * @function LevelRenderer.Animation.Animator.prototype.done + * @description 添加动画结束的回调 + * @param {function} cb - Function + * @returns {LevelRenderer.Animation.Animator} Animator + */ + done(cb) { + if (cb) { + this._doneList.push(cb); + } + return this; + } + +} + + + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Render.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + /** + * @private + * @class LevelRenderer.Render + * @category Visualization Theme + * @classdesc Render 接口类,对外可用的所有接口都在这里。内部使用非 get 接口统一返回 this 对象,支持链式调用。 + * @param {string} id - 唯一标识。 + * @param {HTMLElement} dom - Dom 对象。 + */ + +class Render { + constructor(id, dom) { + /** + * @member {string} LevelRenderer.Render.prototype.id + * @description 唯一标识。 + */ + this.id = id; + + /** + * @member {LevelRenderer.Storage} LevelRenderer.Render.prototype.storage + * @description 图形仓库对象。 + */ + this.storage = new Storage(); + + /** + * @member {LevelRenderer.Painter} LevelRenderer.Render.prototype.painter + * @description 绘制器对象。 + * + */ + this.painter = new Painter(dom, this.storage); + + /** + * @member {LevelRenderer.Handler} LevelRenderer.Render.prototype.handler + * @description 事件处理对象。 + * + */ + this.handler = new Handler(dom, this.storage, this.painter); + + /** + * @member {Array} LevelRenderer.Render.prototype.animatingElements + * @description 动画控制数组。 + * + */ + this.animatingElements = []; + + /** + * @member {LevelRenderer.animation.Animation} LevelRenderer.Render.prototype.animation + * @description 动画对象。 + * + */ + this.animation = new Animation({ + stage: { + update: Render.getFrameCallback(this) + } + }); + + /** + * @member {boolean} LevelRenderer.Render.prototype._needsRefreshNextFrame + * @description 是否需要刷新下一帧。 + * + */ + this._needsRefreshNextFrame = false; + this.animation.start(); + this.CLASS_NAME = "SuperMap.LevelRenderer.Render"; + + } + + /** + * @function LevelRenderer.Render.prototype.destory + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.id = null; + this.storage = null; + this.painter = null; + this.handler = null; + this.animatingElements = null; + this.animation = null; + this._needsRefreshNextFrame = null; + } + + /** + * @function LevelRenderer.Render.prototype.getId + * @description 获取实例唯一标识。 + * @return {string} 实例唯一标识。 + */ + getId() { + return this.id; + } + + /** + * @function LevelRenderer.Render.prototype.addShape + * @description 添加图形形状到根节点。 + * + * @param {LevelRenderer.Shape} shape - 图形对象,可用属性全集,详见各 shape。 + * @return {LevelRenderer.Render} this。 + */ + addShape(shape) { + this.storage.addRoot(shape); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.addGroup + * @description 添加组到根节点。 + * + * (code) + * //添加组到根节点例子 + * var render = new LevelRenderer.Render("Render",document.getElementById('lRendertest')); + * render.clear(); + * var g = new LevelRenderer.Group(); + * g.addChild(new LevelRenderer.Shape.Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * brushType: 'fill' + * } + * })); + * render.addGroup(g); + * render.render(); + * (end) + * + * @param {LevelRenderer.Group} group - 组对象。 + * @return {LevelRenderer.Render} this。 + */ + addGroup(group) { + this.storage.addRoot(group); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.delShape + * @description 从根节点删除图形形状。 + * + * @param {string} shapeId - 图形对象唯一标识。 + * @return {LevelRenderer.Render} this。 + */ + delShape(shapeId) { + this.storage.delRoot(shapeId); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.delGroup + * @description 从根节点删除组。 + * + * @param {string} groupId - 组对象唯一标识。 + * @return {LevelRenderer.Render} this。 + */ + delGroup(groupId) { + this.storage.delRoot(groupId); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.modShape + * @description 修改图形形状。 + * + * @param {string} shapeId - 图形对象唯一标识。 + * @param {LevelRenderer.Shape} shape - 图形对象。 + * @return {LevelRenderer.Render} this。 + */ + modShape(shapeId, shape) { + this.storage.mod(shapeId, shape); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.modGroup + * @description 修改组。 + * + * @param {string} groupId - 组对象唯一标识。 + * @param {LevelRenderer.Group} group - 组对象。 + * @return {LevelRenderer.Render} this。 + */ + modGroup(groupId, group) { + this.storage.mod(groupId, group); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.modLayer + * @description 修改指定 zlevel 的绘制配置项。 + * + * @param {string} zLevel - 组对象唯一标识。 + * @param {Object} config - 配置对象。 + * @param {string} clearColor - 每次清空画布的颜色。默认值:0。 + * @param {noolean} motionBlur - 是否开启动态模糊。默认值:false。 + * @param {number} lastFrameAlpha - 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显。默认值:0.7。 + * @param {Array.} position - 层的平移。 + * @param {Array.} rotation - 层的旋转。 + * @param {Array.} scale - 层的缩放。 + * @param {boolean} zoomable - 层是否支持鼠标缩放操作。默认值:false。 + * @param {boolean} panable - 层是否支持鼠标平移操作。默认值:false。 + * @return {LevelRenderer.Render} this。 + */ + modLayer(zLevel, config) { + this.painter.modLayer(zLevel, config); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.addHoverShape + * @description 添加额外高亮层显示,仅提供添加方法,每次刷新后高亮层图形均被清空。 + * + * @param {LevelRenderer.Shape} shape - 图形对象。 + * @return {LevelRenderer.Render} this。 + */ + addHoverShape(shape) { + this.storage.addHover(shape); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.render + * @description 渲染。 + * + * @callback {function} callback - 渲染结束后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + render(callback) { + this.painter.render(callback); + this._needsRefreshNextFrame = false; + return this; + } + + /** + * @function LevelRenderer.Render.prototype.refresh + * @description 视图更新。 + * + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + refresh(callback) { + this.painter.refresh(callback); + this._needsRefreshNextFrame = false; + return this; + } + + /** + * @function LevelRenderer.Render.prototype.refreshNextFrame + * @description 标记视图在浏览器下一帧需要绘制。 + * @return {LevelRenderer.Render} this。 + */ + refreshNextFrame() { + this._needsRefreshNextFrame = true; + return this; + } + + /** + * @function LevelRenderer.Render.prototype.refreshHover + * @description 绘制(视图更新)高亮层。 + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + refreshHover(callback) { + this.painter.refreshHover(callback); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.refreshShapes + * @description 视图更新。 + * + * @param {Array.} shapeList - 需要更新的图形列表。 + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + refreshShapes(shapeList, callback) { + this.painter.refreshShapes(shapeList, callback); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.resize + * @description 调整视图大小。 + * @return {LevelRenderer.Render} this。 + */ + resize() { + this.painter.resize(); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.animate + * @description 动画。 + * + * @example + * zr.animate(circle.id, 'style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + * + * + * @param {Array.<(LevelRenderer.Shape/LevelRenderer.Group)>} el - 动画对象。 + * @param {string} path - 需要添加动画的属性获取路径,可以通过 a.b.c 来获取深层的属性。若传入对象为,path需为空字符串。 + * @param {function} loop - 动画是否循环。 + * @return {LevelRenderer.animation.Animator} Animator。 + */ + animate(el, path, loop) { + if (typeof(el) === 'string') { + el = this.storage.get(el); + } + if (el) { + var target; + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + prop = prop[pathSplitted[i]]; + } + if (prop) { + target = prop; + } + } else { + target = el; + } + + if (!target) { + SUtil_SUtil.Util_log( + 'Property "' + + path + + '" is not existed in element ' + + el.id + ); + return; + } + + var animatingElements = this.animatingElements; + if (typeof el.__aniCount === 'undefined') { + // 正在进行的动画记数 + el.__aniCount = 0; + } + if (el.__aniCount === 0) { + animatingElements.push(el); + } + el.__aniCount++; + + return this.animation.animate(target, {loop: loop}) + .done(function () { + el.__aniCount--; + if (el.__aniCount === 0) { + // 从animatingElements里移除 + var idx = new Util_Util().indexOf(animatingElements, el); + animatingElements.splice(idx, 1); + } + }); + } else { + SUtil_SUtil.Util_log('Element not existed'); + } + } + + /** + * @function LevelRenderer.Render.prototype.clearAnimation + * @description 停止所有动画。 + * + */ + clearAnimation() { + this.animation.clear(); + } + + /** + * @function LevelRenderer.Render.prototype.getWidth + * @description 获取视图宽度。 + * @return {number} 视图宽度。 + */ + getWidth() { + return this.painter.getWidth(); + } + + /** + * @function LevelRenderer.Render.prototype.getHeight + * @description 获取视图高度。 + * @return {number} 视图高度。 + */ + getHeight() { + return this.painter.getHeight(); + } + + /** + * @function LevelRenderer.Render.prototype.toDataURL + * @description 图像导出。 + * + * @param {string} type - 类型。 + * @param {string} backgroundColor - 背景色,默认值:"#FFFFFF"。 + * @param {string} args - 参数。 + * @return {string} 图片的 Base64 url。 + */ + toDataURL(type, backgroundColor, args) { + return this.painter.toDataURL(type, backgroundColor, args); + } + + /** + * @function LevelRenderer.Render.prototype.shapeToImage + * @description 将常规 shape 转成 image shape。 + * + * @param {LevelRenderer.Shape} e - 图形。 + * @param {number} width - 宽度。 + * @param {number} height - 高度。 + * @return {Object} image shape。 + */ + shapeToImage(e, width, height) { + var id = Util.createUniqueID("SuperMap.LevelRenderer.ToImage_"); + return this.painter.shapeToImage(id, e, width, height); + } + + /** + * @function LevelRenderer.Render.prototype.on + * @description 事件绑定。 + * + * @param {string} eventName - 事件名称。 + * @param {function} eventHandler - 响应函数。 + * @return {LevelRenderer.Render} this。 + */ + on(eventName, eventHandler) { + this.handler.on(eventName, eventHandler); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.un + * @description 事件解绑定,参数为空则解绑所有自定义事件。 + * + * @param {string} eventName - 事件名称。 + * @param {function} eventHandler - 响应函数。 + * @return {LevelRenderer.Render} this。 + */ + un(eventName, eventHandler) { + this.handler.un(eventName, eventHandler); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.trigger + * @description 事件触发。 + * + * @param {string} eventName - 事件名称,resize,hover,drag,etc。 + * @param {event} event - event dom事件对象。 + * @return {LevelRenderer.Render} this。 + */ + trigger(eventName, event) { + this.handler.trigger(eventName, event); + this.handler.dispatch(eventName, event); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.clear + * @description 清除当前 Render 下所有类图的数据和显示,clear 后 MVC 和已绑定事件均还存在在,Render 可用。 + * @return {LevelRenderer.Render} this。 + */ + clear() { + this.storage.delRoot(); + this.painter.clear(); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.dispose + * @description 释放当前 Render 实例(删除包括 dom,数据、显示和事件绑定),dispose后 Render 不可用。 + */ + dispose() { + this.animation.stop(); + + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + + this.animation = null; + this.animatingElements = null; + this.storage = null; + this.painter = null; + this.handler = null; + + // 释放后告诉全局删除对自己的索引,没想到啥好方法 + // zrender.delInstance(this.id); + + } + + // SMIC-方法扩展 - start + /** + * @function LevelRenderer.Render.prototype.updateHoverShapes + * @description 更新设置显示高亮图层。 + * + * @param {Array.} shapes - 图形数组。 + * @return {LevelRenderer.Render} this。 + */ + updateHoverShapes(shapes) { + this.painter.updateHoverLayer(shapes); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.getAllShapes + * @description 获取所有图形。 + * @return {Array.} 图形数组。 + */ + getAllShapes() { + return this.storage._shapeList; + } + + /** + * @function LevelRenderer.Render.prototype.clearAll + * @description 清除高亮和图形图层。 + * @return {LevelRenderer.Render} this。 + */ + clearAll() { + this.clear(); + this.painter.clearHover(); + return this; + } + + /** + * @function LevelRenderer.Render.prototype.getHoverOne + * @description 获取单个高亮图形,当前鼠标对应。 + * @return {LevelRenderer.Shape} 高亮图形。 + */ + getHoverOne() { + return this.handler.getLastHoverOne(); + } + + static getFrameCallback(renderInstance) { + return function () { + var animatingElements = renderInstance.animatingElements; + + //animatingElements instanceof Array 临时解决 destory 报错 + if (animatingElements instanceof Array) { + for (var i = 0, l = animatingElements.length; i < l; i++) { + renderInstance.storage.mod(animatingElements[i].id); + } + + if (animatingElements.length || renderInstance._needsRefreshNextFrame) { + renderInstance.refresh(); + } + } + }; + } + + // SMIC-方法扩展 - end + + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/LevelRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LevelRenderer + * @deprecatedclass SuperMap.LevelRenderer + * @category Visualization Theme + * @classdesc LevelRenderer 渲染器 + * @example + * //在渲染器上加上图形 + * var levelRenderer = new LevelRenderer(); + * var zr = levelRenderer.init(document.getElementById('lRendertest')); + * zr.clear(); + * zr.addShape(new LevelRenderer.Shape.Circle({ + * style:{ + * x : 100, + * y : 100, + * r : 50, + * brushType: 'fill' + * } + * })); + * zr.render(); + * @private + */ +class LevelRenderer { + constructor() { + /** + * @member {Object} LevelRenderer.prototype._instances + * @description LevelRenderer 实例 map 索引 + */ + LevelRenderer._instances = {}; + + // 工具 + LevelRenderer.Tool = {}; + + /** + * @member {string} LevelRenderer.prototype.version + * @description 版本。zRender(Baidu)的版本号 + * 记录当前 LevelRenderer 是在 zRender 的那个版本上构建而来。 + * 在每次完整评判和实施由 zRender(Baidu)升级带来的 LevelRenderer 升级后修改。 + */ + this.version = '2.0.4'; + + this.CLASS_NAME = "SuperMap.LevelRenderer"; + + } + + /** + * @function LevelRenderer.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为null。 + */ + destroy() { + this.dispose(); + this.version = null; + } + + /** + * @function LevelRenderer.prototype.init + * @description 创建 LevelRenderer 实例。 + * @param {HTMLElement} dom - 绘图容器。 + * @returns {LevelRenderer} LevelRenderer 实例。 + */ + init(dom) { + var zr = new Render(Util.createUniqueID("LRenderer_"), dom); + LevelRenderer._instances[zr.id] = zr; + return zr; + } + + /** + * @function LevelRenderer.prototype.dispose + * @description LevelRenderer 实例销毁。 + * 可以通过 zrender.dispose(zr) 销毁指定 LevelRenderer.Render 实例。 + * 也可以通过 zr.dispose() 直接销毁 + * @param {LevelRenderer.Render} zr - ZRender对象,不传此参数则销毁全部。 + * @returns {LevelRenderer} this。 + */ + dispose(zr) { + if (zr) { + zr.dispose(); + this.delInstance(zr.id); + } else { + for (var key in LevelRenderer._instances) { + LevelRenderer._instances[key].dispose(); + } + LevelRenderer._instances = {}; + } + + return this; + } + + /** + * @function LevelRenderer.prototype.getInstance + * @description 获取 LevelRenderer.Render 实例。 + * @param {string} id - ZRender对象索引。 + * @returns {LevelRenderer.Render} LevelRenderer.Render 实例。 + */ + getInstance(id) { + return LevelRenderer._instances[id]; + } + + /** + * @function LevelRenderer.prototype.delInstance + * @description 删除 zrender 实例,LevelRenderer.Render 实例 dispose 时会调用,删除后 getInstance 则返回 undefined + * @param {string} id - ZRender对象索引。 + * @param {string} id - LevelRenderer.Render 对象索引。 + * @returns {LevelRenderer} this。 + */ + delInstance(id) { + delete LevelRenderer._instances[id]; + return this; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicEllipse.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicEllipse + * @category Visualization Theme + * @classdesc 椭圆。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicEllipse({ + * style: { + * x: 100, + * y: 100, + * a: 40, + * b: 20, + * brushType: 'both', + * color: 'blue', + * strokeColor: 'red', + * lineWidth: 3, + * text: 'SmicEllipse' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicEllipse extends (/* unused pure expression or super */ null && (Shape)) { + constructor(options) { + super(options); + + /** + * @member {string} LevelRenderer.Shape.SmicEllipse.prototype.type + * @description 图形类型。 + */ + this.type = 'smicellipse'; + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicEllipse"; + } + + + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.buildPath + * @description 构建椭圆的 Path。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var k = 0.5522848; + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var a = style.a; + var b = style.b; + var ox = a * k; // 水平控制点偏移量 + var oy = b * k; // 垂直控制点偏移量 + // 从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线 + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + } + + + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.getRect + * @description 计算返回椭圆包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - style.a - lineWidth / 2), + y: Math.round((style.x + __OP[1]) - style.b - lineWidth / 2), + width: style.a * 2 + lineWidth, + height: style.b * 2 + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicIsogon.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicIsogon + * @category Visualization Theme + * @classdesc 正多边形。 + * @extends LevelRenderer.Shape + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class SmicIsogon extends (/* unused pure expression or super */ null && (Shape)) { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicIsogon.prototype.type + * @description 图形类型。 + */ + this.type = 'smicisogon'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicIsogon"; + } + + + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.buildPath + * @description 创建n角星(n>=3)路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var sin = SUtil.Util_math.sin; + var cos = SUtil.Util_math.cos; + var PI = Math.PI; + + var n = style.n; + if (!n || n < 2) { + return; + } + + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var r = style.r; + + var dStep = 2 * PI / n; + var deg = -PI / 2; + var xStart = x + r * cos(deg); + var yStart = y + r * sin(deg); + deg += dStep; + + // 记录边界点,用于判断insight + var pointList = style.pointList = []; + pointList.push([xStart, yStart]); + for (let i = 0, end = n - 1; i < end; i++) { + pointList.push([x + r * cos(deg), y + r * sin(deg)]); + deg += dStep; + } + pointList.push([xStart, yStart]); + + // 绘制 + ctx.moveTo(pointList[0][0], pointList[0][1]); + for (let i = 0; i < pointList.length; i++) { + ctx.lineTo(pointList[i][0], pointList[i][1]); + } + ctx.closePath(); + + return; + } + + + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.getRect + * @description 计算返回正多边形的包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - style.r - lineWidth / 2), + y: Math.round((style.y + __OP[1]) - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicRing.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicRing + * @category Visualization Theme + * @classdesc 圆环。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicRing({ + * style: { + * x: 100, + * y: 100, + * r0: 30, + * r: 50 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ +class SmicRing extends (/* unused pure expression or super */ null && (Shape)) { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicRing.prototype.type + * @description 图形类型。 + */ + this.type = 'smicring'; + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicRing"; + + } + + + /** + * @function LevelRenderer.Shape.SmicRing.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + + /** + * @function LevelRenderer.Shape.SmicRing.prototype.buildPath + * @description 创建圆环路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + // 非零环绕填充优化 + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r, 0, Math.PI * 2, false); + ctx.moveTo((style.x + __OP[0]) + style.r0, style.y + __OP[1]); + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r0, 0, Math.PI * 2, true); + return; + } + + + /** + * @function LevelRenderer.Shape.SmicRing.prototype.getRect + * @description 计算返回圆环包围盒矩阵 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - style.r - lineWidth / 2), + y: Math.round((style.y + __OP[1]) - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicStar.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicStar + * @category Visualization Theme + * @classdesc n 角星(n>3)。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicStar({ + * style: { + * x: 200, + * y: 100, + * r: 150, + * n: 5, + * text: '五角星' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ +class SmicStar extends (/* unused pure expression or super */ null && (Shape)) { + constructor(options) { + super(options); + /** + * @member {string} LevelRenderer.Shape.SmicStar.prototype.type + * @description 图形类型。 + */ + this.type = 'smicstar'; + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicStar"; + } + + /** + * @function LevelRenderer.Shape.SmicStar.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + destroy() { + this.type = null; + super.destroy(); + } + + /** + * @function LevelRenderer.Shape.SmicStar.prototype.buildPath + * @description 创建n 角星(n>3)路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var n = style.n; + if (!n || n < 2) { + return; + } + + var sin = SUtil.Util_math.sin; + var cos = SUtil.Util_math.cos; + var PI = Math.PI; + + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var r = style.r; + var r0 = style.r0; + + // 如果未指定内部顶点外接圆半径,则自动计算 + if (r0 == null) { + r0 = n > 4 + // 相隔的外部顶点的连线的交点, + // 被取为内部交点,以此计算r0 + ? r * cos(2 * PI / n) / cos(PI / n) + // 二三四角星的特殊处理 + : r / 3; + } + + var dStep = PI / n; + var deg = -PI / 2; + var xStart = x + r * cos(deg); + var yStart = y + r * sin(deg); + deg += dStep; + + // 记录边界点,用于判断inside + var pointList = style.pointList = []; + pointList.push([xStart, yStart]); + for (var i = 0, end = n * 2 - 1, ri; i < end; i++) { + ri = i % 2 === 0 ? r0 : r; + pointList.push([x + ri * cos(deg), y + ri * sin(deg)]); + deg += dStep; + } + pointList.push([xStart, yStart]); + + // 绘制 + ctx.moveTo(pointList[0][0], pointList[0][1]); + for (let i = 0; i < pointList.length; i++) { + ctx.lineTo(pointList[i][0], pointList[i][1]); + } + + ctx.closePath(); + + return; + } + + /** + * @function LevelRenderer.Shape.SmicStar.prototype.getRect + * @description 返回 n 角星包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + var __OP = this.refOriginalPosition; + + var lineWidth; + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + style.__rect = { + x: Math.round((style.x + __OP[0]) - style.r - lineWidth / 2), + y: Math.round((style.y + __OP[1]) - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + + return style.__rect; + } + +} + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/overlay/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/components/CommonTypes.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @description 该文件用于存储一些公用常量 + * @private + */ +const FileTypes = { + EXCEL: "EXCEL", + CSV: "CSV", + ISERVER: "ISERVER", + GEOJSON: "GEOJSON", + JSON: 'JSON' +}; +const FileConfig = { + fileMaxSize: 10 * 1024 * 1024 +}; + +;// CONCATENATED MODULE: ./src/common/components/openfile/FileModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FileModel + * @deprecatedclass SuperMap.FileModel + * @description 文件数据组件数据模型,用于存储一些文件数据或状态,todo 结构待完善 + * @category Components OpenFile + * @private + */ +class FileModel { + constructor(options) { + this.FileTypes = FileTypes; + this.FileConfig = FileConfig; + this.loadFileObject = options && options.loadFileObject ? options.loadFileObject : []; + } + + /** + * @function FileModel.prototype.set + * @description 设置属性值 + * @param {string} key - 属性名称 + * @param {string|Object} value - 属性值 + */ + set(key, value) { + this[key] = value; + } + + /** + * @function FileModel.prototype.get + * @description 获取数据值 + * @param {string} key - 属性名称 + * @returns {string|Object} value - 返回属性值 + */ + get(key) { + return this[key]; + } + +} + +;// CONCATENATED MODULE: ./src/common/components/messagebox/MessageBox.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class MessageBox + * @aliasclass Components.MessageBox + * @deprecatedclass SuperMap.Components.MessageBox + * @version 9.1.1 + * @classdesc 组件信息提示框。 + * @category Components Common + * @usage + */ +class MessageBox { + + constructor() { + this._initView(); + } + + _initView() { + //原生js形式 + const messageBoxContainer = document.createElement("div"); + messageBoxContainer.hidden = true; + messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-orange"); + + //图标 + const iconContainer = document.createElement("div"); + iconContainer.setAttribute("class", "icon"); + this.icon = document.createElement("span"); + this.icon.setAttribute("class", "supermapol-icons-message-warning"); + iconContainer.appendChild(this.icon); + messageBoxContainer.appendChild(iconContainer); + + //内容: + const messageBox = document.createElement("div"); + messageBox.setAttribute("class", "component-messagebox"); + messageBox.innerHTML = ""; + messageBoxContainer.appendChild(messageBox); + this.messageBox = messageBox; + + //关闭按钮 + const cancelContainer = document.createElement("div"); + cancelContainer.setAttribute("class", "component-messagebox__cancelbtncontainer"); + const cancelBtn = document.createElement("button"); + cancelBtn.setAttribute("class", "component-messagebox__cancelBtn"); + cancelBtn.innerHTML = "x"; + cancelBtn.onclick = this.closeView.bind(this); + cancelContainer.appendChild(cancelBtn); + messageBoxContainer.appendChild(cancelContainer); + + this.messageBoxContainer = messageBoxContainer; + document.body.appendChild(this.messageBoxContainer); + } + + /** + * @function MessageBox.prototype.closeView + * @description 关闭提示框。 + */ + closeView() { + this.messageBoxContainer.hidden = true; + } + + /** + * @function MessageBox.prototype.showView + * @description 显示提示框。 + * @param {string} message - 提示框显示内容。 + * @param {string}[type="warring"] 提示框类型,如 "warring", "failure", "success"。 + */ + showView(message, type = 'warring') { + //设置提示框的样式: + if (type === "success") { + this.icon.setAttribute("class", "supermapol-icons-message-success"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-green"); + + } else if (type === "failure") { + this.icon.setAttribute("class", "supermapol-icons-message-failure"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-red"); + } else if (type === "warring") { + this.icon.setAttribute("class", "supermapol-icons-message-warning"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-orange"); + } + this.messageBox.innerHTML = message; + this.messageBoxContainer.hidden = false; + } +} + +;// CONCATENATED MODULE: external "function(){try{return echarts}catch(e){return {}}}()" +const external_function_try_return_echarts_catch_e_return_namespaceObject = function(){try{return echarts}catch(e){return {}}}(); +var external_function_try_return_echarts_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_echarts_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/lang/locales/en-US.js + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * Namespace: SuperMap.Lang["en"] + * Dictionary for English. Keys for entries are used in calls to + * . Entry bodies are normal strings or + * strings formatted for use with calls. + */ +let en = { + 'title_dataFlowService': 'Data Flow Service', + 'title_distributedAnalysis': 'Distributed Analysis', + 'title_clientComputing': 'Client Computing', + 'title_dataServiceQuery': 'Data Service Query', + 'title_searchCity':'Search city', + 'title_searchLayer':' Search layer', + + 'text_input_value_inputDataFlowUrl': 'Please enter the data stream service address such as: ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe', + 'text_displayFeaturesInfo': 'Display feature information', + 'text_subscribe': 'subscribe', + 'text_cancelSubscribe': 'unsubscribe', + + 'text_densityAnalysis': 'Density Analysis', + 'text_CalculateTheValuePerUnitArea': 'Calculate the value per unit area within the neighborhood shape', + 'text_option_selectDataset':'Please select a dataset', + 'text_label_dataset': 'Dataset', + 'text_option_simplePointDensityAnalysis': 'Simple point density analysis', + 'text_option_nuclearDensityAnalysis': 'Nuclear density analysis', + 'text_label_analyticalMethod': 'Analytical method', + 'text_option_quadrilateral': 'Quadrilateral', + 'text_option_hexagon': 'hexagon', + 'text_label_meshType': 'Mesh type', + 'text_option_notSet': 'Not set', + 'text_label_weightField': 'Weight field', + 'text_label_gridSizeInMeters': 'Grid size', + 'text_label_searchRadius': 'Search radius', + 'text_label_queryRange': 'Scope of analysis', + 'text_label_areaUnit': 'Area unit', + 'text_option_equidistantSegmentation': 'Equidistant segmentation', + 'text_option_logarithm': 'Logarithm', + 'text_option_equalCountingSegment': 'Equal counting segment', + 'text_option_squareRootSegmentation': 'Square root segmentation', + 'text_label_thematicMapSegmentationMode': 'Thematic map segmentation mode', + 'text_label_thematicMapSegmentationParameters': 'Thematic map segmentation parameters', + 'text_option_greenOrangePurpleGradient': 'Green orange purple gradient', + 'text_option_greenOrangeRedGradient': 'Green orange red gradient', + 'text_option_rainbowGradient': 'Rainbow gradient', + 'text_option_spectralGradient': 'Spectral gradient', + 'text_option_terrainGradient': 'Terrain gradient', + 'text_label_thematicMapColorGradientMode': 'Thematic map color gradient mode', + 'text_label_resultLayerName': 'Result layer name', + 'text_chooseFile': 'Open File', + 'text_isoline': 'Isoline', + 'text_extractDiscreteValue': 'Extract discrete value generation curve', + 'text_buffer': 'Buffer', + 'text_specifyTheDistance': 'Specify the distance to create the surrounding area', + 'text_label_analysisLayer': 'Analysis layer', + 'text_label_extractField': 'Extract field', + 'text_label_extractedValue': 'Extracted value', + 'text_label_distanceAttenuation': 'Distance attenuation', + 'text_label_gridSize': 'gridSize', + 'text_label_bufferRadius': 'Buffer radius', + 'text_label_defaultkilometers': 'Default 10 kilometers', + 'text_label_kilometer': 'kilometer', + 'text_label_unit': 'unit', + 'text_retainOriginal': 'Retain original object field', + 'text_mergeBuffer': 'Merge buffer', + 'text_label_color': 'Color', + 'text_label_buffer': '[Buffer]', + 'text_label_isolines': '[Isolines]', + 'text_label_queryRangeTips': 'The default is the full range of input data. Example: -74.050, 40.650, -73.850, 40.850', + 'text_label_queryModel': 'Query mode', + 'text_label_IDArrayOfFeatures': 'ID array of features', + 'text_label_maxFeatures': 'The maximum number of features that can be returned', + 'text_label_bufferDistance': 'Buffer distance', + 'text_label_queryRange1': 'Query range', + 'text_label_spatialQueryMode': 'Spatial query mode', + 'text_label_featureFilter': 'Feature filter', + 'text_label_geometricObject': 'Geometric object', + 'text_label_queryMode': 'Query mode', + 'text_label_searchTips': 'Search for city locations or layer features', + 'text_label_chooseSearchLayers': 'Select a query layer', + 'text_loadSearchCriteria': 'Load search criteria', + 'text_saveSearchCriteria': 'Save search criteria', + + "btn_analyze": "Analyze", + "btn_analyzing": "Analyzing", + "btn_emptyTheAnalysisLayer": "Empty the analysis layer", + "btn_cancelAnalysis": "Cancel", + "btn_query": "Query", + "btn_querying": "Querying", + "btn_emptyTheRresultLayer": "Clear all result layers", + + 'msg_dataReturnedIsEmpty.': 'The request is successful and the data returned by the query is empty.', + 'msg_dataFlowServiceHasBeenSubscribed': 'The data stream service has been subscribed to.', + 'msg_inputDataFlowUrlFirst': 'Please enter the data stream service address first.', + 'msg_datasetOrMethodUnsupport': 'This dataset does not support this analysis type. Please reselect the dataset.', + 'msg_selectDataset': 'Please select a data set!', + 'msg_setTheWeightField': 'Please set the weight field!', + 'msg_theFieldNotSupportAnalysis': 'The field you currently select does not support analysis!', + 'msg_resultIsEmpty': 'The result of the analysis is empty!', + 'msg_openFileFail': 'Failed to open file!', + 'msg_fileTypeUnsupported': 'File format is not supported!', + 'msg_fileSizeExceeded': 'File size exceeded! The file size should not exceed 10M!', + 'msg_dataInWrongGeoJSONFormat': 'Wrong data format! Non standard GEOJSON format data!', + 'msg_dataInWrongFormat': 'Wrong data format! Non standard EXCEL, CSV or GEOJSON format data!', + 'msg_searchKeywords': "Search keywords cannot be empty. Please enter your search criteria.", + 'msg_searchGeocodeField':"Did not match the address matching service data!", + 'msg_cityGeocodeField':"The address matching service of the current city is not configured.", + 'msg_getFeatureField':"No related vector features found!", + 'msg_dataflowservicesubscribed':'The data stream service has been subscribed to.', + 'msg_subscribesucceeded':'The data stream service subscription was successful.', + 'msg_crsunsupport':'Does not support the coordinate system of the current map', + 'msg_tilematrixsetunsupport':'Incoming TileMatrixSet is not supported', + 'msg_jsonResolveFiled': 'JSON format parsing failure!', + 'msg_requestContentFiled': 'Failed to request data through iportal!', + 'msg_getdatafailed': 'Failed to get data!' + +}; + + + +;// CONCATENATED MODULE: ./src/common/lang/locales/zh-CN.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * Namespace: SuperMap.Lang["zh-CN"] + * Dictionary for Simplified Chinese. Keys for entries are used in calls to + * . Entry bodies are normal strings or + * strings formatted for use with calls. + */ +let zh = { + 'title_dataFlowService': '数据流服务', + 'title_distributedAnalysis': '分布式分析', + 'title_clientComputing': '客户端计算', + 'title_dataServiceQuery': '数据服务查询', + 'title_searchCity':'搜索城市', + 'title_searchLayer':'搜索图层', + + 'text_input_value_inputDataFlowUrl': '请输入数据流服务地址如:ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe', + 'text_displayFeaturesInfo': '显示要素信息', + 'text_subscribe': '订阅', + 'text_cancelSubscribe': '取消订阅', + + 'text_densityAnalysis': '密度分析', + 'text_CalculateTheValuePerUnitArea': '计算点指定邻域形状内的每单位面积量值', + 'text_option_selectDataset':'请选择数据集', + 'text_label_dataset': '数据集', + 'text_option_simplePointDensityAnalysis': '简单点密度分析', + 'text_option_nuclearDensityAnalysis': '核密度分析', + 'text_label_analyticalMethod': '分析方法', + 'text_option_quadrilateral': '四边形', + 'text_option_hexagon': '六边形', + 'text_label_meshType': '网格面类型', + 'text_option_notSet': '未设置', + 'text_label_weightField': '权重字段', + 'text_label_gridSizeInMeters': '网格大小', + 'text_label_searchRadius': '搜索半径', + 'text_label_queryRange': '分析范围', + 'text_label_areaUnit': '面积单位', + 'text_option_equidistantSegmentation': '等距离分段', + 'text_option_logarithm': '对数', + 'text_option_equalCountingSegment': '等计数分段', + 'text_option_squareRootSegmentation': '平方根分段', + 'text_label_thematicMapSegmentationMode': '专题图分段模式', + 'text_label_thematicMapSegmentationParameters': '专题图分段参数', + 'text_option_greenOrangePurpleGradient': '绿橙紫渐变', + 'text_option_greenOrangeRedGradient': '绿橙红渐变', + 'text_option_rainbowGradient': '彩虹渐变', + 'text_option_spectralGradient': '光谱渐变', + 'text_option_terrainGradient': '地形渐变', + 'text_label_thematicMapColorGradientMode': '专题图颜色渐变模式', + 'text_label_resultLayerName': '结果图层名称', + 'text_chooseFile': '选择文件', + 'text_isoline': '等值线', + 'text_extractDiscreteValue': '提取离散值生成曲线', + 'text_buffer': '缓冲区', + 'text_specifyTheDistance': '指定距离创建周边区域', + 'text_label_analysisLayer': '分析图层', + 'text_label_extractField': '提取字段', + 'text_label_extractedValue': '提取值', + 'text_label_distanceAttenuation': '距离衰减', + 'text_label_gridSize': '栅格大小', + 'text_label_bufferRadius': '缓冲半径', + 'text_label_defaultkilometers': '默认10千米', + 'text_option_kilometer': '千米', + 'text_label_unit': '单位', + 'text_retainOriginal': '保留原对象字段属性', + 'text_mergeBuffer': '合并缓冲区', + 'text_label_color': '颜色', + 'text_label_buffer': '[缓冲区]', + 'text_label_isolines': '[等值线]', + 'text_label_queryRangeTips': '默认为输入数据的全幅范围。范例:-74.050,40.650,-73.850,40.850', + 'text_label_IDArrayOfFeatures': '要素 ID 数组', + 'text_label_maxFeatures': '最多可返回的要素数量', + 'text_label_bufferDistance': '缓冲区距离', + 'text_label_queryRange1': '查询范围', + 'text_label_spatialQueryMode': '空间查询模式', + 'text_label_featureFilter': '要素过滤器', + 'text_label_geometricObject': '几何对象', + 'text_label_queryMode': '查询模式', + 'text_label_searchTips': '搜索城市地点或图层要素', + 'text_label_chooseSearchLayers': '选择查询图层', + 'text_loadSearchCriteria': '加载搜索条件', + 'text_saveSearchCriteria': '保存搜索条件', + + + "btn_analyze": "分析", + "btn_analyzing": "分析中", + "btn_emptyTheAnalysisLayer": "清空分析图层", + "btn_cancelAnalysis": "取消", + "btn_query": "查询", + "btn_querying": "查询中", + "btn_emptyTheRresultLayer": "清除所有结果图层", + + + 'msg_dataFlowServiceHasBeenSubscribed': '已订阅该数据流服务。', + 'msg_inputDataFlowUrlFirst': '请先输入数据流服务地址。', + 'msg_datasetOrMethodUnsupport': '该数据集不支持本分析类型,请重新选择数据集', + 'msg_selectDataset': '请选择数据集!', + 'msg_setTheWeightField': '请设置权重字段!', + 'msg_theFieldNotSupportAnalysis': '您当前选择的字段不支持分析!', + 'msg_resultIsEmpty': '分析的结果为空!', + 'msg_dataReturnedIsEmpty': '请求成功,查询返回的数据为空。', + 'msg_openFileFail': '打开文件失败!', + 'msg_fileTypeUnsupported': '不支持该文件格式!', + 'msg_fileSizeExceeded': '文件大小超限!文件大小不得超过 10M!', + 'msg_dataInWrongGeoJSONFormat': '数据格式错误!非标准的 GEOJSON 格式数据!', + 'msg_dataInWrongFormat': '数据格式错误!非标准的 EXCEL, CSV 或 GEOJSON 格式数据!', + 'msg_searchKeywords': "搜索关键字不能为空,请输入搜索条件。", + 'msg_searchGeocodeField':"未匹配到地址匹配服务数据!", + 'msg_cityGeocodeField':"未配置当前城市的地址匹配服务。", + 'msg_getFeatureField':"未查找到相关矢量要素!", + 'msg_dataflowservicesubscribed':'已订阅该数据流服务。', + 'msg_subscribesucceeded':'数据流服务订阅成功。', + 'msg_crsunsupport':'不支持当前地图的坐标系', + 'msg_tilematrixsetunsupport':'不支持传入的TileMatrixSet', + 'msg_jsonResolveFiled': 'json格式解析失败!', + 'msg_requestContentFiled': '通过iportal请求数据失败!', + 'msg_getdatafailed': '获取数据失败!' +}; + + + +;// CONCATENATED MODULE: ./src/common/lang/Lang.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @name Lang + * @namespace + * @category BaseTypes Internationalization + * @description 国际化的命名空间,包含多种语言和方法库来设置和获取当前的语言。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { Lang } from '{npm}'; + * + * const result = Lang.getCode(); + * + * ``` + */ +let Lang = { + 'en-US': en, + "zh-CN": zh, + /** + * @member {string} Lang.code + * @description 当前所使用的语言类型。 + */ + code: null, + + /** + * @member {string} [Lang.defaultCode='en-US'] + * @description 默认使用的语言类型。 + */ + defaultCode: "en-US", + + /** + * @function Lang.getCode + * @description 获取当前的语言代码。 + * @returns {string} 当前的语言代码。 + */ + getCode: function () { + if (!Lang.code) { + Lang.setCode(); + } + return Lang.code; + }, + + /** + * @function Lang.setCode + * @description 设置语言代码。 + * @param {string} code - 此参数遵循IETF规范。 + */ + setCode: function () { + var lang = this.getLanguageFromCookie(); + if (lang) { + Lang.code = lang; + return; + } + lang = Lang.defaultCode; + if (navigator.appName === 'Netscape') { + lang = navigator.language; + } else { + lang = navigator.browserLanguage; + } + if (lang.indexOf('zh') === 0) { + lang = 'zh-CN'; + } + if (lang.indexOf('en') === 0) { + lang = 'en-US'; + } + + Lang.code = lang; + }, + /** + * @function Lang.getLanguageFromCookie + * @description 从 cookie 中获取语言类型。 + */ + getLanguageFromCookie() { + var name = 'language='; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1) + } + if (c.indexOf(name) !== -1) { + return c.substring(name.length, c.length) + } + } + return ""; + }, + + /** + * @function Lang.i18n + * @description 从当前语言字符串的字典查找 key。 + * @param {string} key - 字典中 i18n 字符串值的关键字。 + * @returns {string} 国际化的字符串。 + */ + i18n: function (key) { + var dictionary = Lang[Lang.getCode()]; + var message = dictionary && dictionary[key]; + if (!message) { + // Message not found, fall back to message key + message = key; + } + return message; + } + +}; + + + + +;// CONCATENATED MODULE: external "function(){try{return XLSX}catch(e){return {}}}()" +const external_function_try_return_XLSX_catch_e_return_namespaceObject = function(){try{return XLSX}catch(e){return {}}}(); +var external_function_try_return_XLSX_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_XLSX_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/components/util/FileReaderUtil.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @name FileReaderUtil + * @namespace + * @category Components OpenFile + * @description 组件读取文件工具类。 + * @version 9.1.1 + * @type {{rABS: (boolean|*), rABF: (boolean|*), rAT: (boolean|*), readFile: (function(*, *=, *=, *=, *=)), readTextFile: (function(*, *=, *=, *=)), readXLSXFile: (function(*, *=, *=, *=)), processDataToGeoJson: (function(string, Object): GeoJSONObject), processExcelDataToGeoJson: (function(Object): GeoJSONObject), isXField: (function(*)), isYField: (function(*)), string2Csv: (function(*, *=))}} + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { FileReaderUtil } from '{npm}'; + * + * const result = FileReaderUtil.isXField(data); + * ``` + */ +let FileReaderUtil = { + rABS: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString, + rABF: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsArrayBuffer, + rAT: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsText, + /** + * @function FileReaderUtil.prototype.readFile + * @description 读取文件 + * @param {string} fileType - 当前读取的文件类型 + * + * @param {Object} file - 读取回来的文件内容对象 + * @param {function} success - 读取文件成功回调函数 + * @param {function} failed - 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readFile(fileType, file, success, failed, context) { + if (FileTypes.JSON === fileType || FileTypes.GEOJSON === fileType) { + this.readTextFile(file, success, failed, context) + } else if (FileTypes.EXCEL === fileType || FileTypes.CSV === fileType) { + this.readXLSXFile(file, success, failed, context) + } + }, + + /** + * @description 读取文本文件 + * @param {Object} file 文件内容对象 + * @param {function} success 读取文件成功回调函数 + * @param {function} failed 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readTextFile(file, success, failed, context) { + let reader = new FileReader(); + reader.onloadend = function (evt) { + success && success.call(context, evt.target.result); + }; + reader.onerror = function (error) { + failed && failed.call(context, error) + }; + this.rAT ? reader.readAsText(file.file, 'utf-8') : reader.readAsBinaryString(file.file); + }, + + /** + * @description 读取excel或csv文件 + * @param {Object} file 文件内容对象 + * @param {function} success 读取文件成功回调函数 + * @param {function} failed 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readXLSXFile(file, success, failed, context) { + let reader = new FileReader(); + reader.onloadend = function (evt) { + let xLSXData = new Uint8Array(evt.target.result); + let workbook = external_function_try_return_XLSX_catch_e_return_default().read(xLSXData, {type: "array"}); + try { + if (workbook && workbook.SheetNames && workbook.SheetNames.length > 0) { + //暂时只读取第一个sheets的内容 + let sheetName = workbook.SheetNames[0]; + let xLSXCSVString = external_function_try_return_XLSX_catch_e_return_default().utils.sheet_to_csv(workbook.Sheets[sheetName]); + success && success.call(context, xLSXCSVString); + } + } catch (error) { + failed && failed.call(context, error); + } + }; + reader.onerror = function (error) { + failed && failed.call(context, error) + }; + this.rABF && reader.readAsArrayBuffer(file.file); + }, + + /** + * @function FileReaderUtil.prototype.processDataToGeoJson + * @description 将读取回来得数据统一处理为 GeoJSON 格式 + * @param {string} type - 文件类型 + * @param {Object} data - 读取返回的数据对象 + * @param {function} success - 数据处理成功的回调 + * @param {function} failed - 数据处理失败的回调 + * @param {Object} context - 回调重定向对象 + * @returns {GeoJSONObject} 返回标准 GeoJSON 规范格式数据 + * @private + */ + processDataToGeoJson(type, data, success, failed, context) { + let geojson = null; + if (type === "EXCEL" || type === "CSV") { + geojson = this.processExcelDataToGeoJson(data); + success && success.call(context, geojson); + } else if (type === 'JSON' || type === 'GEOJSON') { + let result = data; + //geojson、json未知,通过类容来判断 + if ((typeof result) === "string") { + result = JSON.parse(result); + } + if (result.type === 'ISERVER') { + geojson = result.data.recordsets[0].features; + } else if (result.type === 'FeatureCollection') { + //geojson + geojson = result; + } else { + //不支持数据 + failed && failed.call(context, Lang.i18n('msg_dataInWrongGeoJSONFormat')); + } + success && success.call(context, geojson); + } else { + failed && failed.call(context, Lang.i18n('msg_dataInWrongFormat')); + } + }, + /** + * @function FileReaderUtil.prototype.processExcelDataToGeoJson + * @description 表格文件数据处理 + * @param {Object} data - 读取的表格文件数据 + * @returns {GeoJSONObject} 返回标准 GeoJSON 规范格式数据 + * @private + */ + processExcelDataToGeoJson(data) { + //处理为对象格式转化 + let dataContent = this.string2Csv(data); + let fieldCaptions = dataContent.colTitles; + + //位置属性处理 + let xfieldIndex = -1, + yfieldIndex = -1; + for (let i = 0, len = fieldCaptions.length; i < len; i++) { + if (this.isXField(fieldCaptions[i])) { + xfieldIndex = i; + } + if (this.isYField(fieldCaptions[i])) { + yfieldIndex = i; + } + } + // feature 构建后期支持坐标系 4326/3857 + let features = []; + for (let i = 0, len = dataContent.rows.length; i < len; i++) { + let row = dataContent.rows[i]; + //if (featureFrom === "LonLat") { + let x = Number(row[xfieldIndex]), + y = Number(row[yfieldIndex]); + + //属性信息 + let attributes = {}; + for (let index in dataContent.colTitles) { + let key = dataContent.colTitles[index]; + attributes[key] = dataContent.rows[i][index]; + } + + //目前csv 只支持处理点,所以先生成点类型的 geojson + let feature = { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [x, y] + }, + "properties": attributes + }; + features.push(feature); + } + return features; + }, + /** + * @description 判断是否地理X坐标 + * @param {string} data 字段名 + */ + isXField(data) { + var lowerdata = data.toLowerCase(); + return (lowerdata === "x" || lowerdata === "smx" || + lowerdata === "jd" || lowerdata === "经度" || lowerdata === "东经" || lowerdata === "longitude" || + lowerdata === "lot" || lowerdata === "lon" || lowerdata === "lng" || lowerdata === "x坐标"); + }, + + /** + * @description 判断是否地理Y坐标 + * @param {string} data 字段名 + */ + isYField(data) { + var lowerdata = data.toLowerCase(); + return (lowerdata === "y" || lowerdata === "smy" || + lowerdata === "wd" || lowerdata === "纬度" || lowerdata === "北纬" || + lowerdata === "latitude" || lowerdata === "lat" || lowerdata === "y坐标"); + }, + /** + * @description 字符串转为dataEditor 支持的csv格式数据 + * @param {string} string 待转化的字符串 + * @param {boolean} withoutTitle 是否需要列标题 + */ + string2Csv(string, withoutTitle) { + // let rows = string.split('\r\n'); + let rows = string.split('\n'); + let result = {}; + if (!withoutTitle) { + result["colTitles"] = rows[0].split(','); + } else { + result["colTitles"] = []; + } + result['rows'] = []; + for (let i = (withoutTitle) ? 0 : 1; i < rows.length; i++) { + rows[i] && result['rows'].push(rows[i].split(',')); + } + return result; + } + +}; + + + +;// CONCATENATED MODULE: ./src/common/components/chart/ChartModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class ChartModel + * @classdesc 图表组件数据模型 + * @private + * @param {Object} datasets - 数据来源。 + * @category Components Chart + * @fires ChartModel#getdatafailed + */ + +class ChartModel { + constructor(datasets) { + this.datasets = datasets; + this.EVENT_TYPES = ['getdatafailed']; + this.events = new Events(this, null, this.EVENT_TYPES); + } + /** + * @private + * @function ChartModel.prototype.getDatasetInfo + * @description 获得数据集数据。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + getDatasetInfo(success) { + let datasetUrl = this.datasets.url; + let me = this; + FetchRequest.get(datasetUrl) + .then(function (response) { + return response.json(); + }) + .then(function (results) { + if (results.datasetInfo) { + let datasetInfo = results.datasetInfo; + me.datasetsInfo = { + dataSourceName: datasetInfo.dataSourceName, + datasetName: datasetInfo.name, + mapName: results.name + }; + success({ + result: me.datasetsInfo + }); + } + }) + .catch(function (error) { + console.log(error); + me._fireFailedEvent(error); + }); + } + + /** + * @private + * @function ChartModel.prototype.getDataFeatures + * @description 请求数据集的数据信息 + * @param {Object} results - 数据集信息。 + * @param {function} success - 成功回调函数。 + */ + getDataFeatures(results, success) { + let datasetsInfo = results.result; + let getFeatureParam, getFeatureBySQLParams, getFeatureBySQLService; + let params = { + name: datasetsInfo.datasetName + '@' + datasetsInfo.dataSourceName + }; + Object.assign(params, this.datasets.queryInfo); + getFeatureParam = new FilterParameter(params); + getFeatureBySQLParams = new GetFeaturesBySQLParameters({ + queryParameter: getFeatureParam, + datasetNames: [datasetsInfo.dataSourceName + ':' + datasetsInfo.datasetName], + fromIndex: 0, + toIndex: 100000 + }); + getFeatureBySQLService = new GetFeaturesBySQLService(datasetsInfo.dataUrl, { + eventListeners: { + processCompleted: success, + processFailed: function () {} + } + }); + getFeatureBySQLService.processAsync(getFeatureBySQLParams); + } + + /** + * @private + * @function ChartModel.prototype.getLayerFeatures + * @description 请求图层要素的数据信息 + * @param {Object} results - 数据集信息。 + * @param {Callbacks} success - 成功回调函数。 + */ + getLayerFeatures(results, success) { + let datasetsInfo = results.result; + let queryParam, queryBySQLParams, queryBySQLService; + let params = { + name: datasetsInfo.mapName + }; + Object.assign(params, this.datasets.queryInfo); + queryParam = new FilterParameter(params); + queryBySQLParams = new QueryBySQLParameters({ + queryParams: [queryParam], + expectCount: 100000 + }); + queryBySQLService = new QueryBySQLService(datasetsInfo.dataUrl, { + eventListeners: { + processCompleted: success, + processFailed: function () {} + } + }); + queryBySQLService.processAsync(queryBySQLParams); + } + + /** + * @private + * @function ChartModel.prototype.getDataInfoByIptl + * @description 用dataId获取iportal的数据。 + * @param {Callbacks} success - 成功回调函数。 + * + */ + getDataInfoByIptl(success) { + // success是chart的回调 + this.getServiceInfo(this.datasets.url, success); + } + + /** + * @private + * @function ChartModel.prototype.getServiceInfo + * @description 用iportal获取dataItemServices。 + * @param {string} url + * @param {Callbacks} success - 成功回调函数。 + * */ + getServiceInfo(url, success) { + let me = this; + FetchRequest.get(url, null, { + withCredentials: this.datasets.withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + if (data.succeed === false) { + //请求失败 + me._fireFailedEvent(data); + return; + } + // 是否有rest服务 + if (data.dataItemServices && data.dataItemServices.length > 0) { + let dataItemServices = data.dataItemServices, + resultData; + + dataItemServices.forEach((item) => { + // 如果有restdata并且发布成功,就请求restdata服务 + // 如果有restmap并且发布成功,就请求restmap服务 + // 其他情况就请求iportal/content.json + if (item.serviceType === 'RESTDATA' && item.serviceStatus === 'PUBLISHED') { + resultData = item; + } else if (item.serviceType === 'RESTMAP' && item.serviceStatus === 'PUBLISHED') { + resultData = item; + } else { + me.getDatafromContent(url, success); + return; + } + }); + // 如果有服务,获取数据源和数据集, 然后请求rest服务 + resultData && me.getDatafromRest(resultData.serviceType, resultData.address, success); + } else { + me.getDatafromContent(url, success); + return; + } + }) + .catch((error) => { + console.log(error); + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype.getDatafromURL + * @description 用iportal获取数据。(通过固定的url来请求,但是不能请求工作空间的数据) + * @param {string} url + * @param {Callbacks} success - 成功回调函数。 + */ + getDatafromContent(url, success) { + // 成功回调传入的results + let results = { + result: {} + }, + me = this; + url += '/content.json?pageSize=9999999¤tPage=1'; + // 获取图层数据 + FetchRequest.get(url, null, { + withCredentials: this.datasets.withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + if (data.succeed === false) { + //请求失败 + me._fireFailedEvent(data); + return; + } + if (data.type) { + if (data.type === 'JSON' || data.type === 'GEOJSON') { + // 将字符串转换成json + data.content = JSON.parse(data.content.trim()); + // 如果是json文件 data.content = {type:'fco', features},格式不固定 + if (!data.content.features) { + //json格式解析失败 + console.log(Lang.i18n('msg_jsonResolveFiled')); + return; + } + let features = this._formatGeoJSON(data.content); + results.result.features = { + type: data.content.type, + features + }; + } else if (data.type === 'EXCEL' || data.type === 'CSV') { + let features = this._excelData2Feature(data.content); + results.result.features = { + type: 'FeatureCollection', + features + }; + } + success(results, 'content'); + } + }, this) + .catch((error) => { + console.log(error); + me._fireFailedEvent(error); + }); + } + + /** + * @private + * @function ChartModel.prototype._getDataSource + * @description 获取数据源名和数据集名。 + * @param {string} serviceType 服务类型 + * @param {string} address 地址 + * @param {Callbacks} success - 成功回调函数。 + * @return {Array.} ["数据源名:数据集名"] + * @return {string} 图层名 + */ + getDatafromRest(serviceType, address, success) { + let me = this, + withCredentials = this.datasets.withCredentials; + if (serviceType === 'RESTDATA') { + let url = `${address}/data/datasources`, + sourceName, + datasetName; + // 请求获取数据源名 + FetchRequest.get(url, null, { + withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + sourceName = data.datasourceNames[0]; + url = `${address}/data/datasources/${sourceName}/datasets`; + // 请求获取数据集名 + FetchRequest.get(url, null, { + withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + datasetName = data.datasetNames[0]; + // 请求restdata服务 + me.getDatafromRestData(`${address}/data`, [sourceName + ':' + datasetName], success); + return [sourceName + ':' + datasetName]; + }) + .catch(function (error) { + me._fireFailedEvent(error); + }); + }) + .catch(function (error) { + me._fireFailedEvent(error); + }); + } else { + // 如果是地图服务 + let url = `${address}/maps`, + mapName, + layerName, + path; + // 请求获取地图名 + FetchRequest.get(url, null, { + withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + mapName = data[0].name; + path = data[0].path; + url = url = `${address}/maps/${mapName}/layers`; + // 请求获取图层名 + FetchRequest.get(url, null, { + withCredentials + }) + .then((response) => { + return response.json(); + }) + .then((data) => { + layerName = data[0].subLayers.layers[0].caption; + // 请求restmap服务 + me.getDatafromRestMap(layerName, path, success); + return layerName; + }) + .catch(function (error) { + me._fireFailedEvent(error); + }); + }) + .catch(function (error) { + me._fireFailedEvent(error); + }); + } + } + + /** + * @private + * @function ChartModel.prototype.getDatafromRestData + * @description 请求restdata服务 + * @param {string} url + * @param {Array} dataSource [数据源名:数据集名] + * @param {Callbacks} success - 成功回调函数。 + */ + getDatafromRestData(url, dataSource, success) { + let me = this; + this.datasets.queryInfo.attributeFilter = this.datasets.queryInfo.attributeFilter || 'SmID>0'; + this._getFeatureBySQL( + url, + dataSource, + this.datasets.queryInfo, + (results) => { + // 此时的features已经处理成geojson了 + success(results, 'RESTDATA'); + }, + (error) => { + console.log(error); + me._fireFailedEvent(error); + } + ); + } + + /** + * @private + * @function ChartModel.prototype.getDatafromRestMap + * @description 请求restmap服务 + * @param {string} dataSource layerName + * @param {string} path - map服务地址。 + * @param {Callbacks} success - 成功回调函数。 + */ + getDatafromRestMap(dataSource, path, success) { + let me = this; + this.datasets.queryInfo.attributeFilter = this.datasets.queryInfo.attributeFilter || 'smid=1'; + this._queryFeatureBySQL( + path, + dataSource, + this.datasets.queryInfo, + null, + null, + (results) => { + // let features = result.result.recordsets[0].features; + success(results, 'RESTMAP'); + }, + (error) => { + console.log(error); + me._fireFailedEvent(error); + } + ); + } + + /** + * @private + * @function ChartModel.prototype._getFeatureBySQL + * @description 通过 sql 方式查询数据。 + */ + _getFeatureBySQL(url, datasetNames, queryInfo, processCompleted, processFaild) { + let getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams; + let params = { + name: datasetNames.join().replace(':', '@') + }; + Object.assign(params, queryInfo); + getFeatureParam = new FilterParameter(params); + getFeatureBySQLParams = new GetFeaturesBySQLParameters({ + queryParameter: getFeatureParam, + datasetNames: datasetNames, + fromIndex: 0, + toIndex: 100000, + returnContent: true + }); + let options = { + eventListeners: { + processCompleted: (getFeaturesEventArgs) => { + processCompleted && processCompleted(getFeaturesEventArgs); + }, + processFailed: (e) => { + processFaild && processFaild(e); + } + } + }; + getFeatureBySQLService = new GetFeaturesBySQLService(url, options); + getFeatureBySQLService.processAsync(getFeatureBySQLParams); + } + + /** + * @private + * @function ChartModel.prototype._queryFeatureBySQL + * @description 通过 sql 方式查询数据。 + */ + _queryFeatureBySQL( + url, + layerName, + queryInfo, + fields, + epsgCode, + processCompleted, + processFaild, + startRecord, + recordLength, + onlyAttribute + ) { + var queryParam, queryBySQLParams; + var filterParams = { + name: layerName + }; + Object.assign(filterParams, queryInfo); + queryParam = new FilterParameter(filterParams); + if (fields) { + queryParam.fields = fields; + } + var params = { + queryParams: [queryParam] + }; + if (onlyAttribute) { + params.queryOption = QueryOption.ATTRIBUTE; + } + startRecord && (params.startRecord = startRecord); + recordLength && (params.expectCount = recordLength); + if (epsgCode) { + params.prjCoordSys = { + epsgCode: epsgCode + }; + } + queryBySQLParams = new QueryBySQLParameters(params); + this._queryBySQL(url, queryBySQLParams, (data) => { + data.type === 'processCompleted' ? processCompleted(data) : processFaild(data); + }); + } + /** + * @function ChartModel.prototype._queryBySQL + * @description SQL 查询服务。 + * @param {QueryBySQLParameters} params - SQL 查询相关参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 结果类型。 + */ + _queryBySQL(url, params, callback, resultFormat) { + var me = this; + var queryBySQLService = new QueryBySQLService(url, { + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + queryBySQLService.processAsync(params); + } + /** + * @function ChartModel.prototype._processFormat + * @description 将数据转换成geojson。 + * @param {Object} resultFormat - 返回结果集。 + * @return {Object} [resultFormat=DataFormat.GEOJSON] - 结果类型。 + */ + _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } + + /** + * @private + * @function ChartModel.prototype._formatGeoJSON + * @description 格式 GeoJSON。 + * @param {GeoJSON} data - GeoJSON 数据。 + */ + _formatGeoJSON(data) { + let features = data.features; + features.forEach((row, index) => { + row.properties['index'] = index; + }); + return features; + } + + /** + * @private + * @description 将 csv 和 xls 文件内容转换成 geojson + * @function ChartModel.prototype._excelData2Feature + * @param content 文件内容 + * @param layerInfo 图层信息 + * @returns {Array} feature的数组集合 + */ + _excelData2Feature(dataContent) { + let fieldCaptions = dataContent.colTitles; + //位置属性处理 + let xfieldIndex = -1, + yfieldIndex = -1; + for (let i = 0, len = fieldCaptions.length; i < len; i++) { + if (FileReaderUtil.isXField(fieldCaptions[i])) { + xfieldIndex = i; + } + if (FileReaderUtil.isYField(fieldCaptions[i])) { + yfieldIndex = i; + } + } + + // feature 构建后期支持坐标系 4326/3857 + let features = []; + + for (let i = 0, len = dataContent.rows.length; i < len; i++) { + let row = dataContent.rows[i]; + + let x = Number(row[xfieldIndex]), + y = Number(row[yfieldIndex]); + //属性信息 + let attributes = {}; + for (let index in dataContent.colTitles) { + let key = dataContent.colTitles[index]; + attributes[key] = dataContent.rows[i][index]; + } + attributes['index'] = i + ''; + //目前csv 只支持处理点,所以先生成点类型的 geojson + let feature = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [x, y] + }, + properties: attributes + }; + features.push(feature); + } + return features; + } + /** + * @private + * @description 请求数据失败的事件 + * @function ChartModel.prototype._fireFailedEvent + * @param {Object} error 错误信息 + */ + _fireFailedEvent(error) { + let errorData = error + ? { + error, + message: Lang.i18n('msg_getdatafailed') + } + : { + message: Lang.i18n('msg_getdatafailed') + }; + /** + * @event ChartModel#getdatafailed + * @description 监听到获取数据失败事件后触发 + * @property {Object} error - 事件对象。 + */ + this.events.triggerEvent('getdatafailed', errorData); + } +} + +;// CONCATENATED MODULE: ./src/common/components/chart/ChartViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ChartViewModel + * @aliasclass Components.ChartViewModel + * @deprecatedclass SuperMap.Components.ChartViewModel + * @classdesc 图表组件功能类 + * @category Components Chart + * @version 10.0.0 + * @param {Object} options - 可选参数。 + * @param {string} options.type - 图表类型。 + * @param {ChartView.Datasets} options.datasets - 数据来源。 + * @param {Array.} options.chartOptions - 图表可选配置。 + * @param {Array.} options.chartOptions.xAxis - X轴可选参数。 + * @param {string} options.chartOptions.xAxis.field - X轴字段名。 + * @param {string} options.chartOptions.xAxis.name - X轴名称。 + * @param {Array.} options.chartOptions.yAxis - Y轴可选参数。 + * @param {string} options.chartOptions.yAxis.field - Y轴字段名。 + * @param {string} options.chartOptions.yAxis.name - Y轴名称。 + * @fires ChartViewModel#getdatafailed + * @usage + */ + +class ChartViewModel { + + constructor(options) { + this.datasets = options.datasets; + this.xField = []; + this.yField = []; + this.grid = { + top: "50px", + bottom: "50px", + left: "50px", + right: "60px" + }; + this.chartType = options.type || "bar"; + this._initXYField(options.chartOptions); + this.EVENT_TYPES = ["getdatafailed"]; + this.events = new Events(this, null, this.EVENT_TYPES); + } + + /** + * @function ChartViewModel.prototype._initXYField + * @description 初始化XY字段。 + * @private + * @param {Object} chartOptions - options里的图表参数。 + */ + _initXYField(chartOptions) { + let me = this; + if (chartOptions && chartOptions.length > 0) { + chartOptions.forEach(function (option) { + if (option.xAxis) { + me.xField.push({ + field: option.xAxis.field, + name: option.xAxis.name + }); + } + if (option.yAxis) { + me.yField.push({ + field: option.yAxis.field, + name: option.yAxis.name + }); + } + }); + } + } + /** + * @function ChartViewModel.prototype.getDatasetInfo + * @description 获得数据集数据。 + * @param {function} success - 成功回调函数。 + */ + getDatasetInfo(success) { + this.createChart = success; + if (this.datasets && this._checkUrl(this.datasets.url)) { + this.chartModel = new ChartModel(this.datasets); + if(this.datasets.type === 'iServer'){ + this.chartModel.getDatasetInfo(this._getDatasetInfoSuccess.bind(this)); + }else if(this.datasets.type === 'iPortal'){ + this.chartModel.getDataInfoByIptl(this._getDataInfoSuccess.bind(this)); + } + /** + * @event ChartViewModel#getdatafailed + * @description 监听到获取数据失败事件后触发。 + * @property {Object} error - 事件对象。 + */ + this.chartModel.events.on({"getdatafailed": (error) => { + this.events.triggerEvent("getdatafailed", error) + }}); + } + } + + /** + * @function ChartViewModel.prototype._getDatasetInfoSuccess + * @description 成功回调函数。 + * @private + * @param {Object} results - 数据集信息。 + */ + _getDatasetInfoSuccess(results) { + let datasetUrl = this.datasets.url; + //判断服务为地图服务 或者 数据服务 + let restIndex = datasetUrl.indexOf("rest"); + if (restIndex > 0) { + let index = datasetUrl.indexOf("/", restIndex + 5); + let type = datasetUrl.substring(restIndex + 5, index); + let dataUrl = datasetUrl.substring(0, restIndex + 4) + "/data"; + + if (type === "maps") { + let mapIndex = datasetUrl.indexOf("/", index + 1); + let mapName = datasetUrl.substring(index + 1, mapIndex); + dataUrl = datasetUrl.substring(0, restIndex + 4) + "/maps/" + mapName; + results.result.dataUrl = dataUrl; + this._getLayerFeatures(results); + } else if (type === "data") { + results.result.dataUrl = dataUrl; + this._getDataFeatures(results); + } + } + } + + /** + * @function ChartViewModel.prototype._getDataInfoSuccess + * @description 请求iportal数据成功之后的回调。 + * @private + */ + _getDataInfoSuccess(results, type) { + let me = this; + if(type === 'RESTMAP'){ + me._getChartDatasFromLayer(results); + }else{ + me._getChartDatas(results); + } + } + + /** + * @function ChartViewModel.prototype._getDataFeatures + * @description 请求数据集的数据信息 + * @private + * @param {Object} results - 数据集信息 + */ + _getDataFeatures(results) { + this.chartModel.getDataFeatures(results, this._getChartDatas.bind(this)); + } + + /** + * @function ChartViewModel.prototype._getLayerFeatures + * @description 请求图层的数据信息。 + * @private + * @param {Object} results - 数据集信息。 + */ + _getLayerFeatures(results) { + this.chartModel.getLayerFeatures(results, this._getChartDatasFromLayer.bind(this)); + } + + /** + * @function ChartViewModel.prototype._getChartDatas + * @description 将请求回来的数据转换为图表所需的数据格式。 + * @private + * @param {Object} results - 数据要素信息。 + */ + _getChartDatas(results) { + if (results) { + // 数据来自restdata---results.result.features + this.features = results.result.features; + let features = this.features.features; + let data = {}; + if (features.length) { + let feature = features[0]; + let attrFields = [], + itemTypes = []; + for (let attr in feature.properties) { + attrFields.push(attr); + itemTypes.push(this._getDataType(feature.properties[attr])); + } + data = { + features, + fieldCaptions: attrFields, + fieldTypes: itemTypes, + fieldValues: [] + } + for (let m in itemTypes) { + let fieldValue = []; + + for (let j in features) { + let feature = features[j]; + let caption = data.fieldCaptions[m]; + let value = feature.properties[caption]; + fieldValue.push(value); + } + data.fieldValues.push(fieldValue); + } + this.createChart(data); + } + } + } + /** + * @function ChartViewModel.prototype._getChartDatasFromLayer + * @description 将请求回来的数据转换为图表所需的数据格式。 + * @private + * @param {Object} results - 图层数据要素信息。 + */ + _getChartDatasFromLayer(results) { + if (results.result.recordsets) { + let recordsets = results.result.recordsets[0]; + let features = recordsets.features.features; + this.features = recordsets.features; + let data = {}; + if (features.length) { + data = { + features: recordsets.features, + fieldCaptions: recordsets.fieldCaptions, + fieldTypes: recordsets.fieldTypes, + fieldValues: [] + } + for (let m in data.fieldCaptions) { + let fieldValue = []; + + for (let j in features) { + let feature = features[j]; + let caption = data.fieldCaptions[m]; + let value = feature.properties[caption]; + fieldValue.push(value); + } + data.fieldValues.push(fieldValue); + } + this.createChart(data); + } + } + } + + /** + * @function ChartViewModel.prototype._createChartOptions + * @description 创建图表所需参数。 + * @private + * @param {Object} data - 图表数据。 + */ + _createChartOptions(data) { + this.calculatedData = this._createChartDatas(data); + return this.updateChartOptions(this.chartType); + } + + /** + * @function ChartViewModel.prototype.changeType + * @description 改变图表类型。 + * @param {string} type - 图表类型。 + */ + changeType(type) { + if (type !== this.chartType) { + this.chartType = type; + return this.updateChartOptions(this.chartType); + } + } + + /** + * @function ChartViewModel.prototype.updateData + * @description 改变图表类型。 + * @param {ChartView.Datasets} datasets - 数据来源。 + * @param {function} success 成功回调函数。 + */ + updateData(datasets, chartOption, success) { + this.updateChart = success; + this.xField = []; + this.yField = []; + this._initXYField(chartOption); + // type的设置默认值 + datasets.type = datasets.type || 'iServer'; + // withCredentials的设置默认值 + datasets.withCredentials = datasets.withCredentials || false; + this.datasets = datasets; + this.getDatasetInfo(this._updateDataSuccess.bind(this)); + } + + /** + * @function ChartViewModel.prototype._updateDataSuccess + * @description 改变图表类型。 + * @private + * @param {Object} data - 图表数据。 + */ + _updateDataSuccess(data) { + let options = this._createChartOptions(data); + this.updateChart(options); + } + + /** + * @function ChartViewModel.prototype.updateChartOptions + * @description 更新图表所需参数。 + * @param {string} type - 图表类型。 + * @param {Object} style - 图表样式。 + */ + updateChartOptions(type, style) { + if (this.calculatedData) { + let grid = this.grid; + let series = this._createChartSeries(this.calculatedData, type); + let datas = []; + for (let i in this.calculatedData.XData) { + datas.push({ + value: this.calculatedData.XData[i].fieldsData + }); + } + let xAxis = { + type: "category", + name: this.xField[0].name || "X", + data: datas, + nameTextStyle: { + color: '#fff', + fontSize: 14 + }, + splitLine: { + show: false + }, + axisLine: { + lineStyle: { + color: '#eee' + } + } + } + let yAxis = { + type: "value", + name: this.yFieldName || "Y", + data: {}, + nameTextStyle: { + color: '#fff', + fontSize: 14 + }, + splitLine: { + show: false + }, + axisLine: { + lineStyle: { + color: '#eee' + } + } + } + let tooltip = { + formatter: '{b0}: {c0}' + }; + let backgroundColor = '#404a59'; + if (style) { + if (style.grid) { + grid = style.grid; + } + if (style.tooltip) { + tooltip = style.tooltip; + } + if (style.backgroundColor) { + backgroundColor = style.backgroundColor; + } + } + return { + backgroundColor: backgroundColor, + grid: grid, + series: series, + xAxis: xAxis, + yAxis: yAxis, + tooltip: tooltip + } + } + } + + /** + * @function ChartViewModel.prototype._createChartDatas + * @description 构建图表数据。 + * @private + * @param {Object} data - 源数据。 + */ + _createChartDatas(data) { + let fieldIndex = 0, yfieldIndexs = []; + let fieldCaptions = data.fieldCaptions; + let me = this; + //X + fieldCaptions.forEach(function (field, index) { + if (me.xField[0] && field === me.xField[0].field) { + fieldIndex = index; + } + }); + //Y + this.yFieldName = ""; + this.yField.forEach(function (value, index) { + if (index !== 0) { + me.yFieldName = me.yFieldName + ","; + } + me.yFieldName = me.yFieldName + value.name; + fieldCaptions.forEach(function (field, index) { + if (field === value.field) { + yfieldIndexs.push(index); + } + }); + }) + let datas = this._getAttrData(data, fieldIndex); + let yDatas = []; + if (yfieldIndexs.length > 0) { + yfieldIndexs.forEach(function (yfieldIndex) { + let yData = []; + for (let i in data.fieldValues[yfieldIndex]) { + yData.push({ + value: data.fieldValues[yfieldIndex][i] + }); + } + yDatas.push(yData); + }); + } else { //未指定Y字段时,y轴计数 + let YData = [], + XData = [], + len = datas.length; + + //计算X轴,Y轴数据,并去重 + for (let i = 0; i < len; i++) { + let isSame = false; + for (let j = 0, leng = XData.length; j < leng; j++) { + if (datas[i].fieldsData === XData[j].fieldsData) { + YData[j].value++; + XData[j].recordIndexs.push(i); + isSame = true; + break; + } + } + if (!isSame) { + if (datas[i].fieldsData) { + XData.push({ fieldsData: datas[i].fieldsData, recordIndexs: [i] }); + YData.push({ value: 1 }); + } + } + } + datas = XData; + yDatas = [YData]; + } + return { + XData: datas, + YData: yDatas + } + } + + /** + * @function ChartViewModel.prototype._getAttrData + * @description 选中字段数据。 + * @private + * @param {Object} datacontent - 图表数据。 + * @param {number} index - 字段索引。 + */ + _getAttrData(datacontent, index) { + if (index === 0) { + this.xField = [{ + field: datacontent.fieldCaptions[index], + name: datacontent.fieldCaptions[index] + }]; + } + let fieldsDatas = []; + for (let i = 0, len = datacontent.fieldValues[index].length; i < len; i++) { + let value = datacontent.fieldValues[index][i]; + fieldsDatas.push({ + recordIndexs: i, + fieldsData: value + }); + } + return fieldsDatas; + } + + /** + * @function ChartViewModel.prototype._createChartSeries + * @description 图表数据。 + * @private + * @param {Object} calculatedData - 图表数据。 + * @param {string} chartType - 图表类型。 + */ + _createChartSeries(calculatedData, chartType) { + let series = []; + let yDatas = calculatedData.YData; + yDatas.forEach(function (yData) { + let value = 0; + let serieData = []; + for (let data of yData) { + value = data.value; + serieData.push({ + value: value + }); + } + let serie = { + type: chartType, + data: serieData, + name: "y" + }; + + series.push(serie); + }); + return series; + } + + /** + * @function ChartViewModel.prototype._isDate + * @description 判断是否为日期。 + * @private + * @param {string} data - 字符串。 + */ + _isDate(data) { + let reg = /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/ig; + return reg.test(data); + } + + /** + * @function ChartViewModel.prototype._isNumber + * @description 判断是否为数值。 + * @private + * @param {string} data - 字符串。 + */ + _isNumber(data) { + let mdata = Number(data); + if (mdata === 0) { + return true; + } + return !isNaN(mdata); + } + + /** + * @function ChartViewModel.prototype._getDataType + * @description 判断数据的类型。 + * @private + * @param {string} data - 字符串。 + */ + _getDataType(data) { + if (data !== null && data !== undefined && data !== '') { + if (this._isDate(data)) { + return "DATE"; + } + if (this._isNumber(data)) { + return "NUMBER"; + } + } + return "STRING"; + } + + /** + * @function ChartViewModel.prototype._checkUrl + * @description 检查url是否符合要求。 + * @private + * @param {string} url。 + */ + _checkUrl(url) { + let match; + if (url === '' || !this._isMatchUrl(url)) { + match = false; + } else if (/^http[s]?:\/\/localhost/.test(url) || /^http[s]?:\/\/127.0.0.1/.test(url)) { + //不是实际域名 + match = false; + } else { + match = true; + } + return match; + } + + /** + * @function ChartViewModel.prototype._isMatchUrl + * @description 判断输入的地址是否符合地址格式。 + * @private + * @param {string} str - url。 + */ + _isMatchUrl(str) { + var reg = new RegExp('(https?|http|file|ftp)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'); + return reg.test(str); + } + + /** + * @function ChartViewModel.prototype.getStyle + * @description 获取图表样式。 + */ + getStyle() { + let style = { + grid: this.grid, + tooltip: this.tooltip, + backgroundColor: this.backgroundColor + } + return style; + } + + /** + * @function ChartViewModel.prototype.getFeatures + * @description 获取地图服务,数据服务请求返回的数据。 + */ + getFeatures() { + return this.features; + } + + /** + * @function ChartViewModel.prototype.setStyle + * @description 设置图表样式。 + * @param {Object} style - 图表样式 + */ + setStyle(style) { + return this.updateChartOptions(this.chartType, style); + } +} + +;// CONCATENATED MODULE: ./src/common/components/chart/ChartView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ChartView + * @aliasclass Components.Chart + * @deprecatedclass SuperMap.Components.Chart + * @classdesc 图表组件 + * @version 9.1.2 + * @param {string} domID - 图表dom元素ID。 + * @param {Object} options - 可选参数。 + * @param {string} options.type - 图表类型。 + * @param {ChartView.Datasets} options.datasets - 数据来源 + * @param {Array.} options.chartOptions - 图表可选参数。 + * @param {Array.} options.chartOptions.xAxis - 图表X轴。 + * @param {string} options.chartOptions.xAxis.field - 图表X轴字段名。 + * @param {string} options.chartOptions.xAxis.name - 图表X轴名称。 + * @param {Array.} options.chartOptions.yAxis - 图表Y轴。 + * @param {string} options.chartOptions.yAxis.field - 图表Y轴字段名。 + * @param {string} options.chartOptions.yAxis.name - 图表Y轴名称。 + * @category Components Chart + * @usage + */ +/** + * @typedef {Object} ChartView.Datasets - 数据来源 + * @property {string} [type = 'iServer'] - 服务类型 iServer, iPortal。 + * @property {string} url - 服务地址。 + * @property {boolean} [withCredentials = false] - 设置请求是否带cookie + * @property {FilterParameter} queryInfo - 查询条件 + */ +class ChartView { + + constructor(domID, options) { + this.domID = domID; + this.chartType = options.type || "bar"; + // 设置options.datasets.type的默认值是iServer + options.datasets.type = options.datasets.type || 'iServer'; + // 设置withCredentials的默认值为false + options.datasets.withCredentials = options.datasets.withCredentials || false; + this.viewModel = new ChartViewModel(options); + //添加控件。 + this._fillDataToView(); + } + + /** + * @function ChartView.prototype.onAdd + * @description 创建图表之后成功回调 + * @param {function} addChart - 回调函数。 + */ + onAdd(addChart) { + this.addChart = addChart; + } + + /** + * @function ChartView.prototype._fillDataToView + * @description 填充数据到 view。 + * @private + */ + _fillDataToView() { + let messageboxs = new MessageBox(); + //iclient 绑定createChart事件成功回调 + this.viewModel.getDatasetInfo(this._createChart.bind(this)); + this.viewModel.events.on({ + "getdatafailed": (error) => { + messageboxs.showView(error.message); + } + }); + } + + /** + * @function ChartView.prototype.getStyle + * @description 获取图表样式。 + */ + getStyle() { + return this.viewModel.getStyle() + } + + /** + * @function ChartView.prototype.getFeatures + * @description 获取地图服务,数据服务请求返回的数据。 + */ + getFeatures() { + return this.viewModel.getFeatures(); + } + + /** + * @function ChartView.prototype.setStyle + * @description 设置图表样式。 + * @param {Object} style - 图表样式,参考Echarts-options样式设置。 + */ + setStyle(style) { + let newOptions = this.viewModel.setStyle(style); + this._updateChart(newOptions); + } + + /** + * @function ChartView.prototype.changeType + * @description 改变图表类型。 + * @param {string} type - 图表类型。 + */ + changeType(type) { + if (this.chartType !== type) { + this.chartType = type; + let newOptions = this.viewModel.changeType(type); + this._updateChart(newOptions); + } + } + + /** + * @function ChartView.prototype.updateData + * @description 更新图表数据。 + * @param {ChartView.Datasets} datasets - 数据来源。 + * @param {Object} chartOption - X,Y轴信息。 + */ + updateData(datasets, chartOption) { + let me = this; + this.viewModel.updateData(datasets, chartOption, function (options) { + me._updateChart(options); + if (me.addChart) { + me.addChart(); + } + }); + } + + /** + * @function ChartView.prototype._createChart + * @description 创建图表。 + * @private + * @param {Object} data - 图表数据。 + */ + _createChart(data) { + this.echart = external_function_try_return_echarts_catch_e_return_default().init( + document.getElementById(this.domID), + null, { + renderer: "canvas" + } + ) + let options = this.viewModel._createChartOptions(data); + this.echart.setOption(options); + if (this.addChart) { + this.addChart(); + } + } + + /** + * @function ChartView.prototype._updateChart + * @description 更新图表。 + * @private + * @param {Object} options - 图表参数。 + */ + _updateChart(options) { + if (this.echart) { + this.echart.clear(); + this.echart.setOption(options); + } + } +} + +;// CONCATENATED MODULE: ./src/common/components/templates/TemplateBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TemplateBase + * @aliasclass Components.TemplateBase + * @deprecatedclass SuperMap.Components.TemplateBase + * @classdesc 组件公用组件父类,用于约束统一封装的公用组件结构。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @category Components Common + * @usage + */ +class TemplateBase { + constructor(options) { + options = options ? options : {}; + /** + * @member {string} [TemplateBase.prototype.id=null] + * @description 组件 dom 元素 id。 + */ + this.id = options.id ? options.id : null; + + /** + * @member {HTMLElement} [TemplateBase.prototype.rootContainer=null] + * @description 组件 dom 元素对象。 + */ + this.rootContainer = null; + } + + /** + * @function TemplateBase.prototype.getElement + * @description 获取当前组件元素对象。 + * @return {HTMLElement} 组件 dom 元素对象 + */ + getElement() { + //todo 其实感觉再这里给组件设置不太合理 + if (this.id) { + this.rootContainer.id = this.id; + } + + return this.rootContainer; + } + + /** + * @function TemplateBase.prototype._initView + * @private + * @description 初始化模板。 + */ + _initView() { + //子类实现此方法 + } + + /** + * @function TemplateBase.prototype.showView + * @description 显示组件。 + */ + showView() { + this.rootContainer.hidden = false; + } + + /** + * @function TemplateBase.prototype.closeView + * @description 隐藏组件。 + */ + closeView() { + this.rootContainer.hidden = true; + } +} + +;// CONCATENATED MODULE: ./src/common/components/templates/CommonContainer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CommonContainer + * @aliasclass Components.CommonContainer + * @deprecatedclass SuperMap.Components.CommonContainer + * @classdesc 组件统一外框。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 标题。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ +class CommonContainer extends TemplateBase { + constructor(options) { + super(options); + let title = options.title ? options.title : ""; + this._initView(title); + } + + /** + * @private + * @override + */ + _initView(title) { + const container = document.createElement("div"); + container.setAttribute("class", "component-container"); + + //title + const titleContainer = document.createElement("div"); + titleContainer.setAttribute("class", "component-title"); + const titleContent = document.createElement("div"); + titleContent.innerHTML = title; + titleContainer.appendChild(titleContent); + container.appendChild(titleContainer); + //container + const componentContent = document.createElement("div"); + componentContent.setAttribute("class", "component-content"); + container.appendChild(componentContent); + this.content = componentContent; + + this.rootContainer = container; + return container; + } + + /** + * @function CommonContainer.prototype.getContentElement + * @description 获取内容元素容器。 + */ + getContentElement() { + return this.content; + } + + /** + * @function CommonContainer.prototype.appendContent + * @description 填充内容元素。 + */ + appendContent(element) { + this.content.appendChild(element); + } +} + +;// CONCATENATED MODULE: ./src/common/components/templates/Select.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Select + * @aliasclass Components.Select + * @deprecatedclass SuperMap.Components.Select + * @classdesc 组件统一的文字下拉框。 + * @version 9.1.1 + * @param {Array.} options - 组件配置参数数组。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} [options.labelName] - label 名称。 + * @param {Array.} options.optionsArr - 需要创建的 option 数据数组。 + * @param {function} [options.optionsClickCb] - option 点击事件回调函数。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ +class Select extends TemplateBase { + constructor(options) { + super(options); + this._initView(options); + } + + _initView(options) { + let selectTool = this._createElement('div', "component-selecttool"); + + if (options.labelName) { + let label = this._createElement('label', 'component-selecttool__lable--describe', selectTool); + label.innerHTML = options.labelName; + } + + let chartSelect = this._createElement('div', 'component-selecttool--chart', selectTool); + chartSelect.setAttribute('tabindex', '1'); + + let selectName = this._createElement('div', "component-selecttool__name", chartSelect); + selectName.title = options.optionsArr[0]; + selectName.innerHTML = options.optionsArr[0]; + + let chartTriangleBtn = this._createElement('div', 'component-selecttool__trianglebtn--chart', chartSelect); + let triangleBtn = this._createElement('div', 'component-triangle-down-img', chartTriangleBtn); + let selectContent = this._createElement('div', 'component-selecttool__content', chartSelect); + let scrollarea = this._createElement('div', 'component-selecttool__content--chart', selectContent); + let scrollareaContent = this._createElement('div', 'component-selecttool__scrollarea__content', scrollarea); + scrollareaContent.setAttribute('tabindex', '1'); + this.createOptions(scrollareaContent, options.optionsArr); + this.optionClickEvent(scrollareaContent, selectName, options.optionsClickCb); + // 下拉框显示 & 隐藏事件 + this._selectClickEvent(chartSelect, selectContent, triangleBtn); + this.rootContainer = selectTool; + } + + /** + * @function Select.prototype.createOptions + * @description 创建所属下拉框选项。 + */ + createOptions(container, optionsArr) { + for (let i in optionsArr) { + let option = this._createElement('div', 'component-selecttool__option', container); + option.title = optionsArr[i]; + option.innerHTML = optionsArr[i]; + } + } + + /** + * @function Select.prototype._selectClickEvent + * @description select 点击显示&隐藏事件。 + * @private + */ + _selectClickEvent(eventElement, contentElement, triangleBtn) { + eventElement.onclick = function (e) { + if (contentElement.style.display === "block") { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } else { + contentElement.style.display = "block"; + triangleBtn.className = "triangle-up-img"; + } + e.preventDefault(); + e.stopPropagation(); + }; + eventElement.onmousedown = function (evt) { + //console.log('dropdownbox onmousedown '+evt.target.className); + if (evt.target !== this) { + this.focus(); + evt.preventDefault(); + evt.stopPropagation() + } + }; + eventElement.onblur = function () { + + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } + } + + /** + * @function Select.prototype._createElement + * @description 通用创建元素。 + * @private + */ + _createElement(tagName, className, parentEle) { + let ele = document.createElement(tagName || 'div'); + className && (ele.className = className); + parentEle && parentEle.appendChild(ele); + return ele; + } + + /** + * @function Select.prototype.optionClickEvent + * @description 下拉框的 option 的点击事件。 + */ + optionClickEvent(optionEleArr, selectNameEle, optionsClickCb) { + for (let i = 0; i < optionEleArr.children.length; i++) { + let childEle = optionEleArr.children[i]; + childEle.onclick = function () { + selectNameEle.innerHTML = childEle.innerHTML; + selectNameEle.title = childEle.title; + if (childEle.getAttribute('data-value')) { + selectNameEle.setAttribute('data-value', childEle.getAttribute('data-value')) + } + optionsClickCb && optionsClickCb(childEle); + } + } + } +} + +;// CONCATENATED MODULE: ./src/common/components/templates/DropDownBox.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DropDownBox + * @aliasclass Components.DropDownBox + * @deprecatedclass SuperMap.Components.DropDownBox + * @classdesc 组件统一的图片下拉框。 + * @version 9.1.1 + * @param {Array.} options - 组件配置参数数组。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 下拉框 title。 + * @param {string} options.remark - 下拉框解释标记文本。 + * @param {string} [options.dataValue] - 下拉框 attribute 名为 data-value 的值 。 + * @param {string} [options.icon] - 下拉框图标。 + * @param {string} [options.icon.className] - 下拉框图标类名。 + * @param {string} [options.icon.background] - 下拉框图标背景 url。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ +class DropDownBox extends TemplateBase { + constructor(optionsArr) { + super(optionsArr); + this._initView(optionsArr); + } + + /** + * @function DropDownBox.prototype._initView + * @description 初始化下拉框。 + * @private + * @override + */ + _initView(optionsArr) { + let dropDownContainer = document.createElement('div'); + dropDownContainer.className = 'component-dropdownbox--container'; + let dropDownBox = document.createElement('div'); + dropDownBox.setAttribute('tabindex', '1'); + dropDownBox.className = "component-dropdownbox"; + dropDownContainer.appendChild(dropDownBox); + + let dropDownTopContainer = document.createElement('div'); + dropDownBox.appendChild(dropDownTopContainer); + + this._createDropDownOption(optionsArr[0], dropDownTopContainer); + + let triangleBtnContainer = document.createElement('div'); + triangleBtnContainer.className = 'component-dropdownbox__triangle-btn'; + dropDownBox.appendChild(triangleBtnContainer); + + let triangleBtn = document.createElement('div'); + triangleBtn.className = 'component-triangle-down-img'; + triangleBtnContainer.appendChild(triangleBtn); + + let createDropDownBoxParam = { + "parentEle": dropDownBox, + "dropDownContent": ['component-dropdownbox__content component-dropdownbox__content--chart', 'dropDownContent'], + "scrollareaContent": 'component-selecttool__scrollarea__content', + "optionsArr": optionsArr, + "triangleBtn": triangleBtn, + "dropDownTopContainer": dropDownTopContainer + }; + this._createDropDownBox(createDropDownBoxParam); + + this.rootContainer = dropDownContainer; + + } + + /** + * @function DropDownBox.prototype._createDropDownBox + * @description 创建下拉框。 + * @private + */ + _createDropDownBox(createDropDownBoxParam) { + let dropDownBox = createDropDownBoxParam.parentEle; + let dropDownTopContainer = createDropDownBoxParam.dropDownTopContainer; + let dropDownContent = document.createElement('div'); + dropDownContent.className = createDropDownBoxParam.dropDownContent[0]; + dropDownBox.appendChild(dropDownContent); + + let scrollareaContent = document.createElement('div'); + scrollareaContent.className = createDropDownBoxParam.scrollareaContent; + dropDownContent.appendChild(scrollareaContent); + + let optionsArr = createDropDownBoxParam.optionsArr; + for (let i = 0; i < optionsArr.length; i++) { + this._createDropDownOption(optionsArr[i], scrollareaContent) + } + // 下拉框显示 & 隐藏事件 + let triangleBtn = createDropDownBoxParam.triangleBtn; + this._dropDownClickEvent(dropDownBox, dropDownContent, triangleBtn); + + this._eleOnblur(dropDownBox, dropDownContent, triangleBtn); + + // 下拉框 options 点击事件 + let scrollareaOptions = scrollareaContent.children; + for (let i = 0; i < scrollareaOptions.length; i++) { + scrollareaOptions[i].onclick = function () { + dropDownTopContainer.innerHTML = scrollareaOptions[i].outerHTML; + //evt.stopPropagation(); + } + } + } + + /** + * @function DropDownBox.prototype._createDropDownOption + * @description 创建下拉框子元素。 + * @private + */ + _createDropDownOption(data, parentElement) { + let ele = document.createElement('div'); + ele.className = 'component-dropdownbox__item'; + let dataItem = data; + if (dataItem['dataValue']) { + ele.setAttribute('data-value', dataItem['dataValue']); + } + parentElement.appendChild(ele); + + let imgContainer = document.createElement('div'); + imgContainer.className = 'component-dropdownbox__item__img'; + ele.appendChild(imgContainer); + + let img = document.createElement('div'); + if (dataItem.icon.className) { + img.className = dataItem.icon.className; + } + if (dataItem.icon.background) { + img.style.background = dataItem.icon.background; + } + imgContainer.appendChild(img); + + let title = document.createElement('div'); + title.className = 'component-dropdownbox__item__title'; + title.title = dataItem.title; + title.innerHTML = dataItem.title; + ele.appendChild(title); + + let remark = document.createElement('div'); + remark.className = 'component-dropdownbox__item__remark'; + remark.title = dataItem.remark; + remark.innerHTML = dataItem.remark; + ele.appendChild(remark); + } + + /** + * @function DropDownBox.prototype._dropDownClickEvent + * @description 下拉框点击事件。 + * @private + */ + _dropDownClickEvent(eventElement, contentElement, triangleBtn) { + eventElement.onclick = function (e) { + if (contentElement.style.display === "block") { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } else { + contentElement.style.display = "block"; + triangleBtn.className = "triangle-up-img"; + } + e.preventDefault(); + e.stopPropagation() + }; + eventElement.onmousedown = function (evt) { + //console.log('dropdownbox onmousedown '+evt.target.className); + if (evt.target !== this) { + this.focus(); + evt.preventDefault(); + evt.stopPropagation() + } + } + } + + /** + * @function DropDownBox.prototype._eleOnblur + * @description 下拉框失焦事件。 + * @private + */ + _eleOnblur(eventElement, contentElement, triangleBtn) { + eventElement.onblur = function () { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } + } + + /** + * @function DropDownBox.prototype._createElement + * @description 通用创建元素。 + * @private + */ + _createElement(tagName, className, parentEle) { + let ele = document.createElement(tagName || 'div'); + className && (ele.className = className); + parentEle && parentEle.appendChild(ele); + return ele; + } + +} + + +;// CONCATENATED MODULE: ./src/common/components/templates/PopContainer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class PopContainer + * @aliasclass Components.PopContainer + * @deprecatedclass SuperMap.Components.PopContainer + * @classdesc 弹框组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 弹框组件名称。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ +class PopContainer extends TemplateBase { + constructor(options) { + options = options ? options : {}; + super(options); + options.title = options.title ? options.title : ""; + this._initView(options.title); + } + + /** + * @private + * @override + */ + _initView(titile) { + const container = document.createElement("div"); + container.setAttribute("class", "component-popcontainer"); + + //header + const header = document.createElement("div"); + header.setAttribute("class", "component-popcontainer__header"); + const title = document.createElement("label"); + title.setAttribute("class", "component-popcontainer__header__title"); + title.innerHTML = titile; + header.appendChild(title); + + const closeBtn = document.createElement("span"); + closeBtn.setAttribute("class", "supermapol-icons-clear component-popcontainer__header__close"); + closeBtn.onclick = this.closeView.bind(this); + container.appendChild(closeBtn); + container.appendChild(header); + + //content + const content = document.createElement("div"); + content.setAttribute("class", "component-popcontainer__content"); + this.content = content; + + container.appendChild(content); + + this.rootContainer = container; + + } + + /** + * @function PopContainer.prototype.appendContent + * @description 追加内容。 + * @param {HTMLElement} dom - 内容元素。 + */ + appendContent(dom) { + this.content.appendChild(dom); + } + +} + +;// CONCATENATED MODULE: ./src/common/components/templates/AttributesPopContainer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class AttributesPopContainer + * @aliasclass Components.AttributesPopContainer + * @deprecatedclass SuperMap.Components.AttributesPopContainer + * @classdesc 属性弹框组件 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Object} options.title - 属性弹框组件名称。 + * @param {Object} options.attributes - 组件需要显示的属性内容。 + * @extends {PopContainer} + * @category Components Common + * @usage + */ +class AttributesPopContainer extends PopContainer { + constructor(options) { + //默认为属性: + options.title = options.title ? options.title : "属性"; + + super(options); + this.rootContainer.firstChild.hidden = true; + options.attributes = options.attributes ? options.attributes : []; + this._createAttributesTable(options.attributes); + } + + _createAttributesTable(attributes) { + const table = document.createElement("table"); + table.setAttribute("class", "component-popcontainer__content__table"); + + const tbody = document.createElement("tbody"); + + let single = true; + for (let name in attributes) { + const tr = document.createElement("tr"); + if (single) { + tr.setAttribute("class", "component-popcontainer__content__td--color"); + } + const title = document.createElement("td"); + const titleSpan = document.createElement("Span"); + titleSpan.innerHTML = name; + title.appendChild(titleSpan); + const value = document.createElement("td"); + value.innerHTML = attributes[name]; + + tr.appendChild(title); + tr.appendChild(value); + tbody.appendChild(tr); + single = !single; + } + table.appendChild(tbody); + + this.appendContent(table); + } +} + +;// CONCATENATED MODULE: ./src/common/components/templates/IndexTabsPageContainer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IndexTabsPageContainer + * @aliasclass Components.IndexTabsPageContainer + * @deprecatedclass SuperMap.Components.IndexTabsPageContainer + * @classdesc 标签索引组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ +class IndexTabsPageContainer extends TemplateBase { + constructor(options) { + super(options); + this._initView(); + } + + /** + * @private + * @override + */ + _initView() { + const container = document.createElement("div"); + container.setAttribute("class", "component-tabpage"); + + const header = document.createElement("ul"); + this.header = header; + + const content = document.createElement("div"); + content.setAttribute("class", "component-tabpage__content"); + this.content = content; + + container.appendChild(header); + container.appendChild(content); + this.rootContainer = container; + + } + + /** + * @function IndexTabsPageContainer.prototype.setTabs + * @description 设置标签元素。 + * @param {Array.} tabs + */ + setTabs(tabs) { + this.removeAllTabs(); + this.appendTabs(tabs); + } + + /** + * @function IndexTabsPageContainer.prototype.appendTabs + * @description 追加标签元素。 + * @param {Array.} tabs + */ + appendTabs(tabs) { + for (let i = 0; i < tabs.length; i++) { + let title = document.createElement("span"); + title.index = i; + title.appendChild(document.createTextNode(tabs[i].title)); + //绑定标签切换对应页面: + title.onclick = this._changeTabsPage.bind(this); + let content = tabs[i].content; + content.index = i; + content.hidden = true; + + this.header.appendChild(title); + this.content.appendChild(content); + } + //todo 确认是否两个子元素的 index 相互对应 + //默认显示第一个标签对象 + this.header.firstChild.setAttribute("class", "on"); + this.content.firstChild.hidden = false; + } + + /** + * @function IndexTabsPageContainer.prototype.removeTab + * @description 删除某个标签页面。 + * @param {number} index - 标签索引号。 + */ + removeTab(index) { + this.header.removeChild(this.header.children[index]); + this.content.removeChild(this.content.children[index]); + } + + /** + * @function IndexTabsPageContainer.prototype.removeAllTabs + * @description 删除所有标签。 + */ + removeAllTabs() { + for (let i = this.header.children.length; i > 0; i--) { + this.header.removeChild(this.header.children[i]); + this.content.removeChild(this.content.children[i]); + } + } + + _changeTabsPage(e) { + const index = e.target.index; + for (let i = 0; i < this.header.children.length; i++) { + this.header.children[i].setAttribute("class", ""); + this.content.children[i].hidden = true; + if (i === index) { + this.header.children[i].setAttribute("class", "on"); + this.content.children[i].hidden = false; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/components/templates/CityTabsPage.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class CityTabsPage + * @aliasclass Components.CityTabsPage + * @deprecatedclass SuperMap.Components.CityTabsPage + * @classdesc 城市地址匹配组件模板 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Object|Array.} options.config - 城市名称配置列表,支持两种格式:{key1:{A:[],B:[]}, key2:{C:[],D:[]}} 或 + * ["成都市","北京市"],用户可根据自己的项目需求进行配置 + * @extends {IndexTabsPageContainer} + * @category Components Common + * @usage + */ +class CityTabsPage extends IndexTabsPageContainer { + constructor(options) { + super(options); + //去掉默认的边框阴影样式: + this.rootContainer.classList.add("component-citytabpage--noneBoxShadow"); + this.config = options.config; + //header,若 config为城市名称数组,则直接加载内容 + if (Util.isArray(this.config)) { + this.header.hidden = true; + this._createCityItem("城市", this.config); + this.content.style.border = "none"; + } else { + this._createTabs(); + this.header.onclick = (e) => { + //关闭所有元素 是否有更简化的写法? + for (let i = 0; i < this.header.children.length; i++) { + this.header.children[i].setAttribute("class", ""); + } + //打开点击内容元素 + e.target.setAttribute("class", "on"); + this._createCityContent(e.target.innerHTML); + }; + } + + } + + /** + * @function CityTabsPage.prototype._createTabs + * @description 创建 Tabs + * @private + */ + _createTabs() { + //header + if (Util.isArray(this.config)) { + for (let i = 0; i < this.config.length; i++) { + let innerHTML = ""; + for (const key in this.config[i]) { + innerHTML += key; + } + let li = document.createElement("li"); + li.innerHTML = innerHTML; + this.header.appendChild(li); + } + } else { + for (const key in this.config) { + let li = document.createElement("li"); + li.innerHTML = key; + this.header.appendChild(li); + } + } + this.header.firstChild.setAttribute("class", "on"); + this._createCityContent(this.header.firstChild.innerHTML); + } + + /** + * @function CityTabsPage.prototype._createCityContent + * @description 创建列表容器 + * @private + */ + _createCityContent(keyName) { + //清除元素: + for (let i = this.content.children.length; i > 0; i--) { + this.content.removeChild(this.content.children[i - 1]); + } + //创建对应元素 + const cities = this.config[keyName]; + for (let key in cities) { + this._createCityItem(key, cities[key]); + } + } + + /** + * @function CityTabsPage.prototype._createCityContent + * @description 创建列表容器 + * @private + */ + _createCityItem(key, cities) { + const city = document.createElement("div"); + + const cityClass = document.createElement("div"); + cityClass.setAttribute("class", "component-citytabpag__py-key"); + cityClass.innerHTML = key; + city.appendChild(cityClass); + + const cityContent = document.createElement("div"); + cityContent.setAttribute("class", "component-citytabpag__content"); + + for (let i = 0; i < cities.length; i++) { + let span = document.createElement("span"); + span.innerHTML = cities[i]; + cityContent.appendChild(span); + } + //HOT 元素长度单独微调: + if (key === "HOT") { + cityContent.style.width = "428px"; + } + city.appendChild(cityContent); + this.content.appendChild(city); + } + +} + +;// CONCATENATED MODULE: ./src/common/components/templates/NavTabsPage.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class NavTabsPage + * @aliasclass Components.NavTabsPage + * @deprecatedclass SuperMap.Components.NavTabsPage + * @classdesc 标签页面组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Array.} [options.tabs=[]] - 标签对象数组,形如:[{title: "",content: HTMLElement}],初始时,传入则创建页面。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ +// todo 思考拆分的控件应该以哪种方式使用 +class NavTabsPage extends TemplateBase { + constructor(options) { + super(options); + this.navTabsTitle = null; + this.navTabsContent = null; + options.tabs = options.tabs ? options.tabs : []; + this._initView(options.tabs); + } + + /** + * @override + * @private + */ + _initView(tabs) { + const navTabsPage = document.createElement("div"); + navTabsPage.setAttribute("class", "component-navtabspage"); + + //关闭按钮 + const closeBtn = document.createElement("span"); + closeBtn.setAttribute("class", "supermapol-icons-close"); + closeBtn.onclick = this.closeView.bind(this); + navTabsPage.appendChild(closeBtn); + + //标签 + const navTabsTitle = document.createElement("div"); + this.navTabsTitle = navTabsTitle; + navTabsTitle.setAttribute("class", "component-navtabspage__title"); + navTabsPage.appendChild(navTabsTitle); + + //内容 + const navTabsContent = document.createElement("div"); + this.navTabsContent = navTabsContent; + navTabsContent.setAttribute("class", "component-navtabspage__content"); + navTabsPage.appendChild(navTabsContent); + + //若 tabs 初始传入值,则 + if (tabs.length > 0) { + this.appendTabs(tabs); + } + + this.rootContainer = navTabsPage; + } + + /** + * @function NavTabsPage.prototype.setTabs + * @description 设置标签。 + * @param {Array.} tabs - 标签对象数组,形如:[{title: "",content: {}}]。 + */ + setTabs(tabs) { + this.removeAllTabs(); + this.appendTabs(tabs); + } + + /** + * @function NavTabsPage.prototype.appendTabs + * @description 添加标签页面。 + * @param {Array.} tabs - 标签对象数组,形如:[{title: "",content: {}}]。 + */ + appendTabs(tabs) { + for (let i = 0; i < tabs.length; i++) { + let title = document.createElement("span"); + title.index = i; + title.appendChild(document.createTextNode(tabs[i].title)); + //绑定标签切换对应页面: + title.onclick = this._changeTabsPage.bind(this); + let content = tabs[i].content; + content.index = i; + content.hidden = true; + + this.navTabsTitle.appendChild(title); + this.navTabsContent.appendChild(content); + } + //todo 确认是否两个子元素的 index 相互对应 + //默认显示第一个标签对象 + this.navTabsTitle.firstChild.setAttribute("class", "component-navtabspage__tabs--select"); + this.navTabsContent.firstChild.hidden = false; + } + + /** + * @function NavTabsPage.prototype.removeTab + * @description 删除某个标签页面。 + * @param {number} index - 标签索引号。 + */ + removeTab(index) { + this.navTabsTitle.removeChild(this.navTabsTitle.children[index]); + this.navTabsContent.removeChild(this.navTabsContent.children[index]); + } + + /** + * @function NavTabsPage.prototype.removeAllTabs + * @description 删除所有标签。 + */ + removeAllTabs() { + for (let i = this.navTabsTitle.children.length; i > 0; i--) { + this.navTabsTitle.removeChild(this.navTabsTitle.children[i]); + this.navTabsContent.removeChild(this.navTabsContent.children[i]); + } + } + + _changeTabsPage(e) { + const index = e.target.index; + for (let i = 0; i < this.navTabsTitle.children.length; i++) { + this.navTabsTitle.children[i].setAttribute("class", ""); + this.navTabsContent.children[i].hidden = true; + if (i === index) { + this.navTabsTitle.children[i].setAttribute("class", "component-navtabspage__tabs--select"); + this.navTabsContent.children[i].hidden = false; + } + } + } + +} + +;// CONCATENATED MODULE: ./src/common/components/templates/PaginationContainer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class PaginationContainer + * @aliasclass Components.PaginationContainer + * @deprecatedclass SuperMap.Components.PaginationContainer + * @classdesc 分页组件模板。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {HTMLElement} options.contents - 页面填充的 DOM 元素对象。 + * @param {number} options.pageCounts - 页数。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ +class PaginationContainer extends TemplateBase { + constructor(options) { + options = options ? options : {}; + super(options); + this.currentPage = 0; + this.pageNumberLis = []; + this.currentPageNumberLis = []; + this.linkageEvent = null; + + options.contents = options.contents ? options.contents : null; + options.pageCounts = options.pageCounts ? options.pageCounts : 0; + this._initView(options.contents, options.pageCounts); + } + + /** + * @function PaginationContainer.prototype.setLinkageEvent + * @description 设置页面联动方法。 + * @param {function} linkageEvent - 联动方法,实现指定功能。 + */ + setLinkageEvent(linkageEvent) { + this.linkageEvent = linkageEvent; + } + + /** + * @private + * @override + */ + _initView(contents, pageCounts) { + const container = document.createElement("div"); + container.setAttribute("class", "component-pagination"); + + //content + const content = document.createElement("div"); + content.setAttribute("class", "component-pagination__content"); + container.appendChild(content); + this.content = content; + + //link + const link = document.createElement("ul"); + link.setAttribute("class", "component-pagination__link"); + link.onclick = this._changePageEvent.bind(this); + container.appendChild(link); + this._createLink(link); + this.link = link; + //填充内容: + if (contents) { + this.setContent(contents); + } + if (pageCounts !== 0) { + this.setPageLink(pageCounts); + } + this.rootContainer = container; + } + + /**---------以下是页面相关操作 **/ + /** + * @function PaginationContainer.prototype.setContent + * @description 设置页面内容。 + * @param {HTMLElement} element - 页面内容元素。 + */ + setContent(element) { + this.clearContent(); + this.appendContent(element); + } + + /** + * @function PaginationContainer.prototype.appendContent + * @description 追加内容。 + * @param {HTMLElement} element - 页面内容元素。 + */ + appendContent(element) { + this.content.appendChild(element); + } + + /** + * @function PaginationContainer.prototype.clearContent + * @description 清空内容元素。 + */ + clearContent() { + for (let i = this.content.children.length - 1; i >= 0; i--) { + this.content.removeChild(this.content.children[i]); + } + } + + /** -----以下是页码相关的操作:**/ + /** + * @function PaginationContainer.prototype.setPageLink + * @description 设置页码数。 + * @param {number} pageNumber - 页码数。 + */ + setPageLink(pageNumber) { + //清空当前页码 + this.pageNumberLis = []; + this.currentPageNumberLis = []; + this.clearPageLink(); + + //创建页码 + this._createPageLi(pageNumber); + //添加页码到页码列表 + this._appendPageLink(); + } + + /** + * @description 创建页码。 + * @param pageNumber + * @private + */ + _createPageLi(pageNumber) { + for (let i = 0; i < pageNumber; i++) { + const pageLi = document.createElement("li"); + pageLi.innerHTML = i + 1; + /*const liContent = document.createElement("span"); + liContent.innerHTML = i + 1;*/ + // pageLi.appendChild(liContent); + this.pageNumberLis.push(pageLi); + } + this.pageNumberLis[0].setAttribute("class", "active"); + this.currentPage = 1; + if (pageNumber < 5) { + this.currentPageNumberLis = this.pageNumberLis; + } else { + for (let i = 0; i < 5; i++) { + this.currentPageNumberLis.push(this.pageNumberLis[i]); + } + } + } + + /** + * @description 添加页码到页码列表。 + * @private + */ + _appendPageLink() { + //todo 如何插入中间 + for (let i = 0; i < this.currentPageNumberLis.length; i++) { + this.link.insertBefore(this.currentPageNumberLis[i], this.link.childNodes[this.link.children.length - 2]); + } + + for (let i = 0; i < this.currentPageNumberLis.length; i++) { + //清空 active 状态 + this.currentPageNumberLis[i].setAttribute("class", ""); + //给当前选中的 li 赋值 active 状态 + if (Number(this.currentPageNumberLis[i].innerHTML) === this.currentPage) { + this.currentPageNumberLis[i].setAttribute("class", "active"); + } + } + + //根据 currentPage 改变按钮状态 + this._changeDisableState(); + + if (this.linkageEvent) { + this.linkageEvent(this.currentPage); + } + + } + + /** + * @function PaginationContainer.prototype.clearPageLink + * @description 清除页码列表。 + */ + clearPageLink() { + for (let i = this.link.children.length - 3; i > 1; i--) { + this.link.removeChild(this.link.children[i]); + } + } + + /** + * @description 创建页码按钮。 + * @param ul + * @private + */ + _createLink(ul) { + for (let i = 0; i < 4; i++) { + const li = document.createElement("li"); + li.setAttribute("class", "disable"); + const liContent = document.createElement("span"); + li.appendChild(liContent); + if (i === 0) { + liContent.id = "first"; + liContent.setAttribute("class", "supermapol-icons-first"); + } else if (i === 1) { + liContent.id = "prev"; + liContent.setAttribute("class", "supermapol-icons-prev"); + } else if (i === 2) { + liContent.id = "next"; + liContent.setAttribute("class", "supermapol-icons-next"); + } else if (i === 3) { + liContent.id = "last"; + liContent.setAttribute("class", "supermapol-icons-last"); + } + + ul.appendChild(li); + } + } + + /** + * @description 点击页码事件。 + * @param e + * @private + */ + _changePageEvent(e) { + //todo + const trigger = e.target; + //若列表禁用,点击无效 + if (trigger.parentElement.classList[0] === "disable") { + return; + } + let targetLi; + if (trigger.id) { + targetLi = trigger.id; + } else if (Number(trigger.innerHTML)) { + targetLi = Number(trigger.innerHTML); + } else { + return; + } + + //页码预处理: + this._prePageNum(targetLi); + + + //根据 currentPageNumberLis 创建页码列表 + this.clearPageLink(); + this._appendPageLink(); + } + + /** + * @description 根据 currentPage 改变按钮状态。 + * @private + */ + _changeDisableState() { + this.link.children[0].setAttribute("class", ""); + this.link.children[1].setAttribute("class", ""); + this.link.children[this.link.children.length - 1].setAttribute("class", ""); + this.link.children[this.link.children.length - 2].setAttribute("class", ""); + + if (this.currentPage === 1) { + this.link.children[0].setAttribute("class", "disable"); + this.link.children[1].setAttribute("class", "disable"); + } + if (this.currentPage === this.pageNumberLis.length) { + this.link.children[this.link.children.length - 1].setAttribute("class", "disable"); + this.link.children[this.link.children.length - 2].setAttribute("class", "disable"); + } + + } + + /** + * @description 根据点击页码列表事件准备需展现的页码列表。 + * @param {string|number} targetLi - 被点击的列表对象 id 或 被点击的页码值。 + * @private + */ + _prePageNum(targetLi) { + const currentPageNumberLis = []; + if (targetLi === "first") { + this.currentPage = 1; + } else if (targetLi === "last") { + this.currentPage = this.pageNumberLis.length; + } else if (targetLi === "prev") { + this.currentPage = this.currentPage - 1; + + } else if (targetLi === "next") { + this.currentPage = this.currentPage + 1; + } else { + this.currentPage = targetLi; + } + + if (this.pageNumberLis.length <= 5) { + for (let i = 0; i < this.pageNumberLis.length; i++) { + currentPageNumberLis.push(this.pageNumberLis[i]); + } + } else { + //当前点击前三,都取前五 + if (this.currentPage <= 3) { + for (let i = 0; i < 5; i++) { + currentPageNumberLis.push(this.pageNumberLis[i]); + } + } else if (this.currentPage >= this.pageNumberLis.length - 3) { + //点击后三,都取后5 + for (let i = this.pageNumberLis.length - 5; i < this.pageNumberLis.length; i++) { + currentPageNumberLis.push(this.pageNumberLis[i]); + } + } else { + //其他,取中间: + for (let i = this.currentPage - 3; i <= this.currentPage + 1; i++) { + currentPageNumberLis.push(this.pageNumberLis[i]); + } + } + + } + if (currentPageNumberLis.length > 0) { + this.currentPageNumberLis = currentPageNumberLis; + } + } + +} + +;// CONCATENATED MODULE: ./src/common/components/util/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @name ComponentsUtil + * @namespace + * @category BaseTypes Util + * @description 获取文件类型工具类。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ComponentsUtil } from '{npm}'; + * + * const result = ComponentsUtil.getFileType(fileName); + * ``` + */ +let ComponentsUtil = { + /** + * @function ComponentsUtil.getFileType + * @description 获取上传文件类型。 + * @param {string} fileName - 文件名称。 + */ + getFileType(fileName) { + let regCSV = /^.*\.(?:csv)$/i; + let regExcel = /^.*\.(?:xls|xlsx)$/i; //文件名可以带空格 + let regGeojson = /^.*\.(?:geojson|json)$/i; + if (regExcel.test(fileName)) { //校验不通过 + return FileTypes.EXCEL; + } else if (regCSV.test(fileName)) { + return FileTypes.CSV; + } else if (regGeojson.test(fileName)) { + return FileTypes.GEOJSON; + } + return null; + } + +}; + +;// CONCATENATED MODULE: ./src/common/components/util/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +;// CONCATENATED MODULE: ./src/common/components/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +//数据 + +//组件 + +//提示框组件 + +//图表组件 + + +//公用模板: + + + + + + + + + + + +//工具类 + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/lang/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +;// CONCATENATED MODULE: ./src/common/index.common.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/index.all.js + + + + + + + + +;// CONCATENATED MODULE: ./src/common/namespace.js +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +// Lang +SuperMap.Lang = Lang; +SuperMap.i18n = SuperMap.Lang.i18n; +// CommonUtil +SuperMap.Util = { ...SuperMap.Util, ...Util }; +SuperMap.Browser = Browser; +SuperMap.INCHES_PER_UNIT = INCHES_PER_UNIT; +SuperMap.METERS_PER_INCH = METERS_PER_INCH; +SuperMap.DOTS_PER_INCH = DOTS_PER_INCH; +SuperMap.IS_GECKO = IS_GECKO; + +// FetchRequest +SuperMap.setCORS = setCORS; +SuperMap.isCORS = isCORS; +SuperMap.setRequestTimeout = setRequestTimeout; +SuperMap.getRequestTimeout = getRequestTimeout; +SuperMap.FetchRequest = FetchRequest; + +// commontypes +SuperMap.inherit = inheritExt; +SuperMap.mixin = mixinExt; +SuperMap.String = StringExt; +SuperMap.Number = NumberExt; +SuperMap.Function = FunctionExt; +SuperMap.Array = ArrayExt; +SuperMap.Date = DateExt; +SuperMap.Event = Event; +SuperMap.Bounds = Bounds; +SuperMap.Credential = Credential; +SuperMap.Events = Events; +SuperMap.Feature = Feature; +SuperMap.Geometry = Geometry; +SuperMap.Pixel = Pixel; +SuperMap.Size = Size; +SuperMap.Feature.Vector = Vector; +SuperMap.Geometry.Collection = Collection; +SuperMap.Geometry.Curve = Curve; +SuperMap.Geometry.GeoText = GeoText; +SuperMap.Geometry.LinearRing = LinearRing; +SuperMap.Geometry.LineString = LineString; +SuperMap.Geometry.MultiLineString = MultiLineString; +SuperMap.Geometry.MultiPoint = MultiPoint; +SuperMap.Geometry.MultiPolygon = MultiPolygon; +SuperMap.Geometry.Point = Point; +SuperMap.Geometry.Polygon = Polygon; +SuperMap.Geometry.Rectangle = Rectangle; +// Components +SuperMap.Components.Chart = ChartView; +SuperMap.Components.ChartViewModel = ChartViewModel; +SuperMap.Components.MessageBox = MessageBox; +SuperMap.Components.AttributesPopContainer = AttributesPopContainer; +SuperMap.Components.CityTabsPage = CityTabsPage; +SuperMap.Components.CommonContainer = CommonContainer; +SuperMap.Components.DropDownBox = DropDownBox; +SuperMap.Components.IndexTabsPageContainer = IndexTabsPageContainer; +SuperMap.Components.NavTabsPage = NavTabsPage; +SuperMap.Components.PaginationContainer = PaginationContainer; +SuperMap.Components.PopContainer = PopContainer; +SuperMap.Components.Select = Select; +SuperMap.Components.TemplateBase = TemplateBase; +SuperMap.Components.FileReaderUtil = FileReaderUtil; +// control +SuperMap.TimeControlBase = TimeControlBase; +SuperMap.TimeFlowControl = TimeFlowControl; +// Format +SuperMap.Format = SuperMap.Format || Format; +SuperMap.Format.GeoJSON = GeoJSON; +SuperMap.Format.JSON = JSONFormat; +SuperMap.Format.WKT = WKT; +// iManager +SuperMap.iManager = IManager; +SuperMap.iManagerCreateNodeParam = IManagerCreateNodeParam; +SuperMap.iManagerServiceBase = IManagerServiceBase; +// iPortal +SuperMap.iPortal = IPortal; +SuperMap.iPortalAddDataParam = IPortalAddDataParam; +SuperMap.iPortalAddResourceParam = IPortalAddResourceParam; +SuperMap.iPortalDataConnectionInfoParam = IPortalDataConnectionInfoParam; +SuperMap.iPortalDataMetaInfoParam = IPortalDataMetaInfoParam; +SuperMap.iPortalDataStoreInfoParam = IPortalDataStoreInfoParam; +SuperMap.iPortalQueryParam = IPortalQueryParam; +SuperMap.iPortalQueryResult = IPortalQueryResult; +SuperMap.iPortalRegisterServiceParam = IPortalRegisterServiceParam; +SuperMap.iPortalResource = IPortalResource; +SuperMap.iPortalServiceBase = IPortalServiceBase; +SuperMap.iPortalShareEntity = IPortalShareEntity; +SuperMap.iPortalShareParam = IPortalShareParam; +SuperMap.iPortalUser = IPortalUser; +// iServer +SuperMap.AddressMatchService = AddressMatchService; +SuperMap.AggregationParameter = AggregationParameter; +SuperMap.AreaSolarRadiationParameters = AreaSolarRadiationParameters; +SuperMap.AreaSolarRadiationService = AreaSolarRadiationService; +SuperMap.BucketAggParameter = BucketAggParameter; +SuperMap.BufferAnalystParameters = BufferAnalystParameters; +SuperMap.BufferAnalystService = BufferAnalystService; +SuperMap.BufferDistance = BufferDistance; +SuperMap.BuffersAnalystJobsParameter = BuffersAnalystJobsParameter; +SuperMap.BuffersAnalystJobsService = BuffersAnalystJobsService; +SuperMap.BufferSetting = BufferSetting; +SuperMap.BurstPipelineAnalystParameters = BurstPipelineAnalystParameters; +SuperMap.BurstPipelineAnalystService = BurstPipelineAnalystService; +SuperMap.ChartFeatureInfoSpecsService = ChartFeatureInfoSpecsService; +SuperMap.ChartQueryFilterParameter = ChartQueryFilterParameter; +SuperMap.ChartQueryParameters = ChartQueryParameters; +SuperMap.ChartQueryService = ChartQueryService; +SuperMap.ClipParameter = ClipParameter; +SuperMap.ColorDictionary = ColorDictionary; +SuperMap.CommonServiceBase = CommonServiceBase; +SuperMap.ComputeWeightMatrixParameters = ComputeWeightMatrixParameters; +SuperMap.ComputeWeightMatrixService = ComputeWeightMatrixService; +SuperMap.CreateDatasetParameters = CreateDatasetParameters; +SuperMap.DataFlowService = DataFlowService; +SuperMap.DataReturnOption = DataReturnOption; +SuperMap.DatasetBufferAnalystParameters = DatasetBufferAnalystParameters; +SuperMap.DatasetInfo = DatasetInfo; +SuperMap.DatasetOverlayAnalystParameters = DatasetOverlayAnalystParameters; +SuperMap.DatasetService = DatasetService; +SuperMap.DatasetSurfaceAnalystParameters = DatasetSurfaceAnalystParameters; +SuperMap.DatasetThiessenAnalystParameters = DatasetThiessenAnalystParameters; +SuperMap.DatasourceConnectionInfo = DatasourceConnectionInfo; +SuperMap.DatasourceService = DatasourceService; +SuperMap.DensityAnalystService = DensityAnalystService; +SuperMap.DensityKernelAnalystParameters = DensityKernelAnalystParameters; +SuperMap.EditFeaturesParameters = EditFeaturesParameters; +SuperMap.EditFeaturesService = EditFeaturesService; +SuperMap.FacilityAnalyst3DParameters = FacilityAnalyst3DParameters; +SuperMap.FacilityAnalystSinks3DParameters = FacilityAnalystSinks3DParameters; +SuperMap.FacilityAnalystSinks3DService = FacilityAnalystSinks3DService; +SuperMap.FacilityAnalystSources3DParameters = FacilityAnalystSources3DParameters; +SuperMap.FacilityAnalystSources3DService = FacilityAnalystSources3DService; +SuperMap.FacilityAnalystStreamParameters = FacilityAnalystStreamParameters; +SuperMap.FacilityAnalystStreamService = FacilityAnalystStreamService; +SuperMap.FacilityAnalystTracedown3DParameters = FacilityAnalystTracedown3DParameters; +SuperMap.FacilityAnalystTracedown3DService = FacilityAnalystTracedown3DService; +SuperMap.FacilityAnalystTraceup3DParameters = FacilityAnalystTraceup3DParameters; +SuperMap.FacilityAnalystTraceup3DService = FacilityAnalystTraceup3DService; +SuperMap.FacilityAnalystUpstream3DParameters = FacilityAnalystUpstream3DParameters; +SuperMap.FacilityAnalystUpstream3DService = FacilityAnalystUpstream3DService; +SuperMap.FieldParameters = FieldParameters; +SuperMap.FieldsFilter = FieldsFilter; +SuperMap.FieldStatisticService = FieldStatisticService; +SuperMap.FieldStatisticsParameters = FieldStatisticsParameters; +SuperMap.FilterParameter = FilterParameter; +SuperMap.FindClosestFacilitiesParameters = FindClosestFacilitiesParameters; +SuperMap.FindClosestFacilitiesService = FindClosestFacilitiesService; +SuperMap.FindLocationParameters = FindLocationParameters; +SuperMap.FindLocationService = FindLocationService; +SuperMap.FindMTSPPathsParameters = FindMTSPPathsParameters; +SuperMap.FindMTSPPathsService = FindMTSPPathsService; +SuperMap.FindPathParameters = FindPathParameters; +SuperMap.FindPathService = FindPathService; +SuperMap.FindServiceAreasParameters = FindServiceAreasParameters; +SuperMap.FindServiceAreasService = FindServiceAreasService; +SuperMap.FindTSPPathsParameters = FindTSPPathsParameters; +SuperMap.FindTSPPathsService = FindTSPPathsService; +SuperMap.GenerateSpatialDataParameters = GenerateSpatialDataParameters; +SuperMap.GenerateSpatialDataService = GenerateSpatialDataService; +SuperMap.GeoCodingParameter = GeoCodingParameter; +SuperMap.GeoDecodingParameter = GeoDecodingParameter; +SuperMap.GeoHashGridAggParameter = GeoHashGridAggParameter; +SuperMap.GeometryBatchAnalystService = GeometryBatchAnalystService; +SuperMap.GeometryBufferAnalystParameters = GeometryBufferAnalystParameters; +SuperMap.GeometryOverlayAnalystParameters = GeometryOverlayAnalystParameters; +SuperMap.GeometrySurfaceAnalystParameters = GeometrySurfaceAnalystParameters; +SuperMap.GeometryThiessenAnalystParameters = GeometryThiessenAnalystParameters; +SuperMap.GeoprocessingService = GeoprocessingService; +SuperMap.GeoRelationAnalystParameters = GeoRelationAnalystParameters; +SuperMap.GeoRelationAnalystService = GeoRelationAnalystService; +SuperMap.GetFeaturesByBoundsParameters = GetFeaturesByBoundsParameters; +SuperMap.GetFeaturesByBoundsService = GetFeaturesByBoundsService; +SuperMap.GetFeaturesByBufferParameters = GetFeaturesByBufferParameters; +SuperMap.GetFeaturesByBufferService = GetFeaturesByBufferService; +SuperMap.GetFeaturesByGeometryParameters = GetFeaturesByGeometryParameters; +SuperMap.GetFeaturesByGeometryService = GetFeaturesByGeometryService; +SuperMap.GetFeaturesByIDsParameters = GetFeaturesByIDsParameters; +SuperMap.GetFeaturesByIDsService = GetFeaturesByIDsService; +SuperMap.GetFeaturesBySQLParameters = GetFeaturesBySQLParameters; +SuperMap.GetFeaturesBySQLService = GetFeaturesBySQLService; +SuperMap.GetFeaturesParametersBase = GetFeaturesParametersBase; +SuperMap.GetFeaturesServiceBase = GetFeaturesServiceBase; +SuperMap.GetFieldsService = GetFieldsService; +SuperMap.GetGridCellInfosParameters = GetGridCellInfosParameters; +SuperMap.GetGridCellInfosService = GetGridCellInfosService; +SuperMap.GetLayersInfoService = GetLayersInfoService; +SuperMap.Grid = Grid; +SuperMap.HillshadeParameter = HillshadeParameter; +SuperMap.Image = UGCImage; +SuperMap.ImageCollectionService = ImageCollectionService_ImageCollectionService; +SuperMap.ImageGFAspect = ImageGFAspect; +SuperMap.ImageGFHillShade = ImageGFHillShade; +SuperMap.ImageGFOrtho = ImageGFOrtho; +SuperMap.ImageGFSlope = ImageGFSlope; +SuperMap.ImageRenderingRule = ImageRenderingRule; +SuperMap.ImageSearchParameter = ImageSearchParameter; +SuperMap.ImageService = ImageService_ImageService; +SuperMap.ImageStretchOption = ImageStretchOption; +SuperMap.InterpolationAnalystParameters = InterpolationAnalystParameters; +SuperMap.InterpolationAnalystService = InterpolationAnalystService; +SuperMap.InterpolationDensityAnalystParameters = InterpolationDensityAnalystParameters; +SuperMap.InterpolationIDWAnalystParameters = InterpolationIDWAnalystParameters; +SuperMap.InterpolationKrigingAnalystParameters = InterpolationKrigingAnalystParameters; +SuperMap.InterpolationRBFAnalystParameters = InterpolationRBFAnalystParameters; +SuperMap.JoinItem = JoinItem; +SuperMap.KernelDensityJobParameter = KernelDensityJobParameter; +SuperMap.KernelDensityJobsService = KernelDensityJobsService; +SuperMap.LabelImageCell = LabelImageCell; +SuperMap.LabelMatrixCell = LabelMatrixCell; +SuperMap.LabelMixedTextStyle = LabelMixedTextStyle; +SuperMap.LabelSymbolCell = LabelSymbolCell; +SuperMap.LabelThemeCell = LabelThemeCell; +SuperMap.LayerStatus = LayerStatus; +SuperMap.LinkItem = LinkItem; +SuperMap.MappingParameters = MappingParameters; +SuperMap.MapService = MapService; +SuperMap.MathExpressionAnalysisParameters = MathExpressionAnalysisParameters; +SuperMap.MathExpressionAnalysisService = MathExpressionAnalysisService; +SuperMap.MeasureParameters = MeasureParameters; +SuperMap.MeasureService = MeasureService; +SuperMap.MetricsAggParameter = MetricsAggParameter; +SuperMap.NDVIParameter = NDVIParameter; +SuperMap.NetworkAnalystServiceBase = NetworkAnalystServiceBase; +SuperMap.OutputSetting = OutputSetting; +SuperMap.OverlapDisplayedOptions = OverlapDisplayedOptions; +SuperMap.OverlayAnalystParameters = OverlayAnalystParameters; +SuperMap.OverlayAnalystService = OverlayAnalystService; +SuperMap.OverlayGeoJobParameter = OverlayGeoJobParameter; +SuperMap.OverlayGeoJobsService = OverlayGeoJobsService; +SuperMap.PointWithMeasure = PointWithMeasure; +SuperMap.ProcessingServiceBase = ProcessingServiceBase; +SuperMap.QueryByBoundsParameters = QueryByBoundsParameters; +SuperMap.QueryByBoundsService = QueryByBoundsService; +SuperMap.QueryByDistanceParameters = QueryByDistanceParameters; +SuperMap.QueryByDistanceService = QueryByDistanceService; +SuperMap.QueryByGeometryParameters = QueryByGeometryParameters; +SuperMap.QueryByGeometryService = QueryByGeometryService; +SuperMap.QueryBySQLParameters = QueryBySQLParameters; +SuperMap.QueryBySQLService = QueryBySQLService; +SuperMap.QueryParameters = QueryParameters; +SuperMap.QueryService = QueryService; +SuperMap.RasterFunctionParameter = RasterFunctionParameter; +SuperMap.Route = Route; +SuperMap.RouteCalculateMeasureParameters = RouteCalculateMeasureParameters; +SuperMap.RouteCalculateMeasureService = RouteCalculateMeasureService; +SuperMap.RouteLocatorParameters = RouteLocatorParameters; +SuperMap.RouteLocatorService = RouteLocatorService; +SuperMap.ServerColor = ServerColor; +SuperMap.ServerFeature = ServerFeature; +SuperMap.ServerGeometry = ServerGeometry; +SuperMap.ServerStyle = ServerStyle; +SuperMap.ServerTextStyle = ServerTextStyle; +SuperMap.ServerTheme = ServerTheme; +SuperMap.SetDatasourceParameters = SetDatasourceParameters; +SuperMap.SetLayerInfoParameters = SetLayerInfoParameters; +SuperMap.SetLayerInfoService = SetLayerInfoService; +SuperMap.SetLayersInfoParameters = SetLayersInfoParameters; +SuperMap.SetLayersInfoService = SetLayersInfoService; +SuperMap.SetLayerStatusParameters = SetLayerStatusParameters; +SuperMap.SetLayerStatusService = SetLayerStatusService; +SuperMap.SingleObjectQueryJobsParameter = SingleObjectQueryJobsParameter; +SuperMap.SingleObjectQueryJobsService = SingleObjectQueryJobsService; +SuperMap.Sortby = Sortby; +SuperMap.SpatialAnalystBase = SpatialAnalystBase; +SuperMap.StopQueryParameters = StopQueryParameters; +SuperMap.StopQueryService = StopQueryService; +SuperMap.SummaryAttributesJobsParameter = SummaryAttributesJobsParameter; +SuperMap.SummaryAttributesJobsService = SummaryAttributesJobsService; +SuperMap.SummaryMeshJobParameter = SummaryMeshJobParameter; +SuperMap.SummaryMeshJobsService = SummaryMeshJobsService; +SuperMap.SummaryRegionJobParameter = SummaryRegionJobParameter; +SuperMap.SummaryRegionJobsService = SummaryRegionJobsService; +SuperMap.SupplyCenter = SupplyCenter; +SuperMap.SurfaceAnalystParameters = SurfaceAnalystParameters; +SuperMap.SurfaceAnalystParametersSetting = SurfaceAnalystParametersSetting; +SuperMap.SurfaceAnalystService = SurfaceAnalystService; +SuperMap.TerrainCurvatureCalculationParameters = TerrainCurvatureCalculationParameters; +SuperMap.TerrainCurvatureCalculationService = TerrainCurvatureCalculationService; +SuperMap.Theme = Theme; +SuperMap.ThemeDotDensity = ThemeDotDensity; +SuperMap.ThemeFlow = ThemeFlow; +SuperMap.ThemeGraduatedSymbol = ThemeGraduatedSymbol; +SuperMap.ThemeGraduatedSymbolStyle = ThemeGraduatedSymbolStyle; +SuperMap.ThemeGraph = ThemeGraph; +SuperMap.ThemeGraphAxes = ThemeGraphAxes; +SuperMap.ThemeGraphItem = ThemeGraphItem; +SuperMap.ThemeGraphSize = ThemeGraphSize; +SuperMap.ThemeGraphText = ThemeGraphText; +SuperMap.ThemeGridRange = ThemeGridRange; +SuperMap.ThemeGridRangeItem = ThemeGridRangeItem; +SuperMap.ThemeGridUnique = ThemeGridUnique; +SuperMap.ThemeGridUniqueItem = ThemeGridUniqueItem; +SuperMap.ThemeLabel = ThemeLabel; +SuperMap.ThemeLabelAlongLine = ThemeLabelAlongLine; +SuperMap.ThemeLabelBackground = ThemeLabelBackground; +SuperMap.ThemeLabelItem = ThemeLabelItem; +SuperMap.ThemeLabelText = ThemeLabelText; +SuperMap.ThemeLabelUniqueItem = ThemeLabelUniqueItem; +SuperMap.ThemeMemoryData = ThemeMemoryData; +SuperMap.ThemeOffset = ThemeOffset; +SuperMap.ThemeParameters = ThemeParameters; +SuperMap.ThemeRange = ThemeRange; +SuperMap.ThemeRangeItem = ThemeRangeItem; +SuperMap.ThemeService = ThemeService; +SuperMap.ThemeUnique = ThemeUnique; +SuperMap.ThemeUniqueItem = ThemeUniqueItem; +SuperMap.ThiessenAnalystParameters = ThiessenAnalystParameters; +SuperMap.ThiessenAnalystService = ThiessenAnalystService; +SuperMap.TilesetsService = TilesetsService; +SuperMap.TopologyValidatorJobsParameter = TopologyValidatorJobsParameter; +SuperMap.TopologyValidatorJobsService = TopologyValidatorJobsService; +SuperMap.TransferLine = TransferLine; +SuperMap.TransferPathParameters = TransferPathParameters; +SuperMap.TransferPathService = TransferPathService; +SuperMap.TransferSolutionParameters = TransferSolutionParameters; +SuperMap.TransferSolutionService = TransferSolutionService; +SuperMap.TransportationAnalystParameter = TransportationAnalystParameter; +SuperMap.TransportationAnalystResultSetting = TransportationAnalystResultSetting; +SuperMap.UGCLayer = UGCLayer; +SuperMap.UGCMapLayer = UGCMapLayer; +SuperMap.UGCSubLayer = UGCSubLayer; +SuperMap.UpdateDatasetParameters = UpdateDatasetParameters; +SuperMap.UpdateEdgeWeightParameters = UpdateEdgeWeightParameters; +SuperMap.UpdateEdgeWeightService = UpdateEdgeWeightService; +SuperMap.UpdateTurnNodeWeightParameters = UpdateTurnNodeWeightParameters; +SuperMap.UpdateTurnNodeWeightService = UpdateTurnNodeWeightService; +SuperMap.Vector = Vector_Vector; +SuperMap.VectorClipJobsParameter = VectorClipJobsParameter; +SuperMap.VectorClipJobsService = VectorClipJobsService; +SuperMap.WebPrintingJobContent = WebPrintingJobContent; +SuperMap.WebPrintingJobCustomItems = WebPrintingJobCustomItems; +SuperMap.WebPrintingJobExportOptions = WebPrintingJobExportOptions; +SuperMap.WebPrintingJobImage = WebPrintingJobImage; +SuperMap.WebPrintingJobLayers = WebPrintingJobLayers; +SuperMap.WebPrintingJobLayoutOptions = WebPrintingJobLayoutOptions; +SuperMap.WebPrintingJobLegendOptions = WebPrintingJobLegendOptions; +SuperMap.WebPrintingJobLittleMapOptions = WebPrintingJobLittleMapOptions; +SuperMap.WebPrintingJobNorthArrowOptions = WebPrintingJobNorthArrowOptions; +SuperMap.WebPrintingJobParameters = WebPrintingJobParameters; +SuperMap.WebPrintingJobScaleBarOptions = WebPrintingJobScaleBarOptions; +SuperMap.WebPrintingService = WebPrintingService; +//Online +SuperMap.Online = Online; +SuperMap.OnlineData = OnlineData; +SuperMap.OnlineQueryDatasParameter = OnlineQueryDatasParameter; +SuperMap.ServiceStatus = ServiceStatus; +// 包含online中的DataItemType数据类型 +SuperMap.DataItemType = DataItemType; +SuperMap.DataItemOrderBy = DataItemOrderBy; +SuperMap.FilterField = FilterField; +SuperMap.OnlineServiceBase = OnlineServiceBase; +// overlay +SuperMap.Feature = SuperMap.Feature || {}; +SuperMap.Feature.Theme = Theme_Theme; +SuperMap.Feature.Theme.Bar = Bar; +SuperMap.Feature.Theme.Bar3D = Bar3D; +SuperMap.Feature.Theme.Circle = Circle; +SuperMap.Feature.Theme.Graph = Graph; +SuperMap.Feature.Theme.Line = Line; +SuperMap.Feature.Theme.Pie = Pie; +SuperMap.Feature.Theme.Point = overlay_Point_Point; +SuperMap.Feature.Theme.RankSymbol = RankSymbol; +SuperMap.Feature.Theme.Ring = Ring; +SuperMap.Feature.Theme.ThemeVector = ThemeVector; +SuperMap.Feature.ShapeParameters = ShapeParameters; +SuperMap.Feature.ShapeParameters.Circle = Circle_Circle; +SuperMap.Feature.ShapeParameters.Image = Image_Image; +SuperMap.Feature.ShapeParameters.Label = Label; +SuperMap.Feature.ShapeParameters.Line = Line_Line; +SuperMap.Feature.ShapeParameters.Point = Point_Point; +SuperMap.Feature.ShapeParameters.Polygon = Polygon_Polygon; +SuperMap.Feature.ShapeParameters.Rectangle = Rectangle_Rectangle; +SuperMap.Feature.ShapeParameters.Sector = Sector; +SuperMap.Feature.ShapeFactory = ShapeFactory; +// LevelRenderer +SuperMap.LevelRenderer = LevelRenderer; + +// security +SuperMap.KeyServiceParameter = KeyServiceParameter; +SuperMap.SecurityManager = SecurityManager; +SuperMap.ServerInfo = ServerInfo; +SuperMap.TokenServiceParameter = TokenServiceParameter; +// style +SuperMap.ThemeStyle = ThemeStyle; +SuperMap.CartoCSS = CartoCSS; +// thirdparty +// SuperMap.BinaryClassification = BinaryClassification; +// SuperMap.LandcoverClassification = LandcoverClassification; +// SuperMap.ObjectDetection = ObjectDetection; +// SuperMap.WebMachineLearning = WebMachineLearning; +SuperMap.ElasticSearch = ElasticSearch; +// util +SuperMap.ArrayStatistic = ArrayStatistic; +SuperMap.ColorsPickerUtil = ColorsPickerUtil; + +// REST +SuperMap.DataFormat = DataFormat; +SuperMap.ServerType = ServerType; +SuperMap.GeometryType = GeometryType; +SuperMap.QueryOption = QueryOption; +SuperMap.JoinType = JoinType; +SuperMap.SpatialQueryMode = SpatialQueryMode; +SuperMap.SpatialRelationType = SpatialRelationType; +SuperMap.MeasureMode = MeasureMode; +SuperMap.Unit = Unit; +SuperMap.BufferRadiusUnit = BufferRadiusUnit; +SuperMap.EngineType = EngineType; +SuperMap.ThemeGraphTextFormat = ThemeGraphTextFormat; +SuperMap.ThemeGraphType = ThemeGraphType; +SuperMap.GraphAxesTextDisplayMode = GraphAxesTextDisplayMode; +SuperMap.GraduatedMode = GraduatedMode; +SuperMap.RangeMode = RangeMode; +SuperMap.ThemeType = ThemeType; +SuperMap.ColorGradientType = ColorGradientType; +SuperMap.TextAlignment = TextAlignment; +SuperMap.FillGradientMode = FillGradientMode; +SuperMap.AlongLineDirection = AlongLineDirection; +SuperMap.LabelBackShape = LabelBackShape; +SuperMap.LabelOverLengthMode = LabelOverLengthMode; +SuperMap.DirectionType = DirectionType; +SuperMap.OverlayOperationType = OverlayOperationType; +SuperMap.OutputType = OutputType; +SuperMap.SideType = SideType; +SuperMap.SupplyCenterType = SupplyCenterType; +SuperMap.TurnType = TurnType; +SuperMap.BufferEndType = BufferEndType; +SuperMap.SmoothMethod = SmoothMethod; +SuperMap.SurfaceAnalystMethod = SurfaceAnalystMethod; +SuperMap.DataReturnMode = DataReturnMode; +SuperMap.EditType = EditType; +SuperMap.TransferTactic = TransferTactic; +SuperMap.TransferPreference = TransferPreference; +SuperMap.GridType = GridType; +SuperMap.ColorSpaceType = ColorSpaceType; +SuperMap.LayerType = LayerType; +SuperMap.UGCLayerType = UGCLayerType; +SuperMap.StatisticMode = StatisticMode; +SuperMap.PixelFormat = PixelFormat; +SuperMap.SearchMode = SearchMode; +SuperMap.InterpolationAlgorithmType = InterpolationAlgorithmType; +SuperMap.VariogramMode = VariogramMode; +SuperMap.Exponent = Exponent; +SuperMap.ClientType = ClientType; +SuperMap.ChartType = ChartType; +SuperMap.ClipAnalystMode = ClipAnalystMode; +SuperMap.AnalystAreaUnit = AnalystAreaUnit; +SuperMap.AnalystSizeUnit = AnalystSizeUnit; +SuperMap.StatisticAnalystMode = StatisticAnalystMode; +SuperMap.SummaryType = SummaryType; +SuperMap.TopologyValidatorRule = TopologyValidatorRule; +SuperMap.BucketAggType = BucketAggType; +SuperMap.MetricsAggType = MetricsAggType; +SuperMap.GetFeatureMode = GetFeatureMode; +SuperMap.RasterFunctionType = RasterFunctionType; +SuperMap.ResourceType = ResourceType; +SuperMap.OrderBy = OrderBy; +SuperMap.OrderType = OrderType; +SuperMap.SearchType = SearchType; +SuperMap.AggregationTypes = AggregationTypes; +SuperMap.PermissionType = PermissionType; +SuperMap.EntityType = EntityType; +SuperMap.WebExportFormatType = WebExportFormatType; +SuperMap.WebScaleOrientationType = WebScaleOrientationType; +SuperMap.WebScaleType = WebScaleType; +SuperMap.WebScaleUnit = WebScaleUnit; + + +;// CONCATENATED MODULE: external "L" +const external_L_namespaceObject = L; +var external_L_default = /*#__PURE__*/__webpack_require__.n(external_L_namespaceObject); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/global.js +/* harmony default export */ function global(defs) { + defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); + defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); + defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"); + + defs.WGS84 = defs['EPSG:4326']; + defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 + defs.GOOGLE = defs['EPSG:3857']; + defs['EPSG:900913'] = defs['EPSG:3857']; + defs['EPSG:102113'] = defs['EPSG:3857']; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/values.js +var PJD_3PARAM = 1; +var PJD_7PARAM = 2; +var PJD_GRIDSHIFT = 3; +var PJD_WGS84 = 4; // WGS84 or equivalent +var PJD_NODATUM = 5; // WGS84 or equivalent +var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms +var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms +var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms +var SEC_TO_RAD = 4.84813681109535993589914102357e-6; +var HALF_PI = Math.PI/2; +// ellipoid pj_set_ell.c +var SIXTH = 0.1666666666666666667; +/* 1/6 */ +var RA4 = 0.04722222222222222222; +/* 17/360 */ +var RA6 = 0.02215608465608465608; +var EPSLN = 1.0e-10; +// you'd think you could use Number.EPSILON above but that makes +// Mollweide get into an infinate loop. + +var D2R = 0.01745329251994329577; +var R2D = 57.29577951308232088; +var FORTPI = Math.PI/4; +var TWO_PI = Math.PI * 2; +// SPI is slightly greater than Math.PI, so values that exceed the -180..180 +// degree range by a tiny amount don't get wrapped. This prevents points that +// have drifted from their original location along the 180th meridian (due to +// floating point error) from changing their sign. +var SPI = 3.14159265359; + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/PrimeMeridian.js +var PrimeMeridian_exports = {}; + + +PrimeMeridian_exports.greenwich = 0.0; //"0dE", +PrimeMeridian_exports.lisbon = -9.131906111111; //"9d07'54.862\"W", +PrimeMeridian_exports.paris = 2.337229166667; //"2d20'14.025\"E", +PrimeMeridian_exports.bogota = -74.080916666667; //"74d04'51.3\"W", +PrimeMeridian_exports.madrid = -3.687938888889; //"3d41'16.58\"W", +PrimeMeridian_exports.rome = 12.452333333333; //"12d27'8.4\"E", +PrimeMeridian_exports.bern = 7.439583333333; //"7d26'22.5\"E", +PrimeMeridian_exports.jakarta = 106.807719444444; //"106d48'27.79\"E", +PrimeMeridian_exports.ferro = -17.666666666667; //"17d40'W", +PrimeMeridian_exports.brussels = 4.367975; //"4d22'4.71\"E", +PrimeMeridian_exports.stockholm = 18.058277777778; //"18d3'29.8\"E", +PrimeMeridian_exports.athens = 23.7163375; //"23d42'58.815\"E", +PrimeMeridian_exports.oslo = 10.722916666667; //"10d43'22.5\"E" + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/units.js +/* harmony default export */ const units = ({ + ft: {to_meter: 0.3048}, + 'us-ft': {to_meter: 1200 / 3937} +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/match.js +var ignoredChar = /[\s_\-\/\(\)]/g; +function match(obj, key) { + if (obj[key]) { + return obj[key]; + } + var keys = Object.keys(obj); + var lkey = key.toLowerCase().replace(ignoredChar, ''); + var i = -1; + var testkey, processedKey; + while (++i < keys.length) { + testkey = keys[i]; + processedKey = testkey.toLowerCase().replace(ignoredChar, ''); + if (processedKey === lkey) { + return obj[testkey]; + } + } +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projString.js + + + + + +/* harmony default export */ function projString(defData) { + var self = {}; + var paramObj = defData.split('+').map(function(v) { + return v.trim(); + }).filter(function(a) { + return a; + }).reduce(function(p, a) { + var split = a.split('='); + split.push(true); + p[split[0].toLowerCase()] = split[1]; + return p; + }, {}); + var paramName, paramVal, paramOutname; + var params = { + proj: 'projName', + datum: 'datumCode', + rf: function(v) { + self.rf = parseFloat(v); + }, + lat_0: function(v) { + self.lat0 = v * D2R; + }, + lat_1: function(v) { + self.lat1 = v * D2R; + }, + lat_2: function(v) { + self.lat2 = v * D2R; + }, + lat_ts: function(v) { + self.lat_ts = v * D2R; + }, + lon_0: function(v) { + self.long0 = v * D2R; + }, + lon_1: function(v) { + self.long1 = v * D2R; + }, + lon_2: function(v) { + self.long2 = v * D2R; + }, + alpha: function(v) { + self.alpha = parseFloat(v) * D2R; + }, + gamma: function(v) { + self.rectified_grid_angle = parseFloat(v); + }, + lonc: function(v) { + self.longc = v * D2R; + }, + x_0: function(v) { + self.x0 = parseFloat(v); + }, + y_0: function(v) { + self.y0 = parseFloat(v); + }, + k_0: function(v) { + self.k0 = parseFloat(v); + }, + k: function(v) { + self.k0 = parseFloat(v); + }, + a: function(v) { + self.a = parseFloat(v); + }, + b: function(v) { + self.b = parseFloat(v); + }, + r_a: function() { + self.R_A = true; + }, + zone: function(v) { + self.zone = parseInt(v, 10); + }, + south: function() { + self.utmSouth = true; + }, + towgs84: function(v) { + self.datum_params = v.split(",").map(function(a) { + return parseFloat(a); + }); + }, + to_meter: function(v) { + self.to_meter = parseFloat(v); + }, + units: function(v) { + self.units = v; + var unit = match(units, v); + if (unit) { + self.to_meter = unit.to_meter; + } + }, + from_greenwich: function(v) { + self.from_greenwich = v * D2R; + }, + pm: function(v) { + var pm = match(PrimeMeridian_exports, v); + self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R; + }, + nadgrids: function(v) { + if (v === '@null') { + self.datumCode = 'none'; + } + else { + self.nadgrids = v; + } + }, + axis: function(v) { + var legalAxis = "ewnsud"; + if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { + self.axis = v; + } + }, + approx: function() { + self.approx = true; + } + }; + for (paramName in paramObj) { + paramVal = paramObj[paramName]; + if (paramName in params) { + paramOutname = params[paramName]; + if (typeof paramOutname === 'function') { + paramOutname(paramVal); + } + else { + self[paramOutname] = paramVal; + } + } + else { + self[paramName] = paramVal; + } + } + if(typeof self.datumCode === 'string' && self.datumCode !== "WGS84"){ + self.datumCode = self.datumCode.toLowerCase(); + } + return self; +} + +;// CONCATENATED MODULE: ./node_modules/wkt-parser/parser.js +/* harmony default export */ const parser = (parseString); + +var NEUTRAL = 1; +var KEYWORD = 2; +var NUMBER = 3; +var QUOTED = 4; +var AFTERQUOTE = 5; +var ENDED = -1; +var whitespace = /\s/; +var latin = /[A-Za-z]/; +var keyword = /[A-Za-z84_]/; +var endThings = /[,\]]/; +var digets = /[\d\.E\-\+]/; +// const ignoredChar = /[\s_\-\/\(\)]/g; +function Parser(text) { + if (typeof text !== 'string') { + throw new Error('not a string'); + } + this.text = text.trim(); + this.level = 0; + this.place = 0; + this.root = null; + this.stack = []; + this.currentObject = null; + this.state = NEUTRAL; +} +Parser.prototype.readCharicter = function() { + var char = this.text[this.place++]; + if (this.state !== QUOTED) { + while (whitespace.test(char)) { + if (this.place >= this.text.length) { + return; + } + char = this.text[this.place++]; + } + } + switch (this.state) { + case NEUTRAL: + return this.neutral(char); + case KEYWORD: + return this.keyword(char) + case QUOTED: + return this.quoted(char); + case AFTERQUOTE: + return this.afterquote(char); + case NUMBER: + return this.number(char); + case ENDED: + return; + } +}; +Parser.prototype.afterquote = function(char) { + if (char === '"') { + this.word += '"'; + this.state = QUOTED; + return; + } + if (endThings.test(char)) { + this.word = this.word.trim(); + this.afterItem(char); + return; + } + throw new Error('havn\'t handled "' +char + '" in afterquote yet, index ' + this.place); +}; +Parser.prototype.afterItem = function(char) { + if (char === ',') { + if (this.word !== null) { + this.currentObject.push(this.word); + } + this.word = null; + this.state = NEUTRAL; + return; + } + if (char === ']') { + this.level--; + if (this.word !== null) { + this.currentObject.push(this.word); + this.word = null; + } + this.state = NEUTRAL; + this.currentObject = this.stack.pop(); + if (!this.currentObject) { + this.state = ENDED; + } + + return; + } +}; +Parser.prototype.number = function(char) { + if (digets.test(char)) { + this.word += char; + return; + } + if (endThings.test(char)) { + this.word = parseFloat(this.word); + this.afterItem(char); + return; + } + throw new Error('havn\'t handled "' +char + '" in number yet, index ' + this.place); +}; +Parser.prototype.quoted = function(char) { + if (char === '"') { + this.state = AFTERQUOTE; + return; + } + this.word += char; + return; +}; +Parser.prototype.keyword = function(char) { + if (keyword.test(char)) { + this.word += char; + return; + } + if (char === '[') { + var newObjects = []; + newObjects.push(this.word); + this.level++; + if (this.root === null) { + this.root = newObjects; + } else { + this.currentObject.push(newObjects); + } + this.stack.push(this.currentObject); + this.currentObject = newObjects; + this.state = NEUTRAL; + return; + } + if (endThings.test(char)) { + this.afterItem(char); + return; + } + throw new Error('havn\'t handled "' +char + '" in keyword yet, index ' + this.place); +}; +Parser.prototype.neutral = function(char) { + if (latin.test(char)) { + this.word = char; + this.state = KEYWORD; + return; + } + if (char === '"') { + this.word = ''; + this.state = QUOTED; + return; + } + if (digets.test(char)) { + this.word = char; + this.state = NUMBER; + return; + } + if (endThings.test(char)) { + this.afterItem(char); + return; + } + throw new Error('havn\'t handled "' +char + '" in neutral yet, index ' + this.place); +}; +Parser.prototype.output = function() { + while (this.place < this.text.length) { + this.readCharicter(); + } + if (this.state === ENDED) { + return this.root; + } + throw new Error('unable to parse string "' +this.text + '". State is ' + this.state); +}; + +function parseString(txt) { + var parser = new Parser(txt); + return parser.output(); +} + +;// CONCATENATED MODULE: ./node_modules/wkt-parser/process.js + + +function mapit(obj, key, value) { + if (Array.isArray(key)) { + value.unshift(key); + key = null; + } + var thing = key ? {} : obj; + + var out = value.reduce(function(newObj, item) { + sExpr(item, newObj); + return newObj + }, thing); + if (key) { + obj[key] = out; + } +} + +function sExpr(v, obj) { + if (!Array.isArray(v)) { + obj[v] = true; + return; + } + var key = v.shift(); + if (key === 'PARAMETER') { + key = v.shift(); + } + if (v.length === 1) { + if (Array.isArray(v[0])) { + obj[key] = {}; + sExpr(v[0], obj[key]); + return; + } + obj[key] = v[0]; + return; + } + if (!v.length) { + obj[key] = true; + return; + } + if (key === 'TOWGS84') { + obj[key] = v; + return; + } + if (key === 'AXIS') { + if (!(key in obj)) { + obj[key] = []; + } + obj[key].push(v); + return; + } + if (!Array.isArray(key)) { + obj[key] = {}; + } + + var i; + switch (key) { + case 'UNIT': + case 'PRIMEM': + case 'VERT_DATUM': + obj[key] = { + name: v[0].toLowerCase(), + convert: v[1] + }; + if (v.length === 3) { + sExpr(v[2], obj[key]); + } + return; + case 'SPHEROID': + case 'ELLIPSOID': + obj[key] = { + name: v[0], + a: v[1], + rf: v[2] + }; + if (v.length === 4) { + sExpr(v[3], obj[key]); + } + return; + case 'PROJECTEDCRS': + case 'PROJCRS': + case 'GEOGCS': + case 'GEOCCS': + case 'PROJCS': + case 'LOCAL_CS': + case 'GEODCRS': + case 'GEODETICCRS': + case 'GEODETICDATUM': + case 'EDATUM': + case 'ENGINEERINGDATUM': + case 'VERT_CS': + case 'VERTCRS': + case 'VERTICALCRS': + case 'COMPD_CS': + case 'COMPOUNDCRS': + case 'ENGINEERINGCRS': + case 'ENGCRS': + case 'FITTED_CS': + case 'LOCAL_DATUM': + case 'DATUM': + v[0] = ['name', v[0]]; + mapit(obj, key, v); + return; + default: + i = -1; + while (++i < v.length) { + if (!Array.isArray(v[i])) { + return sExpr(v, obj[key]); + } + } + return mapit(obj, key, v); + } +} + +;// CONCATENATED MODULE: ./node_modules/wkt-parser/index.js +var wkt_parser_D2R = 0.01745329251994329577; + + + + + +function rename(obj, params) { + var outName = params[0]; + var inName = params[1]; + if (!(outName in obj) && (inName in obj)) { + obj[outName] = obj[inName]; + if (params.length === 3) { + obj[outName] = params[2](obj[outName]); + } + } +} + +function d2r(input) { + return input * wkt_parser_D2R; +} + +function cleanWKT(wkt) { + if (wkt.type === 'GEOGCS') { + wkt.projName = 'longlat'; + } else if (wkt.type === 'LOCAL_CS') { + wkt.projName = 'identity'; + wkt.local = true; + } else { + if (typeof wkt.PROJECTION === 'object') { + wkt.projName = Object.keys(wkt.PROJECTION)[0]; + } else { + wkt.projName = wkt.PROJECTION; + } + } + if (wkt.AXIS) { + var axisOrder = ''; + for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) { + var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()]; + if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) { + axisOrder += 'n'; + } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) { + axisOrder += 's'; + } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) { + axisOrder += 'e'; + } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) { + axisOrder += 'w'; + } + } + if (axisOrder.length === 2) { + axisOrder += 'u'; + } + if (axisOrder.length === 3) { + wkt.axis = axisOrder; + } + } + if (wkt.UNIT) { + wkt.units = wkt.UNIT.name.toLowerCase(); + if (wkt.units === 'metre') { + wkt.units = 'meter'; + } + if (wkt.UNIT.convert) { + if (wkt.type === 'GEOGCS') { + if (wkt.DATUM && wkt.DATUM.SPHEROID) { + wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a; + } + } else { + wkt.to_meter = wkt.UNIT.convert; + } + } + } + var geogcs = wkt.GEOGCS; + if (wkt.type === 'GEOGCS') { + geogcs = wkt; + } + if (geogcs) { + //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ + // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; + //} + if (geogcs.DATUM) { + wkt.datumCode = geogcs.DATUM.name.toLowerCase(); + } else { + wkt.datumCode = geogcs.name.toLowerCase(); + } + if (wkt.datumCode.slice(0, 2) === 'd_') { + wkt.datumCode = wkt.datumCode.slice(2); + } + if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { + wkt.datumCode = 'nzgd49'; + } + if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') { + if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { + wkt.sphere = true; + } + wkt.datumCode = 'wgs84'; + } + if (wkt.datumCode.slice(-6) === '_ferro') { + wkt.datumCode = wkt.datumCode.slice(0, - 6); + } + if (wkt.datumCode.slice(-8) === '_jakarta') { + wkt.datumCode = wkt.datumCode.slice(0, - 8); + } + if (~wkt.datumCode.indexOf('belge')) { + wkt.datumCode = 'rnb72'; + } + if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { + wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); + if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { + wkt.ellps = 'intl'; + } + + wkt.a = geogcs.DATUM.SPHEROID.a; + wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); + } + + if (geogcs.DATUM && geogcs.DATUM.TOWGS84) { + wkt.datum_params = geogcs.DATUM.TOWGS84; + } + if (~wkt.datumCode.indexOf('osgb_1936')) { + wkt.datumCode = 'osgb36'; + } + if (~wkt.datumCode.indexOf('osni_1952')) { + wkt.datumCode = 'osni52'; + } + if (~wkt.datumCode.indexOf('tm65') + || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) { + wkt.datumCode = 'ire65'; + } + if (wkt.datumCode === 'ch1903+') { + wkt.datumCode = 'ch1903'; + } + if (~wkt.datumCode.indexOf('israel')) { + wkt.datumCode = 'isr93'; + } + } + if (wkt.b && !isFinite(wkt.b)) { + wkt.b = wkt.a; + } + + function toMeter(input) { + var ratio = wkt.to_meter || 1; + return input * ratio; + } + var renamer = function(a) { + return rename(wkt, a); + }; + var list = [ + ['standard_parallel_1', 'Standard_Parallel_1'], + ['standard_parallel_1', 'Latitude of 1st standard parallel'], + ['standard_parallel_2', 'Standard_Parallel_2'], + ['standard_parallel_2', 'Latitude of 2nd standard parallel'], + ['false_easting', 'False_Easting'], + ['false_easting', 'False easting'], + ['false-easting', 'Easting at false origin'], + ['false_northing', 'False_Northing'], + ['false_northing', 'False northing'], + ['false_northing', 'Northing at false origin'], + ['central_meridian', 'Central_Meridian'], + ['central_meridian', 'Longitude of natural origin'], + ['central_meridian', 'Longitude of false origin'], + ['latitude_of_origin', 'Latitude_Of_Origin'], + ['latitude_of_origin', 'Central_Parallel'], + ['latitude_of_origin', 'Latitude of natural origin'], + ['latitude_of_origin', 'Latitude of false origin'], + ['scale_factor', 'Scale_Factor'], + ['k0', 'scale_factor'], + ['latitude_of_center', 'Latitude_Of_Center'], + ['latitude_of_center', 'Latitude_of_center'], + ['lat0', 'latitude_of_center', d2r], + ['longitude_of_center', 'Longitude_Of_Center'], + ['longitude_of_center', 'Longitude_of_center'], + ['longc', 'longitude_of_center', d2r], + ['x0', 'false_easting', toMeter], + ['y0', 'false_northing', toMeter], + ['long0', 'central_meridian', d2r], + ['lat0', 'latitude_of_origin', d2r], + ['lat0', 'standard_parallel_1', d2r], + ['lat1', 'standard_parallel_1', d2r], + ['lat2', 'standard_parallel_2', d2r], + ['azimuth', 'Azimuth'], + ['alpha', 'azimuth', d2r], + ['srsCode', 'name'] + ]; + list.forEach(renamer); + if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) { + wkt.long0 = wkt.longc; + } + if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) { + wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); + wkt.lat_ts = wkt.lat1; + } +} +/* harmony default export */ function wkt_parser(wkt) { + var lisp = parser(wkt); + var type = lisp.shift(); + var name = lisp.shift(); + lisp.unshift(['name', name]); + lisp.unshift(['type', type]); + var obj = {}; + sExpr(lisp, obj); + cleanWKT(obj); + return obj; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/defs.js + + + + +function defs(name) { + /*global console*/ + var that = this; + if (arguments.length === 2) { + var def = arguments[1]; + if (typeof def === 'string') { + if (def.charAt(0) === '+') { + defs[name] = projString(arguments[1]); + } + else { + defs[name] = wkt_parser(arguments[1]); + } + } else { + defs[name] = def; + } + } + else if (arguments.length === 1) { + if (Array.isArray(name)) { + return name.map(function(v) { + if (Array.isArray(v)) { + defs.apply(that, v); + } + else { + defs(v); + } + }); + } + else if (typeof name === 'string') { + if (name in defs) { + return defs[name]; + } + } + else if ('EPSG' in name) { + defs['EPSG:' + name.EPSG] = name; + } + else if ('ESRI' in name) { + defs['ESRI:' + name.ESRI] = name; + } + else if ('IAU2000' in name) { + defs['IAU2000:' + name.IAU2000] = name; + } + else { + console.log(name); + } + return; + } + + +} +global(defs); +/* harmony default export */ const lib_defs = (defs); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/parseCode.js + + + + +function testObj(code){ + return typeof code === 'string'; +} +function testDef(code){ + return code in lib_defs; +} +var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; +function testWKT(code){ + return codeWords.some(function (word) { + return code.indexOf(word) > -1; + }); +} +var codes = ['3857', '900913', '3785', '102113']; +function checkMercator(item) { + var auth = match(item, 'authority'); + if (!auth) { + return; + } + var code = match(auth, 'epsg'); + return code && codes.indexOf(code) > -1; +} +function checkProjStr(item) { + var ext = match(item, 'extension'); + if (!ext) { + return; + } + return match(ext, 'proj4'); +} +function testProj(code){ + return code[0] === '+'; +} +function parse(code){ + if (testObj(code)) { + //check to see if this is a WKT string + if (testDef(code)) { + return lib_defs[code]; + } + if (testWKT(code)) { + var out = wkt_parser(code); + // test of spetial case, due to this being a very common and often malformed + if (checkMercator(out)) { + return lib_defs["EPSG:3857"]; + } + var maybeProjStr = checkProjStr(out); + if (maybeProjStr) { + return projString(maybeProjStr); + } + return out; + } + if (testProj(code)) { + return projString(code); + } + }else{ + return code; + } +} + +/* harmony default export */ const parseCode = (parse); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/extend.js +/* harmony default export */ function extend(destination, source) { + destination = destination || {}; + var value, property; + if (!source) { + return destination; + } + for (property in source) { + value = source[property]; + if (value !== undefined) { + destination[property] = value; + } + } + return destination; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/msfnz.js +/* harmony default export */ function msfnz(eccent, sinphi, cosphi) { + var con = eccent * sinphi; + return cosphi / (Math.sqrt(1 - con * con)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/sign.js +/* harmony default export */ function sign(x) { + return x<0 ? -1 : 1; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_lon.js + + + + +/* harmony default export */ function adjust_lon(x) { + return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI)); +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/tsfnz.js + + +/* harmony default export */ function tsfnz(eccent, phi, sinphi) { + var con = eccent * sinphi; + var com = 0.5 * eccent; + con = Math.pow(((1 - con) / (1 + con)), com); + return (Math.tan(0.5 * (HALF_PI - phi)) / con); +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/phi2z.js + + +/* harmony default export */ function phi2z(eccent, ts) { + var eccnth = 0.5 * eccent; + var con, dphi; + var phi = HALF_PI - 2 * Math.atan(ts); + for (var i = 0; i <= 15; i++) { + con = eccent * Math.sin(phi); + dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi; + phi += dphi; + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } + //console.log("phi2z has NoConvergence"); + return -9999; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/merc.js + + + + + + +function init() { + var con = this.b / this.a; + this.es = 1 - con * con; + if(!('x0' in this)){ + this.x0 = 0; + } + if(!('y0' in this)){ + this.y0 = 0; + } + this.e = Math.sqrt(this.es); + if (this.lat_ts) { + if (this.sphere) { + this.k0 = Math.cos(this.lat_ts); + } + else { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } + } + else { + if (!this.k0) { + if (this.k) { + this.k0 = this.k; + } + else { + this.k0 = 1; + } + } + } +} + +/* Mercator forward equations--mapping lat,long to x,y + --------------------------------------------------*/ + +function forward(p) { + var lon = p.x; + var lat = p.y; + // convert to radians + if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { + return null; + } + + var x, y; + if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + return null; + } + else { + if (this.sphere) { + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); + } + else { + var sinphi = Math.sin(lat); + var ts = tsfnz(this.e, lat, sinphi); + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 - this.a * this.k0 * Math.log(ts); + } + p.x = x; + p.y = y; + return p; + } +} + +/* Mercator inverse equations--mapping x,y to lat/long + --------------------------------------------------*/ +function inverse(p) { + + var x = p.x - this.x0; + var y = p.y - this.y0; + var lon, lat; + + if (this.sphere) { + lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); + } + else { + var ts = Math.exp(-y / (this.a * this.k0)); + lat = phi2z(this.e, ts); + if (lat === -9999) { + return null; + } + } + lon = adjust_lon(this.long0 + x / (this.a * this.k0)); + + p.x = lon; + p.y = lat; + return p; +} + +var names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; +/* harmony default export */ const merc = ({ + init: init, + forward: forward, + inverse: inverse, + names: names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/longlat.js +function longlat_init() { + //no-op for longlat +} + +function identity(pt) { + return pt; +} + + +var longlat_names = ["longlat", "identity"]; +/* harmony default export */ const longlat = ({ + init: longlat_init, + forward: identity, + inverse: identity, + names: longlat_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections.js + + +var projs = [merc, longlat]; +var projections_names = {}; +var projStore = []; + +function add(proj, i) { + var len = projStore.length; + if (!proj.names) { + console.log(i); + return true; + } + projStore[len] = proj; + proj.names.forEach(function(n) { + projections_names[n.toLowerCase()] = len; + }); + return this; +} + + + +function get(name) { + if (!name) { + return false; + } + var n = name.toLowerCase(); + if (typeof projections_names[n] !== 'undefined' && projStore[projections_names[n]]) { + return projStore[projections_names[n]]; + } +} + +function start() { + projs.forEach(add); +} +/* harmony default export */ const projections = ({ + start: start, + add: add, + get: get +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/Ellipsoid.js +var Ellipsoid_exports = {}; + +Ellipsoid_exports.MERIT = { + a: 6378137.0, + rf: 298.257, + ellipseName: "MERIT 1983" +}; + +Ellipsoid_exports.SGS85 = { + a: 6378136.0, + rf: 298.257, + ellipseName: "Soviet Geodetic System 85" +}; + +Ellipsoid_exports.GRS80 = { + a: 6378137.0, + rf: 298.257222101, + ellipseName: "GRS 1980(IUGG, 1980)" +}; + +Ellipsoid_exports.IAU76 = { + a: 6378140.0, + rf: 298.257, + ellipseName: "IAU 1976" +}; + +Ellipsoid_exports.airy = { + a: 6377563.396, + b: 6356256.910, + ellipseName: "Airy 1830" +}; + +Ellipsoid_exports.APL4 = { + a: 6378137, + rf: 298.25, + ellipseName: "Appl. Physics. 1965" +}; + +Ellipsoid_exports.NWL9D = { + a: 6378145.0, + rf: 298.25, + ellipseName: "Naval Weapons Lab., 1965" +}; + +Ellipsoid_exports.mod_airy = { + a: 6377340.189, + b: 6356034.446, + ellipseName: "Modified Airy" +}; + +Ellipsoid_exports.andrae = { + a: 6377104.43, + rf: 300.0, + ellipseName: "Andrae 1876 (Den., Iclnd.)" +}; + +Ellipsoid_exports.aust_SA = { + a: 6378160.0, + rf: 298.25, + ellipseName: "Australian Natl & S. Amer. 1969" +}; + +Ellipsoid_exports.GRS67 = { + a: 6378160.0, + rf: 298.2471674270, + ellipseName: "GRS 67(IUGG 1967)" +}; + +Ellipsoid_exports.bessel = { + a: 6377397.155, + rf: 299.1528128, + ellipseName: "Bessel 1841" +}; + +Ellipsoid_exports.bess_nam = { + a: 6377483.865, + rf: 299.1528128, + ellipseName: "Bessel 1841 (Namibia)" +}; + +Ellipsoid_exports.clrk66 = { + a: 6378206.4, + b: 6356583.8, + ellipseName: "Clarke 1866" +}; + +Ellipsoid_exports.clrk80 = { + a: 6378249.145, + rf: 293.4663, + ellipseName: "Clarke 1880 mod." +}; + +Ellipsoid_exports.clrk58 = { + a: 6378293.645208759, + rf: 294.2606763692654, + ellipseName: "Clarke 1858" +}; + +Ellipsoid_exports.CPM = { + a: 6375738.7, + rf: 334.29, + ellipseName: "Comm. des Poids et Mesures 1799" +}; + +Ellipsoid_exports.delmbr = { + a: 6376428.0, + rf: 311.5, + ellipseName: "Delambre 1810 (Belgium)" +}; + +Ellipsoid_exports.engelis = { + a: 6378136.05, + rf: 298.2566, + ellipseName: "Engelis 1985" +}; + +Ellipsoid_exports.evrst30 = { + a: 6377276.345, + rf: 300.8017, + ellipseName: "Everest 1830" +}; + +Ellipsoid_exports.evrst48 = { + a: 6377304.063, + rf: 300.8017, + ellipseName: "Everest 1948" +}; + +Ellipsoid_exports.evrst56 = { + a: 6377301.243, + rf: 300.8017, + ellipseName: "Everest 1956" +}; + +Ellipsoid_exports.evrst69 = { + a: 6377295.664, + rf: 300.8017, + ellipseName: "Everest 1969" +}; + +Ellipsoid_exports.evrstSS = { + a: 6377298.556, + rf: 300.8017, + ellipseName: "Everest (Sabah & Sarawak)" +}; + +Ellipsoid_exports.fschr60 = { + a: 6378166.0, + rf: 298.3, + ellipseName: "Fischer (Mercury Datum) 1960" +}; + +Ellipsoid_exports.fschr60m = { + a: 6378155.0, + rf: 298.3, + ellipseName: "Fischer 1960" +}; + +Ellipsoid_exports.fschr68 = { + a: 6378150.0, + rf: 298.3, + ellipseName: "Fischer 1968" +}; + +Ellipsoid_exports.helmert = { + a: 6378200.0, + rf: 298.3, + ellipseName: "Helmert 1906" +}; + +Ellipsoid_exports.hough = { + a: 6378270.0, + rf: 297.0, + ellipseName: "Hough" +}; + +Ellipsoid_exports.intl = { + a: 6378388.0, + rf: 297.0, + ellipseName: "International 1909 (Hayford)" +}; + +Ellipsoid_exports.kaula = { + a: 6378163.0, + rf: 298.24, + ellipseName: "Kaula 1961" +}; + +Ellipsoid_exports.lerch = { + a: 6378139.0, + rf: 298.257, + ellipseName: "Lerch 1979" +}; + +Ellipsoid_exports.mprts = { + a: 6397300.0, + rf: 191.0, + ellipseName: "Maupertius 1738" +}; + +Ellipsoid_exports.new_intl = { + a: 6378157.5, + b: 6356772.2, + ellipseName: "New International 1967" +}; + +Ellipsoid_exports.plessis = { + a: 6376523.0, + rf: 6355863.0, + ellipseName: "Plessis 1817 (France)" +}; + +Ellipsoid_exports.krass = { + a: 6378245.0, + rf: 298.3, + ellipseName: "Krassovsky, 1942" +}; + +Ellipsoid_exports.SEasia = { + a: 6378155.0, + b: 6356773.3205, + ellipseName: "Southeast Asia" +}; + +Ellipsoid_exports.walbeck = { + a: 6376896.0, + b: 6355834.8467, + ellipseName: "Walbeck" +}; + +Ellipsoid_exports.WGS60 = { + a: 6378165.0, + rf: 298.3, + ellipseName: "WGS 60" +}; + +Ellipsoid_exports.WGS66 = { + a: 6378145.0, + rf: 298.25, + ellipseName: "WGS 66" +}; + +Ellipsoid_exports.WGS7 = { + a: 6378135.0, + rf: 298.26, + ellipseName: "WGS 72" +}; + +var WGS84 = Ellipsoid_exports.WGS84 = { + a: 6378137.0, + rf: 298.257223563, + ellipseName: "WGS 84" +}; + +Ellipsoid_exports.sphere = { + a: 6370997.0, + b: 6370997.0, + ellipseName: "Normal Sphere (r=6370997)" +}; + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/deriveConstants.js + + + + +function eccentricity(a, b, rf, R_A) { + var a2 = a * a; // used in geocentric + var b2 = b * b; // used in geocentric + var es = (a2 - b2) / a2; // e ^ 2 + var e = 0; + if (R_A) { + a *= 1 - es * (SIXTH + es * (RA4 + es * RA6)); + a2 = a * a; + es = 0; + } else { + e = Math.sqrt(es); // eccentricity + } + var ep2 = (a2 - b2) / b2; // used in geocentric + return { + es: es, + e: e, + ep2: ep2 + }; +} +function sphere(a, b, rf, ellps, sphere) { + if (!a) { // do we have an ellipsoid? + var ellipse = match(Ellipsoid_exports, ellps); + if (!ellipse) { + ellipse = WGS84; + } + a = ellipse.a; + b = ellipse.b; + rf = ellipse.rf; + } + + if (rf && !b) { + b = (1.0 - 1.0 / rf) * a; + } + if (rf === 0 || Math.abs(a - b) < EPSLN) { + sphere = true; + b = a; + } + return { + a: a, + b: b, + rf: rf, + sphere: sphere + }; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/Datum.js +var Datum_exports = {}; + +Datum_exports.wgs84 = { + towgs84: "0,0,0", + ellipse: "WGS84", + datumName: "WGS84" +}; + +Datum_exports.ch1903 = { + towgs84: "674.374,15.056,405.346", + ellipse: "bessel", + datumName: "swiss" +}; + +Datum_exports.ggrs87 = { + towgs84: "-199.87,74.79,246.62", + ellipse: "GRS80", + datumName: "Greek_Geodetic_Reference_System_1987" +}; + +Datum_exports.nad83 = { + towgs84: "0,0,0", + ellipse: "GRS80", + datumName: "North_American_Datum_1983" +}; + +Datum_exports.nad27 = { + nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", + ellipse: "clrk66", + datumName: "North_American_Datum_1927" +}; + +Datum_exports.potsdam = { + towgs84: "598.1,73.7,418.2,0.202,0.045,-2.455,6.7", + ellipse: "bessel", + datumName: "Potsdam Rauenberg 1950 DHDN" +}; + +Datum_exports.carthage = { + towgs84: "-263.0,6.0,431.0", + ellipse: "clark80", + datumName: "Carthage 1934 Tunisia" +}; + +Datum_exports.hermannskogel = { + towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232", + ellipse: "bessel", + datumName: "Hermannskogel" +}; + +Datum_exports.osni52 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "airy", + datumName: "Irish National" +}; + +Datum_exports.ire65 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "mod_airy", + datumName: "Ireland 1965" +}; + +Datum_exports.rassadiran = { + towgs84: "-133.63,-157.5,-158.62", + ellipse: "intl", + datumName: "Rassadiran" +}; + +Datum_exports.nzgd49 = { + towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", + ellipse: "intl", + datumName: "New Zealand Geodetic Datum 1949" +}; + +Datum_exports.osgb36 = { + towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + ellipse: "airy", + datumName: "Airy 1830" +}; + +Datum_exports.s_jtsk = { + towgs84: "589,76,480", + ellipse: 'bessel', + datumName: 'S-JTSK (Ferro)' +}; + +Datum_exports.beduaram = { + towgs84: '-106,-87,188', + ellipse: 'clrk80', + datumName: 'Beduaram' +}; + +Datum_exports.gunung_segara = { + towgs84: '-403,684,41', + ellipse: 'bessel', + datumName: 'Gunung Segara Jakarta' +}; + +Datum_exports.rnb72 = { + towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", + ellipse: "intl", + datumName: "Reseau National Belge 1972" +}; + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datum.js + + +function datum(datumCode, datum_params, a, b, es, ep2, nadgrids) { + var out = {}; + + if (datumCode === undefined || datumCode === 'none') { + out.datum_type = PJD_NODATUM; + } else { + out.datum_type = PJD_WGS84; + } + + if (datum_params) { + out.datum_params = datum_params.map(parseFloat); + if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) { + out.datum_type = PJD_3PARAM; + } + if (out.datum_params.length > 3) { + if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) { + out.datum_type = PJD_7PARAM; + out.datum_params[3] *= SEC_TO_RAD; + out.datum_params[4] *= SEC_TO_RAD; + out.datum_params[5] *= SEC_TO_RAD; + out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0; + } + } + } + + if (nadgrids) { + out.datum_type = PJD_GRIDSHIFT; + out.grids = nadgrids; + } + out.a = a; //datum object also uses these values + out.b = b; + out.es = es; + out.ep2 = ep2; + return out; +} + +/* harmony default export */ const lib_datum = (datum); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/nadgrid.js +/** + * Resources for details of NTv2 file formats: + * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf + * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm + */ + +var loadedNadgrids = {}; + +/** + * Load a binary NTv2 file (.gsb) to a key that can be used in a proj string like +nadgrids=. Pass the NTv2 file + * as an ArrayBuffer. + */ +function nadgrid(key, data) { + var view = new DataView(data); + var isLittleEndian = detectLittleEndian(view); + var header = readHeader(view, isLittleEndian); + if (header.nSubgrids > 1) { + console.log('Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored'); + } + var subgrids = readSubgrids(view, header, isLittleEndian); + var nadgrid = {header: header, subgrids: subgrids}; + loadedNadgrids[key] = nadgrid; + return nadgrid; +} + +/** + * Given a proj4 value for nadgrids, return an array of loaded grids + */ +function getNadgrids(nadgrids) { + // Format details: http://proj.maptools.org/gen_parms.html + if (nadgrids === undefined) { return null; } + var grids = nadgrids.split(','); + return grids.map(parseNadgridString); +} + +function parseNadgridString(value) { + if (value.length === 0) { + return null; + } + var optional = value[0] === '@'; + if (optional) { + value = value.slice(1); + } + if (value === 'null') { + return {name: 'null', mandatory: !optional, grid: null, isNull: true}; + } + return { + name: value, + mandatory: !optional, + grid: loadedNadgrids[value] || null, + isNull: false + }; +} + +function secondsToRadians(seconds) { + return (seconds / 3600) * Math.PI / 180; +} + +function detectLittleEndian(view) { + var nFields = view.getInt32(8, false); + if (nFields === 11) { + return false; + } + nFields = view.getInt32(8, true); + if (nFields !== 11) { + console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian'); + } + return true; +} + +function readHeader(view, isLittleEndian) { + return { + nFields: view.getInt32(8, isLittleEndian), + nSubgridFields: view.getInt32(24, isLittleEndian), + nSubgrids: view.getInt32(40, isLittleEndian), + shiftType: decodeString(view, 56, 56 + 8).trim(), + fromSemiMajorAxis: view.getFloat64(120, isLittleEndian), + fromSemiMinorAxis: view.getFloat64(136, isLittleEndian), + toSemiMajorAxis: view.getFloat64(152, isLittleEndian), + toSemiMinorAxis: view.getFloat64(168, isLittleEndian), + }; +} + +function decodeString(view, start, end) { + return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end))); +} + +function readSubgrids(view, header, isLittleEndian) { + var gridOffset = 176; + var grids = []; + for (var i = 0; i < header.nSubgrids; i++) { + var subHeader = readGridHeader(view, gridOffset, isLittleEndian); + var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian); + var lngColumnCount = Math.round( + 1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval); + var latColumnCount = Math.round( + 1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval); + // Proj4 operates on radians whereas the coordinates are in seconds in the grid + grids.push({ + ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)], + del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)], + lim: [lngColumnCount, latColumnCount], + count: subHeader.gridNodeCount, + cvs: mapNodes(nodes) + }); + } + return grids; +} + +function mapNodes(nodes) { + return nodes.map(function (r) {return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)];}); +} + +function readGridHeader(view, offset, isLittleEndian) { + return { + name: decodeString(view, offset + 8, offset + 16).trim(), + parent: decodeString(view, offset + 24, offset + 24 + 8).trim(), + lowerLatitude: view.getFloat64(offset + 72, isLittleEndian), + upperLatitude: view.getFloat64(offset + 88, isLittleEndian), + lowerLongitude: view.getFloat64(offset + 104, isLittleEndian), + upperLongitude: view.getFloat64(offset + 120, isLittleEndian), + latitudeInterval: view.getFloat64(offset + 136, isLittleEndian), + longitudeInterval: view.getFloat64(offset + 152, isLittleEndian), + gridNodeCount: view.getInt32(offset + 168, isLittleEndian) + }; +} + +function readGridNodes(view, offset, gridHeader, isLittleEndian) { + var nodesOffset = offset + 176; + var gridRecordLength = 16; + var gridShiftRecords = []; + for (var i = 0; i < gridHeader.gridNodeCount; i++) { + var record = { + latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian), + longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian), + latitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian), + longitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian), + }; + gridShiftRecords.push(record); + } + return gridShiftRecords; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/Proj.js + + + + + + + + + +function Projection(srsCode,callback) { + if (!(this instanceof Projection)) { + return new Projection(srsCode); + } + callback = callback || function(error){ + if(error){ + throw error; + } + }; + var json = parseCode(srsCode); + if(typeof json !== 'object'){ + callback(srsCode); + return; + } + var ourProj = Projection.projections.get(json.projName); + if(!ourProj){ + callback(srsCode); + return; + } + if (json.datumCode && json.datumCode !== 'none') { + var datumDef = match(Datum_exports, json.datumCode); + if (datumDef) { + json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null); + json.ellps = datumDef.ellipse; + json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; + } + } + json.k0 = json.k0 || 1.0; + json.axis = json.axis || 'enu'; + json.ellps = json.ellps || 'wgs84'; + json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this + + var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere); + var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A); + var nadgrids = getNadgrids(json.nadgrids); + var datumObj = json.datum || lib_datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2, + nadgrids); + + extend(this, json); // transfer everything over from the projection because we don't know what we'll need + extend(this, ourProj); // transfer all the methods from the projection + + // copy the 4 things over we calulated in deriveConstants.sphere + this.a = sphere_.a; + this.b = sphere_.b; + this.rf = sphere_.rf; + this.sphere = sphere_.sphere; + + // copy the 3 things we calculated in deriveConstants.eccentricity + this.es = ecc.es; + this.e = ecc.e; + this.ep2 = ecc.ep2; + + // add in the datum object + this.datum = datumObj; + + // init the projection + this.init(); + + // legecy callback from back in the day when it went to spatialreference.org + callback(null, this); + +} +Projection.projections = projections; +Projection.projections.start(); +/* harmony default export */ const Proj = (Projection); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datumUtils.js + + +function compareDatums(source, dest) { + if (source.datum_type !== dest.datum_type) { + return false; // false, datums are not equal + } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) { + // the tolerance for es is to ensure that GRS80 and WGS84 + // are considered identical + return false; + } else if (source.datum_type === PJD_3PARAM) { + return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]); + } else if (source.datum_type === PJD_7PARAM) { + return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]); + } else { + return true; // datums are equal + } +} // cs_compare_datums() + +/* + * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates + * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), + * according to the current ellipsoid parameters. + * + * Latitude : Geodetic latitude in radians (input) + * Longitude : Geodetic longitude in radians (input) + * Height : Geodetic height, in meters (input) + * X : Calculated Geocentric X coordinate, in meters (output) + * Y : Calculated Geocentric Y coordinate, in meters (output) + * Z : Calculated Geocentric Z coordinate, in meters (output) + * + */ +function geodeticToGeocentric(p, es, a) { + var Longitude = p.x; + var Latitude = p.y; + var Height = p.z ? p.z : 0; //Z value not always supplied + + var Rn; /* Earth radius at location */ + var Sin_Lat; /* Math.sin(Latitude) */ + var Sin2_Lat; /* Square of Math.sin(Latitude) */ + var Cos_Lat; /* Math.cos(Latitude) */ + + /* + ** Don't blow up if Latitude is just a little out of the value + ** range as it may just be a rounding issue. Also removed longitude + ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. + */ + if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { + Latitude = -HALF_PI; + } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { + Latitude = HALF_PI; + } else if (Latitude < -HALF_PI) { + /* Latitude out of range */ + //..reportError('geocent:lat out of range:' + Latitude); + return { x: -Infinity, y: -Infinity, z: p.z }; + } else if (Latitude > HALF_PI) { + /* Latitude out of range */ + return { x: Infinity, y: Infinity, z: p.z }; + } + + if (Longitude > Math.PI) { + Longitude -= (2 * Math.PI); + } + Sin_Lat = Math.sin(Latitude); + Cos_Lat = Math.cos(Latitude); + Sin2_Lat = Sin_Lat * Sin_Lat; + Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat)); + return { + x: (Rn + Height) * Cos_Lat * Math.cos(Longitude), + y: (Rn + Height) * Cos_Lat * Math.sin(Longitude), + z: ((Rn * (1 - es)) + Height) * Sin_Lat + }; +} // cs_geodetic_to_geocentric() + +function geocentricToGeodetic(p, es, a, b) { + /* local defintions and variables */ + /* end-criterium of loop, accuracy of sin(Latitude) */ + var genau = 1e-12; + var genau2 = (genau * genau); + var maxiter = 30; + + var P; /* distance between semi-minor axis and location */ + var RR; /* distance between center and location */ + var CT; /* sin of geocentric latitude */ + var ST; /* cos of geocentric latitude */ + var RX; + var RK; + var RN; /* Earth radius at location */ + var CPHI0; /* cos of start or old geodetic latitude in iterations */ + var SPHI0; /* sin of start or old geodetic latitude in iterations */ + var CPHI; /* cos of searched geodetic latitude */ + var SPHI; /* sin of searched geodetic latitude */ + var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ + var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ + + var X = p.x; + var Y = p.y; + var Z = p.z ? p.z : 0.0; //Z value not always supplied + var Longitude; + var Latitude; + var Height; + + P = Math.sqrt(X * X + Y * Y); + RR = Math.sqrt(X * X + Y * Y + Z * Z); + + /* special cases for latitude and longitude */ + if (P / a < genau) { + + /* special case, if P=0. (X=0., Y=0.) */ + Longitude = 0.0; + + /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis + * of ellipsoid (=center of mass), Latitude becomes PI/2 */ + if (RR / a < genau) { + Latitude = HALF_PI; + Height = -b; + return { + x: p.x, + y: p.y, + z: p.z + }; + } + } else { + /* ellipsoidal (geodetic) longitude + * interval: -PI < Longitude <= +PI */ + Longitude = Math.atan2(Y, X); + } + + /* -------------------------------------------------------------- + * Following iterative algorithm was developped by + * "Institut for Erdmessung", University of Hannover, July 1988. + * Internet: www.ife.uni-hannover.de + * Iterative computation of CPHI,SPHI and Height. + * Iteration of CPHI and SPHI to 10**-12 radian resp. + * 2*10**-7 arcsec. + * -------------------------------------------------------------- + */ + CT = Z / RR; + ST = P / RR; + RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST); + CPHI0 = ST * (1.0 - es) * RX; + SPHI0 = CT * RX; + iter = 0; + + /* loop to find sin(Latitude) resp. Latitude + * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ + do { + iter++; + RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0); + + /* ellipsoidal (geodetic) height */ + Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0); + + RK = es * RN / (RN + Height); + RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST); + CPHI = ST * (1.0 - RK) * RX; + SPHI = CT * RX; + SDPHI = SPHI * CPHI0 - CPHI * SPHI0; + CPHI0 = CPHI; + SPHI0 = SPHI; + } + while (SDPHI * SDPHI > genau2 && iter < maxiter); + + /* ellipsoidal (geodetic) latitude */ + Latitude = Math.atan(SPHI / Math.abs(CPHI)); + return { + x: Longitude, + y: Latitude, + z: Height + }; +} // cs_geocentric_to_geodetic() + +/****************************************************************/ +// pj_geocentic_to_wgs84( p ) +// p = point to transform in geocentric coordinates (x,y,z) + + +/** point object, nothing fancy, just allows values to be + passed back and forth by reference rather than by value. + Other point classes may be used as long as they have + x and y properties, which will get modified in the transform method. +*/ +function geocentricToWgs84(p, datum_type, datum_params) { + + if (datum_type === PJD_3PARAM) { + // if( x[io] === HUGE_VAL ) + // continue; + return { + x: p.x + datum_params[0], + y: p.y + datum_params[1], + z: p.z + datum_params[2], + }; + } else if (datum_type === PJD_7PARAM) { + var Dx_BF = datum_params[0]; + var Dy_BF = datum_params[1]; + var Dz_BF = datum_params[2]; + var Rx_BF = datum_params[3]; + var Ry_BF = datum_params[4]; + var Rz_BF = datum_params[5]; + var M_BF = datum_params[6]; + // if( x[io] === HUGE_VAL ) + // continue; + return { + x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF, + y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF, + z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF + }; + } +} // cs_geocentric_to_wgs84 + +/****************************************************************/ +// pj_geocentic_from_wgs84() +// coordinate system definition, +// point to transform in geocentric coordinates (x,y,z) +function geocentricFromWgs84(p, datum_type, datum_params) { + + if (datum_type === PJD_3PARAM) { + //if( x[io] === HUGE_VAL ) + // continue; + return { + x: p.x - datum_params[0], + y: p.y - datum_params[1], + z: p.z - datum_params[2], + }; + + } else if (datum_type === PJD_7PARAM) { + var Dx_BF = datum_params[0]; + var Dy_BF = datum_params[1]; + var Dz_BF = datum_params[2]; + var Rx_BF = datum_params[3]; + var Ry_BF = datum_params[4]; + var Rz_BF = datum_params[5]; + var M_BF = datum_params[6]; + var x_tmp = (p.x - Dx_BF) / M_BF; + var y_tmp = (p.y - Dy_BF) / M_BF; + var z_tmp = (p.z - Dz_BF) / M_BF; + //if( x[io] === HUGE_VAL ) + // continue; + + return { + x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp, + y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp, + z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp + }; + } //cs_geocentric_from_wgs84() +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datum_transform.js + + + + +function checkParams(type) { + return (type === PJD_3PARAM || type === PJD_7PARAM); +} + +/* harmony default export */ function datum_transform(source, dest, point) { + // Short cut if the datums are identical. + if (compareDatums(source, dest)) { + return point; // in this case, zero is sucess, + // whereas cs_compare_datums returns 1 to indicate TRUE + // confusing, should fix this + } + + // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest + if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { + return point; + } + + // If this datum requires grid shifts, then apply it to geodetic coordinates. + var source_a = source.a; + var source_es = source.es; + if (source.datum_type === PJD_GRIDSHIFT) { + var gridShiftCode = applyGridShift(source, false, point); + if (gridShiftCode !== 0) { + return undefined; + } + source_a = SRS_WGS84_SEMIMAJOR; + source_es = SRS_WGS84_ESQUARED; + } + + var dest_a = dest.a; + var dest_b = dest.b; + var dest_es = dest.es; + if (dest.datum_type === PJD_GRIDSHIFT) { + dest_a = SRS_WGS84_SEMIMAJOR; + dest_b = SRS_WGS84_SEMIMINOR; + dest_es = SRS_WGS84_ESQUARED; + } + + // Do we need to go through geocentric coordinates? + if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) { + return point; + } + + // Convert to geocentric coordinates. + point = geodeticToGeocentric(point, source_es, source_a); + // Convert between datums + if (checkParams(source.datum_type)) { + point = geocentricToWgs84(point, source.datum_type, source.datum_params); + } + if (checkParams(dest.datum_type)) { + point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params); + } + point = geocentricToGeodetic(point, dest_es, dest_a, dest_b); + + if (dest.datum_type === PJD_GRIDSHIFT) { + var destGridShiftResult = applyGridShift(dest, true, point); + if (destGridShiftResult !== 0) { + return undefined; + } + } + + return point; +} + +function applyGridShift(source, inverse, point) { + if (source.grids === null || source.grids.length === 0) { + console.log('Grid shift grids not found'); + return -1; + } + var input = {x: -point.x, y: point.y}; + var output = {x: Number.NaN, y: Number.NaN}; + var onlyMandatoryGrids = false; + var attemptedGrids = []; + for (var i = 0; i < source.grids.length; i++) { + var grid = source.grids[i]; + attemptedGrids.push(grid.name); + if (grid.isNull) { + output = input; + break; + } + onlyMandatoryGrids = grid.mandatory; + if (grid.grid === null) { + if (grid.mandatory) { + console.log("Unable to find mandatory grid '" + grid.name + "'"); + return -1; + } + continue; + } + var subgrid = grid.grid.subgrids[0]; + // skip tables that don't match our point at all + var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0; + var minX = subgrid.ll[0] - epsilon; + var minY = subgrid.ll[1] - epsilon; + var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon; + var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon; + if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x ) { + continue; + } + output = applySubgridShift(input, inverse, subgrid); + if (!isNaN(output.x)) { + break; + } + } + if (isNaN(output.x)) { + console.log("Failed to find a grid shift table for location '"+ + -input.x * R2D + " " + input.y * R2D + " tried: '" + attemptedGrids + "'"); + return -1; + } + point.x = -output.x; + point.y = output.y; + return 0; +} + +function applySubgridShift(pin, inverse, ct) { + var val = {x: Number.NaN, y: Number.NaN}; + if (isNaN(pin.x)) { return val; } + var tb = {x: pin.x, y: pin.y}; + tb.x -= ct.ll[0]; + tb.y -= ct.ll[1]; + tb.x = adjust_lon(tb.x - Math.PI) + Math.PI; + var t = nadInterpolate(tb, ct); + if (inverse) { + if (isNaN(t.x)) { + return val; + } + t.x = tb.x - t.x; + t.y = tb.y - t.y; + var i = 9, tol = 1e-12; + var dif, del; + do { + del = nadInterpolate(t, ct); + if (isNaN(del.x)) { + console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation."); + break; + } + dif = {x: tb.x - (del.x + t.x), y: tb.y - (del.y + t.y)}; + t.x += dif.x; + t.y += dif.y; + } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol); + if (i < 0) { + console.log("Inverse grid shift iterator failed to converge."); + return val; + } + val.x = adjust_lon(t.x + ct.ll[0]); + val.y = t.y + ct.ll[1]; + } else { + if (!isNaN(t.x)) { + val.x = pin.x + t.x; + val.y = pin.y + t.y; + } + } + return val; +} + +function nadInterpolate(pin, ct) { + var t = {x: pin.x / ct.del[0], y: pin.y / ct.del[1]}; + var indx = {x: Math.floor(t.x), y: Math.floor(t.y)}; + var frct = {x: t.x - 1.0 * indx.x, y: t.y - 1.0 * indx.y}; + var val= {x: Number.NaN, y: Number.NaN}; + var inx; + if (indx.x < 0 || indx.x >= ct.lim[0]) { + return val; + } + if (indx.y < 0 || indx.y >= ct.lim[1]) { + return val; + } + inx = (indx.y * ct.lim[0]) + indx.x; + var f00 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; + inx++; + var f10= {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; + inx += ct.lim[0]; + var f11 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; + inx--; + var f01 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; + var m11 = frct.x * frct.y, m10 = frct.x * (1.0 - frct.y), + m00 = (1.0 - frct.x) * (1.0 - frct.y), m01 = (1.0 - frct.x) * frct.y; + val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x); + val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y); + return val; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/adjust_axis.js +/* harmony default export */ function adjust_axis(crs, denorm, point) { + var xin = point.x, + yin = point.y, + zin = point.z || 0.0; + var v, t, i; + var out = {}; + for (i = 0; i < 3; i++) { + if (denorm && i === 2 && point.z === undefined) { + continue; + } + if (i === 0) { + v = xin; + if ("ew".indexOf(crs.axis[i]) !== -1) { + t = 'x'; + } else { + t = 'y'; + } + + } + else if (i === 1) { + v = yin; + if ("ns".indexOf(crs.axis[i]) !== -1) { + t = 'y'; + } else { + t = 'x'; + } + } + else { + v = zin; + t = 'z'; + } + switch (crs.axis[i]) { + case 'e': + out[t] = v; + break; + case 'w': + out[t] = -v; + break; + case 'n': + out[t] = v; + break; + case 's': + out[t] = -v; + break; + case 'u': + if (point[t] !== undefined) { + out.z = v; + } + break; + case 'd': + if (point[t] !== undefined) { + out.z = -v; + } + break; + default: + //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); + return null; + } + } + return out; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/toPoint.js +/* harmony default export */ function toPoint(array){ + var out = { + x: array[0], + y: array[1] + }; + if (array.length>2) { + out.z = array[2]; + } + if (array.length>3) { + out.m = array[3]; + } + return out; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/checkSanity.js +/* harmony default export */ function checkSanity(point) { + checkCoord(point.x); + checkCoord(point.y); +} +function checkCoord(num) { + if (typeof Number.isFinite === 'function') { + if (Number.isFinite(num)) { + return; + } + throw new TypeError('coordinates must be finite numbers'); + } + if (typeof num !== 'number' || num !== num || !isFinite(num)) { + throw new TypeError('coordinates must be finite numbers'); + } +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/transform.js + + + + + + + +function checkNotWGS(source, dest) { + return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84'); +} + +function transform(source, dest, point, enforceAxis) { + var wgs84; + if (Array.isArray(point)) { + point = toPoint(point); + } + checkSanity(point); + // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 + if (source.datum && dest.datum && checkNotWGS(source, dest)) { + wgs84 = new Proj('WGS84'); + point = transform(source, wgs84, point, enforceAxis); + source = wgs84; + } + // DGR, 2010/11/12 + if (enforceAxis && source.axis !== 'enu') { + point = adjust_axis(source, false, point); + } + // Transform source points to long/lat, if they aren't already. + if (source.projName === 'longlat') { + point = { + x: point.x * D2R, + y: point.y * D2R, + z: point.z || 0 + }; + } else { + if (source.to_meter) { + point = { + x: point.x * source.to_meter, + y: point.y * source.to_meter, + z: point.z || 0 + }; + } + point = source.inverse(point); // Convert Cartesian to longlat + if (!point) { + return; + } + } + // Adjust for the prime meridian if necessary + if (source.from_greenwich) { + point.x += source.from_greenwich; + } + + // Convert datums if needed, and if possible. + point = datum_transform(source.datum, dest.datum, point); + if (!point) { + return; + } + + // Adjust for the prime meridian if necessary + if (dest.from_greenwich) { + point = { + x: point.x - dest.from_greenwich, + y: point.y, + z: point.z || 0 + }; + } + + if (dest.projName === 'longlat') { + // convert radians to decimal degrees + point = { + x: point.x * R2D, + y: point.y * R2D, + z: point.z || 0 + }; + } else { // else project + point = dest.forward(point); + if (dest.to_meter) { + point = { + x: point.x / dest.to_meter, + y: point.y / dest.to_meter, + z: point.z || 0 + }; + } + } + + // DGR, 2010/11/12 + if (enforceAxis && dest.axis !== 'enu') { + return adjust_axis(dest, true, point); + } + + return point; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/core.js + + +var wgs84 = Proj('WGS84'); + +function transformer(from, to, coords, enforceAxis) { + var transformedArray, out, keys; + if (Array.isArray(coords)) { + transformedArray = transform(from, to, coords, enforceAxis) || {x: NaN, y: NaN}; + if (coords.length > 2) { + if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) { + if (typeof transformedArray.z === 'number') { + return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3)); + } else { + return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3)); + } + } else { + return [transformedArray.x, transformedArray.y].concat(coords.splice(2)); + } + } else { + return [transformedArray.x, transformedArray.y]; + } + } else { + out = transform(from, to, coords, enforceAxis); + keys = Object.keys(coords); + if (keys.length === 2) { + return out; + } + keys.forEach(function (key) { + if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) { + if (key === 'x' || key === 'y' || key === 'z') { + return; + } + } else { + if (key === 'x' || key === 'y') { + return; + } + } + out[key] = coords[key]; + }); + return out; + } +} + +function checkProj(item) { + if (item instanceof Proj) { + return item; + } + if (item.oProj) { + return item.oProj; + } + return Proj(item); +} + +function proj4(fromProj, toProj, coord) { + fromProj = checkProj(fromProj); + var single = false; + var obj; + if (typeof toProj === 'undefined') { + toProj = fromProj; + fromProj = wgs84; + single = true; + } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { + coord = toProj; + toProj = fromProj; + fromProj = wgs84; + single = true; + } + toProj = checkProj(toProj); + if (coord) { + return transformer(fromProj, toProj, coord); + } else { + obj = { + forward: function (coords, enforceAxis) { + return transformer(fromProj, toProj, coords, enforceAxis); + }, + inverse: function (coords, enforceAxis) { + return transformer(toProj, fromProj, coords, enforceAxis); + } + }; + if (single) { + obj.oProj = toProj; + } + return obj; + } +} +/* harmony default export */ const core = (proj4); +;// CONCATENATED MODULE: ./node_modules/mgrs/mgrs.js + + + +/** + * UTM zones are grouped, and assigned to one of a group of 6 + * sets. + * + * {int} @private + */ +var NUM_100K_SETS = 6; + +/** + * The column letters (for easting) of the lower left value, per + * set. + * + * {string} @private + */ +var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; + +/** + * The row letters (for northing) of the lower left value, per + * set. + * + * {string} @private + */ +var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; + +var A = 65; // A +var I = 73; // I +var O = 79; // O +var V = 86; // V +var Z = 90; // Z +/* harmony default export */ const mgrs = ({ + forward: mgrs_forward, + inverse: mgrs_inverse, + toPoint: mgrs_toPoint +}); +/** + * Conversion of lat/lon to MGRS. + * + * @param {object} ll Object literal with lat and lon properties on a + * WGS84 ellipsoid. + * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for + * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5. + * @return {string} the MGRS string for the given location and accuracy. + */ +function mgrs_forward(ll, accuracy) { + accuracy = accuracy || 5; // default accuracy 1m + return encode(LLtoUTM({ + lat: ll[1], + lon: ll[0] + }), accuracy); +}; + +/** + * Conversion of MGRS to lat/lon. + * + * @param {string} mgrs MGRS string. + * @return {array} An array with left (longitude), bottom (latitude), right + * (longitude) and top (latitude) values in WGS84, representing the + * bounding box for the provided MGRS reference. + */ +function mgrs_inverse(mgrs) { + var bbox = UTMtoLL(decode(mgrs.toUpperCase())); + if (bbox.lat && bbox.lon) { + return [bbox.lon, bbox.lat, bbox.lon, bbox.lat]; + } + return [bbox.left, bbox.bottom, bbox.right, bbox.top]; +}; + +function mgrs_toPoint(mgrs) { + var bbox = UTMtoLL(decode(mgrs.toUpperCase())); + if (bbox.lat && bbox.lon) { + return [bbox.lon, bbox.lat]; + } + return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2]; +}; +/** + * Conversion from degrees to radians. + * + * @private + * @param {number} deg the angle in degrees. + * @return {number} the angle in radians. + */ +function degToRad(deg) { + return (deg * (Math.PI / 180.0)); +} + +/** + * Conversion from radians to degrees. + * + * @private + * @param {number} rad the angle in radians. + * @return {number} the angle in degrees. + */ +function radToDeg(rad) { + return (180.0 * (rad / Math.PI)); +} + +/** + * Converts a set of Longitude and Latitude co-ordinates to UTM + * using the WGS84 ellipsoid. + * + * @private + * @param {object} ll Object literal with lat and lon properties + * representing the WGS84 coordinate to be converted. + * @return {object} Object literal containing the UTM value with easting, + * northing, zoneNumber and zoneLetter properties, and an optional + * accuracy property in digits. Returns null if the conversion failed. + */ +function LLtoUTM(ll) { + var Lat = ll.lat; + var Long = ll.lon; + var a = 6378137.0; //ellip.radius; + var eccSquared = 0.00669438; //ellip.eccsq; + var k0 = 0.9996; + var LongOrigin; + var eccPrimeSquared; + var N, T, C, A, M; + var LatRad = degToRad(Lat); + var LongRad = degToRad(Long); + var LongOriginRad; + var ZoneNumber; + // (int) + ZoneNumber = Math.floor((Long + 180) / 6) + 1; + + //Make sure the longitude 180.00 is in Zone 60 + if (Long === 180) { + ZoneNumber = 60; + } + + // Special zone for Norway + if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { + ZoneNumber = 32; + } + + // Special zones for Svalbard + if (Lat >= 72.0 && Lat < 84.0) { + if (Long >= 0.0 && Long < 9.0) { + ZoneNumber = 31; + } + else if (Long >= 9.0 && Long < 21.0) { + ZoneNumber = 33; + } + else if (Long >= 21.0 && Long < 33.0) { + ZoneNumber = 35; + } + else if (Long >= 33.0 && Long < 42.0) { + ZoneNumber = 37; + } + } + + LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin + // in middle of + // zone + LongOriginRad = degToRad(LongOrigin); + + eccPrimeSquared = (eccSquared) / (1 - eccSquared); + + N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); + T = Math.tan(LatRad) * Math.tan(LatRad); + C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); + A = Math.cos(LatRad) * (LongRad - LongOriginRad); + + M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad)); + + var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0); + + var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0))); + if (Lat < 0.0) { + UTMNorthing += 10000000.0; //10000000 meter offset for + // southern hemisphere + } + + return { + northing: Math.round(UTMNorthing), + easting: Math.round(UTMEasting), + zoneNumber: ZoneNumber, + zoneLetter: getLetterDesignator(Lat) + }; +} + +/** + * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience + * class where the Zone can be specified as a single string eg."60N" which + * is then broken down into the ZoneNumber and ZoneLetter. + * + * @private + * @param {object} utm An object literal with northing, easting, zoneNumber + * and zoneLetter properties. If an optional accuracy property is + * provided (in meters), a bounding box will be returned instead of + * latitude and longitude. + * @return {object} An object literal containing either lat and lon values + * (if no accuracy was provided), or top, right, bottom and left values + * for the bounding box calculated according to the provided accuracy. + * Returns null if the conversion failed. + */ +function UTMtoLL(utm) { + + var UTMNorthing = utm.northing; + var UTMEasting = utm.easting; + var zoneLetter = utm.zoneLetter; + var zoneNumber = utm.zoneNumber; + // check the ZoneNummber is valid + if (zoneNumber < 0 || zoneNumber > 60) { + return null; + } + + var k0 = 0.9996; + var a = 6378137.0; //ellip.radius; + var eccSquared = 0.00669438; //ellip.eccsq; + var eccPrimeSquared; + var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); + var N1, T1, C1, R1, D, M; + var LongOrigin; + var mu, phi1Rad; + + // remove 500,000 meter offset for longitude + var x = UTMEasting - 500000.0; + var y = UTMNorthing; + + // We must know somehow if we are in the Northern or Southern + // hemisphere, this is the only time we use the letter So even + // if the Zone letter isn't exactly correct it should indicate + // the hemisphere correctly + if (zoneLetter < 'N') { + y -= 10000000.0; // remove 10,000,000 meter offset used + // for southern hemisphere + } + + // There are 60 zones with zone 1 being at West -180 to -174 + LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin + // in middle of + // zone + + eccPrimeSquared = (eccSquared) / (1 - eccSquared); + + M = y / k0; + mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); + + phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu); + // double phi1 = ProjMath.radToDeg(phi1Rad); + + N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); + T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); + C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); + R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); + D = x / (N1 * k0); + + var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); + lat = radToDeg(lat); + + var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); + lon = LongOrigin + radToDeg(lon); + + var result; + if (utm.accuracy) { + var topRight = UTMtoLL({ + northing: utm.northing + utm.accuracy, + easting: utm.easting + utm.accuracy, + zoneLetter: utm.zoneLetter, + zoneNumber: utm.zoneNumber + }); + result = { + top: topRight.lat, + right: topRight.lon, + bottom: lat, + left: lon + }; + } + else { + result = { + lat: lat, + lon: lon + }; + } + return result; +} + +/** + * Calculates the MGRS letter designator for the given latitude. + * + * @private + * @param {number} lat The latitude in WGS84 to get the letter designator + * for. + * @return {char} The letter designator. + */ +function getLetterDesignator(lat) { + //This is here as an error flag to show that the Latitude is + //outside MGRS limits + var LetterDesignator = 'Z'; + + if ((84 >= lat) && (lat >= 72)) { + LetterDesignator = 'X'; + } + else if ((72 > lat) && (lat >= 64)) { + LetterDesignator = 'W'; + } + else if ((64 > lat) && (lat >= 56)) { + LetterDesignator = 'V'; + } + else if ((56 > lat) && (lat >= 48)) { + LetterDesignator = 'U'; + } + else if ((48 > lat) && (lat >= 40)) { + LetterDesignator = 'T'; + } + else if ((40 > lat) && (lat >= 32)) { + LetterDesignator = 'S'; + } + else if ((32 > lat) && (lat >= 24)) { + LetterDesignator = 'R'; + } + else if ((24 > lat) && (lat >= 16)) { + LetterDesignator = 'Q'; + } + else if ((16 > lat) && (lat >= 8)) { + LetterDesignator = 'P'; + } + else if ((8 > lat) && (lat >= 0)) { + LetterDesignator = 'N'; + } + else if ((0 > lat) && (lat >= -8)) { + LetterDesignator = 'M'; + } + else if ((-8 > lat) && (lat >= -16)) { + LetterDesignator = 'L'; + } + else if ((-16 > lat) && (lat >= -24)) { + LetterDesignator = 'K'; + } + else if ((-24 > lat) && (lat >= -32)) { + LetterDesignator = 'J'; + } + else if ((-32 > lat) && (lat >= -40)) { + LetterDesignator = 'H'; + } + else if ((-40 > lat) && (lat >= -48)) { + LetterDesignator = 'G'; + } + else if ((-48 > lat) && (lat >= -56)) { + LetterDesignator = 'F'; + } + else if ((-56 > lat) && (lat >= -64)) { + LetterDesignator = 'E'; + } + else if ((-64 > lat) && (lat >= -72)) { + LetterDesignator = 'D'; + } + else if ((-72 > lat) && (lat >= -80)) { + LetterDesignator = 'C'; + } + return LetterDesignator; +} + +/** + * Encodes a UTM location as MGRS string. + * + * @private + * @param {object} utm An object literal with easting, northing, + * zoneLetter, zoneNumber + * @param {number} accuracy Accuracy in digits (1-5). + * @return {string} MGRS string for the given UTM location. + */ +function encode(utm, accuracy) { + // prepend with leading zeroes + var seasting = "00000" + utm.easting, + snorthing = "00000" + utm.northing; + + return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); +} + +/** + * Get the two letter 100k designator for a given UTM easting, + * northing and zone number value. + * + * @private + * @param {number} easting + * @param {number} northing + * @param {number} zoneNumber + * @return the two letter 100k designator for the given UTM location. + */ +function get100kID(easting, northing, zoneNumber) { + var setParm = get100kSetForZone(zoneNumber); + var setColumn = Math.floor(easting / 100000); + var setRow = Math.floor(northing / 100000) % 20; + return getLetter100kID(setColumn, setRow, setParm); +} + +/** + * Given a UTM zone number, figure out the MGRS 100K set it is in. + * + * @private + * @param {number} i An UTM zone number. + * @return {number} the 100k set the UTM zone is in. + */ +function get100kSetForZone(i) { + var setParm = i % NUM_100K_SETS; + if (setParm === 0) { + setParm = NUM_100K_SETS; + } + + return setParm; +} + +/** + * Get the two-letter MGRS 100k designator given information + * translated from the UTM northing, easting and zone number. + * + * @private + * @param {number} column the column index as it relates to the MGRS + * 100k set spreadsheet, created from the UTM easting. + * Values are 1-8. + * @param {number} row the row index as it relates to the MGRS 100k set + * spreadsheet, created from the UTM northing value. Values + * are from 0-19. + * @param {number} parm the set block, as it relates to the MGRS 100k set + * spreadsheet, created from the UTM zone. Values are from + * 1-60. + * @return two letter MGRS 100k code. + */ +function getLetter100kID(column, row, parm) { + // colOrigin and rowOrigin are the letters at the origin of the set + var index = parm - 1; + var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); + var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); + + // colInt and rowInt are the letters to build to return + var colInt = colOrigin + column - 1; + var rowInt = rowOrigin + row; + var rollover = false; + + if (colInt > Z) { + colInt = colInt - Z + A - 1; + rollover = true; + } + + if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) { + colInt++; + } + + if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) { + colInt++; + + if (colInt === I) { + colInt++; + } + } + + if (colInt > Z) { + colInt = colInt - Z + A - 1; + } + + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + rollover = true; + } + else { + rollover = false; + } + + if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) { + rowInt++; + } + + if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) { + rowInt++; + + if (rowInt === I) { + rowInt++; + } + } + + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + } + + var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); + return twoLetter; +} + +/** + * Decode the UTM parameters from a MGRS string. + * + * @private + * @param {string} mgrsString an UPPERCASE coordinate string is expected. + * @return {object} An object literal with easting, northing, zoneLetter, + * zoneNumber and accuracy (in meters) properties. + */ +function decode(mgrsString) { + + if (mgrsString && mgrsString.length === 0) { + throw ("MGRSPoint coverting from nothing"); + } + + var length = mgrsString.length; + + var hunK = null; + var sb = ""; + var testChar; + var i = 0; + + // get Zone number + while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) { + if (i >= 2) { + throw ("MGRSPoint bad conversion from: " + mgrsString); + } + sb += testChar; + i++; + } + + var zoneNumber = parseInt(sb, 10); + + if (i === 0 || i + 3 > length) { + // A good MGRS string has to be 4-5 digits long, + // ##AAA/#AAA at least. + throw ("MGRSPoint bad conversion from: " + mgrsString); + } + + var zoneLetter = mgrsString.charAt(i++); + + // Should we check the zone letter here? Why not. + if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { + throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString); + } + + hunK = mgrsString.substring(i, i += 2); + + var set = get100kSetForZone(zoneNumber); + + var east100k = getEastingFromChar(hunK.charAt(0), set); + var north100k = getNorthingFromChar(hunK.charAt(1), set); + + // We have a bug where the northing may be 2000000 too low. + // How + // do we know when to roll over? + + while (north100k < getMinNorthing(zoneLetter)) { + north100k += 2000000; + } + + // calculate the char index for easting/northing separator + var remainder = length - i; + + if (remainder % 2 !== 0) { + throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString); + } + + var sep = remainder / 2; + + var sepEasting = 0.0; + var sepNorthing = 0.0; + var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; + if (sep > 0) { + accuracyBonus = 100000.0 / Math.pow(10, sep); + sepEastingString = mgrsString.substring(i, i + sep); + sepEasting = parseFloat(sepEastingString) * accuracyBonus; + sepNorthingString = mgrsString.substring(i + sep); + sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; + } + + easting = sepEasting + east100k; + northing = sepNorthing + north100k; + + return { + easting: easting, + northing: northing, + zoneLetter: zoneLetter, + zoneNumber: zoneNumber, + accuracy: accuracyBonus + }; +} + +/** + * Given the first letter from a two-letter MGRS 100k zone, and given the + * MGRS table set for the zone number, figure out the easting value that + * should be added to the other, secondary easting value. + * + * @private + * @param {char} e The first letter from a two-letter MGRS 100´k zone. + * @param {number} set The MGRS table set for the zone number. + * @return {number} The easting value for the given letter and set. + */ +function getEastingFromChar(e, set) { + // colOrigin is the letter at the origin of the set for the + // column + var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); + var eastingValue = 100000.0; + var rewindMarker = false; + + while (curCol !== e.charCodeAt(0)) { + curCol++; + if (curCol === I) { + curCol++; + } + if (curCol === O) { + curCol++; + } + if (curCol > Z) { + if (rewindMarker) { + throw ("Bad character: " + e); + } + curCol = A; + rewindMarker = true; + } + eastingValue += 100000.0; + } + + return eastingValue; +} + +/** + * Given the second letter from a two-letter MGRS 100k zone, and given the + * MGRS table set for the zone number, figure out the northing value that + * should be added to the other, secondary northing value. You have to + * remember that Northings are determined from the equator, and the vertical + * cycle of letters mean a 2000000 additional northing meters. This happens + * approx. every 18 degrees of latitude. This method does *NOT* count any + * additional northings. You have to figure out how many 2000000 meters need + * to be added for the zone letter of the MGRS coordinate. + * + * @private + * @param {char} n Second letter of the MGRS 100k zone + * @param {number} set The MGRS table set number, which is dependent on the + * UTM zone number. + * @return {number} The northing value for the given letter and set. + */ +function getNorthingFromChar(n, set) { + + if (n > 'V') { + throw ("MGRSPoint given invalid Northing " + n); + } + + // rowOrigin is the letter at the origin of the set for the + // column + var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); + var northingValue = 0.0; + var rewindMarker = false; + + while (curRow !== n.charCodeAt(0)) { + curRow++; + if (curRow === I) { + curRow++; + } + if (curRow === O) { + curRow++; + } + // fixing a bug making whole application hang in this loop + // when 'n' is a wrong character + if (curRow > V) { + if (rewindMarker) { // making sure that this loop ends + throw ("Bad character: " + n); + } + curRow = A; + rewindMarker = true; + } + northingValue += 100000.0; + } + + return northingValue; +} + +/** + * The function getMinNorthing returns the minimum northing value of a MGRS + * zone. + * + * Ported from Geotrans' c Lattitude_Band_Value structure table. + * + * @private + * @param {char} zoneLetter The MGRS zone to get the min northing for. + * @return {number} + */ +function getMinNorthing(zoneLetter) { + var northing; + switch (zoneLetter) { + case 'C': + northing = 1100000.0; + break; + case 'D': + northing = 2000000.0; + break; + case 'E': + northing = 2800000.0; + break; + case 'F': + northing = 3700000.0; + break; + case 'G': + northing = 4600000.0; + break; + case 'H': + northing = 5500000.0; + break; + case 'J': + northing = 6400000.0; + break; + case 'K': + northing = 7300000.0; + break; + case 'L': + northing = 8200000.0; + break; + case 'M': + northing = 9100000.0; + break; + case 'N': + northing = 0.0; + break; + case 'P': + northing = 800000.0; + break; + case 'Q': + northing = 1700000.0; + break; + case 'R': + northing = 2600000.0; + break; + case 'S': + northing = 3500000.0; + break; + case 'T': + northing = 4400000.0; + break; + case 'U': + northing = 5300000.0; + break; + case 'V': + northing = 6200000.0; + break; + case 'W': + northing = 7000000.0; + break; + case 'X': + northing = 7900000.0; + break; + default: + northing = -1.0; + } + if (northing >= 0.0) { + return northing; + } + else { + throw ("Invalid zone letter: " + zoneLetter); + } + +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/Point.js + + +function lib_Point_Point(x, y, z) { + if (!(this instanceof lib_Point_Point)) { + return new lib_Point_Point(x, y, z); + } + if (Array.isArray(x)) { + this.x = x[0]; + this.y = x[1]; + this.z = x[2] || 0.0; + } else if(typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z || 0.0; + } else if (typeof x === 'string' && typeof y === 'undefined') { + var coords = x.split(','); + this.x = parseFloat(coords[0], 10); + this.y = parseFloat(coords[1], 10); + this.z = parseFloat(coords[2], 10) || 0.0; + } else { + this.x = x; + this.y = y; + this.z = z || 0.0; + } + console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); +} + +lib_Point_Point.fromMGRS = function(mgrsStr) { + return new lib_Point_Point(mgrs_toPoint(mgrsStr)); +}; +lib_Point_Point.prototype.toMGRS = function(accuracy) { + return mgrs_forward([this.x, this.y], accuracy); +}; +/* harmony default export */ const lib_Point = (lib_Point_Point); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_enfn.js +var C00 = 1; +var C02 = 0.25; +var C04 = 0.046875; +var C06 = 0.01953125; +var C08 = 0.01068115234375; +var C22 = 0.75; +var C44 = 0.46875; +var C46 = 0.01302083333333333333; +var C48 = 0.00712076822916666666; +var C66 = 0.36458333333333333333; +var C68 = 0.00569661458333333333; +var C88 = 0.3076171875; + +/* harmony default export */ function pj_enfn(es) { + var en = []; + en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); + en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); + var t = es * es; + en[2] = t * (C44 - es * (C46 + es * C48)); + t *= es; + en[3] = t * (C66 - es * C68); + en[4] = t * es * C88; + return en; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_mlfn.js +/* harmony default export */ function pj_mlfn(phi, sphi, cphi, en) { + cphi *= sphi; + sphi *= sphi; + return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4])))); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_inv_mlfn.js + + + +var MAX_ITER = 20; + +/* harmony default export */ function pj_inv_mlfn(arg, es, en) { + var k = 1 / (1 - es); + var phi = arg; + for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */ + var s = Math.sin(phi); + var t = 1 - es * s * s; + //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; + //phi -= t * (t * Math.sqrt(t)) * k; + t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; + phi -= t; + if (Math.abs(t) < EPSLN) { + return phi; + } + } + //..reportError("cass:pj_inv_mlfn: Convergence error"); + return phi; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/tmerc.js +// Heavily based on this tmerc projection implementation +// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js + + + + + + + + + +function tmerc_init() { + this.x0 = this.x0 !== undefined ? this.x0 : 0; + this.y0 = this.y0 !== undefined ? this.y0 : 0; + this.long0 = this.long0 !== undefined ? this.long0 : 0; + this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; + + if (this.es) { + this.en = pj_enfn(this.es); + this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); + } +} + +/** + Transverse Mercator Forward - long/lat to x/y + long/lat in radians + */ +function tmerc_forward(p) { + var lon = p.x; + var lat = p.y; + + var delta_lon = adjust_lon(lon - this.long0); + var con; + var x, y; + var sin_phi = Math.sin(lat); + var cos_phi = Math.cos(lat); + + if (!this.es) { + var b = cos_phi * Math.sin(delta_lon); + + if ((Math.abs(Math.abs(b) - 1)) < EPSLN) { + return (93); + } + else { + x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0; + y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2)); + b = Math.abs(y); + + if (b >= 1) { + if ((b - 1) > EPSLN) { + return (93); + } + else { + y = 0; + } + } + else { + y = Math.acos(y); + } + + if (lat < 0) { + y = -y; + } + + y = this.a * this.k0 * (y - this.lat0) + this.y0; + } + } + else { + var al = cos_phi * delta_lon; + var als = Math.pow(al, 2); + var c = this.ep2 * Math.pow(cos_phi, 2); + var cs = Math.pow(c, 2); + var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0; + var t = Math.pow(tq, 2); + var ts = Math.pow(t, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + al = al / Math.sqrt(con); + var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en); + + x = this.a * (this.k0 * al * (1 + + als / 6 * (1 - t + c + + als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c + + als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) + + this.x0; + + y = this.a * (this.k0 * (ml - this.ml0 + + sin_phi * delta_lon * al / 2 * (1 + + als / 12 * (5 - t + 9 * c + 4 * cs + + als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c + + als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) + + this.y0; + } + + p.x = x; + p.y = y; + + return p; +} + +/** + Transverse Mercator Inverse - x/y to long/lat + */ +function tmerc_inverse(p) { + var con, phi; + var lat, lon; + var x = (p.x - this.x0) * (1 / this.a); + var y = (p.y - this.y0) * (1 / this.a); + + if (!this.es) { + var f = Math.exp(x / this.k0); + var g = 0.5 * (f - 1 / f); + var temp = this.lat0 + y / this.k0; + var h = Math.cos(temp); + con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2))); + lat = Math.asin(con); + + if (y < 0) { + lat = -lat; + } + + if ((g === 0) && (h === 0)) { + lon = 0; + } + else { + lon = adjust_lon(Math.atan2(g, h) + this.long0); + } + } + else { // ellipsoidal form + con = this.ml0 + y / this.k0; + phi = pj_inv_mlfn(con, this.es, this.en); + + if (Math.abs(phi) < HALF_PI) { + var sin_phi = Math.sin(phi); + var cos_phi = Math.cos(phi); + var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0; + var c = this.ep2 * Math.pow(cos_phi, 2); + var cs = Math.pow(c, 2); + var t = Math.pow(tan_phi, 2); + var ts = Math.pow(t, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + var d = x * Math.sqrt(con) / this.k0; + var ds = Math.pow(d, 2); + con = con * tan_phi; + + lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 - + ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs - + ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c - + ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t)))); + + lon = adjust_lon(this.long0 + (d * (1 - + ds / 6 * (1 + 2 * t + c - + ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c - + ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi)); + } + else { + lat = HALF_PI * sign(y); + lon = 0; + } + } + + p.x = lon; + p.y = lat; + + return p; +} + +var tmerc_names = ["Fast_Transverse_Mercator", "Fast Transverse Mercator"]; +/* harmony default export */ const tmerc = ({ + init: tmerc_init, + forward: tmerc_forward, + inverse: tmerc_inverse, + names: tmerc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/sinh.js +/* harmony default export */ function sinh(x) { + var r = Math.exp(x); + r = (r - 1 / r) / 2; + return r; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/hypot.js +/* harmony default export */ function hypot(x, y) { + x = Math.abs(x); + y = Math.abs(y); + var a = Math.max(x, y); + var b = Math.min(x, y) / (a ? a : 1); + + return a * Math.sqrt(1 + Math.pow(b, 2)); +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/log1py.js +/* harmony default export */ function log1py(x) { + var y = 1 + x; + var z = y - 1; + + return z === 0 ? x : x * Math.log(y) / z; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/asinhy.js + + + +/* harmony default export */ function asinhy(x) { + var y = Math.abs(x); + y = log1py(y * (1 + y / (hypot(1, y) + 1))); + + return x < 0 ? -y : y; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/gatg.js +/* harmony default export */ function gatg(pp, B) { + var cos_2B = 2 * Math.cos(2 * B); + var i = pp.length - 1; + var h1 = pp[i]; + var h2 = 0; + var h; + + while (--i >= 0) { + h = -h2 + cos_2B * h1 + pp[i]; + h2 = h1; + h1 = h; + } + + return (B + h * Math.sin(2 * B)); +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/clens.js +/* harmony default export */ function clens(pp, arg_r) { + var r = 2 * Math.cos(arg_r); + var i = pp.length - 1; + var hr1 = pp[i]; + var hr2 = 0; + var hr; + + while (--i >= 0) { + hr = -hr2 + r * hr1 + pp[i]; + hr2 = hr1; + hr1 = hr; + } + + return Math.sin(arg_r) * hr; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/cosh.js +/* harmony default export */ function cosh(x) { + var r = Math.exp(x); + r = (r + 1 / r) / 2; + return r; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/clens_cmplx.js + + + +/* harmony default export */ function clens_cmplx(pp, arg_r, arg_i) { + var sin_arg_r = Math.sin(arg_r); + var cos_arg_r = Math.cos(arg_r); + var sinh_arg_i = sinh(arg_i); + var cosh_arg_i = cosh(arg_i); + var r = 2 * cos_arg_r * cosh_arg_i; + var i = -2 * sin_arg_r * sinh_arg_i; + var j = pp.length - 1; + var hr = pp[j]; + var hi1 = 0; + var hr1 = 0; + var hi = 0; + var hr2; + var hi2; + + while (--j >= 0) { + hr2 = hr1; + hi2 = hi1; + hr1 = hr; + hi1 = hi; + hr = -hr2 + r * hr1 - i * hi1 + pp[j]; + hi = -hi2 + i * hr1 + r * hi1; + } + + r = sin_arg_r * cosh_arg_i; + i = cos_arg_r * sinh_arg_i; + + return [r * hr - i * hi, r * hi + i * hr]; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/etmerc.js +// Heavily based on this etmerc projection implementation +// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js + + + + + + + + + + +function etmerc_init() { + if (!this.approx && (isNaN(this.es) || this.es <= 0)) { + throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.'); + } + if (this.approx) { + // When '+approx' is set, use tmerc instead + tmerc.init.apply(this); + this.forward = tmerc.forward; + this.inverse = tmerc.inverse; + } + + this.x0 = this.x0 !== undefined ? this.x0 : 0; + this.y0 = this.y0 !== undefined ? this.y0 : 0; + this.long0 = this.long0 !== undefined ? this.long0 : 0; + this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; + + this.cgb = []; + this.cbg = []; + this.utg = []; + this.gtu = []; + + var f = this.es / (1 + Math.sqrt(1 - this.es)); + var n = f / (2 - f); + var np = n; + + this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 )))))); + this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725)))))); + + np = np * n; + this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945))))); + this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945))))); + + np = np * n; + this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835)))); + this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835)))); + + np = np * n; + this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175))); + this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175))); + + np = np * n; + this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237)); + this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185)); + + np = np * n; + this.cgb[5] = np * (601676 / 22275); + this.cbg[5] = np * (444337 / 155925); + + np = Math.pow(n, 2); + this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256))); + + this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800)))))); + this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800)))))); + + this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720))))); + this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360))))); + + np = np * n; + this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 )))); + this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440)))); + + np = np * n; + this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600))); + this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600))); + + np = np * n; + this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680)); + this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840)); + + np = np * n; + this.utg[5] = np * (-20648693 / 638668800); + this.gtu[5] = np * (212378941 / 319334400); + + var Z = gatg(this.cbg, this.lat0); + this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z)); +} + +function etmerc_forward(p) { + var Ce = adjust_lon(p.x - this.long0); + var Cn = p.y; + + Cn = gatg(this.cbg, Cn); + var sin_Cn = Math.sin(Cn); + var cos_Cn = Math.cos(Cn); + var sin_Ce = Math.sin(Ce); + var cos_Ce = Math.cos(Ce); + + Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); + Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce)); + Ce = asinhy(Math.tan(Ce)); + + var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce); + + Cn = Cn + tmp[0]; + Ce = Ce + tmp[1]; + + var x; + var y; + + if (Math.abs(Ce) <= 2.623395162778) { + x = this.a * (this.Qn * Ce) + this.x0; + y = this.a * (this.Qn * Cn + this.Zb) + this.y0; + } + else { + x = Infinity; + y = Infinity; + } + + p.x = x; + p.y = y; + + return p; +} + +function etmerc_inverse(p) { + var Ce = (p.x - this.x0) * (1 / this.a); + var Cn = (p.y - this.y0) * (1 / this.a); + + Cn = (Cn - this.Zb) / this.Qn; + Ce = Ce / this.Qn; + + var lon; + var lat; + + if (Math.abs(Ce) <= 2.623395162778) { + var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce); + + Cn = Cn + tmp[0]; + Ce = Ce + tmp[1]; + Ce = Math.atan(sinh(Ce)); + + var sin_Cn = Math.sin(Cn); + var cos_Cn = Math.cos(Cn); + var sin_Ce = Math.sin(Ce); + var cos_Ce = Math.cos(Ce); + + Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn)); + Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); + + lon = adjust_lon(Ce + this.long0); + lat = gatg(this.cgb, Cn); + } + else { + lon = Infinity; + lat = Infinity; + } + + p.x = lon; + p.y = lat; + + return p; +} + +var etmerc_names = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc", "Transverse_Mercator", "Transverse Mercator", "tmerc"]; +/* harmony default export */ const etmerc = ({ + init: etmerc_init, + forward: etmerc_forward, + inverse: etmerc_inverse, + names: etmerc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_zone.js + + +/* harmony default export */ function adjust_zone(zone, lon) { + if (zone === undefined) { + zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1; + + if (zone < 0) { + return 0; + } else if (zone > 60) { + return 60; + } + } + return zone; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/utm.js + + +var dependsOn = 'etmerc'; + + + +function utm_init() { + var zone = adjust_zone(this.zone, this.long0); + if (zone === undefined) { + throw new Error('unknown utm zone'); + } + this.lat0 = 0; + this.long0 = ((6 * Math.abs(zone)) - 183) * D2R; + this.x0 = 500000; + this.y0 = this.utmSouth ? 10000000 : 0; + this.k0 = 0.9996; + + etmerc.init.apply(this); + this.forward = etmerc.forward; + this.inverse = etmerc.inverse; +} + +var utm_names = ["Universal Transverse Mercator System", "utm"]; +/* harmony default export */ const utm = ({ + init: utm_init, + names: utm_names, + dependsOn: dependsOn +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/srat.js +/* harmony default export */ function srat(esinp, exp) { + return (Math.pow((1 - esinp) / (1 + esinp), exp)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/gauss.js + +var gauss_MAX_ITER = 20; + + +function gauss_init() { + var sphi = Math.sin(this.lat0); + var cphi = Math.cos(this.lat0); + cphi *= cphi; + this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); + this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); + this.phic0 = Math.asin(sphi / this.C); + this.ratexp = 0.5 * this.C * this.e; + this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); +} + +function gauss_forward(p) { + var lon = p.x; + var lat = p.y; + + p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; + p.x = this.C * lon; + return p; +} + +function gauss_inverse(p) { + var DEL_TOL = 1e-14; + var lon = p.x / this.C; + var lat = p.y; + var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); + for (var i = gauss_MAX_ITER; i > 0; --i) { + lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI; + if (Math.abs(lat - p.y) < DEL_TOL) { + break; + } + p.y = lat; + } + /* convergence failed */ + if (!i) { + return null; + } + p.x = lon; + p.y = lat; + return p; +} + +var gauss_names = ["gauss"]; +/* harmony default export */ const gauss = ({ + init: gauss_init, + forward: gauss_forward, + inverse: gauss_inverse, + names: gauss_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/sterea.js + + + +function sterea_init() { + gauss.init.apply(this); + if (!this.rc) { + return; + } + this.sinc0 = Math.sin(this.phic0); + this.cosc0 = Math.cos(this.phic0); + this.R2 = 2 * this.rc; + if (!this.title) { + this.title = "Oblique Stereographic Alternative"; + } +} + +function sterea_forward(p) { + var sinc, cosc, cosl, k; + p.x = adjust_lon(p.x - this.long0); + gauss.forward.apply(this, [p]); + sinc = Math.sin(p.y); + cosc = Math.cos(p.y); + cosl = Math.cos(p.x); + k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); + p.x = k * cosc * Math.sin(p.x); + p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); + p.x = this.a * p.x + this.x0; + p.y = this.a * p.y + this.y0; + return p; +} + +function sterea_inverse(p) { + var sinc, cosc, lon, lat, rho; + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + + p.x /= this.k0; + p.y /= this.k0; + if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) { + var c = 2 * Math.atan2(rho, this.R2); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); + lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); + } + else { + lat = this.phic0; + lon = 0; + } + + p.x = lon; + p.y = lat; + gauss.inverse.apply(this, [p]); + p.x = adjust_lon(p.x + this.long0); + return p; +} + +var sterea_names = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea","Oblique Stereographic Alternative","Double_Stereographic"]; +/* harmony default export */ const sterea = ({ + init: sterea_init, + forward: sterea_forward, + inverse: sterea_inverse, + names: sterea_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/stere.js + + + + + + + + +function ssfn_(phit, sinphi, eccen) { + sinphi *= eccen; + return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen)); +} + +function stere_init() { + this.coslat0 = Math.cos(this.lat0); + this.sinlat0 = Math.sin(this.lat0); + if (this.sphere) { + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); + } + } + else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (this.lat0 > 0) { + //North pole + //trace('stere:north pole'); + this.con = 1; + } + else { + //South pole + //trace('stere:south pole'); + this.con = -1; + } + } + this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); + } + this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); + this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; + this.cosX0 = Math.cos(this.X0); + this.sinX0 = Math.sin(this.X0); + } +} + +// Stereographic forward equations--mapping lat,long to x,y +function stere_forward(p) { + var lon = p.x; + var lat = p.y; + var sinlat = Math.sin(lat); + var coslat = Math.cos(lat); + var A, X, sinX, cosX, ts, rh; + var dlon = adjust_lon(lon - this.long0); + + if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { + //case of the origine point + //trace('stere:this is the origin point'); + p.x = NaN; + p.y = NaN; + return p; + } + if (this.sphere) { + //trace('stere:sphere case'); + A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); + p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; + p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; + return p; + } + else { + X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; + cosX = Math.cos(X); + sinX = Math.sin(X); + if (Math.abs(this.coslat0) <= EPSLN) { + ts = tsfnz(this.e, lat * this.con, this.con * sinlat); + rh = 2 * this.a * this.k0 * ts / this.cons; + p.x = this.x0 + rh * Math.sin(lon - this.long0); + p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); + //trace(p.toString()); + return p; + } + else if (Math.abs(this.sinlat0) < EPSLN) { + //Eq + //trace('stere:equateur'); + A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); + p.y = A * sinX; + } + else { + //other case + //trace('stere:normal case'); + A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); + p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; + } + p.x = A * cosX * Math.sin(dlon) + this.x0; + } + //trace(p.toString()); + return p; +} + +//* Stereographic inverse equations--mapping x,y to lat/long +function stere_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat, ts, ce, Chi; + var rh = Math.sqrt(p.x * p.x + p.y * p.y); + if (this.sphere) { + var c = 2 * Math.atan(rh / (2 * this.a * this.k0)); + lon = this.long0; + lat = this.lat0; + if (rh <= EPSLN) { + p.x = lon; + p.y = lat; + return p; + } + lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); + if (Math.abs(this.coslat0) < EPSLN) { + if (this.lat0 > 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); + } + else { + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + } + } + else { + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); + } + p.x = lon; + p.y = lat; + return p; + } + else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (rh <= EPSLN) { + lat = this.lat0; + lon = this.long0; + p.x = lon; + p.y = lat; + //trace(p.toString()); + return p; + } + p.x *= this.con; + p.y *= this.con; + ts = rh * this.cons / (2 * this.a * this.k0); + lat = this.con * phi2z(this.e, ts); + lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y)); + } + else { + ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); + lon = this.long0; + if (rh <= EPSLN) { + Chi = this.X0; + } + else { + Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); + } + lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); + } + } + p.x = lon; + p.y = lat; + + //trace(p.toString()); + return p; + +} + +var stere_names = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"]; +/* harmony default export */ const stere = ({ + init: stere_init, + forward: stere_forward, + inverse: stere_inverse, + names: stere_names, + ssfn_: ssfn_ +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/somerc.js +/* + references: + Formules et constantes pour le Calcul pour la + projection cylindrique conforme à axe oblique et pour la transformation entre + des systèmes de référence. + http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf + */ + +function somerc_init() { + var phy0 = this.lat0; + this.lambda0 = this.long0; + var sinPhy0 = Math.sin(phy0); + var semiMajorAxis = this.a; + var invF = this.rf; + var flattening = 1 / invF; + var e2 = 2 * flattening - Math.pow(flattening, 2); + var e = this.e = Math.sqrt(e2); + this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); + this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); + this.b0 = Math.asin(sinPhy0 / this.alpha); + var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); + var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); + var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); + this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; +} + +function somerc_forward(p) { + var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); + var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); + var S = -this.alpha * (Sa1 + Sa2) + this.K; + + // spheric latitude + var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); + + // spheric longitude + var I = this.alpha * (p.x - this.lambda0); + + // psoeudo equatorial rotation + var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); + + var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); + + p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; + p.x = this.R * rotI + this.x0; + return p; +} + +function somerc_inverse(p) { + var Y = p.x - this.x0; + var X = p.y - this.y0; + + var rotI = Y / this.R; + var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); + + var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); + var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); + + var lambda = this.lambda0 + I / this.alpha; + + var S = 0; + var phy = b; + var prevPhy = -1000; + var iteration = 0; + while (Math.abs(phy - prevPhy) > 0.0000001) { + if (++iteration > 20) { + //...reportError("omercFwdInfinity"); + return; + } + //S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); + S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); + prevPhy = phy; + phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; + } + + p.x = lambda; + p.y = phy; + return p; +} + +var somerc_names = ["somerc"]; +/* harmony default export */ const somerc = ({ + init: somerc_init, + forward: somerc_forward, + inverse: somerc_inverse, + names: somerc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/omerc.js + + + + + +var TOL = 1e-7; + +function isTypeA(P) { + var typeAProjections = ['Hotine_Oblique_Mercator','Hotine_Oblique_Mercator_Azimuth_Natural_Origin']; + var projectionName = typeof P.PROJECTION === "object" ? Object.keys(P.PROJECTION)[0] : P.PROJECTION; + + return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1; +} + + +/* Initialize the Oblique Mercator projection + ------------------------------------------*/ +function omerc_init() { + var con, com, cosph0, D, F, H, L, sinph0, p, J, gamma = 0, + gamma0, lamc = 0, lam1 = 0, lam2 = 0, phi1 = 0, phi2 = 0, alpha_c = 0, AB; + + // only Type A uses the no_off or no_uoff property + // https://github.com/OSGeo/proj.4/issues/104 + this.no_off = isTypeA(this); + this.no_rot = 'no_rot' in this; + + var alp = false; + if ("alpha" in this) { + alp = true; + } + + var gam = false; + if ("rectified_grid_angle" in this) { + gam = true; + } + + if (alp) { + alpha_c = this.alpha; + } + + if (gam) { + gamma = (this.rectified_grid_angle * D2R); + } + + if (alp || gam) { + lamc = this.longc; + } else { + lam1 = this.long1; + phi1 = this.lat1; + lam2 = this.long2; + phi2 = this.lat2; + + if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL || + Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL || + Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) { + throw new Error(); + } + } + + var one_es = 1.0 - this.es; + com = Math.sqrt(one_es); + + if (Math.abs(this.lat0) > EPSLN) { + sinph0 = Math.sin(this.lat0); + cosph0 = Math.cos(this.lat0); + con = 1 - this.es * sinph0 * sinph0; + this.B = cosph0 * cosph0; + this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es); + this.A = this.B * this.k0 * com / con; + D = this.B * com / (cosph0 * Math.sqrt(con)); + F = D * D -1; + + if (F <= 0) { + F = 0; + } else { + F = Math.sqrt(F); + if (this.lat0 < 0) { + F = -F; + } + } + + this.E = F += D; + this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B); + } else { + this.B = 1 / com; + this.A = this.k0; + this.E = D = F = 1; + } + + if (alp || gam) { + if (alp) { + gamma0 = Math.asin(Math.sin(alpha_c) / D); + if (!gam) { + gamma = alpha_c; + } + } else { + gamma0 = gamma; + alpha_c = Math.asin(D * Math.sin(gamma0)); + } + this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B; + } else { + H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B); + L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B); + F = this.E / H; + p = (L - H) / (L + H); + J = this.E * this.E; + J = (J - L * H) / (J + L * H); + con = lam1 - lam2; + + if (con < -Math.pi) { + lam2 -=TWO_PI; + } else if (con > Math.pi) { + lam2 += TWO_PI; + } + + this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B); + gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0)) / (F - 1 / F)); + gamma = alpha_c = Math.asin(D * Math.sin(gamma0)); + } + + this.singam = Math.sin(gamma0); + this.cosgam = Math.cos(gamma0); + this.sinrot = Math.sin(gamma); + this.cosrot = Math.cos(gamma); + + this.rB = 1 / this.B; + this.ArB = this.A * this.rB; + this.BrA = 1 / this.ArB; + AB = this.A * this.B; + + if (this.no_off) { + this.u_0 = 0; + } else { + this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c))); + + if (this.lat0 < 0) { + this.u_0 = - this.u_0; + } + } + + F = 0.5 * gamma0; + this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F)); + this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F)); +} + + +/* Oblique Mercator forward equations--mapping lat,long to x,y + ----------------------------------------------------------*/ +function omerc_forward(p) { + var coords = {}; + var S, T, U, V, W, temp, u, v; + p.x = p.x - this.lam0; + + if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) { + W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B); + + temp = 1 / W; + S = 0.5 * (W - temp); + T = 0.5 * (W + temp); + V = Math.sin(this.B * p.x); + U = (S * this.singam - V * this.cosgam) / T; + + if (Math.abs(Math.abs(U) - 1.0) < EPSLN) { + throw new Error(); + } + + v = 0.5 * this.ArB * Math.log((1 - U)/(1 + U)); + temp = Math.cos(this.B * p.x); + + if (Math.abs(temp) < TOL) { + u = this.A * p.x; + } else { + u = this.ArB * Math.atan2((S * this.cosgam + V * this.singam), temp); + } + } else { + v = p.y > 0 ? this.v_pole_n : this.v_pole_s; + u = this.ArB * p.y; + } + + if (this.no_rot) { + coords.x = u; + coords.y = v; + } else { + u -= this.u_0; + coords.x = v * this.cosrot + u * this.sinrot; + coords.y = u * this.cosrot - v * this.sinrot; + } + + coords.x = (this.a * coords.x + this.x0); + coords.y = (this.a * coords.y + this.y0); + + return coords; +} + +function omerc_inverse(p) { + var u, v, Qp, Sp, Tp, Vp, Up; + var coords = {}; + + p.x = (p.x - this.x0) * (1.0 / this.a); + p.y = (p.y - this.y0) * (1.0 / this.a); + + if (this.no_rot) { + v = p.y; + u = p.x; + } else { + v = p.x * this.cosrot - p.y * this.sinrot; + u = p.y * this.cosrot + p.x * this.sinrot + this.u_0; + } + + Qp = Math.exp(-this.BrA * v); + Sp = 0.5 * (Qp - 1 / Qp); + Tp = 0.5 * (Qp + 1 / Qp); + Vp = Math.sin(this.BrA * u); + Up = (Vp * this.cosgam + Sp * this.singam) / Tp; + + if (Math.abs(Math.abs(Up) - 1) < EPSLN) { + coords.x = 0; + coords.y = Up < 0 ? -HALF_PI : HALF_PI; + } else { + coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up)); + coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B)); + + if (coords.y === Infinity) { + throw new Error(); + } + + coords.x = -this.rB * Math.atan2((Sp * this.cosgam - Vp * this.singam), Math.cos(this.BrA * u)); + } + + coords.x += this.lam0; + + return coords; +} + +var omerc_names = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "Oblique_Mercator", "omerc"]; +/* harmony default export */ const omerc = ({ + init: omerc_init, + forward: omerc_forward, + inverse: omerc_inverse, + names: omerc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/lcc.js + + + + + + +function lcc_init() { + + //double lat0; /* the reference latitude */ + //double long0; /* the reference longitude */ + //double lat1; /* first standard parallel */ + //double lat2; /* second standard parallel */ + //double r_maj; /* major axis */ + //double r_min; /* minor axis */ + //double false_east; /* x offset in meters */ + //double false_north; /* y offset in meters */ + + //the above value can be set with proj4.defs + //example: proj4.defs("EPSG:2154","+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"); + + if (!this.lat2) { + this.lat2 = this.lat1; + } //if lat2 is not defined + if (!this.k0) { + this.k0 = 1; + } + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + // Standard Parallels cannot be equal and on opposite sides of the equator + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + + var temp = this.b / this.a; + this.e = Math.sqrt(1 - temp * temp); + + var sin1 = Math.sin(this.lat1); + var cos1 = Math.cos(this.lat1); + var ms1 = msfnz(this.e, sin1, cos1); + var ts1 = tsfnz(this.e, this.lat1, sin1); + + var sin2 = Math.sin(this.lat2); + var cos2 = Math.cos(this.lat2); + var ms2 = msfnz(this.e, sin2, cos2); + var ts2 = tsfnz(this.e, this.lat2, sin2); + + var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); + + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); + } + else { + this.ns = sin1; + } + if (isNaN(this.ns)) { + this.ns = sin1; + } + this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); + this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); + if (!this.title) { + this.title = "Lambert Conformal Conic"; + } +} + +// Lambert Conformal conic forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- +function lcc_forward(p) { + + var lon = p.x; + var lat = p.y; + + // singular cases : + if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { + lat = sign(lat) * (HALF_PI - 2 * EPSLN); + } + + var con = Math.abs(Math.abs(lat) - HALF_PI); + var ts, rh1; + if (con > EPSLN) { + ts = tsfnz(this.e, lat, Math.sin(lat)); + rh1 = this.a * this.f0 * Math.pow(ts, this.ns); + } + else { + con = lat * this.ns; + if (con <= 0) { + return null; + } + rh1 = 0; + } + var theta = this.ns * adjust_lon(lon - this.long0); + p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; + p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; + + return p; +} + +// Lambert Conformal Conic inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- +function lcc_inverse(p) { + + var rh1, con, ts; + var lat, lon; + var x = (p.x - this.x0) / this.k0; + var y = (this.rh - (p.y - this.y0) / this.k0); + if (this.ns > 0) { + rh1 = Math.sqrt(x * x + y * y); + con = 1; + } + else { + rh1 = -Math.sqrt(x * x + y * y); + con = -1; + } + var theta = 0; + if (rh1 !== 0) { + theta = Math.atan2((con * x), (con * y)); + } + if ((rh1 !== 0) || (this.ns > 0)) { + con = 1 / this.ns; + ts = Math.pow((rh1 / (this.a * this.f0)), con); + lat = phi2z(this.e, ts); + if (lat === -9999) { + return null; + } + } + else { + lat = -HALF_PI; + } + lon = adjust_lon(theta / this.ns + this.long0); + + p.x = lon; + p.y = lat; + return p; +} + +var lcc_names = [ + "Lambert Tangential Conformal Conic Projection", + "Lambert_Conformal_Conic", + "Lambert_Conformal_Conic_1SP", + "Lambert_Conformal_Conic_2SP", + "lcc" +]; + +/* harmony default export */ const lcc = ({ + init: lcc_init, + forward: lcc_forward, + inverse: lcc_inverse, + names: lcc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/krovak.js + + +function krovak_init() { + this.a = 6377397.155; + this.es = 0.006674372230614; + this.e = Math.sqrt(this.es); + if (!this.lat0) { + this.lat0 = 0.863937979737193; + } + if (!this.long0) { + this.long0 = 0.7417649320975901 - 0.308341501185665; + } + /* if scale not set default to 0.9999 */ + if (!this.k0) { + this.k0 = 0.9999; + } + this.s45 = 0.785398163397448; /* 45 */ + this.s90 = 2 * this.s45; + this.fi0 = this.lat0; + this.e2 = this.es; + this.e = Math.sqrt(this.e2); + this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2)); + this.uq = 1.04216856380474; + this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa); + this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2); + this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g; + this.k1 = this.k0; + this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)); + this.s0 = 1.37008346281555; + this.n = Math.sin(this.s0); + this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); + this.ad = this.s90 - this.uq; +} + +/* ellipsoid */ +/* calculate xy from lat/lon */ +/* Constants, identical to inverse transform function */ +function krovak_forward(p) { + var gfi, u, deltav, s, d, eps, ro; + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + /* Transformation */ + gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2)); + u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); + deltav = -delta_lon * this.alfa; + s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); + d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); + eps = this.n * d; + ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); + p.y = ro * Math.cos(eps) / 1; + p.x = ro * Math.sin(eps) / 1; + + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + return (p); +} + +/* calculate lat/lon from xy */ +function krovak_inverse(p) { + var u, deltav, s, d, eps, ro, fi1; + var ok; + + /* Transformation */ + /* revert y, x*/ + var tmp = p.x; + p.x = p.y; + p.y = tmp; + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + ro = Math.sqrt(p.x * p.x + p.y * p.y); + eps = Math.atan2(p.y, p.x); + d = eps / Math.sin(this.s0); + s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); + u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); + deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); + p.x = this.long0 - deltav / this.alfa; + fi1 = u; + ok = 0; + var iter = 0; + do { + p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); + if (Math.abs(fi1 - p.y) < 0.0000000001) { + ok = 1; + } + fi1 = p.y; + iter += 1; + } while (ok === 0 && iter < 15); + if (iter >= 15) { + return null; + } + + return (p); +} + +var krovak_names = ["Krovak", "krovak"]; +/* harmony default export */ const krovak = ({ + init: krovak_init, + forward: krovak_forward, + inverse: krovak_inverse, + names: krovak_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/mlfn.js +/* harmony default export */ function mlfn(e0, e1, e2, e3, phi) { + return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e0fn.js +/* harmony default export */ function e0fn(x) { + return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x))); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e1fn.js +/* harmony default export */ function e1fn(x) { + return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x))); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e2fn.js +/* harmony default export */ function e2fn(x) { + return (0.05859375 * x * x * (1 + 0.75 * x)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e3fn.js +/* harmony default export */ function e3fn(x) { + return (x * x * x * (35 / 3072)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/gN.js +/* harmony default export */ function gN(a, e, sinphi) { + var temp = e * sinphi; + return a / Math.sqrt(1 - temp * temp); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_lat.js + + + +/* harmony default export */ function adjust_lat(x) { + return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI)); +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/imlfn.js +/* harmony default export */ function imlfn(ml, e0, e1, e2, e3) { + var phi; + var dphi; + + phi = ml / e0; + for (var i = 0; i < 15; i++) { + dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); + phi += dphi; + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } + + //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); + return NaN; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/cass.js + + + + + + + + + + + +function cass_init() { + if (!this.sphere) { + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + } +} + +/* Cassini forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ +function cass_forward(p) { + + /* Forward equations + -----------------*/ + var x, y; + var lam = p.x; + var phi = p.y; + lam = adjust_lon(lam - this.long0); + + if (this.sphere) { + x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); + y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); + } + else { + //ellipsoid + var sinphi = Math.sin(phi); + var cosphi = Math.cos(phi); + var nl = gN(this.a, this.e, sinphi); + var tl = Math.tan(phi) * Math.tan(phi); + var al = lam * Math.cos(phi); + var asq = al * al; + var cl = this.es * cosphi * cosphi / (1 - this.es); + var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + + x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); + y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); + + + } + + p.x = x + this.x0; + p.y = y + this.y0; + return p; +} + +/* Inverse equations + -----------------*/ +function cass_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var phi, lam; + + if (this.sphere) { + var dd = y + this.lat0; + phi = Math.asin(Math.sin(dd) * Math.cos(x)); + lam = Math.atan2(Math.tan(x), Math.cos(dd)); + } + else { + /* ellipsoid */ + var ml1 = this.ml0 / this.a + y; + var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); + if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { + p.x = this.long0; + p.y = HALF_PI; + if (y < 0) { + p.y *= -1; + } + return p; + } + var nl1 = gN(this.a, this.e, Math.sin(phi1)); + + var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); + var tl1 = Math.pow(Math.tan(phi1), 2); + var dl = x * this.a / nl1; + var dsq = dl * dl; + phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); + lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); + + } + + p.x = adjust_lon(lam + this.long0); + p.y = adjust_lat(phi); + return p; + +} + +var cass_names = ["Cassini", "Cassini_Soldner", "cass"]; +/* harmony default export */ const cass = ({ + init: cass_init, + forward: cass_forward, + inverse: cass_inverse, + names: cass_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/qsfnz.js +/* harmony default export */ function qsfnz(eccent, sinphi) { + var con; + if (eccent > 1.0e-7) { + con = eccent * sinphi; + return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con)))); + } + else { + return (2 * sinphi); + } +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/laea.js + + + + + + +/* + reference + "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + */ + +var S_POLE = 1; + +var N_POLE = 2; +var EQUIT = 3; +var OBLIQ = 4; + +/* Initialize the Lambert Azimuthal Equal Area projection + ------------------------------------------------------*/ +function laea_init() { + var t = Math.abs(this.lat0); + if (Math.abs(t - HALF_PI) < EPSLN) { + this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; + } + else if (Math.abs(t) < EPSLN) { + this.mode = this.EQUIT; + } + else { + this.mode = this.OBLIQ; + } + if (this.es > 0) { + var sinphi; + + this.qp = qsfnz(this.e, 1); + this.mmf = 0.5 / (1 - this.es); + this.apa = authset(this.es); + switch (this.mode) { + case this.N_POLE: + this.dd = 1; + break; + case this.S_POLE: + this.dd = 1; + break; + case this.EQUIT: + this.rq = Math.sqrt(0.5 * this.qp); + this.dd = 1 / this.rq; + this.xmf = 1; + this.ymf = 0.5 * this.qp; + break; + case this.OBLIQ: + this.rq = Math.sqrt(0.5 * this.qp); + sinphi = Math.sin(this.lat0); + this.sinb1 = qsfnz(this.e, sinphi) / this.qp; + this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); + this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); + this.ymf = (this.xmf = this.rq) / this.dd; + this.xmf *= this.dd; + break; + } + } + else { + if (this.mode === this.OBLIQ) { + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + } +} + +/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ +function laea_forward(p) { + + /* Forward equations + -----------------*/ + var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; + var lam = p.x; + var phi = p.y; + + lam = adjust_lon(lam - this.long0); + if (this.sphere) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + coslam = Math.cos(lam); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + if (y <= EPSLN) { + return null; + } + y = Math.sqrt(2 / y); + x = y * cosphi * Math.sin(lam); + y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + } + else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + coslam = -coslam; + } + if (Math.abs(phi + this.lat0) < EPSLN) { + return null; + } + y = FORTPI - phi * 0.5; + y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y)); + x = y * Math.sin(lam); + y *= coslam; + } + } + else { + sinb = 0; + cosb = 0; + b = 0; + coslam = Math.cos(lam); + sinlam = Math.sin(lam); + sinphi = Math.sin(phi); + q = qsfnz(this.e, sinphi); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinb = q / this.qp; + cosb = Math.sqrt(1 - sinb * sinb); + } + switch (this.mode) { + case this.OBLIQ: + b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; + break; + case this.EQUIT: + b = 1 + cosb * coslam; + break; + case this.N_POLE: + b = HALF_PI + phi; + q = this.qp - q; + break; + case this.S_POLE: + b = phi - HALF_PI; + q = this.qp + q; + break; + } + if (Math.abs(b) < EPSLN) { + return null; + } + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + b = Math.sqrt(2 / b); + if (this.mode === this.OBLIQ) { + y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); + } + else { + y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; + } + x = this.xmf * b * cosb * sinlam; + break; + case this.N_POLE: + case this.S_POLE: + if (q >= 0) { + x = (b = Math.sqrt(q)) * sinlam; + y = coslam * ((this.mode === this.S_POLE) ? b : -b); + } + else { + x = y = 0; + } + break; + } + } + + p.x = this.a * x + this.x0; + p.y = this.a * y + this.y0; + return p; +} + +/* Inverse equations + -----------------*/ +function laea_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var lam, phi, cCe, sCe, q, rho, ab; + if (this.sphere) { + var cosz = 0, + rh, sinz = 0; + + rh = Math.sqrt(x * x + y * y); + phi = rh * 0.5; + if (phi > 1) { + return null; + } + phi = 2 * Math.asin(phi); + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinz = Math.sin(phi); + cosz = Math.cos(phi); + } + switch (this.mode) { + case this.EQUIT: + phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh); + x *= sinz; + y = cosz * rh; + break; + case this.OBLIQ: + phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); + x *= sinz * this.cosph0; + y = (cosz - Math.sin(phi) * this.sinph0) * rh; + break; + case this.N_POLE: + y = -y; + phi = HALF_PI - phi; + break; + case this.S_POLE: + phi -= HALF_PI; + break; + } + lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y); + } + else { + ab = 0; + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + x /= this.dd; + y *= this.dd; + rho = Math.sqrt(x * x + y * y); + if (rho < EPSLN) { + p.x = this.long0; + p.y = this.lat0; + return p; + } + sCe = 2 * Math.asin(0.5 * rho / this.rq); + cCe = Math.cos(sCe); + x *= (sCe = Math.sin(sCe)); + if (this.mode === this.OBLIQ) { + ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; + q = this.qp * ab; + y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; + } + else { + ab = y * sCe / rho; + q = this.qp * ab; + y = rho * cCe; + } + } + else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + y = -y; + } + q = (x * x + y * y); + if (!q) { + p.x = this.long0; + p.y = this.lat0; + return p; + } + ab = 1 - q / this.qp; + if (this.mode === this.S_POLE) { + ab = -ab; + } + } + lam = Math.atan2(x, y); + phi = authlat(Math.asin(ab), this.apa); + } + + p.x = adjust_lon(this.long0 + lam); + p.y = phi; + return p; +} + +/* determine latitude from authalic latitude */ +var P00 = 0.33333333333333333333; + +var P01 = 0.17222222222222222222; +var P02 = 0.10257936507936507936; +var P10 = 0.06388888888888888888; +var P11 = 0.06640211640211640211; +var P20 = 0.01641501294219154443; + +function authset(es) { + var t; + var APA = []; + APA[0] = es * P00; + t = es * es; + APA[0] += t * P01; + APA[1] = t * P10; + t *= es; + APA[0] += t * P02; + APA[1] += t * P11; + APA[2] = t * P20; + return APA; +} + +function authlat(beta, APA) { + var t = beta + beta; + return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t)); +} + +var laea_names = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; +/* harmony default export */ const laea = ({ + init: laea_init, + forward: laea_forward, + inverse: laea_inverse, + names: laea_names, + S_POLE: S_POLE, + N_POLE: N_POLE, + EQUIT: EQUIT, + OBLIQ: OBLIQ +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/asinz.js +/* harmony default export */ function asinz(x) { + if (Math.abs(x) > 1) { + x = (x > 1) ? 1 : -1; + } + return Math.asin(x); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/aea.js + + + + + + +function aea_init() { + + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); + this.e3 = Math.sqrt(this.es); + + this.sin_po = Math.sin(this.lat1); + this.cos_po = Math.cos(this.lat1); + this.t1 = this.sin_po; + this.con = this.sin_po; + this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po); + + this.sin_po = Math.sin(this.lat2); + this.cos_po = Math.cos(this.lat2); + this.t2 = this.sin_po; + this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po); + + this.sin_po = Math.sin(this.lat0); + this.cos_po = Math.cos(this.lat0); + this.t3 = this.sin_po; + this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po); + + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); + } + else { + this.ns0 = this.con; + } + this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; + this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0; +} + +/* Albers Conical Equal Area forward equations--mapping lat,long to x,y + -------------------------------------------------------------------*/ +function aea_forward(p) { + + var lon = p.x; + var lat = p.y; + + this.sin_phi = Math.sin(lat); + this.cos_phi = Math.cos(lat); + + var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi); + var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; + var theta = this.ns0 * adjust_lon(lon - this.long0); + var x = rh1 * Math.sin(theta) + this.x0; + var y = this.rh - rh1 * Math.cos(theta) + this.y0; + + p.x = x; + p.y = y; + return p; +} + +function aea_inverse(p) { + var rh1, qs, con, theta, lon, lat; + + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + if (this.ns0 >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } + else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + theta = 0; + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + con = rh1 * this.ns0 / this.a; + if (this.sphere) { + lat = Math.asin((this.c - con * con) / (2 * this.ns0)); + } + else { + qs = (this.c - con * con) / this.ns0; + lat = this.phi1z(this.e3, qs); + } + + lon = adjust_lon(theta / this.ns0 + this.long0); + p.x = lon; + p.y = lat; + return p; +} + +/* Function to compute phi1, the latitude for the inverse of the + Albers Conical Equal-Area projection. +-------------------------------------------*/ +function phi1z(eccent, qs) { + var sinphi, cosphi, con, com, dphi; + var phi = asinz(0.5 * qs); + if (eccent < EPSLN) { + return phi; + } + + var eccnts = eccent * eccent; + for (var i = 1; i <= 25; i++) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + con = eccent * sinphi; + com = 1 - con * con; + dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi = phi + dphi; + if (Math.abs(dphi) <= 1e-7) { + return phi; + } + } + return null; +} + +var aea_names = ["Albers_Conic_Equal_Area", "Albers", "aea"]; +/* harmony default export */ const aea = ({ + init: aea_init, + forward: aea_forward, + inverse: aea_inverse, + names: aea_names, + phi1z: phi1z +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/gnom.js + + + + +/* + reference: + Wolfram Mathworld "Gnomonic Projection" + http://mathworld.wolfram.com/GnomonicProjection.html + Accessed: 12th November 2009 + */ +function gnom_init() { + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.sin_p14 = Math.sin(this.lat0); + this.cos_p14 = Math.cos(this.lat0); + // Approximation for projecting points to the horizon (infinity) + this.infinity_dist = 1000 * this.a; + this.rc = 1; +} + +/* Gnomonic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ +function gnom_forward(p) { + var sinphi, cosphi; /* sin and cos value */ + var dlon; /* delta longitude value */ + var coslon; /* cos of longitude */ + var ksp; /* scale factor */ + var g; + var x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + dlon = adjust_lon(lon - this.long0); + + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1; + if ((g > 0) || (Math.abs(g) <= EPSLN)) { + x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; + } + else { + + // Point is in the opposing hemisphere and is unprojectable + // We still need to return a reasonable point, so we project + // to infinity, on a bearing + // equivalent to the northern hemisphere equivalent + // This is a reasonable approximation for short shapes and lines that + // straddle the horizon. + + x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); + y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + + } + p.x = x; + p.y = y; + return p; +} + +function gnom_inverse(p) { + var rh; /* Rho */ + var sinc, cosc; + var c; + var lon, lat; + + /* Inverse equations + -----------------*/ + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + + p.x /= this.k0; + p.y /= this.k0; + + if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) { + c = Math.atan2(rh, this.rc); + sinc = Math.sin(c); + cosc = Math.cos(c); + + lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh); + lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); + lon = adjust_lon(this.long0 + lon); + } + else { + lat = this.phic0; + lon = 0; + } + + p.x = lon; + p.y = lat; + return p; +} + +var gnom_names = ["gnom"]; +/* harmony default export */ const gnom = ({ + init: gnom_init, + forward: gnom_forward, + inverse: gnom_inverse, + names: gnom_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/iqsfnz.js + + +/* harmony default export */ function iqsfnz(eccent, q) { + var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); + if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { + if (q < 0) { + return (-1 * HALF_PI); + } + else { + return HALF_PI; + } + } + //var phi = 0.5* q/(1-eccent*eccent); + var phi = Math.asin(0.5 * q); + var dphi; + var sin_phi; + var cos_phi; + var con; + for (var i = 0; i < 30; i++) { + sin_phi = Math.sin(phi); + cos_phi = Math.cos(phi); + con = eccent * sin_phi; + dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi += dphi; + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } + + //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); + return NaN; +} + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/cea.js + + + + + +/* + reference: + "Cartographic Projection Procedures for the UNIX Environment- + A User's Manual" by Gerald I. Evenden, + USGS Open File Report 90-284and Release 4 Interim Reports (2003) +*/ +function cea_init() { + //no-op + if (!this.sphere) { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } +} + +/* Cylindrical Equal Area forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ +function cea_forward(p) { + var lon = p.x; + var lat = p.y; + var x, y; + /* Forward equations + -----------------*/ + var dlon = adjust_lon(lon - this.long0); + if (this.sphere) { + x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); + y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); + } + else { + var qs = qsfnz(this.e, Math.sin(lat)); + x = this.x0 + this.a * this.k0 * dlon; + y = this.y0 + this.a * qs * 0.5 / this.k0; + } + + p.x = x; + p.y = y; + return p; +} + +/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ +function cea_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat; + + if (this.sphere) { + lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts)); + lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts)); + } + else { + lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); + lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); + } + + p.x = lon; + p.y = lat; + return p; +} + +var cea_names = ["cea"]; +/* harmony default export */ const cea = ({ + init: cea_init, + forward: cea_forward, + inverse: cea_inverse, + names: cea_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/eqc.js + + + +function eqc_init() { + + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.lat0 = this.lat0 || 0; + this.long0 = this.long0 || 0; + this.lat_ts = this.lat_ts || 0; + this.title = this.title || "Equidistant Cylindrical (Plate Carre)"; + + this.rc = Math.cos(this.lat_ts); +} + +// forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- +function eqc_forward(p) { + + var lon = p.x; + var lat = p.y; + + var dlon = adjust_lon(lon - this.long0); + var dlat = adjust_lat(lat - this.lat0); + p.x = this.x0 + (this.a * dlon * this.rc); + p.y = this.y0 + (this.a * dlat); + return p; +} + +// inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- +function eqc_inverse(p) { + + var x = p.x; + var y = p.y; + + p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc))); + p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a))); + return p; +} + +var eqc_names = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; +/* harmony default export */ const eqc = ({ + init: eqc_init, + forward: eqc_forward, + inverse: eqc_inverse, + names: eqc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/poly.js + + + + + + + + + + +var poly_MAX_ITER = 20; + +function poly_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles + this.e = Math.sqrt(this.es); + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas +} + +/* Polyconic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ +function poly_forward(p) { + var lon = p.x; + var lat = p.y; + var x, y, el; + var dlon = adjust_lon(lon - this.long0); + el = dlon * Math.sin(lat); + if (this.sphere) { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.a * this.lat0; + } + else { + x = this.a * Math.sin(el) / Math.tan(lat); + y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); + } + } + else { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.ml0; + } + else { + var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); + x = nl * Math.sin(el); + y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); + } + + } + p.x = x + this.x0; + p.y = y + this.y0; + return p; +} + +/* Inverse equations + -----------------*/ +function poly_inverse(p) { + var lon, lat, x, y, i; + var al, bl; + var phi, dphi; + x = p.x - this.x0; + y = p.y - this.y0; + + if (this.sphere) { + if (Math.abs(y + this.a * this.lat0) <= EPSLN) { + lon = adjust_lon(x / this.a + this.long0); + lat = 0; + } + else { + al = this.lat0 + y / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var tanphi; + for (i = poly_MAX_ITER; i; --i) { + tanphi = Math.tan(phi); + dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); + phi += dphi; + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } + lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat)); + } + } + else { + if (Math.abs(y + this.ml0) <= EPSLN) { + lat = 0; + lon = adjust_lon(this.long0 + x / this.a); + } + else { + + al = (this.ml0 + y) / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var cl, mln, mlnp, ma; + var con; + for (i = poly_MAX_ITER; i; --i) { + con = this.e * Math.sin(phi); + cl = Math.sqrt(1 - con * con) * Math.tan(phi); + mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); + ma = mln / this.a; + dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); + phi -= dphi; + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } + + //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); + cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); + lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); + } + } + + p.x = lon; + p.y = lat; + return p; +} + +var poly_names = ["Polyconic", "poly"]; +/* harmony default export */ const poly = ({ + init: poly_init, + forward: poly_forward, + inverse: poly_inverse, + names: poly_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/nzmg.js + + +/* + reference + Department of Land and Survey Technical Circular 1973/32 + http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf + OSG Technical Report 4.1 + http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf + */ + +/** + * iterations: Number of iterations to refine inverse transform. + * 0 -> km accuracy + * 1 -> m accuracy -- suitable for most mapping applications + * 2 -> mm accuracy + */ +var iterations = 1; + +function nzmg_init() { + this.A = []; + this.A[1] = 0.6399175073; + this.A[2] = -0.1358797613; + this.A[3] = 0.063294409; + this.A[4] = -0.02526853; + this.A[5] = 0.0117879; + this.A[6] = -0.0055161; + this.A[7] = 0.0026906; + this.A[8] = -0.001333; + this.A[9] = 0.00067; + this.A[10] = -0.00034; + + this.B_re = []; + this.B_im = []; + this.B_re[1] = 0.7557853228; + this.B_im[1] = 0; + this.B_re[2] = 0.249204646; + this.B_im[2] = 0.003371507; + this.B_re[3] = -0.001541739; + this.B_im[3] = 0.041058560; + this.B_re[4] = -0.10162907; + this.B_im[4] = 0.01727609; + this.B_re[5] = -0.26623489; + this.B_im[5] = -0.36249218; + this.B_re[6] = -0.6870983; + this.B_im[6] = -1.1651967; + + this.C_re = []; + this.C_im = []; + this.C_re[1] = 1.3231270439; + this.C_im[1] = 0; + this.C_re[2] = -0.577245789; + this.C_im[2] = -0.007809598; + this.C_re[3] = 0.508307513; + this.C_im[3] = -0.112208952; + this.C_re[4] = -0.15094762; + this.C_im[4] = 0.18200602; + this.C_re[5] = 1.01418179; + this.C_im[5] = 1.64497696; + this.C_re[6] = 1.9660549; + this.C_im[6] = 2.5127645; + + this.D = []; + this.D[1] = 1.5627014243; + this.D[2] = 0.5185406398; + this.D[3] = -0.03333098; + this.D[4] = -0.1052906; + this.D[5] = -0.0368594; + this.D[6] = 0.007317; + this.D[7] = 0.01220; + this.D[8] = 0.00394; + this.D[9] = -0.0013; +} + +/** + New Zealand Map Grid Forward - long/lat to x/y + long/lat in radians + */ +function nzmg_forward(p) { + var n; + var lon = p.x; + var lat = p.y; + + var delta_lat = lat - this.lat0; + var delta_lon = lon - this.long0; + + // 1. Calculate d_phi and d_psi ... // and d_lambda + // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. + var d_phi = delta_lat / SEC_TO_RAD * 1E-5; + var d_lambda = delta_lon; + var d_phi_n = 1; // d_phi^0 + + var d_psi = 0; + for (n = 1; n <= 10; n++) { + d_phi_n = d_phi_n * d_phi; + d_psi = d_psi + this.A[n] * d_phi_n; + } + + // 2. Calculate theta + var th_re = d_psi; + var th_im = d_lambda; + + // 3. Calculate z + var th_n_re = 1; + var th_n_im = 0; // theta^0 + var th_n_re1; + var th_n_im1; + + var z_re = 0; + var z_im = 0; + for (n = 1; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; + z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; + } + + // 4. Calculate easting and northing + p.x = (z_im * this.a) + this.x0; + p.y = (z_re * this.a) + this.y0; + + return p; +} + +/** + New Zealand Map Grid Inverse - x/y to long/lat + */ +function nzmg_inverse(p) { + var n; + var x = p.x; + var y = p.y; + + var delta_x = x - this.x0; + var delta_y = y - this.y0; + + // 1. Calculate z + var z_re = delta_y / this.a; + var z_im = delta_x / this.a; + + // 2a. Calculate theta - first approximation gives km accuracy + var z_n_re = 1; + var z_n_im = 0; // z^0 + var z_n_re1; + var z_n_im1; + + var th_re = 0; + var th_im = 0; + for (n = 1; n <= 6; n++) { + z_n_re1 = z_n_re * z_re - z_n_im * z_im; + z_n_im1 = z_n_im * z_re + z_n_re * z_im; + z_n_re = z_n_re1; + z_n_im = z_n_im1; + th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; + th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; + } + + // 2b. Iterate to refine the accuracy of the calculation + // 0 iterations gives km accuracy + // 1 iteration gives m accuracy -- good enough for most mapping applications + // 2 iterations bives mm accuracy + for (var i = 0; i < this.iterations; i++) { + var th_n_re = th_re; + var th_n_im = th_im; + var th_n_re1; + var th_n_im1; + + var num_re = z_re; + var num_im = z_im; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } + + th_n_re = 1; + th_n_im = 0; + var den_re = this.B_re[1]; + var den_im = this.B_im[1]; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } + + // Complex division + var den2 = den_re * den_re + den_im * den_im; + th_re = (num_re * den_re + num_im * den_im) / den2; + th_im = (num_im * den_re - num_re * den_im) / den2; + } + + // 3. Calculate d_phi ... // and d_lambda + var d_psi = th_re; + var d_lambda = th_im; + var d_psi_n = 1; // d_psi^0 + + var d_phi = 0; + for (n = 1; n <= 9; n++) { + d_psi_n = d_psi_n * d_psi; + d_phi = d_phi + this.D[n] * d_psi_n; + } + + // 4. Calculate latitude and longitude + // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. + var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5); + var lon = this.long0 + d_lambda; + + p.x = lon; + p.y = lat; + + return p; +} + +var nzmg_names = ["New_Zealand_Map_Grid", "nzmg"]; +/* harmony default export */ const nzmg = ({ + init: nzmg_init, + forward: nzmg_forward, + inverse: nzmg_inverse, + names: nzmg_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/mill.js + + +/* + reference + "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + */ + + +/* Initialize the Miller Cylindrical projection + -------------------------------------------*/ +function mill_init() { + //no-op +} + +/* Miller Cylindrical forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ +function mill_forward(p) { + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + var dlon = adjust_lon(lon - this.long0); + var x = this.x0 + this.a * dlon; + var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25; + + p.x = x; + p.y = y; + return p; +} + +/* Miller Cylindrical inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ +function mill_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + + var lon = adjust_lon(this.long0 + p.x / this.a); + var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); + + p.x = lon; + p.y = lat; + return p; +} + +var mill_names = ["Miller_Cylindrical", "mill"]; +/* harmony default export */ const mill = ({ + init: mill_init, + forward: mill_forward, + inverse: mill_inverse, + names: mill_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/sinu.js + + + +var sinu_MAX_ITER = 20; + + + + + + + +function sinu_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + + + if (!this.sphere) { + this.en = pj_enfn(this.es); + } + else { + this.n = 1; + this.m = 0; + this.es = 0; + this.C_y = Math.sqrt((this.m + 1) / this.n); + this.C_x = this.C_y / (this.m + 1); + } + +} + +/* Sinusoidal forward equations--mapping lat,long to x,y + -----------------------------------------------------*/ +function sinu_forward(p) { + var x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + lon = adjust_lon(lon - this.long0); + + if (this.sphere) { + if (!this.m) { + lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; + } + else { + var k = this.n * Math.sin(lat); + for (var i = sinu_MAX_ITER; i; --i) { + var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); + lat -= V; + if (Math.abs(V) < EPSLN) { + break; + } + } + } + x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); + y = this.a * this.C_y * lat; + + } + else { + + var s = Math.sin(lat); + var c = Math.cos(lat); + y = this.a * pj_mlfn(lat, s, c, this.en); + x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); + } + + p.x = x; + p.y = y; + return p; +} + +function sinu_inverse(p) { + var lat, temp, lon, s; + + p.x -= this.x0; + lon = p.x / this.a; + p.y -= this.y0; + lat = p.y / this.a; + + if (this.sphere) { + lat /= this.C_y; + lon = lon / (this.C_x * (this.m + Math.cos(lat))); + if (this.m) { + lat = asinz((this.m * lat + Math.sin(lat)) / this.n); + } + else if (this.n !== 1) { + lat = asinz(Math.sin(lat) / this.n); + } + lon = adjust_lon(lon + this.long0); + lat = adjust_lat(lat); + } + else { + lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); + s = Math.abs(lat); + if (s < HALF_PI) { + s = Math.sin(lat); + temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); + //temp = this.long0 + p.x / (this.a * Math.cos(lat)); + lon = adjust_lon(temp); + } + else if ((s - EPSLN) < HALF_PI) { + lon = this.long0; + } + } + p.x = lon; + p.y = lat; + return p; +} + +var sinu_names = ["Sinusoidal", "sinu"]; +/* harmony default export */ const sinu = ({ + init: sinu_init, + forward: sinu_forward, + inverse: sinu_inverse, + names: sinu_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/moll.js + +function moll_init() {} + +/* Mollweide forward equations--mapping lat,long to x,y + ----------------------------------------------------*/ +function moll_forward(p) { + + /* Forward equations + -----------------*/ + var lon = p.x; + var lat = p.y; + + var delta_lon = adjust_lon(lon - this.long0); + var theta = lat; + var con = Math.PI * Math.sin(lat); + + /* Iterate using the Newton-Raphson method to find theta + -----------------------------------------------------*/ + while (true) { + var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); + theta += delta_theta; + if (Math.abs(delta_theta) < EPSLN) { + break; + } + } + theta /= 2; + + /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" + this is done here because of precision problems with "cos(theta)" + --------------------------------------------------------------------------*/ + if (Math.PI / 2 - Math.abs(lat) < EPSLN) { + delta_lon = 0; + } + var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; + var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; + + p.x = x; + p.y = y; + return p; +} + +function moll_inverse(p) { + var theta; + var arg; + + /* Inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + arg = p.y / (1.4142135623731 * this.a); + + /* Because of division by zero problems, 'arg' can not be 1. Therefore + a number very close to one is used instead. + -------------------------------------------------------------------*/ + if (Math.abs(arg) > 0.999999999999) { + arg = 0.999999999999; + } + theta = Math.asin(arg); + var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); + if (lon < (-Math.PI)) { + lon = -Math.PI; + } + if (lon > Math.PI) { + lon = Math.PI; + } + arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; + if (Math.abs(arg) > 1) { + arg = 1; + } + var lat = Math.asin(arg); + + p.x = lon; + p.y = lat; + return p; +} + +var moll_names = ["Mollweide", "moll"]; +/* harmony default export */ const moll = ({ + init: moll_init, + forward: moll_forward, + inverse: moll_inverse, + names: moll_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/eqdc.js + + + + + + + + + + + +function eqdc_init() { + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + // Standard Parallels cannot be equal and on opposite sides of the equator + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + this.lat2 = this.lat2 || this.lat1; + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); + this.e = Math.sqrt(this.es); + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + + this.sinphi = Math.sin(this.lat1); + this.cosphi = Math.cos(this.lat1); + + this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); + + if (Math.abs(this.lat1 - this.lat2) < EPSLN) { + this.ns = this.sinphi; + } + else { + this.sinphi = Math.sin(this.lat2); + this.cosphi = Math.cos(this.lat2); + this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); + this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); + } + this.g = this.ml1 + this.ms1 / this.ns; + this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + this.rh = this.a * (this.g - this.ml0); +} + +/* Equidistant Conic forward equations--mapping lat,long to x,y + -----------------------------------------------------------*/ +function eqdc_forward(p) { + var lon = p.x; + var lat = p.y; + var rh1; + + /* Forward equations + -----------------*/ + if (this.sphere) { + rh1 = this.a * (this.g - lat); + } + else { + var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); + rh1 = this.a * (this.g - ml); + } + var theta = this.ns * adjust_lon(lon - this.long0); + var x = this.x0 + rh1 * Math.sin(theta); + var y = this.y0 + this.rh - rh1 * Math.cos(theta); + p.x = x; + p.y = y; + return p; +} + +/* Inverse equations + -----------------*/ +function eqdc_inverse(p) { + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + var con, rh1, lat, lon; + if (this.ns >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } + else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + var theta = 0; + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + + if (this.sphere) { + lon = adjust_lon(this.long0 + theta / this.ns); + lat = adjust_lat(this.g - rh1 / this.a); + p.x = lon; + p.y = lat; + return p; + } + else { + var ml = this.g - rh1 / this.a; + lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); + lon = adjust_lon(this.long0 + theta / this.ns); + p.x = lon; + p.y = lat; + return p; + } + +} + +var eqdc_names = ["Equidistant_Conic", "eqdc"]; +/* harmony default export */ const eqdc = ({ + init: eqdc_init, + forward: eqdc_forward, + inverse: eqdc_inverse, + names: eqdc_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/vandg.js + + + + + + +/* Initialize the Van Der Grinten projection + ----------------------------------------*/ +function vandg_init() { + //this.R = 6370997; //Radius of earth + this.R = this.a; +} + +function vandg_forward(p) { + + var lon = p.x; + var lat = p.y; + + /* Forward equations + -----------------*/ + var dlon = adjust_lon(lon - this.long0); + var x, y; + + if (Math.abs(lat) <= EPSLN) { + x = this.x0 + this.R * dlon; + y = this.y0; + } + var theta = asinz(2 * Math.abs(lat / Math.PI)); + if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) { + x = this.x0; + if (lat >= 0) { + y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); + } + else { + y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); + } + // return(OK); + } + var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI)); + var asq = al * al; + var sinth = Math.sin(theta); + var costh = Math.cos(theta); + + var g = costh / (sinth + costh - 1); + var gsq = g * g; + var m = g * (2 / sinth - 1); + var msq = m * m; + var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); + if (dlon < 0) { + con = -con; + } + x = this.x0 + con; + //con = Math.abs(con / (Math.PI * this.R)); + var q = asq + g; + con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); + if (lat >= 0) { + //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); + y = this.y0 + con; + } + else { + //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); + y = this.y0 - con; + } + p.x = x; + p.y = y; + return p; +} + +/* Van Der Grinten inverse equations--mapping x,y to lat/long + ---------------------------------------------------------*/ +function vandg_inverse(p) { + var lon, lat; + var xx, yy, xys, c1, c2, c3; + var a1; + var m1; + var con; + var th1; + var d; + + /* inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + con = Math.PI * this.R; + xx = p.x / con; + yy = p.y / con; + xys = xx * xx + yy * yy; + c1 = -Math.abs(yy) * (1 + xys); + c2 = c1 - 2 * yy * yy + xx * xx; + c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; + d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; + a1 = (c1 - c2 * c2 / 3 / c3) / c3; + m1 = 2 * Math.sqrt(-a1 / 3); + con = ((3 * d) / a1) / m1; + if (Math.abs(con) > 1) { + if (con >= 0) { + con = 1; + } + else { + con = -1; + } + } + th1 = Math.acos(con) / 3; + if (p.y >= 0) { + lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } + else { + lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } + + if (Math.abs(xx) < EPSLN) { + lon = this.long0; + } + else { + lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); + } + + p.x = lon; + p.y = lat; + return p; +} + +var vandg_names = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; +/* harmony default export */ const vandg = ({ + init: vandg_init, + forward: vandg_forward, + inverse: vandg_inverse, + names: vandg_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/aeqd.js + + + + + + + + + + + + + + +function aeqd_init() { + this.sin_p12 = Math.sin(this.lat0); + this.cos_p12 = Math.cos(this.lat0); +} + +function aeqd_forward(p) { + var lon = p.x; + var lat = p.y; + var sinphi = Math.sin(p.y); + var cosphi = Math.cos(p.y); + var dlon = adjust_lon(lon - this.long0); + var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; + if (this.sphere) { + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North Pole case + p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); + p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); + return p; + } + else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South Pole case + p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); + p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); + return p; + } + else { + //default case + cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); + c = Math.acos(cos_c); + kp = c ? c / Math.sin(c) : 1; + p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); + p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); + return p; + } + } + else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North Pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); + p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); + return p; + } + else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South Pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); + p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); + return p; + } + else { + //Default case + tanphi = sinphi / cosphi; + Nl1 = gN(this.a, this.e, this.sin_p12); + Nl = gN(this.a, this.e, sinphi); + psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); + Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); + if (Az === 0) { + s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } + else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { + s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } + else { + s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); + } + G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); + H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); + GH = G * H; + Hs = H * H; + s2 = s * s; + s3 = s2 * s; + s4 = s3 * s; + s5 = s4 * s; + c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); + p.x = this.x0 + c * Math.sin(Az); + p.y = this.y0 + c * Math.cos(Az); + return p; + } + } + + +} + +function aeqd_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi; + if (this.sphere) { + rh = Math.sqrt(p.x * p.x + p.y * p.y); + if (rh > (2 * HALF_PI * this.a)) { + return; + } + z = rh / this.a; + + sinz = Math.sin(z); + cosz = Math.cos(z); + + lon = this.long0; + if (Math.abs(rh) <= EPSLN) { + lat = this.lat0; + } + else { + lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); + con = Math.abs(this.lat0) - HALF_PI; + if (Math.abs(con) <= EPSLN) { + if (this.lat0 >= 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); + } + else { + lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); + } + } + else { + /*con = cosz - this.sin_p12 * Math.sin(lat); + if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { + //no-op, just keep the lon value as is + } else { + var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); + lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); + }*/ + lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); + } + } + + p.x = lon; + p.y = lat; + return p; + } + else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = Mlp - rh; + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); + p.x = lon; + p.y = lat; + return p; + } + else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = rh - Mlp; + + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + p.x = lon; + p.y = lat; + return p; + } + else { + //default case + rh = Math.sqrt(p.x * p.x + p.y * p.y); + Az = Math.atan2(p.x, p.y); + N1 = gN(this.a, this.e, this.sin_p12); + cosAz = Math.cos(Az); + tmp = this.e * this.cos_p12 * cosAz; + A = -tmp * tmp / (1 - this.es); + B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); + D = rh / N1; + Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; + F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; + psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); + lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); + sinpsi = Math.sin(psi); + lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es)); + p.x = lon; + p.y = lat; + return p; + } + } + +} + +var aeqd_names = ["Azimuthal_Equidistant", "aeqd"]; +/* harmony default export */ const aeqd = ({ + init: aeqd_init, + forward: aeqd_forward, + inverse: aeqd_inverse, + names: aeqd_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/ortho.js + + + + +function ortho_init() { + //double temp; /* temporary variable */ + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.sin_p14 = Math.sin(this.lat0); + this.cos_p14 = Math.cos(this.lat0); +} + +/* Orthographic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ +function ortho_forward(p) { + var sinphi, cosphi; /* sin and cos value */ + var dlon; /* delta longitude value */ + var coslon; /* cos of longitude */ + var ksp; /* scale factor */ + var g, x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + dlon = adjust_lon(lon - this.long0); + + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1; + if ((g > 0) || (Math.abs(g) <= EPSLN)) { + x = this.a * ksp * cosphi * Math.sin(dlon); + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + } + p.x = x; + p.y = y; + return p; +} + +function ortho_inverse(p) { + var rh; /* height above ellipsoid */ + var z; /* angle */ + var sinz, cosz; /* sin of z and cos of z */ + var con; + var lon, lat; + /* Inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + rh = Math.sqrt(p.x * p.x + p.y * p.y); + z = asinz(rh / this.a); + + sinz = Math.sin(z); + cosz = Math.cos(z); + + lon = this.long0; + if (Math.abs(rh) <= EPSLN) { + lat = this.lat0; + p.x = lon; + p.y = lat; + return p; + } + lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh); + con = Math.abs(this.lat0) - HALF_PI; + if (Math.abs(con) <= EPSLN) { + if (this.lat0 >= 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); + } + else { + lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); + } + p.x = lon; + p.y = lat; + return p; + } + lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz)); + p.x = lon; + p.y = lat; + return p; +} + +var ortho_names = ["ortho"]; +/* harmony default export */ const ortho = ({ + init: ortho_init, + forward: ortho_forward, + inverse: ortho_inverse, + names: ortho_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/qsc.js +// QSC projection rewritten from the original PROJ4 +// https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c + + + +/* constants */ +var FACE_ENUM = { + FRONT: 1, + RIGHT: 2, + BACK: 3, + LEFT: 4, + TOP: 5, + BOTTOM: 6 +}; + +var AREA_ENUM = { + AREA_0: 1, + AREA_1: 2, + AREA_2: 3, + AREA_3: 4 +}; + +function qsc_init() { + + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.lat0 = this.lat0 || 0; + this.long0 = this.long0 || 0; + this.lat_ts = this.lat_ts || 0; + this.title = this.title || "Quadrilateralized Spherical Cube"; + + /* Determine the cube face from the center of projection. */ + if (this.lat0 >= HALF_PI - FORTPI / 2.0) { + this.face = FACE_ENUM.TOP; + } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) { + this.face = FACE_ENUM.BOTTOM; + } else if (Math.abs(this.long0) <= FORTPI) { + this.face = FACE_ENUM.FRONT; + } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) { + this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT; + } else { + this.face = FACE_ENUM.BACK; + } + + /* Fill in useful values for the ellipsoid <-> sphere shift + * described in [LK12]. */ + if (this.es !== 0) { + this.one_minus_f = 1 - (this.a - this.b) / this.a; + this.one_minus_f_squared = this.one_minus_f * this.one_minus_f; + } +} + +// QSC forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- +function qsc_forward(p) { + var xy = {x: 0, y: 0}; + var lat, lon; + var theta, phi; + var t, mu; + /* nu; */ + var area = {value: 0}; + + // move lon according to projection's lon + p.x -= this.long0; + + /* Convert the geodetic latitude to a geocentric latitude. + * This corresponds to the shift from the ellipsoid to the sphere + * described in [LK12]. */ + if (this.es !== 0) {//if (P->es != 0) { + lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y)); + } else { + lat = p.y; + } + + /* Convert the input lat, lon into theta, phi as used by QSC. + * This depends on the cube face and the area on it. + * For the top and bottom face, we can compute theta and phi + * directly from phi, lam. For the other faces, we must use + * unit sphere cartesian coordinates as an intermediate step. */ + lon = p.x; //lon = lp.lam; + if (this.face === FACE_ENUM.TOP) { + phi = HALF_PI - lat; + if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_0; + theta = lon - HALF_PI; + } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_1; + theta = (lon > 0.0 ? lon - SPI : lon + SPI); + } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) { + area.value = AREA_ENUM.AREA_2; + theta = lon + HALF_PI; + } else { + area.value = AREA_ENUM.AREA_3; + theta = lon; + } + } else if (this.face === FACE_ENUM.BOTTOM) { + phi = HALF_PI + lat; + if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_0; + theta = -lon + HALF_PI; + } else if (lon < FORTPI && lon >= -FORTPI) { + area.value = AREA_ENUM.AREA_1; + theta = -lon; + } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_2; + theta = -lon - HALF_PI; + } else { + area.value = AREA_ENUM.AREA_3; + theta = (lon > 0.0 ? -lon + SPI : -lon - SPI); + } + } else { + var q, r, s; + var sinlat, coslat; + var sinlon, coslon; + + if (this.face === FACE_ENUM.RIGHT) { + lon = qsc_shift_lon_origin(lon, +HALF_PI); + } else if (this.face === FACE_ENUM.BACK) { + lon = qsc_shift_lon_origin(lon, +SPI); + } else if (this.face === FACE_ENUM.LEFT) { + lon = qsc_shift_lon_origin(lon, -HALF_PI); + } + sinlat = Math.sin(lat); + coslat = Math.cos(lat); + sinlon = Math.sin(lon); + coslon = Math.cos(lon); + q = coslat * coslon; + r = coslat * sinlon; + s = sinlat; + + if (this.face === FACE_ENUM.FRONT) { + phi = Math.acos(q); + theta = qsc_fwd_equat_face_theta(phi, s, r, area); + } else if (this.face === FACE_ENUM.RIGHT) { + phi = Math.acos(r); + theta = qsc_fwd_equat_face_theta(phi, s, -q, area); + } else if (this.face === FACE_ENUM.BACK) { + phi = Math.acos(-q); + theta = qsc_fwd_equat_face_theta(phi, s, -r, area); + } else if (this.face === FACE_ENUM.LEFT) { + phi = Math.acos(-r); + theta = qsc_fwd_equat_face_theta(phi, s, q, area); + } else { + /* Impossible */ + phi = theta = 0; + area.value = AREA_ENUM.AREA_0; + } + } + + /* Compute mu and nu for the area of definition. + * For mu, see Eq. (3-21) in [OL76], but note the typos: + * compare with Eq. (3-14). For nu, see Eq. (3-38). */ + mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI)); + t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta))))); + + /* Apply the result to the real area. */ + if (area.value === AREA_ENUM.AREA_1) { + mu += HALF_PI; + } else if (area.value === AREA_ENUM.AREA_2) { + mu += SPI; + } else if (area.value === AREA_ENUM.AREA_3) { + mu += 1.5 * SPI; + } + + /* Now compute x, y from mu and nu */ + xy.x = t * Math.cos(mu); + xy.y = t * Math.sin(mu); + xy.x = xy.x * this.a + this.x0; + xy.y = xy.y * this.a + this.y0; + + p.x = xy.x; + p.y = xy.y; + return p; +} + +// QSC inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- +function qsc_inverse(p) { + var lp = {lam: 0, phi: 0}; + var mu, nu, cosmu, tannu; + var tantheta, theta, cosphi, phi; + var t; + var area = {value: 0}; + + /* de-offset */ + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + + /* Convert the input x, y to the mu and nu angles as used by QSC. + * This depends on the area of the cube face. */ + nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y)); + mu = Math.atan2(p.y, p.x); + if (p.x >= 0.0 && p.x >= Math.abs(p.y)) { + area.value = AREA_ENUM.AREA_0; + } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) { + area.value = AREA_ENUM.AREA_1; + mu -= HALF_PI; + } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) { + area.value = AREA_ENUM.AREA_2; + mu = (mu < 0.0 ? mu + SPI : mu - SPI); + } else { + area.value = AREA_ENUM.AREA_3; + mu += HALF_PI; + } + + /* Compute phi and theta for the area of definition. + * The inverse projection is not described in the original paper, but some + * good hints can be found here (as of 2011-12-14): + * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302 + * (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */ + t = (SPI / 12) * Math.tan(mu); + tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2))); + theta = Math.atan(tantheta); + cosmu = Math.cos(mu); + tannu = Math.tan(nu); + cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta)))); + if (cosphi < -1) { + cosphi = -1; + } else if (cosphi > +1) { + cosphi = +1; + } + + /* Apply the result to the real area on the cube face. + * For the top and bottom face, we can compute phi and lam directly. + * For the other faces, we must use unit sphere cartesian coordinates + * as an intermediate step. */ + if (this.face === FACE_ENUM.TOP) { + phi = Math.acos(cosphi); + lp.phi = HALF_PI - phi; + if (area.value === AREA_ENUM.AREA_0) { + lp.lam = theta + HALF_PI; + } else if (area.value === AREA_ENUM.AREA_1) { + lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI); + } else if (area.value === AREA_ENUM.AREA_2) { + lp.lam = theta - HALF_PI; + } else /* area.value == AREA_ENUM.AREA_3 */ { + lp.lam = theta; + } + } else if (this.face === FACE_ENUM.BOTTOM) { + phi = Math.acos(cosphi); + lp.phi = phi - HALF_PI; + if (area.value === AREA_ENUM.AREA_0) { + lp.lam = -theta + HALF_PI; + } else if (area.value === AREA_ENUM.AREA_1) { + lp.lam = -theta; + } else if (area.value === AREA_ENUM.AREA_2) { + lp.lam = -theta - HALF_PI; + } else /* area.value == AREA_ENUM.AREA_3 */ { + lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI); + } + } else { + /* Compute phi and lam via cartesian unit sphere coordinates. */ + var q, r, s; + q = cosphi; + t = q * q; + if (t >= 1) { + s = 0; + } else { + s = Math.sqrt(1 - t) * Math.sin(theta); + } + t += s * s; + if (t >= 1) { + r = 0; + } else { + r = Math.sqrt(1 - t); + } + /* Rotate q,r,s into the correct area. */ + if (area.value === AREA_ENUM.AREA_1) { + t = r; + r = -s; + s = t; + } else if (area.value === AREA_ENUM.AREA_2) { + r = -r; + s = -s; + } else if (area.value === AREA_ENUM.AREA_3) { + t = r; + r = s; + s = -t; + } + /* Rotate q,r,s into the correct cube face. */ + if (this.face === FACE_ENUM.RIGHT) { + t = q; + q = -r; + r = t; + } else if (this.face === FACE_ENUM.BACK) { + q = -q; + r = -r; + } else if (this.face === FACE_ENUM.LEFT) { + t = q; + q = r; + r = -t; + } + /* Now compute phi and lam from the unit sphere coordinates. */ + lp.phi = Math.acos(-s) - HALF_PI; + lp.lam = Math.atan2(r, q); + if (this.face === FACE_ENUM.RIGHT) { + lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI); + } else if (this.face === FACE_ENUM.BACK) { + lp.lam = qsc_shift_lon_origin(lp.lam, -SPI); + } else if (this.face === FACE_ENUM.LEFT) { + lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI); + } + } + + /* Apply the shift from the sphere to the ellipsoid as described + * in [LK12]. */ + if (this.es !== 0) { + var invert_sign; + var tanphi, xa; + invert_sign = (lp.phi < 0 ? 1 : 0); + tanphi = Math.tan(lp.phi); + xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared); + lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa)); + if (invert_sign) { + lp.phi = -lp.phi; + } + } + + lp.lam += this.long0; + p.x = lp.lam; + p.y = lp.phi; + return p; +} + +/* Helper function for forward projection: compute the theta angle + * and determine the area number. */ +function qsc_fwd_equat_face_theta(phi, y, x, area) { + var theta; + if (phi < EPSLN) { + area.value = AREA_ENUM.AREA_0; + theta = 0.0; + } else { + theta = Math.atan2(y, x); + if (Math.abs(theta) <= FORTPI) { + area.value = AREA_ENUM.AREA_0; + } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_1; + theta -= HALF_PI; + } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_2; + theta = (theta >= 0.0 ? theta - SPI : theta + SPI); + } else { + area.value = AREA_ENUM.AREA_3; + theta += HALF_PI; + } + } + return theta; +} + +/* Helper function: shift the longitude. */ +function qsc_shift_lon_origin(lon, offset) { + var slon = lon + offset; + if (slon < -SPI) { + slon += TWO_PI; + } else if (slon > +SPI) { + slon -= TWO_PI; + } + return slon; +} + +var qsc_names = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"]; +/* harmony default export */ const qsc = ({ + init: qsc_init, + forward: qsc_forward, + inverse: qsc_inverse, + names: qsc_names +}); + + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/robin.js +// Robinson projection +// Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c +// Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039 + + + + +var COEFS_X = [ + [1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06], + [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06], + [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07], + [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06], + [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06], + [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08], + [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06], + [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06], + [0.9216, -0.00467746, -0.00010457, 4.81243e-06], + [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06], + [0.8679, -0.00609363, -0.000113898, 3.32484e-06], + [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07], + [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07], + [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06], + [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06], + [0.6732, -0.00986209, -0.000199569, 1.91974e-05], + [0.6213, -0.010418, 8.83923e-05, 6.24051e-06], + [0.5722, -0.00906601, 0.000182, 6.24051e-06], + [0.5322, -0.00677797, 0.000275608, 6.24051e-06] +]; + +var COEFS_Y = [ + [-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11], + [0.0620, 0.0124, -1.26793e-09, 4.22642e-10], + [0.1240, 0.0124, 5.07171e-09, -1.60604e-09], + [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09], + [0.2480, 0.0124002, 7.10039e-08, -2.24e-08], + [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08], + [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07], + [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07], + [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07], + [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07], + [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07], + [0.6769, 0.011713, -3.20223e-05, -5.16405e-07], + [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07], + [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06], + [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09], + [0.8936, 0.00969686, -6.4636e-05, -8.547e-06], + [0.9394, 0.00840947, -0.000192841, -4.2106e-06], + [0.9761, 0.00616527, -0.000256, -4.2106e-06], + [1.0000, 0.00328947, -0.000319159, -4.2106e-06] +]; + +var FXC = 0.8487; +var FYC = 1.3523; +var C1 = R2D/5; // rad to 5-degree interval +var RC1 = 1/C1; +var NODES = 18; + +var poly3_val = function(coefs, x) { + return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3])); +}; + +var poly3_der = function(coefs, x) { + return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]); +}; + +function newton_rapshon(f_df, start, max_err, iters) { + var x = start; + for (; iters; --iters) { + var upd = f_df(x); + x -= upd; + if (Math.abs(upd) < max_err) { + break; + } + } + return x; +} + +function robin_init() { + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.long0 = this.long0 || 0; + this.es = 0; + this.title = this.title || "Robinson"; +} + +function robin_forward(ll) { + var lon = adjust_lon(ll.x - this.long0); + + var dphi = Math.abs(ll.y); + var i = Math.floor(dphi * C1); + if (i < 0) { + i = 0; + } else if (i >= NODES) { + i = NODES - 1; + } + dphi = R2D * (dphi - RC1 * i); + var xy = { + x: poly3_val(COEFS_X[i], dphi) * lon, + y: poly3_val(COEFS_Y[i], dphi) + }; + if (ll.y < 0) { + xy.y = -xy.y; + } + + xy.x = xy.x * this.a * FXC + this.x0; + xy.y = xy.y * this.a * FYC + this.y0; + return xy; +} + +function robin_inverse(xy) { + var ll = { + x: (xy.x - this.x0) / (this.a * FXC), + y: Math.abs(xy.y - this.y0) / (this.a * FYC) + }; + + if (ll.y >= 1) { // pathologic case + ll.x /= COEFS_X[NODES][0]; + ll.y = xy.y < 0 ? -HALF_PI : HALF_PI; + } else { + // find table interval + var i = Math.floor(ll.y * NODES); + if (i < 0) { + i = 0; + } else if (i >= NODES) { + i = NODES - 1; + } + for (;;) { + if (COEFS_Y[i][0] > ll.y) { + --i; + } else if (COEFS_Y[i+1][0] <= ll.y) { + ++i; + } else { + break; + } + } + // linear interpolation in 5 degree interval + var coefs = COEFS_Y[i]; + var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i+1][0] - coefs[0]); + // find t so that poly3_val(coefs, t) = ll.y + t = newton_rapshon(function(x) { + return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x); + }, t, EPSLN, 100); + + ll.x /= poly3_val(COEFS_X[i], t); + ll.y = (5 * i + t) * D2R; + if (xy.y < 0) { + ll.y = -ll.y; + } + } + + ll.x = adjust_lon(ll.x + this.long0); + return ll; +} + +var robin_names = ["Robinson", "robin"]; +/* harmony default export */ const robin = ({ + init: robin_init, + forward: robin_forward, + inverse: robin_inverse, + names: robin_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/geocent.js + + +function geocent_init() { + this.name = 'geocent'; + +} + +function geocent_forward(p) { + var point = geodeticToGeocentric(p, this.es, this.a); + return point; +} + +function geocent_inverse(p) { + var point = geocentricToGeodetic(p, this.es, this.a, this.b); + return point; +} + +var geocent_names = ["Geocentric", 'geocentric', "geocent", "Geocent"]; +/* harmony default export */ const geocent = ({ + init: geocent_init, + forward: geocent_forward, + inverse: geocent_inverse, + names: geocent_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/tpers.js + +var mode = { + N_POLE: 0, + S_POLE: 1, + EQUIT: 2, + OBLIQ: 3 +}; + + + + +var params = { + h: { def: 100000, num: true }, // default is Karman line, no default in PROJ.7 + azi: { def: 0, num: true, degrees: true }, // default is North + tilt: { def: 0, num: true, degrees: true }, // default is Nadir + long0: { def: 0, num: true }, // default is Greenwich, conversion to rad is automatic + lat0: { def: 0, num: true } // default is Equator, conversion to rad is automatic +}; + +function tpers_init() { + Object.keys(params).forEach(function (p) { + if (typeof this[p] === "undefined") { + this[p] = params[p].def; + } else if (params[p].num && isNaN(this[p])) { + throw new Error("Invalid parameter value, must be numeric " + p + " = " + this[p]); + } else if (params[p].num) { + this[p] = parseFloat(this[p]); + } + if (params[p].degrees) { + this[p] = this[p] * D2R; + } + }.bind(this)); + + if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) { + this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE; + } else if (Math.abs(this.lat0) < EPSLN) { + this.mode = mode.EQUIT; + } else { + this.mode = mode.OBLIQ; + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + + this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius + + if (this.pn1 <= 0 || this.pn1 > 1e10) { + throw new Error("Invalid height"); + } + + this.p = 1 + this.pn1; + this.rp = 1 / this.p; + this.h1 = 1 / this.pn1; + this.pfact = (this.p + 1) * this.h1; + this.es = 0; + + var omega = this.tilt; + var gamma = this.azi; + this.cg = Math.cos(gamma); + this.sg = Math.sin(gamma); + this.cw = Math.cos(omega); + this.sw = Math.sin(omega); +} + +function tpers_forward(p) { + p.x -= this.long0; + var sinphi = Math.sin(p.y); + var cosphi = Math.cos(p.y); + var coslam = Math.cos(p.x); + var x, y; + switch (this.mode) { + case mode.OBLIQ: + y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + break; + case mode.EQUIT: + y = cosphi * coslam; + break; + case mode.S_POLE: + y = -sinphi; + break; + case mode.N_POLE: + y = sinphi; + break; + } + y = this.pn1 / (this.p - y); + x = y * cosphi * Math.sin(p.x); + + switch (this.mode) { + case mode.OBLIQ: + y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + break; + case mode.EQUIT: + y *= sinphi; + break; + case mode.N_POLE: + y *= -(cosphi * coslam); + break; + case mode.S_POLE: + y *= cosphi * coslam; + break; + } + + // Tilt + var yt, ba; + yt = y * this.cg + x * this.sg; + ba = 1 / (yt * this.sw * this.h1 + this.cw); + x = (x * this.cg - y * this.sg) * this.cw * ba; + y = yt * ba; + + p.x = x * this.a; + p.y = y * this.a; + return p; +} + +function tpers_inverse(p) { + p.x /= this.a; + p.y /= this.a; + var r = { x: p.x, y: p.y }; + + // Un-Tilt + var bm, bq, yt; + yt = 1 / (this.pn1 - p.y * this.sw); + bm = this.pn1 * p.x * yt; + bq = this.pn1 * p.y * this.cw * yt; + p.x = bm * this.cg + bq * this.sg; + p.y = bq * this.cg - bm * this.sg; + + var rh = hypot(p.x, p.y); + if (Math.abs(rh) < EPSLN) { + r.x = 0; + r.y = p.y; + } else { + var cosz, sinz; + sinz = 1 - rh * rh * this.pfact; + sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1); + cosz = Math.sqrt(1 - sinz * sinz); + switch (this.mode) { + case mode.OBLIQ: + r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh); + p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh; + p.x *= sinz * this.cosph0; + break; + case mode.EQUIT: + r.y = Math.asin(p.y * sinz / rh); + p.y = cosz * rh; + p.x *= sinz; + break; + case mode.N_POLE: + r.y = Math.asin(cosz); + p.y = -p.y; + break; + case mode.S_POLE: + r.y = -Math.asin(cosz); + break; + } + r.x = Math.atan2(p.x, p.y); + } + + p.x = r.x + this.long0; + p.y = r.y; + return p; +} + +var tpers_names = ["Tilted_Perspective", "tpers"]; +/* harmony default export */ const tpers = ({ + init: tpers_init, + forward: tpers_forward, + inverse: tpers_inverse, + names: tpers_names +}); + +;// CONCATENATED MODULE: ./node_modules/proj4/projs.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* harmony default export */ function proj4_projs(proj4){ + proj4.Proj.projections.add(tmerc); + proj4.Proj.projections.add(etmerc); + proj4.Proj.projections.add(utm); + proj4.Proj.projections.add(sterea); + proj4.Proj.projections.add(stere); + proj4.Proj.projections.add(somerc); + proj4.Proj.projections.add(omerc); + proj4.Proj.projections.add(lcc); + proj4.Proj.projections.add(krovak); + proj4.Proj.projections.add(cass); + proj4.Proj.projections.add(laea); + proj4.Proj.projections.add(aea); + proj4.Proj.projections.add(gnom); + proj4.Proj.projections.add(cea); + proj4.Proj.projections.add(eqc); + proj4.Proj.projections.add(poly); + proj4.Proj.projections.add(nzmg); + proj4.Proj.projections.add(mill); + proj4.Proj.projections.add(sinu); + proj4.Proj.projections.add(moll); + proj4.Proj.projections.add(eqdc); + proj4.Proj.projections.add(vandg); + proj4.Proj.projections.add(aeqd); + proj4.Proj.projections.add(ortho); + proj4.Proj.projections.add(qsc); + proj4.Proj.projections.add(robin); + proj4.Proj.projections.add(geocent); + proj4.Proj.projections.add(tpers); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/index.js + + + + + + + + + + +core.defaultDatum = 'WGS84'; //default datum +core.Proj = Proj; +core.WGS84 = new core.Proj('WGS84'); +core.Point = lib_Point; +core.toPoint = toPoint; +core.defs = lib_defs; +core.nadgrid = nadgrid; +core.transform = transform; +core.mgrs = mgrs; +core.version = '__VERSION__'; +proj4_projs(core); +/* harmony default export */ const lib = (core); + +;// CONCATENATED MODULE: ./src/leaflet/core/Proj4Leaflet.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * Inspired by https://github.com/kartena/Proj4Leaflet + */ + + + +window.proj4 = lib; +window.Proj4js = lib; +(external_L_default()).Proj = (external_L_default()).Proj || {}; + +(external_L_default()).Proj._isProj4Obj = function(a) { + return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined'; +}; + +/** + * @class L.Proj.Projection + * @private + * @classdesc Proj 投影定义类。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {string} code - proj srsCode + * @param {string} def - 投影的 proj4 定义。{@link [详细]{https://iclient.supermap.io/web/introduction/leafletDevelop.html#projection}} + * @param {L.Bounds} bounds - 投影范围参数 + */ +(external_L_default()).Proj.Projection = external_L_default().Class.extend({ + initialize: function(code, def, bounds, wrapLng) { + var isP4 = external_L_default().Proj._isProj4Obj(code); + this._proj = isP4 ? code : this._projFromCodeDef(code, def); + var boundsOption = bounds; + if (external_L_default().Util.isArray(bounds)) { + boundsOption = external_L_default().bounds(bounds); + } + this.bounds = isP4 ? def : boundsOption; + this.wrapLng = wrapLng; + }, + + /** + * @function L.Proj.Projection.prototype.project + * @description 通过地理坐标得到投影坐标。 + * @param {L.Latlng} latlng - 经纬度坐标。 + * @returns {L.Point} 返回投影坐标点。 + */ + project: function(latlng) { + var point = this._proj.forward([latlng.lng, latlng.lat]); + return new (external_L_default()).Point(point[0], point[1]); + }, + + /** + * @function L.Proj.Projection.prototype.unproject + * @description 通过投影坐标得到地理坐标。 + * @param {L.Point} point - 坐标点。 + * @param {number} unbounded - 坐标点高程值等。 + * @returns {L.LatLng} 返回经纬度坐标 + */ + unproject: function(point, zoom) { + if (this.bounds && !this.wrapLng) { + point.x = + point.x < this.bounds.min.x + ? this.bounds.min.x + : point.x > this.bounds.max.x + ? this.bounds.max.x + : point.x; + point.y = + point.y < this.bounds.min.y + ? this.bounds.min.y + : point.y > this.bounds.max.y + ? this.bounds.max.y + : point.y; + } + var point2 = this._proj.inverse([point.x, point.y]); + return new (external_L_default()).LatLng(point2[1], point2[0], zoom); + }, + + _projFromCodeDef: function(code, def) { + if (def) { + lib.defs(code, def); + } else if (lib.defs[code] === undefined) { + var urn = code.split(':'); + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + if (lib.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + + return lib(code); + }, + getUnits: function() { + return this._proj.oProj.units || 'degrees'; + } +}); + +/** + * @class CRS + * @aliasclass Proj.CRS + * @deprecatedclass L.Proj.CRS + * @deprecatedclassinstance L.supermap.Proj.crs + * @classdesc 基于 Proj4 坐标系统扩展类。 + * 为计算级别,`options.scales` `options.scaleDenominators` `options.resolutions` `options.bounds` 必须指定一个,先后顺序已按优先级排列。 + * 当指定`options.bounds` 时,第 0 级为一张 256 切片包含整个 bounds,即`Math.max(bounds.getSize().x, bounds.getSize().y)/256` 。 + * 为保证切片行列号正确,`options.origin` `options.bounds` 必须指定一个。 + * 当指定`options.bounds` 时,切片原点为 bounds 的左上角。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {string} srsCode - proj srsCode。 + * @param {Object} options - 参数。 + * @param {string} options.def - 投影的proj4定义。[详细]{@link https://iclient.supermap.io/web/introduction/leafletDevelop.html#multiProjection} + * @param {(Array.|L.Point)} [options.origin] - 原点。 + * @param {Array.} [options.scales] - 比例尺数组。 + * @param {Array.} [options.scaleDenominators] - 比例尺分母数组。 + * @param {Array.} [options.resolutions] - 分辨率数组。 + * @param {(Array.|L.Bounds)} [options.bounds] - 范围。 + * @param {number} [options.dpi=96] - dpi。 + * @param {number} [options.wrapLng] - 定义经度(水平)坐标轴是否在给定范围内环绕。大多数情况下默认为[-180,180]。 + * @example + * var crs =new CRS("EPSG:4326",{ + * origin: [-180,90], + * scaleDenominators: [2000,1000,500,200,100,50,20,10], + * }); + * var map=L.map('map', { + * crs: crs + * ... + * }) + * @usage + */ +var CRS = external_L_default().Class.extend({ + includes: (external_L_default()).CRS, + + options: { + transformation: new (external_L_default()).Transformation(1, 0, -1, 0) + }, + + initialize: function(srsCode, options) { + var code, proj, def; + + if (external_L_default().Proj._isProj4Obj(srsCode)) { + proj = srsCode; + code = proj.srsCode; + options = options || {}; + + this.projection = new (external_L_default()).Proj.Projection(proj, options.bounds,options.wrapLng); + } else { + code = srsCode; + options = options || {}; + def = options.def || ''; + this.projection = new (external_L_default()).Proj.Projection(code, def, options.bounds,options.wrapLng); + } + + external_L_default().Util.setOptions(this, options); + if (this.options.wrapLng) { + this.wrapLng = this.options.wrapLng; + } + this.code = code; + this.transformation = this.options.transformation; + this.options.dpi = this.options.dpi || 96; + if (this.options.bounds) { + this.options.bounds = external_L_default().bounds(this.options.bounds); + } + if (!this.options.origin && this.options.bounds) { + this.options.origin = [this.options.bounds.min.x, this.options.bounds.max.y]; + } + if (this.options.origin) { + if (this.options.origin instanceof (external_L_default()).Point) { + this.options.origin = [this.options.origin.x, this.options.origin.y]; + } + this.transformation = new (external_L_default()).Transformation(1, -this.options.origin[0], -1, this.options.origin[1]); + } + + if (this.options.scales && this.options.scales.length > 0) { + this.scales = this.options.scales; + this._scales = this._toProj4Scales(this.options.scales, this.options.dpi); + } else if (this.options.scaleDenominators && this.options.scaleDenominators.length > 0) { + this.scales = []; + for (let i = 0; i < this.options.scaleDenominators.length; i++) { + this.scales[i] = 1 / this.options.scaleDenominators[i]; + } + this._scales = this._toProj4Scales(this.scales, this.options.dpi); + } else if (this.options.resolutions && this.options.resolutions.length > 0) { + this._scales = []; + for (let i = this.options.resolutions.length - 1; i >= 0; i--) { + if (this.options.resolutions[i]) { + this._scales[i] = 1 / this.options.resolutions[i]; + } + } + } else if (this.options.bounds) { + this._scales = this._getDefaultProj4ScalesByBounds(this.options.bounds); + } + this._rectify(); + this.infinite = !this.options.bounds; + }, + _rectify: function() { + if (this._scales) { + if (!this.resolutions) { + this.resolutions = []; + this.resolutions = this._proj4ScalesToResolutions(this._scales); + } + if (!this.scales) { + this.scales = []; + for (let i = 0; i < this.resolutions.length; i++) { + var scaleD = + this.resolutions[i] * + this.options.dpi * + (1 / 0.0254) * + this._getMeterPerMapUnit(this.projection.getUnits()); + this.scales[i] = 1.0 / scaleD; + } + } + } + }, + /** + * @function CRS.prototype.scale + * @description 通过缩放级别获取比例尺值。 + * @param {number} zoom - 缩放级别。 + * @returns 比例尺值。 + */ + scale: function(zoom) { + var iZoom = Math.floor(zoom), + baseScale, + nextScale, + scaleDiff, + zDiff; + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + // Non-integer zoom, interpolate + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = zoom - iZoom; + return baseScale + scaleDiff * zDiff; + } + }, + + /** + * @function CRS.prototype.zoom + * @description 根据比例尺返回缩放级别。 + * @param {number} scale - 比例尺。 + * @returns {number} 缩放级别。 + */ + zoom: function(scale) { + // Find closest number in this._scales, down + var downScale = this._closestElement(this._scales, scale), + downZoom = this._scales.indexOf(downScale), + nextScale, + nextZoom, + scaleDiff; + // Check if scale is downScale => return array index + if (!downScale) { + return 0; + } + if (scale === downScale) { + return downZoom; + } + // Interpolate + nextZoom = downZoom + 1; + nextScale = this._scales[nextZoom]; + if (nextScale === undefined) { + return downZoom; + } + scaleDiff = nextScale - downScale; + return (scale - downScale) / scaleDiff + downZoom; + }, + + distance: (external_L_default()).CRS.Earth.distance, + + R: (external_L_default()).CRS.Earth.R, + + /* Get the closest lowest element in an array */ + _closestElement: function(array, element) { + var low; + for (var i = array.length; i--; ) { + if (array[i] <= element && (low === undefined || low < array[i])) { + low = array[i]; + } + } + return low; + }, + _proj4ScalesToResolutions(_scales) { + var resolutions = []; + if (!_scales) { + return resolutions; + } + for (var i = 0; i < _scales.length; i++) { + resolutions[i] = 1.0 / _scales[i]; + } + return resolutions; + }, + _toProj4Scales: function(scales, dpi) { + var proj4Scales = []; + if (!scales) { + return proj4Scales; + } + for (var i = 0; i < scales.length; i++) { + var a = this.projection ? this._getMeterPerMapUnit(this.projection.getUnits()) : 1; + proj4Scales[i] = 1 / (0.0254 / ((dpi || 96) * scales[i]) / a); + } + return proj4Scales; + }, + _getMeterPerMapUnit: function(mapUnit) { + var earchRadiusInMeters = 6378137; + var meterPerMapUnit = 1; + if (mapUnit === 'meter') { + meterPerMapUnit = 1; + } else if (mapUnit === 'degrees') { + // 每度表示多少米。 + meterPerMapUnit = (Math.PI * 2 * earchRadiusInMeters) / 360; + } else if (mapUnit === 'kilometer') { + meterPerMapUnit = 1.0e-3; + } else if (mapUnit === 'inch') { + meterPerMapUnit = 1 / 2.5399999918e-2; + } else if (mapUnit === 'feet') { + meterPerMapUnit = 0.3048; + } + return meterPerMapUnit; + }, + _getDefaultProj4ScalesByBounds: function(bounds) { + if (!bounds) { + return []; + } + var boundsSize = bounds.getSize(); + var extendsSize = Math.max(boundsSize.x, boundsSize.y); + var resolution = extendsSize / 256; + var scales = []; + var maxZoom = 23; + for (var i = 0; i < maxZoom; i++) { + scales[i] = Math.pow(2, i) / resolution; + } + return scales; + } +}); +var crs = function(srsCode, options) { + return new CRS(srsCode, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/core/Attributions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @enum attribution + * @description 版权相关配置。 + * @type {string} + * @private + */ + +let Attributions = { + + Prefix: `Leaflet + with © SuperMap iClient`, + + Common: { + attribution: `Map Data © SuperMap iServer` + }, + + Online: { + attribution: `Map Data © SuperMap Online` + }, + + ECharts: { + attribution: `© 2018 百度 ECharts` + }, + + MapV: { + attribution: `© 2018 百度 MapV ` + }, + + Turf: { + attribution: `© turfjs` + }, + + Baidu: { + attribution: `Map Data © 2018 Baidu - GS(2016)2089号 - Data © 长地万方` + }, + + Cloud: { + attribution: `Map Data ©2014 SuperMap - GS(2014)6070号-data©Navinfo` + }, + + Tianditu: { + attribution: `Map Data ` + } +}; + +/* harmony default export */ const core_Attributions = (Attributions); +;// CONCATENATED MODULE: ./src/leaflet/core/Base.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +external_L_default().Control.Attribution.include({ + options: { + position: 'bottomright', + prefix: core_Attributions.Prefix + } +}); +external_L_default().Map.include({ + /* + * 获取精确的像素坐标. + * 当需要绘制比较平滑的曲线的时候可调用此方法代替latLngToContainerPoint + * @param latlng + */ + latLngToAccurateContainerPoint: function (latlng) { + var projectedPoint = this.project(external_L_default().latLng(latlng)); + var layerPoint = projectedPoint._subtract(this.getPixelOrigin()); + return external_L_default().point(layerPoint).add(this._getMapPanePos()); + } +}); +wrapToGeoJSON([(external_L_default()).Polyline, (external_L_default()).Polygon, (external_L_default()).Marker, (external_L_default()).CircleMarker, (external_L_default()).Circle, (external_L_default()).LayerGroup]); + +function wrapToGeoJSON(objClassArray) { + objClassArray.map((objClass) => { + objClass.defaultFunction = objClass.prototype.toGeoJSON; + objClass.include({ + toGeoJSON: function (precision) { + return objClass.defaultFunction.call(this, precision || 10); + } + }) + return objClass; + }) + +} +;// CONCATENATED MODULE: ./src/leaflet/services/ServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ServiceBase + * @classdesc L.supermap 服务基类。 + * @category iServer Core + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @fires ServiceBase#initialized + * @fires ServiceBase#destroy + * @extends {L.Evented} + * @usage + */ +var ServiceBase = external_L_default().Evented.extend({ + + options: { + url: null, + + proxy: null, + + withCredentials: false, + crossOrigin: null + }, + + initialize: function (url, options) { + if (url) { + url = (url.indexOf("/") !== url.length - 1) ? + url : url.substr(0, url.length - 1); + } + this.url = url; + external_L_default().setOptions(this, options); + /** + * @event ServiceBase#initialized + * @description 构造函数构造成功后触发。 + * @property {ServiceBase} this - this 对象。 + */ + this.fire("initialized", this); + }, + + /** + * @function ServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy: function () { + /** + * @event ServiceBase#destroy + * @description 资源释放成功后触发。 + * @property {ServiceBase} this - this 对象。 + */ + this.fire("destroy", this); + } + +}); +;// CONCATENATED MODULE: ./src/leaflet/services/MapService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class MapService + * @deprecatedclassinstance L.supermap.mapService + * @classdesc 地图信息服务类。 + * @category iServer Map + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * new MapService(url) + * .getMapInfo(function(result){ + * //doSomething + * }) + * @usage + */ +var MapService_MapService = ServiceBase.extend({ + + options: { + projection: null + }, + + initialize: function (url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + if (options.projection) { + this.options.projection = options.projection; + } + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function MapService.prototype.getMapInfo + * @description 获取地图信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getMapInfo: function (callback) { + var me = this; + var getMapStatusService = new MapService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + projection: me.options.projection + }); + getMapStatusService.processAsync(); + }, + + /** + * @function MapService.prototype.getTilesets + * @description 获取切片列表信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTilesets: function (callback) { + var me = this; + var tilesetsService = new TilesetsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + + tilesetsService.processAsync(); + } +}); + +var mapService = function (url, options) { + return new MapService_MapService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/control/ChangeTileVersion.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ChangeTileVersion + * @aliasclass control.ChangeTileVersion + * @deprecatedclassinstance L.supermap.control.changeTileVersion + * @classdesc 版本切换控件,支持 IE10 及以上。 + * @category Control + * @extends {L.Control} + * @example + * new ChangeTileVersion({ + * layer: baseLayer, + * position: "topleft", + * orientation: "horizontal" + * }).addTo(map); + * @param {Object} options - 参数。 + * @param {L.Layer} options.layer - Leaflet Layer 对象。 + * @param {string} [options.position='topleft'] - 控件位置继承自 Leaflet control。 + * @param {string} [options.title='switch tile version'] - 鼠标滑过时提示。 + * @param {string} [options.tooltip='top'] - tooltip 提示显示位置 top | right | bottom | left。 + * @param {boolean} [options.collapsed=true] - 是否折叠。 + * @param {string} [options.nextText='+'] - 下一个版本的按钮布局。 + * @param {string} [options.lastText='-'] - 上一个版本的按钮布局。 + * @param {string} [options.ico='v'] - 控件显示的 logo。 + * @param {string} [options.orientation='horizontal'] - 方向 horizontal|vertical。 + * @param {boolean} [options.switch=true] - 是否显示上/下一个版本切换控件。 + * @usage + */ +var ChangeTileVersion = external_L_default().Control.extend({ + + options: { + //绑定的底图图层 + layer: null, + //控件位置 继承自leaflet control + position: 'topleft', + //鼠标滑过时提示 + title: 'switch tile version', + //tooltip提示显示位置 top | right | bottom | left + tooltip: "top", + //是否折叠 + collapsed: true, + //下一个版本的按钮布局 + nextText: "+", + //上一个版本的按钮布局 + lastText: "-", + //控件显示的logo + ico: 'V', + //方向horizontal|vertical + orientation: 'horizontal', + //是否显示上/下一个版本切换控件 + switch: true + }, + + /** + * @private + * @function ChangeTileVersion.prototype.onAdd + * @description 添加控件。 + */ + onAdd: function () { + if (this.options.orientation !== 'vertical') { + this.options.orientation = 'horizontal'; + } + var layout = this._initLayout(); + if (this.options.layer) { + this.setLayer(this.options.layer); + } + return layout; + }, + + /** + * @function ChangeTileVersion.prototype.setContent + * @description 设置版本信息。 + * @param {Object} version - 版本信息。 + */ + setContent: function (version) { + var content = external_L_default().Util.extend({}, version); + this.setVersionName(content.desc).setToolTip(content.desc); + }, + + /** + * @function ChangeTileVersion.prototype.setVersionName + * @description 设置版本号。 + * @param {string} content - 版本信息。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + setVersionName: function (content) { + var value = content; + if (!content) { + value = this.getValue(); + } + this._sliderValue.innerHTML = value; + return this; + }, + + /** + * @function ChangeTileVersion.prototype.setToolTip + * @description 设置提示信息。 + * @param {(HTMLElement|string)} tooltip - 提示信息。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + setToolTip: function (tooltip) { + this.tooltip.innerHTML = tooltip; + return this; + }, + + /** + * @function ChangeTileVersion.prototype.updateLength + * @description 更新进度条长度。 + * @param {number} length - 进度长度参数。 + */ + updateLength: function (length) { + if (length > 0) { + this.length = length; + this.max = this.length - 1; + this.slider.setAttribute("max", this.max); + } + }, + + /** + * @function ChangeTileVersion.prototype.setLayer + * @description 设置需要绑定的图层。 + * @param {TiledMapLayer} layer - 绑定的图层。 + */ + setLayer: function (layer) { + if (layer) { + this.options.layer = layer; + } + var me = this; + var tileLayer = me.options.layer; + tileLayer.on("tilesetsinfoloaded", function (result) { + var tileVersions = result && result.tileVersions; + me.update(tileVersions); + }); + tileLayer.on("tileversionschanged", function (result) { + var tileVersions = result && result.tileVersion; + me.setContent(tileVersions); + }); + me.getTileSetsInfo(); + }, + + /** + * @function ChangeTileVersion.prototype.update + * @description 更新缓存切片集和进度条长度。 + * @param {number} tileVersions - 待更新的切片版本号。 + */ + update: function (tileVersions) { + this.tileVersions = tileVersions || []; + this.updateLength(this.tileVersions.length); + }, + + /** + * @function ChangeTileVersion.prototype.getTileSetsInfo + * @description 获取切片集信息。 + */ + getTileSetsInfo: function () { + var me = this; + if (me.options.layer) { + new MapService_MapService(me.options.layer._url).getTilesets(function getTilesInfoSucceed(info) { + me.options.layer.setTileSetsInfo(info.result); + }); + } + }, + + /** + * @function ChangeTileVersion.prototype.removeLayer + * @description 移除绑定的地图图层。 + */ + removeLayer: function () { + this.options.layer = null; + }, + + /** + * @function ChangeTileVersion.prototype.nextTilesVersion + * @description 下一个版本,首次调用该函数默认为无版本。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + nextTilesVersion: function () { + if (this.firstLoad) { + this.options.layer.nextTilesVersion(); + this.firstLoad = !!0; + return this; + } + if (parseInt(this.slider.value) > this.max-1) { + return this; + } + this.slider.value = parseInt(this.slider.value) + 1; + this.options.layer.nextTilesVersion(); + return this; + }, + + /** + * @function ChangeTileVersion.prototype.lastTilesVersion + * @description 上一个版本。 + */ + lastTilesVersion: function () { + if (parseInt(this.slider.value) < this.min + 1) { + return this; + } + this.slider.value = parseInt(this.slider.value) - 1; + this.options.layer.lastTilesVersion(); + return this; + }, + + /** + * @function ChangeTileVersion.prototype.tilesVersion + * @description 请求指定版本。 + * @param {string} version - 版本号参数。 + */ + tilesVersion: function (version) { + var layer = this.options.layer, + tileVersions = this.tileVersions; + var len = tileVersions.length; + for (var i = 0; i < len; i++) { + if (tileVersions[i].name == version) { + layer.updateCurrentTileSetsIndex(i); + layer.changeTilesVersion(); + break; + } + } + }, + + /** + * @function ChangeTileVersion.prototype.getValue + * @description 获取进度条的值。(注:进度条的值并不是版本号)。 + */ + getValue: function () { + return this.slider.value; + }, + + /** + * @function ChangeTileVersion.prototype.getVersion + * @description 获取当前进度条的值对应的版本号。 + */ + getVersion: function () { + var version = this.tileVersions[this.getValue()]; + return version && version.name; + }, + + _initLayout: function () { + var className = 'leaflet-control-ctv'; + this._container = external_L_default().DomUtil.create('div', className + ' ' + className + '-' + this.options.orientation); + //正常情况下显示btn + this._sliderBtn = external_L_default().DomUtil.create('a', className + '-toggle', this._container); + this._sliderBtn.setAttribute("title", this.options.title); + this._sliderBtn.innerHTML = this.options.ico; + + //滑块拖动时值显示区域 + this._sliderValue = external_L_default().DomUtil.create('p', className + '-value', this._container); + this._sliderValue.innerHTML = this.options.ico; + + var sliderClassName = "leaflet-ctv-slider"; + this._sliderContent = external_L_default().DomUtil.create('div', sliderClassName + "-main" + " tooltip", this._container); + + //tooltip提示框 + this.tooltip = external_L_default().DomUtil.create("span", "tooltip-text" + " " + "tooltip-" + this.options.tooltip, this._sliderContent); + this.tooltip.innerHTML = this.options.ico; + + //加控件 + if (this.options.switch) { + this._next = external_L_default().DomUtil.create('a', sliderClassName + "-incdec" + " " + sliderClassName + '-next', this._sliderContent); + this._next.innerHTML = this.options.nextText; + external_L_default().DomEvent.on(this._next, 'click', this.nextTilesVersion, this); + external_L_default().DomUtil.addClass(this._container, className + '-incdec'); + } + + //滑块 + this._sliderContainer = external_L_default().DomUtil.create('div', sliderClassName + '-container', this._sliderContent); + this.slider = external_L_default().DomUtil.create('input', sliderClassName, this._sliderContainer); + + + this.min = this.min == null || isNaN(this.min) ? 0 : parseInt(this.min); + this.slider.setAttribute("title", this.options.title); + this.slider.setAttribute("id", "slider"); + this.slider.setAttribute("type", "range"); + this.slider.setAttribute("min", this.min); + this.slider.setAttribute("max", 0); + this.slider.setAttribute("step", 1); + this.slider.setAttribute("value", 0); + + // //判断浏览器是否支持Range滑动条 + // if (this.slider.type == "text") { + // console.error("抱歉,您的浏览器不支持HTML5 range滑动条,请使用高版本浏览器"); + // } + this.firstLoad = true; + if ('oninput' in this.slider || 'onchange' in this.slider) { + external_L_default().DomEvent.on(this.slider, "change", this._tilesVersion, this); + } else { + this.slider.onpropertychange = this._tilesVersion; + } + + //减控件 + if (this.options.switch) { + this._last = external_L_default().DomUtil.create('a', sliderClassName + "-incdec" + " " + sliderClassName + '-last', this._sliderContent); + this._last.innerHTML = this.options.lastText; + external_L_default().DomEvent.on(this._last, 'click', this.lastTilesVersion, this); + } + + //if (window.matchMedia("screen and (-webkit-min-device-pixel-ratio:0)").matches && this.options.orientation == 'vertical') { + if (this.options.orientation === 'vertical') { + this.slider.style.width = 170 + 'px'; + this._sliderContainer.style.height = 170 + 'px'; + } else { + this._sliderContainer.style.width = 150 + 'px'; + } + + external_L_default().DomEvent.disableClickPropagation(this._container); + + if (this.options.collapsed) { + if (!(external_L_default()).Browser.android) { + external_L_default().DomEvent.on(this._container, 'mouseenter', this._expand, this) + .on(this._container, 'mouseleave', this._collapse, this); + } + + if ((external_L_default()).Browser.touch) { + external_L_default().DomEvent.on(this._sliderBtn, 'click', (external_L_default()).DomEvent.stop) + .on(this._sliderBtn, 'click', this._expand, this); + } else { + external_L_default().DomEvent.on(this._sliderBtn, 'focus', this._expand, this); + } + } else { + this._expand(); + } + return this._container; + }, + + _expand: function () { + external_L_default().DomUtil.addClass(this._container, 'leaflet-control-ctv-expanded'); + }, + + _collapse: function () { + external_L_default().DomUtil.removeClass(this._container, 'leaflet-control-ctv-expanded'); + }, + + _tilesVersion: function () { + var version = this.getVersion(); + this.tilesVersion(version); + } + + +}); + +external_L_default().Map.mergeOptions({ + changeTileVersionControl: false +}); + +external_L_default().Map.addInitHook(function () { + if (this.options.changeTileVersionControl) { + this.changeTileVersionControl = new ChangeTileVersion(); + this.addControl(this.changeTileVersionControl); + } +}); + +var changeTileVersion = function (options) { + return new ChangeTileVersion(options); +}; + +;// CONCATENATED MODULE: ./src/common/control/img/Logo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var LogoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAAAdCAYAAAAjHtusAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozYWZlOGIwMi01MWE3LTRiZjYtYWVkYS05MGQ2ZTQ4YjZiMmUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODg0NkFBQUE3RjEzMTFFNzhFRjJFQkY4RjcxQjc1NjIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODg0NkFBQTk3RjEzMTFFNzhFRjJFQkY4RjcxQjc1NjIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MWI3NzdhNC1lZmEyLTQ1MzUtOGQzNi03MmRjNDkyODMzN2UiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjYTYzODVjMi1jNDQ1LTExN2EtYTc0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"; +;// CONCATENATED MODULE: ./src/leaflet/control/Logo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class Logo + * @aliasclass control.Logo + * @deprecatedclassinstance L.supermap.control.logo + * @classdesc Logo 控件。 + * @category Control + * @extends {L.Control} + * @example + * new Logo({ + * imageUrl: xxx,//非必填项 + * }).addTo(map); + * @param {Object} options - 参数。 + * @param {string} [options.position='bottomright'] - 控件位置继承自 leaflet control。 + * @param {string} [options.imageUrl] - logo 图片地址。 + * @param {string} [options.width] - logo 图片宽度。 + * @param {string} [options.height] - logo 图片高度。 + * @param {string} [options.link] - 跳转链接。 + * @param {string} [options.alt='SuperMap iClient'] - logo 图片失效时显示的提示文本。 + * @usage + */ +var Logo = external_L_default().Control.extend({ + + options: { + position: 'bottomright', + //logo图片地址 + imageUrl: null, + //跳转链接 + link: null, + //logo图片宽 + width: null, + //logo图片高 + height: null, + //logo图片失效时显示文本 + alt: "SuperMap iClient" + }, + + /** + * @private + * @function Logo.prototype.onAdd + * @override + * @description 添加 logo。 + * @returns {HTMLElement} 返回创建 logo 的 div。 + */ + onAdd: function () { + var div = external_L_default().DomUtil.create('div', 'iclient-leaflet-logo'); + div.style.marginTop = 0; + div.style.marginBottom = 0; + div.style.marginLeft = 0; + div.style.marginRight = 0; + //iClient.png base64 + var imgSrc = LogoBase64; + if (this.options.imageUrl) { + imgSrc = this.options.imageUrl; + } + var alt = this.options.alt; + + var imageWidth = "94px"; + var imageHeight = "29px"; + var styleSize = "width:" + imageWidth + ";height:" + imageHeight + ";"; + if (this.options.imageUrl) { + imageWidth = this.options.width; + imageHeight = this.options.height; + styleSize = "width:" + imageWidth + ";height:" + imageHeight + ";"; + if (!imageWidth || !imageHeight) { + styleSize = ""; + } + } + var link = this.options.link || "https://iclient.supermap.io"; + div.innerHTML = "" + + "" + alt + ""; + return div; + } +}); +//map默认开启logoControl +external_L_default().Map.mergeOptions({ + logoControl: true +}); +//map默认开启logoControl +external_L_default().Map.addInitHook(function () { + if (!this._logoAdded && this.options.logoControl) { + if (this.options.logoControl === true) { + this.logoControl = new Logo(); + + } else if (this.options.logoControl instanceof (external_L_default()).Control) { + this.logoControl = this.options.logoControl; + } + if (this.logoControl) { + this.addControl(this.logoControl); + this._logoAdded = true; + } + } +}); +var logo = function (options) { + return new Logo(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/control/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +;// CONCATENATED MODULE: ./src/leaflet/core/CommontypesConversion.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + const isArray = function(obj) { + return Object.prototype.toString.call(obj) == '[object Array]'; +} +/** + * @class CommontypesConversion + * @category BaseTypes Util + * @classdesc Leaflet 对象和 SuperMap 对象转换工具。 + * @usage + */ +const CommontypesConversion = { + /** + * @function CommontypesConversion.toSuperMapBounds + * @description 将 Leaflet 对象的 bounds 转成 SuperMap 的 bounds对象。 + * @param {(L.Bounds|L.LatLngBounds)} bounds - 图层显示范围。 + * @returns {Bounds} SuperMap 的 bounds 对象。 + */ + toSuperMapBounds(bounds) { + if (bounds && ["FeatureCollection", "Feature"].indexOf(bounds.type) !== -1) { + bounds = external_L_default().geoJSON(bounds).getBounds(); + } + if (bounds instanceof (external_L_default()).LatLngBounds) { + return new Bounds( + bounds.getSouthWest().lng, + bounds.getSouthWest().lat, + bounds.getNorthEast().lng, + bounds.getNorthEast().lat + ); + } + if (bounds instanceof (external_L_default()).Bounds) { + return new Bounds( + bounds.min.x, + bounds.min.y, + bounds.max.x, + bounds.max.y + ); + } + if (isArray(bounds)) { + return new Bounds( + bounds[0], + bounds[1], + bounds[2], + bounds[3] + ); + } + + return new Bounds(); + }, + + /** + * @function CommontypesConversion.isArray + * @description 判断是否为数组格式。 + * @param {Object} obj - 待判断的对象。 + * @returns {boolean} 是否是数组。 + */ + isArray, + + /** + * @function CommontypesConversion.toProcessingParam + * @description 将 Region 节点数组转为 Processing 服务需要的分析参数。 + * @param {Array} points - Region 各个节点数组。 + * @returns processing 服务裁剪、查询分析的分析参数。 + */ + toProcessingParam(points) { + var geometryParam = {}; + if (points.length < 1) { + geometryParam = ""; + } else { + var results = []; + for (var i = 0; i < points.length; i++) { + var point = {}; + point.x = points[i][0]; + point.y = points[i][1]; + results.push(point); + } + geometryParam.type = "REGION"; + geometryParam.points = results; + } + return geometryParam; + } +} + + +;// CONCATENATED MODULE: ./src/leaflet/core/ExtendsCRS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @name BaiduCRS + * @description 百度坐标对象。 + * @namespace + * @category BaseTypes Projection + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { BaiduCRS } from "{npm}"; + * + * const baiduCRS = BaiduCRS; + * ``` + */ +var BaiduCRS = external_L_default().extend({}, (external_L_default()).CRS.EPSG3857, { + code: 'Baidu', + scale: function (zoom) { + return (6378137 * Math.PI * 2) / Math.pow(2, 18 - zoom) + }, + + transformation: (function () { + var scale = 0.5 / (Math.PI * 6378137); + return new (external_L_default()).Transformation(scale, 0, -scale, 0); + }()) +}); + +var tdt_WGS84_resolutions = []; + +for (let i = 1; i < 19; i++) { + tdt_WGS84_resolutions.push(0.703125 * 2 / (Math.pow(2, i))); +} + +/** + * @name TianDiTu_WGS84CRS + * @deprecatedclass L.CRS.TianDiTu_WGS84CRS + * @description 天地图 WGS84 坐标对象。 + * @namespace + * @category BaseTypes Projection + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { TianDiTu_WGS84CRS } from "{npm}"; + * + * const tianDiTu_WGS84CRS = TianDiTu_WGS84CRS; + * + * ``` + */ +var TianDiTu_WGS84CRS = crs("EPSG:4326",{ + origin: [-180, 90], + resolutions: tdt_WGS84_resolutions, + bounds: external_L_default().bounds([-180, -90], [180, 90]), + wrapLng: [-180, 180] +}); + +const c = Math.PI * 2 * 6378137; +const halfC = c / 2; +var tdt_Mercator_resolutions = []; +for (let i = 1; i < 19; i++) { + tdt_Mercator_resolutions.push(c / 256 / Math.pow(2, i)); +} + +/** + * @name TianDiTu_MercatorCRS + * @deprecatedclass L.CRS.TianDiTu_MercatorCRS + * @description 天地图墨卡托坐标对象。 + * @category BaseTypes Projection + * @namespace + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { TianDiTu_MercatorCRS } from "{npm}"; + * + * const tianDiTu_MercatorCRS = TianDiTu_MercatorCRS; + * + * ``` + */ +var TianDiTu_MercatorCRS = crs('EPSG:3857', { + origin: [-halfC, halfC], + resolutions: tdt_Mercator_resolutions, + bounds: external_L_default().bounds([-halfC, -halfC], [halfC, halfC]), + wrapLng: [-180, 180] +}); +;// CONCATENATED MODULE: ./src/leaflet/core/NonEarthCRS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class NonProjection + * @classdesc 平面无投影对象。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {L.Bounds} bounds - 坐标范围 + */ +var NonProjection = external_L_default().Class.extend({ + initialize: function (bounds) { + this.bounds = bounds; + }, + + project: function (latlng) { + return new (external_L_default()).Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new (external_L_default()).LatLng(point.y, point.x); + } +}); + +var nonProjection = function (bounds) { + return new NonProjection(bounds); +}; + +/** + * @class NonEarthCRS + * @aliasclass CRS.NonEarthCRS + * @deprecatedclass L.CRS.NonEarthCRS + * @deprecatedclassinstance L.supermap.CRS.nonEarthCRS + * @classdesc 平面无投影坐标类。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {Object} options.origin - 原点。 + * @param {L.Bounds} options.bounds - 范围。 + * @param {Array.} [options.resolutions] - 分辨率。 + * @usage + */ +var NonEarthCRS = external_L_default().Class.extend({ + /** + * @member {Object} [NonEarthCRS.prototype.includes=L.CRS] + * @description 坐标对象。 + */ + includes: (external_L_default()).CRS, + + initialize: function (options) { + if (options.origin) { + this.transformation = new (external_L_default()).Transformation(1, -options.origin.x, -1, options.origin.y); + } + this.projection = nonProjection(options.bounds); + this.bounds = options.bounds; + this.origin = options.origin; + this.resolutions = options.resolutions; + }, + + /** + * @function NonEarthCRS.prototype.scale + * @description 通过缩放级别计算比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 返回比例尺值。 + */ + scale: function (zoom) { + let defaultScale; + if (!this.resolutions || this.resolutions.length === 0) { + const width = Math.max(this.bounds.getSize().x, this.bounds.getSize().y); + defaultScale = 1.0 / (width / 256); + return defaultScale * Math.pow(2, zoom); + } + if (this.resolutions[zoom]) { + return 1.0 / this.resolutions[zoom]; + } + return (1.0 / this.resolutions[0]) * Math.pow(2, zoom); + }, + + /** + * @function NonEarthCRS.prototype.zoom + * @description 通过比例尺计算范围。 + * @param {number} scale - 比例尺。 + * @returns {number} 返回空间范围值。 + */ + zoom: function (scale) { + let defaultScale; + if (!this.resolutions || this.resolutions.length === 0) { + const width = Math.max(this.bounds.getSize().x, this.bounds.getSize().y); + defaultScale = 1.0 / (width / 256); + return Math.log(scale / defaultScale) / Math.LN2; + } + const index = this.resolutions.indexOf(1.0 / scale); + if (index > -1) { + return index; + } + return Math.log(scale / (1.0 / this.resolutions[0])) / Math.LN2; + }, + /** + * @function NonEarthCRS.prototype.distance + * @description 通过两个坐标点计算之间的距离。 + * @param {L.LatLng} latlng1 - 坐标点1。 + * @param {L.LatLng} latlng2 - 坐标点2。 + * @returns {number} 返回距离长度。 + */ + distance: function (latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + + return Math.sqrt(dx * dx + dy * dy); + }, + + infinite: false +}); +var nonEarthCRS = function (options) { + return new NonEarthCRS(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/core/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + /** + * @function toGeoJSON + * @category BaseTypes Util + * @description 将传入对象转为 GeoJSON 格式。 + * @param {Object} feature - 待转参数。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { toGeoJSON } from '{npm}'; + * + * const result = toGeoJSON(feature); + * ``` + */ + var toGeoJSON = function(feature) { + if (!feature) { + return feature; + } + return new GeoJSON().toGeoJSON(feature); +}; + + /** + * @function toSuperMapGeometry + * @category BaseTypes Util + * @description 将 GeoJSON 对象转为 SuperMap 几何图形。 + * @param {GeoJSONObject} geometry - GeoJSON 对象。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { toSuperMapGeometry } from '{npm}'; + * + * const result = toSuperMapGeometry(geometry); + * ``` + */ +var toSuperMapGeometry = function(geometry) { + if (!geometry) { + return geometry; + } + var result, + format = new GeoJSON(); + if (['FeatureCollection', 'Feature', 'Geometry'].indexOf(geometry.type) != -1) { + result = format.read(geometry, geometry.type); + } else if (typeof geometry.toGeoJSON === 'function') { + var geojson = geometry.toGeoJSON(); + result = geojson ? format.read(geojson, geojson.type) : geometry; + } + + var serverResult = result || geometry; + if (external_L_default().Util.isArray(result)) { + if (result.length === 1) { + serverResult = result[0]; + } else if (result.length > 1) { + serverResult = []; + result.map(function(item) { + serverResult.push(item.geometry); + return item; + }); + } + } + + return serverResult && serverResult.geometry ? serverResult.geometry : serverResult; +}; +var Util_getMeterPerMapUnit = getMeterPerMapUnit; + + + /** + * @function resolutionToScale + * @category BaseTypes Util + * @description 通过分辨率计算比例尺。 + * @param {number} resolution - 分辨率。 + * @param {number} dpi - 屏幕分辨率。 + * @param {string} mapUnit - 地图单位。 + * @returns {number} 比例尺。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { resolutionToScale } from '{npm}'; + * + * const result = resolutionToScale(resolution, dpi, mapUnit); + * ``` + */ +var resolutionToScale = function(resolution, dpi, mapUnit) { + var inchPerMeter = 1 / 0.0254; + // 地球半径。 + var meterPerMapUnit = Util_getMeterPerMapUnit(mapUnit); + var scale = resolution * dpi * inchPerMeter * meterPerMapUnit; + scale = 1 / scale; + return scale; +}; + + /** + * @function scaleToResolution + * @category BaseTypes Util + * @description 通过比例尺计算分辨率。 + * @param {number} scale - 比例尺。 + * @param {number} dpi - 屏幕分辨率。 + * @param {string} mapUnit - 地图单位。 + * @returns {number} 分辨率。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { scaleToResolution } from '{npm}'; + * + * const result = scaleToResolution(scale, dpi, mapUnit); + * ``` + */ +var scaleToResolution = function(scale, dpi, mapUnit) { + var inchPerMeter = 1 / 0.0254; + var meterPerMapUnitValue = Util_getMeterPerMapUnit(mapUnit); + var resolution = scale * dpi * inchPerMeter * meterPerMapUnitValue; + resolution = 1 / resolution; + return resolution; +}; + + /** + * @function normalizeScale + * @category BaseTypes Util + * @description 转换比例尺。 + * @param {number} scale - 比例尺。 + * @returns {number} 正常的 scale 值。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { normalizeScale } from '{npm}'; + * + * const result = normalizeScale(scale); + * ``` + */ +var normalizeScale = function(scale) { + return scale > 1.0 ? 1.0 / scale : scale; +}; + + /** + * @function getResolutionFromScaleDpi + * @category BaseTypes Util + * @description 根据比例尺和 dpi 计算屏幕分辨率。 + * @param {number} scale - 比例尺。 + * @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 + * @param {string} [coordUnit] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 + * @returns {number} 当前比例尺下的屏幕分辨率。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { getResolutionFromScaleDpi } from '{npm}'; + * + * const result = getResolutionFromScaleDpi(scale, dpi, coordUnit, datumAxis); + * ``` + */ +var getResolutionFromScaleDpi = function(scale, dpi, coordUnit, datumAxis) { + var resolution = null, + ratio = 10000; + //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + if (scale > 0 && dpi > 0) { + scale = normalizeScale(scale); + if ( + coordUnit.toLowerCase() === 'degree' || + coordUnit.toLowerCase() === 'degrees' || + coordUnit.toLowerCase() === 'dd' + ) { + //scale = CommonUtil.normalizeScale(scale); + resolution = (0.0254 * ratio) / dpi / scale / ((Math.PI * 2 * datumAxis) / 360) / ratio; + return resolution; + } else { + resolution = (0.0254 * ratio) / dpi / scale / ratio; + return resolution; + } + } + return -1; +}; + + +;// CONCATENATED MODULE: ./src/leaflet/core/Transform.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @function transform + * @description 转换要素坐标。 + * @category BaseTypes Util + * @param {(L.Marker|L.CircleMarker|L.Polyline|L.Polygon|L.Rectangle|L.LatLngBounds|L.Bounds|Object)} feature - 待转换要素:Leaflet Vector Layers 。 + * 的 {@link L.Marker}|{@link L.CircleMarker}|{@link L.Polyline}|{@link L.Polygon}|{@link L.Rectangle}|{@link L.LatLngBounds}|{@link L.Bounds}|{@link GeoJSONObject} 类型。 + * @param {CRS} [sourceCRS=L.CRS.EPSG4326] - 转换要素的源坐标系。 + * @param {CRS} targetCRS - 转换要素的目标坐标系。 + * @returns {GeoJSONObject} 返回 GeoJSON 规范的数据类型。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { transform } from '{npm}'; + * + * const result = transform(feature, sourceCRS, targetCRS); + * ``` + */ +var Transform_transform = function (feature, sourceCRS = (external_L_default()).CRS.EPSG4326, targetCRS) { + let selfFeatures = null; + let selfCallback = null; + //将数据统一为 geojson 格式处理: + if (["FeatureCollection", "Feature", "Geometry"].indexOf(feature.type) === -1) { + if (feature.toGeoJSON) { + feature = feature.toGeoJSON(); + } else if (feature instanceof (external_L_default()).LatLngBounds) { + feature = external_L_default().rectangle(feature).toGeoJSON(); + } else if (feature instanceof (external_L_default()).Bounds) { + feature = external_L_default().rectangle([[feature.getTopLeft().x, feature.getTopLeft().y], + [feature.getBottomRight().x, feature.getBottomRight().y]]).toGeoJSON(); + } else { + throw new Error("This tool only supports data conversion in geojson format or Vector Layers of Leaflet.") + } + } + + //geojson 几种数据类型及处理形式 + const parseCoords = { + "point": function (array) { + return selfCallback(array); + }, + + "multipoint": function (array) { + return parseCoords["linestring"].apply(this, [array]) + }, + + "linestring": function (array) { + let points = []; + let p = null; + for (let i = 0, len = array.length; i < len; ++i) { + try { + p = parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + points.push(p); + } + return points; + }, + + "multilinestring": function (array) { + return parseCoords["polygon"].apply(this, [array]); + }, + + "polygon": function (array) { + let rings = []; + let l; + for (let i = 0, len = array.length; i < len; ++i) { + try { + l = parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + rings.push(l); + } + return rings; + }, + "multipolygon": function (array) { + let polys = []; + let p = null; + for (let i = 0, len = array.length; i < len; ++i) { + try { + p = parseCoords["polygon"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + polys.push(p); + } + return polys; + } + + }; + + //返回结果: + return featureTransform(feature, _transformCoordinates); + + function featureTransform(feature, callback) { + selfFeatures = feature; + selfCallback = callback; + //分离处理: + if (feature.type === "Feature") { + selfFeatures = _prepareFeatuers(feature); + } else if (feature.type === "FeatureCollection") { + let featureResults = []; + for (let i = 0; i < feature.features.length; ++i) { + try { + featureResults.push(_prepareFeatuers(feature.features[i])); + } catch (err) { + featureResults = null; + } + } + selfFeatures.features = featureResults; + } + + return selfFeatures; + } + + function _prepareFeatuers(feature) { + const geometry = feature.geometry; + if (!(Util.isArray(geometry.coordinates))) { + throw "Geometry must have coordinates array: " + geometry; + } + if (!parseCoords[geometry.type.toLowerCase()]) { + throw "Unsupported geometry type: " + geometry.type; + } + try { + geometry.coordinates = parseCoords[geometry.type.toLowerCase()].apply( + this, [geometry.coordinates] + ); + } catch (err) { + throw err; + } + feature.geometry = geometry; + return feature; + } + + function _transformCoordinates(coordinates) { + //判断code 是投影坐标还是地理坐标 + var point = sourceCRS.unproject({x: coordinates[0], y: coordinates[1]}); + const transform = targetCRS.project(point); + return [transform.x, transform.y]; + } + +}; + + +;// CONCATENATED MODULE: ./src/leaflet/core/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/mapping/BaiduTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BaiduTileLayer + * @deprecatedclassinstance L.supermap.baiduTileLayer + * @classdesc 百度地图图层。 + * @category ThirdPartyMap + * @extends {L.TileLayer} + * @param {string} [url='https://online{num}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles={styles}&udt=20150815&scaler=1'] - 切片地址。 + * @param {Object} options - 参数。 + * @param {number} [options.minZoom=3] - 最小缩放级别。 + * @param {number} [options.maxZoom=19] - 最大缩放级别。 + * @param {L.LatLngBounds} [options.bounds=L.latLngBounds([-85.0511287798, -180],[85.0511287798, 180])] - 显示范围。 + * @param {L.Browser} [options.retina=L.Browser.retina] - 浏览器显示分辨率。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.attribution='Map Data © 2018 Baidu - GS(2016)2089号 - Data © 长地万方'] - 版权信息。 + * @usage + */ +var BaiduTileLayer = external_L_default().TileLayer.extend({ + + /** + * @member {string} BaiduTileLayer.prototype.url + * @description 切片地址。 + */ + url: "http://online{num}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles={styles}&udt=20150815&scaler=1", + + options: { + minZoom: 3, + maxZoom: 19, + bounds: external_L_default().latLngBounds(external_L_default().latLng(-85.0511287798, -180), external_L_default().latLng(85.0511287798, 180)), + retina: (external_L_default()).Browser.retina, + attribution: core_Attributions.Baidu.attribution + }, + + initialize: function (url, options) { + if (url) { + this.url = url; + } + external_L_default().setOptions(this, options); + if (this.options.retina) { + this.options.maxZoom = 18; + } + external_L_default().stamp(this); + }, + + /** + * @function BaiduTileLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function (coords) { + var url = external_L_default().Util.template(this.url, { + num: Math.abs((coords.x + coords.y) % 8) + 1, + x: coords.x, + y: -coords.y - 1, + z: this._getZoomForUrl(), + styles: this.options.retina ? 'ph' : 'pl' + }); + //支持代理 + if (this.options.tileProxy) { + url = this.options.tileProxy + encodeURIComponent(url); + } + return url; + } +}); +var baiduTileLayer = function (url, options) { + return new BaiduTileLayer(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/mapping/CloudTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class CloudTileLayer + * @deprecatedclassinstance L.supermap.cloudTileLayer + * @classdesc 超图云服务图层。 + * @category ThirdPartyMap + * @extends {L.TileLayer} + * @param {string} [url='http://t2.dituhui.com/FileService/image?map={mapName}&type={type}&x={x}&y={y}&z={z}'] - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.type='web'] - type。 + * @param {number} [options.minZoom=3] - 最小缩放级别。 + * @param {number} [options.maxZoom=18] - 最大缩放级别。 + * @param {string} [options.mapName='quanguo'] - 地图名称。 + * @param {string} [options.attribution='Map Data ©2014 SuperMap - GS(2014)6070号-data©Navinfo'] - 版权信息。 + * @usage + */ +var CloudTileLayer = external_L_default().TileLayer.extend({ + + defaultURL: 'http://t2.dituhui.com/FileService/image', + + options: { + /** + * @member {string} [CloudTileLayer.prototype.options='quanguo'] + * @description 地图名称。 + */ + mapName: "quanguo", + /** + * @member {string} CloudTileLayer.prototype.type + * @description 地图投影。 + */ + type: "web", + minZoom: 3, + maxZoom: 18, + attribution: core_Attributions.Cloud.attribution + }, + + initialize: function (url, options) { + external_L_default().setOptions(this, options); + var cloudURL = url || this.defaultURL; + this._url = cloudURL + "?map=" + this.options.mapName + "&type=" + this.options.type; + external_L_default().stamp(this); + }, + + /** + * @function CloudTileLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function (coords) { + var layerUrl = this._url; + var tileUrl = layerUrl + "&x=" + coords.x + "&y=" + coords.y + "&z=" + coords.z; + //支持代理 + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + return tileUrl; + } +}); +var cloudTileLayer = function (url, options) { + return new CloudTileLayer(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/mapping/ImageMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class ImageMapLayer + * @deprecatedclassinstance L.supermap.imageMapLayer + * @classdesc SuperMap iServer 的 REST 地图服务的图层(SuperMap iServer Java 6R 及以上分块动态 REST 图层)。使用 Image 资源出图。 + * @category iServer Map Tile + * @extends {L.Layer} + * @example + * new ImageMapLayer(url).addTo(map); + * @param {string} url - 服务地址,如:http://{ip}:{port}/iserver/services/map-china400/rest/maps/China。 + * @param {Object} options - 参数。 + * @param {string} [options.layersID] - 获取需要切片的地图图层 ID,即指定需要切片的地图图层,可以是临时图层集,也可以是当前地图中图层的组合。 + * @param {boolean} [options.redirect=false] - 是否重定向,如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流。 + * @param {boolean} [options.transparent=true] - 地图瓦片是否透明。 + * @param {boolean} [options.cacheEnabled=true] - 是否启用缓存。 + * @param {boolean} [options.clipRegionEnabled=false] - 是否启用地图裁剪。 + * @param {L.Path} [options.clipRegion] - 地图显示裁剪的区域(区域为一个面对象)。当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。 + * @param {Object} [options.prjCoordSys] - 请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857}。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内,是否重叠显示。 + * @param {string} [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项。 + * @param {number} [options.opacity=1] - 图层不透明度。 + * @param {string} [options.alt] - 图像无法显示时的提示文字。 + * @param {string} [options.pane='tilePane'] - 图层所归属的 map DOM 的分组。 + * @param {boolean} [options.interactive=false] - 是否响应鼠标点击或悬停等交互事件。 + * @param {boolean} [options.crossOrigin=false] - 是否设置跨域属性。 + * @param {string} [options.errorOverlayUrl] - 图层未能加载时显示的瓦片地址。 + * @param {number} [options.zIndex=1] - 设置图层的层级。 + * @param {string} [options.className] - 自定义 dom 元素的 className。 + * @param {number} [options.updateInterval=150] - 平移时图层延迟刷新间隔时间。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.format='png'] - 瓦片表述类型,支持 "png" 、"webp"、"bmp" 、"jpg"、 "gif" 等图片格式。 + * @param {(NDVIParameter|HillshadeParameter)} [options.rasterfunction] - 栅格分析参数。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @fires ImageMapLayer#load + * @fires ImageMapLayer#error + * @fires ImageMapLayer#loading + * @usage + */ +var ImageMapLayer = external_L_namespaceObject.Layer.extend({ + options: { + //如果有layersID,则是在使用专题图 + layersID: null, + //如果为 true,则将请求重定向到图片的真实地址;如果为 false,则响应体中是图片的字节流 + redirect: false, + //地图图片是否透明 + transparent: true, + //是否启用服务器缓存 + cacheEnabled: true, + //地图显示裁剪的区域是否有效 + clipRegionEnabled: false, + //地图显示裁剪的区域 + clipRegion: null, + //请求的地图的坐标参考系统。 如:prjCoordSys= {"epsgCode":3857}。 + prjCoordSys: null, + //地图对象在同一范围内,是否重叠显示 + overlapDisplayed: false, + //避免地图对象压盖显示的过滤选项 + overlapDisplayedOptions: null, + //图层不透明度 + opacity: 1, + //图像无法显示时的提示文字 + alt: '', + //图层所归属的map DOM的分组。默认为:"tilePane" + pane: 'tilePane', + //是否响应鼠标点击或悬停交互事件 + interactive: false, + //是否设置跨域属性 + crossOrigin: false, + //图层未能加载时显示的瓦片地址 + errorOverlayUrl: '', + //设置图层的显示层级 + zIndex: 1, + //自定义的html class name + className: '', + //版权信息 + attribution: core_Attributions.Common.attribution, + //平移时图层延迟刷新间隔时间。 + updateInterval: 150, + //启用托管地址。 + tileProxy: null, + format: 'png' + }, + + initialize: function(url, options) { + this._url = url; + external_L_namespaceObject.Util.setOptions(this, options); + }, + + /** + * @private + * @function ImageMapLayer.prototype.onAdd + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function(map) { + this.update = external_L_namespaceObject.Util.throttle(this.update, this.options.updateInterval, this); + map.on('moveend', this.update, this); + + if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) { + map.addLayer(this._currentImage); + } else if (this._currentImage) { + this._map.removeLayer(this._currentImage); + this._currentImage = null; + } + this.update(); + }, + + /** + * @private + * @function ImageMapLayer.prototype.onRemove + * @description 从地图上移除。 + */ + onRemove: function() { + // eslint-disable-line no-unused-vars + if (this._currentImage) { + this._map.removeLayer(this._currentImage); + } + this._map.off('moveend', this.update, this); + }, + + /** + * @function ImageMapLayer.prototype.bringToFront + * @description 置顶当前图层。 + */ + bringToFront: function() { + this.options.position = 'front'; + if (this._currentImage) { + this._currentImage.bringToFront(); + } + return this; + }, + + /** + * @function ImageMapLayer.prototype.bringToFront + * @description 置底当前图层。 + */ + bringToBack: function() { + this.options.position = 'back'; + if (this._currentImage) { + this._currentImage.bringToBack(); + } + return this; + }, + + /** + * @function ImageMapLayer.prototype.getOpacity + * @description 获取图层透明度。 + * @returns {number} 图层的透明度。 + */ + getOpacity: function() { + return this.options.opacity; + }, + + /** + * @function ImageMapLayer.prototype.setOpacity + * @description 设置图层不透明度。 + */ + setOpacity: function(opacity) { + this.options.opacity = opacity; + if (this._currentImage) { + this._currentImage.setOpacity(opacity); + } + return this; + }, + + /** + * @function ImageMapLayer.prototype.getImageUrl + * @description 获取 image 图层请求地址,子类可重写实现。 + * @returns {string} 请求瓦片地址。 + */ + getImageUrl: function(params) { + let serviceUrl = Util.urlPathAppend(this._url, `image.${this.options.format}`); + let imageUrl = + serviceUrl + external_L_namespaceObject.Util.getParamString(Object.assign({}, this._initAllRequestParams(), params), serviceUrl); + imageUrl = SecurityManager.appendCredential(imageUrl); + //支持代理 + if (this.options.tileProxy) { + imageUrl = this.options.tileProxy + encodeURIComponent(imageUrl); + } + if (!this.options.cacheEnabled) { + imageUrl += '&_t=' + new Date().getTime(); + } + return imageUrl; + }, + + //获取请求瓦片宽高以及请求范围参数 + _getImageParams: function() { + var size = this._calculateImageSize(); + return { + viewBounds: this._compriseBounds(this._calculateBounds()), + width: size.x, + height: size.y + }; + }, + + //初始化服务请求参数 + _initAllRequestParams: function() { + var me = this, + options = me.options || {}, + params = {}; + + var redirect = options.redirect === true ? options.redirect : false; + params['redirect'] = redirect; + + var transparent = options.transparent === true ? options.transparent : false; + params['transparent'] = transparent; + + var cacheEnabled = options.cacheEnabled === false ? options.cacheEnabled : true; + params['cacheEnabled'] = cacheEnabled; + + if (options.prjCoordSys) { + params['prjCoordSys'] = JSON.stringify(options.prjCoordSys); + } + + if (options.layersID) { + params['layersID'] = options.layersID; + } + if (options.rasterfunction) { + params['rasterfunction'] = JSON.stringify(options.rasterfunction); + } + + if (options.clipRegionEnabled && options.clipRegion) { + params['clipRegionEnabled'] = options.clipRegionEnabled; + params['clipRegion'] = JSON.stringify(ServerGeometry.fromGeometry(toSuperMapGeometry(options.clipRegion))); + } + + if (options.overlapDisplayed === false) { + params['overlapDisplayed'] = false; + if (options.overlapDisplayedOptions) { + params['overlapDisplayedOptions'] = me.overlapDisplayedOptions.toString(); + } + } else { + params['overlapDisplayed'] = true; + } + return params; + }, + + //初始化请求链接 + _requestImage: function(params, bounds) { + var imageUrl = this.getImageUrl(params); + this._loadImage(imageUrl, bounds); + }, + + //加载请求图层 + _loadImage: function(url, bounds) { + if (!this._map) { + return; + } + + var image = new external_L_namespaceObject.ImageOverlay(url, bounds, { + opacity: 0, + alt: this.options.alt, + zIndex: this.options.zIndex, + className: this.options.className, + errorOverlayUrl: this.options.error, + crossOrigin: this.options.crossOrigin, + pane: this.options.pane || this.getPane(), + interactive: this.options.interactive + }).addTo(this._map); + + var onLoad = function(e) { + image.off('error', onLoad, this); + var map = this._map; + if (!map) { + return; + } + + var newImage = e.target; + var oldImage = this._currentImage; + + if (newImage._bounds && newImage._bounds.equals(bounds) && newImage._bounds.equals(map.getBounds())) { + this._currentImage = newImage; + + if (this.options.position === 'front') { + this.bringToFront(); + } + if (this.options.position === 'back') { + this.bringToBack(); + } + + if (this._currentImage._map) { + this._currentImage.setOpacity(this.options.opacity); + } + + oldImage && map.removeLayer(oldImage); + + oldImage && oldImage._map && oldImage._map.removeLayer(oldImage); + } else { + map.removeLayer(newImage); + } + + /** + * @event ImageMapLayer#load + * @description 请求图层加载完成后触发。 + * @property {L.Bounds} bounds - 图层 bounds。 + */ + this.fire('load', { bounds: bounds }); + }; + + image.once('load', onLoad, this); + + image.once( + 'error', + function() { + this._map.removeLayer(image); + /** + * @event ImageMapLayer#error + * @description 请求图层加载失败后触发。 + */ + this.fire('error'); + image.off('load', onLoad, this); + }, + this + ); + + /** + * @event ImageMapLayer#loading + * @description 请求图层加载中触发。 + * @property {L.Bounds} bounds - 图层 bounds。 + */ + this.fire('loading', { bounds: bounds }); + }, + + /** + * @function ImageMapLayer.prototype.update + * @description 更新图层。 + */ + update: function() { + if (!this._map) { + return; + } + + var zoom = this._map.getZoom(); + var bounds = this._map.getBounds(); + if (zoom > (this._map.options.maxZoom|| 18) || zoom < (this._map.options.minZoom || 0)) { + if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + this._currentImage = null; + } + return; + } + var params = this._getImageParams(); + if (params) { + this._requestImage(params, bounds); + } else if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + this._currentImage = null; + } + }, + + //将像素坐标转成点坐标 + _calculateBounds: function() { + var pixelBounds = this._map.getPixelBounds(); + var sw = this._map.unproject(pixelBounds.getBottomLeft()); + var ne = this._map.unproject(pixelBounds.getTopRight()); + var neProjected = this._map.options.crs.project(ne); + var swProjected = this._map.options.crs.project(sw); + return external_L_default().bounds(neProjected, swProjected); + }, + + //转换viewBounds为JSON字符串 + _compriseBounds: function(boundsProjected) { + var projBounds = { + leftBottom: { + x: boundsProjected.getBottomLeft().x, + y: boundsProjected.getTopRight().y + }, + rightTop: { + x: boundsProjected.getTopRight().x, + y: boundsProjected.getBottomLeft().y + } + }; + return JSON.stringify(projBounds); + }, + + //计算图层的宽高 + _calculateImageSize: function() { + var map = this._map; + var bounds = map.getPixelBounds(); + var size = map.getSize(); + + var sw = map.unproject(bounds.getBottomLeft()); + var ne = map.unproject(bounds.getTopRight()); + + var top = map.latLngToLayerPoint(ne).y; + var bottom = map.latLngToLayerPoint(sw).y; + + if (top > 0 || bottom < size.y) { + size.y = bottom - top; + } + return size; + } +}); + +var imageMapLayer = function(url, options) { + return new ImageMapLayer(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/mapping/TileLayer.WMTS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class WMTSLayer + * @deprecatedclassinstance L.supermap.wmtsLayer + * @classdesc wmts 图层类。 + * @category OGC + * @extends {L.TileLayer} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.layer - 显示的图层。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {Object} [options.style] - 图层样式。 + * @param {string} [options.format='image/png'] - wmts 图像格式('image/png'用于具有透明度的图层)。 + * @param {(number|L.Point)} [options.tileSize='256'] - 瓦片大小。 + * @param {string} [options.requestEncoding='KVP'] - KVP 或者 REST 的请求方式。 + * @param {string} [options.tilematrixSet] - 瓦片矩阵集。 + * @param {Array.} [options.matrixIds] - 瓦片矩阵对象。不设置时,默认为获取当前级别为 tilematrix 参数。 + * @param {string} [options.version='1.0.0'] - 版本。 + * @param {string} [options.attribution] - 版权信息。 + * @param {string} [options.noWrap=true] - 图层是否 X 方向平铺。 + * @usage + */ +/** + * @typedef {Object} WMTSLayer.matrix + * @description 瓦片矩阵。 + * @property {string} identifier - 瓦片矩阵标识符。 + */ +var WMTSLayer = external_L_default().TileLayer.extend({ + + options: { + version: '1.0.0', + style: '', + tilematrixSet: '', + format: 'image/png', + tileSize: 256, + matrixIds: null, + layer: '', + requestEncoding: 'KVP', + attribution: '', + noWrap: true + }, + + //todo 自动获取Capabilities + initialize: function (url, options) { // (String, Object) + this._url = url; + external_L_default().setOptions(this, options); + + var opt = this.options; + if (opt.requestEncoding === "REST") { + + var formatSuffixMap = { + "image/png": "png", + "image/png8": "png", + "image/png24": "png", + "image/png32": "png", + "png": "png", + "image/jpeg": "jpg", + "image/jpg": "jpg", + "jpeg": "jpg", + "jpg": "jpg" + }; + this.formatSuffix = "." + (formatSuffixMap[opt.format] || opt.format.split("/").pop() || "png"); + } else { + + opt.requestEncoding = "KVP"; + } + + }, + + /** + * @function WMTSLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function (coords) { // (Point, Number) -> String + var zoom = this._getZoomForUrl(); + var ident = this.options.matrixIds ? this.options.matrixIds[zoom].identifier : zoom; + + var url = external_L_default().Util.template(this._url, {s: this._getSubdomain(coords)}); + + var obj = { + service: 'WMTS', + request: 'GetTile', + version: this.options.version, + style: this.options.style, + tilematrixSet: this.options.tilematrixSet, + format: this.options.format, + width: this.options.tileSize, + height: this.options.tileSize, + layer: this.options.layer, + tilematrix: ident, + tilerow: coords.y, + tilecol: coords.x + }; + + if (this.options.tileProxy) { + url = this.options.tileProxy + url; + } + + if (this.options.requestEncoding === 'KVP') { + url += external_L_default().Util.getParamString(obj, url); + } else if (this.options.requestEncoding === 'REST') { + var params = "/" + obj.layer + "/" + obj.style + "/" + obj.tilematrixSet + "/" + obj.tilematrix + "/" + obj.tilerow + "/" + obj.tilecol + this.formatSuffix; + url += params; + } + return url; + } +}); + +var wmtsLayer = function (url, options) { + return new WMTSLayer(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/mapping/TiandituTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class TiandituTileLayer + * @deprecatedclassinstance L.supermap.tiandituTileLayer + * @classdesc 天地图图层类。 + * @category ThirdPartyMap + * @extends WMTSLayer + * @param {Object} options - 参数。 + * @param {string} [options.url='https://t{s}.tianditu.gov.cn/{layer}_{proj}/wmts?'] - 服务地址。 + * @param {string} options.key - 天地图服务密钥。详见 {@link https://lbs.tianditu.gov.cn/server/MapService.html} + * @param {string} [options.layerType='vec'] - 图层类型。( vec: 矢量图层,img: 影像图层,ter: 地形图层) + * @param {string} [options.style='default'] - 图层风格。 + * @param {string} [options.format='tiles'] - 格式。 + * @param {boolean} [options.isLabel=false] - 是否是标注图层。 + * @param {Array.} [options.subdomains=[0, 1, 2, 3, 4, 5, 6, 7]] - 子域名数组。 + * @param {string} [options.attribution='Map Data '] - 版权信息 + * @param {string} [options.noWrap=true] - 图层是否 X 方向平铺。 + * @usage + */ +var TiandituTileLayer = WMTSLayer.extend({ + layerLabelMap: { + vec: 'cva', + ter: 'cta', + img: 'cia' + }, + layerZoomMap: { + vec: 18, + ter: 14, + img: 18 + }, + options: { + layerType: 'vec', //(vec:矢量图层,vec:矢量标签图层,img:影像图层,cia:影像标签图层,ter:地形,cta:地形标签图层) + isLabel: false, + attribution: core_Attributions.Tianditu.attribution, + url: 'https://t{s}.tianditu.gov.cn/{layer}_{proj}/wmts?', + zoomOffset: 1, + key: '', + dpi: 96, + style: 'default', + format: 'tiles', + subdomains: [0, 1, 2, 3, 4, 5, 6, 7], + bounds: [ + [-90, -180], + [90, 180] + ], + noWrap: true + }, + + initialize: function (options) { + options = options || {}; + external_L_default().setOptions(this, options); + this.options.layer = this.options.isLabel ? this.layerLabelMap[this.options.layerType] : this.options.layerType; + this.options.maxZoom = this.layerZoomMap[this.options.layerType] - 1; + WMTSLayer.prototype.initialize.call(this, this.options.url, this.options); + external_L_default().stamp(this); + if (this.options.key) { + this._url = `${this._url}tk=${this.options.key}`; + } + }, + onAdd: function (map) { + this.options.tilematrixSet = map.options.crs.code === "EPSG:4326" ? "c" : "w"; + this._url = this._url.replace("{layer}", this.options.layer).replace("{proj}", this.options.tilematrixSet); + WMTSLayer.prototype.onAdd.call(this, map); + }, + _isValidTile: function (coords) { + const crs = this._map.options.crs; + if (!crs.infinite) { + const bounds = this._globalTileRange; + if ( + ((!crs.wrapLng || this.options.noWrap) && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || + (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y)) + ) { + return false; + } + } + if (!this.options.bounds) { + return true; + } + const tileBounds = this._tileCoordsToBounds(coords); + return external_L_default().latLngBounds(this.options.bounds).overlaps(tileBounds); + } +}); +var tiandituTileLayer = function (options) { + return new TiandituTileLayer(options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/mapping/TiledMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class TiledMapLayer + * @deprecatedclassinstance L.supermap.tiledMapLayer + * @classdesc SuperMap iServer 的 REST 地图服务的图层(SuperMap iServer Java 6R 及以上分块动态 REST 图层)。使用 TileImage 资源出图。 + * @category iServer Map Tile + * @extends {L.TileLayer} + * @example + * new TiledMapLayer(url).addTo(map); + * @param {string} url - 服务地址,例如: http://{ip}:{port}/iserver/services/map-world/rest/maps/World。 + * @param {Object} options - 参数。 + * @param {string} [options.layersID] - 获取进行切片的地图图层 ID,即指定进行地图切片的图层,可以是临时图层集,也可以是当前地图中图层的组合 + * @param {boolean} [options.redirect=false] - 是否重定向,如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流。 + * @param {boolean} [options.transparent=true] - 是否背景透明。 + * @param {boolean} [options.cacheEnabled=true] - 启用缓存。 + * @param {boolean} [options.clipRegionEnabled=false] - 是否启用地图裁剪。 + * @param {L.Path} [options.clipRegion] - 地图显示裁剪的区域。是一个面对象,当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。 + * @param {Object} [options.prjCoordSys] - 请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857}。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内时,是否重叠显示。 + * @param {string} [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项。 + * @param {string} [options.tileversion] - 切片版本名称,cacheEnabled 为 true 时有效。如果没有设置 tileversion 参数,而且当前地图的切片集中存在多个版本,则默认使用最后一个更新版本。 + * @param {CRS} [options.crs] - 坐标系统类。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.format='png'] - 瓦片表述类型,支持 "png" 、"webp"、"bmp" 、"jpg"、 "gif" 等图片格式。 + * @param {(number|L.Point)} [options.tileSize=256] - 瓦片大小。 + * @param {(NDVIParameter|HillshadeParameter)} [options.rasterfunction] - 栅格分析参数。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @param {Array.} [options.subdomains] - 子域名数组。 + * @fires TiledMapLayer#tilesetsinfoloaded + * @fires TiledMapLayer#tileversionschanged + * @usage + */ +var TiledMapLayer = external_L_default().TileLayer.extend({ + + options: { + //如果有layersID,则是在使用专题图 + layersID: null, + //如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流 + redirect: false, + transparent: true, + cacheEnabled: true, + clipRegionEnabled: false, + //地图显示裁剪的区域 + clipRegion: null, + //请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857} + prjCoordSys: null, + //地图对象在同一范围内时,是否重叠显示 + overlapDisplayed: false, + //避免地图对象压盖显示的过滤选项 + overlapDisplayedOptions: null, + //切片版本名称,cacheEnabled 为 true 时有效。 + tileversion: null, + crs: null, + format: 'png', + //启用托管地址。 + tileProxy:null, + attribution: core_Attributions.Common.attribution, + subdomains: null + }, + + initialize: function (url, options) { + this._url = url; + external_L_default().TileLayer.prototype.initialize.apply(this, arguments); + external_L_default().setOptions(this, options); + external_L_default().stamp(this); + + //当前切片在切片集中的index + this.tileSetsIndex = -1; + this.tempIndex = -1; + }, + + /** + * @private + * @function TiledMapLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { + this._crs = this.options.crs || map.options.crs; + external_L_default().TileLayer.prototype.onAdd.call(this, map); + }, + + /** + * @function TiledMapLayer.prototype.getTileUrl + * @description 根据行列号获取瓦片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 瓦片地址。 + */ + getTileUrl: function (coords) { + var scale = this.getScaleFromCoords(coords); + var layerUrl = this._getLayerUrl(); + var tileUrl = layerUrl + "&scale=" + scale + "&x=" + coords.x + "&y=" + coords.y; + //支持代理 + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + if (!this.options.cacheEnabled) { + tileUrl += "&_t=" + new Date().getTime(); + } + if (this.options.subdomains) { + tileUrl = external_L_default().Util.template(tileUrl, {s: this._getSubdomain(coords)}); + } + return tileUrl; + }, + + /** + * @function TiledMapLayer.prototype.getScale + * @description 根据缩放级别获取比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 比例尺。 + */ + getScale: function (zoom) { + var me = this; + //返回当前比例尺 + var z = zoom || me._map.getZoom(); + return me.scales[z]; + }, + + /** + * @function TiledMapLayer.prototype.getScaleFromCoords + * @description 通过行列号获取比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 比例尺。 + */ + getScaleFromCoords: function (coords) { + var me = this, + scale; + if (me.scales && me.scales[coords.z]) { + return me.scales[coords.z]; + } + me.scales = me.scales || {}; + scale = me.getDefaultScale(coords); + me.scales[coords.z] = scale; + return scale; + }, + + /** + * @private + * @function TiledMapLayer.prototype.getDefaultScale + * @description 获取默认比例尺信息。 + * @param {Object} coords - 坐标对象参数。 + */ + getDefaultScale: function (coords) { + var me = this, + crs = me._crs; + if (crs.scales) { + return crs.scales[coords.z]; + } else { + var tileBounds = me._tileCoordsToBounds(coords); + var ne = crs.project(tileBounds.getNorthEast()); + var sw = crs.project(tileBounds.getSouthWest()); + var tileSize = me.options.tileSize; + var resolution = Math.max( + Math.abs(ne.x - sw.x) / tileSize, + Math.abs(ne.y - sw.y) / tileSize + ); + var mapUnit = Unit.METER; + if (crs.code) { + var array = crs.code.split(':'); + if (array && array.length > 1) { + var code = parseInt(array[1]); + mapUnit = code && code >= 4000 && code <= 5000 ? Unit.DEGREE : Unit.METER; + } + } + return resolutionToScale(resolution, 96, mapUnit); + } + }, + + + /** + * @function TiledMapLayer.prototype.setTileSetsInfo + * @description 设置瓦片集信息。 + * @param {Object} tileSets - 瓦片对象集。 + */ + setTileSetsInfo: function (tileSets) { + this.tileSets = tileSets; + if (external_L_default().Util.isArray(this.tileSets)) { + this.tileSets = this.tileSets[0]; + } + if (!this.tileSets) { + return; + } + /** + * @event TiledMapLayer#tilesetsinfoloaded + * @description 瓦片集信息设置完成后触发。 + * @property {Array.} tileVersions - 瓦片集信息。 + */ + this.fire('tilesetsinfoloaded', { + tileVersions: this.tileSets.tileVersions + }); + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.lastTilesVersion + * @description 请求上一个版本切片,并重新绘制。 + */ + lastTilesVersion: function () { + this.tempIndex = this.tileSetsIndex - 1; + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.nextTilesVersion + * @description 请求下一个版本切片,并重新绘制。 + */ + nextTilesVersion: function () { + this.tempIndex = this.tileSetsIndex + 1; + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.changeTilesVersion + * @description 切换到某一版本的切片,并重绘。通过 this.tempIndex 保存需要切换的版本索引 + */ + changeTilesVersion: function () { + var me = this; + //切片版本集信息是否存在 + if (me.tileSets == null) { + //版本信息为空,重新查询,查询成功继续跳转到相应的版本 + //me.getTileSetsInfo(); + return; + } + if (me.tempIndex === me.tileSetsIndex || this.tempIndex < 0) { + return; + } + //检测index是否可用 + var tileVersions = me.tileSets.tileVersions; + if (tileVersions && me.tempIndex < tileVersions.length && me.tempIndex >= 0) { + var name = tileVersions[me.tempIndex].name; + var result = me.mergeTileVersionParam(name); + if (result) { + me.tileSetsIndex = me.tempIndex; + /** + * @event TiledMapLayer#tileversionschanged + * @description 切片的版本切换和重绘成功之后触发。 + * @property {Object} tileVersion - 该版本的切片。 + */ + me.fire('tileversionschanged', { + tileVersion: tileVersions[me.tempIndex] + }); + } + } + }, + + /** + * @function TiledMapLayer.prototype.updateCurrentTileSetsIndex + * @description 手动设置当前切片集索引,目前主要提供给控件使用。 + * @param {number} index - 索引值。 + */ + updateCurrentTileSetsIndex: function (index) { + this.tempIndex = index; + }, + + /** + * @function TiledMapLayer.prototype.mergeTileVersionParam + * @description 更改URL请求参数中的切片版本号,并重绘。 + * @param {string} version - 切片版本号。 + * @returns {boolean} 是否成功。 + */ + mergeTileVersionParam: function (version) { + if (version) { + this.requestParams["tileversion"] = version; + this._paramsChanged = true; + this.redraw(); + this._paramsChanged = false; + return true; + } + return false; + }, + + _getLayerUrl: function () { + if (this._paramsChanged) { + this._layerUrl = this._createLayerUrl(); + } + return this._layerUrl || this._createLayerUrl(); + }, + + _createLayerUrl: function () { + let layerUrl = Util.urlPathAppend(this._url, `tileImage.${this.options.format}`); + this.requestParams = this.requestParams || this._getAllRequestParams(); + layerUrl = Util.urlAppend(layerUrl, external_L_namespaceObject.Util.getParamString(this.requestParams)); + layerUrl = SecurityManager.appendCredential(layerUrl); + this._layerUrl = layerUrl; + return layerUrl; + }, + + _getAllRequestParams: function () { + var me = this, + options = me.options || {}, + params = {}; + + var tileSize = this.options.tileSize; + if (!(tileSize instanceof (external_L_default()).Point)) { + tileSize = external_L_default().point(tileSize, tileSize); + } + params["width"] = tileSize.x; + params["height"] = tileSize.y; + + params["redirect"] = options.redirect === true; + params["transparent"] = options.transparent === true; + params["cacheEnabled"] = !(options.cacheEnabled === false); + + if (options.prjCoordSys) { + params["prjCoordSys"] = JSON.stringify(options.prjCoordSys); + } + + if (options.layersID) { + params["layersID"] = options.layersID.toString(); + } + + if (options.clipRegionEnabled && options.clipRegion) { + options.clipRegion = ServerGeometry.fromGeometry(toSuperMapGeometry(options.clipRegion)); + params["clipRegionEnabled"] = options.clipRegionEnabled; + params["clipRegion"] = JSON.stringify(options.clipRegion); + } + + //切片的起始参考点,默认为地图范围的左上角。 + var crs = me._crs; + if (crs.options && crs.options.origin) { + params["origin"] = JSON.stringify({ + x: crs.options.origin[0], + y: crs.options.origin[1] + }); + } else if (crs.projection && crs.projection.bounds) { + var bounds = crs.projection.bounds; + var tileOrigin = external_L_default().point(bounds.min.x, bounds.max.y); + params["origin"] = JSON.stringify({ + x: tileOrigin.x, + y: tileOrigin.y + }); + } + + if (options.overlapDisplayed === false) { + params["overlapDisplayed"] = false; + if (options.overlapDisplayedOptions) { + params["overlapDisplayedOptions"] = me.overlapDisplayedOptions.toString(); + } + } else { + params["overlapDisplayed"] = true; + } + + if (params.cacheEnabled === true && options.tileversion) { + params["tileversion"] = options.tileversion.toString(); + } + if (options.rasterfunction) { + params["rasterfunction"] = JSON.stringify(options.rasterfunction); + } + + return params; + } +}); + +var tiledMapLayer = function (url, options) { + return new TiledMapLayer(url, options); +}; + +// EXTERNAL MODULE: ./node_modules/jsonsql/index.js +var jsonsql = __webpack_require__(545); +var jsonsql_default = /*#__PURE__*/__webpack_require__.n(jsonsql); +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoDefaultStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @constant DefaultStyle + * @description 这个 style 对应的是默认设置。 + * @category BaseTypes Style + * @private + */ +var DefaultStyle = { + + /** + * @constant DefaultStyle.prototype.TEXT + * @description 默认文本样式。 + */ + "TEXT": { + fontSize: "14px", + fontFamily: "Arial Unicode MS Regular,Microsoft YaHei", + textAlign: "left", + color: "rgba(255,255,255,0)", + fillColor: "rgba(80,80,80,1)", + weight: 1, + globalAlpha: 1 + }, + + /** + * @constant DefaultStyle.prototype.POINT + * @description 默认点样式。 + */ + "POINT": { + fillColor: "#ffcc00", + color: "#cc3333", + weight: 1, + radius: 3, + opacity: 1 + }, + + /** + * @constant DefaultStyle.prototype.LINE + * @description 默认线样式。 + */ + "LINE": { + color: "rgba(0,0,0,0)", + weight: 1, + lineCap: "butt", + lineJoin: "round", + + dashOffset: 0, + dashArray: [], + opacity: 1 + }, + + /** + * @constant DefaultStyle.prototype.REGION + * @description 默认多边形样式。 + */ + "REGION": { + color: "rgba(0,0,0,0)", + fillColor: "rgba(0,0,0,0)", + weight: 1, + lineCap: "butt", + lineJoin: "round", + dashOffset: 0, + opacity: 1, + fillOpacity: 1, + dashArray: [] + } +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoStyleMap.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @constant CartoStyleMap + * @description CartoCSS 中的 style 属性名与 leaflet 的 style 属性名的对应表。 + * @category BaseTypes Style + * @private + */ +var CartoStyleMap = { + + /* + * @constant CartoStyleMap.prototype.TEXT + * @description 默认文本样式。 + */ + "TEXT": { + "text-size": "fontSize", + "text-face-name": "fontFamily", + "text-align": "textAlign", + "text-name": "textName", + 'text-weight': 'fontWeight', + "text-halo-color": "color", + "text-fill": "fillColor", + "text-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.POINT + * @description 默认点样式。 + */ + "POINT": { + "point-file": "iconUrl", + "point-fill": "fillColor", + "point-radius": "radius", + "point-halo-color": "color", + "point-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.LINE + * @description 默认线样式。 + */ + "LINE": { + "line-color": "color", + "line-width": "weight", + "line-cap": "lineCap", + "line-join": "lineJoin", + "line-dash-offset": "dashOffset", + "line-opacity": "opacity", + "line-dasharray": "dashArray", + "line-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.REGION + * @description 默认多边形样式。 + */ + "REGION": { + "line-color": "color", + "line-width": "weight", + "line-cap": "lineCap", + "line-join": "lineJoin", + "line-dash-offset": "dashOffset", + "line-opacity": "opacity", + "line-dasharray": "dashArray", + "polygon-fill": "fillColor", + "polygon-opacity": "fillOpacity", + "polygon-comp-op": "globalCompositeOperation" + } +}; + +/** + * @constant ServerStyleMap + * @description 服务端传过来的 style 属性名与 leaflet 的 style 属性名的对应表。 + * @private + */ +var ServerStyleMap = { + + /** + * @member ServerStyleMap.prototype.lineWidth + * @description 线宽。 + */ + lineWidth: { + leafletStyle: "weight", + type: "number", + unit: "mm", + defaultValue: 0.1 + }, + + /** + * @member ServerStyleMap.prototype.fillForeColor + * @description 填充前景色。 + */ + fillForeColor: { + leafletStyle: "fillColor", + type: "color", + defaultValue: "rgba(0,0,0,0)" + }, + + /** + * @member ServerStyleMap.prototype.foreColor + * @description 前景色。 + */ + foreColor: { + leafletStyle: "color", + type: "color", + defaultValue: "rgba(0,0,0,0)" + }, + + /** + * @member ServerStyleMap.prototype.markerSize + * @description 图标大小。 + */ + markerSize: { + leafletStyle: "markerSize", + type: "number", + unit: "mm", + defaultValue: 2.4 + }, + + /** + * @member ServerStyleMap.prototype.lineColor + * @description 线要素颜色。 + */ + lineColor: { + leafletStyle: "color", + type: "color", + defaultValue: "#000000" + } +}; + +/** + * @constant CompOpMap + * @description Canvas 中的 globalCompositeOperation 属性值与 CartoCSS 中的 CompOp 属性值对照表。 + * @private + */ +var CompOpMap = { + "clear": "", + "src": "", + "dst": "", + "src-over": "source-over", + "dst-over": "destination-over", + "src-in": "source-in", + "dst-in": "destination-in", + "src-out": "source-out", + "dst-out": "destination-out", + "src-atop": "source-atop", + "dst-atop": "destination-atop", + "xor": "xor", + "plus": "lighter", + "minus": "", + "multiply": "", + "screen": "", + "overlay": "", + "darken": "", + "lighten": "lighter", + "color-dodge": "", + "color-burn": "", + "hard-light": "", + "soft-light": "", + "difference": "", + "exclusion": "", + "contrast": "", + "invert": "", + "invert-rgb": "", + "grain-merge": "", + "grain-extract": "", + "hue": "", + "saturation": "", + "color": "", + "value": "" +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoCSSToLeaflet.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class CartoCSSToLeaflet + * @classdesc CartoCSS 样式转 Leaflet 样式类。 + * @category BaseTypes Style + * @param {string} url - 服务地址。 + * @private + */ +class CartoCSSToLeaflet { + + + constructor(url) { + /** + * @member CartoCSSToLeaflet.prototype.cartoCSS + * @description CartoCSS 样式。 + */ + this.cartoCSS = null; + + /** + * @member CartoCSSToLeaflet.prototype.mapUrl + * @description 地图服务地址。 + */ + this.mapUrl = url; + } + + /** + * @function CartoCSSToLeaflet.prototype.pretreatedCartoCSS + * @description CartoCSS 样式预处理。 + * @param {string} cartoStr - Carto 信息。 + * @param {Object} processCharacters - 需要处理的特征对象。 + */ + pretreatedCartoCSS(cartoStr, processCharacters) { + if (processCharacters) { + cartoStr = this.processCharacters(cartoStr); + } + this.cartoCSS = this.cartoCSS || {}; + var shaders = new CartoCSS(cartoStr).getShaders(); + if (!shaders) { + return; + } + for (var i = 0; i < shaders.length; i++) { + var element = shaders[i].elements[0]; + var attachment = shaders[i].attachment; + this.cartoCSS[element.clean] = this.cartoCSS[element.clean] || {}; + this.cartoCSS[element.clean][attachment] = this.cartoCSS[element.clean][attachment] || []; + this.cartoCSS[element.clean][attachment].push(shaders[i]); + } + } + + /** + * @function CartoCSSToLeaflet.prototype.processCharacters + * @description 替换一些关键符号。 + * @param {string} cartoCSSStr - cartoCSSS 信息。 + */ + processCharacters(cartoCSSStr) { + var style = cartoCSSStr; + if (!style) { + return; + } + var me = this; + style = style.replace(/[@]/gi, "___"); + style = style.replace(/\\#/gi, "\#"); + + var cachedLayer = {}; + me.layersInfo && Object.keys(me.layersInfo).sort().forEach(function (attr) { + var newAttr = attr.replace(/[@#\s]/gi, "___"); + var to = attr; + var keys = Object.keys(cachedLayer); + for (let index = keys.length; index > -1; index--) { + if (attr.indexOf(keys[index]) > -1) { + to = attr.replace(keys[index], cachedLayer[keys[index]]); + break; + } + } + to = to.replace(/[#]/gi, "\#"); + cachedLayer[attr] = newAttr; + style = style.replace(new RegExp(to, "g"), newAttr); + }) + style = style.replace(/[#]/gi, "\n#"); + //将zoom转化为scale,以免引起混淆 + style = style.replace(/\[zoom/gi, "[scale"); + return style; + } + + /** + * @function CartoCSSToLeaflet.prototype.pickShader + * @description 拾取着色对象。 + * @param {string} layerName - 图层名称。 + */ + pickShader(layerName) { + if (!this.cartoCSS) { + return null; + } + var name = layerName.replace(/[@#\s]/gi, "___"); + return this.cartoCSS[name]; + } + + /** + * @function CartoCSSToLeaflet.prototype.getDefaultStyle + * @description 获取默认风格。 + * @param {string} type - 默认风格类型。 + */ + getDefaultStyle(type) { + var style = {}; + //设置默认值 + var expandStyle = DefaultStyle[type]; + for (var prop in expandStyle) { + var val = expandStyle[prop]; + style[prop] = val; + } + return style; + } + + /** + * @function CartoCSSToLeaflet.prototype.getStyleFromiPortalMarker + * @description 从 iPortalMarker 中获取样式。 + * @param {string} icon - iPortal 图标。 + */ + getStyleFromiPortalMarker(icon) { + if (icon.indexOf("./") == 0) { + return null; + } + //兼容iportal示例的问题 + if (icon.indexOf("http://support.supermap.com.cn:8092/static/portal") == 0) { + icon = icon.replace("http://support.supermap.com.cn:8092/static/portal", "http://support.supermap.com.cn:8092/apps/viewer/static"); + } + return external_L_default().icon({ + iconUrl: icon, + iconSize: external_L_default().point(48, 43), + iconAnchor: external_L_default().point(24, 43), + popupAnchor: external_L_default().point(0, -43) + }); + } + + /** + * @function CartoCSSToLeaflet.prototype.getStyleFromiPortalStyle + * @description 从 iPortal 的风格中获取样式。 + * @param {Object} iPortalStyle - iPortal 的样式对象。 + * @param {string} type - 样式类型。 + * @param {Object} [fStyle] - 图标参数。 + */ + getStyleFromiPortalStyle(iPortalStyle, type, fStyle) { + var featureStyle = fStyle ? JSON.parse(fStyle) : null; + var style = {}; + if (type === 'Point' || type === 'MultiPoint') { + var pointStyle = featureStyle || iPortalStyle.pointStyle; + if (pointStyle.externalGraphic) { + if (pointStyle.externalGraphic.indexOf("./") == 0) { + return null; + } + //兼容iportal示例的问题 + if (pointStyle.externalGraphic.indexOf("http://support.supermap.com.cn:8092/static/portal") == 0) { + pointStyle.externalGraphic = pointStyle.externalGraphic.replace("http://support.supermap.com.cn:8092/static/portal", "http://support.supermap.com.cn:8092/apps/viewer/static"); + } + return external_L_default().icon({ + iconUrl: pointStyle.externalGraphic, + iconSize: external_L_default().point(pointStyle.graphicWidth, pointStyle.graphicHeight), + iconAnchor: external_L_default().point(-pointStyle.graphicXOffset, -pointStyle.graphicYOffset), + popupAnchor: external_L_default().point(0, -pointStyle.graphicHeight) + }); + + } + style.radius = pointStyle.pointRadius; + style.color = pointStyle.strokeColor; + style.opacity = pointStyle.strokeOpacity; + style.lineCap = pointStyle.strokeLineCap; + style.weight = pointStyle.strokeWidth; + style.fillColor = pointStyle.fillColor; + style.fillOpacity = pointStyle.fillOpacity; + style.dashArray = this.dashStyle(pointStyle, 1); + return style; + } + if (type === 'LineString' || type === 'MultiLineString' || type === 'Box') { + var lineStyle = featureStyle || iPortalStyle.lineStyle; + style.color = lineStyle.strokeColor; + style.opacity = lineStyle.strokeOpacity; + style.fillOpacity = lineStyle.fillOpacity; + style.lineCap = lineStyle.strokeLineCap; + style.weight = lineStyle.strokeWidth; + style.dashArray = this.dashStyle(lineStyle, 1); + return style; + } + if (type === 'Polygon' || type === 'MultiPolygon') { + var polygonStyle = featureStyle || iPortalStyle.polygonStyle; + style.color = polygonStyle.strokeColor; + style.opacity = polygonStyle.strokeOpacity; + style.lineCap = polygonStyle.strokeLineCap; + style.weight = polygonStyle.strokeWidth; + style.fillColor = polygonStyle.fillColor; + style.fillOpacity = polygonStyle.fillOpacity; + style.dashArray = this.dashStyle(polygonStyle, 1); + return style; + } + } + + /** + * @function CartoCSSToLeaflet.prototype.dashStyle + * @description 符号样式。 + * @param {Object} style - 样式参数。 + * @param {number} widthFactor - 宽度系数。 + */ + dashStyle(style, widthFactor) { + if (!style) { + return []; + } + var w = style.strokeWidth * widthFactor; + var str = style.strokeDashstyle; + switch (str) { + case 'solid': + return []; + case 'dot': + return [1, 4 * w]; + case 'dash': + return [4 * w, 4 * w]; + case 'dashdot': + return [4 * w, 4 * w, 1, 4 * w]; + case 'longdash': + return [8 * w, 4 * w]; + case 'longdashdot': + return [8 * w, 4 * w, 1, 4 * w]; + default: + if (!str) { + return []; + } + if (Util.isArray(str)) { + return str; + } + str = StringExt.trim(str).replace(/\s+/g, ","); + return str.replace(/\[|\]/gi, "").split(","); + } + } + + /** + * @function CartoCSSToLeaflet.prototype.getValidStyleFromCarto + * @description 从 Carto 中获取有效的样式。 + * @param {number} zoom - 缩放级别。 + * @param {number} scale - 比例尺。 + * @param {Array.} shader - 渲染器对象数组。 + * @param {Object} feature - 要素。 + * @param {string} [fromServer] - 服务源。 + */ + getValidStyleFromCarto(zoom, scale, shader, feature, fromServer) { + if (!shader) { + return null; + } + var type = feature.type, + attributes = feature.properties.attributes || {}, + style = this.getDefaultStyle(type); + fromServer = (fromServer === undefined) ? true : fromServer; + + attributes.FEATUREID = feature.properties.id; + attributes.SCALE = scale; + + var cartoStyleMap = CartoStyleMap[type]; + + var fontSize, fontName; + for (var i = 0, len = shader.length; i < len; i++) { + var _shader = shader[i]; + var prop = cartoStyleMap[_shader.property]; + var value = _shader.getValue(attributes, zoom, true); + if ((value !== null) && prop) { + if (prop === "fontSize") { + if (fromServer) { + value *= 0.8 + } + fontSize = value + "px"; + style.fontSize = fontSize; + } else if (prop === "fontName") { + fontName = value; + style.fontName = fontName; + } else { + if (prop === "globalCompositeOperation") { + value = CompOpMap[value]; + if (!value) { + continue; + } + } else if (fromServer && prop === 'iconUrl') { + value = this.mapUrl + '/tileFeature/symbols/' + value.replace(/(___)/gi, '@'); + value = value.replace(/(__0__0__)/gi, '__8__8__'); + style["iconUrl"] = value; + continue; + } + if (prop === 'weight' && value < 1) { + value = Math.ceil(value); + } + style[prop] = value; + } + } + } + return style; + } + + /** + * @function CartoCSSToLeaflet.prototype.getValidStyleFromLayerInfo + * @description 通过图层信息获取有效的样式。 + * @param {Feature} feature - 要素。 + * @param {Object} layerInfo - 图层信息。 + */ + getValidStyleFromLayerInfo(feature, layerInfo) { + var type = feature.type, + style = this.getDefaultStyle(type), + shader = layerInfo && layerInfo.layerStyle; + if (!shader) { + return style; + } + if (type === "POINT") { + var size = Math.ceil(shader.markerSize * DOTS_PER_INCH * INCHES_PER_UNIT.mm) || 8; + var symbolParameters = { + "transparent": true, + "resourceType": "SYMBOLMARKER", + "picWidth": size, + "picHeight": size, + "style": JSON.stringify(shader) + }; + style.iconUrl = Util.urlAppend(this.mapUrl + "/symbol.png", Util.getParameterString(symbolParameters)); + style.iconSize = [size, size]; + return style; + } + if (type === "TEXT") { + shader = feature.properties.textStyle || layerInfo.layerStyle; + //设置文本是否使用粗体 + style.fontWeight = shader.bold ? shader.fontWeight : "normal"; + //设置文本的尺寸(对应fontHeight属性)和行高,行高iserver不支持,默认5像素 + //固定大小的时候单位是毫米 + if (shader.fontHeight) { + var text_h = shader.fontHeight * DOTS_PER_INCH * INCHES_PER_UNIT.mm * 0.85; //毫米转像素,服务端的字体貌似要稍微小一点 + style.fontSize = text_h + "px"; + style.textHeight = text_h; + } + + //设置文本字体类型 + //在桌面字体钱加@时为了解决对联那种形式,但是在canvas不支持,并且添加了@会导致 + //字体大小被固定,这里需要去掉 + if (shader.fontName) { + style.fontFamily = (shader.fontName.indexOf("@")) ? + shader.fontName.replace(/@/g, "") : shader.fontName; + } + + //设置对齐方式 + if (shader.align) { + var alignStr = shader.align.replace(/TOP|MIDDLE|BASELINE|BOTTOM/, ""); + style.textAlign = alignStr.toLowerCase(); + } + style.weight = shader.outline ? shader.outlineWidth : 0; + if (shader.backColor) { + style.color = "rgba(" + shader.backColor.red + "," + + shader.backColor.green + "," + + shader.backColor.blue + + ",1)"; + } + if (shader.foreColor) { + style.fillColor = "rgba(" + shader.foreColor.red + "," + + shader.foreColor.green + "," + + shader.foreColor.blue + + ",1)"; + } + style.rotation = shader.rotation || 0; + return style; + } + //目前只实现桌面系统默认的几种symbolID,非系统默认的面用颜色填充替代,线则用实线来替代 + var fillSymbolID = shader["fillSymbolID"] > 7 ? 0 : shader["fillSymbolID"]; + var lineSymbolID = shader["lineSymbolID"] > 5 ? 0 : shader["lineSymbolID"]; + for (var attr in shader) { + var obj = ServerStyleMap[attr]; + if (!obj) { + continue; + } + var leafletStyle = obj.leafletStyle; + switch (obj.type) { + case "number": + { + let value = shader[attr]; + if (obj.unit) { + value = value * DOTS_PER_INCH * INCHES_PER_UNIT[obj.unit] * 2.5; + } + style[leafletStyle] = value; + break; + } + + case "color": + { + var color = shader[attr]; + let value, alpha = 1; + if (leafletStyle === "fillColor") { + if (fillSymbolID === 0 || fillSymbolID === 1) { + //当fillSymbolID为0时,用颜色填充,为1是无填充,即为透明填充,alpha通道为0 + alpha = 1 - fillSymbolID; + value = "rgba(" + color.red + "," + color.green + "," + color.blue + "," + alpha + ")"; + } + } else if (leafletStyle === "color") { + if (lineSymbolID === 0 || lineSymbolID === 5) { + //对于lineSymbolID为0时,线为实线,为lineSymbolID为5时,为无线模式,即线为透明,即alpha通道为0 + alpha = lineSymbolID === 0 ? 1 : 0; + } else { + //以下几种linePattern分别模拟了桌面的SymbolID为1~4几种符号的linePattern + var linePattern = [1, 0]; + switch (lineSymbolID) { + case 1: + linePattern = [9.7, 3.7]; + break; + case 2: + linePattern = [3.7, 3.7]; + break; + case 3: + linePattern = [9.7, 3.7, 2.3, 3.7]; + break; + case 4: + linePattern = [9.7, 3.7, 2.3, 3.7, 2.3, 3.7]; + break; + default: + break + } + style.lineDasharray = linePattern; + } + value = "rgba(" + color.red + "," + color.green + "," + color.blue + "," + alpha + ")"; + } + style[leafletStyle] = value; + break; + } + default: + break; + } + } + + //处理标签文本的情况 + if (layerInfo.textField) { + style.textAlign = "LEFT"; + } + return style; + } + +} + +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/Graphic.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class Graphic + * @deprecatedclassinstance L.supermap.graphic + * @classdesc 高效率点图层要素类。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {L.LatLng} options.latLng - 经纬度。 + * @param {number} options.id - 要素id。 + * @param {(CircleStyle|CloverStyle|ImageStyle)} [options.style] - 点样式。 + * @param {Object} [options.attributes] - 要素属性。 + * @usage + */ +var Graphic = external_L_default().Class.extend({ + + initialize: function (options) { + options = options || {}; + + var latLng = options.latLng || options._latLng; + this._latLng = external_L_default().latLng(latLng.lat, latLng.lng); + this._style = options.style || options._canvas; + this.attributes = options.attributes; + this.id = options.id ? options.id : null; + }, + + /** + * @function Graphic.prototype.getId + * @description 获取当前要素 ID。 + * @returns {string} 要素 ID。 + */ + getId() { + return this.id; + }, + + /** + * @function Graphic.prototype.setId + * @description 设置当前要素 ID。 + * @param {string} id - 要素 ID。 + */ + + setId(id) { + this.id = id; + }, + + /** + * @function Graphic.prototype.setLatLng + * @description 设置经纬度。 + * @param {L.LatLng} latLng - 经纬度参数。 + */ + setLatLng: function (latLng) { + this._latLng = latLng; + }, + + /** + * @deprecated + * @function Graphic.prototype.setCanvas + * @description 设置画布,已弃用该设置,请使用 setStyle 接口。 + * @param {HTMLCanvasElement} canvas - 传入需要设置的画布。 + */ + setCanvas: function (canvas) { + this._style = canvas; + }, + + /** + * @function Graphic.prototype.setAttributes + * @description 设置要素属性。 + * @param {Object} attributes - 属性对象。 + */ + setAttributes: function (attributes) { + this.attributes = attributes; + }, + + + /** + * @function Graphic.prototype.getLatLng + * @description 获取经纬度。 + * @returns {L.LatLng} 经纬度。 + */ + + getLatLng: function () { + return this._latLng; + }, + + /** + * @deprecated + * @function Graphic.prototype.getCanvas + * @description 获取画布,已弃用该设置,请使用 getStyle 接口 + * @returns {HTMLCanvasElement} 画布。 + */ + getCanvas: function () { + return this._style; + }, + + /** + * @function Graphic.prototype.getAttributes + * @description 获取要素属性。 + * @returns {Object} 要素属性。 + */ + getAttributes: function () { + return this.attributes; + }, + + /** + * @function Graphic.prototype.setStyle + * @description 设置样式。 + * @param {(CircleStyle|ImageStyle|CloverStyle)} style - 样式。 + */ + setStyle: function (style) { + this._style = style; + }, + + /** + * @function Graphic.prototype.getStyle + * @description 获取样式。 + * @returns {(CircleStyle|ImageStyle|CloverStyle)} 样式。 + */ + getStyle: function () { + return this._style; + } + +}); +var graphic = function (options) { + return new Graphic(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/ThemeFeature.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class ThemeFeature + * @deprecatedclassinstance L.supermap.themeFeature + * @classdesc 客户端专题图要素类。 + * 支持的 geometry 参数类型为 {@link L.Point},{@link L.LatLng},{@link L.Polyline},{@link L.Polygon}。 + * @category Visualization Theme + * @extends {L.Class} + * @param {(L.Path|L.Point|L.LatLng)} geometry - 要素图形。 + * @param {Object} attributes - 要素属性。 + * @usage + */ +var ThemeFeature = external_L_default().Class.extend({ + + initialize: function (geometry, attributes) { + this.geometry = geometry; + this.attributes = attributes; + }, + + /** + * @function ThemeFeature.prototype.toFeature + * @description 转为内部矢量要素。 + * @returns {FeatureVector} 内部矢量要素。 + */ + toFeature: function () { + let geometry = this.geometry; + if (geometry.toGeoJSON) { + const geojsonObject = geometry.toGeoJSON(); + geojsonObject.properties = this.attributes; + return new GeoJSON().read(geojsonObject)[0]; + } + if (geometry.length === 3) { + geometry = new GeoText(geometry[1], geometry[0], geometry[2]); + } else if (geometry.length === 2) { + geometry = new Point(geometry[0], geometry[1]); + } else if (geometry instanceof (external_L_default()).LatLng) { + geometry = new Point(geometry.lng, geometry.lat); + } else if (geometry instanceof (external_L_default()).Point) { + geometry = new Point(geometry.x, geometry.y); + } else if (geometry instanceof (external_L_default()).CircleMarker) { + var latLng = geometry.getLatLng(); + geometry = new Point(latLng.lng, latLng.lat); + } + return new Vector(geometry, this.attributes); + }, + + /** + * @function ThemeFeature.prototype.reverseLatLngs + * @description 坐标反转。 + * @param {L.LatLng} latlngs - 坐标值。 + */ + reverseLatLngs: function (latlngs) { + if (!external_L_default().Util.isArray(latlngs)) { + latlngs = [latlngs]; + } + for (var i = 0; i < latlngs.length; i++) { + latlngs[i] = [latlngs[i].lng, latlngs[i].lat]; + } + return latlngs; + } +}); +var themeFeature = function (geometry, attributes) { + return new ThemeFeature(geometry, attributes); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/ThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class ThemeLayer + * @classdesc 专题图层基类,调用建议使用其子类实现类。 + * @category Visualization Theme + * @extends {L.Layer} + * @param {string} name - 专题图图层名称。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @fires ThemeLayer#featuresremoved + * @usage + */ +var ThemeLayer = external_L_default().Layer.extend({ + + options: { + //要素坐标是否和地图坐标系一致,默认为false,要素默认是经纬度坐标。 + alwaysMapCRS: false, + id: Util.createUniqueID("themeLayer_"), + opacity: 1, + // {Array} 专题要素事件临时存储,临时保存图层未添加到 map 前用户添加的事件监听,待图层添加到 map 后把这些事件监听添加到图层上,清空此图层。 + //这是一个二维数组,组成二维数组的每个一维数组长度为 2,分别是 event, callback。 + TFEvents: [], + attribution: core_Attributions.Common.attribution + }, + + initialize: function (name, options) { + external_L_default().Util.setOptions(this, options); + this.name = name; + this.features = []; + this.TFEvents = this.options.TFEvents; + this.levelRenderer = new LevelRenderer(); + this.movingOffset = [0, 0]; + }, + + /** + * @function ThemeLayer.prototype.getEvents + * @description 获取图层事件。 + * @returns {Object} 返回图层事件。 + */ + getEvents: function () { + var me = this; + var events = { + zoomend: me._reset, + moveend: me._reset, + resize: me._resize + }; + if (this._map._zoomAnimated) { + events.zoomanim = me._zoomAnim; + } + return events; + }, + + /** + * @function ThemeLayer.prototype.onRemove + * @description 删除某个地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onRemove: function (map) { + var me = this; + external_L_default().DomUtil.remove(me.container); + map.off("mousemove", me.mouseMoveHandler); + }, + + /** + * @function ThemeLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function (map) { + var me = this; + + + me.map = me._map = map; + me._initContainer(); + if (!me.levelRenderer) { + map.removeLayer(me); + return; + } + //初始化渲染器 + var size = map.getSize(); + me.container.style.width = size.x + "px"; + me.container.style.height = size.y + "px"; + me._updateOpacity(); + + me.renderer = me.levelRenderer.init(me.container); + me.renderer.clear(); + if (me.features && me.features.length > 0) { + me._reset(); + } + + //处理用户预先(在图层添加到 map 前)监听的事件 + me.addTFEvents(); + me.mouseMoveHandler = function (e) { + var xy = e.layerPoint; + me.currentMousePosition = external_L_default().point(xy.x + me.movingOffset[0], xy.y + me.movingOffset[1]); + }; + map.on("mousemove", me.mouseMoveHandler); + + me.update(map.getBounds()); + }, + + /** + * @function ThemeLayer.prototype.addFeatures + * @description 添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + */ + addFeatures: function (features) { // eslint-disable-line no-unused-vars + //子类实现此方法 + }, + + /** + * @function ThemeLayer.prototype.redrawThematicFeatures + * @description 抽象方法,实例化子类前先执行此方法。 + * @param {L.Bounds} bounds - 重绘专题要素范围。 + */ + redrawThematicFeatures: function (bounds) { // eslint-disable-line no-unused-vars + //子类必须实现此方法 + }, + + /** + * @function ThemeLayer.prototype.destroyFeatures + * @description 销毁要素。 + * @param {Array.} features - 待销毁的要素。 + */ + destroyFeatures: function (features) { + if (features === undefined) { + features = this.features; + } + if (!features) { + return; + } + this.removeFeatures(features); + for (var i = features.length - 1; i >= 0; i--) { + features[i].destroy(); + } + }, + + /** + * @function ThemeLayer.prototype.removeFeatures + * @description 删除专题图中 features。 + * @param {Array.} features - 待删除的要素。 + */ + removeFeatures: function (features) { + var me = this; + if (!features || features.length === 0) { + return; + } + if (features === me.features) { + return me.removeAllFeatures(); + } + if (!(external_L_default().Util.isArray(features))) { + features = [features]; + } + + var featuresFailRemoved = []; + + for (var i = features.length - 1; i >= 0; i--) { + var feature = features[i]; + + //如果我们传入的feature在features数组中没有的话,则不进行删除, + //并将其放入未删除的数组中。 + var findex = external_L_default().Util.indexOf(me.features, feature); + + if (findex === -1) { + featuresFailRemoved.push(feature); + continue; + } + me.features.splice(findex, 1); + } + + var drawFeatures = []; + for (var hex = 0, len = me.features.length; hex < len; hex++) { + feature = me.features[hex]; + drawFeatures.push(feature); + } + me.features = []; + me.addFeatures(drawFeatures); + //绘制专题要素 + if (me.renderer) { + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + } + + var succeed = featuresFailRemoved.length == 0; + /** + * @event ThemeLayer#featuresremoved + * @description 成功删除要素之后触发。 + * @property {Array.} features - 事件对象。 + * @property {boolean} succeed - 要素是否删除成功,true 为删除成功,false 为删除失败。 + */ + me.fire("featuresremoved", { + features: featuresFailRemoved, + succeed: succeed + }); + }, + + /** + * @function ThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function () { + var me = this; + if (me.renderer) { + me.renderer.clear(); + } + me.features = []; + me.fire("featuresremoved", { + features: [], + succeed: true + }); + }, + + /** + * @function ThemeLayer.prototype.getFeatures + * @description 查看当前图层中的有效数据。 + * @returns {Array} 返回图层中的有效数据。 + */ + getFeatures: function () { + var me = this; + var len = me.features.length; + var clonedFeatures = new Array(len); + for (var i = 0; i < len; ++i) { + clonedFeatures[i] = me.features[i]; + } + return clonedFeatures; + }, + + /** + * @function ThemeLayer.prototype.getFeatureBy + * @description 过滤属性。 + * @param {string} property - 过滤某个属性名。 + * @param {string} value - 返回属性值。 + */ + getFeatureBy: function (property, value) { + var me = this; + var feature = null; + for (var id in me.features) { + if (me.features[id][property] !== value) { + continue; + } + feature = me.features[id]; + break; + } + return feature; + }, + + /** + * @function ThemeLayer.prototype.getFeatureById + * @description 返回指定 ID 的矢量要素,不存在则返回 null。 + * @param {number} featureId - 要素 ID。 + */ + getFeatureById: function (featureId) { + return this.getFeatureBy('id', featureId); + }, + + /** + * @function ThemeLayer.prototype.getFeaturesByAttribute + * @description 指定属性名和属性值,返回所有匹配的要素数组。 + * @param {string} attrName - 属性名。 + * @param {string} attrValue - 属性值。 + * @returns {Array} 返回所有匹配的要素数组。 + */ + getFeaturesByAttribute: function (attrName, attrValue) { + var me = this, + feature, + foundFeatures = []; + for (var id in me.features) { + feature = me.features[id]; + if (feature && feature.attributes && (feature.attributes[attrName] === attrValue)) { + foundFeatures.push(feature); + } + } + return foundFeatures; + }, + + /** + * @function ThemeLayer.prototype.update + * @description 更新图层。 + * @param {L.Bounds} bounds - 图层范围。 + */ + update: function (bounds) { + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + external_L_default().DomUtil.setPosition(this.container, mapOffset); + + var me = this; + // var bounds = me._map.getBounds(); + // var topLeft = me._map.latLngToLayerPoint(bounds.getNorthWest()); + // var mapOffset = [parseInt(topLeft.x, 10) || 0, parseInt(topLeft.y, 10) || 0] + // // var offsetLeft = parseInt(me._map.getContainer().style.left, 10); + // // offsetLeft = -Math.round(offsetLeft); + // //var offsetTop = parseInt(me._map.getContainer().style.top, 10); + // //offsetTop = -Math.round(offsetTop); + // me.container.style.left = mapOffset[0] + 'px'; + // me.container.style.top = mapOffset[1] + 'px'; + + //绘制专题要素 + if (me.renderer) { + me.redrawThematicFeatures(bounds); + } + + if (me.currentMousePosition) { + me.currentMousePosition = external_L_default().point( + me.currentMousePosition.x - me.movingOffset[0], + me.currentMousePosition.y - me.movingOffset[1]); + } + me.movingOffset = [0, 0]; + me._zoom = me._map.getZoom(); + me._center = me._map.getCenter(); + }, + + /** + * @function ThemeLayer.prototype.setOpacity + * @description 设置图层的不透明度,取值 [0-1] 之间。 + * @param {number} opacity - 不透明度。 + */ + setOpacity: function (opacity) { + var me = this; + if (opacity === me.options.opacity) { + return; + } + if (!isNaN(opacity)) { + me.options.opacity = opacity; + me._updateOpacity(); + } + + }, + + /** + * @function ThemeLayer.prototype.redraw + * @description 重绘该图层。 + * @returns {boolean} 返回是否重绘成功。 + */ + redraw: function () { + var me = this; + if (!me.renderer) { + return false; + } + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + return true; + }, + + /** + * @function ThemeLayer.prototype.on + * @description 监听事件。监听专题要素事件。 + * @param {Event} event - 监听事件。 + * @param {function} callback - 回调函数。 + * @param {string} context - 信息。 + */ + on: function (event, callback, context) { // eslint-disable-line no-unused-vars + if (this.renderer) { + this.renderer.on(event, callback); + } else { + external_L_default().Layer.prototype.on.call(this, event, callback); + } + return this; + }, + + /** + * @function ThemeLayer.prototype.off + * @description 移除事件监听。 + * @param {Event} event - 监听事件。 + * @param {function} callback - 回调函数。 + * @param {string} context - 信息。 + */ + off: function (event, callback, context) { // eslint-disable-line no-unused-vars + var me = this; + if (me.renderer) { + me.renderer.un(event, callback); + } else { + external_L_default().Layer.prototype.off.call(this, event, callback); + } + return this; + }, + fire: function (type, data, propagate) { // eslint-disable-line no-unused-vars + if (this.renderer) { + this.renderer.trigger(type, data); + } + external_L_default().Layer.prototype.fire.call(this, type, data, propagate); + return this; + }, + + /** + * @function ThemeLayer.prototype.addTFEvents + * @description 先把事件监听添加到图层,再把图层添加到地图。 + * @private + */ + addTFEvents: function () { + var me = this; + var tfEs = me.TFEvents; + var len = tfEs.length; + + for (var i = 0; i < len; i++) { + me.renderer.on(tfEs[i][0], tfEs[i][1]); + } + }, + + /** + * @function ThemeLayer.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {Array} coordinate + */ + getLocalXY: function (coordinate) { + if (!this._map) { + return coordinate; + } + var coor = coordinate; + if (external_L_default().Util.isArray(coordinate)) { + coor = external_L_default().point(coordinate[0], coordinate[1]); + } + if (!(coordinate instanceof (external_L_default()).Point)) { + if (coordinate instanceof Point || coordinate instanceof GeoText) { + coor = external_L_default().point(coordinate.x, coordinate.y); + } else { + coor = external_L_default().point(coordinate.lon, coordinate.lat); + } + + } + var point = this._map.latLngToAccurateContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(coor.y, coor.x) : this._map.options.crs.unproject(coor)); + return [point.x, point.y]; + }, + + /** + * @function ThemeLayer.prototype.toiClientFeature + * @description 转为 iClient 要素。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + * @returns {Array.} 转换后的 iClient 要素。 + */ + toiClientFeature: function (features) { + //若 features 非数组形式 feature 则先做以下处理: + if (!Util.isArray(features)) { + features = [features]; + } + + let featuresTemp = []; + for (let i = 0; i < features.length; i++) { + //themeFeature 数据类型 + if (features[i] instanceof ThemeFeature) { + featuresTemp.push(features[i].toFeature()); + } else if (features[i] instanceof Vector) { + // 若是 FeatureVector 类型直接返回 + featuresTemp.push(features[i]); + } else if (["FeatureCollection", "Feature", "Geometry"].indexOf(features[i].type) != -1) { + //GeoJSON 规范数据类型 + const format = new GeoJSON(); + featuresTemp = featuresTemp.concat(format.read(features[i])); + } else if (features[i].geometry && features[i].geometry.parts) { + //iServer服务器返回数据格式 todo 暂未找到更好的参数判断,暂用 geometry.parts 试用 + featuresTemp.push(ServerFeature.fromJson(features[i]).toFeature()); + } else { + throw new Error(`features[${i}]'s type is not be supported.`); + } + + } + return featuresTemp; + }, + + /** + * @function ThemeLayer.prototype.toFeature + * @deprecated + * @description 转为 iClient 要素,该方法将被弃用,由 {@link ThemeLayer#toiClientFeature} 代替。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + * @returns {FeatureVector} 转换后的 iClient 要素。 + */ + toFeature: function (features) { + return this.toiClientFeature(features); + }, + + _initContainer: function () { + var parentContainer = this.getPane(); + var animated = this._map.options.zoomAnimation && (external_L_default()).Browser.any3d; + var className = 'themeLayer leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide'); + this.container = external_L_default().DomUtil.create("div", className, parentContainer); + + var originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + this.container.id = this.options.id; + this.container.style[originProp] = '50% 50%'; + + this.container.style.position = "absolute"; + this.container.style.zIndex = 200; + }, + + + _zoomAnim: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._getCenterOffset(e.center)._multiplyBy(-scale).subtract(this._map._getMapPanePos()); + + if ((external_L_default()).DomUtil.setTransform) { + external_L_default().DomUtil.setTransform(this.container, offset, scale); + + } else { + this.container.style[(external_L_default()).DomUtil.TRANSFORM] = external_L_default().DomUtil.getTranslateString(offset) + ' scale(' + scale + ')'; + } + }, + + _updateOpacity: function () { + var me = this; + Util.modifyDOMElement(me.container, null, null, null, null, null, null, me.options.opacity); + if (me._map !== null) { + /** + * @event ThemeLayer#changelayer + * @description 图层属性改变之后触发。 + * @property {Object} layer - 图层。 + * @property {string} property - 图层属性。 + */ + me._map.fire("changelayer", { + layer: me, + property: "opacity" + }); + } + }, + + //缩放移动重绘 + _reset: function () { + var me = this; + var latLngBounds = me._map.getBounds(); + me.update(latLngBounds); + var size = me._map.getSize(); + // var bounds = me._map.getBounds(); + // var topLeft = me._map.latLngToLayerPoint(bounds.getNorthWest()); + // var mapOffset = [parseInt(topLeft.x, 10) || 0, parseInt(topLeft.y, 10) || 0] + // var offsetLeft = parseInt(me._map.getContainer().style.left, 10); + // offsetLeft = -Math.round(offsetLeft); + //var offsetTop = parseInt(me._map.getContainer().style.top, 10); + //offsetTop = -Math.round(offsetTop); + //me.container.style.left = mapOffset[0] + 'px'; + //me.container.style.top = mapOffset[1] + 'px'; + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + external_L_default().DomUtil.setPosition(this.container, mapOffset); + + + if (parseFloat(me.container.width) !== parseFloat(size.x)) { + me.container.width = size.x + 'px'; + } + if (parseFloat(me.container.height) !== parseFloat(size.y)) { + me.container.height = size.y + 'px'; + } + me.redraw(); + }, + + //通知渲染器的尺寸变化 + _resize: function () { + var me = this; + var newSize = me._map.getSize(); + me.container.style.width = newSize.x + "px"; + me.container.style.height = newSize.y + "px"; + me.renderer.resize(); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/GeoFeatureThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class GeoFeatureThemeLayer + * @classdesc 地理几何专题要素型专题图层基类。此类型专题图的专题要素形状就是由 feature.geometry 决定。此类不建议直接实例化调用。 + * @category Visualization Theme + * @extends ThemeLayer + * @category Visualization Graphic + * @param {string} name - 专题图名。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 样式(style) 中的有效属性应用到专题图层。 + * 禁止对专题要素使用数据(feature)的 style。 + * 此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @fires GeoFeatureThemeLayer#beforefeaturesadded + * @usage + */ +var GeoFeatureThemeLayer = ThemeLayer.extend({ + + options: { + + // {number} 节点抽稀像素距离,默认值 2。 + nodesClipPixel: 2, + + //{boolean} 图形是否在 hover 时高亮 ,默认值:false。 + isHoverAble: false, + + //{boolean} 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面),默认值:false。 + isMultiHover: false, + + // {boolean} 图形是否可点击,默认 true + isClickAble: true, + //是否允许 feature 样式(style) 中的有效属性应用到专题图层。 + //默认值为: false,禁止对专题要素使用数据(feature)的 style。 + //此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + //的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + isAllowFeatureStyle: false + }, + + initialize: function (name, options) { + ThemeLayer.prototype.initialize.call(this, name, options); + external_L_default().Util.setOptions(this, options); + var me = this; + me.cache = {}; + me.cacheFields = []; + me.style = {}; + me.highlightStyle = {}; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.addFeatures + * @description 添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待填加的要素。 + */ + addFeatures: function (features) { + var me = this; + + /** + * @event GeoFeatureThemeLayer#beforefeaturesadded + * @description 添加数据之前触发。 + * @property {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 事件对象。 + */ + me.fire("beforefeaturesadded", {features: features}); + + //转换 features 形式 + this.features = this.toiClientFeature(features); + + if (!me.isCustomSetMaxCacheCount) { + me.maxCacheCount = me.features.length * 5; + } + + if (!me.renderer) { + return; + } + //绘制专题要素 + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + }, + + /** + * @function GeoFeatureThemeLayer.prototype.removeFeatures + * @description 删除专题图中 features。参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature。 + * @param {FeatureVector} features - 待删除的要素。 + */ + removeFeatures: function (features) { // eslint-disable-line no-unused-vars + this.clearCache(); + ThemeLayer.prototype.removeFeatures.call(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function () { + this.clearCache(); + ThemeLayer.prototype.removeAllFeatures.call(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素。 + * 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,抽稀,缓存等步骤。 + * 地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘的范围。 + */ + redrawThematicFeatures: function (bounds) { + var me = this; + //获取高亮专题要素对应的用户 id + var hoverone = me.renderer.getHoverOne(); + var hoverFid = null; + if (hoverone && hoverone.refDataID) { + hoverFid = hoverone.refDataID; + } + if (this.options.alwaysMapCRS && bounds && bounds instanceof (external_L_default()).LatLngBounds) { + var crs = this._map.options.crs; + bounds = external_L_default().bounds(crs.project(bounds.getSouthWest()), crs.project(bounds.getNorthEast())); + } + bounds = CommontypesConversion.toSuperMapBounds(bounds); + //清除当前所有可视元素 + me.renderer.clearAll(); + + var features = me.features; + var cache = me.cache; + var cacheFields = me.cacheFields; + var cmZoom = me._map.getZoom(); + + var maxCC = me.maxCacheCount; + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var feaBounds = feature.geometry.getBounds(); + + //剔除当前视图(地理)范围以外的数据 + if (bounds && !bounds.intersectsBounds(feaBounds)) { + continue; + } + + //缓存字段 + var fields = feature.id + "_zoom_" + cmZoom.toString(); + if (cache[fields]) { + cache[fields].updateAndAddShapes(); + continue; + } + + var thematicFeature = me.createThematicFeature(features[i]); + //检查 thematicFeature 是否有可视化图形 + if (thematicFeature.getShapesCount() < 1) { + continue; + } + //加入缓存 + cache[fields] = thematicFeature; + cacheFields.push(fields); + //缓存数量限制 + if (cacheFields.length > maxCC) { + var fieldsTemp = cacheFields[0]; + cacheFields.splice(0, 1); + delete cache[fieldsTemp]; + } + } + + me.renderer.render(); + + //地图漫游后,重新高亮图形 + if (hoverFid && me.options.isHoverAble && me.options.isMultiHover) { + var hShapes = this.getShapesByFeatureID(hoverFid); + this.renderer.updateHoverShapes(hShapes); + } + }, + + /** + * @function GeoFeatureThemeLayer.prototype.createThematicFeature + * @description 创建专题要素。 + * @param {FeatureVector} feature - 要创建的要素。 + */ + createThematicFeature: function (feature) { + var me = this; + var style = me.getStyleByData(feature); + if (feature.style && me.isAllowFeatureStyle) { + style = Util.copyAttributesWithClip(feature.style); + } + + //创建专题要素时的可选参数 + var options = {}; + options.nodesClipPixel = me.options.nodesClipPixel; + options.isHoverAble = me.options.isHoverAble; + options.isMultiHover = me.options.isMultiHover; + options.isClickAble = me.options.isClickAble; + options.highlightStyle = ShapeFactory.transformStyle(me.highlightStyle); + + //将数据转为专题要素(Vector) + var thematicFeature = new ThemeVector(feature, me, ShapeFactory.transformStyle(style), options); + + //直接添加图形到渲染器 + for (var m = 0; m < thematicFeature.shapes.length; m++) { + me.renderer.addShape(thematicFeature.shapes[m]); + } + + return thematicFeature; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.redraw + * @description 重绘该图层。 + */ + redraw: function () { + this.clearCache(); + return ThemeLayer.prototype.redraw.apply(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.clearCache + * @description 清除缓存数据。 + */ + clearCache: function () { + this.cache = {}; + this.cacheFields = []; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.clear + * @description 清除的内容包括数据(features) 、专题要素、缓存。 + */ + clear: function () { + var me = this; + me.renderer.clearAll(); + me.renderer.refresh(); + me.removeAllFeatures(); + me.clearCache(); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.getCacheCount + * @description 获取当前缓存数量。 + * @returns {number} 返回当前缓存数量。 + */ + getCacheCount: function () { + return this.cacheFields.length; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.setMaxCacheCount + * @description 设置最大缓存数量。 + * @param {number} cacheCount - 最大缓存量。 + */ + setMaxCacheCount: function (cacheCount) { + if (isNaN(cacheCount)) { + return; + } + this.maxCacheCount = cacheCount; + this.isCustomSetMaxCacheCount = true; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.getShapesByFeatureID + * @description 通过 FeatureID 获取 feature 关联的所有图形。如果不传入此参数,函数将返回所有图形。 + * @param {number} featureID - 要素 ID。 + */ + getShapesByFeatureID: function (featureID) { + var me = this, + list = [], + shapeList = me.renderer.getAllShapes(); + + if (!featureID) { + return shapeList + } + + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + if (si.refDataID && featureID === si.refDataID) { + list.push(si); + } + } + return list; + } + +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/UniqueThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UniqueThemeLayer + * @deprecatedclassinstance L.supermap.uniqueThemeLayer + * @category Visualization Theme + * @classdesc 客户端单值专题图。单值专题图是利用不同的颜色或符号(线型、填充)表示图层中某一属性信息的不同属性值,属性值相同的要素具有相同的渲染风格。 + * 比如土壤类型分布图、土地利用图、行政区划图等。单值专题图着重表示现象质的差别,一般不表示数量的特征。 + * @extends GeoFeatureThemeLayer + * @param {string} name - 专题图层名。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。 + * 此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @usage + */ +var UniqueThemeLayer = GeoFeatureThemeLayer.extend({ + + + /** + * @member {Object} UniqueThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} UniqueThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} UniqueThemeLayer.prototype.highlightStyle + * @description 开启 hover 事件后,触发的样式风格。 + */ + + initialize: function (name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); + //{Array.} 图层中专题要素的样式 + this.style = []; + //{string} 用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; + + //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + this.styleGroups = []; + }, + + /** + * @private + * @function UniqueThemeLayer.prototype.getStyleByData + * @description 根据用户数据(feature)设置专题要素的 Style。 + * @param {FeatureVector} feat - 用户要素数据。 + * @returns {Array.} 返回包含专题要素 style 的对象。 + */ + getStyleByData: function (feat) { + var me = this, + feature = feat, + style = Util.copyAttributesWithClip({}, me.style); + + + var groups = me.styleGroups, + isSfInAttributes = false,//指定的 themeField 是否是 feature 的属性字段之一 + attribute = null; //属性值 + + var isValidStyleGroup = me.styleGroups && me.styleGroups.length > 0; + if (me.themeField && isValidStyleGroup && feature.attributes) { + var tf = me.themeField, + attributes = feature.attributes; + for (var property in attributes) { + if (tf !== property) { + continue; + } + isSfInAttributes = true; + attribute = attributes[property]; + break; + } + } + + //判断属性值是否属于styleGroups的某一个范围,以便对获取分组 style + if (isSfInAttributes) { + for (var i = 0, len = groups.length; i < len; i++) { + if ((attribute).toString() === ( groups[i].value).toString()) { + var sty1 = groups[i].style; + style = Util.copyAttributesWithClip(style, sty1); + } + + } + } + return style; + } +}); + +var uniqueThemeLayer = function (name, options) { + return new UniqueThemeLayer(name, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/RangeThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class RangeThemeLayer + * @deprecatedclassinstance L.supermap.rangeThemeLayer + * @category Visualization Theme + * @classdesc 范围分段专题图。范围分段专题图对数据({@link FeatureVector})属性字段(attributes)的属性值进行分段,使用不同的颜色或符号(线型、填充)渲染不同范围段的属性值。 + * 分段专题图一般用来反映连续分布现象的数量或程度特征,如降水量的分布,土壤侵蚀强度的分布等。 + * @extends GeoFeatureThemeLayer + * @param {string} name - 图层名 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ +var RangeThemeLayer = GeoFeatureThemeLayer.extend({ + + /** + * @member {Object} RangeThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} RangeThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} RangeThemeLayer.prototype.highlightStyle + * @description hover 的样式风格。 + */ + + initialize: function (name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); + //{Array.} 图层中专题要素的样式 + this.style = []; + //{string} 用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; + + //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + this.styleGroups = []; + }, + + /** + * @function RangeThemeLayer.prototype.getStyleByData + * @description 根据用户数据( feature )设置专题要素的 Style。 + * @param {FeatureVector} feat - 矢量要素对象。 + * @returns {Array.} 专题要素的 Style。 + */ + getStyleByData: function (feat) { + var me = this, + feature = feat, + style = Util.copyAttributesWithClip({}, me.style); + + var groups = me.styleGroups, + isSfInAttributes = false,//指定的 themeField 是否是 feature 的属性字段之一 + attribute = null; //属性值 + + var isValidStyleGroup = me.styleGroups && me.styleGroups.length > 0; + + if (me.themeField && isValidStyleGroup && feature.attributes) { + var Sf = me.themeField, + attributes = feature.attributes; + + for (var property in attributes) { + if (Sf !== property) { + continue; + } + isSfInAttributes = true; + attribute = attributes[property]; + break; + } + } + + //判断属性值是否属于styleGroups的某一个范围,以便对获取分组 style + if (isSfInAttributes) { + for (var i = 0, len = groups.length; i < len; i++) { + var isContianed = i === len-1 ? ((attribute >= groups[i].start) && (attribute <= groups[i].end)) : ((attribute >= groups[i].start) && (attribute < groups[i].end)); + if (isContianed) { + var sty1 = groups[i].style; + style = Util.copyAttributesWithClip(style, sty1); + } + } + + } + return style; + } + +}); +var rangeThemeLayer = function (name, options) { + return new RangeThemeLayer(name, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/LabelThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class LabelThemeLayer + * @deprecatedclassinstance L.supermap.labelThemeLayer + * @classdesc 标签专题图。 + * @category Visualization Theme + * @extends GeoFeatureThemeLayer + * @param {string} name - 图层名。 + * @param {Object} options - 参数。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {boolean} [options.isAvoid=true] - 是否进行地图边缘的避让处理。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ +var LabelThemeLayer = GeoFeatureThemeLayer.extend({ + + /** + * @member {Object} LabelThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} LabelThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} LabelThemeLayer.prototype.highlightStyle + * @description 开启 hover 事件后,触发的样式风格。 + */ + + options: { + //是否进行压盖处理,如果设为true,将隐藏被压盖的标签,默认为true。 + isOverLay: true, + //是否进行地图边缘的避让处理,如果设为true,将把与地图边缘相交的标签移到地图范围内,默认为 true,在地图边缘处做避让处理。 + isAvoid: true + }, + + initialize: function (name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); + external_L_default().Util.setOptions(this, options); + //图层中专题要素的样式 + this.style = []; + //用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; + + //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + this.styleGroups = []; + + this.defaultStyle = { + //默认文本样式 + fontColor: "#000000", + fontOpacity: 1, + fontSize: "12px", + fontStyle: "normal", + fontWeight: "normal", + labelAlign: "cm", + labelXOffset: 0, + labelYOffset: 0, + labelRotation: 0, + + //默认样式 + fill: false, + fillColor: "#ee9900", + fillOpacity: 0.4, + stroke: false, + strokeColor: "#ee9900", + strokeOpacity: 1, + strokeWidth: 1, + strokeLinecap: "round", + strokeDashstyle: "solid", + + //默认显示背景框 + labelRect: true, + //对用户隐藏但必须保持此值的属性 + //cursor: "pointer", + + labelSelect: true, + + //用 _isGeoTextStrategyStyle 标记此style,携带此类style的要素特指GeoText策略中的标签要素 + _isGeoTextStrategyStyle: true + }; + + //获取标签像素 bounds 的方式。0 - 表示通过文本类容和文本风格计算获取像素范围,现在支持中文、英文; 1 - 表示通过绘制的文本标签获取像素范围,支持各个语种的文字范围获取,但性能消耗较大(尤其是采用SVG渲染)。默认值为0。 + this.getPxBoundsMode = 0; + + this.labelFeatures = []; + }, + /** + * @function LabelThemeLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function (map) { + GeoFeatureThemeLayer.prototype.onAdd.call(this, map); + this.container.style.zIndex = 200; + }, + /** + * @function LabelThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素。 + * 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,抽稀,缓存等步骤。 + * 地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘范围。 + */ + redrawThematicFeatures: function (bounds) { + if (this.features.length > 0 && this.labelFeatures.length == 0) { + var feats = this.setLabelsStyle(this.features); + for (var i = 0, len = feats.length; i < len; i++) { + this.labelFeatures.push(feats[i]); + } + } + this.features = this.getDrawnLabels(this.labelFeatures); + GeoFeatureThemeLayer.prototype.redrawThematicFeatures.call(this, bounds); + }, + + /** + * @function LabelThemeLayer.prototype.removeFeatures + * @description 从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature。 + * @param {Array.} features - 要删除的要素。 + */ + removeFeatures: function (features) { // eslint-disable-line no-unused-vars + this.labelFeatures = []; + GeoFeatureThemeLayer.prototype.removeFeatures.call(this, arguments); + }, + + /** + * @function LabelThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function () { + this.labelFeatures = []; + GeoFeatureThemeLayer.prototype.removeAllFeatures.call(this, arguments); + }, + + /** + * @function LabelThemeLayer.prototype.getDrawnLabels + * @description 获取经(压盖)处理后将要绘制在图层上的标签要素。 + * @param {Array.} labelFeatures - 所有标签要素的数组。 + * @returns {Array.} 最终要绘制的标签要素数组。 + */ + getDrawnLabels: function (labelFeatures) { + var feas = [], //最终要绘制的标签要素集 + fea, //最终要绘制的标签要素 + fi, //临时标签要素,用户的第i个标签 + labelsB = [], //不产生压盖的标签要素范围集 + styTmp, //用于临时存储要素style的变量 + feaSty, //标签要素最终的style + // styleTemp用于屏蔽文本style中带有偏移性质style属性,偏移已经在计算bounds的过程中参与了运算, + // 所以在最终按照bounds来绘制标签时,需屏蔽style中带有偏移性质属性,否则文本的偏移量将扩大一倍。 + styleTemp = { + labelAlign: "cm", + labelXOffset: 0, + labelYOffset: 0 + }; + + var map = this._map; + var mapSize = map.getSize(); + var zoom = map.getZoom(); + //对用户的每个标签要素进行处理与判断 + for (var i = 0, len = labelFeatures.length; i < len; i++) { + fi = labelFeatures[i]; + //检查fi的style在避让中是否被改变,如果改变,重新设置要素的style + if (fi.isStyleChange || fi.isStyleChange === undefined) { + fi = this.setStyle(fi); + } + + //标签最终的中心点像素位置 (偏移后) + var loc = this.getLabelPxLocation(fi); + + //过滤掉地图范围外的标签 (偏移后) + if ((loc.x >= 0 && loc.x <= mapSize.x) && (loc.y >= 0 && loc.y <= mapSize.y)) { + //根据当前地图缩放级别过滤标签 + if (fi.style.minZoomLevel > -1) { + if (zoom <= fi.style.minZoomLevel) { + continue; + } + } + if (fi.style.maxZoomLevel > -1) { + if (zoom > fi.style.maxZoomLevel) { + continue; + } + } + + //计算标签bounds + var boundsQuad = null; + if (fi.isStyleChange) { + fi.isStyleChange = null; + boundsQuad = this.calculateLabelBounds(fi, loc); + } else { + if (fi.geometry.bsInfo.w && fi.geometry.bsInfo.h) { + //使用calculateLabelBounds2可以提高bounds的计算效率,尤其是在getPxBoundsMode = 1时 + boundsQuad = this.calculateLabelBounds2(fi, loc); + } else { + boundsQuad = this.calculateLabelBounds(fi, loc); + } + } + + //避让处理 -start + var mapViewBounds = new Bounds(0, mapSize.y, mapSize.x, 0), //地图像素范围 + quadlen = boundsQuad.length; + + if (this.options.isAvoid) { + var avoidInfo = this.getAvoidInfo(mapViewBounds, boundsQuad); //避让信息 + + if (avoidInfo) { + //横向(x方向)上的避让 + if (avoidInfo.aspectW === "left") { + fi.style.labelXOffset += avoidInfo.offsetX; + + for (let j = 0; j < quadlen; j++) { + boundsQuad[j].x += avoidInfo.offsetX; + } + } else if (avoidInfo.aspectW === "right") { + fi.style.labelXOffset += (-avoidInfo.offsetX); + + for (let j = 0; j < quadlen; j++) { + boundsQuad[j].x += (-avoidInfo.offsetX); + } + } + + //纵向(y方向)上的避让 + if (avoidInfo.aspectH === "top") { + fi.style.labelYOffset += avoidInfo.offsetY; + + for (let j = 0; j < quadlen; j++) { + boundsQuad[j].y += avoidInfo.offsetY; + } + } else if (avoidInfo.aspectH === "bottom") { + fi.style.labelYOffset += (-avoidInfo.offsetY); + + for (let j = 0; j < quadlen; j++) { + boundsQuad[j].y += (-avoidInfo.offsetY); + } + } + + //如果style发生变化,记录下来 + fi.isStyleChange = true; + } + } + //避让处理 -end + + //压盖处理 -start + if (this.options.isOverLay) { + //是否压盖 + var isOL = false; + + if (i != 0) { + for (let j = 0; j < labelsB.length; j++) { + //压盖判断 + if (this.isQuadrilateralOverLap(boundsQuad, labelsB[j])) { + isOL = true; + break; + } + } + } + + if (isOL) { + continue; + } else { + labelsB.push(boundsQuad); + } + } + //压盖处理 -end + + //背景(事件)-start + + //将标签像素范围转为地理范围 + var geoBs = []; + for (let j = 0; j < quadlen - 1; j++) { + geoBs.push(map.containerPointToLatLng(boundsQuad[j])); + } + + //屏蔽有偏移性质的style属性,偏移量在算bounds时已经加入计算 + var leftBottom = geoBs[3]; + var rightTop = geoBs[1]; + var bounds = new Bounds(leftBottom.lng, leftBottom.lat, rightTop.lng, rightTop.lat); + var center = bounds.getCenterLonLat(); + var label = new GeoText(center.lon, center.lat, fi.attributes[this.themeField]); + label.calculateBounds(); + styTmp = Util.cloneObject(fi.style); + feaSty = Util.cloneObject(Util.copyAttributes(styTmp, styleTemp)); + fea = new Vector(label, fi.attributes, feaSty); + //赋予id + fea.id = fi.id; + fea.fid = fi.fid; + feas.push(fea); + } + } + + //返回最终要绘制的标签要素 + return feas; + }, + + /** + * @function LabelThemeLayer.prototype.getStyleByData + * @description 根据用户数据(feature)设置专题要素的 Style。 + * @param {FeatureVector} feat - 矢量要素对象。 + * @returns {Array.} 专题要素的 Style。 + */ + getStyleByData: function (feat) { + var feature = feat; + feature.style = Util.copyAttributes(feature.style, this.defaultStyle); + //将style赋给标签 + if (this.style && this.style.fontSize && parseFloat(this.style.fontSize) < 12) { + this.style.fontSize = "12px"; + } + feature.style = Util.copyAttributes(feature.style, this.style); + + if (this.themeField && this.styleGroups && feature.attributes) { + var Sf = this.themeField; + var attributes = feature.attributes; + var groups = this.styleGroups; + var isSfInAttrs = false; //指定的 groupField 是否是geotext的属性字段之一 + var attr = null; //属性值 + + for (var property in attributes) { + if (Sf === property) { + isSfInAttrs = true; + attr = attributes[property]; + break; + } + } + + //判断属性值是否属于styleGroups的某一个范围,以便对标签分组 + if (isSfInAttrs) { + for (var i = 0, len = groups.length; i < len; i++) { + if ((attr >= groups[i].start) && (attr < groups[i].end)) { + var sty1 = groups[i].style; + if (sty1 && sty1.fontSize && parseFloat(sty1.fontSize) < 12) { + sty1.fontSize = "12px"; + } + feature.style = Util.copyAttributes(feature.style, sty1); + } + } + } + feature.style.label = feature.attributes[this.themeField] + } + + + return feature.style; + }, + + /** + * @function LabelThemeLayer.prototype.setLabelsStyle + * @description 设置标签要素的 Style。 + * @param {Array.} labelFeatures - 需要设置 Style 的标签要素数组。 + * @returns {Array.} 赋予 Style 后的标签要素数组。 + */ + setLabelsStyle: function (labelFeatures) { + var fea, labelFeas = []; + for (var i = 0, len = labelFeatures.length; i < len; i++) { + var feature = labelFeatures[i]; + if (feature.geometry.CLASS_NAME === "SuperMap.Geometry.GeoText") { + //设置标签的Style + if (feature.geometry.bsInfo.w || feature.geometry.bsInfo.h) { + feature.geometry.bsInfo.w = null; + feature.geometry.bsInfo.h = null; + feature.geometry.labelWTmp = null; + } + fea = this.setStyle(feature); + //为标签要素指定图层 + fea.layer = this.layer; + labelFeas.push(fea); + } else { + return labelFeatures; + } + } + return labelFeas; + }, + + /** + * @function LabelThemeLayer.prototype.setStyle + * @description 设置标签要素的 Style。 + * @param {FeatureVector} feat - 需要赋予 style 的要素。 + */ + setStyle: function (feat) { + var feature = feat; + feature.style = Util.copyAttributes(feature.style, this.defaultStyle); + //将style赋给标签 + if (this.style && this.style.fontSize && parseFloat(this.style.fontSize) < 12) { + this.style.fontSize = "12px"; + } + feature.style = Util.copyAttributes(feature.style, this.style); + + if (this.groupField && this.styleGroups && feature.attributes) { + var Sf = this.groupField; + var Attrs = feature.attributes; + var Gro = this.styleGroups; + var isSfInAttrs = false; //指定的 groupField 是否是geotext的属性字段之一 + var attr = null; //属性值 + + for (var property in Attrs) { + if (Sf === property) { + isSfInAttrs = true; + attr = Attrs[property]; + break; + } + } + + //判断属性值是否属于styleGroups的某一个范围,以便对标签分组 + if (isSfInAttrs) { + for (var i = 0, len = Gro.length; i < len; i++) { + if ((attr >= Gro[i].start) && (attr < Gro[i].end)) { + //feature.style = Util.copyAttributes(feature.style, this.defaultStyle); + var sty1 = Gro[i].style; + if (sty1 && sty1.fontSize && parseFloat(sty1.fontSize) < 12) { + sty1.fontSize = "12px"; + } + feature.style = Util.copyAttributes(feature.style, sty1); + } + } + } + } + + //将文本内容赋到标签要素的style上 + feature.style.label = feature.geometry.text; + + return feature; + }, + + /** + * @function LabelThemeLayer.prototype.getLabelPxLocation + * @description 获取标签要素的像素坐标。 + * @param {FeatureVector} feature - 标签要素。 + * @returns {L.Point} 标签位置。 + */ + getLabelPxLocation: function (feature) { + var geoText = feature.geometry; + var styleTmp = feature.style; + + //将标签的地理位置转为像素位置 + var locationTmp = geoText.getCentroid(); + var locTmp = this._map.latLngToContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(locationTmp.y, locationTmp.x) : this._map.options.crs.unproject(external_L_default().point(locationTmp.x, locationTmp.y))); + var loc = external_L_default().point(locTmp.x, locTmp.y); + + //偏移处理 + if (styleTmp.labelXOffset || styleTmp.labelYOffset) { + var xOffset = isNaN(styleTmp.labelXOffset) ? 0 : styleTmp.labelXOffset; + var yOffset = isNaN(styleTmp.labelYOffset) ? 0 : styleTmp.labelYOffset; + var point = loc.add(external_L_default().point(xOffset, -yOffset)); + return external_L_default().point(point.x, point.y); + } else { + return external_L_default().point(loc.x, loc.y); + } + }, + + + /** + * @function LabelThemeLayer.prototype.calculateLabelBounds + * @description 获得标签要素的最终范围。 + * + * @param {FeatureVector} feature - 需要计算 bounds 的标签要素数。 + * @param {L.Point} loc - 标签位置。 + * + * @returns {Array.} 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + calculateLabelBounds: function (feature, loc) { + var geoText = feature.geometry; + + //标签范围(未旋转前) + var labB = null; + var labelInfo = null; + //获取bounds的方式 + if (this.getPxBoundsMode == 0) { + labB = geoText.getLabelPxBoundsByText(loc, feature.style); + } else if (this.getPxBoundsMode === 1) { + //canvas + labelInfo = this.getLabelInfo(feature.geometry.getCentroid(), feature.style); + labB = geoText.getLabelPxBoundsByLabel(loc, labelInfo.w, labelInfo.h, feature.style); + } else { + return null; + } + + //旋转Bounds + var boundsQuad = []; + if ((feature.style.labelRotation % 180) == 0) { + boundsQuad = [{ + "x": labB.left, + "y": labB.top + }, + { + "x": labB.right, + "y": labB.top + }, + { + "x": labB.right, + "y": labB.bottom + }, + { + "x": labB.left, + "y": labB.bottom + }, + { + "x": labB.left, + "y": labB.top + } + ]; + } else { + boundsQuad = this.rotationBounds(labB, loc, feature.style.labelRotation); + } + + //重置GeoText的bounds + geoText.bounds = new Bounds(boundsQuad[1].x, boundsQuad[3].y, boundsQuad[2].x, boundsQuad[4].y); + return boundsQuad; + }, + + /** + * @function LabelThemeLayer.prototype.calculateLabelBounds2 + * @description 获得标签要素的最终范围的另一种算法(通过记录下的标签宽高),提高计算 bounds 的效率。 + * + * @param {FeatureVector} feature - 需要计算 bounds 的标签要素数。 + * @param {L.Point} loc - 标签位置。 + * + * @returns {Array.} 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + calculateLabelBounds2: function (feature, loc) { + var labB, left, bottom, top, right; + var labelSize = feature.geometry.bsInfo; + var style = feature.style; + var locationPx = Util.cloneObject(loc); + + //处理文字对齐 + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + case "lm": + locationPx.x += labelSize.w / 2; + break; + case "lb": + locationPx.x += labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + case "ct": + locationPx.y += labelSize.h / 2; + break; + case "cb": + locationPx.y -= labelSize.h / 2; + break; + case "rt": + locationPx.x -= labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + case "rm": + locationPx.x -= labelSize.w / 2; + break; + case "rb": + locationPx.x -= labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + default: + break; + } + } + + left = locationPx.x - labelSize.w / 2; + bottom = locationPx.y + labelSize.h / 2; + //处理斜体字 + if (style.fontStyle && style.fontStyle === "italic") { + right = locationPx.x + labelSize.w / 2 + parseInt(parseFloat(style.fontSize) / 2); + } else { + right = locationPx.x + labelSize.w / 2; + } + top = locationPx.y - labelSize.h / 2; + + labB = new Bounds(left, bottom, right, top); + + //旋转Bounds + var boundsQuad = []; + if ((style.labelRotation % 180) == 0) { + boundsQuad = [{ + "x": labB.left, + "y": labB.top + }, + { + "x": labB.right, + "y": labB.top + }, + { + "x": labB.right, + "y": labB.bottom + }, + { + "x": labB.left, + "y": labB.bottom + }, + { + "x": labB.left, + "y": labB.top + } + ]; + } else { + boundsQuad = this.rotationBounds(labB, loc, style.labelRotation); + } + + //重置GeoText的bounds + feature.geometry.bounds = new Bounds(boundsQuad[1].x, boundsQuad[3].y, boundsQuad[2].x, boundsQuad[4].y); + return boundsQuad; + }, + + /** + * @function LabelThemeLayer.prototype.getLabelInfo + * @description 根据当前位置获取绘制后的标签信息,包括标签的宽,高和行数等。 + * @returns {Object} 绘制后的标签信息。 + */ + getLabelInfo: function (location, style) { + var LABEL_ALIGN = { + "l": "left", + "r": "right", + "t": "top", + "b": "bottom" + }, + LABEL_FACTOR = { + "l": 0, + "r": -1, + "t": 0, + "b": -1 + }; + + style = Util.extend({ + fontColor: "#000000", + labelAlign: "cm" + }, style); + var pt = this.getLocalXY(location); + var labelWidth = 0; + + if (style.labelXOffset || style.labelYOffset) { + var xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset; + var yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset; + pt[0] += xOffset; + pt[1] -= yOffset; + } + + var canvas = document.createElement('canvas'); + canvas.globalAlpha = 0; + canvas.lineWidth = 1; + + var ctx = canvas.getContext("2d"); + + ctx.fillStyle = style.fontColor; + ctx.globalAlpha = style.fontOpacity || 1.0; + var fontStyle = [style.fontStyle ? style.fontStyle : "normal", + "normal", + style.fontWeight ? style.fontWeight : "normal", + style.fontSize ? style.fontSize : "1em", + style.fontFamily ? style.fontFamily : "sans-serif" + ].join(" "); + var labelRows = style.label.split('\n'); + var numRows = labelRows.length; + var vfactor, lineHeight, labelWidthTmp; + if (ctx.fillText) { + // HTML5 + ctx.font = fontStyle; + ctx.textAlign = LABEL_ALIGN[style.labelAlign[0]] || + "center"; + ctx.textBaseline = LABEL_ALIGN[style.labelAlign[1]] || + "middle"; + vfactor = LABEL_FACTOR[style.labelAlign[1]]; + if (vfactor == null) { + vfactor = -.5; + } + lineHeight = ctx.measureText('Mg').height || + ctx.measureText('xx').width; + pt[1] += lineHeight * vfactor * (numRows - 1); + for (let i = 0; i < numRows; i++) { + labelWidthTmp = ctx.measureText(labelRows[i]).width; + if (labelWidth < labelWidthTmp) { + labelWidth = labelWidthTmp; + } + } + } else if (ctx.mozDrawText) { + // Mozilla pre-Gecko1.9.1 (} bounds旋转后形成的多边形节点数组。是一个四边形,形如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + rotationBounds: function (bounds, rotationCenterPoi, angle) { + var ltPoi = external_L_default().point(bounds.left, bounds.top); + var rtPoi = external_L_default().point(bounds.right, bounds.top); + var rbPoi = external_L_default().point(bounds.right, bounds.bottom); + var lbPoi = external_L_default().point(bounds.left, bounds.bottom); + + var ver = []; + ver.push(this.getRotatedLocation(ltPoi.x, ltPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(rtPoi.x, rtPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(rbPoi.x, rbPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(lbPoi.x, lbPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + + //bounds旋转后形成的多边形节点数组 + var quad = []; + + for (var i = 0; i < ver.length; i++) { + quad.push({ + "x": ver[i].x, + "y": ver[i].y + }); + } + quad.push({ + "x": ver[0].x, + "y": ver[0].y + }); + return quad; + }, + + /** + * @function LabelThemeLayer.prototype.getRotatedLocation + * @description 获取一个点绕旋转中心顺时针旋转后的位置。(此方法用于屏幕坐标)。 + * + * @param {number} x - 旋转点横坐标。 + * @param {number} y - 旋转点纵坐标。 + * @param {number} rx - 旋转中心点横坐标。 + * @param {number} ry - 旋转中心点纵坐标。 + * @param {number} angle - 旋转角度。 + * + * @returns {Object} 旋转后的坐标位置对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + */ + getRotatedLocation: function (x, y, rx, ry, angle) { + var loc = {}, + x0, y0; + + y = -y; + ry = -ry; + angle = -angle; //顺时针旋转 + x0 = (x - rx) * Math.cos((angle / 180) * Math.PI) - (y - ry) * Math.sin((angle / 180) * Math.PI) + rx; + y0 = (x - rx) * Math.sin((angle / 180) * Math.PI) + (y - ry) * Math.cos((angle / 180) * Math.PI) + ry; + + loc.x = x0; + loc.y = -y0; + + return loc; + }, + + /** + * @function LabelThemeLayer.prototype.getAvoidInfo + * @description 获取避让的信息。 + * + * @param {Bounds} bounds - 地图像素范围。 + * @param {Array.} quadrilateral - 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * + * @returns {Object} 避让的信息。 + */ + getAvoidInfo: function (bounds, quadrilateral) { + if (quadrilateral.length !== 5) { + return null; + } //不是四边形 + + //将bound序列化为点数组形式 + var bounddQuad = [{ + "x": bounds.left, + "y": bounds.top + }, + { + "x": bounds.right, + "y": bounds.top + }, + { + "x": bounds.right, + "y": bounds.bottom + }, + { + "x": bounds.left, + "y": bounds.bottom + }, + { + "x": bounds.left, + "y": bounds.top + } + ]; + + var isIntersection = false, + bqLen = bounddQuad.length, + quadLen = quadrilateral.length; + + var offsetX = 0, + offsetY = 0, + aspectH = "", + aspectW = ""; + for (var i = 0; i < bqLen - 1; i++) { + for (var j = 0; j < quadLen - 1; j++) { + var isLineIn = Util.lineIntersection(bounddQuad[i], bounddQuad[i + 1], quadrilateral[j], quadrilateral[j + 1]); + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + //设置避让信息 + setInfo(quadrilateral[j]); + setInfo(quadrilateral[j + 1]); + isIntersection = true; + } + } + } + + if (isIntersection) { + //组织避让操作所需的信息 + return { + "aspectW": aspectW, + "aspectH": aspectH, + "offsetX": offsetX, + "offsetY": offsetY + }; + } else { + return null; + } + + + //内部函数:设置避让信息 + //参数:vec-{Object} quadrilateral四边形单个节点。如:{"x":1,"y":1}。 + function setInfo(vec) { + //四边形不在bounds内的节点 + if (!bounds.contains(vec.x, vec.y)) { + //bounds的Top边 + if (vec.y < bounds.top) { + let oY = Math.abs(bounds.top - vec.y); + if (oY > offsetY) { + offsetY = oY; + aspectH = "top"; + } + } + + //bounds的Bottom边 + if (vec.y > bounds.bottom) { + let oY = Math.abs(vec.y - bounds.bottom); + if (oY > offsetY) { + offsetY = oY; + aspectH = "bottom"; + } + } + + //bounds的left边 + if (vec.x < bounds.left) { + let oX = Math.abs(bounds.left - vec.x); + if (oX > offsetX) { + offsetX = oX; + aspectW = "left"; + } + } + + //bounds的right边 + if (vec.x > bounds.right) { + let oX = Math.abs(vec.x - bounds.right); + if (oX > offsetX) { + offsetX = oX; + aspectW = "right"; + } + } + } + } + + }, + + + /** + * @function LabelThemeLayer.prototype.isQuadrilateralOverLap + * @description 判断两个四边形是否有压盖。 + * + * @param {Array.} quadrilateral - 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * @param {Array.} quadrilateral2 - 第二个四边形节点数组。 + * + * @returns {boolean} 是否压盖,true表示压盖。 + */ + isQuadrilateralOverLap: function (quadrilateral, quadrilateral2) { + var quadLen = quadrilateral.length, + quad2Len = quadrilateral2.length; + if (quadLen !== 5 || quad2Len !== 5) { + return null; + } //不是四边形 + + var OverLap = false; + //如果两四边形互不包含对方的节点,则两个四边形不相交 + for (let i = 0; i < quadLen; i++) { + if (this.isPointInPoly(quadrilateral[i], quadrilateral2)) { + OverLap = true; + break; + } + } + for (let i = 0; i < quad2Len; i++) { + if (this.isPointInPoly(quadrilateral2[i], quadrilateral)) { + OverLap = true; + break; + } + } + //加上两矩形十字相交的情况 + for (let i = 0; i < quadLen - 1; i++) { + if (OverLap) { + break; + } + for (var j = 0; j < quad2Len - 1; j++) { + var isLineIn = Util.lineIntersection(quadrilateral[i], quadrilateral[i + 1], quadrilateral2[j], quadrilateral2[j + 1]); + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + OverLap = true; + break; + } + } + } + + return OverLap; + }, + + /** + * @function LabelThemeLayer.prototype.isPointInPoly + * @description 判断一个点是否在多边形里面。(射线法)。 + * + * @param {Object} pt - 需要判定的点对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Array.} poly - 多边形节点数组。例如一个四边形:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * @returns {boolean} 点是否在多边形内。 + */ + isPointInPoly: function (pt, poly) { + for (var isIn = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { + ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y)) && + (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x) && + (isIn = !isIn); + } + return isIn; + } + + +}); + +var labelThemeLayer = function (name, options) { + return new LabelThemeLayer(name, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/FeatureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + +/** + * @class FeatureService + * @deprecatedclassinstance L.supermap.featureService + * @classdesc 要素数据集类。提供:ID 查询,范围查询,SQL 查询,几何查询,bounds 查询,缓冲区查询,地物编辑。 + * @category iServer Data Feature + * @example + * new FeatureService(url) + * .getFeaturesByIDs(param,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var FeatureService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function FeatureService.prototype.getFeaturesByIDs + * @description 数据集 ID 查询服务。 + * @param {GetFeaturesByIDsParameters} params - ID 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByIDs: function (params, callback, resultFormat) { + var me = this; + var getFeaturesByIDsService = new GetFeaturesByIDsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByIDsService.processAsync(me._processParams(params)); + + }, + + /** + * @function FeatureService.prototype.getFeaturesByBounds + * @description 数据集 bounds 查询服务。 + * @param {GetFeaturesByBoundsParameters} params - 数据集范围查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByBounds: function (params, callback, resultFormat) { + var me = this; + var getFeaturesByBoundsService = new GetFeaturesByBoundsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByBoundsService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesByBuffer + * @description 数据集 buffer 查询服务。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByBuffer: function (params, callback, resultFormat) { + var me = this; + var getFeatureService = new GetFeaturesByBufferService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeatureService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesBySQL + * @description 数据集 SQL 查询服务。 + * @param {GetFeaturesBySQLParameters} params - 数据集 SQL 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesBySQL: function (params, callback, resultFormat) { + var me = this; + var getFeatureBySQLService = new GetFeaturesBySQLService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeatureBySQLService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesByGeometry + * @description 数据集几何查询服务类。 + * @param {GetFeaturesByGeometryParameters} params - 数据集几何查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByGeometry: function (params, callback, resultFormat) { + var me = this; + var getFeaturesByGeometryService = new GetFeaturesByGeometryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByGeometryService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.editFeatures + * @description 地物编辑服务。 + * @param {EditFeaturesParameters} params - 数据服务中数据集添加、修改、删除参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + editFeatures: function (params, callback) { + + if (!params || !params.dataSourceName || !params.dataSetName) { + return; + } + + var me = this, + url = me.url, + dataSourceName = params.dataSourceName, + dataSetName = params.dataSetName; + + url = Util.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + var editFeatureService = new EditFeaturesService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + editFeatureService.processAsync(me._processParams(params)); + }, + + _processParams: function (params) { + if (!params) { + return {}; + } + params.returnContent = (params.returnContent == null) ? true : params.returnContent; + params.fromIndex = params.fromIndex ? params.fromIndex : 0; + params.toIndex = params.toIndex ? params.toIndex : -1; + params.isUseBatch = (params.isUseBatch == null) ? false : params.isUseBatch; + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + if (params.geometry) { + params.geometry = toSuperMapGeometry(params.geometry); + } + + if (params.editType) { + params.editType = params.editType.toLowerCase(); + } + + var me = this; + if (params.features) { + var features = []; + if (external_L_default().Util.isArray(params.features)) { + params.features.map(function (feature) { + features.push(me._createServerFeature(feature)); + return feature; + }); + } else { + features.push(me._createServerFeature(params.features)); + } + params.features = features; + } + return params; + }, + + _createServerFeature: function (geoFeature) { + var geoJSONFeature, feature = {}, fieldNames = [], fieldValues = []; + + geoJSONFeature = geoFeature || {}; + + for (var key in geoJSONFeature.properties) { + fieldNames.push(key); + fieldValues.push(geoJSONFeature.properties[key]); + } + feature.fieldNames = fieldNames; + feature.fieldValues = fieldValues; + if (geoJSONFeature.id) { + feature.id = geoJSONFeature.id; + } + feature.geometry = toSuperMapGeometry(geoJSONFeature); + return feature; + }, + + _processFormat: function (resultFormat) { + return (resultFormat) ? resultFormat : DataFormat.GEOJSON; + } +}); + +var FeatureService_featureService = function (url, options) { + return new FeatureService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/UnicodeMarker.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UnicodeMarker + * @deprecatedclassinstance L.supermap.unicodeMarker + * @classdesc Unicode 字符图标。 + * @category Visualization Marker + * @extends {L.Path} + * @param {L.LatLngBounds} latlng - 经纬度坐标。 + * @param {Object} options - 参数。 + * @param {string} options.label - 符号 Unicode 值。 + * @param {string} [options.labelRotation='0'] - 符号旋转角度。 + * @param {string} [options.globalAlpha='1'] - 符号的透明值。 + * @param {string} [options.fontStyle='normal'] - 符号的风格。 + * @param {string} [options.fontWeight='normal'] - 符号的粗细。 + * @param {string} [options.fontSize='1em'] - 符号的尺寸。 + * @param {string} [options.fontFamily='sans-serif'] - 符号的字体。 + * @param {string} [options.textAlign='center'] - 符号内容的对齐方式。 + * @param {string} [options.textBaseline='middle'] - 绘制符号时使用的基线。 + * @fires UnicodeMarker#move + * @usage + */ +var UnicodeMarker = external_L_default().Path.extend({ + // @section + // @aka CircleMarker options + options: { + fontStyle: "normal", + fontWeight: "normal", + fontSize: "1em", + fontFamily: "sans-serif", + textAlign: "center", + textBaseline: "middle", + vfactor: -.5, + labelRotation: 0, + globalAlpha: 1, + label: "" + }, + + initialize: function (latlng, options) { + external_L_default().Util.setOptions(this, options); + this._latlng = latlng; + }, + + /** + * @function UnicodeMarker.prototype.setLatLng + * @description 设置 marker 新坐标。 + * @param {L.LatLng} setLatLng - 需要设置的新坐标。 + */ + setLatLng: function (latlng) { + this._latlng = latlng; + this.redraw(); + /** + * @event UnicodeMarker#move + * @description circle marker 重设坐标之后触发。 + * @property {L.LatLng} latlng - 当前 marker 坐标。 + */ + return this.fire('move', {latlng: this._latlng}); + }, + + /** + * @function UnicodeMarker.prototype.getLatLng + * @description 获取 marker 坐标。 + * @returns {L.LatLng} 返回当前 marker 坐标。 + */ + getLatLng: function () { + return this._latlng; + }, + + + _project: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + this._updateBounds(); + }, + + _updateBounds: function () { + var w = this._clickTolerance(), + p = [w, w]; + this._pxBounds = new (external_L_default()).Bounds(this._point.subtract(p), this._point.add(p)); + }, + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + _updatePath: function () { + this._renderer._updateUnicode(this); + }, + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p) { + return p.distanceTo(this._point) <= this._clickTolerance(); + } +}) +var unicodeMarker = function (latlng, options) { + return new UnicodeMarker(latlng, options); +}; + +external_L_default().Canvas.include({ + _updateUnicode: function (layer) { + if (!this._drawing) { + return; + } + let pt = {x: layer._point.x, y: layer._point.y}, + ctx = this._ctx, + fontStyle = [layer.options.fontStyle, + "normal", layer.options.fontWeight, + layer.options.fontSize, + layer.options.fontFamily].join(" "); + let label = layer.options.label.replace(/^&#x/, ''); + label = String.fromCharCode(parseInt(label, 16)); + let labelRows = label.split('\n'); + let numRows = labelRows.length; + // if (layer.options.labelXOffset || layer.options.labelYOffset) { + // let xOffset = isNaN(layer.options.labelXOffset) ? 0 : layer.options.labelXOffset; + // let yOffset = isNaN(layer.options.labelYOffset) ? 0 : layer.options.labelYOffset; + // pt.x += xOffset; + // pt.y -= yOffset; + // } + ctx.fillStyle = layer.options.fontColor; + ctx.globalAlpha = 1.0; + if (layer.options.fontOpacity >= 0 && layer.options.fontOpacity < 1) { + ctx.globalAlpha = layer.options.fontOpacity; + } + if (ctx.fillText) { + // HTML5 + ctx.font = fontStyle; + ctx.textAlign = layer.options.textAlign; + ctx.textBaseline = layer.options.textBaseline; + let vfactor = layer.options.vfactor; + let lineHeight = + ctx.measureText('Mg').height || + ctx.measureText('xx').width; + pt.y += lineHeight * vfactor * (numRows - 1); + for (let i = 0; i < numRows; i++) { + if (layer.options.labelRotation != 0) { + ctx.save(); + ctx.translate(pt.x, pt.y); + ctx.rotate(layer.options.labelRotation * Math.PI / 180); + ctx.fillText(labelRows[i], 0, (lineHeight * i)); + ctx.restore(); + } else { + ctx.fillText(labelRows[i], pt.x, pt.y); + } + + } + } else if (ctx.mozDrawText) { + // Mozilla pre-Gecko1.9.1 (SuperMap Online'] - 版权信息。 + * @fires WebMap#maploaded + * @fires WebMap#coordconvertsuccess + * @fires WebMap#coordconvertfailed + * @fires WebMap#featureunselected + * @fires WebMap#featureselected + * @fires WebMap#featuremousemove + * @usage + */ +var WebMap = external_L_default().LayerGroup.extend({ + + options: { + map: 'map', + server: 'https://www.supermapol.com', + featureLayerPopupEnable: true, + featureLayerPopup: null, + credentialValue: null, + credentialKey: 'key', + attribution: core_Attributions.Online.attribution + }, + + /** + * @private + * @function WebMap.prototype.defaultFeatureLayerPopup + * @description 默认图层弹出框。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @returns {string} 图层弹出框内容。 + */ + defaultFeatureLayerPopup: function (layer) { + return layer.feature.properties.attributes.title + ":" + layer.feature.properties.attributes.description; + }, + + initialize: function (id, options) { + if (!id && !options) { + return; + } + this._layers = {}; + external_L_default().setOptions(this, options); + this.id = id; + this.load(); + this.cartoCSSToLeaflet = new CartoCSSToLeaflet(); + }, + + /** + * @private + * @function WebMap.prototype.load + * @description 登陆后添加地图图层。 + */ + load: function () { + if (this.options.server.indexOf('http://') < 0 && this.options.server.indexOf('https://') < 0) { + this.options.server = "http://" + this.options.server; + } + var mapUrl = this.options.server + '/web/maps/' + this.id + '.json'; + if (this.options.credentialValue) { + mapUrl += ('?' + this.options.credentialKey + '=' + this.options.credentialValue); + } + var me = this; + FetchRequest.get(mapUrl).then(function (response) { + return response.json() + }).then(function (jsonObj) { + if (!jsonObj) { + return; + } + var layers = jsonObj.layers; + me.mapInfo = jsonObj; + me.createLayersByJson(layers); + }); + }, + + /** + * @private + * @function WebMap.prototype.addLayerWrapper + * @description 添加图层容器。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @param {boolean} [isBaseLayer] - 是否为底图层。 + * @param {Object} options - 参数。 + * @returns {WebMap} WebMap的实例对象。 + */ + addLayerWrapper: function (layer, isBaseLayer, options) { + if (isBaseLayer) { + this.createMap(options); + } + this.addLayer(layer); + if (layer.labelLayer) { + this.addLayer(layer.labelLayer); + } + return this; + }, + + /** + * @private + * @function WebMap.prototype.createLayersByJson + * @description 通过 JSON 创建图层。 + * @param {JSONObject} layersJson - 图层的 JSON 信息。 + */ + createLayersByJson: function (layersJson) { + if (!external_L_default().Util.isArray(layersJson)) { + return; + } + if (layersJson.length === 0) { + return; + } + this.layers = []; + var layerQueue = []; + for (var i = 0; i < layersJson.length; i++) { + var layerJson = layersJson[i]; + layerJson["_originIndex"] = i; + var layerJsonType = layerJson.layerType = layerJson.layerType || "BASE_LAYER"; + if (layerJsonType !== "BASE_LAYER") { + //如果图层不是底图,则先加到图层队列里面等待底图完成后再处理 + layerQueue.unshift(layerJson); + continue; + } else { + layerJson.isBaseLayer = true; + this.createLayer(layerJson.type, layerJson); + } + } + //底图加载完成后开始处理图层队列里的图层 + while (layerQueue.length > 0) { + var layerInfo = layerQueue.pop(); + var type = layerInfo.type; + var layerType = layerInfo.layerType = layerInfo.layerType || "BASE_LAYER"; + if (layerType !== "OVERLAY_LAYER") { + type = layerType; + } + this.createLayer(type, layerInfo); + } + /** + * @event WebMap#maploaded + * @description 底图加载完成后触发。 + * @property {L.Map} map - Leaflet Map 对象。 + */ + this.fire('maploaded', { + map: this._map + }); + }, + + /** + * @private + * @function WebMap.prototype.createCRS + * @description 创建坐标对象。 + * @param {number} epsgCode - epsg 编码。 + * @param {string} type - 坐标类型。 + * @param {number} resolutions - 分辨率。 + * @param {L.Point} origin - 切片原点。 + * @param {L.Bounds} bounds - 地图范围。 + */ + createCRS: function (epsgCode, type, resolutions, origin, bounds) { + if (epsgCode < 0) { + return new NonEarthCRS({ + bounds: bounds, + origin: origin, + resolutions: resolutions + }) + } + + if (epsgCode === 910112 || epsgCode === 910102) { + return BaiduCRS; + } + if (epsgCode === 910111) { + epsgCode = 3857 + //todo 火星mercator + } + if (epsgCode === 910101) { + epsgCode = 4326 + //todo 火星 + } + return crs("EPSG:" + epsgCode, { + origin: origin, + resolutions: resolutions, + bounds: bounds + }) + }, + + /** + * @private + * @function WebMap.prototype.createMap + * @description 创建地图。 + * @param {Object} options - 参数。 + */ + createMap: function (options) { + var crs = options.crs || (external_L_default()).CRS.EPSG3857; + var bounds = external_L_default().latLngBounds(crs.unproject(options.bounds.min), crs.unproject(options.bounds.max)); + this._map = external_L_default().map(this.options.map, { + center: bounds.getCenter(), + maxZoom: options.maxZoom || 22, + minZoom: options.minZoom || 0, + zoom: options.zoom || 0, + crs: crs, + renderer: external_L_default().canvas() + }); + if (crs instanceof NonEarthCRS) { + this._map.setZoom(options.zoom ? options.zoom + 2 : 2, { + maxZoom: options.maxZoom || 22 + }); + } else { + this._map.fitBounds(bounds, { + maxZoom: options.maxZoom || 22 + }); + } + }, + + /** + * @private + * @function WebMap.prototype.getResolutionsFromScales + * @description 通过比例尺获取分辨率。 + * @param {Array.} scales - 排序比例尺数组。 + * @param {number} dpi - 屏幕分辨率。 + * @param {string} units - 地图的单位。 + * @param {Datum} datum - 大地参照系类。 + * @returns {Array.} 返回给定比例尺所对应的分辨率。 + */ + getResolutionsFromScales: function (scales, dpi, units, datum) { + var resolutions = []; + for (var i = 0; i < scales.length; i++) { + resolutions.push(getResolutionFromScaleDpi(scales[i], dpi, units, datum)) + } + return resolutions; + }, + + /** + * @private + * @function WebMap.prototype.createLayer + * @description 创建图层。 + * @param {string} type - 图层类型。 + * @param {Object} layerInfo - 图层信息。 + */ + createLayer: function (type, layerInfo) { + var prjCoordSys = layerInfo.prjCoordSys, + epsgCode = prjCoordSys && prjCoordSys.epsgCode || this.mapInfo.epsgCode, + center = this.mapInfo.center || layerInfo.center, + level = this.mapInfo.level || layerInfo.level, + bounds = this.mapInfo.extent || layerInfo.bounds, + scales = layerInfo.scales, + isBaseLayer = layerInfo.isBaseLayer, + opacity = layerInfo.opacity; + var mapBounds = external_L_default().bounds([bounds.leftBottom.x, bounds.leftBottom.y], [bounds.rightTop.x, bounds.rightTop.y]); + var layerBounds = layerInfo.bounds ? external_L_default().bounds([layerInfo.bounds.leftBottom.x, layerInfo.bounds.leftBottom.y], [layerInfo.bounds.rightTop.x, layerInfo.bounds.rightTop.y]) : mapBounds; + if (!center) { + center = layerBounds.getCenter(); + } + var origin = external_L_default().point(layerBounds.min.x, layerBounds.max.y); + var resolutions = !scales ? null : this.getResolutionsFromScales(scales, 96, layerInfo.units); + var crs = this.createCRS(epsgCode, prjCoordSys ? prjCoordSys.type : '', resolutions, origin, layerBounds); + var mapOptions = { + bounds: mapBounds, + center: external_L_default().point(center.x, center.y), + crs: crs, + zoom: level + }; + var layer; + switch (type) { + case "SUPERMAP_REST": + layer = tiledMapLayer(layerInfo.url, { + transparent: true, + opacity: opacity + }); + break; + case "SUPERMAP_REST_VECTOR": + //ToDO + break; + case "TIANDITU_VEC": + case "TIANDITU_IMG": + case "TIANDITU_TER": + mapOptions.crs = epsgCode === 4326 ? TianDiTu_WGS84CRS : TianDiTu_MercatorCRS; + mapOptions.minZoom = 1; + mapOptions.zoom = 1 + mapOptions.zoom; + layer = this.createTiandituLayer(layerInfo); + break; + case "BAIDU": + mapOptions.crs = BaiduCRS; + mapOptions.zoom = 3 + mapOptions.zoom; + mapOptions.minZoom = 3; + layer = baiduTileLayer(); + break; + case 'BING': + //todo + break; + case "WMS": + layer = this.createWmsLayer(layerInfo); + break; + case "WMTS": + mapOptions.resolutions = this.getResolutionsFromScales(scales, 90.71446714322, layerInfo.units); + var identifier = layerInfo.identifier; + var layerName = identifier.substring(identifier.indexOf("_") + 1); + layer = wmtsLayer(layerInfo.url, { + layer: layerName, + style: "default", + tilematrixSet: identifier, + format: "image/png" + }); + break; + case "CLOUD": + mapOptions.crs = (external_L_default()).CRS.EPSG3857; + mapOptions.zoom = 3 + mapOptions.zoom; + mapOptions.minZoom = 3; + layer = cloudTileLayer(layerInfo.url, { + opacity: opacity + }); + break; + case "MARKER_LAYER": + layer = this.createMarkersLayer(layerInfo, crs); + break; + case "FEATURE_LAYER": + if (layerInfo.identifier == "ANIMATORVECTOR") { + //todo + } else if (layerInfo.identifier == "THEME") { + layer = this.createThemeLayer(layerInfo); + } else { + layer = this.createVectorLayer(layerInfo, crs); + } + break; + default: + throw new Error('unSupported Layer Type'); + } + if (layer && layerInfo.isVisible) { + this.addLayerWrapper(layer, isBaseLayer, mapOptions); + } + }, + + /** + * @private + * @function WebMap.prototype.createTiandituLayer + * @description 创建天地图图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {tiandituTileLayer} 返回天地图图层对象。 + */ + createTiandituLayer: function (layerInfo) { + var type = layerInfo.type.split('_')[1].toLowerCase(); + var isLabel = layerInfo.layerType === 'OVERLAY_LAYER'; + var layer = new TiandituTileLayer({ + layerType: type, + isLabel: isLabel + }); + return layer; + }, + + /** + * @private + * @function WebMap.prototype.createMarkersLayer + * @description 创建图标图层。 + * @param {Object} layerInfo - 图层信息。 + * @param {Object} crs - 坐标对象。 + * @returns {L.Layer} 返回 marker 图层。 + */ + createMarkersLayer: function (layerInfo, crs) { + var that = this; + var markers = layerInfo.markers || []; + //style = layerInfo.style, + //opacity = layerInfo.opacity, + //marker, point, size, offset, icon, that = this; + //todo offset + var coordsToLatLng = function (coords) { + var ll = crs.unproject(external_L_default().point(coords[0], coords[1])); + return new (external_L_default()).LatLng(ll.lat, ll.lng, coords[2]); + }; + + var layer = external_L_default().geoJSON(toGeoJSON(markers), { + pointToLayer: function (geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + }; + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function (geoJsonFeature) { + return that.cartoCSSToLeaflet.getStyleFromiPortalMarker(geoJsonFeature.properties.icon); + } + }); + if (this.options.featureLayerPopupEnable) { + layer.bindPopup(this.options.featureLayerPopup || this.defaultFeatureLayerPopup) + } + return layer; + }, + /** + * @private + * @function WebMap.prototype.createWmsLayer + * @description 创建 Wms 图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {L.Layer} 返回 Wms 图层对象。 + + */ + createWmsLayer: function (layerInfo) { + var url = layerInfo.url, + opacity = layerInfo.opacity, + subLayers = layerInfo.subLayers; + + if (!subLayers || subLayers === "undefined" || subLayers === "null") { + subLayers = "0"; + } + return external_L_default().tileLayer.wms(url, { + layers: subLayers, + format: 'image/png', + transparent: true, + noWrap: true, + opacity: opacity + }) + }, + /** + * @private + * @function WebMap.prototype.createVectorLayer + * @description 创建矢量要素图层。 + * @param {Object} layerInfo - 图层信息。 + * @param {Object} crs - 坐标对象。 + * @returns {L.Layer} 返回矢量要素图层对象。 + */ + createVectorLayer: function (layerInfo, crs) { + var style = layerInfo.style, + opacity = layerInfo.opacity, + me = this; + //todo readonly = layerInfo.readonly; + var coordsToLatLng = function (coords) { + var ll = crs.unproject(external_L_default().point(coords[0], coords[1])); + return new (external_L_default()).LatLng(ll.lat, ll.lng, coords[2]); + }; + if (!layerInfo.url) { + var layer = external_L_default().geoJSON(toGeoJSON(layerInfo.features), { + pointToLayer: function (geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + } + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function (geoJsonFeature) { + let lStyle = me.cartoCSSToLeaflet.getStyleFromiPortalStyle(style ? style : {}, geoJsonFeature.geometry.type, geoJsonFeature.properties.style); + if (lStyle && lStyle.dashArray && lStyle.dashArray.length == 0) { + lStyle.dashArray = null; + } + return lStyle; + }, + opacity: opacity + }); + if (this.options.featureLayerPopupEnable) { + layer.bindPopup(this.options.featureLayerPopup || this.defaultFeatureLayerPopup) + } + return layer; + } else { + var url = layerInfo.url, + datasourceName = layerInfo.name, + datasets = layerInfo.features; + for (var setNameIndex = 0; setNameIndex < datasets.length; setNameIndex++) { + var dataset = datasets[setNameIndex]; + if (dataset.visible) { + this.getFeaturesBySQL(url, datasourceName, dataset.name, "", DataFormat.GEOJSON, (serviceResult) => { + var layer = external_L_default().geoJSON(serviceResult.result, { + pointToLayer: function (geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + }; + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function (geoJsonFeature) { + return this.cartoCSSToLeaflet.getStyleFromiPortalStyle(style ? style : {}, geoJsonFeature.geometry.type, geoJsonFeature.properties.style); + }, + opacity: opacity + }); + if (this.options.featureLayerPopupEnable) { + layer.bindPopup(me.options.featureLayerPopup || me.defaultFeatureLayerPopup) + } + this.addLayer(layer); + }) + } + } + } + }, + getFeaturesBySQL: function (url, datasourceName, datasetName, filter, format, callback) { + filter = filter || "SMID > 0"; + var sqlParam = new GetFeaturesBySQLParameters({ + queryParameter: { + name: datasetName + "@" + datasourceName, + attributeFilter: filter + }, + datasetNames: [datasourceName + ":" + datasetName], + fromIndex: 0, + toIndex: 100000 + }); + FeatureService_featureService(url).getFeaturesBySQL(sqlParam, callback, format); + }, + /** + * @private + * @function WebMap.prototype.createThemeLayer + * @description 创建专题图图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {L.Layer} 返回专题图图层对象。 + */ + createThemeLayer: function (layerInfo) { + var themeSettings = layerInfo.themeSettings && JSON.parse(layerInfo.themeSettings); + + var layer; + var type = themeSettings.type; + layerInfo.themeSettings = themeSettings; + if (type === "HEAT") { + layer = this.createHeatLayer(layerInfo, themeSettings); + } else if (type === "UNIQUE") { + layer = this.createUniqueLayer(layerInfo, themeSettings); + } else if (type === "RANGE") { + layer = this.createRangeLayer(layerInfo, themeSettings); + } else { + layer = this.createBaseThemeLayer(layerInfo, themeSettings); + } + if (layer) { + this.addFeature2ThemeLayer(layerInfo, layer); + layer.on('add', (e) => { + this.registerThemeEvent(e.target); + }) + } + if (themeSettings && themeSettings.labelField) { + var labelLayer = this.createLabelLayer(layerInfo, themeSettings); + labelLayer.on('add', (e) => { + this.registerThemeEvent(e.target); + }); + layer.labelLayer = labelLayer; + } + return layer; + }, + createBaseThemeLayer: function (layerInfo, themeSettings) { + let style = layerInfo.style, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType, + featureStyle = style.pointStyle; + if (vectorType === "LINE") { + featureStyle.fill = false; + } else { + featureStyle.fill = true; + } + var pointStyle = {}; + pointStyle.radius = featureStyle.pointRadius; + pointStyle.color = featureStyle.strokeColor; + pointStyle.opacity = featureStyle.strokeOpacity; + pointStyle.lineCap = featureStyle.strokeLineCap; + pointStyle.weight = featureStyle.strokeWidth; + pointStyle.fillColor = featureStyle.fillColor; + pointStyle.fillOpacity = featureStyle.fillOpacity; + var pointToLayer = (geojson, latlng) => { + return external_L_default().circleMarker(latlng, pointStyle); + }; + if (featureStyle.unicode) { + pointToLayer = (geojson, latlng) => { + return new UnicodeMarker(latlng, featureStyle) + } + } + return external_L_default().geoJSON({ + type: "GeometryCollection", + geometries: [] + }, { + pointToLayer: pointToLayer, + opacity: opacity + }); + //this.registerVectorEvent(vector); + }, + createUniqueLayer: function (layerInfo, themeSettings) { + var title = layerInfo.title; + var themeField = themeSettings.field, + styleGroups = [], + settings = themeSettings.settings, + isVisible = layerInfo.isVisible, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType; + //组成styleGroup + for (var i = 0; i < settings.length; i++) { + var object = {}; + object.value = settings[i].value; + object.style = settings[i].style; + styleGroups.push(object); + } + var unique = new UniqueThemeLayer(title, { + opacity: opacity, + visibility: isVisible + }); + this.registerThemeEvent(unique); + unique.style = layerInfo.style.pointStyle; + if (vectorType === "LINE") { + unique.style.fill = false; + } else { + unique.style.fill = true; + } + unique.style.stroke = true; + unique.themeField = themeField; + unique.styleGroups = styleGroups; + var that = this; + unique.on('click', function (event) { + if (event.target && event.target.refDataID) { + var currenFeature = unique.getFeatureById(event.target.refDataID); + that.events.triggerEvent("uniquefeatureclicked", currenFeature, unique); + } + }); + return unique; + }, + createRangeLayer: function (layerInfo, themeSettings) { + var title = layerInfo.title; + var themeField = themeSettings.field, + styleGroups = [], + settings = themeSettings.settings, + isVisible = layerInfo.isVisible, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType, + featureStyle = layerInfo.style.pointStyle; + if (vectorType === "LINE") { + featureStyle.fill = false; + } else { + featureStyle.fill = true; + } + //组成styleGroup + for (var i = 0; i < settings.length; i++) { + var object = {}; + object.start = settings[i].start; + object.end = settings[i].end; + object.style = settings[i].style; + styleGroups.push(object); + } + var range = new RangeThemeLayer(title, { + visibility: isVisible, + opacity: opacity + }); + this.registerThemeEvent(range); + range.style = layerInfo.style.pointStyle; + range.style.stroke = true; + range.themeField = themeField; + range.styleGroups = styleGroups; + return range; + }, + createLabelLayer: function (layerInfo, themeSettings) { + var title = layerInfo.title; + var labelField = themeSettings.labelField, + settings = themeSettings.settings, + isVisible = layerInfo.isVisible; + + //目前只是同一样式 + var style; + if (!settings || settings.length > 0) { + style = { + "fillColor": "#ffffff" + }; + } else { + style = settings[0].style; + } + var layerStyle = external_L_default().Util.extend(new ThemeStyle(), style); + layerStyle.fontWeight = "bold"; + layerStyle.fontSize = "14px"; + //默认显示标签边框背景 + layerStyle.labelRect = true; + layerStyle.strokeColor = layerStyle.fillColor; + layerStyle.fontColor = themeSettings.labelColor; + if (themeSettings.labelFont) { + layerStyle.fontFamily = themeSettings.labelFont; + } + + var label = new LabelThemeLayer(title, { + visibility: isVisible, + opacity: 0.7 + }); + this.registerThemeEvent(label); + label.style = layerStyle; + + label.themeField = labelField; + //styleGroup, 目前只是同一样式 + label.styleGroups = []; + return label; + }, + createHeatLayer: function (layerInfo, themeSettings) { + let colors = themeSettings.colors || ['blue', 'cyan', 'lime', 'yellow', 'red']; + let gradient = {}, + featureWeight; + for (let i = 0, len = colors.length, index = 1; i < len; i++) { + gradient[index / len] = colors[i]; + index++; + } + let radius = themeSettings.settings[0].radius; + //判断单位 + if (themeSettings.heatUnit === "千米" || themeSettings.heatUnit === "km") { + radius = themeSettings.heatRadius * 1000 + } + //权重 + if (themeSettings.settings[0] && themeSettings.settings[0].featureWeight) { + featureWeight = themeSettings.settings[0].featureWeight; + } + return external_L_default().heatLayer([], { + radius: radius / 2, + minOpacity: layerInfo.opacity, + gradient: gradient, + blur: radius / 2, + featureWeight: featureWeight + }) + }, + addFeature2ThemeLayer: function (layerInfo, layer) { + if (layerInfo.layerType !== "FEATURE_LAYER" || layerInfo.identifier !== "THEME") { + return; + } + var me = this; + var isRestData = !!layerInfo.datasourceName; + var cartoCSS = layerInfo.cartoCSS; + if (cartoCSS) { + var needTransform = this.getCartoCSS2Obj(cartoCSS).needTransform; + var isAddFile = this.getCartoCSS2Obj(cartoCSS).isAddFile; + } + + var url = layerInfo.url, + subLayers, subLayer, layerName, credential = layerInfo.credential, + themeSettings = layerInfo.themeSettings, + filter = themeSettings.filter; + + if (isAddFile) { + var position = JSON.parse(layerInfo.datasourceName); + var sql = this.getSQLFromFilter(filter); + if (url) { + this.getFeatureFromFileAdded(layerInfo, function (data) { + var sFeaturesArr = [], + features, result; + if (data.type === 'EXCEL' || data.type === 'CSV') { + features = me.parseFeatureFromEXCEL.apply(me, [data.content.rows, data.content.colTitles, false, position]); + for (var x = 0, len = features.length; x < len; x++) { + result = jsonsql_default()({ + attr: features[x].attributes + }, sql); + if (result.length > 0) { + sFeaturesArr.push(features[x]) + } + } + } else { + features = me.parseFeatureFromJson(data.content); + for (var i = 0, length = features.length; i < length; i++) { + result = jsonsql_default()({ + attr: features[i].attributes + }, sql); + if (result.length > 0) { + sFeaturesArr.push(features[i]); + } + } + } + var newEpsgCode = '4326', + oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + if (needTransform) { + me.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, sFeaturesArr, function (features) { + addFeatures(features); + }); + } else { + addFeatures(sFeaturesArr); + } + }, function () {}); + } else { + var newFeautures = [], + features = layerInfo.features; + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var sqlResult = jsonsql_default()({ + attr: feature.attributes + }, sql); + if (sqlResult.length > 0) { + var lon = feature.geometry.points[0].x, + lat = feature.geometry.points[0].y; + var point = new Point(lon, lat); + var vector = new Vector(point, feature.attributes, feature.style); + newFeautures.push(vector); + } + } + addFeatures(newFeautures); + } + } else if (isRestData) { + var dataSourceName = layerInfo.datasourceName; + subLayers = layerInfo.subLayers && JSON.parse(layerInfo.subLayers); + if (subLayers.length && subLayers.length > 0) { + subLayer = subLayers[0]; + } else { + subLayer = subLayers; + } + layerName = subLayer && subLayer.name; + this.getFeaturesBySQL(layerInfo.url, dataSourceName, layerName, themeSettings.filter, DataFormat.ISERVER, (getFeaturesEventArgs) => { + var features, feature, result = getFeaturesEventArgs.result, + addedFeatures = []; + if (result && result.features) { + features = result.features; + for (var fi = 0, felen = features.length; fi < felen; fi++) { + feature = ServerFeature.fromJson(features[fi]).toFeature(); + addedFeatures.push(feature); + } + var newEpsgCode = '4326', + oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + + if (needTransform) { + this.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, addedFeatures, function (features) { + addFeatures(features); + }); + } else { + addFeatures(features); + } + } + }) + } else { + subLayers = layerInfo.subLayers && JSON.parse(layerInfo.subLayers); + if (subLayers.length && subLayers.length > 0) { + subLayer = subLayers[0]; + } else { + subLayer = subLayers; + } + layerName = subLayer && subLayer.name; + var oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + this.getFeaturesBySQL(url, credential, layerName, filter, DataFormat.ISERVER, function (features) { + var newEpsgCode = '4326'; + if (needTransform) { + me.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, features, function (features) { + addFeatures(features); + }); + } else { + addFeatures(features); + } + }); + } + + function addFeatures(features) { + if (layer && layer.labelLayer instanceof LabelThemeLayer) { + me.addFeature2LabelLayer(layer.labelLayer, features, layerInfo); + } + if ((external_L_default()).HeatLayer && layer instanceof (external_L_default()).HeatLayer) { + var heatPoints = []; + for (let i = 0, len = features.length; i < len; i++) { + let geometry = features[i].geometry; + heatPoints[i] = external_L_default().latLng(geometry.y, geometry.x); + if (layer.options.featureWeight) { + heatPoints[i] = [heatPoints[i].lat, heatPoints[i].lng, parseFloat(features[i].attributes[layer.options.featureWeight])]; + } + } + layer.setLatLngs(heatPoints); + } else if (layer instanceof (external_L_default()).GeoJSON) { + layer.addData(new GeoJSON().toGeoJSON(features)); + } else { + layer.addFeatures(features); + } + + } + }, + + addFeature2LabelLayer: function (layer, features, layerInfo) { + if (!features) { + return; + } + + var feature, geoTextFeature; + var themeSettings = layerInfo.themeSettings; + themeSettings = typeof themeSettings === "string" ? JSON.parse(layerInfo.themeSettings) : layerInfo.themeSettings; + var themeField = themeSettings.labelField; + + var style = layer.style; + var labelFeatures = [], + lngLat; + var styleInfo = layerInfo.styleString && JSON.parse(layerInfo.styleString); + for (var i = 0; i < features.length; i++) { + lngLat = this.getLabelLngLat(themeSettings.vectorType, features[i]); + //设置标签的偏移量 + this.setLabelOffset(themeSettings.vectorType, styleInfo, features[i], style); + feature = features[i]; + var attributes = feature.attributes; + geoTextFeature = new ThemeFeature([lngLat.lat, lngLat.lng, attributes[themeField]], attributes); + labelFeatures.push(geoTextFeature); + } + layer.style = style; + layer.addFeatures(labelFeatures); + }, + setLabelOffset: function (vectorType, styleInfo, feature, layerStyle) { + if (vectorType === 'POINT') { + var pointRadius = styleInfo.pointStyle.pointRadius || 0; + var strokeWidth = styleInfo.pointStyle.strokeWidth || 0; + var fontSize = parseInt(styleInfo.pointStyle.fontSize) || 0; + layerStyle.labelXOffset = 0; + layerStyle.labelYOffset = styleInfo.pointStyle.unicode ? 20 + fontSize : 25 + (pointRadius + strokeWidth); + } else { + return; + } + }, + getLabelLngLat: function (vectorType, feature) { + var lngLat = {}; + if (vectorType === 'POINT') { + var geometry = feature.geometry; + lngLat.lng = geometry.x; + lngLat.lat = geometry.y; + } else if (vectorType === 'LINE') { + //一条线所有顶点的数量 + var length, index; + var components = feature.geometry.components; + if (components[0].x) { + //说明是lineString类型 + length = components.length; + //线取中间点下一个显示标签 + index = parseInt(length / 2); + lngLat.lng = components[index].x; + lngLat.lat = components[index].y; + } else { + //说明是MultiLineString类型,取第一条线 + var lineOne = components[0].components; + length = lineOne.length; + index = parseInt(length / 2); + lngLat.lng = lineOne[index].x; + lngLat.lat = lineOne[index].y; + } + } else { + var centroid = feature.geometry.getCentroid(); + lngLat.lng = centroid.x; + lngLat.lat = centroid.y; + } + return lngLat; + }, + changeFeatureLayerEpsgCode: function (oldEpsgCode, newEpsgCode, layer, features, success) { + var me = this, + i, len; + var points = []; + if (!oldEpsgCode || !newEpsgCode) { + return; + } + if (features && features.length > 0) { + for (i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var geometry = feature.geometry; + var vertices = geometry.getVertices(); + points = points.concat(vertices); + } + oldEpsgCode = 'EPSG:' + oldEpsgCode; + newEpsgCode = 'EPSG:' + newEpsgCode; + me.coordsTransform(oldEpsgCode, newEpsgCode, points, function (layer, features) { + return function (newCoors) { + var start = 0, + len = newCoors.length; + for (i = start; i < len; i++) { + var point = points[i], + coor = newCoors[i]; + point.x = coor.x; + point.y = coor.y; + point.calculateBounds(); + } + for (i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var geometry = feature.geometry; + if (geometry.components) { + me.calculateComponents(geometry.components); + } + geometry.calculateBounds(); + } + success && success.call(me, features); + } + }(layer, features)); + } + return true; + }, + calculateComponents: function (components) { + if (components) { + if (components.components) { + this.calculateComponents(components.components); + } else { + for (var i = 0, len = components.length; i < len; i++) { + var component = components[i]; + if (component.components) { + this.calculateComponents(component.components) + } + component.calculateBounds(); + } + } + } + }, + coordsTransform: function (fromEpsg, toEpsg, point, success) { + var newCoord; + var from = this.SERVER_TYPE_MAP[fromEpsg], + to = this.SERVER_TYPE_MAP[toEpsg]; + if (fromEpsg === toEpsg || !from || !to) { + if (point && point.length !== undefined) { + newCoord = []; + for (var i = 0, len = point.length; i < len; i++) { + var coor = { + x: point[i].x, + y: point[i].y + }; + newCoord.push(coor); + } + } else { + newCoord = { + x: point.x, + y: point.y + }; + } + if (success) { + success.call(this, newCoord); + } + } else { + var mercator = this.SERVER_TYPE_MAP['EPSG:3857'], + wgs84 = this.SERVER_TYPE_MAP['EPSG:4326']; + if ((from === mercator || from === wgs84) && (to === mercator || to === wgs84)) { + this.projTransform(fromEpsg, toEpsg, point, success); + } else { + var convertType = from + '_' + to; + this.postTransform(convertType, point, success); + } + } + }, + projTransform: function (fromEpsg, toEpsg, point, success) { + var newCoor, me = this; + if (!lib) { + return; + } + if (point && point.length !== undefined) { + newCoor = []; + for (var i = 0, len = point.length; i < len; i++) { + var coor = lib(fromEpsg, toEpsg, [point[i].x, point[i].y]); + newCoor.push({ + x: coor[0], + y: coor[1] + }); + } + } else { + newCoor = lib(fromEpsg, toEpsg, [point.x, point.y]); + newCoor = { + x: newCoor[0], + y: newCoor[1] + }; + } + if (success) { + /** + * @event WebMap#coordconvertsuccess + * @description 坐标转换成功后触发。 + * @property {L.LatLng} newCoor - 转换成功后的坐标。 + */ + me.fire('coordconvertsuccess', { + newCoor: newCoor + }); + success.call(me, newCoor); + } + }, + postTransform: function (convertType, point, success) { + var me = this, + epsgArray = []; + if (!convertType) { + return success.call(me, null); + } + if (point && point.length !== undefined) { + for (var i = 0, len = point.length; i < len; i++) { + epsgArray.push({ + x: point[i].x, + y: point[i].y + }); + } + } else { + epsgArray = [{ + x: point.x, + y: point.y + }]; + } + if (epsgArray.length === 0) { + return success.call(me, null); + } + var postData = { + "convertType": convertType, + "points": epsgArray + }; + var url = this.server + "/apps/viewer/coordconvert.json"; + postData = JSON.stringify(postData); + var options = {}; + if (!Util.isInTheSameDomain(url) && this.proxy) { + options.proxy = this.proxy; + } + FetchRequest.post(url, postData, options).then((response) => { + return response.json() + }).then((jsonObj) => { + var newCoors = jsonObj; + if (!point && point.length !== undefined) { + newCoors = newCoors[0]; + } + this.fire('coordconvertsuccess', { + newCoors: newCoors + }); + success.call(this, newCoors); + }).catch((err) => { + if (!this.actived) { + return; + } + /** + * @event WebMap#coordconvertfailed + * @description 坐标转换失败后触发。 + * @property {Object} err - error 对象。 + */ + this.fire('coordconvertfailed', { + err: err + }); + }) + }, + getSQLFromFilter: function (filter) { + + if (!filter) { + return ' * where (1==1||1>=0)' + } else { + filter = filter.replace(/=/g, '==').replace(/and|AND/g, '&&').replace(/or|OR/g, '||').replace(/>==/g, '>=').replace(/<==/g, '<='); + return ' * where (' + filter + ')'; + } + }, + getAttributesObjFromTable: function (cols, colTitles) { + if (cols.length === 0 || colTitles.length === 0) { + return; + } + var attrArr = []; + for (var i = 0; i < cols.length; i++) { + var obj = {}; + for (var j = 0; j < colTitles.length; j++) { + obj[colTitles[j]] = cols[i][j] + } + attrArr.push(obj); + } + return attrArr; + }, + parseFeatureFromEXCEL: function (rows, colTitles, isGraphic, position) { + var attrArr = this.getAttributesObjFromTable(rows, colTitles); + var features = []; + for (var i = 0, len = attrArr.length; i < len; i++) { + var lon = attrArr[i][position["lon"]]; + var lat = attrArr[i][position["lat"]]; + if (!lon || !lat) { + continue; + } + lon = parseFloat(lon); + lat = parseFloat(lat); + var geometry = new Point(lon, lat); + var pointGraphic; + if (isGraphic) { + pointGraphic = new Graphic(geometry, attrArr[i], null); + } else { + pointGraphic = new Vector(geometry, attrArr[i], null); + } + features.push(pointGraphic); + } + return features; + + + }, + + parseFeatureFromJson: function (feature) { + var format = new GeoJSON(); + var features = format.read(feature); + //兼容insights数据格式 + if (features == null) { + var content = JSON.parse(feature.replace(/'/, '"')); + if (content.isAnalyseResult || content.type === 'MapEditor' || content.type === 'DataInsights' || content.type === 'ISERVER') { + content = content.data.recordsets[0].features; + } + format = new GeoJSON(); + features = format.read(content); + } + for (var i = 0, len = features.length; i < len; i++) { + features[i].attributes = features[i].attributes.properties || features[i].attributes; + } + return features; + + }, + getFeatureFromFileAdded: function (layerInfo, success, failed, isGraphic) { + var url = isGraphic ? layerInfo.url + '?currentPage=1&&pageSize=9999999' : layerInfo.url; + FetchRequest.get(url).then(response => response.json()).then(data => { + success && success(data); + }).catch(err => failed && failed(err)); + }, + getCartoCSS2Obj: function (cartoCSS) { + var isAddFile, needTransform = false; + if (cartoCSS.indexOf('}') > -1) { + cartoCSS = JSON.parse(cartoCSS); + needTransform = cartoCSS.needTransform; + isAddFile = cartoCSS.isAddFile; + } else { + if (cartoCSS === 'needTransform') { + needTransform = true; + //layerInfo.needTransform = true; + isAddFile = false; + } else { + isAddFile = cartoCSS === 'true'; + } + } + return { + isAddFile: isAddFile, + needTransform: needTransform + } + + + }, + registerThemeEvent: function (themeLayer) { + themeLayer.on('click', evt => { + if (!themeLayer.map) { + return; + } + if (this.selectedFeature) { + /** + * @event WebMap#featureunselected + * @description 重置选中的要素为空。 + * @property {FeatureVector} feature - 在重置之前选中的要素。 + */ + this.fire('featureunselected', { + feature: this.selectedFeature + }); + this.selectedFeature = null; + } + let feature; + if (evt.target && evt.target.refDataID) { + feature = themeLayer.getFeatureById(evt.target.refDataID); + } + if (feature) { + this.selectedFeature = feature; + /** + * @event WebMap#featureselected + * @description 点击要素,要素存在之后触发。设置选中的要素。 + * @property {FeatureVector} feature - 点击的要素。 + */ + this.fire('featureselected', { + feature: feature + }); + } + }); + themeLayer.on('mousemove', evt => { + if (!themeLayer.map) { + return; + } + if (evt.target && evt.target.refDataID) { + let feature; + if (evt.target && evt.target.refDataID) { + feature = themeLayer.getFeatureById(evt.target.refDataID); + } + if (feature) { + /** + * @event WebMap#featuremousemove + * @description 鼠标移动到要素上之后触发。 + * @property {FeatureVector} feature - 当前被移动到的要素。 + */ + this.fire('featuremousemove', { + feature: feature + }); + } + + } + }); + }, + SERVER_TYPE_MAP: { + "EPSG:4326": "WGS84", + "EPSG:3857": "MERCATOR", + "EPSG:900913": "MERCATOR", + "EPSG:102113": "MERCATOR", + "EPSG:910101": "GCJ02", + "EPSG:910111": "GCJ02MERCATOR", + "EPSG:910102": "BD", + "EPSG:910112": "BDMERCATOR" + } +}); +var webMap = function (id, options) { + return new WebMap(id, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/mapping/ImageTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class ImageTileLayer + * @deprecatedclassinstance L.supermap.imageTileLayer + * @version 10.2.0 + * @classdesc iServer 影像服务图层源。根据请求参数,返回指定的影像数据栅格瓦片并渲染。 + * @category iServer Image + * @extends {L.TileLayer} + * @example + * new ImageTileLayer(url,{collectionId:'xxx'}).addTo(map); + * @param {string} url - 服务地址,例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 参数。 + * @param {string} options.collectionId - 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {string} [options.sqlFilter] 对所显示影像的过滤条件。相当于sql查询中的where子句。支持st_geometry空间函数过滤。11.0版本暂不支持通过ECQL进行过滤。 + * @param {ImageRenderingRule} [options.renderingRule] 指定影像显示的风格,包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。不指定时,使用发布服务时所配置的风格。 + * @param {Array.} [options.ids] 返回影像集合中指定ID的影像,该id为系统维护的一个自增id,为SuperMap SDX引擎的SmID字段内容。 + * @param {Array.} [options.names] 返回影像集合中指定名称影像的瓦片资源。影像名称包含文件后缀,如S-60-45.tif。 + * @param {string} [options.format='png'] - 瓦片表述类型,瓦片格式目前支持png、jpg和webp三种格式。 + * @param {boolean} [options.transparent=true] - 瓦片是否透明。默认透明。 + * @param {boolean} [options.cacheEnabled=true] - 启用缓存。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @param {Array.} [options.subdomains] - 子域名数组。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @usage + */ +var ImageTileLayer = external_L_default().TileLayer.extend({ + options: { + collectionId: null, + sqlFilter: null, + ids: null, + names: null, + renderingRule: null, + format: 'png', + zoomOffset: 1, + transparent: true, + cacheEnabled: true, + tileProxy: null, //启用托管地址。 + attribution: core_Attributions.Common.attribution, + subdomains: null + }, + + initialize: function (url, options) { + this._url = url; + external_L_default().TileLayer.prototype.initialize.apply(this, arguments); + external_L_default().setOptions(this, options); + external_L_default().stamp(this); + }, + + /** + * @private + * @function ImageTileLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { + external_L_default().TileLayer.prototype.onAdd.call(this, map); + }, + + /** + * @function ImageTileLayer.prototype.getTileUrl + * @description 根据行列号获取瓦片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 瓦片地址。 + */ + getTileUrl: function (coords) { + var layerUrl = this._getLayerUrl(); + var tileUrl = layerUrl + '&z=' + this._getZoomForUrl() + '&x=' + coords.x + '&y=' + coords.y; + //支持代理 + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + if (!this.options.cacheEnabled) { + tileUrl += '&_t=' + new Date().getTime(); + } + if (this.options.subdomains) { + tileUrl = external_L_default().Util.template(tileUrl, { s: this._getSubdomain(coords) }); + } + return tileUrl; + }, + + _getLayerUrl: function () { + return this._layerUrl || this._createLayerUrl(); + }, + + _createLayerUrl: function () { + let layerUrl = Util.urlPathAppend( + this._url, + `/collections/${this.options.collectionId}/tile.${this.options.format}` + ); + this.requestParams = this.requestParams || this._getAllRequestParams(); + layerUrl = Util.urlAppend(layerUrl, external_L_namespaceObject.Util.getParamString(this.requestParams)); + layerUrl = SecurityManager.appendCredential(layerUrl); + this._layerUrl = layerUrl; + return layerUrl; + }, + + _getAllRequestParams: function () { + var me = this, + options = me.options || {}, + params = {}; + + params['transparent'] = options.transparent === true; + params['cacheEnabled'] = !(options.cacheEnabled === false); + + if (options.sqlFilter) { + params['sqlFilter'] = options.sqlFilter; + } + if (options.renderingRule) { + params['renderingRule'] = JSON.stringify(options.renderingRule); + } + if (options.ids) { + params['ids'] = options.ids.join(','); + } + if (options.names) { + params['names'] = options.names.join(','); + } + + return params; + } +}); + +var imageTileLayer = function (url, options) { + return new ImageTileLayer(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/mapping/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/services/DataFlowService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DataFlowService + * @deprecatedclassinstance L.supermap.dataFlowService + * @classdesc 数据流服务类。 + * @category iServer DataFlow + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {function} [options.style] - 设置数据加载样式。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.excludeField] - 排除字段。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @fires DataFlowService#broadcastSocketConnected + * @fires DataFlowService#broadcastSocketError + * @fires DataFlowService#broadcastFailed + * @fires DataFlowService#broadcastSucceeded + * @fires DataFlowService#subscribeSocketError + * @fires DataFlowService#messageSucceeded + * @fires DataFlowService#setFilterParamSucceeded + * @usage + */ +var DataFlowService_DataFlowService = ServiceBase.extend({ + + options: { + geometry: null, + prjCoordSys: null, + excludeField: null + }, + + initialize: function (url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + if (options.projection) { + this.options.prjCoordSys = options.projection; + } + ServiceBase.prototype.initialize.call(this, url, options); + this.dataFlow = new DataFlowService(url, options); + /** + * @event DataFlowService#broadcastSocketConnected + * @description broadcast Socket 连接成功。 + */ + /** + * @event DataFlowService#broadcastSocketError + * @description broadcast Socket 连接失败。 + */ + /** + * @event DataFlowService#broadcastFailed + * @description 广播失败。 + */ + /** + * @event DataFlowService#broadcastSucceeded + * @description 广播成功。 + */ + /** + * @event DataFlowService#subscribeSocketConnected + * @description 订阅数据连接成功。 + */ + /** + * @event DataFlowService#subscribeSocketError + * @description 订阅数据连接失败。 + */ + /** + * @event DataFlowService#messageSucceeded + * @description 获取信息成功。 + */ + /** + * @event DataFlowService#setFilterParamSucceeded + * @description 设置过滤参数成功。 + */ + this.dataFlow.events.on({ + "broadcastSocketConnected": this._defaultEvent, + "broadcastSocketError": this._defaultEvent, + "broadcastFailed": this._defaultEvent, + "broadcastSucceeded": this._defaultEvent, + "subscribeSocketConnected": this._defaultEvent, + "subscribeSocketError": this._defaultEvent, + "messageSucceeded": this._defaultEvent, + "setFilterParamSucceeded": this._defaultEvent, + scope: this + }) + }, + + /** + * @function DataFlowService.prototype.initBroadcast + * @description 初始化广播。 + */ + initBroadcast: function () { + this.dataFlow.initBroadcast(); + return this; + }, + + /** + * @function DataFlowService.prototype.broadcast + * @description 加载广播数据。 + * @param {JSONObject} obj - JSON 格式的要素数据。 + */ + broadcast: function (obj) { + this.dataFlow.broadcast(obj); + }, + + /** + * @function DataFlowService.prototype.initSubscribe + * @description 初始化订阅数据。 + */ + initSubscribe: function () { + this.dataFlow.initSubscribe(); + return this; + }, + + + /** + * @function DataFlowService.prototype.setExcludeField + * @description 设置排除字段。 + * @param {Object} excludeField - 排除字段。 + */ + setExcludeField: function (excludeField) { + this.dataFlow.setExcludeField(excludeField); + this.options.excludeField = excludeField; + return this; + }, + + /** + * @function DataFlowService.prototype.setGeometry + * @description 设置添加的 GeoJSON 几何要素数据。 + * @param {GeoJSONObject} geometry - 指定几何范围,该范围内的要素才能被订阅。 + */ + setGeometry: function (geometry) { + this.dataFlow.setGeometry(geometry); + this.options.geometry = geometry; + return this; + }, + + /** + * @function DataFlowService.prototype.unSubscribe + * @description 结束订阅数据。 + */ + unSubscribe: function () { + this.dataFlow.unSubscribe(); + }, + + /** + * @function DataFlowService.prototype.unBroadcast + * @description 结束加载广播。 + */ + unBroadcast: function () { + this.dataFlow.unBroadcast(); + }, + + _defaultEvent: function (e) { + this.fire(e.eventType || e.type, e); + } +}); + +var dataFlowService = function (url, options) { + return new DataFlowService_DataFlowService(url, options); +}; + +;// CONCATENATED MODULE: external "function(){try{return mapv}catch(e){return {}}}()" +const external_function_try_return_mapv_catch_e_return_namespaceObject = function(){try{return mapv}catch(e){return {}}}(); +;// CONCATENATED MODULE: ./src/leaflet/overlay/mapv/MapVRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +var BaseLayer = external_function_try_return_mapv_catch_e_return_namespaceObject.baiduMapLayer ? external_function_try_return_mapv_catch_e_return_namespaceObject.baiduMapLayer.__proto__ : Function; + +/** + * @class MapVRenderer + * @classdesc 地图渲染类。 + * @category Visualization MapV + * @private + * @extends mapv.BaseLayer + * @param {L.Map} map - Leaflet Map 对象。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @param {DataSet} dataSet - 待渲染的数据集。 + * @param {Object} options - 参数。 + * @usage + */ +class MapVRenderer extends BaseLayer { + + constructor(map, layer, dataSet, options) { + super(map, dataSet, options); + if (!BaseLayer) { + return; + } + + + var self = this; + options = options || {}; + + self.init(options); + self.argCheck(options); + this.canvasLayer = layer; + this.clickEvent = this.clickEvent.bind(this); + this.mousemoveEvent = this.mousemoveEvent.bind(this); + this._moveStartEvent = this.moveStartEvent.bind(this); + this._moveEndEvent = this.moveEndEvent.bind(this); + this._zoomStartEvent = this.zoomStartEvent.bind(this); + this.bindEvent(); + } + + /** + * @function MapVRenderer.prototype.clickEvent + * @description 鼠标点击事件。 + * @param {Object} e - 触发对象。 + */ + clickEvent(e) { + var offset = this.map.containerPointToLayerPoint([0, 0]); + var devicePixelRatio = this.devicePixelRatio = this.canvasLayer.devicePixelRatio = window.devicePixelRatio || 1 ; + var pixel = e.layerPoint; + super.clickEvent(external_L_default().point((pixel.x - offset.x) / devicePixelRatio, (pixel.y - offset.y) / devicePixelRatio), e); + } + + /** + * @function MapVRenderer.prototype.mousemoveEvent + * @description 鼠标移动事件。 + * @param {Object} e - 触发对象。 + */ + mousemoveEvent(e) { + var pixel = e.layerPoint; + super.mousemoveEvent(pixel, e); + } + + /** + * @function MapVRenderer.prototype.bindEvent + * @description 监听鼠标移动和点击事件。 + * @param {Object} e - 触发对象。 + */ + bindEvent() { + var map = this.map; + + if (this.options.methods) { + if (this.options.methods.click) { + map.on('click', this.clickEvent); + } + if (this.options.methods.mousemove) { + map.on('mousemove', this.mousemoveEvent); + } + } + this.map.on('movestart', this._moveStartEvent); + this.map.on('moveend', this._moveEndEvent); + this.map.on('zoomstart', this._zoomStartEvent); + } + /** + * @function MapVRenderer.prototype.destroy + * @description 释放资源。 + */ + destroy() { + this.unbindEvent(); + this.clearData(); + this.animator && this.animator.stop(); + this.animator = null; + this.canvasLayer = null; + } + /** + * @function MapVRenderer.prototype.unbindEvent + * @description 移除鼠标事件。 + * @param {Object} e - 触发对象。 + */ + unbindEvent() { + var map = this.map; + + if (this.options.methods) { + if (this.options.methods.click) { + map.off('click', this.clickEvent); + } + if (this.options.methods.mousemove) { + map.off('mousemove', this.mousemoveEvent); + } + } + this.map.off('movestart', this._moveStartEvent); + this.map.off('moveend', this._moveEndEvent); + this.map.off('zoomstart', this._zoomStartEvent); + } + + /** + * @function MapVRenderer.prototype.getContext + * @description 获取信息。 + */ + getContext() { + return this.canvasLayer.getCanvas().getContext(this.context); + } + + /** + * @function MapVRenderer.prototype.addData + * @description 添加数据。 + * @param {Object} data - 待添加的数据。 + * @param {Object} options - 参数。 + */ + addData(data, options) { + var _data = data; + if (data && data.get) { + _data = data.get(); + } + this.dataSet.add(_data); + this.update({ + options: options + }); + } + + /** + * @function MapVRenderer.prototype.update + * @description 更新图层。 + * @param {Object} opt - 待更新的数据。 + * @param {Object} opt.data - mapv 数据集。 + * @param {Object} opt.options - mapv 绘制参数。 + */ + update(opt) { + var update = opt || {}; + var _data = update.data; + if (_data && _data.get) { + _data = _data.get(); + } + if (_data != undefined) { + this.dataSet.set(_data); + } + super.update({ + options: update.options + }); + } + + /** + * @function MapVRenderer.prototype.getData + * @description 获取数据 + */ + getData() { + return this.dataSet; + } + + /** + * @function MapVRenderer.prototype.removeData + * @description 删除符合过滤条件的数据。 + * @param {function} filter - 过滤条件。参数为数据项,返回值为 true,表示删除该元素;否则表示不删除。 + */ + removeData(filter) { + if (!this.dataSet) { + return; + } + var newData = this.dataSet.get({ + filter: function (data) { + return (filter != null && typeof filter === "function") ? !filter(data) : true; + } + }); + this.dataSet.set(newData); + this.update({ + options: null + }); + } + + /** + * @function MapVRenderer.prototype.clearData + * @description 清除数据。 + */ + clearData() { + this.dataSet && this.dataSet.clear(); + this.update({ + options: null + }); + } + + _canvasUpdate(time) { + if (!this.canvasLayer) { + return; + } + + var self = this; + + var animationOptions = self.options.animation; + + var context = this.getContext(); + var map = this.map; + if (self.isEnabledTime()) { + if (time === undefined) { + this.clear(context); + return; + } + if (this.context === '2d') { + context.save(); + context.globalCompositeOperation = 'destination-out'; + context.fillStyle = 'rgba(0, 0, 0, .1)'; + context.fillRect(0, 0, context.canvas.width, context.canvas.height); + context.restore(); + } + } else { + this.clear(context); + } + + if (this.context === '2d') { + for (var key in self.options) { + context[key] = self.options[key]; + } + } else { + context.clear(context.COLOR_BUFFER_BIT); + } + + if (self.options.minZoom && map.getZoom() < self.options.minZoom || self.options.maxZoom && map.getZoom() > self.options.maxZoom) { + return; + } + + var bounds = map.getBounds(); + //获取当前像素下的地理范围 + var dw = bounds.getEast() - bounds.getWest(); + var dh = bounds.getNorth() - bounds.getSouth(); + var mapCanvas = map.getSize(); + + var resolutionX = dw / mapCanvas.x, + resolutionY = dh / mapCanvas.y; + // 一个像素是多少米 + var zoomUnit = Util_getMeterPerMapUnit('DEGREE') * resolutionX; + //var centerPx = map.latLngToLayerPoint(map.getCenter()); + + //获取屏幕左上角的地理坐标坐标 + //左上角屏幕坐标为0,0 + var topLeft = this.canvasLayer.getTopLeft(); + + var topLeftPX = map.latLngToAccurateContainerPoint(topLeft); + // var lopLeft = map.containerPointToLatLng([0, 0]); + var dataGetOptions = { + transferCoordinate: function (coordinate) { + var offset; + if (self.context === '2d') { + offset = map.latLngToAccurateContainerPoint(external_L_default().latLng(coordinate[1], coordinate[0])); + } else { + offset = { + 'x': (coordinate[0] - topLeft.lng) / resolutionX, + 'y': (topLeft.lat - coordinate[1]) / resolutionY + }; + } + var pixel = { + x: offset.x - topLeftPX.x, + y: offset.y - topLeftPX.y + }; + return [pixel.x, pixel.y]; + } + }; + + if (time !== undefined) { + dataGetOptions.filter = function (item) { + var trails = animationOptions.trails || 10; + return (time && item.time > (time - trails) && item.time < time); + } + } + + var data = self.dataSet.get(dataGetOptions); + + this.processData(data); + + var worldPoint = map.latLngToContainerPoint(external_L_default().latLng(0, 0)); + var pixel = { + x: worldPoint.x - topLeftPX.x, + y: worldPoint.y - topLeftPX.y + }; + + // 兼容unit为'm'的情况 + if (self.options.unit === 'm') { + if (self.options.size) { + self.options._size = self.options.size / zoomUnit; + } + if (self.options.width) { + self.options._width = self.options.width / zoomUnit; + } + if (self.options.height) { + self.options._height = self.options.height / zoomUnit; + } + } else { + self.options._size = self.options.size; + self.options._height = self.options.height; + self.options._width = self.options.width; + } + + this.drawContext(context, data, self.options, pixel); + + self.options.updateCallback && self.options.updateCallback(time); + } + + init(options) { + + var self = this; + + self.options = options; + + this.initDataRange(options); + + this.context = self.options.context || '2d'; + + if (self.options.zIndex) { + this.canvasLayer && this.canvasLayer.setZIndex(self.options.zIndex); + } + + this.initAnimator(); + } + + addAnimatorEvent() {} + + /** + * @function MapVRenderer.prototype.moveStartEvent + * @description 开始移动事件。 + */ + moveStartEvent() { + var animationOptions = this.options.animation; + if (this.isEnabledTime() && this.animator) { + this.steps.step = animationOptions.stepsRange.start; + this._hide(); + } + } + + /** + * @function MapVRenderer.prototype.moveEndEvent + * @description 移除移动事件。 + */ + moveEndEvent() { + this.canvasLayer.draw(); + this._show(); + } + + /** + * @function MapVRenderer.prototype.zoomStartEvent + * @description 隐藏渲染样式。 + */ + zoomStartEvent() { + this._hide(); + } + + /** + * @function MapVRenderer.prototype.clear + * @description 清除信息。 + * @param {string} context - 指定要清除的信息。 + */ + clear(context) { + context && context.clearRect && context.clearRect(0, 0, context.canvas.width, context.canvas.height); + } + + _hide() { + this.canvasLayer.canvas.style.display = 'none'; + } + + _show() { + this.canvasLayer.canvas.style.display = 'block'; + } + + /** + * @function MapVRenderer.prototype.draw + * @description 绘制渲染。 + */ + draw() { + this.canvasLayer.draw(); + } +} +;// CONCATENATED MODULE: ./src/leaflet/overlay/MapVLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class MapVLayer + * @deprecatedclassinstance L.supermap.mapVLayer + * @classdesc MapV 图层。 + * @category Visualization MapV + * @extends {L.Layer} + * @param {Mapv.DataSet} dataSet - MapV 图层数据集。 + * @param {Object} mapVOptions - MapV 图层参数。 + * @param {Object} options - 参数。 + * @param {string} [options.attributionPrefix] - 版权信息前缀。 + * @param {string} [options.attribution='© 2018 百度 MapV'] - 版权信息。 + * @fires MapVLayer#loaded + * @usage + */ +var MapVLayer = external_L_default().Layer.extend({ + + options: { + attributionPrefix: null, + attribution: core_Attributions.MapV.attribution + }, + + initialize: function (dataSet, mapVOptions, options) { + options = options || {}; + this.dataSet = dataSet || {}; + this.mapVOptions = mapVOptions || {}; + this.render = this.render.bind(this); + external_L_default().Util.setOptions(this, options); + if (this.options.attributionPrefix) { + this.options.attribution = this.options.attributionPrefix + this.options.attribution; + } + + this.canvas = this._createCanvas(); + external_L_default().stamp(this); + }, + + /** + * @private + * @function MapVLayer.prototype.onAdd + * @description 添加地图图层。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { + this._map = map; + var overlayPane = this.getPane(); + var container = this.container = external_L_default().DomUtil.create("div", "leaflet-layer leaflet-zoom-animated", overlayPane); + container.appendChild(this.canvas); + var size = map.getSize(); + container.style.width = size.x + "px"; + container.style.height = size.y + "px"; + this.renderer = new MapVRenderer(map, this, this.dataSet, this.mapVOptions); + this.draw(); + /** + * @event MapVLayer#loaded + * @description 图层添加完成之后触发。 + */ + this.fire("loaded"); + }, + + // _hide: function () { + // this.canvas.style.display = 'none'; + // }, + + // _show: function () { + // this.canvas.style.display = 'block'; + // }, + + /** + * @private + * @function MapVLayer.prototype.onRemove + * @description 删除地图图层。 + */ + onRemove: function () { + external_L_default().DomUtil.remove(this.container); + this.renderer.destroy(); + }, + + /** + * @function MapVLayer.prototype.addData + * @description 添加数据。 + * @param {Object} data - 需要添加的数据。 + * @param {Object} options - 参数。 + */ + addData: function (data, options) { + this.renderer.addData(data, options); + }, + + /** + * @function MapVLayer.prototype.update + * @description 更新图层。 + * @param {Object} opt - 待更新的数据。 + * @param {Object} data - mapv 数据集。 + * @param {Object} options - 参数。 + */ + update: function (opt) { + this.renderer.update(opt); + }, + + /** + * @function MapVLayer.prototype.getData + * @description 获取数据。 + * @returns {Mapv.DataSet} mapv 数据集。 + */ + getData: function () { + if (this.renderer) { + this.dataSet = this.renderer.getData(); + } + return this.dataSet; + }, + + /** + * @function MapVLayer.prototype.removeData + * @description 删除数据。 + * @param {function} filter - 过滤条件。指定数据项后,返回值为 true,表示删除该元素;否则表示不删除。 + * @example + * filter=function(data){ + * if(data.id=="1"){ + * return true + * } + * return false; + * } + */ + removeData: function (filter) { + this.renderer && this.renderer.removeData(filter); + }, + + /** + * @function MapVLayer.prototype.clearData + * @description 清除数据。 + */ + clearData: function () { + this.renderer.clearData(); + }, + + /** + * @function MapVLayer.prototype.draw + * @description 绘制图层。 + */ + draw: function () { + return this._reset(); + }, + + /** + * @function MapVLayer.prototype.setZIndex + * @description 设置 canvas 层级。 + * @param {number} zIndex - canvas 层级。 + */ + setZIndex: function (zIndex) { + this.canvas.style.zIndex = zIndex; + }, + + /** + * @function MapVLayer.prototype.render + * @description 渲染。 + */ + render: function () { + this.renderer._canvasUpdate(); + }, + + /** + * @function MapVLayer.prototype.getCanvas + * @description 获取 canvas。 + * @returns {HTMLElement} 返回 mapV 图层包含的 canvas 对象。 + */ + getCanvas: function () { + return this.canvas; + }, + + /** + * @function MapVLayer.prototype.getContainer + * @description 获取容器。 + * @returns {HTMLElement} 返回包含 mapV 图层的 dom 对象。 + */ + getContainer: function () { + return this.container; + }, + + /** + * @function MapVLayer.prototype.getTopLeft + * @description 获取左上角坐标。 + * @returns {L.Bounds} 返回左上角坐标。 + */ + getTopLeft: function () { + var map = this._map; + var topLeft; + if (map) { + var bounds = map.getBounds(); + topLeft = bounds.getNorthWest(); + } + return topLeft; + + }, + + _createCanvas: function () { + var canvas = document.createElement('canvas'); + canvas.style.position = 'absolute'; + canvas.style.top = 0 + "px"; + canvas.style.left = 0 + "px"; + canvas.style.pointerEvents = "none"; + canvas.style.zIndex = this.options.zIndex || 600; + var global$2 = typeof window === 'undefined' ? {} : window; + var devicePixelRatio = this.devicePixelRatio = global$2.devicePixelRatio || 1; + if (!this.mapVOptions.context || this.mapVOptions.context === '2d') { + canvas.getContext('2d').scale(devicePixelRatio, devicePixelRatio); + } + return canvas; + }, + + + _resize: function () { + var canvas = this.canvas; + if (!canvas) { + return; + } + + var map = this._map; + var size = map.getSize(); + canvas.width = size.x; + canvas.height = size.y; + canvas.style.width = size.x + 'px'; + canvas.style.height = size.y + 'px'; + var bounds = map.getBounds(); + var topLeft = map.latLngToLayerPoint(bounds.getNorthWest()); + external_L_default().DomUtil.setPosition(canvas, topLeft); + + }, + + _reset: function () { + this._resize(); + this._render() + }, + redraw: function () { + this._resize(); + this._render() + }, + _render: function () { + this.render(); + } + +}); + +var mapVLayer = function (dataSet, mapVOptions, options) { + return new MapVLayer(dataSet, mapVOptions, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/dataflow/MapvRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * + * @class MapvRenderer + * @classdesc 数据流图层 MapV 渲染器。 + * @category iServer DataFlow + * @extends {MapVLayer} + * @param {string} url - 服务地址 + * @param {Object} options - 参数。 + * @param {Object} [options.geometry] - GeoJSON 几何对象。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @usage + */ +var MapvRenderer = MapVLayer.extend({ + + initialize: function (url, options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this.data = []; + this.mapVOptions = { + draw: 'simple' + }; + MapVLayer.prototype.initialize.call(this, new window.mapv.DataSet([]), this.mapVOptions, options) + this.idCache = {}; + this.url = url; + this._last = new Date(); + this._imageCache = {}; + }, + + onMessageSuccessed: function (msg) { + const geoID = msg.featureResult.properties['id']; + const geometry = msg.featureResult.geometry; + //设置每个点的经纬度和图片的样式 + const item = { + geometry: msg.featureResult.geometry + } + if (geometry.type === 'Point' && this.options.pointToLayer) { + //const pointStyle = this.options.pointToLayer ? this.options.pointToLayer(msg.featureResult, L.latLng(geometry.coordinates[1],geometry.coordinates[0])) : new L.marker(L.latLng(geometry.coordinates[1],geometry.coordinates[0])); + const pointStyle = this.options.pointToLayer(msg.featureResult, external_L_default().latLng(geometry.coordinates[1], geometry.coordinates[0])); + if (pointStyle instanceof (external_L_default()).Marker) { + this.mapVOptions.draw = 'icon'; + let icon = pointStyle.options.icon; + const imgUrl = icon._getIconUrl('icon'); + const imgWidth = icon.options.iconSize ? icon.options.iconSize[0] : null; + const imgHeight = icon.options.iconSize ? icon.options.iconSize[1] : null; + const iconKey = `${imgUrl}_${imgWidth}_${imgHeight}`; + let img = this._imageCache[iconKey]; + if (!img) { + img = icon.createIcon(); + this._imageCache[iconKey] = img; + img.onload = () => { + this.update({ + data: this.data, + options: this.mapVOptions + }); + } + + } + item.icon = img; + if (icon.options.iconSize || img.style.height) { + this.mapVOptions.offset = { + x: 0, + y: -(icon.options.iconSize[1] || img.style.height) / 2 + }; + } + if (this.options.deg) { + item.deg = this.options.deg + if (typeof item.deg === 'function') { + if(this.idCache[geoID]&&this.data[this.idCache[geoID]]){ + item.deg = item.deg(msg.featureResult, external_L_default().latLng(geometry.coordinates[1], geometry.coordinates[0]),this.data[this.idCache[geoID]]); + } + + } + } + } + if (pointStyle instanceof (external_L_default()).CircleMarker) { + this.mapVOptions.draw = 'simple'; + const sty = this._toMapvStyle(pointStyle); + for (const key in sty) { + if (sty.hasOwnProperty(key)) { + item[key] = sty[key]; + } + } + } + } else if (this.options.style) { + const sty = this._toMapvStyle(this.options.style(msg.featureResult)); + for (const key in sty) { + if (sty.hasOwnProperty(key)) { + item[key] = sty[key]; + } + } + } + + if (this.idCache[geoID] == undefined) { + this.data.push(item); + this.idCache[geoID] = this.data.length - 1; + } else { + this.data[this.idCache[geoID]] = item; + } + //绘制图层 + if (new Date() - this._last > 200) { + this._last = new Date(); + this.update({ + data: this.data, + options: this.mapVOptions + }); + } + }, + _toMapvStyle: function (options) { + const mapvOps = { + draw: 'simple' + }; + mapvOps.strokeStyle = options.color; + mapvOps.lineWidth = options.width; + mapvOps.globalAlpha = options.fillOpacity || options.opacity; + mapvOps.lineCap = options.lineCap; + mapvOps.lineJoin = options.lineJoin; + mapvOps.fillStyle = options.fillColor; + mapvOps.size = options.radius; + return mapvOps; + } + +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/dataflow/NormalRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class NormalRenderer + * @classdesc 数据流图层普通渲染器。 + * @category iServer DataFlow + * @extends {L.GeoJSON} + * @param {string} url - 服务地址 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} [options.geometry] - GeoJSON 几何对象。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @usage + */ +var NormalRenderer = external_L_default().GeoJSON.extend({ + + initialize: function (url, options) { + options = options || {}; + if (options.style && !options.pointToLayer) { + options.pointToLayer = function (geojson, latlng) { + return external_L_default().circleMarker(latlng, options.style()); + } + } + external_L_default().Util.setOptions(this, options); + this._layers = {}; + external_L_default().stamp(this); + this.url = url; + this.idCache = {}; + }, + + onMessageSuccessed: function (msg) { + const geojson = msg.featureResult; + const geoID = msg.featureResult.properties[this.options.idField]; + let layer = null; + if (geoID !== undefined && this.idCache[geoID]) { + layer = this.getLayer(this.idCache[geoID]); + this._updateLayerData(layer, geojson); + } else { + layer = external_L_default().GeoJSON.geometryToLayer(geojson, this.options); + layer.feature = external_L_default().GeoJSON.asFeature(geojson); + this.addLayer(layer); + if (geoID !== undefined) { + this.idCache[geoID] = this.getLayerId(layer); + } + } + if (this.options.onEachFeature) { + this.options.onEachFeature(geojson, layer); + } + }, + _updateLayerData: function (layer, geojson) { + if (geojson.properties) { + layer.feature.properties = geojson.properties; + } + var latlngs = []; + switch (geojson.geometry.type) { + case 'Point': + latlngs = external_L_default().GeoJSON.coordsToLatLng(geojson.geometry.coordinates); + layer.setLatLng(latlngs); + break; + case 'LineString': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0); + layer.setLatLngs(latlngs); + break; + case 'MultiLineString': + case 'Polygon': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1); + layer.setLatLngs(latlngs); + break; + case 'MultiPolygon': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2); + layer.setLatLngs(latlngs); + break; + } + } +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/DataFlowLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class DataFlowLayer + * @deprecatedclassinstance L.supermap.dataFlowLayer + * @classdesc 数据流图层源。订阅SuperMap iServer 数据流服务并上图。订阅得到的数据会根据 `options.idField` 自动更新。 + * @category iServer DataFlow + * @extends {L.LayerGroup} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Object} [options.render='normal'] - 绘制方式。可选值为'normal','mapv'。 + 'normal' 表示以 {( {@link L.LatLng}|{@link L.Polyline}|{@link L.Polygon}|{@link L.Marker} )} 方式绘制数据流。'mapv' 表示以 {@link MapVLayer} 方式绘制实时数据。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @param {function} [options.pointToLayer] - 定义点要素如何绘制在地图上。 + `function(geoJsonPoint, latlng) { + return L.marker(latlng); + }` + * @param {function} [options.style] - 定义点、线、面要素样式。参数为{@link L.Path-option}。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function|number} [options.deg] - 定义图标的旋转角度。`options.render` 为 `mapv` 时有效。
+ `function (feature,latlng) { + return feature.properties['rotate']; + }` + * @fires DataFlowLayer#subscribesucceeded + * @fires DataFlowLayer#subscribefailed + * @fires DataFlowLayer#setfilterparamsucceeded + * @fires DataFlowLayer#dataupdated + * @usage + */ + +var DataFlowLayer = external_L_default().LayerGroup.extend({ + + options: { + geometry: null, + prjCoordSys: null, + excludeField: null, + idField: "id", + render: 'normal' + }, + + initialize: function (url, options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this.url = url; + this._layers = {}; + this.dataService = new DataFlowService_DataFlowService(this.url, { + geometry: this.options.geometry, + prjCoordSys: this.options.prjCoordSys, + excludeField: this.options.excludeField + }) + + }, + /** + * @private + * @function DataFlowLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { // eslint-disable-line no-unused-vars + this.dataService.initSubscribe(); + /** + * @event DataFlowLayer#subscribesucceeded + * @description 初始化成功后触发。 + * @property {Object} e - 事件对象。 + */ + this.dataService.on('subscribeSocketConnected', (e) => this.fire("subscribesucceeded", e)); + + /** + * @event DataFlowLayer#subscribefailed + * @description 初始化失败后触发。 + * @property {Object} e - 事件对象。 + */ + this.dataService.on('subscribeSocketError', (e) => this.fire("subscribefailed", e)) + this.dataService.on('messageSucceeded', (msg) => this._onMessageSuccessed(msg)); + + /** + * @event DataFlowLayer#setfilterparamsucceeded + * @description 过滤参数设置成功后触发。 + * @property {Object} e - 事件对象。 + */ + this.dataService.on('setFilterParamSucceeded', (msg) => this.fire("setfilterparamsucceeded", msg)); + if (this.options.render === 'mapv') { + this.addLayer(new MapvRenderer(this.url, this.options)); + } else { + this.addLayer(new NormalRenderer(this.url, this.options)); + } + external_L_default().LayerGroup.prototype.onAdd.call(this, map); + }, + /** + * @private + * @function DataFlowLayer.prototype.onRemove + * @description 删除指定地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onRemove: function (map) { // eslint-disable-line no-unused-vars + external_L_default().LayerGroup.prototype.onRemove.call(this, map); + this.dataService && this.dataService.unSubscribe(); + }, + /** + * @function DataFlowLayer.prototype.setExcludeField + * @description 设置唯一字段。 + * @param {string} excludeField - 唯一字段。 + */ + setExcludeField: function (excludeField) { + this.dataService.setExcludeField(excludeField); + this.options.excludeField = excludeField; + return this; + }, + + /** + * @function DataFlowLayer.prototype.setGeometry + * @description 设置集合要素。 + * @param {GeoJSONObject} geometry - 待设置的 GeoJSON 几何要素对象。 + */ + setGeometry: function (geometry) { + this.dataService.setGeometry(geometry); + this.options.geometry = geometry; + return this; + }, + _onMessageSuccessed: function (msg) { + this.getLayers().map((layer) => { + if (layer.onMessageSuccessed) { + layer.onMessageSuccessed(msg); + /** + * @description 图层数据更新成功后触发。 + * @event DataFlowLayer#dataupdated + * @property {Object} layer - 更新数据成功的图层。 + * @property {Object} data - 更新的要素。 + */ + this.fire("dataupdated", { + layer: layer, + data: msg.featureResult + }); + } + return layer; + }) + } + +}); +var dataFlowLayer = function (url, options) { + return new DataFlowLayer(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/EChartsLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class EchartsLayer + * @deprecatedclassinstance L.supermap.echartsLayer + * @classdesc 百度 ECharts 图层类。 + * @category Visualization ECharts + * @extends {L.Layer} + * @param {Object} echartsOptions - 图表参数。 + * @param {Object} options - 参数。 + * @param {boolean} [options.loadWhileAnimating=false] - 是否在移动时实时绘制。 + * @param {string} [options.attribution='© 2018 百度 ECharts'] - 版权信息。 + * @usage + */ +const EchartsLayer = external_L_default().Layer.extend({ + + includes: [], + _echartsContainer: null, + _map: null, + _ec: null, + _echartsOptions: null, + + options: { + attribution: core_Attributions.ECharts.attribution, + loadWhileAnimating: false + }, + + initialize: function (echartsOptions, options) { + external_L_default().Util.setOptions(this, options); + this.setOption(echartsOptions); + }, + /** + * @function EchartsLayer.prototype.setOption + * @description 设置图表地图参数。 + * @param {Object} echartsOptions - 图表参数。 + * @param {string} lazyUpdate - 后台自动更新。 + * @param {boolean} [notMerge] - 是否合并参数。 + */ + setOption: function (echartsOptions, notMerge, lazyUpdate) { + const baseOption = echartsOptions.baseOption || echartsOptions; + baseOption.LeafletMap = baseOption.LeafletMap || { + roam: true + }; + baseOption.animation = baseOption.animation === true; + this._echartsOptions = echartsOptions; + this._ec && this._ec.setOption(echartsOptions, notMerge, lazyUpdate); + }, + getEcharts: function () { + return this._ec; + }, + _disableEchartsContainer: function () { + this._echartsContainer.style.visibility = "hidden"; + }, + _enableEchartsContainer: function () { + this._echartsContainer.style.visibility = "visible"; + }, + + /** + * @private + * @function EchartsLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { + this._map = map; + this._initEchartsContainer(); + this._ec = external_function_try_return_echarts_catch_e_return_default().init(this._echartsContainer); + this._ec.leafletMap= map; + const me = this; + + map.on("zoomstart", function () { + me._disableEchartsContainer(); + }); + !me.options.loadWhileAnimating && map.on("movestart", function () { + me._disableEchartsContainer(); + }); + external_function_try_return_echarts_catch_e_return_default().registerAction({ + type: 'LeafletMapLayout', + event: 'LeafletMapLayout', + update: 'updateLayout' + }, function (payload ) { // eslint-disable-line no-unused-vars + }); + external_function_try_return_echarts_catch_e_return_default().registerCoordinateSystem( + 'leaflet', LeafletMapCoordSys + ); + external_function_try_return_echarts_catch_e_return_default().extendComponentModel({ + type: 'LeafletMap', + getBMap: function () { + return this.__LeafletMap; + }, + defaultOption: { + roam: false + } + }); + external_function_try_return_echarts_catch_e_return_default().extendComponentView({ + type: 'LeafletMap', + render: function (LeafletMapModel, ecModel, api) { + let rendering = true; + let leafletMap = ecModel.scheduler.ecInstance.leafletMap; + const viewportRoot = api.getZr().painter.getViewportRoot(); + + const animated = leafletMap.options.zoomAnimation && (external_L_default()).Browser.any3d; + viewportRoot.className = ' leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide') + ' echarts-layer'; + + const originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + viewportRoot.style[originProp] = '50% 50%'; + + const coordSys = LeafletMapModel.coordinateSystem; + + const ecLayers = api.getZr().painter.getLayers(); + + const moveHandler = function () { + if (rendering) { + return; + } + const offset = me._map.containerPointToLayerPoint([0, 0]); + const mapOffset = [offset.x || 0, offset.y || 0]; + viewportRoot.style.left = mapOffset[0] + 'px'; + viewportRoot.style.top = mapOffset[1] + 'px'; + + if (!me.options.loadWhileAnimating) { + for (let item in ecLayers) { + if (!ecLayers.hasOwnProperty(item)) { + continue; + } + ecLayers[item] && clearContext(ecLayers[item].ctx); + } + me._enableEchartsContainer(); + } + + coordSys.setMapOffset(mapOffset); + LeafletMapModel.__mapOffset = mapOffset; + + api.dispatchAction({ + type: 'LeafletMapLayout' + }); + + + }; + + function clearContext(context) { + context && context.clearRect && context.clearRect(0, 0, context.canvas.width, context.canvas.height); + } + + function zoomEndHandler() { + if (rendering) { + return; + } + + api.dispatchAction({ + type: 'LeafletMapLayout' + }); + me._enableEchartsContainer(); + } + + if (me._oldMoveHandler) { + leafletMap.off(me.options.loadWhileAnimating ? 'move' : 'moveend', me._oldMoveHandler); + + } + if (me._oldZoomEndHandler) { + leafletMap.off('zoomend', me._oldZoomEndHandler); + + } + + leafletMap.on(me.options.loadWhileAnimating ? 'move' : 'moveend', moveHandler); + leafletMap.on('zoomend', zoomEndHandler); + me._oldMoveHandler = moveHandler; + me._oldZoomEndHandler = zoomEndHandler; + rendering = false; + } + }); + this._ec.setOption(this._echartsOptions); + }, + + onRemove: function () { + // 销毁echarts实例 + this._ec.clear(); + this._ec.dispose(); + delete this._ec; + external_L_default().DomUtil.remove(this._echartsContainer); + + if (this._oldZoomEndHandler) { + this._map.off("zoomend", this._oldZoomEndHandler); + this._oldZoomEndHandler = null; + } + if (this._oldMoveHandler) { + this._map.off(this.options.loadWhileAnimating ? 'move' : 'moveend', this._oldMoveHandler); + this._oldMoveHandler = null; + } + if (this._resizeHandler) { + this._map.off('resize', this._resizeHandler); + this._resizeHandler = null; + } + delete this._map; + }, + + _initEchartsContainer: function () { + const size = this._map.getSize(); + + const _div = document.createElement('div'); + _div.style.position = 'absolute'; + _div.style.height = size.y + 'px'; + _div.style.width = size.x + 'px'; + _div.style.zIndex = 10; + this._echartsContainer = _div; + + this.getPane().appendChild(this._echartsContainer); + const me = this; + + function _resizeHandler(e) { + let size = e.newSize; + me._echartsContainer.style.width = size.x + 'px'; + me._echartsContainer.style.height = size.y + 'px'; + me._ec.resize() + } + + this._map.on('resize', _resizeHandler); + this._resizeHandler = _resizeHandler + } + +}); + +/** + * @class LeafletMapCoordSys + * @private + * @classdesc 地图坐标系统类。 + * @param {L.Map} leafletMap - Leaflet Map 对象。 + */ +function LeafletMapCoordSys(leafletMap) { + this._LeafletMap = leafletMap; + this.dimensions = ['lng', 'lat']; + this._mapOffset = [0, 0]; +} + +LeafletMapCoordSys.prototype.dimensions = ['lng', 'lat']; + +LeafletMapCoordSys.prototype.setMapOffset = function (mapOffset) { + this._mapOffset = mapOffset +}; + +LeafletMapCoordSys.prototype.getBMap = function () { + return this._LeafletMap +}; + +LeafletMapCoordSys.prototype.prepareCustoms = function () { + const zrUtil = (external_function_try_return_echarts_catch_e_return_default()).util; + + const rect = this.getViewRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'leaflet', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: zrUtil.bind(this.dataToPoint, this), + size: zrUtil.bind(dataToCoordSize, this) + } + }; + + function dataToCoordSize(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return zrUtil.map([0, 1], function (dimIdx) { + const val = dataItem[dimIdx]; + const halfSize = dataSize[dimIdx] / 2; + const p1 = []; + const p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } +}; + +LeafletMapCoordSys.prototype.dataToPoint = function (data) { + //处理数据中的null值 + if (data[1] === null) { + data[1] = (external_L_default()).CRS.EPSG3857.projection.MAX_LATITUDE; + } + //平面坐标系不能这么处理 + //data[1] = this.fixLat(data[1]); + + const px = this._LeafletMap.latLngToLayerPoint([data[1], data[0]]); + + const mapOffset = this._mapOffset; + return [px.x - mapOffset[0], px.y - mapOffset[1]]; +}; + +LeafletMapCoordSys.prototype.fixLat = function (lat) { + if (lat >= 90) { + return 89.99999999999999; + } + if (lat <= -90) { + return -89.99999999999999; + } + return lat; +}; + +LeafletMapCoordSys.prototype.pointToData = function (pt) { + let mapOffset = this._mapOffset; + let point = this._LeafletMap.layerPointToLatLng([pt[0] + mapOffset[0], pt[1] + mapOffset[1]]); + return [point.lng, point.lat]; +}; + +LeafletMapCoordSys.prototype.getViewRect = function () { + const size = this._LeafletMap.getSize(); + return new (external_function_try_return_echarts_catch_e_return_default()).graphic.BoundingRect(0, 0, size.x, size.y); +}; + +LeafletMapCoordSys.prototype.getRoamTransform = function () { + return external_function_try_return_echarts_catch_e_return_default().matrix.create(); +}; +LeafletMapCoordSys.dimensions = LeafletMapCoordSys.prototype.dimensions; + +LeafletMapCoordSys.create = function (ecModel) { + let coordSys; + let leafletMap = ecModel.scheduler.ecInstance.leafletMap; + ecModel.eachComponent('LeafletMap', function (leafletMapModel) { + if (!coordSys) { + coordSys = new LeafletMapCoordSys(leafletMap); + } + leafletMapModel.coordinateSystem = coordSys; + leafletMapModel.coordinateSystem.setMapOffset(leafletMapModel.__mapOffset || [0, 0]); + }); + ecModel.eachSeries(function (seriesModel) { + if (!seriesModel.get('coordinateSystem') || seriesModel.get('coordinateSystem') === 'leaflet') { + if (!coordSys) { + coordSys = new LeafletMapCoordSys(leafletMap); + } + seriesModel.coordinateSystem = coordSys; + seriesModel.animation = seriesModel.animation === true; + } + }) +}; +const echartsLayer = function (echartsOptions, options) { + return new EchartsLayer(echartsOptions, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/core/Detector.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +class Detector { + static supportWebGL() { + return getContext('webgl'); + } + + static supportWebGL2() { + return getContext('webgl2'); + } + + static supportCanvas() { + return getContext('2d'); + } + + +} + +function getContext(context) { + var canvas = document.createElement('canvas'); + return canvas && canvas.getContext(context); +} +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CloverStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class CloverStyle + * @deprecatedclassinstance L.supermap.cloverStyle + * @classdesc 三叶草要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {number} [options.angle=60] - 三叶草每个扇叶的圆心角,单位弧度。 + * @param {number} [options.spaceAngle=0] - 扇叶间隔角度,通过计算获取。 + * @param {number} [options.count=3] - 扇叶数量。 + * @param {boolean} [options.stroke=true] - 是否描边。 + * @param {number} [options.strokeWidth=1] - 边框宽度。 + * @param {string} [options.color='#3388ff'] - 颜色。 + * @param {number} [options.weight=1] - 线宽。 + * @param {number} [options.opacity=1] - 透明度。 + * @param {string} [options.lineCap='round'] - 线帽形状。 + * @param {string} [options.lineJoin='round'] - 线条交汇边角形状。 + * @param {boolean} [options.fill=false] - 是否填充。 + * @param {string} [options.fillColor='#66ccff'] - 填充色。 + * @param {number} [options.fillOpacity=0.2] - 填充透明度。 + * @param {string} [options.fillRule='evenodd'] - 填充形状。 + * @param {number} [options.radius=10] - 半径。 + * @usage + */ +var CloverStyle = external_L_default().Class.extend({ + + options: { + radius: 10, + angele: 60, + spaceAngle: 0, + count: 3, + fill: false, + stroke: true, + color: '#3388ff', + weight: 1, + lineCap: 'round', + lineJoin: 'round', + fillColor: '#66ccff', + fillOpacity: 0.2, + fillRule: 'evenodd', + opacity: 1, + strokeWidth:1 + }, + + + initialize: function (options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + + + var strokeWidth = this.options.strokeWidth === undefined ? 1 : this.options.strokeWidth; + this.options.width = 2 * (this.options.radius + strokeWidth) + 1; + this._initStyle(); + }, + + /** + * @function CloverStyle.prototype.getStyle + * @description 获取画布。 + */ + getStyle: function () { + return this._canvas; + }, + + /** + * @function CloverStyle.prototype.drawSector + * @description 绘制扇形。 + * @param {CanvasRenderingContext2D} ctx - context 对象。 + * @param {number} x - 中心点 x。 + * @param {number} y - 中心点 y。 + * @param {number} r - 中心点 r。 + * @param {number} sAngle - 扇叶起始角度。 + * @param {number} eAngle - 扇叶终止角度。 + */ + drawSector: function (ctx, x, y, r, sAngle, eAngle) { + //角度转换 + sAngle = sAngle / 180 * Math.PI; + eAngle = eAngle / 180 * Math.PI; + ctx.moveTo(x, y); + ctx.lineTo(x + r * Math.cos(sAngle), y + r * Math.sin(sAngle)); + ctx.arc(x, y, r, sAngle, eAngle); + ctx.lineTo(x, y); + }, + + _initStyle: function () { + //起始角度 + var sAngle = 0; + var options = this.options; + var eAngle = options.angle; + options.spaceAngle = 360 / options.count - options.angle; + if (options.spaceAngle < 0) { + return; + } + this._ctx.beginPath(); + this.anchor = [options.width / 2, options.width / 2]; + for (var i = 0; i < options.count; i++) { + this.drawSector(this._ctx, this.anchor[0], this.anchor[1], options.radius, sAngle, eAngle); + sAngle = eAngle + options.spaceAngle; + eAngle = sAngle + options.angle; + } + this._fillStroke(); + }, + + _fillStroke: function () { + var options = this.options; + if (options.fill) { + this._ctx.globalAlpha = options.fillOpacity; + this._ctx.fillStyle = options.fillColor || options.color; + this._ctx.fill(options.fillRule || 'evenodd'); + } + if (options.stroke && options.weight !== 0) { + this._ctx.globalAlpha = options.opacity; + this._ctx.lineWidth = options.weight; + this._ctx.strokeStyle = options.color; + this._ctx.lineCap = options.lineCap; + this._ctx.lineJoin = options.lineJoin; + this._ctx.stroke(); + } + } +}); + +var cloverStyle = function (options) { + return new CloverStyle(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CircleStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class CircleStyle + * @deprecatedclassinstance L.supermap.circleStyle + * @classdesc 圆形要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {boolean} [options.stroke=true] - 是否描边。 + * @param {string} [options.color='#3388ff'] - 颜色。 + * @param {number} [options.weight=1] - 线宽。 + * @param {number} [options.opacity=1] - 透明度。 + * @param {string} [options.lineCap='round'] - 线帽形状。 + * @param {string} [options.lineJoin='round'] - 线条交汇边角形状。 + * @param {boolean} [options.fill=false] - 是否填充。 + * @param {string} [options.fillColor] - 填充色。 + * @param {number} [options.fillOpacity=0.2] - 填充透明度。 + * @param {string} [options.fillRule='evenodd'] - 填充形状。 + * @param {number} [options.radius=3] - 半径。 + * @usage + */ +var CircleStyle = external_L_default().Class.extend({ + + options: { + stroke: true, + color: '#3388ff', + weight: 1, + opacity: 1, + lineCap: 'round', + lineJoin: 'round', + fill: false, + fillColor: null, + fillOpacity: 0.2, + fillRule: 'evenodd', + radius: 3 + }, + + initialize: function (options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + this._initStyle(); + }, + + /** + * @deprecated + * @function CircleStyle.prototype.getCanvas + * @description 获取画布,已弃用该设置,请使用 getStyle 接口。 + */ + getCanvas: function () { + return this._canvas; + }, + + /** + * @function CircleStyle.prototype.getStyle + * @description 获取画布。 + */ + getStyle: function () { + return this._canvas; + }, + + _initStyle: function () { + this._ctx.beginPath(); + this._ctx.arc(this._canvas.width / 2, this._canvas.height / 2, this.options.radius, 0, Math.PI * 2); + this._fillStroke(); + }, + + _fillStroke: function () { + var options = this.options; + if (options.fill) { + this._ctx.globalAlpha = options.fillOpacity; + this._ctx.fillStyle = options.fillColor || options.color; + this._ctx.fill(options.fillRule || 'evenodd'); + } + if (options.stroke && options.weight !== 0) { + this._ctx.globalAlpha = options.opacity; + this._ctx.lineWidth = options.weight; + this._ctx.strokeStyle = options.color; + this._ctx.lineCap = options.lineCap; + this._ctx.lineJoin = options.lineJoin; + this._ctx.stroke(); + } + } + +}); + +var circleStyle = function (options) { + return new CircleStyle(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/ImageStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ImageStyle + * @deprecatedclassinstance L.supermap.imageStyle + * @classdesc 自定义图形要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {HTMLImageElement} options.img - image 对象。 + * @param {Array.} [options.origin=[0.0]] - 中心点。 + * @param {Array} [options.anchor] - 偏移量。 + * @param {Array} [options.size] - 图形大小,即高度和宽度[width,height]。 + * @param {Array} [options.radius] - 半径。 + * @param {Array} [options.weight] - 宽度。 + * @usage + */ +var ImageStyle = external_L_default().Class.extend({ + + options: { + img: null, + origin: [0, 0], + anchor: null, + size: null + }, + + initialize: function (options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + }, + + /** + * @function ImageStyle.prototype.getStyle + * @description 获取样式。 + */ + getStyle: function () { + return this.options; + } + +}); + +var imageStyle = function (options) { + return new ImageStyle(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CanvasRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +const emptyFunc = (external_L_default()).Util.falseFn; +var GraphicCanvasRenderer = external_L_default().Class.extend({ + initialize: function (layer, options) { + this.layer = layer; + options = options || {}; + external_L_default().Util.setOptions(this, options); + }, + + /** + * @private + * @function GraphicCanvasRenderer.prototype.getRenderer + * @description 返回渲染器,提供图层后续的数据增删改。 + * @returns {L.Canvas} + */ + getRenderer: function () { + return this.options.renderer; + }, + + /** + * @private + * @function GraphicCanvasRenderer.prototype.update + * @description 更新图层,数据或者样式改变后调用。 + */ + update: function () { + this.getRenderer()._clear(); + this.getRenderer()._draw(); + }, + _getGraphicAtPoint: function (p) { + const layer = this.layer; + const map = layer._map; + + let graphics = layer._getGraphicsInBounds(); + for (let i = graphics.length - 1; i >= 0; i--) { + let p1, p2, bounds; + const center = map.latLngToLayerPoint(graphics[i].getLatLng()); + let style = graphics[i].getStyle(); + if (!style && this.defaultStyle) { + style = this.defaultStyle; + } + if (style.img) { + let imgWidth = style.img.width; + let imgHeight = style.img.height; + if (style.size && style.size[0] && style.size[1]) { + imgWidth = style.size[0]; + imgHeight = style.size[1]; + } + const anchor = style.anchor || [imgWidth / 2, imgHeight / 2]; + p1 = external_L_default().point(center.x - anchor[0], center.y - anchor[1]); + p2 = external_L_default().point(p1.x + imgWidth, p1.y + imgHeight); + } else { + p1 = external_L_default().point(center.x - style.width / 2, center.y - style.height / 2); + p2 = external_L_default().point(center.x + style.width / 2, center.y + style.height / 2); + } + bounds = external_L_default().bounds(p1, p2); + if (bounds.contains(p)) { + return graphics[i]; + } + } + return null; + }, + containsPoint: function (p) { + return !!this._getGraphicAtPoint(p); + }, + _handleClick: function (evt) { + evt.target = null; + const layer = this.layer; + const map = layer._map; + const graphic = this._getGraphicAtPoint(map.latLngToLayerPoint(evt.latlng)); + if (graphic) { + this.layer._renderer._ctx.canvas.style.cursor = 'pointer'; + evt.target = graphic; + if (evt.type === 'click' && layer.options.onClick) { + layer.options.onClick.call(layer, graphic, evt); + } + return; + } + this.layer._renderer._ctx.canvas.style.cursor = 'auto'; + }, + + //跟GraphicWebGLRenderer保持一致 + _clearBuffer: emptyFunc +}); + +external_L_default().Canvas.include({ + drawGraphics: function (graphics, defaultStyle) { + var me = this; + if (!me._drawing) { + return; + } + //this._ctx.clearRect(0, 0, this._ctx.canvas.width, me._ctx.canvas.height); + graphics.forEach(function (graphic) { + var style = graphic.getStyle(); + if (!style && defaultStyle) { + style = defaultStyle; + } + if (style.img) { + //绘制图片 + me._drawImage.call(me, me._ctx, style, graphic.getLatLng()); + } else { + //绘制canvas + me._drawCanvas.call(me, me._ctx, style, graphic.getLatLng()); + } + }); + }, + + _drawCanvas: function (ctx, style, latLng) { + var canvas = style; + var pt = this._map.latLngToLayerPoint(latLng); + var p0 = pt.x - canvas.width / 2; + var p1 = pt.y - canvas.height / 2; + var width = canvas.width; + var height = canvas.height; + + ctx.drawImage(canvas, p0, p1, width, height); + }, + + _drawImage: function (ctx, style, latLng) { + //设置图片的大小 + var width, height; + if (style.size) { + var size = style.size; + width = size[0]; + height = size[1]; + } else { + width = style.img.width; + height = style.img.height; + } + //设置偏移 + var point = this._coordinateToPoint(latLng); + + var pt = external_L_default().point(point), + ac = external_L_default().point(style.anchor || [width / 2, height / 2]); + point = [pt.x - ac.x, pt.y - ac.y]; + + //参数分别为:图片,图片裁剪下x,y位置,裁剪长宽,放置在画布的位置x,y, 占取画布长宽 + //ctx.drawImage(style.img, 0, 0, width, height, point[0], point[1], width, height); + ctx.drawImage(style.img, point[0], point[1], width, height); + }, + + _coordinateToPoint: function (coordinate) { + if (!this._map) { + return coordinate; + } + var latLng = coordinate; + if (external_L_default().Util.isArray(coordinate)) { + latLng = external_L_default().latLng(coordinate[0], coordinate[1]); + } else if (coordinate instanceof (external_L_default()).LatLng) { + latLng = external_L_default().latLng(coordinate.lat, coordinate.lng); + } + var point = this._map.latLngToLayerPoint(latLng); + return [point.x, point.y]; + } +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/WebGLRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +const WebGLRenderer_emptyFunc = (external_L_default()).Util.falseFn; +/** + * @private + * @class GraphicWebGLRenderer + * @classdesc 高效率点图层 webgl 渲染器。 + * @category Visualization Graphic + * @extends {L.Layer} + * @param {Array.} layer - 高效率点图层。 + * @param {Object} options - 参数。 + * @param {number} options.width - 地图宽度。 + * @param {number} options.height - 地图高度。 + * @param {HTMLElement} options.container - 放置渲染器的父元素。 + * @param {Array.} [options.color=[0, 0, 0, 255]] - 颜色,目前只支持 rgba 数组。 + * @param {number} [options.radius=10] - 半径。 + * @param {number} [options.opacity=0.8] - 不透明度。 + * @param {Array} [options.highlightColor] - 高亮颜色,目前只支持 rgba 数组。 + * @param {number} [options.radiusScale=1] - 点放大倍数。 + * @param {number} [options.radiusMinPixels=0] - 半径最小值,单位为像素。 + * @param {number} [options.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - 半径最大值,单位为像素。 + * @param {number} [options.strokeWidth=1] - 边框大小。 + * @param {boolean} [options.outline=false] - 是否显示边框。 + * @param {function} [options.onClick] - 点击事件。 + * @param {function} [options.onHover] - 悬停事件。 + + */ +const CSS_TRANSFORM = (function () { + let div = document.createElement('div'); + let props = [ + 'transform', + 'WebkitTransform', + 'MozTransform', + 'OTransform', + 'msTransform' + ]; + + for (let i = 0; i < props.length; i++) { + let prop = props[i]; + if (div.style[prop] !== undefined) { + return prop; + } + } + return props[0]; +})(); +var GraphicWebGLRenderer = external_L_default().Class.extend({ + initialize: function (layer, options) { + this.layer = layer; + let opt = options || {}; + external_L_default().Util.setOptions(this, opt); + this.options.radius = this._pixelToMeter(this.options.radius); + this._initContainer(); + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.getRenderer + * @description 返回渲染器,可对图层数据增加、删除和修改。 + * @returns {GraphicWebGLRenderer} + */ + getRenderer: function () { + return this; + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.update + * @description 更新图层。 + */ + update: function (graphics) { + + if (graphics && graphics.length > -1) { + this._data = graphics; + } + this._renderLayer.setChangeFlags({ + dataChanged: true, + propsChanged: true, + viewportChanged: true, + updateTriggersChanged: true + }); + + this._refreshData(); + let state = this._getLayerState(); + state.data = this._data || []; + this._layerDefaultStyleCache = null; + this._renderLayer.setNeedsRedraw(true); + this._renderLayer.setState(state); + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.drawGraphics + * @description 绘制点要素。 + */ + drawGraphics: function (graphics) { + this._clearBuffer(); + let size = this.layer._map.getSize(); + if (this._container.width !== size.x) { + this._container.width = size.x; + } + if (this._container.height !== size.y) { + this._container.height = size.y; + } + let mapPane = this.layer._map.getPanes().mapPane; + let point = mapPane._leaflet_pos; + + this._container.style[CSS_TRANSFORM] = 'translate(' + + -Math.round(point.x) + 'px,' + + -Math.round(point.y) + 'px)'; + + this._data = graphics || []; + if (!this._renderLayer) { + this._createInnerRender(); + } + this._draw(); + }, + + + _initContainer: function () { + this._container = this._createCanvas(this.options.width, this.options.height); + this._layerContainer = this.options.container; + this._wrapper = external_L_default().DomUtil.create('div', "deck-wrapper", this._layerContainer); + this._wrapper.appendChild(this._container); + }, + + _createCanvas: function (width, height) { + //leaflet-layer 对应的css会自动设置position + let canvas = external_L_default().DomUtil.create('canvas', 'graphicLayer leaflet-layer leaflet-zoom-hide'); + canvas.oncontextmenu = (external_L_default()).Util.falseFn; + canvas.width = width; + canvas.height = height; + canvas.style.width = width + "px"; + canvas.style.height = height + "px"; + return canvas; + }, + _pixelToMeter: function (pixel) { + const bounds = this.layer._map.getBounds(); + const latlngRes = (bounds.getEast() - bounds.getWest()) / this.layer._map.getSize().x + const meterRes = latlngRes * (Math.PI * 6378137 / 180); + return pixel * meterRes; + }, + _createInnerRender: function () { + let me = this; + let state = this._getLayerState(); + let { + color, + radius, + opacity, + highlightColor, + radiusScale, + radiusMinPixels, + radiusMaxPixels, + strokeWidth, + outline + } = state; + let innerLayerOptions = { + id: 'scatter-plot', + data: me._data, + pickable: Boolean(this.options.onClick) || Boolean(this.options.onHover), + autoHighlight: true, + color: color, + opacity: opacity, + radius: radius, + radiusScale: radiusScale, + highlightColor: highlightColor, + radiusMinPixels: radiusMinPixels, + radiusMaxPixels: radiusMaxPixels, + strokeWidth: strokeWidth, + coordinateSystem:this._isWGS84()?window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT, + isGeographicCoordinateSystem: this._isWGS84(), + outline: outline, + getPosition: function (point) { + if (!point) { + return [0, 0, 0]; + } + let lngLat = point.getLatLng(); + return lngLat && [lngLat.lng, lngLat.lat, 0]; + }, + getColor: function (point) { + let defaultStyle = me._getLayerDefaultStyle(); + let style = point && point.options; + return style && style.color || defaultStyle.color + }, + getRadius: function (point) { + let defaultStyle = me._getLayerDefaultStyle(); + let style = point && point.getStyle(); + return style && style.radius || defaultStyle.radius + }, + updateTriggers: { + getColor: [color], + getRadius: [radius] + } + }; + let _self = this; + if (this.options.onClick) { + innerLayerOptions.onClick = function () { + _self._container.style.cursor = "pointer"; + _self.options.onClick.apply(_self, arguments) + }; + } + if (this.options.onHover) { + innerLayerOptions.onHover = function () { + _self._container.style.cursor = "pointer"; + _self.options.onHover.apply(_self, arguments) + }; + } + me._renderLayer = new window.DeckGL.ScatterplotLayer(innerLayerOptions); + }, + + _getLayerDefaultStyle: function () { + if (this._layerDefaultStyleCache) { + return this._layerDefaultStyleCache; + } + let { + color, + opacity, + radius, + radiusScale, + radiusMinPixels, + radiusMaxPixels, + strokeWidth, + outline + } = this.layer.options; + radius = this._pixelToMeter(radius); + this._layerDefaultStyleCache = { + color, + opacity, + radius, + radiusScale, + radiusMinPixels, + radiusMaxPixels, + strokeWidth, + outline + } + return this._layerDefaultStyleCache + + }, + + _getLayerState: function () { + let state = this.layer.getState(); + state.zoom = state.zoom - 1; + return state; + }, + + _draw: function () { + let state = this._getLayerState(); + this._refreshData(); + state.data = this._data || []; + let deckOptions = {}; + + for (let key in state) { + deckOptions[key] = state[key]; + } + this._layerDefaultStyleCache = null; + this._renderLayer.setNeedsRedraw(true); + deckOptions.layers = [this._renderLayer]; + deckOptions.canvas = this._container; + deckOptions.onBeforeRender = this._onBeforeRender.bind(this); + deckOptions.onAfterRender = this._onAfterRender.bind(this); + deckOptions.coordinateSystem = this._isWGS84()? window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT; + deckOptions.isGeographicCoordinateSystem = this._isWGS84(); + if (!this.deckGL) { + this.deckGL = new window.DeckGL.experimental.DeckGLJS(deckOptions); + } else { + this.deckGL.setProps(deckOptions); + } + }, + + _clearBuffer: function () { + if (this.deckGL) { + let lm = this.deckGL.layerManager; + lm && lm.context.gl.clear(lm.context.gl.COLOR_BUFFER_BIT); + } + return this; + }, + + _refreshData: function () { + let graphics = this._data || []; + let sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); + //this.layer.props.data不能被重新赋值,只能在原数组上进行操作 + if (!this._renderLayer.props.data) { + this._renderLayer.props.data = []; + } + this._renderLayer.props.data.length = 0; + for (let i = 0; i < sGraphics.length; i++) { + this._renderLayer.props.data.push(sGraphics[i]); + } + this._data = this._renderLayer.props.data; + }, + + _handleClick: WebGLRenderer_emptyFunc, + + //deck渲染开始前调用,可以重写 + _onBeforeRender: WebGLRenderer_emptyFunc, + + //deck渲染结束后调用,可以重写 + _onAfterRender: WebGLRenderer_emptyFunc, + + //以下为leaflet再带的renderer的方法,为了保持接口正常调用,故增加这几个方法 + _removePath: function () { + this._wrapper.parentElement.removeChild(this._wrapper); + this._container = null; + this._wrapper = null; + return this; + }, + _initPath: WebGLRenderer_emptyFunc, + _addPath: WebGLRenderer_emptyFunc, + containsPoint: WebGLRenderer_emptyFunc, + _isWGS84(){ + return this.layer._map.options.crs.code === "EPSG:4326"; + } + +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/GraphicLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +const Renderer = ['canvas', 'webgl']; + +const defaultProps = { + color: [0, 0, 0, 255], + opacity: 0.8, + radius: 10, + radiusScale: 1, + radiusMinPixels: 0, + radiusMaxPixels: Number.MAX_SAFE_INTEGER, + strokeWidth: 1, + outline: false +}; +const BASE_RESOLUTIONS = { + 'EPSG:4326': 360.0 / 256, + 'EPSG:3857': (20037508.34279 * 2) / 256 +}; +const DEFAULT_ZOOM_OFFSET = { + 'EPSG:4326': 1, + 'EPSG:3857': 0 +}; + +/** + * @class GraphicLayer + * @deprecatedclassinstance L.supermap.graphicLayer + * @classdesc 高效率点图层类。 + * @category Visualization Graphic + * @extends {L.Path} + * @param {Array.} graphics - 要素对象。 + * @param {Object} options - 参数。 + * @param {string} [options.render='canvas'] - 指定使用的渲染器。可选值:'webgl','canvas'( webgl 渲染目前只支持散点)。 + * @param {Array.} [options.color=[0, 0, 0, 255]] - 要素颜色。 + * @param {Array.} [options.highlightColor] - webgl 渲染时要素高亮颜色。 + * @param {number} [options.opacity=0.8] - 要素透明度,。当 {@link Graphic} 的 style 参数传入设置了 fillOpacity 或 opacity 的 {@link CircleStyle} 或 {@link CloverStyle},此参数无效。{@link Graphic} 的 style 传入 {@link ImageStyle} 后不支持此参数。 + * @param {number} [options.radius=10] - 要素半径,单位为像素。当 {@link Graphic} 的 style 参数传入了 radius,此参数无效。 + * @param {number} [options.radiusScale=1] - webgl 渲染时的要素放大倍数。 + * @param {number} [options.radiusMinPixels=0] - webgl 渲染时的要素半径最小值,单位为像素。 + * @param {number} [options.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - webgl 渲染时的要素半径最大值,单位为像素。 + * @param {number} [options.strokeWidth=1] - 边框大小。当 {@link Graphic} 的 style 参数传入了 weight,此参数无效。 + * @param {boolean} [options.outline=false] - 是否显示边框。当 {@link Graphic} 的 style 参数传入设置了 stroke 的 {@link CircleStyle} 或 {@link CloverStyle},此参数无效。 + * @param {function} [options.onClick] - 图层鼠标点击响应事件(支持 webgl、canvas 渲染)。 + * @param {function} [options.onHover] - 图层鼠标悬停响应事件(只支持 webgl 渲染)。 + * @usage + */ +var GraphicLayer = external_L_default().Path.extend({ + initialize: function (graphics, options) { + this.graphics = [].concat(graphics); + let opt = options || {}; + // 由于是canvas实现所以不能更改pane + opt.pane = 'overlayPane'; + external_L_default().Util.setOptions(this, opt); + //因为跟基类的renderer冲突,所以采用render这个名字 + this.options.render = this.options.render || Renderer[0]; + //浏览器支持webgl并且指定使用webgl渲染才使用webgl渲染 + if (!Detector.supportWebGL2()) { + this.options.render = Renderer[0]; + } + if (this.options.interactive) { + this.on('click mousemove dblclick mousedown mouseup mouseout contextmenu', this._handleClick, this); + } + }, + + /** + * @private + * @function GraphicLayer.prototype.getEvents + * @description 获取事件。 + * @returns {Object} 返回该图层支持的事件对象。 + */ + getEvents: function () { + const events = { + resize: this._resize.bind(this), + moveend: this._moveEnd.bind(this) + }; + return events; + }, + + /** + * @private + * @function GraphicLayer.prototype.onAdd + * @description 添加图形。 + */ + onAdd: function (map) { + this._map = map; + this._crs = map.options.crs; + this.defaultStyle = this._getDefaultStyle(this.options); + this._renderer = this._createRenderer(); + this._container = this._renderer._container; + // this.addInteractiveTarget(this._container); + external_L_default().Path.prototype.onAdd.call(this); + }, + + /** + * @private + * @override + * @function GraphicLayer.prototype.onRemove + * @description 移除图层。 + */ + onRemove: function () { + this.off('click mousemove dblclick mousedown mouseup contextmenu', this._handleClick, this); + this._renderer._removePath(this); + }, + + /** + * @function GraphicLayer.prototype.setGraphics + * @description 设置绘制的点要素数据,会覆盖之前的所有要素。 + * @param {Array.} graphics - 点要素对象数组。 + */ + setGraphics: function (graphics) { + this.graphics = this.graphics || []; + this.graphics.length = 0; + let sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); + this.graphics = [].concat(sGraphics); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.addGraphics + * @description 追加点要素,不会覆盖之前的要素。 + * @param {Array.} graphics - 点要素对象数组。 + */ + addGraphics: function (graphics) { + this.graphics = this.graphics || []; + let sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); + this.graphics = this.graphics.concat(sGraphics); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.getGraphicBy + * @description 指定属性名和属性值,获取第一个匹配的要素数组。 + * @param {string} property - 属性名称。 + * @param {string} value - 属性值。 + * @returns {Graphic} 返回匹配的 graphic 。 + */ + getGraphicBy(property, value) { + let graphic = null; + for (let index in this.graphics) { + if (this.graphics[index][property] === value) { + graphic = this.graphics[index]; + break; + } + } + return graphic; + }, + + /** + * @function GraphicLayer.prototype.getGraphicById + * @description 获取指定 id 的矢量要素。 + * @param {string} graphicId - 矢量要素的属性 id。 + * @returns {Graphic} 返回匹配的 graphic。 + */ + getGraphicById(graphicId) { + return this.getGraphicBy('id', graphicId); + }, + + /** + * @function GraphicLayer.prototype.getGraphicsByAttribute + * @description 指定属性名和属性值,获取所有匹配的要素数组。 + * @param {string} attrName - 属性名称。 + * @param {string} attrValue - 属性值。 + * @returns {Array.} 返回匹配的 graphic 数组。 + */ + getGraphicsByAttribute(attrName, attrValue) { + var graphic, + foundgraphics = []; + for (let index in this.graphics) { + graphic = this.graphics[index]; + if (graphic && graphic.attributes) { + if (graphic.attributes[attrName] === attrValue) { + foundgraphics.push(graphic); + } + } + } + return foundgraphics; + }, + + /** + * @function GraphicLayer.prototype.removeGraphics + * @description 删除要素数组,默认删除所有要素。 + * @param {Array.} [graphics=null] - 删除的 graphics 数组。 + */ + removeGraphics(graphics = null) { + //当 graphics 为 null 、为空数组,或 === this.graphics,则清除所有要素 + if (!graphics || graphics.length === 0 || graphics === this.graphics) { + this.graphics.length = 0; + this.update(); + return; + } + if (!Util.isArray(graphics)) { + graphics = [graphics]; + } + + for (let i = graphics.length - 1; i >= 0; i--) { + let graphic = graphics[i]; + + //如果我们传入的grapchic在graphics数组中没有的话,则不进行删除, + //并将其放入未删除的数组中。 + let findex = Util.indexOf(this.graphics, graphic); + + if (findex === -1) { + continue; + } + this.graphics.splice(findex, 1); + } + + //删除完成后重新设置 setGraphics,以更新 + this.update(); + }, + + /** + * @function GraphicLayer.prototype.setStyle + * @description 设置图层要素整体样式。 + * @param {Object} styleOptions - 样式对象。 + * @param {Array.} [styleOptions.color=[0, 0, 0, 255]] - 点颜色。 + * @param {number} [styleOptions.radius=10] - 点半径。 + * @param {number} [styleOptions.opacity=0.8] - 不透明度。 + * @param {Array} [styleOptions.highlightColor] - 高亮颜色,目前只支持 rgba 数组。 + * @param {number} [styleOptions.radiusScale=1] - 点放大倍数。 + * @param {number} [styleOptions.radiusMinPixels=0] - 半径最小值,单位为像素。 + * @param {number} [styleOptions.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - 半径最大值,单位为像素。 + * @param {number} [styleOptions.strokeWidth=1] - 边框大小。 + * @param {boolean} [styleOptions.outline=false] - 是否显示边框。 + */ + setStyle: function (styleOptions) { + let _opt = this.options; + let styleOpt = { + color: _opt.color, + radius: _opt.radius, + opacity: _opt.opacity, + highlightColor: _opt.highlightColor, + radiusScale: _opt.radiusScale, + radiusMinPixels: _opt.radiusMinPixels, + radiusMaxPixels: _opt.radiusMaxPixels, + strokeWidth: _opt.strokeWidth, + outline: _opt.outline + }; + this.options = external_L_default().Util.extend(this.options, styleOpt, styleOptions); + this.defaultStyle = this._getDefaultStyle(this.options); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.update + * @description 更新图层,数据或者样式改变后调用。 + */ + update: function () { + this._layerRenderer.update(this.graphics); + }, + + /** + * @function GraphicLayer.prototype.clear + * @description 释放图层资源。 + */ + clear: function () { + this.removeGraphics(); + }, + + /** + * @function GraphicLayer.prototype.getRenderer + * @description 获取渲染器。 + * @returns {Object} 内部渲染器。 + */ + getRenderer: function () { + return this._renderer; + }, + + /** + * @function GraphicLayer.prototype.getState + * @description 获取当前地图和图层状态。 + * @returns {Object} 地图和图层状态,包含地图状态信息和本图层相关状态。 + */ + getState: function () { + let map = this._map; + let width = map.getSize().x; + let height = map.getSize().y; + + let center = map.getCenter(); + let longitude = center.lng; + let latitude = center.lat; + let zoomOffset = DEFAULT_ZOOM_OFFSET[this._crs.code] || 0; + if(BASE_RESOLUTIONS[this._crs.code] && this._crs.resolutions && this._crs.resolutions.length > 0 ){ + zoomOffset = Math.round(Math.log2(BASE_RESOLUTIONS[this._crs.code]/this._crs.resolutions[0])) + } + let zoom = map.getZoom() + zoomOffset; + let maxZoom = map.getMaxZoom() + zoomOffset; + + let mapViewport = { + longitude: longitude, + latitude: latitude, + zoom: zoom, + maxZoom: maxZoom, + pitch: 0, + bearing: 0 + }; + let state = {}; + for (let key in mapViewport) { + state[key] = mapViewport[key]; + } + state.width = width; + state.height = height; + let options = this.options; + state.color = options.color; + state.radius = options.radius; + state.opacity = options.opacity; + state.highlightColor = options.highlightColor; + state.radiusScale = options.radiusScale; + state.radiusMinPixels = options.radiusMinPixels; + state.radiusMaxPixels = options.radiusMaxPixels; + state.strokeWidth = options.strokeWidth; + state.outline = options.outline; + return state; + }, + + _resize: function () { + let size = this._map.getSize(); + this._container.width = size.x; + this._container.height = size.y; + this._container.style.width = size.x + 'px'; + this._container.style.height = size.y + 'px'; + + let mapOffset = this._map.containerPointToLayerPoint([0, 0]); + external_L_default().DomUtil.setPosition(this._container, mapOffset); + this._update(); + }, + _moveEnd: function () { + if (this._layerRenderer instanceof GraphicWebGLRenderer) { + this._update(); + } + }, + //使用canvas渲染或webgl渲染 + _createRenderer: function () { + let map = this._map; + let width = map.getSize().x; + let height = map.getSize().y; + let _renderer; + if (this.options.render === Renderer[0]) { + _renderer = new GraphicCanvasRenderer(this, { + width: width, + height: height, + renderer: map.getRenderer(this) + }); + } else { + let optDefault = external_L_default().Util.setOptions({}, defaultProps); + let opt = external_L_default().Util.setOptions( + { + options: optDefault + }, + this.options + ); + opt = external_L_default().Util.setOptions(this, opt); + opt.container = map.getPane('overlayPane'); + opt.width = width; + opt.height = height; + + _renderer = new GraphicWebGLRenderer(this, opt); + } + _renderer.defaultStyle = this.defaultStyle; + this._layerRenderer = _renderer; + return this._layerRenderer.getRenderer(); + }, + + /** + * @private + * @override + */ + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + /** + * @private + * @override + */ + _updatePath: function () { + let graphics = this._getGraphicsInBounds(); + this._renderer.drawGraphics(graphics, this.defaultStyle); + }, + + /** + * @private + * @override + */ + _project: function () { + let me = this; + me._getGraphicsInBounds().map(function (graphic) { + let point = me._map.latLngToLayerPoint(graphic.getLatLng()); + let w = me._clickTolerance(); + let p = [graphic._anchor + w, graphic._anchor + w]; + graphic._pxBounds = new (external_L_default()).Bounds(point.subtract(p), point.add(p)); + return graphic; + }); + me._pxBounds = external_L_default().bounds(external_L_default().point(0, 0), external_L_default().point(this._container.width, this._container.height)); + }, + _getDefaultStyle: function (options) { + const target = {}; + if (options.color) { + target.fill = true; + const color = this.toRGBA(options.color); + target.color = color; + target.fillColor = color; + } + if (options.opacity) { + target.opacity = options.opacity; + target.fillOpacity = options.opacity; + } + if (options.radius) { + target.radius = options.radius; + } + if (options.strokeWidth) { + target.weight = options.strokeWidth; + } + if (options.outline) { + target.stroke = options.outline; + } + return new CircleStyle(target).getStyle(); + }, + toRGBA(colorArray) { + return `rgba(${colorArray[0]},${colorArray[1]},${colorArray[2]},${(colorArray[3] || 255) / 255})`; + }, + _getGraphicsInBounds: function () { + let me = this; + let graphicsInBounds = []; + let viewBounds = me._map.getBounds(); + this.graphics.map(function (graphic) { + if (viewBounds.contains(graphic.getLatLng())) { + graphicsInBounds.push(graphic); + } + return graphic; + }); + return graphicsInBounds; + }, + + _handleClick: function (evt) { + this._layerRenderer._handleClick(evt); + }, + /** + * @private + * @override + */ + beforeAdd: (external_L_default()).Util.falseFn, + + /** + * @private + * @override + */ + _containsPoint: function (p) { + return this._layerRenderer.containsPoint(p); + } +}); + +let graphicLayer = function (graphics, options) { + return new GraphicLayer(graphics, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/GraphThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class GraphThemeLayer + * @deprecatedclassinstance L.supermap.graphThemeLayer + * @category Visualization Theme + * @classdesc 统计专题图图层。统计专题图通过为每个要素绘制统计图表来反映其对应的专题值的大小。它可同时表示多个字段属性信息,在区域本身与各区域之间形成横向和纵向的对比。 + * 统计专题图多用于具有相关数量特征的地图上,比如表示不同地区多年的粮食产量、GDP、人口等,不同时段客运量、地铁流量等。 + * 目前提供的统计图类型有:柱状图(Bar),折线图(Line),饼图(Pie),三维柱状图(Bar3D),点状图(Point),环状图(Ring)。 + * @extends ThemeLayer + * @param {string} name - 专题图表名称。 + * @param {string} chartsType - 图表类型。目前可用:"Bar","Bar3D","Line","Point","Pie","Ring"。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {Object} [options.cache] - 缓存。 + * @param {Object} [options.charts] - 图表。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。专题要素事件临时存储。 + * @param {Object} options.chartsSetting - 各类型图表的 chartsSetting 对象可设属性请参考具体图表模型类的注释中对 chartsSetting 对象可设属性的描述。chartsSetting 对象通常都具有以下 5 个基础可设属性:
+ * @param {number} options.chartsSetting.width - 专题要素(图表)宽度。 + * @param {number} options.chartsSetting.height - 专题要素(图表)高度。 + * @param {Array.} options.chartsSetting.codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [options.chartsSetting.XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位为像素。 + * @param {number} [options.chartsSetting.YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位为像素。 + * @param {Array.} [options.chartsSetting.dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值,长度为 4 的一维数组。 + * @param {number} [options.chartsSetting.decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage +*/ +var GraphThemeLayer = ThemeLayer.extend({ + + + options: { + //是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表,默认值:true。 + isOverLay: true + }, + + initialize: function (name, chartsType, options) { + var newArgs = []; + newArgs.push(name); + newArgs.push(options); + ThemeLayer.prototype.initialize.apply(this, newArgs); + this.chartsType = chartsType; + this.themeFields = options && options.themeFields ? options.themeFields : null; + this.charts = options && options.charts ? options.charts : []; + this.cache = options && options.cache ? options.cache : {}; + this.chartsSetting = options && options.chartsSetting ? options.chartsSetting : {}; + }, + + /** + * @function GraphThemeLayer.prototype.setChartsType + * @description 设置图表类型,此函数可动态改变图表类型。在调用此函数前请通过 chartsSetting 为新类型的图表做相关配置。图表类型,目前支持:"Bar", "Bar3D", "Line","Point","Pie","Ring"。 + * @param {string} chartsType - 图表类型。目前可用:"Bar", "Bar3D", "Line","Point","Pie","Ring"。 + */ + setChartsType: function (chartsType) { + this.chartsType = chartsType; + this.redraw(); + }, + + /** + * @function GraphThemeLayer.prototype.addFeatures + * @description 向专题图图层中添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待添加的要素。 + */ + addFeatures: function (features) { + var me = this; + /** + * @event GraphThemeLayer#beforefeaturesadded + * @description 向专题图图层中添加数据之前触发。 + * @property {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待添加的要素。 + */ + me.fire("beforefeaturesadded", {features: features}); + + //转换 features 形式 + this.features = this.toiClientFeature(features); + + //绘制专题要素 + if (!me.renderer) { + return; + } + + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + + }, + + /** + * @function GraphThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,压盖处理,缓存等步骤。地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘的范围。 + */ + redrawThematicFeatures: function (bounds) { + var me = this; + //清除当前所有可视元素 + me.renderer.clearAll(); + var features = me.features; + if (this.options.alwaysMapCRS && bounds && bounds instanceof (external_L_default()).LatLngBounds) { + var crs = this._map.options.crs; + bounds = external_L_default().bounds(crs.project(bounds.getSouthWest()), crs.project(bounds.getNorthEast())); + } + bounds = CommontypesConversion.toSuperMapBounds(bounds); + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + // 要素范围判断 + var feaBounds = feature.geometry.getBounds(); + //剔除当前视图(地理)范围以外的数据 + if (bounds && !bounds.intersectsBounds(feaBounds)) { + continue; + } + var cache = me.cache; + // 用feature id 做缓存标识 + var cacheField = feature.id; + // 数据对应的图表是否已缓存,没缓存则重新创建图表 + if (!cache[cacheField]) { + cache[cacheField] = cacheField; + var chart = me.createThematicFeature(feature); + // 压盖处理权重值 + var isValidOverlayWeightField = me.overlayWeightField + && feature.attributes[me.overlayWeightField] + && !isNaN(feature.attributes[me.overlayWeightField]); + if (chart && isValidOverlayWeightField) { + chart["__overlayWeight"] = feature.attributes[me.overlayWeightField]; + } + + if (chart) { + me.charts.push(chart); + } + } + } + + me.drawCharts(); + }, + + /** + * @function GraphThemeLayer.prototype.createThematicFeature + * @description 创建专题要素(图表)。 + * @param {Object} feature - 待创建的要素。 + */ + createThematicFeature: function (feature) { + var me = this; + var thematicFeature; + // 检查图表创建条件并创建图形 + if (Theme_Theme[me.chartsType] && me.themeFields && me.chartsSetting) { + thematicFeature = new Theme_Theme[me.chartsType](feature, me, me.themeFields, me.chartsSetting); + } + + // thematicFeature 是否创建成功 + if (!thematicFeature) { + return false + } + // 对专题要素执行图形装载 + thematicFeature.assembleShapes(); + return thematicFeature; + }, + + /** + * @function GraphThemeLayer.prototype.drawCharts + * @description 绘制图表。包含压盖处理。 + */ + drawCharts: function () { + var me = this; + if (!me.renderer) { + return; + } + + // 图表权重值处理 + if (me.overlayWeightField) { + me._sortChart(); + } + + if (me.options && !me.options.isOverLay) { + // 不进行避让 + me._addOverlayShape(); + } else { + //进行避让 + me._addNoOverlayShape(); + } + // 绘制图形 + me.renderer.render(); + }, + + /** + * @function GraphThemeLayer.prototype.getShapesByFeatureID + * @description 通过 FeatureID 获取 feature 关联的所有图形。如果不传入此参数,函数将返回所有图形。 + * @param {number} featureID - 要素 ID。 + */ + getShapesByFeatureID: function (featureID) { + var me = this, list = []; + var shapeList = me.renderer.getAllShapes(); + + if (!featureID) { + return shapeList; + } + + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + if (si.refDataID && featureID === si.refDataID) { + list.push(si); + } + } + return list; + }, + + /** + * @function GraphThemeLayer.prototype.isQuadrilateralOverLap + * @description 判断两个四边形是否有压盖。 + * @param {Array.} quadrilateral - 四边形节点数组。 + * @example + * [{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]; + * @param {Array.} quadrilateral2 - 第二个四边形节点数组。 + */ + isQuadrilateralOverLap: function (quadrilateral, quadrilateral2) { + var me = this; + var quadLen = quadrilateral.length, + quad2Len = quadrilateral2.length; + if (quadLen !== 5 || quad2Len !== 5) { + return null; + }//不是四边形 + + var OverLap = false; + //如果两四边形互不包含对方的节点,则两个四边形不相交 + for (var i = 0; i < quadLen; i++) { + if (me.isPointInPoly(quadrilateral[i], quadrilateral2)) { + OverLap = true; + break; + } + } + for (let i = 0; i < quad2Len; i++) { + if (me.isPointInPoly(quadrilateral2[i], quadrilateral)) { + OverLap = true; + break; + } + } + //加上两矩形十字相交的情况 + for (let i = 0; i < quadLen - 1; i++) { + if (OverLap) { + break; + } + for (let j = 0; j < quad2Len - 1; j++) { + var isLineIn = Util.lineIntersection(quadrilateral[i], quadrilateral[i + 1], quadrilateral2[j], quadrilateral2[j + 1]); + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + OverLap = true; + break; + } + } + } + + return OverLap; + }, + + /** + * @function GraphThemeLayer.prototype.isPointInPoly + * @description 判断一个点是否在多边形里面(射线法)。 + * @param {Object} pt - 需要判定的点对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Array.} poly - 多边形节点数组。 + * 例如一个四边形:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + isPointInPoly: function (pt, poly) { + for (var isIn = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { + ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y)) + && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x) + && (isIn = !isIn); + } + return isIn; + }, + + /** + * @function GraphThemeLayer.prototype.isChartInMap + * @description 判断图表是否在地图里。 + * @param {Bounds} mapPxBounds - 地图像素范围。 + * @param {Array.} chartPxBounds - 图表范围的四边形节点数组。 + * 例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + isChartInMap: function (mapPxBounds, chartPxBounds) { + var mb = mapPxBounds; + + var isIn = false; + for (var i = 0, len = chartPxBounds.length; i < len; i++) { + var cb = chartPxBounds[i]; + + if (cb.x >= mb.left && cb.x <= mb.right && cb.y >= mb.top && cb.y <= mb.bottom) { + isIn = true; + break; + } + } + + return isIn; + }, + + /** + * @function GraphThemeLayer.prototype.clearCache + * @description 清除缓存数据。 + */ + clearCache: function () { + this.cache = {}; + this.charts = []; + }, + + /** + * @function GraphThemeLayer.prototype.removeFeatures + * @description 从专题图中删除 feature。这个函数删除所有传递进来的矢量要素(数据)。 + * @param {Array.} features - 待删除的要素。 + */ + removeFeatures: function (features) { // eslint-disable-line no-unused-vars + var me = this; + me.clearCache(); + ThemeLayer.prototype.removeFeatures.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function () { + var me = this; + me.clearCache(); + ThemeLayer.prototype.removeAllFeatures.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.redraw + * @description 重绘该图层,成功则返回 true,否则返回 false。 + */ + redraw: function () { + var me = this; + me.clearCache(); + return ThemeLayer.prototype.redraw.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.clear + * @description 清除图层。清除的内容包括数据(features) 、专题要素、缓存。 + */ + clear: function () { + var me = this; + if (me.renderer) { + me.renderer.clearAll(); + me.renderer.refresh(); + } + me.removeAllFeatures(); + me.clearCache(); + }, + + /** + * @function GraphThemeLayer.prototype.getWeightFieldValue + * @description 获取权重字段的值。 + * @param {FeatureVector} feature - 矢量要素。 + * @param {Array.} weightField - 字段名数组。 + * @param {number} defaultValue - 当通过 weightField 获取不到权重值时,使用 defaultValue 作为权重值。 + */ + getWeightFieldValue: function (feature, weightField, defaultValue) { + if (typeof(defaultValue) === "undefined" || isNaN(defaultValue)) { + defaultValue = 0; + } + if (!feature.attributes) { + return defaultValue; + } + + var fieldValue = feature.attributes[weightField]; + + if (typeof(fieldValue) === "undefined" || isNaN(fieldValue)) { + fieldValue = defaultValue + } + + return fieldValue; + }, + + _sortChart: function () { + var me = this; + if (!me.charts) { + return; + } + me.charts.sort(function (cs, ce) { + if (typeof(cs["__overlayWeight"]) === "undefined" && typeof(ce["__overlayWeight"]) === "undefined") { + return 0; + } else if (typeof(cs["__overlayWeight"]) !== "undefined" && typeof(ce["__overlayWeight"]) === "undefined") { + return -1; + } else if (typeof(cs["__overlayWeight"]) === "undefined" && typeof(ce["__overlayWeight"]) !== "undefined") { + return 1; + } else if (typeof(cs["__overlayWeight"]) !== "undefined" && typeof(ce["__overlayWeight"]) !== "undefined") { + return (parseFloat(cs["__overlayWeight"]) < parseFloat(ce["__overlayWeight"])) ? 1 : -1; + } + return 0; + }); + }, + + _addOverlayShape: function () { + var me = this; + var charts = me.charts; + for (var m = 0, len_m = charts.length; m < len_m; m++) { + var chart_m = charts[m]; + + // 图形参考位置 (reSetLocation 会更新 chartBounds) + var shapeROP_m = chart_m.resetLocation(); + + // 添加图形 + var shapes_m = chart_m.shapes; + for (var n = 0, slen_n = shapes_m.length; n < slen_n; n++) { + shapes_m[n].refOriginalPosition = shapeROP_m; + me.renderer.addShape(shapes_m[n]); + } + } + }, + _addNoOverlayShape: function () { + var me = this; + // 压盖判断所需 chartsBounds 集合 + var mapBounds = me._map.getBounds(); + var crs = this._map.options.crs; + if (this.options.alwaysMapCRS) { + mapBounds = external_L_default().bounds(crs.project(mapBounds.getSouthWest()), crs.project(mapBounds.getNorthEast())); + } + mapBounds = CommontypesConversion.toSuperMapBounds(mapBounds); + var charts = me.charts; + var chartsBounds = []; + // 获取地图像素 bounds + var mapPxLT = me.getLocalXY(new LonLat(mapBounds.left, mapBounds.top)); + var mapPxRB = me.getLocalXY(new LonLat(mapBounds.right, mapBounds.bottom)); + var mBounds = new Bounds(mapPxLT[0], mapPxRB[1], mapPxRB[0], mapPxLT[1]); + + // 压盖处理 & 添加图形 + for (var i = 0, len = charts.length; i < len; i++) { + var chart = charts[i]; + // 图形参考位置 (reSetLocation 会更新 chartBounds) + var shapeROP = chart.resetLocation(); + // 图表框 + var cbs = chart.chartBounds; + var cBounds = [ + {"x": cbs.left, "y": cbs.top}, + {"x": cbs.left, "y": cbs.bottom}, + {"x": cbs.right, "y": cbs.bottom}, + {"x": cbs.right, "y": cbs.top}, + {"x": cbs.left, "y": cbs.top} + ]; + // 地图范围外不绘制 + if (mBounds && !me.isChartInMap(mBounds, cBounds)) { + continue; + } + // 是否压盖 + var isOverlay = false; + + for (let j = 0; j < chartsBounds.length; j++) { + //压盖判断 + if (me.isQuadrilateralOverLap(cBounds, chartsBounds[j])) { + isOverlay = true; + break; + } + } + + if (isOverlay) { + continue; + } else { + chartsBounds.push(cBounds); + } + + // 添加图形 + var shapes = chart.shapes; + for (let j = 0, slen = shapes.length; j < slen; j++) { + shapes[j].refOriginalPosition = shapeROP; + me.renderer.addShape(shapes[j]); + } + } + } + +}); +var graphThemeLayer = function (name, chartsType, options) { + return new GraphThemeLayer(name, chartsType, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/RankSymbolThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class RankSymbolThemeLayer + * @deprecatedclassinstance L.supermap.rankSymbolThemeLayer + * @category Visualization Theme + * @classdesc 符号专题图图层。符号专题图通过为每个要素绘制符号大小来反映其对应的专题值的大小;它只能表示单个字段属性信息。 + * 符号专题图多用于具有相关数量特征的地图上,比如表示不同地区粮食产量、GDP、人口等。 + * 即通过制作一个符号专题图,就可以清晰展示各个区域相关 Value 的分布差异等。 + * 目前提供的符号图形有:圆形(后续进行扩展、心形、五角星、多角心、图片等)。 + * @extends {GraphThemeLayer} + * @param {string} name - 专题图层名。 + * @param {ChartType} symbolType - 符号类型。目前支持:'Circle'。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,表示在图表绘制过程中隐藏对已存在的图表产生压盖的图表。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ +var RankSymbolThemeLayer = GraphThemeLayer.extend({ + + /** + * @member {Object} RankSymbolThemeLayer.prototype.symbolSetting + * @description 符号 Circle 配置对象。 + * @property {Array} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @property {number} [maxR] - 圆形的最大半径。 + * @property {number} [minR] - 圆形的最小半径。 + * @property {string} [fillColor] - 圆形的填充色,如:fillColor: "#FFB980"。 + * @property {Object} [circleStyle] - 圆形的基础 style,此参数控制圆形基础样式,优先级低于 circleStyleByFields 和 circleStyleByCodomain。 + * @property {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @property {Object} [circleHoverStyle] - 圆形 hover 状态时的样式,circleHoverAble 为 true 时有效。 + * @property {boolean} [circleHoverAble=true] - 是否允许圆形使用 hover 状态。同时设置 circleHoverAble 和 circleClickAble 为 false,可以直接屏蔽图形对专题图层事件的响应。 + * @property {boolean} [circleClickAble=true] - 是否允许圆形被点击。同时设置 circleHoverAble 和 circleClickAble 为 false,可以直接屏蔽图形对专题图层事件的响应。 + */ + + initialize: function (name, symbolType, options) { // eslint-disable-line no-unused-vars + GraphThemeLayer.prototype.initialize.apply(this, arguments); + this.symbolType = symbolType; + this.symbolSetting = {}; + }, + + /** + * @function RankSymbolThemeLayer.prototype.setSymbolType + * @description 设置符号类型,此函数可动态改变图表类型。在调用此函数前请通过 symbolSetting 为新类型的图表做相关配置。 + * @param {ChartType} symbolType - 目前支持:'Circle'。 + * + */ + //todo 这里怎么又是supermap的类型 + setSymbolType: function (symbolType) { + this.symbolType = symbolType; + this.redraw(); + }, + + /** + * @private + * @function RankSymbolThemeLayer.prototype.createThematicFeature + * @description 创建专题要素(图形)。 + * @param {FeatureVector} feature - 要创建的专题图形要素。 + * @returns {FeatureTheme} 专题图形。 + */ + createThematicFeature: function (feature) { + var me = this; + var thematicFeature; + // 检查图形创建条件并创建图形 + if (Theme_Theme[me.symbolType] && me.themeField && me.symbolSetting) { + thematicFeature = new Theme_Theme[me.symbolType](feature, me, [me.themeField], me.symbolSetting); + } + + // thematicFeature 是否创建成功 + if (!thematicFeature) { + return false; + } + + // 对专题要素执行图形装载 + thematicFeature.assembleShapes(); + + return thematicFeature; + } + +}); + +var rankSymbolThemeLayer = function (name, symbolType, options) { + return new RankSymbolThemeLayer(name, symbolType, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/SVGRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SVGRenderer + * @classdesc 矢量图层缩放渲染器类。 + * @category Visualization VectorTile + * @private + * @extends {L.SVG} + * @param {Object} tileCoord - 切片坐标系。 + * @param {number} tileSize - 切片大小。 + * @param {Object} options - 渲染器参数。 + */ +var SVGRenderer = external_L_default().SVG.extend({ + + initialize: function (tileCoord, tileSize, options) { + external_L_default().SVG.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._container.setAttribute('viewBox', [0, 0, this._size.x, this._size.y].join(' ')); + + this._layers = {}; + }, + + /** + * @function SVGRenderer.prototype.getCoord + * @description 获取坐标。 + */ + getCoord: function () { + return this._tileCoord; + }, + + /** + * @function SVGRenderer.prototype.getContainer + * @description 获取容器。 + */ + getContainer: function () { + return this._container; + }, + + onAdd: (external_L_default()).Util.falseFn, + + /** + * @function SVGRenderer.prototype.addTo + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + addTo: function (map) { + this._map = map; + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + layer._path.style.pointerEvents = 'auto'; + this._map._targets[external_L_default().stamp(layer._path)] = layer; + } + } + }, + + /** + * @function SVGRenderer.prototype.removeFrom + * @description 从地图移除。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + removeFrom: function (map) { + var _map = map || this._map; + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + delete _map._targets[external_L_default().stamp(layer._path)]; + } + } + delete this._map; + }, + + _addPath: function (layer) { + if (!this._rootGroup) { + this._initContainer(); + } + if (!this._rootGroup) { + this._rootGroup = this._container; + } + this._rootGroup.appendChild(layer._path); + this._layers[external_L_default().stamp(layer)] = layer; + }, + + _updateIcon: function (layer) { + var path = layer._path = external_L_default().SVG.create('image'), + options = layer.options, + iconUrl = options.iconUrl; + if (options.iconSize) { + var size = external_L_default().point(options.iconSize), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + } else { + var img = new Image(); + img.src = iconUrl; + external_L_default().DomEvent.on(img, 'load', function () { + var size = external_L_default().point([img.width, img.height]), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + }); + } + path.setAttribute('href', iconUrl); + } +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/CanvasRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CanvasRenderer + * @private + * @classdesc 画布渲染器。 + * @category Visualization VectorTile + * @extends {L.Canvas} + * @param {Object} tileCoord - 切片坐标系。 + * @param {number} tileSize - 切片大小。 + * @param {Object} options - 渲染器参数。 + */ +var CanvasRenderer = external_L_default().Canvas.extend({ + + initialize: function (tileCoord, tileSize, options) { + external_L_default().Canvas.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._layers = {}; + this._drawnLayers = {}; + this._drawing = true; + + if (options.interactive) { + this._container.style.pointerEvents = 'auto'; + } + }, + + /** + * @function CanvasRenderer.prototype.getCoord + * @description 获取坐标。 + */ + getCoord: function () { + return this._tileCoord; + }, + + /** + * @function CanvasRenderer.prototype.getContainer + * @description 获取容器。 + */ + getContainer: function () { + return this._container; + }, + + /** + * @function CanvasRenderer.prototype.getOffset + * @description 停止渲染。 + */ + getOffset: function () { + return this._tileCoord.scaleBy(this._size).subtract(this._map.getPixelOrigin()); + }, + + onAdd: (external_L_default()).Util.falseFn, + + /** + * @function CanvasRenderer.prototype.addTo + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + addTo: function (map) { + this._map = map; + }, + + /** + * @function CanvasRenderer.prototype.removeFrom + * @description 从地图移除。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + removeFrom: function (map) { // eslint-disable-line no-unused-vars + delete this._map; + }, + + _updateDashArray: function (layer) { + var array = layer.options.dashArray; + if (array && typeof array === "string") { + var parts = array.split(','), + dashArray = [], + i; + for (i = 0; i < parts.length; i++) { + dashArray.push(Number(parts[i])); + } + layer.options._dashArray = dashArray; + } else { + layer.options._dashArray = array; + } + }, + + _onClick: function (e) { + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()), layer, clickedLayer; + + for (var id in this._layers) { + layer = this._layers[id]; + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } + } + if (clickedLayer) { + external_L_default().DomEvent.stop(e); + this._fireEvent([clickedLayer], e); + } + }, + + _onMouseMove: function (e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { + return; + } + + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()); + this._handleMouseHover(e, point); + }, + + _updateIcon: function (layer) { + if (!this._drawing) { + return; + } + + var options = layer.options, + ctx = this._ctx, + img = layer._getImage(); + if (options.iconSize && img.complete) { + var size = external_L_default().point(options.iconSize), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + ctx.drawImage(img, p.x, p.y, size.x, size.y); + } else { + external_L_default().DomEvent.on(img, 'load', function () { + var size = external_L_default().point([img.width, img.height]), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + ctx.drawImage(img, p.x, p.y, size.x, size.y); + }); + } + + this._drawnLayers[layer._leaflet_id] = layer; + } +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorFeatureType.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * @constant VectorFeatureType + * @description 矢量图层要素类型,和 SuperMap.CartoStyleMap 中的类型相对应。 + * @category Visualization VectorTile + * @private + */ +var VectorFeatureType = { + LABEL: "LABEL",//label实际处理成TEXT + TEXT: "TEXT", + POINT: "POINT", + LINE: "LINE", + REGION: "REGION" +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/Symbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Symbolizer + * @description 符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {Object} feature — 要素。 + */ +var Symbolizer = external_L_default().Class.extend({ + + initialize: function (feature) { + this.properties = feature.properties; + this.type = feature.type; + this.layerName = feature.layerName; + }, + + /** + * @function Symbolizer.prototype.render + * @description 绘制线符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function (renderer, style) { + this._renderer = renderer; + this._container = renderer._container; + + this.options = style; + renderer._initPath(this); + renderer._updateStyle(this); + var elem = this.getElement(); + if (elem && this.layerName) { + external_L_default().DomUtil.addClass(elem, this.layerName); + } + }, + + /** + * @function Symbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function (renderer, style) { + this.options = style; + renderer._updateStyle(this); + }, + + /** + * @function Symbolizer.prototype.getElement + * @description 获取文本信息。 + */ + getElement: function () { + return this._path || this._renderer._container; + }, + + _getPixelBounds: function () { + var parts = this._parts; + var bounds = external_L_default().bounds([]); + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + for (var j = 0; j < part.length; j++) { + bounds.extend(part[j]); + } + } + + var w = this._clickTolerance(), + p = new (external_L_default()).Point(w, w); + + bounds.min._subtract(p); + bounds.max._add(p); + + return bounds; + }, + _clickTolerance: (external_L_default()).Path.prototype._clickTolerance +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/TextSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class TextSymbolizer + * @classdesc 文本符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Path} + * @param {Object} feature - 要素。 + * @param {number} pxPerExtent - 文本符号大小。 + */ +var TextSymbolizer = external_L_default().Path.extend({ + + /** + * @member TextSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: Symbolizer.prototype, + + options: { + color: 'white', + fillColor: 'black', + fill: true, + fillOpacity: 1, + opacity: 0.6, + weight: 1, + rotation: 0.0, + stroke: true, + fontFamily: "Arial Unicode MS Regular", + fontSize: 14, + fontWeight: 'normal', + textAlign: 'center', + offsetX: 1, + offsetY: 1 + }, + + initialize: function (feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + this._makeFeatureParts(feature, pxPerExtent); + this.options.offsetX = pxPerExtent || 1; + this.options.offsetY = pxPerExtent || 1; + }, + + /** + * @function TextSymbolizer.prototype.render + * @description 绘制点符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function (renderer, style) { + //原本类型就是text的情况 + if (this.properties.texts) { + this._text = this.properties.texts[0]; + } + //类型是label的情况 + if (!this._text) { + var attributes = this.properties.attributes; + this._text = (attributes && this.properties.textField) ? + attributes[this.properties.textField] || "" : ""; + } + var options = this.options; + this._pxBounds = external_L_default().bounds(this._point, this._point); + Symbolizer.prototype.render.apply(this, [renderer, style]); + this.options = external_L_default().Util.extend(options, style); + this._updatePath(); + }, + + _makeFeatureParts: function (feat, pxPerExtent) { + pxPerExtent = pxPerExtent || {x: 1, y: 1}; + var coord = feat.geometry[0]; + if (typeof coord[0] === 'object' && 'x' in coord[0]) { + this._point = external_L_default().point(coord[0]).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } else { + this._point = external_L_default().point(coord).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } + }, + + /** + * @function TextSymbolizer.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function () { + this._updateBounds(); + }, + + /** + * @function TextSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function (renderer, style) { + this._updateBounds(); + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + + + _updateBounds: function () { + var w = this._renderer._getTextWidth(this); + var p = [w / 2, w / 2]; + this._pxBounds = external_L_default().bounds(this._point.subtract(p), this._point.add(p)); + }, + + _updatePath: function () { + this._renderer._updateText(this); + }, + _containsPoint: function (point) { // eslint-disable-line no-unused-vars + return false; + } +}); + +CanvasRenderer.include({ + _getTextWidth: function (layer) { + return this._ctx.measureText(layer._text).width; + }, + _updateText: function (layer) { + if (!this._drawing || layer._empty()) { + return; + } + var container = this.getContainer(); + var size = this._map.getSize(); + container.width = size.x; + container.height = size.y; + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; + var ctx = this._ctx, + options = layer.options, + offsetX = options.offsetX || 1, + offsetY = options.offsetY || 1, + p = layer._point.subtract(external_L_default().point(offsetX, offsetY)); + if (!options.fill) { + return; + } + + this._drawnLayers[layer._leaflet_id] = layer; + + ctx.fillRect(0, 0, size.x, size.y); + ctx.font = [ + options.fontWeight ? options.fontWeight : "normal", + options.fontSize ? options.fontSize : "14px", + options.fontFamily ? options.fontFamily : "Arial Unicode MS Regular,Microsoft Yahei" + ].join(" "); + ctx.textAlign = options.textAlign; + ctx.lineWidth = options.weight; + ctx.fillStyle = options.fillColor; + ctx.fillText(layer._text, p.x, p.y); + ctx.strokeStyle = options.color; + ctx.strokeText(layer._text, p.x, p.y); + ctx.rotate(options.rotation); + } +}); + +SVGRenderer.include({ + _getTextWidth: function (layer) { + return layer._path.getComputedTextLength() || 0; + }, + + _initPath: function (layer) { + var path; + + if (TextSymbolizer && layer instanceof TextSymbolizer) { + path = layer._path = external_L_default().SVG.create("text"); + path.textContent = layer._text; + } else { + path = layer._path = external_L_default().SVG.create("path"); + } + + if (layer.options.className) { + external_L_default().DomUtil.addClass(path, layer.options.className); + } + + if (layer.options.interactive) { + external_L_default().DomUtil.addClass(path, 'leaflet-interactive'); + } + + this._updateStyle(layer); + this._layers[external_L_default().stamp(layer)] = layer; + }, + + + _updateText: function (layer) { + var path = layer._path, + options = layer.options, + offsetX = options.offsetX || 1, + offsetY = options.offsetY || 1, + p = layer._point.subtract(external_L_default().point(offsetX, offsetY)); + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + options.rotation = options.rotation || 0; + path.setAttribute('transform', 'rotate(' + options.rotation / Math.PI * 180 + ' ' + p.x + ' ' + p.y + ')'); + path.setAttribute('text-anchor', options.textAlign === 'center' ? 'middle' : options.textAlign); + path.style.fontSize = options.fontSize; + path.style.fontFamily = options.fontFamily; + path.style.fontWeight = options.fontWeight || "normal"; + path.style.glyphOrientationVertical = options.rotation||''; + if (options.stroke) { + path.setAttribute('stroke', options.color); + path.setAttribute('stroke-linecap', 'round'); + path.setAttribute('stroke-linejoin', 'round'); + path.setAttribute('stroke-opacity', options.opacity); + path.setAttribute('stroke-width', options.weight > 1 ? options.weight / 10 : options.weight); + } else { + path.setAttribute('stroke', 'none'); + } + if (options.fill) { + path.setAttribute('fill', options.fillColor || options.color); + path.setAttribute('fill-opacity', options.fillOpacity); + } else { + path.setAttribute('fill', 'none'); + } + } + + +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/PointSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class PointSymbolizer + * @classdesc 点符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.CircleMarker} + * @param {Object} feature - 点要素。 + * @param {number} pxPerExtent - 点符号大小。 + */ +var PointSymbolizer = external_L_default().CircleMarker.extend({ + + /** + * @member PointSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: Symbolizer.prototype, + + statics: { + iconCache: {} + }, + + initialize: function (feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + this._makeFeatureParts(feature, pxPerExtent); + }, + + getLatLng: undefined, + + + /** + * @function PointSymbolizer.prototype.render + * @description 绘制点符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function (renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._radius = style.radius || (external_L_default()).CircleMarker.prototype.options.radius; + this._updatePath(); + }, + + _makeFeatureParts: function (feat, pxPerExtent) { + pxPerExtent = pxPerExtent || {x: 1, y: 1}; + var coord = feat.geometry[0]; + if (typeof coord[0] === 'object' && 'x' in coord[0]) { + this._point = external_L_default().point(coord[0]).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } else { + this._point = external_L_default().point(coord).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } + }, + + /** + * @function PointSymbolizer.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function () { + this._updateBounds(); + }, + + /** + * @function PointSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function (renderer, style) { + this._radius = style.radius || this._radius; + this._updateBounds(); + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + + _updateBounds: function () { + var icon = this.options.iconUrl; + if (icon && this.options.iconSize) { + var size = external_L_default().point(this.options.iconSize), + anchor = size && size.divideBy(2, true), + p = this._point.subtract(anchor); + this._pxBounds = new (external_L_default()).Bounds(p, p.add(size)); + } else { + external_L_default().CircleMarker.prototype._updateBounds.call(this); + } + }, + + _updatePath: function () { + if (this.options.iconUrl) { + this._renderer._updateIcon(this) + } else { + external_L_default().CircleMarker.prototype._updatePath.call(this); + } + }, + + _getImage: function () { + if (!this.options.iconUrl) { + return null; + } + var url = this.options.iconUrl, + img = PointSymbolizer.iconCache[url]; + if (!img) { + var iconSize = this.options.iconSize || [50, 50]; + img = PointSymbolizer.iconCache[url] = this._createIcon(url, iconSize); + } + return img; + }, + + _createIcon: function (url, iconSize) { + var src = url; + + if (!src) { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + + var img = document.createElement('img'), name = "icon"; + img.src = src; + img.className = 'leaflet-marker-' + name + ' ' + (this.layerName || ''); + + // var options = this.options; + var sizeOption = iconSize; + + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; + } + if (sizeOption) { + var size = external_L_default().point(sizeOption), + anchor = external_L_default().point(size && size.divideBy(2, true)); + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; + } + } + + img.onload = function () { + if (!sizeOption) { + img.style.width = this.width + 'px'; + img.style.height = this.height + 'px'; + } + }; + + return img; + }, + + _containsPoint: function (p) { + var icon = this.options.iconUrl; + if (icon) { + return this._pxBounds.contains(p); + } else { + return external_L_default().CircleMarker.prototype._containsPoint.call(this, p); + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/SymbolizerPolyBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class PolyBase + * @classdesc 多边形基类。 + * @category Visualization VectorTile + * @private + */ +//@type {{_makeFeatureParts: PolyBase._makeFeatureParts, makeInteractive: PolyBase.makeInteractive}} +var PolyBase = { + _makeFeatureParts: function (feat, pxPerExtent) { + pxPerExtent = pxPerExtent || {x: 1, y: 1}; + var rings = feat.geometry; + var coord; + + this._parts = []; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + var part = []; + for (var j = 0; j < ring.length; j++) { + coord = ring[j]; + part.push(external_L_default().point(coord).scaleBy(pxPerExtent)); + } + this._parts.push(part); + } + }, + + /** + * @function PolyBase.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function () { + this._pxBounds = this._getPixelBounds(); + } +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/LineSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class LineSymbolizer + * @classdesc 线符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Polyline} + * @param {Object} feature - 线要素。 + * @param {number} pxPerExtent - 线长。 + */ +var LineSymbolizer = external_L_default().Polyline.extend({ + + /** + * @member LineSymbolizer.prototype.includes + * @description 包含符号。 + */ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function (feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + this._makeFeatureParts(feature, pxPerExtent); + }, + + /** + * @function LineSymbolizer.prototype.render + * @description 绘制线符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function (renderer, style) { + style.fill = false; + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + }, + + /** + * @function LineSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function (renderer, style) { + style.fill = false; + Symbolizer.prototype.updateStyle.call(this, renderer, style); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/RegionSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class RegionSymbolizer + * @classdesc 面符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Polygon} + * @param {Object} feature - 面要素。 + * @param {number} pxPerExtent - 面积像素大小。 + */ +var RegionSymbolizer = external_L_default().Polygon.extend({ + + /** + * @member RegionSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function (feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + this._makeFeatureParts(feature, pxPerExtent); + }, + + /** + * @function RegionSymbolizer.prototype.render + * @description 绘制面符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function (renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + } +}); +// EXTERNAL MODULE: ./node_modules/pbf/index.js +var node_modules_pbf = __webpack_require__(614); +var pbf_default = /*#__PURE__*/__webpack_require__.n(node_modules_pbf); +// EXTERNAL MODULE: ./node_modules/@mapbox/vector-tile/index.js +var vector_tile = __webpack_require__(929); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTilePBF.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class VectorTilePBF + * @classdesc 矢量瓦片 PBF(MVT) 表述出图。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {string} url - 服务地址。 + */ +var VectorTilePBF = external_L_default().Class.extend({ + + initialize: function (url) { + this.url = url; + }, + + /** + * @function VectorTilePBF.prototype.getTile + * @description 获取瓦片 PBF(MVT)。 + * @returns {Promise} 返回包含矢量瓦片信息的 Promise 对象。 + */ + getTile: function () { + var me = this; + return FetchRequest.get(me.url, null, { + timeout: 10000 + }).then(function (response) { + if (!response.ok) { + return {layers: []}; + } + return response.blob().then(function (blob) { + var reader = new FileReader(); + return new Promise(function (resolve) { + reader.addEventListener("loadend", function () { + var pbf = new (pbf_default())(reader.result); + return resolve(new vector_tile.VectorTile(pbf)); + }); + reader.readAsArrayBuffer(blob); + }); + }); + }).then(function (json) { + return me._processVectorTileSpec(json); + }); + }, + + _processVectorTileSpec: function (vectorTile) { + var layers = []; + for (var layerName in vectorTile.layers) { + var feats = []; + for (var i = 0; i < vectorTile.layers[layerName].length; i++) { + var feat = vectorTile.layers[layerName].feature(i); + feat.geometry = feat.loadGeometry(); + feat.layerName = layerName; + feat.properties = {attributes: external_L_default().Util.extend({}, feat.properties), id: feat.id}; + switch (feat.type) { + case 1: + feat.type = VectorFeatureType.POINT; + break; + case 2: + feat.type = VectorFeatureType.LINE; + break; + case 3: + feat.type = VectorFeatureType.REGION; + break; + default: + break; + } + feats.push(feat); + } + var layer = {}; + layer.features = feats; + layer.layerName = layerName; + layer.extent = vectorTile.layers[layerName].extent; + layers.push(layer); + } + return layers; + } + +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTileJSON.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class VectorTileJSON + * @classdesc iServer 矢量瓦片 JSON 表述出图。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {string} url - 服务地址。 + */ +var VectorTileJSON = external_L_default().Class.extend({ + + initialize: function (url) { + this.url = url; + }, + + /** + * @function VectorTileJSON.prototype.getTile + * @description 获取瓦片。 + * @returns {Promise} 返回包含矢量瓦片信息的 Promise 对象。 + */ + getTile: function () { + var me = this; + return FetchRequest.get(me.url, null, { + timeout: 10000 + }).then(function (response) { + return response.json() + }).then(function (json) { + return me._processRecordSets(json, me); + }); + }, + + _processRecordSets: function (records, scope) { + var recordsets = records.recordsets; + // 如果iServer支持了tileFeature geojson表述则不需要此步骤 + recordsets = scope._convertToGeoJSON(recordsets); + if (!recordsets) { + return null; + } + + //类似VT标准的数据格式,并为每个要素添加一个layerName字段 + for (var i = 0; i < recordsets.length; i++) { + var recordset = recordsets[i]; + for (var j = 0; j < recordset.features.length; j++) { + var feature = recordset.features[j]; + feature = scope._convertToVectorLayerFeature(feature, scope); + feature.layerName = recordset.layerName; + recordset.features[j] = feature; + } + recordset.extent = 256; + delete recordset.fieldTypes; + delete recordset.fields; + } + return recordsets; + }, + + _convertToVectorLayerFeature: function (feature, scope) { + if (!feature.geometry) { + return; + } + var newFeature = {}; + + var geom = feature.geometry, + type = geom.type, + coords = geom.coordinates, + tags = feature.properties, + id = tags.id, + i, j, rings, projectedRing; + + + if (type === 'Point') { + newFeature = (tags && tags.texts) ? + scope._createFeature(id, VectorFeatureType.TEXT, [coords], tags) : + scope._createFeature(id, VectorFeatureType.POINT, [coords], tags); + } else if (type === 'MultiPoint') { + newFeature = scope._createFeature(id, VectorFeatureType.POINT, coords, tags); + } else if (type === 'LineString') { + newFeature = scope._createFeature(id, VectorFeatureType.LINE, [coords], tags); + } else if (type === 'MultiLineString' || type === 'Polygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + projectedRing = coords[i]; + if (type === 'Polygon') { + projectedRing.outer = (i === 0); + } + rings.push(projectedRing); + } + var featureType = (type === 'Polygon') ? + VectorFeatureType.REGION : + VectorFeatureType.LINE; + newFeature = scope._createFeature(id, featureType, rings, tags); + } else if (type === 'MultiPolygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + projectedRing = coords[i][j]; + projectedRing.outer = (j === 0); + rings.push(projectedRing); + } + } + newFeature = scope._createFeature(id, VectorFeatureType.REGION, rings, tags); + } else { + throw new Error('Illegal GeoJSON object'); + } + return newFeature; + }, + + _convertToGeoJSON: function (recordsets) { + if (!recordsets) { + return; + } + for (var i = 0; i < recordsets.length; i++) { + var recordset = recordsets[i]; + for (var j = 0; j < recordset.features.length; j++) { + var feature = recordset.features[j]; + var points = []; + var startIndex = 0; + + for (var k = 0; k < feature.geometry.parts.length; k++) { + var partPointsLength = feature.geometry.parts[k] * 2; + for (var l = 0, index = startIndex; l < partPointsLength; l += 2, index += 2) { + var x = feature.geometry.points[index]; + var y = feature.geometry.points[index + 1]; + points.push({x: x, y: y}); + } + startIndex += partPointsLength; + } + feature.geometry.points = points; + } + recordset.features = toGeoJSON(recordset.features).features; + } + return recordsets; + }, + + _createFeature: function (id, type, geometry, properties) { + return { + id: id, + type: type, + geometry: geometry, + properties: properties + } + } + +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/VectorTileFormat.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @enum VectorTileFormat + * @category BaseTypes Constant + * @description 矢量瓦片格式 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { VectorTileFormat } from '{npm}'; + * + * const result = VectorTileFormat.JSON; + * ``` + */ +var VectorTileFormat = { + /** JSON */ + JSON: "JSON", + /** MVT */ + MVT: "MVT", + /** PBF */ + PBF: "PBF" +}; + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTile.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class VectorTile + * @classdesc 矢量瓦片图层基类。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {string} [options.layer] - 图层名称。 + * @param {(number|L.Point)} [options.tileSize=256] - 瓦片大小。 + * @param {string} [options.format] - 返回值类型。 + * @param {Object} [options.coords] - 坐标系统对象。 + * @param {Object} [options.renderer] - 渲染器对象。 + * @param {function} done - 回调函数。 + */ +var VectorTile = external_L_default().Class.extend({ + + initialize: function (options, done) { + this.layer = options.layer; + this.tileSize = options.layer.getTileSize(); + this.format = options.format; + this.coords = options.coords; + this.renderer = options.renderer; + this.done = done; + this.layer._textVectorTiles = {}; + }, + + /** + * @function VectorTile.prototype.renderTile + * @description 渲染切片。 + */ + renderTile: function () { + var me = this, layer = me.layer, coords = me.coords; + var tileFeatureUrl = layer._getTileUrl(coords); + + var format = [VectorTileFormat.MVT, VectorTileFormat.PBF]; + + var tileFeaturePromise; + if (format.indexOf(me.format.toUpperCase()) > -1) { + tileFeaturePromise = new VectorTilePBF(tileFeatureUrl); + } else { + tileFeaturePromise = new VectorTileJSON(tileFeatureUrl) + } + + tileFeaturePromise.getTile().then(function (tileFeature) { + me.render(tileFeature, coords); + }) + }, + + /** + * @function VectorTile.prototype.render + * @description 渲染切片要素。 + * @param {Object} tileFeature - 需要渲染的切片要素。 + * @param {Object} coords - 切片坐标参数对象。 + */ + render: function (tileFeature, coords) { + if (!tileFeature) { + return; + } + var me = this, + renderer = me.renderer, + tileLayer = me.layer; + + for (var k = 0; k < tileFeature.length; k++) { + var layer = tileFeature[k], layerName = layer.layerName; + tileLayer._dataLayerNames[layerName] = true; + var pxPerExtent = me.tileSize.divideBy(layer.extent); + var layerStyleInfo = tileLayer.getLayerStyleInfo(layer.layerName); + + for (var i = 0; i < layer.features.length; i++) { + var feat = layer.features[i]; + if (!feat) { + continue; + } + + //标签图层处理为文本 + if (layerStyleInfo && layerStyleInfo.type === VectorFeatureType.LABEL + && feat.type === VectorFeatureType.POINT + && feat.properties.attributes) { + feat.type = VectorFeatureType.TEXT; + } + + var styleOptions = me._getStyleOptions(coords, feat, layerName, me); + if (!styleOptions.length) { + continue; + } + + var featureLayer = me._createFeatureLayer(feat, pxPerExtent); + + if (!featureLayer) { + continue; + } + + // 保存文本图层单独绘制,避免被压盖 + var param = {scope: me, coords: coords, renderer: renderer}; + if (me._extractTextLayer(feat, featureLayer, styleOptions, param)) { + continue; + } + + for (var j = 0; j < styleOptions.length; j++) { + var style = me._validateStyle(styleOptions[j], feat.type); + featureLayer.render(renderer, style); + renderer._addPath(featureLayer); + } + + if (tileLayer.options.interactive) { + featureLayer.makeInteractive(); + } + + var featureKey = tileLayer._getFeatureKey(feat.id, layerName); + renderer._features[featureKey] = { + layerName: layerName, + feature: featureLayer + }; + } + } + + if (tileLayer._map) { + renderer.addTo(tileLayer._map); + } + + external_L_default().Util.requestAnimFrame(me.done.bind(coords, null, me.layer._vectorTiles[me.layer._tileCoordsToKey(coords)])); + }, + + // 保存文本图层单独绘制,避免被压盖 + _extractTextLayer: function (feat, featureLayer, style, param) { + + if (feat.type !== VectorFeatureType.TEXT) { + return false; + } + + var me = param.scope, + coords = param.coords, + tileLayer = me.layer, + key = tileLayer._tileCoordsToKey(coords); + + var id = feat.id, + layerName = feat.layerName; + + var textTileLayers = tileLayer._textVectorTiles[key]; + if (!textTileLayers) { + textTileLayers = { + layers: {}, + coords: coords, + renderer: param.renderer + }; + } + + // 不同瓦片可能请求到同一个文本图层,为避免重复绘制,只保存绘制最后一个 + textTileLayers.layers[id] = { + layer: featureLayer, + style: style, + layerName: layerName + }; + tileLayer._textVectorTiles[key] = textTileLayers; + return true; + }, + + _getStyleOptions: function (coords, feature, layerName, scope) { + var me = scope; + var tileLayer = me.layer; + var styleOptions = tileLayer.getVectorTileLayerStyle(coords, feature) || me._defaultStyle(feature.type); + + //根据id和layerName识别唯一要素 + var id = feature.id, + styleKey = tileLayer._getFeatureKey(id, layerName), + styleOverride = tileLayer._overriddenStyles[styleKey]; + + styleOptions = styleOverride ? styleOverride : styleOptions; + styleOptions = (styleOptions instanceof Function) ? styleOptions(feature.properties, coords.z) : styleOptions; + styleOptions = !(styleOptions instanceof Array) ? [styleOptions] : styleOptions; + return styleOptions; + }, + + _createFeatureLayer: function (feat, pxPerExtent) { + var layer; + switch (feat.type) { + case VectorFeatureType.POINT: + layer = new PointSymbolizer(feat, pxPerExtent); + break; + case VectorFeatureType.LINE: + layer = new LineSymbolizer(feat, pxPerExtent); + break; + case VectorFeatureType.REGION: + layer = new RegionSymbolizer(feat, pxPerExtent); + break; + case VectorFeatureType.TEXT: + layer = new TextSymbolizer(feat, pxPerExtent); + break; + default: + break; + } + var vectorLayer = this.layer; + + if (layer && vectorLayer.options.interactive) { + layer.addEventParent(vectorLayer); + } + + return layer; + }, + + //矫正一些参数 + _validateStyle: function (style, type) { + //默认leaflet path的边宽为3,矩形颜色填充透明度为0.2,跟iClient不一样,故作调整 + (external_L_default()).Path.prototype.options.weight = 1; + (external_L_default()).Path.prototype.options.fillOpacity = 1; + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, (external_L_default()).CircleMarker.prototype.options, style); + case VectorFeatureType.LINE: + return external_L_default().extend({}, (external_L_default()).Polyline.prototype.options, style); + case VectorFeatureType.REGION: + return external_L_default().extend({}, (external_L_default()).Polygon.prototype.options, style); + case VectorFeatureType.TEXT: + return external_L_default().extend({}, TextSymbolizer.prototype.options, style); + default: + break; + } + }, + + //如果cartoCSS和layerInfo都没有得到样式,则使用该默认样式 + _defaultStyle: function (type) { + var defaultOptions = (external_L_default()).Path.prototype.options; + defaultOptions.weight = 1; + defaultOptions.fillOpacity = 1; + defaultOptions.radius = 3; + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, defaultOptions, (external_L_default()).CircleMarker.prototype.options); + case VectorFeatureType.LINE: + return external_L_default().extend({}, defaultOptions, (external_L_default()).Polyline.prototype.options); + case VectorFeatureType.REGION: + return external_L_default().extend({}, defaultOptions, (external_L_default()).Polygon.prototype.options); + case VectorFeatureType.TEXT: + return external_L_default().extend({}, defaultOptions, TextSymbolizer.prototype.options); + default: + break; + } + } + +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorGrid.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/** + * Inspired by https://github.com/Leaflet/Leaflet.VectorGrid + */ + + + + + + + + +/** + * @class VectorGrid + * @classdesc 矢量瓦片图层基类。 + * @category Visualization VectorTile + * @extends {L.GridLayer} + * @param {Object} options - 参数。 + * @param {Object} [options.vectorTileLayerStyles] - 矢量网片图层风格。 + * @param {string} [options.renderer='SVG'] - 渲染器类型。 + * @param {VectorTileFormat} [options.format=VectorTileFormat.JSON] - 矢量瓦片格式。 + * @param {boolean} [options.interactive=true] - 是否可交互。 + * @param {number} [options.maxZoom=23] - 最大缩放级别。 + * @usage + */ +var VectorGrid = external_L_default().GridLayer.extend({ + + options: { + vectorTileLayerStyles: null, + //SVG or Canvas + renderer: "SVG", + format: VectorTileFormat.JSON, + interactive: true, + maxZoom:23 + }, + + initialize: function (options) { + var me = this; + external_L_default().setOptions(me, options); + external_L_default().GridLayer.prototype.initialize.call(me, options); + me._vectorTiles = {}; + //交互事件使用,键值为id_layerName + me._overriddenStyles = {}; + me.vectorTileLayerStyles = me.options.vectorTileLayerStyles; + me.on('tileunload', function (e) { + var key = me._tileCoordsToKey(e.coords), + tile = me._vectorTiles[key]; + + if (tile && me._map) { + tile.removeFrom(me._map); + } + delete me._vectorTiles[key]; + }, me); + me.on('tileerror ', me._renderText, me); + me.on('load', me._renderText, me); + me._dataLayerNames = {}; + }, + + /** + * @private + * @function VectorGrid.prototype.createTile + * @description 创建切片图层。 + * @param {Object} coords - 切片坐标参数对象。 + * @param {function} done - todo。 + */ + createTile: function (coords, done) { + var me = this; + + var tileSize = me.getTileSize(); + var renderer = null; + + if (me.options.renderer === "Canvas") { + renderer = new CanvasRenderer(coords, tileSize, me.options); + } else { + renderer = new SVGRenderer(coords, tileSize, me.options); + } + + me._vectorTiles[me._tileCoordsToKey(coords)] = renderer; + renderer._features = {}; + + new VectorTile({ + layer: me, + format: me.options.format, + coords: coords, + renderer: renderer + }, done).renderTile(); + + return renderer.getContainer(); + }, + + /** + * @function VectorGrid.prototype.getStyles + * @description 获取图层样式。 + * @returns {Object} 所有图层的样式。 + */ + getStyles: function () { + return this.vectorTileLayerStyles; + }, + + /** + * @function VectorGrid.prototype.getStyle + * @description 获取指定图层样式。 + * @param {string} layerName - 图层名称。 + * @returns {Object} 指定图层的样式。 + */ + getStyle: function (layerName) { + return this.vectorTileLayerStyles && this.vectorTileLayerStyles[layerName]; + }, + + /** + * @function VectorGrid.prototype.setFeatureStyle + * @description 指定要素 ID 和图层名称设置要素风格。 + * @param {number} id - 要素 ID。 + * @param {string} layerName - 图层名称。 + * @param {(Array|function)} layerStyle - 图层样式。 + * @returns {VectorGrid} VectorGrid的实例对象。 + */ + setFeatureStyle: function (id, layerName, layerStyle) { + var featureKey = this._getFeatureKey(id, layerName); + this._overriddenStyles[featureKey] = layerStyle; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[featureKey]; + if (data) { + var feat = data.feature; + this._updateStyles(feat, tile, layerStyle); + } + } + return this; + }, + + /** + * @function VectorGrid.prototype.resetFeatureStyle + * @description 指定要素 ID 和图层名称重绘要素风格。 + * @param {number} id - 要素 ID。 + * @param {string} layerName - 图层名称。 + * @returns {VectorGrid} VectorGrid的实例对象。 + */ + resetFeatureStyle: function (id, layerName) { + var featureKey = this._getFeatureKey(id, layerName); + delete this._overriddenStyles[featureKey]; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var data = tile._features[featureKey]; + if (data) { + var feat = data.feature; + var styleOptions = this.vectorTileLayerStyles[data.layerName]; + this._updateStyles(feat, tile, styleOptions); + } + } + return this; + }, + + /** + * @function VectorGrid.prototype.getDataLayerNames + * @description 获取数据图层名称。 + * @returns {Array} 返回数据图层名称数组。 + */ + getDataLayerNames: function () { + return Object.keys(this._dataLayerNames); + }, + + _removeAllTiles: function () { + external_L_default().GridLayer.prototype._removeAllTiles.call(this); + this._textVectorTiles = {}; + }, + + + _renderText: function () { + var textVectorTiles = this._textVectorTiles; + for (var key in textVectorTiles) { + var textTiles = textVectorTiles[key]; + var renderer = textTiles.renderer; + + for (var layerId in textTiles.layers) { + var tile = textTiles.layers[layerId]; + var styleOptions = tile.style, + featureLayer = tile.layer; + for (var j = 0; j < styleOptions.length; j++) { + featureLayer.render(renderer, styleOptions[j]); + renderer._addPath(featureLayer); + } + + if (this.options.interactive) { + featureLayer.makeInteractive(); + } + } + } + }, + + _getFeatureKey: function (id, layerName) { + id = id || 0; + layerName = layerName || "null"; + return id + "_" + layerName; + }, + + _updateStyles: function (feat, renderer, styleOptions) { + styleOptions = (styleOptions instanceof Function) ? + styleOptions(feat.properties, renderer.getCoord().z) : + styleOptions; + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + for (var j = 0; j < styleOptions.length; j++) { + var style = this._extendStyle(styleOptions[j], feat.type); + feat.updateStyle(renderer, style); + } + }, + + //矫正一些参数 + _extendStyle: function (style, type) { + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, (external_L_default()).CircleMarker.prototype.options, style); + case VectorFeatureType.LINE: + return external_L_default().extend({}, (external_L_default()).Polyline.prototype.options, style); + case VectorFeatureType.REGION: + return external_L_default().extend({}, (external_L_default()).Polygon.prototype.options, style); + case VectorFeatureType.TEXT: + return external_L_default().extend({}, TextSymbolizer.prototype.options, style); + default: + break; + } + } + +}); + +;// CONCATENATED MODULE: ./src/leaflet/overlay/TiledVectorLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +/** + * @class TiledVectorLayer + * @deprecatedclassinstance L.supermap.tiledVectorLayer + * @classdesc SuperMap iServer 的矢量瓦片图层。 + * @category Visualization VectorTile + * @extends VectorGrid + * @example + * new TiledVectorLayer(url).addTo(map); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.layerNames - 指定图层的名称列表,支持的类型为矢量图层。 + * @param {string} options.layersID - 获取进行切片的地图图层 ID。 + * @param {string} [options.cartoCSS] - 客户端 CartoCSS 样式字符串。 + * @param {boolean} [options.serverCartoCSSStyle=true] - 是否使用服务端 CartoCSS 样式。 + * @param {boolean} [options.processCharacters=false] - 设置客户端 CartoCSS 样式时是否进行特定字符转换。 + * @param {CRS} [options.crs] - 坐标系统类。 + * @param {boolean} [options.returnAttributes=false] - 是否返回 attributes。 + * @param {string} [options.expands] - expands。 + * @param {boolean} [options.cacheEnabled=true] - 是否启用缓存。 + * @param {Object} [options.tileTemplate] - 瓦片模板,如果设置了此参数,则按此模板出图。默认出图方式为 URL 对接的第三方瓦片。 + * @param {string} [options.subdomains] - 子域名。 + * @param {number} [options.timeout=10000] - 延时。 + * @param {string} [options.attribution='Map Data © SuperMap iServer`] - 版权信息。 + * @usage + */ +var TiledVectorLayer = VectorGrid.extend({ + options: { + crs: null, + //客户端cartocss样式 + cartoCSS: null, + // 指定图层的名称列表。支持的类型为矢量图层 + layerNames: null, + //获取进行切片的地图图层 ID + layersID: null, + //是否服务端CartoCSS样式,默认使用 + serverCartoCSSStyle: true, + //设置客户端CartoCSS样式时是否进行特定字符转换 + processCharacters: false, + + returnAttributes: false, + + /*各图层扩展的像素值。 + *例如: + * 0_15:0_5,1_10:表示顶级0图层的0、1子图层扩展的像素分别为5、10像素;顶级0图层下,除0、1图层外的子图层的扩展像素都为15像素。 + * 0:0_5,1_10:表示顶级0图层的0、1子图层扩展的像素分别为5、10像素;顶级0图层下,其他除0、1图层外的子图层的扩展像素为根据该图层默认样式计算得出的默认值。 + */ + expands: null, + cacheEnabled: false, + //瓦片模板,如果设置了此参数,则按此模板出图,url无效(对接第三方瓦片) + tileTemplate: null, + subdomains: 'abc', + + timeout: 10000, + attribution: core_Attributions.Common.attribution + }, + + initialize: function (url, options) { + options = options || {}; + options.noWrap = (options.noWrap == null) ? true : options.noWrap; + external_L_default().setOptions(this, options); + VectorGrid.prototype.initialize.call(this, options); + external_L_default().stamp(this); + var me = this; + + if (!url || url.indexOf("http") < 0) { + url = ""; + return this; + } + + me.url = url; + if (url.indexOf("/") === (url.length - 1)) { + url = url.substr(0, url.length - 1); + me.url = url; + } + this.cartoCSSToLeaflet = new CartoCSSToLeaflet(me.url); + me.initLayersInfo(); + if (!me.options.serverCartoCSSStyle && me.options.cartoCSS) { + me.setClientCartoCSS(me.options.cartoCSS); + } + }, + + /** + * @private + * @function TiledVectorLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function (map) { + this._crs = this.options.crs || map.options.crs; + this._map = map; + this._initLayerUrl(); + if (this.options.tileTemplate || !this.options.serverCartoCSSStyle) { + this._initGrid(); + } + }, + + /** + * @private + * @function TiledVectorLayer.prototype.initLayersInfo + * @description 获取服务器图层资源下的风格信息(当 CartoCSS 中不存在相应图层渲染信息时使用)。 + */ + initLayersInfo: function () { + var me = this; + var layersUrl = Util.urlPathAppend(me.url, "layers"); + FetchRequest.get(SecurityManager.appendCredential(layersUrl), null, { + timeout: me.options.timeout + }).then(function (response) { + return response.json(); + }).then(function (json) { + me.layersInfoInitialized = true; + me.layersInfo = json; + if (!me.layersInfo) { + return; + } + var layersInfo = {}; + for (var i = 0, len = me.layersInfo.length; i < len; i++) { + var layers = me.layersInfo[i].subLayers.layers; + for (var j = 0, len1 = layers.length; j < len1; j++) { + layers[j].layerIndex = len1 - j; + layersInfo[layers[j].name] = layers[j]; + } + } + me.layersInfo = layersInfo; + me.cartoCSSToLeaflet.layersInfo = layersInfo; + if (me.options.serverCartoCSSStyle) { + me.getVectorStylesFromServer(); + } + }).catch(function (ex) { + console.error('error', ex) + }); + }, + + /** + * @function TiledVectorLayer.prototype.getLayerStyleInfo + * @description 获取图层样式信息。 + * @param {string} layerName - 图层名称。 + */ + getLayerStyleInfo: function (layerName) { + var me = this, + layerInfo_simple; + me.layersStyles = me.layersStyles || {}; + + layerInfo_simple = me.layersStyles[layerName]; + if (layerInfo_simple) { + return layerInfo_simple; + } + + if (!me.layersInfo) { + return {}; + } + var layerInfo = me.layersInfo[layerName]; + if (!layerInfo) { + return null; + } + layerInfo_simple = { + layerIndex: layerInfo.layerIndex, + ugcLayerType: layerInfo.ugcLayerType + }; + switch (layerInfo.ugcLayerType) { + case "VECTOR": + layerInfo_simple.layerStyle = layerInfo.style ? layerInfo.style : null; + break; + case "THEME": + var theme = layerInfo.theme; + //标注图层特别标明 + layerInfo_simple.layerStyle = theme ? theme.defaultStyle : null; + if (theme && theme.type === "LABEL") { + layerInfo_simple.type = theme.type; + layerInfo_simple.textField = theme.labelExpression; + } + break; + default: + //SVTile发布出来的地图没有ugcLayerType属性 + if (layerInfo.style) { + layerInfo_simple.layerStyle = layerInfo.style; + } + break; + } + me.layersStyles[layerName] = layerInfo_simple; + return layerInfo_simple; + }, + + /* + * @function TiledVectorLayer.prototype.getVectorStylesFromServer + * @description 等待服务器的 carto 返回之后拼接本地配置的 cartoCSS, 并调用 onAdd 出图。 + */ + getVectorStylesFromServer: function () { + var me = this; + var vectorStyleUrl = Util.urlPathAppend(me.url, "tileFeature/vectorstyles"); + FetchRequest.get(SecurityManager.appendCredential(vectorStyleUrl), null, { + timeout: me.options.timeout + }).then(function (response) { + return response.json() + }).then(function (styles) { + if (!styles || !styles.style) { + return null; + } + if (styles.style && styles.type === 'cartoCSS') { + me.setServerCartoCSS(styles.style); + } + if (me.options) { + me.setClientCartoCSS(me.options.cartoCSS); + } + me._initGrid(); + }).catch(function (ex) { + console.error('error', ex) + }); + }, + + /** + * @private + * @function TiledVectorLayer.prototype.setServerCartoCSS + * @description 设置服务端获取到的 cartoCSS 样式, cartoCSS 请求回来之后自动调用。 + */ + setServerCartoCSS: function (cartoCSSStr) { + this.cartoCSSToLeaflet.pretreatedCartoCSS(cartoCSSStr, true); + }, + /** + * @function TiledVectorLayer.prototype.setClientCartoCSS + * @description 客户端设置 cartoCSS 样式。 + */ + setClientCartoCSS: function (cartoCSSStr) { + let processCharacters = false; + if (this.options.processCharacters) { + processCharacters = this.options.processCharacters; + } + this.cartoCSSToLeaflet.pretreatedCartoCSS(cartoCSSStr, processCharacters); + }, + + /** + * @private + * @function TiledVectorLayer.prototype.getVectorTileLayerStyle + * @description 获取图层风格信息,当 CartoCSS 中包含有对该图层的渲染信息时,优先获取,否则获取图层资源下图层样式的渲染信息。 + * @param {Object} coords - 图层坐标参数对象。 + * @param {Object} feature - 需要获取的要素。 + */ + getVectorTileLayerStyle: function (coords, feature) { + if (!feature) { + return null; + } + var me = this, + layerName = feature.layerName, + layerStyleInfo = me.getLayerStyleInfo(layerName); + + //处理标签图层 + if (layerStyleInfo && layerStyleInfo.textField) { + var textField = layerStyleInfo.textField; + if (textField && textField.indexOf('.')) { + var arr = textField.split('.'); + textField = arr && arr.length > 0 && arr[arr.length - 1]; + } + feature.properties.textField = textField; + } + + me.vectorTileLayerStyles = me.vectorTileLayerStyles || {}; + + var style = me.vectorTileLayerStyles[layerName]; + if (style) { + feature = this._mergeFeatureTextField(feature, style); + return style; + } + + // CartoCSSToLeaflet内部做了客户端配置的cartoCSS和服务端cartoCSS的拼接处理 + // 客户端配置的cartoCSS会覆盖相应图层的服务端cartoCSS + var scale = this.getScaleFromCoords(coords); + var shaders = this.cartoCSSToLeaflet.pickShader(layerName) || []; + style = []; + for (var itemKey in shaders) { + var shader = shaders[itemKey]; + for (var j = 0; j < shader.length; j++) { + var serverStyle = this.cartoCSSToLeaflet.getValidStyleFromCarto(coords.z, scale, shader[j], feature,this.options.serverCartoCSSStyle); + if (serverStyle) { + style.push(serverStyle); + } + } + } + + feature = this._mergeFeatureTextField(feature, style); + + //次优先级是layers资源的默认的样式,最低优先级是CartoDefaultStyle的样式 + if (feature.type === "TEXT" || style.length === 0) { + style = this.cartoCSSToLeaflet.getValidStyleFromLayerInfo(feature, layerStyleInfo); + if (feature.type === "TEXT") { + style.textName = "[" + feature.properties.textField + "]"; + } + } + + me.vectorTileLayerStyles[layerName] = style; + return style; + }, + + /** + * @function TiledVectorLayer.prototype.getScale + * @description 通过缩放级别获取比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 比例尺。 + */ + getScale: function (zoom) { + var me = this; + //返回当前比例尺 + var z = zoom || me._map.getZoom(); + return me.scales[z]; + }, + + /** + * @function TiledVectorLayer.prototype.getScaleFromCoords + * @description 通过行列号获取比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 比例尺。 + */ + getScaleFromCoords: function (coords) { + var me = this, + scale; + if (me.scales && me.scales[coords.z]) { + return me.scales[coords.z]; + } + me.scales = me.scales || {}; + scale = me.getDefaultScale(coords); + me.scales[coords.z] = scale; + return scale; + }, + + /** + * @private + * @function TiledVectorLayer.prototype.getDefaultScale + * @description 根据行列号获取默认比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 默认比例尺。 + */ + getDefaultScale: function (coords) { + var me = this, + crs = me._crs; + if (crs.scales) { + return crs.scales[coords.z]; + } else { + var tileBounds = me._tileCoordsToBounds(coords); + var ne = crs.project(tileBounds.getNorthEast()); + var sw = crs.project(tileBounds.getSouthWest()); + var tileSize = me.options.tileSize; + var resolution = Math.max( + Math.abs(ne.x - sw.x) / tileSize, + Math.abs(ne.y - sw.y) / tileSize + ); + var mapUnit = Unit.METER; + if (crs.code) { + var array = crs.code.split(':'); + if (array && array.length > 1) { + var code = parseInt(array[1]); + mapUnit = code && code >= 4000 && code <= 5000 ? Unit.DEGREE : Unit.METER; + } + } + return resolutionToScale(resolution, 96, mapUnit); + } + }, + + _mergeFeatureTextField: function (feature, style) { + //如果设置了使用服务端cartocss样式,则文本专题图图层优先从carto中读取文本字段的key + if (!this.options.serverCartoCSSStyle || !style || feature.type !== "TEXT") { + return feature; + } + + var tempStyle = style; + if (!external_L_default().Util.isArray(style)) { + tempStyle = [style]; + } + for (var i = 0; i < tempStyle.length; i++) { + var textName = tempStyle[i].textName; + if (textName && feature.properties) { + feature.properties.textField = textName.substring(1, textName.length - 1); + } + } + + return feature; + }, + + _getTileUrl: function (coords) { + var me = this, + tileTemplate = me.options.tileTemplate; + if (!tileTemplate) { + return me._getDefaultTileUrl(coords); + } + return me._getTileTemplateUrl(coords) + }, + + _getTileTemplateUrl: function (coords) { + var me = this, + tileTemplate = me.options.tileTemplate; + var data = { + s: me._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: coords.z + }; + if (me._map && !me._map.options.crs.infinite) { + var invertedY = me._globalTileRange.max.y - coords.y; + if (me.options.tms) { + data['y'] = invertedY; + } + data['-y'] = invertedY; + } + + var tileUrl = external_L_default().Util.template(tileTemplate, external_L_default().extend(data, me.options)); + return tileUrl; + }, + + _initGrid: function () { + VectorGrid.prototype.onAdd.call(this, this._map); + }, + + _getSubdomain: (external_L_default()).TileLayer.prototype._getSubdomain, + _getDefaultTileUrl: function (coords) { + var x = coords.x, + y = coords.y; + var tileUrl = this._tileUrl + "&x=" + x + "&y=" + y; + var scale = this.getScaleFromCoords(coords); + tileUrl += "&scale=" + scale; + return tileUrl; + }, + + _initLayerUrl: function () { + var options = this.options; + if (!this.url) { + return; + } + var format = options.format.toString().toLowerCase(); + this._tileUrl = Util.urlPathAppend(this.url, "tileFeature." + format ); + this._tileUrl = Util.urlAppend(this._tileUrl, encodeURI(this._createURLParam(options))); + }, + + _createURLParam: function (options) { + var params = []; + + //添加安全认证信息 + var credential = this._getCredential(this._tileUrl); + if (credential) { + params.push(credential); + } + if (options.layersID) { + params.push("layersID=" + options.layersID); + } + if (options.layerNames) { + if (!external_L_default().Util.isArray(options.layerNames)) { + options.layerNames = [options.layerNames]; + } + var layerNamesString = '[' + options.layerNames.join(',') + ']'; + params.push("layerNames=" + layerNamesString); + } + //切片的起始参考点,默认为地图范围的左上角。 + var crs = this._crs; + if (crs.options && crs.options.origin) { + params.push("origin=" + JSON.stringify({ + x: crs.options.origin[0], + y: crs.options.origin[1] + })); + } else if (crs.projection && crs.projection.bounds) { + var bounds = crs.projection.bounds; + var tileOrigin = external_L_default().point(bounds.min.x, bounds.max.y); + params.push("origin=" + JSON.stringify({ + x: tileOrigin.x, + y: tileOrigin.y + })); + } + if (options.expands) { + params.push("expands=" + options.expands); + } + + params.push("returnAttributes=" + options.returnAttributes); + + params.push("cacheEnabled=" + options.cacheEnabled); + + var tileSize = this.options.tileSize; + params.push("width=" + tileSize); + params.push("height=" + tileSize); + return params.join("&"); + }, + + //获取token或key表达式 + _getCredential: function (url) { + var value = SecurityManager.getToken(url); + var credential = value ? new Credential(value, 'token') || new Credential(value, 'key') : null; + if (credential) { + return credential.getUrlParameters(); + } + return null; + } +}); + +var tiledVectorLayer = function (url, options) { + return new TiledVectorLayer(url, options); +}; + +;// CONCATENATED MODULE: external "function(){try{return turf}catch(e){return {}}}()" +const external_function_try_return_turf_catch_e_return_namespaceObject = function(){try{return turf}catch(e){return {}}}(); +;// CONCATENATED MODULE: ./src/leaflet/overlay/TurfLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class TurfLayer + * @deprecatedclassinstance L.supermap.turfLayer + * @classdesc Turf 图层。 + * @category Visualization Turf + * @extends {L.Layer} + * @param {Object} options - 参数。 + * @param {string} [options.attribution='© turfjs'] - 版权信息。 + * @usage + */ +var TurfLayer = external_L_default().GeoJSON.extend({ + + turfMap: { + "Measurement.along": ["line", "distance", "units"], + "Measurement.area": ["geojson"], + "Measurement.bbox": ["geojson"], + "Measurement.bboxPolygon": ["bbox"], + "Measurement.bearing": ["start", "end", "final"], + "Measurement.center": ["geojson", "properties"], + "Measurement.centerOfMass": ["geojson", "properties"], + "Measurement.centroid": ["geojson", "properties"], + "Measurement.destination": ["origin", "distance", "bearing", "units"], + "Measurement.distance": ["from", "to", "units"], + "Measurement.envelope": ["geojson"], + "Measurement.length": ["geojson", "units"], + "Measurement.midpoint": ["point1", "point2"], + "Measurement.pointOnFeature": ["geojson"], + "Measurement.polygonTangents": ["point", "polygon"], + "Measurement.rhumbBearing": ["start", "end", "final"], + "Measurement.rhumbDestination": ["origin", "distance", "bearing", "units"], + "Measurement.rhumbDistance": ["from", "to", "units"], + "Measurement.square": ["bbox"], + "Measurement.greatCircle": ["start", "end", "properties", "npoints", "offset"], + "CoordinateMutation.cleanCoords": ["geojson", "mutate"], + "CoordinateMutation.flip": ["geojson", "mutate"], + "CoordinateMutation.rewind": ["geojson", "reverse", "mutate"], + "CoordinateMutation.round": ["num", "precision"], + "CoordinateMutation.truncate": ["geojson", "precision", "coordinates", "mutate"], + "Transformation.bboxClip": ["feature", "bbox"], + "Transformation.bezierSpline": ["line", "resolution", "sharpness"], + "Transformation.buffer": ["geojson", "radius", "units", "steps"], + "Transformation.circle": ["center", "radius", "steps", "units", "properties"], + "Transformation.clone": ["geojson"], + "Transformation.concave": ["points", "maxEdge", "units"], + "Transformation.convex": ["geojson", "concavity"], + "Transformation.difference": ["polygon1", "polygon2"], + "Transformation.dissolve": ["featureCollection", "propertyName"], + "Transformation.intersect": ["poly1", "poly2"], + "Transformation.lineOffset": ["geojson", "distance", "units"], + "Transformation.simplify": ["feature", "tolerance", "highQuality"], + "Transformation.tesselate": ["poly"], + "Transformation.transformRotate": ["geojson", "angle", "pivot", "mutate"], + "Transformation.transformTranslate": ["geojson", "distance", "direction", "units", "zTranslation", "mutate"], + "Transformation.transformScale": ["geojson", "factor", "origin", "mutate"], + "Transformation.union": ["A"], + "Transformation.voronoi": ["points", "bbox"], + "featureConversion.combine": ["fc"], + "featureConversion.explode": ["geojson"], + "featureConversion.flatten": ["geojson"], + "featureConversion.lineStringToPolygon": ["lines", "properties", "autoComplete", "orderCoords"], + "featureConversion.polygonize": ["geojson"], + "featureConversion.polygonToLineString": ["polygon", "properties"], + "Misc.kinks": ["featureIn"], + "Misc.lineArc": ["center", "radius", "bearing1", "bearing2", "steps", "units"], + "Misc.lineChunk": ["geojson", "segmentLength", "units", "reverse"], + "Misc.lineIntersect": ["line1", "line2"], + "Misc.lineOverlap": ["line1", "line2"], + "Misc.lineSegment": ["geojson"], + "Misc.lineSlice": ["startPt", "stopPt", "line"], + "Misc.lineSliceAlong": ["line", "startDist", "stopDist", "units"], + "Misc.lineSplit": ["line", "splitter"], + "Misc.mask": ["polygon", "mask"], + "Misc.pointOnLine": ["lines", "pt", "units"], + "Misc.sector": ["center", "radius", "bearing1", "bearing2", "steps", "units"], + "Misc.shortestPath": ["start", "end", "obstacles", "units", "resolution"], + "Misc.unkinkPolygon": ["geojson"], + "Helper.featureCollection": ["features", "bbox", "id"], + "Helper.feature": ["geometry", "properties", "bbox", "id"], + "Helper.geometryCollection": ["geometries", "properties", "bbox", "id"], + "Helper.lineString": ["coordinates", "properties", "bbox", "id"], + "Helper.multiLineString": ["coordinates", "properties", "bbox", "id"], + "Helper.multiPoint": ["coordinates", "properties", "bbox", "id"], + "Helper.multiPolygon": ["coordinates", "properties", "bbox", "id"], + "Helper.point": ["coordinates", "properties", "bbox", "id"], + "Helper.polygon": ["coordinates", "properties", "bbox", "id"], + "Data.sample": ["featurecollection", "num"], + "Interpolation.interpolate": ["points", "cellSize", "gridType", "property", "units", "weight"], + "Interpolation.isobands": ["pointGrid", "breaks", "zProperty", "commonProperties", "breaksProperties"], + "Interpolation.isolines": ["pointGrid", "breaks", "zProperty", "commonProperties", "breaksProperties"], + "Interpolation.planepoint": ["point", "triangle"], + "Interpolation.tin": ["points", "z"], + "Joins.pointsWithinPolygon": ["points", "polygons"], + "Joins.tag": ["points", "polygons", "field", "outField", "mask", "properties"], + "Grids.hexGrid": ["bbox", "cellSide", "units", "triangles"], + "Grids.pointGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Grids.squareGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Grids.triangleGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Classification.nearestPoint": ["targetPoint", "points"], + "Aggregation.collect": ["polygons", "points", "inProperty", "outProperty"], + "Aggregation.clustersDbscan": ["points", "maxDistance", "units", "minPoints", "mutate"], + "Aggregation.clustersKmeans": ["points", "numberOfClusters", "mutate"], + "Meta.coordAll": ["geojson"], + "Meta.coordEach": ["geojson", "callback", "excludeWrapCoord"], + "Meta.coordReduce": ["geojson", "callback", "initialValue", "excludeWrapCoord"], + "Meta.featureEach": ["geojson", "callback"], + "Meta.featureReduce": ["geojson", "callback", "initialValue"], + "Meta.flattenEach": ["geojson", "callback"], + "Meta.flattenReduce": ["geojson", "callback", "initialValue"], + "Meta.getCoord": ["coord"], + "Meta.getCoords": ["coords"], + "Meta.getGeom": ["geojson"], + "Meta.getGeomType": ["geojson", "name"], + "Meta.geomEach": ["geojson", "callback"], + "Meta.geomReduce": ["geojson", "callback", "initialValue"], + "Meta.propEach": ["geojson", "callback"], + "Meta.propReduce": ["geojson", "callback", "initialValue"], + "Meta.segmentEach": ["geojson", "callback"], + "Meta.segmentReduce": ["geojson", "callback", "initialValue"], + "Meta.getCluster": ["geojson", "filter"], + "Meta.clusterEach": ["geojson", "property", "callback"], + "Meta.clusterReduce": ["geojson", "property", "callback", "initialValue"], + "Assertions.collectionOf": ["featureCollection", "type", "name"], + "Assertions.containsNumber": ["coordinates"], + "Assertions.geojsonType": ["value", "type", "name"], + "Assertions.featureOf": ["feature", "type", "name"], + "Booleans.booleanClockwise": ["line"], + "Booleans.booleanContains": ["feature1", "feature2"], + "Booleans.booleanCrosses": ["feature1", "feature2"], + "Booleans.booleanDisjoint": ["feature1", "feature2"], + "Booleans.booleanEqual": ["feature1", "feature2"], + "Booleans.booleanOverlap": ["feature1", "feature2"], + "Booleans.booleanParallel": ["feature1", "feature2"], + "Booleans.booleanPointInPolygon": ["point", "polygon", "ignoreBoundary"], + "Booleans.booleanPointOnLine": ["point", "linestring", "ignoreEndVertices"], + "UnitConversion.bearingToAngle": ["bearing"], + "UnitConversion.convertArea": ["area", "originalUnit", "finalUnit"], + "UnitConversion.convertLength": ["length", "originalUnit", "finalUnit"], + "UnitConversion.degreesToradians": ["degrees"], + "UnitConversion.lengthToRadians": ["distance", "units"], + "UnitConversion.lengthToDegrees": ["distance", "units"], + "UnitConversion.radiansToLength": ["radians", "units"], + "UnitConversion.radiansToDegrees": ["radians"], + "UnitConversion.toMercator": ["geojson", "mutate"], + "UnitConversion.toWgs84": ["geojson", "mutate"] + }, + options: { + attribution: core_Attributions.Turf.attribution + }, + + initialize: function (options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + external_L_default().stamp(this); + this._layers = {}; + }, + // 5.0.0 及以上版本参数配置 + turfOptionMap: { + "Measurement.along": ["line", "distance", {units: ""}], + "Measurement.bboxPolygon": ["bbox", {properties: "", id: ""}], + "Measurement.bearing": ["start", "end", {final: ""}], + "Measurement.center": ["geojson", {properties: ""}], + "Measurement.destination": ["origin", "distance", "bearing", {units: "", properties: ""}], + "Measurement.distance": ["from", "to", {units: ""}], + "Measurement.length": ["geojson", {units: ""}], + "Measurement.rhumbBearing": ["start", "end", {final: ""}], + "Measurement.rhumbDestination": ["origin", "distance", "bearing", {units: "", properties: ""}], + "Measurement.rhumbDistance": ["from", "to", {units: ""}], + "Measurement.greatCircle": ["start", "end", {properties: "", npoints: "", offset: ""}], + "CoordinateMutation.cleanCoords": ["geojson", {mutate: ""}], + "CoordinateMutation.flip": ["geojson", {mutate: ""}], + "CoordinateMutation.rewind": ["geojson", {mutate: "", reverse: ""}], + "CoordinateMutation.truncate": ["geojson", {precision: "", coordinates: "", mutate: ""}], + "Transformation.bezierSpline": ["line", {resolution: "", sharpness: ""}], + "Transformation.buffer": ["geojson", "radius", {units: "", steps: ""}], + "Transformation.circle": ["center", "radius", {units: "", steps: "", properties: ""}], + "Transformation.concave": ["points", {maxEdge: "", units: ""}], + "Transformation.convex": ["geojson", {concavity: ""}], + "Transformation.dissolve": ["featureCollection", {propertyName: ""}], + "Transformation.lineOffset": ["geojson", "distance", {units: ""}], + "Transformation.simplify": ["geojson", {tolerance: "", highQuality: ""}], + "Transformation.transformRotate": ["geojson", "angle", {pivot: "", mutate: ""}], + "Transformation.transformTranslate": ["geojson", "distance", "direction", { + units: "", + zTranslation: "", + mutate: "" + }], + "Transformation.transformScale": ["geojson", "factor", {origin: "", mutate: ""}], + "Transformation.voronoi": ["points", {bbox: ""}], + "featureConversion.lineStringToPolygon": ["lines", {properties: "", autoComplete: "", orderCoords: ""}], + "featureConversion.polygonToLineString": ["polygon", {properties: ""}], + "Misc.lineArc": ["center", "radius", "bearing1", "bearing2", {steps: "", units: ""}], + "Misc.lineChunk": ["geojson", "segmentLength", {units: "", reverse: ""}], + "Misc.lineOverlap": ["line1", "line2", {tolerance: ""}], + "Misc.lineSliceAlong": ["line", "startDist", "stopDist", {units: ""}], + "Misc.pointOnLine": ["lines", "pt", {units: ""}], + "Misc.sector": ["center", "radius", "bearing1", "bearing2", {units: "", steps: "", properties: ""}], + "Misc.shortestPath": ["start", "end", {obstacles: "", units: "", resolution: ""}], + "Helper.feature": ["geometry", "properties", {bbox: "", id: ""}], + "Helper.geometryCollection": ["geometries", "properties", {bbox: "", id: ""}], + "Helper.lineString": ["coordinates", "properties", {bbox: "", id: ""}], + "Helper.multiLineString": ["coordinates", "properties", {bbox: "", id: ""}], + "Helper.multiPoint": ["coordinates", "properties", {bbox: "", id: ""}], + "Helper.multiPolygon": ["coordinates", "properties", {bbox: "", id: ""}], + "Helper.point": ["coordinates", "properties", {bbox: "", id: ""}], + "Helper.polygon": ["coordinates", "properties", {bbox: "", id: ""}], + "Interpolation.interpolate": ["points", "cellSize", {gridType: "", property: "", units: "", weight: ""}], + "Interpolation.isobands": ["pointGrid", "breaks", {zProperty: "", commonProperties: "", breaksProperties: ""}], + "Interpolation.isolines": ["pointGrid", "breaks", {zProperty: "", commonProperties: "", breaksProperties: ""}], + "Grids.hexGrid": ["bbox", "cellSide", {units: "", triangles: "", properties: "", mask: ""}], + "Grids.pointGrid": ["bbox", "cellSide", {units: "", mask: "", properties: ""}], + "Grids.squareGrid": ["bbox", "cellSide", {units: "", mask: "", properties: ""}], + "Grids.triangleGrid": ["bbox", "cellSide", {units: "", mask: "", properties: ""}], + "Aggregation.clustersDbscan": ["points", "maxDistance", {units: "", minPoints: "", mutate: ""}], + "Aggregation.clustersKmeans": ["points", {numberOfClusters: "", mutate: ""}], + "Booleans.booleanPointInPolygon": ["point", "polygon", {ignoreBoundary: ""}], + "Booleans.booleanPointOnLine": ["point", "linestring", {ignoreEndVertices: ""}], + "UnitConversion.toMercator": ["geojson", {mutate: ""}], + "UnitConversion.toWgs84": ["geojson", {mutate: ""}] + }, + + /** + * @function TurfLayer.prototype.process + * @description 执行 Turf.js 提供的相关空间分析方法。 + * @param {string} type - Turf.js 提供的空间分析方法名。 + * @param {Object} args - Turf.js 提供的空间分析方法对应的参数对象。 + * @param {function} callback - 空间分析完成执行的回调函数,返回执行的结果。 + * @param {boolean} [addFeaturesToMap=true] - 是否添加到地图。 + */ + process: function (type, args, callback, addFeaturesToMap) { + // 兼容版本4到5 + var result; + try { + result = external_function_try_return_turf_catch_e_return_namespaceObject[type.split('.')[1]].apply(this, this.parse(type, args)); + } catch (e) { + result = external_function_try_return_turf_catch_e_return_namespaceObject[type.split('.')[1]].apply(this, this.parseOption(type, args)); + } + addFeaturesToMap = addFeaturesToMap == null ? true : addFeaturesToMap; + if (addFeaturesToMap) { + this.addData([result]); + } + if (callback) { + callback(result); + } + }, + + parse: function (type, args) { + if (type === 'Transformation.union') { + return args['A']; + } + var result = []; + var tempArgs = this.turfMap[type]; + if (tempArgs) { + tempArgs.map(function (key) { + result.push(args[key]); + return args[key]; + }); + } + return result; + }, + parseOption(type, args) { + var result = []; + var tempArgs = this.turfOptionMap[type]; + tempArgs.map(function (key) { + if (key instanceof Object) { + var options = key; + Object.keys(options).forEach(function (k) { + options[k] = args[k] + }) + result.push(options); + } else { + result.push(args[key]) + } + return args; + }) + return result; + } +}); + +var turfLayer = function (options) { + return new TurfLayer(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/HeatMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class HeatMapFeature + * @deprecatedclassinstance L.supermap.heatMapFeature + * @category Visualization HeatMap + * @classdesc 客户端专题图要素类。 + * 支持的 geometry 参数类型为 {@link L.Point}、{@link L.LatLng}、{@link L.CircleMarker}。 + * @extends {L.Class} + * @param {(L.Point|L.LatLng|L.CircleMarker)} geometry - 要素图形。 + * @param {Object} attributes - 要素属性。 + * @usage + */ +var HeatMapFeature = external_L_default().Class.extend({ + initialize: function (geometry, attributes) { + this.geometry = geometry; + this.attributes = attributes; + }, + + /** + * @function HeatMapFeature.prototype.toFeature + * @description 转为内部矢量要素。 + * @returns {FeatureVector} 内部矢量要素。 + */ + toFeature: function () { + var geometry = this.geometry; + var points = []; + if (geometry instanceof (external_L_default()).LatLng) { + points = [geometry.lng, geometry.lat]; + } else if (geometry instanceof (external_L_default()).Point) { + points = [geometry.x, geometry.y]; + } else if (geometry instanceof (external_L_default()).CircleMarker) { + var latLng = geometry.getLatLng(); + points = [latLng.lng, latLng.lat]; + } else { + points = geometry; + } + if (points.length === 2) { + geometry = new Point(points[0], points[1]); + } + + return new Vector(geometry, this.attributes); + } + +}); + +var heatMapFeature = function (geometry, attributes) { + return new HeatMapFeature(geometry, attributes); +}; + +/** + * @class HeatMapLayer + * @classdesc 热力图层类。 + * @category Visualization HeatMap + * @param {string} name - 图层名称。 + * @param {boolean} [loadWhileAnimating=true] - 是否实时重绘。(当绘制大数据量要素的情况下会出现卡顿,建议把该参数设为 false)。 + * @param {Array.} [colors=['blue', 'cyan', 'lime', 'yellow', 'red']] - 颜色线性渐变数组,颜色值必须为 canvas 所支持的。 + * @param {Object} options - 构造参数。 + * @param {L.Map} options.map - Leaflet Map 对象。 + * @param {string} [options.id] - 专题图层 ID,默认使用 CommonUtil.createUniqueID("heatMapLayer_") 创建专题图层 ID。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.featureWeight] - 对应 feature 属性中的热点权重字段名称,权重值类型为 number。 + * @param {number} [options.radius=50] - 热点渲染的最大半径(热点像素半径),单位为 px,当 useGeoUnit 参数 为 true 时,单位使用当前图层地理坐标单位。热点显示的时候以精确点为中心点开始往四周辐射衰减,其衰减半径和权重值成比列。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.useGeoUnit=false] - 使用地理单位,即默认热点半径默认使用像素单位。 当设置为 true 时,热点半径和图层地理坐标保持一致。 + * @param {number} [options.blur] - 模糊量,单位为 px。默认值为半径的二分之一。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * + * @extends {L.Layer} + * @fires HeatMapLayer#featuresremoved + * @fires HeatMapLayer#changelayer + * @usage + */ +var HeatMapLayer = external_L_default().Layer.extend({ + options: { + //要素坐标是否和地图坐标系一致,默认为false,要素默认是经纬度坐标。 + alwaysMapCRS: false, + //热力图默认参数: + id: Util.createUniqueID("heatMapLayer_"), + featureWeight: null, + opacity: 1, + colors: ['blue', 'cyan', 'lime', 'yellow', 'red'], + useGeoUnit: false, + radius: 50, + attribution: core_Attributions.Common.attribution + }, + + initialize: function (name, options) { + external_L_default().Util.setOptions(this, options); + this.name = name; + + this.features = []; + this.maxWeight = null; + this.minWeight = null; + this.rootCanvas = null; + this.canvasContext = null; + this.maxWidth = null; + this.maxHeight = null; + + //热力图参数: + this.id = this.options.id; + /* + * options.featureWeight对应 feature 属性中的热点权重字段名称,权重值类型为float + * //例如: + * //feature.attributes中表示权重的字段为height,则在HeatMapLayer的featureWeight参数赋值为"height" + * feature1.attributes.height = 7.0; + * feature2.attributes.height = 6.0; + * var heatMapLayer = new HeatMapLayer("heatmaplayer",{"featureWeight":"height"}); + * heatMapLayer.addFeatures([feature1,feature2]); + * @type {null} + */ + this.featureWeight = this.options.featureWeight; + this.colors = this.options.colors; + this.useGeoUnit = this.options.useGeoUnit; + this.opacity = this.options.opacity; + this.radius = this.options.radius; + this.blur = this.options.blur; + this.movingOffset = [0, 0]; + }, + + /** + * @function HeatMapLayer.prototype.onRemove + * @description 删除某个地图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onRemove: function (map) { + var me = this; + external_L_default().DomUtil.remove(me.rootCanvas); + map.off("mousemove", me.mouseMoveHandler); + }, + + /** + * @function HeatMapLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function (map) { + var me = this; + + me._map = map; + me._createCanvasContainer(); + if (!me.rootCanvas) { + map.removeLayer(me); + return; + } + //初始化渲染器 + var size = map.getSize(); + me.rootCanvas.width = me.maxWidth = size.x; + me.rootCanvas.height = me.maxHeight = size.y; + me._updateOpacity(); + + me.mouseMoveHandler = function (e) { + var xy = e.layerPoint; + me.currentMousePosition = external_L_default().point(xy.x + me.movingOffset[0], xy.y + me.movingOffset[1]); + }; + map.on("mousemove", me.mouseMoveHandler); + + me.update(); + }, + + /** + * @function HeatMapLayer.prototype.addFeatures + * @description 添加热点信息。 + * @param {(GeoJSONObject|HeatMapFeature)} features - 待添加的要素数组。 + * + * @example + * var geojson = { + * "type": "FeatureCollection", + * "features": [ + * { + * "type": "feature", + * "geometry": { + * "type": "Point", //只支持point类型 + * "coordinates": [0, 0] + * }, + * "properties": { + * "height": Math.random()*9, + * "geoRadius": useGeoRadius?radius:null + * } + * } + * ] + * }; + * var heatMapLayer = new HeatMapLayer("heatmaplayer",{"id":"heatmap"}); + * heatMapLayer.addFeatures(geojson); + */ + addFeatures: function (features) { + this.features = this.toiClientFeature(features); + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype.refresh + * @description 强制刷新当前热点显示,在图层热点数组发生变化后调用,更新显示。 + */ + refresh: function () { + if (this.features.length === 0) { + return; + } + if (this._map) { + var extent = this._map.getBounds(); + this.updateHeatPoints(extent); + } + }, + + /** + * @function HeatMapLayer.prototype.updateHeatPoints + * @description 刷新热点图显示。 + * @param {L.LatLngBounds} bounds - 当前显示范围。 + */ + updateHeatPoints: function (bounds) { + if (this.features && this.features.length > 0) { + this.convertFastToPixelPoints(bounds); + } else { + this.canvasContext.clearRect(0, 0, this.maxWidth, this.maxWidth); + } + }, + + /** + * @function HeatMapLayer.prototype.convertFastToPixelPoints + * @description 过滤位于当前显示范围内的热点,并转换其为当前分辨率下的像素坐标。 + * @param {L.LatLngBounds} bounds - 当前显示范围。 + * @private + */ + convertFastToPixelPoints: function (bounds) { + var data = [], x, y, k, resolution, maxTemp, minTemp, maxWeightTemp; + //获取当前像素下的地理范围 + var dw = bounds.getEast() - bounds.getWest(); + var dh = bounds.getNorth() - bounds.getSouth(); + var mapCanvas = this._map.getSize(); + + if (dw / mapCanvas.x > dh / mapCanvas.y) { + resolution = dw / mapCanvas.x; + } else { + resolution = dh / mapCanvas.y; + } + + //热点半径 + this.useRadius = this.useGeoUnit ? parseInt(this.radius / resolution) : this.radius; + + for (var i = 0; i < this.features.length; i++) { + var feature = this.features[i]; + var point = feature.geometry; + var pixelPoint = this.getLocalXY(new LonLat(point.x, point.y)); + if (this.featureWeight) { + pixelPoint.weight = feature.attributes[this.featureWeight];//point.value; + if (!this.maxWeight) { + //找出最大最小权重值 + maxTemp = maxTemp ? maxTemp : pixelPoint.weight; + minTemp = minTemp ? minTemp : pixelPoint.weight; + maxTemp = Math.max(maxTemp, pixelPoint.weight); + minTemp = Math.min(minTemp, pixelPoint.weight); + } + } else { + pixelPoint.weight = 1; + } + + x = Math.floor(pixelPoint[0]); + y = Math.floor(pixelPoint[1]); + k = pixelPoint.weight; + + data.push([x, y, k]); + } + + //无最大权重设置 + if (!this.maxWeight) { + if (maxTemp && minTemp) { + maxWeightTemp = (maxTemp + minTemp) / 2; + } else { + maxWeightTemp = 1; + } + this.draw(data, maxWeightTemp); + } else { + this.draw(data, this.maxWeight); + } + + }, + + /** + * @function HeatMapLayer.prototype.draw + * @description 绘制热点图。 + * @param {Array} data - convertToPixelPoints 方法计算出的点。 + * @param {number} maxWeight - 最大权重。 + * @private + */ + draw: function (data, maxWeight) { + if (this.maxHeight > 0 && this.maxWidth > 0) { + var ctx = this.canvasContext; + //清空 + this.canvasContext.clearRect(0, 0, this.maxWidth, this.maxHeight); + this.drawCircle(this.useRadius); + this.createGradient(); + + for (var i = 0; i < data.length; i++) { + var p = data[i]; + this.canvasContext.globalAlpha = Math.max(p[2] / maxWeight, 0.05); + this.canvasContext.drawImage(this.circle, p[0] - this.useRadius, p[1] - this.useRadius); + } + + var colored = ctx.getImageData(0, 0, this.maxWidth, this.maxHeight); + this.colorize(colored.data, this.grad); + ctx.putImageData(colored, 0, 0); + } else { + return false; + } + + }, + + /** + * @function HeatMapLayer.prototype.colorize + * @description 根据渐变色重置热点图 rgb 值。 + * @param {Array} pixels 像素 RGBA 值。 + * @param {Array} gradient 渐变 canvas.getImageData.data。 + * @private + */ + colorize: function (pixels, gradient) { + for (var i = 0, j; i < pixels.length; i += 4) { + j = pixels[i + 3] * 4; + if (j) { + pixels[i] = gradient[j]; + pixels[i + 1] = gradient[j + 1]; + pixels[i + 2] = gradient[j + 2]; + } + } + }, + + /** + * @function HeatMapLayer.drawCircle + * @description 绘制热点半径圆。 + * @param {number} r - 热点半径。 + * @private + */ + drawCircle: function (r) { + var blur = this.blur || r / 2; + + var circle = this.circle = document.createElement('canvas'), + ctx = circle.getContext("2d"); + + circle.height = 2 * r; + circle.width = 2 * r; + ctx.shadowOffsetX = ctx.shadowOffsetY = 2 * r; + ctx.shadowBlur = blur; + ctx.shadowColor = "#000000"; + + ctx.beginPath(); + ctx.arc(-r, -r, r / 2, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + }, + + /** + * @function HeatMapLayer.createGradient + * @description 根据 this.canvasColors 设置渐变并 getImageData。 + * @private + */ + createGradient: function () { + var colors = this.colors; + var canvas = document.createElement('canvas'), + ctx = canvas.getContext("2d"), + gradient = ctx.createLinearGradient(0, 0, 0, 256); + canvas.height = 256; + canvas.width = 1; + + var index = 1; + for (var i = 0, len = colors.length; i < len; i++) { + gradient.addColorStop(index / len, colors[i]); + index++; + } + + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 1, 256); + + this.grad = ctx.getImageData(0, 0, 1, 256).data; + }, + + /** + * @function HeatMapLayer.prototype.update + * @description 更新图层。 + */ + update: function () { + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + external_L_default().DomUtil.setPosition(this.rootCanvas, mapOffset); + + var me = this; + + me.refresh(); + + if (me.currentMousePosition) { + me.currentMousePosition = external_L_default().point( + me.currentMousePosition.x - me.movingOffset[0], + me.currentMousePosition.y - me.movingOffset[1]); + } + + me.movingOffset = [0, 0]; + me._zoom = me._map.getZoom(); + me._center = me._map.getCenter(); + }, + + /** + * @function HeatMapLayer.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {Array} coordinate - 地理坐标。 + */ + getLocalXY: function (coordinate) { + if (!this._map) { + return coordinate; + } + var coor = coordinate; + if (external_L_default().Util.isArray(coordinate)) { + coor = external_L_default().point(coordinate[0], coordinate[1]); + } + if (!(coordinate instanceof (external_L_default()).Point)) { + if (coordinate instanceof Point || coordinate instanceof GeoText) { + coor = external_L_default().point(coordinate.x, coordinate.y); + } else { + coor = external_L_default().point(coordinate.lon, coordinate.lat); + } + + } + var point = this._map.latLngToContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(coor.y, coor.x) : this._map.options.crs.unproject(coor)); + return [point.x, point.y]; + }, + + /** + * @function HeatMapLayer.prototype.setOpacity + * @description 设置图层的不透明度,取值 [0-1] 之间。 + * @param {number} opacity - 不透明度。 + */ + setOpacity: function (opacity) { + var me = this; + if (opacity === me.options.opacity) { + return; + } + if (opacity) { + me.options.opacity = opacity; + } + me._updateOpacity(); + }, + + /** + * @function HeatMapLayer.prototype.removeFeatures + * @description 移除指定的热点信息。 + * @param {Array.} features - 热点信息数组。 + */ + removeFeatures: function (features) { + if (!features || features.length === 0 || !this.features || this.features.length === 0) { + return; + } + if (features === this.features) { + return this.removeAllFeatures(); + } + if (!(Util.isArray(features))) { + features = [features]; + } + var heatPoint, index, heatPointsFailedRemoved = []; + for (var i = 0, len = features.length; i < len; i++) { + heatPoint = features[i]; + index = Util.indexOf(this.features, heatPoint); + //找不到视为删除失败 + if (index === -1) { + heatPointsFailedRemoved.push(heatPoint); + continue; + } + //删除热点 + this.features.splice(index, 1); + } + var succeed = heatPointsFailedRemoved.length == 0 ? true : false; + //派发删除features成功的事件 + /** + * @event HeatMapLayer#featuresremoved + * @description 删除features成功后触发。 + * @property {Array.} features - 事件对象。 + * @property {boolean} succeed - 删除是否成功,false 为失败,true 为成功。 + */ + this._map.fire("featuresremoved", {features: heatPointsFailedRemoved, succeed: succeed}); + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype.removeAllFeatures + * @description 移除全部的热点信息。 + */ + removeAllFeatures: function () { + this.features = []; + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype._createCanvasContainer + * @description 创建热力图绘制容器。 + * @private + */ + _createCanvasContainer: function () { + //构建绘图面板 + var parentContainer = this.getPane(); + var animated = this._map.options.zoomAnimation && (external_L_default()).Browser.any3d; + var className = 'heatMapLayer leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide'); + this.rootCanvas = external_L_default().DomUtil.create("canvas", className, parentContainer); + + var originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + this.rootCanvas.id = this.id; + this.rootCanvas.style[originProp] = '50% 50%'; + + this.rootCanvas.style.position = "absolute"; + this.rootCanvas.style.zIndex = 200; + + Util.modifyDOMElement(this.rootCanvas, null, null, null, + null, null, null, this.opacity); + this.canvasContext = this.rootCanvas.getContext('2d'); + }, + + _updateOpacity: function () { + var me = this; + Util.modifyDOMElement(me.rootCanvas, null, null, null, null, null, null, me.options.opacity); + if (me._map !== null) { + /** + * @event HeatMapLayer#changelayer + * @description 图层透明度更新成功之后触发。 + * @property {HeatMapLayer} layer - 图层。 + * @property {string} property - 改变的图层属性。 + */ + me._map.fire("changelayer", {layer: me, property: "opacity"}); + } + }, + + /** + * @function HeatMapLayer.prototype.getEvents + * @description 获取图层事件。 + * @returns {Object} 返回图层支持的事件。 + * @private + */ + getEvents: function () { + var me = this; + var events = { + zoomend: me._reset, + moveend: me._reset, + resize: me._resize + }; + if (this._map._zoomAnimated) { + events.zoomanim = me._zoomAnim; + } + return events; + }, + + /** + * @function HeatMapLayer.prototype.toiClientFeature + * @description 转为 iClient 要素。 + * @param {(GeoJSONObject|HeatMapFeature)} features - 待添加的要素数组。 + * @returns {FeatureVector} 转换后的 iClient 要素。 + */ + toiClientFeature: function (features) { + if (!external_L_default().Util.isArray(features)) { + features = [features]; + } + let featuresTemp = []; + for (let i = 0, len = features.length; i < len; i++) { + //支持ThemeFeature类型的feature + //支持传入ThemeFeature类型,ThemeFeature.geometry instanceof L.LatLng | ThemeFeature.geometry instanceof L.Point + if (features[i] instanceof HeatMapFeature) { + featuresTemp.push(features[i].toFeature()); + } else if (["FeatureCollection", "Feature", "Geometry"].indexOf(features[i].type) != -1) { + const format = new GeoJSON(); + featuresTemp = featuresTemp.concat(format.read(features[i])); + } else if (features[i].geometry && features[i].geometry.parts) { + //iServer服务器返回数据格式 todo 暂未找到更好的参数判断,暂用 geometry.parts 试用 + featuresTemp.push(ServerFeature.fromJson(features[i]).toFeature()); + } else { + throw new Error("Features's type does not match, please check."); + } + } + return featuresTemp; + }, + + _zoomAnim: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._getCenterOffset(e.center)._multiplyBy(-scale).subtract(this._map._getMapPanePos()); + + if ((external_L_default()).DomUtil.setTransform) { + external_L_default().DomUtil.setTransform(this.rootCanvas, offset, scale); + + } else { + this.rootCanvas.style[(external_L_default()).DomUtil.TRANSFORM] = external_L_default().DomUtil.getTranslateString(offset) + ' scale(' + scale + ')'; + } + }, + + //缩放移动重绘 + _reset: function () { + var me = this; + me.update(); + var size = me._map.getSize(); + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + external_L_default().DomUtil.setPosition(this.rootCanvas, mapOffset); + + if (parseFloat(me.rootCanvas.width) !== parseFloat(size.x)) { + me.rootCanvas.width = size.x; + } + if (parseFloat(me.rootCanvas.height) !== parseFloat(size.y)) { + me.rootCanvas.height = size.y; + } + me.refresh(); + }, + + //通知渲染器的尺寸变化 + _resize: function () { + var me = this; + var newSize = me._map.getSize(); + me.maxWidth = newSize.x; + me.maxHeight = newSize.y; + } + + +}); +var heatMapLayer = function (name, options) { + return new HeatMapLayer(name, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/mapv/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/services/AddressMatchService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class AddressMatchService + * @deprecatedclassinstance L.supermap.addressMatchService + * @constructs AddressMatchService + * @classdesc 地址匹配服务。 + * @category iServer AddressMatch + * @extends {ServiceBase} + * @example + * new AddressMatchService(url,options) + * .code(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var AddressMatchService_AddressMatchService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function AddressMatchService.prototype.code + * @description 获取正向地址匹配结果。 + * @param {GeoCodingParameter} params - 正向匹配参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + code: function (params, callback) { + var me = this; + var addressMatchService = new AddressMatchService(this.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + addressMatchService.code(Util.urlPathAppend(me.url, 'geocoding'), params); + }, + + /** + * @function AddressMatchService.prototype.decode + * @description 获取反向地址匹配结果。 + * @param {GeoDecodingParameter} params - 反向匹配参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + decode: function (params, callback) { + var me = this; + var addressMatchService = new AddressMatchService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + addressMatchService.decode(Util.urlPathAppend(me.url, 'geodecoding'), params); + } + +}); + +var addressMatchService = function (url, options) { + return new AddressMatchService_AddressMatchService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/ChartService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ChartService + * @deprecatedclassinstance L.supermap.chartService + * @classdesc 海图服务。 + * @category iServer Map Chart + * @extends {ServiceBase} + * @example + * new ChartService(url) + * .queryChart(param,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var ChartService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ChartService.prototype.queryChart + * @description 查询海图服务。 + * @param {ChartQueryParameters} params - 海图查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryChart: function (params, callback, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var chartQueryService = new ChartQueryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + + chartQueryService.processAsync(param); + }, + + /** + * @function ChartService.prototype.getChartFeatureInfo + * @description 获取海图物标信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getChartFeatureInfo: function (callback) { + var me = this, url = me.url.concat(); + url = Util.urlPathAppend(url, 'chartFeatureInfoSpecs'); + var chartFeatureInfoSpecsService = new ChartFeatureInfoSpecsService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + chartFeatureInfoSpecsService.processAsync(); + }, + + _processParams: function (params) { + if (!params) { + return {}; + } + params.returnContent = (params.returnContent == null) ? true : params.returnContent; + if (params.chartQueryFilterParameters && !external_L_default().Util.isArray(params.chartQueryFilterParameters)) { + params.chartQueryFilterParameters = [params.chartQueryFilterParameters]; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + }, + _processFormat: function (resultFormat) { + return (resultFormat) ? resultFormat : DataFormat.GEOJSON; + } +}); + +var chartService = function (url, options) { + return new ChartService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/DatasetService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class DatasetService + * @deprecatedclassinstance L.supermap.datasetService + * @classdesc 数据集信息服务类。 + * @category iServer Data Dataset + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var DatasetService_DatasetService = ServiceBase.extend({ + + initialize: function (url,options) { + ServiceBase.prototype.initialize.call(this, url,options); + }, + + + /** + * @function DatasetService.prototype.getDatasets + * @description 数据集查询服务。 + * @example + * new DatasetService(url).getDatasets(datasourceName,function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasets: function (datasourceName, callback) { + if (!datasourceName) { + return; + } + const me = this; + const datasetService = new DatasetService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasetService.getDatasetsService(datasourceName); + }, + + /** + * @function DatasetService.prototype.getDataset + * @description 数据集信息查询服务。 + * @example + * new DatasetService(url).getDataset(datasourceName, datasetName, function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {string} datasetName - 数据集名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDataset: function (datasourceName, datasetName, callback) { + if (!datasourceName || !datasetName) { + return; + } + const me = this; + const datasetService = new DatasetService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasetService.getDatasetService(datasourceName, datasetName); + }, + + /** + * @function DatasetService.prototype.setDataset + * @description 数据集信息设置服务。可实现修改已存在数据集,新增不存在数据集。 + * @example + * new DatasetService(url).setDataset(params, function(result){ + * //doSomething + * }); + * @param {CreateDatasetParameters | UpdateDatasetParameters } params - 数据集创建参数类(当前数据源下的数据集不存在时,新建数据集) || 数据集信息更改参数类(当前数据源下的数据集存在时,更改数据集信息) + * @param {RequestCallback} callback - 回调函数。 + */ + setDataset(params, callback) { + if(!(params instanceof CreateDatasetParameters) && !(params instanceof UpdateDatasetParameters)){ + return; + }else if (params instanceof CreateDatasetParameters) { + var datasetParams = { + "datasetType": params.datasetType, + "datasetName": params.datasetName + } + }else if(params instanceof UpdateDatasetParameters){ + datasetParams = { + "datasetName": params.datasetName, + "isFileCache": params.isFileCache, + "description": params.description, + "prjCoordSys": params.prjCoordSys, + "charset": params.charset + } + } + const me = this; + const url = Util.urlPathAppend(me.url, `datasources/name/${params.datasourceName}/datasets/name/${params.datasetName}`); + const datasetService = new DatasetService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasetService.setDatasetService(datasetParams); + }, + + /** + * @function DatasetService.prototype.deleteDataset + * @description 指定数据源下的数据集删除服务。 + * @example + * new DatasetService(url).deleteDataset(datasourceName, datasetName, function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {string} datasetName - 数据集名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + deleteDataset: function (datasourceName, datasetName, callback) { + const me = this; + const url = Util.urlPathAppend(me.url, `datasources/name/${datasourceName}/datasets/name/${datasetName}`); + const datasetService = new DatasetService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasetService.deleteDatasetService(); + } +}); + +var datasetService = function (url, options) { + return new DatasetService_DatasetService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/DatasourceService.js + /* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DatasourceService + * @deprecatedclassinstance L.supermap.datasourceService + * @classdesc 数据源服务类。 + * @category iServer Data Datasource + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var DatasourceService_DatasourceService = ServiceBase.extend({ + + initialize: function (url,options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function DatasourceService.prototype.getDatasources + * @description 数据源集查询服务。 + * @example + * new DatasourceService(url).getDatasources(function(result){ + * //doSomething + * }); + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasources: function (callback) { + const me = this; + const datasourceService = new DatasourceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.getDatasourcesService(); + }, + + /** + * @function DatasourceService.prototype.getDatasource + * @description 数据源信息查询服务。 + * @example + * new DatasourceService(url).getDatasource(datasourceName,function(result){ + * //doSomething + * }); + * @param datasourceName - 数据源名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasource: function (datasourceName, callback) { + if (!datasourceName) { + return; + } + const me = this; + const datasourceService = new DatasourceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.getDatasourceService(datasourceName); + }, + + /** + * @function DatasourceService.prototype.setDatasource + * @description 数据源信息设置服务。可实现更改当前数据源信息。 + * @example + * new DatasourceService(url).setDatasource(params, function(result){ + * //doSomething + * }); + * @param {SetDatasourceParameters} params - 数据源信息设置参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setDatasource: function(params, callback) { + if (!(params instanceof SetDatasourceParameters)) { + return; + } + const datasourceParams = { + description: params.description , + coordUnit: params.coordUnit, + distanceUnit: params.distanceUnit + }; + const me = this; + const url = Util.urlPathAppend(me.url,`datasources/name/${params.datasourceName}`); + const datasourceService = new DatasourceService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.setDatasourceService(datasourceParams); + } +}); + +var datasourceService = function (url, options) { + return new DatasourceService_DatasourceService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/FieldService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class FieldService + * @deprecatedclassinstance L.supermap.fieldService + * @classdesc 字段服务类。 + * @category iServer Data Field + * @extends {ServiceBase} + * @example + * new FieldService(url).getFields(function(result){ + * //doSomething + * }); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var FieldService = ServiceBase.extend({ + + initialize: function (url,options) { + ServiceBase.prototype.initialize.call(this, url,options); + }, + + /** + * @function FieldService.prototype.getFields + * @description 字段查询服务。 + * @param {FieldParameters} params - 字段信息查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getFields: function (params, callback) { + var me = this; + var getFieldsService = new GetFieldsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin:me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + datasource: params.datasource, + dataset: params.dataset + }); + getFieldsService.processAsync(); + }, + + /** + * @function FieldService.prototype.getFieldStatisticsInfo + * @description 字段统计服务。 + * @param {FieldStatisticsParameters} params - 字段统计信息查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getFieldStatisticsInfo: function (params, callback) { + if (!(params instanceof FieldStatisticsParameters)) { + return; + } + var me = this, + fieldName = params.fieldName, + modes = params.statisticMode; + if (modes && !external_L_default().Util.isArray(modes)) { + modes = [modes]; + } + me.currentStatisticResult = {fieldName: fieldName}; + me._statisticsCallback = callback; + //针对每种统计方式分别进行请求 + modes.forEach(mode => { + me.currentStatisticResult[mode] = null; + me._fieldStatisticRequest(params.datasource, params.dataset, fieldName, mode); + }); + }, + + _fieldStatisticRequest: function (dataSourceName, dataSetName, fieldName, statisticMode) { + var me = this; + var statisticService = new FieldStatisticService(me.url, { + eventListeners: { + scope: me, + processCompleted: me._processCompleted, + processFailed: me._statisticsCallback + }, + datasource: dataSourceName, + dataset: dataSetName, + field: fieldName, + statisticMode: statisticMode, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers + }); + statisticService.processAsync(); + }, + + _processCompleted: function (fieldStatisticResult) { + var me = this; + var getAll = true, + result = fieldStatisticResult.result; + if (this.currentStatisticResult) { + if (null == me.currentStatisticResult[result.mode]) { + this.currentStatisticResult[result.mode] = result.result; + } + } + for (var mode in me.currentStatisticResult) { + if (null == me.currentStatisticResult[mode]) { + getAll = false; + break; + } + } + if (getAll) { + me._statisticsCallback({result: me.currentStatisticResult}); + } + } +}); +var fieldService = function (url, options) { + return new FieldService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/GridCellInfosService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GridCellInfosService + * @deprecatedclassinstance L.supermap.gridCellInfosService + * @classdesc 数据栅格查询服务。 + * @category iServer Data Grid + * @extends {ServiceBase} + * @example + * new GridCellInfosService(url) + * .getGridCellInfos(param,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var GridCellInfosService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function GridCellInfosService.prototype.getGridCellInfos + * @param {GetGridCellInfosParameters} params - 数据服务栅格查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getGridCellInfos: function (params, callback) { + if (!(params instanceof GetGridCellInfosParameters)) { + return; + } + var me = this; + var gridCellQueryService = new GetGridCellInfosService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + gridCellQueryService.processAsync(params); + } +}); +var gridCellInfosService = function (url, options) { + return new GridCellInfosService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/GeoprocessingService.js + + + + + +/** + * @class GeoprocessingService + * @deprecatedclassinstance L.supermap.geoprocessingService + * @classdesc 处理自动化服务接口类。 + * @version 10.1.0 + * @category iServer ProcessingAutomationService + * @extends ServiceBase + * @example + * //为了安全访问受保护的处理自动化服务,必须通过传递 iserver 令牌( token ),才能正确访问相关资源。 + * SecurityManager.registerToken(serviceUrl, token); + * var geoprocessingService = new GeoprocessingService("http://localhost:8090/iserver/services/geoprocessing/restjsr/gp/v2") + geoprocessingService.submitJob(identifier,params, environments, function(serverResult) { + console.log(serverResult.result); + var jobID = serverResult.result.jobID; + var options = { + interval: 5000, + statusCallback: function(state) { + console.log("Job Status: ", state); + } + }; + geoprocessingService.waitForJobCompletion(jobID, identifier, options, function(serverResult) { + console.log(serverResult); + }) + }) + * + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @usage + */ +const GeoprocessingService_GeoprocessingService = ServiceBase.extend({ + initialize: function (url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + ServiceBase.prototype.initialize.call(this, url, options); + this.headers = {}; + this.crossOrigin = true; + this.withCredentials = true; + this.proxy = true; + }, + + /** + * @function GeoprocessingService.prototype.getTools + * @description 获取处理自动化工具列表。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTools: function (callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getTools(); + }, + + /** + * @function GeoprocessingService.prototype.getTool + * @description 获取工具的ID、名称、描述、输入参数、环境参数和输出结果等相关参数。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTool: function (identifier, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getTool(identifier); + }, + + /** + * @function GeoprocessingService.prototype.execute + * @description 同步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + execute: function (identifier, parameter, environment, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.execute(identifier, parameter, environment); + }, + + /** + * @function GeoprocessingService.prototype.submitJob + * @description 异步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + submitJob: function (identifier, parameter, environment, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.submitJob(identifier, parameter, environment); + }, + + /** + * @function GeoprocessingService.prototype.waitForJobCompletion + * @description 获取处理自动化异步执行状态信息。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} options - 参数。 + * @param {number} options.interval - 定时器时间间隔。 + * @param {RequestCallback} options.statusCallback - 任务状态的回调函数。 + * @param {function} callback 回调函数。 + */ + waitForJobCompletion: function (jobId, identifier, options, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.waitForJobCompletion(jobId, identifier, options); + }, + + /** + * @function GeoprocessingService.prototype.getJobInfo + * @description 获取处理自动化任务的执行信息。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + getJobInfo: function (identifier, jobId, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getJobInfo(identifier, jobId); + }, + + /** + * @function GeoprocessingService.prototype.cancelJob + * @description 取消处理自动化任务的异步执行。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + cancelJob: function (identifier, jobId, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.cancelJob(identifier, jobId); + }, + + /** + * @function GeoprocessingService.prototype.getJobs + * @description 获取处理自动化服务任务列表。 + * @param {string} identifier - 处理自动化工具 ID。(传参代表 identifier 算子的任务列表,不传参代表所有任务的列表) + * @param {RequestCallback} callback - 回调函数。 + */ + getJobs: function (identifier, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getJobs(identifier); + }, + + /** + * @function GeoprocessingService.prototype.getResults + * @description 处理自动化工具异步执行的结果,支持结果过滤。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {string} filter - 输出异步结果的 ID。(可选,传入 filter 参数时对该处理自动化工具执行的结果进行过滤获取,不填参时显示所有的执行结果) + * @param {RequestCallback} callback - 回调函数。 + */ + getResults: function (identifier, jobId, filter, callback) { + const geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getResults(identifier, jobId, filter); + } +}); +const geoprocessingService = function (url, options) { + return new GeoprocessingService_GeoprocessingService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/LayerInfoService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +/** + * @class LayerInfoService + * @deprecatedclassinstance L.supermap.layerInfoService + * @classdesc 图层信息类。 + * @category iServer Map Layer + * @extends {ServiceBase} + * @example + * new LayerInfoService(url).getLayersInfo(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var LayerInfoService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function LayerInfoService.prototype.getLayersInfo + * @description 获取图层信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLayersInfo: function (callback) { + var me = this; + var getLayersInfoService = new GetLayersInfoService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + getLayersInfoService.processAsync(); + }, + + /** + * @function LayerInfoService.prototype.setLayerInfo + * @description 设置图层信息服务。可以实现临时图层中子图层的修改。 + * @param {SetLayerInfoParameters} params - 设置图层信息参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayerInfo: function (params, callback) { + if (!(params instanceof SetLayerInfoParameters)) { + return; + } + var me = this, + resourceID = params.resourceID, + tempLayerName = params.tempLayerName, + layerInfoParams = params.layerInfo; + if (!resourceID || !tempLayerName) { + return; + } + var url = Util.urlPathAppend(me.url,`tempLayersSet/${resourceID}/${tempLayerName}`); + + var setLayerInfoService = new SetLayerInfoService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + + setLayerInfoService.processAsync(layerInfoParams); + }, + + + /** + * @function LayerInfoService.prototype.setLayersInfo + * @description 设置图层信息。可以实现创建新的临时图层和修改现有的临时图层。 + * @param {SetLayersInfoParameters} params - 设置图层信息参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayersInfo: function (params, callback) { + if (!(params instanceof SetLayersInfoParameters)) { + return; + } + var me = this, + resourceID = params.resourceID, + isTempLayers = params.isTempLayers ? params.isTempLayers : false, + layersInfo = params.layersInfo; + if ((isTempLayers && !resourceID) || !layersInfo) { + return; + } + var setLayersInfoService = new SetLayersInfoService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + resourceID: resourceID, + isTempLayers: isTempLayers + }); + + setLayersInfoService.processAsync(layersInfo); + }, + + + /** + * @function LayerInfoService.prototype.setLayerStatus + * @description 负责将子图层显示控制参数传递到服务端,并获取服务端返回的图层显示状态。 + * @param {SetLayerStatusParameters} params - 子图层显示控制参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayerStatus: function (params, callback) { + if (!(params instanceof SetLayerStatusParameters)) { + return; + } + var me = this; + var setLayerStatusService = new SetLayerStatusService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + setLayerStatusService.processAsync(params); + } + +}); + +var layerInfoService = function (url, options) { + return new LayerInfoService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/MeasureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class MeasureService + * @deprecatedclassinstance L.supermap.measureService + * @classdesc 量算服务类。 + * @category iServer Map Measure + * @example + * 用法: + * new MeasureService(url).measureDistance({ + * geometry:xxx + * },function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ +var MeasureService_MeasureService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function MeasureService.prototype.measureDistance + * @description 测距。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measureDistance: function (params, callback) { + this.measure(MeasureMode.DISTANCE, params, callback); + return this; + }, + + /** + * @function MeasureService.prototype.measureArea + * @description 测面积。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measureArea: function (params, callback) { + this.measure(MeasureMode.AREA, params, callback); + return this; + }, + + /** + * @function MeasureService.measure + * @param {MeasureMode} [type=MeasureMode.DISTANCE] - 量算模式。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measure: function (type, params, callback) { + if (!(params instanceof MeasureParameters)) { + return; + } + var me = this; + if (params.geometry) { + params.geometry = toSuperMapGeometry(params.geometry); + } + var measureService = new MeasureService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + measureMode: type, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + measureService.processAsync(params); + } +}); + +var measureService = function (url, options) { + return new MeasureService_MeasureService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/NetworkAnalyst3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class NetworkAnalyst3DService + * @deprecatedclassinstance L.supermap.networkAnalyst3DService + * @classdesc 3D 网络分析服务类。 + * @category iServer FacilityAnalyst3D + * @extends {ServiceBase} + * @example + * new NetworkAnalyst3DService(url) + * .sinksFacilityAnalyst(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * "http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var NetworkAnalyst3DService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function NetworkAnalyst3DService.prototype.sinksFacilityAnalyst + * @description 汇查找服务。 + * @param {FacilityAnalystSinks3DParameters} params - 最近设施分析参数类(汇查找资源)。 + * @param {RequestCallback} callback - 回调函数。 + */ + sinksFacilityAnalyst: function (params, callback) { + var me = this; + var facilityAnalystSinks3DService = new FacilityAnalystSinks3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystSinks3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.sourcesFacilityAnalyst + * @description 源查找服务。 + * @param {FacilityAnalystSources3DParameters} params - 最近设施分析参数类(源查找资源)。 + * @param {RequestCallback} callback - 回调函数。 + * @returns {NetworkAnalyst3DService} NetworkAnalyst3DService的实例对象。 + */ + sourcesFacilityAnalyst: function (params, callback) { + var me = this; + var facilityAnalystSources3DService = new FacilityAnalystSources3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystSources3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.traceUpFacilityAnalyst + * @description 上游追踪资源服务。 + * @param {FacilityAnalystTraceup3DParameters} params - 上游追踪资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @returns {NetworkAnalyst3DService} NetworkAnalyst3DService的实例对象。 + */ + traceUpFacilityAnalyst: function (params, callback) { + var me = this; + var facilityAnalystTraceup3DService = new FacilityAnalystTraceup3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystTraceup3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.traceDownFacilityAnalyst + * @description 下游追踪资源服务。 + * @param {FacilityAnalystTracedown3DParameters} params - 下游追踪资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + traceDownFacilityAnalyst: function (params, callback) { + var me = this; + var facilityAnalystTracedown3DService = new FacilityAnalystTracedown3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystTracedown3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.upstreamFacilityAnalyst + * @description 上游关键设施查找服务。 + * @param {FacilityAnalystUpstream3DParameters} params - 上游关键设施查找资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + upstreamFacilityAnalyst: function (params, callback) { + var me = this; + var facilityAnalystUpstream3DService = new FacilityAnalystUpstream3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystUpstream3DService.processAsync(params); + } +}); + +var networkAnalyst3DService = function (url, options) { + return new NetworkAnalyst3DService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/NetworkAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + +/** + * @class NetworkAnalystService + * @deprecatedclassinstance L.supermap.networkAnalystService + * @classdesc 网络分析服务类。 + * @category iServer NetworkAnalyst + * @example + * new NetworkAnalystService(url) + * .findPath(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}。
+ * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ +var NetworkAnalystService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function NetworkAnalystService.prototype.burstPipelineAnalyst + * @description 爆管分析服务:即将给定弧段或节点作为爆管点来进行分析,返回关键结点 ID 数组,普通结点 ID 数组及其上下游弧段 ID 数组。 + * @param {BurstPipelineAnalystParameters} params - 爆管分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + burstPipelineAnalyst: function (params, callback) { + var me = this; + var burstPipelineAnalystService = new BurstPipelineAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + burstPipelineAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.computeWeightMatrix + * @description 耗费矩阵分析服务:根据交通网络分析参数中的耗费字段返回一个耗费矩阵。该矩阵是一个二维数组,用来存储任意两点间的资源消耗。 + * @param {ComputeWeightMatrixParameters} params - 耗费矩阵分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + computeWeightMatrix: function (params, callback) { + var me = this; + var computeWeightMatrixService = new ComputeWeightMatrixService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + computeWeightMatrixService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findClosestFacilities + * @description 最近设施分析服务:指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * @param {FindClosestFacilitiesParameters} params - 最近设施分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findClosestFacilities: function (params, callback, resultFormat) { + var me = this; + var findClosestFacilitiesService = new FindClosestFacilitiesService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findClosestFacilitiesService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.streamFacilityAnalyst + * @description 上游/下游关键设施查找资源服务:查找给定弧段或节点的上游/下游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。 + * @param {FacilityAnalystStreamParameters} params - 上游/下游关键设施查找资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + streamFacilityAnalyst: function (params, callback, resultFormat) { + var me = this; + var facilityAnalystStreamService = new FacilityAnalystStreamService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + facilityAnalystStreamService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findLocation + * @description 选址分区分析服务:确定一个或多个待建设施的最佳或最优位置。 + * @param {FindLocationParameters} params - 选址分区分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findLocation: function (params, callback, resultFormat) { + var me = this; + var findLocationService = new FindLocationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findLocationService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findPath + * @description 最佳路径分析服务:在网络数据集中指定一些节点,按照节点的选择顺序,顺序访问这些节点从而求解起止点之间阻抗最小的路经。 + * @param {FindPathParameters} params - 最佳路径分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findPath: function (params, callback, resultFormat) { + var me = this; + var findPathService = new FindPathService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findPathService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findTSPPaths + * @description 旅行商分析服务:路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findTSPPaths: function (params, callback, resultFormat) { + var me = this; + var findTSPPathsService = new FindTSPPathsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findTSPPathsService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findMTSPPaths + * @description 多旅行商分析服务:也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数)。查找经济有效的配送路径,并给出相应的行走路线。 + * @param {FindMTSPPathsParameters} params - 多旅行商分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findMTSPPaths: function (params, callback, resultFormat) { + var me = this; + var findMTSPPathsService = new FindMTSPPathsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findMTSPPathsService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findServiceAreas + * @description 服务区分析服务:以指定服务站点为中心,在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * @param {FindServiceAreasParameters} params - 服务区分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findServiceAreas: function (params, callback, resultFormat) { + var me = this; + var findServiceAreasService = new FindServiceAreasService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findServiceAreasService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.updateEdgeWeight + * @description 更新边的耗费权重服务。 + * @param {UpdateEdgeWeightParameters} params - 更新边的耗费权重服务参数类。 + * @param {RequestCallback} callback -回调函数。 + */ + updateEdgeWeight: function (params, callback) { + var me = this; + var updateEdgeWeightService = new UpdateEdgeWeightService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + updateEdgeWeightService.processAsync(params); + }, + + /** + * @function NetworkAnalystService.prototype.updateTurnNodeWeight + * @description 转向耗费权重更新服务。 + * @param {UpdateTurnNodeWeightParameters} params - 转向耗费权重更新服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + updateTurnNodeWeight: function (params, callback) { + var me = this; + var updateTurnNodeWeightService = new UpdateTurnNodeWeightService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + updateTurnNodeWeightService.processAsync(params); + }, + + _processParams: function (params) { + if (!params) { + return {}; + } + + if (params.centers && external_L_default().Util.isArray(params.centers)) { + params.centers.map(function (point, key) { + params.centers[key] = (point instanceof (external_L_default()).LatLng) ? {x: point.lng, y: point.lat} : point; + return params.centers[key]; + }); + } + + if (params.nodes && external_L_default().Util.isArray(params.nodes)) { + params.nodes.map(function (point, key) { + params.nodes[key] = (point instanceof (external_L_default()).LatLng) ? {x: point.lng, y: point.lat} : point; + return params.nodes[key]; + }); + } + + if (params.event && params.event instanceof (external_L_default()).LatLng) { + params.event = {x: params.event.lng, y: params.event.lat}; + } + + if (params.facilities && external_L_default().Util.isArray(params.facilities)) { + params.facilities.map(function (point, key) { + params.facilities[key] = (point instanceof (external_L_default()).LatLng) ? {x: point.lng, y: point.lat} : point; + return params.facilities[key]; + }); + } + + if (params.parameter && params.parameter.barrierPoints) { + var barrierPoints = params.parameter.barrierPoints; + if (external_L_default().Util.isArray(barrierPoints)) { + barrierPoints.map(function (point, key) { + params.parameter.barrierPoints[key] = (point instanceof (external_L_default()).LatLng) ? { + x: point.lng, + y: point.lat + } : point; + return params.parameter.barrierPoints[key]; + }); + } else { + params.parameter.barrierPoints = [(barrierPoints instanceof (external_L_default()).LatLng) ? { + x: barrierPoints.lng, + y: barrierPoints.lat + } : barrierPoints]; + } + } + return params; + }, + + _processFormat: function (resultFormat) { + return (resultFormat) ? resultFormat : DataFormat.GEOJSON; + } + +}); + +var networkAnalystService = function (url, options) { + return new NetworkAnalystService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/ProcessingService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + +/** + * @class ProcessingService + * @deprecatedclassinstance L.supermap.processingService + * @classdesc 分布式分析服务类。 + * @category iServer ProcessingService + * @extends ServiceBase + * @example + * new ProcessingService(url) + * .getKernelDensityJobs(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var ProcessingService = ServiceBase.extend({ + initialize: function(url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + ServiceBase.prototype.initialize.call(this, url, options); + this.kernelDensityJobs = {}; + this.summaryMeshJobs = {}; + this.queryJobs = {}; + this.summaryRegionJobs = {}; + this.vectorClipJobs = {}; + this.overlayGeoJobs = {}; + this.buffersJobs = {}; + this.topologyValidatorJobs = {}; + this.summaryAttributesJobs = {}; + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJobs + * @description 获取密度分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getKernelDensityJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + kernelDensityJobsService.getKernelDensityJobs(); + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJob + * @description 获取指定 ID 的密度分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getKernelDensityJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + kernelDensityJobsService.getKernelDensityJob(id); + }, + + /** + * @function ProcessingService.prototype.addKernelDensityJob + * @description 新建密度分析。 + * @param {KernelDensityJobParameter} params - 密度分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addKernelDensityJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.kernelDensityJobs[job.id] = job.state; + } + }, + format: format + }); + kernelDensityJobsService.addKernelDensityJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJobState + * @description 获取密度分析的状态。 + * @param {string} id - 密度分析 ID。 + * @returns {Object} 密度分析的状态。 + */ + getKernelDensityJobState: function(id) { + return this.kernelDensityJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJobs + * @description 获取点聚合分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryMeshJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryMeshJobsService.getSummaryMeshJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJob + * @description 获取指定 ID 的点聚合分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryMeshJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryMeshJobsService.getSummaryMeshJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryMeshJob + * @description 新建点聚合分析。 + * @param {SummaryMeshJobParameter} params - 点聚合分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryMeshJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.summaryMeshJobs[job.id] = job.state; + } + }, + format: format + }); + summaryMeshJobsService.addSummaryMeshJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJobState + * @description 获取点聚合分析的状态。 + * @param {string} id - 点聚合分析的 ID。 + * @returns {Object} 点聚合分析的状态。 + */ + getSummaryMeshJobState: function(id) { + return this.summaryMeshJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getQueryJobs + * @description 获取单对象查询分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getQueryJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + singleObjectQueryJobsService.getQueryJobs(); + }, + + /** + * @function ProcessingService.prototype.getQueryJob + * @description 获取指定 ID 的单对象查询分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getQueryJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + singleObjectQueryJobsService.getQueryJob(id); + }, + + /** + * @function ProcessingService.prototype.addQueryJob + * @description 新建单对象查询分析。 + * @param {SingleObjectQueryJobsParameter} params - 单对象空间查询分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addQueryJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.queryJobs[job.id] = job.state; + } + }, + format: format + }); + singleObjectQueryJobsService.addQueryJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getQueryJobState + * @description 获取单对象查询分析的状态。 + * @param {string} id - 单对象查询分析的 ID。 + * @returns {Object} 单对象查询分析的状态。 + */ + getQueryJobState: function(id) { + return this.queryJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJobs + * @description 获取区域汇总分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryRegionJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryRegionJobsService.getSummaryRegionJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJob + * @description 获取指定 ID 的区域汇总分析。 + * @param {string} id - 区域汇总分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryRegionJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryRegionJobsService.getSummaryRegionJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryRegionJob + * @description 新建区域汇总分析。 + * @param {SummaryRegionJobParameter} params - 区域汇总分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryRegionJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.summaryRegionJobs[job.id] = job.state; + } + }, + format: format + }); + summaryRegionJobsService.addSummaryRegionJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJobState + * @description 获取区域汇总分析的状态。 + * @param {string} id - 区域汇总分析的 ID。 + * @returns {Object} 区域汇总分析的状态。 + */ + getSummaryRegionJobState: function(id) { + return this.summaryRegionJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getVectorClipJobs + * @description 获取矢量裁剪分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getVectorClipJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + vectorClipJobsService.getVectorClipJobs(); + }, + + /** + * @function ProcessingService.prototype.getVectorClipJob + * @description 获取指定 ID 的矢量裁剪分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getVectorClipJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + vectorClipJobsService.getVectorClipJob(id); + }, + + /** + * @function ProcessingService.prototype.addVectorClipJob + * @description 新建矢量裁剪分析。 + * @param {VectorClipJobsParameter} params - 矢量裁剪分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addVectorClipJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.vectorClipJobs[job.id] = job.state; + } + }, + format: format + }); + vectorClipJobsService.addVectorClipJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getVectorClipJobState + * @description 获取矢量裁剪分析的状态。 + * @param {string} id - 矢量裁剪分析的 ID。 + * @returns {Object} 矢量裁剪分析的状态。 + */ + getVectorClipJobState: function(id) { + return this.vectorClipJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getOverlayGeoJobs + * @description 获取叠加分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getOverlayGeoJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + overlayGeoJobsService.getOverlayGeoJobs(); + }, + + /** + * @function ProcessingService.prototype.getOverlayGeoJob + * @description 获取指定 ID 的叠加分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getOverlayGeoJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + overlayGeoJobsService.getOverlayGeoJob(id); + }, + + /** + * @function ProcessingService.prototype.addOverlayGeoJob + * @description 新建叠加分析。 + * @param {OverlayGeoJobParameter} params - 叠加分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addOverlayGeoJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.overlayGeoJobs[job.id] = job.state; + } + }, + format: format + }); + overlayGeoJobsService.addOverlayGeoJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getoverlayGeoJobState + * @description 获取叠加分析的状态。 + * @param {string} id - 叠加分析的 ID。 + * @returns {Object} 叠加分析的状态 + */ + getoverlayGeoJobState: function(id) { + return this.overlayGeoJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getBuffersJobs + * @description 获取缓冲区分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getBuffersJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + buffersAnalystJobsService.getBuffersJobs(); + }, + + /** + * @function ProcessingService.prototype.getBuffersJob + * @description 获取指定 ID 的缓冲区分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getBuffersJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + buffersAnalystJobsService.getBuffersJob(id); + }, + + /** + * @function ProcessingService.prototype.addBuffersJob + * @description 新建缓冲区分析。 + * @param {BuffersAnalystJobsParameter} params - 缓冲区分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addBuffersJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.buffersJobs[job.id] = job.state; + } + }, + format: format + }); + buffersAnalystJobsService.addBuffersJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getBuffersJobState + * @description 获取缓冲区分析的状态。 + * @param {string} id - 缓冲区分析的 ID。 + * @returns {Object} 缓冲区分析的状态 + */ + getBuffersJobState: function(id) { + return this.buffersJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJobs + * @description 获取拓扑检查分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getTopologyValidatorJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + topologyValidatorJobsService.getTopologyValidatorJobs(); + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJob + * @description 获取指定 ID 的拓扑检查分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getTopologyValidatorJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + topologyValidatorJobsService.getTopologyValidatorJob(id); + }, + + /** + * @function ProcessingService.prototype.addTopologyValidatorJob + * @description 新建拓扑检查分析。 + * @param {TopologyValidatorJobsParameter} params - 拓扑检查分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addTopologyValidatorJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.topologyValidatorJobs[job.id] = job.state; + } + }, + format: format + }); + topologyValidatorJobsService.addTopologyValidatorJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJobState + * @description 获取拓扑检查分析的状态。 + * @param {string} id - 拓扑检查分析的 ID。 + * @returns {Object} 拓扑检查分析的状态。 + */ + getTopologyValidatorJobState: function(id) { + return this.topologyValidatorJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJobs + * @description 获取属性汇总分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryAttributesJobs: function(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryAttributesJobsService.getSummaryAttributesJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJob + * @description 获取指定 ID 的属性汇总分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryAttributesJob: function(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryAttributesJobsService.getSummaryAttributesJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryAttributesJob + * @description 新建属性汇总分析。 + * @param {SummaryAttributesJobsParameter} params - 属性汇总分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryAttributesJob: function(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function(job) { + me.summaryAttributesJobs[job.id] = job.state; + } + }, + format: format + }); + summaryAttributesJobsService.addSummaryAttributesJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJobState + * @description 获取属性汇总分析的状态。 + * @param {string} id - 属性汇总分析的 ID。 + * @returns {Object} 属性汇总分析的状态。 + */ + getSummaryAttributesJobState: function(id) { + return this.summaryAttributesJobs[id]; + }, + + _processFormat: function(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + }, + + _processParams: function(params) { + if (!params) { + return {}; + } + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + if (params.query) { + params.query = CommontypesConversion.toSuperMapBounds(params.query); + } + if (params.geometryQuery) { + params.geometryQuery = CommontypesConversion.toProcessingParam(params.geometryQuery); + } + if (params.geometryClip) { + params.geometryClip = CommontypesConversion.toProcessingParam(params.geometryClip); + } + return params; + } +}); +var processingService = function(url, options) { + return new ProcessingService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/QueryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +/** + * @class QueryService + * @deprecatedclassinstance L.supermap.queryService + * @classdesc 地图查询服务类。 + * @category iServer Map QueryResults + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * new QueryService(url).queryByBounds(param,function(result){ + * //doSomething + * }) + * @usage + */ +var QueryService_QueryService = ServiceBase.extend({ + initialize: function(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + /** + * @function QueryService.prototype.queryByBounds + * @description bounds 查询地图服务。 + * @param {QueryByBoundsParameters} params - Bounds 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByBounds: function(params, callback, resultFormat) { + var me = this; + var queryService = new QueryByBoundsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + queryService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryByDistance + * @description 地图距离查询服务。 + * @param {QueryByDistanceParameters} params - Distance 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByDistance: function(params, callback, resultFormat) { + var me = this; + var queryByDistanceService = new QueryByDistanceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + queryByDistanceService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryBySQL + * @description 地图 SQL 查询服务。 + * @param {QueryBySQLParameters} params - SQL 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryBySQL: function(params, callback, resultFormat) { + var me = this; + var queryBySQLService = new QueryBySQLService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + queryBySQLService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryByGeometry + * @description 地图几何查询服务。 + * @param {QueryByGeometryParameters} params - Geometry 查询相关参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByGeometry: function(params, callback, resultFormat) { + var me = this; + var queryByGeometryService = new QueryByGeometryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + queryByGeometryService.processAsync(me._processParams(params)); + }, + + _processParams: function(params) { + if (!params) { + return {}; + } + params.returnContent = params.returnContent == null ? true : params.returnContent; + if (params.queryParams && !external_L_default().Util.isArray(params.queryParams)) { + params.queryParams = [params.queryParams]; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + + if (params.geometry) { + if (params.geometry instanceof (external_L_default()).Point) { + params.geometry = new Point(params.geometry.x, params.geometry.y); + } else { + params.geometry = toSuperMapGeometry(params.geometry); + } + } + + return params; + }, + + _processFormat: function(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); + +var queryService = function(url, options) { + return new QueryService_QueryService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/SpatialAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + +/** + * @class SpatialAnalystService + * @deprecatedclassinstance L.supermap.spatialAnalystService + * @classdesc 空间分析服务类。提供:地区太阳辐射、缓冲区分析、点密度分析、动态分段分析、空间关系分析、插值分析、栅格代数运算、叠加分析、路由定位、路由测量计算、表面分析、地形曲率计算、泰森多边形分析。 + * @category iServer SpatialAnalyst + * @example + * new SpatialAnalystService(url) + * .bufferAnalysis(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ +var SpatialAnalystService = ServiceBase.extend({ + initialize: function(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + /** + * @function SpatialAnalystService.prototype.getAreaSolarRadiationResult + * @description 地区太阳辐射。 + * @param {AreaSolarRadiationParameters} params - 地区太阳辐射参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getAreaSolarRadiationResult: function(params, callback, resultFormat) { + var me = this; + var areaSolarRadiationService = new AreaSolarRadiationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + areaSolarRadiationService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.bufferAnalysis + * @description 缓冲区分析。 + * @param {DatasetBufferAnalystParameters} params - 数据集缓冲区分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + bufferAnalysis: function(params, callback, resultFormat) { + var me = this; + var bufferAnalystService = new BufferAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + bufferAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.densityAnalysis + * @description 点密度分析。 + * @param {DensityKernelAnalystParameters} params - 核密度分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + densityAnalysis: function(params, callback, resultFormat) { + var me = this; + var densityAnalystService = new DensityAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + densityAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.generateSpatialData + * @description 动态分段分析。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + generateSpatialData: function(params, callback, resultFormat) { + var me = this; + var generateSpatialDataService = new GenerateSpatialDataService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + generateSpatialDataService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.geoRelationAnalysis + * @description 空间关系分析。 + * @param {GeoRelationAnalystParameters} params - 空间关系分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + geoRelationAnalysis: function(params, callback, resultFormat) { + var me = this; + var geoRelationAnalystService = new GeoRelationAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + geoRelationAnalystService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.interpolationAnalysis + * @description 插值分析。 + * @param {InterpolationDensityAnalystParameters|InterpolationIDWAnalystParameters|InterpolationRBFAnalystParameters|InterpolationKrigingAnalystParameters} params - 样条插值(径向基函数插值法)分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + interpolationAnalysis: function(params, callback, resultFormat) { + var me = this; + var interpolationAnalystService = new InterpolationAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + interpolationAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.mathExpressionAnalysis + * @description 栅格代数运算。 + * @param {MathExpressionAnalysisParameters} params - 栅格代数运算参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + mathExpressionAnalysis: function(params, callback, resultFormat) { + var me = this; + var mathExpressionAnalysisService = new MathExpressionAnalysisService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + mathExpressionAnalysisService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.overlayAnalysis + * @description 叠加分析。 + * @param {DatasetOverlayAnalystParameters|GeometryOverlayAnalystParameters} params - 数据集叠加分析参数类。|| 几何对象叠加分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + overlayAnalysis: function(params, callback, resultFormat) { + var me = this; + var overlayAnalystService = new OverlayAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + overlayAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.routeCalculateMeasure + * @description 路由测量计算。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + routeCalculateMeasure: function(params, callback, resultFormat) { + var me = this; + var routeCalculateMeasureService = new RouteCalculateMeasureService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + routeCalculateMeasureService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.routeLocate + * @description 路由定位。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + routeLocate: function(params, callback, resultFormat) { + var me = this; + var routeLocatorService = new RouteLocatorService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + routeLocatorService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.surfaceAnalysis + * @description 表面分析。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + surfaceAnalysis: function(params, callback, resultFormat) { + var me = this; + var surfaceAnalystService = new SurfaceAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + surfaceAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.terrainCurvatureCalculate + * @description 地形曲率计算。 + * @param {TerrainCurvatureCalculationParameters} params - 地形曲率计算参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + terrainCurvatureCalculate: function(params, callback, resultFormat) { + var me = this; + var terrainCurvatureCalculationService = new TerrainCurvatureCalculationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + terrainCurvatureCalculationService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.thiessenAnalysis + * @description 泰森多边形分析。 + * @param {DatasetThiessenAnalystParameters|GeometryThiessenAnalystParameters} params - 数据集泰森多边形分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + thiessenAnalysis: function(params, callback, resultFormat) { + var me = this; + var thiessenAnalystService = new ThiessenAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + thiessenAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.geometrybatchAnalysis + * @description 批量空间分析。 + * @param {Array.} params -批量分析参数对象数组;包括:
+ * @param {string} params.analystName - 空间分析方法的名称。包括:
+ * "buffer","overlay","interpolationDensity","interpolationidw","interpolationRBF","interpolationKriging","isoregion","isoline" + * @param {Object} param - 空间分析类型对应的请求参数,包括:
+ * {@link GeometryBufferAnalystParameters} 缓冲区分析参数类。
+ * {@link GeometryOverlayAnalystParameters} 叠加分析参数类。
+ * {@link InterpolationAnalystParameters} 插值分析参数类。
+ * {@link SurfaceAnalystParameters} 表面分析参数类。
+ * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + geometrybatchAnalysis: function(params, callback, resultFormat) { + var me = this; + var geometryBatchAnalystService = new GeometryBatchAnalystService(me.url, { + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + + //处理批量分析中各个分类类型的参数: + var analystParameters = []; + for (var i = 0; i < params.length; i++) { + var tempParameter = params[i]; + analystParameters.push({ + analystName: tempParameter.analystName, + param: me._processParams(tempParameter.param) + }); + } + + geometryBatchAnalystService.processAsync(analystParameters); + }, + + _processParams: function(params) { + if (!params) { + return {}; + } + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + if (params.inputPoints) { + for (let i = 0; i < params.inputPoints.length; i++) { + let inputPoint = params.inputPoints[i]; + if (external_L_default().Util.isArray(inputPoint)) { + params.inputPoints[i] = { x: inputPoint[0], y: inputPoint[1], tag: inputPoint[2] }; + } + } + } + + if (params.points) { + for (let i = 0; i < params.points.length; i++) { + let point = params.points[i]; + if (external_L_default().Util.isArray(point)) { + params.points[i] = { x: point[0], y: point[1] }; + } else if (point instanceof (external_L_default()).LatLng) { + params.points[i] = { x: point.lng, y: point.lat }; + } else { + params.points[i] = { x: point.x, y: point.y }; + } + } + } + if (params.point) { + if (external_L_default().Util.isArray(params.point)) { + params.point = { x: params.point[0], y: params.point[1] }; + } else if (params.point instanceof (external_L_default()).LatLng) { + params.point = { x: params.point.lng, y: params.point.lat }; + } else { + params.point = { x: params.point.x, y: params.point.y }; + } + } + if (params.extractRegion) { + params.extractRegion = toSuperMapGeometry(params.extractRegion); + } + if (params.extractParameter && params.extractParameter.clipRegion) { + params.extractParameter.clipRegion = toSuperMapGeometry(params.extractParameter.clipRegion); + } + if (params.clipParam && params.clipParam.clipRegion) { + params.clipParam.clipRegion = toSuperMapGeometry(params.clipParam.clipRegion); + } + //支持格式:Vector Layers; GeoJson + if (params.sourceGeometry) { + var SRID = null; + if (params.sourceGeometrySRID) { + SRID = params.sourceGeometrySRID; + } + params.sourceGeometry = toSuperMapGeometry(params.sourceGeometry); + if (SRID) { + params.sourceGeometry.SRID = SRID; + } + delete params.sourceGeometry.sourceGeometrySRID; + } + if (params.operateGeometry) { + params.operateGeometry = toSuperMapGeometry(params.operateGeometry); + } + //支持传入多个几何要素进行叠加分析: + if (params.sourceGeometries) { + var sourceGeometries = []; + for (var k = 0; k < params.sourceGeometries.length; k++) { + sourceGeometries.push(toSuperMapGeometry(params.sourceGeometries[k])); + } + params.sourceGeometries = sourceGeometries; + } + //支持传入多个几何要素进行叠加分析: + if (params.operateGeometries) { + var operateGeometries = []; + for (var j = 0; j < params.operateGeometries.length; j++) { + operateGeometries.push(toSuperMapGeometry(params.operateGeometries[j])); + } + params.operateGeometries = operateGeometries; + } + if (params.sourceRoute) { + if (params.sourceRoute instanceof (external_L_default()).Polyline) { + var target = {}; + target.type = 'LINEM'; + target.parts = [params.sourceRoute.getLatLngs().length]; + target.points = []; + for (let i = 0; i < params.sourceRoute.getLatLngs().length; i++) { + let point = params.sourceRoute.getLatLngs()[i]; + target.points = target.points.concat({ x: point.lng, y: point.lat, measure: point.alt }); + } + params.sourceRoute = target; + } + } + if (params.operateRegions && external_L_default().Util.isArray(params.operateRegions)) { + params.operateRegions.map(function(geometry, key) { + params.operateRegions[key] = toSuperMapGeometry(geometry); + return params.operateRegions[key]; + }); + } + // if (params.sourceRoute && params.sourceRoute.components && L.Util.isArray(params.sourceRoute.components)) { + // params.sourceRoute.components.map(function (geometry, key) { + // params.sourceRoute.components[key] = Util.toSuperMapGeometry(geometry); + // }); + // } + + return params; + }, + + _processFormat: function(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var spatialAnalystService = function(url, options) { + return new SpatialAnalystService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/ThemeService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeService + * @deprecatedclassinstance L.supermap.themeService + * @classdesc 专题图服务类。 + * @category iServer Map Theme + * @extends {ServiceBase} + * @example + * new ThemeService(url,{ + * projection:projection + * }).getThemeInfo(params,function(result){ + * //doSomething + * }); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var ThemeService_ThemeService = ServiceBase.extend({ + + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ThemeService.prototype.getThemeInfo + * @description 获取专题图信息。 + * @param {ThemeParameters} params - 专题图参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getThemeInfo: function (params, callback) { + var me = this; + var themeService = new ThemeService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers:me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + themeService.processAsync(params); + } +}); + +var themeService = function (url, options) { + return new ThemeService_ThemeService(url, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/services/TrafficTransferAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class TrafficTransferAnalystService + * @deprecatedclassinstance L.supermap.trafficTransferAnalystService + * @classdesc 交通换乘分析服务类。 + * @category iServer TrafficTransferAnalyst + * @example + * new TrafficTransferAnalystService(url).queryStop(params,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var TrafficTransferAnalystService = ServiceBase.extend({ + initialize: function(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function TrafficTransferAnalystService.prototype.queryStop + * @description 站点查询服务。 + * @param {StopQueryParameters} params - 站点查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + queryStop: function(params, callback) { + var me = this; + var stopQueryService = new StopQueryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + stopQueryService.processAsync(params); + }, + /** + * @function TrafficTransferAnalystService.prototype.analysisTransferPath + * @description 交通换乘线路查询服务。 + * @param {TransferPathParameters} params - 交通换乘线路查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + analysisTransferPath: function(params, callback) { + var me = this; + var transferPathService = new TransferPathService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + transferPathService.processAsync(me._processParams(params)); + }, + /** + * @function TrafficTransferAnalystService.prototype.analysisTransferSolution + * @description 交通换乘方案查询服务。 + * @param {TransferSolutionParameters} params - 交通换乘方案查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + analysisTransferSolution: function(params, callback) { + var me = this; + var transferSolutionService = new TransferSolutionService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + transferSolutionService.processAsync(me._processParams(params)); + }, + + _processParams: function(params) { + if (!params) { + return {}; + } + + if (params.points && external_L_default().Util.isArray(params.points)) { + params.points.map(function(point, key) { + params.points[key] = point instanceof (external_L_default()).LatLng ? { x: point.lng, y: point.lat } : point; + return params.points[key]; + }); + } + return params; + } +}); + +var trafficTransferAnalystService = function(url, options) { + return new TrafficTransferAnalystService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/WebPrintingJobService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class WebPrintingJobService + * @deprecatedclassinstance L.supermap.webPrintingJobService + * @classdesc Web 打印服务类。 + * 提供:创建 Web 打印任务,获取 Web 打印任务内容,获取 Web 打印输出文档流,获取 Web 打印服务的布局模板信息。 + * @category iServer WebPrintingJob + * @example + * new WebPrintingJobService(url) + * .createWebPrintingJob(param,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @version 10.1.0 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var WebPrintingJobService = ServiceBase.extend({ + initialize: function(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function WebPrintingJobService.prototype.createWebPrintingJob + * @description 创建 Web 打印任务。 + * @param {WebPrintingJobParameters} params - Web 打印参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + createWebPrintingJob(params, callback) { + if (!params) { + return; + } + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + + webPrintingService.createWebPrintingJob(me._processParams(params)); + }, + + /** + * @function WebPrintingJobService.prototype.getPrintingJob + * @description 获取 Web 打印输出文档任务。 + * @param {string} jobId - Web 打印输入文档任务 Id。 + * @param {RequestCallback} callback - 回调函数。 + */ + getPrintingJob: function(jobId, callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + + webPrintingService.getPrintingJob(jobId); + }, + + /** + * @function WebPrintingJobService.prototype.getPrintingJobResult + * @description 获取 Web 打印任务的输出文档。 + * @param {string} jobId - Web 打印输入文档任务 Id。 + * @param {RequestCallback} callback - 回调函数。 + */ + getPrintingJobResult: function(jobId, callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + + webPrintingService.getPrintingJobResult(jobId); + }, + + /** + * @function WebPrintingJobService.prototype.getLayoutTemplates + * @description 查询 Web 打印服务所有可用的模板信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLayoutTemplates: function(callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + + webPrintingService.getLayoutTemplates(); + }, + + _processParams(params) { + if (params.layoutOptions && params.layoutOptions.littleMapOptions) { + params.layoutOptions.littleMapOptions.center = this._toPointObject( + params.layoutOptions.littleMapOptions.center + ); + } + if (params.exportOptions) { + params.exportOptions.center = this._toPointObject(params.exportOptions.center); + } + return params; + }, + + _toPointObject(point) { + if (external_L_default().Util.isArray(point)) { + return { + x: point[0], + y: point[1] + }; + } else if (point instanceof Point || point instanceof (external_L_default()).Point) { + return { + x: point.x, + y: point.y + }; + } else if (point instanceof (external_L_default()).LatLng) { + return { + x: point.lng, + y: point.lat + }; + } + return point; + } +}); + +var webPrintingJobService = function(url, options) { + return new WebPrintingJobService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/ImageService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageService + * @deprecatedclassinstance L.supermap.imageService + * @version 10.2.0 + * @constructs ImageService + * @classdesc 影像服务类 + * @category iServer Image + * @extends {ServiceBase} + * @example + * new ImageService(url,options) + * .getCollections(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var ImageService = ServiceBase.extend({ + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ImageService.prototype.getCollections + * @description 返回影像集合列表(Collections)。 + * @param {RequestCallback} callback - 回调函数。 + */ + getCollections: function (callback) { + var me = this; + var ImageService = new ImageService_ImageService(this.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.getCollections(); + }, + + /** + * @function ImageService.prototype.getCollectionByID + * @description ID值等于`collectionId`参数值的影像集合(Collection)。 ID值用于在服务中唯一标识该影像集合。 + * @param {string} collectionId 影像集合( Collection )的 ID ,在一个影像服务中唯一标识影像集合。 + * @param {RequestCallback} callback - 回调函数。 + */ + getCollectionByID: function (collectionId, callback) { + var me = this; + var ImageService = new ImageService_ImageService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.getCollectionByID(collectionId); + }, + /** + * @function ImageService.prototype.search + * @description 查询与过滤条件匹配的影像数据。 + * @param {ImageSearchParameter} [itemSearch] 查询参数 + * @param {RequestCallback} callback - 回调函数。 + */ + search: function (itemSearch, callback) { + var me = this; + var ImageService = new ImageService_ImageService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.search(itemSearch); + } +}); + +var imageService = function (url, options) { + return new ImageService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/ImageCollectionService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ImageCollectionService + * @deprecatedclassinstance L.supermap.imageCollectionService + * @version 10.2.0 + * @constructs ImageCollectionService + * @classdesc 影像集合服务类 + * @category iServer Image + * @extends {ServiceBase} + * @example + * new ImageCollectionService(url,options) + * .getLegend(queryParams, function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ +var ImageCollectionService = ServiceBase.extend({ + initialize: function (url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ImageCollectionService.prototype.getLegend + * @param {Object} queryParams query 参数。 + * @param {ImageRenderingRule} [queryParams.renderingRule] 指定影像显示的风格,包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。默认使用发布服务时所配置的风格。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLegend: function (queryParams, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(this.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getLegend(queryParams); + }, + + /** + * @function ImageCollectionService.prototype.getStatistics + * @description 返回当前影像集合的统计信息。包括文件数量,文件大小等信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getStatistics: function (callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getStatistics(); + }, + + /** + * @function ImageCollectionService.prototype.getTileInfo + * @description 返回影像集合所提供的服务瓦片的信息,包括:每层瓦片的分辨率,比例尺等信息,方便前端进行图层叠加。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTileInfo: function (callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getTileInfo(); + }, + + /** + * @function ImageCollectionService.prototype.deleteItemByID + * @description 删除影像集合中指定ID (`featureId`)的Item对象,即从影像集合中删除指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + * @param {RequestCallback} callback - 回调函数。 + */ + deleteItemByID(featureId, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(this.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.deleteItemByID(featureId); + }, + + /** + * @function ImageCollectionService.prototype.getItemByID + * @description 返回影像集合中指定ID (`featureId`)的Item对象,即返回影像集合中指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + * @param {RequestCallback} callback - 回调函数。 + */ + getItemByID(featureId, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getItemByID(featureId); + } +}); + +var imageCollectionService = function (url, options) { + return new ImageCollectionService(url, options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/services/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/components/ComponentsViewBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. +* This program are made available under the terms of the Apache License, Version 2.0 +* which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ComponentsViewBase + * @aliasclass Components.ComponentsViewBase + * @deprecatedclassinstance L.supermap.components.componentsViewBase + * @classdesc Lealfet 组件基类。 + * @category Components Common + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @extends {L.Control} + * @usage + */ +var ComponentsViewBase = external_L_default().Control.extend({ + options: { + //控件位置 继承自leaflet control + position: 'topright', + //默认样式,以支持组件设置图层基本样式 + style: (feature, latLng) => { + if (latLng /*&& feature instanceof L.latLng || feature.geometry.type.toLowerCase() === "point"*/) { + return external_L_default().circleMarker(latLng, { + fillColor: 'blue', + weight: 1, + opacity: 1, + color: 'blue', + fillOpacity: 0.6 + }); + } else { + return { + fillColor: 'blue', + weight: 1, + opacity: 1, + color: 'blue', + fillOpacity: 0.6 + } + } + }, + onEachFeature: null + }, + + initialize(options) { + external_L_default().setOptions(this, options); + //组件事件处理对象://todo 确认一些公开或私有的成员变量 + this._event = new (external_L_default()).Evented(); + //组件根 dom 元素: + this.rootContainer = null; + //图层参数,主要配置组件返回数据图层的样式和事件等 + }, + + /** + * @function ComponentsViewBase.prototype.onAdd + * @description 向地图添加组件。 + */ + onAdd(map) { + //子类实现此方法 + this.map = map; + this.rootContainer = this._initView(); + return this.rootContainer; + }, + + /** + * @function ComponentsViewBase.prototype.on + * @param {string} eventType - 监听的事件类型。 + * @param {function} callback - 监听事件的回调函数。 + */ + on(eventType, callback) { + this._event.on(eventType, callback); + }, + + /** + * @function ComponentsViewBase.prototype.off + * @description 事件关闭。 + * @param {string} eventType - 监听的事件名。 + * @param {function} callback - 监听事件的回调函数。 + */ + off(eventType, callback) { + this._event.off(eventType, callback); + }, + + /** + * @function ComponentsViewBase.prototype._initView + * @description 初始化组件 UI。 + * @private + */ + _initView() { + //子类实现此方法 + }, + + /** + * @function ComponentsViewBase.prototype._preventMapEvent + * @description 阻止 map 默认事件。 + * @private + */ + _preventMapEvent(div, map) { + if (!div || !map) { + return; + } + div.addEventListener('mouseover', function () { + map.dragging.disable(); + map.scrollWheelZoom.disable(); + map.doubleClickZoom.disable(); + }); + div.addEventListener('mouseout', function () { + map.dragging.enable(); + map.scrollWheelZoom.enable(); + map.doubleClickZoom.enable(); + }); + } + +}); + +var componentsViewBase = function (options) { + return new ComponentsViewBase(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/openfile/OpenFileViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class OpenFileViewModel + * @aliasclass Components.OpenFileViewModel + * @deprecatedclassinstance L.supermap.components.openFileViewModel + * @classdesc 打开本地文件组件功能类,目前只支持 WGS84 经纬度坐标。 + * @version 9.1.1 + * @category Components OpenFile + * @param {L.Map} map - Leaflet Map 对象。 + * @fires OpenFileViewModel#filesizeexceed + * @fires OpenFileViewModel#errorfileformat + * @fires OpenFileViewModel#openfilesucceeded + * @fires OpenFileViewModel#openfilefailed + * @extends {L.Evented} + * @usage + */ +var OpenFileViewModel = external_L_default().Evented.extend({ + initialize() { + this.fileModel = new FileModel(); + }, + + /** + * @function OpenFileViewModel.prototype.readFile + * @description 打开文件并加载到地图。 + * @param {Object} fileEventObject - 本地文件对象。 + */ + readFile(fileEventObject) { + let inputDom = fileEventObject.target; + let file = inputDom.files[0]; + //文件大小限制 + if (file.size > this.fileModel.FileConfig.fileMaxSize) { + // document.alert("File supports up to 10M."); + /** + * @event OpenFileViewModel#filesizeexceed + * @description 超出文件大小限制后触发。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + this.fire("filesizeexceed", {messageType: "warring", message: Lang.i18n('msg_fileSizeExceeded')}); + return false; + } + + let filePath = inputDom.value; + let fileName = file.name; + let fileType = ComponentsUtil.getFileType(fileName); + //文件格式不支持 + if (!fileType) { + // document.alert("Unsupported data type."); + /** + * @event OpenFileViewModel#errorfileformat + * @description 文件格式不支持时触发。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + this.fire("errorfileformat", {messageType: "failure", message: Lang.i18n('msg_fileTypeUnsupported')}); + return false; + } + //文件类型限制 + if (fileName !== "") { + //给control 一份数据 + //todo MVVM模式 应该是数据变化触发数据变化的事件 + this.fileModel.set( + "loadFileObject", { + file: file, + filePath: filePath, + fileName: fileName, + fileType: fileType + }); + //响应选中文件添加到地图 + this._readData(); + } + }, + + /** + * @function OpenFileViewModel.prototype._readData + * @description 数据文件中的数据。 + * @private + */ + _readData() { + //todo 需要测试另外两个 + const me = this; + const type = this.fileModel.loadFileObject.fileType; + FileReaderUtil.readFile(type, { + file: this.fileModel.loadFileObject.file, + path: this.fileModel.loadFileObject.filePath + }, (data) => { + //将数据统一转换为 geoJson 格式加载到底图 + FileReaderUtil.processDataToGeoJson(type, data, (geojson) => { + if (geojson) { + /** + * @event OpenFileViewModel#openfilesucceeded + * @description 打开文件成功。 + * @property {GeoJSONObject} result - GeoJSON 格式数据。 + * @property {string} layerName - 图层名。 + */ + this.fire("openfilesucceeded", { + result: geojson, + layerName: this.fileModel.loadFileObject.fileName.split('.')[0] + }); + } + }, (e) => { + me.fire("openfilefailed", {messageType: "failure", message: e}); + }, this); + }, () => { + /** + * @event OpenFileViewModel#openfilefailed + * @description 打开文件失败。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + me.fire("openfilefailed", {messageType: "failure", message: Lang.i18n('msg_openFileFail')}); + }, this); + } + +}); + +var openFileViewModel = function (options) { + return new OpenFileViewModel(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/openfile/OpenFileView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class OpenFileView + * @aliasclass Components.OpenFileView + * @deprecatedclassinstance L.supermap.components.openFile + * @classdesc 打开文件组件,用于打开本地数据文件并加载到地图,目前支持打开.csv|.xls|.xlsx|.geojson|.json 格式,只支持 WGS84 经纬度坐标。 + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires OpenFileView#openfilesucceeded + * @fires OpenFileView#openfilefailed + * @extends {ComponentsViewBase} + * @category Components OpenFile + * @usage + */ +var OpenFileView = ComponentsViewBase.extend({ + options: { + //绑定的底图图层 + layer: null + }, + + initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + //初始化 ViewModel: + this.viewModel = new OpenFileViewModel(); + }, + + /** + * @function OpenFileView.prototype.setViewStyle + * @description 设置组件样式。 + * @param {string} styleName - css 样式名称。 + * @param {string} value - css 样式值。 + */ + setViewStyle(styleName, value) { + this.rootContainer.style[styleName] = value; + }, + + /** + * @function OpenFileView.prototype._initView + * @description 创建打开文件组件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView() { + + //初始化 view + const uploadContent = external_L_default().DomUtil.create('div', 'component-openfile'); + uploadContent.id = 'openFile'; + + this.fileSelect = external_L_default().DomUtil.create('div', '', uploadContent); + this.label = external_L_default().DomUtil.create('label', 'component-openfile__span--select', this.fileSelect); + this.label.htmlFor = "input_file"; + + external_L_default().DomUtil.create('div', 'supermapol-icons-upload', this.label); + const fileSpan = external_L_default().DomUtil.create('span', 'component-openfile__span', this.label); + fileSpan.appendChild(document.createTextNode(Lang.i18n('text_chooseFile'))); + + this.fileInput = external_L_default().DomUtil.create('input', 'component-openfile__input', this.fileSelect); + this.fileInput.id = "input_file"; + this.fileInput.type = "file"; + this.fileInput.accept = ".json,.geojson,.csv,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" + + this.fileInput.onchange = (fileEventObject) => { + this.messageBox.closeView(); + this.viewModel.readFile(fileEventObject); + }; + //增加提示框: + this.messageBox = new MessageBox(); + + //添加监听 + this.viewModel.on("filesizeexceed", (e) => { + this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("errorfileformat", (e) => { + this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("openfilefailed", (e) => { + this.messageBox.showView(e.message, e.messageType); + /** + * @event OpenFileView#openfilefailed + * @description 打开文件失败。 + * @property {Object} e - 事件对象。 + */ + this._event.fire("openfilefailed", e); + }); + this.viewModel.on("readdatafail", (e) => { + this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("openfilesucceeded", (e) => { + /** + * @event OpenFileView#openfilesucceeded + * @description 打开文件成功。 + * @property {Object} e - 事件对象。 + */ + this._event.fire("openfilesucceeded", e); + }); + + // 阻止 map 默认事件 + this._preventMapEvent(uploadContent, this.map); + return uploadContent; + } + +}); +var openFileView = function (options) { + return new OpenFileView(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/search/CityConfig.js +const config = { + HOT: { + HOT: ["北京市", "上海市", "广州市", "深圳市", "南京市", "杭州市", "天津市", "重庆市", "成都市", "青岛市", "苏州市", "无锡市", "常州市", "温州市", "武汉市", "长沙市", "南昌市", "三亚市", "合肥市", "石家庄市"] + }, + AB: { + A: ["阿拉善盟", "鞍山市", "安庆市", "安阳市", "阿坝藏族羌族自治州", "安顺市", "阿里地区", "安康市", "阿克苏地区", "阿勒泰地区", "阿拉尔市"], + B: ["北京市", "保定市", "包头市", "巴彦淖尔市", "本溪市", "白山市", "白城市", "蚌埠市", "亳州市", "滨州市", "北海市", "百色市", "白沙黎族自治县", "保亭黎族苗族自治县", "巴中市", "毕节地区", "保山市", "宝鸡市", "白银市", "博尔塔拉蒙古自治州", "巴音郭楞蒙古自治州", "北区"] + }, + CD: { + C: ["重庆市", "成都市", "常州市", "长沙市", "承德市", "沧州市", "长治市", "赤峰市", "朝阳市", "长春市", "滁州市", "巢湖市", "池州市", "常德市", "郴州市", "潮州市", "崇左市", "澄迈县", "昌江黎族自治县", "楚雄彝族自治州", "昌都地区", "昌吉回族自治州"], + D: ["大同市", "大连市", "丹东市", "大庆市", "大兴安岭地区", "东营市", "德州市", "东莞市", "儋州市", "东方市", "定安县", "德阳市", "达州市", "大理白族自治州", "德宏傣族景颇族自治州", "迪庆藏族自治州", "定西市", "东区", "大埔区", "大堂区"] + }, + EFG: { + E: ["鄂尔多斯市", "鄂州市", "恩施土家族苗族自治州"], + F: ["抚顺市", "阜新市", "阜阳市", "福州市", "抚州市", "佛山市", "防城港市"], + G: ["广州市", "赣州市", "桂林市", "贵港市", "广元市", "广安市", "贵阳市", "固原市", "高雄市", "高雄县", "甘南藏族自治州", "甘孜藏族自治州"] + }, + H: { + H: ["杭州市", "合肥市", "邯郸市", "衡水市", "呼和浩特市", "呼伦贝尔市", "葫芦岛市", "哈尔滨市", "鹤岗市", "黑河市", "淮安市", "湖州市", "淮南市", "淮北市", "黄山市", "菏泽市", "鹤壁市", "黄石市", "黄冈市", "衡阳市", "怀化市", "惠州市", "河源市", "贺州市", "河池市", "海口市", "红河哈尼族彝族自治州", "汉中市", "海东地区", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州", "果洛藏族自治州", "海西蒙古族藏族自治州", "哈密地区", "和田地区", "花莲县", "黄大仙区", "花地玛堂区"] + }, + J: { + J: ["晋城市", "晋中市", "锦州市", "吉林市", "鸡西市", "佳木斯市", "嘉兴市", "金华市", "景德镇市", "九江市", "吉安市", "济南市", "济宁市", "焦作市", "济源市", "荆门市", "荆州市", "江门市", "湛江市", "揭阳市", "嘉峪关市", "金昌市", "酒泉市", "基隆市", "嘉义市", "嘉义县", "九龙城区", "嘉模堂区"] + }, + KL: { + K: ["开封市", "昆明市", "克拉玛依市", "克孜勒苏柯尔克孜自治州", "喀什地区"], + L: ["廊坊市", "临汾市", "吕梁市", "辽阳市", "辽源市", "连云港市", "丽水市", "六安市", "龙岩市", "莱芜市", "临沂市", "聊城市", "洛阳市", "漯河市", "娄底市", "柳州市", "来宾市", "临高县", "乐东黎族自治县", "陵水黎族自治县", "泸州市", "乐山市", "凉山彝族自治州", "六盘水市", "丽江市", "临沧市", "拉萨市", "林芝地区", "兰州市", "陇南市", "临夏回族自治州"] + }, + MNP: { + M: ["牡丹江市", "马鞍山市", "茂名市", "梅州市", "绵阳市", "眉山市", "苗栗县"], + N: ["南京市", "南昌市", "南通市", "宁波市", "南平市", "宁德市", "南阳市", "南宁市", "南沙群岛", "内江市", "南充市", "怒江傈傈族自治州", "那曲地区", "南投县"], + P: ["盘锦市", "莆田市", "萍乡市", "平顶山市", "濮阳市", "攀枝花市", "平凉市", "屏东县", "澎湖县"] + }, + QR: { + Q: ["青岛市", "秦皇岛市", "齐齐哈尔市", "黔西南布依族苗族自治州", "七台河市", "衢州市", "泉州市", "潜江市", "清远市", "钦州市", "琼海市", "曲靖市", "庆阳市", "荃湾区", "黔东南苗族侗族自治州", "黔南布依族苗族自治州", "琼中黎族苗族自治县"], + R: ["日照市", "日喀则地区"] + }, + S: { + S: ["上海市", "深圳市", "苏州市", "石家庄市", "三亚市", "朔州市", "沈阳市", "四平市", "松原市", "双鸭山市", "绥化市", "宿迁市", "绍兴市", "宿州市", "三明市", "上饶市", "三门峡市", "商丘市", "十堰市", "随州市", "邵阳市", "韶关市", "汕头市", "汕尾市", "三亚市", "遂宁市", "思茅市", "山南地区", "商洛市", "石嘴山市", "石河子市", "深水埗区", "沙田区", "神农架林区", "圣安多尼堂区", "圣方济各堂区"] + }, + T: { + T: ["天津市", "唐山市", "太原市", "通辽市", "铁岭市", "通化市", "泰州市", "台州市", "铜陵市", "泰安市", "天门市", "屯昌县", "铜仁地区", "铜川市", "天水市", "吐鲁番地区", "塔城地区", "图木舒克市", "台北市", "台中市", "台南市", "台北县", "桃园县", "台中县", "台南县", "台东县", "屯门区"] + }, + W: { + W: ["无锡市", "温州市", "武汉市", "乌海市", "乌兰察布市", "芜湖市", "潍坊市", "威海市", "梧州市", "五指山市", "文昌市", "万宁市", "文山壮族苗族自治州", "渭南市", "武威市", "吴忠市", "乌鲁木齐市", "五家渠市", "湾仔区", "望德堂区"] + }, + X: { + X: ["邢台市", "忻州市", "兴安盟", "徐州市", "宣城市", "厦门市", "新余市", "新乡市", "许昌市", "信阳市", "襄樊市", "孝感市", "咸宁市", "仙桃市", "湘潭市", "西安市", "咸阳市", "西宁市", "新竹市", "新竹县", "西贡区", "锡林郭勒盟", "西沙群岛", "湘西土家族苗族自治州", "西双版纳傣族自治州"] + }, + Y: { + Y: ["阳泉市", "运城市", "营口市", "延边朝鲜族自治州", "伊春市", "盐城市", "扬州市", "鹰潭市", "宜春市", "烟台市", "宜昌市", "岳阳市", "益阳市", "永州市", "阳江市", "云浮市", "玉林市", "宜宾市", "雅安市", "玉溪市", "延安市", "榆林市", "玉树藏族自治州", "银川市", "伊犁哈萨克自治州", "宜兰县", "云林县", "油尖旺区", "元朗区"] + }, + Z: { + Z: ["郑州市", "张家口市", "镇江市", "舟山市", "漳州市", "淄博市", "枣庄市", "周口市", "驻马店市", "株洲市", "张家界市", "珠海市", "肇庆市", "中山市", "自贡市", "资阳市", "遵义市", "昭通市", "张掖市", "中卫市", "彰化县", "中西区", "中沙群岛的岛礁及其海域"] + } +}; +;// CONCATENATED MODULE: ./src/leaflet/components/commonmodels/GeoJsonLayersModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeoJsonLayersDataModel + * @aliasclass Components.GeoJsonLayersDataModel + * @deprecatedclassinstance L.supermap.components.GeoJsonLayersDataModel + * @description 多图层数据模型。 + * @category Components Common + * @private + * @param {Array.} layers - 图层数组。 + * @param {GeoJSONLayerWithName} layers.layerObject - 含有 layerName 与 GeoJSON 图层的对象。 + * @fires GeoJsonLayersDataModel#newlayeradded + * @usage + */ +// todo 看看如何完善 +class GeoJsonLayersDataModel { + constructor(layers) { + this.layers = []; + if (layers && layers.length > 0) { + this.addLayers(layers); + } + this.currentLayerDataModel = null; + } + + addLayers(layers, success, failed, context) { + for (let i = 0; i < layers.length; i++) { + let layerName = layers[i].layerName; + if (layers[i].layer instanceof (external_L_default()).GeoJSON) { + let geoJsonLayerDataModel = new GeoJsonLayerDataModel(layers[i].layer); + //赋给 GeoJsonLayersDataModel 对象 layerName 属性,每个图层名对应一个 layerDataModel 对象 + this.layers[layerName] = geoJsonLayerDataModel; + success && success.call(context, {layerName: layerName, layer: geoJsonLayerDataModel}); + } else { + failed && failed.call(context, "") + } + } + } + + /** + * @function GeoJsonLayersDataModel.prototype.setCurrentLayerDataModel + * @description 设置当前选中的图层。 + * @param {string} layerName - 选中的图层名称。 + */ + setCurrentLayerDataModel(layerName) { + if (this.layers[layerName]) { + this.currentLayerDataModel = this.layers[layerName]; + } + } +} + + +/** + * @class GeoJsonLayerDataModel + * @classdesc 图层数据模型,可用于图层要素数据、属性管理等。 + * @category Components Common + * @param {L.GeoJSON} layer - GeoJSON 图层。 + * 注:leaflet 没有 feature 的概念 + * @usage + */ +class GeoJsonLayerDataModel { + + constructor(layer) { + //图层对象 + this.layer = layer; + //要素图层数组 + this.features = layer.getLayers(); + //图层属性字段 + this.attributeNames = []; + //这里一个图层默认共用一套属性字段 + if (this.features[0].feature.properties) { + for (let field in this.features[0].feature.properties) { + this.attributeNames.push(field); + } + } + //指定图层操作属性字段 + this.operatingAttributeNames = []; + //图层属性对象 + this.attributes = {}; + } + + /** + * @function GeoJsonLayerDataModel.prototype.setOperatingAttributeNames + * @description 指定操作字段。 + * @param {Array.} operatingAttr - 查询属性字段数组,该数组为 this.attributeNames 的子集。 + */ + setOperatingAttributeNames(operatingAttr) { + this.operatingAttributeNames = operatingAttr; + } + + /** + * @function GeoJsonLayerDataModel.prototype.getAllAttributeNames + * @description 获取图层所有属性名称。 + * @returns {Array.} 返回图层所有属性名称。 + */ + getAllAttributeNames() { + return this.attributeNames; + } + + /** + * @function GeoJsonLayerDataModel.prototype.getAttributeNamesByType + * @description 获取指定类型的图层属性字段。 + * @param {string} [type] - 类型参数。默认返回所有字段,可选 'Num'。 + * @returns {Array.} 返回指定类型的图层属性字段。 + */ + getAttributeNamesByType(type) { + //图层属性字段 + if (this.features[0].feature.properties) { + let properties = this.features[0].feature.properties; + let attributeNames = []; + if (type === 'Num') { + for (let field in properties) { + if (!isNaN(properties[field])) { + attributeNames.push(field); + } + } + } else { + attributeNames = this.attributeNames; + } + return attributeNames; + } + } + + /** + * @function GeoJsonLayerDataModel.prototype.getAllFeatures + * @description 获取图层所有要素。 + * @returns {Array.} 返回图层所有要素。 + */ + getAllFeatures() { + return this.features; + } + + /** + * @function GeoJsonLayerDataModel.prototype.getAttributeValueByAttributeName + * @description 获取属性值。 + * @param {string} attributeName - 属性名称。 + * @returns {Object} 返回属性值对象。 + */ + getAttributeValueByAttributeName(attributeName) { + //如果图层属性对象中已存在该属性,则直接返回 + if (this.attributes[attributeName]) { + return this.attributes[attributeName]; + } + + //若图层属性对象还未存储该属性,则遍历每个feature 读取其属性值,并存储到图层属性对象中 + this.attributes[attributeName] = []; + for (let i = 0; i < this.features.length; i++) { + this.attributes[attributeName].push([this.features[i].feature.properties[attributeName]]); + } + + return this.attributes[attributeName]; + } + + //getAttributeValueByAttributeName(feature,attributeName) + //getAllFeatures() + //todo getFeatureByID() + //getFeaturesByKeywords(keyword,searchAttributeNames) + //getAllAttributeValues(attributeName) ?? + //getAllAttributeNames() + + /** + * @function GeoJsonLayerDataModel.prototype.getFeaturesByKeyWord + * @description 查询要素对象。 + * @param {string} keyWord - 查询关键字。 + * @returns {Array.} 返回要素对象数组。 + */ + getFeaturesByKeyWord(keyWord) { + let features = [], keyReg = new RegExp(keyWord.toLowerCase()); + const self = this; + this.features.forEach(function (feature) { + if (!feature.feature.properties) { + return null; + } + let fAttr = feature.feature.properties; + let operatingAttributeNames; + //若设置了过滤字段,则按过滤字段查询 + if (self.operatingAttributeNames.length > 0) { + operatingAttributeNames = self.operatingAttributeNames; + } else { + //若未设置了过滤字段,则按图层字段查询 + operatingAttributeNames = self.attributeNames; + } + //遍历要素,查询符合条件的要素 + for (let i = 0, len = operatingAttributeNames.length; i < len; i++) { + if (fAttr[operatingAttributeNames[i]] && keyReg.test(fAttr[operatingAttributeNames[i]].toString().toLowerCase())) { + let filterAttributeName = operatingAttributeNames[i]; + let filterAttributeValue = fAttr[operatingAttributeNames[i]]; + //将查询出的属性字段及属性值赋给 feature 并返回 + feature.filterAttribute = { + filterAttributeName: filterAttributeName, + filterAttributeValue: filterAttributeValue + }; + features.push(feature); + break; + } + } + }); + return features; + } +} + +;// CONCATENATED MODULE: ./src/leaflet/components/search/SearchViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SearchViewModel + * @aliasclass Components.SearchViewModel + * @deprecatedclassinstance L.supermap.components.searchViewModel + * @classdesc 图层查询组件功能类。 + * @version 9.1.1 + * @category Components Search + * @param {L.Map} map - Leaflet Map 对象。 + * @param {Object} options - 参数。 + * @param {Object} [options.cityGeoCodingConfig] - 城市地址匹配服务配置,包括:{addressUrl:"",key:""},默认为 online 本地搜索服务。 + * @fires SearchViewModel#newlayeradded + * @fires SearchViewModel#searchlayersucceeded + * @fires SearchViewModel#searchfailed + * @fires SearchViewModel#geocodesucceeded + * @extends {L.Evented} + * @usage + */ +var SearchViewModel = external_L_default().Evented.extend({ + options: { + cityGeoCodingConfig: { + addressUrl: "https://www.supermapol.com/iserver/services/localsearch/rest/searchdatas/China/poiinfos", + key: "fvV2osxwuZWlY0wJb8FEb2i5" + } + }, + + initialize(map, options) { + if (map) { + /** + * @member {L.Map} SearchViewModel.prototype.map + * @description 当前组件所在的地图。 + */ + this.map = map; + } else { + return new Error(`Cannot find map, fileModel.map cannot be null.`); + } + + external_L_default().Util.setOptions(this, options); + //初始化Model + this.dataModel = new GeoJsonLayersDataModel(); + //初始话地址匹配服务 + + this.geoCodeParam = { + keyWords: '北京市', + city: "北京市", + pageSize: this.options.pageSize, + pageNum: this.options.pageNum + }; + //查询缓存 + this.searchCache = {}; + }, + + /** + * @function SearchViewModel.prototype.search + * @description 查询。 + * @param {string} keyWords - 查询的关键字。 + * @param {string} [searchLayerName] - 执行的查询类型,支执行矢量图层属性查询,当为 "geocode" 则执行地址匹配。 + */ + search(keyWord, searchLayerName) { + if (!searchLayerName) { + this.searchFromCityLocalSearchService(keyWord); + } else { + this.searchFromLayer(keyWord, searchLayerName); + } + }, + + /** + * @function SearchViewModel.prototype.searchFromLayer + * @description 图层属性查询。 + * @param {string} searchLayerName - 查询的图层名。 + * @param {string} keyWord - 图层属性搜索关键字。 + */ + searchFromLayer(keyWord, searchLayerName) { + if (this.dataModel.layers[searchLayerName]) { + let resultFeatures = this.dataModel.layers[searchLayerName].getFeaturesByKeyWord(keyWord); + if (resultFeatures && resultFeatures.length > 0) { + /** + * @event SearchViewModel#searchlayersucceeded + * @description 图层属性查询成功后触发。 + * @property {Object} result - 图层数据。 + */ + this.fire("searchlayersucceeded", { + result: resultFeatures + }); + } else { + /** + * @event SearchViewModel#searchfailed + * @description 图层属性查询失败后触发。 + * @property {string} searchType - 图层属性查询状态。 + */ + this.fire("searchfailed", { + searchType: "searchLayersField" + }); + } + } + }, + + /** + * @function SearchViewModel.prototype.searchFromCityLocalSearchService + * @description 城市地址匹配查询。 + * @param {string} keyWords - 城市地址匹配查询关键字。 + */ + searchFromCityLocalSearchService(keyWords) { + //todo 是否保留缓存?请求过的数据保留一份缓存? + if (this.searchCache[keyWords]) { + /** + * @event SearchViewModel#geocodesucceeded + * @description 城市地址匹配成功后触发。 + * @property {Object} result - 城市匹配成功后返回的数据。 + */ + this.fire("geocodesucceeded", { + result: this.searchCache[keyWords] + }); + } else { + this.geoCodeParam.keyWords = keyWords || this.geoCodeParam.city; + const self = this; + let url = this._getSearchUrl(this.geoCodeParam); + FetchRequest.get(url).then((response) => { + return response.json(); + }).then((geocodingResult) => { + if (geocodingResult.error || geocodingResult.poiInfos.length === 0) { + self.fire("searchfailed", { + searchType: "searchGeocodeField" + }); + return; + } + if (geocodingResult.poiInfos) { + const geoJsonResult = self._dataToGeoJson(geocodingResult.poiInfos, self.geoCodeParam); + self.fire("geocodesucceeded", { + result: geoJsonResult + }); + } + }) + } + }, + + /** + * @function SearchViewModel.prototype.addSearchLayers + * @description 添加新的可查询图层。 + * @param {Array.} layers - 新添加的图层对象。 + */ + addSearchLayers(layers) { + this.dataModel.addLayers(layers, (e) => { + /** + * @event SearchViewModel#newlayeradded + * @description 添加查询图层事件。 + * @property {Object} result - 事件返回的新的查询图层对象。 + * @property {string} layerName - 事件返回的新的查询图层对象名。 + */ + this.fire("newlayeradded", { + layerName: e.layerName + }); + }, null, this); + }, + + /** + * @function SearchViewModel.prototype.panToLayer + * @description 缩放到指定图层。 + * @param {string} layerName - 指定缩放的图层名。 + */ + panToLayer(layerName) { + if (this.dataModel.layers[layerName]) { + this.map.flyToBounds(this.dataModel.layers[layerName].layer.getBounds()); + } + }, + + /** + * @function SearchViewModel.prototype.panToCity + * @description 缩放到指定城市。 + * @param {string} city - 指定缩放的城市名。 + */ + panToCity(city) { + this.geoCodeParam.keyWords = city; + this.geoCodeParam.city = city; + const self = this; + let url = this._getSearchUrl(this.geoCodeParam); + FetchRequest.get(url).then((response) => { + return response.json(); + }).then((geocodingResult) => { + if (geocodingResult.poiInfos.length > 0) { + //缩放至城市 + const center = external_L_default().latLng(geocodingResult.poiInfos[0].location.y, geocodingResult.poiInfos[0].location.x); + self.map.setView(center, 8); + } else { + self.fire("searchfailed", { + searchType: "cityGeocodeField" + }); + } + }) + }, + + + /** + * @description 将地址匹配返回的数据转为 GeoJSON 格式数据。 + * @param data + * @private + */ + _dataToGeoJson(data, geoCodeParam) { + let features = []; + for (let i = 0; i < data.length; i++) { + let feature = { + type: "Feature", + geometry: { + type: "Point", + coordinates: [data[i].location.x, data[i].location.y] + }, + properties: { + name: data[i].name || geoCodeParam.keyWords, + address: data[i].formatedAddress || data[i].address + } + }; + features.push(feature); + } + + return features; + }, + + /** + * @function SearchViewModel.prototype._getSearchUrl + * @description 获取地理编码查询地址。 + * @param {Object} geoCodeParam - 地理编码查询参数。 + * @private + */ + _getSearchUrl(geoCodeParam) { + let url = this.options.cityGeoCodingConfig.addressUrl + `.json?keywords=${geoCodeParam.keyWords}&city=${geoCodeParam.city}&pageSize=${geoCodeParam.pageSize}&pageNum=${geoCodeParam.pageNum}&key=${this.options.cityGeoCodingConfig.key}`; + return url; + } +}); + +var searchViewModel = function (options) { + return new SearchViewModel(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/search/SearchView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class SearchView + * @aliasclass Components.Search + * @deprecatedclassinstance L.supermap.components.search + * @classdesc 图层查询组件。 + * @category Components Search + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {Object|Array.} [options.cityConfig] - 城市地址匹配配置,默认为全国城市,与 options.cityGeoCodingConfig 支持匹配的服务对应; + * 配置两种格式:{key1:{A:[],B:[]}, key2:{C:[],D:[]}} 或 ["成都市","北京市"],用户可根据自己的项目需求进行配置。 + * @param {Object} [options.cityGeoCodingConfig] - 城市地址匹配服务配置,包括:{addressUrl:"",key:""} 默认为 online 地址匹配服务,与 options.cityConfig 对应。 + * @param {boolean} [options.isGeoCoding=true] - 是否支持城市地址匹配功能。 + * @param {number} [options.pageSize=10] - 地址匹配查询返回记录结果数,最大设置为 20。 + * @param {number} [options.pageNum=1] - 地址匹配查询分页页码,默认 1 代表第一页。 + * @param {number} [options.perPageDataNum=8] - 每页显示个数,最大值为 8。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @extends {ComponentsViewBase} + * @fires SearchView#searchlayersucceeded + * @fires SearchView#searchfailed + * @fires SearchView#geocodesucceeded + * @usage + */ +var SearchView = ComponentsViewBase.extend({ + options: { + cityConfig: config, + cityGeoCodingConfig: { + addressUrl: "https://www.supermapol.com/iserver/services/localsearch/rest/searchdatas/China/poiinfos", + key: "fvV2osxwuZWlY0wJb8FEb2i5" + }, + isGeoCoding: true, + pageSize: 10, + pageNum: 1, + perPageDataNum: 8 + }, + + initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + //当前选中查询的图层名: + this.currentSearchLayerName = ""; + this.isSearchLayer = false; + this.perPageDataNum = this.options.perPageDataNum; + }, + + /*------以下是一些接口-----*/ + /** + * @function SearchView.prototype.onAdd + * @description 向底图添加组件。 + * @private + * @override + */ + onAdd: function (map) { + //初始化组件业务逻辑执行对象 viewModel + this.viewModel = new SearchViewModel(map, this.options); + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function SearchView.prototype.addSearchLayer + * @description 添加可查询的图层。 + * @param {Array.|L.GeoJSON} layers - 可查询的图层。 + */ + addSearchLayer(layers) { + //将可查询图层数据传入vm处理 + this.viewModel.addSearchLayers(layers); + }, + + /*----------以下是创建 dom 元素的方法---------*/ + /** + * @function SearchView.prototype._initView + * @description 创建地址匹配或图层要素查询组件。 + * @override + * @returns {HTMLElement} + * @private + */ + _initView() { + // self 便于 this 对象的使用 + const self = this; + const div = document.createElement("div"); + div.setAttribute("class", "component-search-container"); + + //外框 + const poiContainer = document.createElement("div"); + poiContainer.setAttribute("class", "component-search"); + //主体 + //---------下拉框: + const poiSettings = document.createElement("div"); + poiSettings.setAttribute("class", "component-search__settings"); + //下拉框 + const poiSearchName = document.createElement("div"); + //由View 维护,进行交互操作 + poiSearchName.setAttribute("class", "component-search__settings__name"); + //poiSettings.innerHTML 通过下拉框选项改变 + + poiSettings.appendChild(poiSearchName); + + //下拉标记 + const triangleIcon = document.createElement("span"); + triangleIcon.setAttribute("class", "supermapol-icons-solid-down-triangle"); + poiSettings.appendChild(triangleIcon); + + //城市地址匹配页面, 以及图层查询页面 + //城市地址匹配页面: + let citySelect = null; + if (this.options.isGeoCoding) { + const cityTabsPageObj = new CityTabsPage({ + config: this.options.cityConfig + }); + citySelect = cityTabsPageObj.getElement(); + //点选城市名,修改显示,并执行定位城市查询【城市列表列表点击事件】 + cityTabsPageObj.content.onclick = (e) => { + if (e.target.nodeName === "SPAN" && e.target.innerText) { + this.viewModel.panToCity(e.target.innerHTML); + this.messageBox.closeView(); + poiSearchName.removeChild(poiSearchName.firstChild); + poiSearchName.insertBefore(document.createTextNode(e.target.innerHTML), poiSearchName.firstChild); + this.isSearchLayer = false; + } + }; + //支持城市地址匹配,则初始化显示配置的第一个城市名: + poiSearchName.appendChild(document.createTextNode(cityTabsPageObj.content.getElementsByTagName("span")[0].innerText)); + } + + //图层查询页面:写法是为了为了代码可读性 + const layersSelect = function () { + const layersSelect = document.createElement("div"); + layersSelect.setAttribute("class", "component-search__layers"); + + const layersContent = document.createElement("div"); + layersContent.setAttribute("class", "component-search-layers-content"); + layersSelect.appendChild(layersContent); + + //header todo 两个选项的功能暂没用到,先关闭,后续用到再打开 + const layersHeader = document.createElement("div"); + layersHeader.setAttribute("class", "component-search__layers__header"); + //加载搜索条件 + const loadBtn = document.createElement("div"); + loadBtn.setAttribute("class", "load-btn"); + layersHeader.appendChild(loadBtn); + const loadIcon = document.createElement("span"); + loadIcon.setAttribute("class", "supermapol-icons-poi-load"); + loadBtn.appendChild(loadIcon); + const loadBtnText = document.createElement("span"); + loadBtnText.appendChild(document.createTextNode(Lang.i18n("text_loadSearchCriteria"))); + loadBtn.appendChild(loadBtnText); + //保存搜索条件 + const saveBtn = document.createElement("div"); + saveBtn.setAttribute("class", "save-btn"); + layersHeader.appendChild(saveBtn); + const icon = document.createElement("span"); + icon.setAttribute("class", "supermapol-icons-poi-save"); + saveBtn.appendChild(icon); + const saveBtnText = document.createElement("span"); + saveBtnText.appendChild(document.createTextNode(Lang.i18n("text_saveSearchCriteria"))); + saveBtn.appendChild(saveBtnText); + + //body + const layerSelectOptions = document.createElement("div"); + layerSelectOptions.setAttribute("class", "component-search__layers__body"); + //选中查询图层监听 + //选择查询图层【图层列表点击事件】 + layerSelectOptions.onclick = (e) => { + //先进行清除操作 + self.clearSearchResult(); + + let selectLayerOption = null; + if (e.target.classList[0] === "component-search__layers__itme__singleselect") { + selectLayerOption = e.target; + } else if (e.target.classList[0] === "component-single-default-img" || e.target.classList[0] === "single-label") { + selectLayerOption = e.target.parentNode; + } else { + return; + } + + if (document.getElementsByClassName("component-single-checked-img").length > 0) { + document.getElementsByClassName("component-single-checked-img")[0].setAttribute("class", "component-single-default-img"); + } + + selectLayerOption.firstChild.setAttribute("class", "component-single-checked-img"); + self.currentSearchLayerName = selectLayerOption.lastChild.innerText; + self.isSearchLayer = true; + poiSearchName.removeChild(poiSearchName.firstChild); + poiSearchName.insertBefore(document.createTextNode(self.currentSearchLayerName), poiSearchName.firstChild); + + self.viewModel.panToLayer(self.currentSearchLayerName); + self.messageBox.closeView(); + }; + + layersContent.appendChild(layerSelectOptions); + + //读取当前图层数据,并展现 + //只有调用添加查询图层接口才能添加图层选项 + + return layersSelect; + }(); + + //配置开启 城市匹配功能则添加 + let navTabs = []; + if (citySelect) { + navTabs.push({ + title: Lang.i18n("title_searchCity"), + content: citySelect + }) + } + navTabs.push({ + title: Lang.i18n("title_searchLayer"), + content: layersSelect + }); + const navTabsPageObject = new NavTabsPage({ + tabs: navTabs + }); + const navTabsPage = navTabsPageObject.getElement(); + navTabsPageObject.closeView(); + poiContainer.appendChild(navTabsPage); + + poiSettings.onclick = () => { + if (navTabsPage.hidden) { + navTabsPageObject.showView(); + } else { + navTabsPageObject.closeView(); + } + }; + poiContainer.appendChild(poiSettings); + //初始时,下拉框若没赋值显示信息,则再次赋值: + if (!poiSearchName.innerText) { + poiSearchName.appendChild(document.createTextNode(Lang.i18n("text_label_chooseSearchLayers"))); + } + //---------下拉框 END + + //---------搜索输入框: + const poiInputContainer = document.createElement("div"); + poiInputContainer.setAttribute("class", "component-search__input"); + const poiInput = document.createElement("input"); + poiInput.type = "text"; + poiInput.placeholder = Lang.i18n("text_label_searchTips"); + + poiInputContainer.appendChild(poiInput); + //由View 维护,进行交互操作 + this.poiInput = poiInput; + //清除输入内容按钮: + const poiInputClose = document.createElement("span"); + poiInputClose.setAttribute("class", "supermapol-icons-close"); + poiInputClose.hidden = true; + + poiInputContainer.appendChild(poiInputClose); + + poiContainer.appendChild(poiInputContainer); + //---------搜索输入框 END + + //--------搜索按钮: + const searchBtn = document.createElement("div"); + searchBtn.setAttribute("class", "component-search-icon supermapol-icons-search"); + //查询结果页面 + const resultDomObj = new PaginationContainer(); + this._resultDomObj = resultDomObj; + //查询要素或匹配要素【搜索按钮点击事件】 + searchBtn.onclick = () => { + //若是遮挡结果显示,则关闭 + resultDomObj.closeView(); + this.clearSearchResult(); + this.messageBox.closeView(); + navTabsPageObject.closeView(); + const keyWord = this.poiInput.value.trim(); + if (keyWord === "") { + this.messageBox.showView(Lang.i18n('msg_searchKeywords')); + return; + } + if (this.isSearchLayer) { + this.viewModel.search(keyWord, this.currentSearchLayerName); + } else { + this.viewModel.search(keyWord); + } + }; + + //【输入框输入内容回车事件】 + poiInput.onkeypress = (e) => { + //.which属性判断按下的是哪个键,回车键的键位序号为13 + if (e.which == 13) { + //手动触发 searchBtn 得点击事件,执行查询操作 + var evt = document.createEvent("HTMLEvents"); + evt.initEvent("click", false, true); + searchBtn.dispatchEvent(evt); + } + }; + + poiContainer.appendChild(searchBtn); + //--------搜索按钮 END + + const resultContainer = function createResultPage() { + const resultContainer = resultDomObj.getElement(); + resultContainer.style.position = "absolute"; + resultContainer.style.top = "44px"; + resultContainer.style.right = "0"; + //先关闭结果界面,当有数据时再打开 + resultDomObj.closeView(); + + //【结果列表点击事件】,以支持联动map上对应要素: + resultDomObj.content.onclick = (e) => { + let selectFeatureOption = null; + if (e.target.parentNode.className === "component-search-result-info") { + selectFeatureOption = e.target.parentNode.parentNode; + } else if (e.target.parentNode.className === "component-search__resultitme") { + selectFeatureOption = e.target.parentNode; + } else if (e.target.className === "component-search__resultitme") { + selectFeatureOption = e.target; + } else { + return; + } + //修改 + if (document.getElementsByClassName("component-search__resultitme-selected").length > 0) { + document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"); + } + + selectFeatureOption.firstChild.classList.add("component-search__resultitme-selected"); + + let filter = selectFeatureOption.children[1].firstChild.innerText; + //联动地图上要素响应 + self._linkageFeature(filter); + }; + + return resultContainer; + }(); + poiContainer.appendChild(resultContainer); + + //清除输入框内容【输入框删除按钮点击事件】 + poiInputClose.onclick = (e) => { + this.clearSearchResult(); + poiInput.value = ""; + e.target.hidden = true; + resultDomObj.closeView(); + }; + + //【输入框输入内容事件】 + poiInput.oninput = () => { + poiInputClose.hidden = false; + }; + + //添加提示框 + this.messageBox = new MessageBox(); + //绑定 VM 的监听 + this._addViewModelListener(); + div.appendChild(poiContainer); + + //阻止 map 默认事件 + this._preventMapEvent(div, this.map); + return div; + }, + + /** + * @function SearchView.prototype._createSearchLayerItem + * @description 创建查询图层选项。 + * @private + */ + _createSearchLayerItem(layerName) { + const layerOption = document.createElement("div"); + layerOption.setAttribute("class", "component-search__layers__itme"); + + // 创建圆形单选框 + const singleSelect = document.createElement("div"); + singleSelect.setAttribute("class", "component-search__layers__itme__singleselect"); + const singleIcon = document.createElement("div"); + singleIcon.setAttribute("class", "component-single-default-img"); + singleSelect.appendChild(singleIcon); + const singleLabel = document.createElement("span"); + singleLabel.setAttribute("class", "single-label"); + singleLabel.innerHTML = layerName; + singleSelect.appendChild(singleLabel); + + layerOption.appendChild(singleSelect); + + //attributes-select todo 暂不支持该功能 + // const attributesSelect = (new ComponentSelect(layer.layer.attributeNames)).getElement(); + //选择查询的字段 todo 限制图层查找属性功能待属性选择框优化后完善 + /*attributesSelect.onchange = (e) => { + this.searchAttributes = e.target.value; + };*/ + // layerOption.appendChild(attributesSelect); + + document.getElementsByClassName("component-search__layers__body")[0].appendChild(layerOption); + }, + + /** + * @function SearchView.prototype._createResultItem + * @description 创建查询结果列表。 + * @private + */ + _createResultItem(featureType, properties) { + const item = document.createElement("div"); + item.setAttribute("class", "component-search__resultitme"); + + let icon = document.createElement("div"); + if (featureType === "Point" || featureType === "MultiPoint") { + icon.setAttribute("class", "supermapol-icons-marker-layer component-search-result-icon"); + } else if (featureType === "LineString" || featureType === "MultiLineString ") { + icon.setAttribute("class", "supermapol-icons-line-layer component-search-result-icon"); + } else if (featureType === "Polygon" || featureType === "MultiPolygon") { + icon.setAttribute("class", "supermapol-icons-polygon-layer component-search-result-icon"); + } else { + icon.setAttribute("class", "supermapol-icons-point-layer component-search-result-icon"); + } + item.appendChild(icon); + + const info = document.createElement("div"); + info.setAttribute("class", "component-search-result-info"); + const info1 = document.createElement("div"); + info.appendChild(info1); + + const info2 = document.createElement("div"); + //分地址匹配和图层搜索的两种数据展现形式: + if (properties.name) { + info1.innerHTML = properties.name; + info2.innerHTML = properties.address; + info.appendChild(info2); + } else { + info1.innerHTML = properties.filterAttributeName + ": " + properties.filterAttributeValue; + } + + item.appendChild(info); + + //暂时删除复选框UI + const check = document.createElement("div"); + check.setAttribute("class", "component-checkbox component-checkbox-default-img"); + // item.appendChild(check); + return item; + }, + + /*----------对 VM 的一些事件监听 ----------*/ + /** + * @function SearchView.prototype._addViewModelListener + * @description 绑定对 VM 的事件监听。 + * @private + */ + _addViewModelListener() { + //----可查询图层变化监听 + this.viewModel.on("searchlayerschanged", (layers) => { + for (let i = 0; i < layers.length; i++) { + this._createSearchLayerItem(layers[i]); + } + }); + + //----可查询图层变化监听 + this.viewModel.on("newlayeradded", (e) => { + this._createSearchLayerItem(e.layerName); + }); + + //----图层查询结果监听 + this.viewModel.on("searchlayersucceeded", (e) => { + const data = e.result; + this.clearSearchResult(); + this.searchResultLayer = external_L_default().featureGroup(data, { + pointToLayer: this.options.style, + style: this.options.style + }).bindPopup(function (layer) { + if (layer.feature.properties) { + return (new AttributesPopContainer({ + attributes: layer.feature.properties + })).getElement(); + } + }).addTo(this.map); + this.searchResultLayer.eachLayer((layer) => { + this.options.onEachFeature ? this.options.onEachFeature(layer.toGeoJSON(), layer) : + this._featureOnclickEvent.bind(this)(layer.toGeoJSON(), layer); + }); + this.searchLayersData = data; + //查询结果列表: + this._prepareResultData(data); + /** + * @event SearchView#searchlayersucceeded + * @description 图层查询成功后触发。 + * @property {Object} result - 事件返回的 GeoJSON 格式数据对象。 + */ + this._event.fire("searchlayersucceeded", { + result: this.searchResultLayer.toGeoJSON() + }); + }); + + //----地址匹配服务监听 + this.viewModel.on("geocodesucceeded", (e) => { + const data = e.result; + //先清空当前有的地址匹配图层 + this.clearSearchResult(); + this.searchResultLayer = external_L_default().geoJSON(data, { + pointToLayer: this.options.style, + style: this.options.style, + onEachFeature: this.options.onEachFeature || this._featureOnclickEvent.bind(this) + }).bindPopup(function (layer) { + if (layer.feature.properties) { + return (new AttributesPopContainer({ + attributes: layer.feature.properties + })).getElement(); + } + }).addTo(this.map); + this.searchLayersData = data + //查询结果列表: + this._prepareResultData(data); + /** + * @event SearchView#geocodesucceeded + * @description 地址匹配服务成功后触发。 + * @property {Object} result - 事件返回的 GeoJSON 格式数据对象。 + */ + this._event.fire("geocodesucceeded", { + result: data + }); + }); + + //----地址匹配或图层查询失败监听 + this.viewModel.on("searchfailed", (e) => { + let message = ""; + if (e.searchType === "searchGeocodeField") { + message = Lang.i18n("msg_searchGeocodeField"); + } else if (e.searchType === "cityGeocodeField") { + message = Lang.i18n("msg_cityGeocodeField"); + } else { + message = Lang.i18n("msg_getFeatureField"); + } + this.messageBox.showView(message) + /** + * @event SearchView#searchfailed + * @description 图层属性查询失败后触发。 + * @property {string} message - 失败原因。 + */ + this._event.fire("searchfailed", { + message: message + }); + }); + }, + + /*-------以下是一些辅助性功能函数 -------*/ + /** + * @function SearchView.prototype._prepareResultData + * @description 展示数据。 + * @param {Array.} data - 图层查询或地址匹配返回的要素数据数组。 + * @private + */ + _prepareResultData(data) { + this.currentResult = data; + //向下取舍,这只页码 + let pageCounts = Math.ceil(data.length / this.perPageDataNum); + this._resultDomObj.setPageLink(pageCounts); + //初始结果页面内容: + this._createResultListByPageNum(1, data); + this._resultDomObj.showView(); + + //给页面模板设置联动事件 + this._resultDomObj.setLinkageEvent(_linkageEvent); + const self = this; + + function _linkageEvent(page) { + self._createResultListByPageNum(page, self.currentResult); + } + }, + + /** + * @function SearchView.prototype._createResultListByPageNum + * @description 填充内容。 + * @param {number} page - 页数。 + * @param {Array.} data - 图层查询或地址匹配返回的要素数据数组。 + * @private + */ + _createResultListByPageNum(page, data) { + let start = 0, + end; + if (page === 1 && data.length < this.perPageDataNum) { + //data数据不满8个时: + end = data.length - 1; + } else if (page * this.perPageDataNum > data.length) { + //最后一页且数据不满8个时 + start = this.perPageDataNum * (page - 1); + end = data.length - 1 + } else { + //中间页面的情况 + start = this.perPageDataNum * (page - 1); + end = page * this.perPageDataNum - 1 + } + const content = document.createElement("div"); + for (let i = start; i <= end; i++) { + let properties, featureType = "Point"; + if (data[i].filterAttribute) { + featureType = data[i].feature.geometry.type; + properties = data[i].filterAttribute; + } else { + properties = data[i].properties; + } + content.appendChild(this._createResultItem(featureType, properties)) + } + this._resultDomObj.setContent(content); + this._resultDomObj.showView(); + + //查询完成默认选中第一个结果: + content.firstChild.getElementsByClassName("component-search-result-icon")[0].classList.add("component-search__resultitme-selected"); + const filter = content.firstChild.getElementsByClassName("component-search-result-info")[0].firstChild.innerText; + + !this._selectMarkerFeature && this._linkageFeature(filter); + }, + + /** + * @function SearchView.prototype._flyToBounds + * @param {L.Bounds} bounds - 当前图层范围。 + * @description 移动到该范围。 + * @private + */ + _flyToBounds(bounds) { + const sw = bounds.getSouthWest(); + const ne = bounds.getNorthEast(); + if (sw.lat === ne.lat && sw.lng === ne.lng) { + this.map.flyTo(sw); + } else { + // this.map.fitBounds(this.searchResultLayer.getBounds()); + this.map.fitBounds(bounds); + } + }, + + /** + * @function SearchView.prototype._linkageFeature + * @description 点击结果列表联动地图上要素响应。 + * @private + */ + _linkageFeature(filter) { + let filterValue = ""; + if (this.isSearchLayer) { + filterValue = filter.split(":")[1].trim(); + } else { + filterValue = filter; + } + this._selectFeature && this._selectFeature.addTo(this.map); + this.searchResultLayer.eachLayer((layer) => { + // this._resetLayerStyleToDefault(layer); + if (!filterValue || layer.filterAttribute && layer.filterAttribute.filterAttributeValue === filterValue || + layer.feature.properties && layer.feature.properties.name === filterValue) { + layer.remove(); + + this._setSelectedLayerStyle(layer); + /*layer.bindPopup(function () { + return (new AttributesPopContainer(layer.feature.properties)).getElement() + }, {closeOnClick: false}).openPopup().addTo(this.map);*/ + //若这个图层只有一个点的话,则直接 flyTo 到点: + + } + }); + }, + + /** + * @function SearchView.prototype.clearSearchResult + * @description 清空查询结果。 + */ + clearSearchResult() { + if (this.searchResultLayer) { + this.map.closePopup(); + //若当前是查询图层的结果,则不删除图层,只修改样式 + !this.isSearchLayer && this.map.removeLayer(this.searchResultLayer); + this._selectMarkerFeature && this.map.removeLayer(this._selectMarkerFeature); + this._selectFeaturethis && this.map.removeLayer(this._selectFeature); + this._selectMarkerFeature = null; + this._selectFeature = null; + this.searchResultLayer = null; + this.currentResult = null; + } + }, + /** + * @function SearchView.prototype._featureOnclickEvent + * @description 要素点击事件 + * @param {L.layer} layer - Leaflet Layer 对象。 + * @private + */ + _featureOnclickEvent(feature, layer) { + layer.on('click', () => { + let pageEles1 = document.getElementsByClassName('component-pagination__link')[0]; + this._resultDomObj._changePageEvent({ + target: pageEles1.children[0].children[0] + }); + this._selectFeature && this._selectFeature.addTo(this.map); + layer.remove(); + let page, dataIndex; + + for (let i = 0; i < this.searchLayersData.length; i++) { + let item = this.searchLayersData[i] + if ((item.properties && (item.properties.name === feature.properties.name)) || (item.filterAttribute && (item.filterAttribute.filterAttributeName + ": " + item.filterAttribute.filterAttributeValue) === (layer.filterAttribute.filterAttributeName + ": " + layer.filterAttribute.filterAttributeValue))) { + dataIndex = i % this.perPageDataNum; + page = parseInt(i / this.perPageDataNum) + 1; + break; + } + } + if (page > 1) { + for (let i = 1; i < page; i++) { + let pageEles; + pageEles = document.getElementsByClassName('component-pagination__link')[0]; + this._resultDomObj._changePageEvent({ + target: pageEles.children[pageEles.children.length - 2].children[0] + }); + } + } + let pageList = document.getElementsByClassName('component-search-result-info') + + let target = pageList[dataIndex].children[0]; + + if (target.innerHTML === feature.properties.name || target.innerHTML === (layer.filterAttribute.filterAttributeName + ": " + layer.filterAttribute.filterAttributeValue)) { + let selectFeatureOption = pageList[dataIndex].parentNode; + //修改 + if (document.getElementsByClassName("component-search__resultitme-selected").length > 0) { + document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"); + } + selectFeatureOption.firstChild.classList.add("component-search__resultitme-selected"); + this._setSelectedLayerStyle(layer); + } + }, this) + }, + /** + * @function SearchView.prototype._setSelectedLayerStyle + * @description 设置图层选中样式。 + * @param {L.layer} layer - Leaflet Layer 对象。 + * @private + */ + _setSelectedLayerStyle(layer) { + this._selectMarkerFeature && this._selectMarkerFeature.remove(); + this._selectMarkerFeature = null; + this._selectFeature = layer; + //circleMarker 需要变成 marker 的样式: + this._selectMarkerFeature = external_L_default().geoJSON(layer.toGeoJSON(), { + //点选中样式, todo marker 显示位置需要调整 + pointToLayer: (geoJsonPoint, latlng) => { + return external_L_default().marker(latlng, { + icon: external_L_default().divIcon({ + className: 'component-select-marker-icon', + iconAnchor: [15, 0] + }) + }) + }, + //线和面选中样式: + style: { + fillColor: 'red', + weight: 1, + opacity: 1, + color: 'red', + fillOpacity: 0.2 + } + }).addTo(this.map); + this._selectMarkerFeature.bindPopup(function () { + return (new AttributesPopContainer({ + attributes: layer.feature.properties + })).getElement() + }, { + closeOnClick: false + }).openPopup().addTo(this.map); + + this._flyToBounds(this.searchResultLayer.getBounds()); + let center; + if (layer.getLatLng) { + center = layer.getLatLng(); + } else if (layer.getCenter) { + center = layer.getCenter(); + } + this.map.setView(center); + } +}); + +var searchView = function (options) { + return new SearchView(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/dataflow/DataFlowViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DataFlowViewModel + * @aliasclass Components.DataFlowViewModel + * @deprecatedclassinstance L.supermap.components.dataFlowViewModel + * @classdesc 数据流组件功能类。 + * @version 9.1.1 + * @category Components DataFlow + * @param {L.Map} map - Leaflet Map 对象。 + * @param {Object} [dataFlowLayerOptions] - 数据流服务返回数据数据展示样式,默认采用 ViewModel 默认样式。 + * @param {Object} options - 参数。 + * @param {function} [options.style] - 定义点、线、面要素样式。参数为{@link L.Path-option}。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗,默认对新创建的图层不执行任何操作。 + * @fires DataFlowViewModel#dataflowservicesubscribed + * @fires DataFlowViewModel#subscribesucceeded + * @fires DataFlowViewModel#subscribefailed + * @fires DataFlowViewModel#dataupdated + * @extends {L.Evented} + * @usage + */ +var DataFlowViewModel = external_L_default().Evented.extend({ + options: { + _defaultLayerOptions: { + //style 返回 marker样式或者 L.path 样式 + style: null, + onEachFeature: function (feature, layer) { + let content = "属性信息如下:
"; + for (let key in feature.properties) { + content += key + ": " + feature.properties[key] + "
" + } + layer.bindPopup(content); + + } + } + }, + + initialize(map, dataFlowLayerOptions = null) { + if (map) { + /** + * @member {L.Map} DataFlowViewModel.prototype.map + * @description Leaflet Map 对象。 + */ + this.map = map; + } else { + return new Error(`Cannot find map, fileModel.map cannot be null.`); + } + //合并用户的 dataFlowLayerOptions + external_L_default().Util.extend(this.options._defaultLayerOptions, dataFlowLayerOptions); + //点样式也存储在style里 + this.options._defaultLayerOptions.pointToLayer = this.options._defaultLayerOptions.style; + + /** + * @member {boolean} [DataFlowViewModel.prototype.popupsStatus=true] + * @description 图层 popup 打开 "true" 或关闭 "false" 的状态。 + */ + this.popupsStatus = true; + /** + * @member {boolean} [DataFlowViewModel.prototype.dataFlowStatus=false] + * @description 数据流服务当前状态,订阅 "true" 或未订阅 "false" 的状态。 + */ + this.dataFlowStatus = false; + + /** + * @member {string} [DataFlowViewModel.prototype.dataFlowUrl=""] + * @description 数据流地址。 + */ + this.dataFlowUrl = ""; + + /** + * @member {Array.} [DataFlowViewModel.prototype.currentFeatures] + * @description 当前订阅数据流返回的要素数组。 + */ + this.currentFeatures = []; + + /** + * @member {DataFlowLayer} [DataFlowViewModel.prototype.dataFlowLayer=null] + * @description 当前 dataFlowLayer 图层对象。 + */ + this.dataFlowLayer = null; + + }, + + /** + * @function DataFlowViewModel.prototype.subscribe + * @description 订阅数据流。 + * @param {string} dataFlowUrl - 数据流服务地址。 + */ + subscribe(dataFlowUrl) { + //若当前数据流服务没变,则不进行重新订阅 todo 或者没点击暂停 + if (this.dataFlowUrl === dataFlowUrl) { + if (this.dataFlowStatus) { + /** + * @event DataFlowViewModel#dataflowservicesubscribed + * @description 数据流订阅成功后触发。 + */ + this.fire("dataflowservicesubscribed"); + return; + } + } else { + this.dataFlowUrl = dataFlowUrl + } + this.dataFlowStatus = true; + //移除已有图层 + if (this.dataFlowLayer) { + this.dataFlowLayer.remove(); + this.dataFlowLayer = null; + } + //创建DataFlowLayer,创建DataFlowLayer订阅iServer dataflow服务并将结果加载到地图上 + const dataFlowLayer = new DataFlowLayer(dataFlowUrl, this.options._defaultLayerOptions); + dataFlowLayer.on('subscribesucceeded', (result) => { + /** + * @event DataFlowViewModel#subscribesucceeded + * @description 数据流订阅成功后触发。 + * @property {Object} result - 返回的数据。 + */ + this.fire("subscribesucceeded", {result: result}); + }); + dataFlowLayer.on('subscribefailed', (result) => { + /** + * @event DataFlowViewModel#subscribefailed + * @description 数据流订阅失败后触发。 + * @property {Object} result - 返回的数据。 + */ + this.fire("subscribefailed", {result: result}); + }); + dataFlowLayer.on('dataupdated', (result) => { + //派发出订阅返回的数据: + /** + * @event DataFlowViewModel#dataupdated + * @description 数据返回成功后触发。 + * @property {Object} result - 返回的数据。 + */ + this.fire("dataupdated", {result: result}); + //若数据超出当前视图范围,则移动到数据所在视图范围: + let layerBounds = result.layer.getBounds(), + mapBounds = CommontypesConversion.toSuperMapBounds(this.map.getBounds()), + layerBoundsSuperMap = CommontypesConversion.toSuperMapBounds(layerBounds); + if (!mapBounds.intersectsBounds(layerBoundsSuperMap)) { + if (layerBoundsSuperMap.left === layerBoundsSuperMap.right && layerBoundsSuperMap.top === layerBoundsSuperMap.bottom) { + this.map.setView(layerBounds.getCenter()) + } else { + this.map.flyToBounds(layerBounds); + } + } + if (this.popupsStatus) { + this.openPopups(); + } + }); + dataFlowLayer.addTo(this.map); + + this.dataFlowLayer = dataFlowLayer; + }, + + /** + * @function DataFlowViewModel.prototype.cancelSubscribe + * @description 取消订阅的数据流。 + */ + cancelSubscribe() { + if (this.dataFlowLayer) { + this.dataFlowStatus = false; + this.dataFlowLayer.dataService.unSubscribe(); + this.dataFlowLayer.remove(); + this.dataFlowLayer = null; + } + + }, + + /** + * @function DataFlowViewModel.prototype.openPopups + * @description 打开图层要素弹窗。 + */ + openPopups() { + this.popupsStatus = true; + if (this.dataFlowLayer) { + const layers = this.dataFlowLayer.getLayers(); + for (let i = 0; i < layers.length; i++) { + for (let j = 0; j < layers[i].getLayers().length; j++) { + layers[i].getLayers()[j].openPopup(); + } + } + } + }, + /** + * @function DataFlowViewModel.prototype.closePopups + * @description 关闭图层要素弹窗。 + */ + closePopups() { + this.popupsStatus = false; + if (this.dataFlowLayer) { + const layers = this.dataFlowLayer.getLayers(); + for (let i = 0; i < layers.length; i++) { + for (let j = 0; j < layers[i].getLayers().length; j++) { + layers[i].getLayers()[j].closePopup(); + } + } + } + } +}); + +var dataFlowViewModel = function (options) { + return new DataFlowViewModel(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/dataflow/DataFlowView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class DataFlowView + * @aliasclass Components.DataFlowView + * @deprecatedclassinstance L.supermap.components.dataFlow + * @classdesc 数据流组件。 + * @version 9.1.1 + * @category Components DataFlow + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DataFlowView#dataupdated + * @extends {ComponentsViewBase} + * @usage + */ +var DataFlowView = ComponentsViewBase.extend({ + initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + }, + + /** + * @function DataFlowView.prototype.onAdd + * @description 给地图添加组件。 + * @override + * @private + */ + onAdd(map) { + //为了避免空对象为复写默认配置的现象,先判断参数是否为空 + let options = {}; + if (this.options.style) { + options.style = this.options.style; + } + if (this.options.onEachFeature) { + options.style = this.options.onEachFeature; + } + this.viewModel = new DataFlowViewModel(map, options); + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DataFlowView.prototype._initView + * @description 创建数据组件,用于打开本地文件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView() { + const containerObj = new CommonContainer({title: Lang.i18n("title_dataFlowService")}); + const container = containerObj.getElement(); + + const componentContent = containerObj.getContentElement(); + componentContent.style.padding = "10px 18px"; + const dataFlowContainer1 = document.createElement("div"); + dataFlowContainer1.setAttribute("class", "component-dataflow__container"); + //输入框 + const dataFlowInputContainer = document.createElement("div"); + dataFlowInputContainer.setAttribute("class", "component-input-default"); + const dataFlowInput = document.createElement("input"); + dataFlowInput.setAttribute("class", "component-input-default"); + dataFlowInput.type = "text"; + dataFlowInput.placeholder = Lang.i18n('text_input_value_inputDataFlowUrl'); + dataFlowInput.title = Lang.i18n('text_input_value_inputDataFlowUrl'); + + dataFlowInputContainer.appendChild(dataFlowInput); + //删除输入值按钮: + const inputClearBtn = document.createElement("span"); + inputClearBtn.setAttribute("class", "supermapol-icons-close"); + inputClearBtn.hidden = true; + //---清除输入值【清除按钮点击事件】 + inputClearBtn.onclick = (e) => { + dataFlowInput.value = ""; + e.target.hidden = true; + }; + //---输入框值改变,打开清除按钮【输入框内容改变事件】 + dataFlowInput.oninput = () => { + inputClearBtn.hidden = false; + }; + dataFlowInputContainer.appendChild(inputClearBtn); + dataFlowContainer1.appendChild(dataFlowInputContainer); + + componentContent.appendChild(dataFlowContainer1); + + //复选框条件 + const dataFlowContainer2 = document.createElement("div"); + dataFlowContainer2.setAttribute("class", "component-dataflow__container"); + const checkboxContainer = document.createElement("div"); + checkboxContainer.setAttribute("class", "component-checkbox-container"); + const attributesCheckbox = document.createElement("div"); + attributesCheckbox.setAttribute("class", "component-checkbox-default component-checkbox-selected-img"); + attributesCheckbox.checked = true; + checkboxContainer.appendChild(attributesCheckbox); + const checkboxLabel = document.createElement("div"); + checkboxLabel.setAttribute("class", "component-label component-label-selected"); + checkboxLabel.innerHTML = Lang.i18n('text_displayFeaturesInfo'); + checkboxContainer.appendChild(checkboxLabel); + //----是否显示属性框【属性框复选框点击事件】 + attributesCheckbox.onclick = (e) => { + e.target.checked = !e.target.checked; + if (e.target.checked) { + checkboxLabel.setAttribute("class", "component-label component-label-selected"); + e.target.setAttribute("class", "component-checkbox-default component-checkbox-selected-img"); + this.viewModel.openPopups(); + } else { + checkboxLabel.setAttribute("class", "component-label"); + e.target.setAttribute("class", "component-checkbox-default component-checkbox-default-img"); + this.viewModel.closePopups(); + } + }; + + dataFlowContainer2.appendChild(checkboxContainer); + componentContent.appendChild(dataFlowContainer2); + + //订阅按钮,取消按钮: + const dataFlowContainer3 = document.createElement("div"); + dataFlowContainer3.setAttribute("class", "component-dataflow__container component-init-center"); + const subscribe = document.createElement("button"); + subscribe.setAttribute("class", "component-button-default"); + subscribe.innerHTML = Lang.i18n('text_subscribe'); + //----订阅服务【订阅按钮点击事件】 + subscribe.onclick = () => { + const urlDataFlow = dataFlowInput.value; + if (urlDataFlow === "") { + this.messageBox.showView(Lang.i18n('msg_inputDataFlowUrlFirst')); + return; + } + this.viewModel.subscribe(urlDataFlow); + }; + dataFlowContainer3.appendChild(subscribe); + const cancelSubscribe = document.createElement("button"); + cancelSubscribe.setAttribute("class", "component-button-default"); + cancelSubscribe.innerHTML = Lang.i18n('text_cancelSubscribe'); + //----取消订阅服务【取消订阅按钮点击事件】 + cancelSubscribe.onclick = () => { + this.viewModel.cancelSubscribe(); + }; + dataFlowContainer3.appendChild(cancelSubscribe); + componentContent.appendChild(dataFlowContainer3); + + //增加提示框: + this.messageBox = new MessageBox(); + + this.viewModel.on("dataflowservicesubscribed", () => { + this.messageBox.showView(Lang.i18n("msg_dataflowservicesubscribed")); + }); + + this.viewModel.on("subscribesucceeded", () => { + this.messageBox.showView(Lang.i18n("msg_subscribesucceeded")); + }); + + /** + * @event DataFlowView#dataupdated + * @description 数据流服务成功返回数据后触发。 + * @property {Object} result - 事件返回的数据对象。 + */ + this.viewModel.on("dataupdated", (result) => { + this.messageBox.closeView(); + this._event.fire("dataupdated", result); + }); + + //关闭在控件上触发地图的事件响应: + //阻止 map 默认事件 + this._preventMapEvent(container, this.map); + return container; + } + +}); + +var dataFlowView = function (options) { + return new DataFlowView(options); +}; + + +;// CONCATENATED MODULE: ./src/leaflet/components/commonmodels/GeoJSONLayerWithName.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeoJSONLayerWithName + * @aliasclass Components.GeoJSONLayerWithName + * @deprecatedclassinstance L.supermap.components.geoJSONLayerWithName + * @classdesc 含有 layerName 与 GeoJSON 图层的对象。 + * @param {Object} layerObject - 图层对象。 + * @param {string} layerName - 图层名称。 + * @param {L.GeoJSON} layer - 图层。 + * @category Components Common + * @usage + */ +class GeoJSONLayerWithName { + constructor(layerName, layer) { + this.layerName = layerName; + this.layer = layer; + } +} + +var geoJSONLayerWithName = function (layerName, layer) { + return new GeoJSONLayerWithName(layerName, layer); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ClientComputationViewModel + * @aliasclass Components.ClientComputationViewModel + * @deprecatedclassinstance L.supermap.components.clientComputationViewModel + * @classdesc 客户端计算组件功能类。 + * @version 9.1.1 + * @category Components ClientComputation + * @param {string} workerUrl - worker 地址,原始位置为 dist/leaflet/workers/TurfWorker.js。 + * @fires ClientComputationViewModel#analysisfailed + * @fires ClientComputationViewModel#analysissucceeded + * @fires ClientComputationViewModel#layerloaded + * @fires ClientComputationViewModel#layersremoved + * @extends {L.Evented} + * @usage + */ +class ClientComputationViewModel extends (external_L_default()).Evented { + initialize(workerUrl) { + this.workerUrl = workerUrl; + this.turfLayers = []; + } + + /** + * @function ClientComputationViewModel.prototype.getLayersData + * @description 获取填充到 view 的数据。 + * @param {Array.} layersArr - 图层数组。 + * @returns {Object} layers 数据。 + */ + + getLayersData(layersArr) { + let result = {}; + let pointData = {}, lineData = {}, polygonData = {}; + for (let i = 0; i < layersArr; i++) { + layersArr[i] = new GeoJSONLayerWithName(layersArr[i].layerName, layersArr[i].layer) + } + this.geoJsonLayersDataModel = new GeoJsonLayersDataModel(layersArr); + // 把 layersArr 转成 key = layername 对象,方便获取 fields 时遍历 + let dataObj = []; + for (let i = 0; i < layersArr.length; i++) { + dataObj[layersArr[i].layerName] = { + fields: layersArr[i].fields, + layer: layersArr[i].layer.toGeoJSON() + } + } + + for (let key in this.geoJsonLayersDataModel.layers) { + let fields; + if (dataObj[key].fields) { + fields = dataObj[key].fields; + } else { + fields = this.geoJsonLayersDataModel.layers[key].getAttributeNamesByType("Num"); + } + let fieldsValue = []; + for (let i = 0; i < fields.length; i++) { + fieldsValue[fields[i]] = this.geoJsonLayersDataModel.layers[key].getAttributeValueByAttributeName(fields[i]); + // 去空 & 去重 & 转 number + let arr = fieldsValue[fields[i]]; + for (var j = 0; j < arr.length; j++) { + if (arr[j] == "" || typeof (arr[j]) == "undefined") { + arr.splice(j, 1); + j = j - 1; + } + arr[j] = parseFloat(arr[j]) + } + fieldsValue[fields[i]] = Array.from(new Set(arr.sort(function (a, b) { + return a - b; + }))); + } + + let obj = { + layerName: key, + fields: fields, + fieldsValue: fieldsValue, + features: dataObj[key].layer + } + + let layersType = dataObj[key].layer.features[0].geometry.type; + if (layersType === "Point") { + pointData[key] = obj; + } else if (layersType === "LineString") { + lineData[key] = obj; + } else if (layersType === "Polygon") { + polygonData[key] = obj; + } + } + result['point'] = pointData; + result['lineString'] = lineData; + result['polygon'] = polygonData; + + return result; + } + + /** + * @function ClientComputationViewModel.prototype.analysis + * @description 客户端计算。 + * @param {Object} params - 客户端计算参数。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + analysis(params, map) { + this.geoJsonLayersDataModel.setCurrentLayerDataModel(params.analysisLayers); + this.worker = new Worker(this.workerUrl); + let resultData = this.geoJsonLayersDataModel.currentLayerDataModel.layer.toGeoJSON(); + if (params.analysisMethod === "isolines") { + let fieldsValue = params.analysisFieldsValue.split(","); + let pointGrid = resultData; + for (let j = 0; j < fieldsValue.length; j++) { + fieldsValue[j] = parseFloat(fieldsValue[j]) + } + let me = this; + let analysisParams = { + "pointGrid": pointGrid, + "analysisMethod": params.analysisMethod, + "breaks": fieldsValue, + "zProperty": params.analysisFields, + "analysisCellSize": params.analysisCellSize, + "options": {gridType: "point", property: params.analysisFields, weight: Number(params.analysisBreaks)} + }; + this.worker.postMessage(analysisParams); + this.worker.onmessage = (e) => { + if (e.data.features.length === 0) { + /** + * @event ClientComputationViewModel#analysisfailed + * @description 事件分析失败后触发,返回结果为空。 + */ + me.fire('analysisfailed'); + } else { + /** + * @event ClientComputationViewModel#analysissucceeded + * @description 事件分析成功后触发。 + * @property {Object} data - 分析成功后的数据。 + */ + me.fire('analysissucceeded', {'data': e.data}); + + let turfLayer = external_L_default().geoJSON(e.data, { + style: { + color: '#1060C2', weight: 3 + }, + onEachFeature: function (feature, layer) { + if (feature.properties) { + layer.bindPopup((new AttributesPopContainer(feature.properties)).getElement()) + } + layer.on({ + 'mouseover': function () { + layer.setStyle({color: "#ffffff", weight: 5}) + }, + 'mouseout': function () { + layer.setStyle({color: '#1060C2', weight: 3}) + }, + "click": function () { + layer.setStyle({color: "#ffffff", weight: 5}) + + } + }); + } + }).addTo(map); + me.turfLayers.push(turfLayer); + /** + * @event ClientComputationViewModel#layerloaded + * @description 结果图层加载完成后触发。 + * @property {L.GeoJSON} layer - 加载完成后的结果图层。 + * @property {string} name - 加载完成后的结果图层名称。 + */ + me.fire('layerloaded', {"layer": turfLayer, "name": params.resultLayersName}); + me.worker.terminate(); + } + + }; + } else if (params.analysisMethod === "buffer") { + let me = this; + let analysisParams = { + "analysisMethod": "buffer", + "radius": params.radius, + "unit": params.unit, + "isSave": params.isSaveStatus, + "isUnion": params.isUnion, + 'geoJson': resultData + }; + this.worker.postMessage(analysisParams); + this.worker.onmessage = (e) => { + let turfLayer = external_L_default().geoJSON(e.data, { + style: { + color: "#ffffff", fillColor: '#1060C2', fillOpacity: .5, weight: 1.5 + }, + onEachFeature: function (feature, layer) { + if (feature.properties) { + layer.bindPopup((new AttributesPopContainer(feature.properties)).getElement()) + } + layer.on({ + 'mouseover': function () { + layer.setStyle({ + color: "#ffffff", + fillColor: "rgb(46,40,79)", + fillOpacity: .5, + weight: 5 + }) + }, + 'mouseout': function () { + layer.setStyle({color: "#ffffff", fillColor: '#1060C2', fillOpacity: .5, weight: 1.5}) + }, + "click": function () { + layer.setStyle({ + color: "#ffffff", + fillColor: "rgb(46,40,79)", + fillOpacity: .5, + weight: 2 + }) + + } + }); + } + + }).addTo(map); + me.turfLayers.push(turfLayer); + me.fire('layerloaded', {"layer": turfLayer, "name": params.resultLayersName}); + me.worker.terminate(); + }; + } + } + + /** + * @function ClientComputationViewModel.prototype.clearLayers + * @description 清空分析图层。 + */ + clearLayers() { + for (let i in this.turfLayers) { + this.turfLayers[i].clearLayers() + } + /** + * @event ClientComputationViewModel#layersremoved + * @description 图层删除之后触发。 + * @property {Array.} layer - 需要删除的图层数组。 + */ + this.fire('layersremoved', {layers: this.turfLayers}); + } + + /** + * @function ClientComputationViewModel.prototype.cancelAnalysis + * @description 取消分析。 + */ + cancelAnalysis() { + this.worker.terminate(); + } +} + +var clientComputationViewModel = function (options) { + return new ClientComputationViewModel(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ClientComputationView + * @aliasclass Components.ClientComputationView + * @deprecatedclassinstance L.supermap.components.clientComputation + * @classdesc 叠加图层的客户端计算。 + * @version 9.1.1 + * @param {string} workerUrl - worker 地址,原始位置为 dist/leaflet/workers/TurfWorker.js。 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires ClientComputationView#analysissucceeded + * @fires ClientComputationView#analysisfailed + * @fires ClientComputationView#layersremoved + * @category Components ClientComputation + * @extends {ComponentsViewBase} + * @usage + */ +var ClientComputationView = ComponentsViewBase.extend({ + + initialize: function (workerUrl, options) { + if (!workerUrl) { + throw new Error('workerUrl is required'); + } + this.workerUrl = workerUrl; + ComponentsViewBase.prototype.initialize.apply(this, [options]); + }, + /** + * @function ClientComputationView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function (map) { + this.map = map; + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + /** + * @function ClientComputationView.prototype.addLayer + * @description 添加叠加图层。 + */ + addLayer: function (layer) { + this.layers = this.layers || []; + this.layers.push(layer); + let fillData = this.viewModel.getLayersData(this.layers); + this.fillDataToView(fillData); + }, + + /** + * @function ClientComputationView.prototype.fillDataToView + * @private + * @description 填充数据到 view。 + * @param {Object} fillData - 待填充的数据。 + */ + fillDataToView: function (fillData) { + if (!fillData) { + return; + } + this.fillData = fillData; + + let analysisMethod = document.getElementById('dropDownTop').getAttribute('data-value'); + let currentFillData = {}; + switch (analysisMethod) { + case 'isolines': + currentFillData = fillData['point']; + break; + case 'buffer': + currentFillData = fillData['point']; + break; + } + if (JSON.stringify(currentFillData) == '{}') { + return; + } + // 填充分析图层下拉框 + let layserArr = []; + for (let layerName in currentFillData) { + layserArr.push(layerName); + } + let layersSelect = document.getElementById('layersSelect'); + let layerSelectName = document.getElementById('layerSelectName'); + // 清空 layersSelect; + layersSelect.innerHTML = ''; + layerSelectName.title = layserArr[0]; + layerSelectName.innerHTML = layserArr[0]; + this._createOptions(layersSelect, layserArr); + // 设置 layer select option 点击事件 + this.layerSelectObj.optionClickEvent(layersSelect, layerSelectName, this.layersSelectOnchange); + + // 当前选中图层数据 + let currentData = currentFillData[layerSelectName.title]; + let fieldsArr = currentData.fields; + let textAreaData = currentData.fieldsValue; + // 设置当前数据 + this.currentData = currentData; + this.currentFillData = currentFillData; + // 填充字段下拉框 + let fieldsSelect = document.getElementById('fieldsSelect'); + // 清空 fieldsSelect + fieldsSelect.innerHTML = ''; + let fieldsSelectNameDiv = document.getElementById('fieldsSelectName'); + fieldsSelectNameDiv.innerHTML = fieldsArr[0]; + fieldsSelectNameDiv.title = fieldsArr[0]; + this._createOptions(fieldsSelect, fieldsArr); + this.fieldsSelectObj.optionClickEvent(fieldsSelect, fieldsSelectNameDiv, this.fieldsSelectOnchange); + + // 当前选中字段 + let fieldsSelectName = fieldsSelectNameDiv.title; + // 通过当前选中字段 填充 TextArea 初始值 + let getValueTextArea = document.getElementById('getValueTextArea'); + getValueTextArea.value = textAreaData[fieldsSelectName].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', textAreaData[fieldsSelectName]); + + // 结果图层 + let resultLayersName = document.getElementById('resultLayersName'); + let analysisType = document.getElementById('dropDownTop').getAttribute('data-value'); + switch (analysisType) { + case 'isolines': + resultLayersName.value = Lang.i18n('text_label_isolines') + layerSelectName.title; + break; + case 'buffer': + resultLayersName.value = Lang.i18n('text_label_buffer') + layerSelectName.title; + break; + + } + }, + + /** + * @function ClientComputationView.prototype._initView + * @description 创建客户端计算组件。 + * @returns {HTMLElement} + * @private + */ + _initView: function () { + //初始化 ViewModel + this.workerUrl && (this.viewModel = new ClientComputationViewModel(this.workerUrl)); + //初始化 view + // Container + let container = (new CommonContainer({ title: Lang.i18n('title_clientComputing') })).getElement(); + container.classList.add('component-analysis'); + container.children[0].style.fontSize = '12px'; + let analysisOptionsArr = [{ + 'title': Lang.i18n('text_isoline'), + 'dataValue': 'isolines', + 'remark': Lang.i18n('text_extractDiscreteValue'), + 'icon': { + 'className': 'component-analyst-isoline-img' + } + }, { + 'title': Lang.i18n('text_buffer'), + 'dataValue': 'buffer', + 'remark': Lang.i18n('text_specifyTheDistance'), + 'icon': { + 'className': 'component-analyst-buffer-img' + } + }]; + let componentContentContainer = container.children[1]; + componentContentContainer.classList.add('component-content--scroll'); + componentContentContainer.classList.add('component-content--analysis'); + + // 下拉框 + let dropDownBox = (new DropDownBox(analysisOptionsArr)).getElement(); + componentContentContainer.appendChild(dropDownBox); + let dropDownTopContainer = dropDownBox.children[0].children[0]; + let dropDownItems = dropDownBox.children[0].children[2].children[0]; + dropDownTopContainer.children[0].id = 'dropDownTop'; + // analysisContainer + let analysisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); + + // 分析图层 + let analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisTypeContainer); + + + let layerSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', analysisLayer); + layerSelectControl.id = 'layerSelectControl'; + let layerOptions = { + 'optionsArr': [''], + 'labelName': Lang.i18n('text_label_analysisLayer') + }; + let layerSelectObj = new Select(layerOptions); + let layerSelectTool = layerSelectObj.getElement(); + this.layerSelectObj = layerSelectObj; + layerSelectControl.appendChild(layerSelectTool); + // 图层选中div + let layerSelectName = layerSelectTool.children[1].children[0]; + layerSelectName.id = 'layerSelectName'; + // 图层下拉框select + let layersSelect = layerSelectTool.children[1].children[2].children[0].children[0]; + layersSelect.id = 'layersSelect'; + + // ISOLINE + // 提取字段 + let div = external_L_default().DomUtil.create('div', 'component-analysis__container__analysistype', analysisTypeContainer); + let isolineDiv = external_L_default().DomUtil.create('div', 'component-clientcomputation__isoline', div); + let fieldsOptions = { + 'optionsArr': [''], + 'labelName': Lang.i18n('text_label_extractField'), + 'optionsClickCb': this.fieldsSelectOnchange + + }; + let fieldsSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', isolineDiv); + let fieldsSelectObj = new Select(fieldsOptions); + let fieldsSelectTool = fieldsSelectObj.getElement(); + this.fieldsSelectObj = fieldsSelectObj; + let fieldsSelectName = fieldsSelectTool.children[1].children[0]; + fieldsSelectName.id = 'fieldsSelectName'; + let fieldsSelect = fieldsSelectTool.children[1].children[2].children[0].children[0]; + fieldsSelect.id = 'fieldsSelect'; + fieldsSelectControl.appendChild(fieldsSelectTool); + + // 提取值 + let textareaContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', isolineDiv); + let textareaSpan = external_L_default().DomUtil.create('span', 'component-textarea__name', textareaContainer); + textareaSpan.innerHTML = Lang.i18n('text_label_extractedValue'); + let textareaControl = external_L_default().DomUtil.create('div', 'component-textarea', textareaContainer); + textareaControl.id = 'getValueText'; + let scrollarea = external_L_default().DomUtil.create('div', '', textareaControl); + let scrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', scrollarea); + scrollareaContent.setAttribute('tabindex', '1'); + let getValueTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content', scrollareaContent); + getValueTextArea.id = 'getValueTextArea'; + getValueTextArea.setAttribute('rows', '20'); + + // 距离衰减 + let breaksDiv = external_L_default().DomUtil.create('div', '', isolineDiv); + let breaksSpan = external_L_default().DomUtil.create('span', '', breaksDiv); + breaksSpan.innerHTML = Lang.i18n('text_label_distanceAttenuation'); + let breaks = external_L_default().DomUtil.create('input', '', breaksDiv); + breaks.value = '3'; + + // 栅格大小 + let cellSizeDiv = external_L_default().DomUtil.create('div', '', isolineDiv); + let cellSizeSpan = external_L_default().DomUtil.create('span', '', cellSizeDiv); + cellSizeSpan.innerHTML = Lang.i18n('text_label_gridSize'); + let cellSize = external_L_default().DomUtil.create('input', '', cellSizeDiv); + cellSize.value = '30'; + + // BUFFER + // 缓冲半径 + let bufferDiv = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer hidden', div); + let bufferRadius = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--radius', bufferDiv); + let bufferRadiusSpan = external_L_default().DomUtil.create('span', '', bufferRadius); + bufferRadiusSpan.innerHTML = Lang.i18n('text_label_bufferRadius'); + let bufferRadiusDiv = external_L_default().DomUtil.create('div', '', bufferRadius); + let bufferRadiusInput = external_L_default().DomUtil.create('input', 'buffer-radius-input', bufferRadiusDiv); + bufferRadiusInput.id = 'bufferRadiusInput'; + bufferRadiusInput.value = '10'; + bufferRadiusInput.setAttribute('placeholder', Lang.i18n('text_label_defaultkilometers')); + let bufferUnit = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--unit', bufferRadiusDiv); + bufferUnit.id = 'bufferUnit'; + // 半径单位选择下拉框 + let bufferUnitOptions = { + 'optionsArr': [Lang.i18n('text_option_kilometer')], + 'labelName': Lang.i18n('text_label_unit') + }; + + let bufferUnitSelectTool = (new Select(bufferUnitOptions)).getElement(); + let bufferUnitSelectName = bufferUnitSelectTool.children[1].children[0]; + bufferUnitSelectName.id = 'bufferUnitSelectName'; + let bufferUnitSelect = bufferUnitSelectTool.children[1].children[2].children[0].children[0]; + bufferUnitSelect.id = 'bufferUnitSelect'; + bufferUnitSelectTool.children[0].style.display = 'none'; + bufferUnit.appendChild(bufferUnitSelectTool); + + // 保留原对象字段属性 + let saveFieldDiv = external_L_default().DomUtil.create('div', '', bufferRadius); + let saveAttrsContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--issaveattrs', saveFieldDiv); + saveAttrsContainer.id = 'saveAttrsContainer'; + let saveAttrsCheckbox = external_L_default().DomUtil.create('div', 'checkbox checkbox-fault', saveAttrsContainer); + saveAttrsCheckbox.id = 'saveAttrsCheckbox'; + let saveAttrsLabel = external_L_default().DomUtil.create('div', 'lable', saveAttrsContainer); + saveAttrsLabel.id = 'saveAttrsLabel'; + saveAttrsLabel.innerHTML = Lang.i18n('text_retainOriginal'); + + // 合并缓冲区 + let isUnionContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--isunion', saveFieldDiv); + isUnionContainer.id = 'isUnionContainer'; + let isUnionCheckbox = external_L_default().DomUtil.create('div', 'checkbox checkbox-fault', isUnionContainer); + isUnionCheckbox.id = 'isUnionCheckbox'; + let isUnionLabel = external_L_default().DomUtil.create('div', 'lable', isUnionContainer); + isUnionLabel.innerHTML = Lang.i18n('text_mergeBuffer'); + isUnionLabel.id = 'isUnionLabel'; + + // 结果图层 + let resultLayerDiv = external_L_default().DomUtil.create('div', 'component-analysis__container__resultLayersName', analysisTypeContainer); + let resultLayerSpan = external_L_default().DomUtil.create('span', '', resultLayerDiv); + resultLayerSpan.innerHTML = Lang.i18n('text_label_resultLayerName'); + let resultLayersName = external_L_default().DomUtil.create('input', '', resultLayerDiv); + resultLayersName.id = 'resultLayersName'; + + // 分析按钮 + let runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisTypeContainer); + let runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + let analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_analyze'); + let analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + let analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); + let svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.id = 'analyse_background'; + svgContainer.innerHTML = ` + + + + + `; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_analyzing'); + let analysisCancelBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--cancel', analysingContainer); + analysisCancelBtn.innerHTML = Lang.i18n('btn_cancelAnalysis'); + let deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheAnalysisLayer'); + + for (let i = 0; i < dropDownItems.children.length; i++) { + // 点击何种分析类型 判断使用图层数据 + dropDownItems.children[i].onclick = () => { + dropDownTopContainer.innerHTML = dropDownItems.children[i].outerHTML; + dropDownTopContainer.children[0].id = 'dropDownTop'; + let layersSelect = document.getElementById('layersSelect'); + let layerSelectName = document.getElementById('layerSelectName'); + let analysisMethod = dropDownItems.children[i].getAttribute('data-value'); + let currentFillData = {}; + switch (analysisMethod) { + case 'buffer': + isolineDiv.classList.add('hidden'); + bufferDiv.classList.remove('hidden'); + componentContentContainer.style.height = '422px'; + resultLayersName.value = Lang.i18n('text_label_buffer') + layerSelectName.title; + currentFillData = this.fillData['point']; + break; + case 'isolines': + isolineDiv.classList.remove('hidden'); + bufferDiv.classList.add('hidden'); + componentContentContainer.style.height = '712px'; + resultLayersName.value = Lang.i18n('text_label_isolines') + layerSelectName.title; + currentFillData = this.fillData['point']; + break; + } + // 清空 layersSelect; + // 清空 layersSelect; + if (this.currentFillData === currentFillData) { + return; + } + layersSelect.innerHTML = ''; + if (JSON.stringify(currentFillData) == '{}') { + resultLayersName.value = ''; + layerSelectName.title = ''; + layerSelectName.innerHTML = ''; + return; + } + + let layserArr = []; + for (let layerName in currentFillData) { + layserArr.push(layerName); + } + + layerSelectName.title = layserArr[0]; + layerSelectName.innerHTML = layserArr[0]; + this._createOptions(layersSelect, layserArr); + // 设置 layer select option 点击事件 + this.layerSelectObj.optionClickEvent(layersSelect, layerSelectName, this.layersSelectOnchange); + + if (analysisMethod === 'buffer') { + resultLayersName.value = Lang.i18n('text_label_buffer') + layserArr[0]; + } else if (analysisMethod === 'isolines') { + resultLayersName.value = Lang.i18n('text_label_isolines') + layserArr[0]; + } + + // 当前选中图层数据 + this.currentData = currentFillData[layerSelectName.title]; + this.currentFillData = currentFillData; + } + } + + // 字段下拉框 onchange 事件 + this.fieldsSelectOnchange = fieldsSelectOnchange.bind(this); + + function fieldsSelectOnchange(option) { + if (this.currentData) { + let displayData = this.currentData; + let fieldsSelectName = option.title; + getValueTextArea.value = displayData.fieldsValue[fieldsSelectName].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', displayData.fieldsValue[fieldsSelectName]); + } + } + + + // 选中图层实时改变事件 + this.layersSelectOnchange = layersSelectOnchange.bind(this); + + function layersSelectOnchange(option) { + if (this.currentData) { + let layerSelectName = option.title; + let displayData = this.currentFillData[layerSelectName]; + this.currentData = displayData; + fieldsSelect.innerHTML = ''; + this._createOptions(fieldsSelect, displayData.fields); + let fieldsSelectNameDiv = document.getElementById('fieldsSelectName'); + let field = displayData.fields[0]; + fieldsSelectNameDiv.title = field; + fieldsSelectNameDiv.innerHTML = field; + let fieldsSelectName = field; + this.fieldsSelectObj.optionClickEvent(fieldsSelect, fieldsSelectNameDiv, this.fieldsSelectOnchange); + getValueTextArea.value = displayData.fieldsValue[fieldsSelectName].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', displayData.fieldsValue[fieldsSelectName]); + let analysisMethod = document.getElementById('dropDownTop').getAttribute('data-value'); + switch (analysisMethod) { + case 'buffer': + resultLayersName.value = Lang.i18n('text_label_buffer') + layerSelectName; + break; + case 'isolines': + resultLayersName.value = Lang.i18n('text_label_isolines') + layerSelectName; + break; + } + } + } + + //复选框事件 + let isSaveStatus = true; + //合并缓冲区 + //合并缓冲区,默认不选中,即为false + let isUnion = false; + //选中select + saveAttrsLabel.classList.add("selected"); + saveAttrsCheckbox.classList.add("checkbox-active"); + saveAttrsContainer.onclick = () => { + if (isSaveStatus) { + //将当前状态和样式->不选中的样式和状态 + saveAttrsCheckbox.classList.add("checkbox-fault"); + saveAttrsCheckbox.classList.remove("checkbox-active"); + saveAttrsLabel.classList.remove("selected"); + isSaveStatus = false; + } else { + //将当前样式和状态改为选中 + saveAttrsCheckbox.classList.add("checkbox-active"); + saveAttrsCheckbox.classList.remove("checkbox-fault"); + saveAttrsLabel.classList.add("selected"); + isSaveStatus = true; + //如果当前状态为选中的状态,则将上一个复选框的样式和状态由选中-不选中 + if (isUnion) { + //移除dom样式和复选框的状态改变 + isUnionCheckbox.classList.add("checkbox-fault"); + isUnionCheckbox.classList.remove("checkbox-active"); + isUnion = false; + } + } + } + isUnionContainer.onclick = () => { + if (isUnion) { + //将选中状态 由选中->不选中,修改其样式和状态 + isUnionCheckbox.classList.add("checkbox-fault"); + isUnionCheckbox.classList.remove("checkbox-active"); + isUnionLabel.classList.remove("selected"); + isUnion = false; + + } else { + //将状态由不选中->选中,修改其样式和状态 + isUnionCheckbox.classList.add("checkbox-active"); + isUnionCheckbox.classList.remove("checkbox-fault"); + isUnionLabel.classList.add("selected"); + isUnion = true; + //如果当前状态为选中的,将上一个复选框改为不选中的状态 + if (isSaveStatus) { + //修改当前样式和状态 + saveAttrsCheckbox.classList.add("checkbox-fault"); + saveAttrsCheckbox.classList.remove("checkbox-active"); + isSaveStatus = false; + } + } + } + + // 提示框 + this.messageBox = new MessageBox(); + // 分析按钮点击事件 + analysisBtn.onclick = () => { + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + let dropDownTop = document.getElementById('dropDownTop'); + let analysisMethod = dropDownTop.getAttribute('data-value'); + let params; + switch (analysisMethod) { + case 'isolines': + params = getIsolinesAnalysisParams(); + break; + case 'buffer': + params = getBufferAnalysisParams(); + break; + } + this.viewModel.analysis(params, this.map); + this.viewModel.on('layerloaded', (e)=> { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event ClientComputationView#analysissucceeded + * @description 分析完成之后触发。 + * @property {L.GeoJSON} layer - 加载完成后的结果图层。 + * @property {string} name - 加载完成后的结果图层名称。 + */ + this._event.fire('analysissucceeded', { "layer": e.layer, "name": e.name }) + }); + // 若分析的结果为空 + this.viewModel.on('analysisfailed', ()=> { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + this.messageBox.showView(Lang.i18n('msg_resultIsEmpty'), "failure"); + /** + * @event ClientComputationView#analysisfailed + * @description 分析失败之后触发。 + */ + this._event.fire('analysisfailed') + }) + } + // 取消按钮点击事件 + analysisCancelBtn.onclick = () => { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + this.viewModel.cancelAnalysis() + } + // 删除按钮点击事件 + deleteLayersBtn.onclick = () => { + /** + * @event ClientComputationView#layersremoved + * @description 结果图层删除后触发。 + * @property {Array.} layers - 被删除的结果图层。 + */ + this.viewModel.on('layersremoved', (e) => { + this._event.fire('layersremoved', { 'layers': e.layers }); + }) + this.viewModel.clearLayers(); + } + + // 获取分析数据 + function getIsolinesAnalysisParams() { + let dropDownTop = document.getElementById('dropDownTop'); + let analysisMethod = dropDownTop.getAttribute('data-value'); + let resultLayersName = document.getElementById('resultLayersName').value; + let analysisLayers = layerSelectName.title; + let analysisFields = fieldsSelectName.title; + let analysisFieldsValue = getValueTextArea.value.replace(/[\r\n]/g, "").split(',').toString(); + let analysisBreaks = breaks.value; + let analysisCellSize = cellSize.value; + let param = { + 'analysisMethod': analysisMethod, + 'analysisLayers': analysisLayers, + 'analysisFields': analysisFields, + 'analysisFieldsValue': analysisFieldsValue, + 'analysisBreaks': analysisBreaks, + 'analysisCellSize': analysisCellSize, + 'resultLayersName': resultLayersName + } + return param; + } + + function getBufferAnalysisParams() { + let dropDownTop = document.getElementById('dropDownTop'); + let resultLayersName = document.getElementById('resultLayersName').value; + let analysisLayers = layerSelectName.title; + let analysisMethod = dropDownTop.getAttribute('data-value'); + let radius = bufferRadiusInput.value; + let unit = bufferUnitSelectName.title; + + let param = { + 'analysisMethod': analysisMethod, + 'analysisLayers': analysisLayers, + 'radius': radius, + 'unit': unit, + 'resultLayersName': resultLayersName, + 'isSaveStatus': isSaveStatus, + 'isUnion': isUnion + + }; + return param; + } + + // 阻止 map 默认事件 + this._preventMapEvent(container, this.map); + return container; + }, + + /** + * @function ClientComputationView.prototype._createOptions + * @description 创建 select 下拉框的 options。 + * @private + */ + _createOptions(container, optionsArr) { + for (let i in optionsArr) { + let option = document.createElement('div'); + let optData = optionsArr[i]; + option.className = 'component-selecttool__option'; + option.title = optData; + option.innerHTML = optData; + option.setAttribute('data-value', optData); + container.appendChild(option); + } + } + +}); + +var clientComputationView = function (options) { + return new ClientComputationView(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ClientComputationLayer + * @aliasclass Components.ClientComputationLayer + * @deprecatedclassinstance L.supermap.components.clientComputationLayer + * @classdesc 客户端计算图层对象。 + * @version 9.1.1 + * @param {Object} layerObject - 图层对象。 + * @param {string} layerObject.layerName - 图层名称。 + * @param {L.GeoJSON} layerObject.layer - 图层。 + * @param {Array.} [layerObject.fields] - 字段数组。 + * @category Components ClientComputation + * @usage + */ +class ClientComputationLayer{ + constructor(layerObject){ + this.layerName = layerObject.layerName; + this.layer = layerObject.layer; + this.fields = layerObject.fields || null; + } +} +var clientComputationLayer = function(layerObject){ + return new ClientComputationLayer(layerObject) +} + +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DistributedAnalysisModel + * @aliasclass Components.DistributedAnalysisModel + * @deprecatedclassinstance L.supermap.components.DistributedAnalysisModel + * @classdesc 分布式分析组件数据模型。 + * @private + * @category Components DistributedAnalysis + * @param {string} processingUrl - 分布式分析地址。 + * @fires DistributedAnalysisModel#datasetsloaded + * @fires DistributedAnalysisModel#datasetinfoloaded + * @extends {L.Evented} + */ +class DistributedAnalysisModel extends (external_L_default()).Evented { + + initialize(processingUrl) { + this.processingUrl = processingUrl + } + /** + * @function DistributedAnalysisModel.prototype.getDatasetsName + * @description 获取所有可进行分布式分析的数据集名称。 + * @param {string} url - 服务地址。 + */ + getDatasetsName() { + let url = this.processingUrl; + this.dataset = []; + this.dataset['datasetNames'] = []; + this.dataset['childUrl'] = []; + + let host = 'http://' + url.split('/')[2]; + let sharefileUrl = host + '/iserver/services/datacatalog/rest/datacatalog/sharefile.json'; + let datasetsUrl = host + '/iserver/services/datacatalog/rest/datacatalog/relationship/datasets.json'; + let me = this; + FetchRequest.get(sharefileUrl).then(function (response) { + return response.json(); + }).then(function (result) { + me.dataset['datasetNames'] = me.dataset['datasetNames'].concat(result.datasetNames); + me.dataset['childUrl'] = me.dataset['childUrl'].concat(result.childUriList); + let _me = me; + FetchRequest.get(datasetsUrl).then(function (response) { + return response.json(); + }).then(function (result) { + _me.dataset['datasetNames'] = _me.dataset['datasetNames'].concat(result.datasetNames); + _me.dataset['childUrl'] = _me.dataset['childUrl'].concat(result.childUriList); + + let datasetHash = []; + for (let i in _me.dataset['datasetNames']) { + datasetHash[_me.dataset.datasetNames[i]] = _me.dataset.childUrl[i] + } + /** + * @event DistributedAnalysisModel#datasetsloaded + * @description 数据集获取完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {Array.} result.dataset - 数据集名称数组。 + * @property {Object} result.datasetHash - 数据集名称数组与数据集 URL 一一对应的对象。 + */ + _me.fire('datasetsloaded', { 'result': { 'dataset': _me.dataset, 'datasetHash': datasetHash } }); + + }); + }); + } + /** + * @function DistributedAnalysisModel.prototype.getDatasetInfo + * @description 获取数据集类型和字段。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + getDatasetInfo(datasetUrl) { + let type; + let me = this; + FetchRequest.get(datasetUrl).then(function (response) { + return response.json(); + }).then(function (data) { + let datasetInfo = data.datasetInfo + if (datasetInfo.datasetType === 'LINE' || datasetInfo.type === 'LINE') { + type = 'LINE'; + } else if (datasetInfo.datasetType === 'POINT' || datasetInfo.type === 'POINT' || datasetInfo.type === 'CSV') { + type = 'POINT'; + } else if (datasetInfo.datasetType === 'REGION' || datasetInfo.type === 'REGION') { + type = 'REGION'; + } + let fields = []; + let fieldInfos = datasetInfo.fieldInfos || datasetInfo.fieldInfo || null; + if (fieldInfos) { + for (let i in fieldInfos) { + fields.push(fieldInfos[i].name) + } + /** + * @event DistributedAnalysisModel#datasetinfoloaded + * @description 数据集查询完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {string} result.type - 数据集类型。 + * @property {Array.} result.fields - 数据集字段。 + */ + me.fire('datasetinfoloaded', { 'result': { 'type': type, 'fields': fields } }) + } else { + let fieldsUrl = data.childUriList[0].replace('//fields', '/fields'); + FetchRequest.get(fieldsUrl).then(function (response) { + return response.json(); + }).then(function (data) { + let fieldNames = data.fieldNames; + let fields = []; + for (let i in fieldNames) { + fields.push(fieldNames[i]) + } + me.fire('datasetinfoloaded', { 'result': { 'type': type, 'fields': fields } }) + }) + } + }) + } +} +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class DistributedAnalysisViewModel + * @aliasclass Components.DistributedAnalysisViewModel + * @deprecatedclassinstance L.supermap.components.distributedAnalysisViewModel + * @classdesc 分布式分析组件功能类。 + * @version 9.1.1 + * @category Components DistributedAnalysis + * @param {string} processingUrl - 分布式分析地址。 + * @fires DistributedAnalysisViewModel#datasetsloaded + * @fires DistributedAnalysisViewModel#datasetinfoloaded + * @fires DistributedAnalysisViewModel#analysisfailed + * @fires DistributedAnalysisViewModel#analysissucceeded + * @fires DistributedAnalysisViewModel#layerloaded + * @fires DistributedAnalysisViewModel#layersremoved + * @extends {L.Evented} + * @usage + */ +class DistributedAnalysisViewModel extends (external_L_default()).Evented { + initialize(processingUrl) { + this.processingUrl = processingUrl + } + /** + * @function DistributedAnalysisViewModel.prototype.getDatasetsName + * @description 获取所有数据集名称。 + * @param {string} url - 服务地址。 + */ + getDatasetsName() { + let processingUrl = this.processingUrl; + this.resultLayers = []; + this.datasetNames = []; + this.distributedAnalysisModel = new DistributedAnalysisModel(processingUrl); + this.distributedAnalysisModel.getDatasetsName(); + let me = this; + this.distributedAnalysisModel.on('datasetsloaded', function (e) { + /** + * @event DistributedAnalysisViewModel#datasetsloaded + * @description 数据集获取完成之后触发。 + * @property {Object} result - 数据集数据。 + */ + me.fire('datasetsloaded', { 'result': e.result }); + }) + } + + /** + * @function DistributedAnalysisViewModel.prototype.getDatasetInfo + * @description 获取数据集类型和字段。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + getDatasetInfo(datasetUrl) { + // 判断数据集类型 + this.distributedAnalysisModel.getDatasetInfo(datasetUrl); + let me = this; + this.distributedAnalysisModel.on('datasetinfoloaded', function (e) { + let type = e.result.type; + let fields = e.result.fields; + /** + * @event DistributedAnalysisViewModel#datasetinfoloaded + * @description 数据集类型与字段获取完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {string} result.type - 数据集类型。 + * @property {Array.} result.fields - 数据集所含有的字段。 + */ + me.fire('datasetinfoloaded', { 'result': { 'type': type, 'fields': fields } }) + }) + } + + /** + * @function DistributedAnalysisViewModel.prototype.analysis + * @description 分布式分析。 + * @param {Object.} params - 参数。 + * @param {KernelDensityJobParameter} params.analysisParam - 密度分析任务参数类。 + * @param {string} [params.resultLayerName] - 结果图层名称。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + analysis(params, map) { + let processingService = new ProcessingService(this.processingUrl); + if (params.analysisParam instanceof KernelDensityJobParameter) { + let kernelDensityJobParameter = params.analysisParam + let me = this; + processingService.addKernelDensityJob(kernelDensityJobParameter, function (serviceResult) { + if (serviceResult.error) { + /** + * @event DistributedAnalysisViewModel#analysisfailed + * @description 分析失败后触发。 + */ + me.fire('analysisfailed', { 'error': serviceResult.error }); + return; + } + serviceResult.result.setting.serviceInfo.targetServiceInfos.map(function (info) { + if (info.serviceType === 'RESTMAP') { + FetchRequest.get(info.serviceAddress + '/maps').then(function (response) { + return response.json(); + }).then(function (result) { + let mapUrl = result[0].path; + /** + * @event DistributedAnalysisViewModel#analysissucceeded + * @description 分析成功后服务器返回的数据。 + */ + me.fire('analysissucceed', { 'result': result }); + let layer = tiledMapLayer(mapUrl, { noWrap: true, transparent: true }); + me.resultLayers.push(layer); + layer.addTo(map); + /** + * @event DistributedAnalysisViewModel#layerloaded + * @description 分析结果图层加载完成后触发。 + * @property {L.GeoJSON} layer - 结果图层。 + * @property {string} name - 结果图层名称。 + */ + let date = new Date(); + let resultLayerName = params.resultLayerName || date.getTime(); + me.fire('layerloaded', { 'layer': layer, 'name': resultLayerName }) + }); + } + return info; + }); + }) + } + + } + /** + * @function DistributedAnalysisViewModel.prototype.clearLayers + * @description 清空分析图层。 + */ + clearLayers() { + for (let i in this.resultLayers) { + this.resultLayers[i].remove(); + } + /** + * @event DistributedAnalysisViewModel#layersremoved + * @description 图层删除后触发。 + * @property {Array.} layers - 结果图层数组。 + */ + this.fire('layersremoved', { 'layers': this.resultLayers }); + this.resultLayers = []; + } + +} +var distributedAnalysisViewModel = function (options) { + return new DistributedAnalysisViewModel(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class DistributedAnalysisView + * @aliasclass Components.DistributedAnalysisView + * @deprecatedclassinstance L.supermap.components.distributedAnalysis + * @classdesc 分布式分析组件。 + * @version 9.1.1 + * @param {string} processingUrl - 分布式分析服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DistributedAnalysisView#analysissucceeded + * @fires DistributedAnalysisView#analysisfailed + * @fires DistributedAnalysisView#layersremoved + * @extends {ComponentsViewBase} + * @category Components DistributedAnalysis + * @usage + */ +var DistributedAnalysisView = ComponentsViewBase.extend({ + + initialize: function (processingUrl, options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + //初始化 ViewModel: + this.viewModel = new DistributedAnalysisViewModel(processingUrl); + }, + /** + * @function DistributedAnalysisView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function (map) { + this._fillDataToView(); + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DistributedAnalysisView.prototype._fillDataToView + * @description 添加数据。 + * @private + */ + _fillDataToView: function () { + + // 获取数据集 + this.viewModel.on('datasetsloaded', (e) => { + let datasetOptionsArr = e.result.dataset.datasetNames; + this.datasetSelect.innerHTML = ''; + this._createOptions(this.datasetSelect, datasetOptionsArr); + this.datasetSelectObj.optionClickEvent(this.datasetSelect, this.datasetSelectName, this.datasetSelectOnchange); + this.dataHash = e.result.datasetHash; + }); + this.viewModel.getDatasetsName(); + }, + + /** + * @function DistributedAnalysisView.prototype._initView + * @description 创建分布式分析组件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView: function () { + // 组件 container + let container = (new CommonContainer({title: Lang.i18n('title_distributedAnalysis')})).getElement(); + container.classList.add('component-analysis'); + container.children[0].style.fontSize = '12px'; + + // 组件内容 container + let componentContentContainer = external_L_default().DomUtil.create('div', 'component-content component-content--scroll component-content--analysis', container); + + // 分析方式下拉框 + let analysisOptionsArr = [{ + 'title': Lang.i18n('text_densityAnalysis'), + 'dataValue': 'density', + 'remark': Lang.i18n('text_CalculateTheValuePerUnitArea'), + 'icon': { + 'className': 'component-analyst-density-img' + } + }]; + let dropDownBox = (new DropDownBox(analysisOptionsArr)).getElement(); + componentContentContainer.appendChild(dropDownBox); + // 选中的 dropDownItem + let dropDownTop = dropDownBox.children[0].children[0].children[0]; + + // 各分析参数 container + let analysisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); + let analysisType = external_L_default().DomUtil.create('div', 'analysistype', analysisTypeContainer); + let analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisType); + + // 数据集下拉框 + let datasetSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', analysisLayer); + let datasetOptions = { + 'optionsArr': [Lang.i18n('text_option_selectDataset')], + 'labelName': Lang.i18n('text_label_dataset'), + "optionsClickCb": datasetSelectOnchange.bind(this) + }; + let datasetSelectObj = new Select(datasetOptions); + let datasetSelectTool = datasetSelectObj.getElement(); + this.datasetSelectObj = datasetSelectObj; + datasetSelectControl.appendChild(datasetSelectTool); + // 选中的 dataset + let datasetSelectName = datasetSelectTool.children[1].children[0]; + this.datasetSelectName = datasetSelectName; + // dataset select container + let datasetSelect = datasetSelectTool.children[1].children[2].children[0].children[0]; + datasetSelect.children[0].style.display = 'none'; + this.datasetSelect = datasetSelect; + + // 分析方法下拉框 & 网格面类型下拉框 + let analyseIDW = external_L_default().DomUtil.create('div', 'component-analysis__idw', analysisLayer); + let analysisOptions = [{ + 'optionsArr': [Lang.i18n('text_option_simplePointDensityAnalysis'), Lang.i18n('text_option_nuclearDensityAnalysis')], + 'labelName': Lang.i18n('text_label_analyticalMethod') + // 'optionsClickCb': analysisMethodSelectOnchange.bind(this) + }, { + 'optionsArr': [Lang.i18n('text_option_quadrilateral'), Lang.i18n('text_option_hexagon')], + 'labelName': Lang.i18n('text_label_meshType') + }]; + // 分析参数 select control + let analysisSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__idw__selecttool', analyseIDW); + for (let i in analysisOptions) { + let selectTool = (new Select(analysisOptions[i])).getElement(); + analysisSelectControl.appendChild(selectTool); + } + + // 权重选择下拉框 + let weightFieldsSelectOptions = { + 'optionsArr': [Lang.i18n('text_option_notSet')], + 'labelName': Lang.i18n('text_label_weightField') + }; + let weightFieldsSelectObj = new Select(weightFieldsSelectOptions); + let weightFieldsSelectTool = weightFieldsSelectObj.getElement(); + analysisSelectControl.appendChild(weightFieldsSelectTool); + this.weightFieldsSelectObj = weightFieldsSelectObj; + + // 分析方法选中值 & option attr设置 + let analysisMethodSelectName = analysisSelectControl.children[0].children[1].children[0]; + analysisMethodSelectName.setAttribute('data-value', '0'); + let analysisMethodSelect = analysisSelectControl.children[0].children[1].children[2].children[0].children[0]; + let analysisMethodDV = ['0', '1']; + this._setEleAtribute(analysisMethodDV, 'data-value', analysisMethodSelect.children); + + // 网格面类型选中值 & option attr设置 + let gridTypeSelectName = analysisSelectControl.children[1].children[1].children[0]; + gridTypeSelectName.setAttribute('data-value', '0'); + let gridTypeSelect = analysisSelectControl.children[1].children[1].children[2].children[0].children[0]; + let gridTypeDV = ['0', '1']; + this._setEleAtribute(gridTypeDV, 'data-value', gridTypeSelect.children); + + // 权重值选中值 + let weightFieldsSelectName = analysisSelectControl.children[2].children[1].children[0]; + let weightFieldsSelect = analysisSelectControl.children[2].children[1].children[2].children[0].children[0]; + + // 分析范围 & 网格大小 & 搜索半径 & 面积单位 + // 分析范围 + let inputOptions = [{ + 'spanName': Lang.i18n('text_label_queryRange'), + 'value': '' + }]; + for (let i in inputOptions) { + this._creatInputBox(inputOptions[i], analysisSelectControl) + } + let queryRangeInput = analysisSelectControl.children[3].children[1]; + queryRangeInput.setAttribute('placeholder', Lang.i18n('text_label_queryRangeTips')); + queryRangeInput.title = Lang.i18n('text_label_queryRangeTips'); + + // 网格大小 + let gridSizeUnitSelectOptions = { + 'optionsArr': ['Meter', 'Kilometer', 'Yard', 'Foot', 'Mile'] + }; + let gridSizeOptions = { + 'labelName': Lang.i18n('text_label_gridSizeInMeters'), + 'selectOptions': gridSizeUnitSelectOptions + }; + let gridSizeContainer = this._creatUnitSelectBox(gridSizeOptions, analysisSelectControl); + let gridSizeInput = gridSizeContainer.children[1].children[0]; + gridSizeInput.value = '1000'; + let gridSizeUnitSelectName = gridSizeContainer.children[1].children[1].children[0].children[0].children[0]; + + // 搜索半径 + let searchRadiusUnitSelectOptions = { + 'optionsArr': ['Meter', 'Kilometer', 'Yard', 'Foot', 'Mile'] + }; + let searchRadiusOptions = { + 'labelName': Lang.i18n('text_label_searchRadius'), + 'selectOptions': searchRadiusUnitSelectOptions + }; + let searchRadiusContainer = this._creatUnitSelectBox(searchRadiusOptions, analysisSelectControl); + let searchRadiusInput = searchRadiusContainer.children[1].children[0]; + searchRadiusInput.value = '300'; + let searchRadiusSelectName = searchRadiusContainer.children[1].children[1].children[0].children[0].children[0]; + // 面积单位 + let areaUnitSelectOptions = { + 'labelName': Lang.i18n('text_label_areaUnit'), + 'optionsArr': ['SquareMile', 'SquareMeter', 'Hectare', 'Acre', 'SquareFoot', 'SquareYard'] + }; + let areaUnitSelectTool = (new Select(areaUnitSelectOptions)).getElement(); + analysisSelectControl.appendChild(areaUnitSelectTool); + let areaUnitSelectName = areaUnitSelectTool.children[1].children[0]; + // 专题图分段 + let rangeContent = external_L_default().DomUtil.create('div', 'range-content', analysisType); + let rangeContentOptions = { + 'optionsArr': [Lang.i18n('text_option_notSet'), Lang.i18n('text_option_equidistantSegmentation'), Lang.i18n('text_option_logarithm'), Lang.i18n('text_option_equalCountingSegment'), Lang.i18n('text_option_squareRootSegmentation')], + 'labelName': Lang.i18n('text_label_thematicMapSegmentationMode'), + "optionsClickCb": themeModelSelectOnchange + }; + rangeContent.appendChild((new Select(rangeContentOptions)).getElement()); + + let themeModelSelectName = rangeContent.children[0].children[1].children[0]; + themeModelSelectName.setAttribute('data-value', 'NOTSET'); + let themeModelSelect = rangeContent.children[0].children[1].children[2].children[0].children[0]; + let themeModelDataValue = ['NOTSET', 'EQUALINTERVAL', 'LOGARITHM', 'QUANTILE', 'SQUAREROOT']; + this._setEleAtribute(themeModelDataValue, 'data-value', themeModelSelect.children); + + let rangeContentParamInput = this._creatInputBox({ + 'spanName': Lang.i18n('text_label_thematicMapSegmentationParameters'), + 'value': '20' + }, rangeContent); + rangeContentParamInput.classList.add('hidden'); + let rangeContentModelSelectTool = (new Select({ + 'optionsArr': [ + Lang.i18n('text_option_greenOrangePurpleGradient'), + Lang.i18n('text_option_greenOrangeRedGradient'), + Lang.i18n('text_option_rainbowGradient'), + Lang.i18n('text_option_spectralGradient'), + Lang.i18n('text_option_terrainGradient')], + 'labelName': Lang.i18n('text_label_thematicMapColorGradientMode') + })).getElement(); + rangeContent.appendChild(rangeContentModelSelectTool); + rangeContentModelSelectTool.classList.add('hidden'); + let rangeContentModelSelect = rangeContentModelSelectTool.children[1].children[2].children[0].children[0]; + let rangeContentModelSelectName = rangeContentModelSelectTool.children[1].children[0]; + rangeContentModelSelectName.setAttribute('data-value', 'GREENORANGEVIOLET'); + let rangeContentModelDV = ['GREENORANGEVIOLET', 'GREENORANGERED', 'RAINBOW', 'SPECTRUM', 'TERRAIN']; + this._setEleAtribute(rangeContentModelDV, 'data-value', rangeContentModelSelect.children); + + // 专题图分段模式下拉框 onchange 事件 + function themeModelSelectOnchange(option) { + if (option.getAttribute('data-value') !== 'NOTSET') { + rangeContentParamInput.classList.remove('hidden'); + rangeContentModelSelectTool.classList.remove('hidden'); + } else { + rangeContentParamInput.classList.add('hidden'); + rangeContentModelSelectTool.classList.add('hidden'); + } + } + + // 结果图层 + let resultLayerContainer = external_L_default().DomUtil.create('div', '', analysisType); + let resultLayerSpan = external_L_default().DomUtil.create('span', '', resultLayerContainer); + resultLayerSpan.innerHTML = Lang.i18n('text_label_resultLayerName'); + let resultLayerInput = external_L_default().DomUtil.create('input', 'component-distributeanalysis__input', resultLayerContainer); + + // 分析 & 分析中 & 取消 按钮 + let runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisTypeContainer); + let runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + let analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_analyze'); + let analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + let analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); + analysisingBtn.style.width = '200px'; + let svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.innerHTML = ` + + + + + `; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_analyzing'); + + // 删除按钮 + let deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.id = 'deleteLayersBtn'; + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheAnalysisLayer'); + + // 交互 + // 弹框 + this.messageBox = new MessageBox(); + + // 数据集下拉框 onchange 事件 + this.datasetSelectOnchange = datasetSelectOnchange.bind(this); + + function datasetSelectOnchange(option) { + this.messageBox.closeView(); + if (this.dataHash) { + weightFieldsSelect.innerHTML = ''; + // 获取当前选中数据集类型 + let datasetUrl = this.dataHash[option.title]; + // 判断当前选中数据集是否支持该选中分析类,并填充分析权重字段 + let _me = this; + this.viewModel.on('datasetinfoloaded', function (e) { + weightFieldsSelectName.title = Lang.i18n('text_option_notSet'); + weightFieldsSelectName.innerHTML = Lang.i18n('text_option_notSet'); + weightFieldsSelect.innerHTML = ''; + let analyseType = dropDownTop.getAttribute('data-value'); + let type = e.result.type; + let fields = e.result.fields; + if (analyseType === 'density') { + if (type === 'REGION' || type === 'LINE') { + _me.messageBox.showView(Lang.i18n('msg_datasetOrMethodUnsupport'), "failure"); + } else { + _me.messageBox.closeView(); + _me._createOptions(weightFieldsSelect, fields); + _me.weightFieldsSelectObj.optionClickEvent(weightFieldsSelect, weightFieldsSelectName); + } + } + }); + this.viewModel.getDatasetInfo(datasetUrl); + } + } + + // 分析按钮点击事件 + analysisBtn.onclick = () => { + this.messageBox.closeView(); + let params = getAnalysisParam(); + if (datasetSelectName.title === Lang.i18n('text_option_selectDataset')) { + this.messageBox.showView(Lang.i18n('msg_selectDataset'), "failure"); + } else if ( weightFieldsSelectName.title === Lang.i18n('text_option_notSet')) { + this.messageBox.showView(Lang.i18n('msg_setTheWeightField'), "failure"); + } else { + this.messageBox.closeView(); + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + + this.viewModel.on('layerloaded', (e) => { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event DistributedAnalysisView#analysissucceeded + * @description 分析完成后触发。 + * @property {L.GeoJSON} layer - 结果图层。 + * @property {string} name - 结果图层名称。 + */ + this._event.fire('analysissucceeded', {'layer': e.layer, 'name': e.name}) + }); + + this.viewModel.on('analysisfailed', (e) => { + this.messageBox.showView(Lang.i18n('msg_theFieldNotSupportAnalysis'), "failure"); + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event DistributedAnalysisView#analysisfailed + * @description 分析失败后触发。 + * @property {string} error - 服务器返回的错误。 + */ + this._event.fire('analysisfailed', {'error': e.error}) + }); + + this.viewModel.analysis(params, this.map); + } + }; + + // 删除按钮点击事件 + deleteLayersBtn.onclick = () => { + /** + * @event DistributedAnalysisView#layersremoved + * @description 结果图层删除后触发。 + * @property {Array.} layers - 被删除的结果图层。 + */ + this.viewModel.on('layersremoved', (e) => { + this._event.fire('layersremoved', { 'layers': e.layers }); + }); + this.viewModel.clearLayers(); + }; + + // 获取分析参数 + function getAnalysisParam() { + let analysisType = dropDownTop.getAttribute('data-value'); + let analysisMethod = analysisMethodSelectName.getAttribute('data-value'); + let gridType = gridTypeSelectName.getAttribute('data-value'); + let queryRange = queryRangeInput.value; + let gridSizeUnit = gridSizeUnitSelectName.title; + let searchRadiusUnit = searchRadiusSelectName.title; + let areaUnit = areaUnitSelectName.title; + let colorGradientType = rangeContentModelSelectName.getAttribute('data-value'); + let themeModel = themeModelSelectName.getAttribute('data-value'); + let date = new Date(); + let resultLayerName = resultLayerInput.value || date.getTime(); + let mappingParameter; + if (themeModel === 'NOTSET') { + mappingParameter = ''; + } else { + mappingParameter = { + 'rangeMode': themeModel, + 'rangeCount': rangeContentParamInput.value, + 'colorGradientType': colorGradientType + } + } + let analysisParam; + if (analysisType === 'density') { + analysisParam = new KernelDensityJobParameter({ + 'datasetName': datasetSelectName.title, + 'method': analysisMethod, + 'meshType': gridType, + 'resolution': gridSizeInput.value, + 'fields': weightFieldsSelectName.title, + 'radius': searchRadiusInput.value, + 'meshSizeUnit': gridSizeUnit, + 'radiusUnit': searchRadiusUnit, + 'areaUnit': areaUnit, + 'query': queryRange, + 'mappingParameters': new MappingParameters({ + 'rangeMode': mappingParameter.rangeMode, + 'rangeCount': mappingParameter.rangeCount, + 'colorGradientType': mappingParameter.colorGradientType + }) + }) + } + + let params = { + 'analysisParam': analysisParam, + 'resultLayerName': resultLayerName + }; + return params; + } + + //阻止 map 默认事件 + this._preventMapEvent(container, this.map); + return container; + }, + + /** + * @function DistributedAnalysisView.prototype._createOptions + * @description 创建下拉框。 + * @private + */ + _createOptions(container, optionsArr) { + for (let i in optionsArr) { + let option = document.createElement('div'); + option.className = 'component-selecttool__option'; + option.title = optionsArr[i]; + option.innerHTML = optionsArr[i]; + option.setAttribute('data-value', optionsArr[i]); + container.appendChild(option); + } + }, + + /** + * @function DistributedAnalysisView.prototype._creatInputBox + * @description 创建输入框。 + * @private + */ + _creatInputBox(inputOptions, parentEle) { + let div = external_L_default().DomUtil.create('div', '', parentEle); + let span = external_L_default().DomUtil.create('span', '', div); + span.innerHTML = inputOptions.spanName; + let input = external_L_default().DomUtil.create('input', '', div); + input.value = inputOptions.value; + input.className = 'component-distributeanalysis__input'; + return div; + }, + + /** + * @function DistributedAnalysisView.prototype._creatUnitSelectBox + * @description 创建选择框。 + * @private + */ + _creatUnitSelectBox(options, parentEle) { + let unitSelectBoxContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--radius', parentEle); + let unitSelectSpan = external_L_default().DomUtil.create('span', '', unitSelectBoxContainer); + unitSelectSpan.innerHTML = options.labelName; + let unitSelectInputContainer = external_L_default().DomUtil.create('div', '', unitSelectBoxContainer); + external_L_default().DomUtil.create('input', 'buffer-radius-input', unitSelectInputContainer); + + let unitSelectUnitContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--unit', unitSelectInputContainer); + let unitSelectOptions = options.selectOptions; + let unitSelectTool = (new Select(unitSelectOptions)).getElement(); + unitSelectUnitContainer.appendChild(unitSelectTool); + + return unitSelectBoxContainer; + }, + + /** + * @function DistributedAnalysisView.prototype._setEleAtribute + * @description 设置元素的属性名和属性值。 + * @private + */ + _setEleAtribute(daraValueArr, attributeName, eleArr) { + for (let i = 0; i < eleArr.length; i++) { + eleArr[i].setAttribute(attributeName, daraValueArr[i]) + } + } + +}); +var distributedAnalysisView = function (options) { + return new DistributedAnalysisView(options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/dataservicequery/DataServiceQueryViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class DataServiceQueryViewModel + * @aliasclass Components.DataServiceQueryViewModel + * @deprecatedclassinstance L.supermap.components.dataServiceQueryViewModel + * @classdesc 数据服务查询组件功能类。 + * @version 9.1.1 + * @category Components DataServiceQuery + * @param {string} dataserviceUrl - 数据服务地址。 + * @fires DataServiceQueryViewModel#getfeaturessucceeded + * @fires DataServiceQueryViewModel#getfeaturesfailed + * @extends {L.Evented} + * @usage + */ +class DataServiceQueryViewModel extends (external_L_default()).Evented { + + initialize(dataserviceUrl) { + this.dataserviceUrl = dataserviceUrl; + this.resultLayers = []; + } + + /** + * @function DataServiceQueryViewModel.prototype.getFeatures + * @description 获取 features。 + * @param {(GetFeaturesByIDsParameters|GetFeaturesByBufferParameters|GetFeaturesByBoundsParameters|GetFeaturesBySQLParameters|GetFeaturesByGeometryParameters)} queryParam - 查询参数。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + getFeatures(queryParam, map) { + let dataserviceUrl = this.dataserviceUrl; + let me = this; + let featureService = FeatureService_featureService(dataserviceUrl); + if (queryParam instanceof GetFeaturesByIDsParameters) { + featureService.getFeaturesByIDs(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesBySQLParameters) { + featureService.getFeaturesBySQL(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByBoundsParameters) { + featureService.getFeaturesByBounds(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByBufferParameters) { + featureService.getFeaturesByBuffer(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByGeometryParameters) { + featureService.getFeaturesByGeometry(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } + } + + /** + * @function DataServiceQueryViewModel.prototype._getQureyResult + * @description 获取查询结果。 + * @private + * @param {Object} serviceResult - 返回查询结果。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + _getQureyResult(serviceResult, map) { + if (serviceResult.error) { + /** + * @event DataServiceQueryViewModel#getfeaturesfailed + * @description features 获取失败时触发。 + * @property {string} error - 服务器返回的错误。 + */ + this.fire('getfeaturesfailed', { 'error': serviceResult.error }); + return; + } + let resultLayer = external_L_default().geoJSON(serviceResult.result.features, { + onEachFeature: function (feature, layer) { + layer.bindPopup("ID: " + feature.properties.SMID); + }, + pointToLayer: function (geoJsonPoint, latLng) { + return external_L_default().circleMarker(latLng, { radius: 6}) + } + }).addTo(map); + this.resultLayers.push(resultLayer); + /** + * @event DataServiceQueryViewModel#getfeaturessucceeded + * @description features 获取成功时触发。 + * @property {Object} result - 服务器返回的结果。 + */ + this.fire('getfeaturessucceeded', { 'result': serviceResult.result.features }) + } + + /** + * @function DataServiceQueryViewModel.prototype.clearLayers + * @description 清除所有结果图层。 + */ + clearLayers() { + for (let i in this.resultLayers) { + this.resultLayers[i].remove(); + } + this.resultLayers = []; + } +} +var dataServiceQueryViewModel = function (dataserviceUrl) { + return new dataServiceQueryViewModel(dataserviceUrl); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/dataservicequery/DataServiceQueryView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +/** + * @class DataServiceQueryView + * @aliasclass Components.DataServiceQueryView + * @deprecatedclassinstance L.supermap.components.dataServiceQuery + * @classdesc 数据服务查询组件。 + * @version 9.1.1 + * @param {string} dataServiceUrl - 数据服务地址。 + * @param {(Array.|string)} dataSetNames - 配置查询方式和查询的数据集数组。格式:" 数据源名:数据集名 ",例:"World: Countries"。 + * @param {Object} options - 参数。 + * @param {(Array.|GetFeatureMode)} [options.getFeatureMode] - 查询方式。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DataServiceQueryView#getfeaturessucceeded + * @fires DataServiceQueryView#getfeaturesfailed + * @category Components DataServiceQuery + * @extends {ComponentsViewBase} + * @usage + */ +var DataServiceQueryView = ComponentsViewBase.extend({ + + initialize: function (dataServiceUrl, dataSetNames, options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + + this.dataServiceUrl = dataServiceUrl; + if (!dataSetNames || dataSetNames.length === 0) { + throw new Error('Please configure the dataset of the query!') + } + if (dataSetNames instanceof Array) { + this.dataSetNames = dataSetNames; + } else { + this.dataSetNames = dataSetNames.split(" "); + } + }, + + /** + * @function DataServiceQueryView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function (map) { + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DataServiceQueryView.prototype.onRemove + * @description 移除控件。 + * @private + */ + onRemove: function () { + this.map.off('pm:create'); + }, + + /** + * @function DataServiceQueryView.prototype.setDataSetNames + * @description 设置查询的数据集名称。 + * @param {(Array.|string)} dataSetNames - 配置查询方式和查询的数据集数组。格式:" 数据源名:数据集名 ",例:"World: Countries"; + */ + setDataSetNames(dataSetNames) { + if (dataSetNames instanceof Array) { + this.dataSetNames = dataSetNames; + } else { + this.dataSetNames = dataSetNames.split(" "); + } + }, + + /** + * @function DataServiceQueryView.prototype.setGetFeatureMode + * @description 设置查询方式。 + * @param {(Array.|GetFeatureMode)} getFeatureMode - 查询方式。 + */ + setGetFeatureMode(getFeatureMode) { + this.getFeatureMode = getFeatureMode; + this._getFeatureModeOnchange(this.getFeatureMode); + }, + /** + * @function DataServiceQueryView.prototype.setDataServiceUrl + * @description 设置查询的数据服务地址。 + * @param {string} dataServiceUrl - 数据服务地址。 + */ + setDataServiceUrl(dataServiceUrl) { + this.dataServiceUrl = dataServiceUrl; + this.viewModel = new DataServiceQueryViewModel(this.dataServiceUrl); + + }, + /** + * @function DataServiceQueryView.prototype._getFeatureModeOnchange + * @private + * @description 改变查询方式时改变 UI。 + * @param {string} getFeatureMode - 查询方式。 + */ + _getFeatureModeOnchange(getFeatureMode) { + let queryModelOptionsArr; + if (!getFeatureMode || JSON.stringify(getFeatureMode) == '{}') { + queryModelOptionsArr = ['ID', 'SQL', 'BOUNDS', 'BUFFER', 'SPATIAL']; + } else { + queryModelOptionsArr = getFeatureMode; + } + let queryModelControl = document.getElementById('queryModelControl'); + queryModelControl.innerHTML = ''; + this.creatQueryModeSelect(queryModelOptionsArr, queryModelControl) + }, + + /** + * @function DataServiceQueryView.prototype._initView + * @description 创建数据服务查询组件。 + * @returns {HTMLElement} + * @private + */ + _initView: function () { + // 初始化 ViewModel: + this.viewModel = new DataServiceQueryViewModel(this.dataServiceUrl); + this.messageBox = new MessageBox(); + + // 组件 container + let container = (new CommonContainer({title: Lang.i18n('title_dataServiceQuery')})).getElement(); + container.classList.add('component-servicequery__container'); + container.children[0].classList.add('component-servicequery__title'); + let componentContentContainer = container.children[1]; + componentContentContainer.classList.add('component-content--scroll'); + componentContentContainer.classList.add('data-services'); + // 组件内容 container + let analyusisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); + let analysisType = external_L_default().DomUtil.create('div', 'component-servicequery__analysistype', analyusisTypeContainer); + let analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisType); + + let queryModelOptionsArr, getFeatureModeArr = this.options.getFeatureMode; + // 获取查询模式 + if (!getFeatureModeArr || JSON.stringify(getFeatureModeArr) == '{}') { + queryModelOptionsArr = ['ID', 'SQL', 'BOUNDS', 'BUFFER', 'SPATIAL']; + } else { + queryModelOptionsArr = getFeatureModeArr; + } + // 查询模式 + let queryModelContainer = external_L_default().DomUtil.create('div', '', analysisLayer); + queryModelContainer.id = 'queryModelContainer'; + let queryModelControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', queryModelContainer); + queryModelControl.id = 'queryModelControl'; + this.creatQueryModeSelect = creatQueryModeSelect.bind(this); + this.queryModeltOnchange = queryModeltOnchange.bind(this); + this.creatQueryModeSelect(queryModelOptionsArr, queryModelControl); + + // 要素 ID 数组 + let featuresIdArrContainer = external_L_default().DomUtil.create('div', 'component-analysis__container component-textarea--dataservice__container', analysisLayer); + let textareaSpan = external_L_default().DomUtil.create('span', 'textarea-name', featuresIdArrContainer); + textareaSpan.innerHTML = Lang.i18n('text_label_IDArrayOfFeatures'); + let textareaControl = external_L_default().DomUtil.create('div', 'component-textarea component-textarea--dataservice', featuresIdArrContainer); + textareaControl.id = 'getfeaturesIdArr'; + let scrollarea = external_L_default().DomUtil.create('div', 'scrollarea', textareaControl); + let scrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', scrollarea); + scrollareaContent.setAttribute('tabindex', '1'); + let getValueTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content', scrollareaContent); + getValueTextArea.value = '[1,2,3]'; + getValueTextArea.id = 'getValueTextArea'; + + // SQL 最多可返回的要素数量 + let maxFeaturesContainer = external_L_default().DomUtil.create('div', 'component-servicequery__maxfeatures-container hidden', analysisLayer); + let maxFeaturesOtions = { + 'spanName': Lang.i18n('text_label_maxFeatures'), + 'value': '1000' + }; + let maxFeaturesInputBox = this._creatInputBox(maxFeaturesOtions, maxFeaturesContainer); + let maxFeaturesInput = maxFeaturesInputBox.children[1]; + maxFeaturesInput.classList.add('max-features-input'); + // Buffer 缓冲区距离 + let bufferDistanceContainer = external_L_default().DomUtil.create('div', 'component-servicequery__distance-container hidden', analysisLayer); + let bufferDistanceOtions = { + 'spanName': Lang.i18n('text_label_bufferDistance'), + 'value': '10' + }; + let bufferDistanceInputBox = this._creatInputBox(bufferDistanceOtions, bufferDistanceContainer); + let bufferDistanceInput = bufferDistanceInputBox.children[1]; + + + // Bounds 查询范围; + let queryRangeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container component-textarea--dataservice__container hidden', analysisLayer); + let queryRangetextareaSpan = external_L_default().DomUtil.create('span', 'textarea-name', queryRangeContainer); + let queryRangeMainContent = external_L_default().DomUtil.create('div', '', queryRangeContainer); + let queryRangeIconContainer = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon-container', queryRangeMainContent); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_queryRange1'); + let queryRangeRecIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-polygon-layer bounds', queryRangeIconContainer); + let queryRangeLineIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-line-layer hidden', queryRangeIconContainer); + let queryRangePointIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-point-layer hidden', queryRangeIconContainer); + let queryRangetextareaControl = external_L_default().DomUtil.create('div', 'component-textarea component-textarea--rangequery', queryRangeMainContent); + queryRangetextareaControl.id = 'getfeaturesIdArr'; + let queryRangescrollarea = external_L_default().DomUtil.create('div', '', queryRangetextareaControl); + let queryRangescrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', queryRangescrollarea); + queryRangescrollareaContent.setAttribute('tabindex', '1'); + let queryRangeTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content component-textarea--rangequery__content', queryRangescrollareaContent); + queryRangeTextArea.value = '{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}'; + + // geometry 空间查询模式 + let spatialQueryModeContainer = external_L_default().DomUtil.create('div', 'component-servicequery__spatialquerymode-container hidden', analysisLayer); + let spatialQueryModeOptions = { + 'optionsArr': ['CONTAIN', 'CROSS', 'DISJOINT', 'IDENTITY', 'INTERSECT', 'NONE', 'OVERLAP', 'TOUCH', 'WITHIN'], + 'labelName': Lang.i18n('text_label_spatialQueryMode') + }; + let spatialQueryModeControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', spatialQueryModeContainer); + let spatialQueryModeSelectTool = (new Select(spatialQueryModeOptions)).getElement(); + spatialQueryModeSelectTool.children[1].classList.add('dataservice-select'); + spatialQueryModeControl.appendChild(spatialQueryModeSelectTool); + let spatialQueryModeSelectName = spatialQueryModeSelectTool.children[1].children[0]; + spatialQueryModeSelectName.id = 'spatialQueryModeSelectName'; + let spatialQueryModeSelectContent = spatialQueryModeSelectTool.children[1].children[2]; + spatialQueryModeSelectContent.classList.add('component-servicequery__spatialquerymode__selectcontent'); + + + // 分析按钮 + let runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisLayer); + let runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + let analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_query'); + let analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + let analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying', analysingContainer); + let svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.innerHTML = ` + + + + + `; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_querying'); + + // 删除按钮 + let deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheRresultLayer'); + + // 设置当前显示参数 + queryModeltOnchange(queryModelOptionsArr[0]); + + // 分析按钮点击事件 + let me = this; + analysisBtn.onclick = () => { + this.messageBox.closeView(); + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + let queryParams = getQueryParams(); + + this.viewModel.on('getfeaturessucceeded', (e) => { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + if (e.result.features.length === 0) { + this.messageBox.showView(Lang.i18n('msg_dataReturnedIsEmpty'), "success"); + } + /** + * @event DataServiceQueryView#getfeaturessucceeded + * @description features 获取成功时触发。 + * @property {Object} result - 服务器返回的结果。 + */ + this._event.fire('getfeaturessucceeded', {'result': e.result}) + }); + this.viewModel.on('getfeaturesfailed', (e) => { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + this.messageBox.showView(e.error.errorMsg, "failure"); + /** + * @event DataServiceQueryView#getfeaturesfailed + * @description features 获取失败时触发。 + * @property {string} error - 服务器返回的错误。 + */ + this._event.fire('getfeaturesfailed', {'error': e.error}) + }); + this.viewModel.getFeatures(queryParams, this.map); + }; + + let bounds, resultLayer; + // 矩形 & 多边形绘制 + queryRangeRecIcon.onclick = (e) => { + let queryModelSelectName = document.getElementById('queryModelSelectName'); + let getFeatureMode = queryModelSelectName.title; + if (resultLayer) { + resultLayer.remove(); + } + // 矩形 + if (getFeatureMode === 'BOUNDS') { + this.map.pm.enableDraw('Rectangle'); + // 多边形 + } else { + this.map.pm.enableDraw('Poly'); + } + e.stopPropagation(); + e.preventDefault(); + }; + + // 线绘制 + queryRangeLineIcon.onclick = (e) => { + if (resultLayer) { + resultLayer.remove(); + } + this.map.pm.enableDraw('Line'); + e.stopPropagation(); + e.preventDefault(); + }; + + // 点绘制 + queryRangePointIcon.onclick = (e) => { + if (resultLayer) { + resultLayer.remove(); + } + this.map.pm.enableDraw('Marker'); + e.stopPropagation(); + e.preventDefault(); + }; + + this.map.on('pm:create', (e) => { + if (e.shape === 'Rectangle') { + resultLayer = e.layer; + let boundsT = resultLayer.getBounds(); + bounds = external_L_default().bounds([boundsT._southWest.lng, boundsT._southWest.lat], [boundsT._northEast.lng, boundsT._northEast.lat]); + let geo = { + 'leftBottom': {'x': boundsT._southWest.lng, 'y': boundsT._southWest.lat}, + 'rightTop': {'x': boundsT._northEast.lng, 'y': boundsT._northEast.lat} + }; + queryRangeTextArea.value = JSON.stringify(geo); + } + if (e.shape === 'Marker') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + this.map.pm.disableDraw("Marker"); + } + if (e.shape === 'Line') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + } + if (e.shape === 'Polygon') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + } + }); + // 删除按钮点击事件 + deleteLayersBtn.onclick = () => { + this.viewModel.clearLayers(); + }; + + function creatQueryModeSelect(queryModelOptionsArr, queryModelControl) { + // 查询模式 + let queryModelSelectName; + + if (queryModelOptionsArr instanceof Array && queryModelOptionsArr.length > 1) { + let queryModelOptions = { + 'optionsArr': queryModelOptionsArr, + 'labelName': Lang.i18n('text_label_queryMode'), + 'optionsClickCb': this.queryModeltOnchange + }; + let queryModelSelectTool = (new Select(queryModelOptions)).getElement(); + queryModelControl.appendChild(queryModelSelectTool); + queryModelSelectName = queryModelSelectTool.children[1].children[0]; + queryModelSelectTool.children[1].classList.add('dataservice-select'); + let queryModelSelect = queryModelSelectTool.children[1]; + queryModelSelect.classList.add('dataservice-select'); + queryModelSelect.classList.add('querymodel-select'); + } else { + let span = external_L_default().DomUtil.create('span', '', queryModelContainer); + span.innerHTML = Lang.i18n('text_label_queryMode'); + queryModelSelectName = external_L_default().DomUtil.create('div', 'component-servicequery__querymode-selectname', queryModelContainer); + let text = external_L_default().DomUtil.create('span', '', queryModelSelectName); + if (queryModelOptionsArr instanceof Array) { + text.innerHTML = queryModelOptionsArr[0]; + } else { + text.innerHTML = queryModelOptionsArr; + } + queryModelSelectName.title = text.innerHTML; + this.queryModeltOnchange(queryModelSelectName); + } + queryModelSelectName.id = 'queryModelSelectName'; + return queryModelSelectName; + } + + // 查询模式下拉框 onchange 事件 + function queryModeltOnchange(option) { + // 获取当前选中查询模式 + let queryModelSelectName; + if (option.title) { + queryModelSelectName = option.title; + } else { + queryModelSelectName = option; + } + + // 控制部分查询参数元素隐藏和显示 + maxFeaturesContainer.classList.add('hidden'); + queryRangeContainer.classList.add('hidden'); + bufferDistanceContainer.classList.add('hidden'); + queryRangeLineIcon.classList.add('hidden'); + queryRangePointIcon.classList.add('hidden'); + queryRangeRecIcon.classList.remove('bounds'); + spatialQueryModeContainer.classList.add('hidden'); + textareaSpan.innerHTML = Lang.i18n('text_label_featureFilter'); + getValueTextArea.value = 'SMID<10'; + if (queryModelSelectName === 'BUFFER' || queryModelSelectName === 'SPATIAL') { + queryRangeContainer.classList.remove('hidden'); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_geometricObject'); + queryRangeTextArea.value = '{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[84.90234375,40.25390625]}}'; + queryRangeLineIcon.classList.remove('hidden'); + queryRangePointIcon.classList.remove('hidden'); + } + switch (queryModelSelectName) { + case 'ID': + textareaSpan.innerHTML = Lang.i18n('text_label_IDArrayOfFeatures'); + getValueTextArea.value = '[1,2,3]'; + break; + case 'SQL': + maxFeaturesContainer.classList.remove('hidden'); + break; + case 'BOUNDS': + queryRangeContainer.classList.remove('hidden'); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_queryRange'); + queryRangeTextArea.value = '{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}'; + queryRangeRecIcon.classList.add('bounds'); + break; + case 'BUFFER': + bufferDistanceContainer.classList.remove('hidden'); + break; + case 'SPATIAL': + spatialQueryModeContainer.classList.remove('hidden'); + break; + } + } + + // 获取查询参数 + function getQueryParams() { + // 数据集数组 + let datasetArr = me.dataSetNames; + let queryModelSelectName = document.getElementById('queryModelSelectName'); + let getFeatureMode = queryModelSelectName.title; + // 过滤条件 + let attributeFilter = getValueTextArea.value; + + let queryParam; + if (getFeatureMode === 'ID') { + let value = getValueTextArea.value; + let ids = value.substring(1, value.length - 1).split(','); + queryParam = new GetFeaturesByIDsParameters({ + IDs: ids, + datasetNames: datasetArr + }); + } else if (getFeatureMode === 'SQL') { + let maxFeatures = maxFeaturesInput.value; + queryParam = new GetFeaturesBySQLParameters({ + queryParameter: { + attributeFilter: attributeFilter + }, + datasetNames: datasetArr, + maxFeatures: maxFeatures + }); + } else if (getFeatureMode === 'BOUNDS') { + if (!bounds) { + let value = JSON.parse(queryRangeTextArea.value); + bounds = external_L_default().bounds([value.leftBottom.x, value.leftBottom.y], [value.rightTop.x, value.rightTop.y]) + } + queryParam = new GetFeaturesByBoundsParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + bounds: bounds + }); + } else if (getFeatureMode === 'BUFFER') { + let bufferDistance = bufferDistanceInput.value; + let defaultGeometryValue = JSON.parse(queryRangeTextArea.value); + let geometryLayer = resultLayer || defaultGeometryValue; + queryParam = new GetFeaturesByBufferParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + bufferDistance: bufferDistance, + geometry: geometryLayer + }); + } else if (getFeatureMode === 'SPATIAL') { + let spatialQueryMode = spatialQueryModeSelectName.title; + let defaultGeometryValue = JSON.parse(queryRangeTextArea.value); + let geometryLayer = resultLayer || defaultGeometryValue; + queryParam = new GetFeaturesByGeometryParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + spatialQueryMode: spatialQueryMode, + geometry: geometryLayer + }); + } + return queryParam; + } + + //阻止 map 默认事件 + this._preventMapEvent(container, this.map); + return container; + }, + + /** + * @function DataServiceQueryView.prototype._creatInputBox + * @description 创建含有 span 的 input 框。 + * @private + */ + _creatInputBox(inputOptions, parentEle) { + let div = external_L_default().DomUtil.create('div', '', parentEle); + let span = external_L_default().DomUtil.create('span', '', div); + span.innerHTML = inputOptions.spanName; + let input = external_L_default().DomUtil.create('input', '', div); + input.value = inputOptions.value; + // input.className = 'distributeInput' + return div; + } + +}); +var dataServiceQueryView = function (dataServiceUrl, dataSetNames, options) { + return new DataServiceQueryView(dataServiceUrl, dataSetNames, options); +}; + +;// CONCATENATED MODULE: ./src/leaflet/components/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/namespace.js +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + +// 注:命名空间重复,内容会被覆盖 +// 例如SuperMap.Components=>L.supermap.Componets,再写L.supermap.Componets = {}, SuprMap的Components就不会挂在L.supermap上了 + +// L.supermap.d3Layer是在别的地方挂上的 +(external_L_default()).supermap = { ...SuperMap, Components: { ...SuperMap.Components }, ...(external_L_default()).supermap }; +(external_L_default()).supermap.components = (external_L_default()).supermap.components || {}; +(external_L_default()).supermap.Components = (external_L_default()).supermap.Components || {}; +(external_L_default()).supermap.control = (external_L_default()).supermap.control || {}; +(external_L_default()).supermap.Util = {}; + +// ./core +// L.Util.supermap_callbacks = coreUtil.supermap_callbacks; +(external_L_default()).Util.toGeoJSON = toGeoJSON; +(external_L_default()).supermap.Util.toGeoJSON = toGeoJSON; +(external_L_default()).Util.toSuperMapGeometry = toSuperMapGeometry; +(external_L_default()).supermap.Util.toSuperMapGeometry = toSuperMapGeometry; +(external_L_default()).Util.resolutionToScale = resolutionToScale; +(external_L_default()).supermap.Util.resolutionToScale = resolutionToScale; +(external_L_default()).Util.scaleToResolution = scaleToResolution; +(external_L_default()).supermap.Util.scaleToResolution = scaleToResolution; +(external_L_default()).Util.getMeterPerMapUnit = Util_getMeterPerMapUnit; +(external_L_default()).supermap.Util.getMeterPerMapUnit = Util_getMeterPerMapUnit; +(external_L_default()).Util.GetResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).supermap.Util.getResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).supermap.Util.GetResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).Util.NormalizeScale = normalizeScale; +(external_L_default()).supermap.Util.normalizeScale = normalizeScale; +(external_L_default()).supermap.Util.NormalizeScale = normalizeScale; +(external_L_default()).Util.transform = Transform_transform; +(external_L_default()).supermap.Util.transform = Transform_transform; +// L.Proj4Leaflet +(external_L_default()).Proj = (external_L_default()).Proj || {}; +(external_L_default()).supermap.Proj = (external_L_default()).supermap.Proj || {}; +(external_L_default()).Proj.CRS = crs; +(external_L_default()).supermap.Proj.crs = crs; +(external_L_default()).supermap.Proj.CRS = CRS; +// core/NonEarthCRS +(external_L_default()).Projection = {}; +(external_L_default()).supermap.Projection = (external_L_default()).supermap.Projection || {}; +(external_L_default()).Projection.NonProjection = nonProjection; +(external_L_default()).supermap.Projection.nonProjection = nonProjection; +(external_L_default()).supermap.Projection.NonProjection = NonProjection; +(external_L_default()).supermap.CRS = (external_L_default()).supermap.CRS || {}; +(external_L_default()).CRS.NonEarthCRS = nonEarthCRS; +(external_L_default()).supermap.CRS.NonEarthCRS = NonEarthCRS; +(external_L_default()).supermap.CRS.nonEarthCRS = nonEarthCRS; +// core/ExtendsCRS +(external_L_default()).CRS.BaiduCRS = BaiduCRS; +(external_L_default()).supermap.CRS.BaiduCRS = BaiduCRS; +(external_L_default()).CRS.TianDiTu_WGS84CRS = TianDiTu_WGS84CRS; +(external_L_default()).supermap.CRS.TianDiTu_WGS84CRS = TianDiTu_WGS84CRS; +(external_L_default()).CRS.TianDiTu_MercatorCRS = TianDiTu_MercatorCRS; +(external_L_default()).supermap.CRS.TianDiTu_MercatorCRS = TianDiTu_MercatorCRS; +(external_L_default()).CRS.TianDiTu_Mercator = TianDiTu_MercatorCRS; +(external_L_default()).supermap.CRS.TianDiTu_Mercator = TianDiTu_MercatorCRS; +(external_L_default()).CRS.TianDiTu_WGS84 = TianDiTu_WGS84CRS; +(external_L_default()).supermap.CRS.TianDiTu_WGS84 = TianDiTu_WGS84CRS; +(external_L_default()).CRS.Baidu = BaiduCRS; +(external_L_default()).supermap.CRS.Baidu = BaiduCRS; +(external_L_default()).supermap.CommontypesConversion = CommontypesConversion; +// components +(external_L_default()).supermap.components.clientComputationLayer = clientComputationLayer; +(external_L_default()).supermap.Components.ClientComputationLayer = ClientComputationLayer; +(external_L_default()).supermap.components.clientComputation = clientComputationView; +(external_L_default()).supermap.Components.ClientComputation = ClientComputationView; +(external_L_default()).supermap.components.clientComputationViewModel = clientComputationViewModel; +(external_L_default()).supermap.Components.ClientComputationViewModel = ClientComputationViewModel; +(external_L_default()).supermap.components.geoJSONLayerWithName = geoJSONLayerWithName; +(external_L_default()).supermap.Components.GeoJSONLayerWithName = GeoJSONLayerWithName; +(external_L_default()).supermap.components.GeoJsonLayersDataModel = GeoJsonLayersDataModel; +(external_L_default()).supermap.Components.GeoJsonLayersDataModel = GeoJsonLayersDataModel; +(external_L_default()).supermap.components.dataFlow = dataFlowView; +(external_L_default()).supermap.Components.DataFlow = DataFlowView; +(external_L_default()).supermap.components.dataFlowViewModel = dataFlowViewModel; +(external_L_default()).supermap.Components.DataFlowViewModel = DataFlowViewModel; +(external_L_default()).supermap.components.dataServiceQuery = dataServiceQueryView; +(external_L_default()).supermap.Components.DataServiceQuery = DataServiceQueryView; +(external_L_default()).supermap.components.dataServiceQueryViewModel = dataServiceQueryViewModel; +(external_L_default()).supermap.Components.DataServiceQueryViewModel = DataServiceQueryViewModel; +(external_L_default()).supermap.components.DistributedAnalysisModel = DistributedAnalysisModel; +(external_L_default()).supermap.Components.DistributedAnalysisModel = DistributedAnalysisModel; +(external_L_default()).supermap.components.distributedAnalysis = distributedAnalysisView; +(external_L_default()).supermap.Components.DistributedAnalysis = DistributedAnalysisView; +(external_L_default()).supermap.components.distributedAnalysisViewModel = distributedAnalysisViewModel; +(external_L_default()).supermap.Components.DistributedAnalysisViewModel = DistributedAnalysisViewModel; +(external_L_default()).supermap.components.openFile = openFileView; +(external_L_default()).supermap.Components.OpenFile = OpenFileView; +(external_L_default()).supermap.components.openFileViewModel = openFileViewModel; +(external_L_default()).supermap.Components.OpenFileViewModel = OpenFileViewModel; +(external_L_default()).supermap.components.search = searchView; +(external_L_default()).supermap.Components.Search = SearchView; +(external_L_default()).supermap.components.searchViewModel = searchViewModel; +(external_L_default()).supermap.Components.SearchViewModel = SearchViewModel; +(external_L_default()).supermap.components.componentsViewBase = componentsViewBase; +(external_L_default()).supermap.Components.ComponentsViewBase = ComponentsViewBase; +// control +(external_L_default()).supermap.control.changeTileVersion = changeTileVersion; +(external_L_default()).supermap.control.ChangeTileVersion = ChangeTileVersion; +(external_L_default()).supermap.control.logo = logo; +(external_L_default()).supermap.control.Logo = Logo; +// mapping +(external_L_default()).supermap.baiduTileLayer = baiduTileLayer; +(external_L_default()).supermap.BaiduTileLayer = BaiduTileLayer; +(external_L_default()).supermap.cloudTileLayer = cloudTileLayer; +(external_L_default()).supermap.CloudTileLayer = CloudTileLayer; +(external_L_default()).supermap.imageMapLayer = imageMapLayer; +(external_L_default()).supermap.ImageMapLayer = ImageMapLayer; +(external_L_default()).supermap.imageTileLayer = imageTileLayer; +(external_L_default()).supermap.ImageTileLayer = ImageTileLayer; +(external_L_default()).supermap.tiandituTileLayer = tiandituTileLayer; +(external_L_default()).supermap.TiandituTileLayer = TiandituTileLayer; +(external_L_default()).supermap.tiledMapLayer = tiledMapLayer; +(external_L_default()).supermap.TiledMapLayer = TiledMapLayer; +(external_L_default()).supermap.wmtsLayer = wmtsLayer; +(external_L_default()).supermap.WMTSLayer = WMTSLayer; +(external_L_default()).supermap.webmap = webMap; +(external_L_default()).supermap.WebMap = WebMap; +// overlay +(external_L_default()).supermap.CartoCSSToLeaflet = CartoCSSToLeaflet; +(external_L_default()).supermap.DefaultStyle = DefaultStyle; +(external_L_default()).supermap.CartoStyleMap = CartoStyleMap; +(external_L_default()).supermap.ServerStyleMap = ServerStyleMap; +(external_L_default()).supermap.CompOpMap = CompOpMap; +(external_L_default()).supermap.circleStyle = circleStyle; +(external_L_default()).supermap.CircleStyle = CircleStyle; +(external_L_default()).supermap.cloverStyle = cloverStyle; +(external_L_default()).supermap.CloverStyle = CloverStyle; +(external_L_default()).supermap.graphic = graphic; +(external_L_default()).supermap.Graphic = Graphic; +(external_L_default()).supermap.imageStyle = imageStyle; +(external_L_default()).supermap.ImageStyle = ImageStyle; +(external_L_default()).supermap.themeFeature = themeFeature; +(external_L_default()).supermap.ThemeFeature = ThemeFeature; +(external_L_default()).supermap.dataFlowLayer = dataFlowLayer; +(external_L_default()).supermap.DataFlowLayer = DataFlowLayer; +(external_L_default()).supermap.echartsLayer = echartsLayer; +(external_L_default()).supermap.EchartsLayer = EchartsLayer; +(external_L_default()).supermap.graphicLayer = graphicLayer; +(external_L_default()).supermap.GraphicLayer = GraphicLayer; +(external_L_default()).supermap.graphThemeLayer = graphThemeLayer; +(external_L_default()).supermap.GraphThemeLayer = GraphThemeLayer; +(external_L_default()).supermap.heatMapFeature = heatMapFeature; +(external_L_default()).supermap.HeatMapFeature = HeatMapFeature; +(external_L_default()).supermap.heatMapLayer = heatMapLayer; +(external_L_default()).supermap.HeatMapLayer = HeatMapLayer; +(external_L_default()).supermap.labelThemeLayer = labelThemeLayer; +(external_L_default()).supermap.LabelThemeLayer = LabelThemeLayer; +(external_L_default()).supermap.mapVLayer = mapVLayer; +(external_L_default()).supermap.MapVLayer = MapVLayer; +(external_L_default()).supermap.rangeThemeLayer = rangeThemeLayer; +(external_L_default()).supermap.RangeThemeLayer = RangeThemeLayer; +(external_L_default()).supermap.rankSymbolThemeLayer = rankSymbolThemeLayer; +(external_L_default()).supermap.RankSymbolThemeLayer = RankSymbolThemeLayer; +(external_L_default()).supermap.tiledVectorLayer = tiledVectorLayer; +(external_L_default()).supermap.TileVectorLayer = TiledVectorLayer; +(external_L_default()).supermap.TiledVectorLayer = TiledVectorLayer; +(external_L_default()).supermap.turfLayer = turfLayer; +(external_L_default()).supermap.TurfLayer = TurfLayer; +(external_L_default()).supermap.unicodeMarker = unicodeMarker; +(external_L_default()).supermap.UnicodeMarker = UnicodeMarker; +(external_L_default()).supermap.uniqueThemeLayer = uniqueThemeLayer; +(external_L_default()).supermap.UniqueThemeLayer = UniqueThemeLayer; +(external_L_default()).supermap.VectorTileFormat = VectorTileFormat; +(external_L_default()).supermap.addressMatchService = addressMatchService; +(external_L_default()).supermap.AddressMatchService = AddressMatchService_AddressMatchService; +(external_L_default()).supermap.chartService = chartService; +(external_L_default()).supermap.ChartService = ChartService; +(external_L_default()).supermap.dataFlowService = dataFlowService; +(external_L_default()).supermap.DataFlowService = DataFlowService_DataFlowService; +(external_L_default()).supermap.datasetService = datasetService; +(external_L_default()).supermap.DatasetService = DatasetService_DatasetService; +(external_L_default()).supermap.datasourceService = datasourceService; +(external_L_default()).supermap.DatasourceService = DatasourceService_DatasourceService; +(external_L_default()).supermap.featureService = FeatureService_featureService; +(external_L_default()).supermap.FeatureService = FeatureService; +(external_L_default()).supermap.fieldService = fieldService; +(external_L_default()).supermap.FieldService = FieldService; +(external_L_default()).supermap.geoprocessingService = geoprocessingService; +(external_L_default()).supermap.GeoprocessingService = GeoprocessingService_GeoprocessingService; +(external_L_default()).supermap.gridCellInfosService = gridCellInfosService; +(external_L_default()).supermap.GridCellInfosService = GridCellInfosService; +(external_L_default()).supermap.imageCollectionService = imageCollectionService; +(external_L_default()).supermap.ImageCollectionService = ImageCollectionService; +(external_L_default()).supermap.imageService = imageService; +(external_L_default()).supermap.ImageService = ImageService; +(external_L_default()).supermap.layerInfoService = layerInfoService; +(external_L_default()).supermap.LayerInfoService = LayerInfoService; +(external_L_default()).supermap.mapService = mapService; +(external_L_default()).supermap.MapService = MapService_MapService; +(external_L_default()).supermap.measureService = measureService; +(external_L_default()).supermap.MeasureService = MeasureService_MeasureService; +(external_L_default()).supermap.networkAnalyst3DService = networkAnalyst3DService; +(external_L_default()).supermap.NetworkAnalyst3DService = NetworkAnalyst3DService; +(external_L_default()).supermap.networkAnalystService = networkAnalystService; +(external_L_default()).supermap.NetworkAnalystService = NetworkAnalystService; +(external_L_default()).supermap.processingService = processingService; +(external_L_default()).supermap.ProcessingService = ProcessingService; +(external_L_default()).supermap.queryService = queryService; +(external_L_default()).supermap.QueryService = QueryService_QueryService; +(external_L_default()).supermap.ServiceBase = ServiceBase; +(external_L_default()).supermap.spatialAnalystService = spatialAnalystService; +(external_L_default()).supermap.SpatialAnalystService = SpatialAnalystService; +(external_L_default()).supermap.themeService = themeService; +(external_L_default()).supermap.ThemeService = ThemeService_ThemeService; +(external_L_default()).supermap.trafficTransferAnalystService = trafficTransferAnalystService; +(external_L_default()).supermap.TrafficTransferAnalystService = TrafficTransferAnalystService; +(external_L_default()).supermap.webPrintingJobService = webPrintingJobService; +(external_L_default()).supermap.WebPrintingJobService = WebPrintingJobService; + +// 处理命名空间重名 +(external_L_default()).supermap.CommonUtil = Util; + + +})(); + +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +})(); + +/******/ })() +; \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.min.js b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.min.js new file mode 100644 index 00000000..fb8559e6 --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet-es6.min.js @@ -0,0 +1,1678 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */(()=>{var e={550:e=>{"use strict";function t(e,t){this.x=e,this.y=t}e.exports=t,t.prototype={clone:function(){return new t(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},multByPoint:function(e){return this.clone()._multByPoint(e)},divByPoint:function(e){return this.clone()._divByPoint(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},rotateAround:function(e,t){return this.clone()._rotateAround(e,t)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,s=e.y-this.y;return t*t+s*s},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,s=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=s,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_multByPoint:function(e){return this.x*=e.x,this.y*=e.y,this},_divByPoint:function(e){return this.x/=e.x,this.y/=e.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),s=Math.sin(e),i=t*this.x-s*this.y,r=s*this.x+t*this.y;return this.x=i,this.y=r,this},_rotateAround:function(e,t){var s=Math.cos(e),i=Math.sin(e),r=t.x+s*(this.x-t.x)-i*(this.y-t.y),n=t.y+i*(this.x-t.x)+s*(this.y-t.y);return this.x=r,this.y=n,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},t.convert=function(e){return e instanceof t?e:Array.isArray(e)?new t(e[0],e[1]):e}},929:(e,t,s)=>{e.exports.VectorTile=s(779),s(24),s(701)},779:(e,t,s)=>{"use strict";var i=s(701);function r(e,t,s){if(3===e){var r=new i(s,s.readVarint()+s.pos);r.length&&(t[r.name]=r)}}e.exports=function(e,t){this.layers=e.readFields(r,{},t)}},24:(e,t,s)=>{"use strict";var i=s(550);function r(e,t,s,i,r){this.properties={},this.extent=s,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=r,e.readFields(n,this,t)}function n(e,t,s){1==e?t.id=s.readVarint():2==e?function(e,t){var s=e.readVarint()+e.pos;for(;e.pos>3}if(n--,1===r||2===r)a+=e.readSVarint(),o+=e.readSVarint(),1===r&&(t&&l.push(t),t=[]),t.push(new i(a,o));else{if(7!==r)throw new Error("unknown command "+r);t&&t.push(t[0].clone())}}return t&&l.push(t),l},r.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,s=1,i=0,r=0,n=0,a=1/0,o=-1/0,l=1/0,h=-1/0;e.pos>3}if(i--,1===s||2===s)r+=e.readSVarint(),n+=e.readSVarint(),ro&&(o=r),nh&&(h=n);else if(7!==s)throw new Error("unknown command "+s)}return[a,l,o,h]},r.prototype.toGeoJSON=function(e,t,s){var i,n,o=this.extent*Math.pow(2,s),l=this.extent*e,h=this.extent*t,u=this.loadGeometry(),c=r.types[this.type];function p(e){for(var t=0;t{"use strict";var i=s(24);function r(e,t){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(n,this,t),this.length=this._features.length}function n(e,t,s){15===e?t.version=s.readVarint():1===e?t.name=s.readString():5===e?t.extent=s.readVarint():2===e?t._features.push(s.pos):3===e?t._keys.push(s.readString()):4===e&&t._values.push(function(e){var t=null,s=e.readVarint()+e.pos;for(;e.pos>3;t=1===i?e.readString():2===i?e.readFloat():3===i?e.readDouble():4===i?e.readVarint64():5===i?e.readVarint():6===i?e.readSVarint():7===i?e.readBoolean():null}return t}(s))}e.exports=r,r.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new i(this._pbf,t,this.extent,this._keys,this._values)}},693:function(e){!function(t){"use strict";if(t.__disableNativeFetch||!t.fetch){o.prototype.append=function(e,t){e=n(e),t=a(t);var s=this.map[e];s||(s=[],this.map[e]=s),s.push(t)},o.prototype.delete=function(e){delete this.map[n(e)]},o.prototype.get=function(e){var t=this.map[n(e)];return t?t[0]:null},o.prototype.getAll=function(e){return this.map[n(e)]||[]},o.prototype.has=function(e){return this.map.hasOwnProperty(n(e))},o.prototype.set=function(e,t){this.map[n(e)]=[a(t)]},o.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(s){this.map[s].forEach(function(i){e.call(t,i,s,this)},this)},this)};var s={blob:"FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in t,arrayBuffer:"ArrayBuffer"in t},i=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];p.prototype.clone=function(){return new p(this)},c.call(p.prototype),c.call(f.prototype),f.prototype.clone=function(){return new f(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},f.error=function(){var e=new f(null,{status:0,statusText:""});return e.type="error",e};var r=[301,302,303,307,308];f.redirect=function(e,t){if(-1===r.indexOf(t))throw new RangeError("Invalid status code");return new f(null,{status:t,headers:{location:e}})},t.Headers=o,t.Request=p,t.Response=f,t.fetch=function(e,t){return new Promise(function(i,r){var n;n=p.prototype.isPrototypeOf(e)&&!t?e:new p(e,t);var a=new XMLHttpRequest;var l=!1;function h(){if(4===a.readyState){var e=1223===a.status?204:a.status;if(e<100||e>599){if(l)return;return l=!0,void r(new TypeError("Network request failed"))}var t={status:e,statusText:a.statusText,headers:function(e){var t=new o;return e.getAllResponseHeaders().trim().split("\n").forEach(function(e){var s=e.trim().split(":"),i=s.shift().trim(),r=s.join(":").trim();t.append(i,r)}),t}(a),url:"responseURL"in a?a.responseURL:/^X-Request-URL:/m.test(a.getAllResponseHeaders())?a.getResponseHeader("X-Request-URL"):void 0},s="response"in a?a.response:a.responseText;l||(l=!0,i(new f(s,t)))}}a.onreadystatechange=h,a.onload=h,a.onerror=function(){l||(l=!0,r(new TypeError("Network request failed")))},a.open(n.method,n.url,!0);try{"include"===n.credentials&&("withCredentials"in a?a.withCredentials=!0:console&&console.warn&&console.warn("withCredentials is not supported, you can ignore this warning"))}catch(e){console&&console.warn&&console.warn("set withCredentials error:"+e)}"responseType"in a&&s.blob&&(a.responseType="blob"),n.headers.forEach(function(e,t){a.setRequestHeader(t,e)}),a.send(void 0===n._bodyInit?null:n._bodyInit)})},t.fetch.polyfill=!0,e.exports&&(e.exports=t.fetch)}function n(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function a(e){return"string"!=typeof e&&(e=String(e)),e}function o(e){this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function l(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function h(e){return new Promise(function(t,s){e.onload=function(){t(e.result)},e.onerror=function(){s(e.error)}})}function u(e){var t=new FileReader;return t.readAsArrayBuffer(e),h(t)}function c(){return this.bodyUsed=!1,this._initBody=function(e,t){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else if(s.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e,this._options=t;else if(s.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(e){if(!s.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e))throw new Error("unsupported BodyInit type")}else this._bodyText=""},s.blob?(this.blob=function(){var e=l(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this.blob().then(u)},this.text=function(){var e,t,s,i,r,n,a,o=l(this);if(o)return o;if(this._bodyBlob)return e=this._bodyBlob,t=this._options,s=new FileReader,i=t.headers.map["content-type"]?t.headers.map["content-type"].toString():"",r=/charset\=[0-9a-zA-Z\-\_]*;?/,n=e.type.match(r)||i.match(r),a=[e],n&&a.push(n[0].replace(/^charset\=/,"").replace(/;$/,"")),s.readAsText.apply(s,a),h(s);if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)}):this.text=function(){var e=l(this);return e||Promise.resolve(this._bodyText)},s.formData&&(this.formData=function(){return this.text().then(d)}),this.json=function(){return this.text().then(JSON.parse)},this}function p(e,t){var s,r,n=(t=t||{}).body;if(p.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=(s=t.method||this.method||"GET",r=s.toUpperCase(),i.indexOf(r)>-1?r:s),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n,t)}function d(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var s=e.split("="),i=s.shift().replace(/\+/g," "),r=s.join("=").replace(/\+/g," ");t.append(decodeURIComponent(i),decodeURIComponent(r))}}),t}function f(e,t){t||(t={}),this._initBody(e,t),this.type="default",this.status=t.status,this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText,this.headers=t.headers instanceof o?t.headers:new o(t.headers),this.url=t.url||""}}("undefined"!=typeof self?self:this)},144:function(e,t){var s,i,r;i=[t,e],void 0===(r="function"==typeof(s=function(e,t){"use strict";var s={timeout:5e3,jsonpCallback:"callback",jsonpCallbackFunction:null};function i(e){try{delete window[e]}catch(t){window[e]=void 0}}function r(e){var t=document.getElementById(e);t&&document.getElementsByTagName("head")[0].removeChild(t)}t.exports=function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=e,a=t.timeout||s.timeout,o=t.jsonpCallback||s.jsonpCallback,l=void 0;return new Promise(function(s,h){var u=t.jsonpCallbackFunction||"jsonp_"+Date.now()+"_"+Math.ceil(1e5*Math.random()),c=o+"_"+u;window[u]=function(e){s({ok:!0,json:function(){return Promise.resolve(e)}}),l&&clearTimeout(l),r(c),i(u)},n+=-1===n.indexOf("?")?"?":"&";var p=document.createElement("script");p.setAttribute("src",""+n+o+"="+u),t.charset&&p.setAttribute("charset",t.charset),p.id=c,document.getElementsByTagName("head")[0].appendChild(p),l=setTimeout(function(){h(new Error("JSONP request to "+e+" timed out")),i(u),r(c),window[u]=function(){i(u)}},a),p.onerror=function(){h(new Error("JSONP request to "+e+" failed")),i(u),r(c),l&&clearTimeout(l)}})}})?s.apply(t,i):s)||(e.exports=r)},645:(e,t)=>{t.read=function(e,t,s,i,r){var n,a,o=8*r-i-1,l=(1<>1,u=-7,c=s?r-1:0,p=s?-1:1,d=e[t+c];for(c+=p,n=d&(1<<-u)-1,d>>=-u,u+=o;u>0;n=256*n+e[t+c],c+=p,u-=8);for(a=n&(1<<-u)-1,n>>=-u,u+=i;u>0;a=256*a+e[t+c],c+=p,u-=8);if(0===n)n=1-h;else{if(n===l)return a?NaN:1/0*(d?-1:1);a+=Math.pow(2,i),n-=h}return(d?-1:1)*a*Math.pow(2,n-i)},t.write=function(e,t,s,i,r,n){var a,o,l,h=8*n-r-1,u=(1<>1,p=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,d=i?0:n-1,f=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,a=u):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),(t+=a+c>=1?p/l:p*Math.pow(2,1-c))*l>=2&&(a++,l/=2),a+c>=u?(o=0,a=u):a+c>=1?(o=(t*l-1)*Math.pow(2,r),a+=c):(o=t*Math.pow(2,c-1)*Math.pow(2,r),a=0));r>=8;e[s+d]=255&o,d+=f,o/=256,r-=8);for(a=a<0;e[s+d]=255&a,d+=f,a/=256,h-=8);e[s+d-f]|=128*m}},545:(e,t,s)=>{var i=s(820),r="&&",n="||",a="and",o="or",l="=",h="~",u="!"+l,c="!"+h,p=">",d=">=",f="<",m="<=",y="*",g=",",v=".",S="(",b=")",x="where",_={pathway:[],groups:{}},C={},w={},M=console.log;function A(e){var t=E(e,x),s=t[0],i=t[1];_.pathway=E(s,g);for(var a=0,o=_.pathway.length;aw&&-1!==w){var O="gr_"+(new Date).getTime();_.groups[O]=i.substring(w+1,M),i=i.replace(S+_.groups[O]+b,O),A=-1}A+=1}!function e(t,s){var i=T(s,r),a=T(s,n);if(i!==Number.MAX_VALUE||a!==Number.MAX_VALUE)if(i-1}function O(e,t){var s=E(t,v),r=e;for(var n in s){if(!r.hasOwnProperty(s[n]))return"";r=r[s[n]]}return r=i.isDate(r)?r.valueOf():i.isDateString(r)?i.parseDateFromString(r):r.toString()}function P(e,t){var s=!1;for(var i in e){if(s=s||(i===a?N:i===o?P:I)(e[i],t),w.trace&&M(_.step,"======((( or",e[i],s),s)return s}return s}function N(e,t){var s=!0;for(var i in e){if(s=s&&(i===a?N:i===o?P:I)(e[i],t),w.trace&&M(_.step,"======((( and",e[i],s),!s)return s}return s}function I(e,t){if(_.step+=1,e.or){var s=P(e.or,t);return w.trace&&M(_.step,"OR",e,s),s}if(e.and){s=N(e.and,t);return w.trace&&M(_.step,"AND",e,s),s}if("object"==typeof e)return e.eq?O(t,e.eq[0])===e.eq[1]:e.ne?O(t,e.ne[0])!==e.ne[1]:e.req?L(O(t,e.req[0]),e.req[1]):e.nreq?!L(O(t,e.nreq[0]),e.nreq[1]):e.gt?O(t,e.gt[0])>e.gt[1]:e.ge?O(t,e.ge[0])>=e.ge[1]:e.lt?O(t,e.lt[0])0?i.map(function(e){for(var t={},s=0,i=_.pathway.length;s{function t(e){return Object.prototype.toString.call(e)}function s(e){return"[object String]"===t(e)}e.exports={getObjectType:t,isDate:function(e){return"[object Date]"===t(e)},isString:s,isDateString:function(e){return s(e)&&!isNaN(Date.parse(e))},parseDateFromString:function(e){return Date.parse(e)},isNumber:function(e){return"number"==typeof e}}},52:(e,t,s)=>{var i=9007199254740991,r="[object Arguments]",n="[object Function]",a="[object GeneratorFunction]",o="[object Map]",l="[object Set]",h=/^\[object .+?Constructor\]$/,u=/^(?:0|[1-9]\d*)$/,c="object"==typeof s.g&&s.g&&s.g.Object===Object&&s.g,p="object"==typeof self&&self&&self.Object===Object&&self,d=c||p||Function("return this")();function f(e,t){return function(e,t){for(var s=-1,i=e?e.length:0,r=Array(i);++s-1&&e%1==0&&e-1&&e%1==0&&e<=i}(e.length)&&!J(e)}function J(e){var t=q(e)?x.call(e):"";return t==n||t==a}function q(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var H=function(e){return function(t){var s,i,r,n=G(t);return n==o?(s=t,i=-1,r=Array(s.size),s.forEach(function(e,t){r[++i]=[t,e]}),r):n==l?function(e){var t=-1,s=Array(e.size);return e.forEach(function(e){s[++t]=[e,e]}),s}(t):f(t,e(t))}}(function(e){return V(e)?D(e):k(e)});e.exports=H},614:(e,t,s)=>{"use strict";e.exports=r;var i=s(645);function r(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}r.Varint=0,r.Fixed64=1,r.Bytes=2,r.Fixed32=5;var n="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function a(e){return e.type===r.Bytes?e.readVarint()+e.pos:e.pos+1}function o(e,t,s){return s?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function l(e,t,s){var i=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.floor(Math.log(t)/(7*Math.LN2));s.realloc(i);for(var r=s.pos-1;r>=e;r--)s.buf[r+i]=s.buf[r]}function h(e,t){for(var s=0;s>>8,e[s+2]=t>>>16,e[s+3]=t>>>24}function b(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}r.prototype={destroy:function(){this.buf=null},readFields:function(e,t,s){for(s=s||this.length;this.pos>3,n=this.pos;this.type=7&i,e(r,t,this),this.pos===n&&this.skip(i)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=v(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=b(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=v(this.buf,this.pos)+4294967296*v(this.buf,this.pos+4);return this.pos+=8,e},readSFixed64:function(){var e=v(this.buf,this.pos)+4294967296*b(this.buf,this.pos+4);return this.pos+=8,e},readFloat:function(){var e=i.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=i.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,s,i=this.buf;return t=127&(s=i[this.pos++]),s<128?t:(t|=(127&(s=i[this.pos++]))<<7,s<128?t:(t|=(127&(s=i[this.pos++]))<<14,s<128?t:(t|=(127&(s=i[this.pos++]))<<21,s<128?t:function(e,t,s){var i,r,n=s.buf;if(r=n[s.pos++],i=(112&r)>>4,r<128)return o(e,i,t);if(r=n[s.pos++],i|=(127&r)<<3,r<128)return o(e,i,t);if(r=n[s.pos++],i|=(127&r)<<10,r<128)return o(e,i,t);if(r=n[s.pos++],i|=(127&r)<<17,r<128)return o(e,i,t);if(r=n[s.pos++],i|=(127&r)<<24,r<128)return o(e,i,t);if(r=n[s.pos++],i|=(1&r)<<31,r<128)return o(e,i,t);throw new Error("Expected varint not more than 10 bytes")}(t|=(15&(s=i[this.pos]))<<28,e,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=12&&n?function(e,t,s){return n.decode(e.subarray(t,s))}(this.buf,t,e):function(e,t,s){var i="",r=t;for(;r239?4:l>223?3:l>191?2:1;if(r+u>s)break;1===u?l<128&&(h=l):2===u?128==(192&(n=e[r+1]))&&(h=(31&l)<<6|63&n)<=127&&(h=null):3===u?(n=e[r+1],a=e[r+2],128==(192&n)&&128==(192&a)&&((h=(15&l)<<12|(63&n)<<6|63&a)<=2047||h>=55296&&h<=57343)&&(h=null)):4===u&&(n=e[r+1],a=e[r+2],o=e[r+3],128==(192&n)&&128==(192&a)&&128==(192&o)&&((h=(15&l)<<18|(63&n)<<12|(63&a)<<6|63&o)<=65535||h>=1114112)&&(h=null)),null===h?(h=65533,u=1):h>65535&&(h-=65536,i+=String.fromCharCode(h>>>10&1023|55296),h=56320|1023&h),i+=String.fromCharCode(h),r+=u}return i}(this.buf,t,e)},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){if(this.type!==r.Bytes)return e.push(this.readVarint(t));var s=a(this);for(e=e||[];this.pos127;);else if(t===r.Bytes)this.pos=this.readVarint()+this.pos;else if(t===r.Fixed32)this.pos+=4;else{if(t!==r.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t268435455||e<0?function(e,t){var s,i;e>=0?(s=e%4294967296|0,i=e/4294967296|0):(i=~(-e/4294967296),4294967295^(s=~(-e%4294967296))?s=s+1|0:(s=0,i=i+1|0));if(e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),function(e,t,s){s.buf[s.pos++]=127&e|128,e>>>=7,s.buf[s.pos++]=127&e|128,e>>>=7,s.buf[s.pos++]=127&e|128,e>>>=7,s.buf[s.pos++]=127&e|128,e>>>=7,s.buf[s.pos]=127&e}(s,0,t),function(e,t){var s=(7&e)<<4;if(t.buf[t.pos++]|=s|((e>>>=3)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;t.buf[t.pos++]=127&e}(i,t)}(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length),this.pos++;var t=this.pos;this.pos=function(e,t,s){for(var i,r,n=0;n55295&&i<57344){if(!r){i>56319||n+1===t.length?(e[s++]=239,e[s++]=191,e[s++]=189):r=i;continue}if(i<56320){e[s++]=239,e[s++]=191,e[s++]=189,r=i;continue}i=r-55296<<10|i-56320|65536,r=null}else r&&(e[s++]=239,e[s++]=191,e[s++]=189,r=null);i<128?e[s++]=i:(i<2048?e[s++]=i>>6|192:(i<65536?e[s++]=i>>12|224:(e[s++]=i>>18|240,e[s++]=i>>12&63|128),e[s++]=i>>6&63|128),e[s++]=63&i|128)}return s}(this.buf,e,this.pos);var s=this.pos-t;s>=128&&l(t,s,this),this.pos=t-1,this.writeVarint(s),this.pos+=s},writeFloat:function(e){this.realloc(4),i.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),i.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var s=0;s=128&&l(s,i,this),this.pos=s-1,this.writeVarint(i),this.pos+=i},writeMessage:function(e,t,s){this.writeTag(e,r.Bytes),this.writeRawMessage(t,s)},writePackedVarint:function(e,t){t.length&&this.writeMessage(e,h,t)},writePackedSVarint:function(e,t){t.length&&this.writeMessage(e,u,t)},writePackedBoolean:function(e,t){t.length&&this.writeMessage(e,d,t)},writePackedFloat:function(e,t){t.length&&this.writeMessage(e,c,t)},writePackedDouble:function(e,t){t.length&&this.writeMessage(e,p,t)},writePackedFixed32:function(e,t){t.length&&this.writeMessage(e,f,t)},writePackedSFixed32:function(e,t){t.length&&this.writeMessage(e,m,t)},writePackedFixed64:function(e,t){t.length&&this.writeMessage(e,y,t)},writePackedSFixed64:function(e,t){t.length&&this.writeMessage(e,g,t)},writeBytesField:function(e,t){this.writeTag(e,r.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,r.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,r.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,r.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,r.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,r.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,r.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,r.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,r.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,r.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}},107:function(e,t,s){!function(){"use strict";function e(e){var t=this.constructor;return this.then(function(s){return t.resolve(e()).then(function(){return s})},function(s){return t.resolve(e()).then(function(){return t.reject(s)})})}function t(e){return new this(function(t,s){if(!e||void 0===e.length)return s(new TypeError(typeof e+" "+e+" is not iterable(cannot read property Symbol(Symbol.iterator))"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);var r=i.length;function n(e,s){if(s&&("object"==typeof s||"function"==typeof s)){var a=s.then;if("function"==typeof a)return void a.call(s,function(t){n(e,t)},function(s){i[e]={status:"rejected",reason:s},0==--r&&t(i)})}i[e]={status:"fulfilled",value:s},0==--r&&t(i)}for(var a=0;a{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t}),s.d=((e,t)=>{for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})}),s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=((e,t)=>Object.prototype.hasOwnProperty.call(e,t)),(()=>{"use strict"; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var e=window.SuperMap=window.SuperMap||{};e.Components=window.SuperMap.Components||{}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var t={GEOJSON:"GEOJSON",ISERVER:"ISERVER"},i={ISERVER:"ISERVER",IPORTAL:"IPORTAL",ONLINE:"ONLINE"},r={LINE:"LINE",LINEM:"LINEM",POINT:"POINT",REGION:"REGION",POINTEPS:"POINTEPS",LINEEPS:"LINEEPS",REGIONEPS:"REGIONEPS",ELLIPSE:"ELLIPSE",CIRCLE:"CIRCLE",TEXT:"TEXT",RECTANGLE:"RECTANGLE",UNKNOWN:"UNKNOWN",GEOCOMPOUND:"GEOCOMPOUND"},n={ATTRIBUTE:"ATTRIBUTE",ATTRIBUTEANDGEOMETRY:"ATTRIBUTEANDGEOMETRY",GEOMETRY:"GEOMETRY"},a={CONTAIN:"CONTAIN",CROSS:"CROSS",DISJOINT:"DISJOINT",IDENTITY:"IDENTITY",INTERSECT:"INTERSECT",NONE:"NONE",OVERLAP:"OVERLAP",TOUCH:"TOUCH",WITHIN:"WITHIN"},o={DISTANCE:"DISTANCE",AREA:"AREA"},l={METER:"METER",KILOMETER:"KILOMETER",MILE:"MILE",YARD:"YARD",DEGREE:"DEGREE",MILLIMETER:"MILLIMETER",CENTIMETER:"CENTIMETER",INCH:"INCH",DECIMETER:"DECIMETER",FOOT:"FOOT",SECOND:"SECOND",MINUTE:"MINUTE",RADIAN:"RADIAN"},h={CENTIMETER:"CENTIMETER",DECIMETER:"DECIMETER",FOOT:"FOOT",INCH:"INCH",KILOMETER:"KILOMETER",METER:"METER",MILE:"MILE",MILLIMETER:"MILLIMETER",YARD:"YARD"},u={CAPTION:"CAPTION",CAPTION_PERCENT:"CAPTION_PERCENT",CAPTION_VALUE:"CAPTION_VALUE",PERCENT:"PERCENT",VALUE:"VALUE"},c={AREA:"AREA",BAR:"BAR",BAR3D:"BAR3D",LINE:"LINE",PIE:"PIE",PIE3D:"PIE3D",POINT:"POINT",RING:"RING",ROSE:"ROSE",ROSE3D:"ROSE3D",STACK_BAR:"STACK_BAR",STACK_BAR3D:"STACK_BAR3D",STEP:"STEP"},p={ALL:"ALL",NONE:"NONE",YAXES:"YAXES"},d={CONSTANT:"CONSTANT",LOGARITHM:"LOGARITHM",SQUAREROOT:"SQUAREROOT"},f={CUSTOMINTERVAL:"CUSTOMINTERVAL",EQUALINTERVAL:"EQUALINTERVAL",LOGARITHM:"LOGARITHM",QUANTILE:"QUANTILE",SQUAREROOT:"SQUAREROOT",STDDEVIATION:"STDDEVIATION"},m={BLACK_WHITE:"BLACKWHITE",BLUE_BLACK:"BLUEBLACK",BLUE_RED:"BLUERED",BLUE_WHITE:"BLUEWHITE",CYAN_BLACK:"CYANBLACK",CYAN_BLUE:"CYANBLUE",CYAN_GREEN:"CYANGREEN",CYAN_WHITE:"CYANWHITE",GREEN_BLACK:"GREENBLACK",GREEN_BLUE:"GREENBLUE",GREEN_ORANGE_VIOLET:"GREENORANGEVIOLET",GREEN_RED:"GREENRED",GREEN_WHITE:"GREENWHITE",PINK_BLACK:"PINKBLACK",PINK_BLUE:"PINKBLUE",PINK_RED:"PINKRED",PINK_WHITE:"PINKWHITE",RAIN_BOW:"RAINBOW",RED_BLACK:"REDBLACK",RED_WHITE:"REDWHITE",SPECTRUM:"SPECTRUM",TERRAIN:"TERRAIN",YELLOW_BLACK:"YELLOWBLACK",YELLOW_BLUE:"YELLOWBLUE",YELLOW_GREEN:"YELLOWGREEN",YELLOW_RED:"YELLOWRED",YELLOW_WHITE:"YELLOWWHITE"},y={TOPLEFT:"TOPLEFT",TOPCENTER:"TOPCENTER",TOPRIGHT:"TOPRIGHT",BASELINELEFT:"BASELINELEFT",BASELINECENTER:"BASELINECENTER",BASELINERIGHT:"BASELINERIGHT",BOTTOMLEFT:"BOTTOMLEFT",BOTTOMCENTER:"BOTTOMCENTER",BOTTOMRIGHT:"BOTTOMRIGHT",MIDDLELEFT:"MIDDLELEFT",MIDDLECENTER:"MIDDLECENTER",MIDDLERIGHT:"MIDDLERIGHT"},g={NORMAL:"ALONG_LINE_NORMAL",LB_TO_RT:"LEFT_BOTTOM_TO_RIGHT_TOP",LT_TO_RB:"LEFT_TOP_TO_RIGHT_BOTTOM",RB_TO_LT:"RIGHT_BOTTOM_TO_LEFT_TOP",RT_TO_LB:"RIGHT_TOP_TO_LEFT_BOTTOM"},v={DIAMOND:"DIAMOND",ELLIPSE:"ELLIPSE",MARKER:"MARKER",NONE:"NONE",RECT:"RECT",ROUNDRECT:"ROUNDRECT",TRIANGLE:"TRIANGLE"},S={NEWLINE:"NEWLINE",NONE:"NONE",OMIT:"OMIT"},b={FLAT:"FLAT",ROUND:"ROUND"},x={CLIP:"CLIP",ERASE:"ERASE",IDENTITY:"IDENTITY",INTERSECT:"INTERSECT",UNION:"UNION",UPDATE:"UPDATE",XOR:"XOR"},_={INDEXEDHDFS:"INDEXEDHDFS",UDB:"UDB",MONGODB:"MONGODB",PG:"PG"},C={BSPLINE:"BSPLINE",POLISH:"POLISH"},w={ISOLINE:"ISOLINE",ISOREGION:"ISOREGION"},M={DATASET_AND_RECORDSET:"DATASET_AND_RECORDSET",DATASET_ONLY:"DATASET_ONLY",RECORDSET_ONLY:"RECORDSET_ONLY"},A={ADD:"add",UPDATE:"update",DELETE:"delete"},T={LESS_TIME:"LESS_TIME",LESS_TRANSFER:"LESS_TRANSFER",LESS_WALK:"LESS_WALK",MIN_DISTANCE:"MIN_DISTANCE"},E={BUS:"BUS",SUBWAY:"SUBWAY",NO_SUBWAY:"NO_SUBWAY",NONE:"NONE"},O={EXPONENTIAL:"EXPONENTIAL",GAUSSIAN:"GAUSSIAN",SPHERICAL:"SPHERICAL"},P={EXP1:"EXP1",EXP2:"EXP2"},N={IP:"IP",REFERER:"Referer",REQUESTIP:"RequestIP",NONE:"NONE",SERVER:"SERVER",WEB:"WEB"},I={CLIP:"clip",INTERSECT:"intersect"},F={SQUAREMETER:"SquareMeter",SQUAREKILOMETER:"SquareKiloMeter",HECTARE:"Hectare",ARE:"Are",ACRE:"Acre",SQUAREFOOT:"SquareFoot",SQUAREYARD:"SquareYard",SQUAREMILE:"SquareMile"},D={METER:"Meter",KILOMETER:"Kilometer",YARD:"Yard",FOOT:"Foot",MILE:"Mile"},R={MAX:"max",MIN:"min",AVERAGE:"average",SUM:"sum",VARIANCE:"variance",STDDEVIATION:"stdDeviation"},k={SUMMARYMESH:"SUMMARYMESH",SUMMARYREGION:"SUMMARYREGION"},B={REGIONNOOVERLAP:"REGIONNOOVERLAP",REGIONNOOVERLAPWITH:"REGIONNOOVERLAPWITH",REGIONCONTAINEDBYREGION:"REGIONCONTAINEDBYREGION",REGIONCOVEREDBYREGION:"REGIONCOVEREDBYREGION",LINENOOVERLAP:"LINENOOVERLAP",LINENOOVERLAPWITH:"LINENOOVERLAPWITH",POINTNOIDENTICAL:"POINTNOIDENTICAL"},G={GEOHASH_GRID:"geohash_grid"},U={AVG:"avg",MAX:"max",MIN:"min",SUM:"sum"},j={NDVI:"NDVI",HILLSHADE:"HILLSHADE"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class z{constructor(e,t){this.w=e?parseFloat(e):0,this.h=e?parseFloat(t):0,this.CLASS_NAME="SuperMap.Size"}toString(){return"w="+this.w+",h="+this.h}clone(){return new z(this.w,this.h)}equals(e){var t=!1;return null!=e&&(t=this.w===e.w&&this.h===e.h||isNaN(this.w)&&isNaN(this.h)&&isNaN(e.w)&&isNaN(e.h)),t}destroy(){this.w=null,this.h=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class V{constructor(e,t,s){this.x=e?parseFloat(e):0,this.y=t?parseFloat(t):0,this.mode=s,this.CLASS_NAME="SuperMap.Pixel"}toString(){return"x="+this.x+",y="+this.y}clone(){return new V(this.x,this.y,this.mode)}equals(e){var t=!1;return null!=e&&(t=this.x==e.x&&this.y==e.y||isNaN(this.x)&&isNaN(this.y)&&isNaN(e.x)&&isNaN(e.y)),t}distanceTo(e){return Math.sqrt(Math.pow(this.x-e.x,2)+Math.pow(this.y-e.y,2))}add(e,t){if(null==e||null==t)throw new TypeError("Pixel.add cannot receive null values");return new V(this.x+e,this.y+t)}offset(e){var t=this.clone();return e&&(t=this.add(e.x,e.y)),t}destroy(){this.x=null,this.y=null,this.mode=null}}V.Mode={LeftTop:"lefttop",RightTop:"righttop",RightBottom:"rightbottom",LeftBottom:"leftbottom"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var J=function(...e){class t{constructor(t){for(var s=0;s0&&(s=parseFloat(e.toPrecision(t))),s},format:function(e,t,s,i){t=void 0!==t?t:0,s=void 0!==s?s:H.thousandsSeparator,i=void 0!==i?i:H.decimalSeparator,null!=t&&(e=parseFloat(e.toFixed(t)));var r=e.toString().split(".");1===r.length&&null==t&&(t=0);var n,a=r[0];if(s)for(var o=/(-?[0-9]+)([0-9]{3})/;o.test(a);)a=a.replace(o,"$1"+s+"$2");if(0==t)n=a;else{var l=r.length>1?r[1]:"0";null!=t&&(l+=new Array(t-l.length+1).join("0")),n=a+i+l}return n}};Number.prototype.limitSigDigs||(Number.prototype.limitSigDigs=function(e){return H.limitSigDigs(this,e)});var W={bind:function(e,t){var s=Array.prototype.slice.apply(arguments,[2]);return function(){var i=s.concat(Array.prototype.slice.apply(arguments,[0]));return e.apply(t,i)}},bindAsEventListener:function(e,t){return function(s){return e.call(t,s||window.event)}},False:function(){return!1},True:function(){return!0},Void:function(){}},Y={filter:function(e,t,s){var i=[];if(Array.prototype.filter)i=e.filter(t,s);else{var r=e.length;if("function"!=typeof t)throw new TypeError;for(var n=0;n-1||r.indexOf("trident")>-1&&r.indexOf("rv")>-1?(t="msie",e=r.match(/msie ([\d.]+)/)||r.match(/rv:([\d.]+)/)):r.indexOf("chrome")>-1?(t="chrome",e=r.match(/chrome\/([\d.]+)/)):r.indexOf("firefox")>-1?(t="firefox",e=r.match(/firefox\/([\d.]+)/)):r.indexOf("opera")>-1?(t="opera",e=r.match(/version\/([\d.]+)/)):r.indexOf("safari")>-1&&(t="safari",e=r.match(/version\/([\d.]+)/)),s=e?e[1]:"",r.indexOf("ipad")>-1||r.indexOf("ipod")>-1||r.indexOf("iphone")>-1?i="apple":r.indexOf("android")>-1&&(s=(e=r.match(/version\/([\d.]+)/))?e[1]:"",i="android"),{name:t,version:s,device:i}}(),K=function(){var e=!0,t=X;return document.createElement("canvas").getContext?("firefox"===t.name&&parseFloat(t.version)<5&&(e=!1),"safari"===t.name&&parseFloat(t.version)<4&&(e=!1),"opera"===t.name&&parseFloat(t.version)<10&&(e=!1),"msie"===t.name&&parseFloat(t.version)<9&&(e=!1)):e=!1,e}(),Z=function(){var e=navigator.userAgent.toLowerCase();return-1===e.indexOf("webkit")&&-1!==e.indexOf("gecko")}(),$=96,ee={extend:function(e,t){if(e=e||{},t){for(var s in t){var i=t[s];void 0!==i&&(e[s]=i)}!("function"==typeof window.Event&&t instanceof window.Event)&&t.hasOwnProperty&&t.hasOwnProperty("toString")&&(e.toString=t.toString)}return e},copy:function(e,t){var s;if(e=e||{},t)for(var i in e)void 0!==(s=t[i])&&(e[i]=s)},reset:function(e){for(var t in e=e||{})if(e.hasOwnProperty(t)){if("object"==typeof e[t]&&e[t]instanceof Array){for(var s in e[t])e[t][s].destroy&&e[t][s].destroy();e[t].length=0}else"object"==typeof e[t]&&e[t]instanceof Object&&e[t].destroy&&e[t].destroy();e[t]=null}},getElement:function(){for(var e=[],t=0,s=arguments.length;t=0;s--)e[s]===t&&e.splice(s,1);return e},indexOf:function(e,t){if(null==e)return-1;if("function"==typeof e.indexOf)return e.indexOf(t);for(var s=0,i=e.length;s=0&&parseFloat(o)<1?(e.style.filter="alpha(opacity="+100*o+")",e.style.opacity=o):1===parseFloat(o)&&(e.style.filter="",e.style.opacity="")},applyDefaults:function(e,t){e=e||{};var s="function"==typeof window.Event&&t instanceof window.Event;for(var i in t)(void 0===e[i]||!s&&t.hasOwnProperty&&t.hasOwnProperty(i)&&!e.hasOwnProperty(i))&&(e[i]=t[i]);return!s&&t&&t.hasOwnProperty&&t.hasOwnProperty("toString")&&!e.hasOwnProperty("toString")&&(e.toString=t.toString),e},getParameterString:function(e){var t=[];for(var s in e){var i,r=e[s];if(null!=r&&"function"!=typeof r)i=Array.isArray(r)||"[object Object]"===r.toString()?encodeURIComponent(JSON.stringify(r)):encodeURIComponent(r),t.push(encodeURIComponent(s)+"="+i)}return t.join("&")},urlAppend:function(e,t){var s=e;if(t){0===t.indexOf("?")&&(t=t.substring(1));var i=(e+" ").split(/[?&]/);s+=" "===i.pop()?t:i.length?"&"+t:"?"+t}return s},urlPathAppend:function(e,t){let s=e;if(!t)return s;0===t.indexOf("/")&&(t=t.substring(1));const i=e.split("?");return i[0].indexOf("/",i[0].length-1)<0&&(i[0]+="/"),s=`${i[0]}${t}${i.length>1?`?${i[1]}`:""}`},DEFAULT_PRECISION:14,toFloat:function(e,t){return null==t&&(t=ee.DEFAULT_PRECISION),"number"!=typeof e&&(e=parseFloat(e)),0===t?e:parseFloat(e.toPrecision(t))},rad:function(e){return e*Math.PI/180},getParameters:function(e){e=null===e||void 0===e?window.location.href:e;var t="";if(q.contains(e,"?")){var s=e.indexOf("?")+1,i=q.contains(e,"#")?e.indexOf("#"):e.length;t=e.substring(s,i)}for(var r={},n=t.split(/[&;]/),a=0,o=n.length;a1?1/e:e},getResolutionFromScale:function(e,t){var s;e&&(null==t&&(t="degrees"),s=1/(ee.normalizeScale(e)*te[t]*$));return s},getScaleFromResolution:function(e,t){return null==t&&(t="degrees"),e*te[t]*$},getBrowser:function(){return X},isSupportCanvas:K,supportCanvas:function(){return ee.isSupportCanvas},isInTheSameDomain:function(e){if(!e)return!0;var t=e.indexOf("//"),s=document.location.toString(),i=s.indexOf("//");if(-1===t)return!0;var r,n=r=e.substring(0,t),a=s.substring(i+2);i=a.indexOf("/");var o=a.indexOf(":"),l=a.substring(0,i),h=document.location.protocol;if(-1!==o||(l+=":"+("http:"===h.toLowerCase()?80:443)),h.toLowerCase()!==n.toLowerCase())return!1;var u=(n=e.substring(t+2)).indexOf(":");t=n.indexOf("/");var c,p=n.substring(0,t);return-1!==u?c=n.substring(0,u):(c=n.substring(0,t),p+=":"+("http:"===r.toLowerCase()?80:443)),c===document.domain&&p===l},calculateDpi:function(e,t,s,i,r){if(e&&t&&s){var n,a=e.getWidth(),o=e.getHeight(),l=t.w,h=t.h;if(r=r||6378137,"degree"===(i=i||"degrees").toLowerCase()||"degrees"===i.toLowerCase()||"dd"===i.toLowerCase()){let e=a/l,t=o/h;n=254/(e>t?e:t)/s/(2*Math.PI*r/360)/1e4}else{n=254/(a/l)/s/1e4}return n}},toJSON:function(e){var t=e;if(null==t)return null;switch(t.constructor){case String:return t=(t=(t=(t=(t=(t=(t='"'+t.replace(/(["\\])/g,"\\$1")+'"').replace(/\n/g,"\\n")).replace(/\r/g,"\\r")).replace("<","<")).replace(">",">")).replace(/%/g,"%25")).replace(/&/g,"%26");case Array:for(var s="",i=0,r=t.length;i0?"{"+e.join(",")+"}":"{}"}return t.toString()}},getResolutionFromScaleDpi:function(e,t,s,i){return i=i||6378137,s=s||"",e>0&&t>0?(e=ee.normalizeScale(e),"degree"===s.toLowerCase()||"degrees"===s.toLowerCase()||"dd"===s.toLowerCase()?254/t/e/(2*Math.PI*i/360)/1e4:254/t/e/1e4):-1},getScaleFromResolutionDpi:function(e,t,s,i){return i=i||6378137,s=s||"",e>0&&t>0?"degree"===s.toLowerCase()||"degrees"===s.toLowerCase()||"dd"===s.toLowerCase()?254/t/e/(2*Math.PI*i/360)/1e4:254/t/e/1e4:-1},transformResult:function(e){return e.responseText&&"string"==typeof e.responseText&&(e=JSON.parse(e.responseText)),e},copyAttributes:function(e,t){if(e=e||{},t)for(var s in t){var i=t[s];void 0!==i&&"CLASS_NAME"!==s&&"function"!=typeof i&&(e[s]=i)}return e},copyAttributesWithClip:function(e,t,s){if(e=e||{},t)for(var i in t){var r=!1;if(s&&s.length)for(var n=0,a=s.length;n=0&&n<=1&&r<=1&&n>=0?new Q.Point(e.x+r*(t.x-e.x),e.y+r*(t.y-e.y)):"No Intersection";else if(0==o&&0==l){var u=Math.max(e.y,t.y),c=Math.min(e.y,t.y),p=Math.max(e.x,t.x),d=Math.min(e.x,t.x);a=(s.y>=c&&s.y<=u||i.y>=c&&i.y<=u)&&s.x>=d&&s.x<=p||i.x>=d&&i.x<=p?"Coincident":"Parallel"}else a="Parallel";return a},getTextBounds:function(e,t,s){document.body.appendChild(s),s.style.width="auto",s.style.height="auto",e.fontSize&&(s.style.fontSize=e.fontSize),e.fontFamily&&(s.style.fontFamily=e.fontFamily),e.fontWeight&&(s.style.fontWeight=e.fontWeight),s.style.position="relative",s.style.visibility="hidden",s.style.display="inline-block",s.innerHTML=t;var i=s.clientWidth,r=s.clientHeight;return document.body.removeChild(s),{textWidth:i,textHeight:r}},convertPath:function(e,t){return t?e.replace(/\{([\w-\.]+)\}/g,(e,s)=>{var i;return i=t.hasOwnProperty(s)?function(e){if(void 0==e||null==e)return"";if(e instanceof Date)return e.toJSON();if(function(e){if("string"!=typeof e&&"object"!=typeof e)return!1;try{const t=e.toString();return"[object Object]"===t||"[object Array]"===t}catch(e){return!1}}(e))return JSON.stringify(e);return e.toString()}(t[s]):e,encodeURIComponent(i)}):e}},te={inches:1,ft:12,mi:63360,m:39.3701,km:39370.1,dd:4374754,yd:36};te.in=te.inches,te.degrees=te.dd,te.nmi=1852*te.m;const se=.0254000508001016;ee.extend(te,{Inch:te.inches,Meter:39.37,Foot:12,IFoot:11.999976,ClarkeFoot:11.999868327581488,SearsFoot:11.999955194477684,GoldCoastFoot:11.999964589846002,IInch:.9999979999999999,MicroInch:999998e-9,Mil:9.99998e-7,Centimeter:.3937,Kilometer:39370,Yard:36,SearsYard:35.99986558343306,IndianYard:35.99987015540864,IndianYd37:35.999740205100004,IndianYd62:35.999880755999996,IndianYd75:35.999868945,IndianFoot:11.9999567087,IndianFt37:11.9999134017,IndianFt62:11.999960252000001,IndianFt75:11.999956315,Mile:63360,IYard:35.999928,IMile:63359.87328,NautM:72913.24,"Lat-66":4367838.370169282,"Lat-83":4367954.152606599,Decimeter:3.9370000000000003,Millimeter:.03937,Dekameter:393.7,Decameter:393.7,Hectometer:3937,GermanMeter:39.370535294205006,CaGrid:39.359685060000004,ClarkeChain:791.991309620512,GunterChain:792.0000000000001,BenoitChain:791.9977268035781,SearsChain:791.9970428354235,ClarkeLink:7.91991309620512,GunterLink:7.920000000000001,BenoitLink:7.919977268035781,SearsLink:7.919970428354236,Rod:198.00000000000014,IntnlChain:791.998416,IntnlLink:7.91998416,Perch:198.00000000000014,Pole:198.00000000000014,Furlong:7919.999999999997,Rood:148.75036777426,CapeFoot:11.999868185255002,Brealey:14763.75,ModAmFt:12.000458400000001,Fathom:71.999856,"NautM-UK":72959.85408,"50kilometers":1968500,"150kilometers":5905500}),ee.extend(te,{mm:te.Meter/1e3,cm:te.Meter/100,dm:100*te.Meter,km:1e3*te.Meter,kmi:te.nmi,fath:te.Fathom,ch:te.IntnlChain,link:te.IntnlLink,"us-in":te.inches,"us-ft":te.Foot,"us-yd":te.Yard,"us-ch":te.GunterChain,"us-mi":te.Mile,"ind-yd":te.IndianYd37,"ind-ft":te.IndianFt37,"ind-ch":791.9942845122}),te.degree=te.dd,te.meter=te.m,te.foot=te.ft,te.inch=te.inches,te.mile=te.mi,te.kilometer=te.km,te.yard=te.yd; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ie{constructor(e,t){ee.isArray(e)&&(t=e[1],e=e[0]),this.lon=e?ee.toFloat(e):0,this.lat=t?ee.toFloat(t):0,this.CLASS_NAME="SuperMap.LonLat"}toString(){return"lon="+this.lon+",lat="+this.lat}toShortString(){return this.lon+","+this.lat}clone(){return new ie(this.lon,this.lat)}add(e,t){if(null==e||null==t)throw new TypeError("LonLat.add cannot receive null values");return new ie(this.lon+ee.toFloat(e),this.lat+ee.toFloat(t))}equals(e){var t=!1;return null!=e&&(t=this.lon===e.lon&&this.lat===e.lat||isNaN(this.lon)&&isNaN(this.lat)&&isNaN(e.lon)&&isNaN(e.lat)),t}wrapDateLine(e){var t=this.clone();if(e){for(;t.lone.right;)t.lon-=e.getWidth()}return t}destroy(){this.lon=null,this.lat=null}static fromString(e){var t=e.split(",");return new ie(t[0],t[1])}static fromArray(e){var t=ee.isArray(e),s=t&&e[0],i=t&&e[1];return new ie(s,i)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class re{constructor(e,t,s,i){ee.isArray(e)&&(i=e[3],s=e[2],t=e[1],e=e[0]),this.left=null!=e?ee.toFloat(e):this.left,this.bottom=null!=t?ee.toFloat(t):this.bottom,this.right=null!=s?ee.toFloat(s):this.right,this.top=null!=i?ee.toFloat(i):this.top,this.centerLonLat=null,this.CLASS_NAME="SuperMap.Bounds"}clone(){return new re(this.left,this.bottom,this.right,this.top)}equals(e){var t=!1;return null!=e&&(t=this.left===e.left&&this.right===e.right&&this.top===e.top&&this.bottom===e.bottom),t}toString(){return[this.left,this.bottom,this.right,this.top].join(",")}toArray(e){return!0===e?[this.bottom,this.left,this.top,this.right]:[this.left,this.bottom,this.right,this.top]}toBBOX(e,t){null==e&&(e=6);var s=Math.pow(10,e),i=Math.round(this.left*s)/s,r=Math.round(this.bottom*s)/s,n=Math.round(this.right*s)/s,a=Math.round(this.top*s)/s;return!0===t?r+","+i+","+a+","+n:i+","+r+","+n+","+a}getWidth(){return this.right-this.left}getHeight(){return this.top-this.bottom}getSize(){return new z(this.getWidth(),this.getHeight())}getCenterPixel(){return new V((this.left+this.right)/2,(this.bottom+this.top)/2)}getCenterLonLat(){return this.centerLonLat||(this.centerLonLat=new ie((this.left+this.right)/2,(this.bottom+this.top)/2)),this.centerLonLat}scale(e,t){var s,i;e=e||1,null==t&&(t=this.getCenterLonLat()),"SuperMap.LonLat"===t.CLASS_NAME?(s=t.lon,i=t.lat):(s=t.x,i=t.y);var r=(this.left-s)*e+s,n=(this.bottom-i)*e+i,a=(this.right-s)*e+s,o=(this.top-i)*e+i;return new re(r,n,a,o)}add(e,t){if(null==e||null==t)throw new TypeError("Bounds.add cannot receive null values");return new re(this.left+e,this.bottom+t,this.right+e,this.top+t)}extend(e){var t=null;if(e){switch(e.CLASS_NAME){case"SuperMap.LonLat":t=new re(e.lon,e.lat,e.lon,e.lat);break;case"SuperMap.Geometry.Point":t=new re(e.x,e.y,e.x,e.y);break;case"SuperMap.Bounds":t=e}t&&(this.centerLonLat=null,(null==this.left||t.leftthis.right)&&(this.right=t.right),(null==this.top||t.top>this.top)&&(this.top=t.top))}}containsLonLat(e,t){"boolean"==typeof t&&(t={inclusive:t}),t=t||{};var s=this.contains(e.lon,e.lat,t.inclusive),i=t.worldBounds;if(i&&!s){var r=i.getWidth(),n=(i.left+i.right)/2,a=Math.round((e.lon-n)/r);s=this.containsLonLat({lon:e.lon-a*r,lat:e.lat},{inclusive:t.inclusive})}return s}containsPixel(e,t){return this.contains(e.x,e.y,t)}contains(e,t,s){if(null==s&&(s=!0),null==e||null==t)return!1;return s?e>=this.left&&e<=this.right&&t>=this.bottom&&t<=this.top:e>this.left&&ethis.bottom&&t=s.bottom&&e.bottom<=s.top||s.bottom>=e.bottom&&s.bottom<=e.top,a=e.top>=s.bottom&&e.top<=s.top||s.top>e.bottom&&s.top=s.left&&e.left<=s.right||s.left>=e.left&&s.left<=e.right,l=e.right>=s.left&&e.right<=s.right||s.right>=e.left&&s.right<=e.right;i=(n||a)&&(o||l)}if(t.worldBounds&&!i){var h=t.worldBounds,u=h.getWidth(),c=!h.containsBounds(s),p=!h.containsBounds(e);c&&!p?(e=e.add(-u,0),i=s.intersectsBounds(e,{inclusive:t.inclusive})):p&&!c&&(s=s.add(-u,0),i=e.intersectsBounds(s,{inclusive:t.inclusive}))}return i}containsBounds(e,t,s){null==t&&(t=!1),null==s&&(s=!0);var i=this.contains(e.left,e.bottom,s),r=this.contains(e.right,e.bottom,s),n=this.contains(e.left,e.top,s),a=this.contains(e.right,e.top,s);return t?i||r||n||a:i&&r&&n&&a}determineQuadrant(e){var t="",s=this.getCenterLonLat();return t+=e.lat=e.right&&r.right>e.right;)r=r.add(-n,0);var a=r.left+s;ae.left&&r.right-i>e.right&&(r=r.add(-n,0))}return r}toServerJSONObject(){return{rightTop:{x:this.right,y:this.top},leftBottom:{x:this.left,y:this.bottom},left:this.left,right:this.right,top:this.top,bottom:this.bottom}}destroy(){this.left=null,this.right=null,this.top=null,this.bottom=null,this.centerLonLat=null}static fromString(e,t){var s=e.split(",");return re.fromArray(s,t)}static fromArray(e,t){return!0===t?new re(e[1],e[0],e[3],e[2]):new re(e[0],e[1],e[2],e[3])}static fromSize(e){return new re(0,e.h,e.w,0)}static oppositeQuadrant(e){var t="";return t+="t"===e.charAt(0)?"b":"t",t+="l"===e.charAt(1)?"r":"l"}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ne extends Q{constructor(e){super(),this.components=[],this.componentTypes=null,null!=e&&this.addComponents(e),this.CLASS_NAME="SuperMap.Geometry.Collection",this.geometryType="Collection"}destroy(){this.components.length=0,this.components=null,super.destroy()}clone(){for(var e=new ne,t=0,s=this.components.length;t-1)){if(null!=t&&t=0;--s)t=this.removeComponent(e[s])||t;return t}removeComponent(e){return ee.removeItem(this.components,e),this.clearBounds(),!0}getArea(){for(var e=0,t=0,s=this.components.length;t2;return t&&super.removeComponent.apply(this,arguments),t}getSortedSegments(){for(var e,t,s=this.components.length-1,i=new Array(s),r=0;r=1?1:g)<=-1?-1:g,u=180*Math.acos(g)/Math.PI,a=(u=r.x==s.x?t.x>s.x&&i.x>s.x||t.xp*t.x+d&&i.y>p*i.x+d||t.ys.y?i.xs.x&&(o=!1):r.xp*i.x+d&&(o=!1):r.x>s.x?i.y>s.y&&(o=!1):i.y=0?180*Math.atan(v)/Math.PI:Math.abs(180*Math.atan(v)/Math.PI)+90,b=Math.abs(t.y);s.y==b&&b==r.y&&s.x=0?v>=0?h+=l:h=180-(h-90)+l:h=v>0?h-180+l:90-h+l:x>=0?v>=0?h-=l:h=180-(h-90)-l:h=v>=0?h-180-l:90-h-l,h=h*Math.PI/180;var C=t.x+n*Math.cos(h),w=t.y+n*Math.sin(h);c.push(new le(C,w))}c.push(r)}return c}static createLineEPS(e){var t=[],s=e.length;if(s<2)return e;for(var i=0;i1&&(s=parseFloat(s)*h),i.labelAlign&&"cm"!==i.labelAlign)switch(i.labelAlign){case"lt":l.x+=t/2,l.y+=s/2;break;case"lm":l.x+=t/2;break;case"lb":l.x+=t/2,l.y-=s/2;break;case"ct":l.y+=s/2;break;case"cb":l.y-=s/2;break;case"rt":l.x-=t/2,l.y+=s/2;break;case"rm":l.x-=t/2;break;case"rb":l.x-=t/2,l.y-=s/2}return this.bsInfo.h=s,this.bsInfo.w=t,r=l.x-parseFloat(t)/2,n=l.y+parseFloat(s)/2,o=l.x+parseFloat(t)/2,a=l.y-parseFloat(s)/2,new re(r,n,o,a)}getLabelPxBoundsByText(e,t){var s,i,r,n,a=this.getLabelPxSize(t),o=ee.cloneObject(e);if(t.labelAlign&&"cm"!==t.labelAlign)switch(t.labelAlign){case"lt":o.x+=a.w/2,o.y+=a.h/2;break;case"lm":o.x+=a.w/2;break;case"lb":o.x+=a.w/2,o.y-=a.h/2;break;case"ct":o.y+=a.h/2;break;case"cb":o.y-=a.h/2;break;case"rt":o.x-=a.w/2,o.y+=a.h/2;break;case"rm":o.x-=a.w/2;break;case"rb":o.x-=a.w/2,o.y-=a.h/2}return this.bsInfo.h=a.h,this.bsInfo.w=a.w,s=o.x-a.w/2,i=o.y+a.h/2,n=t.fontStyle&&"italic"===t.fontStyle?o.x+a.w/2+parseInt(parseFloat(t.fontSize)/2):o.x+a.w/2,r=o.y-a.h/2,new re(s,i,n,r)}getLabelPxSize(e){var t,s,i,r,n=parseFloat(e.strokeWidth);t=e.label||this.text,s=e.fontSize?parseFloat(e.fontSize):parseFloat("12px");var a=t.split("\n"),o=a.length;r=o>1?s*o+o+n+.2*s:s+n+.2*s+1,i=0,this.labelWTmp&&i255?s++:i++;return t.cnC=s,t.enC=i,t.textC=e.length,t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ce extends he{constructor(e){super(e),this.componentTypes=["SuperMap.Geometry.Point"],this.CLASS_NAME="SuperMap.Geometry.LinearRing",this.geometryType="LinearRing"}addComponent(e,t){var s=!1,i=this.components.pop();null==t&&e.equals(i)||(s=super.addComponent.apply(this,arguments));var r=this.components[0];return super.addComponent.apply(this,[r]),s}removeComponent(e){var t=this.components&&this.components.length>3;if(t){this.components.pop(),super.removeComponent.apply(this,arguments);var s=this.components[0];super.addComponent.apply(this,[s])}return t}getArea(){var e=0;if(this.components&&this.components.length>2){for(var t=0,s=0,i=this.components.length;s0){e+=Math.abs(this.components[0].getArea());for(var t=1,s=this.components.length;t1},isLeftClick:function(e){return e.which&&1===e.which||e.button&&1===e.button},isRightClick:function(e){return e.which&&3===e.which||e.button&&2===e.button},stop:function(e,t){t||(e.preventDefault?e.preventDefault():e.returnValue=!1),e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},findElement:function(e,t){for(var s=ve.element(e);s.parentNode&&(!s.tagName||s.tagName.toUpperCase()!=t.toUpperCase());)s=s.parentNode;return s},observe:function(e,t,s,i){var r=ee.getElement(e);if(i=i||!1,"keypress"===t&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||r.attachEvent)&&(t="keydown"),this.observers||(this.observers={}),!r._eventCacheID){var n="eventCacheID_";r.id&&(n=r.id+"_"+n),r._eventCacheID=ee.createUniqueID(n)}var a=r._eventCacheID;this.observers[a]||(this.observers[a]=[]),this.observers[a].push({element:r,name:t,observer:s,useCapture:i}),r.addEventListener?"mousewheel"===t?r.addEventListener(t,s,{useCapture:i,passive:!1}):r.addEventListener(t,s,i):r.attachEvent&&r.attachEvent("on"+t,s)},stopObservingElement:function(e){var t=ee.getElement(e)._eventCacheID;this._removeElementObservers(ve.observers[t])},_removeElementObservers:function(e){if(e)for(var t=e.length-1;t>=0;t--){var s=e[t],i=new Array(s.element,s.name,s.observer,s.useCapture);ve.stopObserving.apply(this,i)}},stopObserving:function(e,t,s,i){i=i||!1;var r=ee.getElement(e),n=r._eventCacheID;"keypress"===t&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||r.detachEvent)&&(t="keydown");var a=!1,o=ve.observers[n];if(o)for(var l=0;!a&&l0&&s.push(","),s.push(this.writeNewline(),this.writeIndent(),t));return this.level-=1,s.push(this.writeNewline(),this.writeIndent(),"]"),s.join("")},string:function(e){var t={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return/["\\\x00-\x1f]/.test(e)?'"'+e.replace(/([\x00-\x1f\\"])/g,function(e,s){var i=t[s];return i||(i=s.charCodeAt(),"\\u00"+Math.floor(i/16).toString(16)+(i%16).toString(16))})+'"':'"'+e+'"'},number:function(e){return isFinite(e)?String(e):"null"},boolean:function(e){return String(e)},date:function(e){function t(e){return e<10?"0"+e:e}return'"'+e.getFullYear()+"-"+t(e.getMonth()+1)+"-"+t(e.getDate())+"T"+t(e.getHours())+":"+t(e.getMinutes())+":"+t(e.getSeconds())+'"'}}}read(e,t){var s;if(this.nativeJSON)try{s=JSON.parse(e,t)}catch(e){}return this.keepData&&(this.data=s),s}write(e,t){this.pretty=!!t;var s=null,i=typeof e;if(this.serialize[i])try{s=!this.pretty&&this.nativeJSON?JSON.stringify(e):this.serialize[i].apply(this,[e])}catch(e){}return s}writeIndent(){var e=[];if(this.pretty)for(var t=0;t0){e+='"points":[';for(var s=0,i=this.components.length;s0))return null;for(var n=0,a=0,o=[];n0){if(1===s)return new le(t[0].x,t[0].y);var i=[];for(let e=0;e0){if(1===s){let s=[];for(let i=0;i0){if(1===o){for(e=0,s=[];e=0;t--)if(p[e]=-1,h[t].containsBounds(h[e])){u[e]=-1*u[t],u[e]<0&&(p[e]=t);break}for(let e=0;e0?r.push(l[e]):(r[p[e]].components=r[p[e]].components.concat(l[e].components),r.push(""))}else{r=new Array;for(let e=0;e0&&r.length>0&&(r[r.length-1].components=r[r.length-1].components.concat(a),a=[]),r.push(l[e])),e==i-1){var d=r.length;if(d)r[d-1].components=r[d-1].components.concat(a);else for(let e=0,t=a.length;e=0;t--)if(f[e]=-1,c[t].containsBounds(c[e])){p[e]=-1*p[t],p[e]<0&&(f[e]=t);break}for(let e=0;e0?n.push(u[e]):(n[f[e]].components=n[f[e]].components.concat(u[e].components),n.push(""))}else{n=new Array;for(let e=0;e0&&n.length>0&&(n[n.length-1].components=n[n.length-1].components.concat(l),l=[]),n.push(u[e])),e==i-1){var m=n.length;if(m)n[m-1].components=n[m-1].components.concat(l);else for(let e=0,t=l.length;ee[n]){var a=e[n];e[n]=e[r],e[r]=a;var o=t[n];if(t[n]=t[r],t[r]=o,s&&s.length>0){var l=s[n];s[n]=s[r],s[r]=l}if(i&&i.length>0){var h=i[n];i[n]=i[r],i[r]=h}}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Oe extends we{constructor(e){super(e),this.ignoreExtraDims=!0,this.CLASS_NAME="SuperMap.Format.GeoJSON",this.parseCoords={point:function(e){if(!1===this.ignoreExtraDims&&2!=e.length)throw"Only 2D points are supported: "+e;return new le(e[0],e[1])},multipoint:function(e){for(var t=[],s=null,i=0,r=e.length;ithis._toiSevrerFeature(e)):this._toiSevrerFeature(i)}toGeoJSON(e){var t={type:null};if(ee.isArray(e)){t.type="FeatureCollection";var s=e.length;t.features=new Array(s);for(var i=0;i-1||(t[i]=e[i]);return t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Pe{constructor(e){var t=this;e=e||{},this.speed=e.speed&&e.speed>=0?e.speed:1,this.frequency=e.speed&&e.frequency>=0?e.frequency:1e3,this.startTime=e.startTime&&null!=e.startTime?e.startTime:0,this.endTime=e.endTime&&null!=e.endTime&&e.endTime>=t.startTime?e.endTime:+new Date,this.repeat=void 0===e.repeat||e.repeat,this.reverse=void 0!==e.reverse&&e.reverse,this.currentTime=null,this.oldTime=null,this.running=!1,this.EVENT_TYPES=["start","pause","stop"],t.events=new Se(this,null,this.EVENT_TYPES),t.speed=Number(t.speed),t.frequency=Number(t.frequency),t.startTime=Number(t.startTime),t.endTime=Number(t.endTime),t.startTime=Date.parse(new Date(t.startTime)),t.endTime=Date.parse(new Date(t.endTime)),t.currentTime=t.startTime,this.CLASS_NAME="SuperMap.TimeControlBase"}updateOptions(e){var t=this;(e=e||{}).speed&&e.speed>=0&&(t.speed=e.speed,t.speed=Number(t.speed)),e.speed&&e.frequency>=0&&(t.frequency=e.frequency,t.frequency=Number(t.frequency)),e.startTime&&null!=e.startTime&&(t.startTime=e.startTime,t.startTime=Date.parse(new Date(t.startTime))),e.endTime&&null!=e.endTime&&e.endTime>=t.startTime&&(t.endTime=e.endTime,t.endTime=Date.parse(new Date(t.endTime))),null!=e.repeat&&(t.repeat=e.repeat),null!=e.reverse&&(t.reverse=e.reverse)}start(){var e=this;e.running||(e.running=!0,e.tick(),e.events.triggerEvent("start",e.currentTime))}pause(){this.running=!1,this.events.triggerEvent("pause",this.currentTime)}stop(){var e=this;e.currentTime=e.startTime,e.running&&(e.running=!1),e.events.triggerEvent("stop",e.currentTime)}toggle(){this.running?this.pause():this.start()}setSpeed(e){return e>=0&&(this.speed=e,!0)}getSpeed(){return this.speed}setFrequency(e){return e>=0&&(this.frequency=e,!0)}getFrequency(){return this.frequency}setStartTime(e){var t=this;return!((e=Date.parse(new Date(e)))>t.endTime)&&(t.startTime=e,t.currentTime=t.endTime&&(t.currentTime=t.startTime,t.tick()),!0)}getEndTime(){return this.endTime}setCurrentTime(e){var t=this;return t.currentTime=Date.parse(new Date(t.currentTime)),e>=t.startTime&&e<=t.endTime&&(t.currentTime=e,t.startTime=t.currentTime,t.tick(),!0)}getCurrentTime(){return this.currentTime}setRepeat(e){this.repeat=e}getRepeat(){return this.repeat}setReverse(e){this.reverse=e}getReverse(){return this.reverse}getRunning(){return this.running}destroy(){var e=this;e.speed=null,e.frequency=null,e.startTime=null,e.endTime=null,e.currentTime=null,e.repeat=null,e.running=!1,e.reverse=null}tick(){}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +s(107),s(693);var Ne=s(144),Ie=s.n(Ne); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +let Fe=window.fetch;var De,Re,ke={limitLength:1500,queryKeys:[],queryValues:[],supermap_callbacks:{},addQueryStrings:function(e){for(var t in e){this.queryKeys.push(t),"string"!=typeof e[t]&&(e[t]=ee.toJSON(e[t]));var s=encodeURIComponent(e[t]);this.queryValues.push(s)}},issue:function(e){for(var t=this,s=t.getUid(),i=e.url,r=[],n=new Promise(function(e){t.supermap_callbacks[s]=function(i){delete t.supermap_callbacks[s],e(i)}}),a=i,o=0,l=t.queryKeys?t.queryKeys.length:0,h=0;h=t.limitLength){if(0==o)return!1;r.push(a),a=i,o=0,h--}else if(a.length+t.queryKeys[h].length+2+t.queryValues[h].length>t.limitLength)for(var u=t.queryValues[h];u.length>0;){var c=t.limitLength-a.length-t.queryKeys[h].length-2;a.indexOf("?")>-1?a+="&":a+="?";var p=u.substring(0,c);"%"===p.substring(c-1,c)?(c-=1,p=u.substring(0,c)):"%"===p.substring(c-2,c-1)&&(c-=2,p=u.substring(0,c)),a+=t.queryKeys[h]+"="+p,u=u.substring(c),p.length>0&&(r.push(a),a=i,o=0)}else o++,a.indexOf("?")>-1?a+="&":a+="?",a+=t.queryKeys[h]+"="+t.queryValues[h];return r.push(a),t.send(r,"RequestJSONPPromise.supermap_callbacks["+s+"]",e&&e.proxy),n},getUid:function(){return 1e3*(new Date).getTime()+Math.floor(1e17*Math.random())},send:function(e,t,s){var i=e.length;if(i>0)for(var r=(new Date).getTime(),n=0;n-1?a+="&":a+="?",a+="sectionCount="+i,a+="§ionIndex="+n,a+="&jsonpUserID="+r,s&&(a=decodeURIComponent(a),a=s+encodeURIComponent(a)),Ie()(a,{jsonpCallbackFunction:t,timeout:3e4})}},GET:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings(e.params),this.issue(e)},POST:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)},PUT:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)},DELETE:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)}},Be=function(){return void 0!=De?De:window.XMLHttpRequest&&"withCredentials"in new window.XMLHttpRequest},Ge=function(){return Re||45e3},Ue={commit:function(e,t,s,i){switch(e=e?e.toUpperCase():e){case"GET":return this.get(t,s,i);case"POST":return this.post(t,s,i);case"PUT":return this.put(t,s,i);case"DELETE":return this.delete(t,s,i);default:return this.get(t,s,i)}},supportDirectRequest:function(e,t){return!!ee.isInTheSameDomain(e)||(void 0!=t.crossOrigin?t.crossOrigin:Be()||t.proxy)},get:function(e,t,s){s=s||{};if(e=ee.urlAppend(e,this._getParameterString(t||{})),e=this._processUrl(e,s),!this.supportDirectRequest(e,s)){var i={url:e=e.replace(".json",".jsonp"),data:t};return ke.GET(i)}return this.urlIsLong(e)?this._postSimulatie("GET",e.substring(0,e.indexOf("?")-1),t,s):this._fetch(e,t,s,"GET")},delete:function(e,t,s){s=s||{};if(e=ee.urlAppend(e,this._getParameterString(t||{})),e=this._processUrl(e,s),!this.supportDirectRequest(e,s)){e=e.replace(".json",".jsonp");var i={url:e+="&_method=DELETE",data:t};return ke.DELETE(i)}return this.urlIsLong(e)?this._postSimulatie("DELETE",e.substring(0,e.indexOf("?")-1),t,s):this._fetch(e,t,s,"DELETE")},post:function(e,t,s){if(s=s||{},!this.supportDirectRequest(e,s)){e=e.replace(".json",".jsonp");var i={url:e+="&_method=POST",data:t};return ke.POST(i)}return this._fetch(this._processUrl(e,s),t,s,"POST")},put:function(e,t,s){if(s=s||{},e=this._processUrl(e,s),!this.supportDirectRequest(e,s)){e=e.replace(".json",".jsonp");var i={url:e+="&_method=PUT",data:t};return ke.PUT(i)}return this._fetch(e,t,s,"PUT")},urlIsLong:function(e){for(var t=0,s=null,i=0,r=e.length;i-1?"&":"?")+"_method="+e,"string"!=typeof s&&(s=JSON.stringify(s)),this.post(t,s,i)},_processUrl:function(e,t){if(this._isMVTRequest(e))return e;if(-1===e.indexOf(".json")&&!t.withoutFormatSuffix)if(e.indexOf("?")<0)e+=".json";else{var s=e.split("?");2===s.length&&(e=s[0]+".json?"+s[1])}return t&&t.proxy&&("function"==typeof t.proxy?e=t.proxy(e):(e=decodeURIComponent(e),e=t.proxy+encodeURIComponent(e))),e},_fetch:function(e,t,s,i){return(s=s||{}).headers=s.headers||{},s.headers["Content-Type"]||FormData.prototype.isPrototypeOf(t)||(s.headers["Content-Type"]="application/x-www-form-urlencoded;charset=UTF-8"),s.timeout?this._timeout(s.timeout,Fe(e,{method:i,headers:s.headers,body:"PUT"===i||"POST"===i?t:void 0,credentials:this._getWithCredentials(s),mode:"cors",timeout:Ge()}).then(function(e){return e})):Fe(e,{method:i,body:"PUT"===i||"POST"===i?t:void 0,headers:s.headers,credentials:this._getWithCredentials(s),mode:"cors",timeout:Ge()}).then(function(e){return e})},_getWithCredentials:function(e){return!0===e.withCredentials?"include":!1===e.withCredentials?"omit":"same-origin"},_fetchJsonp:function(e,t){return t=t||{},Ie()(e,{method:"GET",timeout:t.timeout}).then(function(e){return e})},_timeout:function(e,t){return new Promise(function(s,i){setTimeout(function(){i(new Error("timeout"))},e),t.then(s,i)})},_getParameterString:function(e){var t=[];for(var s in e){var i,r=e[s];if(null!=r&&"function"!=typeof r)i=Array.isArray(r)||"[object Object]"===r.toString()?encodeURIComponent(JSON.stringify(r)):encodeURIComponent(r),t.push(encodeURIComponent(s)+"="+i)}return t.join("&")},_isMVTRequest:function(e){return e.indexOf(".mvt")>-1||e.indexOf(".pbf")>-1}}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class je{static generateToken(e,t){var s=this.servers[e];if(s)return Ue.post(s.tokenServiceUrl,JSON.stringify(t.toJSON())).then(function(e){return e.text()})}static registerServers(e){this.servers=this.servers||{},ee.isArray(e)||(e=[e]);for(var t=0;t0?(t.totalTimes--,t.ajaxPolling()):t._processFailed(e)}ajaxPolling(){let e=this,t=e.options.url,s=/^http:\/\/([a-z]{9}|(\d+\.){3}\d+):\d{0,4}/;e.index=parseInt(Math.random()*e.length),e.url=e.urls[e.index],t=t.replace(s,s.exec(e.url)[0]),e.options.url=t,e.options.isInTheSameDomain=ee.isInTheSameDomain(t),e._commit(e.options)}calculatePollingTimes(){let e=this;e.times?e.totalTimes>e.POLLING_TIMES?e.times>e.POLLING_TIMES?e.totalTimes=e.POLLING_TIMES:e.totalTimes=e.times:e.timese.POLLING_TIMES&&(e.totalTimes=e.POLLING_TIMES),e.totalTimes--}isServiceSupportPolling(){return!("SuperMap.REST.ThemeService"===this.CLASS_NAME||"SuperMap.REST.EditFeaturesService"===this.CLASS_NAME)}serviceProcessCompleted(e){e=ee.transformResult(e),this.events.triggerEvent("processCompleted",{result:e})}serviceProcessFailed(e){let t=(e=ee.transformResult(e)).error||e;this.events.triggerEvent("processFailed",{error:t})}_commit(e){if("POST"===e.method||"PUT"===e.method||"PATCH"===e.method)if(e.params&&(e.url=ee.urlAppend(e.url,ee.getParameterString(e.params||{}))),"object"==typeof e.data)try{e.params=ee.toJSON(e.data)}catch(e){console.log("不是json对象")}else e.params=e.data;Ue.commit(e.method,e.url,e.params,{headers:e.headers,withCredentials:e.withCredentials,crossOrigin:e.crossOrigin,timeout:e.async?0:null,proxy:e.proxy}).then(function(e){return e.text?e.text():e.json?e.json():e}).then(function(e){let t=e;return"string"==typeof e&&(t=(new we).read(e)),(!t||t.error||t.code>=300&&304!==t.code)&&(t=t&&t.error?{error:t.error}:{error:t}),t}).catch(function(e){return{error:e}}).then(t=>{t.error?(e.scope?W.bind(e.failure,e.scope):e.failure)(t):(t.succeed=void 0==t.succeed||t.succeed,(e.scope?W.bind(e.success,e.scope):e.success)(t))})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class st{constructor(e){e.filters&&"string"==typeof e.filters&&(e.filters=e.filters.split(",")),this.address=null,this.fromIndex=null,this.toIndex=null,this.filters=null,this.prjCoordSys=null,this.maxReturn=null,ee.extend(this,e)}destroy(){this.address=null,this.fromIndex=null,this.toIndex=null,this.filters=null,this.prjCoordSys=null,this.maxReturn=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class it{constructor(e){e.filters&&(e.filters=e.filters.split(",")),this.x=null,this.y=null,this.fromIndex=null,this.toIndex=null,this.filters=null,this.prjCoordSys=null,this.maxReturn=null,this.geoDecodingRadius=null,ee.extend(this,e)}destroy(){this.x=null,this.y=null,this.fromIndex=null,this.toIndex=null,this.filters=null,this.prjCoordSys=null,this.maxReturn=null,this.geoDecodingRadius=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class rt extends tt{constructor(e,t){super(e,t),this.options=t||{},this.CLASS_NAME="SuperMap.AddressMatchService"}destroy(){super.destroy()}code(e,t){t instanceof st&&this.processAsync(e,t)}decode(e,t){t instanceof it&&this.processAsync(e,t)}processAsync(e,t){this.request({method:"GET",url:e,params:t,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}serviceProcessCompleted(e){e.succeed&&delete e.succeed,super.serviceProcessCompleted(e)}serviceProcessFailed(e){super.serviceProcessFailed(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class nt{constructor(e){this.aggName=null,this.aggFieldName=null,this.CLASS_NAME="SuperMap.AggregationParameter",ee.extend(this,e)}destroy(){this.aggName=null,this.aggFieldName=null,this.aggType=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class at extends nt{constructor(e){super(),this.subAggs=null,this.aggType=null,this.CLASS_NAME="SuperMap.BucketAggParameter",ee.extend(this,e)}destroy(){this.subAggs&&(this.subAggs=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ot{constructor(e){this.dataset=null,this.targetDatasourceName=null,this.totalGridName=null,this.diffuseDatasetGridName=null,this.durationDatasetGridName=null,this.directDatasetGridName=null,this.latitude=null,this.timeMode="MULTIDAYS",this.dayStart=null,this.dayEnd=null,this.hourStart=null,this.hourEnd=null,this.transmittance=null,this.hourInterval=null,this.dayInterval=null,this.deleteExistResultDataset=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.AreaSolarRadiationParameters"}destroy(){var e=this;e.dataset=null,e.zFactor=1,e.averageCurvatureName=null,e.profileCurvatureName=null,e.planCurvatureName=null,e.deleteExistResultDataset=!0}static toObject(e,t){var s={};for(var i in e){if("dataset"!==i)"latitude"===i||"timeMode"===i||"dayStart"===i||("dayEnd"===i||"hourStart"===i||"hourEnd"===i)||("transmittance"===i||"hourInterval"===i||"dayInterval"===i)?s[i]=e[i]:t[i]=e[i]}t.parameter=s}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class lt extends tt{constructor(e,s){super(e,s),this.format=t.GEOJSON,this.CLASS_NAME="SuperMap.SpatialAnalystBase"}destroy(){super.destroy(),this.format=null}serviceProcessCompleted(e){var s,i=this;if((e=ee.transformResult(e))&&i.format===t.GEOJSON&&"function"==typeof i.toGeoJSONResult)if(ee.isArray(e)){for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.numericPrecision=null,e.rangeMode=null,e.rangeCount=null,e.colorGradientType=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class xt{constructor(e){if(this.datasetName="",this.bounds="",this.distance="",this.distanceField="",this.distanceUnit=D.METER,this.dissolveField="",this.output=null,this.mappingParameters=null,!e)return this;ee.extend(this,e),this.CLASS_NAME="SuperMap.BuffersAnalystJobsParameter"}destroy(){this.datasetName=null,this.bounds=null,this.distance=null,this.distanceField=null,this.distanceUnit=null,this.dissolveField=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"output"!==s?(t.analyst=t.analyst||{},"bounds"===s&&e[s]?t.analyst[s]=e[s].toBBOX():t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class _t extends tt{constructor(e,t){(t=t||{}).EVENT_TYPES=["processCompleted","processFailed","processRunning"],super(e,t),this.CLASS_NAME="SuperMap.ProcessingServiceBase"}destroy(){super.destroy()}getJobs(e){var t=this;Ue.get(je.appendCredential(e),null,{proxy:t.proxy}).then(function(e){return e.json()}).then(function(e){t.events.triggerEvent("processCompleted",{result:e})}).catch(function(e){t.eventListeners.processFailed({error:e})})}addJob(e,t,s,i){var r=this,n=null;t&&t instanceof s&&(n=new Object,s.toObject(t,n));let a=Object.assign({"Content-Type":"application/x-www-form-urlencoded"},r.headers||{});var o={proxy:r.proxy,headers:a,withCredentials:r.withCredentials,crossOrigin:r.crossOrigin,isInTheSameDomain:r.isInTheSameDomain};Ue.post(je.appendCredential(e),JSON.stringify(n),o).then(function(e){return e.json()}).then(function(e){e.succeed?r.serviceProcessCompleted(e,i):r.serviceProcessFailed(e)}).catch(function(e){r.serviceProcessFailed({error:e})})}serviceProcessCompleted(e,t){e=ee.transformResult(e),t=t||1e3;var s=this;if(e)var i=setInterval(function(){Ue.get(je.appendCredential(e.newResourceLocation),{_t:(new Date).getTime()}).then(function(e){return e.json()}).then(function(e){s.events.triggerEvent("processRunning",{id:e.id,state:e.state}),"LOST"!==e.state.runState&&"KILLED"!==e.state.runState&&"FAILED"!==e.state.runState||(clearInterval(i),s.events.triggerEvent("processFailed",{error:e.state.errorMsg,state:e.state.runState})),"FINISHED"===e.state.runState&&e.setting.serviceInfo&&(clearInterval(i),s.events.triggerEvent("processCompleted",{result:e}))}).catch(function(e){clearInterval(i),s.events.triggerEvent("processFailed",{error:e})})},t)}serviceProcessFailed(e){super.serviceProcessFailed(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ct extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/buffers"),this.CLASS_NAME="SuperMap.BuffersAnalystJobsService"}destroy(){super.destroy()}getBuffersJobs(){super.getJobs(this.url)}getBuffersJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addBuffersJob(e,t){super.addJob(this.url,e,xt,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class wt{constructor(e){this.sourceNodeIDs=null,this.edgeID=null,this.nodeID=null,this.isUncertainDirectionValid=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.BurstPipelineAnalystParameters"}destroy(){this.sourceNodeIDs=null,this.edgeID=null,this.nodeID=null,this.isUncertainDirectionValid=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Mt extends tt{constructor(e,s){super(e,s),this.format=t.GEOJSON,this.CLASS_NAME="SuperMap.NetworkAnalystServiceBase"}destroy(){super.destroy(),this.format=null}serviceProcessCompleted(e){var s;(e=ee.transformResult(e))&&this.format===t.GEOJSON&&"function"==typeof this.toGeoJSONResult&&(s=this.toGeoJSONResult(e)),s||(s=e),this.events.triggerEvent("processCompleted",{result:s})}toGeoJSONResult(e){return null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class At extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.BurstPipelineAnalystService"}destroy(){super.destroy()}processAsync(e){if(!(e instanceof wt))return null;var t,s=this;if(s.url=ee.urlPathAppend(s.url,"burstAnalyse"),t={sourceNodeIDs:e.sourceNodeIDs,isUncertainDirectionValid:e.isUncertainDirectionValid},null!==e.edgeID&&null!==e.nodeID)throw new Error("edgeID and nodeID cannot be null at the same time.");if(null===e.edgeID&&null===e.nodeID)throw new Error("edgeID and nodeID cannot be null at the same time.");null!==e.edgeID?t.edgeID=e.edgeID:t.nodeID=e.nodeID,s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Tt extends tt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.ChartFeatureInfoSpecsService"}destroy(){super.destroy(),ee.reset(this)}processAsync(){var e=this;e.isTempLayers||ee.urlPathAppend(e.url,"chartFeatureInfoSpecs"),e.request({method:"GET",params:null,scope:e,success:e.serviceProcessCompleted,failure:e.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Et{constructor(e){this.isQueryPoint=null,this.isQueryLine=null,this.isQueryRegion=null,this.attributeFilter=null,this.chartFeatureInfoSpecCode=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.ChartQueryFilterParameter"}destroy(){var e=this;e.isQueryPoint=null,e.isQueryLine=null,e.isQueryRegion=null,e.attributeFilter=null,e.chartFeatureInfoSpecCode=null}toJson(){var e="";return e+='"isQueryPoint":'+this.isQueryPoint+",",e+='"isQueryLine":'+this.isQueryLine+",",e+='"isQueryRegion":'+this.isQueryRegion+",",this.attributeFilter&&(e+='"attributeFilter": "'+this.attributeFilter+'",'),e="{"+(e+='"chartFeatureInfoSpecCode":'+this.chartFeatureInfoSpecCode)+"}"}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Lt{constructor(e){this.queryMode=null,this.bounds=null,this.chartLayerNames=null,this.chartQueryFilterParameters=null,this.returnContent=!0,this.startRecord=0,this.expectCount=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.ChartQueryParameters"}destroy(){var e=this;e.queryMode=null,e.bounds=null,e.chartLayerNames=null,e.chartQueryFilterParameters=null,e.returnContent=!0,e.startRecord=0,e.expectCount=null}getVariablesJson(){var e="";if(e+='"queryMode":"'+this.queryMode+'",',this.chartLayerNames&&this.chartLayerNames.length){for(var t=[],s=this.chartLayerNames.length,i=0;i0&&(s+=","),s+='{"x":'+t[e].x+',"y":'+t[e].y+"}";else if(!0===e)for(let e=0;e0&&(s+=","),s+=t[e];return s+="]"}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class kt extends tt{constructor(e,t){(t=t||{}).EVENT_TYPES=["broadcastSocketConnected","broadcastSocketError","broadcastFailed","broadcastSucceeded","subscribeSocketConnected","subscribeSocketError","messageSucceeded","setFilterParamSucceeded"],super(e,t),this.geometry=null,this.prjCoordSys=null,this.excludeField=null,ee.extend(this,t),this.CLASS_NAME="SuperMap.DataFlowService"}initBroadcast(){var e=this;return this.broadcastWebSocket=this._connect(ee.urlPathAppend(e.url,"broadcast")),this.broadcastWebSocket.onopen=function(t){e.broadcastWebSocket.isOpen=!0,t.eventType="broadcastSocketConnected",e.events.triggerEvent("broadcastSocketConnected",t)},this.broadcastWebSocket.onclose=function(t){e.broadcastWebSocket.isOpen=!1,t.eventType="broadcastSocketConnected",e.events.triggerEvent("broadcastSocketConnected",t)},this.broadcastWebSocket.onerror=function(t){t.eventType="broadcastSocketError",e.events.triggerEvent("broadcastSocketError",t)},this}broadcast(e){this.broadcastWebSocket&&this.broadcastWebSocket.isOpen?(this.broadcastWebSocket.send(JSON.stringify(e)),this.events.triggerEvent("broadcastSucceeded")):this.events.triggerEvent("broadcastFailed")}initSubscribe(){var e=this;return this.subscribeWebSocket=this._connect(ee.urlPathAppend(e.url,"subscribe")),this.subscribeWebSocket.onopen=function(t){e.subscribeWebSocket.send(e._getFilterParams()),t.eventType="subscribeSocketConnected",e.events.triggerEvent("subscribeSocketConnected",t)},this.subscribeWebSocket.onerror=function(t){t.eventType="subscribeSocketError",e.events.triggerEvent("subscribeSocketError",t)},this.subscribeWebSocket.onmessage=function(t){e._onMessage(t)},this}setExcludeField(e){return this.excludeField=e,this.subscribeWebSocket.send(this._getFilterParams()),this}setGeometry(e){return this.geometry=e,this.subscribeWebSocket.send(this._getFilterParams()),this}unSubscribe(){this.subscribeWebSocket&&(this.subscribeWebSocket.close(),this.subscribeWebSocket=null)}unBroadcast(){this.broadcastWebSocket&&(this.broadcastWebSocket.close(),this.broadcastWebSocket=null)}destroy(){tt.prototype.destroy.apply(this,arguments);this.geometry=null,this.prjCoordSys=null,this.excludeField=null,this.unBroadcast(),this.unSubscribe()}_getFilterParams(){var e={filterParam:{prjCoordSys:this.prjCoordSys,excludeField:this.excludeField,geometry:this.geometry}};return ee.toJSON(e)}_onMessage(e){if(e.data&&e.data.indexOf("filterParam")>=0){var t=JSON.parse(e.data);return e.filterParam=t,e.eventType="setFilterParamSucceeded",void this.events.triggerEvent("setFilterParamSucceeded",e)}var s=JSON.parse(e.data);e.featureResult=s,e.eventType="messageSucceeded",this.events.triggerEvent("messageSucceeded",e)}_connect(e){return e=je.appendCredential(e),"WebSocket"in window?new WebSocket(e):"MozWebSocket"in window?new(0,window.MozWebSocket)(e):(console.log("no WebSocket"),null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Bt{constructor(e){e=e||{},this.bounds=null,this.dataSourceName=null,this.description=null,this.encodeType=null,this.isReadOnly=null,this.name=null,this.prjCoordSys=null,this.tableName=null,this.type=null,ee.extend(this,e);var t=this.bounds;t&&(this.bounds=new re(t.leftBottom.x,t.leftBottom.y,t.rightTop.x,t.rightTop.y)),this.CLASS_NAME="SuperMap.DatasetInfo"}destroy(){ee.reset(this)}toServerJSONObject(){var e={};return(e=ee.copyAttributes(e,this)).bounds&&e.bounds.toServerJSONObject&&(e.bounds=e.bounds.toServerJSONObject()),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Gt{constructor(e){this.operation=x.UNION,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.OverlayAnalystParameters"}destroy(){this.operation=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ut extends Gt{constructor(e){super(e),this.operateDataset=null,this.operateDatasetFields=[],this.operateDatasetFilter=new ft,this.operateRegions=[],this.sourceDataset=null,this.sourceDatasetFields=[],this.sourceDatasetFilter=new ft,this.tolerance=0,this.resultSetting=new dt,ee.extend(this,e),this.CLASS_NAME="SuperMap.DatasetOverlayAnalystParameters"}destroy(){super.destroy();var e=this;if(e.operateDataset=null,e.operateDatasetFields=null,e.operateDatasetFilter&&(e.operateDatasetFilter.destroy(),e.operateDatasetFilter=null),e.operateRegions){for(var t=0,s=e.operateRegions,i=s.length;t0&&(s+=","),s+='{"x":'+t[e].x+',"y":'+t[e].y+"}";else if(!0===e)for(let e=0;e0&&(s+=","),s+=t[e];return s+="]"}toGeoJSONResult(e){if(!e||!e.facilityPathList)return e;var t=new Oe;return e.facilityPathList.map(function(e){return e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e}),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ms{constructor(e){this.expectedSupplyCenterCount=null,this.isFromCenter=!1,this.supplyCenters=null,this.turnWeightField=null,this.weightName=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.FindLocationParameters"}destroy(){var e=this;if(e.expectedSupplyCenterCount=null,e.isFromCenter=null,e.turnWeightField=null,e.weightName=null,e.supplyCenters){for(var t=0,s=e.supplyCenters,i=s.length;t0&&(t+=","),t+=ee.toJSON(e[i]);return t+="]"}toGeoJSONResult(e){if(!e)return null;var t=new Oe;return e.demandResults&&(e.demandResults=t.toGeoJSON(e.demandResults)),e.supplyResults&&(e.supplyResults=t.toGeoJSON(e.supplyResults)),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class gs{constructor(e){this.centers=null,this.hasLeastTotalCost=!1,this.isAnalyzeById=!1,this.nodes=null,this.parameter=new Ft,ee.extend(this,e),this.CLASS_NAME="SuperMap.FindMTSPPathsParameters"}destroy(){var e=this;e.centers=null,e.hasLeastTotalCost=null,e.isAnalyzeById=null,e.nodes=null,e.maxWeight=null,e.parameter&&(e.parameter.destroy(),e.parameter=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class vs extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.FindMTSPPathsService"}destroy(){super.destroy()}processAsync(e){if(e instanceof gs){var t,s=this,i=s.getJson(e.isAnalyzeById,e.centers),r=s.getJson(e.isAnalyzeById,e.nodes);s.url=ee.urlPathAppend(s.url,"mtsppath"),t={centers:i,nodes:r,parameter:ee.toJSON(e.parameter),hasLeastTotalCost:e.hasLeastTotalCost},s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJson(e,t){var s="[",i=t?t.length:0;if(!1===e)for(let e=0;e0&&(s+=","),s+='{"x":'+t[e].x+',"y":'+t[e].y+"}";else if(!0===e)for(let e=0;e0&&(s+=","),s+=t[e];return s+="]"}toGeoJSONResult(e){if(!e||!e.pathList)return null;var t=new Oe;return e.pathList.map(function(e){return e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e}),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ss{constructor(e){this.isAnalyzeById=!1,this.hasLeastEdgeCount=null,this.nodes=null,this.parameter=new Ft,ee.extend(this,e),this.CLASS_NAME="SuperMap.FindPathParameters"}destroy(){var e=this;e.isAnalyzeById=null,e.hasLeastEdgeCount=null,e.nodes=null,e.parameter&&(e.parameter.destroy(),e.parameter=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class bs extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.FindPathService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Ss){var t,s=this;s.url=ee.urlPathAppend(s.url,"path"),t={hasLeastEdgeCount:e.hasLeastEdgeCount,parameter:ee.toJSON(e.parameter),nodes:s.getJson(e.isAnalyzeById,e.nodes)},s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJson(e,t){var s="[",i=t?t.length:0;if(!1===e)for(let e=0;e0&&(s+=","),s+='{"x":'+t[e].x+',"y":'+t[e].y+"}";else if(!0===e)for(let e=0;e0&&(s+=","),s+=t[e];return s+="]"}toGeoJSONResult(e){if(!e||!e.pathList||e.pathList.length<1)return null;var t=new Oe;return e.pathList.forEach(function(e){e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures))}),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class xs{constructor(e){this.isAnalyzeById=!1,this.isCenterMutuallyExclusive=!1,this.centers=null,this.isFromCenter=!1,this.weights=null,this.parameter=new Ft,ee.extend(this,e),this.CLASS_NAME="SuperMap.FindServiceAreasParameters"}destroy(){var e=this;e.isAnalyzeById=null,e.isCenterMutuallyExclusive=null,e.centers=null,e.isFromCenter=null,e.weights=null,e.parameter&&(e.parameter.destroy(),e.parameter=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class _s extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.FindServiceAreasService"}destroy(){super.destroy()}processAsync(e){if(e instanceof xs){var t,s=this;s.url=ee.urlPathAppend(s.url,"servicearea"),t={isFromCenter:e.isFromCenter,isCenterMutuallyExclusive:e.isCenterMutuallyExclusive,parameter:ee.toJSON(e.parameter),centers:s.getJson(e.isAnalyzeById,e.centers),weights:s.getJson(!0,e.weights)},s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJson(e,t){var s="[",i=t?t.length:0;if(!1===e)for(let e=0;e0&&(s+=","),s+='{"x":'+t[e].x+',"y":'+t[e].y+"}";else if(!0===e)for(let e=0;e0&&(s+=","),s+=t[e];return s+="]"}toGeoJSONResult(e){if(!e||!e.serviceAreaList)return e;var t=new Oe;return e.serviceAreaList.map(function(e){return e.serviceRegion&&(e.serviceRegion=t.toGeoJSON(e.serviceRegion)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e.routes&&(e.routes=t.toGeoJSON(e.routes)),e}),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Cs{constructor(e){this.endNodeAssigned=!1,this.isAnalyzeById=!1,this.nodes=null,this.parameter=new Ft,ee.extend(this,e),this.CLASS_NAME="SuperMap.FindTSPPathsParameters"}destroy(){var e=this;e.endNodeAssigned=null,e.isAnalyzeById=null,e.nodes=null,e.parameter&&(e.parameter.destroy(),e.parameter=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ws extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.FindTSPPathsService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Cs){var t,s=this;s.url=ee.urlPathAppend(s.url,"tsppath"),t={parameter:ee.toJSON(e.parameter),endNodeAssigned:e.endNodeAssigned,nodes:s.getNodesJson(e)},s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getNodesJson(e){var t,s,i,r,n="";if(!1===e.isAnalyzeById){for(t="[",s=0,i=(r=e.nodes).length;s0&&(t+=","),t+='{"x":'+r[s].x+',"y":'+r[s].y+"}";n+=t+="]"}else if(!0===e.isAnalyzeById){let t="[",s=e.nodes,i=s.length;for(let e=0;e0&&(t+=","),t+=s[e];n+=t+="]"}return n}toGeoJSONResult(e){if(!e||!e.tspPathList)return null;var t=new Oe;return e.tspPathList.forEach(function(e){e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures))}),e}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ms{constructor(e){this.routeTable=null,this.routeIDField=null,this.attributeFilter=null,this.eventTable=null,this.eventRouteIDField=null,this.measureField=null,this.measureStartField=null,this.measureEndField=null,this.measureOffsetField=null,this.errorInfoField=null,this.retainedFields=null,this.dataReturnOption=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.GenerateSpatialDataParameters"}destroy(){var e=this;e.routeTable&&(e.routeTable=null),e.routeIDField=null,e.attributeFilter=null,e.eventTable=null,e.eventRouteIDField=null,e.measureField=null,e.measureStartField=null,e.measureEndField=null,e.measureOffsetField=null,e.errorInfoField=null,e.dataReturnOption&&(e.dataReturnOption.destroy(),e.dataReturnOption=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class As extends lt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GenerateSpatialDataService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Ms){var t,s=this;t=s.getJsonParameters(e),s.request({method:"POST",data:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJsonParameters(e){var t="datasets/"+e.routeTable+"/linearreferencing/generatespatialdata";return this.url=ee.urlPathAppend(this.url,t),this.url=ee.urlAppend(this.url,"returnContent=true"),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ts extends Gt{constructor(e){super(e),e&&e.operateGeometry&&(this.operateGeometry=e.operateGeometry),e&&e.sourceGeometry&&(this.sourceGeometry=e.sourceGeometry),e&&e.operateGeometries&&(this.operateGeometries=e.operateGeometries),e&&e.sourceGeometries&&(this.sourceGeometries=e.sourceGeometries),e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.GeometryOverlayAnalystParameters"}destroy(){super.destroy();var e=this;e.sourceGeometry&&(e.sourceGeometry.destroy(),e.sourceGeometry=null),e.sourceGeometries&&(e.sourceGeometries.destroy(),e.sourceGeometries=null),e.sourceGeometry&&(e.sourceGeometry.destroy(),e.sourceGeometry=null),e.operateGeometries&&(e.operateGeometries.destroy(),e.operateGeometries=null)}static toObject(e,t){for(var s in e)if("sourceGeometry"===s)t.sourceGeometry=Le.fromGeometry(e.sourceGeometry);else if("sourceGeometries"===s){for(var i=[],r=0;r=0;e--)this.points[e].destroy();this.points=null}}static toObject(e,t){for(var s in e)"clipRegion"===s?t.clipRegion=Le.fromGeometry(e.clipRegion):t[s]=e[s]}}class Os extends tt{constructor(e,t){(t=t||{}).EVENT_TYPES=["processCompleted","processFailed","processRunning"],super(e,t),this.CLASS_NAME="SuperMap.GeoprocessingService",this.headers={},this.crossOrigin=!0}getTools(){this._get(`${this.url}/list`)}getTool(e){this._get(`${this.url}/${e}`)}execute(e,t,s){const i={parameter:t=t||null,environment:s=s||null};this._get(`${this.url}/${e}/execute`,i)}submitJob(e,t,s){const i={parameter:t=t||null,environments:s=s||null};this.request({url:`${this.url}/${e}/jobs`,headers:{"Content-type":"application/json"},method:"POST",data:JSON.stringify(i),scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}waitForJobCompletion(e,t,s){const i=this,r=setInterval(function(){i._get(`${i.url}/${t}/jobs/${e}`,null,function(e){const t=e.state.runState;switch(s.statusCallback&&s.statusCallback(t),t){case"FINISHED":clearInterval(r),i.events.triggerEvent("processCompleted",{result:e});break;case"FAILED":case"CANCELED":clearInterval(r),i.events.triggerEvent("processFailed",{result:e})}})},s.interval)}getJobInfo(e,t){this._get(`${this.url}/${e}/jobs/${t}`)}cancelJob(e,t){this._get(`${this.url}/${e}/jobs/${t}/cancel`)}getJobs(e){let t=`${this.url}/jobs`;e&&(t=`${this.url}/${e}/jobs`),this._get(t)}getResults(e,t,s){let i=`${this.url}/${e}/jobs/${t}/results`;s&&(i=`${i}/${s}`),this._get(i)}_get(e,t,s,i){this.request({url:e,method:"GET",params:t,headers:{"Content-type":"application/json"},scope:this,success:s||this.serviceProcessCompleted,failure:i||this.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ps{constructor(e){this.dataset=null,this.sourceFilter=null,this.referenceFilter=null,this.spatialRelationType=null,this.isBorderInside=null,this.returnFeature=null,this.returnGeoRelatedOnly=null,this.startRecord=0,this.expectCount=500,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.GeoRelationAnalystParameters"}destroy(){var e=this;e.sourceFilter&&e.sourceFilter.destroy(),e.sourceFilter=null,e.referenceFilter&&e.referenceFilter.destroy(),e.referenceFilter=null,e.dataset=null,e.spatialRelationType=null,e.isBorderInside=null,e.returnFeature=null,e.returnGeoRelatedOnly=null,e.startRecord=null,e.expectCount=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ns extends lt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GeoRelationAnalystService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Ps){var t=this;t.url=ee.urlPathAppend(t.url,"datasets/"+e.dataset+"/georelation");var s=ee.toJSON(e);t.url=ee.urlAppend(t.url,"returnContent=true"),t.request({method:"POST",data:s,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Is extends tt{constructor(e,t){super(e,t),t&&(this.datasource=null,this.dataset=null,t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.DatasetService")}destroy(){super.destroy();this.datasource=null,this.dataset=null}getDatasetsService(e){var t=this;t.url=ee.urlPathAppend(t.url,`datasources/name/${e}/datasets`),t.request({method:"GET",data:null,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}getDatasetService(e,t){var s=this;s.url=ee.urlPathAppend(s.url,`datasources/name/${e}/datasets/name/${t}`),s.request({method:"GET",data:null,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}setDatasetService(e){if(e){var t=ee.toJSON(e);this.request({method:"PUT",data:t,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}}deleteDatasetService(){this.request({method:"DELETE",data:null,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Fs{constructor(e){this.datasetNames=null,this.targetEpsgCode=null,this.targetPrj=null,this.returnContent=!0,this.fromIndex=0,this.toIndex=19,this.returnCountOnly=!1,this.maxFeatures=null,this.hasGeometry=!0,this.aggregations=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesParametersBase"}destroy(){var e=this;e.datasetNames=null,e.returnContent=null,e.fromIndex=null,e.toIndex=null,e.hasGeometry=null,e.maxFeatures=null,e.targetEpsgCode=null,e.targetPrj=null,e.aggregation&&(e.aggregation=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ds extends Fs{constructor(e){super(e),this.getFeatureMode=Ds.getFeatureMode.BOUNDS,this.bounds=null,this.fields=null,this.attributeFilter=null,this.spatialQueryMode=a.CONTAIN,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesByBoundsParameters"}destroy(){super.destroy();var e=this;if(e.bounds&&(e.bounds.destroy(),e.bounds=null),e.fields){for(;e.fields.length>0;)e.fields.pop();e.fields=null}e.attributeFilter=null,e.spatialQueryMode=null,e.getFeatureMode=null}static toJsonParameters(e){var t,s,i;return s={leftBottom:{x:e.bounds.left,y:e.bounds.bottom},rightTop:{x:e.bounds.right,y:e.bounds.top}},i={datasetNames:e.datasetNames,getFeatureMode:Ds.getFeatureMode.BOUNDS,bounds:s,spatialQueryMode:e.spatialQueryMode},e.fields&&((t=new ft).name=e.datasetNames,t.fields=e.fields,i.queryParameter=t),e.attributeFilter&&(i.attributeFilter=e.attributeFilter,i.getFeatureMode=Ds.getFeatureMode.BOUNDS_ATTRIBUTEFILTER),e.maxFeatures&&!isNaN(e.maxFeatures)&&(i.maxFeatures=e.maxFeatures),"boolean"==typeof e.hasGeometry&&(i.hasGeometry=e.hasGeometry),e.targetEpsgCode&&(i.targetEpsgCode=e.targetEpsgCode),!e.targetEpsgCode&&e.targetPrj&&(i.targetPrj=e.targetPrj),e.aggregations&&(i.aggregations=e.aggregations),ee.toJSON(i)}}Ds.getFeatureMode={BOUNDS:"BOUNDS",BOUNDS_ATTRIBUTEFILTER:"BOUNDS_ATTRIBUTEFILTER"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Rs extends tt{constructor(e,s){super(e,s),s=s||{},this.returnContent=!0,this.fromIndex=0,this.toIndex=19,this.hasGeometry=!0,this.maxFeatures=null,this.format=t.GEOJSON,ee.extend(this,s),this.url=ee.urlPathAppend(this.url,"featureResults"),this.CLASS_NAME="SuperMap.GetFeaturesServiceBase"}destroy(){super.destroy();var e=this;e.returnContent=null,e.fromIndex=null,e.toIndex=null,e.maxFeatures=null,e.format=null,e.hasGeometry=null}processAsync(e){if(e){var t,s=this,i=!0;s.returnContent=e.returnContent,s.fromIndex=e.fromIndex,s.toIndex=e.toIndex,s.maxFeatures=e.maxFeatures,s.hasGeometry=e.hasGeometry,s.returnContent&&(s.url=ee.urlAppend(s.url,"returnContent="+s.returnContent),i=!1),null!=s.fromIndex&&null!=s.toIndex&&!isNaN(s.fromIndex)&&!isNaN(s.toIndex)&&s.fromIndex>=0&&s.toIndex>=0&&!i&&(s.url=ee.urlAppend(s.url,`fromIndex=${s.fromIndex}&toIndex=${s.toIndex}`)),e.returnCountOnly&&(s.url=ee.urlAppend(s.url,"&returnCountOnly="+e.returnContent)),t=s.getJsonParameters(e),s.request({method:"POST",data:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}serviceProcessCompleted(e){if(e=ee.transformResult(e),this.format===t.GEOJSON&&e.features){var s=new Oe;e.features=s.toGeoJSON(e.features)}this.events.triggerEvent("processCompleted",{result:e})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ks extends Rs{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GetFeaturesByBoundsService"}destroy(){super.destroy()}getJsonParameters(e){return Ds.toJsonParameters(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Bs extends Fs{constructor(e){super(e),this.bufferDistance=null,this.attributeFilter=null,this.geometry=null,this.fields=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesByBufferParameters"}destroy(){super.destroy();var e=this;if(e.bufferDistance=null,e.attributeFilter=null,e.fields){for(;e.fields.length>0;)e.fields.pop();e.fields=null}e.geometry&&(e.geometry.destroy(),e.geometry=null)}static toJsonParameters(e){var t,s,i;return i=Le.fromGeometry(e.geometry),s={datasetNames:e.datasetNames,getFeatureMode:"BUFFER",bufferDistance:e.bufferDistance,geometry:i},e.fields&&((t=new ft).name=e.datasetNames,t.fields=e.fields,s.queryParameter=t),e.attributeFilter&&(s.attributeFilter=e.attributeFilter,s.getFeatureMode="BUFFER_ATTRIBUTEFILTER"),e.maxFeatures&&!isNaN(e.maxFeatures)&&(s.maxFeatures=e.maxFeatures),"boolean"==typeof e.hasGeometry&&(s.hasGeometry=e.hasGeometry),e.targetEpsgCode&&(s.targetEpsgCode=e.targetEpsgCode),!e.targetEpsgCode&&e.targetPrj&&(s.targetPrj=e.targetPrj),ee.toJSON(s)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Gs extends Rs{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GetFeaturesByBufferService"}destroy(){super.destroy()}getJsonParameters(e){if(e instanceof Bs)return Bs.toJsonParameters(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Us extends Fs{constructor(e){super(e),this.getFeatureMode="SPATIAL",this.geometry=null,this.fields=null,this.attributeFilter=null,this.spatialQueryMode=a.CONTAIN,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesByGeometryParameters"}destroy(){super.destroy();var e=this;if(e.geometry&&(e.geometry.destroy(),e.geometry=null),e.fields){for(;e.fields.length>0;)e.fields.pop();e.fields=null}e.attributeFilter=null,e.spatialQueryMode=null,e.getFeatureMode=null}static toJsonParameters(e){var t,s,i;return s=Le.fromGeometry(e.geometry),i={datasetNames:e.datasetNames,getFeatureMode:"SPATIAL",geometry:s,spatialQueryMode:e.spatialQueryMode},e.fields&&((t=new ft).name=e.datasetNames,t.fields=e.fields,i.queryParameter=t),e.attributeFilter&&(i.attributeFilter=e.attributeFilter,i.getFeatureMode="SPATIAL_ATTRIBUTEFILTER"),e.maxFeatures&&!isNaN(e.maxFeatures)&&(i.maxFeatures=e.maxFeatures),"boolean"==typeof e.hasGeometry&&(i.hasGeometry=e.hasGeometry),e.targetEpsgCode&&(i.targetEpsgCode=e.targetEpsgCode),!e.targetEpsgCode&&e.targetPrj&&(i.targetPrj=e.targetPrj),e.aggregations&&(i.aggregations=e.aggregations),ee.toJSON(i)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class js extends Rs{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GetFeaturesByGeometryService"}destroy(){super.destroy()}getJsonParameters(e){return Us.toJsonParameters(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class zs extends Fs{constructor(e){super(e),this.getFeatureMode="ID",this.IDs=null,this.fields=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesByIDsParameters"}destroy(){super.destroy();var e=this;if(e.IDs=null,e.getFeatureMode=null,e.fields){for(;e.fields.length>0;)e.fields.pop();e.fields=null}}static toJsonParameters(e){var t,s;return t={datasetNames:e.datasetNames,getFeatureMode:"ID",ids:e.IDs},e.fields&&((s=new ft).name=e.datasetNames,s.fields=e.fields,t.queryParameter=s),e.targetEpsgCode&&(t.targetEpsgCode=e.targetEpsgCode),"boolean"==typeof e.hasGeometry&&(t.hasGeometry=e.hasGeometry),!e.targetEpsgCode&&e.targetPrj&&(t.targetPrj=e.targetPrj),e.aggregations&&(t.aggregations=e.aggregations),ee.toJSON(t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Vs extends Rs{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GetFeaturesByIDsService"}destroy(){super.destroy()}getJsonParameters(e){return zs.toJsonParameters(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Js extends Fs{constructor(e){super(e),this.getFeatureMode="SQL",this.queryParameter=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetFeaturesBySQLParameters"}destroy(){super.destroy();this.getFeatureMode=null,this.queryParameter&&(this.queryParameter.destroy(),this.queryParameter=null)}static toJsonParameters(e){var t={datasetNames:e.datasetNames,getFeatureMode:"SQL",queryParameter:e.queryParameter};return e.maxFeatures&&!isNaN(e.maxFeatures)&&(t.maxFeatures=e.maxFeatures),"boolean"==typeof e.hasGeometry&&(t.hasGeometry=e.hasGeometry),e.aggregations&&(t.aggregations=e.aggregations),e.targetEpsgCode&&(t.targetEpsgCode=e.targetEpsgCode),!e.targetEpsgCode&&e.targetPrj&&(t.targetPrj=e.targetPrj),e.aggregations&&(t.aggregations=e.aggregations),ee.toJSON(t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class qs extends Rs{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.GetFeaturesBySQLService"}destroy(){super.destroy()}getJsonParameters(e){return Js.toJsonParameters(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Hs extends tt{constructor(e,t){super(e,t),this.datasource=null,this.dataset=null,t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.GetFieldsService"}destroy(){super.destroy();this.datasource=null,this.dataset=null}processAsync(){var e=this;e.url=ee.urlPathAppend(e.url,`datasources/${e.datasource}/datasets/${e.dataset}/fields`),e.request({method:"GET",data:null,scope:e,success:e.serviceProcessCompleted,failure:e.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ws{constructor(e){this.datasetName=null,this.dataSourceName=null,this.X=null,this.Y=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.GetGridCellInfosParameters"}destroy(){this.datasetName=null,this.dataSourceName=null,this.X=null,this.Y=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ys extends tt{constructor(e,t){super(e,t),this.datasetName=null,this.dataSourceName=null,this.datasetType=null,this.X=null,this.Y=null,t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.GetGridCellInfosService"}destroy(){super.destroy();var e=this;e.X=null,e.Y=null,e.datasetName=null,e.dataSourceName=null,e.datasetType=null}processAsync(e){if(e instanceof Ws){ee.extend(this,e);var t=this;t.url=ee.urlPathAppend(t.url,`datasources/${t.dataSourceName}/datasets/${t.datasetName}`),t.queryRequest(t.getDatasetInfoCompleted,t.getDatasetInfoFailed)}}queryRequest(e,t){this.request({method:"GET",data:null,scope:this,success:e,failure:t})}getDatasetInfoCompleted(e){e=ee.transformResult(e),this.datasetType=e.datasetInfo.type,this.queryGridInfos()}queryGridInfos(){var e=this;e.url=ee.urlPathAppend(e.url,"GRID"==e.datasetType?"gridValue":"imageValue"),null!=e.X&&null!=e.Y&&(e.url=ee.urlAppend(e.url,`x=${e.X}&y=${e.Y}`)),e.queryRequest(e.serviceProcessCompleted,e.serviceProcessFailed)}getDatasetInfoFailed(e){this.serviceProcessFailed(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Qs{constructor(e,t){if(!e)return this;this.memoryData=null,this.type=e,t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.Theme"}destroy(){this.memoryData&&(this.memoryData.destroy(),this.memoryData=null),this.type=null}toServerJSONObject(){}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Xs{constructor(e){this.align=y.BASELINECENTER,this.backColor=new Me(255,255,255),this.foreColor=new Me(0,0,0),this.backOpaque=!1,this.sizeFixed=!0,this.fontHeight=6,this.fontWidth=0,this.fontWeight=400,this.fontName="Times New Roman",this.bold=!1,this.italic=!1,this.italicAngle=0,this.shadow=!1,this.strikeout=!1,this.outline=!1,this.opaqueRate=0,this.underline=!1,this.rotation=0,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ServerTextStyle"}destroy(){var e=this;e.align=null,e.backColor&&(e.backColor.destroy(),e.backColor=null),e.foreColor&&(e.foreColor.destroy(),e.foreColor=null),e.backOpaque=null,e.sizeFixed=null,e.fontHeight=null,e.fontWidth=null,e.fontWeight=null,e.fontName=null,e.bold=null,e.italic=null,e.italicAngle=null,e.shadow=null,e.strikeout=null,e.outline=null,e.opaqueRate=null,e.underline=null,e.rotation=null}static fromObj(e){var t=new Xs(e);return ee.copy(t,e),t.backColor=Me.fromJson(e.backColor),t.foreColor=Me.fromJson(e.foreColor),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ks{constructor(e){this.caption=null,this.end=0,this.start=0,this.visible=!0,this.style=new Xs,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeLabelItem"}destroy(){var e=this;e.caption=null,e.end=null,e.start=null,e.style&&(e.style.destroy(),e.style=null),e.visible=null}static fromObj(e){if(e){var t=new Ks;return ee.copy(t,e),t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Zs{constructor(e){this.caption=null,this.style=new Ae,this.unique=null,this.visible=!0,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeUniqueItem"}destroy(){var e=this;e.caption=null,e.unique=null,e.style&&(e.style.destroy(),e.style=null),e.visible=null}toServerJSONObject(){var e={};return(e=ee.copyAttributes(e,this)).style&&e.style.toServerJSONObject&&(e.style=e.style.toServerJSONObject()),e}static fromObj(e){var t=new Zs;return ee.copy(t,e),t.style=Ae.fromJson(e.style),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class $s{constructor(e){this.offsetFixed=!1,this.offsetX="0.0",this.offsetY="0.0",e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeOffset"}destroy(){this.offsetFixed=null,this.offsetX=null,this.offsetY=null}static fromObj(e){if(e){var t=new $s;return ee.copy(t,e),t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ei{constructor(e){this.defaultStyle=null,this.separator=null,this.separatorEnabled=!1,this.splitIndexes=null,this.styles=new Xs,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.LabelMixedTextStyle"}destroy(){var e=this;if(e.defaultStyle&&(e.defaultStyle.destroy(),e.defaultStyle=null),e.separator=null,e.separatorEnabled=null,e.splitIndexes&&(e.splitIndexes=null),e.styles){for(var t=0,s=e.styles,i=s.length;t0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.defaultStyle&&(e.defaultStyle.destroy(),e.defaultStyle=null)}toServerJSONObject(){var e={};if((e=ee.copyAttributes(e,this)).defaultStyle&&e.defaultStyle.toServerJSONObject&&(e.defaultStyle=e.defaultStyle.toServerJSONObject()),e.items){for(var t=[],s=e.items.length,i=0;i0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.rangeExpression=null,e.rangeMode=null,e.rangeParameter=null,e.colorGradientType=null}static fromObj(e){if(e){var t=new mi;ee.copy(t,e);var s=e.items,i=s?s.length:0;t.items=[];for(var r=0;r0?e[0].subLayers.layers:null)?t.length:0,this.handleLayers(s,t),this.events.triggerEvent("processCompleted",{result:e[0]})}handleLayers(e,t){var s;if(e)for(var i=0;i0)this.handleLayers(t[i].subLayers.layers.length,t[i].subLayers.layers);else switch(t[i].ugcLayerType){case"THEME":(s=new bi).fromJson(t[i]),t[i]=s;break;case"GRID":(s=new xi).fromJson(t[i]),t[i]=s;break;case"IMAGE":(s=new _i).fromJson(t[i]),t[i]=s;break;case"VECTOR":(s=new Ci).fromJson(t[i]),t[i]=s}}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Mi{constructor(e){e&&(this.bounds=null,this.searchRadius=0,this.zValueFieldName=null,this.zValueScale=1,this.resolution=null,this.filterQueryParameter=null,this.outputDatasetName=null,this.outputDatasourceName=null,this.pixelFormat=null,this.dataset=null,this.inputPoints=null,this.InterpolationAnalystType="dataset",this.clipParam=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.InterpolationAnalystParameters")}destroy(){var e=this;e.bounds=null,e.searchRadius=null,e.zValueFieldName=null,e.zValueScale=null,e.resolution=null,e.filterQueryParameter=null,e.outputDatasetName=null,e.pixelFormat=null}static toObject(e,t){for(var s in e)if("inputPoints"===s&&"geometry"===e.InterpolationAnalystType){for(var i=[],r=0;r=200&&e.code<300||0==e.code||304===e.code,s=e.code&&t;!e.code||s?this.events&&this.events.triggerEvent("processCompleted",{result:e}):this.events.triggerEvent("processFailed",{error:e})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Di{constructor(e){e&&(this.dataset=null,this.extractRegion=null,this.expression=null,this.isZip=!1,this.ignoreNoValue=!1,this.targetDatasource=null,this.resultGridName=null,this.deleteExistResultDataset=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.MathExpressionAnalysisParameters")}destroy(){var e=this;e.dataset=null,e.bounds=null,e.expression=null,e.isZip=!0,e.ignoreNoValue=!0,e.targetDatasource=null,e.resultGridName=null,e.deleteExistResultDataset=null}static toObject(e,t){for(var s in e)if("dataset"!==s&&(t[s]=e[s]),"extractRegion"===s&&e[s]){for(var i=e[s].components[0].components,r={},n=[],a=i.length,o=0;o(e.fieldNames=r[i].fieldCaptions,e)),this.format===t.GEOJSON&&(r[i].features=s.toGeoJSON(r[i].features)));this.events.triggerEvent("processCompleted",{result:e})}getQueryParameters(e){return new Ot({customParams:e.customParams,expectCount:e.expectCount,networkType:e.networkType,queryOption:e.queryOption,queryParams:e.queryParams,startRecord:e.startRecord,prjCoordSys:e.prjCoordSys,holdTime:e.holdTime})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ji extends Vi{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.QueryByBoundsService"}destroy(){super.destroy()}getJsonParameters(e){if(!(e instanceof zi))return null;var t,s="",i=e.bounds;return t=this.getQueryParameters(e),s+="'queryMode':'BoundsQuery','queryParameters':",s+=ee.toJSON(t),s="{"+(s+=",'bounds': {'rightTop':{'y':"+i.top+",'x':"+i.right+"},'leftBottom':{'y':"+i.bottom+",'x':"+i.left+"}}")+"}"}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class qi extends Ot{constructor(e){super(e=e||{}),this.geometry=null,this.isNearest=null,this.returnContent=!0,ee.extend(this,e),this.CLASS_NAME="SuperMap.QueryByDistanceParameters"}destroy(){super.destroy();var e=this;e.returnContent=null,e.distance=null,e.isNearest=null,e.geometry&&(e.geometry.destroy(),e.geometry=null)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Hi extends Vi{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.QueryByDistanceService"}destroy(){super.destroy()}getJsonParameters(e){if(e instanceof qi){var t="",s=this.getQueryParameters(e),i=Le.fromGeometry(e.geometry);return t+=e.isNearest?"'queryMode':'FindNearest','queryParameters':":"'queryMode':'DistanceQuery','queryParameters':",t+=ee.toJSON(s),t="{"+(t+=",'geometry':"+ee.toJSON(i)+",'distance':"+e.distance)+"}"}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Wi extends Ot{constructor(e){super(e=e||{}),this.returnContent=!0,this.geometry=null,this.spatialQueryMode=a.INTERSECT,ee.extend(this,e),this.CLASS_NAME="SuperMap.QueryByGeometryParameters"}destroy(){super.destroy();this.returnContent=null,this.geometry=null,this.spatialQueryMode=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Yi extends Vi{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.QueryByGeometryService"}destroy(){super.destroy()}getJsonParameters(e){if(e instanceof Wi){var t,s="",i=e.geometry,r=Le.fromGeometry(i);return t=this.getQueryParameters(e),s+="'queryMode':'SpatialQuery','queryParameters':",s="{"+(s+=ee.toJSON(t)+",'geometry':"+ee.toJSON(r)+",'spatialQueryMode':"+ee.toJSON(e.spatialQueryMode))+"}"}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Qi extends Ot{constructor(e){super(e=e||{}),this.returnContent=!0,ee.extend(this,e),this.CLASS_NAME="SuperMap.QueryBySQLParameters"}destroy(){super.destroy();this.returnContent=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Xi extends Vi{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.QueryBySQLService"}destroy(){super.destroy()}getJsonParameters(e){if(e instanceof Qi){var t,s="";return t=this.getQueryParameters(e),s+="'queryMode':'SqlQuery','queryParameters':",s="{"+(s+=ee.toJSON(t))+"}"}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ki{constructor(e){if(!e)return this;this.sourceRoute=null,this.point=null,this.tolerance=null,this.isIgnoreGap=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.RouteCalculateMeasureParameters"}destroy(){var e=this;e.sourceRoute=null,e.point=null,e.tolerance&&(e.tolerance=null),e.isIgnoreGap&&(e.isIgnoreGap=!1)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Zi extends lt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.RouteCalculateMeasureService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Ki){var t,s=this;t=s.getJsonParameters(e),s.request({method:"POST",data:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJsonParameters(e){return this.url=ee.urlPathAppend(this.url,"geometry/calculatemeasure"),this.url=ee.urlAppend(this.url,"returnContent=true"),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class $i{constructor(e){if(!e)return this;this.sourceRoute=null,this.dataset=null,this.routeIDField=null,this.routeID=null,this.type=null,this.measure=null,this.offset=0,this.isIgnoreGap=!1,this.startMeasure=null,this.endMeasure=null;var t=e.sourceRoute,s={};if(t&&t instanceof Q&&t.components){s.type=t.type,s.parts=t.parts;for(var i=[],r=0,n=t.components.length;r0&&(s+='"subLayers":'+e.toJSON()),s+=',"visible":true,',s+='"name":"'+this.getMapName(this.mapUrl)+'"',s+="}]",t.request({method:"PUT",data:s,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}}createTempLayerComplete(e){(e=ee.transformResult(e)).succeed&&(this.lastparams.resourceID=e.newResourceID),this.processAsync(this.lastparams)}getMapName(e){var t=e;"/"===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1));var s=t.lastIndexOf("/");return t.substring(s+1,t.length)}serviceProcessCompleted(e){null!=(e=ee.transformResult(e))&&null!=this.lastparams&&(e.newResourceID=this.lastparams.resourceID),this.events.triggerEvent("processCompleted",{result:e})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class hr{constructor(e){e&&(this.datasetName="",this.datasetQuery="",this.geometryQuery="",this.mode=a.CONTAIN,this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.SingleObjectQueryJobsParameter")}destroy(){this.datasetName=null,this.datasetQuery=null,this.geometryQuery=null,this.mode=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"output"!==s?(t.analyst=t.analyst||{},t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ur extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/query"),this.CLASS_NAME="SuperMap.SingleObjectQueryJobsService"}destroy(){super.destroy()}getQueryJobs(){super.getJobs(this.url)}getQueryJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addQueryJob(e,t){super.addJob(this.url,e,hr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class cr{constructor(e){e=e||{},this.keyWord=null,this.returnPosition=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.StopQueryParameters"}destroy(){ee.reset(this)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class pr extends tt{constructor(e,t){super(e,t),t=t||{},ee.extend(this,t),this.CLASS_NAME="SuperMap.StopQueryService"}destroy(){super.destroy(),ee.reset(this)}processAsync(e){if(e instanceof cr){var t=this;t.url=ee.urlPathAppend(t.url,"stops/keyword/"+e.keyWord),t.request({method:"GET",params:{returnPosition:e.returnPosition},scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class dr{constructor(e){e&&(this.datasetName="",this.groupField="",this.attributeField="",this.statisticModes="",this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.SummaryAttributesJobsParameter")}destroy(){this.datasetName=null,this.groupField=null,this.attributeField=null,this.statisticModes=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"output"!==s?(t.analyst=t.analyst||{},t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class fr extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/summaryattributes"),this.CLASS_NAME="SuperMap.SummaryAttributesJobsService"}destroy(){super.destroy()}getSummaryAttributesJobs(){super.getJobs(this.url)}getSummaryAttributesJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addSummaryAttributesJob(e,t){super.addJob(this.url,e,dr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class mr{constructor(e){e&&(this.datasetName="",this.regionDataset="",this.query="",this.resolution=100,this.meshType=0,this.statisticModes=R.AVERAGE,this.fields="",this.type=k.SUMMARYMESH,this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.SummaryMeshJobParameter")}destroy(){this.datasetName=null,this.query=null,this.resolution=null,this.statisticModes=null,this.meshType=null,this.fields=null,this.regionDataset=null,this.type=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"type"!==s?"output"!==s?("SUMMARYMESH"===e.type&&"regionDataset"!==s||"SUMMARYREGION"===e.type&&!i(["meshType","resolution","query"],s))&&(t.analyst=t.analyst||{},"query"===s&&e[s]?t.analyst[s]=e[s].toBBOX():t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):t.type=e[s]:(t.input=t.input||{},t.input[s]=e[s]);function i(e,t){for(var s=e.length;s--;)if(e[s]===t)return!0;return!1}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class yr extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/aggregatepoints"),this.CLASS_NAME="SuperMap.SummaryMeshJobsService"}destroy(){super.destroy()}getSummaryMeshJobs(){super.getJobs(this.url)}getSummaryMeshJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addSummaryMeshJob(e,t){super.addJob(this.url,e,mr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class gr{constructor(e){e&&(this.datasetName="",this.regionDataset="",this.sumShape=!0,this.query="",this.standardSummaryFields=!1,this.standardFields="",this.standardStatisticModes="",this.weightedSummaryFields=!1,this.weightedFields="",this.weightedStatisticModes="",this.meshType=0,this.resolution=100,this.meshSizeUnit=D.METER,this.type=k.SUMMARYMESH,this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.SummaryRegionJobParameter")}destroy(){this.datasetName=null,this.sumShape=null,this.regionDataset=null,this.query=null,this.standardSummaryFields=null,this.standardFields=null,this.standardStatisticModes=null,this.weightedSummaryFields=null,this.weightedFields=null,this.weightedStatisticModes=null,this.meshType=null,this.resolution=null,this.meshSizeUnit=null,this.type=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"type"!==s&&"type"!==s?"output"!==s?("SUMMARYREGION"===e.type||"SUMMARYMESH"===e.type&&"regionDataset"!==s)&&(t.analyst=t.analyst||{},"query"===s&&e[s]?t.analyst[s]=e[s].toBBOX():t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):t.type=e[s]:(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class vr extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/summaryregion"),this.CLASS_NAME="SuperMap.SummaryRegionJobsService"}destroy(){super.destroy()}getSummaryRegionJobs(){super.getJobs(this.url)}getSummaryRegionJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addSummaryRegionJob(e,t){super.addJob(this.url,e,gr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Sr{constructor(e){this.maxWeight=null,this.nodeID=null,this.resourceValue=null,this.type=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.SupplyCenter"}destroy(){this.maxWeight=null,this.nodeID=null,this.resourceValue=null,this.type=null}static fromJson(e){if(e)return new Sr({maxWeight:e.maxWeight,nodeID:e.nodeID,resourceValue:e.resourceValue,type:e.type})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class br extends lt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.SurfaceAnalystService"}destroy(){super.destroy()}processAsync(e){if(e instanceof zt){var t,s=this;t=s.getJsonParameters(e),s.request({method:"POST",data:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}getJsonParameters(e){var t="",s={},i=this;if(e instanceof Vt)i.url=ee.urlPathAppend(i.url,"datasets/"+e.dataset+"/"+e.surfaceAnalystMethod.toLowerCase()),Vt.toObject(e,s),t=ee.toJSON(s);else{if(!(e instanceof Es))return;i.url=ee.urlPathAppend(i.url,"geometry/"+e.surfaceAnalystMethod.toLowerCase()),t=ee.toJSON(e)}return i.url=ee.urlAppend(i.url,"returnContent=true"),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class xr{constructor(e){e&&(this.dataset=null,this.zFactor=1,this.averageCurvatureName=null,this.profileCurvatureName="",this.planCurvatureName="",this.deleteExistResultDataset=!1,ee.extend(this,e),this.CLASS_NAME="SuperMap.TerrainCurvatureCalculationParameters")}destroy(){var e=this;e.dataset=null,e.zFactor=1,e.averageCurvatureName=null,e.profileCurvatureName=null,e.planCurvatureName=null,e.deleteExistResultDataset=!0}static toObject(e,t){for(var s in e)"dataset"!==s&&(t[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class _r extends lt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.TerrainCurvatureCalculationService"}destroy(){super.destroy()}processAsync(e){var t=this,s={};e instanceof xr&&(t.url=ee.urlPathAppend(t.url,"datasets/"+e.dataset+"/terraincalculation/curvature")),xr.toObject(e,s);var i=ee.toJSON(s);t.url=ee.urlAppend(t.url,"returnContent=true"),t.request({method:"POST",data:i,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Cr{constructor(e){this.flowEnabled=!1,this.leaderLineDisplayed=!1,this.leaderLineStyle=new Ae,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeFlow"}destroy(){var e=this;e.flowEnabled=null,e.leaderLineDisplayed=null,e.leaderLineStyle&&(e.leaderLineStyle.destroy(),e.leaderLineStyle=null)}static fromObj(e){if(e){var t=new Cr;return ee.copy(t,e),t.leaderLineStyle=Ae.fromJson(e.leaderLineStyle),t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class wr{constructor(e){this.caption=null,this.color=new Me,this.end=0,this.start=0,this.visible=!0,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeGridRangeItem"}destroy(){var e=this;e.caption=null,e.end=null,e.start=null,e.color&&(e.color.destroy(),e.color=null),e.visible=null}toServerJSONObject(){var e={};return(e=ee.copyAttributes(e,this)).color&&e.color.toServerJSONObject&&(e.color=e.color.toServerJSONObject()),e}static fromObj(e){if(e){var t=new wr;return ee.copy(t,e),t.color=Me.fromJson(e.color),t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Mr extends Qs{constructor(e){super("GRIDRANGE",e),this.items=null,this.rangeMode=f.EQUALINTERVAL,this.rangeParameter=0,this.colorGradientType=m.YELLOW_RED,this.reverseColor=!1,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ThemeGridRange"}destroy(){super.destroy();var e=this;if(e.items){if(e.items.length>0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.reverseColor=null,e.rangeMode=null,e.rangeParameter=null,e.colorGradientType=null}static fromObj(e){if(e){var t=new Mr;ee.copy(t,e);var s=e.items,i=s?s.length:0;t.items=[];for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.defaultcolor&&(e.defaultcolor.destroy(),e.defaultcolor=null)}toServerJSONObject(){var e={};if((e=ee.copyAttributes(e,this)).defaultcolor&&e.defaultcolor.toServerJSONObject&&(e.defaultcolor=e.defaultcolor.toServerJSONObject()),e.items){for(var t=[],s=e.items.length,i=0;i0&&(1===r.length?s+="'displayFilter':\""+r[0]+'",':s+="'displayFilter':\""+r[a]+'",'),(n=e.displayOrderBy)&&n.length>0&&(1===n.length?s+="'displayOrderBy':'"+n[0]+"',":s+="'displayOrderBy':'"+n[a]+"',"),(t=e.fieldValuesDisplayFilter)&&(s+="'fieldValuesDisplayFilter':"+ee.toJSON(t)+","),e.joinItems&&e.joinItems.length>0&&e.joinItems[a]&&(s+="'joinItems':["+ee.toJSON(e.joinItems[a])+"],"),e.datasetNames&&e.dataSourceNames){var l=e.datasetNames[a]?a:e.datasetNames.length-1,h=e.dataSourceNames[a]?a:e.dataSourceNames.length-1;s+="'datasetInfo': {'name': '"+e.datasetNames[l]+"','dataSourceName': '"+e.dataSourceNames[h]+"'}},"}else s+="},"}e.themes&&e.themes.length>0&&(s=s.substring(0,s.length-1)),s+="]},";var u=this.url.split("/");return s+="'name': '"+u[u.length-2]+"'}]"}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Pr extends lt{constructor(e,t){super(e,t),this.mode=null,t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.ThiessenAnalystService"}destroy(){super.destroy(),this.mode=null}processAsync(e){var t={},s=this;e instanceof qt?(s.mode="datasets",s.url=ee.urlPathAppend(s.url,"datasets/"+e.dataset+"/thiessenpolygon"),qt.toObject(e,t)):e instanceof Ls&&(s.mode="geometry",s.url=ee.urlPathAppend(s.url,"geometry/thiessenpolygon"),Ls.toObject(e,t));var i=ee.toJSON(t);s.url=ee.urlAppend(s.url,"returnContent=true"),s.request({method:"POST",data:i,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Nr extends lt{constructor(e,t){super(e,t),t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.GeometryBatchAnalystService"}processAsync(e){var t=this;t.url=ee.urlPathAppend(t.url,"geometry/batchanalyst"),t.url=ee.urlAppend(t.url,"returnContent=true&ignoreAnalystParam=true");var s=t._processParams(e),i=ee.toJSON(s);t.request({method:"POST",data:i,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}_processParams(e){var t=this;if(ee.isArray(e)){var s=[];return e.map(function(e){return s.push(t._toJSON(e)),e}),s}}_toJSON(e){var t={};if("buffer"===e.analystName)t.analystName="buffer",t.param={},yt.toObject(e.param,t.param);else if("overlay"===e.analystName)t.analystName="overlay",t.param={},Ts.toObject(e.param,t.param);else if("interpolationDensity"===e.analystName)t.analystName="interpolationDensity",t.param={},Mi.toObject(e.param,t.param);else if("interpolationidw"===e.analystName)t.analystName="interpolationidw",t.param={},Mi.toObject(e.param,t.param);else if("interpolationRBF"===e.analystName)t.analystName="interpolationRBF",t.param={},Mi.toObject(e.param,t.param);else if("interpolationKriging"===e.analystName)t.analystName="interpolationKriging",t.param={},Mi.toObject(e.param,t.param);else{if("thiessenpolygon"!==e.analystName)return e;t.analystName="thiessenpolygon",t.param={},Ls.toObject(e.param,t.param)}return t}destroy(){super.destroy()}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ir extends tt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.TilesetsService"}destroy(){super.destroy()}processAsync(){if(this.url){var e=this;e.url=ee.urlPathAppend(e.url,"tilesets"),e.request({method:"GET",scope:e,success:e.serviceProcessCompleted,failure:e.serviceProcessFailed})}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Fr{constructor(e){e&&(this.datasetName="",this.datasetTopology="",this.tolerance="",this.rule=B.REGIONNOOVERLAP,this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.TopologyValidatorJobsParameter")}destroy(){this.datasetName=null,this.datasetTopology=null,this.tolerance=null,this.rule=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"output"!==s?(t.analyst=t.analyst||{},t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Dr extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/topologyvalidator"),this.CLASS_NAME="SuperMap.TopologyValidatorJobsService"}destroy(){super.destroy()}getTopologyValidatorJobs(){super.getJobs(this.url)}getTopologyValidatorJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addTopologyValidatorJob(e,t){super.addJob(this.url,e,Fr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Rr{constructor(e){e=e||{},this.lineID=null,this.lineName=null,this.lineAliasName=null,this.startStopIndex=null,this.startStopName=null,this.startStopAliasName=null,this.endStopIndex=null,this.endStopName=null,this.endStopAliasName=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.TransferLine"}destroy(){ee.reset(this)}static fromJson(e){if(e)return new Rr({lineID:e.lineID,lineName:e.lineName,lineAliasName:e.lineAliasName,startStopIndex:e.startStopIndex,startStopName:e.startStopName,startStopAliasName:e.startStopAliasName,endStopIndex:e.endStopIndex,endStopName:e.endStopName,endStopAliasName:e.endStopAliasName})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class kr{constructor(e){e=e||{},this.transferLines=null,this.points=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.TransferPathParameters"}destroy(){ee.reset(this)}static toJson(e){if(e)return ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Br extends tt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.TransferPathService"}destroy(){super.destroy()}processAsync(e){if(e instanceof kr){var t,s=this;s.url=ee.urlPathAppend(s.url,"path"),t={points:ee.toJSON(e.points),transferLines:ee.toJSON(e.transferLines)},s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Gr{constructor(e){e=e||{},this.solutionCount=6,this.transferPreference=E.NONE,this.transferTactic=T.LESS_TIME,this.walkingRatio=null,this.points=!1,this.evadeLines=null,this.evadeStops=null,this.priorLines=null,this.priorStops=null,this.travelTime=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.TransferSolutionParameters"}destroy(){ee.reset(this)}static toJson(e){if(e)return ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Ur extends tt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.TransferSolutionService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Gr){var t,s=this;s.url=ee.urlPathAppend(s.url,"solutions"),t={points:ee.toJSON(e.points),walkingRatio:e.walkingRatio,transferTactic:e.transferTactic,solutionCount:e.solutionCount,transferPreference:e.transferPreference},e.evadeLines&&(t.evadeLines=ee.toJSON(e.evadeLines)),e.evadeStops&&(t.evadeStops=ee.toJSON(e.evadeStops)),e.priorLines&&(t.priorLines=ee.toJSON(e.priorLines)),e.priorStops&&(t.priorStops=ee.toJSON(e.priorStops)),e.travelTime&&(t.travelTime=e.travelTime),s.request({method:"GET",params:t,scope:s,success:s.serviceProcessCompleted,failure:s.serviceProcessFailed})}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class jr{constructor(e){e&&(this.edgeId="",this.fromNodeId="",this.toNodeId="",this.weightField="",this.edgeWeight="",ee.extend(this,e),this.CLASS_NAME="SuperMap.UpdateEdgeWeightParameters")}destroy(){this.edgeId=null,this.fromNodeId=null,this.toNodeId=null,this.weightField=null,this.edgeWeight=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class zr{constructor(e){e&&(this.datasourceName=null,this.datasetName=null,this.datasetType=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.CreateDatasetParameters")}destroy(){this.datasourceName=null,this.datasetName=null,this.datasetType=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Vr extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.UpdateEdgeWeightService"}destroy(){super.destroy()}processAsync(e){if(e instanceof jr){var t=this,s=t.parse(e);t.url=ee.urlPathAppend(t.url,s);var i=e.edgeWeight?e.edgeWeight:null;t.request({method:"PUT",scope:t,data:i,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}parse(e){if(e){var t="";for(var s in e)if(""!==e[s]&&"edgeWeight"!==e[s])switch(s){case"edgeId":t+="/edgeweight/"+e[s];break;case"fromNodeId":t+="/fromnode/"+e[s];break;case"toNodeId":t+="/tonode/"+e[s];break;case"weightField":t+="/weightfield/"+e[s]}return t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Jr{constructor(e){e&&(this.nodeId="",this.fromEdgeId="",this.toEdgeId="",this.weightField="",this.turnNodeWeight="",ee.extend(this,e),this.CLASS_NAME="SuperMap.UpdateTurnNodeWeightParameters")}destroy(){this.nodeId=null,this.fromEdgeId=null,this.toEdgeId=null,this.weightField=null,this.turnNodeWeight=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class qr extends Mt{constructor(e,t){super(e,t),this.CLASS_NAME="SuperMap.UpdateTurnNodeWeightService"}destroy(){super.destroy()}processAsync(e){if(e instanceof Jr){var t=this,s=t.parse(e);t.url=ee.urlPathAppend(t.url,s);var i=e.turnNodeWeight?e.turnNodeWeight:null;t.request({method:"PUT",scope:t,data:i,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}parse(e){if(e){var t="";for(var s in e)if(""!==e[s]&&"turnNodeWeight"!==e[s])switch(s){case"nodeId":t+="/turnnodeweight/"+e[s];break;case"fromEdgeId":t+="/fromedge/"+e[s];break;case"toEdgeId":t+="/toedge/"+e[s];break;case"weightField":t+="/weightfield/"+e[s]}return t}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Hr{constructor(e){e&&(this.datasourceName=null,this.datasetName=null,this.isFileCache=null,this.description=null,this.prjCoordSys=null,this.charset=null,this.palette=null,this.noValue=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.UpdateDatasetParameters")}destroy(){var e=this;e.datasourceName=null,e.datasetName=null,e.isFileCache=null,e.prjCoordSys=null,e.charset=null,e.palette=null,e.noValue=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Wr{constructor(e){e=e||{},this.datasetName="",this.datasetVectorClip="",this.geometryClip="",this.mode=I.CLIP,this.output=null,this.mappingParameters=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.VectorClipJobsParameter"}destroy(){this.datasetName=null,this.datasetVectorClip=null,this.geometryClip=null,this.mode=null,this.output instanceof St&&(this.output.destroy(),this.output=null),this.mappingParameters instanceof bt&&(this.mappingParameters.destroy(),this.mappingParameters=null)}static toObject(e,t){for(var s in e)"datasetName"!==s?"output"!==s?(t.analyst=t.analyst||{},t.analyst[s]=e[s],"mappingParameters"===s&&(t.analyst[s]=t.analyst[s]||{},t.analyst.mappingParameters=e[s])):(t.output=t.output||{},t.output=e[s]):(t.input=t.input||{},t.input[s]=e[s])}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Yr extends _t{constructor(e,t){super(e,t),this.url=ee.urlPathAppend(this.url,"spatialanalyst/vectorclip"),this.CLASS_NAME="SuperMap.VectorClipJobsService"}destroy(){super.destroy()}getVectorClipJobs(){super.getJobs(this.url)}getVectorClipJob(e){super.getJobs(ee.urlPathAppend(this.url,e))}addVectorClipJob(e,t){super.addJob(this.url,e,Wr,t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Qr{constructor(e){e=e||{},this.type=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.RasterFunctionParameter"}destroy(){this.type=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Xr{constructor(e){this.name=null,this.picAsUrl=null,this.picAsBase64=null,this.CLASS_NAME="SuperMap.WebPrintingJobCustomItems",ee.extend(this,e)}destroy(){this.name=null,this.picAsUrl=null,this.picAsBase64=null}toJSON(){var e={name:this.name};return this.title&&(e.title=this.title),this.picAsUrl?e.picAsUrl=this.picAsUrl:this.picAsBase64&&(e.picAsBase64=this.picAsBase64.replace(/^data:.+;base64,/,"")),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Kr{constructor(e){this.picAsUrl=null,this.picAsBase64=null,this.CLASS_NAME="SuperMap.WebPrintingJobImage",ee.extend(this,e)}destroy(){this.picAsUrl=null,this.picAsBase64=null}toJSON(){var e={};return this.picAsUrl&&(e.picAsUrl=this.picAsUrl),this.picAsBase64&&(e.picAsBase64=this.picAsBase64.replace(/^data:.+;base64,/,"")),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Zr{constructor(e){this.name=null,this.layerType=null,this.url=null,this.CLASS_NAME="SuperMap.WebPrintingJobLayers",ee.extend(this,e)}destroy(){this.name=null,this.layerType=null,this.url=null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class $r{constructor(e){this.title=null,this.picAsUrl=null,this.picAsBase64=null,this.layers=null,this.customItems=null,this.CLASS_NAME="SuperMap.WebPrintingJobLegendOptions",ee.extend(this,e)}destroy(){this.title=null,this.picAsUrl=null,this.picAsBase64=null,this.layers instanceof Zr&&(this.layers.destroy(),this.layers=null),this.customItems instanceof Xr&&(this.customItems.destroy(),this.customItems=null)}toJSON(){var e={title:this.title||""};return this.picAsUrl?e.picAsUrl=this.picAsUrl:this.picAsBase64?e.picAsBase64=this.picAsBase64.replace(/^data:.+;base64,/,""):this.customItems&&(e.customItems=this.customItems),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class en{constructor(e){this.center=null,this.scale=null,this.layerNames=null,this.image=null,this.layers=null,this.CLASS_NAME="SuperMap.WebPrintingJobLittleMapOptions",ee.extend(this,e)}destroy(){this.center=null,this.scale=null,this.layerNames=null,this.image instanceof Kr&&(this.image.destroy(),this.image=null),this.layers instanceof Zr&&(this.layers.destroy(),this.layers=null)}toJSON(){var e={scale:this.scale,center:this.center};return this.layerNames?e.layerNames=this.layerNames:this.layers&&(e.layers=this.layers),this.image&&(e.image=this.image),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class tn{constructor(e){this.picAsUrl=null,this.picAsBase64=null,this.CLASS_NAME="SuperMap.WebPrintingJobNorthArrowOptions",ee.extend(this,e)}destroy(){this.picAsUrl=null,this.picAsBase64=null}toJSON(){var e={};return this.picAsUrl?e.picAsUrl=this.picAsUrl:this.picAsBase64&&(e.picAsBase64=this.picAsBase64.replace(/^data:.+;base64,/,"")),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class sn{constructor(e){this.scaleText=null,this.orientation=null,this.type=null,this.intervals=null,this.unit=null,this.CLASS_NAME="SuperMap.WebPrintingJobScaleBarOptions",ee.extend(this,e)}destroy(){this.scaleText=null,this.orientation=null,this.type=null,this.intervals=null,this.unit=null}toJSON(){var e={scaleText:this.scaleText||"",type:this.type||"BAR",intervals:this.intervals||"",unit:this.unit||"METER"};return this.orientation&&(e.orientation=this.orientation),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class rn{constructor(e){this.type=null,this.url=null,this.token=null,this.value=null,this.CLASS_NAME="SuperMap.WebPrintingJobContent",ee.extend(this,e)}destroy(){this.type="WEBMAP",this.url=null,this.token=null,this.value=null}toJSON(){var e={type:this.type};return this.token&&(e.token=this.token),this.url?e.url=this.url:this.value&&(e.value=this.value),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class nn{constructor(e){this.templateName=null,this.title=null,this.subTitle=null,this.author=null,this.copyright=null,this.scaleBarOptions=null,this.northArrowOptions=null,this.littleMapOptions=null,this.legendOptions=null,this.CLASS_NAME="SuperMap.WebPrintingJobLayoutOptions",ee.extend(this,e)}destroy(){this.templateName=null,this.title=null,this.subTitle=null,this.author=null,this.copyright=null,this.scaleBarOptions instanceof sn&&(this.scaleBarOptions.destroy(),this.scaleBarOptions=null),this.northArrowOptions instanceof tn&&(this.northArrowOptions.destroy(),this.northArrowOptions=null),this.littleMapOptions instanceof en&&(this.littleMapOptions.destroy(),this.littleMapOptions=null),this.legendOptions instanceof $r&&(this.legendOptions.destroy(),this.legendOptions=null)}toJSON(){var e={templateName:this.templateName,title:this.title,subTitle:this.subTitle,author:this.author,copyright:this.copyright};return this.scaleBarOptions&&(e.scaleBarOptions=this.scaleBarOptions),this.northArrowOptions&&(e.northArrowOptions=this.northArrowOptions),this.littleMapOptions&&(e.littleMapOptions=this.littleMapOptions),this.legendOptions&&(e.legendOptions=this.legendOptions),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class an{constructor(e){this.format=null,this.dpi=96,this.scale=null,this.rotation=null,this.center=null,this.CLASS_NAME="SuperMap.WebPrintingJobExportOptions",ee.extend(this,e)}destroy(){this.format=null,this.dpi=null,this.scale=null,this.rotation=null,this.center=null,this.outputSize=null}toJSON(){var e={format:this.format||"PDF",dpi:this.dpi,scale:this.scale,center:this.center};return this.rotation&&(e.rotation=this.rotation),this.outputSize&&(e.outputSize=this.outputSize),ee.toJSON(e)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class on extends tt{constructor(e,t){super(e,t),t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.WebPrintingService",this.url}destroy(){super.destroy()}createWebPrintingJob(e){if(e){e.layoutOptions&&e.layoutOptions.legendOptions&&(!e.layoutOptions.legendOptions.title&&(e.layoutOptions.legendOptions.title=""),e.layoutOptions.legendOptions.picAsBase64=e.layoutOptions.legendOptions.picAsBase64&&e.layoutOptions.legendOptions.picAsBase64.replace(/^data:.+;base64,/,""),e.layoutOptions.legendOptions.customItems&&e.layoutOptions.legendOptions.customItems.hasOwnProperty("picAsBase64")&&(e.layoutOptions.legendOptions.customItems.picAsBase64=e.layoutOptions.legendOptions.customItems.picAsBase64.replace(/^data:.+;base64,/,"")));var t=this;t.request({url:t._processUrl("jobs"),method:"POST",data:ee.toJSON(e),scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}getPrintingJob(e){var t=this,s=t._processUrl(`jobs/${e}`);t.request({url:s,method:"GET",scope:t,success:function(e){t.rollingProcess(e,s)},failure:t.serviceProcessFailed})}getPrintingJobResult(e){var t=this;t.request({url:t._processUrl(`jobs/${e}/result`),method:"GET",scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}getLayoutTemplates(){var e=this;e.request({url:e._processUrl("layouts"),method:"GET",scope:e,success:e.serviceProcessCompleted,failure:e.serviceProcessFailed})}rollingProcess(e,t){var s=this;if(e)var i=setInterval(function(){s.request({url:t,method:"GET",scope:s,success:function(e){switch(e.status){case"FINISHED":clearInterval(i),s.serviceProcessCompleted(e);break;case"ERROR":clearInterval(i),s.serviceProcessFailed(e);break;case"RUNNING":s.events.triggerEvent("processRunning",e)}},failure:s.serviceProcessFailed})},1e3)}_processUrl(e){return e?ee.urlPathAppend(this.url,e):this.url}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ln extends tt{constructor(e,t){super(e,t),this.options=t||{},t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.ImageCollectionService"}destroy(){super.destroy()}getLegend(e){var t={collectionId:this.options.collectionId},s=ee.convertPath("/collections/{collectionId}/legend",t),i=ee.urlPathAppend(this.url,s);this.request({method:"GET",url:i,params:e,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}getStatistics(){var e={collectionId:this.options.collectionId},t=ee.convertPath("/collections/{collectionId}/statistics",e),s=ee.urlPathAppend(this.url,t);this.request({method:"GET",url:s,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}getTileInfo(){var e={collectionId:this.options.collectionId},t=ee.convertPath("/collections/{collectionId}/tileInfo",e),s=ee.urlPathAppend(this.url,t);this.request({method:"GET",url:s,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}deleteItemByID(e){var t={collectionId:this.options.collectionId,featureId:e},s=ee.convertPath("/collections/{collectionId}/items/{featureId}",t),i=ee.urlPathAppend(this.url,s);this.request({method:"DELETE",url:i,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}getItemByID(e){var t={collectionId:this.options.collectionId,featureId:e},s=ee.convertPath("/collections/{collectionId}/items/{featureId}",t),i=ee.urlPathAppend(this.url,s);this.request({method:"GET",url:i,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class hn extends tt{constructor(e,t){super(e,t),this.options=t||{},t&&ee.extend(this,t),this.CLASS_NAME="SuperMap.ImageService"}destroy(){super.destroy()}getCollections(){var e=ee.convertPath("/collections"),t=ee.urlPathAppend(this.url,e);this.request({method:"GET",url:t,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}getCollectionByID(e){var t={collectionId:e},s=ee.convertPath("/collections/{collectionId}",t),i=ee.urlPathAppend(this.url,s);this.request({method:"GET",url:i,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}search(e){var t={...e||{}},s=ee.convertPath("/search"),i=ee.urlPathAppend(this.url,s);this.request({method:"POST",url:i,data:t,scope:this,success:this.serviceProcessCompleted,failure:this.serviceProcessFailed})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class un{constructor(e){this.include=void 0,this.exclude=void 0,this.CLASS_NAME="SuperMap.FieldsFilter",ee.extend(this,e)}destroy(){this.include=void 0,this.exclude=void 0}static constructFromObject(e,t){return e&&(t=t||new un,e.hasOwnProperty("include")&&(t.include=e.include),e.hasOwnProperty("exclude")&&(t.exclude=e.exclude)),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class cn{constructor(e){this.field=void 0,this.direction=cn.Direction.ASC,this.CLASS_NAME="SuperMap.Sortby",ee.extend(this,e)}destroy(){this.field=void 0,this.direction="ASC"}static constructFromObject(e,t){return e&&(t=t||new cn,e.hasOwnProperty("field")&&(t.field=e.field),e.hasOwnProperty("direction")&&(t.direction=e.direction)),t}}cn.Direction={ASC:"ASC",DESC:"DESC"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class pn{constructor(e){this.bbox=void 0,this.collections=void 0,this.ids=void 0,this.limit=void 0,this.fields=void 0,this.query=void 0,this.sortby=void 0,this.CLASS_NAME="SuperMap.ImageSearchParameter",ee.extend(this,e)}destroy(){var e=this;e.bbox=void 0,e.collections=void 0,e.ids=void 0,e.limit=void 0,e.fields=void 0,e.query=void 0,e.sortby=void 0}static constructFromObject(e,t){return e&&(t=t||new pn,e.hasOwnProperty("bbox")&&(t.bbox=e.bbox),e.hasOwnProperty("collections")&&(t.collections=e.collections),e.hasOwnProperty("ids")&&(t.ids=e.ids),e.hasOwnProperty("limit")&&(t.limit=e.limit),e.hasOwnProperty("fields")&&(t.fields=un.constructFromObject&&un.constructFromObject(e.fields,{})||e.fields),e.hasOwnProperty("query")&&(t.query=e.query),e.hasOwnProperty("sortby")&&(t.sortby=e.sortby,e.sortby&&(t.sortby=e.sortby.map(e=>cn.constructFromObject&&cn.constructFromObject(e,{})||e)))),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class dn{constructor(e){this.stretchType=void 0,this.stdevCoefficient=void 0,this.gaussianCoefficient=void 0,this.useMedianValue=void 0,this.minPercent=void 0,this.maxPercent=void 0,this.CLASS_NAME="SuperMap.ImageStretchOption",ee.extend(this,e)}destroy(){var e=this;e.stretchType=void 0,e.stdevCoefficient=void 0,e.gaussianCoefficient=void 0,e.useMedianValue=void 0,e.minPercent=void 0,e.maxPercent=void 0}static constructFromObject(e,t){return e&&(t=t||new dn,e.hasOwnProperty("stretchType")&&(t.stretchType=e.stretchType),e.hasOwnProperty("stdevCoefficient")&&(t.stdevCoefficient=e.stdevCoefficient),e.hasOwnProperty("gaussianCoefficient")&&(t.gaussianCoefficient=e.gaussianCoefficient),e.hasOwnProperty("useMedianValue")&&(t.useMedianValue=e.useMedianValue),e.hasOwnProperty("minPercent")&&(t.minPercent=e.minPercent),e.hasOwnProperty("maxPercent")&&(t.maxPercent=e.maxPercent)),t}}dn.StretchType={NONE:"NONE",GAUSSIAN:"GAUSSIAN",PERCENTCLIP:"PERCENTCLIP",MINIMUMMAXIMUM:"MINIMUMMAXIMUM",STANDARDDEVIATION:"STANDARDDEVIATION"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class fn{constructor(e){this.displayMode=void 0,this.displayBands=void 0,this.stretchOption=void 0,this.interpolationMode=void 0,this.colorScheme=void 0,this.colorTable=void 0,this.brightness=void 0,this.contrast=void 0,this.noData=void 0,this.noDataColor=void 0,this.noDataTransparent=void 0,this.backgroundValue=void 0,this.backgroundColor=void 0,this.backgroundTransparent=void 0,this.gridFunctions=void 0,this.CLASS_NAME="SuperMap.ImageRenderingRule",ee.extend(this,e)}destroy(){var e=this;e.displayMode=void 0,e.displayBands=void 0,e.stretchOption=void 0,e.interpolationMode=void 0,e.colorScheme=void 0,e.colorTable=void 0,e.brightness=void 0,e.contrast=void 0,e.noData=void 0,e.noDataColor=void 0,e.noDataTransparent=void 0,e.backgroundValue=void 0,e.backgroundColor=void 0,e.backgroundTransparent=void 0,e.gridFuncOptions=void 0}static constructFromObject(e,t){return e&&(t=t||new fn,e.hasOwnProperty("displayMode")&&(t.displayMode=e.displayMode),e.hasOwnProperty("displayBands")&&(t.displayBands=e.displayBands),e.hasOwnProperty("stretchOption")&&(t.stretchOption=dn.constructFromObject&&dn.constructFromObject(e.stretchOption,{})||e.stretchOption),e.hasOwnProperty("interpolationMode")&&(t.interpolationMode=e.interpolationMode),e.hasOwnProperty("colorScheme")&&(t.colorScheme=e.colorScheme),e.hasOwnProperty("colorTable")&&(t.colorTable=e.colorTable),e.hasOwnProperty("brightness")&&(t.brightness=e.brightness),e.hasOwnProperty("contrast")&&(t.contrast=e.contrast),e.hasOwnProperty("noData")&&(t.noData=e.noData),e.hasOwnProperty("noDataColor")&&(t.noDataColor=e.noDataColor),e.hasOwnProperty("backgroundValue")&&(t.backgroundValue=e.backgroundValue),e.hasOwnProperty("noDataTransparent")&&(t.noDataTransparent=e.noDataTransparent),e.hasOwnProperty("backgroundColor")&&(t.backgroundColor=e.backgroundColor),e.hasOwnProperty("backgroundTransparent")&&(t.backgroundTransparent=e.backgroundTransparent),e.hasOwnProperty("gridFunctions")&&(t.gridFunctions=e.gridFunctions)),t}}fn.DisplayMode={COMPOSITE:"COMPOSITE",STRETCHED:"Stretched"},fn.InterpolationMode={NEARESTNEIGHBOR:"NEARESTNEIGHBOR",HIGHQUALITYBILINEAR:"HIGHQUALITYBILINEAR",DEFAULT:"DEFAULT"}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class mn{constructor(e){this.girdFuncName="GFHillShade",this.Azimuth=315,this.Altitude=45,this.ZFactor=1,this.CLASS_NAME="SuperMap.ImageGFHillShade",ee.extend(this,e)}destroy(){this.girdFuncName="GFHillShade",this.Azimuth=315,this.Altitude=45,this.ZFactor=1}static constructFromObject(e,t){return e&&(t=t||new mn,e.hasOwnProperty("girdFuncName")&&(t.girdFuncName=e.girdFuncName),e.hasOwnProperty("Azimuth")&&(t.Azimuth=e.Azimuth),e.hasOwnProperty("Altitude")&&(t.Altitude=e.Altitude),e.hasOwnProperty("ZFactor")&&(t.ZFactor=e.ZFactor)),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class yn{constructor(e){this.girdFuncName="GFAspect",this.Azimuth=void 0,this.CLASS_NAME="SuperMap.ImageGFAspect",ee.extend(this,e)}destroy(){this.girdFuncName="GFAspect",this.Azimuth=void 0}static constructFromObject(e,t){return e&&(t=t||new yn,e.hasOwnProperty("girdFuncName")&&(t.girdFuncName=e.girdFuncName),e.hasOwnProperty("Azimuth")&&(t.Azimuth=e.Azimuth)),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class gn{constructor(e){this.girdFuncName="GFOrtho",this.CLASS_NAME="SuperMap.ImageGFOrtho",ee.extend(this,e)}destroy(){this.girdFuncName="GFOrtho"}static constructFromObject(e,t){return e&&(t=t||new gn,e.hasOwnProperty("girdFuncName")&&(t.girdFuncName=e.girdFuncName)),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class vn{constructor(e){this.girdFuncName="GFSlope",this.Altitude=45,this.ZFactor=1,this.CLASS_NAME="SuperMap.ImageGFSlope",ee.extend(this,e)}destroy(){this.girdFuncName="GFSlope",this.Altitude=45,this.ZFactor=1}static constructFromObject(e,t){return e&&(t=t||new vn,e.hasOwnProperty("girdFuncName")&&(t.girdFuncName=e.girdFuncName),e.hasOwnProperty("Altitude")&&(t.Altitude=e.Altitude),e.hasOwnProperty("ZFactor")&&(t.ZFactor=e.ZFactor)),t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Sn{constructor(e){e=e||{},ee.extend(this,e),this.CLASS_NAME="SuperMap.OnlineServiceBase"}request(e,t,s,i={}){return t=je.appendCredential(t),i.crossOrigin=this.options.crossOrigin,i.headers=this.options.headers,Ue.commit(e,t,s,i).then(function(e){return e.json()})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class bn extends Sn{constructor(e,t){super(e),t=t||{},this.MD5=null,this.type=null,this.userName=null,this.fileName=null,this.size=null,this.serviceStatus=null,this.serviceId=null,this.id=null,this.lastModfiedTime=null,this.status=null,this.storageId=null,this.publishInfo=null,this.authorizeSetting=null,this.nickname=null,this.tags=[],this.description=null,this.dataItemServices=null,this.coordType=null,this.dataCheckResult=null,this.dataMetaInfo=null,this.thumbnail=null,ee.extend(this,t),this.id&&(this.serviceUrl=e+"/"+this.id),this.CLASS_NAME="SuperMap.OnlineData"}load(){if(this.serviceUrl){var e=this;return e.request("GET",this.serviceUrl).then(function(t){ee.extend(e,t)})}}getPublishedServices(){return this.dataItemServices}getAuthorizeSetting(){return this.authorizeSetting}}const xn=function(){try{return elasticsearch}catch(e){return{}}}();var _n=s.n(xn); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Cn{constructor(){this.BUILTIN_OBJECT={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},this._ctx=null,this._canvas=null,this._pixelCtx=null,this._width=null,this._height=null,this._offsetX=0,this._offsetY=0,this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Util"}clone(e){var t=this.BUILTIN_OBJECT;if("object"==typeof e&&null!==e){var s=e;if(e instanceof Array){s=[];for(var i=0,r=e.length;in&&(n=e+o+100,i.width=n,s=!0),t+l>a&&(a=t+l+100,i.height=a,s=!0),e<-o&&(n+=o=100*Math.ceil(-e/100),i.width=n,s=!0),t<-l&&(a+=l=100*Math.ceil(-t/100),i.height=a,s=!0),s&&r.translate(o,l)}getPixelOffset(){return{x:this._offsetX,y:this._offsetY}}indexOf(e,t){if(e.indexOf)return e.indexOf(t);for(var s=0,i=e.length;s1)for(var r=0,n=i-1;r1?Math.ceil(e):e}),t.indexOf("hex")>-1)return"#"+((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1);if(t.indexOf("hs")>-1){var s=this.map(e.slice(1,3),function(e){return e+"%"});e[1]=s[0],e[2]=s[1]}return t.indexOf("a")>-1?(3===e.length&&e.push(1),e[3]=this.adjust(e[3],[0,1]),t+"("+e.slice(0,4).join(",")+")"):t+"("+e.slice(0,3).join(",")+")"}}toArray(e){(e=this.trim(e)).indexOf("rgba")<0&&(e=this.toRGBA(e));var t=[],s=0;return e.replace(/[\d.]+/g,function(e){s<3?e|=0:e=+e,t[s++]=e}),t}convert(e,t){if(!this.isCalculableColor(e))return e;var s=this.getData(e),i=s[3];return void 0===i&&(i=1),e.indexOf("hsb")>-1?s=this._HSV_2_RGB(s):e.indexOf("hsl")>-1&&(s=this._HSL_2_RGB(s)),t.indexOf("hsb")>-1||t.indexOf("hsv")>-1?s=this._RGB_2_HSB(s):t.indexOf("hsl")>-1&&(s=this._RGB_2_HSL(s)),s[3]=i,this.toColor(s,t)}toRGBA(e){return this.convert(e,"rgba")}toRGB(e){return this.convert(e,"rgb")}toHex(e){return this.convert(e,"hex")}toHSVA(e){return this.convert(e,"hsva")}toHSV(e){return this.convert(e,"hsv")}toHSBA(e){return this.convert(e,"hsba")}toHSB(e){return this.convert(e,"hsb")}toHSLA(e){return this.convert(e,"hsla")}toHSL(e){return this.convert(e,"hsl")}toName(e){for(var t in this._nameColors)if(this.toHex(this._nameColors[t])===this.toHex(e))return t;return null}trim(e){return String(e).replace(/\s+/g,"")}normalize(e){if(this._nameColors[e]&&(e=this._nameColors[e]),e=(e=this.trim(e)).replace(/hsv/i,"hsb"),/^#[\da-f]{3}$/i.test(e)){var t=(3840&(e=parseInt(e.slice(1),16)))<<8,s=(240&e)<<4,i=15&e;e="#"+((1<<24)+(t<<4)+t+(s<<4)+s+(i<<4)+i).toString(16).slice(1)}return e}lift(e,t){if(!this.isCalculableColor(e))return e;var s=t>0?1:-1;void 0===t&&(t=0),t=Math.abs(t)>1?1:Math.abs(t),e=this.toRGB(e);for(var i=this.getData(e),r=0;r<3;r++)i[r]=1===s?i[r]*(1-t)|0:(255-i[r])*t+i[r]|0;return"rgb("+i.join(",")+")"}reverse(e){if(!this.isCalculableColor(e))return e;var t=this.getData(this.toRGBA(e));return t=this.map(t,function(e){return 255-e}),this.toColor(t,"rgb")}mix(e,t,s){if(!this.isCalculableColor(e)||!this.isCalculableColor(t))return e;void 0===s&&(s=.5);for(var i=2*(s=1-this.adjust(s,[0,1]))-1,r=this.getData(this.toRGBA(e)),n=this.getData(this.toRGBA(t)),a=r[3]-n[3],o=((i*a==-1?i:(i+a)/(1+i*a))+1)/2,l=1-o,h=[],u=0;u<3;u++)h[u]=r[u]*o+n[u]*l;var c=r[3]*s+n[3]*(1-s);return c=Math.max(0,Math.min(1,c)),1===r[3]&&1===n[3]?this.toColor(h,"rgb"):(h[3]=c,this.toColor(h,"rgba"))}random(){return"#"+Math.random().toString(16).slice(2,8)}getData(e){var t,s,i=(e=this.normalize(e)).match(this.colorRegExp);if(null===i)throw new Error("The color format error");var r,n=[];if(i[2])r=[(t=i[2].replace("#","").split(""))[0]+t[1],t[2]+t[3],t[4]+t[5]],n=this.map(r,function(e){return wn.prototype.adjust.call(this,parseInt(e,16),[0,255])});else if(i[4]){var a=i[4].split(",");s=a[3],r=a.slice(0,3),n=this.map(r,function(e){return e=Math.floor(e.indexOf("%")>0?2.55*parseInt(e,0):e),wn.prototype.adjust.call(this,e,[0,255])}),void 0!==s&&n.push(this.adjust(parseFloat(s),[0,1]))}else if(i[5]||i[6]){var o=(i[5]||i[6]).split(","),l=parseInt(o[0],0)/360,h=o[1],u=o[2];s=o[3],(n=this.map([h,u],function(e){return wn.prototype.adjust.call(this,parseFloat(e)/100,[0,1])})).unshift(l),void 0!==s&&n.push(this.adjust(parseFloat(s),[0,1]))}return n}alpha(e,t){if(!this.isCalculableColor(e))return e;null===t&&(t=1);var s=this.getData(this.toRGBA(e));return s[3]=this.adjust(Number(t).toFixed(4),[0,1]),this.toColor(s,"rgba")}map(e,t){if("function"!=typeof t)throw new TypeError;for(var s=e?e.length:0,i=0;i=t[1]&&(e=t[1]),e}isCalculableColor(e){return e instanceof Array||"string"==typeof e}_HSV_2_RGB(e){var t,s,i,r=e[0],n=e[1],a=e[2];if(0===n)t=255*a,s=255*a,i=255*a;else{var o=6*r;6===o&&(o=0);var l=0|o,h=a*(1-n),u=a*(1-n*(o-l)),c=a*(1-n*(1-(o-l))),p=0,d=0,f=0;0===l?(p=a,d=c,f=h):1===l?(p=u,d=a,f=h):2===l?(p=h,d=a,f=c):3===l?(p=h,d=u,f=a):4===l?(p=c,d=h,f=a):(p=a,d=h,f=u),t=255*p,s=255*d,i=255*f}return[t,s,i]}_HSL_2_RGB(e){var t,s,i,r=e[0],n=e[1],a=e[2];if(0===n)t=255*a,s=255*a,i=255*a;else{var o,l=2*a-(o=a<.5?a*(1+n):a+n-n*a);t=255*this._HUE_2_RGB(l,o,r+1/3),s=255*this._HUE_2_RGB(l,o,r),i=255*this._HUE_2_RGB(l,o,r-1/3)}return[t,s,i]}_HUE_2_RGB(e,t,s){return s<0&&(s+=1),s>1&&(s-=1),6*s<1?e+6*(t-e)*s:2*s<1?t:3*s<2?e+(t-e)*(2/3-s)*6:e}_RGB_2_HSB(e){var t,s,i=e[0]/255,r=e[1]/255,n=e[2]/255,a=Math.min(i,r,n),o=Math.max(i,r,n),l=o-a,h=o;if(0===l)t=0,s=0;else{s=l/o;var u=((o-i)/6+l/2)/l,c=((o-r)/6+l/2)/l,p=((o-n)/6+l/2)/l;i===o?t=p-c:r===o?t=1/3+u-p:n===o&&(t=2/3+c-u),t<0&&(t+=1),t>1&&(t-=1)}return[t*=360,s*=100,h*=100]}_RGB_2_HSL(e){var t,s,i=e[0]/255,r=e[1]/255,n=e[2]/255,a=Math.min(i,r,n),o=Math.max(i,r,n),l=o-a,h=(o+a)/2;if(0===l)t=0,s=0;else{s=h<.5?l/(o+a):l/(2-o-a);var u=((o-i)/6+l/2)/l,c=((o-r)/6+l/2)/l,p=((o-n)/6+l/2)/l;i===o?t=p-c:r===o?t=1/3+u-p:n===o&&(t=2/3+c-u),t<0&&(t+=1),t>1&&(t-=1)}return[t*=360,s*=100,h*=100]}}var Mn=new wn; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var An=s(52),Tn=s.n(An); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class En{constructor(e){this.env=null,this.parser=null,this.ruleSet=null,this.cartoStr="",this.shaders=null,"string"==typeof e&&(this.cartoStr=e,this.env={frames:[],errors:[],error:function(e){this.errors.push(e)}},this.parser=this.getParser(this.env),this.parse(e),this.shaders=this.toShaders())}getParser(e){var t,s,i,r,n,a,o,l,h,u=this;function c(){r=o[i],n=s,l=s}function p(){o[i]=r,l=s=n}function d(){s>l&&(o[i]=o[i].slice(s-l),l=s)}function f(e){var r,n,a,u;if(e instanceof Function)return e.call(h.parsers);if("string"==typeof e)r=t.charAt(s)===e?e:null,n=1,d();else{if(d(),!(r=e.exec(o[i])))return null;n=r[0].length}if(r){var c=s+=n;for(u=s+o[i].length-n;s=0&&"\n"!==i.charAt(o);o--)s.column++;return new Error([s.filename,s.line,s.column,s.message].join(";"))}return this.env=e=e||{},this.env.filename=this.env.filename||null,this.env.inputs=this.env.inputs||{},h={parse:function(r){var n,h=null;if(s=i=l=a=0,o=[],t=r.replace(/\r\n/g,"\n"),e.filename&&(u.env.inputs[e.filename]=t),o=function(e){for(var s,i,r,n,a=0,o=/(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g,l=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,u=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g,c=0,p=e[0],d=0;d0?"missing closing `}`":"missing opening `{`"}),e.map(function(e){return e.join("")})}([[]]),h)throw m(h);var c=function(e,t){var s=e.specificity,i=t.specificity;return s[0]!=i[0]?i[0]-s[0]:s[1]!=i[1]?i[1]-s[1]:s[2]!=i[2]?i[2]-s[2]:i[3]-s[3]};return(n=new En.Tree.Ruleset([],f(this.parsers.primary))).root=!0,n.toList=function(e){e.error=function(t){e.errors||(e.errors=new Error("")),e.errors.message?e.errors.message+="\n"+m(t).message:e.errors.message=m(t).message},e.frames=e.frames||[];var t=this.flatten([],[],e);return t.sort(c),t},n},parsers:{primary:function(){for(var e,t=[];(e=f(this.rule)||f(this.ruleset)||f(this.comment))||f(/^[\s\n]+/)||(e=f(this.invalid));)e&&t.push(e);return t},invalid:function(){var e=f(/^[^;\n]*[;\n]/);if(e)return new En.Tree.Invalid(e,n)},comment:function(){var e;if("/"===t.charAt(s))return"/"===t.charAt(s+1)?new En.Tree.Comment(f(/^\/\/.*/),!0):(e=f(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))?new En.Tree.Comment(e):void 0},entities:{quoted:function(){if('"'===t.charAt(s)||"'"===t.charAt(s)){var e=f(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/);return e?new En.Tree.Quoted(e[1]||e[2]):void 0}},field:function(){if(f("[")){var e=f(/(^[^\]]+)/);if(f("]"))return e?new En.Tree.Field(e[1]):void 0}},comparison:function(){var e=f(/^=~|=|!=|<=|>=|<|>/);if(e)return e},keyword:function(){var e=f(/^[A-Za-z\u4e00-\u9fa5-]+[A-Za-z-0-9\u4e00-\u9fa5_]*/);if(e)return new En.Tree.Keyword(e)},call:function(){var e,t;if(e=/^([\w\-]+|%)\(/.exec(o[i])){if("url"===(e=e[1]))return null;s+=e.length;if(f("("),t=f(this.entities.arguments),f(")"))return e?new En.Tree.Call(e,t,s):void 0}},arguments:function(){for(var e,t=[];e=f(this.expression);){t.push(e);if(!f(","))break}return t},literal:function(){return f(this.entities.dimension)||f(this.entities.keywordcolor)||f(this.entities.hexcolor)||f(this.entities.quoted)},url:function(){var e;if("u"===t.charAt(s)&&f(/^url\(/)){e=f(this.entities.quoted)||f(this.entities.variable)||f(/^[\-\w%@_match\/.&=:;#+?~]+/)||"";return f(")")?new En.Tree.URL(void 0!==e.value||e instanceof En.Tree.Variable?e:new En.Tree.Quoted(e)):new En.Tree.Invalid(e,n,"Missing closing ) in URL.")}},variable:function(){var i,r=s;if("@"===t.charAt(s)&&(i=f(/^@[\w-]+/)))return new En.Tree.Variable(i,r,e.filename)},hexcolor:function(){var e;if("#"===t.charAt(s)&&(e=f(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new En.Tree.Color(e[1])},keywordcolor:function(){var e=o[i].match(/^[a-z]+/);if(e&&e[0]in En.Tree.Reference.data.colors)return new En.Tree.Color(En.Tree.Reference.data.colors[f(/^[a-z]+/)])},dimension:function(){var e=t.charCodeAt(s);if(!(e>57||e<45||47===e)){var i=f(/^(-?\d*\.?\d+(?:[eE][-+]?\d+)?)(\%|\w+)?/);return i?new En.Tree.Dimension(i[1],i[2],n):void 0}}},variable:function(){var e;if("@"===t.charAt(s)&&(e=f(/^(@[\w-]+)\s*:/)))return e[1]},entity:function(){var e=f(this.entities.call)||f(this.entities.literal),t=f(this.entities.field)||f(this.entities.variable),s=f(this.entities.url)||f(this.entities.keyword);return e||t||s},end:function(){var e;return f(";")||("string"==typeof(e="}")?t.charAt(s)===e:!!e.test(o[i]))},element:function(){var e=f(/^(?:[.#][\w\u4e00-\u9fa5\-]+|\*|Map)/);if(e)return new En.Tree.Element(e)},attachment:function(){var e=f(/^::([\w\-]+(?:\/[\w\-]+)*)/);if(e)return e[1]},selector:function(){for(var e,i,r,a,o,l=[],h=new En.Tree.Filterset,u=[],c=0,p=0;(r=f(this.element))||(o=f(this.zoom))||(a=f(this.filter))||(e=f(this.attachment));){if(c++,r)l.push(r);else if(o)u.push(o),p++;else if(a){var d=h.add(a);if(d)throw m({message:d,index:s-1});p++}else{if(i)throw m({message:"Encountered second attachment name.",index:s-1});i=e}var y=t.charAt(s);if("{"===y||"}"===y||";"===y||","===y)break}if(c)return new En.Tree.Selector(h,u,l,i,p,n)},filter:function(){c();var t,s,i;if(f("[")&&(t=f(/^[a-zA-Z0-9\-_]+/)||f(this.entities.quoted)||f(this.entities.variable)||f(this.entities.keyword)||f(this.entities.field))&&(t instanceof En.Tree.Quoted&&(t=new En.Tree.Field(t.toString())),(s=f(this.entities.comparison))&&(i=f(this.entities.quoted)||f(this.entities.variable)||f(this.entities.dimension)||f(this.entities.keyword)||f(this.entities.field)))){if(!f("]"))throw m({message:"Missing closing ] of filter.",index:n-1});return t.is||(t=new En.Tree.Field(t)),new En.Tree.Filter(t,s,i,n,e.filename)}},zoom:function(){c();var e,t;if(f(/^\[\s*zoom/g)&&(e=f(this.entities.comparison))&&(t=f(this.entities.variable)||f(this.entities.dimension))&&f("]"))return new En.Tree.Zoom(e,t,n);p()},block:function(){var e;if(f("{")&&(e=f(this.primary))&&f("}"))return e},ruleset:function(){var e,t,s=[];for(c();e=f(this.selector);){for(s.push(e);f(this.comment););if(!f(","))break;for(;f(this.comment););}if(e)for(;f(this.comment););if(s.length>0&&(t=f(this.block))){if(1===s.length&&s[0].elements.length&&"Map"===s[0].elements[0].value){var i=new En.Tree.Ruleset(s,t);return i.isMap=!0,i}return new En.Tree.Ruleset(s,t)}p()},rule:function(){var i,r,o=t.charAt(s);if(c(),"."!==o&&"#"!==o&&(i=f(this.variable)||f(this.property))){if((r=f(this.value))&&f(this.end))return new En.Tree.Rule(i,r,n,e.filename);a=s,p()}},font:function(){for(var e,t=[],s=[];e=f(this.entity);)s.push(e);if(t.push(new En.Tree.Expression(s)),f(","))for(;(e=f(this.expression))&&(t.push(e),f(",")););return new En.Tree.Value(t)},value:function(){for(var e,t=[];(e=f(this.expression))&&(t.push(e),f(",")););return t.length>1?new En.Tree.Value(t.map(function(e){return e.value[0]})):1===t.length?new En.Tree.Value(t):void 0},sub:function(){var e;if(f("(")&&(e=f(this.expression))&&f(")"))return e},multiplication:function(){var e,t,s,i;if(e=f(this.operand)){for(;(s=f("/")||f("*")||f("%"))&&(t=f(this.operand));)i=new En.Tree.Operation(s,[i||e,t],n);return i||e}},addition:function(){var e,i,r,a;if(e=f(this.multiplication)){for(;(r=f(/^[-+]\s+/)||" "!=t.charAt(s-1)&&(f("+")||f("-")))&&(i=f(this.multiplication));)a=new En.Tree.Operation(r,[a||e,i],n);return a||e}},operand:function(){return f(this.sub)||f(this.entity)},expression:function(){for(var e,t=[];e=f(this.addition)||f(this.entity);)t.push(e);if(t.length>0)return new En.Tree.Expression(t)},property:function(){var e=f(/^(([a-z][-a-z_0-9]*\/)?\*?-?[-a-z_0-9]+)\s*:/);if(e)return e[1]}}}}parse(e){var t=this.parser;return this.ruleSet=t.parse(e)}toShaders(){if(this.ruleSet){var e=this.ruleSet;if(e){var t=e.toList(this.env);t.reverse();var s={},i=[];this._toShaders(s,i,t);for(var r=[],n={},a=0,o=t.length;a=0){if(!t.featureFilter){var n=r+i.length,a=s.indexOf(")",n+1),o="featureId&&(featureId"+s.substring(n,a)+")";Object.defineProperty(t,"featureFilter",{configurable:!0,enumerable:!1,value:function(e){return!!o}})}return{property:d,getValue:Function("attributes","zoom","seftFilter","var _value = null; var isExcute=typeof seftFilter=='function'?sefgFilter():seftFilter;if(isExcute){"+s+";} return _value; ")}}return{property:d,getValue:Function("attributes","zoom","var _value = null;"+s+"; return _value; ")}}(u[d],c);Object.defineProperty(c,"attachment",{configurable:!0,enumerable:!1,value:h}),Object.defineProperty(c,"elements",{configurable:!0,enumerable:!1,value:l.elements}),r.push(c),n[i[a]]=!0}Object.defineProperty(c,"zoom",{configurable:!0,enumerable:!1,value:l.zoom})}return r}}return null}_toShaders(e,t,s){for(let i=0,r=s.length;i= minzoom - 1e-6 and scale < maxzoom + 1e-6"},maxzoom:{"default-value":"1.79769e+308",type:"float","default-meaning":"The layer will be visible at the maximum possible scale",doc:"The maximum scale denominator that this layer will be visible at. The default is the numeric limit of the C++ double type, which may vary slightly by system, but is likely a massive number like 1.79769e+308 and ensures that this layer will always be visible unless the value is reduced. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6"},queryable:{"default-value":!1,type:"boolean","default-meaning":"The layer will not be available for the direct querying of data values",doc:"This property was added for GetFeatureInfo/WMS compatibility and is rarely used. It is off by default meaning that in a WMS context the layer will not be able to be queried unless the property is explicitly set to true"},"clear-label-cache":{"default-value":!1,type:"boolean","default-meaning":"The renderer's collision detector cache (used for avoiding duplicate labels and overlapping markers) will not be cleared immediately before processing this layer",doc:"This property, by default off, can be enabled to allow a user to clear the collision detector cache before a given layer is processed. This may be desirable to ensure that a given layers data shows up on the map even if it normally would not because of collisions with previously rendered labels or markers"},"group-by":{"default-value":"",type:"string","default-meaning":"No special layer grouping will be used during rendering",doc:"https://github.com/mapnik/mapnik/wiki/Grouped-rendering"},"buffer-size":{"default-value":"0",type:"float","default-meaning":"No buffer will be used",doc:"Extra tolerance around the Layer extent (in pixels) used to when querying and (potentially) clipping the layer data during rendering"},"maximum-extent":{"default-value":"none",type:"bbox","default-meaning":"No clipping extent will be used",doc:"An extent to be used to limit the bounds used to query this specific layer data during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Layer."}},symbolizers:{"*":{"image-filters":{css:"image-filters","default-value":"none","default-meaning":"no filters",type:"functions",functions:[["agg-stack-blur",2],["emboss",0],["blur",0],["gray",0],["sobel",0],["edge-detect",0],["x-gradient",0],["y-gradient",0],["invert",0],["sharpen",0]],doc:"A list of image filters."},"comp-op":{css:"comp-op","default-value":"src-over","default-meaning":"add the current layer on top of other layers",doc:"Composite operation. This defines how this layer should behave relative to layers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]},opacity:{css:"opacity",type:"float",doc:"An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)","default-value":1,"default-meaning":"no separate buffer will be used and no alpha will be applied to the style after rendering"}},map:{"background-color":{css:"background-color","default-value":"none","default-meaning":"transparent",type:"color",doc:"Map Background color"},"background-image":{css:"background-image",type:"uri","default-value":"","default-meaning":"transparent",doc:"An image that is repeated below all features on a map as a background.",description:"Map Background image"},srs:{css:"srs",type:"string","default-value":"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs","default-meaning":"The proj4 literal of EPSG:4326 is assumed to be the Map's spatial reference and all data from layers within this map will be plotted using this coordinate system. If any layers do not declare an srs value then they will be assumed to be in the same srs as the Map and not transformations will be needed to plot them in the Map's coordinate space",doc:"Map spatial reference (proj4 string)"},"buffer-size":{css:"buffer-size","default-value":"0",type:"float","default-meaning":"No buffer will be used",doc:'Extra tolerance around the map (in pixels) used to ensure labels crossing tile boundaries are equally rendered in each tile (e.g. cut in each tile). Not intended to be used in combination with "avoid-edges".'},"maximum-extent":{css:"","default-value":"none",type:"bbox","default-meaning":"No clipping extent will be used",doc:"An extent to be used to limit the bounds used to query all layers during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Map."},base:{css:"base","default-value":"","default-meaning":"This base path defaults to an empty string meaning that any relative paths to files referenced in styles or layers will be interpreted relative to the application process.",type:"string",doc:"Any relative paths used to reference files will be understood as relative to this directory path if the map is loaded from an in memory object rather than from the filesystem. If the map is loaded from the filesystem and this option is not provided it will be set to the directory of the stylesheet."},"paths-from-xml":{css:"","default-value":!0,"default-meaning":"Paths read from XML will be interpreted from the location of the XML",type:"boolean",doc:"value to control whether paths in the XML will be interpreted from the location of the XML or from the working directory of the program that calls load_map()"},"minimum-version":{css:"","default-value":"none","default-meaning":"Mapnik version will not be detected and no error will be thrown about compatibility",type:"string",doc:"The minumum Mapnik version (e.g. 0.7.2) needed to use certain functionality in the stylesheet"},"font-directory":{css:"font-directory",type:"uri","default-value":"none","default-meaning":"No map-specific fonts will be registered",doc:"Path to a directory which holds fonts which should be registered when the Map is loaded (in addition to any fonts that may be automatically registered)."}},polygon:{fill:{css:"polygon-fill",type:"color","default-value":"rgba(128,128,128,1)","default-meaning":"gray and fully opaque (alpha = 1), same as rgb(128,128,128)",doc:"Fill color to assign to a polygon"},"fill-opacity":{css:"polygon-opacity",type:"float",doc:"The opacity of the polygon","default-value":1,"default-meaning":"opaque"},gamma:{css:"polygon-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of polygon edges"},"gamma-method":{css:"polygon-gamma-method",type:["power","linear","none","threshold","multiply"],"default-value":"power","default-meaning":"pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA",doc:"An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h"},clip:{css:"polygon-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"polygon-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"polygon-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"polygon-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},line:{stroke:{css:"line-color","default-value":"rgba(0,0,0,1)",type:"color","default-meaning":"black and fully opaque (alpha = 1), same as rgb(0,0,0)",doc:"The color of a drawn line"},"stroke-width":{css:"line-width","default-value":1,type:"float",doc:"The width of a line in pixels"},"stroke-opacity":{css:"line-opacity","default-value":1,type:"float","default-meaning":"opaque",doc:"The opacity of a line"},"stroke-linejoin":{css:"line-join","default-value":"miter",type:["miter","round","bevel"],doc:"The behavior of lines when joining"},"stroke-linecap":{css:"line-cap","default-value":"butt",type:["butt","round","square"],doc:"The display of line endings"},"stroke-gamma":{css:"line-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of stroke line"},"stroke-gamma-method":{css:"line-gamma-method",type:["power","linear","none","threshold","multiply"],"default-value":"power","default-meaning":"pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA",doc:"An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h"},"stroke-dasharray":{css:"line-dasharray",type:"numbers",doc:"A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.","default-value":"none","default-meaning":"solid line"},"stroke-dashoffset":{css:"line-dash-offset",type:"numbers",doc:"valid parameter but not currently used in renderers (only exists for experimental svg support in Mapnik which is not yet enabled)","default-value":"none","default-meaning":"solid line"},"stroke-miterlimit":{css:"line-miterlimit",type:"float",doc:"The limit on the ratio of the miter length to the stroke-width. Used to automatically convert miter joins to bevel joins for sharp angles to avoid the miter extending beyond the thickness of the stroking path. Normally will not need to be set, but a larger value can sometimes help avoid jaggy artifacts.","default-value":4,"default-meaning":"Will auto-convert miters to bevel line joins when theta is less than 29 degrees as per the SVG spec: 'miterLength / stroke-width = 1 / sin ( theta / 2 )'"},clip:{css:"line-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"line-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},offset:{css:"line-offset",type:"float","default-value":0,"default-meaning":"no offset",doc:"Offsets a line a number of pixels parallel to its actual path. Postive values move the line left, negative values move it right (relative to the directionality of the line)."},rasterizer:{css:"line-rasterizer",type:["full","fast"],"default-value":"full",doc:"Exposes an alternate AGG rendering method that sacrifices some accuracy for speed."},"geometry-transform":{css:"line-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"line-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},markers:{file:{css:"marker-file",doc:"An SVG file that this marker shows at each placement. If no file is given, the marker will show an ellipse.","default-value":"","default-meaning":"An ellipse or circle, if width equals height",type:"uri"},opacity:{css:"marker-opacity",doc:"The overall opacity of the marker, if set, overrides both the opacity of both the fill and stroke","default-value":1,"default-meaning":"The stroke-opacity and fill-opacity will be used",type:"float"},"fill-opacity":{css:"marker-fill-opacity",doc:"The fill opacity of the marker","default-value":1,"default-meaning":"opaque",type:"float"},stroke:{css:"marker-line-color",doc:"The color of the stroke around a marker shape.","default-value":"black",type:"color"},"stroke-width":{css:"marker-line-width",doc:"The width of the stroke around a marker shape, in pixels. This is positioned on the boundary, so high values can cover the area itself.",type:"float"},"stroke-opacity":{css:"marker-line-opacity","default-value":1,"default-meaning":"opaque",doc:"The opacity of a line",type:"float"},placement:{css:"marker-placement",type:["point","line","interior"],"default-value":"point","default-meaning":"Place markers at the center point (centroid) of the geometry",doc:"Attempt to place markers on a point, in the center of a polygon, or if markers-placement:line, then multiple times along a line. 'interior' placement can be used to ensure that points placed on polygons are forced to be inside the polygon interior"},"multi-policy":{css:"marker-multi-policy",type:["each","whole","largest"],"default-value":"each","default-meaning":"If a feature contains multiple geometries and the placement type is either point or interior then a marker will be rendered for each",doc:"A special setting to allow the user to control rendering behavior for 'multi-geometries' (when a feature contains multiple geometries). This setting does not apply to markers placed along lines. The 'each' policy is default and means all geometries will get a marker. The 'whole' policy means that the aggregate centroid between all geometries will be used. The 'largest' policy means that only the largest (by bounding box areas) feature will get a rendered marker (this is how text labeling behaves by default)."},"marker-type":{css:"marker-type",type:["arrow","ellipse"],"default-value":"ellipse",doc:"The default marker-type. If a SVG file is not given as the marker-file parameter, the renderer provides either an arrow or an ellipse (a circle if height is equal to width)"},width:{css:"marker-width","default-value":10,doc:"The width of the marker, if using one of the default types.",type:"expression"},height:{css:"marker-height","default-value":10,doc:"The height of the marker, if using one of the default types.",type:"expression"},fill:{css:"marker-fill","default-value":"blue",doc:"The color of the area of the marker.",type:"color"},"allow-overlap":{css:"marker-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping markers are shown or hidden.","default-meaning":"Do not allow makers to overlap with each other - overlapping markers will not be shown."},"ignore-placement":{css:"marker-ignore-placement",type:"boolean","default-value":!1,"default-meaning":"do not store the bbox of this geometry in the collision detector cache",doc:"value to control whether the placement of the feature will prevent the placement of other features"},spacing:{css:"marker-spacing",doc:"Space between repeated labels","default-value":100,type:"float"},"max-error":{css:"marker-max-error",type:"float","default-value":.2,doc:"The maximum difference between actual marker placement and the marker-spacing parameter. Setting a high value can allow the renderer to try to resolve placement conflicts with other symbolizers."},transform:{css:"marker-transform",type:"functions",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]],"default-value":"","default-meaning":"No transformation",doc:"SVG transformation definition"},clip:{css:"marker-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"marker-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"marker-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"marker-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},shield:{name:{css:"shield-name",type:"expression",serialization:"content",doc:'Value to use for a shield"s text label. Data columns are specified using brackets like [column_name]'},file:{css:"shield-file",required:!0,type:"uri","default-value":"none",doc:"Image file to render behind the shield text"},"face-name":{css:"shield-face-name",type:"string",validate:"font",doc:"Font name and style to use for the shield text","default-value":"",required:!0},"unlock-image":{css:"shield-unlock-image",type:"boolean",doc:"This parameter should be set to true if you are trying to position text beside rather than on top of the shield image","default-value":!1,"default-meaning":"text alignment relative to the shield image uses the center of the image as the anchor for text positioning."},size:{css:"shield-size",type:"float",doc:"The size of the shield text in pixels"},fill:{css:"shield-fill",type:"color",doc:"The color of the shield text"},placement:{css:"shield-placement",type:["point","line","vertex","interior"],"default-value":"point",doc:"How this shield should be placed. Point placement attempts to place it on top of points, line places along lines multiple times per feature, vertex places on the vertexes of polygons, and interior attempts to place inside of polygons."},"avoid-edges":{css:"shield-avoid-edges",doc:"Tell positioning algorithm to avoid labeling near intersection edges.",type:"boolean","default-value":!1},"allow-overlap":{css:"shield-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping shields are shown or hidden.","default-meaning":"Do not allow shields to overlap with other map elements already placed."},"minimum-distance":{css:"shield-min-distance",type:"float","default-value":0,doc:"Minimum distance to the next shield symbol, not necessarily the same shield."},spacing:{css:"shield-spacing",type:"float","default-value":0,doc:"The spacing between repeated occurrences of the same shield on a line"},"minimum-padding":{css:"shield-min-padding","default-value":0,doc:"Determines the minimum amount of padding that a shield gets relative to other shields",type:"float"},"wrap-width":{css:"shield-wrap-width",type:"unsigned","default-value":0,doc:"Length of a chunk of text in characters before wrapping text"},"wrap-before":{css:"shield-wrap-before",type:"boolean","default-value":!1,doc:"Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width."},"wrap-character":{css:"shield-wrap-character",type:"string","default-value":" ",doc:"Use this character instead of a space to wrap long names."},"halo-fill":{css:"shield-halo-fill",type:"color","default-value":"#FFFFFF","default-meaning":"white",doc:"Specifies the color of the halo around the text."},"halo-radius":{css:"shield-halo-radius",doc:"Specify the radius of the halo in pixels","default-value":0,"default-meaning":"no halo",type:"float"},"character-spacing":{css:"shield-character-spacing",type:"unsigned","default-value":0,doc:"Horizontal spacing between characters (in pixels). Currently works for point placement only, not line placement."},"line-spacing":{css:"shield-line-spacing",doc:"Vertical spacing between lines of multiline labels (in pixels)",type:"unsigned"},dx:{css:"shield-text-dx",type:"float",doc:"Displace text within shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},dy:{css:"shield-text-dy",type:"float",doc:"Displace text within shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},"shield-dx":{css:"shield-dx",type:"float",doc:"Displace shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},"shield-dy":{css:"shield-dy",type:"float",doc:"Displace shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},opacity:{css:"shield-opacity",type:"float",doc:"(Default 1.0) - opacity of the image used for the shield","default-value":1},"text-opacity":{css:"shield-text-opacity",type:"float",doc:"(Default 1.0) - opacity of the text placed on top of the shield","default-value":1},"horizontal-alignment":{css:"shield-horizontal-alignment",type:["left","middle","right","auto"],doc:"The shield's horizontal alignment from its centerpoint","default-value":"auto"},"vertical-alignment":{css:"shield-vertical-alignment",type:["top","middle","bottom","auto"],doc:"The shield's vertical alignment from its centerpoint","default-value":"middle"},"text-transform":{css:"shield-text-transform",type:["none","uppercase","lowercase","capitalize"],doc:"Transform the case of the characters","default-value":"none"},"justify-alignment":{css:"shield-justify-alignment",type:["left","center","right","auto"],doc:"Define how text in a shield's label is justified","default-value":"auto"},clip:{css:"shield-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},"comp-op":{css:"shield-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},"line-pattern":{file:{css:"line-pattern-file",type:"uri","default-value":"none",required:!0,doc:"An image file to be repeated and warped along a line"},clip:{css:"line-pattern-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"line-pattern-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"line-pattern-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"line-pattern-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},"polygon-pattern":{file:{css:"polygon-pattern-file",type:"uri","default-value":"none",required:!0,doc:"Image to use as a repeated pattern fill within a polygon"},alignment:{css:"polygon-pattern-alignment",type:["local","global"],"default-value":"local",doc:"Specify whether to align pattern fills to the layer or to the map."},gamma:{css:"polygon-pattern-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of polygon pattern edges"},opacity:{css:"polygon-pattern-opacity",type:"float",doc:"(Default 1.0) - Apply an opacity level to the image used for the pattern","default-value":1,"default-meaning":"The image is rendered without modifications"},clip:{css:"polygon-pattern-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"polygon-pattern-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"polygon-pattern-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"polygon-pattern-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},raster:{opacity:{css:"raster-opacity","default-value":1,"default-meaning":"opaque",type:"float",doc:"The opacity of the raster symbolizer on top of other symbolizers."},"filter-factor":{css:"raster-filter-factor","default-value":-1,"default-meaning":"Allow the datasource to choose appropriate downscaling.",type:"float",doc:"This is used by the Raster or Gdal datasources to pre-downscale images using overviews. Higher numbers can sometimes cause much better scaled image output, at the cost of speed."},scaling:{css:"raster-scaling",type:["near","fast","bilinear","bilinear8","bicubic","spline16","spline36","hanning","hamming","hermite","kaiser","quadric","catrom","gaussian","bessel","mitchell","sinc","lanczos","blackman"],"default-value":"near",doc:"The scaling algorithm used to making different resolution versions of this raster layer. Bilinear is a good compromise between speed and accuracy, while lanczos gives the highest quality."},"mesh-size":{css:"raster-mesh-size","default-value":16,"default-meaning":"Reprojection mesh will be 1/16 of the resolution of the source image",type:"unsigned",doc:"A reduced resolution mesh is used for raster reprojection, and the total image size is divided by the mesh-size to determine the quality of that mesh. Values for mesh-size larger than the default will result in faster reprojection but might lead to distortion."},"comp-op":{css:"raster-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},point:{file:{css:"point-file",type:"uri",required:!1,"default-value":"none",doc:"Image file to represent a point"},"allow-overlap":{css:"point-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping points are shown or hidden.","default-meaning":"Do not allow points to overlap with each other - overlapping markers will not be shown."},"ignore-placement":{css:"point-ignore-placement",type:"boolean","default-value":!1,"default-meaning":"do not store the bbox of this geometry in the collision detector cache",doc:"value to control whether the placement of the feature will prevent the placement of other features"},opacity:{css:"point-opacity",type:"float","default-value":1,"default-meaning":"Fully opaque",doc:"A value from 0 to 1 to control the opacity of the point"},placement:{css:"point-placement",type:["centroid","interior"],doc:"How this point should be placed. Centroid calculates the geometric center of a polygon, which can be outside of it, while interior always places inside of a polygon.","default-value":"centroid"},transform:{css:"point-transform",type:"functions",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]],"default-value":"","default-meaning":"No transformation",doc:"SVG transformation definition"},"comp-op":{css:"point-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},text:{name:{css:"text-name",type:"expression",required:!0,"default-value":"",serialization:"content",doc:"Value to use for a text label. Data columns are specified using brackets like [column_name]"},"face-name":{css:"text-face-name",type:"string",validate:"font",doc:"Font name and style to render a label in",required:!0},size:{css:"text-size",type:"float","default-value":10,doc:"Text size in pixels"},"text-ratio":{css:"text-ratio",doc:"Define the amount of text (of the total) present on successive lines when wrapping occurs","default-value":0,type:"unsigned"},"wrap-width":{css:"text-wrap-width",doc:"Length of a chunk of text in characters before wrapping text","default-value":0,type:"unsigned"},"wrap-before":{css:"text-wrap-before",type:"boolean","default-value":!1,doc:"Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width."},"wrap-character":{css:"text-wrap-character",type:"string","default-value":" ",doc:"Use this character instead of a space to wrap long text."},spacing:{css:"text-spacing",type:"unsigned",doc:"Distance between repeated text labels on a line (aka. label-spacing)"},"character-spacing":{css:"text-character-spacing",type:"float","default-value":0,doc:"Horizontal spacing adjustment between characters in pixels"},"line-spacing":{css:"text-line-spacing","default-value":0,type:"unsigned",doc:"Vertical spacing adjustment between lines in pixels"},"label-position-tolerance":{css:"text-label-position-tolerance","default-value":0,type:"unsigned",doc:"Allows the label to be displaced from its ideal position by a number of pixels (only works with placement:line)"},"max-char-angle-delta":{css:"text-max-char-angle-delta",type:"float","default-value":"22.5",doc:"The maximum angle change, in degrees, allowed between adjacent characters in a label. This value internally is converted to radians to the default is 22.5*math.pi/180.0. The higher the value the fewer labels will be placed around around sharp corners."},fill:{css:"text-fill",doc:"Specifies the color for the text","default-value":"#000000",type:"color"},opacity:{css:"text-opacity",doc:"A number from 0 to 1 specifying the opacity for the text","default-value":1,"default-meaning":"Fully opaque",type:"float"},"halo-fill":{css:"text-halo-fill",type:"color","default-value":"#FFFFFF","default-meaning":"white",doc:"Specifies the color of the halo around the text."},"halo-radius":{css:"text-halo-radius",doc:"Specify the radius of the halo in pixels","default-value":0,"default-meaning":"no halo",type:"float"},dx:{css:"text-dx",type:"float",doc:"Displace text by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},dy:{css:"text-dy",type:"float",doc:"Displace text by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},"vertical-alignment":{css:"text-vertical-alignment",type:["top","middle","bottom","auto"],doc:"Position of label relative to point position.","default-value":"auto","default-meaning":'Default affected by value of dy; "bottom" for dy>0, "top" for dy<0.'},"avoid-edges":{css:"text-avoid-edges",doc:"Tell positioning algorithm to avoid labeling near intersection edges.","default-value":!1,type:"boolean"},"minimum-distance":{css:"text-min-distance",doc:"Minimum permitted distance to the next text symbolizer.",type:"float"},"minimum-padding":{css:"text-min-padding",doc:"Determines the minimum amount of padding that a text symbolizer gets relative to other text",type:"float"},"minimum-path-length":{css:"text-min-path-length",type:"float","default-value":0,"default-meaning":"place labels on all paths",doc:"Place labels only on paths longer than this value."},"allow-overlap":{css:"text-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping text is shown or hidden.","default-meaning":"Do not allow text to overlap with other text - overlapping markers will not be shown."},orientation:{css:"text-orientation",type:"expression",doc:"Rotate the text."},placement:{css:"text-placement",type:["point","line","vertex","interior"],"default-value":"point",doc:"Control the style of placement of a point versus the geometry it is attached to."},"placement-type":{css:"text-placement-type",doc:'Re-position and/or re-size text to avoid overlaps. "simple" for basic algorithm (using text-placements string,) "dummy" to turn this feature off.',type:["dummy","simple"],"default-value":"dummy"},placements:{css:"text-placements",type:"string","default-value":"",doc:'If "placement-type" is set to "simple", use this "POSITIONS,[SIZES]" string. An example is `text-placements: "E,NE,SE,W,NW,SW";` '},"text-transform":{css:"text-transform",type:["none","uppercase","lowercase","capitalize"],doc:"Transform the case of the characters","default-value":"none"},"horizontal-alignment":{css:"text-horizontal-alignment",type:["left","middle","right","auto"],doc:"The text's horizontal alignment from its centerpoint","default-value":"auto"},"justify-alignment":{css:"text-align",type:["left","right","center","auto"],doc:"Define how text is justified","default-value":"auto","default-meaning":"Auto alignment means that text will be centered by default except when using the `placement-type` parameter - in that case either right or left justification will be used automatically depending on where the text could be fit given the `text-placements` directives"},clip:{css:"text-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},"comp-op":{css:"text-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},building:{fill:{css:"building-fill","default-value":"#FFFFFF",doc:"The color of the buildings walls.",type:"color"},"fill-opacity":{css:"building-fill-opacity",type:"float",doc:"The opacity of the building as a whole, including all walls.","default-value":1},height:{css:"building-height",doc:"The height of the building in pixels.",type:"expression","default-value":"0"}}},colors:{aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50],transparent:[0,0,0,0]},filter:{value:["true","false","null","point","linestring","polygon","collection"]}};En.mapnik_reference={version:{latest:Ln,"2.1.1":Ln}},En.Tree={},En.Tree.operate=function(e,t,s){switch(e){case"+":return t+s;case"-":return t-s;case"*":return t*s;case"%":return t%s;case"/":return t/s}},En.Tree.functions={rgb:function(e,t,s){return this.rgba(e,t,s,1)},rgba:function(e,t,s,i){var r=this,n=[e,t,s].map(function(e){return r.number(e)});return i=r.number(i),n.some(isNaN)||isNaN(i)?null:new En.Tree.Color(n,i)},stop:function(e){var t,s;return arguments.length>1&&(t=arguments[1]),arguments.length>2&&(s=arguments[2]),{is:"tag",val:e,color:t,mode:s,toString:i=>'\n\t"}},hsl:function(e,t,s){return this.hsla(e,t,s,1)},hsla:function(e,t,s,i){if([e=this.number(e)%360/360,t=this.number(t),s=this.number(s),i=this.number(i)].some(isNaN))return null;var r=s<=.5?s*(t+1):s+t-s*t,n=2*s-r;return this.rgba(255*a(e+1/3),255*a(e),255*a(e-1/3),i);function a(e){return 6*(e=e<0?e+1:e>1?e-1:e)<1?n+(r-n)*e*6:2*e<1?r:3*e<2?n+(r-n)*(2/3-e)*6:n}},hue:function(e){return"toHSL"in e?new En.Tree.Dimension(Math.round(e.toHSL().h)):null},saturation:function(e){return"toHSL"in e?new En.Tree.Dimension(Math.round(100*e.toHSL().s),"%"):null},lightness:function(e){return"toHSL"in e?new En.Tree.Dimension(Math.round(100*e.toHSL().l),"%"):null},alpha:function(e){return"toHSL"in e?new En.Tree.Dimension(e.toHSL().a):null},saturate:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.s+=t.value/100,s.s=this.clamp(s.s),this.hsla_simple(s)},desaturate:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.s-=t.value/100,s.s=this.clamp(s.s),this.hsla_simple(s)},lighten:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.l+=t.value/100,s.l=this.clamp(s.l),this.hsla_simple(s)},darken:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.l-=t.value/100,s.l=this.clamp(s.l),this.hsla_simple(s)},fadein:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.a+=t.value/100,s.a=this.clamp(s.a),this.hsla_simple(s)},fadeout:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL();return s.a-=t.value/100,s.a=this.clamp(s.a),this.hsla_simple(s)},spin:function(e,t){if(!("toHSL"in e))return null;var s=e.toHSL(),i=(s.h+t.value)%360;return s.h=i<0?360+i:i,this.hsla_simple(s)},replace:function(e,t,s){return"field"===e.is?e.toString+".replace("+t.toString()+", "+s.toString()+")":e.replace(t,s)},mix:function(e,t,s){var i=s.value/100,r=2*i-1,n=e.toHSL().a-t.toHSL().a,a=((r*n==-1?r:(r+n)/(1+r*n))+1)/2,o=1-a,l=[e.rgb[0]*a+t.rgb[0]*o,e.rgb[1]*a+t.rgb[1]*o,e.rgb[2]*a+t.rgb[2]*o],h=e.alpha*i+t.alpha*(1-i);return new En.Tree.Color(l,h)},greyscale:function(e){return this.desaturate(e,new En.Tree.Dimension(100))},"%":function(e){for(var t=Array.prototype.slice.call(arguments,1),s=e.value,i=0;i.5?h/(2-a-o):h/(a+o),a){case s:e=(i-r)/h+(i=0){if(!e.ppi)return e.error({message:"ppi is not set, so metric units can't be used",index:this.index}),{is:"undefined",value:"undefined"};this.value=this.value/this.densities[this.unit]*e.ppi,this.unit="px"}return this}toColor(){return new En.Tree.Color([this.value,this.value,this.value])}round(){return this.value=Math.round(this.value),this}toString(){return this.value.toString()}operate(e,t,s){return"%"===this.unit&&"%"!==s.unit?(e.error({message:"If two operands differ, the first must not be %",index:this.index}),{is:"undefined",value:"undefined"}):"%"!==this.unit&&"%"===s.unit?"*"===t||"/"===t||"%"===t?(e.error({message:"Percent values can only be added or subtracted from other values",index:this.index}),{is:"undefined",value:"undefined"}):new En.Tree.Dimension(En.Tree.operate(t,this.value,this.value*s.value*.01),this.unit):new En.Tree.Dimension(En.Tree.operate(t,this.value,s.value),this.unit||s.unit)}},En.Tree.Element=class{constructor(e){this.value=e.trim(),"#"===this.value[0]&&(this.type="id",this.clean=this.value.replace(/^#/,"")),"."===this.value[0]&&(this.type="class",this.clean=this.value.replace(/^\./,"")),-1!==this.value.indexOf("*")&&(this.type="wildcard")}specificity(){return["id"===this.type?1:0,"class"===this.type?1:0]}toString(){return this.value}},En.Tree.Expression=class{constructor(e){this.is="expression",this.value=e}ev(e){return this.value.length>1?new En.Tree.Expression(this.value.map(function(t){return t.ev(e)})):this.value[0].ev(e)}toString(e){return this.value.map(function(t){return t.toString(e)}).join(" ")}},En.Tree.Field=class{constructor(e){this.is="field",this.value=e||""}toString(){return'["'+this.value.toUpperCase()+'"]'}ev(){return this}},En.Tree.Filter=class{constructor(e,t,s,i,r){this.ops={"<":[" < ","numeric"],">":[" > ","numeric"],"=":[" = ","both"],"!=":[" != ","both"],"<=":[" <= ","numeric"],">=":[" >= ","numeric"],"=~":[".match(","string",")"]},this.key=e,this.op=t,this.val=s,this.index=i,this.filename=r,this.id=this.key+this.op+this.val}ev(e){return this.key=this.key.ev(e),this.val=this.val.ev(e),this}toString(){return"["+this.id+"]"}},En.Tree.Filterset=class{constructor(){this.filters={}}toJS(e){function t(e){var t=e.op;"="===t&&(t="==");var s=e.val;void 0!==e._val&&(s=e._val.toString(!0)),e.key&&"scale"===e.key.value?s=+s:"string"!=typeof s&&"object"!=typeof s||(s="'"+s+"'");var i="attributes";return i+"&&"+i+e.key+"&&"+i+e.key+" "+t+s}var s=[];for(var i in this.filters)s.push(t(this.filters[i]));return s.join(" && ")}toString(){var e=[];for(var t in this.filters)e.push(this.filters[t].id);return e.sort().join("\t")}ev(e){for(var t in this.filters)this.filters[t].ev(e);return this}clone(){var e=new En.Tree.Filterset;for(var t in this.filters)e.filters[t]=this.filters[t];return e}cloneWith(e){var t=[];for(var s in e.filters){var i=this.addable(e.filters[s]);if(!1===i)return!1;!0===i&&t.push(e.filters[s])}if(!t.length)return null;var r=new En.Tree.Filterset;for(s in this.filters)r.filters[s]=this.filters[s];for(;s=t.shift();)r.add(s);return r}addable(e){var t=e.key.toString(),s=e.val.toString();switch(s.match(/^[0-9]+(\.[0-9]*)?_match/)&&(s=parseFloat(s)),e.op){case"=":return void 0!==this.filters[t+"="]?this.filters[t+"="].val.toString()==s&&null:void 0===this.filters[t+"!="+s]&&(!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=s)&&(!(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=s)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>s)&&!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val"]&&this.filters[t+">"].val>=s?null:void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=s?null:void 0!==this.filters[t+">="]&&this.filters[t+">="].val>s?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val":return t+"="in this.filters?!(this.filters[t+"="].val<=s)&&null:!(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=s)&&(!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val<=s)&&(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=s?null:!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>s)||null));case">=":return void 0!==this.filters[t+"="]?!(this.filters[t+"="].val"]&&this.filters[t+">"].val>=s?null:!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>=s)||null));case"<":return void 0!==this.filters[t+"="]?!(this.filters[t+"="].val>=s)&&null:!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=s)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>=s)&&(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=s?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].vals)&&null:!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=s)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>s)&&(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=s?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val<=s)||null))}}conflict(e){var t=e.key.toString(),s=e.val.toString();return isNaN(parseFloat(s))||(s=parseFloat(s)),("="===e.op&&void 0!==this.filters[t+"="]&&s!=this.filters[t+"="].val.toString()||"!="===e.op&&void 0!==this.filters[t+"="]&&s==this.filters[t+"="].val.toString()||"="===e.op&&void 0!==this.filters[t+"!="]&&s===this.filters[t+"!="].val.toString())&&e.toString()+" added to "+this.toString()+" produces an invalid filter"}add(e,t){var s,i=e.key.toString(),r=e.op,n=this.conflict(e);if(n)return n;if("="===r){for(var a in this.filters)this.filters[a].key===i&&delete this.filters[a];this.filters[i+"="]=e}else if("!="===r)this.filters[i+"!="+e.val]=e;else if("=~"===r)this.filters[i+"=~"+e.val]=e;else if(">"===r){for(var o in this.filters)this.filters[o].key===i&&this.filters[o].val<=e.val&&delete this.filters[o];this.filters[i+">"]=e}else if(">="===r){for(var l in this.filters)s=+this.filters[l].val.toString(),this.filters[l].key===i&&s",this.filters[i+">"]=e):this.filters[i+">="]=e}else if("<"===r){for(var h in this.filters)s=+this.filters[h].val.toString(),this.filters[h].key===i&&s>=e.val&&delete this.filters[h];this.filters[i+"<"]=e}else if("<="===r){for(var u in this.filters)s=+this.filters[u].val.toString(),this.filters[u].key===i&&s>e.val&&delete this.filters[u];void 0!==this.filters[i+"!="+e.val]?(delete this.filters[i+"!="+e.val],e.op="<",this.filters[i+"<"]=e):this.filters[i+"<="]=e}}},En.Tree.Fontset=class{constructor(e,t){this.fonts=t,this.name="fontset-"+e.effects.length}},En.Tree.Invalid=class{constructor(e,t,s){this.is="invalid",this.chunk=e,this.index=t,this.type="syntax",this.message=s||"Invalid code: "+this.chunk}ev(e){return e.error({chunk:this.chunk,index:this.index,type:"syntax",message:this.message||"Invalid code: "+this.chunk}),{is:"undefined"}}},En.Tree.Keyword=class{ev(){return this}constructor(e){this.value=e;var t={transparent:"color",true:"boolean",false:"boolean"};this.is=t[e]?t[e]:"keyword"}toString(){return this.value}},En.Tree.Literal=class{constructor(e){this.value=e||"",this.is="field"}toString(){return this.value}ev(){return this}},En.Tree.Operation=class{constructor(e,t,s){this.is="operation",this.op=e.trim(),this.operands=t,this.index=s}ev(e){var t,s=this.operands[0].ev(e),i=this.operands[1].ev(e);return"undefined"===s.is||"undefined"===i.is?{is:"undefined",value:"undefined"}:(s instanceof En.Tree.Dimension&&i instanceof En.Tree.Color&&("*"===this.op||"+"===this.op?(t=i,i=s,s=t):e.error({name:"OperationError",message:"Can't substract or divide a color from a number",index:this.index})),s instanceof En.Tree.Quoted&&i instanceof En.Tree.Quoted&&"+"!==this.op?(e.error({message:"Can't subtract, divide, or multiply strings.",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):s instanceof En.Tree.Field||i instanceof En.Tree.Field||s instanceof En.Tree.Literal||i instanceof En.Tree.Literal?"color"===s.is||"color"===i.is?(e.error({message:"Can't subtract, divide, or multiply colors in expressions.",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):new En.Tree.Literal(s.ev(e).toString(!0)+this.op+i.ev(e).toString(!0)):void 0===s.operate?(e.error({message:"Cannot do math with type "+s.is+".",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):s.operate(e,this.op,i))}},En.Tree.Quoted=class{constructor(e){this.is="string",this.value=e||""}toString(e){var t=this.value.replace(/&/g,"&"),s=t.replace(/\'/g,"\\'").replace(/\"/g,""").replace(//g,">");return!0===e?"'"+s+"'":t}ev(){return this}operate(e,t,s){return new En.Tree.Quoted(En.Tree.operate(t,this.toString(),s.toString(this.contains_field)))}},En.Tree.Reference={_validateValue:{font:function(e,t){return!e.validation_data||!e.validation_data.fonts||-1!=e.validation_data.fonts.indexOf(t)}},setData:function(e){this.data=e,this.selector_cache=function(e){var t={};for(var s in e.symbolizers)for(var i in e.symbolizers[s])e.symbolizers[s][i].hasOwnProperty("css")&&(t[e.symbolizers[s][i].css]=[e.symbolizers[s][i],s,i]);return t}(e),this.mapnikFunctions=function(e){var t={};for(var s in e.symbolizers)for(var i in e.symbolizers[s])if("functions"===e.symbolizers[s][i].type)for(var r=0;r1?Array.prototype.push.apply(s,i.find(new En.Tree.Selector(null,null,e.elements.slice(1)),t)):s.push(i);break}}),this._lookups[i]=s)}evZooms(e){for(var t=0;tEn.Tree.Zoom.maxZoom||t<0)&&e.error({message:"Only zoom levels between 0 and "+En.Tree.Zoom.maxZoom+" supported.",index:this.index}),this.op){case"=":return this.zoom="zoom && zoom === "+t,this;case">":this.zoom="zoom && zoom > "+t;break;case">=":this.zoom="zoom && zoom >= "+t;break;case"<":this.zoom="zoom && zoom < "+t;break;case"<=":this.zoom="zoom && zoom <= "+t}return this}toString(){for(var e="",t=0;t<=En.Tree.Zoom.maxZoom;t++)e+=this.zoom&1<3&&(t=Array.prototype.slice.call(t,1));for(var i=this._handlers[e],r=i.length,n=0;n4&&(t=Array.prototype.slice.call(t,1,t.length-1));for(var i=t[t.length-1],r=this._handlers[e],n=r.length,a=0;a-this.EPSILON&&ethis.EPSILON||e<-this.EPSILON}cubicAt(e,t,s,i,r){var n=1-r;return n*n*(n*e+3*r*t)+r*r*(r*i+3*n*s)}cubicDerivativeAt(e,t,s,i,r){var n=1-r;return 3*(((t-e)*n+2*(s-t)*r)*n+(i-s)*r*r)}cubicRootAt(e,t,s,i,r,n){var a=i+3*(t-s)-e,o=3*(s-2*t+e),l=3*(t-e),h=e-r,u=o*o-3*a*l,c=o*l-9*a*h,p=l*l-3*o*h,d=0;if(this.isAroundZero(u)&&this.isAroundZero(c))if(this.isAroundZero(o))n[0]=0;else{let e=-l/o;e>=0&&e<=1&&(n[d++]=e)}else{var f=c*c-4*u*p;if(this.isAroundZero(f)){var m=c/u;let e=-o/a+m,t=-m/2;e>=0&&e<=1&&(n[d++]=e),t>=0&&t<=1&&(n[d++]=t)}else if(f>0){let e=Math.sqrt(f),t=u*o+1.5*a*(-c+e),s=u*o+1.5*a*(-c-e),i=(-o-((t=t<0?-Math.pow(-t,this.ONE_THIRD):Math.pow(t,this.ONE_THIRD))+(s=s<0?-Math.pow(-s,this.ONE_THIRD):Math.pow(s,this.ONE_THIRD))))/(3*a);i>=0&&i<=1&&(n[d++]=i)}else{var y=(2*u*o-3*a*c)/(2*Math.sqrt(u*u*u)),g=Math.acos(y)/3,v=Math.sqrt(u),S=Math.cos(g);let e=(-o-2*v*S)/(3*a),t=(-o+v*(S+this.THREE_SQRT*Math.sin(g)))/(3*a),s=(-o+v*(S-this.THREE_SQRT*Math.sin(g)))/(3*a);e>=0&&e<=1&&(n[d++]=e),t>=0&&t<=1&&(n[d++]=t),s>=0&&s<=1&&(n[d++]=s)}}return d}cubicExtrema(e,t,s,i,r){var n=6*s-12*t+6*e,a=9*t+3*i-3*e-9*s,o=3*t-3*e,l=0;if(this.isAroundZero(a)){if(this.isNotAroundZero(n)){let e=-o/n;e>=0&&e<=1&&(r[l++]=e)}}else{var h=n*n-4*a*o;if(this.isAroundZero(h))r[0]=-n/(2*a);else if(h>0){let e=Math.sqrt(h),t=(-n+e)/(2*a),s=(-n-e)/(2*a);t>=0&&t<=1&&(r[l++]=t),s>=0&&s<=1&&(r[l++]=s)}}return l}cubicSubdivide(e,t,s,i,r,n){var a=(t-e)*r+e,o=(s-t)*r+t,l=(i-s)*r+s,h=(o-a)*r+a,u=(l-o)*r+o,c=(u-h)*r+h;n[0]=e,n[1]=a,n[2]=h,n[3]=c,n[4]=c,n[5]=u,n[6]=l,n[7]=i}cubicProjectPoint(e,t,s,i,r,n,a,o,l,h,u){var c,p=this.vector.create(),d=this.vector.create(),f=this.vector.create(),m=.005,y=1/0;p[0]=l,p[1]=h;for(let l=0;l<1;l+=.05){d[0]=this.cubicAt(e,s,r,a,l),d[1]=this.cubicAt(t,i,n,o,l);let h=this.vector.distSquare(p,d);h=0&&u=0&&h<=1&&(r[l++]=h)}}else{var u=a*a-4*n*o;if(this.isAroundZero(u)){let e=-a/(2*n);e>=0&&e<=1&&(r[l++]=e)}else if(u>0){let e=Math.sqrt(u),t=(-a+e)/(2*n),s=(-a-e)/(2*n);t>=0&&t<=1&&(r[l++]=t),s>=0&&s<=1&&(r[l++]=s)}}return l}quadraticExtremum(e,t,s){var i=e+s-2*t;return 0===i?.5:(e-t)/i}quadraticProjectPoint(e,t,s,i,r,n,a,o,l){var h,u=this.vector.create(),c=this.vector.create(),p=this.vector.create(),d=.005,f=1/0;u[0]=a,u[1]=o;for(let a=0;a<1;a+=.05){c[0]=this.quadraticAt(e,s,r,a),c[1]=this.quadraticAt(t,i,n,a);let o=this.vector.distSquare(u,c);o=0&&ln-2?n-1:p+1][0]+r[0],e[p>n-2?n-1:p+1][1]+r[1]],u=[e[p>n-3?n-1:p+2][0]+r[0],e[p>n-3?n-1:p+2][1]+r[1]]);let m=d*d,y=d*m;a.push([h(i[0],f[0],o[0],u[0],d,m,y),h(i[1],f[1],o[1],u[1],d,m,y)])}return a;function h(e,t,s,i,r,n,a){var o=.5*(s-e),l=.5*(i-t);return(2*(t-s)+o+l)*a+(-3*(t-s)-2*o-l)*n+o*r+t}}static SUtil_dashedLineTo(e,t,s,i,r,n,a){var o=[5,5];if(n="number"!=typeof n?5:n,e.setLineDash)return o[0]=n,o[1]=n,a&&a instanceof Array?e.setLineDash(a):e.setLineDash(o),e.moveTo(t,s),void e.lineTo(i,r);var l=i-t,h=r-s,u=Math.floor(Math.sqrt(l*l+h*h)/n);l/=u,h/=u;for(var c=!0,p=0;p0){for(var r=this.isInsidePolygon(t.pointList,u,c),n=e.holePolygonPointLists,a=!1,o=0,l=n.length;ot+o&&a>i+o||ae+o&&n>s+o||nt+c&&u>i+c&&u>n+c&&u>o+c||ue+c&&h>s+c&&h>r+c&&h>a+c||ht+h&&l>i+h&&l>n+h||le+h&&o>s+h&&o>r+h||os||c+u=h)return!0;if(n){var p=i;i=this.normalizeRadian(r),r=this.normalizeRadian(p)}else i=this.normalizeRadian(i),r=this.normalizeRadian(r);i>r&&(r+=h);var d=Math.atan2(l,o);return d<0&&(d+=h),d>=i&&d<=r||d+h>=i&&d+h<=r}isInsideBrokenLine(e,t,s,i){for(var r=Math.max(t,10),n=0,a=e.length-1;ns*s}isInsideRect(e,t,s,i,r,n){return r>=e&&r<=e+s&&n>=t&&n<=t+i}isInsideCircle(e,t,s,i,r){return(i-e)*(i-e)+(r-t)*(r-t)t&&n>i||nr?it&&h>i&&h>n&&h>o||h1&&this.swapExtrema(),f=u.cubicAt(t,i,n,o,p[0]),g>1&&(m=u.cubicAt(t,i,n,o,p[1]))),2==g?St&&o>i&&o>n||o=0&&c<=1){var p=0,d=l.quadraticAt(t,i,n,c);for(let i=0;ia||(h[i]a?0:ns||o<-s)return 0;let u=Math.sqrt(s*s-o*o);if(l[0]=-u,l[1]=u,Math.abs(i-r)>=h){i=0,r=h;var c=n?1:-1;return a>=l[0]+e&&a<=l[1]+e?c:0}if(n){let e=i;i=this.normalizeRadian(r),r=this.normalizeRadian(e)}else i=this.normalizeRadian(i),r=this.normalizeRadian(r);i>r&&(r+=h);var p=0;for(let t=0;t<2;t++){var d=l[t];if(d+e>a){let e=Math.atan2(o,d),t=n?1:-1;e<0&&(e=h+e),(e>=i&&e<=r||e+h>=i&&e+h<=r)&&(e>Math.PI/2&&e<1.5*Math.PI&&(t=-t),p+=t)}}return p}isInsidePath(e,t,s,i,r){for(var n=0,a=0,o=0,l=0,h=0,u=!0,c=!0,p="stroke"===(s=s||"fill")||"both"===s,d="fill"===s||"both"===s,f=0;f0&&(d&&(n+=this.windingLine(a,o,l,h,i,r)),0!==n))return!0;l=y[y.length-2],h=y[y.length-1],u=!1,c&&"A"!==m.command&&(c=!1,a=l,o=h)}switch(m.command){case"M":a=y[0],o=y[1];break;case"L":if(p&&this.isInsideLine(a,o,y[0],y[1],t,i,r))return!0;d&&(n+=this.windingLine(a,o,y[0],y[1],i,r)),a=y[0],o=y[1];break;case"C":if(p&&this.isInsideCubicStroke(a,o,y[0],y[1],y[2],y[3],y[4],y[5],t,i,r))return!0;d&&(n+=this.windingCubic(a,o,y[0],y[1],y[2],y[3],y[4],y[5],i,r)),a=y[4],o=y[5];break;case"Q":if(p&&this.isInsideQuadraticStroke(a,o,y[0],y[1],y[2],y[3],t,i,r))return!0;d&&(n+=this.windingQuadratic(a,o,y[0],y[1],y[2],y[3],i,r)),a=y[2],o=y[3];break;case"A":var g=y[0],v=y[1],S=y[2],b=y[3],x=y[4],_=y[5],C=Math.cos(x)*S+g,w=Math.sin(x)*b+v;c?(c=!1,l=C,h=w):n+=this.windingLine(a,o,C,w);var M=(i-g)*b/S+g;if(p&&this.isInsideArcStroke(g,v,b,x,x+_,1-y[7],t,M,r))return!0;d&&(n+=this.windingArc(g,v,b,x,x+_,1-y[7],M,r)),a=Math.cos(x+_)*S+g,o=Math.sin(x+_)*b+v;break;case"z":if(p&&this.isInsideLine(a,o,l,h,t,i,r))return!0;u=!0}}return d&&(n+=this.windingLine(a,o,l,h,i,r)),0!==n}getTextWidth(e,t){var s=e+":"+t;if(this._textWidthCache[s])return this._textWidthCache[s];this._ctx=this._ctx||this.util.getContext(),this._ctx.save(),t&&(this._ctx.font=t);for(var i=0,r=0,n=(e=(e+"").split("\n")).length;rthis.TEXT_CACHE_MAX&&(this._textWidthCacheCounter=0,this._textWidthCache={}),i}getTextHeight(e,t){var s=e+":"+t;if(this._textHeightCache[s])return this._textHeightCache[s];this._ctx=this._ctx||this.util.getContext(),this._ctx.save(),t&&(this._ctx.font=t),e=(e+"").split("\n");var i=(this._ctx.measureText("ZH").width+2)*e.length;return this._ctx.restore(),this._textHeightCache[s]=i,++this._textHeightCacheCounter>this.TEXT_CACHE_MAX&&(this._textHeightCacheCounter=0,this._textHeightCache={}),i}},Jn.Util_color=new wn,Jn.Util_computeBoundingBox=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){3===arguments.length&&this.computeBoundingBox(arguments),this.CLASS_NAME="SuperMap.LevelRenderer.Tool.ComputeBoundingBox"}computeBoundingBox(e,t,s){if(0!==e.length){for(var i=e[0][0],r=e[0][0],n=e[0][1],a=e[0][1],o=1;or&&(r=l[0]),l[1]a&&(a=l[1])}t[0]=i,t[1]=n,s[0]=r,s[1]=a}}cubeBezier(e,t,s,i,r,n){var a=new zn,o=[];a.cubicExtrema(e[0],t[0],s[0],i[0],o);for(let r=0;rr&&!n?r+=2*Math.PI:ii&&(c[0]=Math.cos(d)*s+e,c[1]=Math.sin(d)*s+t,l.min(a,c,a),l.max(o,c,o))}},Jn.Util_curve=new zn,Jn.Util_env=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Env";var e,t,s,i,r,n,a,o,l,h,u,c,p,d,f,m,y,g,v,S,b,x=this;return e=navigator.userAgent,t=x.os={},s=x.browser={},i=e.match(/Web[kK]it[\/]{0,1}([\d.]+)/),r=e.match(/(Android);?[\s\/]+([\d.]+)?/),n=e.match(/(iPad).*OS\s([\d_]+)/),a=e.match(/(iPod)(.*OS\s([\d_]+))?/),o=!n&&e.match(/(iPhone\sOS)\s([\d_]+)/),l=e.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&e.match(/TouchPad/),u=e.match(/Kindle\/([\d.]+)/),c=e.match(/Silk\/([\d._]+)/),p=e.match(/(BlackBerry).*Version\/([\d.]+)/),d=e.match(/(BB10).*Version\/([\d.]+)/),f=e.match(/(RIM\sTablet\sOS)\s([\d.]+)/),m=e.match(/PlayBook/),y=e.match(/Chrome\/([\d.]+)/)||e.match(/CriOS\/([\d.]+)/),g=e.match(/Firefox\/([\d.]+)/),v=e.match(/MSIE ([\d.]+)/),S=i&&e.match(/Mobile\//)&&!y,b=e.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!y,(s.webkit=!!i)&&(s.version=i[1]),r&&(t.android=!0,t.version=r[2]),o&&!a&&(t.ios=t.iphone=!0,t.version=o[2].replace(/_/g,".")),n&&(t.ios=t.ipad=!0,t.version=n[2].replace(/_/g,".")),a&&(t.ios=t.ipod=!0,t.version=a[3]?a[3].replace(/_/g,"."):null),l&&(t.webos=!0,t.version=l[2]),h&&(t.touchpad=!0),p&&(t.blackberry=!0,t.version=p[2]),d&&(t.bb10=!0,t.version=d[2]),f&&(t.rimtabletos=!0,t.version=f[2]),m&&(s.playbook=!0),u&&(t.kindle=!0,t.version=u[1]),c&&(s.silk=!0,s.version=c[1]),!c&&t.android&&e.match(/Kindle Fire/)&&(s.silk=!0),y&&(s.chrome=!0,s.version=y[1]),g&&(s.firefox=!0,s.version=g[1]),v&&(s.ie=!0,s.version=v[1]),S&&(e.match(/Safari/)||t.ios)&&(s.safari=!0),b&&(s.webview=!0),v&&(s.ie=!0,s.version=v[1]),t.tablet=!!(n||m||r&&!e.match(/Mobile/)||g&&e.match(/Tablet/)||v&&!e.match(/Phone/)&&e.match(/Touch/)),t.phone=!(t.tablet||t.ipod||!(r||o||l||p||d||y&&e.match(/Android/)||y&&e.match(/CriOS\/([\d.]+)/)||g&&e.match(/Mobile/)||v&&e.match(/Touch/))),{browser:s,os:t,canvasSupported:!!document.createElement("canvas").getContext}}destory(){return!0}},Jn.Util_event=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this.stop="function"==typeof window.addEventListener?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0},this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Event"}getX(e){return void 0!==e.zrenderX&&e.zrenderX||void 0!==e.offsetX&&e.offsetX||void 0!==e.layerX&&e.layerX||void 0!==e.clientX&&e.clientX}getY(e){return void 0!==e.zrenderY&&e.zrenderY||void 0!==e.offsetY&&e.offsetY||void 0!==e.layerY&&e.layerY||void 0!==e.clientY&&e.clientY}getDelta(e){return void 0!==e.zrenderDelta&&e.zrenderDelta||void 0!==e.wheelDelta&&e.wheelDelta||void 0!==e.detail&&-e.detail}},Jn.Util_http=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Http"}get(e,t,s){if("object"==typeof e){var i=e;e=i.url,t=i.onsuccess,s=i.onerror}var r=window.XMLHttpRequest?new XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");r.open("GET",e,!0),r.onreadystatechange=function(){4==r.readyState&&(r.status>=200&&r.status<300||304===r.status?t&&t(r.responseText):s&&s(),r.onreadystatechange=new Function,r=null)},r.send(null)}},Jn.Util_log=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){return this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Log",function(){if(0!=+Vn.debugMode)if(1==+Vn.debugMode)for(let e in arguments)throw new Error(arguments[e]);else if(+Vn.debugMode>1)for(let e in arguments)console.log(arguments[e])}}destory(){return!0}},Jn.Util_math=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this._radians=window.Math.PI/180,this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Math"}sin(e,t){return window.Math.sin(t?e*this._radians:e)}cos(e,t){return window.Math.cos(t?e*this._radians:e)}degreeToRadian(e){return e*this._radians}radianToDegree(e){return e/this._radians}},Jn.Util_matrix=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this.ArrayCtor="undefined"==typeof Float32Array?Array:Float32Array,this.CLASS_NAME="SuperMap.LevelRenderer.Tool.Matrix"}create(){var e=new(0,this.ArrayCtor)(6);return this.identity(e),e}identity(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e}copy(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e}mul(e,t,s){return e[0]=t[0]*s[0]+t[2]*s[1],e[1]=t[1]*s[0]+t[3]*s[1],e[2]=t[0]*s[2]+t[2]*s[3],e[3]=t[1]*s[2]+t[3]*s[3],e[4]=t[0]*s[4]+t[2]*s[5]+t[4],e[5]=t[1]*s[4]+t[3]*s[5]+t[5],e}translate(e,t,s){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+s[0],e[5]=t[5]+s[1],e}rotate(e,t,s){var i=t[0],r=t[2],n=t[4],a=t[1],o=t[3],l=t[5],h=Math.sin(s),u=Math.cos(s);return e[0]=i*u+a*h,e[1]=-i*h+a*u,e[2]=r*u+o*h,e[3]=-r*h+u*o,e[4]=u*n+h*l,e[5]=u*l-h*n,e}scale(e,t,s){var i=s[0],r=s[1];return e[0]=t[0]*i,e[1]=t[1]*r,e[2]=t[2]*i,e[3]=t[3]*r,e[4]=t[4]*i,e[5]=t[5]*r,e}invert(e,t){var s=t[0],i=t[2],r=t[4],n=t[1],a=t[3],o=t[5],l=s*a-n*i;return l?(l=1/l,e[0]=a*l,e[1]=-n*l,e[2]=-i*l,e[3]=s*l,e[4]=(i*o-a*r)*l,e[5]=(n*r-s*o)*l,e):null}mulVector(e,t,s){var i=t[0],r=t[2],n=t[4],a=t[1],o=t[3],l=t[5];return e[0]=s[0]*i+s[1]*r+n,e[1]=s[0]*a+s[1]*o+l,e}},Jn.Util=new Cn,Jn.Util_vector=new jn; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class qn{constructor(){var e;this.position=[0,0],this.rotation=[0,0,0],this.scale=[1,1,0,0],this.needLocalTransform=!1,this.needTransform=!1,this.CLASS_NAME="SuperMap.LevelRenderer.Transformable",this.lookAt=(e=Jn.Util_vector.create(),function(t){this.transform||(this.transform=Jn.Util_matrix.create());var s=this.transform;function i(e){return e>-5e-5&&e<5e-5}Jn.Util_vector.sub(e,t,this.position),i(e[0])&&i(e[1])||(Jn.Util_vector.normalize(e,e),s[2]=e[0]*this.scale[1],s[3]=e[1]*this.scale[1],s[0]=e[1]*this.scale[0],s[1]=-e[0]*this.scale[0],s[4]=this.position[0],s[5]=this.position[1],this.decomposeTransform())})}destroy(){this.position=null,this.rotation=null,this.scale=null,this.needLocalTransform=null,this.needTransform=null}updateNeedTransform(){function e(e){return e>5e-5||e<-5e-5}this.needLocalTransform=e(this.rotation[0])||e(this.position[0])||e(this.position[1])||e(this.scale[0]-1)||e(this.scale[1]-1)}updateTransform(){if(this.updateNeedTransform(),this.parent?this.needTransform=this.needLocalTransform||this.parent.needTransform:this.needTransform=this.needLocalTransform,this.needTransform){var e=[0,0],t=this.transform||Jn.Util_matrix.create();if(Jn.Util_matrix.identity(t),this.needLocalTransform){if(s(this.scale[0])||s(this.scale[1])){e[0]=-this.scale[2]||0,e[1]=-this.scale[3]||0;let i=s(e[0])||s(e[1]);i&&Jn.Util_matrix.translate(t,t,e),Jn.Util_matrix.scale(t,t,this.scale),i&&(e[0]=-e[0],e[1]=-e[1],Jn.Util_matrix.translate(t,t,e))}if(this.rotation instanceof Array){if(0!==this.rotation[0]){e[0]=-this.rotation[1]||0,e[1]=-this.rotation[2]||0;let i=s(e[0])||s(e[1]);i&&Jn.Util_matrix.translate(t,t,e),Jn.Util_matrix.rotate(t,t,this.rotation[0]),i&&(e[0]=-e[0],e[1]=-e[1],Jn.Util_matrix.translate(t,t,e))}}else 0!=+this.rotation&&Jn.Util_matrix.rotate(t,t,this.rotation);(s(this.position[0])||s(this.position[1]))&&Jn.Util_matrix.translate(t,t,this.position)}this.transform=t,this.parent&&this.parent.needTransform&&(this.needLocalTransform?Jn.Util_matrix.mul(this.transform,this.parent.transform,this.transform):Jn.Util_matrix.copy(this.transform,this.parent.transform))}function s(e){return e>5e-5||e<-5e-5}}setTransform(e){if(this.needTransform){var t=this.transform;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}}decomposeTransform(){if(this.transform){var e=this.transform,t=e[0]*e[0]+e[1]*e[1],s=this.position,i=this.scale,r=this.rotation;a(t-1)&&(t=Math.sqrt(t));var n=e[2]*e[2]+e[3]*e[3];a(n-1)&&(n=Math.sqrt(n)),s[0]=e[4],s[1]=e[5],i[0]=t,i[1]=n,i[2]=i[3]=0,r[0]=Math.atan2(-e[1]/n,e[0]/t),r[1]=r[2]=0}function a(e){return e>5e-5||e<-5e-5}}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Hn extends(J(Un,qn)){constructor(e){var t;super(e),e=e||{},this.id=null,this.style={},this.highlightStyle=null,this.parent=null,this.__dirty=!0,this.__clipShapes=[],this.invisible=!1,this.ignore=!1,this.zlevel=0,this.draggable=!1,this.clickable=!1,this.hoverable=!0,this.z=0,this.refOriginalPosition=[0,0],this.refDataID=null,this.isHoverByRefDataID=!1,this.refDataHoverGroup=null,this.dataInfo=null,ee.extend(this,e),this.id=this.id||ee.createUniqueID("smShape_"),this.CLASS_NAME="SuperMap.LevelRenderer.Shape",this.getTansform=(t=[],function(e,s){var i=[e,s];return this.needTransform&&this.transform&&(Jn.Util_matrix.invert(t,this.transform),Jn.Util_matrix.mulVector(i,t,[e,s,1]),e==i[0]&&s==i[1]&&this.updateNeedTransform()),i})}destroy(){this.id=null,this.style=null,this.highlightStyle=null,this.parent=null,this.__dirty=null,this.__clipShapes=null,this.invisible=null,this.ignore=null,this.zlevel=null,this.draggable=null,this.clickable=null,this.hoverable=null,this.z=null,this.refOriginalPosition=null,this.refDataID=null,this.refDataHoverGroup=null,this.isHoverByRefDataID=null,this.dataInfo=null,super.destroy()}brush(e,t){var s=this.beforeBrush(e,t);switch(e.beginPath(),this.buildPath(e,s),s.brushType){case"both":this.setCtxGlobalAlpha(e,"fill",s),e.fill(),s.lineWidth>0&&(this.setCtxGlobalAlpha(e,"stroke",s),e.stroke()),this.setCtxGlobalAlpha(e,"reset",s);break;case"stroke":this.setCtxGlobalAlpha(e,"stroke",s),s.lineWidth>0&&e.stroke(),this.setCtxGlobalAlpha(e,"reset",s);break;default:this.setCtxGlobalAlpha(e,"fill",s),e.fill(),this.setCtxGlobalAlpha(e,"reset",s)}this.drawText(e,s,this.style),this.afterBrush(e)}beforeBrush(e,t){var s=this.style;return this.brushTypeOnly&&(s.brushType=this.brushTypeOnly),t&&(s=this.getHighlightStyle(s,this.highlightStyle||{},this.brushTypeOnly)),"stroke"==this.brushTypeOnly&&(s.strokeColor=s.strokeColor||s.color),e.save(),this.doClip(e),this.setContext(e,s),this.setTransform(e),s}afterBrush(e){e.restore()}setContext(e,t){for(var s=[["color","fillStyle"],["strokeColor","strokeStyle"],["opacity","globalAlpha"],["lineCap","lineCap"],["lineJoin","lineJoin"],["miterLimit","miterLimit"],["lineWidth","lineWidth"],["shadowBlur","shadowBlur"],["shadowColor","shadowColor"],["shadowOffsetX","shadowOffsetX"],["shadowOffsetY","shadowOffsetY"]],i=0,r=s.length;i=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height&&Jn.Util_area.isInside(this,this.style,e,t)}drawText(e,t,s){if(void 0!==t.text&&!1!==t.text){var i=t.textColor||t.color||t.strokeColor;e.fillStyle=i;var r,n,a,o,l=10,h=t.textPosition||this.textPosition||"top",u=[];switch(u=this.refOriginalPosition&&2===this.refOriginalPosition.length?this.refOriginalPosition:[0,0],h){case"inside":case"top":case"bottom":case"left":case"right":if(this.getRect){var c=(s||t).__rect||this.getRect(s||t);switch(h){case"inside":a=c.x+c.width/2,o=c.y+c.height/2,r="center",n="middle","stroke"!=t.brushType&&i==t.color&&(e.fillStyle="#fff");break;case"left":a=c.x-l,o=c.y+c.height/2,r="end",n="middle";break;case"right":a=c.x+c.width+l,o=c.y+c.height/2,r="start",n="middle";break;case"top":a=c.x+c.width/2,o=c.y-l,r="center",n="bottom";break;case"bottom":a=c.x+c.width/2,o=c.y+c.height+l,r="center",n="top"}}break;case"start":case"end":var p=0,d=0,f=0,m=0;if(void 0!==t.pointList){var y=t.pointList;if(y.length<2)return;var g=y.length;switch(h){case"start":p=y[0][0]+u[0],d=y[1][0]+u[0],f=y[0][1]+u[1],m=y[1][1]+u[1];break;case"end":p=y[g-2][0]+u[0],d=y[g-1][0]+u[0],f=y[g-2][1]+u[1],m=y[g-1][1]+u[1]}}else p=t.xStart+u[0]||0,d=t.xEnd+u[0]||0,f=t.yStart+u[1]||0,m=t.yEnd+u[1]||0;switch(h){case"start":r=pi&&(i=l[0]),l[1]r&&(r=l[1]))}return e.__rect={x:t,y:s,width:i-t,height:r-s},e.__rect}getRectNoRotation(e){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t,s=this.refOriginalPosition,i=Jn.Util_area.getTextHeight("ZH",e.textFont),r=Jn.Util_area.getTextWidth(e.text,e.textFont),n=Jn.Util_area.getTextHeight(e.text,e.textFont),a=e.x+s[0];"end"==e.textAlign||"right"==e.textAlign?a-=r:"center"==e.textAlign&&(a-=r/2),t="top"==e.textBaseline?e.y+s[1]:"bottom"==e.textBaseline?e.y+s[1]-n:e.y+s[1]-n/2;var o,l=!1;if(e.maxWidth){var h=parseInt(e.maxWidth);h-1&&(r+=!0===l?i/3*(r/o):i/3));return{x:a,y:t,width:r,height:n}}getTextBackground(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition;if(!t&&e.__textBackground)return e.__textBackground;var i=this.getRectNoRotation(e),r=e.x+s[0],n=e.y+s[1],a=[];if(e.textRotation&&0!==e.textRotation){let t=e.textRotation,s=this.getRotatedLocation(i.x,i.y,r,n,t),o=this.getRotatedLocation(i.x+i.width,i.y,r,n,t),l=this.getRotatedLocation(i.x+i.width,i.y+i.height,r,n,t),h=this.getRotatedLocation(i.x,i.y+i.height,r,n,t);a.push(s),a.push(o),a.push(l),a.push(h)}else{let e=[i.x,i.y],t=[i.x+i.width,i.y],s=[i.x+i.width,i.y+i.height],r=[i.x,i.y+i.height];a.push(e),a.push(t),a.push(s),a.push(r)}return e.__textBackground=a,e.__textBackground}getRotatedLocation(e,t,s,i,r){var n,a,o=new Array;return t=-t,i=-i,r=-r,n=(e-s)*Math.cos(r/180*Math.PI)-(t-i)*Math.sin(r/180*Math.PI)+s,a=(e-s)*Math.sin(r/180*Math.PI)+(t-i)*Math.cos(r/180*Math.PI)+i,o[0]=n,o[1]=-a,o}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Qn extends Hn{constructor(e){super(e),this.type="smiccircle",this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]),this.CLASS_NAME="SuperMap.LevelRenderer.Shape.SmicCircle"}destroy(){this.type=null,super.destroy()}buildPath(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition,i=t.x+s[0],r=t.y+s[1];return e.moveTo(i+t.r,r),e.arc(i,r,t.r,0,2*Math.PI,!0),!0}getRect(e){if(e.__rect)return e.__rect;this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t,s=this.refOriginalPosition,i=e.x+s[0],r=e.y+s[1],n=e.r;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(i-n-t/2),y:Math.round(r-n-t/2),width:2*n+t,height:2*n+t},e.__rect}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Xn extends Hn{constructor(e){super(e),this.type="smicpolygon",this.holePolygonPointLists=null,this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]),this.CLASS_NAME="SuperMap.LevelRenderer.Shape.SmicPolygon"}destroy(){this.type=null,this.holePolygonPointLists=null,super.destroy()}brush(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.style;t&&(s=this.getHighlightStyle(s,this.highlightStyle||{})),e.save(),this.setContext(e,s),this.setTransform(e);var i=!1;"fill"!=s.brushType&&"both"!=s.brushType&&void 0!==s.brushType||(e.beginPath(),"dashed"==s.lineType||"dotted"==s.lineType||"dot"==s.lineType||"dash"==s.lineType||"dashdot"==s.lineType||"longdash"==s.lineType||"longdashdot"==s.lineType?this.buildPath(e,{lineType:"solid",lineWidth:s.lineWidth,pointList:s.pointList}):(this.buildPath(e,s),i=!0),e.closePath(),this.setCtxGlobalAlpha(e,"fill",s),e.fill(),this.setCtxGlobalAlpha(e,"reset",s)),s.lineWidth>0&&("stroke"==s.brushType||"both"==s.brushType)&&(i||(e.beginPath(),this.buildPath(e,s)),this.setCtxGlobalAlpha(e,"stroke",s),e.stroke(),this.setCtxGlobalAlpha(e,"reset",s)),this.drawText(e,s,this.style);var r=ee.cloneObject(s);if(r.pointList&&this.holePolygonPointLists&&this.holePolygonPointLists.length>0)for(var n=this.holePolygonPointLists,a=n.length,o=0;o0&&("stroke"==r.brushType||"both"==r.brushType)?(i||(e.beginPath(),this.buildPath(e,r)),e.globalCompositeOperation="source-over",this.setCtxGlobalAlpha(e,"stroke",r),e.stroke(),this.setCtxGlobalAlpha(e,"reset",r)):e.globalCompositeOperation="source-over"}e.restore()}buildPath(e,t){t.showShadow&&(e.shadowBlur=t.shadowBlur,e.shadowColor=t.shadowColor,e.shadowOffsetX=t.shadowOffsetX,e.shadowOffsetY=t.shadowOffsetY),this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition,i=t.pointList;if(!(i.length<2))if(t.smooth&&"spline"!==t.smooth){var r,n,a,o=Jn.SUtil_smoothBezier(i,t.smooth,!0,t.smoothConstraint,s);e.moveTo(i[0][0]+s[0],i[0][1]+s[1]);for(var l=i.length,h=0;hn&&(n=l[h][0]+s[0]),l[h][1]+s[1]o&&(o=l[h][1]+s[1]);return i="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(r-i/2),y:Math.round(a-i/2),width:n-r+i,height:o-a+i},e.__rect}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Kn extends Hn{constructor(e){super(e),this.brushTypeOnly="stroke",this.textPosition="end",this.type="smicbroken-line",this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]),this.CLASS_NAME="SuperMap.LevelRenderer.Shape.SmicBrokenLine"}destroy(){this.brushTypeOnly=null,this.textPosition=null,this.type=null,super.destroy()}buildPath(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition,i=t.pointList;if(!(i.length<2)){var r=Math.min(t.pointList.length,Math.round(t.pointListLength||t.pointList.length));if(t.smooth&&"spline"!==t.smooth){var n,a,o,l=Jn.SUtil_smoothBezier(i,t.smooth,!1,t.smoothConstraint,s);e.moveTo(i[0][0]+s[0],i[0][1]+s[1]);for(let t=0;tu&&(s*=u/(a=s+i),i*=u/a),r+n>u&&(r*=u/(a=r+n),n*=u/a),i+r>c&&(i*=c/(a=i+r),r*=c/a),s+n>c&&(s*=c/(a=s+n),n*=c/a),e.moveTo(l+s,h),e.lineTo(l+u-i,h),0!==i&&e.quadraticCurveTo(l+u,h,l+u,h+i),e.lineTo(l+u,h+c-r),0!==r&&e.quadraticCurveTo(l+u,h+c,l+u-r,h+c),e.lineTo(l+n,h+c),0!==n&&e.quadraticCurveTo(l,h+c,l,h+c-n),e.lineTo(l,h+s),0!==s&&e.quadraticCurveTo(l,h,l+s,h)}buildPath(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition;t.radius?this._buildRadiusPath(e,t):(e.moveTo(t.x+s[0],t.y+s[1]),e.lineTo(t.x+s[0]+t.width,t.y+s[1]),e.lineTo(t.x+s[0]+t.width,t.y+s[1]+t.height),e.lineTo(t.x+s[0],t.y+s[1]+t.height),e.lineTo(t.x+s[0],t.y+s[1])),e.closePath()}getRect(e){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t,s=this.refOriginalPosition;return e.__rect?e.__rect:(t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x+s[0]-t/2),y:Math.round(e.y+s[1]-t/2),width:e.width+t,height:e.height+t},e.__rect)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ea extends Hn{constructor(e){super(e),this.type="smicsector",this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]),this.CLASS_NAME="SuperMap.LevelRenderer.Shape.SmicSector"}destroy(){this.type=null,super.destroy()}buildPath(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var s=this.refOriginalPosition,i=t.x+s[0],r=t.y+s[1],n=t.r0||0,a=t.r,o=t.startAngle,l=t.endAngle,h=t.clockWise||!1;o=Jn.Util_math.degreeToRadian(o),l=Jn.Util_math.degreeToRadian(l),h||(o=-o,l=-l);var u=Jn.Util_math.cos(o),c=Jn.Util_math.sin(o);e.moveTo(u*n+i,c*n+r),e.lineTo(u*a+i,c*a+r),e.arc(i,r,a,o,l,!h),e.lineTo(Jn.Util_math.cos(l)*n+i,Jn.Util_math.sin(l)*n+r),0!==n&&e.arc(i,r,n,l,o,h),e.closePath()}getRect(e){if(e.__rect)return e.__rect;this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t=this.refOriginalPosition,s=Jn.Util_vector.create(),i=Jn.Util_vector.create(),r=Jn.Util_vector.create(),n=Jn.Util_vector.create(),a=e.x+t[0],o=e.y+t[1],l=e.r0||0,h=e.r,u=Jn.Util_math.degreeToRadian(e.startAngle),c=Jn.Util_math.degreeToRadian(e.endAngle),p=e.clockWise;return p||(u=-u,c=-c),l>1?Jn.Util_computeBoundingBox.arc(a,o,l,u,c,!p,s,r):(s[0]=r[0]=a,s[1]=r[1]=o),Jn.Util_computeBoundingBox.arc(a,o,h,u,c,!p,i,n),Jn.Util_vector.min(s,s,i),Jn.Util_vector.max(r,r,n),e.__rect={x:s[0],y:s[1],width:r[0]-s[0],height:r[1]-s[1]},e.__rect}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ta{constructor(e){this.shapeParameters=e,this.CLASS_NAME="SuperMap.Feature.ShapeFactory"}destroy(){this.shapeParameters=null}createShape(e){if(e&&(this.shapeParameters=e),!this.shapeParameters)return null;var t=this.shapeParameters;if(t instanceof Nn){let e=new Object;e.x=t.x,e.y=t.y,e.r=t.r,e=ee.copyAttributesWithClip(e,t.style,["x","y"]);let s=new Wn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","style","highlightStyle"]),s}if(t instanceof In){if(!t.pointList)return null;let e=new Object;e.pointList=t.pointList,e=ee.copyAttributesWithClip(e,t.style,["pointList"]);let s=new Kn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["pointList","style","highlightStyle"]),s}if(t instanceof Fn){if(!t.pointList)return null;let e=new Object;e.pointList=t.pointList,e=ee.copyAttributesWithClip(e,t.style,["pointList"]);let s=new Xn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["pointList","style","highlightStyle"]),s}if(t instanceof Dn){if(!t.x&&!t.y&!t.width&!t.height)return null;let e=new Object;e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e=ee.copyAttributesWithClip(e,t.style,["x","y","width","height"]);let s=new $n;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","width","height","style","highlightStyle"]),s}if(t instanceof Rn){let e=new Object;e.x=t.x,e.y=t.y,e.r=t.r,e.startAngle=t.startAngle,e.endAngle=t.endAngle,t.r0&&(e.r0=t.r0),t.clockWise&&(e.clockWise=t.clockWise),e=ee.copyAttributesWithClip(e,t.style,["x","y","r","startAngle","endAngle","r0","endAngle"]);let s=new ea;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","r","startAngle","endAngle","r0","endAngle","style","highlightStyle"]),s}if(t instanceof kn){let e=new Object;e.x=t.x,e.y=t.y,e.text=t.text,e=ee.copyAttributesWithClip(e,t.style,["x","y","text"]);let s=new Yn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","text","style","highlightStyle"]),s}if(t instanceof Bn){let e=new Object;e.x=t.x,e.y=t.y,t.image&&(e.image=t.image),t.width&&(e.width=t.width),t.height&&(e.height=t.height),t.sx&&(e.sx=t.sx),t.sy&&(e.sy=t.sy),t.sWidth&&(e.sWidth=t.sWidth),t.sHeight&&(e.sHeight=t.sHeight),e=ee.copyAttributesWithClip(e,t.style,["x","y","image","width","height","sx","sy","sWidth","sHeight"]);let s=new Zn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","image","width","height","style","highlightStyle"]),s}if(t instanceof Gn){let e=new Object;e.x=t.x,e.r=t.r,e.y=t.y,e=ee.copyAttributesWithClip(e,t.style,["x","y","r"]);let s=new Qn;return s.style=ta.transformStyle(e),s.highlightStyle=ta.transformStyle(t.highlightStyle),ee.copyAttributesWithClip(s,t,["x","y","r","style","highlightStyle","lineWidth","text","textPosition"]),s}return null}static transformStyle(e){var t={},s=["normal","normal","normal","12","arial,sans-serif"],i=[!0,!1];for(var r in e)switch(r){case"fill":i[0]=e[r];break;case"fillColor":t.color=e[r];break;case"stroke":i[1]=e[r];break;case"strokeWidth":t.lineWidth=e[r];break;case"strokeLinecap":t.lineCap=e[r];break;case"strokeLineJoin":t.lineJoin=e[r];break;case"strokeDashstyle":t.lineType=e[r];break;case"pointRadius":t.r=e[r];break;case"label":t.text=e[r];break;case"labelRect":t.labelRect=e[r];break;case"fontColor":t.textColor=e[r];break;case"fontStyle":s[0]=e[r];break;case"fontVariant":s[1]=e[r];break;case"fontWeight":s[2]=e[r];break;case"fontSize":var n="";e[r]&&e[r].toString().indexOf("px")<0&&(n="px"),s[3]=e[r]+n;break;case"fontFamily":s[4]=e[r];break;case"fontOpacity":t.opacity=e[r];break;case"labelPosition":t.textPosition=e[r];break;case"labelAlign":t.textAlign=e[r];break;case"labelBaseline":t.textBaseline=e[r];break;case"labelRotation":t.textRotation=e[r];break;default:t[r]=e[r]}return t.textFont=s.join(" "),!0===i[0]&&!1===i[1]?t.brushType="fill":!1===i[0]&&!0===i[1]?t.brushType="stroke":!0===i[0]&&!0===i[1]?t.brushType="both":t.brushType="fill",null==t.lineWidth&&(t.lineWidth=1),t}static Background(e,t,s){var i=s||{},r=new Dn(t[0],t[3],Math.abs(t[2]-t[0]),Math.abs(t[3]-t[1]));return r.style={fillColor:"#f3f3f3"},i.backgroundStyle&&ee.copyAttributesWithClip(r.style,i.backgroundStyle),i.backgroundRadius&&(r.style.radius=i.backgroundRadius),r.clickable=!1,r.hoverable=!1,e.createShape(r)}static GraphAxis(e,t,s,i){var r=t,n=s||{},a=[],o=[],l=!!n.useXReferenceLine&&n.useXReferenceLine,h=n.axisYTick&&!isNaN(n.axisYTick)?n.axisYTick:0,u=[],c=[];if(0==h){if(c.push([r[0],r[3]-5]),c.push([r[0],r[1]]),n.axis3DParameter&&!isNaN(n.axis3DParameter)&&n.axis3DParameter>=15){let e=parseInt(n.axis3DParameter),t=[r[0]-e,r[1]+e];n.axisUseArrow?(u.push([t[0]+1.5,t[1]-7.5]),u.push([t[0]-1,t[1]+1]),u.push([t[0]+7.5,t[1]-1.5]),c.push([t[0],t[1]])):c.push([t[0],t[1]]),c.push([r[0],r[1]])}c.push([r[2]+5,r[1]])}else{var p=Math.abs(r[1]-r[3])/h,d=r[3];c.push([r[0],d-5]);for(var f=0;f=15){let e=parseInt(n.axis3DParameter),t=[r[0]-e,r[1]+e];n.axisUseArrow?(u.push([t[0]+1.5,t[1]-7.5]),u.push([t[0]-1,t[1]+1]),u.push([t[0]+7.5,t[1]-1.5]),c.push([t[0],t[1]])):c.push([t[0],t[1]]),c.push([r[0],r[1]])}c.push([r[2]+5,r[1]])}if(n.axisUseArrow){var y=[[r[2]+5,r[1]+4],[r[2]+13,r[1]],[r[2]+5,r[1]-4]],g=[[r[0]-4,r[3]-5],[r[0],r[3]-13],[r[0]+4,r[3]-5]],v=new Fn(y);v.style={fillColor:"#008acd"},ee.copyAttributesWithClip(v.style,n.axisStyle),o.push(e.createShape(v));var S=new Fn(g);if(S.style={fillColor:"#008acd"},ee.copyAttributesWithClip(S.style,n.axisStyle),o.push(e.createShape(S)),n.axis3DParameter&&!isNaN(n.axis3DParameter)&&n.axis3DParameter>=15){var b=new Fn(u);b.style={fillColor:"#008acd"},ee.copyAttributesWithClip(b.style,n.axisStyle),o.push(e.createShape(b))}}var x=new In(c);x.style={strokeLinecap:"butt",strokeLineJoin:"round",strokeColor:"#008acd",strokeWidth:1},n.axisStyle&&ee.copyAttributesWithClip(x.style,n.axisStyle),x.clickable=!1,x.hoverable=!1;var _=[e.createShape(x)],C=[];if(n.axisYLabels&&n.axisYLabels.length&&n.axisYLabels.length>0){var w=n.axisYLabels;let t=w.length;var M=[0,0];if(n.axisYLabelsOffset&&n.axisYLabelsOffset.length&&(M=n.axisYLabelsOffset),1==t){let t=new kn(r[0]-5+M[0],r[3]+M[1],w[0]);t.style={labelAlign:"right"},n.axisYLabelsStyle&&ee.copyAttributesWithClip(t.style,n.axisYLabelsStyle),t.clickable=!1,t.hoverable=!1,C.push(e.createShape(t))}else for(var A=r[3],T=Math.abs(r[1]-r[3])/(t-1),E=0;E0){let t=n.axisXLabels,s=t.length,a=[0,0];if(n.axisXLabelsOffset&&n.axisXLabelsOffset.length&&(a=n.axisXLabelsOffset),i&&i.xPositions&&i.xPositions.length&&i.xPositions.length==s){let o=i.xPositions;for(let i=0;i=0&&s[r]&&ee.copyAttributesWithClip(a,s[r]),i&&i.length&&void 0!==n)for(var o=i,l=o.length,h=parseFloat(n),u=0;u=h[2]||h[1]<=h[3])&&(this.DVBOrigonPoint=[h[0],h[3]],this.DVBWidth=Math.abs(h[2]-h[0]),this.DVBHeight=Math.abs(h[1]-h[3]),this.DVBCenterPoint=[this.DVBOrigonPoint[0]+this.DVBWidth/2,this.DVBOrigonPoint[1]+this.DVBHeight/2],this.origonPointOffset=[this.DVBOrigonPoint[0]-a[0],this.DVBOrigonPoint[1]-a[1]],!0)}resetLocation(e){e&&(this.lonlat=e);var t=this.getLocalXY(this.lonlat);t[0]+=this.XOffset,t[1]+=this.YOffset,this.location=t;var s=this.width,i=this.height,r=this.location;return this.chartBounds=new re(r[0]-s/2,r[1]+i/2,r[0]+s/2,r[1]-i/2),this.resetLinearGradient(),r}resetLinearGradient(){}shapesConvertToRelativeCoordinate(){for(var e=this.shapes,t=this.location,s=0,i=e.length;s=0?i.push(parseFloat(r[a].toString()).toFixed(s)):i.push(parseFloat(r[a].toString()))}catch(e){throw new Error("not a number")}return i.length===t.length&&i}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class ra extends ia{constructor(e,t,s,i,r,n){super(e,t,s,i,r,n),this.setting=null,i&&i.codomain&&(this.setting=i,this.DVBCodomain=this.setting.codomain),this.CLASS_NAME="SuperMap.Feature.Theme.RankSymbol"}destroy(){this.setting=null,super.destroy()}initBaseParameter(){if(!this.setting)return!1;var e=this.setting;e.XOffset&&(this.XOffset=e.XOffset),e.YOffset&&(this.YOffset=e.YOffset),this.XOffset=e.XOffset?e.XOffset:0,this.YOffset=e.YOffset?e.YOffset:0,this.origonPoint=[],this.chartBox=[],this.dataViewBox=[],this.DVBParameter=e.dataViewBoxParameter?e.dataViewBoxParameter:[0,0,0,0],this.DVBOrigonPoint=[],this.DVBCenterPoint=[],this.origonPointOffset=[],this.resetLocation();var t=this.width,s=this.height,i=this.location;this.origonPoint=[i[0]-t/2,i[1]-s/2];var r=this.origonPoint;this.chartBox=[r[0],r[1]+s,r[0]+t,r[1]];var n=this.chartBox,a=this.DVBParameter;this.dataViewBox=[n[0]+a[0],n[1]-a[1],n[2]-a[2],n[3]+a[3]];var o=this.dataViewBox;return!(o[0]>=o[2]||o[1]<=o[3])&&(this.DVBOrigonPoint=[o[0],o[3]],this.DVBWidth=Math.abs(o[2]-o[0]),this.DVBHeight=Math.abs(o[1]-o[3]),this.DVBCenterPoint=[this.DVBOrigonPoint[0]+this.DVBWidth/2,this.DVBOrigonPoint[1]+this.DVBHeight/2],this.origonPointOffset=[this.DVBOrigonPoint[0]-r[0],this.DVBOrigonPoint[1]-r[1]],!0)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class na extends sa{constructor(e,t,s,i,r){if(super(e,t),e.geometry&&e.geometry instanceof Q){this.dataBounds=e.geometry.getBounds(),this.nodesClipPixel=2,this.isHoverAble=!0,this.isMultiHover=!0,this.isClickAble=!0,this.highlightStyle=null,this.shapeOptions={},this.style=s||{},this.CLASS_NAME="SuperMap.Feature.Theme.Vector",this.style=s||{},i&&ee.copyAttributesWithClip(this,i,["shapeOptions","dataBounds"]),r&&ee.copyAttributesWithClip(this.shapeOptions,r);var n=e.geometry;this.lonlat=this.dataBounds.getCenterLonLat(),this.location=this.getLocalXY(this.lonlat),n instanceof ce?this.lineToTF(n):n instanceof he?this.lineToTF(n):n instanceof oe||(n instanceof ae?this.multiPointToTF(n):n instanceof pe?this.multiLineStringToTF(n):n instanceof de?this.multiPolygonToTF(n):n instanceof fe?this.polygonToTF(n):n instanceof ne||(n instanceof le?this.pointToTF(n):n instanceof me?this.rectangleToTF(n):n instanceof ue&&this.geoTextToTF(n)))}}destroy(){this.style=null,this.dataBounds=null,this.nodesClipPixel=null,this.isHoverAble=null,this.isMultiHover=null,this.isClickAble=null,this.highlightStyle=null,this.shapeOptions=null,super.destroy()}lineToTF(e){for(var t=e.components,s=[],i=[],r=this.location,n=[],a=this.nodesClipPixel,o=0;o0){var h=n[n.length-1];if(Math.abs(h[0]-i[0])<=a&&Math.abs(h[1]-i[1])<=a)continue}n.push(i)}if(n.length<2)return null;var u=new Object;(u=ee.copyAttributesWithClip(u,this.style,["pointList"])).pointList=n;var c=new Kn({style:u,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(c.highlightStyle=this.highlightStyle),c.refOriginalPosition=this.location,c.refDataID=this.data.id,c.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&ee.copyAttributesWithClip(c,this.shapeOptions),this.shapes.push(c)}multiPointToTF(e){for(var t=e.components,s=[],i=[],r=this.location,n=[],a=this.nodesClipPixel,o=0;o0){var h=n[n.length-1];if(Math.abs(h[0]-i[0])<=a&&Math.abs(h[1]-i[1])<=a)continue}n.push(i);var u=new Object;u.r=6,(u=ee.copyAttributesWithClip(u,this.style)).x=i[0],u.y=i[1];var c=new Wn({style:u,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(c.highlightStyle=this.highlightStyle),c.refOriginalPosition=r,c.refDataID=this.data.id,c.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&ee.copyAttributesWithClip(c,this.shapeOptions),this.shapes.push(c)}}multiLineStringToTF(e){for(var t=e.components,s=0;s0){var p=n[n.length-1];if(Math.abs(p[0]-i[0])<=l&&Math.abs(p[1]-i[1])<=l)continue}n.push(i)}}else{a=[];for(var d=0;d0){var f=a[a.length-1];if(Math.abs(f[0]-i[0])<=l&&Math.abs(f[1]-i[1])<=l)continue}a.push(i)}}a.length<2||o.push(a)}if(!(n.length<2)){var m={};(m=ee.copyAttributesWithClip(m,this.style,["pointList"])).pointList=n;var y=new Xn({style:m,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(y.highlightStyle=this.highlightStyle),y.refOriginalPosition=this.location,y.refDataID=this.data.id,y.isHoverByRefDataID=this.isMultiHover,o.length>0&&(y.holePolygonPointLists=o),this.shapeOptions&&ee.copyAttributesWithClip(y,this.shapeOptions),this.shapes.push(y)}}rectangleToTF(e){var t=this.location,s=new ie(e.x,e.y),i=this.layer.map.getResolution(),r=this.getLocalXY(s),n=new Object;n.r=6,(n=ee.copyAttributesWithClip(n,this.style)).x=r[0]-t[0],n.y=r[1]-t[1]-2*e.width/i,n.width=e.width/i,n.height=e.height/i;var a=new $n({style:n,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(a.highlightStyle=this.highlightStyle),a.refOriginalPosition=t,a.refDataID=this.data.id,a.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&ee.copyAttributesWithClip(a,this.shapeOptions),this.shapes.push(a)}geoTextToTF(e){var t=this.location,s=this.getLocalXY(e),i=new Object;i.r=6,(i=ee.copyAttributesWithClip(i,this.style,["x","y","text"])).x=s[0]-t[0],i.y=s[1]-t[1],i.text=e.text;var r=new Yn({style:i,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(r.highlightStyle=this.highlightStyle),r.refOriginalPosition=t,r.refDataID=this.data.id,r.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&ee.copyAttributesWithClip(r,this.shapeOptions),this.shapes.push(r)}updateAndAddShapes(){var e=this.getLocalXY(this.lonlat);this.location=e;for(var t=this.layer.renderer,s=0,i=this.shapes.length;s0}addRoot(e){e instanceof aa&&e.addChildrenToStorage(this),this.addToMap(e),this._roots.push(e)}delRoot(e){if(void 0===e){for(var t=0;t=0&&(this.delFromMap(r.id),this._roots.splice(n,1),r instanceof aa&&r.delChildrenFromStorage(this))}}addToMap(e){return e instanceof aa&&(e._storage=this),e.modSelf(),this._elements[e.id]=e,this}get(e){return this._elements[e]}delFromMap(e){var t=this._elements[e];return t&&(delete this._elements[e],t instanceof aa&&(t._storage=null)),this}dispose(){this._elements=null,this._roots=null,this._hoverElements=null}static shapeCompareFunc(e,t){return e.zlevel==t.zlevel?e.z==t.z?e.__renderidx-t.__renderidx:e.z-t.z:e.zlevel-t.zlevel}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class la{constructor(e,t){this.root=e,this.storage=t,this._domRoot=null,this._layers={},this._zlevelList=[],this._layerConfig={},this._bgDom=null,this.shapeToImage=null,la.devicePixelRatio=Math.max(window.devicePixelRatio||1,1),this.CLASS_NAME="SuperMap.LevelRenderer.Painter",this.root.innerHTML="",this._width=this._getWidth(),this._height=this._getHeight();var s=document.createElement("div");this._domRoot=s,s.style.position="relative",s.style.overflow="hidden",s.style.width=this._width+"px",s.style.height=this._height+"px",this.root.appendChild(s),this.shapeToImage=this._createShapeToImageProcessor(),this._bgDom=la.createDom(ee.createUniqueID("SuperMap.Theme_background_"),"div",this),s.appendChild(this._bgDom),this._bgDom.onselectstart=n,this._bgDom.style["-webkit-user-select"]="none",this._bgDom.style["user-select"]="none",this._bgDom.style["-webkit-touch-callout"]="none";var i=new ha(ee.createUniqueID("_highLightLayer_"),this);this._layers.hover=i,s.appendChild(i.dom),i.initContext(),i.dom.onselectstart=n,i.dom.style["-webkit-user-select"]="none",i.dom.style["user-select"]="none",i.dom.style["-webkit-touch-callout"]="none";var r=this;function n(){return!1}this.updatePainter=function(e,t){r.refreshShapes(e,t)}}destroy(){this.dispose(),this._zlevelList=null,this._layerConfig=null,this._bgDom=null,this.shapeToImage=null}render(e){return this.refresh(e,!0),this}refresh(e,t){var s=this.storage.getShapeList(!0);return this._paintList(s,t),"function"==typeof e&&e(),this}_paintList(e,t){var s,i,r;for(var n in void 0===t&&(t=!1),this._updateLayerStatus(e),this._layers)"hover"!==n&&(this._layers[n].unusedCount++,this._layers[n].updateTransform());for(var a=[],o=0,l=e.length;o0&&e>this._zlevelList[0]){for(r=0;re);r++);i=this._layers[this._zlevelList[r]]}this._zlevelList.splice(r+1,0,e),t=new ha(ee.createUniqueID("_levelLayer_"+e),this);var n=i?i.dom:this._bgDom;n.nextSibling?n.parentNode.insertBefore(t.dom,n.nextSibling):n.parentNode.appendChild(t.dom),t.initContext(),this._layers[e]=t,this._layerConfig[e]&&(new Cn).merge(t,this._layerConfig[e],!0),t.updateTransform()}return t}getLayers(){return this._layers}_updateLayerStatus(e){var t=this._layers,s={};for(let e in t)"hover"!==e&&(s[e]=t[e].elCount,t[e].elCount=0);for(let s=0;s0?1.1:1/1.1,s=this.painter.getLayers(),i=!1;for(var r in s)if("hover"!==r){var n=s[r],a=n.position;if(n.zoomable){n.__zoom=n.__zoom||1;var o=n.__zoom;o*=t,t=(o=Math.max(Math.min(n.maxZoom,o),n.minZoom))/n.__zoom,n.__zoom=o,a[0]-=(this._mouseX-a[0])*(t-1),a[1]-=(this._mouseY-a[1])*(t-1),n.scale[0]*=t,n.scale[1]*=t,n.dirty=!0,i=!0}}i&&this.painter.refresh(),this._dispatchAgency(this._lastHover,Vn.EVENT.MOUSEWHEEL,e),this._mousemoveHandler(e)},mousemove:function(e){this._clickThreshold++,e=this._zrenderEventFixed(e),this._lastX=this._mouseX,this._lastY=this._mouseY,this._mouseX=Jn.Util_event.getX(e),this._mouseY=Jn.Util_event.getY(e);var t=this._mouseX-this._lastX,s=this._mouseY-this._lastY;this._processDragStart(e),this._hasfound=0,this._event=e,this._iterateAndFindHover(),this._hasfound||((!this._draggingTarget||this._lastHover&&this._lastHover!=this._draggingTarget)&&(this._processOutShape(e),this._processDragLeave(e)),this._lastHover=null,this.storage.delHover(),this.painter.clearHover());var i="";if(this._draggingTarget)this.storage.drift(this._draggingTarget.id,t,s),this._draggingTarget.modSelf(),this.storage.addHover(this._draggingTarget);else if(this._isMouseDown){var r=this.painter.getLayers(),n=!1;for(var a in r)if("hover"!==a){var o=r[a];o.panable&&(i="move",o.position[0]+=t,o.position[1]+=s,n=!0,o.dirty=!0)}n&&this.painter.refresh()}this._draggingTarget||this._hasfound&&this._lastHover.draggable?i="move":this._hasfound&&this._lastHover.clickable&&(i="pointer"),this.root.style.cursor=i,this._dispatchAgency(this._lastHover,Vn.EVENT.MOUSEMOVE,e),(this._draggingTarget||this._hasfound||this.storage.hasHoverShape())&&this.painter.refreshHover()},mouseout:function(e){var t=(e=this._zrenderEventFixed(e)).toElement||e.relatedTarget;if(t!=this.root)for(;t&&9!=t.nodeType;){if(t==this.root)return void this._mousemoveHandler(e);t=t.parentNode}e.zrenderX=this._lastX,e.zrenderY=this._lastY,this.root.style.cursor="",this._isMouseDown=0,this._processOutShape(e),this._processDrop(e),this._processDragEnd(e),this.painter.refreshHover(),this.dispatch(Vn.EVENT.GLOBALOUT,e)},mousedown:function(e){if(this._clickThreshold=0,2==this._lastDownButton)return this._lastDownButton=e.button,void(this._mouseDownTarget=null);this._lastMouseDownMoment=new Date,e=this._zrenderEventFixed(e),this._isMouseDown=1,this._mouseDownTarget=this._lastHover,this._dispatchAgency(this._lastHover,Vn.EVENT.MOUSEDOWN,e),this._lastDownButton=e.button},mouseup:function(e){e=this._zrenderEventFixed(e),this.root.style.cursor="",this._isMouseDown=0,this._mouseDownTarget=null,this._dispatchAgency(this._lastHover,Vn.EVENT.MOUSEUP,e),this._processDrop(e),this._processDragEnd(e)},touchstart:function(e){e=this._zrenderEventFixed(e,!0),this._lastTouchMoment=new Date,this._mobildFindFixed(e),this._mousedownHandler(e)},touchmove:function(e){e=this._zrenderEventFixed(e,!0),this._mousemoveHandler(e),this._isDragging&&Jn.Util_event.stop(e)},touchend:function(e){e=this._zrenderEventFixed(e,!0),this._mouseupHandler(e);var t=new Date;t-this._lastTouchMoment=0;r--){var n=s[r];if(void 0!==n.zlevel&&(e=this.painter.getLayer(n.zlevel,e),i[0]=this._mouseX,i[1]=this._mouseY,e.needTransform&&(Jn.Util_matrix.invert(t,e.transform),Jn.Util_vector.applyTransform(i,i,t))),this._findHover(n,i[0],i[1]))break}}_mobildFindFixed(e){var t=[{x:10},{x:-20},{x:10,y:10},{y:-20}];this._lastHover=null,this._mouseX=e.zrenderX,this._mouseY=e.zrenderY,this._event=e,this._iterateAndFindHover();for(var s=0;!this._lastHover&&s=0&&this._clips.splice(t,1)}_update(){var e=(new Date).getTime(),t=e-this._time,s=this._clips,i=s.length,r=[],n=[];for(let t=0;t=0&&!(m[S]<=a);S--);S=Math.min(S,h-2)}else{for(S=M;Sa);S++);S=Math.min(S-1,h-2)}M=S,A=a;var o=m[S+1]-m[S];if(0!==o){if(b=(a-m[S])/o,n)if(_=y[S],x=y[0===S?S:S-1],C=y[S>h-2?h-1:S+1],w=y[S>h-3?h-1:S+2],c)da._catmullRomInterpolateArray(x,_,C,w,b,b*b,b*b*b,i(e,l),d);else{let t;t=p?da.rgba2String(T):da._catmullRomInterpolate(x,_,C,w,b,b*b,b*b*b),s(e,l,t)}else if(c)da._interpolateArray(y[S],y[S+1],b,i(e,l),d);else{let t;p?(da._interpolateArray(y[S],y[S+1],b,T,1),t=da.rgba2String(T)):t=da._interpolateNumber(y[S],y[S+1],b),s(e,l,t)}for(S=0;S0){let e=n.SheetNames[0],s=wa().utils.sheet_to_csv(n.Sheets[e]);t&&t.call(i,s)}}catch(e){s&&s.call(i,e)}},r.onerror=function(e){s&&s.call(i,e)},this.rABF&&r.readAsArrayBuffer(e.file)},processDataToGeoJson(e,t,s,i,r){let n=null;if("EXCEL"===e||"CSV"===e)n=this.processExcelDataToGeoJson(t),s&&s.call(r,n);else if("JSON"===e||"GEOJSON"===e){let e=t;"string"==typeof e&&(e=JSON.parse(e)),"ISERVER"===e.type?n=e.data.recordsets[0].features:"FeatureCollection"===e.type?n=e:i&&i.call(r,_a.i18n("msg_dataInWrongGeoJSONFormat")),s&&s.call(r,n)}else i&&i.call(r,_a.i18n("msg_dataInWrongFormat"))},processExcelDataToGeoJson(e){let t=this.string2Csv(e),s=t.colTitles,i=-1,r=-1;for(let e=0,t=s.length;ee.json()).then(i=>{if(!1!==i.succeed)if(i.dataItemServices&&i.dataItemServices.length>0){let r;i.dataItemServices.forEach(i=>{if("RESTDATA"===i.serviceType&&"PUBLISHED"===i.serviceStatus)r=i;else{if("RESTMAP"!==i.serviceType||"PUBLISHED"!==i.serviceStatus)return void s.getDatafromContent(e,t);r=i}}),r&&s.getDatafromRest(r.serviceType,r.address,t)}else s.getDatafromContent(e,t);else s._fireFailedEvent(i)}).catch(e=>{console.log(e),s._fireFailedEvent(e)})}getDatafromContent(e,t){let s={result:{}},i=this;e+="/content.json?pageSize=9999999¤tPage=1",Ue.get(e,null,{withCredentials:this.datasets.withCredentials}).then(e=>e.json()).then(e=>{if(!1!==e.succeed){if(e.type){if("JSON"===e.type||"GEOJSON"===e.type){if(e.content=JSON.parse(e.content.trim()),!e.content.features)return void console.log(_a.i18n("msg_jsonResolveFiled"));let t=this._formatGeoJSON(e.content);s.result.features={type:e.content.type,features:t}}else if("EXCEL"===e.type||"CSV"===e.type){let t=this._excelData2Feature(e.content);s.result.features={type:"FeatureCollection",features:t}}t(s,"content")}}else i._fireFailedEvent(e)},this).catch(e=>{console.log(e),i._fireFailedEvent(e)})}getDatafromRest(e,t,s){let i=this,r=this.datasets.withCredentials;if("RESTDATA"===e){let e,n,a=`${t}/data/datasources`;Ue.get(a,null,{withCredentials:r}).then(e=>e.json()).then(o=>{e=o.datasourceNames[0],a=`${t}/data/datasources/${e}/datasets`,Ue.get(a,null,{withCredentials:r}).then(e=>e.json()).then(r=>(n=r.datasetNames[0],i.getDatafromRestData(`${t}/data`,[e+":"+n],s),[e+":"+n])).catch(function(e){i._fireFailedEvent(e)})}).catch(function(e){i._fireFailedEvent(e)})}else{let e,n,a,o=`${t}/maps`;Ue.get(o,null,{withCredentials:r}).then(e=>e.json()).then(l=>{e=l[0].name,a=l[0].path,o=o=`${t}/maps/${e}/layers`,Ue.get(o,null,{withCredentials:r}).then(e=>e.json()).then(e=>(n=e[0].subLayers.layers[0].caption,i.getDatafromRestMap(n,a,s),n)).catch(function(e){i._fireFailedEvent(e)})}).catch(function(e){i._fireFailedEvent(e)})}}getDatafromRestData(e,t,s){let i=this;this.datasets.queryInfo.attributeFilter=this.datasets.queryInfo.attributeFilter||"SmID>0",this._getFeatureBySQL(e,t,this.datasets.queryInfo,e=>{s(e,"RESTDATA")},e=>{console.log(e),i._fireFailedEvent(e)})}getDatafromRestMap(e,t,s){let i=this;this.datasets.queryInfo.attributeFilter=this.datasets.queryInfo.attributeFilter||"smid=1",this._queryFeatureBySQL(t,e,this.datasets.queryInfo,null,null,e=>{s(e,"RESTMAP")},e=>{console.log(e),i._fireFailedEvent(e)})}_getFeatureBySQL(e,t,s,i,r){let n,a,o,l={name:t.join().replace(":","@")};Object.assign(l,s),n=new ft(l),o=new Js({queryParameter:n,datasetNames:t,fromIndex:0,toIndex:1e5,returnContent:!0}),(a=new qs(e,{eventListeners:{processCompleted:e=>{i&&i(e)},processFailed:e=>{r&&r(e)}}})).processAsync(o)}_queryFeatureBySQL(e,t,s,i,r,a,o,l,h,u){var c,p,d={name:t};Object.assign(d,s),c=new ft(d),i&&(c.fields=i);var f={queryParams:[c]};u&&(f.queryOption=n.ATTRIBUTE),l&&(f.startRecord=l),h&&(f.expectCount=h),r&&(f.prjCoordSys={epsgCode:r}),p=new Qi(f),this._queryBySQL(e,p,e=>{"processCompleted"===e.type?a(e):o(e)})}_queryBySQL(e,t,s,i){new Xi(e,{eventListeners:{scope:this,processCompleted:s,processFailed:s},format:this._processFormat(i)}).processAsync(t)}_processFormat(e){return e||t.GEOJSON}_formatGeoJSON(e){let t=e.features;return t.forEach((e,t)=>{e.properties.index=t}),t}_excelData2Feature(e){let t=e.colTitles,s=-1,i=-1;for(let e=0,r=t.length;e0&&e.forEach(function(e){e.xAxis&&t.xField.push({field:e.xAxis.field,name:e.xAxis.name}),e.yAxis&&t.yField.push({field:e.yAxis.field,name:e.yAxis.name})})}getDatasetInfo(e){this.createChart=e,this.datasets&&this._checkUrl(this.datasets.url)&&(this.chartModel=new Aa(this.datasets),"iServer"===this.datasets.type?this.chartModel.getDatasetInfo(this._getDatasetInfoSuccess.bind(this)):"iPortal"===this.datasets.type&&this.chartModel.getDataInfoByIptl(this._getDataInfoSuccess.bind(this)),this.chartModel.events.on({getdatafailed:e=>{this.events.triggerEvent("getdatafailed",e)}}))}_getDatasetInfoSuccess(e){let t=this.datasets.url,s=t.indexOf("rest");if(s>0){let i=t.indexOf("/",s+5),r=t.substring(s+5,i),n=t.substring(0,s+4)+"/data";if("maps"===r){let r=t.indexOf("/",i+1),a=t.substring(i+1,r);n=t.substring(0,s+4)+"/maps/"+a,e.result.dataUrl=n,this._getLayerFeatures(e)}else"data"===r&&(e.result.dataUrl=n,this._getDataFeatures(e))}}_getDataInfoSuccess(e,t){let s=this;"RESTMAP"===t?s._getChartDatasFromLayer(e):s._getChartDatas(e)}_getDataFeatures(e){this.chartModel.getDataFeatures(e,this._getChartDatas.bind(this))}_getLayerFeatures(e){this.chartModel.getLayerFeatures(e,this._getChartDatasFromLayer.bind(this))}_getChartDatas(e){if(e){this.features=e.result.features;let t=this.features.features,s={};if(t.length){let e=t[0],i=[],r=[];for(let t in e.properties)i.push(t),r.push(this._getDataType(e.properties[t]));s={features:t,fieldCaptions:i,fieldTypes:r,fieldValues:[]};for(let e in r){let i=[];for(let r in t){let n=t[r],a=s.fieldCaptions[e],o=n.properties[a];i.push(o)}s.fieldValues.push(i)}this.createChart(s)}}}_getChartDatasFromLayer(e){if(e.result.recordsets){let t=e.result.recordsets[0],s=t.features.features;this.features=t.features;let i={};if(s.length){i={features:t.features,fieldCaptions:t.fieldCaptions,fieldTypes:t.fieldTypes,fieldValues:[]};for(let e in i.fieldCaptions){let t=[];for(let r in s){let n=s[r],a=i.fieldCaptions[e],o=n.properties[a];t.push(o)}i.fieldValues.push(t)}this.createChart(i)}}}_createChartOptions(e){return this.calculatedData=this._createChartDatas(e),this.updateChartOptions(this.chartType)}changeType(e){if(e!==this.chartType)return this.chartType=e,this.updateChartOptions(this.chartType)}updateData(e,t,s){this.updateChart=s,this.xField=[],this.yField=[],this._initXYField(t),e.type=e.type||"iServer",e.withCredentials=e.withCredentials||!1,this.datasets=e,this.getDatasetInfo(this._updateDataSuccess.bind(this))}_updateDataSuccess(e){let t=this._createChartOptions(e);this.updateChart(t)}updateChartOptions(e,t){if(this.calculatedData){let s=this.grid,i=this._createChartSeries(this.calculatedData,e),r=[];for(let e in this.calculatedData.XData)r.push({value:this.calculatedData.XData[e].fieldsData});let n={type:"category",name:this.xField[0].name||"X",data:r,nameTextStyle:{color:"#fff",fontSize:14},splitLine:{show:!1},axisLine:{lineStyle:{color:"#eee"}}},a={type:"value",name:this.yFieldName||"Y",data:{},nameTextStyle:{color:"#fff",fontSize:14},splitLine:{show:!1},axisLine:{lineStyle:{color:"#eee"}}},o={formatter:"{b0}: {c0}"},l="#404a59";return t&&(t.grid&&(s=t.grid),t.tooltip&&(o=t.tooltip),t.backgroundColor&&(l=t.backgroundColor)),{backgroundColor:l,grid:s,series:i,xAxis:n,yAxis:a,tooltip:o}}}_createChartDatas(e){let t=0,s=[],i=e.fieldCaptions,r=this;i.forEach(function(e,s){r.xField[0]&&e===r.xField[0].field&&(t=s)}),this.yFieldName="",this.yField.forEach(function(e,t){0!==t&&(r.yFieldName=r.yFieldName+","),r.yFieldName=r.yFieldName+e.name,i.forEach(function(t,i){t===e.field&&s.push(i)})});let n=this._getAttrData(e,t),a=[];if(s.length>0)s.forEach(function(t){let s=[];for(let i in e.fieldValues[t])s.push({value:e.fieldValues[t][i]});a.push(s)});else{let e=[],t=[],s=n.length;for(let i=0;i0;e--)this.header.removeChild(this.header.children[e]),this.content.removeChild(this.content.children[e])}_changeTabsPage(e){const t=e.target.index;for(let e=0;e{for(let e=0;e0;e--)this.content.removeChild(this.content.children[e-1]);const t=this.config[e];for(let e in t)this._createCityItem(e,t[e])}_createCityItem(e,t){const s=document.createElement("div"),i=document.createElement("div");i.setAttribute("class","component-citytabpag__py-key"),i.innerHTML=e,s.appendChild(i);const r=document.createElement("div");r.setAttribute("class","component-citytabpag__content");for(let e=0;e0&&this.appendTabs(e),this.rootContainer=t}setTabs(e){this.removeAllTabs(),this.appendTabs(e)}appendTabs(e){for(let t=0;t0;e--)this.navTabsTitle.removeChild(this.navTabsTitle.children[e]),this.navTabsContent.removeChild(this.navTabsContent.children[e])}_changeTabsPage(e){const t=e.target.index;for(let e=0;e=0;e--)this.content.removeChild(this.content.children[e])}setPageLink(e){this.pageNumberLis=[],this.currentPageNumberLis=[],this.clearPageLink(),this._createPageLi(e),this._appendPageLink()}_createPageLi(e){for(let t=0;t1;e--)this.link.removeChild(this.link.children[e])}_createLink(e){for(let t=0;t<4;t++){const s=document.createElement("li");s.setAttribute("class","disable");const i=document.createElement("span");s.appendChild(i),0===t?(i.id="first",i.setAttribute("class","supermapol-icons-first")):1===t?(i.id="prev",i.setAttribute("class","supermapol-icons-prev")):2===t?(i.id="next",i.setAttribute("class","supermapol-icons-next")):3===t&&(i.id="last",i.setAttribute("class","supermapol-icons-last")),e.appendChild(s)}}_changePageEvent(e){const t=e.target;if("disable"===t.parentElement.classList[0])return;let s;if(t.id)s=t.id;else{if(!Number(t.innerHTML))return;s=Number(t.innerHTML)}this._prePageNum(s),this.clearPageLink(),this._appendPageLink()}_changeDisableState(){this.link.children[0].setAttribute("class",""),this.link.children[1].setAttribute("class",""),this.link.children[this.link.children.length-1].setAttribute("class",""),this.link.children[this.link.children.length-2].setAttribute("class",""),1===this.currentPage&&(this.link.children[0].setAttribute("class","disable"),this.link.children[1].setAttribute("class","disable")),this.currentPage===this.pageNumberLis.length&&(this.link.children[this.link.children.length-1].setAttribute("class","disable"),this.link.children[this.link.children.length-2].setAttribute("class","disable"))}_prePageNum(e){const t=[];if(this.currentPage="first"===e?1:"last"===e?this.pageNumberLis.length:"prev"===e?this.currentPage-1:"next"===e?this.currentPage+1:e,this.pageNumberLis.length<=5)for(let e=0;e=this.pageNumberLis.length-3)for(let e=this.pageNumberLis.length-5;e0&&(this.currentPageNumberLis=t)}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +let Ba={getFileType:e=>/^.*\.(?:xls|xlsx)$/i.test(e)?ga.EXCEL:/^.*\.(?:csv)$/i.test(e)?ga.CSV:/^.*\.(?:geojson|json)$/i.test(e)?ga.GEOJSON:null}; +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +e.Lang=_a,e.i18n=e.Lang.i18n,e.Util={...e.Util,...ee},e.Browser=X,e.INCHES_PER_UNIT=te,e.METERS_PER_INCH=se,e.DOTS_PER_INCH=$,e.IS_GECKO=Z,e.setCORS=function(e){De=e},e.isCORS=Be,e.setRequestTimeout=function(e){return Re=e},e.getRequestTimeout=Ge,e.FetchRequest=Ue,e.inherit=function(e,t){var s,i,r,n=function(){};for(n.prototype=t.prototype,e.prototype=new n,s=2,i=arguments.length;s{e.showView(t.message)}})}getStyle(){return this.viewModel.getStyle()}getFeatures(){return this.viewModel.getFeatures()}setStyle(e){let t=this.viewModel.setStyle(e);this._updateChart(t)}changeType(e){if(this.chartType!==e){this.chartType=e;let t=this.viewModel.changeType(e);this._updateChart(t)}}updateData(e,t){let s=this;this.viewModel.updateData(e,t,function(e){s._updateChart(e),s.addChart&&s.addChart()})}_createChart(e){this.echart=xa().init(document.getElementById(this.domID),null,{renderer:"canvas"});let t=this.viewModel._createChartOptions(e);this.echart.setOption(t),this.addChart&&this.addChart()}_updateChart(e){this.echart&&(this.echart.clear(),this.echart.setOption(e))}},e.Components.ChartViewModel=Ta,e.Components.MessageBox=Sa,e.Components.AttributesPopContainer=Ia,e.Components.CityTabsPage=Da,e.Components.CommonContainer=La,e.Components.DropDownBox=Pa,e.Components.IndexTabsPageContainer=Fa,e.Components.NavTabsPage=Ra,e.Components.PaginationContainer=ka,e.Components.PopContainer=Na,e.Components.Select=Oa,e.Components.TemplateBase=Ea,e.Components.FileReaderUtil=Ma,e.TimeControlBase=Pe,e.TimeFlowControl= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Pe{constructor(e,t){super(t);var s=this;s.callback=e,Function.prototype.bind||(Function.prototype.bind=function(e){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var t=Array.prototype.slice.call(arguments,1),s=this,i=function(){},r=function(){return s.apply(this instanceof i&&e?this:e,t.concat(Array.prototype.slice.call(arguments)))};return i.prototype=this.prototype,r.prototype=new i,r}),s.update=s.update.bind(s),s.oldTime=s.currentTime,s.CLASS_NAME="SuperMap.TimeFlowControl"}updateOptions(e){e=e||{},super.updateOptions(e)}start(){var e=this;e.running||(e.running=!0,e.reverse?e.currentTime===e.startTime&&(e.oldTime=e.endTime,e.currentTime=e.oldTime):e.oldTime===e.endTime&&(e.currentTime=e.startTime,e.oldTime=e.currentTime),e.tick())}stop(){super.stop();var e=this;e.oldTime=e.currentTime,e.running&&(e.running=!1),e.intervalId&&window.clearTimeout(e.intervalId)}destroy(){super.destroy(),this.oldTime=null,this.callback=null}tick(){var e=this;e.intervalId&&window.clearInterval(e.intervalId),e.intervalId=null,e.update(),e.intervalId=window.setInterval(e.update,e.frequency)}update(){var e=this;if(e.running)if(e.callback&&e.callback(e.currentTime),e.reverse){if(e.currentTime===e.startTime){if(!e.repeat)return e.running=!1,null;e.oldTime=e.endTime,e.currentTime=e.oldTime}else e.currentTime=e.oldTime,e.oldTime-=e.speed;e.oldTime<=e.startTime&&(e.oldTime=e.startTime)}else{if(e.currentTime===e.endTime){if(!e.repeat)return e.running=!1,e.stop(),null;e.stop(),e.currentTime=e.startTime,e.oldTime=e.currentTime,e.start()}else e.oldTime=e.currentTime,e.currentTime+=e.speed;e.currentTime>=e.endTime&&(e.currentTime=e.endTime)}}},e.Format=e.Format||Ce,e.Format.GeoJSON=Oe,e.Format.JSON=we,e.Format.WKT= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Ce{constructor(e){super(e),this.regExes={typeStr:/^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,spaces:/\s+/,parenComma:/\)\s*,\s*\(/,doubleParenComma:/\)\s*\)\s*,\s*\(\s*\(/,trimParens:/^\s*\(?(.*?)\)?\s*$/},this.CLASS_NAME="SuperMap.Format.WKT",this.extract={point:function(e){return e.x+" "+e.y},multipoint(e){for(var t=[],s=0,i=e.components.length;s0&&r.push(","),s=t[n].geometry,r.push(this.extractGeometry(s));return i&&r.push(")"),r.join("")}extractGeometry(e){var t=e.CLASS_NAME.split(".")[2].toLowerCase();return this.extract[t]?("collection"===t?"GEOMETRYCOLLECTION":t.toUpperCase())+"("+this.extract[t].apply(this,[e])+")":null}},e.iManager= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends ze{constructor(e){super(e)}load(){return this.request("GET",this.serviceUrl+"/web/api/service.json")}createIServer(e){return this.request("POST",this.serviceUrl+"/icloud/web/nodes/server.json",new Ve(e))}createIPortal(e){return this.request("POST",this.serviceUrl+"/icloud/web/nodes/portal.json",new Ve(e))}iServerList(){return this.request("GET",this.serviceUrl+"/icloud/web/nodes/server.json")}iPortalList(){return this.request("GET",this.serviceUrl+"/icloud/web/nodes/portal.json")}startNodes(e){return this.request("POST",this.serviceUrl+"/icloud/web/nodes/started.json",e)}stopNodes(e){return this.request("POST",this.serviceUrl+"/icloud/web/nodes/stopped.json",e)}},e.iManagerCreateNodeParam=Ve,e.iManagerServiceBase=ze,e.iPortal= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Je{constructor(e,t){super(e,t),this.iportalUrl=e,t=t||{},this.withCredentials=t.withCredentials||!1}load(){return Ue.get(this.iportalUrl+"/web")}queryResources(e){if(!(e instanceof qe))return new Promise(function(e){e("queryParams is not instanceof iPortalQueryParam !")});var t=this,s=this.iportalUrl+"/gateway/catalog/resource/search.json";return e.t=(new Date).getTime(),this.request("GET",s,e).then(function(e){var s=[];e.content.forEach(function(e){s.push(new We(t.iportalUrl,e))});let i=new He;return i.content=s,i.total=e.total,i.currentPage=e.currentPage,i.pageSize=e.pageSize,i.aggregations=e.aggregations,i})}updateResourcesShareSetting(e){if(!(e instanceof Ye))return new Promise(function(e){e("shareParams is not instanceof iPortalShareParam !")});var t=e.resourceType.replace("_","").toLowerCase()+"s";"datas"===t&&(t="mycontent/"+t);var s={ids:e.ids,entities:e.entities},i=this.iportalUrl+"/web/"+t+"/sharesetting.json";return this.request("PUT",i,JSON.stringify(s)).then(function(e){return e})}},e.iPortalAddDataParam=Ke,e.iPortalAddResourceParam=Qe,e.iPortalDataConnectionInfoParam=et,e.iPortalDataMetaInfoParam=Ze,e.iPortalDataStoreInfoParam=$e,e.iPortalQueryParam=qe,e.iPortalQueryResult=He,e.iPortalRegisterServiceParam=Xe,e.iPortalResource=We,e.iPortalServiceBase=Je,e.iPortalShareEntity= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){e=e||{},this.permissionType="",this.entityType="",this.entityName="GUEST",this.entityId=null,ee.extend(this,e)}},e.iPortalShareParam=Ye,e.iPortalUser= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Je{constructor(e){super(e),this.iportalUrl=e}deleteResources(e){var t=e.resourceType.replace("_","").toLowerCase(),s=this.iportalUrl+"/web/"+t+"s.json?ids="+encodeURI(JSON.stringify(e.ids));return"data"===t?(s=this.iportalUrl+"/web/mycontent/datas/delete.json",this.request("POST",s,JSON.stringify(e.ids))):this.request("DELETE",s)}addMap(e){if(!(e instanceof Qe))return this.getErrMsgPromise("addMapParams is not instanceof IPortalAddResourceParam !");let t={rootUrl:e.rootUrl,tags:e.tags,authorizeSetting:e.entities},s=this.iportalUrl+"/web/maps/batchaddmaps.json";return this.request("POST",s,JSON.stringify(t)).then(function(e){return e})}addScene(e){if(!(e instanceof Qe))return this.getErrMsgPromise("addSceneParams is not instanceof IPortalAddResourceParam !");let t={rootUrl:e.rootUrl,tags:e.tags,authorizeSetting:e.entities},s=this.iportalUrl+"/web/scenes/batchaddscenes.json";return this.request("POST",s,JSON.stringify(t)).then(function(e){return e})}registerService(e){if(!(e instanceof Xe))return this.getErrMsgPromise("registerParams is not instanceof IPortalRegisterServiceParam !");let t={type:e.type,tags:e.tags,authorizeSetting:e.entities,metadata:e.metadata,addedMapNames:e.addedMapNames,addedSceneNames:e.addedSceneNames},s=this.iportalUrl+"/web/services.json";return this.request("POST",s,JSON.stringify(t)).then(e=>e)}getErrMsgPromise(e){return new Promise(t=>{t(e)})}uploadDataRequest(e,t){var s=this.iportalUrl+"/web/mycontent/datas/"+e+"/upload.json";return this.request("POST",s,t)}addData(e,t){if(!(e instanceof Ke))return this.getErrMsgPromise("params is not instanceof iPortalAddDataParam !");var s,i=this.iportalUrl+"/web/mycontent/datas.json",r={fileName:e.fileName,tags:e.tags,type:e.type},n=e.type.toLowerCase();if("excel"===n||"csv"===n){if(!(e.dataMetaInfo instanceof Ze))return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !");s={xField:e.dataMetaInfo.xField,yField:e.dataMetaInfo.yField},"csv"===n&&(s.fileEncoding=e.dataMetaInfo.fileEncoding),r.coordType="WGS84",r.dataMetaInfo=s}else if("hdfs"===n||"hbase"===n){if(!(e.dataMetaInfo instanceof Ze))return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !");if(!(e.dataMetaInfo.dataStoreInfo instanceof $e))return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo is not instanceof iPortalDataStoreInfoParam !");var a={type:e.dataMetaInfo.dataStoreInfo.type};switch(n){case"hdfs":a.url=e.dataMetaInfo.dataStoreInfo.url,s={url:e.dataMetaInfo.url,dataStoreInfo:a};break;case"hbase":if(!(e.dataMetaInfo.dataStoreInfo.connectionInfo instanceof et))return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo.connectionInfo is not instanceof iPortalDataConnectionInfoParam !");a.connectionInfo={dataBase:e.dataMetaInfo.dataStoreInfo.connectionInfo.dataBase,server:e.dataMetaInfo.dataStoreInfo.connectionInfo.server,engineType:"HBASE"},a.datastoreType="SPATIAL",s={dataStoreInfo:a}}r.dataMetaInfo=s}return this.request("POST",i,JSON.stringify(r)).then(e=>"hdfs"===n||"hbase"===n?e:e.childID?this.uploadDataRequest(e.childID,t):e.customResult)}publishOrUnpublish(e,t){if(!e.dataId||!e.serviceType)return this.getErrMsgPromise("option.dataID and option.serviceType are Required!");var s=e.dataId,i=e.dataServiceId,r=e.serviceType,n=this.iportalUrl+"/web/mycontent/datas/"+s+"/publishstatus.json?serviceType="+r;return i&&(n+="&dataServiceId="+i),this.request("PUT",n,JSON.stringify(t)).then(e=>t?(i||(i=e.customResult),i):e)}getDataPublishedStatus(e,t){var s=this.iportalUrl+"/web/mycontent/datas/"+e+"/publishstatus.json?dataServiceId="+t+"&forPublish=true";return this.request("GET",s)}unPublishDataService(e){return this.publishOrUnpublish(e,!1)}publishDataService(e){return this.publishOrUnpublish(e,!0)}},e.AddressMatchService=rt,e.AggregationParameter=nt,e.AreaSolarRadiationParameters=ot,e.AreaSolarRadiationService=ht,e.BucketAggParameter=at,e.BufferAnalystParameters=pt,e.BufferAnalystService=gt,e.BufferDistance=ut,e.BuffersAnalystJobsParameter=xt,e.BuffersAnalystJobsService=Ct,e.BufferSetting=ct,e.BurstPipelineAnalystParameters=wt,e.BurstPipelineAnalystService=At,e.ChartFeatureInfoSpecsService=Tt,e.ChartQueryFilterParameter=Et,e.ChartQueryParameters=Lt,e.ChartQueryService=Pt,e.ClipParameter= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){this.clipDatasetName=null,this.clipDatasourceName=null,this.clipRegion=null,this.isClipInRegion=!0,this.isExactClip=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.ClipParameter"}destroy(){var e=this;e.clipDatasetName=null,e.clipDatasourceName=null,e.clipRegion=null,e.isClipInRegion=null,e.isExactClip=null}toJSON(){return ee.toJSON({isClipInRegion:this.isClipInRegion,clipDatasetName:this.clipDatasetName,clipDatasourceName:this.clipDatasourceName,isExactClip:this.isExactClip,clipRegion:Le.fromGeometry(this.clipRegion)})}},e.ColorDictionary=Nt,e.CommonServiceBase=tt,e.ComputeWeightMatrixParameters=Dt,e.ComputeWeightMatrixService=Rt,e.CreateDatasetParameters=zr,e.DataFlowService=kt,e.DataReturnOption=dt,e.DatasetBufferAnalystParameters=mt,e.DatasetInfo=Bt,e.DatasetOverlayAnalystParameters=Ut,e.DatasetService=Is,e.DatasetSurfaceAnalystParameters=Vt,e.DatasetThiessenAnalystParameters=qt,e.DatasourceConnectionInfo=vt,e.DatasourceService=Ht,e.DensityAnalystService=Yt,e.DensityKernelAnalystParameters=Wt,e.EditFeaturesParameters=Qt,e.EditFeaturesService=Xt,e.FacilityAnalyst3DParameters=Kt,e.FacilityAnalystSinks3DParameters=Zt,e.FacilityAnalystSinks3DService=$t,e.FacilityAnalystSources3DParameters=es,e.FacilityAnalystSources3DService=ts,e.FacilityAnalystStreamParameters=ss,e.FacilityAnalystStreamService=is,e.FacilityAnalystTracedown3DParameters=rs,e.FacilityAnalystTracedown3DService=ns,e.FacilityAnalystTraceup3DParameters=as,e.FacilityAnalystTraceup3DService=os,e.FacilityAnalystUpstream3DParameters=ls,e.FacilityAnalystUpstream3DService=hs,e.FieldParameters=us,e.FieldsFilter=un,e.FieldStatisticService=ps,e.FieldStatisticsParameters=cs,e.FilterParameter=ft,e.FindClosestFacilitiesParameters=ds,e.FindClosestFacilitiesService=fs,e.FindLocationParameters=ms,e.FindLocationService=ys,e.FindMTSPPathsParameters=gs,e.FindMTSPPathsService=vs,e.FindPathParameters=Ss,e.FindPathService=bs,e.FindServiceAreasParameters=xs,e.FindServiceAreasService=_s,e.FindTSPPathsParameters=Cs,e.FindTSPPathsService=ws,e.GenerateSpatialDataParameters=Ms,e.GenerateSpatialDataService=As,e.GeoCodingParameter=st,e.GeoDecodingParameter=it,e.GeoHashGridAggParameter= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends at{constructor(e){super(),this.precision=5,ee.extend(this,e),this.aggType=G.GEOHASH_GRID,this.CLASS_NAME="SuperMap.GeoHashGridAggParameter"}destroy(){super.destroy(),this.aggType=null,this.precision=null}static toJsonParameters(e){var t={aggName:e.aggName,aggFieldName:e.aggFieldName,aggType:e.aggType,precision:e.precision};return ee.toJson(t)}},e.GeometryBatchAnalystService=Nr,e.GeometryBufferAnalystParameters=yt,e.GeometryOverlayAnalystParameters=Ts,e.GeometrySurfaceAnalystParameters=Es,e.GeometryThiessenAnalystParameters=Ls,e.GeoprocessingService=Os,e.GeoRelationAnalystParameters=Ps,e.GeoRelationAnalystService=Ns,e.GetFeaturesByBoundsParameters=Ds,e.GetFeaturesByBoundsService=ks,e.GetFeaturesByBufferParameters=Bs,e.GetFeaturesByBufferService=Gs,e.GetFeaturesByGeometryParameters=Us,e.GetFeaturesByGeometryService=js,e.GetFeaturesByIDsParameters=zs,e.GetFeaturesByIDsService=Vs,e.GetFeaturesBySQLParameters=Js,e.GetFeaturesBySQLService=qs,e.GetFeaturesParametersBase=Fs,e.GetFeaturesServiceBase=Rs,e.GetFieldsService=Hs,e.GetGridCellInfosParameters=Ws,e.GetGridCellInfosService=Ys,e.GetLayersInfoService=wi,e.Grid=xi,e.HillshadeParameter= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Qr{constructor(e){super(e),this.altitude=45,this.azimuth=315,this.zFactor=1,this.type=j.HILLSHADE,ee.extend(this,e),this.CLASS_NAME="SuperMap.HillshadeParameter"}destroy(){super.destroy(),this.altitude=null,this.azimuth=null,this.zFactor=null}toJSON(){return{altitude:this.altitude,azimuth:this.azimuth,zFactor:this.zFactor,type:this.type}}},e.Image=_i,e.ImageCollectionService=ln,e.ImageGFAspect=yn,e.ImageGFHillShade=mn,e.ImageGFOrtho=gn,e.ImageGFSlope=vn,e.ImageRenderingRule=fn,e.ImageSearchParameter=pn,e.ImageService=hn,e.ImageStretchOption=dn,e.InterpolationAnalystParameters=Mi,e.InterpolationAnalystService=Oi,e.InterpolationDensityAnalystParameters=Ti,e.InterpolationIDWAnalystParameters=Ei,e.InterpolationKrigingAnalystParameters=Li,e.InterpolationRBFAnalystParameters=Ai,e.JoinItem=vi,e.KernelDensityJobParameter=Pi,e.KernelDensityJobsService=Ni,e.LabelImageCell= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Ii{constructor(e){super(e),this.height=0,this.pathField=null,this.rotation=0,this.width=0,this.sizeFixed=!1,this.type="IMAGE",e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.LabelImageCell"}destroy(){var e=this;e.height=null,e.pathField=null,e.rotation=null,e.width=null,e.sizeFixed=null}},e.LabelMatrixCell=Ii,e.LabelMixedTextStyle=ei,e.LabelSymbolCell= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Ii{constructor(e){super(e),this.style=new Ae,this.symbolIDField=null,this.type="SYMBOL",e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.LabelSymbolCell"}destroy(){this.style&&(this.style.destroy(),this.style=null),this.symbolIDField=null}},e.LabelThemeCell= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Ii{constructor(e){super(e),this.themeLabel=new ri,this.type="THEME",e&&ee.extend(this,e),this.CLASS_NAME=" SuperMap.LabelThemeCell"}destroy(){this.themeLabel&&(this.themeLabel.destroy(),this.themeLabel=null)}},e.LayerStatus= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){this.layerName=null,this.isVisible=null,this.displayFilter=null,this.fieldValuesDisplayFilter=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.LayerStatus"}destroy(){this.layerName=null,this.isVisible=null,this.displayFilter=null}toJSON(){var e="{";e+='"type":"UGC",';var t=[];return this.layerName&&(t.push('"name":"'+this.layerName+'"'),t.push('"visible":'+this.isVisible)),this.displayFilter&&t.push('"displayFilter":"'+this.displayFilter+'"'),(this.minScale||0==this.minScale)&&t.push('"minScale":'+this.minScale),(this.maxScale||0==this.maxScale)&&t.push('"maxScale":'+this.maxScale),this.fieldValuesDisplayFilter&&t.push('"fieldValuesDisplayFilter":'+ee.toJSON(this.fieldValuesDisplayFilter)),e+=t,e+="}"}},e.LinkItem= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){this.datasourceConnectionInfo=null,this.foreignKeys=null,this.foreignTable=null,this.linkFields=null,this.linkFilter=null,this.name=null,this.primaryKeys=null,e&&ee.extend(this,e),this.CLASS_NAME="SuperMap.LinkItem"}destroy(){var e=this;e.datasourceConnectionInfo instanceof vt&&(e.datasourceConnectionInfo.destroy(),e.datasourceConnectionInfo=null),e.foreignKeys=null,e.foreignTable=null,e.linkFields=null,e.linkFilter=null,e.name=null,e.primaryKeys=null}},e.MappingParameters=bt,e.MapService=Fi,e.MathExpressionAnalysisParameters=Di,e.MathExpressionAnalysisService=Ri,e.MeasureParameters=ki,e.MeasureService=Bi,e.MetricsAggParameter= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends nt{constructor(e){super(),this.aggType=U.AVG,ee.extend(this,e),this.CLASS_NAME="SuperMap.MetricsAggParameter"}destroy(){super.destroy(),this.aggType=null}},e.NDVIParameter= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends Qr{constructor(e){super(e),this.redIndex=0,this.nirIndex=1,this.colorMap="0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff",this.type=j.NDVI,ee.extend(this,e),this.CLASS_NAME="SuperMap.NDVIParameter"}destroy(){super.destroy(),this.redIndex=null,this.nirIndex=null,this.colorMap=null}toJSON(){return{redIndex:this.redIndex,nirIndex:this.nirIndex,colorMap:this.colorMap,type:this.type}}},e.NetworkAnalystServiceBase=Mt,e.OutputSetting=St,e.OverlapDisplayedOptions= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){e=e||{},this.allowPointOverlap=!0,this.allowPointWithTextDisplay=!0,this.allowTextOverlap=!1,this.allowTextAndPointOverlap=!0,this.allowThemeGraduatedSymbolOverlap=!1,this.allowThemeGraphOverlap=!1,this.horizontalOverlappedSpaceSize=0,this.verticalOverlappedSpaceSize=0,ee.extend(this,e),this.ugcLayer=new yi(e),this.CLASS_NAME="SuperMap.OverlapDisplayedOptions"}destroy(){ee.reset(this)}fromJson(e){this.ugcLayer.fromJson.apply(this,[e])}toServerJSONObject(){return this.ugcLayer.toServerJSONObject.apply(this,arguments)}toString(){var e=this.ugcLayer.toServerJSONObject.apply(this,arguments),t="{";for(var s in e)e.hasOwnProperty(s)&&(t+="'"+s+"':"+e[s]+",");return t=t.substr(0,t.length-1),t+="}"}},e.OverlayAnalystParameters=Gt,e.OverlayAnalystService=Gi,e.OverlayGeoJobParameter=Ui,e.OverlayGeoJobsService=ji,e.PointWithMeasure=Te,e.ProcessingServiceBase=_t,e.QueryByBoundsParameters=zi,e.QueryByBoundsService=Ji,e.QueryByDistanceParameters=qi,e.QueryByDistanceService=Hi,e.QueryByGeometryParameters=Wi,e.QueryByGeometryService=Yi,e.QueryBySQLParameters=Qi,e.QueryBySQLService=Xi,e.QueryParameters=Ot,e.QueryService=Vi,e.RasterFunctionParameter=Qr,e.Route=Ee,e.RouteCalculateMeasureParameters=Ki,e.RouteCalculateMeasureService=Zi,e.RouteLocatorParameters=$i,e.RouteLocatorService=er,e.ServerColor=Me,e.ServerFeature=tr,e.ServerGeometry=Le,e.ServerStyle=Ae,e.ServerTextStyle=Xs,e.ServerTheme=bi,e.SetDatasourceParameters=sr,e.SetLayerInfoParameters=ir,e.SetLayerInfoService=rr,e.SetLayersInfoParameters=nr,e.SetLayersInfoService=ar,e.SetLayerStatusParameters=or,e.SetLayerStatusService=lr,e.SingleObjectQueryJobsParameter=hr,e.SingleObjectQueryJobsService=ur,e.Sortby=cn,e.SpatialAnalystBase=lt,e.StopQueryParameters=cr,e.StopQueryService=pr,e.SummaryAttributesJobsParameter=dr,e.SummaryAttributesJobsService=fr,e.SummaryMeshJobParameter=mr,e.SummaryMeshJobsService=yr,e.SummaryRegionJobParameter=gr,e.SummaryRegionJobsService=vr,e.SupplyCenter=Sr,e.SurfaceAnalystParameters=zt,e.SurfaceAnalystParametersSetting=jt,e.SurfaceAnalystService=br,e.TerrainCurvatureCalculationParameters=xr,e.TerrainCurvatureCalculationService=_r,e.Theme=Qs,e.ThemeDotDensity=ci,e.ThemeFlow=Cr,e.ThemeGraduatedSymbol=di,e.ThemeGraduatedSymbolStyle=pi,e.ThemeGraph=ui,e.ThemeGraphAxes=ai,e.ThemeGraphItem=hi,e.ThemeGraphSize=oi,e.ThemeGraphText=li,e.ThemeGridRange=Mr,e.ThemeGridRangeItem=wr,e.ThemeGridUnique=Tr,e.ThemeGridUniqueItem=Ar,e.ThemeLabel=ri,e.ThemeLabelAlongLine=si,e.ThemeLabelBackground=ii,e.ThemeLabelItem=Ks,e.ThemeLabelText=ti,e.ThemeLabelUniqueItem=Er,e.ThemeMemoryData= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e,t){this.srcData=e,this.targetData=t,this.CLASS_NAME="SuperMap.ThemeMemoryData"}destroy(){this.srcData=null,this.targetData=null}toJSON(){if(this.srcData&&this.targetData){for(var e="",t=Math.min(this.srcData.length,this.targetData.length),s=0;s0&&(e=e.substring(0,e.length-1)),"{"+e+"}"}return null}},e.ThemeOffset=$s,e.ThemeParameters=Lr,e.ThemeRange=mi,e.ThemeRangeItem=fi,e.ThemeService=Or,e.ThemeUnique=ni,e.ThemeUniqueItem=Zs,e.ThiessenAnalystParameters=Jt,e.ThiessenAnalystService=Pr,e.TilesetsService=Ir,e.TopologyValidatorJobsParameter=Fr,e.TopologyValidatorJobsService=Dr,e.TransferLine=Rr,e.TransferPathParameters=kr,e.TransferPathService=Br,e.TransferSolutionParameters=Gr,e.TransferSolutionService=Ur,e.TransportationAnalystParameter=Ft,e.TransportationAnalystResultSetting=It,e.UGCLayer=yi,e.UGCMapLayer=gi,e.UGCSubLayer=Si,e.UpdateDatasetParameters=Hr,e.UpdateEdgeWeightParameters=jr,e.UpdateEdgeWeightService=Vr,e.UpdateTurnNodeWeightParameters=Jr,e.UpdateTurnNodeWeightService=qr,e.Vector=Ci,e.VectorClipJobsParameter=Wr,e.VectorClipJobsService=Yr,e.WebPrintingJobContent=rn,e.WebPrintingJobCustomItems=Xr,e.WebPrintingJobExportOptions=an,e.WebPrintingJobImage=Kr,e.WebPrintingJobLayers=Zr,e.WebPrintingJobLayoutOptions=nn,e.WebPrintingJobLegendOptions=$r,e.WebPrintingJobLittleMapOptions=en,e.WebPrintingJobNorthArrowOptions=tn,e.WebPrintingJobParameters= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){e&&(this.content=null,this.layoutOptions=null,this.exportOptions=null,ee.extend(this,e),this.CLASS_NAME="SuperMap.WebPrintingJobParameters")}destroy(){this.content instanceof rn&&(this.content.destroy(),this.content=null),this.layoutOptions instanceof nn&&(this.layoutOptions.destroy(),this.layoutOptions=null),this.exportOptions instanceof an&&(this.exportOptions.destroy(),this.exportOptions=null)}},e.WebPrintingJobScaleBarOptions=sn,e.WebPrintingService=on,e.Online= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(){this.rootUrl="https://www.supermapol.com",this.webUrl=this.rootUrl+"/web";var e=this.webUrl+"/mycontent";this.mDatasUrl=e+"/datas",this.CLASS_NAME="SuperMap.Online"}load(){return Ue.get(this.rootUrl).then(function(e){return e})}login(){je.loginOnline(this.rootUrl,!0)}queryDatas(e){var t=this,s=t.mDatasUrl;return e&&(e=e.toJSON()),Ue.get(s,e).then(function(e){if(e&&e.content&&!(e.content.length<1)){for(var s=[],i=e.content,r=i.length,n=0;ns[1])return;var n=this.calculateXShapeInfo();if(n){var a=n.xPositions,o=n.width;(void 0===t.useBackground||t.useBackground)&&this.shapes.push(ta.Background(this.shapeFactory,this.chartBox,t)),(void 0===t.useAxis||t.useAxis)&&(this.shapes=this.shapes.concat(ta.GraphAxis(this.shapeFactory,i,t,n)));for(var l=0;l=t.length&&(s%=t.length);var l=t[s][0],h=t[s][1],u=(new wn).getLinearGradient(a,0,o,0,[[0,l],[1,h]]);r.style.color=u}}}},e.Feature.Theme.Bar3D= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends ia{constructor(e,t,s,i,r){super(e,t,s,i,r),this.CLASS_NAME="SuperMap.Feature.Theme.Bar3D"}destroy(){super.destroy()}assembleShapes(){var e=this.setting;if(e.dataViewBoxParameter||(void 0===e.useAxis||e.useAxis?e.dataViewBoxParameter=[45,25,20,20]:e.dataViewBoxParameter=[5,5,5,5]),e.axisUseArrow=void 0===e.axisUseArrow||e.axisUseArrow,e.axisXLabelsOffset=void 0!==e.axisXLabelsOffset?e.axisXLabelsOffset:[-10,10],this.initBaseParameter()){var t=this.DVBCodomain;this.DVBUnitValue=(t[1]-t[0])/this.DVBHeight;var s=this.dataViewBox,i=this.dataValues;if(!(i.length<1)){for(let e=0,s=i.length;et[1])return;var r=this.calculateXShapeInfo();if(r){var n=r.xPositions,a=r.width;(void 0===e.useBackground||e.useBackground)&&this.shapes.push(ta.Background(this.shapeFactory,this.chartBox,e)),(!e.axis3DParameter||isNaN(e.axis3DParameter)||e.axis3DParameter<15)&&(e.axis3DParameter=20),(void 0===e.useAxis||e.useAxis)&&(this.shapes=this.shapes.concat(ta.GraphAxis(this.shapeFactory,s,e,r)));var o=e.bar3DParameter&&!isNaN(e.bar3DParameter)?e.bar3DParameter:10;for(let r=0;r0?this.DVBUnitValue=e.maxR/(r[1]-r[0]):this.DVBUnitValue=e.maxR;var n=this.DVBUnitValue,a=i[0]*n+e.minR;if(this.width=2*a,this.height=2*a,this.initBaseParameter()&&(!r||!(i[0]r[1]))){var o=this.DVBCenterPoint,l=new Gn(o[0],o[1],a);l.style=ta.ShapeStyleTool(null,e.circleStyle,null,null,0),void 0!==e.fillColor?l.style.fillColor=e.fillColor:l.style.fillColor="#ff9277",l.highlightStyle=ta.ShapeStyleTool(null,e.circleHoverStyle),void 0!==e.circleHoverAble&&(l.hoverable=e.circleHoverAble),void 0!==e.circleClickAble&&(l.clickable=e.circleClickAble),l.refDataID=this.data.id,l.dataInfo={field:this.fields[0],r:a,value:i[0]},this.shapes.push(this.shapeFactory.createShape(l)),this.shapesConvertToRelativeCoordinate()}}},e.Feature.Theme.Graph=ia,e.Feature.Theme.Line= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends ia{constructor(e,t,s,i,r,n){super(e,t,s,i,r,n),this.CLASS_NAME="SuperMap.Feature.Theme.Line"}destroy(){super.destroy()}assembleShapes(){var e=this.setting;if(e.dataViewBoxParameter||(void 0===e.useAxis||e.useAxis?e.dataViewBoxParameter=[45,15,15,15]:e.dataViewBoxParameter=[5,5,5,5]),this.initBaseParameter()){var t=this.dataViewBox,s=this.DVBCodomain;this.DVBUnitValue=(s[1]-s[0])/this.DVBHeight;var i=this.DVBUnitValue,r=this.dataValues;if(!(r.length<1)){var n=this.calculateXShapeInfo();if(n){var a,o,l=n.xPositions;(void 0===e.useBackground||e.useBackground)&&this.shapes.push(ta.Background(this.shapeFactory,this.chartBox,e)),this.shapes=this.shapes.concat(ta.GraphAxis(this.shapeFactory,t,e,n));for(var h=[],u=[],c=0,p=r.length;cs[1])return null;a=l[c],o=t[1]-(r[c]-s[0])/i;var d=new Nn(a,o);d.style=ta.ShapeStyleTool({fillColor:"#ee9900"},e.pointStyle,e.pointStyleByFields,e.pointStyleByCodomain,c,r[c]),d.highlightStyle=ta.ShapeStyleTool(null,e.pointHoverStyle),void 0!==e.pointHoverAble&&(d.hoverable=e.pointHoverAble),void 0!==e.pointClickAble&&(d.clickable=e.pointClickAble),d.refDataID=this.data.id,d.dataInfo={field:this.fields[c],value:r[c]},u.push(this.shapeFactory.createShape(d));var f=[a,o];h.push(f)}var m=new In(h);m.style=ta.ShapeStyleTool({strokeColor:"#ee9900"},e.lineStyle),m.clickable=!1,m.hoverable=!1;var y=this.shapeFactory.createShape(m);this.shapes.push(y),this.shapes=this.shapes.concat(u),this.shapesConvertToRelativeCoordinate()}}}}calculateXShapeInfo(){var e,t=this.dataViewBox,s=this.setting,i=this.dataValues.length;if(i<1)return null;var r=[],n=this.DVBWidth,a=0;if(s.xShapeBlank&&s.xShapeBlank.length&&2==s.xShapeBlank.length){var o=n-((e=s.xShapeBlank)[0]+e[1]);if(o<=i)return null;a=o/(i-1)}else e=[a=n/(i+1),a,a];for(var l=0,h=0;hi[1])return;var r=0;for(let e=0;e=360&&(l=359.9999999);var d=new Rn(a[0],a[1],u,o,l);if(void 0===e.sectorStyleByFields){var f=c%t.length;d.style=ta.ShapeStyleTool(null,e.sectorStyle,t,null,f)}else d.style=ta.ShapeStyleTool(null,e.sectorStyle,e.sectorStyleByFields,e.sectorStyleByCodomain,c,s[c]);d.highlightStyle=ta.ShapeStyleTool(null,e.sectorHoverStyle),void 0!==e.sectorHoverAble&&(d.hoverable=e.sectorHoverAble),void 0!==e.sectorClickAble&&(d.clickable=e.sectorClickAble),d.refDataID=this.data.id,d.dataInfo={field:this.fields[c],value:s[c]},this.shapes.push(this.shapeFactory.createShape(d)),o=l}this.shapesConvertToRelativeCoordinate()}}}},e.Feature.Theme.Point= +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class extends ia{constructor(e,t,s,i,r,n){super(e,t,s,i,r,n),this.CLASS_NAME="SuperMap.Feature.Theme.Point"}destroy(){super.destroy()}assembleShapes(){var e=this.setting;if(e.dataViewBoxParameter||(void 0===e.useAxis||e.useAxis?e.dataViewBoxParameter=[45,15,15,15]:e.dataViewBoxParameter=[5,5,5,5]),this.initBaseParameter()){var t=this.dataViewBox,s=this.DVBCodomain;this.DVBUnitValue=(s[1]-s[0])/this.DVBHeight;var i=this.DVBUnitValue,r=this.dataValues,n=this.calculateXShapeInfo();if(n){var a,o,l=n.xPositions;(void 0===e.useBackground||e.useBackground)&&this.shapes.push(ta.Background(this.shapeFactory,this.chartBox,e)),this.shapes=this.shapes.concat(ta.GraphAxis(this.shapeFactory,t,e,n));for(var h=0,u=r.length;hs[1])return null;a=l[h],o=t[1]-(r[h]-s[0])/i;var c=new Nn(a,o);c.style=ta.ShapeStyleTool({fillColor:"#ee9900"},e.pointStyle,e.pointStyleByFields,e.pointStyleByCodomain,h,r[h]),c.highlightStyle=ta.ShapeStyleTool(null,e.pointHoverStyle),void 0!==e.pointHoverAble&&(c.hoverable=e.pointHoverAble),void 0!==e.pointClickAble&&(c.clickable=e.pointClickAble),c.refDataID=this.data.id,c.dataInfo={field:this.fields[h],value:r[h]},this.shapes.push(this.shapeFactory.createShape(c))}this.shapesConvertToRelativeCoordinate()}}}calculateXShapeInfo(){var e,t=this.dataViewBox,s=this.setting,i=this.dataValues.length;if(i<1)return null;var r=[],n=this.DVBWidth,a=0;if(s.xShapeBlank&&s.xShapeBlank.length&&2==s.xShapeBlank.length){var o=n-((e=s.xShapeBlank)[0]+e[1]);if(o<=i)return null;a=o/(i-1)}else e=[a=n/(i+1),a,a];for(var l=0,h=0;hi[1])return;var r=0;for(let e=0;e=0&&t.innerRingRadiust.geoFence.radius&&(t.outOfGeoFence&&t.outOfGeoFence(e),t.events.triggerEvent("outOfGeoFence",{data:e})),s})}_distance(e,t,s,i){return Math.sqrt((e-s)*(e-s)+(t-i)*(t-i))}_getMeterPerMapUnit(e){let t;return"meter"===e?t=1:"degree"===e&&(t=2*Math.PI*6378137/360),t}},e.ArrayStatistic=class{static newInstance(){return this.geostatsInstance||(this.geostatsInstance=new window.geostats),this.geostatsInstance}static getInstance(e){let t=this.newInstance();return t.setSerie(e),t}static getArrayStatistic(e,t){return e.length?"Sum"===t||"求和"===t?this.getSum(e):"Maximum"===t||"最大值"===t?this.getMax(e):"Minimum"===t||"最小值"===t?this.getMin(e):"Average"===t||"平均值"===t?this.getMean(e):"Median"===t||"中位数"===t?this.getMedian(e):"times"===t||"计数"===t?this.getTimes(e):void 0:0}static getArraySegments(e,t,s){return"offset"===t?this.getEqInterval(e,s):"jenks"===t?this.getJenks(e,s):"square"===t?this.getMin(e)>=0&&this.getSqrtInterval(e,s):"logarithm"===t?this.getMin(e)>0&&this.getGeometricProgression(e,s):void 0}static getSum(e){return this.getInstance(e).sum()}static getMax(e){return this.getInstance(e).max()}static getMin(e){return this.getInstance(e).min()}static getMean(e){return this.getInstance(e).mean()}static getMedian(e){return this.getInstance(e).median()}static getTimes(e){return e.length}static getEqInterval(e,t){return this.getInstance(e).getClassEqInterval(t)}static getJenks(e,t){return this.getInstance(e).getClassJenks(t)}static getSqrtInterval(e,t){return e=e.map(function(e){return Math.sqrt(e)}),this.getInstance(e).getClassEqInterval(t).map(function(e){return e*e})}static getGeometricProgression(e,t){return this.getInstance(e).getClassGeometricProgression(t)}},e.ColorsPickerUtil=class{static createCanvas(e,t){var s=document.createElement("canvas");return s.height=e,s.width=t,s.getContext("2d")}static getLinearGradient(e,t,s,i,r){this._ctx||(this._ctx=this.getContext());for(var n=this._ctx.createLinearGradient(e,t,s,i),a=r.length,o=1/(a-1),l=0,h=0;h=t)if("RANGE"===s)for(r=0;r=this.text.length)return;e=this.text[this.place++]}switch(this.state){case po:return this.neutral(e);case 2:return this.keyword(e);case 4:return this.quoted(e);case 5:return this.afterquote(e);case 3:return this.number(e);case-1:return}},So.prototype.afterquote=function(e){if('"'===e)return this.word+='"',void(this.state=4);if(go.test(e))return this.word=this.word.trim(),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in afterquote yet, index '+this.place)},So.prototype.afterItem=function(e){return","===e?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=po)):"]"===e?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=po,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},So.prototype.number=function(e){if(!vo.test(e)){if(go.test(e))return this.word=parseFloat(this.word),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in number yet, index '+this.place)}this.word+=e},So.prototype.quoted=function(e){'"'!==e?this.word+=e:this.state=5},So.prototype.keyword=function(e){if(yo.test(e))this.word+=e;else{if("["===e){var t=[];return t.push(this.word),this.level++,null===this.root?this.root=t:this.currentObject.push(t),this.stack.push(this.currentObject),this.currentObject=t,void(this.state=po)}if(!go.test(e))throw new Error("havn't handled \""+e+'" in keyword yet, index '+this.place);this.afterItem(e)}},So.prototype.neutral=function(e){if(mo.test(e))return this.word=e,void(this.state=2);if('"'===e)return this.word="",void(this.state=4);if(vo.test(e))return this.word=e,void(this.state=3);if(!go.test(e))throw new Error("havn't handled \""+e+'" in neutral yet, index '+this.place);this.afterItem(e)},So.prototype.output=function(){for(;this.place0?90:-90),e.lat_ts=e.lat1)}(r),r}function Mo(e){var t=this;if(2===arguments.length){var s=arguments[1];"string"==typeof s?"+"===s.charAt(0)?Mo[e]=uo(arguments[1]):Mo[e]=wo(arguments[1]):Mo[e]=s}else if(1===arguments.length){if(Array.isArray(e))return e.map(function(e){Array.isArray(e)?Mo.apply(t,e):Mo(e)});if("string"==typeof e){if(e in Mo)return Mo[e]}else"EPSG"in e?Mo["EPSG:"+e.EPSG]=e:"ESRI"in e?Mo["ESRI:"+e.ESRI]=e:"IAU2000"in e?Mo["IAU2000:"+e.IAU2000]=e:console.log(e);return}}!function(e){e("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),e("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),e("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),e.WGS84=e["EPSG:4326"],e["EPSG:3785"]=e["EPSG:3857"],e.GOOGLE=e["EPSG:3857"],e["EPSG:900913"]=e["EPSG:3857"],e["EPSG:102113"]=e["EPSG:3857"]}(Mo);const Ao=Mo;var To=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"];var Eo=["3857","900913","3785","102113"];const Lo=function(e){if(!function(e){return"string"==typeof e}(e))return e;if(function(e){return e in Ao}(e))return Ao[e];if(function(e){return To.some(function(t){return e.indexOf(t)>-1})}(e)){var t=wo(e);if(function(e){var t=ho(e,"authority");if(t){var s=ho(t,"epsg");return s&&Eo.indexOf(s)>-1}}(t))return Ao["EPSG:3857"];var s=function(e){var t=ho(e,"extension");if(t)return ho(t,"proj4")}(t);return s?uo(s):t}return function(e){return"+"===e[0]}(e)?uo(e):void 0};function Oo(e,t){var s,i;if(e=e||{},!t)return e;for(i in t)void 0!==(s=t[i])&&(e[i]=s);return e}function Po(e,t,s){var i=e*t;return s/Math.sqrt(1-i*i)}function No(e){return e<0?-1:1}function Io(e){return Math.abs(e)<=no?e:e-No(e)*ro}function Fo(e,t,s){var i=e*s,r=.5*e;return i=Math.pow((1-i)/(1+i),r),Math.tan(.5*(Xa-t))/i}function Do(e,t){for(var s,i,r=.5*e,n=Xa-2*Math.atan(t),a=0;a<=15;a++)if(s=e*Math.sin(n),n+=i=Xa-2*Math.atan(t*Math.pow((1-s)/(1+s),r))-n,Math.abs(i)<=1e-10)return n;return-9999}function Ro(e){return e}var ko=[{init:function(){var e=this.b/this.a;this.es=1-e*e,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=Po(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(e){var t,s,i=e.x,r=e.y;if(r*so>90&&r*so<-90&&i*so>180&&i*so<-180)return null;if(Math.abs(Math.abs(r)-Xa)<=eo)return null;if(this.sphere)t=this.x0+this.a*this.k0*Io(i-this.long0),s=this.y0+this.a*this.k0*Math.log(Math.tan(io+.5*r));else{var n=Math.sin(r),a=Fo(this.e,r,n);t=this.x0+this.a*this.k0*Io(i-this.long0),s=this.y0-this.a*this.k0*Math.log(a)}return e.x=t,e.y=s,e},inverse:function(e){var t,s,i=e.x-this.x0,r=e.y-this.y0;if(this.sphere)s=Xa-2*Math.atan(Math.exp(-r/(this.a*this.k0)));else{var n=Math.exp(-r/(this.a*this.k0));if(-9999===(s=Do(this.e,n)))return null}return t=Io(this.long0+i/(this.a*this.k0)),e.x=t,e.y=s,e},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:Ro,inverse:Ro,names:["longlat","identity"]}],Bo={},Go=[];function Uo(e,t){var s=Go.length;return e.names?(Go[s]=e,e.names.forEach(function(e){Bo[e.toLowerCase()]=s}),this):(console.log(t),!0)}const jo={start:function(){ko.forEach(Uo)},add:Uo,get:function(e){if(!e)return!1;var t=e.toLowerCase();return void 0!==Bo[t]&&Go[Bo[t]]?Go[Bo[t]]:void 0}};var zo={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},Vo=zo.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};zo.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var Jo={};Jo.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},Jo.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},Jo.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},Jo.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},Jo.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},Jo.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},Jo.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},Jo.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},Jo.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},Jo.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},Jo.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},Jo.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},Jo.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},Jo.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},Jo.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},Jo.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},Jo.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};const qo=function(e,t,s,i,r,n,a){var o={};return o.datum_type=void 0===e||"none"===e?qa:Ja,t&&(o.datum_params=t.map(parseFloat),0===o.datum_params[0]&&0===o.datum_params[1]&&0===o.datum_params[2]||(o.datum_type=ja),o.datum_params.length>3&&(0===o.datum_params[3]&&0===o.datum_params[4]&&0===o.datum_params[5]&&0===o.datum_params[6]||(o.datum_type=za,o.datum_params[3]*=Qa,o.datum_params[4]*=Qa,o.datum_params[5]*=Qa,o.datum_params[6]=o.datum_params[6]/1e6+1))),a&&(o.datum_type=Va,o.grids=a),o.a=s,o.b=i,o.es=r,o.ep2=n,o};var Ho={};function Wo(e){if(0===e.length)return null;var t="@"===e[0];return t&&(e=e.slice(1)),"null"===e?{name:"null",mandatory:!t,grid:null,isNull:!0}:{name:e,mandatory:!t,grid:Ho[e]||null,isNull:!1}}function Yo(e){return e/3600*Math.PI/180}function Qo(e,t,s){return String.fromCharCode.apply(null,new Uint8Array(e.buffer.slice(t,s)))}function Xo(e){return e.map(function(e){return[Yo(e.longitudeShift),Yo(e.latitudeShift)]})}function Ko(e,t,s){return{name:Qo(e,t+8,t+16).trim(),parent:Qo(e,t+24,t+24+8).trim(),lowerLatitude:e.getFloat64(t+72,s),upperLatitude:e.getFloat64(t+88,s),lowerLongitude:e.getFloat64(t+104,s),upperLongitude:e.getFloat64(t+120,s),latitudeInterval:e.getFloat64(t+136,s),longitudeInterval:e.getFloat64(t+152,s),gridNodeCount:e.getInt32(t+168,s)}}function Zo(e,t,s,i){for(var r=t+176,n=[],a=0;a-1.001*Xa)l=-Xa;else if(l>Xa&&l<1.001*Xa)l=Xa;else{if(l<-Xa)return{x:-1/0,y:-1/0,z:e.z};if(l>Xa)return{x:1/0,y:1/0,z:e.z}}return o>Math.PI&&(o-=2*Math.PI),r=Math.sin(l),a=Math.cos(l),n=r*r,{x:((i=s/Math.sqrt(1-t*n))+h)*a*Math.cos(o),y:(i+h)*a*Math.sin(o),z:(i*(1-t)+h)*r}}function sl(e,t,s,i){var r,n,a,o,l,h,u,c,p,d,f,m,y,g,v,S=e.x,b=e.y,x=e.z?e.z:0;if(r=Math.sqrt(S*S+b*b),n=Math.sqrt(S*S+b*b+x*x),r/s<1e-12){if(g=0,n/s<1e-12)return Xa,v=-i,{x:e.x,y:e.y,z:e.z}}else g=Math.atan2(b,S);a=x/n,c=(o=r/n)*(1-t)*(l=1/Math.sqrt(1-t*(2-t)*o*o)),p=a*l,y=0;do{y++,h=t*(u=s/Math.sqrt(1-t*p*p))/(u+(v=r*c+x*p-u*(1-t*p*p))),m=(f=a*(l=1/Math.sqrt(1-h*(2-h)*o*o)))*c-(d=o*(1-h)*l)*p,c=d,p=f}while(m*m>1e-24&&y<30);return{x:g,y:Math.atan(f/Math.abs(d)),z:v}}function il(e){return e===ja||e===za}function rl(e,t,s){if(function(e,t){return e.datum_type===t.datum_type&&!(e.a!==t.a||Math.abs(e.es-t.es)>5e-11)&&(e.datum_type===ja?e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]:e.datum_type!==za||e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]&&e.datum_params[3]===t.datum_params[3]&&e.datum_params[4]===t.datum_params[4]&&e.datum_params[5]===t.datum_params[5]&&e.datum_params[6]===t.datum_params[6])}(e,t))return s;if(e.datum_type===qa||t.datum_type===qa)return s;var i=e.a,r=e.es;if(e.datum_type===Va){if(0!==nl(e,!1,s))return;i=Ha,r=Ya}var n=t.a,a=t.b,o=t.es;if(t.datum_type===Va&&(n=Ha,a=Wa,o=Ya),r===o&&i===n&&!il(e.datum_type)&&!il(t.datum_type))return s;if((s=tl(s,r,i),il(e.datum_type)&&(s=function(e,t,s){if(t===ja)return{x:e.x+s[0],y:e.y+s[1],z:e.z+s[2]};if(t===za){var i=s[0],r=s[1],n=s[2],a=s[3],o=s[4],l=s[5],h=s[6];return{x:h*(e.x-l*e.y+o*e.z)+i,y:h*(l*e.x+e.y-a*e.z)+r,z:h*(-o*e.x+a*e.y+e.z)+n}}}(s,e.datum_type,e.datum_params)),il(t.datum_type)&&(s=function(e,t,s){if(t===ja)return{x:e.x-s[0],y:e.y-s[1],z:e.z-s[2]};if(t===za){var i=s[0],r=s[1],n=s[2],a=s[3],o=s[4],l=s[5],h=s[6],u=(e.x-i)/h,c=(e.y-r)/h,p=(e.z-n)/h;return{x:u+l*c-o*p,y:-l*u+c+a*p,z:o*u-a*c+p}}}(s,t.datum_type,t.datum_params)),s=sl(s,o,n,a),t.datum_type===Va)&&0!==nl(t,!0,s))return;return s}function nl(e,t,s){if(null===e.grids||0===e.grids.length)return console.log("Grid shift grids not found"),-1;for(var i={x:-s.x,y:s.y},r={x:Number.NaN,y:Number.NaN},n=[],a=0;ai.y||u>i.x||d1e-12&&Math.abs(a.y)>1e-12);if(l<0)return console.log("Inverse grid shift iterator failed to converge."),i;i.x=Io(n.x+s.ll[0]),i.y=n.y+s.ll[1]}else isNaN(n.x)||(i.x=e.x+n.x,i.y=e.y+n.y);return i}function ol(e,t){var s,i={x:e.x/t.del[0],y:e.y/t.del[1]},r=Math.floor(i.x),n=Math.floor(i.y),a=i.x-1*r,o=i.y-1*n,l={x:Number.NaN,y:Number.NaN};if(r<0||r>=t.lim[0])return l;if(n<0||n>=t.lim[1])return l;s=n*t.lim[0]+r;var h=t.cvs[s][0],u=t.cvs[s][1];s++;var c=t.cvs[s][0],p=t.cvs[s][1];s+=t.lim[0];var d=t.cvs[s][0],f=t.cvs[s][1];s--;var m=t.cvs[s][0],y=t.cvs[s][1],g=a*o,v=a*(1-o),S=(1-a)*(1-o),b=(1-a)*o;return l.x=S*h+v*c+b*m+g*d,l.y=S*u+v*p+b*y+g*f,l}function ll(e,t,s){var i,r,n,a=s.x,o=s.y,l=s.z||0,h={};for(n=0;n<3;n++)if(!t||2!==n||void 0!==s.z)switch(0===n?(i=a,r=-1!=="ew".indexOf(e.axis[n])?"x":"y"):1===n?(i=o,r=-1!=="ns".indexOf(e.axis[n])?"y":"x"):(i=l,r="z"),e.axis[n]){case"e":h[r]=i;break;case"w":h[r]=-i;break;case"n":h[r]=i;break;case"s":h[r]=-i;break;case"u":void 0!==s[r]&&(h.z=i);break;case"d":void 0!==s[r]&&(h.z=-i);break;default:return null}return h}function hl(e){var t={x:e[0],y:e[1]};return e.length>2&&(t.z=e[2]),e.length>3&&(t.m=e[3]),t}function ul(e){if("function"==typeof Number.isFinite){if(Number.isFinite(e))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof e||e!=e||!isFinite(e))throw new TypeError("coordinates must be finite numbers")}function cl(e,t,s,i){var r;if(Array.isArray(s)&&(s=hl(s)),function(e){ul(e.x),ul(e.y)}(s),e.datum&&t.datum&&function(e,t){return(e.datum.datum_type===ja||e.datum.datum_type===za)&&"WGS84"!==t.datumCode||(t.datum.datum_type===ja||t.datum.datum_type===za)&&"WGS84"!==e.datumCode}(e,t)&&(s=cl(e,r=new el("WGS84"),s,i),e=r),i&&"enu"!==e.axis&&(s=ll(e,!1,s)),"longlat"===e.projName)s={x:s.x*to,y:s.y*to,z:s.z||0};else if(e.to_meter&&(s={x:s.x*e.to_meter,y:s.y*e.to_meter,z:s.z||0}),!(s=e.inverse(s)))return;if(e.from_greenwich&&(s.x+=e.from_greenwich),s=rl(e.datum,t.datum,s))return t.from_greenwich&&(s={x:s.x-t.from_greenwich,y:s.y,z:s.z||0}),"longlat"===t.projName?s={x:s.x*so,y:s.y*so,z:s.z||0}:(s=t.forward(s),t.to_meter&&(s={x:s.x/t.to_meter,y:s.y/t.to_meter,z:s.z||0})),i&&"enu"!==t.axis?ll(t,!0,s):s}var pl=el("WGS84");function dl(e,t,s,i){var r,n,a;return Array.isArray(s)?(r=cl(e,t,s,i)||{x:NaN,y:NaN},s.length>2?void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name?"number"==typeof r.z?[r.x,r.y,r.z].concat(s.splice(3)):[r.x,r.y,s[2]].concat(s.splice(3)):[r.x,r.y].concat(s.splice(2)):[r.x,r.y]):(n=cl(e,t,s,i),2===(a=Object.keys(s)).length?n:(a.forEach(function(i){if(void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name){if("x"===i||"y"===i||"z"===i)return}else if("x"===i||"y"===i)return;n[i]=s[i]}),n))}function fl(e){return e instanceof el?e:e.oProj?e.oProj:el(e)}const ml=function(e,t,s){e=fl(e);var i,r=!1;return void 0===t?(t=e,e=pl,r=!0):(void 0!==t.x||Array.isArray(t))&&(s=t,t=e,e=pl,r=!0),t=fl(t),s?dl(e,t,s):(i={forward:function(s,i){return dl(e,t,s,i)},inverse:function(s,i){return dl(t,e,s,i)}},r&&(i.oProj=t),i)};var yl=6,gl="AJSAJS",vl="AFAFAF",Sl=65,bl=73,xl=79,_l=86,Cl=90;const wl={forward:Ml,inverse:function(e){var t=Ll(Pl(e.toUpperCase()));if(t.lat&&t.lon)return[t.lon,t.lat,t.lon,t.lat];return[t.left,t.bottom,t.right,t.top]},toPoint:Al};function Ml(e,t){return t=t||5,function(e,t){var s="00000"+e.easting,i="00000"+e.northing;return e.zoneNumber+e.zoneLetter+(d=e.easting,f=e.northing,m=e.zoneNumber,y=Ol(m),g=Math.floor(d/1e5),v=Math.floor(f/1e5)%20,r=g,n=v,a=y,o=a-1,l=gl.charCodeAt(o),h=vl.charCodeAt(o),u=l+r-1,c=h+n,p=!1,u>Cl&&(u=u-Cl+Sl-1,p=!0),(u===bl||lbl||(u>bl||lxl||(u>xl||lCl&&(u=u-Cl+Sl-1),c>_l?(c=c-_l+Sl-1,p=!0):p=!1,(c===bl||hbl||(c>bl||hxl||(c>xl||h_l&&(c=c-_l+Sl-1),String.fromCharCode(u)+String.fromCharCode(c))+s.substr(s.length-5,t)+i.substr(i.length-5,t);var r,n,a,o,l,h,u,c,p;var d,f,m,y,g,v}(function(e){var t,s,i,r,n,a,o,l=e.lat,h=e.lon,u=6378137,c=Tl(l),p=Tl(h);o=Math.floor((h+180)/6)+1,180===h&&(o=60);l>=56&&l<64&&h>=3&&h<12&&(o=32);l>=72&&l<84&&(h>=0&&h<9?o=31:h>=9&&h<21?o=33:h>=21&&h<33?o=35:h>=33&&h<42&&(o=37));a=Tl(6*(o-1)-180+3),.006739496752268451,t=u/Math.sqrt(1-.00669438*Math.sin(c)*Math.sin(c)),s=Math.tan(c)*Math.tan(c),i=.006739496752268451*Math.cos(c)*Math.cos(c),r=Math.cos(c)*(p-a),n=u*(.9983242984503243*c-.002514607064228144*Math.sin(2*c)+2639046602129982e-21*Math.sin(4*c)-3.418046101696858e-9*Math.sin(6*c));var d=.9996*t*(r+(1-s+i)*r*r*r/6+(5-18*s+s*s+72*i-.39089081163157013)*r*r*r*r*r/120)+5e5,f=.9996*(n+t*Math.tan(c)*(r*r/2+(5-s+9*i+4*i*i)*r*r*r*r/24+(61-58*s+s*s+600*i-2.2240339282485886)*r*r*r*r*r*r/720));l<0&&(f+=1e7);return{northing:Math.round(f),easting:Math.round(d),zoneNumber:o,zoneLetter:function(e){var t="Z";84>=e&&e>=72?t="X":72>e&&e>=64?t="W":64>e&&e>=56?t="V":56>e&&e>=48?t="U":48>e&&e>=40?t="T":40>e&&e>=32?t="S":32>e&&e>=24?t="R":24>e&&e>=16?t="Q":16>e&&e>=8?t="P":8>e&&e>=0?t="N":0>e&&e>=-8?t="M":-8>e&&e>=-16?t="L":-16>e&&e>=-24?t="K":-24>e&&e>=-32?t="J":-32>e&&e>=-40?t="H":-40>e&&e>=-48?t="G":-48>e&&e>=-56?t="F":-56>e&&e>=-64?t="E":-64>e&&e>=-72?t="D":-72>e&&e>=-80&&(t="C");return t}(l)}}({lat:e[1],lon:e[0]}),t)}function Al(e){var t=Ll(Pl(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat]:[(t.left+t.right)/2,(t.top+t.bottom)/2]}function Tl(e){return e*(Math.PI/180)}function El(e){return e/Math.PI*180}function Ll(e){var t=e.northing,s=e.easting,i=e.zoneLetter,r=e.zoneNumber;if(r<0||r>60)return null;var n,a,o,l,h,u,c,p,d=6378137,f=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),m=s-5e5,y=t;i<"N"&&(y-=1e7),u=6*(r-1)-180+3,p=(c=y/.9996/6367449.145945056)+(3*f/2-27*f*f*f/32)*Math.sin(2*c)+(21*f*f/16-55*f*f*f*f/32)*Math.sin(4*c)+151*f*f*f/96*Math.sin(6*c),n=d/Math.sqrt(1-.00669438*Math.sin(p)*Math.sin(p)),a=Math.tan(p)*Math.tan(p),o=.006739496752268451*Math.cos(p)*Math.cos(p),l=.99330562*d/Math.pow(1-.00669438*Math.sin(p)*Math.sin(p),1.5),h=m/(.9996*n);var g=p-n*Math.tan(p)/l*(h*h/2-(5+3*a+10*o-4*o*o-.06065547077041606)*h*h*h*h/24+(61+90*a+298*o+45*a*a-1.6983531815716497-3*o*o)*h*h*h*h*h*h/720);g=El(g);var v,S=(h-(1+2*a+o)*h*h*h/6+(5-2*o+28*a-3*o*o+.05391597401814761+24*a*a)*h*h*h*h*h/120)/Math.cos(p);if(S=u+El(S),e.accuracy){var b=Ll({northing:e.northing+e.accuracy,easting:e.easting+e.accuracy,zoneLetter:e.zoneLetter,zoneNumber:e.zoneNumber});v={top:b.lat,right:b.lon,bottom:g,left:S}}else v={lat:g,lon:S};return v}function Ol(e){var t=e%yl;return 0===t&&(t=yl),t}function Pl(e){if(e&&0===e.length)throw"MGRSPoint coverting from nothing";for(var t,s=e.length,i=null,r="",n=0;!/[A-Z]/.test(t=e.charAt(n));){if(n>=2)throw"MGRSPoint bad conversion from: "+e;r+=t,n++}var a=parseInt(r,10);if(0===n||n+3>s)throw"MGRSPoint bad conversion from: "+e;var o=e.charAt(n++);if(o<="A"||"B"===o||"Y"===o||o>="Z"||"I"===o||"O"===o)throw"MGRSPoint zone letter "+o+" not handled: "+e;i=e.substring(n,n+=2);for(var l=Ol(a),h=function(e,t){var s=gl.charCodeAt(t-1),i=1e5,r=!1;for(;s!==e.charCodeAt(0);){if(++s===bl&&s++,s===xl&&s++,s>Cl){if(r)throw"Bad character: "+e;s=Sl,r=!0}i+=1e5}return i}(i.charAt(0),l),u=function(e,t){if(e>"V")throw"MGRSPoint given invalid Northing "+e;var s=vl.charCodeAt(t-1),i=0,r=!1;for(;s!==e.charCodeAt(0);){if(++s===bl&&s++,s===xl&&s++,s>_l){if(r)throw"Bad character: "+e;s=Sl,r=!0}i+=1e5}return i}(i.charAt(1),l);u0&&(p=1e5/Math.pow(10,m),d=e.substring(n,n+m),y=parseFloat(d)*p,f=e.substring(n+m),g=parseFloat(f)*p),{easting:y+h,northing:g+u,zoneLetter:o,zoneNumber:a,accuracy:p}}function Nl(e){var t;switch(e){case"C":t=11e5;break;case"D":t=2e6;break;case"E":t=28e5;break;case"F":t=37e5;break;case"G":t=46e5;break;case"H":t=55e5;break;case"J":t=64e5;break;case"K":t=73e5;break;case"L":t=82e5;break;case"M":t=91e5;break;case"N":t=0;break;case"P":t=8e5;break;case"Q":t=17e5;break;case"R":t=26e5;break;case"S":t=35e5;break;case"T":t=44e5;break;case"U":t=53e5;break;case"V":t=62e5;break;case"W":t=7e6;break;case"X":t=79e5;break;default:t=-1}if(t>=0)return t;throw"Invalid zone letter: "+e}function Il(e,t,s){if(!(this instanceof Il))return new Il(e,t,s);if(Array.isArray(e))this.x=e[0],this.y=e[1],this.z=e[2]||0;else if("object"==typeof e)this.x=e.x,this.y=e.y,this.z=e.z||0;else if("string"==typeof e&&void 0===t){var i=e.split(",");this.x=parseFloat(i[0],10),this.y=parseFloat(i[1],10),this.z=parseFloat(i[2],10)||0}else this.x=e,this.y=t,this.z=s||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}Il.fromMGRS=function(e){return new Il(Al(e))},Il.prototype.toMGRS=function(e){return Ml([this.x,this.y],e)};const Fl=Il;var Dl=1,Rl=.25,kl=.046875,Bl=.01953125,Gl=.01068115234375,Ul=.75,jl=.46875,zl=.013020833333333334,Vl=.007120768229166667,Jl=.3645833333333333,ql=.005696614583333333,Hl=.3076171875;function Wl(e){var t=[];t[0]=Dl-e*(Rl+e*(kl+e*(Bl+e*Gl))),t[1]=e*(Ul-e*(kl+e*(Bl+e*Gl)));var s=e*e;return t[2]=s*(jl-e*(zl+e*Vl)),s*=e,t[3]=s*(Jl-e*ql),t[4]=s*e*Hl,t}function Yl(e,t,s,i){return s*=t,t*=t,i[0]*e-s*(i[1]+t*(i[2]+t*(i[3]+t*i[4])))}var Ql=20;function Xl(e,t,s){for(var i=1/(1-t),r=e,n=Ql;n;--n){var a=Math.sin(r),o=1-t*a*a;if(r-=o=(Yl(r,a,Math.cos(r),s)-e)*(o*Math.sqrt(o))*i,Math.abs(o)eo?Math.tan(n):0,f=Math.pow(d,2),m=Math.pow(f,2);t=1-this.es*Math.pow(o,2),h/=Math.sqrt(t);var y=Yl(n,o,l,this.en);s=this.a*(this.k0*h*(1+u/6*(1-f+c+u/20*(5-18*f+m+14*c-58*f*c+u/42*(61+179*m-m*f-479*f)))))+this.x0,i=this.a*(this.k0*(y-this.ml0+o*a*h/2*(1+u/12*(5-f+9*c+4*p+u/30*(61+m-58*f+270*c-330*f*c+u/56*(1385+543*m-m*f-3111*f))))))+this.y0}else{var g=l*Math.sin(a);if(Math.abs(Math.abs(g)-1)=1){if(g-1>eo)return 93;i=0}else i=Math.acos(i);n<0&&(i=-i),i=this.a*this.k0*(i-this.lat0)+this.y0}return e.x=s,e.y=i,e},inverse:function(e){var t,s,i,r,n=(e.x-this.x0)*(1/this.a),a=(e.y-this.y0)*(1/this.a);if(this.es)if(s=Xl(t=this.ml0+a/this.k0,this.es,this.en),Math.abs(s)eo?Math.tan(s):0,u=this.ep2*Math.pow(l,2),c=Math.pow(u,2),p=Math.pow(h,2),d=Math.pow(p,2);t=1-this.es*Math.pow(o,2);var f=n*Math.sqrt(t)/this.k0,m=Math.pow(f,2);i=s-(t*=h)*m/(1-this.es)*.5*(1-m/12*(5+3*p-9*u*p+u-4*c-m/30*(61+90*p-252*u*p+45*d+46*u-m/56*(1385+3633*p+4095*d+1574*d*p)))),r=Io(this.long0+f*(1-m/6*(1+2*p+u-m/20*(5+28*p+24*d+8*u*p+6*u-m/42*(61+662*p+1320*d+720*d*p))))/l)}else i=Xa*No(a),r=0;else{var y=Math.exp(n/this.k0),g=.5*(y-1/y),v=this.lat0+a/this.k0,S=Math.cos(v);t=Math.sqrt((1-Math.pow(S,2))/(1+Math.pow(g,2))),i=Math.asin(t),a<0&&(i=-i),r=0===g&&0===S?0:Io(Math.atan2(g,S)+this.long0)}return e.x=r,e.y=i,e},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]};function Zl(e){var t=Math.exp(e);return t=(t-1/t)/2}function $l(e,t){e=Math.abs(e),t=Math.abs(t);var s=Math.max(e,t),i=Math.min(e,t)/(s||1);return s*Math.sqrt(1+Math.pow(i,2))}function eh(e){var t=Math.abs(e);return t=function(e){var t=1+e,s=t-1;return 0===s?e:e*Math.log(t)/s}(t*(1+t/($l(1,t)+1))),e<0?-t:t}function th(e,t){for(var s,i=2*Math.cos(2*t),r=e.length-1,n=e[r],a=0;--r>=0;)s=i*n-a+e[r],a=n,n=s;return t+s*Math.sin(2*t)}function sh(e,t,s){for(var i,r,n=Math.sin(t),a=Math.cos(t),o=Zl(s),l=function(e){var t=Math.exp(e);return t=(t+1/t)/2}(s),h=2*a*l,u=-2*n*o,c=e.length-1,p=e[c],d=0,f=0,m=0;--c>=0;)i=f,r=d,p=h*(f=p)-i-u*(d=m)+e[c],m=u*f-r+h*d;return[(h=n*l)*p-(u=a*o)*m,h*m+u*p]}const ih={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(Kl.init.apply(this),this.forward=Kl.forward,this.inverse=Kl.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var e=this.es/(1+Math.sqrt(1-this.es)),t=e/(2-e),s=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+t*(-2854/675)))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+t*(4642/4725)))))-2),s*=t,this.cgb[1]=s*(7/3+t*(t*(-227/45+t*(2704/315+t*(2323/945)))-1.6)),this.cbg[1]=s*(5/3+t*(-16/15+t*(-13/9+t*(904/315+t*(-1522/945))))),s*=t,this.cgb[2]=s*(56/15+t*(-136/35+t*(-1262/105+t*(73814/2835)))),this.cbg[2]=s*(-26/15+t*(34/21+t*(1.6+t*(-12686/2835)))),s*=t,this.cgb[3]=s*(4279/630+t*(-332/35+t*(-399572/14175))),this.cbg[3]=s*(1237/630+t*(t*(-24832/14175)-2.4)),s*=t,this.cgb[4]=s*(4174/315+t*(-144838/6237)),this.cbg[4]=s*(-734/315+t*(109598/31185)),s*=t,this.cgb[5]=s*(601676/22275),this.cbg[5]=s*(444337/155925),s=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+s*(.25+s*(1/64+s/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+t*(-96199/604800)))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+t*(7891/37800)))))),this.utg[1]=s*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+t*(1118711/3870720))))),this.gtu[1]=s*(13/48+t*(t*(557/1440+t*(281/630+t*(-1983433/1935360)))-.6)),s*=t,this.utg[2]=s*(-17/480+t*(37/840+t*(209/4480+t*(-5569/90720)))),this.gtu[2]=s*(61/240+t*(-103/140+t*(15061/26880+t*(167603/181440)))),s*=t,this.utg[3]=s*(-4397/161280+t*(11/504+t*(830251/7257600))),this.gtu[3]=s*(49561/161280+t*(-179/168+t*(6601661/7257600))),s*=t,this.utg[4]=s*(-4583/161280+t*(108847/3991680)),this.gtu[4]=s*(34729/80640+t*(-3418889/1995840)),s*=t,this.utg[5]=-.03233083094085698*s,this.gtu[5]=.6650675310896665*s;var i=th(this.cbg,this.lat0);this.Zb=-this.Qn*(i+function(e,t){for(var s,i=2*Math.cos(t),r=e.length-1,n=e[r],a=0;--r>=0;)s=i*n-a+e[r],a=n,n=s;return Math.sin(t)*s}(this.gtu,2*i))},forward:function(e){var t=Io(e.x-this.long0),s=e.y;s=th(this.cbg,s);var i=Math.sin(s),r=Math.cos(s),n=Math.sin(t),a=Math.cos(t);s=Math.atan2(i,a*r),t=Math.atan2(n*r,$l(i,r*a)),t=eh(Math.tan(t));var o,l,h=sh(this.gtu,2*s,2*t);return s+=h[0],t+=h[1],Math.abs(t)<=2.623395162778?(o=this.a*(this.Qn*t)+this.x0,l=this.a*(this.Qn*s+this.Zb)+this.y0):(o=1/0,l=1/0),e.x=o,e.y=l,e},inverse:function(e){var t,s,i=(e.x-this.x0)*(1/this.a),r=(e.y-this.y0)*(1/this.a);if(r=(r-this.Zb)/this.Qn,i/=this.Qn,Math.abs(i)<=2.623395162778){var n=sh(this.utg,2*r,2*i);r+=n[0],i+=n[1],i=Math.atan(Zl(i));var a=Math.sin(r),o=Math.cos(r),l=Math.sin(i),h=Math.cos(i);r=Math.atan2(a*h,$l(l,h*o)),t=Io((i=Math.atan2(l,h*o))+this.long0),s=th(this.cgb,r)}else t=1/0,s=1/0;return e.x=t,e.y=s,e},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]};const rh={init:function(){var e=function(e,t){if(void 0===e){if((e=Math.floor(30*(Io(t)+Math.PI)/Math.PI)+1)<0)return 0;if(e>60)return 60}return e}(this.zone,this.long0);if(void 0===e)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(e)-183)*to,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,ih.init.apply(this),this.forward=ih.forward,this.inverse=ih.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"};function nh(e,t){return Math.pow((1-e)/(1+e),t)}var ah=20;const oh={init:function(){var e=Math.sin(this.lat0),t=Math.cos(this.lat0);t*=t,this.rc=Math.sqrt(1-this.es)/(1-this.es*e*e),this.C=Math.sqrt(1+this.es*t*t/(1-this.es)),this.phic0=Math.asin(e/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+io)/(Math.pow(Math.tan(.5*this.lat0+io),this.C)*nh(this.e*e,this.ratexp))},forward:function(e){var t=e.x,s=e.y;return e.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*s+io),this.C)*nh(this.e*Math.sin(s),this.ratexp))-Xa,e.x=this.C*t,e},inverse:function(e){for(var t=e.x/this.C,s=e.y,i=Math.pow(Math.tan(.5*s+io)/this.K,1/this.C),r=ah;r>0&&(s=2*Math.atan(i*nh(this.e*Math.sin(e.y),-.5*this.e))-Xa,!(Math.abs(s-e.y)<1e-14));--r)e.y=s;return r?(e.x=t,e.y=s,e):null},names:["gauss"]};const lh={init:function(){oh.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(e){var t,s,i,r;return e.x=Io(e.x-this.long0),oh.forward.apply(this,[e]),t=Math.sin(e.y),s=Math.cos(e.y),i=Math.cos(e.x),r=this.k0*this.R2/(1+this.sinc0*t+this.cosc0*s*i),e.x=r*s*Math.sin(e.x),e.y=r*(this.cosc0*t-this.sinc0*s*i),e.x=this.a*e.x+this.x0,e.y=this.a*e.y+this.y0,e},inverse:function(e){var t,s,i,r,n;if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,n=Math.sqrt(e.x*e.x+e.y*e.y)){var a=2*Math.atan2(n,this.R2);t=Math.sin(a),s=Math.cos(a),r=Math.asin(s*this.sinc0+e.y*t*this.cosc0/n),i=Math.atan2(e.x*t,n*this.cosc0*s-e.y*this.sinc0*t)}else r=this.phic0,i=0;return e.x=i,e.y=r,oh.inverse.apply(this,[e]),e.x=Io(e.x+this.long0),e},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]};const hh={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=eo&&(this.k0=.5*(1+No(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=eo&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=eo&&(this.k0=.5*this.cons*Po(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/Fo(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=Po(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-Xa,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(e){var t,s,i,r,n,a,o=e.x,l=e.y,h=Math.sin(l),u=Math.cos(l),c=Io(o-this.long0);return Math.abs(Math.abs(o-this.long0)-Math.PI)<=eo&&Math.abs(l+this.lat0)<=eo?(e.x=NaN,e.y=NaN,e):this.sphere?(t=2*this.k0/(1+this.sinlat0*h+this.coslat0*u*Math.cos(c)),e.x=this.a*t*u*Math.sin(c)+this.x0,e.y=this.a*t*(this.coslat0*h-this.sinlat0*u*Math.cos(c))+this.y0,e):(s=2*Math.atan(this.ssfn_(l,h,this.e))-Xa,r=Math.cos(s),i=Math.sin(s),Math.abs(this.coslat0)<=eo?(n=Fo(this.e,l*this.con,this.con*h),a=2*this.a*this.k0*n/this.cons,e.x=this.x0+a*Math.sin(o-this.long0),e.y=this.y0-this.con*a*Math.cos(o-this.long0),e):(Math.abs(this.sinlat0)0?Io(this.long0+Math.atan2(e.x,-1*e.y)):Io(this.long0+Math.atan2(e.x,e.y)):Io(this.long0+Math.atan2(e.x*Math.sin(o),a*this.coslat0*Math.cos(o)-e.y*this.sinlat0*Math.sin(o))),e.x=t,e.y=s,e)}if(Math.abs(this.coslat0)<=eo){if(a<=eo)return s=this.lat0,t=this.long0,e.x=t,e.y=s,e;e.x*=this.con,e.y*=this.con,i=a*this.cons/(2*this.a*this.k0),s=this.con*Do(this.e,i),t=this.con*Io(this.con*this.long0+Math.atan2(e.x,-1*e.y))}else r=2*Math.atan(a*this.cosX0/(2*this.a*this.k0*this.ms1)),t=this.long0,a<=eo?n=this.X0:(n=Math.asin(Math.cos(r)*this.sinX0+e.y*Math.sin(r)*this.cosX0/a),t=Io(this.long0+Math.atan2(e.x*Math.sin(r),a*this.cosX0*Math.cos(r)-e.y*this.sinX0*Math.sin(r)))),s=-1*Do(this.e,Math.tan(.5*(Xa+n)));return e.x=t,e.y=s,e},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(e,t,s){return t*=s,Math.tan(.5*(Xa+e))*Math.pow((1-t)/(1+t),.5*s)}};const uh={init:function(){var e=this.lat0;this.lambda0=this.long0;var t=Math.sin(e),s=this.a,i=1/this.rf,r=2*i-Math.pow(i,2),n=this.e=Math.sqrt(r);this.R=this.k0*s*Math.sqrt(1-r)/(1-r*Math.pow(t,2)),this.alpha=Math.sqrt(1+r/(1-r)*Math.pow(Math.cos(e),4)),this.b0=Math.asin(t/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),o=Math.log(Math.tan(Math.PI/4+e/2)),l=Math.log((1+n*t)/(1-n*t));this.K=a-this.alpha*o+this.alpha*n/2*l},forward:function(e){var t=Math.log(Math.tan(Math.PI/4-e.y/2)),s=this.e/2*Math.log((1+this.e*Math.sin(e.y))/(1-this.e*Math.sin(e.y))),i=-this.alpha*(t+s)+this.K,r=2*(Math.atan(Math.exp(i))-Math.PI/4),n=this.alpha*(e.x-this.lambda0),a=Math.atan(Math.sin(n)/(Math.sin(this.b0)*Math.tan(r)+Math.cos(this.b0)*Math.cos(n))),o=Math.asin(Math.cos(this.b0)*Math.sin(r)-Math.sin(this.b0)*Math.cos(r)*Math.cos(n));return e.y=this.R/2*Math.log((1+Math.sin(o))/(1-Math.sin(o)))+this.y0,e.x=this.R*a+this.x0,e},inverse:function(e){for(var t=e.x-this.x0,s=e.y-this.y0,i=t/this.R,r=2*(Math.atan(Math.exp(s/this.R))-Math.PI/4),n=Math.asin(Math.cos(this.b0)*Math.sin(r)+Math.sin(this.b0)*Math.cos(r)*Math.cos(i)),a=Math.atan(Math.sin(i)/(Math.cos(this.b0)*Math.cos(i)-Math.sin(this.b0)*Math.tan(r))),o=this.lambda0+a/this.alpha,l=0,h=n,u=-1e3,c=0;Math.abs(h-u)>1e-7;){if(++c>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+n/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(h))/2)),u=h,h=2*Math.atan(Math.exp(l))-Math.PI/2}return e.x=o,e.y=h,e},names:["somerc"]};var ch=1e-7;const ph={init:function(){var e,t,s,i,r,n,a,o,l,h,u,c,p,d=0,f=0,m=0,y=0,g=0,v=0,S=0;this.no_off=(p="object"==typeof(c=this).PROJECTION?Object.keys(c.PROJECTION)[0]:c.PROJECTION,"no_uoff"in c||"no_off"in c||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(p)),this.no_rot="no_rot"in this;var b=!1;"alpha"in this&&(b=!0);var x=!1;if("rectified_grid_angle"in this&&(x=!0),b&&(S=this.alpha),x&&(d=this.rectified_grid_angle*to),b||x)f=this.longc;else if(m=this.long1,g=this.lat1,y=this.long2,v=this.lat2,Math.abs(g-v)<=ch||(e=Math.abs(g))<=ch||Math.abs(e-Xa)<=ch||Math.abs(Math.abs(this.lat0)-Xa)<=ch||Math.abs(Math.abs(v)-Xa)<=ch)throw new Error;var _=1-this.es;t=Math.sqrt(_),Math.abs(this.lat0)>eo?(o=Math.sin(this.lat0),s=Math.cos(this.lat0),e=1-this.es*o*o,this.B=s*s,this.B=Math.sqrt(1+this.es*this.B*this.B/_),this.A=this.B*this.k0*t/e,(r=(i=this.B*t/(s*Math.sqrt(e)))*i-1)<=0?r=0:(r=Math.sqrt(r),this.lat0<0&&(r=-r)),this.E=r+=i,this.E*=Math.pow(Fo(this.e,this.lat0,o),this.B)):(this.B=1/t,this.A=this.k0,this.E=i=r=1),b||x?(b?(u=Math.asin(Math.sin(S)/i),x||(d=S)):(u=d,S=Math.asin(i*Math.sin(u))),this.lam0=f-Math.asin(.5*(r-1/r)*Math.tan(u))/this.B):(n=Math.pow(Fo(this.e,g,Math.sin(g)),this.B),a=Math.pow(Fo(this.e,v,Math.sin(v)),this.B),r=this.E/n,l=(a-n)/(a+n),h=((h=this.E*this.E)-a*n)/(h+a*n),(e=m-y)<-Math.pi?y-=ro:e>Math.pi&&(y+=ro),this.lam0=Io(.5*(m+y)-Math.atan(h*Math.tan(.5*this.B*(m-y))/l)/this.B),u=Math.atan(2*Math.sin(this.B*Io(m-this.lam0))/(r-1/r)),d=S=Math.asin(i*Math.sin(u))),this.singam=Math.sin(u),this.cosgam=Math.cos(u),this.sinrot=Math.sin(d),this.cosrot=Math.cos(d),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.A,this.B,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(i*i-1)/Math.cos(S))),this.lat0<0&&(this.u_0=-this.u_0)),r=.5*u,this.v_pole_n=this.ArB*Math.log(Math.tan(io-r)),this.v_pole_s=this.ArB*Math.log(Math.tan(io+r))},forward:function(e){var t,s,i,r,n,a,o,l,h={};if(e.x=e.x-this.lam0,Math.abs(Math.abs(e.y)-Xa)>eo){if(t=.5*((n=this.E/Math.pow(Fo(this.e,e.y,Math.sin(e.y)),this.B))-(a=1/n)),s=.5*(n+a),r=Math.sin(this.B*e.x),i=(t*this.singam-r*this.cosgam)/s,Math.abs(Math.abs(i)-1)0?this.v_pole_n:this.v_pole_s,o=this.ArB*e.y;return this.no_rot?(h.x=o,h.y=l):(o-=this.u_0,h.x=l*this.cosrot+o*this.sinrot,h.y=o*this.cosrot-l*this.sinrot),h.x=this.a*h.x+this.x0,h.y=this.a*h.y+this.y0,h},inverse:function(e){var t,s,i,r,n,a,o,l={};if(e.x=(e.x-this.x0)*(1/this.a),e.y=(e.y-this.y0)*(1/this.a),this.no_rot?(s=e.y,t=e.x):(s=e.x*this.cosrot-e.y*this.sinrot,t=e.y*this.cosrot+e.x*this.sinrot+this.u_0),r=.5*((i=Math.exp(-this.BrA*s))-1/i),n=.5*(i+1/i),o=((a=Math.sin(this.BrA*t))*this.cosgam+r*this.singam)/n,Math.abs(Math.abs(o)-1)eo?this.ns=Math.log(i/o)/Math.log(r/l):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=i/(this.ns*Math.pow(r,this.ns)),this.rh=this.a*this.f0*Math.pow(h,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(e){var t=e.x,s=e.y;Math.abs(2*Math.abs(s)-Math.PI)<=eo&&(s=No(s)*(Xa-2*eo));var i,r,n=Math.abs(Math.abs(s)-Xa);if(n>eo)i=Fo(this.e,s,Math.sin(s)),r=this.a*this.f0*Math.pow(i,this.ns);else{if((n=s*this.ns)<=0)return null;r=0}var a=this.ns*Io(t-this.long0);return e.x=this.k0*(r*Math.sin(a))+this.x0,e.y=this.k0*(this.rh-r*Math.cos(a))+this.y0,e},inverse:function(e){var t,s,i,r,n,a=(e.x-this.x0)/this.k0,o=this.rh-(e.y-this.y0)/this.k0;this.ns>0?(t=Math.sqrt(a*a+o*o),s=1):(t=-Math.sqrt(a*a+o*o),s=-1);var l=0;if(0!==t&&(l=Math.atan2(s*a,s*o)),0!==t||this.ns>0){if(s=1/this.ns,i=Math.pow(t/(this.a*this.f0),s),-9999===(r=Do(this.e,i)))return null}else r=-Xa;return n=Io(l/this.ns+this.long0),e.x=n,e.y=r,e},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc"]};const fh={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(e){var t,s,i,r,n,a,o,l=e.x,h=e.y,u=Io(l-this.long0);return t=Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.alfa*this.e/2),s=2*(Math.atan(this.k*Math.pow(Math.tan(h/2+this.s45),this.alfa)/t)-this.s45),i=-u*this.alfa,r=Math.asin(Math.cos(this.ad)*Math.sin(s)+Math.sin(this.ad)*Math.cos(s)*Math.cos(i)),n=Math.asin(Math.cos(s)*Math.sin(i)/Math.cos(r)),a=this.n*n,o=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(r/2+this.s45),this.n),e.y=o*Math.cos(a)/1,e.x=o*Math.sin(a)/1,this.czech||(e.y*=-1,e.x*=-1),e},inverse:function(e){var t,s,i,r,n,a,o,l=e.x;e.x=e.y,e.y=l,this.czech||(e.y*=-1,e.x*=-1),n=Math.sqrt(e.x*e.x+e.y*e.y),r=Math.atan2(e.y,e.x)/Math.sin(this.s0),i=2*(Math.atan(Math.pow(this.ro0/n,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),t=Math.asin(Math.cos(this.ad)*Math.sin(i)-Math.sin(this.ad)*Math.cos(i)*Math.cos(r)),s=Math.asin(Math.cos(i)*Math.sin(r)/Math.cos(t)),e.x=this.long0-s/this.alfa,a=t,o=0;var h=0;do{e.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(t/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-e.y)<1e-10&&(o=1),a=e.y,h+=1}while(0===o&&h<15);return h>=15?null:e},names:["Krovak","krovak"]};function mh(e,t,s,i,r){return e*r-t*Math.sin(2*r)+s*Math.sin(4*r)-i*Math.sin(6*r)}function yh(e){return 1-.25*e*(1+e/16*(3+1.25*e))}function gh(e){return.375*e*(1+.25*e*(1+.46875*e))}function vh(e){return.05859375*e*e*(1+.75*e)}function Sh(e){return e*e*e*(35/3072)}function bh(e,t,s){var i=t*s;return e/Math.sqrt(1-i*i)}function xh(e){return Math.abs(e)1e-7?(1-e*e)*(t/(1-(s=e*t)*s)-.5/e*Math.log((1-s)/(1+s))):2*t}var Mh=.3333333333333333,Ah=.17222222222222222,Th=.10257936507936508,Eh=.06388888888888888,Lh=.0664021164021164,Oh=.016415012942191543;const Ph={init:function(){var e,t=Math.abs(this.lat0);if(Math.abs(t-Xa)0)switch(this.qp=wh(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(e){var t,s=[];return s[0]=e*Mh,t=e*e,s[0]+=t*Ah,s[1]=t*Eh,t*=e,s[0]+=t*Th,s[1]+=t*Lh,s[2]=t*Oh,s}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=wh(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(e){var t,s,i,r,n,a,o,l,h,u,c=e.x,p=e.y;if(c=Io(c-this.long0),this.sphere){if(n=Math.sin(p),u=Math.cos(p),i=Math.cos(c),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((s=this.mode===this.EQUIT?1+u*i:1+this.sinph0*n+this.cosph0*u*i)<=eo)return null;t=(s=Math.sqrt(2/s))*u*Math.sin(c),s*=this.mode===this.EQUIT?n:this.cosph0*n-this.sinph0*u*i}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(i=-i),Math.abs(p+this.lat0)=0?(t=(h=Math.sqrt(a))*r,s=i*(this.mode===this.S_POLE?h:-h)):t=s=0}}return e.x=this.a*t+this.x0,e.y=this.a*s+this.y0,e},inverse:function(e){e.x-=this.x0,e.y-=this.y0;var t,s,i,r,n,a,o,l,h,u,c=e.x/this.a,p=e.y/this.a;if(this.sphere){var d,f=0,m=0;if((s=.5*(d=Math.sqrt(c*c+p*p)))>1)return null;switch(s=2*Math.asin(s),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(m=Math.sin(s),f=Math.cos(s)),this.mode){case this.EQUIT:s=Math.abs(d)<=eo?0:Math.asin(p*m/d),c*=m,p=f*d;break;case this.OBLIQ:s=Math.abs(d)<=eo?this.lat0:Math.asin(f*this.sinph0+p*m*this.cosph0/d),c*=m*this.cosph0,p=(f-Math.sin(s)*this.sinph0)*d;break;case this.N_POLE:p=-p,s=Xa-s;break;case this.S_POLE:s-=Xa}t=0!==p||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(c,p):0}else{if(o=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c/=this.dd,p*=this.dd,(a=Math.sqrt(c*c+p*p))1&&(e=e>1?1:-1),Math.asin(e)}const Ih={init:function(){Math.abs(this.lat1+this.lat2)eo?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(e){var t=e.x,s=e.y;this.sin_phi=Math.sin(s),this.cos_phi=Math.cos(s);var i=wh(this.e3,this.sin_phi,this.cos_phi),r=this.a*Math.sqrt(this.c-this.ns0*i)/this.ns0,n=this.ns0*Io(t-this.long0),a=r*Math.sin(n)+this.x0,o=this.rh-r*Math.cos(n)+this.y0;return e.x=a,e.y=o,e},inverse:function(e){var t,s,i,r,n,a;return e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns0>=0?(t=Math.sqrt(e.x*e.x+e.y*e.y),i=1):(t=-Math.sqrt(e.x*e.x+e.y*e.y),i=-1),r=0,0!==t&&(r=Math.atan2(i*e.x,i*e.y)),i=t*this.ns0/this.a,this.sphere?a=Math.asin((this.c-i*i)/(2*this.ns0)):(s=(this.c-i*i)/this.ns0,a=this.phi1z(this.e3,s)),n=Io(r/this.ns0+this.long0),e.x=n,e.y=a,e},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(e,t){var s,i,r,n,a,o=Nh(.5*t);if(e0||Math.abs(n)<=eo?(a=this.x0+1*this.a*s*Math.sin(i)/n,o=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*s*r)/n):(a=this.x0+this.infinity_dist*s*Math.sin(i),o=this.y0+this.infinity_dist*(this.cos_p14*t-this.sin_p14*s*r)),e.x=a,e.y=o,e},inverse:function(e){var t,s,i,r,n,a;return e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,(t=Math.sqrt(e.x*e.x+e.y*e.y))?(r=Math.atan2(t,this.rc),s=Math.sin(r),a=Nh((i=Math.cos(r))*this.sin_p14+e.y*s*this.cos_p14/t),n=Math.atan2(e.x*s,t*this.cos_p14*i-e.y*this.sin_p14*s),n=Io(this.long0+n)):(a=this.phic0,n=0),e.x=n,e.y=a,e},names:["gnom"]};const Dh={init:function(){this.sphere||(this.k0=Po(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(e){var t,s,i=e.x,r=e.y,n=Io(i-this.long0);if(this.sphere)t=this.x0+this.a*n*Math.cos(this.lat_ts),s=this.y0+this.a*Math.sin(r)/Math.cos(this.lat_ts);else{var a=wh(this.e,Math.sin(r));t=this.x0+this.a*this.k0*n,s=this.y0+this.a*a*.5/this.k0}return e.x=t,e.y=s,e},inverse:function(e){var t,s;return e.x-=this.x0,e.y-=this.y0,this.sphere?(t=Io(this.long0+e.x/this.a/Math.cos(this.lat_ts)),s=Math.asin(e.y/this.a*Math.cos(this.lat_ts))):(s=function(e,t){var s=1-(1-e*e)/(2*e)*Math.log((1-e)/(1+e));if(Math.abs(Math.abs(t)-s)<1e-6)return t<0?-1*Xa:Xa;for(var i,r,n,a,o=Math.asin(.5*t),l=0;l<30;l++)if(r=Math.sin(o),n=Math.cos(o),a=e*r,o+=i=Math.pow(1-a*a,2)/(2*n)*(t/(1-e*e)-r/(1-a*a)+.5/e*Math.log((1-a)/(1+a))),Math.abs(i)<=1e-10)return o;return NaN}(this.e,2*e.y*this.k0/this.a),t=Io(this.long0+e.x/(this.a*this.k0))),e.x=t,e.y=s,e},names:["cea"]};const Rh={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(e){var t=e.x,s=e.y,i=Io(t-this.long0),r=xh(s-this.lat0);return e.x=this.x0+this.a*i*this.rc,e.y=this.y0+this.a*r,e},inverse:function(e){var t=e.x,s=e.y;return e.x=Io(this.long0+(t-this.x0)/(this.a*this.rc)),e.y=xh(this.lat0+(s-this.y0)/this.a),e},names:["Equirectangular","Equidistant_Cylindrical","eqc"]};var kh=20;const Bh={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=yh(this.es),this.e1=gh(this.es),this.e2=vh(this.es),this.e3=Sh(this.es),this.ml0=this.a*mh(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(e){var t,s,i,r=e.x,n=e.y,a=Io(r-this.long0);if(i=a*Math.sin(n),this.sphere)Math.abs(n)<=eo?(t=this.a*a,s=-1*this.a*this.lat0):(t=this.a*Math.sin(i)/Math.tan(n),s=this.a*(xh(n-this.lat0)+(1-Math.cos(i))/Math.tan(n)));else if(Math.abs(n)<=eo)t=this.a*a,s=-1*this.ml0;else{var o=bh(this.a,this.e,Math.sin(n))/Math.tan(n);t=o*Math.sin(i),s=this.a*mh(this.e0,this.e1,this.e2,this.e3,n)-this.ml0+o*(1-Math.cos(i))}return e.x=t+this.x0,e.y=s+this.y0,e},inverse:function(e){var t,s,i,r,n,a,o,l,h;if(i=e.x-this.x0,r=e.y-this.y0,this.sphere)if(Math.abs(r+this.a*this.lat0)<=eo)t=Io(i/this.a+this.long0),s=0;else{var u;for(a=this.lat0+r/this.a,o=i*i/this.a/this.a+a*a,l=a,n=kh;n;--n)if(l+=h=-1*(a*(l*(u=Math.tan(l))+1)-l-.5*(l*l+o)*u)/((l-a)/u-1),Math.abs(h)<=eo){s=l;break}t=Io(this.long0+Math.asin(i*Math.tan(l)/this.a)/Math.sin(s))}else if(Math.abs(r+this.ml0)<=eo)s=0,t=Io(this.long0+i/this.a);else{var c,p,d,f,m;for(a=(this.ml0+r)/this.a,o=i*i/this.a/this.a+a*a,l=a,n=kh;n;--n)if(m=this.e*Math.sin(l),c=Math.sqrt(1-m*m)*Math.tan(l),p=this.a*mh(this.e0,this.e1,this.e2,this.e3,l),d=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),l-=h=(a*(c*(f=p/this.a)+1)-f-.5*c*(f*f+o))/(this.es*Math.sin(2*l)*(f*f+o-2*a*f)/(4*c)+(a-f)*(c*d-2/Math.sin(2*l))-d),Math.abs(h)<=eo){s=l;break}c=Math.sqrt(1-this.es*Math.pow(Math.sin(s),2))*Math.tan(s),t=Io(this.long0+Math.asin(i*c/this.a)/Math.sin(s))}return e.x=t,e.y=s,e},names:["Polyconic","poly"]};const Gh={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(e){var t,s=e.x,i=e.y-this.lat0,r=s-this.long0,n=i/Qa*1e-5,a=r,o=1,l=0;for(t=1;t<=10;t++)o*=n,l+=this.A[t]*o;var h,u=l,c=a,p=1,d=0,f=0,m=0;for(t=1;t<=6;t++)h=d*u+p*c,p=p*u-d*c,d=h,f=f+this.B_re[t]*p-this.B_im[t]*d,m=m+this.B_im[t]*p+this.B_re[t]*d;return e.x=m*this.a+this.x0,e.y=f*this.a+this.y0,e},inverse:function(e){var t,s,i=e.x,r=e.y,n=i-this.x0,a=(r-this.y0)/this.a,o=n/this.a,l=1,h=0,u=0,c=0;for(t=1;t<=6;t++)s=h*a+l*o,l=l*a-h*o,h=s,u=u+this.C_re[t]*l-this.C_im[t]*h,c=c+this.C_im[t]*l+this.C_re[t]*h;for(var p=0;p.999999999999&&(s=.999999999999),t=Math.asin(s);var i=Io(this.long0+e.x/(.900316316158*this.a*Math.cos(t)));i<-Math.PI&&(i=-Math.PI),i>Math.PI&&(i=Math.PI),s=(2*t+Math.sin(2*t))/Math.PI,Math.abs(s)>1&&(s=1);var r=Math.asin(s);return e.x=i,e.y=r,e},names:["Mollweide","moll"]};const Jh={init:function(){Math.abs(this.lat1+this.lat2)=0?(s=Math.sqrt(e.x*e.x+e.y*e.y),t=1):(s=-Math.sqrt(e.x*e.x+e.y*e.y),t=-1);var n=0;return 0!==s&&(n=Math.atan2(t*e.x,t*e.y)),this.sphere?(r=Io(this.long0+n/this.ns),i=xh(this.g-s/this.a),e.x=r,e.y=i,e):(i=_h(this.g-s/this.a,this.e0,this.e1,this.e2,this.e3),r=Io(this.long0+n/this.ns),e.x=r,e.y=i,e)},names:["Equidistant_Conic","eqdc"]};const qh={init:function(){this.R=this.a},forward:function(e){var t,s,i=e.x,r=e.y,n=Io(i-this.long0);Math.abs(r)<=eo&&(t=this.x0+this.R*n,s=this.y0);var a=Nh(2*Math.abs(r/Math.PI));(Math.abs(n)<=eo||Math.abs(Math.abs(r)-Xa)<=eo)&&(t=this.x0,s=r>=0?this.y0+Math.PI*this.R*Math.tan(.5*a):this.y0+Math.PI*this.R*-Math.tan(.5*a));var o=.5*Math.abs(Math.PI/n-n/Math.PI),l=o*o,h=Math.sin(a),u=Math.cos(a),c=u/(h+u-1),p=c*c,d=c*(2/h-1),f=d*d,m=Math.PI*this.R*(o*(c-f)+Math.sqrt(l*(c-f)*(c-f)-(f+l)*(p-f)))/(f+l);n<0&&(m=-m),t=this.x0+m;var y=l+c;return m=Math.PI*this.R*(d*y-o*Math.sqrt((f+l)*(l+1)-y*y))/(f+l),s=r>=0?this.y0+m:this.y0-m,e.x=t,e.y=s,e},inverse:function(e){var t,s,i,r,n,a,o,l,h,u,c,p;return e.x-=this.x0,e.y-=this.y0,c=Math.PI*this.R,n=(i=e.x/c)*i+(r=e.y/c)*r,c=3*(r*r/(l=-2*(a=-Math.abs(r)*(1+n))+1+2*r*r+n*n)+(2*(o=a-2*r*r+i*i)*o*o/l/l/l-9*a*o/l/l)/27)/(h=(a-o*o/3/l)/l)/(u=2*Math.sqrt(-h/3)),Math.abs(c)>1&&(c=c>=0?1:-1),p=Math.acos(c)/3,s=e.y>=0?(-u*Math.cos(p+Math.PI/3)-o/3/l)*Math.PI:-(-u*Math.cos(p+Math.PI/3)-o/3/l)*Math.PI,t=Math.abs(i)2*Xa*this.a)return;return s=t/this.a,i=Math.sin(s),r=Math.cos(s),n=this.long0,Math.abs(t)<=eo?a=this.lat0:(a=Nh(r*this.sin_p12+e.y*i*this.cos_p12/t),o=Math.abs(this.lat0)-Xa,n=Math.abs(o)<=eo?this.lat0>=0?Io(this.long0+Math.atan2(e.x,-e.y)):Io(this.long0-Math.atan2(-e.x,e.y)):Io(this.long0+Math.atan2(e.x*i,t*this.cos_p12*r-e.y*this.sin_p12*i))),e.x=n,e.y=a,e}return l=yh(this.es),h=gh(this.es),u=vh(this.es),c=Sh(this.es),Math.abs(this.sin_p12-1)<=eo?(a=_h(((p=this.a*mh(l,h,u,c,Xa))-(t=Math.sqrt(e.x*e.x+e.y*e.y)))/this.a,l,h,u,c),n=Io(this.long0+Math.atan2(e.x,-1*e.y)),e.x=n,e.y=a,e):Math.abs(this.sin_p12+1)<=eo?(p=this.a*mh(l,h,u,c,Xa),a=_h(((t=Math.sqrt(e.x*e.x+e.y*e.y))-p)/this.a,l,h,u,c),n=Io(this.long0+Math.atan2(e.x,e.y)),e.x=n,e.y=a,e):(t=Math.sqrt(e.x*e.x+e.y*e.y),m=Math.atan2(e.x,e.y),d=bh(this.a,this.e,this.sin_p12),y=Math.cos(m),v=-(g=this.e*this.cos_p12*y)*g/(1-this.es),S=3*this.es*(1-v)*this.sin_p12*this.cos_p12*y/(1-this.es),_=1-v*(x=(b=t/d)-v*(1+v)*Math.pow(b,3)/6-S*(1+3*v)*Math.pow(b,4)/24)*x/2-b*x*x*x/6,f=Math.asin(this.sin_p12*Math.cos(x)+this.cos_p12*Math.sin(x)*y),n=Io(this.long0+Math.asin(Math.sin(m)*Math.sin(x)/Math.cos(f))),C=Math.sin(f),a=Math.atan2((C-this.es*_*this.sin_p12)*Math.tan(f),C*(1-this.es)),e.x=n,e.y=a,e)},names:["Azimuthal_Equidistant","aeqd"]};const Wh={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(e){var t,s,i,r,n,a,o,l=e.x,h=e.y;return i=Io(l-this.long0),t=Math.sin(h),s=Math.cos(h),r=Math.cos(i),((n=this.sin_p14*t+this.cos_p14*s*r)>0||Math.abs(n)<=eo)&&(a=1*this.a*s*Math.sin(i),o=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*s*r)),e.x=a,e.y=o,e},inverse:function(e){var t,s,i,r,n,a,o;return e.x-=this.x0,e.y-=this.y0,s=Nh((t=Math.sqrt(e.x*e.x+e.y*e.y))/this.a),i=Math.sin(s),r=Math.cos(s),a=this.long0,Math.abs(t)<=eo?(o=this.lat0,e.x=a,e.y=o,e):(o=Nh(r*this.sin_p14+e.y*i*this.cos_p14/t),n=Math.abs(this.lat0)-Xa,Math.abs(n)<=eo?(a=this.lat0>=0?Io(this.long0+Math.atan2(e.x,-e.y)):Io(this.long0-Math.atan2(-e.x,e.y)),e.x=a,e.y=o,e):(a=Io(this.long0+Math.atan2(e.x*i,t*this.cos_p14*r-e.y*this.sin_p14*i)),e.x=a,e.y=o,e))},names:["ortho"]};var Yh={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},Qh={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4};function Xh(e,t,s,i){var r;return eio&&r<=Xa+io?(i.value=Qh.AREA_1,r-=Xa):r>Xa+io||r<=-(Xa+io)?(i.value=Qh.AREA_2,r=r>=0?r-no:r+no):(i.value=Qh.AREA_3,r+=Xa)),r}function Kh(e,t){var s=e+t;return s<-no?s+=ro:s>+no&&(s-=ro),s}const Zh={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=Xa-io/2?this.face=Yh.TOP:this.lat0<=-(Xa-io/2)?this.face=Yh.BOTTOM:Math.abs(this.long0)<=io?this.face=Yh.FRONT:Math.abs(this.long0)<=Xa+io?this.face=this.long0>0?Yh.RIGHT:Yh.LEFT:this.face=Yh.BACK,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(e){var t,s,i,r,n,a,o={x:0,y:0},l={value:0};if(e.x-=this.long0,t=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(e.y)):e.y,s=e.x,this.face===Yh.TOP)r=Xa-t,s>=io&&s<=Xa+io?(l.value=Qh.AREA_0,i=s-Xa):s>Xa+io||s<=-(Xa+io)?(l.value=Qh.AREA_1,i=s>0?s-no:s+no):s>-(Xa+io)&&s<=-io?(l.value=Qh.AREA_2,i=s+Xa):(l.value=Qh.AREA_3,i=s);else if(this.face===Yh.BOTTOM)r=Xa+t,s>=io&&s<=Xa+io?(l.value=Qh.AREA_0,i=-s+Xa):s=-io?(l.value=Qh.AREA_1,i=-s):s<-io&&s>=-(Xa+io)?(l.value=Qh.AREA_2,i=-s-Xa):(l.value=Qh.AREA_3,i=s>0?-s+no:-s-no);else{var h,u,c,p,d,f;this.face===Yh.RIGHT?s=Kh(s,+Xa):this.face===Yh.BACK?s=Kh(s,+no):this.face===Yh.LEFT&&(s=Kh(s,-Xa)),p=Math.sin(t),d=Math.cos(t),f=Math.sin(s),h=d*Math.cos(s),u=d*f,c=p,this.face===Yh.FRONT?i=Xh(r=Math.acos(h),c,u,l):this.face===Yh.RIGHT?i=Xh(r=Math.acos(u),c,-h,l):this.face===Yh.BACK?i=Xh(r=Math.acos(-h),c,-u,l):this.face===Yh.LEFT?i=Xh(r=Math.acos(-u),c,h,l):(r=i=0,l.value=Qh.AREA_0)}return a=Math.atan(12/no*(i+Math.acos(Math.sin(i)*Math.cos(io))-Xa)),n=Math.sqrt((1-Math.cos(r))/(Math.cos(a)*Math.cos(a))/(1-Math.cos(Math.atan(1/Math.cos(i))))),l.value===Qh.AREA_1?a+=Xa:l.value===Qh.AREA_2?a+=no:l.value===Qh.AREA_3&&(a+=1.5*no),o.x=n*Math.cos(a),o.y=n*Math.sin(a),o.x=o.x*this.a+this.x0,o.y=o.y*this.a+this.y0,e.x=o.x,e.y=o.y,e},inverse:function(e){var t,s,i,r,n,a,o,l,h,u,c,p,d={lam:0,phi:0},f={value:0};if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,s=Math.atan(Math.sqrt(e.x*e.x+e.y*e.y)),t=Math.atan2(e.y,e.x),e.x>=0&&e.x>=Math.abs(e.y)?f.value=Qh.AREA_0:e.y>=0&&e.y>=Math.abs(e.x)?(f.value=Qh.AREA_1,t-=Xa):e.x<0&&-e.x>=Math.abs(e.y)?(f.value=Qh.AREA_2,t=t<0?t+no:t-no):(f.value=Qh.AREA_3,t+=Xa),h=no/12*Math.tan(t),n=Math.sin(h)/(Math.cos(h)-1/Math.sqrt(2)),a=Math.atan(n),(o=1-(i=Math.cos(t))*i*(r=Math.tan(s))*r*(1-Math.cos(Math.atan(1/Math.cos(a)))))<-1?o=-1:o>1&&(o=1),this.face===Yh.TOP)l=Math.acos(o),d.phi=Xa-l,f.value===Qh.AREA_0?d.lam=a+Xa:f.value===Qh.AREA_1?d.lam=a<0?a+no:a-no:f.value===Qh.AREA_2?d.lam=a-Xa:d.lam=a;else if(this.face===Yh.BOTTOM)l=Math.acos(o),d.phi=l-Xa,f.value===Qh.AREA_0?d.lam=-a+Xa:f.value===Qh.AREA_1?d.lam=-a:f.value===Qh.AREA_2?d.lam=-a-Xa:d.lam=a<0?-a-no:-a+no;else{var m,y,g;h=(m=o)*m,y=(h+=(g=h>=1?0:Math.sqrt(1-h)*Math.sin(a))*g)>=1?0:Math.sqrt(1-h),f.value===Qh.AREA_1?(h=y,y=-g,g=h):f.value===Qh.AREA_2?(y=-y,g=-g):f.value===Qh.AREA_3&&(h=y,y=g,g=-h),this.face===Yh.RIGHT?(h=m,m=-y,y=h):this.face===Yh.BACK?(m=-m,y=-y):this.face===Yh.LEFT&&(h=m,m=y,y=-h),d.phi=Math.acos(-g)-Xa,d.lam=Math.atan2(y,m),this.face===Yh.RIGHT?d.lam=Kh(d.lam,-Xa):this.face===Yh.BACK?d.lam=Kh(d.lam,-no):this.face===Yh.LEFT&&(d.lam=Kh(d.lam,+Xa))}return 0!==this.es&&(u=d.phi<0?1:0,c=Math.tan(d.phi),p=this.b/Math.sqrt(c*c+this.one_minus_f_squared),d.phi=Math.atan(Math.sqrt(this.a*this.a-p*p)/(this.one_minus_f*p)),u&&(d.phi=-d.phi)),d.lam+=this.long0,e.x=d.lam,e.y=d.phi,e},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]};var $h=[[1,2.2199e-17,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],eu=[[-5.20417e-18,.0124,1.21431e-18,-8.45284e-11],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],tu=.8487,su=1.3523,iu=so/5,ru=1/iu,nu=18,au=function(e,t){return e[0]+t*(e[1]+t*(e[2]+t*e[3]))},ou=function(e,t){return e[1]+t*(2*e[2]+3*t*e[3])};const lu={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(e){var t=Io(e.x-this.long0),s=Math.abs(e.y),i=Math.floor(s*iu);i<0?i=0:i>=nu&&(i=nu-1),s=so*(s-ru*i);var r={x:au($h[i],s)*t,y:au(eu[i],s)};return e.y<0&&(r.y=-r.y),r.x=r.x*this.a*tu+this.x0,r.y=r.y*this.a*su+this.y0,r},inverse:function(e){var t={x:(e.x-this.x0)/(this.a*tu),y:Math.abs(e.y-this.y0)/(this.a*su)};if(t.y>=1)t.x/=$h[nu][0],t.y=e.y<0?-Xa:Xa;else{var s=Math.floor(t.y*nu);for(s<0?s=0:s>=nu&&(s=nu-1);;)if(eu[s][0]>t.y)--s;else{if(!(eu[s+1][0]<=t.y))break;++s}var i=eu[s],r=5*(t.y-i[0])/(eu[s+1][0]-i[0]);r=function(e,t,s,i){for(var r=t;i;--i){var n=e(r);if(r-=n,Math.abs(n)1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var n={header:r,subgrids:function(e,t,s){for(var i=[],r=0;rthis.bounds.max.x?this.bounds.max.x:e.x,e.y=e.ythis.bounds.max.y?this.bounds.max.y:e.y);var s=this._proj.inverse([e.x,e.y]);return new(Ua().LatLng)(s[1],s[0],t)},_projFromCodeDef:function(e,t){if(t)du.defs(e,t);else if(void 0===du.defs[e]){var s=e.split(":");if(s.length>3&&(e=s[s.length-3]+":"+s[s.length-1]),void 0===du.defs[e])throw"No projection definition for code "+e}return du(e)},getUnits:function(){return this._proj.oProj.units||"degrees"}});var fu=Ua().Class.extend({includes:Ua().CRS,options:{transformation:new(Ua().Transformation)(1,0,-1,0)},initialize:function(e,t){var s,i,r;if(Ua().Proj._isProj4Obj(e)?(s=(i=e).srsCode,t=t||{},this.projection=new(Ua().Proj.Projection)(i,t.bounds,t.wrapLng)):(s=e,r=(t=t||{}).def||"",this.projection=new(Ua().Proj.Projection)(s,r,t.bounds,t.wrapLng)),Ua().Util.setOptions(this,t),this.options.wrapLng&&(this.wrapLng=this.options.wrapLng),this.code=s,this.transformation=this.options.transformation,this.options.dpi=this.options.dpi||96,this.options.bounds&&(this.options.bounds=Ua().bounds(this.options.bounds)),!this.options.origin&&this.options.bounds&&(this.options.origin=[this.options.bounds.min.x,this.options.bounds.max.y]),this.options.origin&&(this.options.origin instanceof Ua().Point&&(this.options.origin=[this.options.origin.x,this.options.origin.y]),this.transformation=new(Ua().Transformation)(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales&&this.options.scales.length>0)this.scales=this.options.scales,this._scales=this._toProj4Scales(this.options.scales,this.options.dpi);else if(this.options.scaleDenominators&&this.options.scaleDenominators.length>0){this.scales=[];for(let e=0;e0){this._scales=[];for(let e=this.options.resolutions.length-1;e>=0;e--)this.options.resolutions[e]&&(this._scales[e]=1/this.options.resolutions[e])}else this.options.bounds&&(this._scales=this._getDefaultProj4ScalesByBounds(this.options.bounds));this._rectify(),this.infinite=!this.options.bounds},_rectify:function(){if(this._scales&&(this.resolutions||(this.resolutions=[],this.resolutions=this._proj4ScalesToResolutions(this._scales)),!this.scales)){this.scales=[];for(let t=0;tLeaflet\n with © SuperMap iClient",Common:{attribution:"Map Data © SuperMap iServer"},Online:{attribution:"Map Data © SuperMap Online"},ECharts:{attribution:"© 2018 百度 ECharts"},MapV:{attribution:"© 2018 百度 MapV "},Turf:{attribution:"© turfjs"},Baidu:{attribution:"Map Data © 2018 Baidu - GS(2016)2089号 - Data © 长地万方"},Cloud:{attribution:"Map Data ©2014 SuperMap - GS(2014)6070号-data©Navinfo"},Tianditu:{attribution:"Map Data "}}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +Ua().Control.Attribution.include({options:{position:"bottomright",prefix:yu.Prefix}}),Ua().Map.include({latLngToAccurateContainerPoint:function(e){var t=this.project(Ua().latLng(e))._subtract(this.getPixelOrigin());return Ua().point(t).add(this._getMapPanePos())}}),function(e){e.map(e=>(e.defaultFunction=e.prototype.toGeoJSON,e.include({toGeoJSON:function(t){return e.defaultFunction.call(this,t||10)}}),e))}([Ua().Polyline,Ua().Polygon,Ua().Marker,Ua().CircleMarker,Ua().Circle,Ua().LayerGroup]); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var gu=Ua().Evented.extend({options:{url:null,proxy:null,withCredentials:!1,crossOrigin:null},initialize:function(e,t){e&&(e=e.indexOf("/")!==e.length-1?e:e.substr(0,e.length-1)),this.url=e,Ua().setOptions(this,t),this.fire("initialized",this)},destroy:function(){this.fire("destroy",this)}}),vu=gu.extend({options:{projection:null},initialize:function(e,t){t=t||{},Ua().setOptions(this,t),t.projection&&(this.options.projection=t.projection),gu.prototype.initialize.call(this,e,t)},getMapInfo:function(e){var t=this;new Fi(t.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e},projection:t.options.projection}).processAsync()},getTilesets:function(e){var t=this;new Ir(t.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e}}).processAsync()}}),Su=Ua().Control.extend({options:{layer:null,position:"topleft",title:"switch tile version",tooltip:"top",collapsed:!0,nextText:"+",lastText:"-",ico:"V",orientation:"horizontal",switch:!0},onAdd:function(){"vertical"!==this.options.orientation&&(this.options.orientation="horizontal");var e=this._initLayout();return this.options.layer&&this.setLayer(this.options.layer),e},setContent:function(e){var t=Ua().Util.extend({},e);this.setVersionName(t.desc).setToolTip(t.desc)},setVersionName:function(e){var t=e;return e||(t=this.getValue()),this._sliderValue.innerHTML=t,this},setToolTip:function(e){return this.tooltip.innerHTML=e,this},updateLength:function(e){e>0&&(this.length=e,this.max=this.length-1,this.slider.setAttribute("max",this.max))},setLayer:function(e){e&&(this.options.layer=e);var t=this,s=t.options.layer;s.on("tilesetsinfoloaded",function(e){var s=e&&e.tileVersions;t.update(s)}),s.on("tileversionschanged",function(e){var s=e&&e.tileVersion;t.setContent(s)}),t.getTileSetsInfo()},update:function(e){this.tileVersions=e||[],this.updateLength(this.tileVersions.length)},getTileSetsInfo:function(){var e=this;e.options.layer&&new vu(e.options.layer._url).getTilesets(function(t){e.options.layer.setTileSetsInfo(t.result)})},removeLayer:function(){this.options.layer=null},nextTilesVersion:function(){return this.firstLoad?(this.options.layer.nextTilesVersion(),this.firstLoad=!1,this):parseInt(this.slider.value)>this.max-1?this:(this.slider.value=parseInt(this.slider.value)+1,this.options.layer.nextTilesVersion(),this)},lastTilesVersion:function(){return parseInt(this.slider.value)"+s+"",e}});Ua().Map.mergeOptions({logoControl:!0}),Ua().Map.addInitHook(function(){!this._logoAdded&&this.options.logoControl&&(!0===this.options.logoControl?this.logoControl=new bu:this.options.logoControl instanceof Ua().Control&&(this.logoControl=this.options.logoControl),this.logoControl&&(this.addControl(this.logoControl),this._logoAdded=!0))}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +const xu=function(e){return"[object Array]"==Object.prototype.toString.call(e)},_u={toSuperMapBounds:e=>(e&&-1!==["FeatureCollection","Feature"].indexOf(e.type)&&(e=Ua().geoJSON(e).getBounds()),e instanceof Ua().LatLngBounds?new re(e.getSouthWest().lng,e.getSouthWest().lat,e.getNorthEast().lng,e.getNorthEast().lat):e instanceof Ua().Bounds?new re(e.min.x,e.min.y,e.max.x,e.max.y):xu(e)?new re(e[0],e[1],e[2],e[3]):new re),isArray:xu,toProcessingParam(e){var t={};if(e.length<1)t="";else{for(var s=[],i=0;i-1?s:Math.log(e/(1/this.resolutions[0]))/Math.LN2},distance:function(e,t){var s=t.lng-e.lng,i=t.lat-e.lat;return Math.sqrt(s*s+i*i)},infinite:!1}),Iu=function(e){return new Nu(e)},Fu=function(e){return e?(new Oe).toGeoJSON(e):e},Du=function(e){if(!e)return e;var t,s=new Oe;if(-1!=["FeatureCollection","Feature","Geometry"].indexOf(e.type))t=s.read(e,e.type);else if("function"==typeof e.toGeoJSON){var i=e.toGeoJSON();t=i?s.read(i,i.type):e}var r=t||e;return Ua().Util.isArray(t)&&(1===t.length?r=t[0]:t.length>1&&(r=[],t.map(function(e){return r.push(e.geometry),e}))),r&&r.geometry?r.geometry:r},Ru=function(e){var t;if(e===l.METER)t=1;else if(e===l.DEGREE)t=2*Math.PI*6378137/360;else if(e===l.KILOMETER)t=.001;else if(e===l.INCH)t=1/.025399999918;else{if(e!==l.FOOT)return t;t=.3048}return t},ku=function(e,t,s){var i=e*t*(1/.0254)*Ru(s);return i=1/i},Bu=function(e,t,s){var i=e*t*(1/.0254)*Ru(s);return i=1/i},Gu=function(e){return e>1?1/e:e},Uu=function(e,t,s,i){return i=i||6378137,s=s||"",e>0&&t>0?(e=Gu(e),"degree"===s.toLowerCase()||"degrees"===s.toLowerCase()||"dd"===s.toLowerCase()?254/t/e/(2*Math.PI*i/360)/1e4:254/t/e/1e4):-1},ju=function(e,t=Ua().CRS.EPSG4326,s){let i=null,r=null;if(-1===["FeatureCollection","Feature","Geometry"].indexOf(e.type))if(e.toGeoJSON)e=e.toGeoJSON();else if(e instanceof Ua().LatLngBounds)e=Ua().rectangle(e).toGeoJSON();else{if(!(e instanceof Ua().Bounds))throw new Error("This tool only supports data conversion in geojson format or Vector Layers of Leaflet.");e=Ua().rectangle([[e.getTopLeft().x,e.getTopLeft().y],[e.getBottomRight().x,e.getBottomRight().y]]).toGeoJSON()}const n={point:function(e){return r(e)},multipoint:function(e){return n.linestring.apply(this,[e])},linestring:function(e){let t=[],s=null;for(let i=0,r=e.length;i(this._map.options.maxZoom||18)||e<(this._map.options.minZoom||0))this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null);else{var s=this._getImageParams();s?this._requestImage(s,t):this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null)}}},_calculateBounds:function(){var e=this._map.getPixelBounds(),t=this._map.unproject(e.getBottomLeft()),s=this._map.unproject(e.getTopRight()),i=this._map.options.crs.project(s),r=this._map.options.crs.project(t);return Ua().bounds(i,r)},_compriseBounds:function(e){var t={leftBottom:{x:e.getBottomLeft().x,y:e.getTopRight().y},rightTop:{x:e.getTopRight().x,y:e.getBottomLeft().y}};return JSON.stringify(t)},_calculateImageSize:function(){var e=this._map,t=e.getPixelBounds(),s=e.getSize(),i=e.unproject(t.getBottomLeft()),r=e.unproject(t.getTopRight()),n=e.latLngToLayerPoint(r).y,a=e.latLngToLayerPoint(i).y;return(n>0||as.max.x)||!t.wrapLat&&(e.ys.max.y))return!1}if(!this.options.bounds)return!0;const s=this._tileCoordsToBounds(e);return Ua().latLngBounds(this.options.bounds).overlaps(s)}}),Xu=Ua().TileLayer.extend({options:{layersID:null,redirect:!1,transparent:!0,cacheEnabled:!0,clipRegionEnabled:!1,clipRegion:null,prjCoordSys:null,overlapDisplayed:!1,overlapDisplayedOptions:null,tileversion:null,crs:null,format:"png",tileProxy:null,attribution:yu.Common.attribution,subdomains:null},initialize:function(e,t){this._url=e,Ua().TileLayer.prototype.initialize.apply(this,arguments),Ua().setOptions(this,t),Ua().stamp(this),this.tileSetsIndex=-1,this.tempIndex=-1},onAdd:function(e){this._crs=this.options.crs||e.options.crs,Ua().TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e){var t=this.getScaleFromCoords(e),s=this._getLayerUrl()+"&scale="+t+"&x="+e.x+"&y="+e.y;return this.options.tileProxy&&(s=this.options.tileProxy+encodeURIComponent(s)),this.options.cacheEnabled||(s+="&_t="+(new Date).getTime()),this.options.subdomains&&(s=Ua().Util.template(s,{s:this._getSubdomain(e)})),s},getScale:function(e){var t=e||this._map.getZoom();return this.scales[t]},getScaleFromCoords:function(e){var t,s=this;return s.scales&&s.scales[e.z]?s.scales[e.z]:(s.scales=s.scales||{},t=s.getDefaultScale(e),s.scales[e.z]=t,t)},getDefaultScale:function(e){var t=this._crs;if(t.scales)return t.scales[e.z];var s=this._tileCoordsToBounds(e),i=t.project(s.getNorthEast()),r=t.project(s.getSouthWest()),n=this.options.tileSize,a=Math.max(Math.abs(i.x-r.x)/n,Math.abs(i.y-r.y)/n),o=l.METER;if(t.code){var h=t.code.split(":");if(h&&h.length>1){var u=parseInt(h[1]);o=u&&u>=4e3&&u<=5e3?l.DEGREE:l.METER}}return ku(a,96,o)},setTileSetsInfo:function(e){this.tileSets=e,Ua().Util.isArray(this.tileSets)&&(this.tileSets=this.tileSets[0]),this.tileSets&&(this.fire("tilesetsinfoloaded",{tileVersions:this.tileSets.tileVersions}),this.changeTilesVersion())},lastTilesVersion:function(){this.tempIndex=this.tileSetsIndex-1,this.changeTilesVersion()},nextTilesVersion:function(){this.tempIndex=this.tileSetsIndex+1,this.changeTilesVersion()},changeTilesVersion:function(){var e=this;if(null!=e.tileSets&&!(e.tempIndex===e.tileSetsIndex||this.tempIndex<0)){var t=e.tileSets.tileVersions;if(t&&e.tempIndex=0){var s=t[e.tempIndex].name;e.mergeTileVersionParam(s)&&(e.tileSetsIndex=e.tempIndex,e.fire("tileversionschanged",{tileVersion:t[e.tempIndex]}))}}},updateCurrentTileSetsIndex:function(e){this.tempIndex=e},mergeTileVersionParam:function(e){return!!e&&(this.requestParams.tileversion=e,this._paramsChanged=!0,this.redraw(),this._paramsChanged=!1,!0)},_getLayerUrl:function(){return this._paramsChanged&&(this._layerUrl=this._createLayerUrl()),this._layerUrl||this._createLayerUrl()},_createLayerUrl:function(){let e=ee.urlPathAppend(this._url,`tileImage.${this.options.format}`);return this.requestParams=this.requestParams||this._getAllRequestParams(),e=ee.urlAppend(e,Ga.Util.getParamString(this.requestParams)),e=je.appendCredential(e),this._layerUrl=e,e},_getAllRequestParams:function(){var e=this.options||{},t={},s=this.options.tileSize;s instanceof Ua().Point||(s=Ua().point(s,s)),t.width=s.x,t.height=s.y,t.redirect=!0===e.redirect,t.transparent=!0===e.transparent,t.cacheEnabled=!(!1===e.cacheEnabled),e.prjCoordSys&&(t.prjCoordSys=JSON.stringify(e.prjCoordSys)),e.layersID&&(t.layersID=e.layersID.toString()),e.clipRegionEnabled&&e.clipRegion&&(e.clipRegion=Le.fromGeometry(Du(e.clipRegion)),t.clipRegionEnabled=e.clipRegionEnabled,t.clipRegion=JSON.stringify(e.clipRegion));var i=this._crs;if(i.options&&i.options.origin)t.origin=JSON.stringify({x:i.options.origin[0],y:i.options.origin[1]});else if(i.projection&&i.projection.bounds){var r=i.projection.bounds,n=Ua().point(r.min.x,r.max.y);t.origin=JSON.stringify({x:n.x,y:n.y})}return!1===e.overlapDisplayed?(t.overlapDisplayed=!1,e.overlapDisplayedOptions&&(t.overlapDisplayedOptions=this.overlapDisplayedOptions.toString())):t.overlapDisplayed=!0,!0===t.cacheEnabled&&e.tileversion&&(t.tileversion=e.tileversion.toString()),e.rasterfunction&&(t.rasterfunction=JSON.stringify(e.rasterfunction)),t}}),Ku=function(e,t){return new Xu(e,t)},Zu=s(545),$u=s.n(Zu),ec={TEXT:{fontSize:"14px",fontFamily:"Arial Unicode MS Regular,Microsoft YaHei",textAlign:"left",color:"rgba(255,255,255,0)",fillColor:"rgba(80,80,80,1)",weight:1,globalAlpha:1},POINT:{fillColor:"#ffcc00",color:"#cc3333",weight:1,radius:3,opacity:1},LINE:{color:"rgba(0,0,0,0)",weight:1,lineCap:"butt",lineJoin:"round",dashOffset:0,dashArray:[],opacity:1},REGION:{color:"rgba(0,0,0,0)",fillColor:"rgba(0,0,0,0)",weight:1,lineCap:"butt",lineJoin:"round",dashOffset:0,opacity:1,fillOpacity:1,dashArray:[]}},tc={TEXT:{"text-size":"fontSize","text-face-name":"fontFamily","text-align":"textAlign","text-name":"textName","text-weight":"fontWeight","text-halo-color":"color","text-fill":"fillColor","text-comp-op":"globalCompositeOperation"},POINT:{"point-file":"iconUrl","point-fill":"fillColor","point-radius":"radius","point-halo-color":"color","point-comp-op":"globalCompositeOperation"},LINE:{"line-color":"color","line-width":"weight","line-cap":"lineCap","line-join":"lineJoin","line-dash-offset":"dashOffset","line-opacity":"opacity","line-dasharray":"dashArray","line-comp-op":"globalCompositeOperation"},REGION:{"line-color":"color","line-width":"weight","line-cap":"lineCap","line-join":"lineJoin","line-dash-offset":"dashOffset","line-opacity":"opacity","line-dasharray":"dashArray","polygon-fill":"fillColor","polygon-opacity":"fillOpacity","polygon-comp-op":"globalCompositeOperation"}},sc={lineWidth:{leafletStyle:"weight",type:"number",unit:"mm",defaultValue:.1},fillForeColor:{leafletStyle:"fillColor",type:"color",defaultValue:"rgba(0,0,0,0)"},foreColor:{leafletStyle:"color",type:"color",defaultValue:"rgba(0,0,0,0)"},markerSize:{leafletStyle:"markerSize",type:"number",unit:"mm",defaultValue:2.4},lineColor:{leafletStyle:"color",type:"color",defaultValue:"#000000"}},ic={clear:"",src:"",dst:"","src-over":"source-over","dst-over":"destination-over","src-in":"source-in","dst-in":"destination-in","src-out":"source-out","dst-out":"destination-out","src-atop":"source-atop","dst-atop":"destination-atop",xor:"xor",plus:"lighter",minus:"",multiply:"",screen:"",overlay:"",darken:"",lighten:"lighter","color-dodge":"","color-burn":"","hard-light":"","soft-light":"",difference:"",exclusion:"",contrast:"",invert:"","invert-rgb":"","grain-merge":"","grain-extract":"",hue:"",saturation:"",color:"",value:""}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class rc{constructor(e){this.cartoCSS=null,this.mapUrl=e}pretreatedCartoCSS(e,t){t&&(e=this.processCharacters(e)),this.cartoCSS=this.cartoCSS||{};var s=new En(e).getShaders();if(s)for(var i=0;i-1;t--)if(e.indexOf(n[t])>-1){r=e.replace(n[t],s[n[t]]);break}r=r.replace(/[#]/gi,"#"),s[e]=i,t=t.replace(new RegExp(r,"g"),i)}),t=(t=t.replace(/[#]/gi,"\n#")).replace(/\[zoom/gi,"[scale")}}pickShader(e){if(!this.cartoCSS)return null;var t=e.replace(/[@#\s]/gi,"___");return this.cartoCSS[t]}getDefaultStyle(e){var t={},s=ec[e];for(var i in s){var r=s[i];t[i]=r}return t}getStyleFromiPortalMarker(e){return 0==e.indexOf("./")?null:(0==e.indexOf("http://support.supermap.com.cn:8092/static/portal")&&(e=e.replace("http://support.supermap.com.cn:8092/static/portal","http://support.supermap.com.cn:8092/apps/viewer/static")),Ua().icon({iconUrl:e,iconSize:Ua().point(48,43),iconAnchor:Ua().point(24,43),popupAnchor:Ua().point(0,-43)}))}getStyleFromiPortalStyle(e,t,s){var i=s?JSON.parse(s):null,r={};if("Point"===t||"MultiPoint"===t){var n=i||e.pointStyle;return n.externalGraphic?0==n.externalGraphic.indexOf("./")?null:(0==n.externalGraphic.indexOf("http://support.supermap.com.cn:8092/static/portal")&&(n.externalGraphic=n.externalGraphic.replace("http://support.supermap.com.cn:8092/static/portal","http://support.supermap.com.cn:8092/apps/viewer/static")),Ua().icon({iconUrl:n.externalGraphic,iconSize:Ua().point(n.graphicWidth,n.graphicHeight),iconAnchor:Ua().point(-n.graphicXOffset,-n.graphicYOffset),popupAnchor:Ua().point(0,-n.graphicHeight)})):(r.radius=n.pointRadius,r.color=n.strokeColor,r.opacity=n.strokeOpacity,r.lineCap=n.strokeLineCap,r.weight=n.strokeWidth,r.fillColor=n.fillColor,r.fillOpacity=n.fillOpacity,r.dashArray=this.dashStyle(n,1),r)}if("LineString"===t||"MultiLineString"===t||"Box"===t){var a=i||e.lineStyle;return r.color=a.strokeColor,r.opacity=a.strokeOpacity,r.fillOpacity=a.fillOpacity,r.lineCap=a.strokeLineCap,r.weight=a.strokeWidth,r.dashArray=this.dashStyle(a,1),r}if("Polygon"===t||"MultiPolygon"===t){var o=i||e.polygonStyle;return r.color=o.strokeColor,r.opacity=o.strokeOpacity,r.lineCap=o.strokeLineCap,r.weight=o.strokeWidth,r.fillColor=o.fillColor,r.fillOpacity=o.fillOpacity,r.dashArray=this.dashStyle(o,1),r}}dashStyle(e,t){if(!e)return[];var s=e.strokeWidth*t,i=e.strokeDashstyle;switch(i){case"solid":return[];case"dot":return[1,4*s];case"dash":return[4*s,4*s];case"dashdot":return[4*s,4*s,1,4*s];case"longdash":return[8*s,4*s];case"longdashdot":return[8*s,4*s,1,4*s];default:return i?ee.isArray(i)?i:(i=q.trim(i).replace(/\s+/g,",")).replace(/\[|\]/gi,"").split(","):[]}}getValidStyleFromCarto(e,t,s,i,r){if(!s)return null;var n=i.type,a=i.properties.attributes||{},o=this.getDefaultStyle(n);r=void 0===r||r,a.FEATUREID=i.properties.id,a.SCALE=t;for(var l,h,u=tc[n],c=0,p=s.length;c7?0:r.fillSymbolID,u=r.lineSymbolID>5?0:r.lineSymbolID;for(var c in r){var p=sc[c];if(p){var d=p.leafletStyle;switch(p.type){case"number":{let e=r[c];p.unit&&(e=e*$*te[p.unit]*2.5),i[d]=e;break}case"color":{var f=r[c];let e,t=1;if("fillColor"===d)0!==h&&1!==h||(t=1-h,e="rgba("+f.red+","+f.green+","+f.blue+","+t+")");else if("color"===d){if(0===u||5===u)t=0===u?1:0;else{var m=[1,0];switch(u){case 1:m=[9.7,3.7];break;case 2:m=[3.7,3.7];break;case 3:m=[9.7,3.7,2.3,3.7];break;case 4:m=[9.7,3.7,2.3,3.7,2.3,3.7]}i.lineDasharray=m}e="rgba("+f.red+","+f.green+","+f.blue+","+t+")"}i[d]=e;break}}}}return t.textField&&(i.textAlign="LEFT"),i}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var nc=Ua().Class.extend({initialize:function(e){var t=(e=e||{}).latLng||e._latLng;this._latLng=Ua().latLng(t.lat,t.lng),this._style=e.style||e._canvas,this.attributes=e.attributes,this.id=e.id?e.id:null},getId(){return this.id},setId(e){this.id=e},setLatLng:function(e){this._latLng=e},setCanvas:function(e){this._style=e},setAttributes:function(e){this.attributes=e},getLatLng:function(){return this._latLng},getCanvas:function(){return this._style},getAttributes:function(){return this.attributes},setStyle:function(e){this._style=e},getStyle:function(){return this._style}}),ac=Ua().Class.extend({initialize:function(e,t){this.geometry=e,this.attributes=t},toFeature:function(){let e=this.geometry;if(e.toGeoJSON){const t=e.toGeoJSON();return t.properties=this.attributes,(new Oe).read(t)[0]}if(3===e.length)e=new ue(e[1],e[0],e[2]);else if(2===e.length)e=new le(e[0],e[1]);else if(e instanceof Ua().LatLng)e=new le(e.lng,e.lat);else if(e instanceof Ua().Point)e=new le(e.x,e.y);else if(e instanceof Ua().CircleMarker){var t=e.getLatLng();e=new le(t.lng,t.lat)}return new _e(e,this.attributes)},reverseLatLngs:function(e){Ua().Util.isArray(e)||(e=[e]);for(var t=0;t0&&t._reset(),t.addTFEvents(),t.mouseMoveHandler=function(e){var s=e.layerPoint;t.currentMousePosition=Ua().point(s.x+t.movingOffset[0],s.y+t.movingOffset[1])},e.on("mousemove",t.mouseMoveHandler),t.update(e.getBounds())}else e.removeLayer(t)},addFeatures:function(e){},redrawThematicFeatures:function(e){},destroyFeatures:function(e){if(void 0===e&&(e=this.features),e){this.removeFeatures(e);for(var t=e.length-1;t>=0;t--)e[t].destroy()}},removeFeatures:function(e){var t=this;if(e&&0!==e.length){if(e===t.features)return t.removeAllFeatures();Ua().Util.isArray(e)||(e=[e]);for(var s=[],i=e.length-1;i>=0;i--){var r=e[i],n=Ua().Util.indexOf(t.features,r);-1!==n?t.features.splice(n,1):s.push(r)}for(var a=[],o=0,l=t.features.length;oh)){var y=o[0];o.splice(0,1),delete a[y]}}}}if(t.renderer.render(),i&&t.options.isHoverAble&&t.options.isMultiHover){var g=this.getShapesByFeatureID(i);this.renderer.updateHoverShapes(g)}},createThematicFeature:function(e){var t=this,s=t.getStyleByData(e);e.style&&t.isAllowFeatureStyle&&(s=ee.copyAttributesWithClip(e.style));var i={};i.nodesClipPixel=t.options.nodesClipPixel,i.isHoverAble=t.options.isHoverAble,i.isMultiHover=t.options.isMultiHover,i.isClickAble=t.options.isClickAble,i.highlightStyle=ta.transformStyle(t.highlightStyle);for(var r=new na(e,t,ta.transformStyle(s),i),n=0;n0;if(t.themeField&&o&&s.attributes){var l=t.themeField,h=s.attributes;for(var u in h)if(l===u){n=!0,a=h[u];break}}if(n)for(var c=0,p=r.length;c0;if(t.themeField&&o&&s.attributes){var l=t.themeField,h=s.attributes;for(var u in h)if(l===u){n=!0,a=h[u];break}}if(n)for(var c=0,p=r.length;c=r[c].start&&a<=r[c].end:a>=r[c].start&&a0&&0==this.labelFeatures.length)for(var t=this.setLabelsStyle(this.features),s=0,i=t.length;s=0&&d.x<=h.x&&d.y>=0&&d.y<=h.y){if(s.style.minZoomLevel>-1&&u<=s.style.minZoomLevel)continue;if(s.style.maxZoomLevel>-1&&u>s.style.maxZoomLevel)continue;var f=null;s.isStyleChange?(s.isStyleChange=null,f=this.calculateLabelBounds(s,d)):f=s.geometry.bsInfo.w&&s.geometry.bsInfo.h?this.calculateLabelBounds2(s,d):this.calculateLabelBounds(s,d);var m=new re(0,h.y,h.x,0),y=f.length;if(this.options.isAvoid){var g=this.getAvoidInfo(m,f);if(g){if("left"===g.aspectW){s.style.labelXOffset+=g.offsetX;for(let e=0;e=r[l].start&&a=r[l].start&&ao&&(o=s,l="top")}if(t.y>e.bottom){let s=Math.abs(t.y-e.bottom);s>o&&(o=s,l="bottom")}if(t.xa&&(a=s,h="left")}if(t.x>e.right){let s=Math.abs(t.x-e.right);s>a&&(a=s,h="right")}}}},isQuadrilateralOverLap:function(e,t){var s=e.length,i=t.length;if(5!==s||5!==i)return null;var r=!1;for(let i=0;i=0&&e.options.fontOpacity<1&&(s.globalAlpha=e.options.fontOpacity),s.fillText){s.font=i,s.textAlign=e.options.textAlign,s.textBaseline=e.options.textBaseline;let r=e.options.vfactor,o=s.measureText("Mg").height||s.measureText("xx").width;t.y+=o*r*(a-1);for(let i=0;i0;){var r=t.pop(),n=r.type,a=r.layerType=r.layerType||"BASE_LAYER";"OVERLAY_LAYER"!==a&&(n=a),this.createLayer(n,r)}this.fire("maploaded",{map:this._map})}},createCRS:function(e,t,s,i,r){return e<0?new Nu({bounds:r,origin:i,resolutions:s}):910112===e||910102===e?Cu:(910111===e&&(e=3857),910101===e&&(e=4326),mu("EPSG:"+e,{origin:i,resolutions:s,bounds:r}))},createMap:function(e){var t=e.crs||Ua().CRS.EPSG3857,s=Ua().latLngBounds(t.unproject(e.bounds.min),t.unproject(e.bounds.max));this._map=Ua().map(this.options.map,{center:s.getCenter(),maxZoom:e.maxZoom||22,minZoom:e.minZoom||0,zoom:e.zoom||0,crs:t,renderer:Ua().canvas()}),t instanceof Nu?this._map.setZoom(e.zoom?e.zoom+2:2,{maxZoom:e.maxZoom||22}):this._map.fitBounds(s,{maxZoom:e.maxZoom||22})},getResolutionsFromScales:function(e,t,s,i){for(var r=[],n=0;n{var t=Ua().geoJSON(e.result,{pointToLayer:function(e,t){var s=new(Ua().Marker)(t);return s.setStyle=function(e){e&&s.setIcon(e)},s},coordsToLatLng:a,style:function(e){return this.cartoCSSToLeaflet.getStyleFromiPortalStyle(i||{},e.geometry.type,e.properties.style)},opacity:r});this.options.featureLayerPopupEnable&&t.bindPopup(n.options.featureLayerPopup||n.defaultFeatureLayerPopup),this.addLayer(t)})}},getFeaturesBySQL:function(e,t,s,i,r,n){var a=new Js({queryParameter:{name:s+"@"+t,attributeFilter:i=i||"SMID > 0"},datasetNames:[t+":"+s],fromIndex:0,toIndex:1e5});dc(e).getFeaturesBySQL(a,n,r)},createThemeLayer:function(e){var t,s=e.themeSettings&&JSON.parse(e.themeSettings),i=s.type;if(e.themeSettings=s,(t="HEAT"===i?this.createHeatLayer(e,s):"UNIQUE"===i?this.createUniqueLayer(e,s):"RANGE"===i?this.createRangeLayer(e,s):this.createBaseThemeLayer(e,s))&&(this.addFeature2ThemeLayer(e,t),t.on("add",e=>{this.registerThemeEvent(e.target)})),s&&s.labelField){var r=this.createLabelLayer(e,s);r.on("add",e=>{this.registerThemeEvent(e.target)}),t.labelLayer=r}return t},createBaseThemeLayer:function(e,t){let s=e.style,i=e.opacity,r=t.vectorType,n=s.pointStyle;n.fill="LINE"!==r;var a={};a.radius=n.pointRadius,a.color=n.strokeColor,a.opacity=n.strokeOpacity,a.lineCap=n.strokeLineCap,a.weight=n.strokeWidth,a.fillColor=n.fillColor,a.fillOpacity=n.fillOpacity;var o=(e,t)=>Ua().circleMarker(t,a);return n.unicode&&(o=((e,t)=>new fc(t,n))),Ua().geoJSON({type:"GeometryCollection",geometries:[]},{pointToLayer:o,opacity:i})},createUniqueLayer:function(e,t){for(var s=e.title,i=t.field,r=[],n=t.settings,a=e.isVisible,o=e.opacity,l=t.vectorType,h=0;h0?{fillColor:"#ffffff"}:n[0].style;var o=Ua().Util.extend(new On,s);o.fontWeight="bold",o.fontSize="14px",o.labelRect=!0,o.strokeColor=o.fillColor,o.fontColor=t.labelColor,t.labelFont&&(o.fontFamily=t.labelFont);var l=new cc(i,{visibility:a,opacity:.7});return this.registerThemeEvent(l),l.style=o,l.themeField=r,l.styleGroups=[],l},createHeatLayer:function(e,t){let s,i=t.colors||["blue","cyan","lime","yellow","red"],r={};for(let e=0,t=i.length,s=1;e0&&n.push(r[o]);else for(var h=0,u=(r=i.parseFeatureFromJson(t.content)).length;h0&&n.push(r[h]);var c=e.prjCoordSys&&e.prjCoordSys.epsgCode;a?i.changeFeatureLayerEpsgCode(c,"4326",s,n,function(e){E(e)}):E(n)},function(){});else{for(var g=[],v=e.features,S=0,b=v.length;S0){var _=x.geometry.points[0].x,C=x.geometry.points[0].y,w=new le(_,C),M=new _e(w,x.attributes,x.style);g.push(M)}}E(g)}}else if(r){var A=e.datasourceName;u=(h=(l=e.subLayers&&JSON.parse(e.subLayers)).length&&l.length>0?l[0]:l)&&h.name,this.getFeaturesBySQL(e.url,A,u,d.filter,t.ISERVER,t=>{var i,r,n=t.result,o=[];if(n&&n.features){for(var l=0,h=(i=n.features).length;l0?l[0]:l)&&h.name;var T=e.prjCoordSys&&e.prjCoordSys.epsgCode;this.getFeaturesBySQL(c,p,u,f,t.ISERVER,function(e){a?i.changeFeatureLayerEpsgCode(T,"4326",s,e,function(e){E(e)}):E(e)})}}function E(t){if(s&&s.labelLayer instanceof cc&&i.addFeature2LabelLayer(s.labelLayer,t,e),Ua().HeatLayer&&s instanceof Ua().HeatLayer){var r=[];for(let e=0,i=t.length;e0){for(n=0,a=i.length;ne.json()).then(e=>{var i=e;t||void 0===t.length||(i=i[0]),this.fire("coordconvertsuccess",{newCoors:i}),s.call(this,i)}).catch(e=>{this.actived&&this.fire("coordconvertfailed",{err:e})})},getSQLFromFilter:function(e){return e?" * where ("+(e=e.replace(/=/g,"==").replace(/and|AND/g,"&&").replace(/or|OR/g,"||").replace(/>==/g,">=").replace(/<==/g,"<="))+")":" * where (1==1||1>=0)"},getAttributesObjFromTable:function(e,t){if(0!==e.length&&0!==t.length){for(var s=[],i=0;ie.json()).then(e=>{t&&t(e)}).catch(e=>s&&s(e))},getCartoCSS2Obj:function(e){var t,s=!1;return e.indexOf("}")>-1?(s=(e=JSON.parse(e)).needTransform,t=e.isAddFile):"needTransform"===e?(s=!0,t=!1):t="true"===e,{isAddFile:t,needTransform:s}},registerThemeEvent:function(e){e.on("click",t=>{if(!e.map)return;let s;this.selectedFeature&&(this.fire("featureunselected",{feature:this.selectedFeature}),this.selectedFeature=null),t.target&&t.target.refDataID&&(s=e.getFeatureById(t.target.refDataID)),s&&(this.selectedFeature=s,this.fire("featureselected",{feature:s}))}),e.on("mousemove",t=>{if(e.map&&t.target&&t.target.refDataID){let s;t.target&&t.target.refDataID&&(s=e.getFeatureById(t.target.refDataID)),s&&this.fire("featuremousemove",{feature:s})}})},SERVER_TYPE_MAP:{"EPSG:4326":"WGS84","EPSG:3857":"MERCATOR","EPSG:900913":"MERCATOR","EPSG:102113":"MERCATOR","EPSG:910101":"GCJ02","EPSG:910111":"GCJ02MERCATOR","EPSG:910102":"BD","EPSG:910112":"BDMERCATOR"}}),yc=Ua().TileLayer.extend({options:{collectionId:null,sqlFilter:null,ids:null,names:null,renderingRule:null,format:"png",zoomOffset:1,transparent:!0,cacheEnabled:!0,tileProxy:null,attribution:yu.Common.attribution,subdomains:null},initialize:function(e,t){this._url=e,Ua().TileLayer.prototype.initialize.apply(this,arguments),Ua().setOptions(this,t),Ua().stamp(this)},onAdd:function(e){Ua().TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e){var t=this._getLayerUrl()+"&z="+this._getZoomForUrl()+"&x="+e.x+"&y="+e.y;return this.options.tileProxy&&(t=this.options.tileProxy+encodeURIComponent(t)),this.options.cacheEnabled||(t+="&_t="+(new Date).getTime()),this.options.subdomains&&(t=Ua().Util.template(t,{s:this._getSubdomain(e)})),t},_getLayerUrl:function(){return this._layerUrl||this._createLayerUrl()},_createLayerUrl:function(){let e=ee.urlPathAppend(this._url,`/collections/${this.options.collectionId}/tile.${this.options.format}`);return this.requestParams=this.requestParams||this._getAllRequestParams(),e=ee.urlAppend(e,Ga.Util.getParamString(this.requestParams)),e=je.appendCredential(e),this._layerUrl=e,e},_getAllRequestParams:function(){var e=this.options||{},t={};return t.transparent=!0===e.transparent,t.cacheEnabled=!(!1===e.cacheEnabled),e.sqlFilter&&(t.sqlFilter=e.sqlFilter),e.renderingRule&&(t.renderingRule=JSON.stringify(e.renderingRule)),e.ids&&(t.ids=e.ids.join(",")),e.names&&(t.names=e.names.join(",")),t}}),gc=gu.extend({options:{geometry:null,prjCoordSys:null,excludeField:null},initialize:function(e,t){t=t||{},Ua().setOptions(this,t),t.projection&&(this.options.prjCoordSys=t.projection),gu.prototype.initialize.call(this,e,t),this.dataFlow=new kt(e,t),this.dataFlow.events.on({broadcastSocketConnected:this._defaultEvent,broadcastSocketError:this._defaultEvent,broadcastFailed:this._defaultEvent,broadcastSucceeded:this._defaultEvent,subscribeSocketConnected:this._defaultEvent,subscribeSocketError:this._defaultEvent,messageSucceeded:this._defaultEvent,setFilterParamSucceeded:this._defaultEvent,scope:this})},initBroadcast:function(){return this.dataFlow.initBroadcast(),this},broadcast:function(e){this.dataFlow.broadcast(e)},initSubscribe:function(){return this.dataFlow.initSubscribe(),this},setExcludeField:function(e){return this.dataFlow.setExcludeField(e),this.options.excludeField=e,this},setGeometry:function(e){return this.dataFlow.setGeometry(e),this.options.geometry=e,this},unSubscribe:function(){this.dataFlow.unSubscribe()},unBroadcast:function(){this.dataFlow.unBroadcast()},_defaultEvent:function(e){this.fire(e.eventType||e.type,e)}});const vc=function(){try{return mapv}catch(e){return{}}}(); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Sc=vc.baiduMapLayer?vc.baiduMapLayer.__proto__:Function; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var bc=Ua().Layer.extend({options:{attributionPrefix:null,attribution:yu.MapV.attribution},initialize:function(e,t,s){s=s||{},this.dataSet=e||{},this.mapVOptions=t||{},this.render=this.render.bind(this),Ua().Util.setOptions(this,s),this.options.attributionPrefix&&(this.options.attribution=this.options.attributionPrefix+this.options.attribution),this.canvas=this._createCanvas(),Ua().stamp(this)},onAdd:function(e){this._map=e;var t=this.getPane(),s=this.container=Ua().DomUtil.create("div","leaflet-layer leaflet-zoom-animated",t);s.appendChild(this.canvas);var i=e.getSize();s.style.width=i.x+"px",s.style.height=i.y+"px",this.renderer=new class extends Sc{constructor(e,t,s,i){super(e,s,i),Sc&&(i=i||{},this.init(i),this.argCheck(i),this.canvasLayer=t,this.clickEvent=this.clickEvent.bind(this),this.mousemoveEvent=this.mousemoveEvent.bind(this),this._moveStartEvent=this.moveStartEvent.bind(this),this._moveEndEvent=this.moveEndEvent.bind(this),this._zoomStartEvent=this.zoomStartEvent.bind(this),this.bindEvent())}clickEvent(e){var t=this.map.containerPointToLayerPoint([0,0]),s=this.devicePixelRatio=this.canvasLayer.devicePixelRatio=window.devicePixelRatio||1,i=e.layerPoint;super.clickEvent(Ua().point((i.x-t.x)/s,(i.y-t.y)/s),e)}mousemoveEvent(e){var t=e.layerPoint;super.mousemoveEvent(t,e)}bindEvent(){var e=this.map;this.options.methods&&(this.options.methods.click&&e.on("click",this.clickEvent),this.options.methods.mousemove&&e.on("mousemove",this.mousemoveEvent)),this.map.on("movestart",this._moveStartEvent),this.map.on("moveend",this._moveEndEvent),this.map.on("zoomstart",this._zoomStartEvent)}destroy(){this.unbindEvent(),this.clearData(),this.animator&&this.animator.stop(),this.animator=null,this.canvasLayer=null}unbindEvent(){var e=this.map;this.options.methods&&(this.options.methods.click&&e.off("click",this.clickEvent),this.options.methods.mousemove&&e.off("mousemove",this.mousemoveEvent)),this.map.off("movestart",this._moveStartEvent),this.map.off("moveend",this._moveEndEvent),this.map.off("zoomstart",this._zoomStartEvent)}getContext(){return this.canvasLayer.getCanvas().getContext(this.context)}addData(e,t){var s=e;e&&e.get&&(s=e.get()),this.dataSet.add(s),this.update({options:t})}update(e){var t=e||{},s=t.data;s&&s.get&&(s=s.get()),void 0!=s&&this.dataSet.set(s),super.update({options:t.options})}getData(){return this.dataSet}removeData(e){if(this.dataSet){var t=this.dataSet.get({filter:function(t){return null==e||"function"!=typeof e||!e(t)}});this.dataSet.set(t),this.update({options:null})}}clearData(){this.dataSet&&this.dataSet.clear(),this.update({options:null})}_canvasUpdate(e){if(this.canvasLayer){var t=this,s=t.options.animation,i=this.getContext(),r=this.map;if(t.isEnabledTime()){if(void 0===e)return void this.clear(i);"2d"===this.context&&(i.save(),i.globalCompositeOperation="destination-out",i.fillStyle="rgba(0, 0, 0, .1)",i.fillRect(0,0,i.canvas.width,i.canvas.height),i.restore())}else this.clear(i);if("2d"===this.context)for(var n in t.options)i[n]=t.options[n];else i.clear(i.COLOR_BUFFER_BIT);if(!(t.options.minZoom&&r.getZoom()t.options.maxZoom)){var a=r.getBounds(),o=a.getEast()-a.getWest(),l=a.getNorth()-a.getSouth(),h=r.getSize(),u=o/h.x,c=l/h.y,p=Ru("DEGREE")*u,d=this.canvasLayer.getTopLeft(),f=r.latLngToAccurateContainerPoint(d),m={transferCoordinate:function(e){var s,i={x:(s="2d"===t.context?r.latLngToAccurateContainerPoint(Ua().latLng(e[1],e[0])):{x:(e[0]-d.lng)/u,y:(d.lat-e[1])/c}).x-f.x,y:s.y-f.y};return[i.x,i.y]}};void 0!==e&&(m.filter=function(t){var i=s.trails||10;return e&&t.time>e-i&&t.time{this.update({data:this.data,options:this.mapVOptions})})),i.icon=o,(n.options.iconSize||o.style.height)&&(this.mapVOptions.offset={x:0,y:-(n.options.iconSize[1]||o.style.height)/2}),this.options.deg&&(i.deg=this.options.deg,"function"==typeof i.deg&&this.idCache[t]&&this.data[this.idCache[t]]&&(i.deg=i.deg(e.featureResult,Ua().latLng(s.coordinates[1],s.coordinates[0]),this.data[this.idCache[t]])))}if(r instanceof Ua().CircleMarker){this.mapVOptions.draw="simple";const e=this._toMapvStyle(r);for(const t in e)e.hasOwnProperty(t)&&(i[t]=e[t])}}else if(this.options.style){const t=this._toMapvStyle(this.options.style(e.featureResult));for(const e in t)t.hasOwnProperty(e)&&(i[e]=t[e])}void 0==this.idCache[t]?(this.data.push(i),this.idCache[t]=this.data.length-1):this.data[this.idCache[t]]=i,new Date-this._last>200&&(this._last=new Date,this.update({data:this.data,options:this.mapVOptions}))},_toMapvStyle:function(e){const t={draw:"simple"};return t.strokeStyle=e.color,t.lineWidth=e.width,t.globalAlpha=e.fillOpacity||e.opacity,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.fillStyle=e.fillColor,t.size=e.radius,t}}),_c=Ua().GeoJSON.extend({initialize:function(e,t){(t=t||{}).style&&!t.pointToLayer&&(t.pointToLayer=function(e,s){return Ua().circleMarker(s,t.style())}),Ua().Util.setOptions(this,t),this._layers={},Ua().stamp(this),this.url=e,this.idCache={}},onMessageSuccessed:function(e){const t=e.featureResult,s=e.featureResult.properties[this.options.idField];let i=null;void 0!==s&&this.idCache[s]?(i=this.getLayer(this.idCache[s]),this._updateLayerData(i,t)):((i=Ua().GeoJSON.geometryToLayer(t,this.options)).feature=Ua().GeoJSON.asFeature(t),this.addLayer(i),void 0!==s&&(this.idCache[s]=this.getLayerId(i))),this.options.onEachFeature&&this.options.onEachFeature(t,i)},_updateLayerData:function(e,t){t.properties&&(e.feature.properties=t.properties);var s=[];switch(t.geometry.type){case"Point":s=Ua().GeoJSON.coordsToLatLng(t.geometry.coordinates),e.setLatLng(s);break;case"LineString":s=Ua().GeoJSON.coordsToLatLngs(t.geometry.coordinates,0),e.setLatLngs(s);break;case"MultiLineString":case"Polygon":s=Ua().GeoJSON.coordsToLatLngs(t.geometry.coordinates,1),e.setLatLngs(s);break;case"MultiPolygon":s=Ua().GeoJSON.coordsToLatLngs(t.geometry.coordinates,2),e.setLatLngs(s)}}}),Cc=Ua().LayerGroup.extend({options:{geometry:null,prjCoordSys:null,excludeField:null,idField:"id",render:"normal"},initialize:function(e,t){t=t||{},Ua().Util.setOptions(this,t),this.url=e,this._layers={},this.dataService=new gc(this.url,{geometry:this.options.geometry,prjCoordSys:this.options.prjCoordSys,excludeField:this.options.excludeField})},onAdd:function(e){this.dataService.initSubscribe(),this.dataService.on("subscribeSocketConnected",e=>this.fire("subscribesucceeded",e)),this.dataService.on("subscribeSocketError",e=>this.fire("subscribefailed",e)),this.dataService.on("messageSucceeded",e=>this._onMessageSuccessed(e)),this.dataService.on("setFilterParamSucceeded",e=>this.fire("setfilterparamsucceeded",e)),"mapv"===this.options.render?this.addLayer(new xc(this.url,this.options)):this.addLayer(new _c(this.url,this.options)),Ua().LayerGroup.prototype.onAdd.call(this,e)},onRemove:function(e){Ua().LayerGroup.prototype.onRemove.call(this,e),this.dataService&&this.dataService.unSubscribe()},setExcludeField:function(e){return this.dataService.setExcludeField(e),this.options.excludeField=e,this},setGeometry:function(e){return this.dataService.setGeometry(e),this.options.geometry=e,this},_onMessageSuccessed:function(e){this.getLayers().map(t=>(t.onMessageSuccessed&&(t.onMessageSuccessed(e),this.fire("dataupdated",{layer:t,data:e.featureResult})),t))}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +const wc=Ua().Layer.extend({includes:[],_echartsContainer:null,_map:null,_ec:null,_echartsOptions:null,options:{attribution:yu.ECharts.attribution,loadWhileAnimating:!1},initialize:function(e,t){Ua().Util.setOptions(this,t),this.setOption(e)},setOption:function(e,t,s){const i=e.baseOption||e;i.LeafletMap=i.LeafletMap||{roam:!0},i.animation=!0===i.animation,this._echartsOptions=e,this._ec&&this._ec.setOption(e,t,s)},getEcharts:function(){return this._ec},_disableEchartsContainer:function(){this._echartsContainer.style.visibility="hidden"},_enableEchartsContainer:function(){this._echartsContainer.style.visibility="visible"},onAdd:function(e){this._map=e,this._initEchartsContainer(),this._ec=xa().init(this._echartsContainer),this._ec.leafletMap=e;const t=this;e.on("zoomstart",function(){t._disableEchartsContainer()}),!t.options.loadWhileAnimating&&e.on("movestart",function(){t._disableEchartsContainer()}),xa().registerAction({type:"LeafletMapLayout",event:"LeafletMapLayout",update:"updateLayout"},function(e){}),xa().registerCoordinateSystem("leaflet",Mc),xa().extendComponentModel({type:"LeafletMap",getBMap:function(){return this.__LeafletMap},defaultOption:{roam:!1}}),xa().extendComponentView({type:"LeafletMap",render:function(e,s,i){let r=!0,n=s.scheduler.ecInstance.leafletMap;const a=i.getZr().painter.getViewportRoot(),o=n.options.zoomAnimation&&Ua().Browser.any3d;a.className=" leaflet-layer leaflet-zoom-"+(o?"animated":"hide")+" echarts-layer";const l=Ua().DomUtil.testProp(["transformOrigin","WebkitTransformOrigin","msTransformOrigin"]);a.style[l]="50% 50%";const h=e.coordinateSystem,u=i.getZr().painter.getLayers(),c=function(){if(r)return;const s=t._map.containerPointToLayerPoint([0,0]),n=[s.x||0,s.y||0];if(a.style.left=n[0]+"px",a.style.top=n[1]+"px",!t.options.loadWhileAnimating){for(let e in u)u.hasOwnProperty(e)&&u[e]&&(o=u[e].ctx)&&o.clearRect&&o.clearRect(0,0,o.canvas.width,o.canvas.height);t._enableEchartsContainer()}var o;h.setMapOffset(n),e.__mapOffset=n,i.dispatchAction({type:"LeafletMapLayout"})};function p(){r||(i.dispatchAction({type:"LeafletMapLayout"}),t._enableEchartsContainer())}t._oldMoveHandler&&n.off(t.options.loadWhileAnimating?"move":"moveend",t._oldMoveHandler),t._oldZoomEndHandler&&n.off("zoomend",t._oldZoomEndHandler),n.on(t.options.loadWhileAnimating?"move":"moveend",c),n.on("zoomend",p),t._oldMoveHandler=c,t._oldZoomEndHandler=p,r=!1}}),this._ec.setOption(this._echartsOptions)},onRemove:function(){this._ec.clear(),this._ec.dispose(),delete this._ec,Ua().DomUtil.remove(this._echartsContainer),this._oldZoomEndHandler&&(this._map.off("zoomend",this._oldZoomEndHandler),this._oldZoomEndHandler=null),this._oldMoveHandler&&(this._map.off(this.options.loadWhileAnimating?"move":"moveend",this._oldMoveHandler),this._oldMoveHandler=null),this._resizeHandler&&(this._map.off("resize",this._resizeHandler),this._resizeHandler=null),delete this._map},_initEchartsContainer:function(){const e=this._map.getSize(),t=document.createElement("div");t.style.position="absolute",t.style.height=e.y+"px",t.style.width=e.x+"px",t.style.zIndex=10,this._echartsContainer=t,this.getPane().appendChild(this._echartsContainer);const s=this;function i(e){let t=e.newSize;s._echartsContainer.style.width=t.x+"px",s._echartsContainer.style.height=t.y+"px",s._ec.resize()}this._map.on("resize",i),this._resizeHandler=i}});function Mc(e){this._LeafletMap=e,this.dimensions=["lng","lat"],this._mapOffset=[0,0]}Mc.prototype.dimensions=["lng","lat"],Mc.prototype.setMapOffset=function(e){this._mapOffset=e},Mc.prototype.getBMap=function(){return this._LeafletMap},Mc.prototype.prepareCustoms=function(){const e=xa().util,t=this.getViewRect();return{coordSys:{type:"leaflet",x:t.x,y:t.y,width:t.width,height:t.height},api:{coord:e.bind(this.dataToPoint,this),size:e.bind(function(t,s){return s=s||[0,0],e.map([0,1],function(e){const i=s[e],r=t[e]/2,n=[],a=[];return n[e]=i-r,a[e]=i+r,n[1-e]=a[1-e]=s[1-e],Math.abs(this.dataToPoint(n)[e]-this.dataToPoint(a)[e])},this)},this)}}},Mc.prototype.dataToPoint=function(e){null===e[1]&&(e[1]=Ua().CRS.EPSG3857.projection.MAX_LATITUDE);const t=this._LeafletMap.latLngToLayerPoint([e[1],e[0]]),s=this._mapOffset;return[t.x-s[0],t.y-s[1]]},Mc.prototype.fixLat=function(e){return e>=90?89.99999999999999:e<=-90?-89.99999999999999:e},Mc.prototype.pointToData=function(e){let t=this._mapOffset,s=this._LeafletMap.layerPointToLatLng([e[0]+t[0],e[1]+t[1]]);return[s.lng,s.lat]},Mc.prototype.getViewRect=function(){const e=this._LeafletMap.getSize();return new(xa().graphic.BoundingRect)(0,0,e.x,e.y)},Mc.prototype.getRoamTransform=function(){return xa().matrix.create()},Mc.dimensions=Mc.prototype.dimensions,Mc.create=function(e){let t,s=e.scheduler.ecInstance.leafletMap;e.eachComponent("LeafletMap",function(e){t||(t=new Mc(s)),e.coordinateSystem=t,e.coordinateSystem.setMapOffset(e.__mapOffset||[0,0])}),e.eachSeries(function(e){e.get("coordinateSystem")&&"leaflet"!==e.get("coordinateSystem")||(t||(t=new Mc(s)),e.coordinateSystem=t,e.animation=!0===e.animation)})};function Ac(e){var t=document.createElement("canvas");return t&&t.getContext(e)} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Tc=Ua().Class.extend({options:{radius:10,angele:60,spaceAngle:0,count:3,fill:!1,stroke:!0,color:"#3388ff",weight:1,lineCap:"round",lineJoin:"round",fillColor:"#66ccff",fillOpacity:.2,fillRule:"evenodd",opacity:1,strokeWidth:1},initialize:function(e){e=e||{},Ua().Util.setOptions(this,e),this._canvas=document.createElement("canvas"),this._canvas.width=2*(this.options.radius+this.options.weight),this._canvas.height=2*(this.options.radius+this.options.weight),this._ctx=this._canvas.getContext("2d");var t=void 0===this.options.strokeWidth?1:this.options.strokeWidth;this.options.width=2*(this.options.radius+t)+1,this._initStyle()},getStyle:function(){return this._canvas},drawSector:function(e,t,s,i,r,n){r=r/180*Math.PI,n=n/180*Math.PI,e.moveTo(t,s),e.lineTo(t+i*Math.cos(r),s+i*Math.sin(r)),e.arc(t,s,i,r,n),e.lineTo(t,s)},_initStyle:function(){var e=0,t=this.options,s=t.angle;if(t.spaceAngle=360/t.count-t.angle,!(t.spaceAngle<0)){this._ctx.beginPath(),this.anchor=[t.width/2,t.width/2];for(var i=0;i=0;t--){let r,n,a;const o=s.latLngToLayerPoint(i[t].getLatLng());let l=i[t].getStyle();if(!l&&this.defaultStyle&&(l=this.defaultStyle),l.img){let e=l.img.width,t=l.img.height;l.size&&l.size[0]&&l.size[1]&&(e=l.size[0],t=l.size[1]);const s=l.anchor||[e/2,t/2];r=Ua().point(o.x-s[0],o.y-s[1]),n=Ua().point(r.x+e,r.y+t)}else r=Ua().point(o.x-l.width/2,o.y-l.height/2),n=Ua().point(o.x+l.width/2,o.y+l.height/2);if((a=Ua().bounds(r,n)).contains(e))return i[t]}return null},containsPoint:function(e){return!!this._getGraphicAtPoint(e)},_handleClick:function(e){e.target=null;const t=this.layer,s=t._map,i=this._getGraphicAtPoint(s.latLngToLayerPoint(e.latlng));if(i)return this.layer._renderer._ctx.canvas.style.cursor="pointer",e.target=i,void("click"===e.type&&t.options.onClick&&t.options.onClick.call(t,i,e));this.layer._renderer._ctx.canvas.style.cursor="auto"},_clearBuffer:Oc});Ua().Canvas.include({drawGraphics:function(e,t){var s=this;s._drawing&&e.forEach(function(e){var i=e.getStyle();!i&&t&&(i=t),i.img?s._drawImage.call(s,s._ctx,i,e.getLatLng()):s._drawCanvas.call(s,s._ctx,i,e.getLatLng())})},_drawCanvas:function(e,t,s){var i=t,r=this._map.latLngToLayerPoint(s),n=r.x-i.width/2,a=r.y-i.height/2,o=i.width,l=i.height;e.drawImage(i,n,a,o,l)},_drawImage:function(e,t,s){var i,r;if(t.size){var n=t.size;i=n[0],r=n[1]}else i=t.img.width,r=t.img.height;var a=this._coordinateToPoint(s),o=Ua().point(a),l=Ua().point(t.anchor||[i/2,r/2]);a=[o.x-l.x,o.y-l.y],e.drawImage(t.img,a[0],a[1],i,r)},_coordinateToPoint:function(e){if(!this._map)return e;var t=e;Ua().Util.isArray(e)?t=Ua().latLng(e[0],e[1]):e instanceof Ua().LatLng&&(t=Ua().latLng(e.lat,e.lng));var s=this._map.latLngToLayerPoint(t);return[s.x,s.y]}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +const Nc=Ua().Util.falseFn,Ic=function(){let e=document.createElement("div"),t=["transform","WebkitTransform","MozTransform","OTransform","msTransform"];for(let s=0;s-1&&(this._data=e),this._renderLayer.setChangeFlags({dataChanged:!0,propsChanged:!0,viewportChanged:!0,updateTriggersChanged:!0}),this._refreshData();let t=this._getLayerState();t.data=this._data||[],this._layerDefaultStyleCache=null,this._renderLayer.setNeedsRedraw(!0),this._renderLayer.setState(t)},drawGraphics:function(e){this._clearBuffer();let t=this.layer._map.getSize();this._container.width!==t.x&&(this._container.width=t.x),this._container.height!==t.y&&(this._container.height=t.y);let s=this.layer._map.getPanes().mapPane._leaflet_pos;this._container.style[Ic]="translate("+-Math.round(s.x)+"px,"+-Math.round(s.y)+"px)",this._data=e||[],this._renderLayer||this._createInnerRender(),this._draw()},_initContainer:function(){this._container=this._createCanvas(this.options.width,this.options.height),this._layerContainer=this.options.container,this._wrapper=Ua().DomUtil.create("div","deck-wrapper",this._layerContainer),this._wrapper.appendChild(this._container)},_createCanvas:function(e,t){let s=Ua().DomUtil.create("canvas","graphicLayer leaflet-layer leaflet-zoom-hide");return s.oncontextmenu=Ua().Util.falseFn,s.width=e,s.height=t,s.style.width=e+"px",s.style.height=t+"px",s},_pixelToMeter:function(e){const t=this.layer._map.getBounds();return e*((t.getEast()-t.getWest())/this.layer._map.getSize().x*(6378137*Math.PI/180))},_createInnerRender:function(){let e=this,t=this._getLayerState(),{color:s,radius:i,opacity:r,highlightColor:n,radiusScale:a,radiusMinPixels:o,radiusMaxPixels:l,strokeWidth:h,outline:u}=t,c={id:"scatter-plot",data:e._data,pickable:Boolean(this.options.onClick)||Boolean(this.options.onHover),autoHighlight:!0,color:s,opacity:r,radius:i,radiusScale:a,highlightColor:n,radiusMinPixels:o,radiusMaxPixels:l,strokeWidth:h,coordinateSystem:this._isWGS84()?window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT,isGeographicCoordinateSystem:this._isWGS84(),outline:u,getPosition:function(e){if(!e)return[0,0,0];let t=e.getLatLng();return t&&[t.lng,t.lat,0]},getColor:function(t){let s=e._getLayerDefaultStyle(),i=t&&t.options;return i&&i.color||s.color},getRadius:function(t){let s=e._getLayerDefaultStyle(),i=t&&t.getStyle();return i&&i.radius||s.radius},updateTriggers:{getColor:[s],getRadius:[i]}},p=this;this.options.onClick&&(c.onClick=function(){p._container.style.cursor="pointer",p.options.onClick.apply(p,arguments)}),this.options.onHover&&(c.onHover=function(){p._container.style.cursor="pointer",p.options.onHover.apply(p,arguments)}),e._renderLayer=new window.DeckGL.ScatterplotLayer(c)},_getLayerDefaultStyle:function(){if(this._layerDefaultStyleCache)return this._layerDefaultStyleCache;let{color:e,opacity:t,radius:s,radiusScale:i,radiusMinPixels:r,radiusMaxPixels:n,strokeWidth:a,outline:o}=this.layer.options;return s=this._pixelToMeter(s),this._layerDefaultStyleCache={color:e,opacity:t,radius:s,radiusScale:i,radiusMinPixels:r,radiusMaxPixels:n,strokeWidth:a,outline:o},this._layerDefaultStyleCache},_getLayerState:function(){let e=this.layer.getState();return e.zoom=e.zoom-1,e},_draw:function(){let e=this._getLayerState();this._refreshData(),e.data=this._data||[];let t={};for(let s in e)t[s]=e[s];this._layerDefaultStyleCache=null,this._renderLayer.setNeedsRedraw(!0),t.layers=[this._renderLayer],t.canvas=this._container,t.onBeforeRender=this._onBeforeRender.bind(this),t.onAfterRender=this._onAfterRender.bind(this),t.coordinateSystem=this._isWGS84()?window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT,t.isGeographicCoordinateSystem=this._isWGS84(),this.deckGL?this.deckGL.setProps(t):this.deckGL=new window.DeckGL.experimental.DeckGLJS(t)},_clearBuffer:function(){if(this.deckGL){let e=this.deckGL.layerManager;e&&e.context.gl.clear(e.context.gl.COLOR_BUFFER_BIT)}return this},_refreshData:function(){let e=this._data||[],t=Ua().Util.isArray(e)?[].concat(e):[e];this._renderLayer.props.data||(this._renderLayer.props.data=[]),this._renderLayer.props.data.length=0;for(let e=0;e=0;t--){let s=e[t],i=ee.indexOf(this.graphics,s);-1!==i&&this.graphics.splice(i,1)}this.update()},setStyle:function(e){let t=this.options,s={color:t.color,radius:t.radius,opacity:t.opacity,highlightColor:t.highlightColor,radiusScale:t.radiusScale,radiusMinPixels:t.radiusMinPixels,radiusMaxPixels:t.radiusMaxPixels,strokeWidth:t.strokeWidth,outline:t.outline};this.options=Ua().Util.extend(this.options,s,e),this.defaultStyle=this._getDefaultStyle(this.options),this.update()},update:function(){this._layerRenderer.update(this.graphics)},clear:function(){this.removeGraphics()},getRenderer:function(){return this._renderer},getState:function(){let e=this._map,t=e.getSize().x,s=e.getSize().y,i=e.getCenter(),r=i.lng,n=i.lat,a=Bc[this._crs.code]||0;kc[this._crs.code]&&this._crs.resolutions&&this._crs.resolutions.length>0&&(a=Math.round(Math.log2(kc[this._crs.code]/this._crs.resolutions[0])));let o={longitude:r,latitude:n,zoom:e.getZoom()+a,maxZoom:e.getMaxZoom()+a,pitch:0,bearing:0},l={};for(let e in o)l[e]=o[e];l.width=t,l.height=s;let h=this.options;return l.color=h.color,l.radius=h.radius,l.opacity=h.opacity,l.highlightColor=h.highlightColor,l.radiusScale=h.radiusScale,l.radiusMinPixels=h.radiusMinPixels,l.radiusMaxPixels=h.radiusMaxPixels,l.strokeWidth=h.strokeWidth,l.outline=h.outline,l},_resize:function(){let e=this._map.getSize();this._container.width=e.x,this._container.height=e.y,this._container.style.width=e.x+"px",this._container.style.height=e.y+"px";let t=this._map.containerPointToLayerPoint([0,0]);Ua().DomUtil.setPosition(this._container,t),this._update()},_moveEnd:function(){this._layerRenderer instanceof Fc&&this._update()},_createRenderer:function(){let e,t=this._map,s=t.getSize().x,i=t.getSize().y;if(this.options.render===Dc[0])e=new Pc(this,{width:s,height:i,renderer:t.getRenderer(this)});else{let r=Ua().Util.setOptions({},Rc),n=Ua().Util.setOptions({options:r},this.options);(n=Ua().Util.setOptions(this,n)).container=t.getPane("overlayPane"),n.width=s,n.height=i,e=new Fc(this,n)}return e.defaultStyle=this.defaultStyle,this._layerRenderer=e,this._layerRenderer.getRenderer()},_update:function(){this._map&&this._updatePath()},_updatePath:function(){let e=this._getGraphicsInBounds();this._renderer.drawGraphics(e,this.defaultStyle)},_project:function(){let e=this;e._getGraphicsInBounds().map(function(t){let s=e._map.latLngToLayerPoint(t.getLatLng()),i=e._clickTolerance(),r=[t._anchor+i,t._anchor+i];return t._pxBounds=new(Ua().Bounds)(s.subtract(r),s.add(r)),t}),e._pxBounds=Ua().bounds(Ua().point(0,0),Ua().point(this._container.width,this._container.height))},_getDefaultStyle:function(e){const t={};if(e.color){t.fill=!0;const s=this.toRGBA(e.color);t.color=s,t.fillColor=s}return e.opacity&&(t.opacity=e.opacity,t.fillOpacity=e.opacity),e.radius&&(t.radius=e.radius),e.strokeWidth&&(t.weight=e.strokeWidth),e.outline&&(t.stroke=e.outline),new Ec(t).getStyle()},toRGBA:e=>`rgba(${e[0]},${e[1]},${e[2]},${(e[3]||255)/255})`,_getGraphicsInBounds:function(){let e=[],t=this._map.getBounds();return this.graphics.map(function(s){return t.contains(s.getLatLng())&&e.push(s),s}),e},_handleClick:function(e){this._layerRenderer._handleClick(e)},beforeAdd:Ua().Util.falseFn,_containsPoint:function(e){return this._layerRenderer.containsPoint(e)}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Uc=oc.extend({options:{isOverLay:!0},initialize:function(e,t,s){var i=[];i.push(e),i.push(s),oc.prototype.initialize.apply(this,i),this.chartsType=t,this.themeFields=s&&s.themeFields?s.themeFields:null,this.charts=s&&s.charts?s.charts:[],this.cache=s&&s.cache?s.cache:{},this.chartsSetting=s&&s.chartsSetting?s.chartsSetting:{}},setChartsType:function(e){this.chartsType=e,this.redraw()},addFeatures:function(e){var t=this;t.fire("beforefeaturesadded",{features:e}),this.features=this.toiClientFeature(e),t.renderer&&(t._map?t.redrawThematicFeatures(t._map.getBounds()):t.redrawThematicFeatures())},redrawThematicFeatures:function(e){var t=this;t.renderer.clearAll();var s=t.features;if(this.options.alwaysMapCRS&&e&&e instanceof Ua().LatLngBounds){var i=this._map.options.crs;e=Ua().bounds(i.project(e.getSouthWest()),i.project(e.getNorthEast()))}e=_u.toSuperMapBounds(e);for(var r=0,n=s.length;r=s.left&&a.x<=s.right&&a.y>=s.top&&a.y<=s.bottom){i=!0;break}}return i},clearCache:function(){this.cache={},this.charts=[]},removeFeatures:function(e){this.clearCache(),oc.prototype.removeFeatures.apply(this,arguments)},removeAllFeatures:function(){this.clearCache(),oc.prototype.removeAllFeatures.apply(this,arguments)},redraw:function(){return this.clearCache(),oc.prototype.redraw.apply(this,arguments)},clear:function(){var e=this;e.renderer&&(e.renderer.clearAll(),e.renderer.refresh()),e.removeAllFeatures(),e.clearCache()},getWeightFieldValue:function(e,t,s){if((void 0===s||isNaN(s))&&(s=0),!e.attributes)return s;var i=e.attributes[t];return(void 0===i||isNaN(i))&&(i=s),i},_sortChart:function(){this.charts&&this.charts.sort(function(e,t){return void 0===e.__overlayWeight&&void 0===t.__overlayWeight?0:void 0!==e.__overlayWeight&&void 0===t.__overlayWeight?-1:void 0===e.__overlayWeight&&void 0!==t.__overlayWeight?1:void 0!==e.__overlayWeight&&void 0!==t.__overlayWeight?parseFloat(e.__overlayWeight)1?s.weight/10:s.weight)):t.setAttribute("stroke","none"),s.fill?(t.setAttribute("fill",s.fillColor||s.color),t.setAttribute("fill-opacity",s.fillOpacity)):t.setAttribute("fill","none")}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Kc=Ua().CircleMarker.extend({includes:Qc.prototype,statics:{iconCache:{}},initialize:function(e,t){Qc.prototype.initialize.call(this,e),this._makeFeatureParts(e,t)},getLatLng:void 0,render:function(e,t){Qc.prototype.render.call(this,e,t),this._radius=t.radius||Ua().CircleMarker.prototype.options.radius,this._updatePath()},_makeFeatureParts:function(e,t){t=t||{x:1,y:1};var s=e.geometry[0];"object"==typeof s[0]&&"x"in s[0]?(this._point=Ua().point(s[0]).scaleBy(t),this._empty=Ua().Util.falseFn):(this._point=Ua().point(s).scaleBy(t),this._empty=Ua().Util.falseFn)},makeInteractive:function(){this._updateBounds()},updateStyle:function(e,t){return this._radius=t.radius||this._radius,this._updateBounds(),Qc.prototype.updateStyle.call(this,e,t)},_updateBounds:function(){if(this.options.iconUrl&&this.options.iconSize){var e=Ua().point(this.options.iconSize),t=e&&e.divideBy(2,!0),s=this._point.subtract(t);this._pxBounds=new(Ua().Bounds)(s,s.add(e))}else Ua().CircleMarker.prototype._updateBounds.call(this)},_updatePath:function(){this.options.iconUrl?this._renderer._updateIcon(this):Ua().CircleMarker.prototype._updatePath.call(this)},_getImage:function(){if(!this.options.iconUrl)return null;var e=this.options.iconUrl,t=Kc.iconCache[e];if(!t){var s=this.options.iconSize||[50,50];t=Kc.iconCache[e]=this._createIcon(e,s)}return t},_createIcon:function(e,t){var s=e;if(!s)throw new Error("iconUrl not set in Icon options (see the docs).");var i=document.createElement("img");i.src=s,i.className="leaflet-marker-icon "+(this.layerName||"");var r=t;if("number"==typeof r&&(r=[r,r]),r){var n=Ua().point(r),a=Ua().point(n&&n.divideBy(2,!0));n&&(i.style.width=n.x+"px",i.style.height=n.y+"px"),a&&(i.style.marginLeft=-a.x+"px",i.style.marginTop=-a.y+"px")}return i.onload=function(){r||(i.style.width=this.width+"px",i.style.height=this.height+"px")},i},_containsPoint:function(e){return this.options.iconUrl?this._pxBounds.contains(e):Ua().CircleMarker.prototype._containsPoint.call(this,e)}}),Zc={_makeFeatureParts:function(e,t){t=t||{x:1,y:1};var s,i=e.geometry;this._parts=[];for(var r=0;r-1?new rp(i):new np(i)).getTile().then(function(t){e.render(t,s)})},render:function(e,t){if(e){for(var s=this,i=s.renderer,r=s.layer,n=0;n0&&a[a.length-1]}t.properties.textField=n}s.vectorTileLayerStyles=s.vectorTileLayerStyles||{};var o=s.vectorTileLayerStyles[i];if(o)return t=this._mergeFeatureTextField(t,o),o;var l=this.getScaleFromCoords(e),h=this.cartoCSSToLeaflet.pickShader(i)||[];for(var u in o=[],h)for(var c=h[u],p=0;p1){var u=parseInt(h[1]);o=u&&u>=4e3&&u<=5e3?l.DEGREE:l.METER}}return ku(a,96,o)},_mergeFeatureTextField:function(e,t){if(!this.options.serverCartoCSSStyle||!t||"TEXT"!==e.type)return e;var s=t;Ua().Util.isArray(t)||(s=[t]);for(var i=0;i0?this.convertFastToPixelPoints(e):this.canvasContext.clearRect(0,0,this.maxWidth,this.maxWidth)},convertFastToPixelPoints:function(e){var t,s,i,r,n,a,o,l=[],h=e.getEast()-e.getWest(),u=e.getNorth()-e.getSouth(),c=this._map.getSize();r=h/c.x>u/c.y?h/c.x:u/c.y,this.useRadius=this.useGeoUnit?parseInt(this.radius/r):this.radius;for(var p=0;p0&&this.maxWidth>0))return!1;var s=this.canvasContext;this.canvasContext.clearRect(0,0,this.maxWidth,this.maxHeight),this.drawCircle(this.useRadius),this.createGradient();for(var i=0;i{s.currentStatisticResult[t]=null,s._fieldStatisticRequest(e.datasource,e.dataset,i,t)})}},_fieldStatisticRequest:function(e,t,s,i){var r=this;new ps(r.url,{eventListeners:{scope:r,processCompleted:r._processCompleted,processFailed:r._statisticsCallback},datasource:e,dataset:t,field:s,statisticMode:i,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers}).processAsync()},_processCompleted:function(e){var t=this,s=!0,i=e.result;for(var r in this.currentStatisticResult&&null==t.currentStatisticResult[i.mode]&&(this.currentStatisticResult[i.mode]=i.result),t.currentStatisticResult)if(null==t.currentStatisticResult[r]){s=!1;break}s&&t._statisticsCallback({result:t.currentStatisticResult})}}),Sp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},getGridCellInfos:function(e,t){if(e instanceof Ws){var s=this;new Ys(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)}}});const bp=gu.extend({initialize:function(e,t){t=t||{},Ua().setOptions(this,t),gu.prototype.initialize.call(this,e,t),this.headers={},this.crossOrigin=!0,this.withCredentials=!0,this.proxy=!0},getTools:function(e){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:e,processFailed:e}}).getTools()},getTool:function(e,t){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:t,processFailed:t}}).getTool(e)},execute:function(e,t,s,i){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:i,processFailed:i}}).execute(e,t,s)},submitJob:function(e,t,s,i){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:i,processFailed:i}}).submitJob(e,t,s)},waitForJobCompletion:function(e,t,s,i){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:i,processFailed:i}}).waitForJobCompletion(e,t,s)},getJobInfo:function(e,t,s){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:s,processFailed:s}}).getJobInfo(e,t)},cancelJob:function(e,t,s){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:s,processFailed:s}}).cancelJob(e,t)},getJobs:function(e,t){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:t,processFailed:t}}).getJobs(e)},getResults:function(e,t,s,i){new Os(this.url,{proxy:this.options.proxy,withCredentials:this.options.withCredentials,crossOrigin:this.options.crossOrigin,headers:this.options.headers,eventListeners:{scope:this,processCompleted:i,processFailed:i}}).getResults(e,t,s)}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var xp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},getLayersInfo:function(e){var t=this;new wi(t.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{processCompleted:e,processFailed:e}}).processAsync()},setLayerInfo:function(e,t){if(e instanceof ir){var s=this,i=e.resourceID,r=e.tempLayerName,n=e.layerInfo;if(i&&r){var a=ee.urlPathAppend(s.url,`tempLayersSet/${i}/${r}`);new rr(a,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{processCompleted:t,processFailed:t}}).processAsync(n)}}},setLayersInfo:function(e,t){if(e instanceof nr){var s=this,i=e.resourceID,r=!!e.isTempLayers&&e.isTempLayers,n=e.layersInfo;if((!r||i)&&n)new ar(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{processCompleted:t,processFailed:t},resourceID:i,isTempLayers:r}).processAsync(n)}},setLayerStatus:function(e,t){if(e instanceof or){var s=this;new lr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{processCompleted:t,processFailed:t}}).processAsync(e)}}}),_p=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},measureDistance:function(e,t){return this.measure(o.DISTANCE,e,t),this},measureArea:function(e,t){return this.measure(o.AREA,e,t),this},measure:function(e,t,s){if(t instanceof ki){var i=this;t.geometry&&(t.geometry=Du(t.geometry)),new Bi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,measureMode:e,eventListeners:{scope:i,processCompleted:s,processFailed:s}}).processAsync(t)}}}),Cp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},sinksFacilityAnalyst:function(e,t){var s=this;new $t(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},sourcesFacilityAnalyst:function(e,t){var s=this;new ts(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},traceUpFacilityAnalyst:function(e,t){var s=this;new os(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},traceDownFacilityAnalyst:function(e,t){var s=this;new ns(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},upstreamFacilityAnalyst:function(e,t){var s=this;new hs(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)}}),wp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},burstPipelineAnalyst:function(e,t){var s=this;new At(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(s._processParams(e))},computeWeightMatrix:function(e,t){var s=this;new Rt(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(s._processParams(e))},findClosestFacilities:function(e,t,s){var i=this;new fs(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},streamFacilityAnalyst:function(e,t,s){var i=this;new is(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},findLocation:function(e,t,s){var i=this;new ys(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},findPath:function(e,t,s){var i=this;new bs(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},findTSPPaths:function(e,t,s){var i=this;new ws(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},findMTSPPaths:function(e,t,s){var i=this;new vs(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},findServiceAreas:function(e,t,s){var i=this;new _s(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},updateEdgeWeight:function(e,t){var s=this;new Vr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},updateTurnNodeWeight:function(e,t){var s=this;new qr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).processAsync(e)},_processParams:function(e){if(!e)return{};if(e.centers&&Ua().Util.isArray(e.centers)&&e.centers.map(function(t,s){return e.centers[s]=t instanceof Ua().LatLng?{x:t.lng,y:t.lat}:t,e.centers[s]}),e.nodes&&Ua().Util.isArray(e.nodes)&&e.nodes.map(function(t,s){return e.nodes[s]=t instanceof Ua().LatLng?{x:t.lng,y:t.lat}:t,e.nodes[s]}),e.event&&e.event instanceof Ua().LatLng&&(e.event={x:e.event.lng,y:e.event.lat}),e.facilities&&Ua().Util.isArray(e.facilities)&&e.facilities.map(function(t,s){return e.facilities[s]=t instanceof Ua().LatLng?{x:t.lng,y:t.lat}:t,e.facilities[s]}),e.parameter&&e.parameter.barrierPoints){var t=e.parameter.barrierPoints;Ua().Util.isArray(t)?t.map(function(t,s){return e.parameter.barrierPoints[s]=t instanceof Ua().LatLng?{x:t.lng,y:t.lat}:t,e.parameter.barrierPoints[s]}):e.parameter.barrierPoints=[t instanceof Ua().LatLng?{x:t.lng,y:t.lat}:t]}return e},_processFormat:function(e){return e||t.GEOJSON}}),Mp=gu.extend({initialize:function(e,t){t=t||{},Ua().setOptions(this,t),gu.prototype.initialize.call(this,e,t),this.kernelDensityJobs={},this.summaryMeshJobs={},this.queryJobs={},this.summaryRegionJobs={},this.vectorClipJobs={},this.overlayGeoJobs={},this.buffersJobs={},this.topologyValidatorJobs={},this.summaryAttributesJobs={}},getKernelDensityJobs:function(e,t){var s=this,i=s._processFormat(t);new Ni(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getKernelDensityJobs()},getKernelDensityJob:function(e,t,s){var i=this,r=i._processFormat(s);new Ni(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getKernelDensityJob(e)},addKernelDensityJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new Ni(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.kernelDensityJobs[e.id]=e.state}},format:a}).addKernelDensityJob(n,s)},getKernelDensityJobState:function(e){return this.kernelDensityJobs[e]},getSummaryMeshJobs:function(e,t){var s=this,i=s._processFormat(t);new yr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getSummaryMeshJobs()},getSummaryMeshJob:function(e,t,s){var i=this,r=i._processFormat(s);new yr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getSummaryMeshJob(e)},addSummaryMeshJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new yr(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.summaryMeshJobs[e.id]=e.state}},format:a}).addSummaryMeshJob(n,s)},getSummaryMeshJobState:function(e){return this.summaryMeshJobs[e]},getQueryJobs:function(e,t){var s=this,i=s._processFormat(t);new ur(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getQueryJobs()},getQueryJob:function(e,t,s){var i=this,r=i._processFormat(s);new ur(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getQueryJob(e)},addQueryJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new ur(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.queryJobs[e.id]=e.state}},format:a}).addQueryJob(n,s)},getQueryJobState:function(e){return this.queryJobs[e]},getSummaryRegionJobs:function(e,t){var s=this,i=s._processFormat(t);new vr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getSummaryRegionJobs()},getSummaryRegionJob:function(e,t,s){var i=this,r=i._processFormat(s);new vr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getSummaryRegionJob(e)},addSummaryRegionJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new vr(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.summaryRegionJobs[e.id]=e.state}},format:a}).addSummaryRegionJob(n,s)},getSummaryRegionJobState:function(e){return this.summaryRegionJobs[e]},getVectorClipJobs:function(e,t){var s=this,i=s._processFormat(t);new Yr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getVectorClipJobs()},getVectorClipJob:function(e,t,s){var i=this,r=i._processFormat(s);new Yr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getVectorClipJob(e)},addVectorClipJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new Yr(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.vectorClipJobs[e.id]=e.state}},format:a}).addVectorClipJob(n,s)},getVectorClipJobState:function(e){return this.vectorClipJobs[e]},getOverlayGeoJobs:function(e,t){var s=this,i=s._processFormat(t);new ji(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getOverlayGeoJobs()},getOverlayGeoJob:function(e,t,s){var i=this,r=i._processFormat(s);new ji(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getOverlayGeoJob(e)},addOverlayGeoJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new ji(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.overlayGeoJobs[e.id]=e.state}},format:a}).addOverlayGeoJob(n,s)},getoverlayGeoJobState:function(e){return this.overlayGeoJobs[e]},getBuffersJobs:function(e,t){var s=this,i=s._processFormat(t);new Ct(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getBuffersJobs()},getBuffersJob:function(e,t,s){var i=this,r=i._processFormat(s);new Ct(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getBuffersJob(e)},addBuffersJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new Ct(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.buffersJobs[e.id]=e.state}},format:a}).addBuffersJob(n,s)},getBuffersJobState:function(e){return this.buffersJobs[e]},getTopologyValidatorJobs:function(e,t){var s=this,i=s._processFormat(t);new Dr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getTopologyValidatorJobs()},getTopologyValidatorJob:function(e,t,s){var i=this,r=i._processFormat(s);new Dr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getTopologyValidatorJob(e)},addTopologyValidatorJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new Dr(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.topologyValidatorJobs[e.id]=e.state}},format:a}).addTopologyValidatorJob(n,s)},getTopologyValidatorJobState:function(e){return this.topologyValidatorJobs[e]},getSummaryAttributesJobs:function(e,t){var s=this,i=s._processFormat(t);new fr(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:e,processFailed:e},format:i}).getSummaryAttributesJobs()},getSummaryAttributesJob:function(e,t,s){var i=this,r=i._processFormat(s);new fr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:r}).getSummaryAttributesJob(e)},addSummaryAttributesJob:function(e,t,s,i){var r=this,n=r._processParams(e),a=r._processFormat(i);new fr(r.url,{proxy:r.options.proxy,withCredentials:r.options.withCredentials,crossOrigin:r.options.crossOrigin,headers:r.options.headers,eventListeners:{scope:r,processCompleted:t,processFailed:t,processRunning:function(e){r.summaryAttributesJobs[e.id]=e.state}},format:a}).addSummaryAttributesJob(n,s)},getSummaryAttributesJobState:function(e){return this.summaryAttributesJobs[e]},_processFormat:function(e){return e||t.GEOJSON},_processParams:function(e){return e?(e.bounds&&(e.bounds=_u.toSuperMapBounds(e.bounds)),e.query&&(e.query=_u.toSuperMapBounds(e.query)),e.geometryQuery&&(e.geometryQuery=_u.toProcessingParam(e.geometryQuery)),e.geometryClip&&(e.geometryClip=_u.toProcessingParam(e.geometryClip)),e):{}}}),Ap=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},queryByBounds:function(e,t,s){var i=this;new Ji(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},queryByDistance:function(e,t,s){var i=this;new Hi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},queryBySQL:function(e,t,s){var i=this;new Xi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},queryByGeometry:function(e,t,s){var i=this;new Yi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},_processParams:function(e){return e?(e.returnContent=null==e.returnContent||e.returnContent,e.queryParams&&!Ua().Util.isArray(e.queryParams)&&(e.queryParams=[e.queryParams]),e.bounds&&(e.bounds=_u.toSuperMapBounds(e.bounds)),e.geometry&&(e.geometry instanceof Ua().Point?e.geometry=new le(e.geometry.x,e.geometry.y):e.geometry=Du(e.geometry)),e):{}},_processFormat:function(e){return e||t.GEOJSON}}),Tp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},getAreaSolarRadiationResult:function(e,t,s){var i=this;new ht(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(e)},bufferAnalysis:function(e,t,s){var i=this;new gt(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},densityAnalysis:function(e,t,s){var i=this;new Yt(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},generateSpatialData:function(e,t,s){var i=this;new As(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(e)},geoRelationAnalysis:function(e,t,s){var i=this;new Ns(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(e)},interpolationAnalysis:function(e,t,s){var i=this;new Oi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},mathExpressionAnalysis:function(e,t,s){var i=this;new Ri(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},overlayAnalysis:function(e,t,s){var i=this;new Gi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},routeCalculateMeasure:function(e,t,s){var i=this;new Zi(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},routeLocate:function(e,t,s){var i=this;new er(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},surfaceAnalysis:function(e,t,s){var i=this;new br(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},terrainCurvatureCalculate:function(e,t,s){var i=this;new _r(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(e)},thiessenAnalysis:function(e,t,s){var i=this;new Pr(i.url,{proxy:i.options.proxy,withCredentials:i.options.withCredentials,crossOrigin:i.options.crossOrigin,headers:i.options.headers,eventListeners:{scope:i,processCompleted:t,processFailed:t},format:i._processFormat(s)}).processAsync(i._processParams(e))},geometrybatchAnalysis:function(e,t,s){for(var i=new Nr(this.url,{eventListeners:{scope:this,processCompleted:t,processFailed:t},format:this._processFormat(s)}),r=[],n=0;nUa().Util.isArray(e)?{x:e[0],y:e[1]}:e instanceof le||e instanceof Ua().Point?{x:e.x,y:e.y}:e instanceof Ua().LatLng?{x:e.lng,y:e.lat}:e}),Pp=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},getCollections:function(e){var t=this;new hn(this.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e}}).getCollections()},getCollectionByID:function(e,t){var s=this;new hn(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).getCollectionByID(e)},search:function(e,t){var s=this;new hn(s.url,{proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).search(e)}}),Np=gu.extend({initialize:function(e,t){gu.prototype.initialize.call(this,e,t)},getLegend:function(e,t){var s=this;new ln(this.url,{collectionId:s.options.collectionId,proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).getLegend(e)},getStatistics:function(e){var t=this;new ln(t.url,{collectionId:t.options.collectionId,proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e}}).getStatistics()},getTileInfo:function(e){var t=this;new ln(t.url,{collectionId:t.options.collectionId,proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e}}).getTileInfo()},deleteItemByID(e,t){var s=this;new ln(this.url,{collectionId:s.options.collectionId,proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).deleteItemByID(e)},getItemByID(e,t){var s=this;new ln(s.url,{collectionId:s.options.collectionId,proxy:s.options.proxy,withCredentials:s.options.withCredentials,crossOrigin:s.options.crossOrigin,headers:s.options.headers,eventListeners:{scope:s,processCompleted:t,processFailed:t}}).getItemByID(e)}}),Ip=Ua().Control.extend({options:{position:"topright",style:(e,t)=>t?Ua().circleMarker(t,{fillColor:"blue",weight:1,opacity:1,color:"blue",fillOpacity:.6}):{fillColor:"blue",weight:1,opacity:1,color:"blue",fillOpacity:.6},onEachFeature:null},initialize(e){Ua().setOptions(this,e),this._event=new(Ua().Evented),this.rootContainer=null},onAdd(e){return this.map=e,this.rootContainer=this._initView(),this.rootContainer},on(e,t){this._event.on(e,t)},off(e,t){this._event.off(e,t)},_initView(){},_preventMapEvent(e,t){e&&t&&(e.addEventListener("mouseover",function(){t.dragging.disable(),t.scrollWheelZoom.disable(),t.doubleClickZoom.disable()}),e.addEventListener("mouseout",function(){t.dragging.enable(),t.scrollWheelZoom.enable(),t.doubleClickZoom.enable()}))}}),Fp=Ua().Evented.extend({initialize(){this.fileModel=new +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class{constructor(e){this.FileTypes=ga,this.FileConfig=va,this.loadFileObject=e&&e.loadFileObject?e.loadFileObject:[]}set(e,t){this[e]=t}get(e){return this[e]}}},readFile(e){let t=e.target,s=t.files[0];if(s.size>this.fileModel.FileConfig.fileMaxSize)return this.fire("filesizeexceed",{messageType:"warring",message:_a.i18n("msg_fileSizeExceeded")}),!1;let i=t.value,r=s.name,n=Ba.getFileType(r);if(!n)return this.fire("errorfileformat",{messageType:"failure",message:_a.i18n("msg_fileTypeUnsupported")}),!1;""!==r&&(this.fileModel.set("loadFileObject",{file:s,filePath:i,fileName:r,fileType:n}),this._readData())},_readData(){const e=this,t=this.fileModel.loadFileObject.fileType;Ma.readFile(t,{file:this.fileModel.loadFileObject.file,path:this.fileModel.loadFileObject.filePath},s=>{Ma.processDataToGeoJson(t,s,e=>{e&&this.fire("openfilesucceeded",{result:e,layerName:this.fileModel.loadFileObject.fileName.split(".")[0]})},t=>{e.fire("openfilefailed",{messageType:"failure",message:t})},this)},()=>{e.fire("openfilefailed",{messageType:"failure",message:_a.i18n("msg_openFileFail")})},this)}}),Dp=Ip.extend({options:{layer:null},initialize(e){Ip.prototype.initialize.apply(this,[e]),this.viewModel=new Fp},setViewStyle(e,t){this.rootContainer.style[e]=t},_initView(){const e=Ua().DomUtil.create("div","component-openfile");return e.id="openFile",this.fileSelect=Ua().DomUtil.create("div","",e),this.label=Ua().DomUtil.create("label","component-openfile__span--select",this.fileSelect),this.label.htmlFor="input_file",Ua().DomUtil.create("div","supermapol-icons-upload",this.label),Ua().DomUtil.create("span","component-openfile__span",this.label).appendChild(document.createTextNode(_a.i18n("text_chooseFile"))),this.fileInput=Ua().DomUtil.create("input","component-openfile__input",this.fileSelect),this.fileInput.id="input_file",this.fileInput.type="file",this.fileInput.accept=".json,.geojson,.csv,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel",this.fileInput.onchange=(e=>{this.messageBox.closeView(),this.viewModel.readFile(e)}),this.messageBox=new Sa,this.viewModel.on("filesizeexceed",e=>{this.messageBox.showView(e.message,e.messageType)}),this.viewModel.on("errorfileformat",e=>{this.messageBox.showView(e.message,e.messageType)}),this.viewModel.on("openfilefailed",e=>{this.messageBox.showView(e.message,e.messageType),this._event.fire("openfilefailed",e)}),this.viewModel.on("readdatafail",e=>{this.messageBox.showView(e.message,e.messageType)}),this.viewModel.on("openfilesucceeded",e=>{this._event.fire("openfilesucceeded",e)}),this._preventMapEvent(e,this.map),e}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Rp{constructor(e){this.layers=[],e&&e.length>0&&this.addLayers(e),this.currentLayerDataModel=null}addLayers(e,t,s,i){for(let r=0;r0?i.operatingAttributeNames:i.attributeNames).length;a0?this.fire("searchlayersucceeded",{result:s}):this.fire("searchfailed",{searchType:"searchLayersField"})}},searchFromCityLocalSearchService(e){if(this.searchCache[e])this.fire("geocodesucceeded",{result:this.searchCache[e]});else{this.geoCodeParam.keyWords=e||this.geoCodeParam.city;const t=this;let s=this._getSearchUrl(this.geoCodeParam);Ue.get(s).then(e=>e.json()).then(e=>{if(e.error||0===e.poiInfos.length)t.fire("searchfailed",{searchType:"searchGeocodeField"});else if(e.poiInfos){const s=t._dataToGeoJson(e.poiInfos,t.geoCodeParam);t.fire("geocodesucceeded",{result:s})}})}},addSearchLayers(e){this.dataModel.addLayers(e,e=>{this.fire("newlayeradded",{layerName:e.layerName})},null,this)},panToLayer(e){this.dataModel.layers[e]&&this.map.flyToBounds(this.dataModel.layers[e].layer.getBounds())},panToCity(e){this.geoCodeParam.keyWords=e,this.geoCodeParam.city=e;const t=this;let s=this._getSearchUrl(this.geoCodeParam);Ue.get(s).then(e=>e.json()).then(e=>{if(e.poiInfos.length>0){const s=Ua().latLng(e.poiInfos[0].location.y,e.poiInfos[0].location.x);t.map.setView(s,8)}else t.fire("searchfailed",{searchType:"cityGeocodeField"})})},_dataToGeoJson(e,t){let s=[];for(let i=0;i{"SPAN"===e.target.nodeName&&e.target.innerText&&(this.viewModel.panToCity(e.target.innerHTML),this.messageBox.closeView(),r.removeChild(r.firstChild),r.insertBefore(document.createTextNode(e.target.innerHTML),r.firstChild),this.isSearchLayer=!1)}),r.appendChild(document.createTextNode(e.content.getElementsByTagName("span")[0].innerText))}const o=function(){const t=document.createElement("div");t.setAttribute("class","component-search__layers");const s=document.createElement("div");s.setAttribute("class","component-search-layers-content"),t.appendChild(s);const i=document.createElement("div");i.setAttribute("class","component-search__layers__header");const n=document.createElement("div");n.setAttribute("class","load-btn"),i.appendChild(n);const a=document.createElement("span");a.setAttribute("class","supermapol-icons-poi-load"),n.appendChild(a);const o=document.createElement("span");o.appendChild(document.createTextNode(_a.i18n("text_loadSearchCriteria"))),n.appendChild(o);const l=document.createElement("div");l.setAttribute("class","save-btn"),i.appendChild(l);const h=document.createElement("span");h.setAttribute("class","supermapol-icons-poi-save"),l.appendChild(h);const u=document.createElement("span");u.appendChild(document.createTextNode(_a.i18n("text_saveSearchCriteria"))),l.appendChild(u);const c=document.createElement("div");return c.setAttribute("class","component-search__layers__body"),c.onclick=(t=>{e.clearSearchResult();let s=null;if("component-search__layers__itme__singleselect"===t.target.classList[0])s=t.target;else{if("component-single-default-img"!==t.target.classList[0]&&"single-label"!==t.target.classList[0])return;s=t.target.parentNode}document.getElementsByClassName("component-single-checked-img").length>0&&document.getElementsByClassName("component-single-checked-img")[0].setAttribute("class","component-single-default-img"),s.firstChild.setAttribute("class","component-single-checked-img"),e.currentSearchLayerName=s.lastChild.innerText,e.isSearchLayer=!0,r.removeChild(r.firstChild),r.insertBefore(document.createTextNode(e.currentSearchLayerName),r.firstChild),e.viewModel.panToLayer(e.currentSearchLayerName),e.messageBox.closeView()}),s.appendChild(c),t}();let l=[];a&&l.push({title:_a.i18n("title_searchCity"),content:a}),l.push({title:_a.i18n("title_searchLayer"),content:o});const h=new Ra({tabs:l}),u=h.getElement();h.closeView(),s.appendChild(u),i.onclick=(()=>{u.hidden?h.showView():h.closeView()}),s.appendChild(i),r.innerText||r.appendChild(document.createTextNode(_a.i18n("text_label_chooseSearchLayers")));const c=document.createElement("div");c.setAttribute("class","component-search__input");const p=document.createElement("input");p.type="text",p.placeholder=_a.i18n("text_label_searchTips"),c.appendChild(p),this.poiInput=p;const d=document.createElement("span");d.setAttribute("class","supermapol-icons-close"),d.hidden=!0,c.appendChild(d),s.appendChild(c);const f=document.createElement("div");f.setAttribute("class","component-search-icon supermapol-icons-search");const m=new ka;this._resultDomObj=m,f.onclick=(()=>{m.closeView(),this.clearSearchResult(),this.messageBox.closeView(),h.closeView();const e=this.poiInput.value.trim();""!==e?this.isSearchLayer?this.viewModel.search(e,this.currentSearchLayerName):this.viewModel.search(e):this.messageBox.showView(_a.i18n("msg_searchKeywords"))}),p.onkeypress=(e=>{if(13==e.which){var t=document.createEvent("HTMLEvents");t.initEvent("click",!1,!0),f.dispatchEvent(t)}}),s.appendChild(f);const y=function(){const t=m.getElement();return t.style.position="absolute",t.style.top="44px",t.style.right="0",m.closeView(),m.content.onclick=(t=>{let s=null;if("component-search-result-info"===t.target.parentNode.className)s=t.target.parentNode.parentNode;else if("component-search__resultitme"===t.target.parentNode.className)s=t.target.parentNode;else{if("component-search__resultitme"!==t.target.className)return;s=t.target}document.getElementsByClassName("component-search__resultitme-selected").length>0&&document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"),s.firstChild.classList.add("component-search__resultitme-selected");let i=s.children[1].firstChild.innerText;e._linkageFeature(i)}),t}();return s.appendChild(y),d.onclick=(e=>{this.clearSearchResult(),p.value="",e.target.hidden=!0,m.closeView()}),p.oninput=(()=>{d.hidden=!1}),this.messageBox=new Sa,this._addViewModelListener(),t.appendChild(s),this._preventMapEvent(t,this.map),t},_createSearchLayerItem(e){const t=document.createElement("div");t.setAttribute("class","component-search__layers__itme");const s=document.createElement("div");s.setAttribute("class","component-search__layers__itme__singleselect");const i=document.createElement("div");i.setAttribute("class","component-single-default-img"),s.appendChild(i);const r=document.createElement("span");r.setAttribute("class","single-label"),r.innerHTML=e,s.appendChild(r),t.appendChild(s),document.getElementsByClassName("component-search__layers__body")[0].appendChild(t)},_createResultItem(e,t){const s=document.createElement("div");s.setAttribute("class","component-search__resultitme");let i=document.createElement("div");"Point"===e||"MultiPoint"===e?i.setAttribute("class","supermapol-icons-marker-layer component-search-result-icon"):"LineString"===e||"MultiLineString "===e?i.setAttribute("class","supermapol-icons-line-layer component-search-result-icon"):"Polygon"===e||"MultiPolygon"===e?i.setAttribute("class","supermapol-icons-polygon-layer component-search-result-icon"):i.setAttribute("class","supermapol-icons-point-layer component-search-result-icon"),s.appendChild(i);const r=document.createElement("div");r.setAttribute("class","component-search-result-info");const n=document.createElement("div");r.appendChild(n);const a=document.createElement("div");return t.name?(n.innerHTML=t.name,a.innerHTML=t.address,r.appendChild(a)):n.innerHTML=t.filterAttributeName+": "+t.filterAttributeValue,s.appendChild(r),document.createElement("div").setAttribute("class","component-checkbox component-checkbox-default-img"),s},_addViewModelListener(){this.viewModel.on("searchlayerschanged",e=>{for(let t=0;t{this._createSearchLayerItem(e.layerName)}),this.viewModel.on("searchlayersucceeded",e=>{const t=e.result;this.clearSearchResult(),this.searchResultLayer=Ua().featureGroup(t,{pointToLayer:this.options.style,style:this.options.style}).bindPopup(function(e){if(e.feature.properties)return new Ia({attributes:e.feature.properties}).getElement()}).addTo(this.map),this.searchResultLayer.eachLayer(e=>{this.options.onEachFeature?this.options.onEachFeature(e.toGeoJSON(),e):this._featureOnclickEvent.bind(this)(e.toGeoJSON(),e)}),this.searchLayersData=t,this._prepareResultData(t),this._event.fire("searchlayersucceeded",{result:this.searchResultLayer.toGeoJSON()})}),this.viewModel.on("geocodesucceeded",e=>{const t=e.result;this.clearSearchResult(),this.searchResultLayer=Ua().geoJSON(t,{pointToLayer:this.options.style,style:this.options.style,onEachFeature:this.options.onEachFeature||this._featureOnclickEvent.bind(this)}).bindPopup(function(e){if(e.feature.properties)return new Ia({attributes:e.feature.properties}).getElement()}).addTo(this.map),this.searchLayersData=t,this._prepareResultData(t),this._event.fire("geocodesucceeded",{result:t})}),this.viewModel.on("searchfailed",e=>{let t="";t="searchGeocodeField"===e.searchType?_a.i18n("msg_searchGeocodeField"):"cityGeocodeField"===e.searchType?_a.i18n("msg_cityGeocodeField"):_a.i18n("msg_getFeatureField"),this.messageBox.showView(t),this._event.fire("searchfailed",{message:t})})},_prepareResultData(e){this.currentResult=e;let t=Math.ceil(e.length/this.perPageDataNum);this._resultDomObj.setPageLink(t),this._createResultListByPageNum(1,e),this._resultDomObj.showView(),this._resultDomObj.setLinkageEvent(function(e){s._createResultListByPageNum(e,s.currentResult)});const s=this},_createResultListByPageNum(e,t){let s,i=0;1===e&&t.lengtht.length?(i=this.perPageDataNum*(e-1),s=t.length-1):(i=this.perPageDataNum*(e-1),s=e*this.perPageDataNum-1);const r=document.createElement("div");for(let e=i;e<=s;e++){let s,i="Point";t[e].filterAttribute?(i=t[e].feature.geometry.type,s=t[e].filterAttribute):s=t[e].properties,r.appendChild(this._createResultItem(i,s))}this._resultDomObj.setContent(r),this._resultDomObj.showView(),r.firstChild.getElementsByClassName("component-search-result-icon")[0].classList.add("component-search__resultitme-selected");const n=r.firstChild.getElementsByClassName("component-search-result-info")[0].firstChild.innerText;!this._selectMarkerFeature&&this._linkageFeature(n)},_flyToBounds(e){const t=e.getSouthWest(),s=e.getNorthEast();t.lat===s.lat&&t.lng===s.lng?this.map.flyTo(t):this.map.fitBounds(e)},_linkageFeature(e){let t="";t=this.isSearchLayer?e.split(":")[1].trim():e,this._selectFeature&&this._selectFeature.addTo(this.map),this.searchResultLayer.eachLayer(e=>{(!t||e.filterAttribute&&e.filterAttribute.filterAttributeValue===t||e.feature.properties&&e.feature.properties.name===t)&&(e.remove(),this._setSelectedLayerStyle(e))})},clearSearchResult(){this.searchResultLayer&&(this.map.closePopup(),!this.isSearchLayer&&this.map.removeLayer(this.searchResultLayer),this._selectMarkerFeature&&this.map.removeLayer(this._selectMarkerFeature),this._selectFeaturethis&&this.map.removeLayer(this._selectFeature),this._selectMarkerFeature=null,this._selectFeature=null,this.searchResultLayer=null,this.currentResult=null)},_featureOnclickEvent(e,t){t.on("click",()=>{let s,i,r=document.getElementsByClassName("component-pagination__link")[0];this._resultDomObj._changePageEvent({target:r.children[0].children[0]}),this._selectFeature&&this._selectFeature.addTo(this.map),t.remove();for(let r=0;r1)for(let e=1;e0&&document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"),e.firstChild.classList.add("component-search__resultitme-selected"),this._setSelectedLayerStyle(t)}},this)},_setSelectedLayerStyle(e){let t;this._selectMarkerFeature&&this._selectMarkerFeature.remove(),this._selectMarkerFeature=null,this._selectFeature=e,this._selectMarkerFeature=Ua().geoJSON(e.toGeoJSON(),{pointToLayer:(e,t)=>Ua().marker(t,{icon:Ua().divIcon({className:"component-select-marker-icon",iconAnchor:[15,0]})}),style:{fillColor:"red",weight:1,opacity:1,color:"red",fillOpacity:.2}}).addTo(this.map),this._selectMarkerFeature.bindPopup(function(){return new Ia({attributes:e.feature.properties}).getElement()},{closeOnClick:!1}).openPopup().addTo(this.map),this._flyToBounds(this.searchResultLayer.getBounds()),e.getLatLng?t=e.getLatLng():e.getCenter&&(t=e.getCenter()),this.map.setView(t)}}),Up=Ua().Evented.extend({options:{_defaultLayerOptions:{style:null,onEachFeature:function(e,t){let s="属性信息如下:
";for(let t in e.properties)s+=t+": "+e.properties[t]+"
";t.bindPopup(s)}}},initialize(e,t=null){if(!e)return new Error("Cannot find map, fileModel.map cannot be null.");this.map=e,Ua().Util.extend(this.options._defaultLayerOptions,t),this.options._defaultLayerOptions.pointToLayer=this.options._defaultLayerOptions.style,this.popupsStatus=!0,this.dataFlowStatus=!1,this.dataFlowUrl="",this.currentFeatures=[],this.dataFlowLayer=null},subscribe(e){if(this.dataFlowUrl===e){if(this.dataFlowStatus)return void this.fire("dataflowservicesubscribed")}else this.dataFlowUrl=e;this.dataFlowStatus=!0,this.dataFlowLayer&&(this.dataFlowLayer.remove(),this.dataFlowLayer=null);const t=new Cc(e,this.options._defaultLayerOptions);t.on("subscribesucceeded",e=>{this.fire("subscribesucceeded",{result:e})}),t.on("subscribefailed",e=>{this.fire("subscribefailed",{result:e})}),t.on("dataupdated",e=>{this.fire("dataupdated",{result:e});let t=e.layer.getBounds(),s=_u.toSuperMapBounds(this.map.getBounds()),i=_u.toSuperMapBounds(t);s.intersectsBounds(i)||(i.left===i.right&&i.top===i.bottom?this.map.setView(t.getCenter()):this.map.flyToBounds(t)),this.popupsStatus&&this.openPopups()}),t.addTo(this.map),this.dataFlowLayer=t},cancelSubscribe(){this.dataFlowLayer&&(this.dataFlowStatus=!1,this.dataFlowLayer.dataService.unSubscribe(),this.dataFlowLayer.remove(),this.dataFlowLayer=null)},openPopups(){if(this.popupsStatus=!0,this.dataFlowLayer){const e=this.dataFlowLayer.getLayers();for(let t=0;t{n.value="",e.target.hidden=!0}),n.oninput=(()=>{a.hidden=!1}),r.appendChild(a),i.appendChild(r),s.appendChild(i);const o=document.createElement("div");o.setAttribute("class","component-dataflow__container");const l=document.createElement("div");l.setAttribute("class","component-checkbox-container");const h=document.createElement("div");h.setAttribute("class","component-checkbox-default component-checkbox-selected-img"),h.checked=!0,l.appendChild(h);const u=document.createElement("div");u.setAttribute("class","component-label component-label-selected"),u.innerHTML=_a.i18n("text_displayFeaturesInfo"),l.appendChild(u),h.onclick=(e=>{e.target.checked=!e.target.checked,e.target.checked?(u.setAttribute("class","component-label component-label-selected"),e.target.setAttribute("class","component-checkbox-default component-checkbox-selected-img"),this.viewModel.openPopups()):(u.setAttribute("class","component-label"),e.target.setAttribute("class","component-checkbox-default component-checkbox-default-img"),this.viewModel.closePopups())}),o.appendChild(l),s.appendChild(o);const c=document.createElement("div");c.setAttribute("class","component-dataflow__container component-init-center");const p=document.createElement("button");p.setAttribute("class","component-button-default"),p.innerHTML=_a.i18n("text_subscribe"),p.onclick=(()=>{const e=n.value;""!==e?this.viewModel.subscribe(e):this.messageBox.showView(_a.i18n("msg_inputDataFlowUrlFirst"))}),c.appendChild(p);const d=document.createElement("button");return d.setAttribute("class","component-button-default"),d.innerHTML=_a.i18n("text_cancelSubscribe"),d.onclick=(()=>{this.viewModel.cancelSubscribe()}),c.appendChild(d),s.appendChild(c),this.messageBox=new Sa,this.viewModel.on("dataflowservicesubscribed",()=>{this.messageBox.showView(_a.i18n("msg_dataflowservicesubscribed"))}),this.viewModel.on("subscribesucceeded",()=>{this.messageBox.showView(_a.i18n("msg_subscribesucceeded"))}),this.viewModel.on("dataupdated",e=>{this.messageBox.closeView(),this._event.fire("dataupdated",e)}),this._preventMapEvent(t,this.map),t}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class zp{constructor(e,t){this.layerName=e,this.layer=t}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Vp extends Ua().Evented{initialize(e){this.workerUrl=e,this.turfLayers=[]}getLayersData(e){let t={},s={},i={},r={};for(let t=0;t{if(0===s.data.features.length)n.fire("analysisfailed");else{n.fire("analysissucceeded",{data:s.data});let i=Ua().geoJSON(s.data,{style:{color:"#1060C2",weight:3},onEachFeature:function(e,t){e.properties&&t.bindPopup(new Ia(e.properties).getElement()),t.on({mouseover:function(){t.setStyle({color:"#ffffff",weight:5})},mouseout:function(){t.setStyle({color:"#1060C2",weight:3})},click:function(){t.setStyle({color:"#ffffff",weight:5})}})}}).addTo(t);n.turfLayers.push(i),n.fire("layerloaded",{layer:i,name:e.resultLayersName}),n.worker.terminate()}})}else if("buffer"===e.analysisMethod){let i=this,r={analysisMethod:"buffer",radius:e.radius,unit:e.unit,isSave:e.isSaveStatus,isUnion:e.isUnion,geoJson:s};this.worker.postMessage(r),this.worker.onmessage=(s=>{let r=Ua().geoJSON(s.data,{style:{color:"#ffffff",fillColor:"#1060C2",fillOpacity:.5,weight:1.5},onEachFeature:function(e,t){e.properties&&t.bindPopup(new Ia(e.properties).getElement()),t.on({mouseover:function(){t.setStyle({color:"#ffffff",fillColor:"rgb(46,40,79)",fillOpacity:.5,weight:5})},mouseout:function(){t.setStyle({color:"#ffffff",fillColor:"#1060C2",fillOpacity:.5,weight:1.5})},click:function(){t.setStyle({color:"#ffffff",fillColor:"rgb(46,40,79)",fillOpacity:.5,weight:2})}})}}).addTo(t);i.turfLayers.push(r),i.fire("layerloaded",{layer:r,name:e.resultLayersName}),i.worker.terminate()})}}clearLayers(){for(let e in this.turfLayers)this.turfLayers[e].clearLayers();this.fire("layersremoved",{layers:this.turfLayers})}cancelAnalysis(){this.worker.terminate()}}var Jp=Ip.extend({initialize:function(e,t){if(!e)throw new Error("workerUrl is required");this.workerUrl=e,Ip.prototype.initialize.apply(this,[t])},onAdd:function(e){return this.map=e,Ip.prototype.onAdd.apply(this,[e])},addLayer:function(e){this.layers=this.layers||[],this.layers.push(e);let t=this.viewModel.getLayersData(this.layers);this.fillDataToView(t)},fillDataToView:function(e){if(!e)return;this.fillData=e;let t={};switch(document.getElementById("dropDownTop").getAttribute("data-value")){case"isolines":case"buffer":t=e.point}if("{}"==JSON.stringify(t))return;let s=[];for(let e in t)s.push(e);let i=document.getElementById("layersSelect"),r=document.getElementById("layerSelectName");i.innerHTML="",r.title=s[0],r.innerHTML=s[0],this._createOptions(i,s),this.layerSelectObj.optionClickEvent(i,r,this.layersSelectOnchange);let n=t[r.title],a=n.fields,o=n.fieldsValue;this.currentData=n,this.currentFillData=t;let l=document.getElementById("fieldsSelect");l.innerHTML="";let h=document.getElementById("fieldsSelectName");h.innerHTML=a[0],h.title=a[0],this._createOptions(l,a),this.fieldsSelectObj.optionClickEvent(l,h,this.fieldsSelectOnchange);let u=h.title,c=document.getElementById("getValueTextArea");c.value=o[u].toString().replace(/,/g,",\r\n"),c.setAttribute("data-value",o[u]);let p=document.getElementById("resultLayersName");switch(document.getElementById("dropDownTop").getAttribute("data-value")){case"isolines":p.value=_a.i18n("text_label_isolines")+r.title;break;case"buffer":p.value=_a.i18n("text_label_buffer")+r.title}},_initView:function(){this.workerUrl&&(this.viewModel=new Vp(this.workerUrl));let e=new La({title:_a.i18n("title_clientComputing")}).getElement();e.classList.add("component-analysis"),e.children[0].style.fontSize="12px";let t=[{title:_a.i18n("text_isoline"),dataValue:"isolines",remark:_a.i18n("text_extractDiscreteValue"),icon:{className:"component-analyst-isoline-img"}},{title:_a.i18n("text_buffer"),dataValue:"buffer",remark:_a.i18n("text_specifyTheDistance"),icon:{className:"component-analyst-buffer-img"}}],s=e.children[1];s.classList.add("component-content--scroll"),s.classList.add("component-content--analysis");let i=new Pa(t).getElement();s.appendChild(i);let r=i.children[0].children[0],n=i.children[0].children[2].children[0];r.children[0].id="dropDownTop";let a=Ua().DomUtil.create("div","component-analysis__container",s),o=Ua().DomUtil.create("div","component-analysis__container__analysisLayer",a),l=Ua().DomUtil.create("div","component-analysis__selecttool",o);l.id="layerSelectControl";let h={optionsArr:[""],labelName:_a.i18n("text_label_analysisLayer")},u=new Oa(h),c=u.getElement();this.layerSelectObj=u,l.appendChild(c);let p=c.children[1].children[0];p.id="layerSelectName",c.children[1].children[2].children[0].children[0].id="layersSelect";let d=Ua().DomUtil.create("div","component-analysis__container__analysistype",a),f=Ua().DomUtil.create("div","component-clientcomputation__isoline",d),m={optionsArr:[""],labelName:_a.i18n("text_label_extractField"),optionsClickCb:this.fieldsSelectOnchange},y=Ua().DomUtil.create("div","component-analysis__selecttool",f),g=new Oa(m),v=g.getElement();this.fieldsSelectObj=g;let S=v.children[1].children[0];S.id="fieldsSelectName";let b=v.children[1].children[2].children[0].children[0];b.id="fieldsSelect",y.appendChild(v);let x=Ua().DomUtil.create("div","component-analysis__container",f);Ua().DomUtil.create("span","component-textarea__name",x).innerHTML=_a.i18n("text_label_extractedValue");let _=Ua().DomUtil.create("div","component-textarea",x);_.id="getValueText";let C=Ua().DomUtil.create("div","",_),w=Ua().DomUtil.create("div","component-scrollarea-content",C);w.setAttribute("tabindex","1");let M=Ua().DomUtil.create("textarea","component-textarea__content",w);M.id="getValueTextArea",M.setAttribute("rows","20");let A=Ua().DomUtil.create("div","",f);Ua().DomUtil.create("span","",A).innerHTML=_a.i18n("text_label_distanceAttenuation");let T=Ua().DomUtil.create("input","",A);T.value="3";let E=Ua().DomUtil.create("div","",f);Ua().DomUtil.create("span","",E).innerHTML=_a.i18n("text_label_gridSize");let L=Ua().DomUtil.create("input","",E);L.value="30";let O=Ua().DomUtil.create("div","component-clientcomputation__buffer hidden",d),P=Ua().DomUtil.create("div","component-clientcomputation__buffer--radius",O);Ua().DomUtil.create("span","",P).innerHTML=_a.i18n("text_label_bufferRadius");let N=Ua().DomUtil.create("div","",P),I=Ua().DomUtil.create("input","buffer-radius-input",N);I.id="bufferRadiusInput",I.value="10",I.setAttribute("placeholder",_a.i18n("text_label_defaultkilometers"));let F=Ua().DomUtil.create("div","component-clientcomputation__buffer--unit",N);F.id="bufferUnit";let D={optionsArr:[_a.i18n("text_option_kilometer")],labelName:_a.i18n("text_label_unit")},R=new Oa(D).getElement(),k=R.children[1].children[0];k.id="bufferUnitSelectName",R.children[1].children[2].children[0].children[0].id="bufferUnitSelect",R.children[0].style.display="none",F.appendChild(R);let B=Ua().DomUtil.create("div","",P),G=Ua().DomUtil.create("div","component-clientcomputation__buffer--issaveattrs",B);G.id="saveAttrsContainer";let U=Ua().DomUtil.create("div","checkbox checkbox-fault",G);U.id="saveAttrsCheckbox";let j=Ua().DomUtil.create("div","lable",G);j.id="saveAttrsLabel",j.innerHTML=_a.i18n("text_retainOriginal");let z=Ua().DomUtil.create("div","component-clientcomputation__buffer--isunion",B);z.id="isUnionContainer";let V=Ua().DomUtil.create("div","checkbox checkbox-fault",z);V.id="isUnionCheckbox";let J=Ua().DomUtil.create("div","lable",z);J.innerHTML=_a.i18n("text_mergeBuffer"),J.id="isUnionLabel";let q=Ua().DomUtil.create("div","component-analysis__container__resultLayersName",a);Ua().DomUtil.create("span","",q).innerHTML=_a.i18n("text_label_resultLayerName");let H=Ua().DomUtil.create("input","",q);H.id="resultLayersName";let W=Ua().DomUtil.create("div","component-analysis__container__analysisbtn",a),Y=Ua().DomUtil.create("div","component-analysis__analysisbtn",W),Q=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis",Y);Q.innerHTML=_a.i18n("btn_analyze");let X=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysing-container hidden",Y),K=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysising",X),Z=Ua().DomUtil.create("div","component-analysis__svg-container",K);Z.id="analyse_background",Z.innerHTML='\n \n \n \n \n ',Ua().DomUtil.create("span","",K).innerHTML=_a.i18n("btn_analyzing");let $=Ua().DomUtil.create("button","component-analysis__analysisbtn--cancel",X);$.innerHTML=_a.i18n("btn_cancelAnalysis");let ee=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",Y);ee.innerHTML=_a.i18n("btn_emptyTheAnalysisLayer");for(let e=0;e{r.innerHTML=n.children[e].outerHTML,r.children[0].id="dropDownTop";let t=document.getElementById("layersSelect"),i=document.getElementById("layerSelectName"),a=n.children[e].getAttribute("data-value"),o={};switch(a){case"buffer":f.classList.add("hidden"),O.classList.remove("hidden"),s.style.height="422px",H.value=_a.i18n("text_label_buffer")+i.title,o=this.fillData.point;break;case"isolines":f.classList.remove("hidden"),O.classList.add("hidden"),s.style.height="712px",H.value=_a.i18n("text_label_isolines")+i.title,o=this.fillData.point}if(this.currentFillData===o)return;if(t.innerHTML="","{}"==JSON.stringify(o))return H.value="",i.title="",void(i.innerHTML="");let l=[];for(let e in o)l.push(e);i.title=l[0],i.innerHTML=l[0],this._createOptions(t,l),this.layerSelectObj.optionClickEvent(t,i,this.layersSelectOnchange),"buffer"===a?H.value=_a.i18n("text_label_buffer")+l[0]:"isolines"===a&&(H.value=_a.i18n("text_label_isolines")+l[0]),this.currentData=o[i.title],this.currentFillData=o});this.fieldsSelectOnchange=function(e){if(this.currentData){let t=this.currentData,s=e.title;M.value=t.fieldsValue[s].toString().replace(/,/g,",\r\n"),M.setAttribute("data-value",t.fieldsValue[s])}}.bind(this),this.layersSelectOnchange=function(e){if(this.currentData){let t=e.title,s=this.currentFillData[t];this.currentData=s,b.innerHTML="",this._createOptions(b,s.fields);let i=document.getElementById("fieldsSelectName"),r=s.fields[0];i.title=r,i.innerHTML=r;let n=r;this.fieldsSelectObj.optionClickEvent(b,i,this.fieldsSelectOnchange),M.value=s.fieldsValue[n].toString().replace(/,/g,",\r\n"),M.setAttribute("data-value",s.fieldsValue[n]);let a=document.getElementById("dropDownTop").getAttribute("data-value");switch(a){case"buffer":H.value=_a.i18n("text_label_buffer")+t;break;case"isolines":H.value=_a.i18n("text_label_isolines")+t}}}.bind(this);let te=!0,se=!1;return j.classList.add("selected"),U.classList.add("checkbox-active"),G.onclick=(()=>{te?(U.classList.add("checkbox-fault"),U.classList.remove("checkbox-active"),j.classList.remove("selected"),te=!1):(U.classList.add("checkbox-active"),U.classList.remove("checkbox-fault"),j.classList.add("selected"),te=!0,se&&(V.classList.add("checkbox-fault"),V.classList.remove("checkbox-active"),se=!1))}),z.onclick=(()=>{se?(V.classList.add("checkbox-fault"),V.classList.remove("checkbox-active"),J.classList.remove("selected"),se=!1):(V.classList.add("checkbox-active"),V.classList.remove("checkbox-fault"),J.classList.add("selected"),se=!0,te&&(U.classList.add("checkbox-fault"),U.classList.remove("checkbox-active"),te=!1))}),this.messageBox=new Sa,Q.onclick=(()=>{let e;switch(X.style.display="block",Q.style.display="none",document.getElementById("dropDownTop").getAttribute("data-value")){case"isolines":e=function(){let e=document.getElementById("dropDownTop").getAttribute("data-value"),t=document.getElementById("resultLayersName").value,s=p.title,i=S.title,r=M.value.replace(/[\r\n]/g,"").split(",").toString(),n=T.value,a=L.value;return{analysisMethod:e,analysisLayers:s,analysisFields:i,analysisFieldsValue:r,analysisBreaks:n,analysisCellSize:a,resultLayersName:t}}();break;case"buffer":e=function(){let e=document.getElementById("dropDownTop"),t=document.getElementById("resultLayersName").value,s=p.title,i=e.getAttribute("data-value"),r=I.value,n=k.title;return{analysisMethod:i,analysisLayers:s,radius:r,unit:n,resultLayersName:t,isSaveStatus:te,isUnion:se}}()}this.viewModel.analysis(e,this.map),this.viewModel.on("layerloaded",e=>{X.style.display="none",Q.style.display="block",this._event.fire("analysissucceeded",{layer:e.layer,name:e.name})}),this.viewModel.on("analysisfailed",()=>{X.style.display="none",Q.style.display="block",this.messageBox.showView(_a.i18n("msg_resultIsEmpty"),"failure"),this._event.fire("analysisfailed")})}),$.onclick=(()=>{X.style.display="none",Q.style.display="block",this.viewModel.cancelAnalysis()}),ee.onclick=(()=>{this.viewModel.on("layersremoved",e=>{this._event.fire("layersremoved",{layers:e.layers})}),this.viewModel.clearLayers()}),this._preventMapEvent(e,this.map),e},_createOptions(e,t){for(let s in t){let i=document.createElement("div"),r=t[s];i.className="component-selecttool__option",i.title=r,i.innerHTML=r,i.setAttribute("data-value",r),e.appendChild(i)}}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class qp{constructor(e){this.layerName=e.layerName,this.layer=e.layer,this.fields=e.fields||null}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Hp extends Ua().Evented{initialize(e){this.processingUrl=e}getDatasetsName(){let e=this.processingUrl;this.dataset=[],this.dataset.datasetNames=[],this.dataset.childUrl=[];let t="http://"+e.split("/")[2],s=t+"/iserver/services/datacatalog/rest/datacatalog/sharefile.json",i=t+"/iserver/services/datacatalog/rest/datacatalog/relationship/datasets.json",r=this;Ue.get(s).then(function(e){return e.json()}).then(function(e){r.dataset.datasetNames=r.dataset.datasetNames.concat(e.datasetNames),r.dataset.childUrl=r.dataset.childUrl.concat(e.childUriList);let t=r;Ue.get(i).then(function(e){return e.json()}).then(function(e){t.dataset.datasetNames=t.dataset.datasetNames.concat(e.datasetNames),t.dataset.childUrl=t.dataset.childUrl.concat(e.childUriList);let s=[];for(let e in t.dataset.datasetNames)s[t.dataset.datasetNames[e]]=t.dataset.childUrl[e];t.fire("datasetsloaded",{result:{dataset:t.dataset,datasetHash:s}})})})}getDatasetInfo(e){let t,s=this;Ue.get(e).then(function(e){return e.json()}).then(function(e){let i=e.datasetInfo;"LINE"===i.datasetType||"LINE"===i.type?t="LINE":"POINT"===i.datasetType||"POINT"===i.type||"CSV"===i.type?t="POINT":"REGION"!==i.datasetType&&"REGION"!==i.type||(t="REGION");let r=[],n=i.fieldInfos||i.fieldInfo||null;if(n){for(let e in n)r.push(n[e].name);s.fire("datasetinfoloaded",{result:{type:t,fields:r}})}else{let i=e.childUriList[0].replace("//fields","/fields");Ue.get(i).then(function(e){return e.json()}).then(function(e){let i=e.fieldNames,r=[];for(let e in i)r.push(i[e]);s.fire("datasetinfoloaded",{result:{type:t,fields:r}})})}})}} +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +class Wp extends Ua().Evented{initialize(e){this.processingUrl=e}getDatasetsName(){let e=this.processingUrl;this.resultLayers=[],this.datasetNames=[],this.distributedAnalysisModel=new Hp(e),this.distributedAnalysisModel.getDatasetsName();let t=this;this.distributedAnalysisModel.on("datasetsloaded",function(e){t.fire("datasetsloaded",{result:e.result})})}getDatasetInfo(e){this.distributedAnalysisModel.getDatasetInfo(e);let t=this;this.distributedAnalysisModel.on("datasetinfoloaded",function(e){let s=e.result.type,i=e.result.fields;t.fire("datasetinfoloaded",{result:{type:s,fields:i}})})}analysis(e,t){let s=new Mp(this.processingUrl);if(e.analysisParam instanceof Pi){let i=e.analysisParam,r=this;s.addKernelDensityJob(i,function(s){s.error?r.fire("analysisfailed",{error:s.error}):s.result.setting.serviceInfo.targetServiceInfos.map(function(s){return"RESTMAP"===s.serviceType&&Ue.get(s.serviceAddress+"/maps").then(function(e){return e.json()}).then(function(s){let i=s[0].path;r.fire("analysissucceed",{result:s});let n=Ku(i,{noWrap:!0,transparent:!0});r.resultLayers.push(n),n.addTo(t);let a=new Date,o=e.resultLayerName||a.getTime();r.fire("layerloaded",{layer:n,name:o})}),s})})}}clearLayers(){for(let e in this.resultLayers)this.resultLayers[e].remove();this.fire("layersremoved",{layers:this.resultLayers}),this.resultLayers=[]}}var Yp=Ip.extend({initialize:function(e,t){Ip.prototype.initialize.apply(this,[t]),this.viewModel=new Wp(e)},onAdd:function(e){return this._fillDataToView(),Ip.prototype.onAdd.apply(this,[e])},_fillDataToView:function(){this.viewModel.on("datasetsloaded",e=>{let t=e.result.dataset.datasetNames;this.datasetSelect.innerHTML="",this._createOptions(this.datasetSelect,t),this.datasetSelectObj.optionClickEvent(this.datasetSelect,this.datasetSelectName,this.datasetSelectOnchange),this.dataHash=e.result.datasetHash}),this.viewModel.getDatasetsName()},_initView:function(){let e=new La({title:_a.i18n("title_distributedAnalysis")}).getElement();e.classList.add("component-analysis"),e.children[0].style.fontSize="12px";let t=Ua().DomUtil.create("div","component-content component-content--scroll component-content--analysis",e),s=[{title:_a.i18n("text_densityAnalysis"),dataValue:"density",remark:_a.i18n("text_CalculateTheValuePerUnitArea"),icon:{className:"component-analyst-density-img"}}],i=new Pa(s).getElement();t.appendChild(i);let r=i.children[0].children[0].children[0],n=Ua().DomUtil.create("div","component-analysis__container",t),a=Ua().DomUtil.create("div","analysistype",n),o=Ua().DomUtil.create("div","component-analysis__container__analysisLayer",a),l=Ua().DomUtil.create("div","component-analysis__selecttool",o),h={optionsArr:[_a.i18n("text_option_selectDataset")],labelName:_a.i18n("text_label_dataset"),optionsClickCb:te.bind(this)},u=new Oa(h),c=u.getElement();this.datasetSelectObj=u,l.appendChild(c);let p=c.children[1].children[0];this.datasetSelectName=p;let d=c.children[1].children[2].children[0].children[0];d.children[0].style.display="none",this.datasetSelect=d;let f=Ua().DomUtil.create("div","component-analysis__idw",o),m=[{optionsArr:[_a.i18n("text_option_simplePointDensityAnalysis"),_a.i18n("text_option_nuclearDensityAnalysis")],labelName:_a.i18n("text_label_analyticalMethod")},{optionsArr:[_a.i18n("text_option_quadrilateral"),_a.i18n("text_option_hexagon")],labelName:_a.i18n("text_label_meshType")}],y=Ua().DomUtil.create("div","component-analysis__idw__selecttool",f);for(let e in m){let t=new Oa(m[e]).getElement();y.appendChild(t)}let g={optionsArr:[_a.i18n("text_option_notSet")],labelName:_a.i18n("text_label_weightField")},v=new Oa(g),S=v.getElement();y.appendChild(S),this.weightFieldsSelectObj=v;let b=y.children[0].children[1].children[0];b.setAttribute("data-value","0");let x=y.children[0].children[1].children[2].children[0].children[0];this._setEleAtribute(["0","1"],"data-value",x.children);let _=y.children[1].children[1].children[0];_.setAttribute("data-value","0");let C=y.children[1].children[1].children[2].children[0].children[0];this._setEleAtribute(["0","1"],"data-value",C.children);let w=y.children[2].children[1].children[0],M=y.children[2].children[1].children[2].children[0].children[0],A=[{spanName:_a.i18n("text_label_queryRange"),value:""}];for(let e in A)this._creatInputBox(A[e],y);let T=y.children[3].children[1];T.setAttribute("placeholder",_a.i18n("text_label_queryRangeTips")),T.title=_a.i18n("text_label_queryRangeTips");let E={labelName:_a.i18n("text_label_gridSizeInMeters"),selectOptions:{optionsArr:["Meter","Kilometer","Yard","Foot","Mile"]}},L=this._creatUnitSelectBox(E,y),O=L.children[1].children[0];O.value="1000";let P=L.children[1].children[1].children[0].children[0].children[0],N={labelName:_a.i18n("text_label_searchRadius"),selectOptions:{optionsArr:["Meter","Kilometer","Yard","Foot","Mile"]}},I=this._creatUnitSelectBox(N,y),F=I.children[1].children[0];F.value="300";let D=I.children[1].children[1].children[0].children[0].children[0],R={labelName:_a.i18n("text_label_areaUnit"),optionsArr:["SquareMile","SquareMeter","Hectare","Acre","SquareFoot","SquareYard"]},k=new Oa(R).getElement();y.appendChild(k);let B=k.children[1].children[0],G=Ua().DomUtil.create("div","range-content",a),U={optionsArr:[_a.i18n("text_option_notSet"),_a.i18n("text_option_equidistantSegmentation"),_a.i18n("text_option_logarithm"),_a.i18n("text_option_equalCountingSegment"),_a.i18n("text_option_squareRootSegmentation")],labelName:_a.i18n("text_label_thematicMapSegmentationMode"),optionsClickCb:function(e){"NOTSET"!==e.getAttribute("data-value")?(V.classList.remove("hidden"),J.classList.remove("hidden")):(V.classList.add("hidden"),J.classList.add("hidden"))}};G.appendChild(new Oa(U).getElement());let j=G.children[0].children[1].children[0];j.setAttribute("data-value","NOTSET");let z=G.children[0].children[1].children[2].children[0].children[0];this._setEleAtribute(["NOTSET","EQUALINTERVAL","LOGARITHM","QUANTILE","SQUAREROOT"],"data-value",z.children);let V=this._creatInputBox({spanName:_a.i18n("text_label_thematicMapSegmentationParameters"),value:"20"},G);V.classList.add("hidden");let J=new Oa({optionsArr:[_a.i18n("text_option_greenOrangePurpleGradient"),_a.i18n("text_option_greenOrangeRedGradient"),_a.i18n("text_option_rainbowGradient"),_a.i18n("text_option_spectralGradient"),_a.i18n("text_option_terrainGradient")],labelName:_a.i18n("text_label_thematicMapColorGradientMode")}).getElement();G.appendChild(J),J.classList.add("hidden");let q=J.children[1].children[2].children[0].children[0],H=J.children[1].children[0];H.setAttribute("data-value","GREENORANGEVIOLET");this._setEleAtribute(["GREENORANGEVIOLET","GREENORANGERED","RAINBOW","SPECTRUM","TERRAIN"],"data-value",q.children);let W=Ua().DomUtil.create("div","",a);Ua().DomUtil.create("span","",W).innerHTML=_a.i18n("text_label_resultLayerName");let Y=Ua().DomUtil.create("input","component-distributeanalysis__input",W),Q=Ua().DomUtil.create("div","component-analysis__container__analysisbtn",n),X=Ua().DomUtil.create("div","component-analysis__analysisbtn",Q),K=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis",X);K.innerHTML=_a.i18n("btn_analyze");let Z=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysing-container hidden",X),$=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysising",Z);$.style.width="200px",Ua().DomUtil.create("div","component-analysis__svg-container",$).innerHTML='\n \n \n \n \n ',Ua().DomUtil.create("span","",$).innerHTML=_a.i18n("btn_analyzing");let ee=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",X);function te(e){if(this.messageBox.closeView(),this.dataHash){M.innerHTML="";let t=this.dataHash[e.title],s=this;this.viewModel.on("datasetinfoloaded",function(e){w.title=_a.i18n("text_option_notSet"),w.innerHTML=_a.i18n("text_option_notSet"),M.innerHTML="";let t=r.getAttribute("data-value"),i=e.result.type,n=e.result.fields;"density"===t&&("REGION"===i||"LINE"===i?s.messageBox.showView(_a.i18n("msg_datasetOrMethodUnsupport"),"failure"):(s.messageBox.closeView(),s._createOptions(M,n),s.weightFieldsSelectObj.optionClickEvent(M,w)))}),this.viewModel.getDatasetInfo(t)}}return ee.id="deleteLayersBtn",ee.innerHTML=_a.i18n("btn_emptyTheAnalysisLayer"),this.messageBox=new Sa,this.datasetSelectOnchange=te.bind(this),K.onclick=(()=>{this.messageBox.closeView();let e=function(){let e,t,s=r.getAttribute("data-value"),i=b.getAttribute("data-value"),n=_.getAttribute("data-value"),a=T.value,o=P.title,l=D.title,h=B.title,u=H.getAttribute("data-value"),c=j.getAttribute("data-value"),d=new Date,f=Y.value||d.getTime();e="NOTSET"===c?"":{rangeMode:c,rangeCount:V.value,colorGradientType:u};"density"===s&&(t=new Pi({datasetName:p.title,method:i,meshType:n,resolution:O.value,fields:w.title,radius:F.value,meshSizeUnit:o,radiusUnit:l,areaUnit:h,query:a,mappingParameters:new bt({rangeMode:e.rangeMode,rangeCount:e.rangeCount,colorGradientType:e.colorGradientType})}));return{analysisParam:t,resultLayerName:f}}();p.title===_a.i18n("text_option_selectDataset")?this.messageBox.showView(_a.i18n("msg_selectDataset"),"failure"):w.title===_a.i18n("text_option_notSet")?this.messageBox.showView(_a.i18n("msg_setTheWeightField"),"failure"):(this.messageBox.closeView(),Z.style.display="block",K.style.display="none",this.viewModel.on("layerloaded",e=>{Z.style.display="none",K.style.display="block",this._event.fire("analysissucceeded",{layer:e.layer,name:e.name})}),this.viewModel.on("analysisfailed",e=>{this.messageBox.showView(_a.i18n("msg_theFieldNotSupportAnalysis"),"failure"),Z.style.display="none",K.style.display="block",this._event.fire("analysisfailed",{error:e.error})}),this.viewModel.analysis(e,this.map))}),ee.onclick=(()=>{this.viewModel.on("layersremoved",e=>{this._event.fire("layersremoved",{layers:e.layers})}),this.viewModel.clearLayers()}),this._preventMapEvent(e,this.map),e},_createOptions(e,t){for(let s in t){let i=document.createElement("div");i.className="component-selecttool__option",i.title=t[s],i.innerHTML=t[s],i.setAttribute("data-value",t[s]),e.appendChild(i)}},_creatInputBox(e,t){let s=Ua().DomUtil.create("div","",t);Ua().DomUtil.create("span","",s).innerHTML=e.spanName;let i=Ua().DomUtil.create("input","",s);return i.value=e.value,i.className="component-distributeanalysis__input",s},_creatUnitSelectBox(e,t){let s=Ua().DomUtil.create("div","component-clientcomputation__buffer--radius",t);Ua().DomUtil.create("span","",s).innerHTML=e.labelName;let i=Ua().DomUtil.create("div","",s);Ua().DomUtil.create("input","buffer-radius-input",i);let r=Ua().DomUtil.create("div","component-clientcomputation__buffer--unit",i),n=e.selectOptions,a=new Oa(n).getElement();return r.appendChild(a),s},_setEleAtribute(e,t,s){for(let i=0;i1){let i={optionsArr:e,labelName:_a.i18n("text_label_queryMode"),optionsClickCb:this.queryModeltOnchange},r=new Oa(i).getElement();t.appendChild(r),s=r.children[1].children[0],r.children[1].classList.add("dataservice-select");let n=r.children[1];n.classList.add("dataservice-select"),n.classList.add("querymodel-select")}else{let t=Ua().DomUtil.create("span","",o);t.innerHTML=_a.i18n("text_label_queryMode"),s=Ua().DomUtil.create("div","component-servicequery__querymode-selectname",o);let i=Ua().DomUtil.create("span","",s);e instanceof Array?i.innerHTML=e[0]:i.innerHTML=e,s.title=i.innerHTML,this.queryModeltOnchange(s)}return s.id="queryModelSelectName",s}.bind(this),this.queryModeltOnchange=H.bind(this),this.creatQueryModeSelect(s,l);let h=Ua().DomUtil.create("div","component-analysis__container component-textarea--dataservice__container",n),u=Ua().DomUtil.create("span","textarea-name",h);u.innerHTML=_a.i18n("text_label_IDArrayOfFeatures");let c=Ua().DomUtil.create("div","component-textarea component-textarea--dataservice",h);c.id="getfeaturesIdArr";let p=Ua().DomUtil.create("div","scrollarea",c),d=Ua().DomUtil.create("div","component-scrollarea-content",p);d.setAttribute("tabindex","1");let f=Ua().DomUtil.create("textarea","component-textarea__content",d);f.value="[1,2,3]",f.id="getValueTextArea";let m=Ua().DomUtil.create("div","component-servicequery__maxfeatures-container hidden",n),y={spanName:_a.i18n("text_label_maxFeatures"),value:"1000"},g=this._creatInputBox(y,m).children[1];g.classList.add("max-features-input");let v=Ua().DomUtil.create("div","component-servicequery__distance-container hidden",n),S={spanName:_a.i18n("text_label_bufferDistance"),value:"10"},b=this._creatInputBox(S,v).children[1],x=Ua().DomUtil.create("div","component-analysis__container component-textarea--dataservice__container hidden",n),_=Ua().DomUtil.create("span","textarea-name",x),C=Ua().DomUtil.create("div","",x),w=Ua().DomUtil.create("div","component-servicequery__rangeicon-container",C);_.innerHTML=_a.i18n("text_label_queryRange1");let M=Ua().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-polygon-layer bounds",w),A=Ua().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-line-layer hidden",w),T=Ua().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-point-layer hidden",w),E=Ua().DomUtil.create("div","component-textarea component-textarea--rangequery",C);E.id="getfeaturesIdArr";let L=Ua().DomUtil.create("div","",E),O=Ua().DomUtil.create("div","component-scrollarea-content",L);O.setAttribute("tabindex","1");let P=Ua().DomUtil.create("textarea","component-textarea__content component-textarea--rangequery__content",O);P.value='{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}';let N=Ua().DomUtil.create("div","component-servicequery__spatialquerymode-container hidden",n),I={optionsArr:["CONTAIN","CROSS","DISJOINT","IDENTITY","INTERSECT","NONE","OVERLAP","TOUCH","WITHIN"],labelName:_a.i18n("text_label_spatialQueryMode")},F=Ua().DomUtil.create("div","component-analysis__selecttool",N),D=new Oa(I).getElement();D.children[1].classList.add("dataservice-select"),F.appendChild(D);let R=D.children[1].children[0];R.id="spatialQueryModeSelectName",D.children[1].children[2].classList.add("component-servicequery__spatialquerymode__selectcontent");let k=Ua().DomUtil.create("div","component-analysis__container__analysisbtn",n),B=Ua().DomUtil.create("div","component-analysis__analysisbtn",k),G=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis",B);G.innerHTML=_a.i18n("btn_query");let U=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysing-container hidden",B),j=Ua().DomUtil.create("div","component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying",U);Ua().DomUtil.create("div","component-analysis__svg-container",j).innerHTML='\n \n \n \n \n ',Ua().DomUtil.create("span","",j).innerHTML=_a.i18n("btn_querying");let z=Ua().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",B);z.innerHTML=_a.i18n("btn_emptyTheRresultLayer"),H(s[0]);let V,J,q=this;function H(e){let t;switch(t=e.title?e.title:e,m.classList.add("hidden"),x.classList.add("hidden"),v.classList.add("hidden"),A.classList.add("hidden"),T.classList.add("hidden"),M.classList.remove("bounds"),N.classList.add("hidden"),u.innerHTML=_a.i18n("text_label_featureFilter"),f.value="SMID<10","BUFFER"!==t&&"SPATIAL"!==t||(x.classList.remove("hidden"),_.innerHTML=_a.i18n("text_label_geometricObject"),P.value='{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[84.90234375,40.25390625]}}',A.classList.remove("hidden"),T.classList.remove("hidden")),t){case"ID":u.innerHTML=_a.i18n("text_label_IDArrayOfFeatures"),f.value="[1,2,3]";break;case"SQL":m.classList.remove("hidden");break;case"BOUNDS":x.classList.remove("hidden"),_.innerHTML=_a.i18n("text_label_queryRange"),P.value='{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}',M.classList.add("bounds");break;case"BUFFER":v.classList.remove("hidden");break;case"SPATIAL":N.classList.remove("hidden")}}return G.onclick=(()=>{this.messageBox.closeView(),U.style.display="block",G.style.display="none";let e=function(){let e,t=q.dataSetNames,s=document.getElementById("queryModelSelectName").title,i=f.value;if("ID"===s){let s=f.value,i=s.substring(1,s.length-1).split(",");e=new zs({IDs:i,datasetNames:t})}else if("SQL"===s){let s=g.value;e=new Js({queryParameter:{attributeFilter:i},datasetNames:t,maxFeatures:s})}else if("BOUNDS"===s){if(!V){let e=JSON.parse(P.value);V=Ua().bounds([e.leftBottom.x,e.leftBottom.y],[e.rightTop.x,e.rightTop.y])}e=new Ds({attributeFilter:i,datasetNames:t,bounds:V})}else if("BUFFER"===s){let s=b.value,r=JSON.parse(P.value),n=J||r;e=new Bs({attributeFilter:i,datasetNames:t,bufferDistance:s,geometry:n})}else if("SPATIAL"===s){let s=R.title,r=JSON.parse(P.value),n=J||r;e=new Us({attributeFilter:i,datasetNames:t,spatialQueryMode:s,geometry:n})}return e}();this.viewModel.on("getfeaturessucceeded",e=>{U.style.display="none",G.style.display="block",0===e.result.features.length&&this.messageBox.showView(_a.i18n("msg_dataReturnedIsEmpty"),"success"),this._event.fire("getfeaturessucceeded",{result:e.result})}),this.viewModel.on("getfeaturesfailed",e=>{U.style.display="none",G.style.display="block",this.messageBox.showView(e.error.errorMsg,"failure"),this._event.fire("getfeaturesfailed",{error:e.error})}),this.viewModel.getFeatures(e,this.map)}),M.onclick=(e=>{let t=document.getElementById("queryModelSelectName").title;J&&J.remove(),"BOUNDS"===t?this.map.pm.enableDraw("Rectangle"):this.map.pm.enableDraw("Poly"),e.stopPropagation(),e.preventDefault()}),A.onclick=(e=>{J&&J.remove(),this.map.pm.enableDraw("Line"),e.stopPropagation(),e.preventDefault()}),T.onclick=(e=>{J&&J.remove(),this.map.pm.enableDraw("Marker"),e.stopPropagation(),e.preventDefault()}),this.map.on("pm:create",e=>{if("Rectangle"===e.shape){let t=(J=e.layer).getBounds();V=Ua().bounds([t._southWest.lng,t._southWest.lat],[t._northEast.lng,t._northEast.lat]);let s={leftBottom:{x:t._southWest.lng,y:t._southWest.lat},rightTop:{x:t._northEast.lng,y:t._northEast.lat}};P.value=JSON.stringify(s)}"Marker"===e.shape&&(J=e.layer,P.value=JSON.stringify(e.layer.toGeoJSON()),this.map.pm.disableDraw("Marker")),"Line"===e.shape&&(J=e.layer,P.value=JSON.stringify(e.layer.toGeoJSON())),"Polygon"===e.shape&&(J=e.layer,P.value=JSON.stringify(e.layer.toGeoJSON()))}),z.onclick=(()=>{this.viewModel.clearLayers()}),this._preventMapEvent(e,this.map),e},_creatInputBox(e,t){let s=Ua().DomUtil.create("div","",t);return Ua().DomUtil.create("span","",s).innerHTML=e.spanName,Ua().DomUtil.create("input","",s).value=e.value,s}}); +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +Ua().supermap={...e,Components:{...e.Components},...Ua().supermap},Ua().supermap.components=Ua().supermap.components||{},Ua().supermap.Components=Ua().supermap.Components||{},Ua().supermap.control=Ua().supermap.control||{},Ua().supermap.Util={},Ua().Util.toGeoJSON=Fu,Ua().supermap.Util.toGeoJSON=Fu,Ua().Util.toSuperMapGeometry=Du,Ua().supermap.Util.toSuperMapGeometry=Du,Ua().Util.resolutionToScale=ku,Ua().supermap.Util.resolutionToScale=ku,Ua().Util.scaleToResolution=Bu,Ua().supermap.Util.scaleToResolution=Bu,Ua().Util.getMeterPerMapUnit=Ru,Ua().supermap.Util.getMeterPerMapUnit=Ru,Ua().Util.GetResolutionFromScaleDpi=Uu,Ua().supermap.Util.getResolutionFromScaleDpi=Uu,Ua().supermap.Util.GetResolutionFromScaleDpi=Uu,Ua().Util.NormalizeScale=Gu,Ua().supermap.Util.normalizeScale=Gu,Ua().supermap.Util.NormalizeScale=Gu,Ua().Util.transform=ju,Ua().supermap.Util.transform=ju,Ua().Proj=Ua().Proj||{},Ua().supermap.Proj=Ua().supermap.Proj||{},Ua().Proj.CRS=mu,Ua().supermap.Proj.crs=mu,Ua().supermap.Proj.CRS=fu,Ua().Projection={},Ua().supermap.Projection=Ua().supermap.Projection||{},Ua().Projection.NonProjection=Pu,Ua().supermap.Projection.nonProjection=Pu,Ua().supermap.Projection.NonProjection=Ou,Ua().supermap.CRS=Ua().supermap.CRS||{},Ua().CRS.NonEarthCRS=Iu,Ua().supermap.CRS.NonEarthCRS=Nu,Ua().supermap.CRS.nonEarthCRS=Iu,Ua().CRS.BaiduCRS=Cu,Ua().supermap.CRS.BaiduCRS=Cu,Ua().CRS.TianDiTu_WGS84CRS=Mu,Ua().supermap.CRS.TianDiTu_WGS84CRS=Mu,Ua().CRS.TianDiTu_MercatorCRS=Lu,Ua().supermap.CRS.TianDiTu_MercatorCRS=Lu,Ua().CRS.TianDiTu_Mercator=Lu,Ua().supermap.CRS.TianDiTu_Mercator=Lu,Ua().CRS.TianDiTu_WGS84=Mu,Ua().supermap.CRS.TianDiTu_WGS84=Mu,Ua().CRS.Baidu=Cu,Ua().supermap.CRS.Baidu=Cu,Ua().supermap.CommontypesConversion=_u,Ua().supermap.components.clientComputationLayer=function(e){return new qp(e)},Ua().supermap.Components.ClientComputationLayer=qp,Ua().supermap.components.clientComputation=function(e){return new Jp(e)},Ua().supermap.Components.ClientComputation=Jp,Ua().supermap.components.clientComputationViewModel=function(e){return new Vp(e)},Ua().supermap.Components.ClientComputationViewModel=Vp,Ua().supermap.components.geoJSONLayerWithName=function(e,t){return new zp(e,t)},Ua().supermap.Components.GeoJSONLayerWithName=zp,Ua().supermap.components.GeoJsonLayersDataModel=Rp,Ua().supermap.Components.GeoJsonLayersDataModel=Rp,Ua().supermap.components.dataFlow=function(e){return new jp(e)},Ua().supermap.Components.DataFlow=jp,Ua().supermap.components.dataFlowViewModel=function(e){return new Up(e)},Ua().supermap.Components.DataFlowViewModel=Up,Ua().supermap.components.dataServiceQuery=function(e,t,s){return new Kp(e,t,s)},Ua().supermap.Components.DataServiceQuery=Kp,Ua().supermap.components.dataServiceQueryViewModel=Xp,Ua().supermap.Components.DataServiceQueryViewModel=Qp,Ua().supermap.components.DistributedAnalysisModel=Hp,Ua().supermap.Components.DistributedAnalysisModel=Hp,Ua().supermap.components.distributedAnalysis=function(e){return new Yp(e)},Ua().supermap.Components.DistributedAnalysis=Yp,Ua().supermap.components.distributedAnalysisViewModel=function(e){return new Wp(e)},Ua().supermap.Components.DistributedAnalysisViewModel=Wp,Ua().supermap.components.openFile=function(e){return new Dp(e)},Ua().supermap.Components.OpenFile=Dp,Ua().supermap.components.openFileViewModel=function(e){return new Fp(e)},Ua().supermap.Components.OpenFileViewModel=Fp,Ua().supermap.components.search=function(e){return new Gp(e)},Ua().supermap.Components.Search=Gp,Ua().supermap.components.searchViewModel=function(e){return new Bp(e)},Ua().supermap.Components.SearchViewModel=Bp,Ua().supermap.components.componentsViewBase=function(e){return new Ip(e)},Ua().supermap.Components.ComponentsViewBase=Ip,Ua().supermap.control.changeTileVersion=function(e){return new Su(e)},Ua().supermap.control.ChangeTileVersion=Su,Ua().supermap.control.logo=function(e){return new bu(e)},Ua().supermap.control.Logo=bu,Ua().supermap.baiduTileLayer=Vu,Ua().supermap.BaiduTileLayer=zu,Ua().supermap.cloudTileLayer=qu,Ua().supermap.CloudTileLayer=Ju,Ua().supermap.imageMapLayer=function(e,t){return new Hu(e,t)},Ua().supermap.ImageMapLayer=Hu,Ua().supermap.imageTileLayer=function(e,t){return new yc(e,t)},Ua().supermap.ImageTileLayer=yc,Ua().supermap.tiandituTileLayer=function(e){return new Qu(e)},Ua().supermap.TiandituTileLayer=Qu,Ua().supermap.tiledMapLayer=Ku,Ua().supermap.TiledMapLayer=Xu,Ua().supermap.wmtsLayer=Yu,Ua().supermap.WMTSLayer=Wu,Ua().supermap.webmap=function(e,t){return new mc(e,t)},Ua().supermap.WebMap=mc,Ua().supermap.CartoCSSToLeaflet=rc,Ua().supermap.DefaultStyle=ec,Ua().supermap.CartoStyleMap=tc,Ua().supermap.ServerStyleMap=sc,Ua().supermap.CompOpMap=ic,Ua().supermap.circleStyle=function(e){return new Ec(e)},Ua().supermap.CircleStyle=Ec,Ua().supermap.cloverStyle=function(e){return new Tc(e)},Ua().supermap.CloverStyle=Tc,Ua().supermap.graphic=function(e){return new nc(e)},Ua().supermap.Graphic=nc,Ua().supermap.imageStyle=function(e){return new Lc(e)},Ua().supermap.ImageStyle=Lc,Ua().supermap.themeFeature=function(e,t){return new ac(e,t)},Ua().supermap.ThemeFeature=ac,Ua().supermap.dataFlowLayer=function(e,t){return new Cc(e,t)},Ua().supermap.DataFlowLayer=Cc,Ua().supermap.echartsLayer=function(e,t){return new wc(e,t)},Ua().supermap.EchartsLayer=wc,Ua().supermap.graphicLayer=function(e,t){return new Gc(e,t)},Ua().supermap.GraphicLayer=Gc,Ua().supermap.graphThemeLayer=function(e,t,s){return new Uc(e,t,s)},Ua().supermap.GraphThemeLayer=Uc,Ua().supermap.heatMapFeature=function(e,t){return new pp(e,t)},Ua().supermap.HeatMapFeature=pp,Ua().supermap.heatMapLayer=function(e,t){return new dp(e,t)},Ua().supermap.HeatMapLayer=dp,Ua().supermap.labelThemeLayer=function(e,t){return new cc(e,t)},Ua().supermap.LabelThemeLayer=cc,Ua().supermap.mapVLayer=function(e,t,s){return new bc(e,t,s)},Ua().supermap.MapVLayer=bc,Ua().supermap.rangeThemeLayer=function(e,t){return new uc(e,t)},Ua().supermap.RangeThemeLayer=uc,Ua().supermap.rankSymbolThemeLayer=function(e,t,s){return new jc(e,t,s)},Ua().supermap.RankSymbolThemeLayer=jc,Ua().supermap.tiledVectorLayer=function(e,t){return new hp(e,t)},Ua().supermap.TileVectorLayer=hp,Ua().supermap.TiledVectorLayer=hp,Ua().supermap.turfLayer=function(e){return new cp(e)},Ua().supermap.TurfLayer=cp,Ua().supermap.unicodeMarker=function(e,t){return new fc(e,t)},Ua().supermap.UnicodeMarker=fc,Ua().supermap.uniqueThemeLayer=function(e,t){return new hc(e,t)},Ua().supermap.UniqueThemeLayer=hc,Ua().supermap.VectorTileFormat=ap,Ua().supermap.addressMatchService=function(e,t){return new fp(e,t)},Ua().supermap.AddressMatchService=fp,Ua().supermap.chartService=function(e,t){return new mp(e,t)},Ua().supermap.ChartService=mp,Ua().supermap.dataFlowService=function(e,t){return new gc(e,t)},Ua().supermap.DataFlowService=gc,Ua().supermap.datasetService=function(e,t){return new yp(e,t)},Ua().supermap.DatasetService=yp,Ua().supermap.datasourceService=function(e,t){return new gp(e,t)},Ua().supermap.DatasourceService=gp,Ua().supermap.featureService=dc,Ua().supermap.FeatureService=pc,Ua().supermap.fieldService=function(e,t){return new vp(e,t)},Ua().supermap.FieldService=vp,Ua().supermap.geoprocessingService=function(e,t){return new bp(e,t)},Ua().supermap.GeoprocessingService=bp,Ua().supermap.gridCellInfosService=function(e,t){return new Sp(e,t)},Ua().supermap.GridCellInfosService=Sp,Ua().supermap.imageCollectionService=function(e,t){return new Np(e,t)},Ua().supermap.ImageCollectionService=Np,Ua().supermap.imageService=function(e,t){return new Pp(e,t)},Ua().supermap.ImageService=Pp,Ua().supermap.layerInfoService=function(e,t){return new xp(e,t)},Ua().supermap.LayerInfoService=xp,Ua().supermap.mapService=function(e,t){return new vu(e,t)},Ua().supermap.MapService=vu,Ua().supermap.measureService=function(e,t){return new _p(e,t)},Ua().supermap.MeasureService=_p,Ua().supermap.networkAnalyst3DService=function(e,t){return new Cp(e,t)},Ua().supermap.NetworkAnalyst3DService=Cp,Ua().supermap.networkAnalystService=function(e,t){return new wp(e,t)},Ua().supermap.NetworkAnalystService=wp,Ua().supermap.processingService=function(e,t){return new Mp(e,t)},Ua().supermap.ProcessingService=Mp,Ua().supermap.queryService=function(e,t){return new Ap(e,t)},Ua().supermap.QueryService=Ap,Ua().supermap.ServiceBase=gu,Ua().supermap.spatialAnalystService=function(e,t){return new Tp(e,t)},Ua().supermap.SpatialAnalystService=Tp,Ua().supermap.themeService=function(e,t){return new Ep(e,t)},Ua().supermap.ThemeService=Ep,Ua().supermap.trafficTransferAnalystService=function(e,t){return new Lp(e,t)},Ua().supermap.TrafficTransferAnalystService=Lp,Ua().supermap.webPrintingJobService=function(e,t){return new Op(e,t)},Ua().supermap.WebPrintingJobService=Op,Ua().supermap.CommonUtil=ee})(),(()=>{"use strict"; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/})()})(); \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.css b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.css new file mode 100644 index 00000000..bff4c63f --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.css @@ -0,0 +1,2772 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */ + +@font-face {font-family: "supermapol-icons"; + src: url(data:application/vnd.ms-fontobject;base64,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AAAAPwAA5nwAAOZ8AAAAQAAA5n0AAOZ9AAAAQQAA5n4AAOZ+AAAAQgAA5n8AAOZ/AAAAQwAA5oAAAOaAAAAARAAA5oEAAOaBAAAARQAA5oIAAOaCAAAARgAA5oMAAOaDAAAARwAA5oQAAOaEAAAASAAA5oUAAOaFAAAASQAA5oYAAOaGAAAASgAA5ocAAOaHAAAASwAA5ogAAOaIAAAATAAA5okAAOaJAAAATQAA5ooAAOaKAAAATgAA5osAAOaLAAAATwAA5owAAOaMAAAAUAAA5o0AAOaNAAAAUQAA5o4AAOaOAAAAUgAA5o8AAOaPAAAAUwAA5pAAAOaQAAAAVAAA5pEAAOaRAAAAVQAA5pIAAOaSAAAAVgAA5pMAAOaTAAAAVwAA5pQAAOaUAAAAWAAA5pUAAOaVAAAAWQAA5pYAAOaWAAAAWgAA5pcAAOaXAAAAWwAA5pgAAOaYAAAAXAAA5pkAAOaZAAAAXQAA5poAAOaaAAAAXgAA5psAAOabAAAAXwAA5pwAAOacAAAAYAAA5p0AAOadAAAAYQAA5p4AAOaeAAAAYgAA5p8AAOafAAAAZQAA5qAAAOagAAAAYwAA5qEAAOahAAAAZAAA5qIAAOaiAAAAZgAA5qMAAOajAAAAZwAA5qQAAOakAAAAaAAA5qUAAOalAAAAaQAA5qYAAOamAAAAagAA5qcAAOanAAAAawAA5qgAAOaoAAAAbAAA5qkAAOapAAAAbQAA5qoAAOaqAAAAbgAA5qsAAOarAAAAbwAA5qwAAOasAAAAcAAA5q0AAOatAAAAcQAA5q4AAOauAAAAcgAA5q8AAOavAAAAcwAA5rAAAOawAAAAdAAA5rEAAOaxAAAAdQAA5rIAAOayAAAAdgAA5rMAAOazAAAAdwAA5rQAAOa0AAAAeAAA5rUAAOa1AAAAeQAA5rYAAOa2AAAAegAA5rcAAOa3AAAAewAA5rgAAOa4AAAAfAAA5rkAAOa5AAAAfQAA5roAAOa6AAAAfgAA5rsAAOa7AAAAfwAA5rwAAOa8AAAAgAAA5r0AAOa9AAAAgQAA5r4AAOa+AAAAggAA5r8AAOa/AAAAgwAA5sAAAObAAAAAhAAA5sEAAObBAAAAhQAA5sIAAObCAAAAhgAA5sMAAObDAAAAhwAA5sQAAObEAAAAiAAA5sUAAObFAAAAiQAA5sYAAObG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dABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUABG1vcmUGZGVsZXRlB3Zpc2libGUHem9vbS10bwZvdXRwdXQHb3BhY2l0eQpsYXllci1pbmZvBHNhdmULbGF5ZXItc3R5bGUKbGluZS1sYXllcgRza2luDG1hcmtlci1sYXllcgtwb2ludC1sYXllcg1wb2x5Z29uLWxheWVyCWludmlzaWJsZQZzZWFyY2gEZWRpdAZsYXllcnMJYmFzZWxheWVyB3NldHRpbmcDYWRkB3ByZXZpZXcHcmVmcmVzaA5zb2xpZC10cmlhbmdsZQtyb2FkbmV0d29yawZyZXR1cm4GcGFja3VwBXNoYXJlDGJhY2tob21lcGFnZQZNeU1hcHMJQ3JlYXRlTWFwCGZlZWRiYWNrBXNraW4xBlNoYXBlLQdhY2NvdW50B1NoYXBlLTEHU2hhcGUtMgdTaGFwZS0zB1NoYXBlLTQHU2hhcGUtNQdTaGFwZS02B1NoYXBlLTcHU2hhcGUtOAdTaGFwZS05CFNoYXBlLTEwCFNoYXBlLTExCFNoYXBlLTEyCFNoYXBlLTEzCFNoYXBlLTE0CFNoYXBlLTE1CFNoYXBlLTE2CFNoYXBlLTE3CFNoYXBlLTE4CFNoYXBlLTE5CFNoYXBlLTIwCFNoYXBlLTIxCFNoYXBlLTIyCFNoYXBlLTIzCFNoYXBlLTI0CFNoYXBlLTI1CFNoYXBlLTI2CFNoYXBlLTI3CFNoYXBlLTI4CFNoYXBlLTI5CFNoYXBlLTMwCFNoYXBlLTMxCFNoYXBlLTMyCFNoYXBlLTMzCFNoYXBlLTM0CFNoYXBlLTM1CFNoYXBlLTM2CFNoYXBlLTM3CFNoYXBlLTM4CFNoYXBlLTM5CFNoYXBlLTQwCFNoYXBlLTQxCFNoYXBlLTQyCFNoYXBlLTQzCFNoYXBlLTQ0CFNoYXBlLTQ1CFNoYXBlLTQ2CFNoYXBlLTQ3CFNoYXBlLTQ4CFNoYXBlLTQ5CFNoYXBlLTUwCFNoYXBlLTUxCFNoYXBlLTUyCFNoYXBlLTUzCFNoYXBlLTU0CFNoYXBlLTU1CFNoYXBlLTU2CFNoYXBlLTU3CFNoYXBlLTU4CFNoYXBlLTU5BE92YWwJUmVjdGFuZ2xlBFN0YXIIVHJpYW5nbGUOcmVzdG9yZWRlZmF1bHQJdXBsb2FkaW5nBWVycm9yBnpvb21pbgd6b29tb3V0BWZpcnN0BG5leHQEbGFzdARwcmV2CHBvaS1sb2FkCHBvaS1zYXZlBGZvbGQMbGFiZWwtZGVsZXRlBnVwbG9hZAZ1bmZvbGQFY2xvc2UEbWFyawd0cmFmZmljC2Z1bGwtZmlndXJlB21lYXN1cmUMZGlzcGxheS1saXN0CWhpZGUtbGlzdAZyZW5hbWUEY29weQdxcS16b25lCnNpbmEtd2VpYm8MY29sb3ItY2hhbmdlEGNyZWF0LWN1c3RvbS1tYXAKY3VzdG9tLW1hcAtsZWdlbmQtZm9sZA1sZWdlbmQtdW5mb2xkCmxlZ2VuZC1iaWcJYXR0cmlidXRlDGxlZ2VuZC1zbWFsbAxjbG9zZS1sZWdlbmQKZm9udC1jb2xvcgRib2xkB2l0YWxpY3MEZm9udA1qdXN0aWZ5LWFsaWduD21pZGRsZS1hbGlnbm1lbglmb250LXNpemUJc3RyaWtlb3V0CnRleHQtbGF5ZXIPcmlnaHQtYWxpZ25tZW50DmxlZnQtYWxpZ25tZW50FHRyYW5zcGFyZW50LWJhY2tncm91CXVuZGVybGluZQVxdWVyeQAAAAA=); /* IE9*/ + src: url(data:application/vnd.ms-fontobject;base64,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AAAAPwAA5nwAAOZ8AAAAQAAA5n0AAOZ9AAAAQQAA5n4AAOZ+AAAAQgAA5n8AAOZ/AAAAQwAA5oAAAOaAAAAARAAA5oEAAOaBAAAARQAA5oIAAOaCAAAARgAA5oMAAOaDAAAARwAA5oQAAOaEAAAASAAA5oUAAOaFAAAASQAA5oYAAOaGAAAASgAA5ocAAOaHAAAASwAA5ogAAOaIAAAATAAA5okAAOaJAAAATQAA5ooAAOaKAAAATgAA5osAAOaLAAAATwAA5owAAOaMAAAAUAAA5o0AAOaNAAAAUQAA5o4AAOaOAAAAUgAA5o8AAOaPAAAAUwAA5pAAAOaQAAAAVAAA5pEAAOaRAAAAVQAA5pIAAOaSAAAAVgAA5pMAAOaTAAAAVwAA5pQAAOaUAAAAWAAA5pUAAOaVAAAAWQAA5pYAAOaWAAAAWgAA5pcAAOaXAAAAWwAA5pgAAOaYAAAAXAAA5pkAAOaZAAAAXQAA5poAAOaaAAAAXgAA5psAAOabAAAAXwAA5pwAAOacAAAAYAAA5p0AAOadAAAAYQAA5p4AAOaeAAAAYgAA5p8AAOafAAAAZQAA5qAAAOagAAAAYwAA5qEAAOahAAAAZAAA5qIAAOaiAAAAZgAA5qMAAOajAAAAZwAA5qQAAOakAAAAaAAA5qUAAOalAAAAaQAA5qYAAOamAAAAagAA5qcAAOanAAAAawAA5qgAAOaoAAAAbAAA5qkAAOapAAAAbQAA5qoAAOaqAAAAbgAA5qsAAOarAAAAbwAA5qwAAOasAAAAcAAA5q0AAOatAAAAcQAA5q4AAOauAAAAcgAA5q8AAOavAAAAcwAA5rAAAOawAAAAdAAA5rEAAOaxAAAAdQAA5rIAAOayAAAAdgAA5rMAAOazAAAAdwAA5rQAAOa0AAAAeAAA5rUAAOa1AAAAeQAA5rYAAOa2AAAAegAA5rcAAOa3AAAAewAA5rgAAOa4AAAAfAAA5rkAAOa5AAAAfQAA5roAAOa6AAAAfgAA5rsAAOa7AAAAfwAA5rwAAOa8AAAAgAAA5r0AAOa9AAAAgQAA5r4AAOa+AAAAggAA5r8AAOa/AAAAgwAA5sAAAObAAAAAhAAA5sEAAObBAAAAhQAA5sIAAObCAAAAhgAA5sMAAObDAAAAhwAA5sQAAObEAAAAiAAA5sUAAObFAAAAiQAA5sYAAObG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dABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUABG1vcmUGZGVsZXRlB3Zpc2libGUHem9vbS10bwZvdXRwdXQHb3BhY2l0eQpsYXllci1pbmZvBHNhdmULbGF5ZXItc3R5bGUKbGluZS1sYXllcgRza2luDG1hcmtlci1sYXllcgtwb2ludC1sYXllcg1wb2x5Z29uLWxheWVyCWludmlzaWJsZQZzZWFyY2gEZWRpdAZsYXllcnMJYmFzZWxheWVyB3NldHRpbmcDYWRkB3ByZXZpZXcHcmVmcmVzaA5zb2xpZC10cmlhbmdsZQtyb2FkbmV0d29yawZyZXR1cm4GcGFja3VwBXNoYXJlDGJhY2tob21lcGFnZQZNeU1hcHMJQ3JlYXRlTWFwCGZlZWRiYWNrBXNraW4xBlNoYXBlLQdhY2NvdW50B1NoYXBlLTEHU2hhcGUtMgdTaGFwZS0zB1NoYXBlLTQHU2hhcGUtNQdTaGFwZS02B1NoYXBlLTcHU2hhcGUtOAdTaGFwZS05CFNoYXBlLTEwCFNoYXBlLTExCFNoYXBlLTEyCFNoYXBlLTEzCFNoYXBlLTE0CFNoYXBlLTE1CFNoYXBlLTE2CFNoYXBlLTE3CFNoYXBlLTE4CFNoYXBlLTE5CFNoYXBlLTIwCFNoYXBlLTIxCFNoYXBlLTIyCFNoYXBlLTIzCFNoYXBlLTI0CFNoYXBlLTI1CFNoYXBlLTI2CFNoYXBlLTI3CFNoYXBlLTI4CFNoYXBlLTI5CFNoYXBlLTMwCFNoYXBlLTMxCFNoYXBlLTMyCFNoYXBlLTMzCFNoYXBlLTM0CFNoYXBlLTM1CFNoYXBlLTM2CFNoYXBlLTM3CFNoYXBlLTM4CFNoYXBlLTM5CFNoYXBlLTQwCFNoYXBlLTQxCFNoYXBlLTQyCFNoYXBlLTQzCFNoYXBlLTQ0CFNoYXBlLTQ1CFNoYXBlLTQ2CFNoYXBlLTQ3CFNoYXBlLTQ4CFNoYXBlLTQ5CFNoYXBlLTUwCFNoYXBlLTUxCFNoYXBlLTUyCFNoYXBlLTUzCFNoYXBlLTU0CFNoYXBlLTU1CFNoYXBlLTU2CFNoYXBlLTU3CFNoYXBlLTU4CFNoYXBlLTU5BE92YWwJUmVjdGFuZ2xlBFN0YXIIVHJpYW5nbGUOcmVzdG9yZWRlZmF1bHQJdXBsb2FkaW5nBWVycm9yBnpvb21pbgd6b29tb3V0BWZpcnN0BG5leHQEbGFzdARwcmV2CHBvaS1sb2FkCHBvaS1zYXZlBGZvbGQMbGFiZWwtZGVsZXRlBnVwbG9hZAZ1bmZvbGQFY2xvc2UEbWFyawd0cmFmZmljC2Z1bGwtZmlndXJlB21lYXN1cmUMZGlzcGxheS1saXN0CWhpZGUtbGlzdAZyZW5hbWUEY29weQdxcS16b25lCnNpbmEtd2VpYm8MY29sb3ItY2hhbmdlEGNyZWF0LWN1c3RvbS1tYXAKY3VzdG9tLW1hcAtsZWdlbmQtZm9sZA1sZWdlbmQtdW5mb2xkCmxlZ2VuZC1iaWcJYXR0cmlidXRlDGxlZ2VuZC1zbWFsbAxjbG9zZS1sZWdlbmQKZm9udC1jb2xvcgRib2xkB2l0YWxpY3MEZm9udA1qdXN0aWZ5LWFsaWduD21pZGRsZS1hbGlnbm1lbglmb250LXNpemUJc3RyaWtlb3V0CnRleHQtbGF5ZXIPcmlnaHQtYWxpZ25tZW50DmxlZnQtYWxpZ25tZW50FHRyYW5zcGFyZW50LWJhY2tncm91CXVuZGVybGluZQVxdWVyeQAAAAA=#iefix) format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url(data:font/ttf;base64,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AADmIgAAAAUAAOYlAADmJQAAAAYAAOYnAADmJwAAAAcAAOYoAADmKAAAAAgAAOYpAADmKQAAAAkAAOYqAADmKgAAAAoAAOYrAADmKwAAAAsAAOYsAADmLAAAAAwAAOYtAADmLQAAAA0AAOYuAADmLgAAAA4AAOYvAADmLwAAAA8AAOYwAADmMAAAABAAAOYzAADmMwAAABEAAOY0AADmNAAAABIAAOY1AADmNQAAABMAAOY2AADmNgAAABQAAOY3AADmNwAAABYAAOY4AADmOAAAABUAAOY5AADmOQAAABcAAOY6AADmOgAAABgAAOY7AADmOwAAABkAAOY8AADmPAAAABoAAOY9AADmPQAAABsAAOY+AADmPgAAABwAAOZZAADmWQAAAB0AAOZaAADmWgAAAB4AAOZbAADmWwAAAB8AAOZcAADmXAAAACAAAOZdAADmXQAAACEAAOZeAADmXgAAACIAAOZfAADmXwAAACMAAOZgAADmYAAAACQAAOZhAADmYQAAACUAAOZiAADmYgAAACYAAOZjAADmYwAAACcAAOZkAADmZAAAACgAAOZlAADmZQAAACkAAOZmAADmZgAAACoAAOZnAADmZwAAACsAAOZoAADmaAAAACwAAOZpAADmaQAAAC0AAOZqAADmagAAAC4AAOZrAADmawAAAC8AAOZsAADmbAAAADAAAOZtAADmbQAAADEAAOZuAADmbgAAADIAAOZvAADmbwAAADMAAOZwAADmcAAAADQAAOZxAADmcQAAADUAAOZyAADmcgAAADYAAOZzAADmcwAAADcAAOZ0AADmdAAAADgAAOZ1AADmdQAAADkAAOZ2AADmdgAAADoAAOZ3AADmdwAAADsAAOZ4AADmeAAAADwAAOZ5AADmeQAAAD0AAOZ6AADmegAAAD4AAOZ7AADmewAAAD8AAOZ8AADmfAAAAEAAAOZ9AADmfQAAAEEAAOZ+AADmfgAAAEIAAOZ/AADmfwAAAEMAAOaAAADmgAAAAEQAAOaBAADmgQAAAEUAAOaCAADmggAAAEYAAOaDAADmgwAAAEcAAOaEAADmhAAAAEgAAOaFAADmhQAAAEkAAOaGAADmhgAAAEoAAOaHAADmhwAAAEsAAOaIAADmiAAAAEwAAOaJAADmiQAAAE0AAOaKAADmigAAAE4AAOaLAADmiwAAAE8AAOaMAADmjAAAAFAAAOaNAADmjQAAAFEAAOaOAADmjgAAAFIAAOaPAADmjwAAAFMAAOaQAADmkAAAAFQAAOaRAADmkQAAAFUAAOaSAADmkgAAAFYAAOaTAADmkwAAAFcAAOaUAADmlAAAAFgAAOaVAADmlQAAAFkAAOaWAADmlgAAAFoAAOaXAADmlwAAAFsAAOaYAADmmAAAAFwAAOaZAADmmQAAAF0AAOaaAADmmgAAAF4AAOabAADmmwAAAF8AAOacAADmnAAAAGAAAOadAADmnQAAAGEAAOaeAADmngAAAGIAAOafAADmnwAAAGUAAOagAADmoAAAAGMAAOahAADmoQAAAGQAAOaiAADmogAAAGYAAOajAADmowAAAGcAAOakAADmpAAAAGgAAOalAADmpQAAAGkAAOamAADmpgAAAGoAAOanAADmpwAAAGsAAOaoAADmqAAAAGwAAOapAADmqQAAAG0AAOaqAADmqgAAAG4AAOarAADmqwAAAG8AAOasAADmrAAAAHAAAOatAADmrQAAAHEAAOauAADmrgAAAHIAAOavAADmrwAAAHMAAOawAADmsAAAAHQAAOaxAADmsQAAAHUAAOayAADmsgAAAHYAAOazAADmswAAAHcAAOa0AADmtAAAAHgAAOa1AADmtQAAAHkAAOa2AADmtgAAAHoAAOa3AADmtwAAAHsAAOa4AADmuAAAAHwAAOa5AADmuQAAAH0AAOa6AADmugAAAH4AAOa7AADmuwAAAH8AAOa8AADmvAAAAIAAAOa9AADmvQAAAIEAAOa+AADmvgAAAIIAAOa/AADmvwAAAIMAAObAAADmwAAAAIQAAObBAADmwQAAAIUAAObCAADmwgAAAIYAAObDAADmwwAAAIcAAObEAADmxAAAAIgAAObFAADmxQAAAIkAAObGAADmxgAAAIoAAObHAADmxwAAAIsAAObIAADmyAAAAIwAAObJAADmyQAAAI0AAObKAADmygAAAI4AAObLAADmywAAAI8AAObMAADmzAAAAJAAAObNAADmzQAAAJEAAObOAADmzgAAAJIAAObPAADmzwAAAJMAAAAAAC4AuAEcAXYByAH2AmACogMOAz4DxgP2BDgEqAUcBWgFsgXiBrAHLgdCB7QIYgh8COIJAglICYwKBgpaCqwK/gt8C6AMRAywDPANYA3KDgYOeA7e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AUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAARtb3JlBmRlbGV0ZQd2aXNpYmxlB3pvb20tdG8Gb3V0cHV0B29wYWNpdHkKbGF5ZXItaW5mbwRzYXZlC2xheWVyLXN0eWxlCmxpbmUtbGF5ZXIEc2tpbgxtYXJrZXItbGF5ZXILcG9pbnQtbGF5ZXINcG9seWdvbi1sYXllcglpbnZpc2libGUGc2VhcmNoBGVkaXQGbGF5ZXJzCWJhc2VsYXllcgdzZXR0aW5nA2FkZAdwcmV2aWV3B3JlZnJlc2gOc29saWQtdHJpYW5nbGULcm9hZG5ldHdvcmsGcmV0dXJuBnBhY2t1cAVzaGFyZQxiYWNraG9tZXBhZ2UGTXlNYXBzCUNyZWF0ZU1hcAhmZWVkYmFjawVza2luMQZTaGFwZS0HYWNjb3VudAdTaGFwZS0xB1NoYXBlLTIHU2hhcGUtMwdTaGFwZS00B1NoYXBlLTUHU2hhcGUtNgdTaGFwZS03B1NoYXBlLTgHU2hhcGUtOQhTaGFwZS0xMAhTaGFwZS0xMQhTaGFwZS0xMghTaGFwZS0xMwhTaGFwZS0xNAhTaGFwZS0xNQhTaGFwZS0xNghTaGFwZS0xNwhTaGFwZS0xOAhTaGFwZS0xOQhTaGFwZS0yMAhTaGFwZS0yMQhTaGFwZS0yMghTaGFwZS0yMwhTaGFwZS0yNAhTaGFwZS0yNQhTaGFwZS0yNghTaGFwZS0yNwhTaGFwZS0yOAhTaGFwZS0yOQhTaGFwZS0zMAhTaGFwZS0zMQhTaGFwZS0zMghTaGFwZS0zMwhTaGFwZS0zNAhTaGFwZS0zNQhTaGFwZS0zNghTaGFwZS0zNwhTaGFwZS0zOAhTaGFwZS0zOQhTaGFwZS00MAhTaGFwZS00MQhTaGFwZS00MghTaGFwZS00MwhTaGFwZS00NAhTaGFwZS00NQhTaGFwZS00NghTaGFwZS00NwhTaGFwZS00OAhTaGFwZS00OQhTaGFwZS01MAhTaGFwZS01MQhTaGFwZS01MghTaGFwZS01MwhTaGFwZS01NAhTaGFwZS01NQhTaGFwZS01NghTaGFwZS01NwhTaGFwZS01OAhTaGFwZS01OQRPdmFsCVJlY3RhbmdsZQRTdGFyCFRyaWFuZ2xlDnJlc3RvcmVkZWZhdWx0CXVwbG9hZGluZwVlcnJvcgZ6b29taW4Hem9vbW91dAVmaXJzdARuZXh0BGxhc3QEcHJldghwb2ktbG9hZAhwb2ktc2F2ZQRmb2xkDGxhYmVsLWRlbGV0ZQZ1cGxvYWQGdW5mb2xkBWNsb3NlBG1hcmsHdHJhZmZpYwtmdWxsLWZpZ3VyZQdtZWFzdXJlDGRpc3BsYXktbGlzdAloaWRlLWxpc3QGcmVuYW1lBGNvcHkHcXEtem9uZQpzaW5hLXdlaWJvDGNvbG9yLWNoYW5nZRBjcmVhdC1jdXN0b20tbWFwCmN1c3RvbS1tYXALbGVnZW5kLWZvbGQNbGVnZW5kLXVuZm9sZApsZWdlbmQtYmlnCWF0dHJpYnV0ZQxsZWdlbmQtc21hbGwMY2xvc2UtbGVnZW5kCmZvbnQtY29sb3IEYm9sZAdpdGFsaWNzBGZvbnQNanVzdGlmeS1hbGlnbg9taWRkbGUtYWxpZ25tZW4JZm9udC1zaXplCXN0cmlrZW91dAp0ZXh0LWxheWVyD3JpZ2h0LWFsaWdubWVudA5sZWZ0LWFsaWdubWVudBR0cmFuc3BhcmVudC1iYWNrZ3JvdQl1bmRlcmxpbmUFcXVlcnkAAAAA) format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPCEtLQoyMDEzLTktMzA6IENyZWF0ZWQuCi0tPgo8c3ZnPgo8bWV0YWRhdGE+CkNyZWF0ZWQgYnkgaWNvbmZvbnQKPC9tZXRhZGF0YT4KPGRlZnM+Cgo8Zm9udCBpZD0ic3VwZXJtYXBvbC1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiID4KICA8Zm9udC1mYWNlCiAgICBmb250LWZhbWlseT0ic3VwZXJtYXBvbC1pY29ucyIKICAgIGZvbnQtd2VpZ2h0PSI1MDAiCiAgICBmb250LXN0cmV0Y2g9Im5vcm1hbCIKICAgIHVuaXRzLXBlci1lbT0iMTAyNCIKICAgIGFzY2VudD0iODk2IgogICAgZGVzY2VudD0iLTEyOCIKICAvPgogICAgPG1pc3NpbmctZ2x5cGggLz4KICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im1vcmUiIHVuaWNvZGU9IiYjNTg5MDk7IiBkPSJNNTMwLjI4NTcxNCAxMjhhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwLTE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwIDE4Mi44NTcxNDN6IG0wIDM2NS42NDExNDNhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwLTE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwIDE4Mi44NTcxNDN6IG0wIDE4Mi44NTcxNDNhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwIDE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwLTE4Mi44NTcxNDN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZGVsZXRlIiB1bmljb2RlPSImIzU4OTExOyIgZD0iTTEzNS44ODE0OC0xMTQuOTgyNDMxYTEwNy41MDQ2NDIgMTA3LjUwNDY0MiAwIDAgMC04LjU1NjQ5MiA4LjU1NjQ5MmMzLjE0NDY5NC0zLjA3MTU2MSA1LjcwNDMyOC02LjA2OTk5IDguNTU2NDkyLTguNTU2NDkyeiBtLTEwLjk2OTg2MSA0LjY4MDQ3NGMtMi45MjUyOTYgMi43NzkwMzItNS44NTA1OTMgNS40ODQ5MzEtOC42Mjk2MjUgOC41NTY0OTIgMi43MDU4OTktMy4wNzE1NjEgNS42MzExOTYtNS44NTA1OTMgOC41NTY0OTItOC41NTY0OTJ6TTEwMTEuNzg4MzUgNzM3LjA4MzI3NGE0Mi45Mjg3MjQgNDIuOTI4NzI0IDAgMCAxLTI5Ljk4NDI4OCAxMi4yMTMxMTJoLTIxMC4xODI1NDV2NjUuODE5MTY5Qzc3MS42OTQ2NSA4NTkuNzk5NDU3IDczNS42NDAzNzIgODk2IDY5MS4zOTUyNjQgODk2SDMzMi4zODgyNjVDMjg4LjE0MzE1NyA4OTYgMjUyLjA4ODg3OSA4NTkuNzk5NDU3IDI1Mi4wODg4NzkgODE1LjE4ODY4N3YtNjUuODkyMzAxSDQwLjczNjIxNUE0MC45NTQxNDkgNDAuOTU0MTQ5IDAgMCAxIDAuMDAxNDYzIDcwOC4xOTU5NzJjMC0yMi42NzEwNDcgMTguMjgzMTAyLTQwLjk1NDE0OSA0MC44MDc4ODQtNDAuOTU0MTQ5aDM1Ljk4MTE0NnYtNzE0LjI4NDI0NmMwLTQ0LjYxMDc3IDM1Ljk4MTE0Ni04MC44MTEzMTMgODAuMjk5Mzg2LTgwLjgxMTMxMmg3MjEuMDg1NTU5YzQ0LjMxODI0IDAgODAuMjk5Mzg2IDM2LjIwMDU0MyA4MC4yOTkzODYgODAuODExMzEyVjY2Ny4xNjg2OWgyMy40MDIzNzFjMjIuNTI0NzgyIDAgNDEuOTc4MDAzIDE4LjI4MzEwMiA0MS45NzgwMDMgNDEuMDI3MjgyYTQwLjY2MTYyIDQwLjY2MTYyIDAgMCAxLTExLjk5MzcxNSAyOC44ODczMDJ6TTMzMi4yNDIgODE0Ljk2OTI5aDM1OC43MTQ0Njl2LTY2LjMzMTA5NUgzMzIuMjQyeiBtNTQ1Ljc4NzE3My04NjEuODY1NDQ4SDE1Ny4wODk4NzlWNjY3LjI0MTgyM2g3MjAuOTM5Mjk0ek01MTEuMzQzMjcxIDUyOS42MDY2MjhjLTIyLjY3MTA0NyAwLTQwLjk1NDE0OS0xOC41MDI1LTQwLjk1NDE0OS00MS4zMTk4MTJ2LTM4Mi44NDgxNjRjMC0yMi43NDQxNzkgMTguMjgzMTAyLTQxLjI0NjY3OSA0MC45NTQxNDktNDEuMjQ2Njc5czQxLjAyNzI4MiAxOC41MDI1IDQxLjAyNzI4MiA0MS4yNDY2NzlWNDg4LjM1OTk0OWE0MS4xMDA0MTQgNDEuMTAwNDE0IDAgMCAxLTQwLjk1NDE0OSA0MS4zMTk4MTF6IG0tMjIyLjEwMzEyOCAwYy0yMi42NzEwNDcgMC00MC45NTQxNDktMTguNTAyNS00MC45NTQxNDktNDEuMzE5ODEydi0zODIuODQ4MTY0YzAtMjIuNzQ0MTc5IDE4LjI4MzEwMi00MS4yNDY2NzkgNDAuOTU0MTQ5LTQxLjI0NjY3OXM0MC45NTQxNDkgMTguNTAyNSA0MC45NTQxNDkgNDEuMjQ2Njc5VjQ4OC4zNTk5NDlhNDEuMTAwNDE0IDQxLjEwMDQxNCAwIDAgMS00MC45NTQxNDkgNDEuMzE5ODExeiBtNDQyLjAxMjI4NCAwYy0yMi42NzEwNDcgMC00MS4wMjcyODItMTguNTAyNS00MS4wMjcyODItNDEuMzE5ODEydi0zODIuODQ4MTY0YzAtMjIuNzQ0MTc5IDE4LjI4MzEwMi00MS4yNDY2NzkgNDAuOTU0MTUtNDEuMjQ2Njc5czQxLjAyNzI4MiAxOC41MDI1IDQxLjAyNzI4MSA0MS4yNDY2NzlWNDg4LjM1OTk0OWE0MS4xMDA0MTQgNDEuMTAwNDE0IDAgMCAxLTQwLjk1NDE0OSA0MS4zMTk4MTF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idmlzaWJsZSIgdW5pY29kZT0iJiM1ODkxMjsiIGQ9Ik01MTIuMDM4MDM0LTU0Ljg1NzE0M0MxNzkuNzUwMDM0LTU0Ljg1NzE0MyA0My4wNDYwMzQgMjIzLjUyNDU3MSA3LjM1MjMyIDMwOC44MDkxNDNhMTA1LjEwNjI4NiAxMDUuMTA2Mjg2IDAgMCAwIDAgNzcuMjM4ODU3QzQzLjExOTE3NyA0NzEuMzMyNTcxIDE3OS44MjMxNzcgNzQ5LjcxNDI4NiA1MTIuMDM4MDM0IDc0OS43MTQyODZjMzMwLjc1MiAwIDQ2OS4wNjUxNDMtMjc4LjM4MTcxNCA1MDQuNjg1NzE1LTM2My42NjYyODYgOS44MDExNDMtMjUuMjM0Mjg2IDkuODAxMTQzLTUyLjAwNDU3MSAwLTc3LjIzODg1N0M5ODEuMTAzMTc3IDIyMy41MjQ1NzEgODQyLjc5MDAzNC01NC44NTcxNDMgNTEyLjAzODAzNC01NC44NTcxNDN6TTc1LjQ0ODMyIDM2MC41OTQyODZhMzQuNzQyODU3IDM0Ljc0Mjg1NyAwIDAgMSAwLTI0Ljc5NTQyOUMxMDUuMzYzNzQ5IDI2MC4wOTYgMjI1LjkwMzE3NyAxOC4yODU3MTQgNTEyLjAzODAzNCAxOC4yODU3MTRjMjg2LjIwOCAwIDQwNi42NzQyODYgMjQxLjczNzE0MyA0MzYuNTg5NzE1IDMxNS45NzcxNDNhMzQuNzQyODU3IDM0Ljc0Mjg1NyAwIDAgMSAwIDI0Ljc5NTQyOUM5MTguNzEyMzIgNDM0Ljc2MTE0MyA3OTguMjQ2MDM0IDY3Ni41NzE0MjkgNTEyLjAzODAzNCA2NzYuNTcxNDI5IDIyNS45MDMxNzcgNjc2LjU3MTQyOSAxMDUuMzYzNzQ5IDQzNC44MzQyODYgNzUuNDQ4MzIgMzYwLjU5NDI4NnpNNTEyLjAzODAzNCAxNjQuNTcxNDI5Yy0xMDAuNzkwODU3IDAtMTgyLjg1NzE0MyA4Mi42NTE0MjktMTgyLjg1NzE0MyAxODIuODU3MTQyUzQxMS4yNDcxNzcgNTMwLjI4NTcxNCA1MTIuMDM4MDM0IDUzMC4yODU3MTRzMTgyLjg1NzE0My04Mi42NTE0MjkgMTgyLjg1NzE0My0xODIuODU3MTQzUzYxMi44Mjg4OTEgMTY0LjU3MTQyOSA1MTIuMDM4MDM0IDE2NC41NzE0Mjl6IG0wIDI5Mi41NzE0MjhjLTYwLjEyMzQyOSAwLTEwOS43MTQyODYtNDkuMDA1NzE0LTEwOS43MTQyODUtMTA5LjcxNDI4NlM0NTEuMzI5NDYzIDIzNy43MTQyODYgNTEyLjAzODAzNCAyMzcuNzE0Mjg2czEwOS43MTQyODYgNDkuMDA1NzE0IDEwOS43MTQyODYgMTA5LjcxNDI4NVM1NzIuMTYxNDYzIDQ1Ny4xNDI4NTcgNTEyLjAzODAzNCA0NTcuMTQyODU3eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Inpvb20tdG8iIHVuaWNvZGU9IiYjNTg5MTM7IiBkPSJNODcxLjQ5NzE0MyA4MzcuNDg1NzE0YzQzLjg4NTcxNCAwIDc5LjM2LTM1LjU0NzQyOSA3OS4zNi03OS4zNlY0NDEuNzgyODU3aC04MC40NTcxNDNWNjgyLjY0MjI4NmMwIDQxLjEwNjI4Ni0zMy4yOCA3NC4zODYyODYtNzQuMzg2Mjg2IDc0LjM4NjI4NUg1NTMuNjkxNDI5TDU1My4zMjU3MTQgODM3LjQ4NTcxNHogbS03NS40ODM0MjktODg1Ljc2YzQxLjEwNjI4NiAwIDc0LjM4NjI4NiAzMy4yOCA3NC4zODYyODYgNzQuMzg2Mjg2VjI3Ny4yMTE0MjlIOTUwLjg1NzE0M3YtMzMwLjgyNTE0M2MwLTQxLjEwNjI4Ni0zMy4yOC03NC4zODYyODYtNzQuMzg2Mjg2LTc0LjM4NjI4Nkg1NTMuMzI1NzE0djc5LjcyNTcxNHpNMC4wNzMxNDMgNzU4LjEyNTcxNEMwIDgwMi4wMTE0MjkgMzUuNTQ3NDI5IDgzNy40ODU3MTQgNzkuMzYgODM3LjQ4NTcxNGgzMTYuNDE2di04MC40NTcxNDNIMTU0LjExMmMtNDEuMTA2Mjg2IDAtNzQuMzg2Mjg2LTMzLjI4LTc0LjM4NjI4Ni03NC4zODYyODV2LTI0MC45MzI1NzJIMHpNNzkuMzYgMjc3LjIxMTQyOXYtMjUxLjA5OTQyOWMwLTQxLjEwNjI4NiAzMy4yOC03NC4zODYyODYgNzQuMzg2Mjg2LTc0LjM4NjI4NkgzOTUuNzAyODU3Vi0xMjhINzQuMzg2Mjg2QTc0LjM4NjI4NiA3NC4zODYyODYgMCAwIDAgMC01My42MTM3MTRWMjc3LjIxMTQyOXpNNjc4Ljc2NTcxNCA0MDguNzIyMjg2di04OS42SDUxOS40NjA1NzF2LTE1NC4xODUxNDNINDI5Ljc4NzQyOVYzMTkuMTIyMjg2SDI3Mi4zODRWNDA4LjcyMjI4NmgxNTcuNDAzNDI5VjU2My45MzE0MjloODkuNjczMTQydi0xNTUuMjA5MTQzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im91dHB1dCIgdW5pY29kZT0iJiM1ODkxNDsiIGQ9Ik0zMjUuNDEyNTcxIDQxMy40NzY1NzFhNDQuMzI0NTcxIDQ0LjMyNDU3MSAwIDAgMS0zMS42NzA4NTctMTMuMTY1NzE0IDQ0LjMyNDU3MSA0NC4zMjQ1NzEgMCAwIDEgMC02My4wNDkxNDNsMTgyLjI3Mi0xODEuMTc0ODU3YTQ0LjgzNjU3MSA0NC44MzY1NzEgMCAwIDEgNjMuMzQxNzE1IDBMNzIxLjYyNzQyOSAzMzcuMTg4NTcxYTQ0LjMyNDU3MSA0NC4zMjQ1NzEgMCAwIDEgMCA2My4xMjIyODYgNDQuOTgyODU3IDQ0Ljk4Mjg1NyAwIDAgMS02My40ODggMEw1NTIuNDQ4IDI5NS4yMDQ1NzFWODUxLjM4Mjg1N0M1NTIuNDQ4IDg3Ni4wMzIgNTMyLjQ4IDg5NiA1MDcuNjExNDI5IDg5NnMtNDQuNzYzNDI5LTE5Ljk2OC00NC43NjM0MjktNDQuNjE3MTQzdi01NTYuMTc4Mjg2bC0xMDUuNjkxNDI5IDEwNS4zMjU3MTVhNDUuMjAyMjg2IDQ1LjIwMjI4NiAwIDAgMS0zMS43NDQgMTIuOTQ2Mjg1eiBtNjU5LjAxNzE0My0xNzguMTAyODU3YTM5LjQ5NzE0MyAzOS40OTcxNDMgMCAwIDEtMzkuNDk3MTQzLTM5LjM1MDg1N3YtMjIyLjIwOGMwLTEyLjg3MzE0My0xMC41MzI1NzEtMjMuNDA1NzE0LTIzLjU1Mi0yMy40MDU3MTRIMTAyLjU0NjI4NmEyMy41NTIgMjMuNTUyIDAgMCAwLTIzLjU1MiAyMy40MDU3MTR2MjIyLjM1NDI4NmEzOS40OTcxNDMgMzkuNDk3MTQzIDAgMCAxLTc4Ljk5NDI4NiAwdi0yNTMuNTEzMTQzYzAtMzkuMDU4Mjg2IDMxLjg5MDI4Ni03MC42NTYgNzAuOTQ4NTcxLTcwLjY1Nmg4ODIuMTAyODU4YzM5LjIwNDU3MSAwIDcwLjk0ODU3MSAzMS43NDQgNzAuOTQ4NTcxIDcwLjY1NlYxOTYuMDIyODU3YTM5LjQ5NzE0MyAzOS40OTcxNDMgMCAwIDEtMzkuNDk3MTQzIDM5LjI3NzcxNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJvcGFjaXR5IiB1bmljb2RlPSImIzU4OTE3OyIgZD0iTTY1NC4yNTA2NjcgMjQxLjc0OTMzM0g5MzguNjY2NjY3Vi00Mi42NjY2NjdINjU0LjI1MDY2N3pNMzY5Ljc0OTMzMyA1MjYuMjUwNjY3aDI4NC41MDEzMzR2LTI4NC41MDEzMzRIMzY5Ljc0OTMzM3pNNjU0LjI1MDY2NyA4MTAuNjY2NjY3SDkzOC42NjY2Njd2LTI4NC40MTZINjU0LjI1MDY2N3pNODUuMzMzMzMzIDI0MS43NDkzMzNoMjg0LjQxNlYtNDIuNjY2NjY3SDg1LjMzMzMzM3pNODUuMzMzMzMzIDgxMC42NjY2NjdoMjg0LjQxNnYtMjg0LjQxNkg4NS4zMzMzMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGF5ZXItaW5mbyIgdW5pY29kZT0iJiM1ODkxOTsiIGQ9Ik01MTIgODk1LjA2MTMzM0E1MTEuMTQ2NjY3IDUxMS4xNDY2NjcgMCAxIDEgNTEyLTEyNy4xNDY2NjcgNTExLjE0NjY2NyA1MTEuMTQ2NjY3IDAgMCAxIDUxMiA4OTUuMTQ2NjY3eiBtMC05MjguNDI2NjY2YTQxNy4yOCA0MTcuMjggMCAxIDAgMCA4MzQuNTYgNDE3LjI4IDQxNy4yOCAwIDAgMCAwLTgzNC41NnpNNDg4Ljc4OTMzMyA2MjQuODk2YTYwLjE2IDYwLjE2IDAgMSAxIDEyMC4zMiAwIDYwLjE2IDYwLjE2IDAgMCAxLTEyMC4zMiAwek01MzEuNjI2NjY3IDcwLjgyNjY2N2MtNDQuMzczMzMzLTExLjA5MzMzMy0xMDUuODEzMzMzLTEwLjA2OTMzMy0xMzYuNTMzMzM0IDIuMjE4NjY2LTMwLjcyIDEyLjM3MzMzMy00MS44OTg2NjcgNTcuMTczMzMzLTI0LjgzMiA5OS42NjkzMzRsNzYuNTQ0IDE5MC44MDUzMzNhNzIuOTYgNzIuOTYgMCAwIDEtNDkuMTUyIDk5LjQ5ODY2N2wtMTQuNjc3MzMzIDQuMDk2Yy00NC4wMzIgMTIuMjAyNjY3LTQzLjE3ODY2NyAyOC4yNDUzMzMgMS45NjI2NjcgMzUuNTg0bDQzLjg2MTMzMyA3LjE2OGM0NS4yMjY2NjcgNy4zMzg2NjcgMTA3LjI2NCAzLjI0MjY2NyAxMzcuOTg0LTkuMDQ1MzM0IDMwLjcyLTEyLjM3MzMzMyA0MS44MTMzMzMtNTcuMTczMzMzIDI0Ljc0NjY2Ny05OS41ODRsLTcxLjUwOTMzNC0xNzYuODEwNjY2Yy0xNy4wNjY2NjctNDIuNDk2IDQuMzUyLTg3Ljg5MzMzMyA0Ny43MDEzMzQtMTAxLjAzNDY2NyA0My4zNDkzMzMtMTMuMDU2IDQyLjQ5Ni0zMi44NTMzMzMtMS44NzczMzQtNDQuMDMybC0zNC4xMzMzMzMtOC41MzMzMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ic2F2ZSIgdW5pY29kZT0iJiM1ODkyMDsiIGQ9Ik03MzIuOCA4MTAuNjg4bDIwNS44ODgtMjA1Ljg4OHYtNjQ3LjQ4OEg4NS4zMTJWODEwLjY4OHpNNzY4IDg5Nkg4NS4zMTJDMzguNCA4OTYgMCA4NTcuNiAwIDgxMC42ODh2LTg1My4zNzZDMC04OS42IDM4LjQtMTI4IDg1LjMxMi0xMjhoODUzLjM3NkM5ODUuNi0xMjggMTAyNC04OS42IDEwMjQtNDIuNjg4VjY0MHpNMTcwLjY4OCA3MjUuMzEyaDQyNi42MjR2LTE3MC42MjRIMTcwLjY4OHpNNTEyIDQyLjY4OGExNzEuMiAxNzEuMiAwIDAgMC0xNzAuNjg4IDE3MC42MjRDMzQxLjMxMiAzMDcuMiA0MTguMTEyIDM4NCA1MTIgMzg0czE3MC42ODgtNzYuOCAxNzAuNjg4LTE3MC42ODhjMC05My44MjQtNzYuOC0xNzAuNjI0LTE3MC42ODgtMTcwLjYyNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsYXllci1zdHlsZSIgdW5pY29kZT0iJiM1ODkyMTsiIGQ9Ik05OTMuNzI4ODUzIDMzMy41Njh2LTAuMDg1MzMzTDUzMC40NTQxODcgMTE0LjM0NjY2N2wtMC4xNzA2NjctMC4wODUzMzQtMC4yNTYtMC4wODUzMzNhNDIuODM3MzMzIDQyLjgzNzMzMyAwIDAgMC0zNi42OTMzMzMgMEg0OTMuMjQ4ODUzYy0wLjA4NTMzMyAwLTAuMTcwNjY3IDAtMC4yNTYgMC4xNzA2NjdMMjkuNzE4MTg3IDMzMy40ODI2NjdBNTUuMzgxMzMzIDU1LjM4MTMzMyAwIDAgMCAwLjAyMjE4NyAzODQuMjU2YzAgMzAuMjkzMzMzIDIxLjUwNCA1NC43ODQgNDcuOTU3MzMzIDU0Ljc4NCA2LjU3MDY2NyAwIDEyLjgtMS41MzYgMTguNDMyLTQuMDk2bDAuMTcwNjY3LTAuMDg1MzMzIDAuMTcwNjY2LTAuMDg1MzM0IDQ0NS4wMTMzMzQtMjEwLjUxNzMzMyA0NDQuOTI4IDIxMC41MTczMzNoMC4yNTZsMC4xNzA2NjYgMC4yNTZ2LTAuMDg1MzMzYTQyLjkyMjY2NyA0Mi45MjI2NjcgMCAwIDAgMTguMjYxMzM0IDQuMDk2YzI2LjQ1MzMzMyAwIDQ3Ljk1NzMzMy0yNC40OTA2NjcgNDcuOTU3MzMzLTU0Ljc4NGE1NS4zODEzMzMgNTUuMzgxMzMzIDAgMCAwLTI5LjYxMDY2Ny01MC42MDI2Njd6IG0wIDIzNy41NjhMNTMwLjQ1NDE4NyAzNTEuOTE0NjY3aC0wLjE3MDY2N2wtMC4yNTYtMC4xNzA2NjdhNDMuOTQ2NjY3IDQzLjk0NjY2NyAwIDAgMC0xOC4yNjEzMzMtNC4yNjY2NjcgNDMuODYxMzMzIDQzLjg2MTMzMyAwIDAgMC0xOC40MzIgNC4yNjY2NjdsLTAuMTcwNjY3IDAuMDg1MzMzLTAuMjU2IDAuMDg1MzM0LTQ2My4xODkzMzMgMjE5LjMwNjY2NkE1NS4zODEzMzMgNTUuMzgxMzMzIDAgMCAwIDAuMDIyMTg3IDYyMS42NTMzMzNjMCAyMi44NjkzMzMgMTIuMzczMzMzIDQyLjQ5NiAyOS42OTYgNTAuNjg4TDQ5Mi45MDc1MiA4OTEuNTYyNjY3IDQ5My4yNDg4NTMgODkxLjczMzMzM2gwLjE3MDY2N2E0Mi40OTYgNDIuNDk2IDAgMCAwIDM2LjY5MzMzMyAwaDAuNDI2NjY3bDQ2My4yNzQ2NjctMjE5LjMwNjY2NmMxNy4zMjI2NjctOC4xOTIgMjkuNjEwNjY3LTI3LjgxODY2NyAyOS42MTA2NjYtNTAuNjAyNjY3YTU1LjM4MTMzMyA1NS4zODEzMzMgMCAwIDAtMjkuNjEwNjY2LTUwLjY4OHpNNDcuOTc5NTIgMjAxLjM4NjY2N2M2LjU3MDY2NyAwIDEyLjgtMS41MzYgMTguNDMyLTQuMjY2NjY3SDY2LjU4MjE4N3MwLjE3MDY2NyAwIDAuMTcwNjY2LTAuMTcwNjY3bDQ0NS4wMTMzMzQtMjEwLjQzMiA0NDQuOTI4IDIxMC40MzIgMC4yNTYgMC4wODUzMzQgMC4xNzA2NjYgMC4wODUzMzNhNDEuODEzMzMzIDQxLjgxMzMzMyAwIDAgMCAxOC4yNjEzMzQgNC4yNjY2NjdjMjYuNDUzMzMzIDAgNDcuOTU3MzMzLTI0LjU3NiA0Ny45NTczMzMtNTQuODY5MzM0IDAtMjIuNzg0LTEyLjI4OC00Mi40MTA2NjctMjkuNjEwNjY3LTUwLjY4OGwtNDYzLjI3NDY2Ni0yMTkuMTM2cy0wLjE3MDY2NyAwLTAuMTcwNjY3LTAuMTcwNjY2SDUyOS45NDIxODdhNDEuNzI4IDQxLjcyOCAwIDAgMC0zNi42OTMzMzQgMEg0OTMuMjQ4ODUzbC0wLjI1NiAwLjE3MDY2NkwyOS43MTgxODcgOTUuODI5MzMzQTU1LjQ2NjY2NyA1NS40NjY2NjcgMCAwIDAgMC4wMjIxODcgMTQ2LjUxNzMzM2MwIDMwLjI5MzMzMyAyMS41MDQgNTQuODY5MzMzIDQ3Ljk1NzMzMyA1NC44NjkzMzR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGluZS1sYXllciIgdW5pY29kZT0iJiM1ODkyMjsiIGQ9Ik03NjcuMzA2OTA4IDU3Ny44NDg1MTFMMzE4LjEzMDU4MyAxMjguNjcyMTg2YTE3MC42NTk2OTggMTcwLjY1OTY5OCAwIDEgMC00NS41NjYxMzkgNTAuOTQxOTJsNDQzLjcxNTIxNSA0NDMuODg1ODc0YTE3MC42NTk2OTggMTcwLjY1OTY5OCAwIDEgMCA1MC45NDE5MTktNDUuNTY2MTM5eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNraW4iIHVuaWNvZGU9IiYjNTg5MjM7IiBkPSJNOTIwLjkwMzA0IDgxNi4yNTZoLTU0Ljg0OGMtNTMuNTA0LTU3LjQ3Mi0xNjcuNDI0LTkzLjQ0LTI1Ny45ODQtOTMuNDQtOTAuNTYgMC0yMDQuNDggMzUuOTY4LTI1Ny45MiA5My40NGgtNTQuOTEyTDk1LjYyMzA0IDYxMS4ybDg5LjI4LTkxLjcxMmE4Ny44NzIgODcuODcyIDAgMCAwIDExOS41NTItODIuMTEydi00ODUuNjMyaDYwNy4xNjhWNDM3LjM3NmE4Ny44NzIgODcuODcyIDAgMCAwIDExOS42MTYgODIuMTEybDg5LjI4IDkxLjcxMnpNMjI0LjcxMTA0IDM2Ni4zMzZ2NzEuMDRhOC4xMjggOC4xMjggMCAwIDEtOC4wNjQgOC4zMiA3LjgwOCA3LjgwOCAwIDAgMS01LjYzMi0yLjQzMmwtNC42NzItNC44YTM3LjQ0IDM3LjQ0IDAgMCAwLTUzLjgyNCAwTDExLjIwNzA0IDU4My41NTJhMzkuODcyIDM5Ljg3MiAwIDAgMCAwIDU1LjI5NkwyNDIuODg3MDQgODc2LjhBNjMuMTA0IDYzLjEwNCAwIDAgMCAyODguMDcxMDQgODk2aDY5LjYzMmMxOC40OTYgMCAzNi4yMjQtOC4wNjQgNDguMTkyLTIyLjQ2NCAzNS43MTItNDMuMDcyIDEzNy44NTYtNzAuOTc2IDIwMi4xNzYtNzAuOTc2czE2Ni40IDI3LjkwNCAyMDIuMjQgNzAuOTc2QTYyLjQ2NCA2Mi40NjQgMCAwIDAgODU4LjM3NTA0IDg5Nkg5MjguMDcxMDRjMTYuOTYgMCAzMy4yOC02LjkxMiA0NS4yNDgtMTkuMmwyMzEuNjE2LTIzNy45NTJhMzkuODcyIDM5Ljg3MiAwIDAgMCAwLTU1LjI5NmwtMTQxLjMxMi0xNDUuMDg4YTM3LjQ0IDM3LjQ0IDAgMCAwLTUzLjgyNCAwbC00LjY3MiA0LjhhNy43NDQgNy43NDQgMCAwIDEtNS42MzIgMi40MzIgOC4xMjggOC4xMjggMCAwIDEtOC4wNjQtOC4zMnYtNTA1Ljg1NmMwLTMyLjg5Ni0yNS45ODQtNTkuNTItNTcuOTg0LTU5LjUySDI4Mi42OTUwNGE1OC43NTIgNTguNzUyIDAgMCAwLTU3Ljk4NCA1OS41MlYzNTYuMzUyek00MjUuOTI3MDQgNTAzLjY4aDI2Mi45MTJjMjQuMjU2IDAgNDMuODQtMTMuODg4IDQzLjg0LTMxLjA0di0yNDguMzJjMC0xNy4xNTItMTkuNTg0LTMxLjA0LTQzLjg0LTMxLjA0SDQyNS45MjcwNGMtMjQuMTkyIDAtNDMuNzc2IDEzLjg4OC00My43NzYgMzEuMDR2MjQ4LjMyYzAgMTcuMTUyIDE5LjU4NCAzMS4wNCA0My43NzYgMzEuMDR6IiAgaG9yaXotYWR2LXg9IjEyMTYiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibWFya2VyLWxheWVyIiB1bmljb2RlPSImIzU4OTI0OyIgZD0iTTUxMiA4OTZDMjc2LjM5NDY2NyA4OTYgODUuMzMzMzMzIDcwOS43MTczMzMgODUuMzMzMzMzIDQ4MFM1MTItMTI4IDUxMi0xMjhzNDI2LjY2NjY2NyAzNzguMjgyNjY3IDQyNi42NjY2NjcgNjA4Uzc0Ny42MDUzMzMgODk2IDUxMiA4OTZ6IG0wLTU5Ny4zMzMzMzNhMTcwLjY2NjY2NyAxNzAuNjY2NjY3IDAgMSAwIDAgMzQxLjMzMzMzMyAxNzAuNjY2NjY3IDE3MC42NjY2NjcgMCAwIDAgMC0zNDEuMzMzMzMzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InBvaW50LWxheWVyIiB1bmljb2RlPSImIzU4OTI1OyIgZD0iTTY4Mi42NjY2NjcgMzg0YTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDAgMCAwLTUxMnpNMTcwLjY2NjY2NyAxMjhhMTcwLjY2NjY2NyAxNzAuNjY2NjY3IDAgMSAwIDAgMzQxLjMzMzMzMyAxNzAuNjY2NjY3IDE3MC42NjY2NjcgMCAwIDAgMC0zNDEuMzMzMzMzeiBtNTU0LjY2NjY2Ni0xNzAuNjY2NjY3YTEyOCAxMjggMCAxIDAgMCAyNTYgMTI4IDEyOCAwIDAgMCAwLTI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiB1bmljb2RlPSImIzU4OTI2OyIgZD0iTTE2MCA1NzZhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtNzA0IDBhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtMC03MDRhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtLTcwNCAwYTE2MCAxNjAgMCAxIDAgMCAzMjAgMTYwIDE2MCAwIDAgMCAwLTMyMHpNMzIwIDc2OGgzODR2LTY0aC0zODR6IG0wLTcwNGgzODR2LTY0aC0zODR6IG0tMTI4IDUxMnYtMzg0SDEyOHYzODR6IG03MDQgMHYtMzg0aC02NHYzODR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iaW52aXNpYmxlIiB1bmljb2RlPSImIzU4OTI3OyIgZD0iTTMwNi4xNDA4OTEgMjIuODkzNzE0bDU2LjUzOTQyOSA1Ni42MTI1NzJBNDQ2LjAyNTE0MyA0NDYuMDI1MTQzIDAgMCAxIDUxMi4wMzgwMzQgNTQuODU3MTQzYzI4Ni4yMDggMCA0MDYuNjc0Mjg2IDI0MS43MzcxNDMgNDM2LjU4OTcxNSAzMTUuOTc3MTQzYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMCAyNC43OTU0MjggNTc4Ljg1MjU3MSA1NzguODUyNTcxIDAgMCAxLTEwMi45ODUxNDMgMTY2Ljc2NTcxNWw1MS4xMjY4NTcgNTEuMmE2ODkuNjY0IDY4OS42NjQgMCAwIDAgMTE5Ljk1NDI4Ni0xOTAuOTc2YzkuODAxMTQzLTI1LjIzNDI4NiA5LjgwMTE0My01Mi4wMDQ1NzEgMC03Ny4yMzg4NThDOTgxLjEwMzE3NyAyNjAuMDk2IDg0Mi43OTAwMzQtMTguMjg1NzE0IDUxMi4wMzgwMzQtMTguMjg1NzE0YTUxMS4wNDkxNDMgNTExLjA0OTE0MyAwIDAgMC0yMDUuODk3MTQzIDQxLjI1MjU3MXogbS0xNzkuMTI2ODU3IDEzMS4yOTE0MjlBNjg4LjU2Njg1NyA2ODguNTY2ODU3IDAgMCAwIDcuMzUyMzIgMzQ1LjM4MDU3MWExMDUuMTA2Mjg2IDEwNS4xMDYyODYgMCAwIDAgMCA3Ny4yMzg4NThDNDIuOTcyODkxIDUwNy45MDQgMTc5Ljc1MDAzNCA3ODYuMjg1NzE0IDUxMi4wMzgwMzQgNzg2LjI4NTcxNGM3OS4yMTM3MTQgMCAxNDcuMzgyODU3LTE1Ljk0NTE0MyAyMDUuNjc3NzE1LTQxLjM5ODg1N2wtNTYuMzItNTYuMzkzMTQzQTQ0Ni4wMjUxNDMgNDQ2LjAyNTE0MyAwIDAgMSA1MTIuMDM4MDM0IDcxMy4xNDI4NTdjLTI4Ni4yMDggMC00MDYuNjc0Mjg2LTI0MS43MzcxNDMtNDM2LjU4OTcxNC0zMTUuOTc3MTQzYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMC0yNC43OTU0MjhjMTMuNTMxNDI5LTM0LjIzMDg1NyA0NS40OTQ4NTctMTAyLjQgMTAyLjk4NTE0My0xNjYuNzY1NzE1eiBtMzU5LjEzMTQyOSA0OC43ODYyODZsMTAxLjAxMDI4NiAxMDEuMDEwMjg1IDQuOTAwNTcxIDQuODI3NDI5IDEwMS4wMTAyODYgMTAxLjAxMDI4NmExODMuNTE1NDI5IDE4My41MTU0MjkgMCAwIDAtMjA2LjkyMTE0My0yMDYuOTIxMTQzek0zMzEuMDA5NDYzIDM1OC4xMDc0MjlhMTgzLjUxNTQyOSAxODMuNTE1NDI5IDAgMCAwIDIwNi45MjExNDMgMjA2LjkyMTE0MnogbTUxNy4xOTMxNDMgMzYyLjA1NzE0MmEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAwIDAtNTEuNzEybC02MjAuNjE3MTQzLTYyMC42MTcxNDJhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMC01MS43MTIgNTEuNzEybDYyMC42MTcxNDMgNjIwLjYxNzE0MmEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAwIDUxLjcxMiAweiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNlYXJjaCIgdW5pY29kZT0iJiM1ODkyODsiIGQ9Ik03NzAuNjU5NTgyIDY4Mi4zMTE4OGEzNTAuNzA3MDY4IDM1MC43MDcwNjggMCAwIDEtNDk4LjkyNTYwMiAwIDM1Ny43NDY4MDggMzU3Ljc0NjgwOCAwIDAgMSAwLTUwMy4wMjE0NTEgMzUwLjc3MTA2NSAzNTAuNzcxMDY1IDAgMCAxIDQ5OC45MjU2MDIgMCAzNTcuNzQ2ODA4IDM1Ny43NDY4MDggMCAwIDEgMCA1MDMuMDIxNDUxeiBtLTU3NS43MjI3Ny01ODAuNDU4NTk2Yy0xODAuMTUzMzU3IDE4MS43NTMyOTgtMTgwLjE1MzM1NyA0NzYuMjA2NDQgMCA2NTcuODk1NzRhNDU4Ljg2MzA3OSA0NTguODYzMDc5IDAgMCAwIDY1Mi41ODM5MzYgMGMxODAuMTUzMzU3LTE4MS42ODkzIDE4MC4xNTMzNTctNDc2LjE0MjQ0MiAwLTY1Ny44OTU3NGE0NTguODYzMDc5IDQ1OC44NjMwNzkgMCAwIDAtNjUyLjU4MzkzNiAweiBtODYyLjA0ODIxMi0yMTEuMTkyMjEyYTYyLjcxNzY4NyA2Mi43MTc2ODcgMCAwIDAtODkuMTQ4NzEzIDBsLTg5LjE0ODcxMyA4OS44NTI2ODdhNjMuOTMzNjQyIDYzLjkzMzY0MiAwIDAgMCAwIDg5Ljg1MjY4NiA2Mi43MTc2ODcgNjIuNzE3Njg3IDAgMCAwIDg5LjE0ODcxMyAwbDg5LjE0ODcxMy04OS44NTI2ODZhNjMuODY5NjQ1IDYzLjg2OTY0NSAwIDAgMCAwLTg5Ljg1MjY4N3oiICBob3Jpei1hZHYteD0iMTA4NyIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJlZGl0IiB1bmljb2RlPSImIzU4OTMxOyIgZD0iTTk3OC4yMjE1NjQtMzYuNjMyNTE3MDAwMDAwMDFINDUuNzc4NDM2YTQ1LjcyNjM5NyA0NS43MjYzOTcgMCAwIDEgMC05MS4zNjc0ODNoOTMyLjQ0MzEyOGE0NS43MjYzOTcgNDUuNzI2Mzk3IDAgMCAxIDAgOTEuMzY3NDgzek0yNzUuODYwNjk3IDEwMC40NjEzNjNhNTEuNTI3NTA3IDUxLjUyNzUwNyAwIDAgMSAxOC44NTM2MDggMy44Mzg5N2gwLjQyNjU1MmwyNTkuNjg0OTg1IDEyMi4xNjQ1NTIgMi42NDQ2MjMgMS4yNzk2NTcgNDQxLjczNzQ2OCA0NDIuNTA1MjYxYTc5LjU5NDY0MiA3OS41OTQ2NDIgMCAwIDEgMCAxMTIuOTUxMDI1TDkxMC4wNTg1MjEgODcyLjQzNTU1YTc5Ljc2NTI2MyA3OS43NjUyNjMgMCAwIDEtMTEyLjk1MTAyNS0wLjE3MDYyMWwtNDM5Ljk0NTk0OC00NDAuMjAxODc5LTIuMDQ3NDUtMS45NjIxNC0xLjE5NDM0Ni0yLjU1OTMxNC0xMjEuNDgyMDY5LTI1OC40OTA2MzhhNDcuMjYxOTg1IDQ3LjI2MTk4NSAwIDAgMSAyLjkwMDU1NS00Ni40MDg4OGM4Ljk1NzU5Ni0xMy42NDk2NzEgMjQuMzk4Nzg2LTIyLjE4MDcxNSA0MC41MjI0NTktMjIuMTgwNzE1eiBtNTI0LjY1OTIxNyA2NDYuMjI2NTk2bDUyLjg5MjQ3NCA1Mi45Nzc3ODQgNzMuMDI1NzM4LTczLjExMTA0OS01Mi44OTI0NzQtNTIuOTc3Nzg0ek0zNjUuOTQ4NTI0IDIzOC44MzQ4OTg5OTk5OTk5NWw2NC44MzU5MzYgMTM3Ljk0Njk4NSAzMDUuMDcwMTM5IDMwNS4zMjYwNyA3My4wMjU3MzgtNzMuMTExMDQ4TDUwMy44OTU1MDggMzAzLjY3MDgzNXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsYXllcnMiIHVuaWNvZGU9IiYjNTg5MzI7IiBkPSJNNTQwLjQ0NDQ0NCAyNTEuMDUwNjY3TDEuMDgwODg5IDU3My4xNTU1NTYgNTQwLjQ0NDQ0NCA4OTUuMjAzNTU2bDUzOS4zNjM1NTYtMzIyLjA0OHpNMTAxMi4zOTQ2NjcgNDMzLjA5NTExMWwtNjcuNDEzMzM0LTQxLjk4NEw1NDAuNDQ0NDQ0IDE1My4wMzExMTEgNjguNDk0MjIyIDQzMy4wOTUxMTFsLTY3LjQxMzMzMy00MS45ODRMNTQwLjQ0NDQ0NCA2OS4wMDYyMjJsNTM5LjM2MzU1NiAzMjIuMTA0ODg5ek0xMDEyLjM5NDY2NyAyMzcuMDU2bC02Ny40MTMzMzQtNDIuMDQwODg5TDU0MC40NDQ0NDQtNDMuMDA4di02Ljk5NzMzM2wtNDcxLjk1MDIyMiAyODAuMDY0LTY3LjQxMzMzMy0zNS4wNDM1NTZMNTQwLjQ0NDQ0NC0xMjcuMDMyODg5bDUzOS4zNjM1NTYgMzIyLjA0OHoiICBob3Jpei1hZHYteD0iMTA4MCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJiYXNlbGF5ZXIiIHVuaWNvZGU9IiYjNTg5MzM7IiBkPSJNMTAyMi45NzYgMzg0LjM5ODIyMkMxMDIyLjk3NiA2NjYuMzk2NDQ0IDc5NC4xNjg4ODkgODk0Ljk3NiA1MTIgODk0Ljk3NiAyMjkuODMxMTExIDg5NC45NzYgMS4wMjQgNjY2LjM5NjQ0NCAxLjAyNCAzODQuMzk4MjIyYzAtMjYwLjQzNzMzMyAxOTUuMjQyNjY3LTQ3NS4zNjM1NTYgNDQ3LjQzMTExMS01MDYuNTk1NTU1YTI1NS4yNjA0NDQgMjU1LjI2MDQ0NCAwIDAgMSA2OC44OTI0NDUtMy45MjUzMzRjMjc5LjcyMjY2NyAyLjkwMTMzMyA1MDUuNjI4NDQ0IDIzMC40IDUwNS42Mjg0NDQgNTEwLjUyMDg4OXogbS03My4xMDIyMjItNy4yMjQ4ODlhNDk5LjgyNTc3OCA0OTkuODI1Nzc4IDAgMCAxLTkuOTU1NTU2IDc0LjYzODIyM2MwLjQ1NTExMSA4LjY0NzExMSAwLjU2ODg4OSAxNi44OTYgMC4zNDEzMzQgMjQuNDYyMjIyYTQzOS4wMTE1NTYgNDM5LjAxMTU1NiAwIDAgMCA5LjY3MTExMS05OS4xMDA0NDV6TTc0LjA2OTMzMyAzODQuMzk4MjIyYzAgMzAuOTQ3NTU2IDMuMTg1Nzc4IDYxLjE1NTU1NiA5LjMyOTc3OCA5MC4yODI2NjcgMTguODg3MTExLTIwLjI1MjQ0NCA2My40ODgtMTkuNzQwNDQ0IDc0LjM1Mzc3OCAxMC40Njc1NTUgMTkuNDU2LTExLjYwNTMzMyA0NS41NjgtMTMuNjUzMzMzIDQ1LjU2OC0zNi44NjQgMC03Ni40NTg2NjcgMi43MzA2NjctMTU4LjQzNTU1NiA3Mi4yNDg4ODktMTU5Ljc0NCAxLjkzNDIyMiAwIDM4LjY4NDQ0NC0xMy45Mzc3NzggNTYuMjA2MjIyLTU5LjMzNTExMSA2LjA4NzExMS0xNS43MDEzMzMgMzAuMDM3MzMzIDAgNTYuMzIgMCAxMy4wODQ0NDQgMCAwLTIyLjA3Mjg4OSAwLTY5Ljg1OTU1NSAwLTQ3LjU1OTExMSAxMDIuNTcwNjY3LTEyMC44MzIgMTAyLjU3MDY2Ny0xMjAuODMyYTU1MC41MTM3NzggNTUwLjUxMzc3OCAwIDAgMSAzLjQxMzMzMy03Ny4zMTIgMTcxLjc0NzU1NiAxNzEuNzQ3NTU2IDAgMCAxLTU4LjAyNjY2Ny03Ljg1MDY2N2MtMjA1LjY1MzMzMyAzNS45NTM3NzgtMzYxLjk4NCAyMTUuMjY3NTU2LTM2MS45ODQgNDMxLjA0NzExMXogbTU0NS43MzUxMTEtNDI0LjIyMDQ0NGMtMi4yNzU1NTYgMTEuMDkzMzMzLTEyLjE3NDIyMiAxNy4xODA0NDQtMzAuMzIxNzc3IDEyLjQ1ODY2NiAxNC40NDk3NzggNjEuNTUzNzc4IDIxLjUwNCA5Ni4wMjg0NDQgNTEuNzEyIDEyMi4yNTQyMjMgNDMuNjMzNzc4IDM3LjgzMTExMSA1LjE3Njg4OSA3OS45Mjg4ODktMjguMDQ2MjIzIDc0Ljk3OTU1NS0yNi4xNjg4ODktMy45ODIyMjItOS42NzExMTEgMzIuNDI2NjY3LTMyLjk5NTU1NSAzNC40MTc3NzgtMjMuNDM4MjIyIDEuOTkxMTExLTUzLjkzMDY2NyA0OC40NjkzMzMtODcuNjA4ODg5IDY0LjUxMi0xNy44MDYyMjIgOC40MTk1NTYtMzUuMzg0ODg5IDMxLjExODIyMi02Mi44NjIyMjIgMzIuMTQyMjIyLTI0LjQwNTMzMyAwLjk2NzExMS02MC4wMTc3NzgtMjAuNTkzNzc4LTYwLjAxNzc3OC0zLjk4MjIyMiAwIDUzLjUzMjQ0NC01LjQwNDQ0NCA5MS43NjE3NzgtNi41NDIyMjIgMTA2Ljk1MTExMS0wLjkxMDIyMiAxMi4yODgtNy45NjQ0NDQgNC4xNTI4ODkgMjQuOTc0MjIyIDMuNDEzMzMzIDE3LjkyLTAuNTEyIDkuMTAyMjIyIDM2LjAxMDY2NyAyNi45MDg0NDQgMzcuNDMyODg5IDE3LjQ2NDg4OSAxLjM2NTMzMyA1OC45OTM3NzgtMTYuMzI3MTExIDY5LjU3NTExMi05LjI3Mjg4OSA5Ljg0MTc3OCA2LjU0MjIyMiA3Mi4zMDU3NzgtMTYzLjk1Mzc3OCA3Mi4zMDU3NzctMjguMTYgMCAxNi4wOTk1NTYtOC4zNjI2NjcgNDQuMDg4ODg5IDAgNTkuMzM1MTEyIDMyLjk5NTU1NiA2MC4zMDIyMjIgNjMuODg2MjIyIDEwOS40NTQyMjIgNjEuMDk4NjY3IDExNi42MjIyMjItMS41MzYgNC4wMzkxMTEtMzMuNzM1MTExIDcuMzk1NTU2LTU5LjUwNTc3OC0xLjI1MTU1Ni04LjcwNC0yLjkwMTMzMyAyLjc4NzU1Ni0xNi40OTc3NzgtOS42NzExMTEtMTkuMzk5MTExLTQ2LjgxOTU1Ni0xMC44MDg4ODktODguMTc3Nzc4IDEyLjU3MjQ0NC03My42NzExMTEgMzQuNTg4NDQ1IDE0Ljc5MTExMSAyMi41MjggNjguNDk0MjIyIDkuODQxNzc4IDczLjIxNiA1NS4wNjg0NDQgMi43MzA2NjcgMjUuODg0NDQ0IDQuOTQ5MzMzIDU1LjkyMTc3OCA2LjQ4NTMzMyA3OC4yMjIyMjIgNjIuOTE5MTExLTkuODQxNzc4IDU1Ljk3ODY2NyA4MS42OTI0NDQtMzcuNTQ2NjY2IDkxLjQ3NzMzNGE0MzguMTAxMzMzIDQzOC4xMDEzMzMgMCAwIDAgNDA4LjYzMjg4OS0yOTQuMTcyNDQ1IDE3Ljg2MzExMSAxNy44NjMxMTEgMCAwIDEtMTAuNDY3NTU2IDQuNzc4NjY3Yy0yOC4yNzM3NzggNzAuNjU2LTk2Ljk5NTU1NiAxOS41MTI4ODktNzMuNjcxMTExLTQyLjgzNzMzNC0xMjQuODcxMTExLTk1Ljk3MTU1Ni05Mi44OTk1NTYtMTYyLjg3Mjg4OS01MS44ODI2NjctMjAxLjIxNiAyMS42MTc3NzgtMjAuMTM4NjY3IDQyLjE1NDY2Ny01MC40MDM1NTYgNTUuNTgwNDQ1LTcyLjE5Mi0xNC42MjA0NDQtNDIuNDk2IDUzLjcwMzExMS0yNS40ODYyMjIgODcuMzgxMzMzIDQ2LjY0ODg4OWE0MzguNjEzMzMzIDQzOC42MTMzMzMgMCAwIDAtMzEzLjA1OTU1Ni0zMDIuODE5NTU1eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNldHRpbmciIHVuaWNvZGU9IiYjNTg5MzQ7IiBkPSJNOTUwLjg0MDg4OSA0NTcuMTU5MTExaC04MS4xODA0NDVhMzY0LjgyODQ0NCAzNjQuODI4NDQ0IDAgMCAxLTUzLjM2MTc3NyAxMjcuMjYwNDQ1bDU3Ljc0MjIyMiA1Ny43OTkxMTFhNzIuODE3Nzc4IDcyLjgxNzc3OCAwIDEgMS0xMDMuMTM5NTU2IDEwMy4xMzk1NTVsLTU3Ljc0MjIyMi01Ny43OTkxMTFhMzUwLjQzNTU1NiAzNTAuNDM1NTU2IDAgMCAxLTEyOCA1NC44NDA4ODlWODIyLjg0MDg4OUM1ODUuMTU5MTExIDg2My4wNjEzMzMgNTUyLjIyMDQ0NCA4OTYgNTEyIDg5NlM0MzguODQwODg5IDg2My4wNjEzMzMgNDM4Ljg0MDg4OSA4MjIuODQwODg5Vjc0Mi40YTM2MS45MjcxMTEgMzYxLjkyNzExMSAwIDAgMS0xMjgtNTQuMTAxMzMzTDI1My4xNTU1NTYgNzQ2LjA0MDg4OWE3Mi44MTc3NzggNzIuODE3Nzc4IDAgMCAxLTEwMy4xMzk1NTYgMCA3Mi44MTc3NzggNzIuODE3Nzc4IDAgMCAxIDAtMTAzLjEzOTU1NkwyMDcuNjQ0NDQ0IDU4NS4xNTkxMTFhMzc0LjM4NTc3OCAzNzQuMzg1Nzc4IDAgMCAxLTUzLjM2MTc3Ny0xMjhINzMuMTU5MTExQzMyLjkzODY2NyA0NTcuMTU5MTExIDAgNDI0LjIyMDQ0NCAwIDM4NHMzMi45Mzg2NjctNzMuMTU5MTExIDczLjE1OTExMS03My4xNTkxMTFoODEuMTgwNDQ1YzkuNTAwNDQ0LTQ2LjgxOTU1NiAyOC41MDEzMzMtODkuMjAxNzc4IDUzLjM2MTc3Ny0xMjcuMjYwNDQ1bC01Ny43NDIyMjItNTcuNzk5MTExYTcyLjgxNzc3OCA3Mi44MTc3NzggMCAwIDEgMC0xMDMuMDgyNjY2IDcyLjgxNzc3OCA3Mi44MTc3NzggMCAwIDEgMTAzLjEzOTU1NiAwbDU3Ljc0MjIyMiA1Ny43NDIyMjJhMzUwLjQzNTU1NiAzNTAuNDM1NTU2IDAgMCAxIDEyOC01NC44NDA4ODl2LTgwLjQ0MDg4OUM0MzguODQwODg5LTk1LjA2MTMzMyA0NzEuNzc5NTU2LTEyOCA1MTItMTI4czczLjE1OTExMSAzMi45Mzg2NjcgNzMuMTU5MTExIDczLjE1OTExMVYyNS42YTM2MS45MjcxMTEgMzYxLjkyNzExMSAwIDAgMSAxMjggNTQuMTAxMzMzbDU3Ljc0MjIyMi01Ny43NDIyMjJjMjguNTU4MjIyLTI4LjU1ODIyMiA3NC42MzgyMjItMjguNTU4MjIyIDEwMy4xMzk1NTYgMHMyOC41NTgyMjIgNzQuNTgxMzMzIDAgMTAzLjEzOTU1NmwtNTcuNzQyMjIyIDU3Ljc0MjIyMmEzNzAuNzQ0ODg5IDM3MC43NDQ4ODkgMCAwIDEgNTMuMzYxNzc3IDEyNy4yNjA0NDRoODEuMTgwNDQ1YTczLjUwMDQ0NCA3My41MDA0NDQgMCAwIDEgMCAxNDcuMDAwODg5ek01MTIgMjM3LjczODY2N0ExNDYuNzE2NDQ0IDE0Ni43MTY0NDQgMCAwIDAgMzY1LjczODY2NyAzODQgMTQ2LjcxNjQ0NCAxNDYuNzE2NDQ0IDAgMCAwIDUxMiA1MzAuMjYxMzMzIDE0Ni43MTY0NDQgMTQ2LjcxNjQ0NCAwIDAgMCA2NTguMjYxMzMzIDM4NCAxNDYuNzE2NDQ0IDE0Ni43MTY0NDQgMCAwIDAgNTEyIDIzNy43Mzg2Njd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYWRkIiB1bmljb2RlPSImIzU4OTM2OyIgZD0iTTAgNDY5LjMzMzMzM2gxMDI0di0xNzAuNjY2NjY2SDB6TTQyNi42NjY2NjcgODk2aDE3MC42NjY2NjZ2LTEwMjRINDI2LjY2NjY2N3oiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwcmV2aWV3IiB1bmljb2RlPSImIzU4OTM1OyIgZD0iTTc3Mi4zNTIgMTk3LjYzMmM5Mi4xNiAxMjYuNTQ5MzMzIDgwLjA0MjY2NyAzMDEuOTk0NjY3LTMxLjA2MTMzMyA0MTIuNDE2QTMxNi4zMzA2NjcgMzE2LjMzMDY2NyAwIDAgMSA1MTUuNzU0NjY3IDcwMy4xNDY2NjdjLTg1LjE2MjY2NyAwLTE2NS4xMi0zMy4zNjUzMzMtMjI1LjUzNi05My4xODRhMzIwLjQyNjY2NyAzMjAuNDI2NjY3IDAgMCAxLTkyLjY3Mi0yMjUuNTM2QTMxOC40NjQgMzE4LjQ2NCAwIDAgMSA1MTYuMjY2NjY3IDY1Ljk2MjY2N2M2Ny4yNDI2NjcgMCAxMzEuNzU0NjY3IDIxLjMzMzMzMyAxODYuOTY1MzMzIDYyLjEyMjY2NmwxNjUuNzE3MzMzLTE2NS4xMmE0OC4yOTg2NjcgNDguMjk4NjY3IDAgMCAxIDY5LjEyIDAgNDguOTgxMzMzIDQ4Ljk4MTMzMyAwIDAgMSAwIDY5LjEyeiBtLTQxMi41ODY2NjcgMzAuNDY0YTIyMC42NzIgMjIwLjY3MiAwIDAgMCAxNTYuNTg2NjY3IDM3Ni43NDY2NjcgMjIwLjY3MiAyMjAuNjcyIDAgMCAwIDE1Ni41MDEzMzMtMzc2LjY2MTMzNGMtODMuNDU2LTgyLjg1ODY2Ny0yMjkuNTQ2NjY3LTgyLjg1ODY2Ny0zMTMuMDg4IDB6TTc2Mi41Mzg2NjcgODk1LjMxNzMzM0gyNjEuOTczMzMzYTI2MS4zNzYgMjYxLjM3NiAwIDAgMS0yNjEuMjA1MzMzLTI2MS4xMnYtNTAwLjM5NDY2NmEyNjEuMzc2IDI2MS4zNzYgMCAwIDEgMjYxLjEyLTI2MS4xMmgyNzEuNzAxMzMzYTQ4LjgxMDY2NyA0OC44MTA2NjcgMCAxIDEgMCA5Ny43OTJIMjYxLjk3MzMzM2ExNjIuOTg2NjY3IDE2Mi45ODY2NjcgMCAwIDAtMTYyLjgxNiAxNjIuNzMwNjY2VjYzMy42QTE2Mi45ODY2NjcgMTYyLjk4NjY2NyAwIDAgMCAyNjEuOTczMzMzIDc5Ni4zMzA2NjdoNTAwLjU2NTMzNGExNjIuOTg2NjY3IDE2Mi45ODY2NjcgMCAwIDAgMTYyLjk4NjY2Ni0xNjIuNzMwNjY3di0yNjYuMjRhNDguODEwNjY3IDQ4LjgxMDY2NyAwIDEgMSA5Ny43MDY2NjcgMFY2MzQuNjI0QTI2MC43Nzg2NjcgMjYwLjc3ODY2NyAwIDAgMSA3NjIuNTM4NjY3IDg5NS4zMTczMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icmVmcmVzaCIgdW5pY29kZT0iJiM1ODkzNzsiIGQ9Ik02OTguMDAyMjg2IDExMS4xNzcxNDNhMzE2LjU2MjI4NiAzMTYuNTYyMjg2IDAgMCAwLTE4OS44Nzg4NTctNTkuOTc3MTQzYy04Ljk5NjU3MSAwLjA3MzE0My0xNy43NzM3MTQgMC43MzE0MjktMjYuNTUwODU4IDEuNDYyODU3LTMuNjU3MTQzIDAuMzY1NzE0LTcuMTY4IDAuOTUwODU3LTEwLjc1MiAxLjQ2Mjg1N2EyNjEuMTIgMjYxLjEyIDAgMCAwLTIwLjQ4IDMuMjE4Mjg2Yy00LjE2OTE0MyAwLjczMTQyOS04LjI2NTE0MyAxLjk3NDg1Ny0xMi4yODggMi45MjU3MTQtNi41ODI4NTcgMS40NjI4NTctMTMuMTY1NzE0IDIuOTI1NzE0LTE5LjY3NTQyOCA0LjkwMDU3Mi0yLjk5ODg1NyAxLjI0MzQyOS01LjkyNDU3MSAyLjE5NDI4Ni04Ljk5NjU3MiAzLjQzNzcxNGEyNDMuMzQ2Mjg2IDI0My4zNDYyODYgMCAwIDAtMjIuMDE2IDguMTkybC00LjgyNzQyOCAxLjk3NDg1N2E1NDguNTcxNDI5IDU0OC41NzE0MjkgMCAwIDAtMjQuNzIyMjg2IDEyLjM2MTE0M2wtMS4wMjQgMC41ODUxNDNhMzI0LjQ2MTcxNCAzMjQuNDYxNzE0IDAgMCAwLTczLjg3NDI4NiA1Ni44MzJsLTEuMDI0IDEuMjQzNDI4YTI3NS4wOTAyODYgMjc1LjA5MDI4NiAwIDAgMC0xOS4zODI4NTcgMjEuODY5NzE1QTMzNi44MjI4NTcgMzM2LjgyMjg1NyAwIDAgMCAxODcuNzU3NzE0IDM4NGg4NS40MzA4NTdMMTM2LjYzMDg1NyA1OTQuMjg1NzE0IDAuMDczMTQzIDM4NGg4NS4yODQ1NzFjMC05Mi4wODY4NTcgMjguMDg2ODU3LTE3Ny41MTc3MTQgNzUuNTU2NTcyLTI0OC4yNDY4NTcgMC41ODUxNDMtMS4wOTcxNDMgMC45NTA4NTctMi4xOTQyODYgMS42MDkxNDMtMy4wNzIgNC45MDA1NzEtNy4zMTQyODYgMTAuMzg2Mjg2LTEzLjk3MDI4NiAxNS42NTI1NzEtMjAuNjk5NDI5IDIuMDQ4LTIuNDg2ODU3IDMuNzMwMjg2LTUuMDQ2ODU3IDUuODUxNDI5LTcuNzUzMTQzIDcuNzUzMTQzLTkuNTgxNzE0IDE2LjA5MTQyOS0xOC43MjQ1NzEgMjQuNTAyODU3LTI3LjY0OGwyLjM0MDU3MS0yLjQ4Njg1N2MyOC41OTg4NTctMjkuNDAzNDI5IDYwLjg1NDg1Ny01NC4xMjU3MTQgOTUuOTYzNDI5LTczLjk0NzQyOGwyLjg1MjU3MS0xLjYwOTE0M2MxMC4wOTM3MTQtNS41NTg4NTcgMjAuNDgtMTAuNzUyIDMwLjkzOTQyOS0xNS4zNmw3LjgyNjI4NS0zLjU4NGE2OTIuODA5MTQzIDY5Mi44MDkxNDMgMCAwIDEgNDAuODg2ODU4LTE1LjA2NzQyOWM4LjExODg1Ny0yLjQxMzcxNCAxNi4zODQtNC42MDggMjQuODY4NTcxLTYuNTgyODU3IDUuNTU4ODU3LTEuMjQzNDI5IDEwLjk3MTQyOS0yLjc3OTQyOSAxNi42NzY1NzEtMy44MDM0MjggMi4zNDA1NzEtMC41ODUxNDMgNC41MzQ4NTctMS4zODk3MTQgNi44NzU0MjktMS42MDkxNDMgOC4wNDU3MTQtMS40NjI4NTcgMTUuOTQ1MTQzLTIuMTk0Mjg2IDIzLjc3MTQyOS0zLjIxODI4NiAyLjkyNTcxNC0wLjUxMiA1Ljc3ODI4Ni0xLjAyNCA4LjYzMDg1Ny0xLjMxNjU3MSAxNC4xODk3MTQtMS40NjI4NTcgMjguMzc5NDI5LTIuMzQwNTcxIDQyLjU2OTE0My0yLjM0MDU3MmE0MTUuNzQ0IDQxNS43NDQgMCAwIDEgMjQzLjkzMTQyOCA3OS41MDYyODYgNTMuNTQwNTcxIDUzLjU0MDU3MSAwIDAgMSAxMi42NTM3MTQgNzMuMTQyODU3IDUwLjAyOTcxNCA1MC4wMjk3MTQgMCAwIDEtNzEuMzE0Mjg1IDEyLjk0NjI4NnpNOTM4LjQ5NiAzODRhNDQyLjg4IDQ0Mi44OCAwIDAgMS03NS4wNDQ1NzEgMjQ3LjY2MTcxNGMtMC43MzE0MjkgMS4xNzAyODYtMS4wOTcxNDMgMi40MTM3MTQtMS42ODIyODYgMy41MTA4NTdhNTM1Ljk5MDg1NyA1MzUuOTkwODU3IDAgMCAxLTE4Ljg3MDg1NyAyNC44Njg1NzIgMzAuNjQ2ODU3IDMwLjY0Njg1NyAwIDAgMC0yLjEyMTE0MyAyLjkyNTcxNCA0MjcuNzM5NDI5IDQyNy43Mzk0MjkgMCAwIDEtMTU5LjMwNTE0MyAxMjIuODhsLTUuMTIgMi4yNjc0MjlhNTA0LjUzOTQyOSA1MDQuNTM5NDI5IDAgMCAxLTMwLjIwOCAxMS40MTAyODVsLTEwLjgyNTE0MyAzLjY1NzE0M2E0MTYuNDAyMjg2IDQxNi40MDIyODYgMCAwIDEtMjYuNzcwMjg2IDcuMTY4bC0xNS4xNDA1NzEgMy41MTA4NTdjLTIuNDg2ODU3IDAuNDM4ODU3LTQuNzU0Mjg2IDEuMTcwMjg2LTcuMzE0Mjg2IDEuNjgyMjg2LTYuODAyMjg2IDEuMDk3MTQzLTEzLjM4NTE0MyAxLjgyODU3MS0yMC4xODc0MjggMi42MzMxNDMtNC42ODExNDMgMC41MTItOS4yMTYgMS4yNDM0MjktMTMuODk3MTQzIDEuNzU1NDI5YTQzMS4wMzA4NTcgNDMxLjAzMDg1NyAwIDAgMS0zMy45MzgyODYgMS44Mjg1NzFjLTIuMDQ4IDAtNC4wOTYgMC4yOTI1NzEtNi4xNDQgMC4yOTI1NzFhNDE1LjE1ODg1NyA0MTUuMTU4ODU3IDAgMCAxLTI0NC41ODk3MTQtNzkuMjg2ODU3IDUzLjM5NDI4NiA1My4zOTQyODYgMCAwIDEtMTIuNTA3NDI5LTczLjIxNmMxNi4wOTE0MjktMjMuNjk4Mjg2IDQ4LjEyOC0yOS41NDk3MTQgNzEuMzE0Mjg2LTEyLjhhMzE1LjYxMTQyOSAzMTUuNjExNDI5IDAgMCAwIDIxNi43OTU0MjkgNTguNTE0Mjg2YzIuOTI1NzE0LTAuMjE5NDI5IDUuNzA1MTQzLTAuNzMxNDI5IDguNTU3NzE0LTEuMTcwMjg2IDcuNzUzMTQzLTAuOTUwODU3IDE1LjM2LTEuOTc0ODU3IDIyLjk2Njg1Ny0zLjY1NzE0MyAzLjIxODI4Ni0wLjU4NTE0MyA2LjU4Mjg1Ny0xLjQ2Mjg1NyA5LjcyOC0yLjE5NDI4NSA3LjQ2MDU3MS0xLjc1NTQyOSAxNC43NzQ4NTctMy41MTA4NTcgMjEuOTQyODU3LTUuNzc4Mjg2IDIuNDEzNzE0LTAuNzMxNDI5IDQuNjA4LTEuNDYyODU3IDYuODAyMjg2LTIuNDEzNzE0IDguMzM4Mjg2LTIuNzc5NDI5IDE2LjQ1NzE0My01LjYzMiAyNC4zNTY1NzEtOS4wNjk3MTUgMC44Nzc3MTQtMC4yMTk0MjkgMS42ODIyODYtMC45NTA4NTcgMi40ODY4NTctMS4yNDM0MjhhMzI2LjIxNzE0MyAzMjYuMjE3MTQzIDAgMCAwIDEyMi44OC05NC43OTMxNDNBMzM3LjMzNDg1NyAzMzcuMzM0ODU3IDAgMCAwIDgzNi4yNDIyODYgMzg0aC04NS41MDRsMTM2Ljc3NzE0My0yMTAuMzU4ODU3TDEwMjMuOTI2ODU3IDM4NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJzb2xpZC10cmlhbmdsZSIgdW5pY29kZT0iJiM1ODkzODsiIGQ9Ik00NzEuMTQyNCAxMjIuMTYzMmMyMi41MjgtMjUuMDg4IDU4LjY3NTItMjUuNiA4MS43MTUyIDBsMjQ1Ljk2NDggMjczLjQwOGM0NS4xNTg0IDUwLjE3NiAyNi40MTkyIDkwLjgyODgtNDEuNTc0NCA5MC44Mjg4aC00OTAuNDk2Yy02OC4wOTYgMC04Ni43MzI4LTQwLjc1NTItNDEuNTc0NC05MC45MzEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJvYWRuZXR3b3JrIiB1bmljb2RlPSImIzU4OTM5OyIgZD0iTTUwMi43MTA4NTcgODE4LjQ2ODU3MWEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxLTM1LjYyMDU3MS0zNy4zMDI4NTd2LTE2Mi4yMzA4NTdhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMSAzNS42MjA1NzEtMzcuMzAyODU3IDM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEgMzUuNjkzNzE0IDM3LjMwMjg1N1Y3ODEuMTY1NzE0YTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEtMzUuNjkzNzE0IDM3LjMwMjg1N3ogbS0xLjYwOTE0My0zNTIuNzY4YTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEtMzUuNjkzNzE0LTM3LjMwMjg1N3YtMTYyLjMwNGEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxIDM1LjY5MzcxNC0zNy4zMDI4NTcgMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMSAzNS42MjA1NzIgMzcuMzAyODU3VjQyOC4zOTc3MTRhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMS0zNS42MjA1NzIgMzcuMzAyODU3eiBtMC0zNTMuMjhhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMS0zNS42OTM3MTQtMzcuMzAyODU3di0xNjIuMzc3MTQzYTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEgMzUuNjkzNzE0LTM3LjMwMjg1NyAzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxIDM1LjYyMDU3MiAzNy4zMDI4NTd2MTYyLjM3NzE0M2EzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxLTM1LjYyMDU3MiAzNy4zMDI4NTd6IG01MDYuNzMzNzE1LTE5My4wOTcxNDJsLTE4OS4xNDc0MjkgODczLjMyNTcxNGMtNC40NjE3MTQgMjAuNzcyNTcxLTIzLjY5ODI4NiAzMy43MTg4NTctNDIuODYxNzE0IDI5LjAzNzcxNC0xOS4yMzY1NzEtNC43NTQyODYtMzEuMTU4ODU3LTI1LjM4MDU3MS0yNi42OTcxNDMtNDYuMDhsMTg5LjE0NzQyOC04NzMuMzk4ODU3YzQuNTM0ODU3LTIwLjc3MjU3MSAyMy42OTgyODYtMzMuNzE4ODU3IDQyLjkzNDg1OC0yOS4wMzc3MTQgMTkuMjM2NTcxIDQuNzU0Mjg2IDMxLjE1ODg1NyAyNS4zODA1NzEgMjYuNjI0IDQ2LjA4ek0yMzMuODM3NzE0IDgyMS42ODY4NTdjLTE5LjE2MzQyOSA0LjY4MTE0My0zOC40LTguMjY1MTQzLTQyLjg2MTcxNC0yOS4wMzc3MTRMMS44Mjg1NzEtODAuNjc2NTcxYy00LjUzNDg1Ny0yMC43NzI1NzEgNy4zODc0MjktNDEuMzk4ODU3IDI2LjYyNC00Ni4wOCAxOS4yMzY1NzEtNC43NTQyODYgMzguNCA4LjE5MiA0Mi45MzQ4NTggMjguOTY0NTcxbDE4OS4xNDc0MjggODczLjMyNTcxNGM0LjQ2MTcxNCAyMC43NzI1NzEtNy40NjA1NzEgNDEuMzk4ODU3LTI2LjY5NzE0MyA0Ni4wOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJyZXR1cm4iIHVuaWNvZGU9IiYjNTg5NDA7IiBkPSJNOTQxLjMxMiAzNDIuNzg0SDI0MC4zODRsMzQ3LjItMzQ3LjItNTguMjQtNTguMjRMODIuNjg4IDM4NGw0NDYuNzIgNDQ2LjY1NiA1OC4yNC01OC4yNC0zNDcuMjY0LTM0Ny4yaDcwMC45Mjh6TTE5OS4yMzIgMzgxLjQ0bDMuNjQ4LTMuMnY2LjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icGFja3VwIiB1bmljb2RlPSImIzU4OTQxOyIgZD0iTTEwNi40OTYgODAwaDgyMC40MTZjMjIuNjU2IDAgNDAuOTYgMjEuNTA0IDQwLjk2IDQ4cy0xOC4zMDQgNDgtNDAuOTYgNDhIMTA2LjQ5NmMtMjIuNTkyIDAtNDAuOTYtMjEuNTA0LTQwLjk2LTQ4czE4LjM2OC00OCA0MC45Ni00OHpNNTQwLjIyNCA0NDhIOTkuNzc2QzgwIDQ0OCA2NCA0MjYuNDk2IDY0IDQwMHMxNi00OCAzNS44NC00OGg0NDAuMzJjMTkuODQgMCAzNS44NCAyMS41MDQgMzUuODQgNDhTNTYwIDQ0OCA1NDAuMTYgNDQ4eiBtMzg1LjE1Mi00NDhIMTA1LjAyNGMtMjIuNjU2IDAtNDEuMDI0LTIxLjUwNC00MS4wMjQtNDhzMTguMzY4LTQ4IDQwLjk2LTQ4aDgyMC40OGMyMi41OTIgMCA0MC45NiAyMS41MDQgNDAuOTYgNDhzLTE4LjM2OCA0OC00MC45NiA0OHogbTMxLjQyNCA2MDcuOTM2bC0yNDAtMjA4IDI0MC0yMDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ic2hhcmUiIHVuaWNvZGU9IiYjNTg5NDI7IiBkPSJNOTE1LjUyIDIzOC43MnYtMjE3LjcyOGMwLTM3LjQ0LTMwLjcyLTY4Ljg2NC02Ni44MTYtNjguODY0bC03MDYuNTYtMS4yOGMtMzYuMDk2IDAtNjUuNiAzMC40LTY1LjYgNjcuODRsMS4yMTYgNzI4LjA2NGMwIDM3LjMxMiAzMC43MiA2OC45MjggNjYuODggNjguOTI4aDM5MC43ODRWODk1LjgwOEgxNDQuNjRDNjIuMDE2IDg5NS44MDggMC4xOTIgODA5LjY2NCAwLjE5MiA3MzIuNjA4di03MTMuODU2YzAtODAuNzY4IDYzLjYxNi0xNDYuNTYgMTQyLjIwOC0xNDYuNTZoNjkyLjczNmM4Mi44MTYgMCAxNTguMTQ0IDcwLjk3NiAxNTguMTQ0IDE0OC44VjIzOC43MnogbS0xODMuMTY4IDU1My40NzJsMjkxLjQ1Ni0yODIuMTEyLTI5MS40NTYtMjgxLjk4NFYzODkuMjQ4cy0yODkuMjggMzEuMDQtNDU4LjA0OC0yMDEuNmMwIDAgNTMuMTIgNDQzLjM5MiA0NTguMDQ4IDQ0My4zOTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYmFja2hvbWVwYWdlIiB1bmljb2RlPSImIzU4OTY5OyIgZD0iTTcyOS4yNDggNDguMTI4aC0xMzkuOTY4YTE5Ljg0IDE5Ljg0IDAgMCAwLTE5Ljg0IDE5Ljg0djI2OS4xMmExOC4wNDggMTguMDQ4IDAgMCAxLTE4LjA0OCAxOC4wMTZoLTc2LjczNmExOC4wNDggMTguMDQ4IDAgMCAxLTE4LjA0OC0xOC4wMTZ2LTI2OS4xMmExOS44NCAxOS44NCAwIDAgMC0xOS44NC0xOS44NEgyOTIuNDhhNTguNDY0IDU4LjQ2NCAwIDAgMC01OC40NjQgNTguNDY0djI0Ny4zNmExMy40NCAxMy40NCAwIDAgMS0xMy40NCAxMy40NEgxODMuNzQ0Yy0zNC40IDAtNTEuODcyIDQxLjI4LTI3Ljk2OCA2NS45ODRsMzI4LjMyIDMzOS4wNGEzOC45MTIgMzguOTEyIDAgMCAwIDU1LjY0OCAwLjMyTDg3Mi41MTIgNDM2LjQ4YzI1LjM3Ni0yNS42IDcuMi02OS4xMi0yOC44MzItNjkuMTJIODA0LjE2YTE0LjQ2NCAxNC40NjQgMCAwIDEtMTQuNDY0LTE0LjQ2NHYtMjQ0LjM1MmE2MC40OCA2MC40OCAwIDAgMC02MC40OC02MC40OHogbS04NS42NjQgNDkuODg4aDcxLjk2OGMxMy40MDggMCAyNC4yNTYgMTAuODggMjQuMjU2IDI0LjI1NnYyNzAuMjA4YzAgMTMuNjk2IDExLjEwNCAyNC44IDI0LjggMjQuOGg0Ni40OTZhNC4yODggNC4yODggMCAwIDEgMy4wNCA3LjI5Nkw1MjMuOTY4IDcxNy43NmExNi4zODQgMTYuMzg0IDAgMCAxLTIzLjQyNC0wLjEyOGwtMjkwLjg4LTMwMC4zODRoNDkuNDcyYzEzLjY5NiAwIDI0LjgtMTEuMTA0IDI0LjgtMjQuOHYtMjcwLjIwOGMwLTEzLjQwOCAxMC44OC0yNC4yNTYgMjQuMjU2LTI0LjI1Nmg3NC4yNGMxMy40NCAwIDI0LjMyIDEwLjg4IDI0LjMyIDI0LjI1NlYzMzQuNzJjMCAzOC44NDggMzEuNDU2IDcwLjMwNCA3MC4yNzIgNzAuMzA0aDcyYzM4LjgxNiAwIDcwLjMwNC0zMS40NTYgNzAuMzA0LTcwLjMwNHYtMjEyLjQxNmMwLTEzLjQwOCAxMC44OC0yNC4yNTYgMjQuMjU2LTI0LjI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJNeU1hcHMiIHVuaWNvZGU9IiYjNTg5NzA7IiBkPSJNODMwLjU5MiA3MjguNTc2Yy01LjE1MiAwLTEwLjQzMi0wLjg2NC0xNS41ODQtMi44MTZsLTE3Mi44OTYtNjIuODE2YTQ1LjI0OCA0NS4yNDggMCAwIDAtMTUuNTg0LTIuNzJjLTUuNzYgMC0xMS40NTYgMS4wNTYtMTYuODY0IDMuMjY0bC0xOTUuMiA3OC4xMTJhNDUuNiA0NS42IDAgMCAxLTMyLjQ0OCAwLjUxMkwxNzcuOTg0IDY2Ny45NjhhNDUuNDQgNDUuNDQgMCAwIDEtMjkuOTItNDIuNzg0di01NDAuMTZhNDUuNTA0IDQ1LjUwNCAwIDAgMSA2MC45OTItNDIuNjg4bDE3Mi44OTYgNjIuODQ4YzQuOTkyIDEuODI0IDEwLjMwNCAyLjY4OCAxNS41NTIgMi42ODggNS43NiAwIDExLjQ4OC0xLjA1NiAxNi44OTYtMy4ybDE5NS4yLTc4LjE3NmE0NS4yNDggNDUuMjQ4IDAgMCAxIDMyLjQ4LTAuNTEybDIwMy45NjggNzQuMjA4YTQ1LjQ0IDQ1LjQ0IDAgMCAxIDI5LjkyIDQyLjc4NFY2ODMuMTA0YzAgMjUuOTUyLTIxLjM0NCA0NS40NzItNDUuNDQgNDUuNDcyek0xOTMuNDcyIDg0LjkyOFY2MjUuMTUybDE4Mi4wMTYgNjYuMTQ0di01NDAuNzM2YTgzLjkzNiA4My45MzYgMCAwIDEtOS4wODgtMi44MTZ6IG0yMjcuNTIgNjUuMjhWNjg5Ljg4OGwxNzEuNzc2LTY4LjY3MmMzLjM5Mi0xLjMxMiA2LjgxNi0yLjQ2NCAxMC4yNC0zLjQyNHYtNTM5LjY4bC0xNzEuNzc2IDY4LjY3MmE3MC4yNCA3MC4yNCAwIDAgMS0xMC4yNCAzLjQyNHogbTQwOS41MDQtNy4zNmwtMTgxLjk4NC02Ni4xNDRWNjE3LjQ0YzMuMDQgMC44IDYuMTEyIDEuNjY0IDkuMDg4IDIuODE2bDE3Mi44OTYgNjIuODE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IkNyZWF0ZU1hcCIgdW5pY29kZT0iJiM1ODk3MTsiIGQ9Ik01MTIgNzM2QzMwMC4wMzIgNzM2IDEyOCA1NjMuOTY4IDEyOCAzNTJzMTcyLjAzMi0zODQgMzg0LTM4NCAzODQgMTcyLjAzMiAzODQgMzg0UzcyMy45NjggNzM2IDUxMiA3MzZ6IG0wLTcxNC4yNGMtMTgyLjAxNiAwLTMzMC4yNCAxNDguMjI0LTMzMC4yNCAzMzAuMjRTMzI5Ljk4NCA2ODIuMjQgNTEyIDY4Mi4yNCA4NDIuMjQgNTM0Ljc4NCA4NDIuMjQgMzUyIDY5NC4wMTYgMjEuNzYgNTEyIDIxLjc2ek02NjcuMTM2IDM4NS43OTJoLTEyMS4zNDR2MTIxLjM0NGMwIDE0LjU5Mi0xMi4yODggMjYuODgtMjYuODggMjYuODhzLTI2Ljg4LTEyLjI4OC0yNi44OC0yNi44OHYtMTIxLjM0NGgtMTIxLjM0NGMtMTQuNTkyIDAtMjYuODgtMTIuMjg4LTI2Ljg4LTI2Ljg4czEyLjI4OC0yNi44OCAyNi44OC0yNi44OGgxMjEuMzQ0di0xMjEuMzQ0YzAtMTQuNTkyIDEyLjI4OC0yNi44OCAyNi44OC0yNi44OHMyNi44OCAxMi4yODggMjYuODggMjYuODh2MTIxLjM0NGgxMjEuMzQ0YzE0LjU5MiAwIDI2Ljg4IDEyLjI4OCAyNi44OCAyNi44OHMtMTIuMjg4IDI2Ljg4LTI2Ljg4IDI2Ljg4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZlZWRiYWNrIiB1bmljb2RlPSImIzU4OTcyOyIgZD0iTTQxMC4zMDQgMTUyLjg5NmwtMTc1LjY0OC0xMzguNjg4djEzOC42ODhoLTI4LjQ0OGE2NCA2NCAwIDAgMC02NCA2NFY2NDMuNTJhNjQgNjQgMCAwIDAgNjQgNjRoNjExLjU4NGE2NCA2NCAwIDAgMCA2NC02NHYtNDI2LjY1NmE2NCA2NCAwIDAgMC02NC02NHogbS03LjM2IDQ2LjIwOGg0MDAuNjRhMzIgMzIgMCAwIDEgMzIgMzJWNjI5LjM0NGEzMiAzMiAwIDAgMS0zMiAzMkgyMjAuNDE2YTMyIDMyIDAgMCAxLTMyLTMydi0zOTguMjRhMzIgMzIgMCAwIDEgMzItMzJoMjguNDQ4YTMyIDMyIDAgMCAwIDMyLTMydi01NS44MDhsMTAyLjIwOCA4MC44OTZhMzIgMzIgMCAwIDAgMTkuODQgNi45MTJ6TTI4MC44OTYgMzg0aDQ2Mi4yMDh2LTQ2LjIwOEgyODAuODk2eiBtMCAxMzguNjU2aDQ2Mi4yMDh2LTQ2LjIwOEgyODAuODk2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNraW4xIiB1bmljb2RlPSImIzU4OTczOyIgZD0iTTc0MC4xOTIgNzgwdi01NmwxNDIuODE2LTE0MS40MDgtNzkuODA4LTc5Ljc3NmE1NS4yIDU1LjIgMCAwIDEtMzcuNzkyIDEzLjk4NCA1Ni43NjggNTYuNzY4IDAgMCAxLTU3LjQwOC01Ny40MDh2LTI5NS4zOTJjMC0zMC44MTYtMjUuMTg0LTU2LTU2LTU2aC0yODBjLTMwLjc4NCAwLTU2IDI1LjE4NC01NiA1NnYyOTUuMzkyYTU2Ljc2OCA1Ni43NjggMCAwIDEtNTcuNDA4IDU3LjQwOGMtMTMuOTg0IDAtMjgtNS42LTM3Ljc5Mi0xNC4wMTZMMTQwLjk5MiA1ODIuNTkybDE0MS40MDggMTQxLjQwOGgzNS4wMDhsMS40MDgtMS40MDhDMzU4LjAxNiA2NjMuODA4IDQzMi4xOTIgNjI1Ljk4NCA1MTIgNjI1Ljk4NHMxNTQuMDE2IDM2LjQxNiAxOTMuMTg0IDk2LjY0YzAgMS4zNzYgMS40MDggMS4zNzYgMS40MDggMS4zNzZoMzMuNnogbS00MjEuMzc2IDBIMjg4Yy0xOS41ODQgMC0zMy42LTUuNi00My4zOTItMTYuOEwxMDEuNzYgNjIxLjc5MmMtMjIuNC0yMi40LTIyLjQtNTcuNDA4IDAtNzguNEwxODQuNDE2IDQ2MC44YzkuNzkyLTkuNzkyIDIzLjc3Ni0xNS4zOTIgMzYuMzg0LTE1LjM5MnMyNi41OTIgNS42IDM2LjQxNiAxNS4zOTJoMS4zNzZjMS40MDggMCAxLjQwOCAwIDEuNDA4LTEuNDA4di0yOTUuMzkyYTExMi4zMiAxMTIuMzIgMCAwIDEgMTEyLTExMmgyODBhMTEyLjMyIDExMi4zMiAwIDAgMSAxMTIgMTEydjI5NS4zOTJjMCAxLjQwOCAwIDEuNDA4IDEuNDA4IDEuNDA4aDEuMzc2YzkuODI0LTkuNzkyIDIzLjgwOC0xNS4zOTIgMzYuNDE2LTE1LjM5MiAxMy45ODQgMCAyNi41OTIgNS42IDM2LjM4NCAxNS4zOTJsODIuNjI0IDgyLjU5MmMyMi40IDIyLjQgMjIuNCA1Ny40MDggMCA3OC40TDc4MC44IDc2My4yYTU2LjA2NCA1Ni4wNjQgMCAwIDEtNDAuNjA4IDE2LjhoLTM1LjAwOGMtMTkuNTg0IDAtMzYuMzg0LTkuNzkyLTQ3LjU4NC0yNi41OTItMjkuNDA4LTQzLjQyNC04NC03MS40MjQtMTQ3LjAwOC03MS40MjRzLTExNy42IDI5LjQ0LTE0Ny4wMDggNzEuNDI0Yy04LjM4NCAxNi44LTI2LjU2IDI2LjU5Mi00NC44IDI2LjU5MnpNMzg0IDQ4MGgxMjh2LTE2MGgtMTI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLSIgdW5pY29kZT0iJiM1ODk3NDsiIGQ9Ik02MTMuNjMyIDgzOS4zNmMxNC41MjggMTguNDMyIDIxLjY5NiAxNS4wNCAxNS44MDgtOEw1NTUuMzkyIDU0MC40OCA3OTguNzg0IDQ2Ny4yYzExLjItMy4zMjggMTQuNTkyLTEzLjYzMiA3LjQ4OC0yMy4wNGwtMzg3LjUyLTUxNi4wOTZjLTE0LjE0NC0xOC45NDQtMjAuODY0LTE1LjgwOC0xNC45MTIgNy4xMDRMNDgyLjI0IDIzNi44IDIwMC45NiAyODYuMjcyYy0xMS41ODQgMi4wNDgtMTUuMTY4IDExLjA3Mi03Ljc0NCAyMC40OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJhY2NvdW50IiB1bmljb2RlPSImIzU4OTc1OyIgZD0iTTg0Ny42OCA2NjEuNDRjMTcuNiAwIDMxLjg3Mi0xNC4yNzIgMzEuODcyLTMxLjg0di00OTEuMmMwLTE3LjU2OC0xNC4yNzItMzEuODcyLTMxLjg3Mi0zMS44NzJIMTc2LjMyYTMxLjkwNCAzMS45MDQgMCAwIDAtMzEuODcyIDMxLjg3MlY2MjkuNmMwIDE3LjU2OCAxNC4yNzIgMzEuODcyIDMxLjg3MiAzMS44NzJ6IG0wIDUyLjUxMkgxNzYuMzJhODQuMzg0IDg0LjM4NCAwIDAgMS04NC4zODQtODQuMzUydi00OTEuMkE4NC4zODQgODQuMzg0IDAgMCAxIDE3Ni4zMiA1NC4wOGg2NzEuMzZhODQuMzg0IDg0LjM4NCAwIDAgMSA4NC4zODQgODQuMzUyVjYyOS42QTg0LjM4NCA4NC4zODQgMCAwIDEgODQ3LjY4IDcxMy45MnpNODEyLjQ0OCA1MzcuNzZjMC0xNC40MzItMTEuODQtMjYuMjQtMjYuMjQtMjYuMjRoLTE3Mi40OGMtMTQuNDMyIDAtMjYuMjQgMTEuODA4LTI2LjI0IDI2LjI0czExLjgwOCAyNi4yNCAyNi4yNCAyNi4yNGgxNzIuNDhjMTQuNCAwIDI2LjI0LTExLjg0IDI2LjI0LTI2LjI0eiBtMC0xMjMuNzQ0YzAtMTQuNDMyLTExLjg0LTI2LjI0LTI2LjI0LTI2LjI0aC0xMTYuOTZhMjYuMzM2IDI2LjMzNiAwIDAgMC0yNi4yNCAyNi4yNGMwIDE0LjQzMiAxMS44MDggMjYuMjQgMjYuMjQgMjYuMjRoMTE2LjkyOGMxNC40NjQgMCAyNi4yNC0xMS44MDggMjYuMjQtMjYuMjR6IG0wLTEyMy43NDRjMC0xNC40LTExLjg0LTI2LjI0LTI2LjI0LTI2LjI0aC02NS43NmMtMTQuNDMyIDAtMjYuMjQgMTEuODQtMjYuMjQgMjYuMjRzMTEuODA4IDI2LjI0IDI2LjI0IDI2LjI0aDY1LjcyOGMxNC40NjQgMCAyNi4yNC0xMS43NzYgMjYuMjQtMjYuMjR6TTQ4MS4wMjQgMzc0LjA4YTE4Ny41MiAxODcuNTIgMCAwIDAgMTA2LjQ2NC0xNjkuMTUyaC01Mi41MTJhMTM0LjExMiAxMzQuMTEyIDAgMCAxLTM5LjU1MiA5NS40NTYgMTM0LjAxNiAxMzQuMDE2IDAgMCAxLTg4Ljg5NiAzOS4zOTIgMTE0LjE3NiAxMTQuMTc2IDAgMCAwLTEzLjEyIDBjLTMzLjYtMS42LTY0Ljk2LTE1LjQyNC04OC44OTYtMzkuMzZhMTM0LjExMiAxMzQuMTEyIDAgMCAxLTM5LjUyLTk1LjQ4OEgyMTIuNDhhMTg3LjUyIDE4Ny41MiAwIDAgMCAxMDYuNDY0IDE2OS4xMiAxMTIuNTEyIDExMi41MTIgMCAxIDAgMTYyLjA4IDB6IG0tMTQxLjA1NiA3OC4wMTZjMC0zMS4yMzIgMjQtNTYuOTYgNTQuNDY0LTU5Ljc0NGExOTAuMTEyIDE5MC4xMTIgMCAwIDAgMTEuMDcyIDAgNjAuMDY0IDYwLjA2NCAwIDAgMSA1NC40NjQgNTkuNzQ0YzAgMzMuMDU2LTI2Ljg4IDYwLTYwIDYwcy02MC0yNi45NDQtNjAtNjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMSIgdW5pY29kZT0iJiM1ODk3NjsiIGQ9Ik04MjMuMjMyIDUxMkg3MDRWNjcyYzAgMTcuNi0xNC40IDMyLTMyIDMyaC01NzZjLTE3LjYgMC0zMi0xNC40LTMyLTMydi00NDhjMC0xNy42IDE0LjQtMzIgMzItMzJIMTI4YzAtNzAuNCA1Ny42LTEyOCAxMjgtMTI4czEyOCA1Ny42IDEyOCAxMjhoMjU2YzAtNzAuNCA1Ny42LTEyOCAxMjgtMTI4czEyOCA1Ny42IDEyOCAxMjhoMzJjMTcuNiAwIDMyIDE0LjQgMzIgMzJWMzE0LjQzMmMwIDMuMi0wLjgzMiA2LjQtMi4zNjggOC43NjhsLTEyMC44MzIgMTgxLjU2OEExNS43NDQgMTUuNzQ0IDAgMCAxIDgyMy4yMzIgNTEyek0yNjguOCAxMjkuNmE2NCA2NCAwIDEgMC0yNC43NjggMTI1LjYzMiA2NCA2NCAwIDAgMCA3NS4yLTc1LjJjLTUuNjMyLTI1LjYtMjUuNi00NS42MzItNTAuNDMyLTUwLjQzMnogbTUxMiAwYTY0IDY0IDAgMSAwLTI0Ljc2OCAxMjUuNjMyIDY0IDY0IDAgMCAwIDc1LjEzNi03NS4yYy01LjU2OC0yNS42LTI1LjYtNDUuNjMyLTUwLjM2OC01MC40MzJ6TTcwNCAzMjBWNDQ4aDk1LjIzMmM1LjU2OCAwIDEwLjM2OC0yLjM2OCAxMi44LTcuMjMyTDg5NiAzMjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMiIgdW5pY29kZT0iJiM1ODk3NzsiIGQ9Ik05MjggNTEyYTMyIDMyIDAgMCAwLTE0LjA4IDMuMkw1NDQgNzA0IDE3NC4wOCA1MTYuNDhBMzIuODk2IDMyLjg5NiAwIDAgMCAxNDUuOTIgNTc2TDU0NCA3NzMuMTIgOTQyLjA4IDU3NmEzMi43NjggMzIuNzY4IDAgMCAwLTE0LjA4LTY0ek0zODQgMTkySDE5MnYtMTkyaDE5MnogbTI1NiAwSDQ0OHYtMTkyaDE5MnogbTI1NiAwaC0xOTJ2LTE5MmgxOTJ6IG0tMTI4IDI1Nkg1NzZ2LTE5MmgxOTJ6TTUxMiA0NDhIMzIwdi0xOTJoMTkyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTMiIHVuaWNvZGU9IiYjNTg5Nzg7IiBkPSJNNjk2LjMyIDM2MC40NDhjMC0yNi42MjQtNC45MjgtNTEuNTItMTQuODQ4LTc0Ljc1MnMtMjMuNTUyLTQzLjUyLTQwLjk2LTYwLjkyOC0zNy43Ni0zMS4wNC02MC45MjgtNDAuOTYtNDguMTI4LTE0Ljg0OC03NC43NTItMTQuODQ4LTUxLjUyIDQuOTI4LTc0Ljc1MiAxNC44NDgtNDMuNTIgMjMuNTUyLTYwLjkyOCA0MC45Ni0zMS4wNCAzNy43Ni00MC45NiA2MC45MjgtMTQuODQ4IDQ4LjEyOC0xNC44NDggNzQuNzUyIDQuOTI4IDUxLjUyIDE0Ljg0OCA3NC43NTIgMjMuNTUyIDQzLjUyIDQwLjk2IDYwLjkyOCAzNy43NiAzMS4wNCA2MC45MjggNDAuOTYgNDguMTI4IDE0Ljg0OCA3NC43NTIgMTQuODQ4IDUxLjUyLTQuOTI4IDc0Ljc1Mi0xNC44NDggNDMuNTItMjMuNTUyIDYwLjkyOC00MC45NiAzMS4wNC0zNy43NiA0MC45Ni02MC45MjggMTQuODQ4LTQ4LjEyOCAxNC44NDgtNzQuNzUyeiBtNjQuNTEyLTM3Ny44NTZjMC03LjQ4OC0zLjA3Mi0xNC4zMzYtOS4yMTYtMjAuNDhzLTE0LjAxNi0xMS40NTYtMjMuNTUyLTE1Ljg3Mi0yMC44LTgtMzMuNzkyLTEwLjc1Mi0yNS45Mi00LjA5Ni0zOC45MTItNC4wOTZIMzQ3LjEzNmMtMTEuNTg0IDAtMjMuMjMyIDEuMzQ0LTM0LjgxNiA0LjA5NnMtMjIuMDE2IDYuMzM2LTMxLjIzMiAxMC43NTItMTYuNzA0IDkuNzI4LTIyLjUyOCAxNS44NzItOC43MDQgMTIuOTkyLTguNzA0IDIwLjQ4eiBtOS4yMTYgODY1LjI4YzI5LjM3NiAwIDUwLjY4OC04LjUxMiA2NC0yNS42czE5Ljk2OC0zNy41NjggMTkuOTY4LTYxLjQ0di02NTcuNDA4YzAtMjMuODcyLTguNTEyLTQ0LjM1Mi0yNS42LTYxLjQ0cy0zOC41OTItMjUuNi02NC41MTItMjUuNkgyNDUuNzZjLTI2LjYyNCAwLTQ4LjEyOCA4LjUxMi02NC41MTIgMjUuNnMtMjQuNTc2IDM3LjU2OC0yNC41NzYgNjEuNDRWNzYwLjgzMmMwIDIzLjg3MiA3LjQ4OCA0NC4xNiAyMi41MjggNjAuOTI4czM1LjUyIDI1LjA4OCA2MS40NCAyNS4wODh6TTIyNS4yOCA3MjguMDY0YzAtNy40ODggMi41Ni0xNC41MjggNy42OC0yMC45OTJzMTMuNDQtOS43MjggMjUuMDg4LTkuNzI4aDc3LjgyNGMxMS41ODQgMCAyMC4xNiAzLjkwNCAyNS42IDExLjc3NnM4LjE5MiAxNS41NTIgOC4xOTIgMjMuMDR2MTUuMzZjMCA3LjQ4OC0zLjA3MiAxNC4zMzYtOS4yMTYgMjAuNDhzLTE0LjcyIDkuMjE2LTI1LjYgOS4yMTZIMjYwLjA5NmMtMTEuNTg0IDAtMjAuMjg4LTMuMi0yNi4xMTItOS43MjhzLTguNzA0LTEzLjQ0LTguNzA0LTIwLjk5MnogbTI3OS41NTItNjIzLjYxNmMzNS41MiAwIDY4LjggNi42NTYgOTkuODQgMTkuOTY4czU4LjI0IDMxLjU1MiA4MS40MDggNTQuNzg0IDQxLjQ3MiA1MC4zNjggNTQuNzg0IDgxLjQwOGEyNTAuNzUyIDI1MC43NTIgMCAwIDEgMTkuOTY4IDk5Ljg0YzAgMzQuODE2LTYuNjU2IDY3Ljc3Ni0xOS45NjggOTguODE2cy0zMS41NTIgNTguMjQtNTQuNzg0IDgxLjQwOC01MC4zNjggNDEuNDcyLTgxLjQwOCA1NC43ODQtNjQuMzIgMTkuOTY4LTk5Ljg0IDE5Ljk2OGMtMzQuODE2IDAtNjcuNzc2LTYuNjU2LTk4LjgxNi0xOS45NjhzLTU4LjI0LTMxLjU1Mi04MS40MDgtNTQuNzg0LTQxLjQ3Mi01MC4zNjgtNTQuNzg0LTgxLjQwOC0xOS45NjgtNjQtMTkuOTY4LTk4LjgxNmMwLTM1LjUyIDYuNjU2LTY4LjggMTkuOTY4LTk5Ljg0IDEzLjMxMi0zMS4wNCAzMS41NTItNTguMjQgNTQuNzg0LTgxLjQwOHM1MC4zNjgtNDEuNDcyIDgxLjQwOC01NC43ODQgNjQtMTkuOTY4IDk4LjgxNi0xOS45Njh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNCIgdW5pY29kZT0iJiM1ODk3OTsiIGQ9Ik02NzcuNzYgMTg0Ljc2OGExOC43NTIgMTguNzUyIDAgMCAwLTUuMTg0IDEyLjU0NGMwIDkuNDcyIDcuNjggMTcuMjE2IDE3LjA4OCAxNy4zNDRoMTAwLjQxNmM5LjYgMCAxNy4zNDQgNy44MDggMTcuMzQ0IDE3LjQwOGExNy45ODQgMTcuOTg0IDAgMCAxLTUuNTA0IDEyLjQ4TDY1Mi44IDM5NC40OTZhMjAuOTI4IDIwLjkyOCAwIDAgMC00LjI4OCAxMS44NCAxNy40MDggMTcuNDA4IDAgMCAwIDE3LjI4IDE3LjI4aDc5LjM2YzkuNiAwLjEyOCAxNy4zNDQgNy45MzYgMTcuMzQ0IDE3LjUzNmExNy4yOCAxNy4yOCAwIDAgMS01LjMxMiAxMi40MTZMNjA4LjU3NiA2MDIuNDMybC0wLjk2IDAuOTZhMTcuNDA4IDE3LjQwOCAwIDAgMCAxMi42MDggMjkuMjQ4aDYwLjE2YzkuNiAwIDE3LjI4IDcuODA4IDE3LjI4IDE3LjQ3MmExNy4xNTIgMTcuMTUyIDAgMCAxLTQuNjcyIDExLjM5MmgwLjM4NEw1NTcuNzYgODI1LjA4OEExNy4yOCAxNy4yOCAwIDAgMSA1NDMuODcyIDgzMmExNy4yOCAxNy4yOCAwIDAgMS0xMy44ODgtNi45MTJMMzk0Ljg4IDY2MS41MDRhMTcuMTUyIDE3LjE1MiAwIDAgMS00LjczNi0xMS4zOTJjMC05LjYgNy43NDQtMTcuNDA4IDE3LjM0NC0xNy40MDhoNjAuMTZhMTYuODMyIDE2LjgzMiAwIDAgMCAxMi44LTI5LjI0OGwtMS4wMjQtMS4wMjQtMTQ4LjQ4LTE0OC44NjRhMTcuMjggMTcuMjggMCAwIDEtNS4zNzYtMTIuNDE2YzAtOS41MzYgNy42MTYtMTcuMjggMTcuMDg4LTE3LjQ3Mmg3OS40ODhhMTcuMjggMTcuMjggMCAwIDAgMTcuMzQ0LTE3LjM0NCAyMC45MjggMjAuOTI4IDAgMCAwLTQuMzUyLTExLjg0TDI4NS44MjQgMjQ0LjQ4YTE3Ljk4NCAxNy45ODQgMCAwIDEtNS42OTYtMTIuNDhjMC05LjYgNy44MDgtMTcuNDA4IDE3LjM0NC0xNy40MDhoMTAwLjY3MmExNy40MDggMTcuNDA4IDAgMCAwIDE3LjIxNi0xNy4yOCAxOC43NTIgMTguNzUyIDAgMCAwLTUuMTItMTIuNjA4bC0xNDguNTQ0LTE0OC40OC0wLjY0LTAuNjRhMTcuMjggMTcuMjggMCAwIDEgMC0yNC40NDggMTcuNzI4IDE3LjcyOCAwIDAgMSAxMi40OC01LjUwNGgyMzUuNjQ4Vi02NGw2OS4zNzYgMC41NzZ2NjkuMTJoMjM1LjM5MmExOC4zMDQgMTguMzA0IDAgMCAxIDE4LjA0OCAxNy42NjQgMTcuMjggMTcuMjggMCAwIDEtNC45MjggMTIuMzUyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTUiIHVuaWNvZGU9IiYjNTg5ODA7IiBkPSJNMjk0LjE0NCAzMjcuMTA0bDEuMzQ0LTEuNjY0IDE1NC41Ni0xNjQuOTI4YzMzLjkyLTM5LjkzNiA5MC42ODgtMzkuOTM2IDEyNS4xMiAwLjUxMmwxNTMuNiAxNjQuODY0IDMuNzc2IDQuMDMyIDIuMjQgMi40MzJBMTQ2LjY4OCAxNDYuNjg4IDAgMCAxIDc2OCA0MjcuNTg0YTE0OC40OCAxNDguNDggMCAwIDEtMjU2IDEwMi4yNzIgMTQ4LjQ4IDE0OC40OCAwIDAgMS0yNTYtMTAyLjI3MmMwLTM3LjEyIDE0LjA4LTczLjQwOCAzOC4xNDQtMTAwLjQ4ek01MTItMzJhNDE2IDQxNiAwIDEgMCAwIDgzMiA0MTYgNDE2IDAgMCAwIDAtODMyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTYiIHVuaWNvZGU9IiYjNTg5ODE7IiBkPSJNNjA4IDMyMGEyMi40IDIyLjQgMCAwIDAgMC00NC44SDUzNC40di0xOS4yYTIyLjQgMjIuNCAwIDEgMC00NC44IDB2MTkuMkg0MTZhMjIuNCAyMi40IDAgMSAwIDAgNDQuOGg3My42djUxLjJINDE2YTIyLjQgMjIuNCAwIDAgMCAwIDQ0LjhoNjQuMzg0bC0wLjI1NiAwLjE5Mi02NCA2NGEyMi40IDIyLjQgMCAwIDAgMzEuNzQ0IDMxLjY4bDY0LTY0TDUxMiA0NDcuNjE2bDAuMTkyIDAuMjU2IDY0IDY0YTIyLjQgMjIuNCAwIDEgMCAzMS42MTYtMzEuNjhsLTY0LTY0LTAuMTkyLTAuMTkySDYwOGEyMi40IDIyLjQgMCAwIDAgMC00NC44SDUzNC40VjMyMHogbTI1NiAxNjBoMzJWNjQwLjE5MkE2NCA2NCAwIDAgMSA4MzEuOTM2IDcwNEgxOTIuMDY0QTY0IDY0IDAgMCAxIDEyOCA2NDAuMTkyVjQ4MGgzMkMyMTIuOTI4IDQ4MCAyNTYgNDM2LjkyOCAyNTYgMzg0cy00My4wNzItOTYtOTYtOTZIMTI4di0xNjAuMTkyQTY0IDY0IDAgMCAxIDE5Mi4wNjQgNjRoNjM5Ljg3MkE2NCA2NCAwIDAgMSA4OTYgMTI3LjgwOFYyODhoLTMyYy01Mi45MjggMC05NiA0My4wNzItOTYgOTZzNDMuMDcyIDk2IDk2IDk2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTciIHVuaWNvZGU9IiYjNTg5ODI7IiBkPSJNMTY0Ljk5MiAyODcuMzZjLTIzLjY4LTQyLjgxNi02Ny4xMzYtMTIwLjgzMiA5LjY2NC0xNzIuOTkyIDI0LjEyOC0xNi4xOTIgNTEuMi0yNy40NTYgNzkuNTUyLTMzLjAyNCAyMS42MzItMy4yIDIyLjcyLTM3LjEyLTIuNjg4LTM2LjI4OC0yNy4wNzIgMS40MDgtMTU4LjkxMiAxMy44MjQtMTgwLjA5NiAxMTQuNDMyLTEwLjk0NCA1OC43NTIgMS40MDggMTExLjM2IDM1LjQ1NiAxNjguNTEybDQ5LjAyNCA4OC4xMjhMNjQgNDY5LjMxMmwyNDQuOCAxNDcuOTY4di0yODYuMDhMMjE2Ljk2IDM4MC44eiBtMjk4LjU2IDQ3MC41MjhjODEuMjE2IDQ0LjkyOCAxMjguMTkyLTMwLjcyIDE1NC4wNDgtNzJsNTYuNzA0LTkwLjM2OC04OS4wMjQtNTcuNzkyIDI1MS4wMDgtMTM0LjAxNi0xMy44MjQgMjg4LTg4Ljk2LTU3LjcyOC01My40NCA4NC45OTJjLTM2LjY3MiA1My4zNzYtNjMuNTUyIDkyLjgtMTI5LjAyNCAxMTAuNTI4LTExNS4yIDIyLjQtMTg1LjkyLTExMy40NzItMTg1LjIxNi0xMTIuNTc2LTExLjUyLTIwLjQ4IDE1LjE2OC0zOC41OTIgMzEuNzQ0LTE1LjA0YTIyMS4xODQgMjIxLjE4NCAwIDAgMCA2NS45MiA1NnogbTQ2My43NDQtNDQyLjQ5NmMtNi4xNDQgMTMuNTY4LTM4LjU5MiAxMC4xMTItMjkuNDQtMTkuMTM2IDkuMjE2LTI3Ljg0IDEyLjkyOC01Ny4yMTYgMTEuMDA4LTg2LjUyOC02LjUyOC05My44MjQtOTQuNzg0LTkzLjEyLTE0Mi45MTItOTMuMTJINjYwLjQ4djEwNy4yNjRsLTI0Ni4yMDgtMTQzLjA0TDY1OS41ODQtNjRsMC4zODQgMTA5LjA1NmgxMDUuOTg0YzYyLjY1Ni0xLjA4OCAxMTIuNTEyIDEyLjYwOCAxNTQuNzUyIDUxLjAwOCA4NC40MTYgNzUuOTA0IDYuNTkyIDIxOS4zMjggNi41OTIgMjE5LjMyOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS04IiB1bmljb2RlPSImIzU4OTgzOyIgZD0iTTQ5MC4xNzYgNjM0LjI0YzEwLjMwNCAwIDE5LjMyOC0zLjcxMiAyNy4xMzYtMTEuMDA4czExLjU4NC0xNi4zODQgMTEuNTg0LTI3LjA3MmMwLTEwLjY4OC0zLjg0LTE5LjcxMi0xMS41ODQtMjcuMDcycy0xNi44MzItMTAuOTQ0LTI3LjEzNi0xMC45NDRhMzcuODI0IDM3LjgyNCAwIDAgMC0zOC43ODQgMzguMDE2YzAgMTAuNjg4IDMuNzEyIDE5LjcxMiAxMS4yIDI3LjA3MnMxNi42NCAxMC45NDQgMjcuNTIgMTAuOTQ0ek0xOTIgMzg0YzAgMjkuMzEyIDEuOTg0IDU3LjYgNi4wMTYgODQuOTI4IDQuMDMyIDI3LjMyOCAxMC4wNDggNTMuNjk2IDE4LjExMiA3OS4wNGw2NDcuMTA0LTM1My4yOGE0NzguNDY0IDQ3OC40NjQgMCAwIDAtNTQuMjcyLTEwNC44MzIgNDAxLjYgNDAxLjYgMCAwIDAtNzQuMTEyLTgxLjZjLTI3LjUyLTIyLjc4NC01Ny42LTQwLjU3Ni05MC4wNDgtNTMuMjQ4QTI3NS44NCAyNzUuODQgMCAwIDAgNTQzLjU1Mi02NGMtNDguMjU2IDAtOTMuNzYgMTEuNzEyLTEzNi41NzYgMzUuMDcycy04MC4xMjggNTUuMzYtMTEyIDk2LTU2Ljk2IDg4LTc1LjM5MiAxNDIuNEE1NDEuNTA0IDU0MS41MDQgMCAwIDAgMTkyIDM4NHogbTY3Mi45NiAxODMuNDI0YzkuNzkyLTI4LjE2IDE3LjQwOC01Ny42IDIyLjg0OC04OC4zMlM4OTYgNDE2LjY0IDg5NiAzODRjMC01MC42ODgtNi41OTItOTkuNDU2LTE5Ljg0LTE0Ni4yNEw2MDQuOCAzODYuNTZ6TTU2NC4yMjQgNDA4LjUxMkwyMzEuNjggNTkwLjI3MmMxNC40IDM2LjAzMiAzMi40NDggNjguODY0IDU0LjMzNiA5OC40MzJzNDYuMDggNTQuOTc2IDcyLjc2OCA3Ni4wOTYgNTUuNjggMzcuNjMyIDg3LjA0IDQ5LjQ3MkM0NzcuMTIgODI2LjExMiA1MDkuNjk2IDgzMiA1NDMuNTUyIDgzMmMzMi43NjggMCA2NC4wNjQtNS4zNzYgOTMuOTUyLTE2YTMyMi41NiAzMjIuNTYgMCAwIDAgODQuMDMyLTQ1LjMxMmMyNi4xMTItMTkuMzkyIDQ5Ljc5Mi00Mi44MTYgNzEuMDQtNzAuMTQ0IDIxLjI0OC0yNy4zMjggMzkuNjgtNTcuNiA1NS4xNjgtOTAuODhMNTYyLjQ5NiA0MTEuMDcyeiBtLTExLjIgNTcuNDcyTDczNi42NCA1ODYuODhhMjM3LjQ0IDIzNy40NCAwIDAgMS0zOC43ODQgNzEuMDQgMTc3LjQwOCAxNzcuNDA4IDAgMCAxLTI0Ljk2IDI2LjE3NiAxODkuNTY4IDE4OS41NjggMCAwIDEtMzMuMjE2IDIyLjc4NCAxNzkuNTIgMTc5LjUyIDAgMCAxLTQxLjM0NCAxNi4wNjQgMjAwLjgzMiAyMDAuODMyIDAgMCAxLTUwLjM2OCA1Ljk1MmMtMTcuMjggMC0zMy4wODgtMi4xMTItNDcuMzYtNi40YTE5MS4xMDQgMTkxLjEwNCAwIDAgMS03Mi44OTYtMzkuNjggMjk5LjU4NCAyOTkuNTg0IDAgMCAxLTI3LjEzNi0yNi42MjQgMjg3LjQ4OCAyODcuNDg4IDAgMCAxLTQ2LjUyOC03MS44NzJ6IG00NC44IDE2OC4xOTJhMzcuODI0IDM3LjgyNCAwIDAgMCAzOC43ODQtMzguMDE2IDM3LjgyNCAzNy44MjQgMCAwIDAtMzguNzg0LTM4LjAxNiAzNy44MjQgMzcuODI0IDAgMCAwLTM4LjcyIDM4LjAxNmMwIDEwLjY4OCAzLjcxMiAxOS43MTIgMTEuMiAyNy4wNzJzMTYuNjQgMTAuOTQ0IDI3LjUyIDEwLjk0NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS05IiB1bmljb2RlPSImIzU4OTg0OyIgZD0iTTYzMS44MDggNjIzLjYxNmMwLTM1LjUyLTYuMzM2LTY4LjkyOC0xOC45NDQtMTAwLjM1MnMtMjkuNTA0LTU4Ljg4LTUwLjY4OC04Mi40MzItNDUuNTY4LTQyLjE3Ni03My4yMTYtNTUuODA4LTU2LjgzMi0yMC40OC04Ny41NTItMjAuNDhTMzQxLjMxMiAzNzEuMDA4IDMxMy4zNDQgMzg0cy01Mi41NDQgMzEuMjMyLTczLjcyOCA1NC43ODQtMzguMDggNTEuNTItNTAuNjg4IDgzLjk2OC0xOC45NDQgNjguMDk2LTE4Ljk0NCAxMDcuMDA4YzAgMzAuNzIgNi4xNDQgNTkuOTA0IDE4LjQzMiA4Ny41NTJBMjQ1Ljc2IDI0NS43NiAwIDAgMCAzMTAuMjcyIDg0MS4yMTZjMjcuMzI4IDEyLjYwOCA1Ni4zMiAxOC45NDQgODcuMDQgMTguOTQ0czYwLjA5Ni02LjY1NiA4OC4wNjQtMTkuOTY4IDUyLjkyOC0zMC45MTIgNzQuNzUyLTUyLjczNiAzOS4yMzItNDYuOTEyIDUyLjIyNC03NS4yNjQgMTkuNDU2LTU3Ljg1NiAxOS40NTYtODguNTc2eiBtLTI3MS4zNi0zMzAuNzUybC0xLjAyNC0zNjMuNTIgMzYuODY0IDQ4LjEyOCAzOC45MTItNDguMTI4djM2My41MnpNNjA0LjE2IDgxMS4wMDhjMTQuMzM2LTE3LjA4OCAyNy4zMjgtMzUuNTIgMzguOTEyLTU1LjI5NiA5LjYtMTcuMDg4IDE4LjQzMi0zNi40OCAyNi42MjQtNTguMzY4czEyLjI4OC00NC43MzYgMTIuMjg4LTY4LjYwOGMtMS4zNDQtNDEuNi01Ljk1Mi03Ni40OC0xMy44MjQtMTA0LjQ0OHMtMTYuNTc2LTUwLjU2LTI2LjExMi02Ny41ODRjLTExLjU4NC0xOS44NC0yNC4yNTYtMzUuNTItMzcuODg4LTQ3LjEwNCAxOS44NCAyLjA0OCAzOS42MTYgNS4xMiA1OS4zOTIgOS4yMTYgMTcuMDg4IDMuMzkyIDM1LjUyIDcuODcyIDU1LjI5NiAxMy4zMTJzMzguNTkyIDEyLjk5MiA1Ni4zMiAyMi41MjhjMTUuNjggOC4xOTIgMzAuNTI4IDE4Ljk0NCA0NC41NDQgMzIuMjU2czI1LjkyIDI5LjE4NCAzNS44NCA0Ny42MTYgMTYuODk2IDM5LjA0IDIwLjk5MiA2MS45NTIgNC4wOTYgNDguMzIgMCA3Ni4yODhjLTQuMDk2IDI4LjY3Mi0xNiA1NC4yNzItMzUuODQgNzYuOHMtNDMuMzI4IDQwLjQ0OC03MC42NTYgNTMuNzYtNTUuODA4IDIxLjEyLTg1LjUwNCAyMy41NTItNTYuNTEyLTIuODgtODAuMzg0LTE1Ljg3MnogbTEuMDI0LTQ1OC43NTJMNjA0LjE2IDUuMTJsMzUuODQgNDcuMTA0IDM4LjkxMi00Ny4xMDRWMzUyLjI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xMCIgdW5pY29kZT0iJiM1ODk4NTsiIGQ9Ik0yNTYuNTEyIDgzMmwtNjQtMzUyYy05LjM0NC01MS41MiAxMTMuOTg0LTc1LjU4NCAxMTItMTI4bC0xNi00MTZjLTIuNDMyLTY0IDY0LTY0IDY0LTY0czY2LjQzMiAwIDY0IDY0bC0xNiA0MTZjLTEuOTg0IDUyLjM1MiAxMTAuOTEyIDc1LjUyIDExMiAxMjhsLTY0IDM1MmgtMzJsMTYtMjU2LTQ4LTMyLTE2IDI4OGgtMzJsLTE2LTI4OC00OCAzMiAxNiAyNTZ6IG01NDQgMGMtNDcuMTA0IDAtMTI1LjY5Ni00MS45Mi0xNTcuMTItMTA0Ljc2OC0yNi4yNC00Ny4xMDQtMzQuODgtMTUyLjM4NC0zNC44OC0yMTUuMjMydi0xNjBjMC01Mi4zNTIgNjkuNzYtNjQgOTYtNjRsLTMyLTM1MmMtNS43Ni02My43NDQgNjQtNjQgNjQtNjRzNjQgMCA2NCA2NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xMSIgdW5pY29kZT0iJiM1ODk4NjsiIGQ9Ik01MTMuNjY0IDUyNS4zMTJhMTE3LjEyIDExNy4xMiAwIDAgMCAxMTYuOTI4IDExNi45OTJjNjQuNTEyIDAgMTE2LjkyOC01Mi40OCAxMTYuOTI4LTExNi45OTJTNjk1LjA0IDQwOC4zMiA2MzAuNTkyIDQwOC4zMmExMTcuMTIgMTE3LjEyIDAgMCAwLTExNi45MjggMTE2Ljk5Mm0zNzcuNiAxNzEuNzEyYzAgMzYuOC0yOS44MjQgNjYuNjg4LTY1LjM0NCA2Ni42ODhoLTAuMDY0QzgyNC43MDQgNzYzLjcxMiA3MDkuMjQ4IDc2OCA2MjIuMDggNzY4Yy0xMDAuNDE2IDAtMTA5LjQ0LTQuODY0LTEyMC4zMi0xNS43NDRMMzQ2LjY4OCA1OTYuOTI4IDE0Ny41MiAzOTcuNjk2YTY3LjA3MiA2Ny4wNzIgMCAwIDEgMC4xMjgtOTQuNzJsMjgzLjItMjgzLjMyOGMxMi42NzItMTIuNjcyIDI5LjQ0LTE5LjY0OCA0Ny40MjQtMTkuNjQ4IDE3LjkyIDAgMzQuNjg4IDYuOTEyIDQ3LjE2OCAxOS40NTZsMjIxLjU2OCAyMjEuNjk2IDEzMi44IDEzMi45MjhjMTEuNzEyIDExLjY0OCAyMi43MiAyMi43MiAxMS41MiAzMjIuOTQ0IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTIiIHVuaWNvZGU9IiYjNTg5ODc7IiBkPSJNODM5LjkzNiA1MDYuNjg4YzAgMTc5Ljg0LTE0Ny4wMDggMzI1Ljc2LTMyOC41NzYgMzI1Ljc2LTE4MS40NCAwLTMyOC41MTItMTQ1LjkyLTMyOC41MTItMzI1Ljc2IDAtNTkuNTIgMTYuMjU2LTExNS4wMDggNDQuMjg4LTE2Mi45NDRoLTAuMzg0bDI4NC42MDgtNDA3LjM2IDI4NC42NzIgNDA3LjM2aC0wLjM4NGMyOC4xNiA0OCA0NC4yODggMTAzLjQ4OCA0NC4yODggMTYyLjk0NE01MTEuNDI0IDM0My44MDhhMTYzLjU4NCAxNjMuNTg0IDAgMCAwLTE2NC4yODggMTYyLjg4IDE2My42NDggMTYzLjY0OCAwIDAgMCAxNjQuMjg4IDE2Mi45NDQgMTYzLjU4NCAxNjMuNTg0IDAgMCAwIDE2NC4yODgtMTYyLjk0NEExNjMuNTIgMTYzLjUyIDAgMCAwIDUxMS4zNiAzNDMuODA4IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTMiIHVuaWNvZGU9IiYjNTg5ODg7IiBkPSJNOTQwLjggNDgwVjEyOGE2NCA2NCAwIDAgMC02NC02NGgtNzA0YTY0IDY0IDAgMCAwLTY0IDY0VjQ4MGEzMiAzMiAwIDAgMCAzMiAzMiAzMS4zNiAzMS4zNiAwIDAgMCAxMy40NCAwbDM3MC41Ni0yNTZMODk2IDUxMmEzMS4yMzIgMzEuMjMyIDAgMCAwIDEyLjggMCAzMiAzMiAwIDAgMCAzMi0zMnpNMTI0LjggNjQ1LjEybDUuMTItNS4xMkw1MjQuOCAzODRsMzk2LjE2IDI1NmgzLjg0YTMxLjM2IDMxLjM2IDAgMCAxIDE2IDMyIDMyIDMyIDAgMCAxLTMyIDMyaC03NjhhMzIgMzIgMCAwIDEtMzItMzIgMzEuMzYgMzEuMzYgMCAwIDEgMTYtMjYuODh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTQiIHVuaWNvZGU9IiYjNTg5ODk7IiBkPSJNMTg4LjE2IDQxMi4yMjRjMTAuNjI0IDIuNzUyIDc4LjIwOCAzMiA4OC44OTYgMzQuNzUyLTI4LjQ4IDMxLjY4LTQ5LjYgNzMuMTUyLTc2LjA5NiAxMzMuNzYtMzUuMDcyLTguNzY4LTk1LjkzNi0yNi44OC05NS45MzYtMjYuODhTMTgzLjgwOCA0MjAuNDggMTg4LjE2IDQxMi4xNnogbTM5MS4wNC0xMTMuNTM2bDcyLjQ0OC04MS45MmMxMjQuMTYgNDEuODU2IDI4OS40NzIgMjA3LjM2IDI4OS40NzIgMjA3LjM2TDg1OC4wNDggNTA4LjhTNzc3LjAyNCAzODMuMzYgNTc5LjIgMjk4LjY4OHpNNDI5LjgyNCA0NjAuMjI0bDY3LjAwOC0zNS4yYzYyLjkxMiA2Mi44NDggMTE1LjIgMTYyLjMwNCAxMTUuMiAxNjIuMzA0bC0xMDQuNTEyIDM5LjA0cy00MC45Ni0xMTMuMTUyLTc3LjY5Ni0xNjYuMTQ0eiBtMjMxLjU1Mi0zMC4zMzZjMTA0Ljk2IDUxLjg0IDI0Ni43ODQgMjI4LjczNiAyNDYuNzg0IDIyOC43MzZMODI2LjE3NiA3MzZzLTExOC42NTYtMTc0LjkxMi0yMzEuMTY4LTIzMy42NjR6IG0tNDkuNDA4LTI1Ny40NzJMNDIwLjE2IDI3My42NjRINjA4LjY0djExMS4zNkg0MTEuNjQ4djUxLjM5MkgyODMuMTM2di01MS4zOTJINjkuMTJ2LTExMS4zNkgyMzEuNjhjLTQ4LjMyLTY1LjQwOC03Mi44MzItOTIuOTkyLTE2Mi41Ni0xNDguMzUybDY1LjcyOC05Ny4yOGM4MS4yOCA1OS45NjggMTEyLjgzMiA5Ny41MzYgMTQ4LjIyNCAxNDIuODQ4di0xOTYuOTkyaDEyOC41MTJWMTcwLjg4bDE0MC40OC04Mi4wNDh6IG0yNjUuOTg0IDEyMS41MzZzLTg5LjQ3Mi0xNjAtMzU2LjQxNi0yMzMuMjhsMzkuMDQtODYuNzg0YzI2NS40NzIgNjQuNzY4IDM3Ni4zMiAyMDUuNjMyIDM5OS4xNjggMjI4LjE2eiBtLTU2My4yIDE3MS45NjhzODEuMjgtMC41NzYgOTQuNTI4IDBjLTkuMjggNDkuMzQ0LTExLjQ1NiA3MC45MTItMTguODggMTMyLjQ4bC0xMTMuODU2LTE4LjI0YzE1LjY4LTM3LjgyNCAzMC43Mi02NS45ODQgMzguMjcyLTExNC4yNHogbTI4OC44OTYgMjA4LjEyOGwtMzIuNDQ4IDExMy41MzZzLTc4LjE0NC03MC4yNzItNDg0LjM1Mi03OC4wOGw0LjkyOC05My44MjRjNDgyLjExMi05LjcyOCA1MTEuODcyIDU4LjM2OCA1MTEuODcyIDU4LjM2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xNSIgdW5pY29kZT0iJiM1ODk5MDsiIGQ9Ik04MzUuMiA1NTQuNjg4aC01ODIuNGMtNzAuNzIgMC0xMjQuOC01NS40ODgtMTI0LjgtMTI4di0yNTZoMTY2LjRWMGg0OTkuMnYxNzAuNjg4SDk2MHYyNTZjMCA3Mi41MTItNTQuMTQ0IDEyOC0xMjQuOCAxMjh6IG0tMTI0LjgtNDY5LjM3NkgzNzcuNlYyOTguNjI0aDMzMi44ek04MzUuMiAzODRjLTI0Ljk2IDAtNDEuNiAxNy4wODgtNDEuNiA0Mi42ODhzMTYuNjQgNDIuNjI0IDQxLjYgNDIuNjI0IDQxLjYtMTcuMDI0IDQxLjYtNDIuNjI0LTE2LjY0LTQyLjY4OC00MS42LTQyLjY4OHogbS00MS42IDM4NEgyOTQuNHYtMTcwLjY4OGg0OTkuMnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xNiIgdW5pY29kZT0iJiM1ODk5MTsiIGQ9Ik05MjEuNiA2NTAuNTZsLTI0Ljk2IDIyLjAxNiAyMS4zMTIgMjQuNDQ4YTM1LjU4NCAzNS41ODQgMCAwIDEgMy41ODQgNTAuMzY4bC0zNy43NiA0Mi44OGEzNi4wOTYgMzYuMDk2IDAgMCAxLTUwLjY4OCAzLjJsLTMwMS40NC0yMzMuNkEzMDMuMjMyIDMwMy4yMzIgMCAwIDEgMjAzLjI2NCA1MTJjLTEyNi41OTItMTExLjIzMi0xNDAuMTYtMzAzLjc0NC0zMC4zMzYtNDMwLjA4IDEwOS43Ni0xMjYuMjA4IDMwMS40NC0xMzguNDMyIDQyNy45NjgtMjcuMmEzMDYuODE2IDMwNi44MTYgMCAwIDEgNzQuMTEyIDM2My43NzZsNDguODk2IDU2IDMwLjIwOC0yNi44OGMxMC44MTYtOS42IDI3Ljg0LTcuNjggMzguMDE2IDQuMjI0bDI5LjYzMiAzNC43NTJjMTAuMjQgMTEuOTY4IDkuNzI4IDI5LjUwNC0xLjA4OCAzOS4xNjhsLTI5LjMxMiAyNi4xMTIgMzcuNjMyIDQzLjIgMjcuMDA4LTIzLjY4YzEwLjg4LTkuNiAyNy44NC03LjU1MiAzNy45NTIgNC42MDhsMjkuMTIgMzUuMmMxMC4xMTIgMTIuMTYgOS40MDggMjkuNzYtMS40NzIgMzkuMzZ6IG0tNTExLjQ4OC01MDkuNjk2YTEwNi4xNzYgMTA2LjE3NiAwIDAgMC0xNTAuNTI4IDkuNiAxMDcuNzc2IDEwNy43NzYgMCAwIDAgMTAuNzUyIDE1MS4zNiAxMDYuMTc2IDEwNi4xNzYgMCAwIDAgMTUwLjUyOC05LjYgMTA3Ljc3NiAxMDcuNzc2IDAgMCAwLTEwLjc1Mi0xNTEuMzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTciIHVuaWNvZGU9IiYjNTg5OTI7IiBkPSJNOTYwIDU3NmgtMjU2di0yMjRhMTI4IDEyOCAwIDAgMSA5Ni0xMjMuNTJWMEg3NjhhMzIgMzIgMCAwIDEgMC02NGgxMjhhMzIgMzIgMCAwIDEgMCA2NGgtMzJ2MjI4LjQ4QTEyOCAxMjggMCAwIDEgOTYwIDM1MnYzLjg0eiBtLTY0LTIyNGE2NCA2NCAwIDEgMC0xMjggMFY1MTJoMTI4eiBtLTQ4MCAzMjBWNzA0YTMyIDMyIDAgMCAxIDAgNjR2MzJBMzIgMzIgMCAwIDEgMzg0IDgzMkgzMjBhMzIgMzIgMCAwIDEtMzItMzJWNzY4YTMyIDMyIDAgMCAxIDAtNjR2LTMyQzI4OCA1ODAuNDggMTI4IDQ3NS41MiAxMjggMzg0di0zODRhNjQgNjQgMCAwIDEgNjQtNjRoMzIwYTcwLjQgNzAuNCAwIDAgMSA2NCA2NFYzODRjMCA4Ni40LTE2MCAyMDEuNi0xNjAgMjg4eiBtLTY0LTYwOGExNjAgMTYwIDAgMSAwIDAgMzIwIDE2MCAxNjAgMCAwIDAgMC0zMjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTgiIHVuaWNvZGU9IiYjNTg5OTM7IiBkPSJNODMyIDQyMS42MzJjMzcuNjMyIDEyLjggNjQgNDguNzY4IDY0IDkwLjM2OCAwIDUuNTY4LTMwLjQgMjQxLjYtMzAuNCAyNDEuNmExNi4zODQgMTYuMzg0IDAgMCAxLTE2IDE0LjRIMTc0LjRjLTggMC0xNS4yMzItNi40LTE2LTE0LjQgMCAwLTMwLjQtMjM2LjgtMzAuNC0yNDEuNiAwLTQxLjYgMjYuMzY4LTc3LjU2OCA2NC05MC40MzJ2LTQwNS41NjhjMC04LjgzMiA3LjE2OC0xNiAxNi0xNmg2MDhhMTYgMTYgMCAwIDEgMTYgMTZ6TTcyMC43NjggNzA0bDIxLjYzMi0xOTJoLTMybC0yMS42MzIgMTkyek01OTIgNzA0bDcuMjMyLTE5MmgtMzJMNTYwIDcwNHogbS0xNjAgMGgzMmwtNy4yMzItMTkyaC0zMnpNMzAzLjE2OCA3MDRoMzJMMzEzLjYgNTEyaC0zMnpNNjA4IDY0aC0xOTJ2MTYwaDE5MnpNNzY4IDM1MkgyNTZWNDIxLjU2OGMxNS4xNjggNS42MzIgMjkuNjMyIDE1LjIzMiA0MCAyNy4yNjRhOTUuNjE2IDk1LjYxNiAwIDAgMSAxNDQgMCA5NS42MTYgOTUuNjE2IDAgMCAxIDE0NCAwIDk1LjYxNiA5NS42MTYgMCAwIDEgMTQ0IDBjMTAuNDMyLTEyLjAzMiAyNC44MzItMjEuNjMyIDQwLTI3LjJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTkiIHVuaWNvZGU9IiYjNTg5OTQ7IiBkPSJNOTA4LjggODAwcy04OS4wMjQgMi42MjQtMTI0LjU0NC0zMmMtMzQuMTc2LTMzLjI4LTQ4LjI1Ni01OC43NTItNDguMjU2LTEyOEgxNDAuOGw4OS4yMTYtMzA4LjA5NmMwLjE5Mi0wLjUxMiAwLjY0LTAuOTYgMC44MzItMS40MDggMTUuMDQtNDIuMDQ4IDU0LjI3Mi03Mi4zMiAxMDEuMDU2LTc0LjExMmwwLjgzMi0wLjM4NGg0MTZ2LTEyLjhzMC4wNjQtMTkuMi0xMi43MzYtNDQuOC0xOS4yLTM4LjQtNzAuNC0zOC40SDI0OS42Yy02NCAwLTY0LTk2IDAtOTZINjU5LjJjNzYuOCAwIDEzNC40IDQ0LjggMTUzLjYgODkuNnMxOS4yIDgzLjIgMTkuMiA4My4yVjY0MGMwIDMzLjUzNiAxNC42NTYgNjQgNDQuOCA2NGgzNS4yYTQ4IDQ4IDAgMCAxIDAgOTZ6IG0tMjU2LTczNmMtMzguNCAwLTY0LTI1LjYtNjQtNjRzMjUuNi02NCA2NC02NCA2NCAyNS42IDY0IDY0LTI1LjYgNjQtNjQgNjR6IG0tMzIwIDBjLTM4LjQgMC02NC0yNS42LTY0LTY0czI1LjYtNjQgNjQtNjQgNjQgMjUuNiA2NCA2NC0yNS42IDY0LTY0IDY0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTIwIiB1bmljb2RlPSImIzU4OTk1OyIgZD0iTTk1MS41NjYwOCAwLjM4NGwtOTAxLjc2IDAuNDQ4cy05Ny4wODgtNC40OC0yMC4xNiA3MC43ODRhNDczLjc5MiA0NzMuNzkyIDAgMCAwIDcwLjQ2NCAzMS43NDQgMTI3Ljg3MiAxMjcuODcyIDAgMCAwLTEwLjQzMiA1MC42ODhjMCA2NC44OTYgNDcuMjMyIDExNy41MDQgMTA1LjUzNiAxMTcuNTA0czEwNS41MzYtNTIuNjA4IDEwNS41MzYtMTE3LjUwNGMwLTEuNDA4LTAuMTI4LTIuNzUyLTAuMTkyLTQuMDk2IDYuNzg0IDAuODk2IDEzLjY5NiAxLjc5MiAyMC42MDggMi41NlY3NjAuNDQ4QzMyMS4xNjYwOCA4MDAuMzg0IDM0OS44MzgwOCA4MzIgMzg4LjY4NjA4IDgzMmg0MDQuNTQ0YzM4Ljg0OCAwIDY1LjkyLTMxLjYxNiA2NS45Mi03MS42MTZ2LTY0MS45MmM0Ny4yOTYtMTMuNjMyIDg3Ljg3Mi0yOS44ODggMTE5LjY4LTQ4LjE5MiAxMTUuNzEyLTc5LjYxNi0yNy4zMjgtNjkuODg4LTI3LjMyOC02OS44ODh6TTU0Ni43NjYwOCA2NzAuOTEyYTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNjg4IDM1Ljg0SDQ0Mi42MzgwOGEzNC45NDQgMzQuOTQ0IDAgMCAxLTM0LjY4OC0zNS44NHYtOTguNDMyYzAtMTkuOTY4IDIzLjkzNi0zNS44NCA0My4zOTItMzUuODRoNjAuOGEzNC45NDQgMzQuOTQ0IDAgMCAxIDM0LjYyNCAzNS44NFY2NzAuOTEyeiBtMC0yNTkuNTJhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC42ODggMzUuODRINDQyLjYzODA4YTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNjg4LTM1Ljg0VjMxMi45NmMwLTE5LjkwNCAyMy45MzYtMzUuNzc2IDQzLjM5Mi0zNS43NzZoNjAuOGEzNC45NDQgMzQuOTQ0IDAgMCAxIDM0LjYyNCAzNS44NFY0MTEuMzI4eiBtMjI1LjY2NCAyNTkuNTJhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC42ODggMzUuODRoLTY5LjQ0YTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNzUyLTM1Ljg0di05OC40MzJjMC0xOS45NjggMjQtMzUuODQgNDMuMzkyLTM1Ljg0aDYwLjhhMzUuMDA4IDM1LjAwOCAwIDAgMSAzNC42ODggMzUuODR6IG0wLTI1OS41MmEzNC45NDQgMzQuOTQ0IDAgMCAxLTM0LjY4OCAzNS44NGgtNjkuNDRhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC43NTItMzUuODRWMzEyLjk2YzAtMTkuOTA0IDI0LTM1Ljc3NiA0My4zOTItMzUuNzc2aDYwLjhhMzUuMDA4IDM1LjAwOCAwIDAgMSAzNC42ODggMzUuODR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjEiIHVuaWNvZGU9IiYjNTg5OTY7IiBkPSJNNTEyIDc2OGMtMjAuNjcyIDAtMjcuNTItMTMuOTUyLTQxLjM0NC0yNy45MDRMNzAuOTEyIDc2LjhDNjQgNjkuNzYgNjQgNTUuODcyIDY0IDQ4Ljg5NmMwLTM0Ljk0NCAyNy41Mi00OC44OTYgNDguMjU2LTQ4Ljg5Nmg3OTkuNDg4YzI3LjUyIDAgNDguMjU2IDEzLjk1MiA0OC4yNTYgNDguODk2IDAgMTMuOTUyIDAgMTMuOTUyLTYuOTEyIDI3LjkwNEw1NjAuMjU2IDc0MC4wOTZDNTQ2LjQzMiA3NTQuMDQ4IDUzMi43MzYgNzY4IDUxMiA3Njh6IG0wLTEwNC43MDRsMjI3LjQ1Ni0zODRoLTU1LjE2OEw1ODAuOTI4IDM4NCA1MTIgMjc5LjI5NiA0NDMuMDcyIDM4NCAzMzkuNzEyIDI3OS4yOTZoLTYyLjA4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTIyIiB1bmljb2RlPSImIzU4OTk3OyIgZD0iTTg0OCA0MzguODQ4TDc5MiAzODRsNTEuNjQ4LTM1My45ODRhMjYuNDk2IDI2LjQ5NiAwIDAgMC0yNi41Ni0zMC4wMTZoLTY0YTI2Ljg4IDI2Ljg4IDAgMCAwLTI0IDE0LjUyOGwtNDEuMzQ0IDgwLjc2OGE5NC41MjggOTQuNTI4IDAgMCAxLTE4LjExMiAyNC41MTJsLTM4LjIwOCAzNy4zNzZhMjIuMTQ0IDIyLjE0NCAwIDAgMS0xNS40ODggNi4yNzJoLTE0OS4xMmEyMi4xNDQgMjIuMTQ0IDAgMCAxLTE1LjQ4OC02LjI3MmwtMzguMjcyLTM3LjM3NmMtNy4yOTYtNy4xNjgtMTMuNDQtMTUuNDI0LTE4LjA0OC0yNC41MTJsLTQxLjM0NC04MC43NjhhMjYuODggMjYuODggMCAwIDAtMjQtMTQuNTI4aC01Mi40OGEyNi4zMDQgMjYuMzA0IDAgMCAwLTI0LjE5MiAzNy41NjhsMjQuOTYgNTEuMzkyYzYuNTkyIDEzLjYzMiAxMC4wNDggMjguNjA4IDEwLjA0OCA0My43NzZWMzg0bDE2OCAxMDkuNjk2LTI0IDIzLjU1Mi0zMi0yMy41NTItMzMuNiAzMi45Ni0xMzQuNC04Ny44MDhMMjg4IDM4NHMtMjIuMTQ0IDE5Ljk2OC01NiA1NC44NDhjMC4xOTIgNDUuNDQtNzUuNDU2IDkwLjI0LTEwMi41MjggMTA0LjgzMmE0MS4yMTYgNDEuMjE2IDAgMCAxLTE5LjUyIDQuODY0aC0yNEEyMS43NiAyMS43NiAwIDAgMCA2NCA1NzAuMTEydjE5LjQ1NmMwIDguNDQ4IDUuMDU2IDE2LjEyOCAxMi45MjggMTkuNTg0bDE5MC43ODQgODQuNTQ0TDMwNC4xMjggNzY4bDQ2LjIwOC02NS40NzJjOS4yMTYtMTMuMDU2IDE1LjkzNi0yNy43MTIgMTkuNjQ4LTQzLjJsMTguODE2LTc3LjgyNEw1NjggNzY4bDU2LTU0Ljg0OC0xOTItMTk1LjkwNCA2Ni41Ni02NS4yMTZhNDYuNDY0IDQ2LjQ2NCAwIDAgMSAzMi41MTItMTMuMTg0aDEzNi4wNjRhNDYuNzIgNDYuNzIgMCAwIDEgMjMuODcyIDYuNTkybDI0Ni41MjggMTQ3LjAwOGExNS40ODggMTUuNDg4IDAgMCAwIDIyLjQ2NC0xMy42MzJ2LTYuNTI4YTU2LjY0IDU2LjY0IDAgMCAwLTE3LjA4OC00MC40NDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjMiIHVuaWNvZGU9IiYjNTg5OTg7IiBkPSJNNjkwLjI0IDc2OGMtNy42OCAwLTI5LjY5Ni0xMC4yNC0yOS42OTYtMTAuMjRMNDMzLjcyOCA2NDAuNTEyYy0zMC4yMDgtMTIuMjg4LTQyLjE3Ni02MS41NjgtMjQtODYuMjA4bDY2LjMwNC05OC4zMDQtMjcxLjEwNC0xNDEuNjk2IDEzNi4zODQtMTA0LjcwNCAxNzAuODggMTA0LjcwNCAxNzAuNjI0LTEwNC43MDQgNjguNDE2IDY5Ljk1Mi0yMDQuOCAyNzkuMjk2TDcyMC45NiA2NjUuNmMzNi4wMzIgMTguNTYgMzAuMjcyIDQ5LjIxNiAzMC4yNzIgNjcuNzc2LTAuMzIgMTQuNjU2LTI0LjY0IDM0LjYyNC02MC45OTIgMzQuNjI0eiBtMTQ2LjE3Ni0yMDkuNDcyYy02Ni4wNDggMC0xMTkuNjE2LTU0LjY1Ni0xMTkuNjE2LTEyMi4xNzYgMC02Ny41MiA1My41NjgtMTIyLjMwNCAxMTkuNjE2LTEyMi4zMDRzMTE5LjQyNCA1NC43ODQgMTE5LjQyNCAxMjIuMzA0YzAgNjcuNTItNTMuNDQgMTIyLjI0LTExOS40MjQgMTIyLjI0ek0xNzAuNjg4IDIwOS40NzJMMCAxMDQuNzA0VjBsMTcwLjY4OCAxMDQuNzA0TDM0MS4zMTIgMGwxNzAuODggMTA0LjcwNEw2ODIuNzUyIDBsMTM2LjM4NCAxMDQuNzA0TDEwMjQgMHYxMDQuNzA0bC0yMDQuOCAxMDQuNzY4LTEzNi4zODQtMTA0Ljc2OC0xNzAuNjg4IDEwNC43NjgtMTcwLjgxNi0xMDQuNzY4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTI0IiB1bmljb2RlPSImIzU4OTk5OyIgZD0iTTcyOC4zMiA2NjguMzUyYTIyMS4yNDggMjIxLjI0OCAwIDAgMS03NC4xMTIgMTEuMzkyIDI3MiAyNzIgMCAwIDEtNjIuNDY0LTguMzJjLTYuMDE2LTEuNjY0LTEyLjE2LTMuMDcyLTE3LjkyLTQuOTI4IDQuMTYgMi4zNjggOC4zODQgNC4yODggMTIuNjA4IDYuMDE2IDMwLjU5MiAxMi45OTIgNjMuMjMyIDE0LjcyIDg4LjMyIDEyLjE2LTI3LjkwNCAxOC44OC03OC4yNzIgMTkuNzc2LTExMC45NzYtMC44OTZsLTAuMTkyIDAuNDQ4YzcuMzYgNC40OCAxNS4yMzIgOC44OTYgMjMuNTUyIDEyLjk5MiAzNi45OTIgMTguMTc2IDgxLjQ3MiAyNi45NDQgMTEyLjM4NCAxNC41OTJhMTI4LjM4NCAxMjguMzg0IDAgMCAxLTQ1Ljk1MiAyMi41OTJjMzMuNiA2LjU5MiA2OC4yMjQgMS45MiA5Ny4xNTItNi4wMTYtMTUuMjk2IDE1LjQyNC0zOC41OTIgMjMuNTUyLTYzLjM2IDI1LjZhMTc0LjA4IDE3NC4wOCAwIDAgMCAxMDAuMDMyLTQuOTI4IDE1NC4yNCAxNTQuMjQgMCAwIDEtNTEuNTIgMzUuOTY4YzQxLjkyIDEuMDI0IDg0LjYwOC0xNS4zNiAxMTYuMjg4LTM1Ljk2OGExOTQuNTYgMTk0LjU2IDAgMCAxLTU5LjY0OCA1MS45NjhjNDcuMjMyLTAuNjQgOTkuNDU2LTIwLjg2NCAxMzAuNTYtNTAuMzY4LTQwLjgzMiA2My44NzItMTEyLjI1NiA4OS41MzYtMTg4LjczNiA3Ni45MjgtNzUuMjY0LTExLjY0OC0xNTcuNDQtNjQuNTc2LTE5OC4xNDQtMTQ0LjU3Ni0xLjUzNi0yLjk0NC0zLjItNi4yNzItNC42NzItOS42YTI3OS45MzYgMjc5LjkzNiAwIDAgMS0zMC43ODQgMzcuNTY4Yy02MC45OTIgNjIuOTc2LTEyNy42OCA3OC41OTItMTc0LjI3MiA2MC41NDQtMzguNC0xMy42OTYtNjguNTQ0LTYxLjUwNC02MC4wOTYtMTE3LjYzMi0yLjg4IDI5Ljc2IDE1LjI5NiA2My4zNiAzNS44NCA3Ny4yNDgtOC44MzItMTcuNTM2LTE0LjMzNi0zOS42OC0xNi40NDgtNTcuMzQ0IDguNzY4IDI1LjI4IDI2LjExMiA1MC4zNjggNDcuNjggNjIuMjA4LTkuMDg4LTEzLjQ0LTE2LjEyOC0zMC4xNDQtMTkuODQtNDQuNTQ0YTgyLjU2IDgyLjU2IDAgMCAwIDUzLjYzMiAzMi44MzIgNzUuNzc2IDc1Ljc3NiAwIDAgMS0zMS4zNi00MC41NzZjMTQuNDY0IDE0LjcyIDM0LjI0IDI4LjggNTcuMDg4IDMzLjkyYTExNi41NDQgMTE2LjU0NCAwIDAgMS0yNC41MTItMzUuMTM2YzE3LjAyNCAyMC40OCA0OS42NjQgMjYuNTYgODMuMDcyIDIyLjQgOC4wNjQtMC45NiAxNi4wNjQtMi4zMDQgMjMuOTM2LTQuMTZ2LTAuNjRjLTI5LjEyIDcuMDQtNjAuOTI4LTUuODI0LTc4LjQ2NC0yNi43NTItMTAzLjQ4OC0zLjY0OC0yMDQuOTI4LTQ3LjE2OC0yNDEuNi0xNDguNzM2IDI0LjE5MiAzNC41NiA2NS45MiA2Ny41MiAxMDUuNzkyIDg2LjAxNmEyMjYuMzY4IDIyNi4zNjggMCAwIDEtMzQuODE2LTY2Ljg4YzIyLjg0OCAyOC45OTIgNTQuMjA4IDU4LjY4OCA4OC43MDQgNzYuMjI0YTE2OS45MiAxNjkuOTIgMCAwIDEtMjguOC01Mi4yODggMjIzLjM2IDIyMy4zNiAwIDAgMCA3OC43MiA0OC42NCAyNjAuNDggMjYwLjQ4IDAgMCAxLTI5LjI0OC0yNC44OTZjLTQ5Ljg1Ni01MC4yNC04Ny44MDgtMTE5LjE2OC0xMDMuNDI0LTIxNC4wOCAyMy4zNiA1NC4yMDggNTYuNTc2IDExMS4yOTYgODYuOTEyIDE0OS45NTItNi45NzYtMjkuNDQtMTAuMTEyLTYyLjUyOC05LjYtODcuODcyIDEzLjQ0IDQyLjI0IDMwLjA4IDg3LjY4IDUyLjczNiAxMjAuNTEyYTI0NS4xMiAyNDUuMTIgMCAwIDEtNS41NjgtNjUuMjE2IDI1NC4wOCAyNTQuMDggMCAwIDAgNDcuMzYgODMuMTM2Yy05LjA4OC0yMC42NzItMTUuMjMyLTQzLjg0LTEzLjI0OC02NS40NzJhNDA4Ljk2IDQwOC45NiAwIDAgMCAyNS41MzYgNjAuMjg4di0wLjEyOGwtMC42NC0xLjY2NCAwLjk2IDAuNzA0YTQzLjY0OCA0My42NDggMCAwIDEgNy42OC0xMy44MjRjMC00LjU0NCAwLTguNzY4IDAuMTkyLTEyLjkyOCAwLjcwNCAzLjMyOCAxLjUzNiA2LjY1NiAyLjQ5NiA5Ljk4NCA2LjY1Ni02Ljc4NCAxNS4zNi0xMS41MiAyNS4xNTItMTMuMDU2LTQ5LjAyNC0xMDguNjA4LTg3LjM2LTIzOC4wOC04OS4yOC0zNjMuMi0xMjEuNDA4LTE4LjQzMi0yMDYuNDY0LTk2LjA2NC0yMDYuNDY0LTEyMS45ODQgMC0yNC45NiAxMDAuNDgtNjEuMjQ4IDI1Ny45Mi02MS4yNDggMTU3LjU2OCAwIDI1OC4wNDggMzYuMjI0IDI1OC4wNDggNjEuMjQ4IDAgMjguOTI4LTEwNi40MzIgMTIyLjU2LTI1MC44OCAxMjUuNzYgMy4wNzIgOTIuNjA4IDI4LjI4OCAyMDAuMzg0IDcwLjIwOCAzMDMuMDRBNDUuMjQ4IDQ1LjI0OCAwIDAgMSA1NTguMDggNTI1LjQ0YzAgMS43MjgtMC4xMjggMy41ODQtMC4zMiA1LjU2OGE0NS4yNDggNDUuMjQ4IDAgMCAxIDYyLjk3NiA0MS40NzJjMCAyLjM2OC0wLjMyIDQuODY0LTAuNTc2IDcuNDI0IDcuMDQtMTUuMDQgMTAuOTQ0LTMwLjQgMTIuNjA4LTQzLjcxMiAxMC4yNCAyNy4wMDggMC41MTIgNjkuNzYtMjYuMDQ4IDkyLjE2YTIwLjA5NiAyMC4wOTYgMCAwIDEgMS40NzItMC43MDRjNS41MDQtNC43MzYgMTAuNjg4LTkuOTg0IDE1Ljg3Mi0xNS40ODggMjQuNzY4LTI2Ljg4IDQwLjcwNC02My4xMDQgMzYuMDMyLTkxLjI2NGExMDguOCAxMDguOCAwIDAgMSAxMC4yNCA0My4wMDhjMTIuMTYtMjcuMiAxNC40LTU3LjE1MiAxMi4xNi04Mi44OCAxMC43NTIgMTUuMzYgMTMuNjk2IDM2LjQ4IDEwLjc1MiA1Ny43OTIgMTMuMzEyLTI2LjgxNiAxNy40NzItNTguMTc2IDExLjk2OC04NS4xMiA5LjkyIDEyLjM1MiAxOS4wMDggMzAuMjcyIDIzLjA0IDQ5LjE1MiA3LjY4LTM1Ljg0LTAuNzY4LTc0LjYyNC0xNi0xMDIuNTI4IDE0LjI3MiAxMy4wNTYgMjkuODg4IDMzLjYgMzcuODI0IDU2LjEyOCA2LjA4LTQwLjUxMi04LTg4LjA2NC0zNS43MTItMTA5LjMxMiA1Ny45MiAyOS4xMiA3My43OTIgOTkuMDA4IDQ5LjkyIDE2My4wMDgtOS40MDggMjYuMzA0LTI1LjUzNiA1Mi40OC00Ni43MiA3NS4xMzZhMTM2LjMyIDEzNi4zMiAwIDAgMS04LjI1NiAyOC41NDRjMjYuNTYtMjMuNzQ0IDQzLjg0LTU0LjcyIDU0LjQtODMuOTY4IDMuODQgMjIuMDgtMy4zMjggNDYuNDY0LTE3LjIxNiA2OC4xNiAyOC4wMzItMjIuNDY0IDQ3LjYxNi01NC43MiA1Ni4zODQtODYuNCAzLjk2OCAxOC40MzIgNC4yODggNDIuMjQtMC41MTIgNjQuODk2IDI1Ljk4NC0zNS4wNzIgMzcuMzc2LTgwLjI1NiAzOS42OC0xMTkuNTUyIDYuNzIgMjIuMDggMTEuMDA4IDUzLjE4NCA3LjU1MiA4MS4xNTJhMjUxLjUyIDI1MS41MiAwIDAgMCA0MS4wODgtMTQwLjYwOGMyMi4xNDQgNzUuMiAzLjAwOCAxNDguNDgtNTMuNTA0IDIwNS4yNDhhMjYyLjI3MiAyNjIuMjcyIDAgMCAxLTEwOC44IDY1LjY2NHogbS0yMjQuNjQtNS4xMmE0MTQuOTc2IDQxNC45NzYgMCAwIDEtOTEuMiAxMC4zNjggMTE1Ljk2OCAxMTUuOTY4IDAgMCAwIDEwMS4xMi0xMi41NDRsLTkuOTIgMi4yNHogbTEwOS41NjgtMTYuMzJhNTIuMTYgNTIuMTYgMCAwIDEtNS41MDQgMi44MTZsMC4xMjggMC43MDQgMTMuMTItNi40Yy0yLjU2IDEuMDI0LTUuMTIgMS45Mi03Ljc0NCAyLjg4eiBtNjkuMTItNTgwLjkyOGMxLjI4LTMuMzkyIDEuOTItNi41OTIgMS45Mi05LjQwOCAwLTQwLjMyLTEyMC43NjgtNzIuOTYtMjY5LjY5Ni03Mi45Ni0xNDguOTkyIDAtMjY5LjY5NiAzMi42NC0yNjkuNjk2IDcyLjk2IDAgMi44MTYgMC42NCA2LjAxNiAxLjg1NiA5LjQwOC0yOS4xMi0xMi43MzYtNDUuODI0LTI3Ljg0LTQ1LjgyNC00NC4wOTYgMC00Ni41OTIgMTQwLjQxNi04NC42MDggMzEzLjYtODQuNjA4IDE3My4yNDggMCAzMTMuNzI4IDM4LjAxNiAzMTMuNzI4IDg0LjYwOCAwIDE2LjI1Ni0xNi44MzIgMzEuMzYtNDUuOTUyIDQ0LjA5NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0yNSIgdW5pY29kZT0iJiM1OTAwMDsiIGQ9Ik02NCAzODguMjg4YzAgNTMuMDU2IDE5LjU4NCAxMDAuNDggNTguODE2IDE0Mi40IDguMzg0IDguMzIgMTYuNzY4IDE5LjUyIDIyLjQgMjcuOTA0IDUzLjE4NCA2Ny4wMDggMTE0Ljc1MiAxMjUuNjMyIDE3OS4yIDE4MS40NCAxOS41ODQgMTYuNzY4IDM2LjM1MiAzMy41MzYgNTYgNDcuNDg4IDI3Ljk2OCAyMi4zMzYgNjEuNTY4IDM2LjI4OCAxMDAuOCA0MS44NTYgNjcuMiA4LjM4NCAxMjUuOTUyLTExLjEzNiAxNzYuMzg0LTU4LjYyNCAxOS41ODQtMTYuNzY4IDM5LjIzMi0zMy40NzIgNjEuNjMyLTUwLjI0IDY0LjM4NC01NS44NzIgMTIzLjItMTE0LjQ5NiAxNzMuNTY4LTE4MS41MDQgOC4zODQtMTEuMTM2IDE5LjU4NC0yMi4zMzYgMjguMDMyLTM2LjI4OCAzMC43Mi00NC42NzIgNDEuOTg0LTk3LjY2NCAzMy42LTE1MC43Mi01LjYzMi00NC42NzItMjUuMjE2LTgwLjk2LTU2LTExNC40OTZsLTUwLjQzMi01OC42MjRjLTM2LjQxNi00MS44NTYtNzIuNzY4LTgwLjk2LTExNC44MTYtMTE3LjI0OC0yMi40LTE5LjUyLTQ0LjgtMzYuMjg4LTY3LjItNTUuODA4LTEzLjk1Mi0xMS4yLTI1LjE1Mi0yMi40LTM5LjE2OC0zMC43MmEyMTQuNTkyIDIxNC41OTIgMCAwIDAtMTUzLjk4NC0zMy41MzZjLTQ0LjggNS41NjgtODEuMjggMjUuMTUyLTExNC44MTYgNTUuODcyLTguMzg0IDguMzItMTYuODMyIDEzLjk1Mi0yOC4wMzIgMjIuMzM2YTExMzkuNTIgMTEzOS41MiAwIDAgMC0xNTYuOCAxNTAuNzJjLTE2Ljc2OCAyMi40LTM2LjM1MiA0MS45Mi01My4xODQgNjQuMjU2LTIuODE2IDguMzItMTQuMDE2IDIyLjMzNi0yMi40IDM2LjI4OEM3NS4yIDMwNC41MTIgNjQgMzQzLjYxNiA2NCAzODguMjg4eiBtMzcyLjQxNi04MC45NnYtMTc1Ljg3MmMwLTE5LjU4NCAxMS4yLTMwLjcyIDMwLjc4NC0zMC43Mmg4OS42YTIxLjQ0IDIxLjQ0IDAgMCAxIDE0LjAxNiA1LjU2OCA1Ni43MDQgNTYuNzA0IDAgMCAxIDE2Ljc2OCA0MS44NTZ2MTUzLjZjMCA1LjU2OCAwIDUuNTY4IDUuNjMyIDUuNTY4aDE3Ni4zODRjMTQuMDE2IDAgMjUuMjE2IDExLjEzNiAyNy45NjggMjUuMDg4djkyLjE2YzAgNS41NjgtMi43NTIgMTEuMTM2LTUuNTY4IDE2Ljc2OC01LjYzMiA4LjMyLTE2LjgzMiAxMS4xMzYtMjguMDMyIDExLjEzNkg1ODcuNTg0VjYyOC4zNTJjMCAyMi40LTExLjIgMzMuNTM2LTMzLjYgMzMuNTM2SDQ3MC4wMTZjLTUuNjMyIDAtMTEuMiAwLTE2LjgzMi0yLjgxNmEzMC43MiAzMC43MiAwIDAgMS0xNi43NjgtMjcuOTA0di0xNzUuODcySDI1OS45NjhjLTE5LjU4NCAwLTMwLjcyLTExLjItMzAuNzItMzAuNzJ2LTg2LjUyOGMwLTguMzg0IDIuNzUyLTE0LjAxNiA1LjU2OC0xOS41ODQgNS41NjgtOC4zMiAxNi43NjgtMTEuMTM2IDI3Ljk2OC0xMS4xMzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjYiIHVuaWNvZGU9IiYjNTkwMDE7IiBkPSJNMzI1LjMxMjM1IDQ1Mi45MjY5MTFjLTEwMy4wMzk4MDcgMC0xODYuNjIzNjUgODIuNjIzODQ1LTE4Ni42MjM2NSAxODQuNjM5NjU0Vjc4NS4yMTQyODhhMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDAgMzcuMzExOTMgMzYuOTI3OTNoMzcuMzExOTNhMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDEgMzcuMzc1OTMgMzYuOTI3OTMxQTM3LjExOTkzIDM3LjExOTkzIDAgMCAxIDIxMy4zMTI1NiA4OTUuOTk4MDhIMTc2LjAwMDYzQTExMS4zNTk3OTEgMTExLjM1OTc5MSAwIDAgMSA2NC4wMDA4NCA3ODUuMjc4Mjg4di0xNDcuNzExNzIzQTI1Ni45NTk1MTggMjU2Ljk1OTUxOCAwIDAgMSAxNzYuNzY4NjI5IDQyNS41OTg5NjIgMzI0LjI4NzM5MiAzMjQuMjg3MzkyIDAgMCAwIDI4OC4wMDA0MiAxOTQuNDMxMzk1QzI4OC4wMDA0MiA1MS43MTE2NjMgNDA0Ljk5MjIwMS02NC4wMDAxMiA1NDkuMzExOTMtNjQuMDAwMTJzMjYxLjM3NTUxIDExNS43MTE3ODMgMjYxLjM3NTUxIDI1OC40MzE1MTV2NDIuMTExOTIxYTE0Ny41ODM3MjMgMTQ3LjU4MzcyMyAwIDAgMSAxMDcuMjYzNzk5IDE3OS45Njc2NjNjLTIwLjY3MTk2MSA3OC45NzU4NTItMTAyLjA3OTgwOSAxMjYuNDYzNzYzLTE4MS45NTE2NTkgMTA2LjA0NzgwMWExNDcuNTgzNzIzIDE0Ny41ODM3MjMgMCAwIDEtMTA3LjI2Mzc5OS0xNzkuOTAzNjYyIDE0OC40Nzk3MjIgMTQ4LjQ3OTcyMiAwIDAgMSAxMDcuMjYzNzk5LTEwNi4xMTE4MDJ2LTQyLjExMTkyMWMwLTEwMS45NTE4MDktODMuNTgzODQzLTE4NC41NzU2NTQtMTg2LjY4NzY1LTE4NC41NzU2NTMtMTAzLjAzOTgwNyAwLTE4Ni42MjM2NSA4Mi42MjM4NDUtMTg2LjYyMzY1IDE4NC41NzU2NTNhMzI0LjI4NzM5MiAzMjQuMjg3MzkyIDAgMCAwIDExMS45OTk3OSAyMzEuMTY3NTY3IDI1Ni44OTU1MTggMjU2Ljg5NTUxOCAwIDAgMSAxMTEuOTk5NzkgMjExLjk2NzYwM1Y3ODUuMjE0Mjg4QTExMS4zNTk3OTEgMTExLjM1OTc5MSAwIDAgMSA0NzQuNjg4MDcgODk1Ljk5ODA4aC0zNy4zNzU5M2EzNy4xMTk5MyAzNy4xMTk5MyAwIDAgMS0zNy4zMTE5My0zNi45Mjc5MzEgMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDEgMzcuMzExOTMtMzYuOTI3OTMxaDM3LjM3NTkzQTM3LjExOTkzIDM3LjExOTkzIDAgMCAwIDUxMiA3ODUuMjc4Mjg4di0xNDcuNjQ3NzI0YzAtMTAyLjAxNTgwOS04My41ODM4NDMtMTg0LjYzOTY1NC0xODYuNjg3NjUtMTg0LjYzOTY1M3ogbTQ0Ny45OTkxNi0xNDcuNzExNzIzYy00MS4yMTU5MjMgMC03NC42MjM4NiAzMy4wODc5MzgtNzQuNjIzODYgNzMuODU1ODYxczMzLjQwNzkzNyA3My44NTU4NjIgNzQuNjIzODYgNzMuODU1ODYyIDc0LjY4Nzg2LTMzLjA4NzkzOCA3NC42ODc4Ni03My44NTU4NjItMzMuNDA3OTM3LTczLjg1NTg2Mi03NC42ODc4Ni03My44NTU4NjF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjciIHVuaWNvZGU9IiYjNTkwMDI7IiBkPSJNODEwLjYyNCAyMzkuMTA0YTI5Ny42IDI5Ny42IDAgMCAxLTI0MS45Mi0xMjQuMDk2Yy04LjM4NC0xMS42NDgtMjYuODgtNS40NC0yNi44OCA4Ljk2djYyLjY1NmEzMC43MiAzMC43MiAwIDAgMCAxNS44MDggMjYuMjRjMzAuMjA4IDE3Ljg1NiA0Ny4yMzIgNTEuNzEyIDQzLjQ1NiA4Ni41OTIgMS45Mi0yLjQzMiAzLjY0OC01LjA1NiA1Ljk1Mi03LjI5NmE4OS42IDg5LjYgMCAwIDEgMTI2LjcyIDEyNi43MmMtMi4zMDQgMi4yNC00Ljg2NCAzLjk2OC03LjI5NiA1Ljk1MiAxOC44OC0xLjk4NCAzOS4yMzIgMS4yMTYgNjEuOTUyIDE5LjMyOCAyMy40ODggMTguODE2IDM5LjIzMiA0Ni43MiAzNi45MjggNzYuNjcyYTg5LjYgODkuNiAwIDAgMS05OC44OCA4Mi4xNzZjMi40MzIgMS45MiA0Ljk5MiAzLjY0OCA3LjI5NiA1Ljk1MmE4OS42IDg5LjYgMCAwIDEtMTI2LjcyIDEyNi43MmMtMi4zMDQtMi4zMDQtMy45NjgtNC44NjQtNS45NTItNy4yOTYgMi4xNzYgMjAuNDgtMS43OTIgNDIuODgtMjQuNDQ4IDY3Ljg0LTE2LjY0IDE4LjMwNC0zOS40MjQgMzEuMTY4LTY0LjEyOCAzMS4yOTZhODkuNiA4OS42IDAgMCAxLTg5LjYtOTkuMmMtMS45MiAyLjQ5Ni0zLjY0OCA1LjEyLTUuOTUyIDcuMzZhODkuNiA4OS42IDAgMCAxLTEyNi43Mi0xMjYuNzJjMi4zMDQtMi4zMDQgNC44NjQtNC4wMzIgNy4yOTYtNS45NTItMjAuNDggMi4xNzYtNDIuODgtMS44NTYtNjcuODQtMjQuNTEyLTE4LjMwNC0xNi42NC0zMS4xNjgtMzkuMzYtMzEuMjk2LTY0LjA2NGE4OS42IDg5LjYgMCAwIDEgOTkuMi04OS42Yy0yLjQ5Ni0xLjkyLTUuMTItMy43MTItNy4zNi01Ljk1MmE4OS42IDg5LjYgMCAwIDEgMTI2LjcyLTEyNi43MmMyLjMwNCAyLjI0IDMuOTY4IDQuODY0IDUuOTUyIDcuMjk2YTg5LjM0NCA4OS4zNDQgMCAwIDEgNDMuNTItODYuNTkyIDMwLjc4NCAzMC43ODQgMCAwIDAgMTUuNjgtMjYuMjR2LTYyLjcyYzAtMTQuMzM2LTE4LjQzMi0yMC41NDQtMjYuODE2LTguOTZhMjk3LjYgMjk3LjYgMCAwIDEtMzIzLjM5MiAxMTIuODMyIDMwLjE0NCAzMC4xNDQgMCAwIDEtMTkuMi00Mi40OTZBNDQ3LjkzNiA0NDcuOTM2IDAgMCAxIDUxMi01OS41Mkg1MTJhNDQ3LjkzNiA0NDcuOTM2IDAgMCAxIDM5OS4xNjggMjQ0LjggMzAuMTQ0IDMwLjE0NCAwIDAgMS0xOS4yIDQyLjQ5NiAyOTcuMzQ0IDI5Ny4zNDQgMCAwIDEtODEuNDA4IDExLjMyOHogbS00MDMuMiAyNzQuODE2YTEwNC41MTIgMTA0LjUxMiAwIDEgMCAyMDkuMDg4IDAgMTA0LjUxMiAxMDQuNTEyIDAgMCAwLTIwOS4wMjQgMHogbTEwNS4wMjQtNTc3LjM0NGMwIDIuMTEyLTAuMzg0IDQuMjI0LTAuNTEyIDYuNGgxLjA4OGMtMC4xMjgtMi4yNC0wLjU3Ni00LjI4OC0wLjU3Ni02LjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjgiIHVuaWNvZGU9IiYjNTkwMDM7IiBkPSJNNTEyIDgzMkMyNjQuODMyIDgzMiA2NCA2MzEuMTY4IDY0IDM4NHMyMDAuODMyLTQ0OCA0NDgtNDQ4IDQ0OCAyMDAuODMyIDQ0OCA0NDgtMjAwLjgzMiA0NDgtNDQ4IDQ0OHogbTIyNC02NTQuNGMwLTE0LjQtMTEuMi0yNS42LTI0LjgzMi0yNS42LTIzNS45NjggMC00MjcuMTM2IDE5Ni4wMzItNDI3LjEzNiA0MzguNCAwIDE0LjQgMTEuMiAyNS42IDI0Ljc2OCAyNS42SDM5Ni44YzEzLjYzMiAwIDI0LjgzMi0xMS4yIDI0LjgzMi0yNS42IDAtMzIgNC44LTYzLjIzMiAxNC40LTkyLjggMi4zNjgtOC44MzIgMC43NjgtMTkuMi02LjQtMjYuNDMybC01NS4yMzItNTYuNzY4YTM4MS41MDQgMzgxLjUwNCAwIDAgMSAxNjUuNjMyLTE2OS42bDU1LjE2OCA1Ni43NjhjNi40IDcuMjMyIDE2LjgzMiA5LjYgMjUuNiA2LjQgMjguMDMyLTkuNiA1OC40MzItMTQuNCA4OS42LTE0LjRhMjUuNiAyNS42IDAgMCAwIDI0LjgzMi0yNS42di05MC4zNjh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjkiIHVuaWNvZGU9IiYjNTkwMDQ7IiBkPSJNNTYzLjc3NiAzMTAuNTkySDQ2NS40MDh2LTE5Ni4zNTJIMzY3LjEwNFY2MDUuMTg0aDE5Ni42NzJjOTcuMDg4IDAgMTQ0LjM4NC02Ny40NTYgMTQ0LjM4NC0xNDcuMiAwLTc5Ljg3Mi0zNy4yNDgtMTQ3LjMyOC0xMzQuNC0xNDcuMzI4aC05Ljk4NHpNNTEyIDgzMy45MkMyNjMuMTY4IDgzMy45MiA2MS40NCA2MzIuNTEyIDYxLjQ0IDM4NGMwLTI0OC41MTIgMjAxLjcyOC00NDkuOTg0IDQ1MC41Ni00NDkuOTg0czQ1MC41NiAyMDEuNDcyIDQ1MC41NiA0NDkuOTJDOTYyLjU2IDYzMi41MTIgNzYwLjgzMiA4MzMuOTIgNTEyIDgzMy45MnogbTUxLjc3Ni0zMjYuODQ4SDQ2NS40MDh2LTk4LjI0SDU2My44NGM0MS42IDAgNDkuMDg4IDEwLjg4IDQ5LjA4OCA0OS4wODggMCAzOC4yNzIgMi4zNjggNDkuMTUyLTM5LjI5NiA0OS4xNTJINTYzLjg0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTMwIiB1bmljb2RlPSImIzU5MDA1OyIgZD0iTTMxNy42OTYgNTQ0LjE5MlY2OTEuNzEySDE2MC44MzJ6IG0zODguNjA4IDE0Ny41MnYtMTQ3LjQ1NmwxNTYuODY0IDE0Ny40NTZ6TTMxNy42OTYgMzI5LjI4VjQ3Ni42NzJIMTYwLjgzMnogbTM4OC42MDggMGwxNTYuODY0IDE0Ny40NTZoLTE1Ni44NjR6TTMxOC40LTY0aDM4Ny41ODRWODMySDMxOC40ek01MDkuMzc2IDc2OS45ODRjNjEuNzYgMCAxMTEuODcyLTQ5LjY2NCAxMTEuODcyLTExMC45NzZzLTUwLjExMi0xMTAuOTc2LTExMS44NzItMTEwLjk3Ni0xMTEuODcyIDQ5LjY2NC0xMTEuODcyIDExMC45NzYgNTAuMTEyIDExMC45NzYgMTExLjg3MiAxMTAuOTc2eiBtMC0yNzUuNTJhMTExLjM2IDExMS4zNiAwIDAgMCAxMTEuODcyLTExMC45MTJjMC02MS4zMTItNTAuMTEyLTExMC45NzYtMTExLjg3Mi0xMTAuOTc2cy0xMTEuODcyIDQ5LjYtMTExLjg3MiAxMTAuOTEyIDUwLjExMiAxMTAuOTc2IDExMS44NzIgMTEwLjk3NnogbTAtMjc1LjUyYzYxLjc2IDAgMTExLjg3Mi00OS42NjQgMTExLjg3Mi0xMTAuOTc2IDAtNjEuMjQ4LTUwLjExMi0xMTAuOTEyLTExMS44NzItMTEwLjkxMnMtMTExLjg3MiA0OS42NjQtMTExLjg3MiAxMTAuOTEyYzAgNjEuMzEyIDUwLjExMiAxMTAuOTc2IDExMS44NzIgMTEwLjk3NnogbTE5Ni45MjgtMTA0LjcwNGwxNTYuODY0IDE0Ny40NTZoLTE1Ni44NjR6IG0tMzg4LjYwOCAwVjI2MS42OTZIMTYwLjgzMnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMSIgdW5pY29kZT0iJiM1OTAwNjsiIGQ9Ik02NTguNDMyIDQyNi42ODhBNDIuNjg4IDQyLjY4OCAwIDEgMCA2NTYuNTEyIDUxMmE0Mi42ODggNDIuNjg4IDAgMCAwIDEuOTItODUuMzEyeiBtLTI5OC42ODggMEE0Mi42ODggNDIuNjg4IDAgMSAwIDM1Ny44MjQgNTEyYTQyLjY4OCA0Mi42ODggMCAwIDAgMS45Mi04NS4zMTJ6IG0wLjk2IDI1MS4zOTJDMzYwLjcwNCA3NjMuMiA0MjcuNDU2IDgzMiA1MDkuNTY4IDgzMmM4Mi4wNDggMCAxNDguODY0LTY4LjggMTQ4Ljg2NC0xNTMuOTJ2LTM4Ljc4NEwzNjAuNzA0IDY0MHogbTU1Ni42NzItMTAwLjM1MkE2Ny45MDQgNjcuOTA0IDAgMCAxIDg1MC40MzIgNjQwaC0xNDkuMzc2djM4LjA4YzAgMTA4LjQxNi04NS41NjggMTk2LjYwOC0xOTEuNDg4IDE5Ni42MDhTMzE4LjAxNiA3ODYuNDk2IDMxOC4wMTYgNjc4LjA4VjY0MEgxNjcuNzQ0Yy0zNC44MTYgMC02NC41MTItMjcuNjQ4LTY3LjAwOC02Mi4yNzJsLTM2LjU0NC01MTIuMzg0QTYwLjQ4IDYwLjQ4IDAgMCAxIDEyNC45OTIgMGg3NjguMTI4YTYwLjM1MiA2MC4zNTIgMCAwIDEgNjAuODY0IDY1LjM0NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMiIgdW5pY29kZT0iJiM1OTAwNzsiIGQ9Ik0yMjAuNDE2IDgxNS41NTJ2LTE0LjY1NmMwLTI5LjI0OCAyMS4zNzYtNTEuMiA0OS43OTItNTEuMiAyMS4zMTIgMCAzNS41ODQgMTQuNjU2IDQyLjY4OCAzNi42MDhsMTQuMjA4IDM2LjU0NCAzOTguMjA4LTE2OC4xOTJMNDQ4IDQ1Ny4xNTJjLTI4LjQxNi0yMS45NTItMjguNDE2LTUxLjItMjEuMzEyLTgwLjQ0OGw2NC0xNTMuNi05Mi40OC0yODUuMjQ4QTQ3LjE2OCA0Ny4xNjggMCAwIDEgNDQwLjk2LTEyOGMyMS4zMTIgMCAzNS41MiA3LjI5NiA0Mi42ODggMzYuNTQ0bDk5LjUyIDI5Mi42MDggNy4xMDQtMjEuOTUydi0yNTZzMC01MS4yIDQ5Ljc5Mi01MS4yIDQ5Ljc5MiA1MS4yIDQ5Ljc5MiA1MS4ydjI0MS4zNDRjMCAxNC42NTYgMCAyMS45NTItNy4xMDQgMzYuNjA4TDU4My4wNCA0NDkuODU2bDE5MiAxMzguOTQ0YzE0LjIwOCAxNC42NTYgMjguNDggMjEuOTUyIDI4LjQ4IDQzLjkwNHMtMTQuMjcyIDM2LjU0NC0yOC40OCA0My44NGwtNTEyIDIxMi4xNmMtNi4yMDggMC04LjM4NC0xLjI4LTE0LjIwOC03LjM2ek0zNjkuNzkyIDY3Ni40OGMtNTYuOTYgMC0xMDYuNjg4LTUxLjItMTA2LjY4OC0xMDkuNjk2IDAtNTguNDk2IDQ5Ljc5Mi0xMDkuNjk2IDEwNi42ODgtMTA5LjY5NnMxMDYuNjI0IDUxLjIgMTA2LjYyNCAxMDkuNjk2YzAgNTguNDk2LTQ5LjcyOCAxMDkuNjk2LTEwNi42MjQgMTA5LjY5NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMyIgdW5pY29kZT0iJiM1OTAwODsiIGQ9Ik03NjggODAwYTk2IDk2IDAgMSAwLTE5MiAwIDk2IDk2IDAgMCAwIDE5MiAweiBtMC02MDhhNjQgNjQgMCAxIDEgMC0xMjggNjQgNjQgMCAwIDEgMCAxMjh6IG0xMTcuNzYgMzE0LjI0bC0xMjIuMjQgMTIyLjI0YTMwLjcyIDMwLjcyIDAgMCAxLTIzLjY4IDExLjUySDI4OGEzMiAzMiAwIDAgMSAwLTY0aDE3Mi44TDI1NiAxNzIuOGEzMS4yMzIgMzEuMjMyIDAgMCAxIDAtMTIuOCAzMi43MDQgMzIuNzA0IDAgMCAxIDY0LTEzLjQ0TDM4NCAyNTZoMTI4bC0xMjMuNTItMjcxLjM2YTMxLjM2IDMxLjM2IDAgMCAxLTQuNDgtMTYuNjQgMzIuNjQgMzIuNjQgMCAwIDEgNjQtMTIuOGwzMDAuOCA2MDAuMzIgOTIuMTYtOTQuNzJhMzIgMzIgMCAwIDEgNDQuOCA0NS40NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNCIgdW5pY29kZT0iJiM1OTAwOTsiIGQ9Ik04MzYuOTI4IDQ3Mi42NHYtMzI0LjkyOGEyOS41NjggMjkuNTY4IDAgMCAwLTU5LjA3MiAwVjI2NS44NTZjMCA0OC45Ni0zOS42OCA4OC41NzYtODguNjQgODguNTc2SDYwMC42NFY3MDguOTI4QTU5LjA3MiA1OS4wNzIgMCAwIDEgNTQxLjU2OCA3NjhIMTg3LjA3MkE1OS4wNzIgNTkuMDcyIDAgMCAxIDEyOCA3MDguOTI4di02NDkuODU2YzAtMzIuNjQgMjYuNDMyLTU5LjA3MiA1OS4wNzItNTkuMDcyaDM1NC40OTZjMzIuNjQgMCA1OS4wNzIgMjYuNDMyIDU5LjA3MiA1OS4wNzJWMjk1LjM2aDg4LjU3NmMxNi4zMiAwIDI5LjU2OC0xMy4xODQgMjkuNTY4LTI5LjUwNHYtMTE4LjE0NGE4OC42NCA4OC42NCAwIDAgMSAxNzcuMjE2IDB2Mzg0YTU5LjA3MiA1OS4wNzIgMCAwIDEtNTkuMDcyIDU5LjA3MlY2ODBhMjkuNTA0IDI5LjUwNCAwIDAgMS0yOS41NjggMjguOTI4IDMwLjA4IDMwLjA4IDAgMCAxLTI5LjUwNC0zMi41MTJ2LTE0NC43MDRhNTkuMDcyIDU5LjA3MiAwIDEgMSA1OS4wNzIgNTkuMDcyeiBtLTI5NS4zNi0yOS41NjhBMjkuNTY4IDI5LjU2OCAwIDAgMCA1MTIgNDEzLjU2OEgyMTYuNjRhMjkuNTY4IDI5LjU2OCAwIDAgMC0yOS41NjggMjkuNTA0djE3Ny4yOGMwIDE2LjI1NiAxMy4yNDggMjkuNDQgMjkuNTY4IDI5LjQ0SDUxMmMxNi4zMiAwIDI5LjU2OC0xMy4xODQgMjkuNTY4LTI5LjQ0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTM1IiB1bmljb2RlPSImIzU5MDEwOyIgZD0iTTMwOC41NDQgNjkyLjU0NGMzMC43ODQgNS4xMiAyOS4wNTYgMzIuNTEyIDEwOS40NCA1MS4zMjggMCAwIDM0LjE3NiA0Mi42ODggNzYuOTI4IDM5LjI5NiAwIDAgNDcuODcyLTYuODQ4IDM1Ljg0IDEzLjY5NlM0OTMuMjQ4IDg2OC42NzIgNTM3LjcyOCA4ODUuNzZzNjYuNjI0LTMuNDU2IDc1LjItMTEuOTY4YzguNTc2LTguNTc2IDguNTc2LTIzLjkzNiA4LjU3Ni0yMy45MzZzMy4zOTItMjcuMzkyIDEuNjY0LTM0LjE3NmMtMS42NjQtNi44NDgtMjMuOTM2LTIwLjU0NC0xMS45NjgtMjcuMzkyIDExLjk2OC02Ljg0OCA5Mi4zNTIgNS4xMiA5NS43NDQtNzAuMDggMCAwIDM5LjI5Ni01NC43MiA1Mi45OTItNzguNjU2IDAgMCA1NC43Mi00NC40MTYgNjguNDE2LTcwLjA4IDAgMCA1Mi45OTItNDQuNDE2IDU2LjM4NC00Ny44NzIgMS43MjgtMy4zOTIgNjYuNjg4LTUxLjI2NCAzNy42MzItNTYuMzg0IDAgMCAxLjY2NC0zNC4xNzYtMTUuMzYtNi44NDgtMTUuNDI0IDI3LjMyOC0xMy42OTYgOC41MTItMTMuNjk2IDUuMTIgMC0zLjM5MiAxMC4yNC0zNS44NC0yMC40OC0xNy4wODgtMjkuMTIgMTguODE2LTI0IDQ0LjQxNi0yNCA0NC40MTZzMTEuOTY4IDYuODQ4LTEzLjY5NiAyMi4yNzJjLTI1LjYgMTUuMzYtNjYuNjI0IDQ2LjA4LTY2LjYyNCA1NC42NTYgMCAwLTQ5LjYgMzUuOTA0LTU2LjQ0OCA1Mi45OTItNi44NDggMTUuMzYtNi44NDggMC0xMC4yNC02Ljc4NCAwIDAtMjUuNi00Mi43NTItMjAuNDgtNjEuNTY4IDMuMzkyLTE4LjgxNiAyOC45OTItOTkuMiAyNS42LTExOS42OC0zLjM5Mi0yMC40OC0xOC44MTYtODUuNDQtMTcuMDg4LTg4Ljg5NiAxLjcyOC0zLjM5MiAyMi4yMDgtODAuMzItMjUuNi0xMTEuMTA0IDAgMC04Mi4xMTItMTU3LjI0OC04MC4zODQtMTc0LjMzNiAxLjcyOC0xOC44MTYgMS43MjgtMjkuMTIgMS43MjgtMjkuMTJsMS42NjQtMjUuNmMtNi44NDgtOC41NzYgNS4xMi02My4yOTYgMTguODE2LTc1LjI2NCAxMy42OTYtMTEuOTY4IDMyLjUxMi02NC45Ni0yNy4zMjgtNDIuNjg4QzUxOC44NDgtOTMuODI0IDUxMi0zOS4xMDQgNTEyLTM5LjEwNHMtNDYuMTQ0IDIwLjQ4LTE1LjM2IDU2LjM4NGMyOS4wNTYgMzUuOTA0IDM5LjI5NiAzNC4yNCAzOS4yOTYgMzQuMjRzMS43MjggMjAuNDggNi44NDggMTcuMDg4YzMuMzkyLTEuNzI4IDE4LjgxNiAyMTMuNjk2IDcwLjA4IDIwNi44NDhsLTEwLjI0IDIwLjQ4cy0xNy4wODgtMzUuODQtMjUuNjY0LTQyLjY4OGMtOC41NzYtNi44NDgtNi44NDgtMzAuNzg0LTM3LjYzMi00Mi43NTItMzAuNzItMTEuOTY4LTg1LjQ0LTU2LjQ0OC0xMjkuOTItODcuMTY4IDAgMC02Ljg0OC0zNy42MzItMTEuOTY4LTM5LjM2LTMuMzkyLTEuNzI4LTMwLjcyLTUxLjI2NC0yNS42LTYxLjUwNCA2Ljg0OC0xMS45NjgtMjIuMjcyLTgwLjM4NC00Ny44NzItOC41NzYtMjUuNiA3MC4wOC02Ljg0OCA3Ni45MjgtNi44NDggNzYuOTI4cy0yMC40OCA1OS44NCA1LjEyIDYxLjU2OCA0Ny44NzItMS43MjggNTEuMjY0IDBjMy40NTYgMS42NjQgOC41NzYgMy4zOTIgOC41NzYgMy4zOTJzODMuNzc2IDExNy45NTIgMTIxLjM0NCAxMTQuNTZjMCAwLTYuNzg0IDE1Mi4xMjggMTAuMjQgMTYwLjY0IDAgMC01Ni4zMiA5MC42MjQtNi43ODQgMTQxLjk1MiAwIDAtMzQuMTc2IDgzLjcxMi0yMi4yMDggOTQuMDE2IDAgMC0yNS42NjQgMTguODE2LTE4LjgxNiAyNS42IDAgMC03OC42NTYtMzIuNDQ4LTExNi4yODgtMzIuNDQ4IDAgMC0yMC40OC01LjEyLTI3LjMyOC0xMS45NjggMCAwLTExOC4yNzItMjUuNi0xMzAuMjQtOC41NzYtMTAuMjQgMTUuMzYgNTMuMzEyIDM3LjYzMiA1My4zMTIgMzcuNjMyczMyLjUxMiAxMC4yNCA2My4yMzIgMTUuMzZ6IG0tMjEzLjY5Ni0xLjY2NGE3My41MzYgNzMuNTM2IDAgMSAxIDE0Ny4wNzIgMCA3My41MzYgNzMuNTM2IDAgMCAxLTE0Ny4wNzIgMHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNiIgdW5pY29kZT0iJiM1OTAxMTsiIGQ9Ik02ODIuNjg4IDc2OGMtMzcuNzYgMC02OC4yODgtMzEuMDQtNjguMjg4LTY5LjMxMnMzMC41OTItNjkuMzc2IDY4LjI4OC02OS4zNzYgNjguMjI0IDMxLjA0IDY4LjIyNCA2OS4zNzZTNzIwLjM4NCA3NjggNjgyLjY4OCA3Njh6IG0tMTI2LjcyLTEzOC4yNGEzMy45MiAzMy45MiAwIDAgMS0yMy42OC05LjkyTDM1MiA0NDYuNTI4YTM1LjAwOCAzNS4wMDggMCAwIDEgMi45NDQtNTIuOTI4bDEyMi44OC05My41Njh2LTE5MC43MmMtMC42NC00Ni44NDggNjguOTkyLTQ2Ljg0OCA2OC4yODggMHYyMDhhMzQuODggMzQuODggMCAwIDEtMTMuNTY4IDI3Ljc3NmwtNTIuNDE2IDM5LjkzNiAxMjQuMTYgMTE5LjM2IDUxLjA3Mi02OS4yNDhhMzMuOTIgMzMuOTIgMCAwIDEgMjcuMzI4LTEzLjgyNGgxMDIuNGM0Ni4wOC0wLjY0IDQ2LjA4IDcwLjAxNiAwIDY5LjM3NmgtODUuMzc2bC01MS4yIDY5LjMxMi00MC45NiA1NS41NTJhMzMuOTg0IDMzLjk4NCAwIDAgMS0yNi4yNCAxNC4yMDh6TTIwNC44IDM1MkM5MS43MTIgMzUyIDAgMjU4Ljg4IDAgMTQ0UzkxLjcxMi02NCAyMDQuOC02NHMyMDQuOCA5My4xMiAyMDQuOCAyMDhTMzE3Ljg4OCAzNTIgMjA0LjggMzUyeiBtNjE0LjQgMGMtMTEzLjA4OCAwLTIwNC44LTkzLjEyLTIwNC44LTIwOFM3MDYuMTEyLTY0IDgxOS4yLTY0czIwNC44IDkzLjEyIDIwNC44IDIwOC05MS43MTIgMjA4LTIwNC44IDIwOHpNMjA0LjggMjgyLjY4OGM3NS4zOTIgMCAxMzYuNTEyLTYyLjA4IDEzNi41MTItMTM4LjY4OHMtNjEuMTItMTM4LjY4OC0xMzYuNTEyLTEzOC42ODgtMTM2LjUxMiA2Mi4wOC0xMzYuNTEyIDEzOC42ODggNjEuMTIgMTM4LjY4OCAxMzYuNTEyIDEzOC42ODh6IG02MTQuNCAwYzc1LjM5MiAwIDEzNi41MTItNjIuMDggMTM2LjUxMi0xMzguNjg4cy02MS4xMi0xMzguNjg4LTEzNi41MTItMTM4LjY4OC0xMzYuNTEyIDYyLjA4LTEzNi41MTIgMTM4LjY4OCA2MS4xMiAxMzguNjg4IDEzNi41MTIgMTM4LjY4OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNyIgdW5pY29kZT0iJiM1OTAxMjsiIGQ9Ik01MTIgNzY4QzQwOS42IDc2OCAzMzIuOCA2ODcuNzQ0IDMzMi44IDU4OC44YTE3OC43NTIgMTc4Ljc1MiAwIDAgMSAxMjgtMTcwLjg4di0zMDkuMjQ4Yy00Ny42MTYgOC40NDgtOTYgMjguMTYtMTM1LjYxNiA2NS4wMjQtNTMuODg4IDUwLjE3Ni05NC43MiAxMzAuMDQ4LTk0LjcyIDI2MS42MzJhNTEuMiA1MS4yIDAgMSAxLTEwMi40NjQgMGMwLTE1My43OTIgNTEuODQtMjY2LjA0OCAxMjcuNDg4LTMzNi41MTJTNDI2Ljg4IDAgNTEyIDBjODUuMjQ4IDAgMTgwLjk5MiAyOC42NzIgMjU2LjY0IDk5LjMyOHMxMjcuMjMyIDE4Mi45NzYgMTI3LjIzMiAzMzZjMy4zMjggNzEuNDI0LTEwNS42IDcxLjQyNC0xMDIuMjcyIDAgMC0xMzAuNzUyLTQwLjk2LTIxMC42ODgtOTQuOTEyLTI2MS4xMi0zOS42MTYtMzYuOTkyLTg3LjkzNi01Ni44OTYtMTM1LjQ4OC02NS40MDhWNDE3LjcyOGExNzguODggMTc4Ljg4IDAgMCAxIDEyOCAxNzEuMDcyQzY5MS4yIDY4Ny43NDQgNjE0LjQgNzY4IDUxMiA3Njh6IG0wLTEwMi40QTc2LjggNzYuOCAwIDEgMCA1MTIgNTEyYTc2LjggNzYuOCAwIDAgMCAwIDE1My42eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTM4IiB1bmljb2RlPSImIzU5MDEzOyIgZD0iTTM4My44MDggMTczLjE4NGMzOS44NzItMC41NzYgNzguMzM2LTE0LjcyIDEwOS4zMTItNDAuMzJsMTUuMzYtMTMuODg4aDIuOTQ0bDE4LjMwNCAxNi44MzJhMTY4LjEyOCAxNjguMTI4IDAgMCAwIDIwMy4yIDEwLjg4bDEzMy41MDQgMjY3LjQ1Ni04OC41NzYgNjAuMTZWNjg4LjI1NmE5MS44NCA5MS44NCAwIDAgMS04OC42NCA4Ny4zNmgtMjkuNTA0YTU2LjI1NiA1Ni4yNTYgMCAwIDEtNTkuMDcyIDYwLjE2aC0xNzcuMjhhNTUuOTM2IDU1LjkzNiAwIDAgMS01OS4wNzItNjAuMTZoLTI5LjUwNGE5MS44NCA5MS44NCAwIDAgMS04OC42NC04Ny4zNnYtMjEzLjgyNGwtODguNTc2LTYwLjIyNCAxMzIuODY0LTI3Mi44OTZhMTcwLjg4IDE3MC44OCAwIDAgMCA5My4zNzYgMzEuOTM2ek0zMDUuMjE2IDY4OC4xOTJhMjcuOTY4IDI3Ljk2OCAwIDAgMCAyOC44NjQgMjcuMTM2aDM1NS4yYTI3Ljk2OCAyNy45NjggMCAwIDAgMjkuNDQtMzAuMTQ0di0xODAuNzM2TDUxMiA2MjQuOTYgMzA1LjI4IDUwNy40NTZ6TTg5NiA1Mi42NzJ2LTYwLjE2YTU4LjY4OCA1OC42ODggMCAwIDEtNDAuMTkyLTIwLjQ4Yy0xNi0xNy40MDgtMzYuNDgtMjkuODg4LTU5LjA3Mi0zNi4xNi0zNi4yODgtMTAuOTQ0LTc1LjUyLTIuNTYtMTA0LjU3NiAyMi4yNzJsLTIzLjA0IDIxLjEyYTQ1LjQ0IDQ1LjQ0IDAgMCAxLTY0Ljk2IDBjLTguMzItNy4yOTYtMTYtMTUuMTA0LTI0LjgzMi0yMi4zMzZhMTExLjc0NCAxMTEuNzQ0IDAgMCAwLTE0Ni40OTYgNC4yMjRsLTIzLjA0IDIxLjEyYTQ0LjIyNCA0NC4yMjQgMCAwIDEtNTkuMDcyIDBjLTExLjItOS4wODgtMjEuMjQ4LTE5LjMyOC0zMi41MTItMjguMzUyLTQxLjYtMzEuMzYtOTguODE2LTI5Ljk1Mi0xMzguODE2IDMuNTg0bC0xOC4zMDQgMTYuMzJBNTUuMjMyIDU1LjIzMiAwIDAgMSAxMjgtNy41NTJ2NjAuMjg4YzE1LjI5NiAxLjkyIDMwLjcyLTEuMDI0IDQ0LjI4OC04LjQ0OCAxNi40NDgtMTAuMzY4IDMyLjA2NC0yMi4wOCA0Ni43Mi0zNC45NDQgMTIuMDk2LTEzLjQ0IDMwLjQtMTkuMiA0Ny44MDgtMTUuMDRhNTQuNTkyIDU0LjU5MiAwIDAgMSAxOC4zMDQgOS42YzkuNDcyIDcuMjMyIDE3LjE1MiAxNS42OCAyNi42MjQgMjMuNDg4YTExMS43NDQgMTExLjc0NCAwIDAgMCAxNDQuNzA0IDBjOS40NzItNy44MDggMTguMzA0LTE2LjgzMiAyNy43NzYtMjQuNzA0YTQ0LjIyNCA0NC4yMjQgMCAwIDEgNTkuMDcyIDBjOS40NzIgNy44NzIgMTguMzA0IDE2Ljg5NiAyNy43NzYgMjQuNzA0YTExMS43NDQgMTExLjc0NCAwIDAgMCAxNDUuMjggMGM4Ljk2LTcuODA4IDE3LjIxNi0xNi4yNTYgMjYuMDQ4LTIzLjQ4OGE0NC4yMjQgNDQuMjI0IDAgMCAxIDU5LjA3MiAwbDI3Ljc3NiAyNC43MDRBMTA0LjUxMiAxMDQuNTEyIDAgMCAwIDg5NiA1Mi43MzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMzkiIHVuaWNvZGU9IiYjNTkwMTQ7IiBkPSJNNzE1LjYzNTI3MyA3MzguNDQxODQ3YzQ0Ljk4OTE4OCAwIDgxLjQ2NjkwOCAzNS4yNjE3OTYgODEuNDY2OTA4IDc4Ljc3OTA3N1M3NjAuNjI0NDYxIDg5NiA3MTUuNjM1MjczIDg5NiA2MzQuMTY4MzY0IDg2MC43MzgyMDQgNjM0LjE2ODM2NCA4MTcuMjg0OTJjMC00My41MTcyOCAzNi40Nzc3Mi03OC44NDMwNzIgODEuNDY2OTA5LTc4Ljg0MzA3M3ogbS02MTAuOTA1ODE5LTU1MS4zMjU1NDJoMjAzLjYzNTI3M2w4MS40NjY5MDkgMjM2LjI3MzIzM0w0NzEuMjk4NTQ0IDU2MS4zMDA5MTkgMzg5Ljc2NzY0IDU4MC45NDc2OTFsLTE4Ny4zMTYyOTMtNzguNzE1MDgxYTQ0LjM0OTIyOCA0NC4zNDkyMjggMCAwIDAtNTcuMDIwNDM2IDIzLjU1MDUyOSA0MS45ODEzNzYgNDEuOTgxMzc2IDAgMCAwIDI0LjQ0NjQ3MiA1NS4xNjQ1NTJsMjE5Ljg5MDI1NyA3OC43MTUwOGgxNjIuODY5ODJsMTYyLjkzMzgxNy03OC43MTUwOCA4MS40NjY5MDgtNzguNzE1MDgxaDEyMi4xNjgzNjVjMjIuNDYyNTk2IDAgNDAuNzAxNDU2LTE3LjY2Mjg5NiA0MC43MDE0NTYtMzkuNDIxNTM2IDAtMjEuNzU4NjQtMTguMjM4ODYtMzkuNDIxNTM2LTQwLjcwMTQ1Ni0zOS40MjE1MzZoLTIwMy42MzUyNzNMNjM0LjE2ODM2NCA1MDIuMTY4NjE0IDU1Mi43MDE0NTYgMzQ0LjY3NDQ1OGwxNjIuOTMzODE3LTE1Ny41NTgxNTN2LTI3NS42OTQ3NjljMC0yMS43NTg2NC0xOC4yMzg4Ni0zOS4zNTc1NC00MC43NjU0NTItMzkuMzU3NTRzLTQwLjcwMTQ1NiAxNy42NjI4OTYtNDAuNzAxNDU3IDM5LjM1NzU0djI0NC45NzY2ODlsLTE2Mi44Njk4MiAxMDkuNDMzMTYxLTgxLjQ2NjkwOC0xNTcuNDMwMTYxSDEwNC43Mjk0NTRjLTIyLjQ2MjU5NiAwLTQwLjcwMTQ1NiAxNy41OTg5LTQwLjcwMTQ1NiAzOS4zNTc1NHMxOC4yMzg4NiAzOS4zNTc1NCA0MC43MDE0NTYgMzkuMzU3NTR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDAiIHVuaWNvZGU9IiYjNTkwMTU7IiBkPSJNMTI4IDY0MGMtMzUuNDU2IDAtNjQtMjguNTQ0LTY0LTY0di00NDhjMC0zNS40NTYgMjguNTQ0LTY0IDY0LTY0aDgzMmMzNS40NTYgMCA2NCAyOC41NDQgNjQgNjRWNTc2YzAgMzUuNDU2LTI4LjU0NCA2NC02NCA2NHogbTAtNjRoOTZhMzIgMzIgMCAxIDAtMzItMzJsLTMyLTMyYTMyIDMyIDAgMSAwLTMyLTMyeiBtNDE2IDBDNjMyLjMyIDU3NiA3MDQgNDc1LjcxMiA3MDQgMzUyUzYzMi4zMiAxMjggNTQ0IDEyOCAzODQgMjI4LjI4OCAzODQgMzUyIDQ1NS42OCA1NzYgNTQ0IDU3NnogbTMyMCAwSDk2MHYtOTZhMzIgMzIgMCAxIDAtMzIgMzJsLTMyIDMyYTMyIDMyIDAgMSAwLTMyIDMyeiBtLTMyMC05NmMtMjAuNjcyIDAtMzQuMTc2LTYuOTc2LTQzLjY0OC0xNmg4Ny4yOTZjLTkuNDcyIDkuMDI0LTIyLjk3NiAxNi00My42NDggMTZ6IG0tNTYtMzJjLTIuODgtNS44MjQtMy45NjgtMTAuOTQ0LTUuMTItMTZoMTIyLjI0Yy0xLjE1MiA1LjA1Ni0yLjI0IDEwLjE3Ni01LjEyIDE2eiBtLTgtMzJ2LTE2aDEyOFY0MTZ6IG0wLTMydi0xNmgxMjhWMzg0eiBtMC0zMnYtMTZoMTI4VjM1MnogbTAtMzJsLTE2LTE2aDEyOEw2MDggMzIweiBtLTMyLTMyczIuMjQtNi41MjggNi41MjgtMTZoMTQ1LjQ3Mkw1NzYgMjg4eiBtLTI4OC0zMmEzMiAzMiAwIDAgMCAwLTY0bDMyLTMyYTMyIDMyIDAgMSAwIDMyLTMySDEyOHY5NmEzMiAzMiAwIDAgMCAzMiAzMnogbTMwMy4yMzIgMGMyLjk0NC01LjUwNCA0Ljg2NC0xMC4xNzYgOC43NjgtMTZoMTQ1LjE1MmM0LjIyNCA4LjgzMiA2Ljg0OCAxNiA2Ljg0OCAxNnogbTQ2NC43NjggMGEzMiAzMiAwIDAgMCAzMi0zMlYxMjhoLTk2YTMyIDMyIDAgMSAwIDMyIDMybDMyIDMyYTMyIDMyIDAgMCAwIDAgNjR6IG0tNDQzLjc3Ni0zMmM1LjA1Ni01LjgyNCAxMC41Ni0xMS4yNjQgMTYuNjQtMTZoOTAuODhjNi40IDQuOTI4IDEyLjAzMiAxMC4zNjggMTYuMjU2IDE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQxIiB1bmljb2RlPSImIzU5MDE2OyIgZD0iTTUxMiA3NjhjLTExNy4wNTYgMC00MDkuNi0xNC43Mi0zODAuMzUyLTQ0LjI4OGwzNTEuMTA0LTM2OS4yOHYtMjM2LjI4OGMwLTU5LjA3Mi0xNzUuNTUyLTI5LjUwNC0xNzUuNTUyLTExOC4xNDRoNDA5LjZjMCA4OC42NC0xNzUuNTUyIDU5LjA3Mi0xNzUuNTUyIDExOC4xNDRWMzU0LjQzMmwzNTEuMTA0IDM2OS4yOEM5MjEuNiA3NTMuMjE2IDYyOS4wNTYgNzY4IDUxMiA3Njh6IG0wLTU5LjA3MmMxNDYuMzA0IDAgMjc3Ljk1Mi0xNC43MiAyNzcuOTUyLTE0LjcybC00My45MDQtNDQuMzUySDI3Ny45NTJsLTQzLjkwNCA0NC4yODhzMTMxLjY0OCAxNC43MiAyNzcuOTUyIDE0LjcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQyIiB1bmljb2RlPSImIzU5MDE3OyIgZD0iTTg4NS4zMTIgNTYzLjJoLTEzOC42MjRWNzA0SDE5MnYtMjgxLjZjMC44OTYtMTU1LjUyIDEyNS44MjQtMjgwLjgzMiAyNzkuMDQtMjc5Ljg3MkEyNzYuNjA4IDI3Ni42MDggMCAwIDEgNzA4LjQ4IDI4MS42aDE3Ni44MzJDOTYxLjkyIDI4MS42IDEwMjQgMzQ0LjY0IDEwMjQgNDIyLjRzLTYyLjA4IDE0MC44LTEzOC42ODggMTQwLjh6IG0wLTIxMS4yaC0xNDguMzUyYzYuMTQ0IDIyLjk3NiA5LjQwOCA0Ni41OTIgOS43MjggNzAuNFY0OTIuOGgxMzguNjI0YzM4LjMzNiAwIDY5LjM3Ni0zMS40ODggNjkuMzc2LTcwLjRzLTMxLjA0LTcwLjQtNjkuMzc2LTcwLjR6IG0tMTM4LjYyNC0zMTYuOGMwLTE5LjQ1Ni0xNS41NTItMzUuMi0zNC42ODgtMzUuMkgyMjYuNjg4Yy0xOS4yIDAtMzQuNjg4IDE1Ljc0NC0zNC42ODggMzUuMnMxNS41NTIgMzUuMiAzNC42ODggMzUuMmg0ODUuMzEyYzE5LjIgMCAzNC42ODgtMTUuNzQ0IDM0LjY4OC0zNS4yeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQzIiB1bmljb2RlPSImIzU5MDE4OyIgZD0iTTk3Mi41NDQgNDA5LjI4aC0xNTAuMDE2di0yNTMuNjMyaDgzLjMyOHYtNjcuNjQ4aDUwLjA0OHYtNjcuNjQ4SDg5LjI4djY3LjY0OGg0OS45ODR2NjcuNjQ4aDk5Ljk2OFY0MDkuMjhINzYuOGwyMjkuMTIgMTUyLjE5MkgxNDMuNDg4TDUwNS45MiA3OTguMDhWODMyaDMzLjI4di0zMy44NTZsMzgzLjM2LTIzNi42NzJoLTE2OC4xOTJ6IG0tNjgzLjI2NCAwdi0yMDIuODhoODMuMzI4djIwMi44OHogbTIxNi42NCAwSDQyMi41OTJ2LTIwMi44OGg4My4zMjh6IG0xMzMuMzEyIDBINTU1LjkwNHYtMjAyLjg4aDgzLjMyOHogbTQ5Ljk4NC0yMDIuODhoODMuMzI4djIwMi44OEg2ODkuMjh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDQiIHVuaWNvZGU9IiYjNTkwMTk7IiBkPSJNOTYgNzM2Yy0xOS4yIDAtMzItMTIuOC0zMi0zMnYtNjA4YzAtMTkuMiAxMi44LTMyIDMyLTMyczMyIDEyLjggMzIgMzJWMTkyaDgzMnYtOTZjMC0xOS4yIDEyLjgtMzIgMzItMzJzMzIgMTIuOCAzMiAzMnYxMjhjMCAxOS4yLTEyLjggMzItMzIgMzJIMTI4VjcwNGMwIDE5LjItMTIuOCAzMi0zMiAzMnogbTE5Mi0zMkMyMzYuOCA3MDQgMTkyIDY1OS4yIDE5MiA2MDhTMjM2LjggNTEyIDI4OCA1MTIgMzg0IDU1Ni44IDM4NCA2MDggMzM5LjIgNzA0IDI4OCA3MDR6TTUxMiA2NDBDNDE2IDY0MCA0MTYgNTQ0IDQxNiA1NDRWNDQ4aC0xOTJjLTE5LjIgMC0zMi0xMi44LTMyLTMydi02NGMwLTE5LjIgMTIuOC0zMiAzMi0zMkgxMDI0VjQ4MEMxMDI0IDY0MCA4NjQgNjQwIDg2NCA2NDB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDUiIHVuaWNvZGU9IiYjNTkwMjA7IiBkPSJNODk0LjI3MiAzNC44OGMtNDAuOTYtMjAuOTI4LTk1LjU1Mi02Ljk3Ni0xMjIuODggMzQuOTQ0bC03NS4wNzIgOTcuNzI4SDMyNy42OGwtNzUuMDcyLTk3LjcyOGMtMzQuMTc2LTQ4Ljg5Ni05NS42MTYtNTUuODcyLTE0My4zNi0yMC45MjgtMzQuMTc2IDI3LjkwNC00Ny44MDggNjkuNzYtNDAuOTYgMTA0LjcwNGw0Ny43NDQgMjU4LjMwNEMxMjkuNzI4IDQ5NS43NDQgMjA0LjggNTU4LjUyOCAyODYuNzIgNTU4LjUyOGgxOTEuMTY4VjY2My4yOTZDNDc3Ljg4OCA3MTkuMTA0IDUxOC44NDggNzY4IDU3My40NCA3NjhoMjExLjY0OGMyMC40OCAwIDM0LjExMi0xMy45NTIgMzQuMTEyLTM0Ljg4IDAtMjAuOTkyLTEzLjYzMi0zNC45NDQtMzQuMTEyLTM0Ljk0NGgtMjA0LjhjLTIwLjQ4IDAtMzQuMTc2LTEzLjk1Mi0zNC4xNzYtMjcuOTA0di0xMTEuNzQ0aDE5MS4xNjhjODEuOTIgMCAxNTYuOTkyLTYyLjg0OCAxNzAuNjg4LTE0Ni41Nmw0Ny43NDQtMjU4LjM2OGM2Ljg0OC00OC44OTYtMTMuNjMyLTk3LjcyOC02MS40NC0xMTguNzJ6TTQwOS42IDM4NGMwIDU1Ljg3Mi00Ny44MDggMTA0LjcwNC0xMDIuNCAxMDQuNzA0UzIwNC44IDQzOS44NzIgMjA0LjggMzg0czQ3LjgwOC0xMDQuNzA0IDEwMi40LTEwNC43MDRTNDA5LjYgMzI4LjEyOCA0MDkuNiAzODR6IG00MDkuNiAwYzAgMjAuOTI4LTEzLjYzMiAzNC44OC0zNC4xMTIgMzQuODhoLTM0LjE3NnYzNC45NDRjMCAyMC45MjgtMTMuNjMyIDM0Ljg4LTM0LjExMiAzNC44OHMtMzQuMTEyLTEzLjk1Mi0zNC4xMTItMzQuODh2LTM0Ljk0NGgtMzQuMTc2Yy0yMC40OCAwLTM0LjExMi0xMy45NTItMzQuMTEyLTM0Ljg4czEzLjYzMi0zNC44OCAzNC4xMTItMzQuODhoMzQuMTc2di0zNC45NDRjMC0yMC45MjggMTMuNjMyLTM0Ljg4IDM0LjExMi0zNC44OHMzNC4xMTIgMTMuOTUyIDM0LjExMiAzNC44OHYzNC45NDRoMzQuMTc2YzIwLjQ4IDAgMzQuMTEyIDEzLjk1MiAzNC4xMTIgMzQuODh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDYiIHVuaWNvZGU9IiYjNTkwMjE7IiBkPSJNMzQxLjEyIDc2OEg2NHYtNjg1LjMxMmgyNTkuMDcyYzQ2LjkxMiAwIDE0OC4wMzItMjcuMDcyIDE0OC4wMzItODIuNjg4VjY0My45NjhDNDcxLjEwNCA2OTAuMTEyIDQwMC4xOTIgNzY4IDM0MS4xMiA3Njh6IG0zNDEuNTA0IDBjLTU5LjEzNiAwLTEzMC4wNDgtNzcuODg4LTEzMC4wNDgtMTI0LjAzMlYwYzAgNTUuNjE2IDEwMS4xMiA4Mi42ODggMTQ3Ljk2OCA4Mi42ODhoMjU5LjEzNlY3Njh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDciIHVuaWNvZGU9IiYjNTkwMjI7IiBkPSJNMTAyNCAzNzQuNHYtMTY2LjRjMC0yMi45NzYtMTcuOTItNDEuNi00MC00MS42cy00MCAxOC42MjQtNDAgNDEuNmMwIDAgNC44IDQxLjYtODAgNDEuNmgtODB2LTIwOGMwLTIyLjk3Ni0xNy45Mi00MS42LTQwLTQxLjZoLTY0MEE0MC44MzIgNDAuODMyIDAgMCAwIDY0IDQxLjZ2MzMyLjhjMCAyMi45NzYgMTcuOTIgNDEuNiA0MCA0MS42aDY0MGMyMi4wOCAwIDQwLTE4LjYyNCA0MC00MS42di00MS42aDgwYzg0LjggMCA4MCA0MS42IDgwIDQxLjYgMCAyMi45NzYgMTcuOTIgNDEuNiA0MCA0MS42czQwLTE4LjYyNCA0MC00MS42ek0yMjQgNzQ4LjhDMTM1LjY4IDc0OC44IDY0IDY3NC4zMDQgNjQgNTgyLjRzNzEuNjgtMTY2LjQgMTYwLTE2Ni40UzM4NCA0OTAuNDk2IDM4NCA1ODIuNCAzMTIuMzIgNzQ4LjggMjI0IDc0OC44eiBtMC0yNDkuNmMtNDQuMTYgMC04MCAzNy4yNDgtODAgODMuMnMzNS44NCA4My4yIDgwIDgzLjIgODAtMzcuMjQ4IDgwLTgzLjItMzUuODQtODMuMi04MC04My4yek01ODQgODMyQzQ3My41MzYgODMyIDM4NCA3MzguODggMzg0IDYyNFM0NzMuNiA0MTYgNTg0IDQxNnMyMDAgOTMuMTIgMjAwIDIwOFM2OTQuNCA4MzIgNTg0IDgzMnogbTAtMzMyLjhjLTY2LjMwNCAwLTEyMCA1NS44NzItMTIwIDEyNC44UzUxNy43NiA3NDguOCA1ODQgNzQ4LjggNzA0IDY5Mi45MjggNzA0IDYyNCA2NTAuMjQgNDk5LjIgNTg0IDQ5OS4yeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQ4IiB1bmljb2RlPSImIzU5MDIzOyIgZD0iTTg5MS45MDQgNzYwYTIyNS45ODQgMjI1Ljk4NCAwIDAgMS0zODYuNDk2LTE0OC42MDhsMjM3LjY5Ni0yMzcuNjk2YTIyNS45ODQgMjI1Ljk4NCAwIDAgMSAxNDguOCAzODYuMzA0ek0zMzAuMTEyIDM1OC45MTJMMTY5LjYgMTk4LjRhNzUuNjQ4IDc1LjY0OCAwIDAgMSAwLTEwNi45NDRsNTMuNTA0LTUzLjUwNGMyOS41MDQtMjkuNTA0IDc3LjQ0LTI5LjUwNCAxMDYuODggMEw0OTAuNDk2IDE5OC40bDE2MC41MTIgMTYwLjUxMi0xNjAuNDQ4IDE2MC4zODR6IG01Ni4wNjQtMTU3Ljg4OGwtNTMuNTA0IDUzLjUwNCAxNTcuODI0IDE1Ny44MjQgNTMuNTA0LTUzLjQ0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQ5IiB1bmljb2RlPSImIzU5MDI0OyIgZD0iTTk1MS4wNCA0MDAuNDQ4TDE1Mi4wNjQgODMwLjIwOGMtMTEuNTIgNS43Ni0yNS42LTMuMzI4LTIzLjkzNi0xNS44MDhsNjEuOTUyLTc0Mi4zMzZjMC44MzItMTEuNjQ4IDEyLjQxNi0xOC4zMDQgMjMuMTY4LTE0LjA4bDI1Ny43MjggMTA4LjggMTQxLjMxMi0xNjEuMjE2YzkuMDg4LTkuOTg0IDI0Ljc2OC01Ljc2IDI4LjA5NiA2LjY1Nmw2Ny43MTIgMjU1LjIzMiAyNDIuOTQ0IDEwMy4wNGExNi45NiAxNi45NiAwIDAgMSAwIDI5Ljk1MnogbS0zMzguNzUyLTMxNy41NjhsLTc0LjM2OCAxMzIuOTkyLTM4MC4wMzIgNTkwLjIwOCA1MDMuOTM2LTUyMy43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTAiIHVuaWNvZGU9IiYjNTkwMjU7IiBkPSJNOTYwIDIxNnY4MGwtMzY2LjU5MiAyNDBWODE2UzU5My40MDggODk2IDUxMiA4OTZDNDMwLjUyOCA4OTYgNDMwLjUyOCA4MTYgNDMwLjUyOCA4MTZ2LTI4MEw2NCAyOTZ2LTgwbDM2Ni41MjggMTIwLjA2NHYtMjI0LjA2NGwtMTIyLjE3Ni05NlYtNjRMNTEyIDE2IDcxNS42NDgtNjR2ODBsLTEyMi4yNCA5NnYyMjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTEiIHVuaWNvZGU9IiYjNTkwMjY7IiBkPSJNOTgwLjczNiA1MjQuMDk2di0xNzEuNzEybDM1LjY0OC0zNi4wOTYtNzQuMzY4LTc4LjQ2NC03NS4yNjQgNzYuMTYgNTEuNTg0IDQ3LjQ4OFY0OTYuOTZDNjk5LjUyIDQwNS41NjggNjI5LjUwNCAzNzcuMTUyIDU4MC45OTIgMzU1LjAwOHMtODMuNDU2LTIyLjA4LTEzMS41ODQtMy43MTJDNDAxLjM0NCAzNjkuNjY0IDE3Mi4yODggNDU0LjQgNTguNTYgNTA5LjU2OGMtNzUuODQgMzYuOC04MC43NjggNjAuMTYgMS4yOCA5MS4zMjggMTA3LjEzNiA0MS4yOCAyODQuMTYgMTA3LjI2NCAzNzguMDQ4IDE0My4zNiA1NS41NTIgMjIuNzg0IDg0LjkyOCAzNS4yIDEzNS44NzIgOS4yMTYgOTEuMDcyLTM4LjA4IDI5OS4xMzYtMTE3LjE4NCA0MDIuNTYtMTYwLjUxMiA5MC4wNDgtMzkuODA4IDI5LjUwNC01Mi45MjggNC40MTYtNjguODY0ek01OTEuNTUyIDI4Ny4wNGM1Mi44NjQgMjIuMTQ0IDEyNC4xNiA1OC42ODggMjAxLjkyIDkyLjQ4di0yNzEuMTA0UzY5Mi45MjggMCA1MTYuMTYgMGMtMTkwLjQgMC0yOTMuMjQ4IDEwOC40MTYtMjkzLjI0OCAxMDguNDE2VjM2MS40NzJjNTkuOTY4LTI0LjgzMiAxMjcuMzYtNDYuMDggMjA4Ljk2LTc0LjQzMiA1MC4yNC0xOC4xMTIgMTE0LjA0OC0yNC4zODQgMTU5LjY4IDB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTIiIHVuaWNvZGU9IiYjNTkwMjc7IiBkPSJNNzc3LjM0NCA2NTAuNDk2SDg3Ni44YzQ0Ljg2NC0wLjA2NCA4MS4yOC0zNS4wMDggODEuNTM2LTc4LjIwOEw5NjAgMTQyLjAxNmMwLjEyOC0yMC43MzYtOC4zODQtNDAuNjQtMjMuNjgtNTUuMjk2cy0zNS44NC0yMi44NDgtNTcuNDA4LTIyLjcybC03MzEuNjQ4IDEuNjY0Yy00NC45OTIgMC4xMjgtODEuNDA4IDM1LjItODEuNjY0IDc4LjRMNjQgNTcyLjIyNGMtMC4xMjggMjAuNzM2IDguMzg0IDQwLjY0IDIzLjYxNiA1NS4zNnMzNS44NCAyMi45MTIgNTcuMzQ0IDIyLjkxMmgxMjQuMjg4YTM2LjU0NCAzNi41NDQgMCAwIDEgMjkuNjMyIDE3LjZsMzMuMjggNjMuNjE2YzkuOTIgMTkuMiAzNi4yODggMzQuOTQ0IDU4LjY4OCAzNS4wNzJMNjU0LjcyIDc2OGMyMi41MjggMC4xMjggNDguNzY4LTE1LjQ4OCA1OC44OC0zNC44MTZsMzQuMjQtNjUuMzQ0YzUuMDU2LTkuNiAxOC4yNC0xNy4zNDQgMjkuNDQtMTcuMzQ0eiBtLTI2Ni40MzItMzguODQ4Yy0xMzQuNzg0IDAtMjQzLjkwNC0xMDUuMDg4LTI0My45MDQtMjM0Ljc1MiAwLTEyOS43MjggMTA5LjEyLTIzNC44OCAyNDMuODQtMjM0Ljg4IDEzNC43ODQgMCAyNDMuOTY4IDEwNS4xNTIgMjQzLjk2OCAyMzQuODggMCAxMjkuNjY0LTEwOS4xODQgMjM0Ljc1Mi0yNDMuOTA0IDIzNC43NTJ6IG0tNS4xMi0zODEuNTA0YzgxLjQwOCAwIDE0Ny4zOTIgNjMuNDg4IDE0Ny4zOTIgMTQxLjgyNGExOS45NjggMTkuOTY4IDAgMCAxLTIwLjM1MiAxOS41ODQgMTkuOTY4IDE5Ljk2OCAwIDAgMS0yMC4yODgtMTkuNTg0YzAtNTYuNzA0LTQ3LjgwOC0xMDIuNzItMTA2Ljc1Mi0xMDIuNzJhMTkuOTY4IDE5Ljk2OCAwIDAgMS0yMC4yODgtMTkuNTg0YzAtMTAuODE2IDkuMDg4LTE5LjUyIDIwLjI4OC0xOS41MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01MyIgdW5pY29kZT0iJiM1OTAyODsiIGQ9Ik01MTIgNzY4YTM4NCAzODQgMCAxIDEgMC03NjhBMzg0IDM4NCAwIDAgMSA1MTIgNzY4eiBtMC02ODIuNjg4YTI5OC42ODggMjk4LjY4OCAwIDEgMCAwIDU5Ny4zNzYgMjk4LjY4OCAyOTguNjg4IDAgMCAwIDAtNTk3LjM3NnogbTAgNDY5LjMxMmExNzAuNjg4IDE3MC42ODggMCAxIDAgMC0zNDEuMzEyIDE3MC42ODggMTcwLjY4OCAwIDAgMCAwIDM0MS4zMTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTQiIHVuaWNvZGU9IiYjNTkwMjk7IiBkPSJNNTE3LjQ0IDY5OS4wNzJjLTg0LjA5NiAwLTE0OS41NjgtOTUuMTA0LTE3NS4xMDQtMTI1LjQ0YTMzLjc5MiAzMy43OTIgMCAwIDEtNy41NTItMjIuMDh2LTMwMy4yMzJhMzAuMzM2IDMwLjMzNiAwIDAgMSA0OS42LTI0LjgzMiAyMDYuNzIgMjA2LjcyIDAgMCAwIDEzMy4wNTYgODAuNjRjOTcuMTUyIDAgMTM0LjQtODcuNDg4IDIzNS43MTItODcuNDg4YTM2My45NjggMzYzLjk2OCAwIDAgMSAxODguMTYgNzUuMDcyYzguNzY4IDYuNDY0IDEzLjg4OCAxNi43MDQgMTMuNzYgMjcuNTg0VjY2OC4xNmEzMC4zMzYgMzAuMzM2IDAgMCAxLTQyLjc1MiAzMC45NzYgMzk2LjM1MiAzOTYuMzUyIDAgMCAwLTE1OS4xNjgtNzMuMDI0Yy0xMDEuMzEyLTEuNDA4LTEzNC40IDczLjAyNC0yMzUuNzEyIDczLjAyNHogbS0yODYuMDgtNjguOTI4YTY4LjkyOCA2OC45MjggMCAxIDAgMCAxMzcuODU2IDY4LjkyOCA2OC45MjggMCAwIDAgMC0xMzcuODU2eiBtMzQuNDk2LTY4LjkyOFYtOTIuMTZhMzQuNDk2IDM0LjQ5NiAwIDAgMC02OC45MjggMFY1NjEuMjhhMzQuNDk2IDM0LjQ5NiAwIDAgMCA2OC45MjggMHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01NSIgdW5pY29kZT0iJiM1OTAzMDsiIGQ9Ik00NzQuMjQxMDYyIDc2OC42Nzg3ODFoLTEzNC4zOTYyMmEzMS43NDMxMDcgMzEuNzQzMTA3IDAgMCAwLTIxLjQzOTM5NyA2LjQ2MzgxOCAzNC4yMzkwMzcgMzQuMjM5MDM3IDAgMCAwLTEwLjQzMTcwNyAxNi40NDc1MzhjLTEuOTgzOTQ0IDYuNTkxODE1LTMuMDA3OTE1IDE0LjA3OTYwNC0zLjAwNzkxNSAyMi4zOTkzN3MwLjYzOTk4MiAxNi4wNjM1NDggMi4wNDc5NDIgMjMuMzU5MzQzYzAuNjM5OTgyIDcuMjk1Nzk1IDEuOTE5OTQ2IDE1LjI5NTU3IDMuOTY3ODg5IDIzLjg3MTMyOEE3My41OTc5MyA3My41OTc5MyAwIDAgMCAzMTkuMzY1NDE4IDg4My4xNzE1NjFhMjYuNTU5MjUzIDI2LjU1OTI1MyAwIDAgMCAxNC4zOTk1OTUgMTEuOTY3NjYzYzYuMDE1ODMxIDEuOTgzOTQ0IDEzLjMxMTYyNiAwLjMxOTk5MSAyMS45NTEzODItNC45OTE4NTkgOS45MTk3MjEtNS45NTE4MzMgMjEuMTgzNDA0LTEyLjQxNTY1MSAzMy43OTEwNS0xOS4zOTE0NTUgMTIuNjA3NjQ1LTYuOTc1ODA0IDI0Ljg5NTMtMTMuOTUxNjA4IDM2Ljg2Mjk2My0yMC45Mjc0MTEgMTEuOTAzNjY1LTYuOTExODA2IDIzLjAzOTM1Mi0xMy4yNDc2MjcgMzMuMjc5MDY0LTE4Ljg3OTQ2OSAxMC4zMDM3MS01LjYzMTg0MiAxOC4xMTE0OTEtMTAuMTExNzE2IDIzLjQyMzM0Mi0xMy40Mzk2MjIgNi42NTU4MTMtNC42NzE4NjkgMTEuNTgzNjc0LTkuNzkxNzI1IDE0LjkxMTU4LTE1LjQyMzU2N3M0LjY3MTg2OS0xMC45NDM2OTIgMy45Njc4ODktMTUuOTM1NTUxLTMuMjYzOTA4LTkuMDg3NzQ0LTcuOTM1Nzc3LTEyLjQxNTY1MWEzMy45MTkwNDYgMzMuOTE5MDQ2IDAgMCAwLTE5LjgzOTQ0Mi00Ljk5MTg2eiBtNzcuNTY1ODE4IDEuMDIzOTcxaDEzMy4zNzIyNDlhMzEuNzQzMTA3IDMxLjc0MzEwNyAwIDAgMSAyMS4zNzUzOTkgNi4zOTk4MiAzNC4yMzkwMzcgMzQuMjM5MDM3IDAgMCAxIDEwLjQzMTcwNyAxNi40NDc1MzhjMi4wNDc5NDIgNi42NTU4MTMgMy4wMDc5MTUgMTQuMDc5NjA0IDMuMDA3OTE1IDIyLjM5OTM3cy0wLjMxOTk5MSAxNi4xMjc1NDYtMC45NTk5NzMgMjMuNDIzMzQxYTEzNjEuODgxNjk3IDEzNjEuODgxNjk3IDAgMCAxLTQuNDc5ODc0IDIzLjM1OTM0M0E2NS4yNzgxNjQgNjUuMjc4MTY0IDAgMCAxIDcwNi41NTQ1MjggODgzLjE3MTU2MWEyNi41NTkyNTMgMjYuNTU5MjUzIDAgMCAxLTE0LjM5OTU5NSAxMS45Njc2NjNjLTYuMDE1ODMxIDEuOTgzOTQ0LTEzLjMxMTYyNiAwLjYzOTk4Mi0yMS44ODczODQtMy45Njc4ODgtOS45ODM3MTktNi4wMTU4MzEtMjEuMjQ3NDAyLTEyLjQ3OTY0OS0zMy45MTkwNDYtMTkuMzkxNDU1cy0yNC45NTkyOTgtMTMuOTUxNjA4LTM3LjI0Njk1My0yMC45Mjc0MTFjLTEyLjI4NzY1NC02Ljk3NTgwNC0yMy41NTEzMzgtMTMuMjQ3NjI3LTMzLjg1NTA0OC0xOC44Nzk0NjktMTAuMjM5NzEyLTUuNjk1ODQtMTcuNzI3NTAxLTEwLjE3NTcxNC0yMi4zOTkzNy0xMy40Mzk2MjItNy4yOTU3OTUtNC42NzE4NjktMTIuNjA3NjQ1LTkuNzkxNzI1LTE1LjkzNTU1MS0xNS40MjM1NjZzLTQuNjA3ODctMTAuOTQzNjkyLTMuOTY3ODg5LTE1Ljk5OTU1IDMuMzI3OTA2LTkuMDg3NzQ0IDcuOTM1Nzc3LTEyLjQxNTY1MSAxMS42NDc2NzItNC45Mjc4NjEgMjAuOTI3NDExLTQuOTI3ODYyek00NjAuMjg5NDU0IDcwMy45NzY2MDFoLTI4OC42MzE4ODJjLTIxLjI0NzQwMiAwLTM1LjAwNzAxNS0zLjQ1NTkwMy00MS4zNDI4MzctMTAuNDMxNzA3LTYuMjcxODI0LTYuOTc1ODA0LTkuNDA3NzM1LTE4LjA0NzQ5Mi05LjQwNzczNi0zMy4yNzkwNjR2LTg3LjY3NzUzNGMwLTE2LjU3NTUzNCAzLjQ1NTkwMy0yOC43OTkxOSAxMC40MzE3MDctMzYuNzk4OTY1IDYuOTc1ODA0LTcuOTM1Nzc3IDIwLjczNTQxNy0xMS45MDM2NjUgNDEuMjc4ODM5LTExLjkwMzY2NWgyODcuNjA3OTExeiBtMTA4LjQxMjk1MSAwaDI4NC42NjM5OTRjMjEuMjQ3NDAyIDAgMzUuNjQ2OTk3LTQuMTU5ODgzIDQzLjI2Mjc4My0xMi40MTU2NTEgNy42Nzk3ODQtOC4zMTk3NjYgMTEuNTE5Njc2LTIwLjA5NTQzNSAxMS41MTk2NzYtMzUuMzI3MDA3di04NS41NjU1OTNjMC0xNS45OTk1NS0zLjUxOTkwMS0yNy43MTEyMjEtMTAuNDk1NzA0LTM1LjM5MTAwNS02Ljk3NTgwNC03LjYxNTc4Ni0yMC43MzU0MTctMTEuMzkxNjgtNDEuMjc4ODQtMTEuMzkxNjc5SDU2OC43MDI0MDV6TTQ2MC4yMjU0NTYgNDcxLjA4NzE1MUgxNTQuNjk4MDQ5di0zNzYuMTgxNDJjMC0zMy43OTEwNSA5LjU5OTczLTYwLjAzMDMxMiAyOC44NjMxODgtNzguNTg5NzkgMTkuMjYzNDU4LTE4LjU1OTQ3OCA0OS4wODY2MTktMjcuOTAzMjE1IDg5LjU5NzQ4LTI3LjkwMzIxNUg0NjAuMTYxNDU4eiBtMTA4LjQ3Njk0OSAwaDMwNC41Njc0MzR2LTM3My4xNzM1MDVjLTAuNjM5OTgyLTMzLjg1NTA0OC0xMC4yMzk3MTItNjAuNTQyMjk3LTI4Ljg2MzE4OC04MC4xMjU3NDYtMTguNTU5NDc4LTE5LjU4MzQ0OS00OC4xMjY2NDYtMjkuMzc1MTc0LTg4LjU3MzUwOS0yOS4zNzUxNzRINTY4LjcwMjQwNXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01NiIgdW5pY29kZT0iJiM1OTAzMTsiIGQ9Ik05MTUuMiA3NjUuMzEyYTI5LjQ0IDI5LjQ0IDAgMCAxLTIxLjg4OCAyMS45NTJBNDkzLjE4NCA0OTMuMTg0IDAgMCAxIDM4NC43MDQgNTk5LjA0YTI5Ljc2IDI5Ljc2IDAgMCAwLTE2Ljk2LTExLjMyOCAzODUuNiAzODUuNiAwIDAgMS0xNzkuOTY4LTEwMi4yNzIgMzk0LjA0OCAzOTQuMDQ4IDAgMCAxLTYwLjQxNi03Ny42OTZjLTE0LjI3Mi0yNC4wNjQgMTAuMTEyLTUyLjQ4IDM2LjM1Mi00Mi43NTJhMzgxLjUwNCAzODEuNTA0IDAgMCAwIDEzMi4xNiAyMi44NDhjLTAuNjQtMy45MDQtMS41MzYtNy44MDgtMi4xMTItMTEuNzEyQTE5ODcuMzI4IDE5ODcuMzI4IDAgMCAxIDM5NC44OCAyNjYuODhhMTk4MS45NTIgMTk4MS45NTIgMCAwIDEgMTA5LjI0OC0xMDEuMTJjMy44NCAwLjUxMiA3LjgwOCAxLjQwOCAxMS43MTIgMi4wNDggMC00Ni4wOC03LjU1Mi05MC43NTItMjIuODQ4LTEzMi4xNi05LjY2NC0yNi4yNCAxOC42ODgtNTAuNjI0IDQyLjc1Mi0zNi4zNTIgMjguMjg4IDE2Ljc2OCA1NC40IDM3LjEyIDc3LjY5NiA2MC40MTZhMzg1LjY2NCAzODUuNjY0IDAgMCAxIDEwMi4yNzIgMTc5Ljk2OCAyOS44MjQgMjkuODI0IDAgMCAwIDExLjI2NCAxNi45NiA0OTMuMjQ4IDQ5My4yNDggMCAwIDEgMTg4LjI4OCA1MDguNjA4eiBtLTIwMC45Ni0zMjAuMTI4YTk5Ljc3NiA5OS43NzYgMCAxIDAtMTQxLjA1NiAxNDEuMTIgOTkuNzc2IDk5Ljc3NiAwIDAgMCAxNDEuMTItMTQxLjEyek0yMjQuNTc2IDIyOC42NzJjLTMwLjI3Mi0zMC4yMDgtMTU4LjQ2NC0yMTcuNi0xMjEuOTg0LTI1NC4wOCAzNi40OC0zNi40OCAyMjMuODcyIDkxLjcxMiAyNTQuMDggMTIxLjkyIDMwLjI3MiAzMC4yNzIgMjUuMjE2IDg0LjM1Mi0xMS4zMjggMTIwLjgzMi0zNi40OCAzNi40OC05MC41NiA0MS42LTEyMC43NjggMTEuMzI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU3IiB1bmljb2RlPSImIzU5MDMyOyIgZD0iTTMwNS4yOCA4MzJDMjI0LjY0IDgzMiAxMjggNzg3LjU4NCAxMjggNjY3Ljk2OFYxMTUuMnMwLTU5LjcxMiA1OS4wNzItNTkuNzEydi01OS43NzZzMC01OS43MTIgNTkuMDcyLTU5LjcxMiA1OS4wNzIgNTkuNzEyIDU5LjA3MiA1OS43MTJ2NTkuNzc2aDQxMy41Njh2LTU5Ljc3NnMwLTU5LjcxMiA1OS4wNzItNTkuNzEyIDU5LjA3MiA1OS43MTIgNTkuMDcyIDU5LjcxMnY1OS43NzZzNTkuMDcyIDAgNTkuMDcyIDU5LjcxMlY2NjcuOTY4Qzg5NiA3OTAuMjA4IDgyMy4wNCA4MzIgNzQyLjQgODMyek0zMjAgNzQyLjRoMzg0YzguMTkyIDAgMTQuNzItNi42NTYgMTQuNzItMTQuOTEyIDAtOC4zMi02LjUyOC0xNC45NzYtMTQuNzItMTQuOTc2SDMyMGExNC44NDggMTQuODQ4IDAgMCAwLTE0LjcyIDE0Ljk3NmMwIDguMjU2IDYuNTI4IDE0LjkxMiAxNC43MiAxNC45MTJ6TTI0Ni4xNDQgNjUyLjhoNTMxLjcxMmM1OS4wNzIgMCA1OS4wNzItNTcuNzI4IDU5LjA3Mi01Ny43Mjh2LTE4MS4xODRzMC01OS43NzYtNTkuMDcyLTU5Ljc3NkgyNDYuMTQ0Yy01OS4wNzIgMC01OS4wNzIgNTkuNzc2LTU5LjA3MiA1OS43NzZ2MTc5LjJzMCA1OS43MTIgNTkuMDcyIDU5LjcxMnogbTAtNDE4LjExMmMzMi42NCAwIDU5LjA3Mi0yNi43NTIgNTkuMDcyLTU5Ljc3NnMtMjYuNDMyLTU5LjcxMi01OS4wNzItNTkuNzEyLTU5LjA3MiAyNi43NTItNTkuMDcyIDU5LjcxMiAyNi40MzIgNTkuNzc2IDU5LjA3MiA1OS43NzZ6IG01MzEuNzEyIDBjMzIuNjQgMCA1OS4wNzItMjYuNzUyIDU5LjA3Mi01OS43NzZzLTI2LjQzMi01OS43MTItNTkuMDcyLTU5LjcxMi01OS4wNzIgMjYuNzUyLTU5LjA3MiA1OS43MTIgMjYuNDMyIDU5Ljc3NiA1OS4wNzIgNTkuNzc2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU4IiB1bmljb2RlPSImIzU5MDMzOyIgZD0iTTk2MCA0MTguODhhMTA0LjQ0OCAxMDQuNDQ4IDAgMCAxLTc5LjIzMiAxMDEuMjQ4bC05NS44MDggMjI2LjI0QTM0LjQzMiAzNC40MzIgMCAwIDEgNzUzLjIxNiA3NjhIMjcwLjc4NGEzNC40MzIgMzQuNDMyIDAgMCAxLTMwLjMzNi0xOS41MkwxNDMuMjMyIDUyMC44MzJBMTA0LjQ0OCAxMDQuNDQ4IDAgMCAxIDY0IDQxOC44OHYtMjQ0LjM1Mmg2OC45Mjh2LTY5Ljc2YzAtMzguNTkyIDMwLjg0OC02OS44ODggNjguOTI4LTY5Ljg4OHM2OC45MjggMzEuMjk2IDY4LjkyOCA2OS44MjR2NjkuODI0aDQ4Mi40MzJ2LTY5Ljc2YzAtMzguNTkyIDMwLjg0OC02OS44ODggNjguOTI4LTY5Ljg4OHM2OC45MjggMzEuMjk2IDY4LjkyOCA2OS44MjR2NjkuODI0SDk2MHpNMjkxLjQ1NiA2OTguMjRoNDQxLjA4OGw3Mi4zMi0xNzQuNTI4SDIxOS4xMzZ6IG0tODkuNi00MTguODhhNjkuMzc2IDY5LjM3NiAwIDAgMC02OC45MjggNjkuNzZjMCAzOC41OTIgMzAuODQ4IDY5LjgyNCA2OC45MjggNjkuODI0czY4LjkyOC0zMS4yMzIgNjguOTI4LTY5Ljc2YzAtMzguNTkyLTMwLjg0OC02OS44MjQtNjguOTI4LTY5LjgyNHogbTYyMC4yODggMGE2OS4zNzYgNjkuMzc2IDAgMCAwLTY4LjkyOCA2OS43NmMwIDM4LjU5MiAzMC44NDggNjkuODI0IDY4LjkyOCA2OS44MjRzNjguOTI4LTMxLjIzMiA2OC45MjgtNjkuNzZjMC0zOC41OTItMzAuODQ4LTY5LjgyNC02OC45MjgtNjkuODI0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU5IiB1bmljb2RlPSImIzU5MDM0OyIgZD0iTTI1NiA4MzJhNjQgNjQgMCAwIDEtNjQtNjR2LTUxMmE2NCA2NCAwIDAgMSA2NC02NGg1NzZhNjQgNjQgMCAwIDEgNjQgNjRWNzY4YTY0IDY0IDAgMCAxLTY0IDY0eiBtMTc2LTMyaDIyNC42NGExNiAxNiAwIDEgMCAwLTMySDQzMmExNiAxNiAwIDEgMCAwIDMyek0yODggNzA0SDUxMnYtMjU2SDI4OGEzMiAzMiAwIDAgMC0zMiAzMnYxOTJhMzIgMzIgMCAwIDAgMzIgMzJ6TTU3NiA3MDRoMjI0YTMyIDMyIDAgMCAwIDMyLTMydi0xOTJhMzIgMzIgMCAwIDAtMzItMzJINTc2ek0zODQgMzg0YTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMCAwIDAgMTI4eiBtMzIwIDBhNjQgNjQgMCAxIDAgMC0xMjggNjQgNjQgMCAwIDAgMCAxMjh6IG0yOC40OC0yNTUuNjE2YTMyLjI1NiAzMi4yNTYgMCAwIDEtMjcuMi00My4yNjRsMTAuODgtMjEuMTJIMzcxLjg0bDguMzIgMTcuMjhhMzIgMzIgMCAwIDEtNTguMjQgMjYuMjRsLTY0LTEyOGEzMS4xNjggMzEuMTY4IDAgMCAxLTEuOTItMTEuNTIgMzIgMzIgMCAwIDEgMzItMzIgMzEuMzYgMzEuMzYgMCAwIDEgMjcuNTIgMTYuNjR2My4ySDMyMGwxOS44NCA0NC4xNmg0MDguMzJsMTkuODQtNDQuMTZ2LTMuMmEzMS4zNiAzMS4zNiAwIDAgMSAyNy41Mi0xNi42NCAzMiAzMiAwIDAgMSAzMiAzMiAzMS4zNiAzMS4zNiAwIDAgMSAwIDE1LjM2bC02NCAxMjhhMzIgMzIgMCAwIDEtMzEuMDQgMTcuMDI0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Ik92YWwiIHVuaWNvZGU9IiYjNTkwMzU7IiBkPSJNNTEyIDM4NG0tMzIwIDBhMzIwIDMyMCAwIDEgMSA2NDAgMCAzMjAgMzIwIDAgMSAxLTY0MCAwWiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlJlY3RhbmdsZSIgdW5pY29kZT0iJiM1OTAzNjsiIGQ9Ik0xOTIgNzA0aDY0MHYtNjQwSDE5MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTdGFyIiB1bmljb2RlPSImIzU5MDM3OyIgZD0iTTUxMiAxNjBsLTI2My4yOTYtMTM4LjQzMiA1MC4yNCAyOTMuMTg0LTIxMi45OTIgMjA3LjY4IDI5NC40IDQyLjgxNkw1MTIgODMybDEzMS42NDgtMjY2Ljc1MiAyOTQuNC00Mi44MTYtMjEyLjk5Mi0yMDcuNjggNTAuMjQtMjkzLjE4NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJUcmlhbmdsZSIgdW5pY29kZT0iJiM1OTAzODsiIGQ9Ik01MTIgNzA0bDM4NC02NDBIMTI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJlc3RvcmVkZWZhdWx0IiB1bmljb2RlPSImIzU5MDQwOyIgZD0iTTg4MC44Njc1NTYgMzI1LjQwNDQ0NGEzNzIuNTA4NDQ0IDM3Mi41MDg0NDQgMCAwIDAtMTk4LjcxMjg4OS0xOTYuNzc4NjY2Yy00Ni4wOC0xOS4zNDIyMjItOTQuNzItMjkuMDcwMjIyLTE0NS40NjQ4ODktMjkuMDcwMjIydjcxLjczNjg4OGMxNjUuNzE3MzMzIDAgMzAwLjk0MjIyMiAxMzMuNjg4ODg5IDMwMC45NDIyMjIgMjk4LjA0MDg4OXMtMTM0LjgyNjY2NyAyOTguMDQwODg5LTMwMC43MTQ2NjcgMjk4LjA0MDg4OWMtMTY1Ljg4OCAwLTMwMC44ODUzMzMtMTMzLjY4ODg4OS0zMDAuODg1MzMzLTI5OC4wNDA4ODkgMC0zMS40MDI2NjcgNC44MzU1NTYtNjIuMDA4ODg5IDE0LjM5Mjg4OS05MS4yNDk3NzdsNjguMjY2NjY3IDM3LjQzMjg4OC0yLjEwNDg4OS0xMTUuOTk2NDQ0LTIuMTA0ODg5LTExNS45OTY0NDQtMTAwLjM1MiA1OS43OTAyMjJMMTEzLjc3Nzc3OCAzMDMuMjE3Nzc4bDcyLjI0ODg4OSAzOS41OTQ2NjZBMzY0LjIwMjY2NyAzNjQuMjAyNjY3IDAgMCAwIDE2My42NjkzMzMgNDY5LjMzMzMzM2MwIDQ5Ljg5MTU1NiA5Ljg5ODY2NyA5OC4zNjA4ODkgMjkuMzU0NjY3IDE0My45Mjg4ODlBMzcyLjIyNCAzNzIuMjI0IDAgMCAwIDM5MS42MjMxMTEgODEwLjA5Nzc3OCAzNzQuMTAxMzMzIDM3NC4xMDEzMzMgMCAwIDAgNTM2LjkxNzMzMyA4MzkuMTExMTExYTM3NC4wNDQ0NDQgMzc0LjA0NDQ0NCAwIDAgMCAyNjMuOTY0NDQ1LTEwOC4zMTY0NDQgMzY4LjI5ODY2NyAzNjguMjk4NjY3IDAgMCAwIDc5Ljk4NTc3OC0xMTcuNTMyNDQ1YzE5LjUxMjg4OS00NS41NjggMjkuMzU0NjY3LTk0LjAzNzMzMyAyOS4zNTQ2NjYtMTQzLjkyODg4OXMtOS44OTg2NjctOTguMzYwODg5LTI5LjM1NDY2Ni0xNDMuOTI4ODg5ek05Ni43MTExMTEtMjUuNmg4MzAuNTc3Nzc4YTM5LjgyMjIyMiAzOS44MjIyMjIgMCAwIDAgMzkuODIyMjIyLTM5LjgyMjIyMnYtNS42ODg4ODlhMzkuODIyMjIyIDM5LjgyMjIyMiAwIDAgMC0zOS44MjIyMjItMzkuODIyMjIySDk2LjcxMTExMUEzOS44MjIyMjIgMzkuODIyMjIyIDAgMCAwIDU2Ljg4ODg4OS03MS4xMTExMTF2NS42ODg4ODlhMzkuODIyMjIyIDM5LjgyMjIyMiAwIDAgMCAzOS44MjIyMjIgMzkuODIyMjIyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InVwbG9hZGluZyIgdW5pY29kZT0iJiM1OTA0MTsiIGQ9Ik03ODQgMTE1LjJhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00OCA0OC44OTZjMCAyNi45NDQgMjEuNTA0IDQ4LjgzMiA0OCA0OC44MzIgNzkuNTUyIDAgMTQ0IDY1LjY2NCAxNDQgMTQ2LjYyNGExNDcuMjY0IDE0Ny4yNjQgMCAwIDEtNTguMTc2IDExNy41MDRsLTAuNjQgMC41MTJhMTQ4LjY3MiAxNDguNjcyIDAgMCAxLTkuNiA2LjU5MmwtMS40NzIgMC45NmExNDYuODE2IDE0Ni44MTYgMCAwIDEtOS40NzIgNS4zMTJsLTIuNjg4IDEuMjhhMTUwLjcyIDE1MC43MiAwIDAgMS04Ljk2IDQuMDk2bC00LjAzMiAxLjQ3MmExNDcuMDA4IDE0Ny4wMDggMCAwIDEtOC4zMiAyLjg4Yy0xLjg1NiAwLjU3Ni0zLjcxMiAwLjk2LTUuNjMyIDEuNDcyLTIuNDMyIDAuNjQtNC44NjQgMS4yOC03LjI5NiAxLjc5Mi0yLjU2IDAuNTEyLTUuMjQ4IDAuODMyLTcuOTM2IDEuMjE2LTEuOTIgMC4yNTYtMy43NzYgMC42NC01LjY5NiAwLjgzMmExNDQuNTEyIDE0NC41MTIgMCAwIDEtMTQuMDggMC43MDRjLTEuNDcyIDAtMi45NDQtMC4xOTItNC40OC0wLjE5MmEyNzEuOTM2IDI3MS45MzYgMCAwIDEtNS40NCAyNC41NzZjLTAuNTEyIDEuOTg0LTEuMjggMy44NC0xLjg1NiA1LjgyNGEyNzQuMDQ4IDI3NC4wNDggMCAwIDEtNS43NiAxOC4xMTJjLTAuNjQgMS43OTItMS41MzYgMy41Mi0yLjE3NiA1LjMxMmEyOTQuNTI4IDI5NC41MjggMCAwIDEtNy42MTYgMTcuNzkyYy0wLjY0IDEuNDA4LTEuNDA4IDIuNzUyLTIuMTEyIDQuMDk2YTI4NC4yMjQgMjg0LjIyNCAwIDAgMS05LjYgMTcuOTJDNjk3LjUzNiA2ODAuMjU2IDYxMS4xMzYgNzM0LjI3MiA1MTIgNzM0LjI3MnMtMTg1LjQ3Mi01NC4wOC0yMzIuOTYtMTM0LjY1NmMtMy40NTYtNS44MjQtNi41OTItMTEuODQtOS42LTE3LjkyLTAuNjQtMS4zNDQtMS40NzItMi42ODgtMi4xMTItNC4wOTYtMi43NTItNS43Ni01LjI0OC0xMS43NzYtNy42MTYtMTcuNzkyLTAuNjQtMS43OTItMS40NzItMy41Mi0yLjExMi01LjMxMmEyNzQuMDQ4IDI3NC4wNDggMCAwIDEtNS44MjQtMTguMTEybC0xLjg1Ni01Ljc2YTI3MS40MjQgMjcxLjQyNCAwIDAgMS01LjQ0LTI0LjY0Yy0xLjUzNiAwLTMuMDA4IDAuMTkyLTQuNDggMC4xOTItNC44IDAtOS40NzItMC4yNTYtMTQuMDgtMC43MDQtMS45Mi0wLjE5Mi0zLjg0LTAuNTc2LTUuNzYtMC44MzItMi41Ni0wLjM4NC01LjI0OC0wLjcwNC03Ljg3Mi0xLjI4LTIuNDk2LTAuNDQ4LTQuODY0LTEuMDg4LTcuMjk2LTEuNzI4LTEuOTItMC41MTItMy44NC0wLjg5Ni01LjY5Ni0xLjQ3MmExNDcuMzkyIDE0Ny4zOTIgMCAwIDEtOC4zMi0yLjg4bC0zLjk2OC0xLjQ3MmMtMy4wNzItMS4yOC02LjA4LTIuNTYtOC45Ni00LjAzMmwtMi42ODgtMS4yOGMtMy4yLTEuNjY0LTYuNC0zLjQ1Ni05LjQwOC01LjM3NmwtMS41MzYtMC45NmExNTIuMDY0IDE1Mi4wNjQgMCAwIDEtOS42LTYuNTkybC0wLjY0LTAuNTEyQTE0Ny4zMjggMTQ3LjMyOCAwIDAgMSA5NiAzNTkuNTUyYzAtODAuOTYgNjQuNDQ4LTE0Ni41NiAxNDQtMTQ2LjU2IDI2LjQ5NiAwIDQ4LTIxLjk1MiA0OC00OC44OTZhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00OC00OC44OTZDMTA3LjQ1NiAxMTUuMiAwIDIyNC42NCAwIDM1OS41NTJjMCAxMTAuMDggNzEuNTUyIDIwMy4xMzYgMTY5Ljg1NiAyMzMuNzI4QzIyMy4yMzIgNzMyLjggMzU1Ljk2OCA4MzIgNTEyIDgzMnMyODguNzY4LTk5LjIgMzQyLjIwOC0yMzguNzJDOTUyLjQ0OCA1NjIuNjg4IDEwMjQgNDY5LjYzMiAxMDI0IDM1OS41NTJjMC0xMzQuOTEyLTEwNy40NTYtMjQ0LjM1Mi0yNDAtMjQ0LjM1MnogbS00NTEuNjQ4IDExNC4xNzZ2MC4wNjRjMC4xMjggMCAwLjEyOCAwLjA2NCAwLjEyOCAwLjEyOEw0NzYuMzUyIDM5Mi4zMmwwLjEyOC0wLjEyOEE0Ny4zNiA0Ny4zNiAwIDAgMCA1MTIgNDA4LjQ0OGMxNC4xNDQgMCAyNi43NTItNi40IDM1LjU4NC0xNi4zMmwwLjA2NCAwLjEyOCAxNDMuODcyLTE2Mi42ODh2LTAuMDY0bDAuMTI4LTAuMTI4YzYuNzItNy42MTYgMTEuMTM2LTE3LjI4IDEyLjE2LTI4LjAzMnYtMC4xMjhhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00Ny44MDgtNTMuNDRoLTEuNTM2bC0wLjk2IDAuMDY0LTEuMDI0IDAuMDY0LTEuNiAwLjE5MmgtMC41MTJsLTIuMTEyIDAuMzJhNDcuNjE2IDQ3LjYxNiAwIDAgMC0yNy45MDQgMTUuNTUybC02MC4zNTIgNjguMjI0di0yNDcuMjk2QTQ4LjQ0OCA0OC40NDggMCAwIDAgNTEyLTY0YTQ4LjQ0OCA0OC40NDggMCAwIDAtNDggNDguODk2djI0Ny4yOTZsLTYwLjM1Mi02OC4yMjRhNDcuNDI0IDQ3LjQyNCAwIDAgMC0yNy44NC0xNS40ODhjLTAuNzA0LTAuMTkyLTEuNDA4LTAuMjU2LTIuMTEyLTAuMzJhMTAuNjI0IDEwLjYyNCAwIDAgMC0wLjY0LTAuMDY0bC0xLjUzNi0wLjE5MkgzNzAuNTZsLTAuODk2LTAuMDY0SDM2OGE0Ny44NzIgNDcuODcyIDAgMCAwLTQyLjI0IDI1LjUzNiA0OS4yOCA0OS4yOCAwIDAgMCA2LjU5MiA1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJlcnJvciIgdW5pY29kZT0iJiM1OTAzOTsiIGQ9Ik01MTItMTI4QTUxMiA1MTIgMCAxIDAgNTEyIDg5NmE1MTIgNTEyIDAgMCAwIDAtMTAyNHogbTAgMjI3LjU4NEE1Ni45MTczMzMgNTYuOTE3MzMzIDAgMSAxIDUxMiAyMTMuMzMzMzMzYTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEgMC0xMTMuNzQ5MzMzeiBtMCA1NjguODMyYTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEtNTYuOTE3MzMzLTU2LjgzMnYtMjg0LjUwMTMzM2E1Ni45MTczMzMgNTYuOTE3MzMzIDAgMCAxIDExMy44MzQ2NjYgMFY2MTEuNTg0QTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEgNTEyIDY2OC40MTZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iem9vbWluIiB1bmljb2RlPSImIzU5MDQyOyIgZD0iTTU4NS4xNDI4NTcgNDU3LjE0Mjg1N2gzNjUuNzE0Mjg2di0xNDYuMjg1NzE0SDU4NS4xNDI4NTd2LTM2NS43MTQyODZINDM4Ljg1NzE0M1YzMTAuODU3MTQzSDczLjE0Mjg1N1Y0NTcuMTQyODU3aDM2NS43MTQyODZWODIyLjg1NzE0M2gxNDYuMjg1NzE0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Inpvb21vdXQiIHVuaWNvZGU9IiYjNTkwNDM7IiBkPSJNNzMuMTQyODU3IDQ1Ny4xNDI4NTdoODc3LjcxNDI4NnYtMTQ2LjI4NTcxNEg3My4xNDI4NTd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZmlyc3QiIHVuaWNvZGU9IiYjNTkwNDQ7IiBkPSJNMjg0LjQ0NDQ0NCA2MTEuNTU1NTU2aDU2Ljg4ODg4OXYtNTEySDI4NC40NDQ0NDR6IG00MjYuNDk2LTUxMS4zMTczMzRhMjkuNDExNTU2IDI5LjQxMTU1NiAwIDAgMC0xOC4yMDQ0NDQgNi40Mjg0NDVMNDEwLjYyNCAzMzMuNDgyNjY3YTI5LjEyNzExMSAyOS4xMjcxMTEgMCAwIDAgMCA0NS4zNDA0NDRsMjgwLjgwMzU1NiAyMjUuNjc4MjIyYTI5LjA3MDIyMiAyOS4wNzAyMjIgMCAwIDAgMzYuNDA4ODg4LTQ1LjM0MDQ0NGwtMjUyLjU4NjY2Ni0yMDIuOTc5NTU2IDI1My44MzgyMjItMjA0LjIzMTExMWEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NC01MS43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibmV4dCIgdW5pY29kZT0iJiM1OTA0NTsiIGQ9Ik0zNzAuNDAzNTU2IDEwMC45MjA4ODg5OTk5OTk5OWEyOS40MTE1NTYgMjkuNDExNTU2IDAgMCAxIDE4LjIwNDQ0NCA2LjQyODQ0NGwyODIuMDU1MTExIDIyNi44MTZhMjkuMTI3MTExIDI5LjEyNzExMSAwIDAgMSAwIDQ1LjM0MDQ0NUwzODkuODU5NTU2IDYwNS4xMjcxMTFhMjkuMDcwMjIyIDI5LjA3MDIyMiAwIDAgMS0zNi40MDg4ODktNDUuMjgzNTU1bDI1Mi41ODY2NjYtMjAyLjk3OTU1Ni0yNTMuODM4MjIyLTIwNC4yMzExMTFhMjkuMDcwMjIyIDI5LjA3MDIyMiAwIDAgMSAxOC4yMDQ0NDUtNTEuNzEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Imxhc3QiIHVuaWNvZGU9IiYjNTkwNDY7IiBkPSJNNzA5LjUxODIyMiA2MTEuNTU1NTU2YTI4LjQ0NDQ0NCAyOC40NDQ0NDQgMCAwIDAgMjguNDQ0NDQ1LTI4LjQ0NDQ0NXYtNDU1LjExMTExMWEyOC40NDQ0NDQgMjguNDQ0NDQ0IDAgMSAwLTU2Ljg4ODg4OSAwdjQ1NS4xMTExMTFhMjguNDQ0NDQ0IDI4LjQ0NDQ0NCAwIDAgMCAyOC40NDQ0NDQgMjguNDQ0NDQ1eiBtLTM5NS45NDY2NjYtNTExLjMxNzMzNGEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NSA1MS43MTJsMjUzLjgzODIyMiAyMDQuMjMxMTExLTI1Mi41ODY2NjYgMjAyLjk3OTU1NmEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwIDM2LjM1MiA0NS4zNDA0NDRsMjgwLjgwMzU1NS0yMjUuNjc4MjIyYTI5LjAxMzMzMyAyOS4wMTMzMzMgMCAwIDAgMC00NS4zNDA0NDRsLTI4MS45OTgyMjItMjI2LjgxNmEyOS40MTE1NTYgMjkuNDExNTU2IDAgMCAwLTE4LjIwNDQ0NC02LjQyODQ0NXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwcmV2IiB1bmljb2RlPSImIzU5MDQ3OyIgZD0iTTY1Mi40NTg2NjcgMTAwLjkyMDg4ODk5OTk5OTk5YTI5LjQxMTU1NiAyOS40MTE1NTYgMCAwIDAtMTguMjA0NDQ1IDYuNDI4NDQ0TDM1Mi4xNDIyMjIgMzM0LjE2NTMzMzAwMDAwMDAzYTI5LjEyNzExMSAyOS4xMjcxMTEgMCAwIDAgMCA0NS4zNDA0NDVsMjgwLjgwMzU1NiAyMjUuNjIxMzMzYTI5LjA3MDIyMiAyOS4wNzAyMjIgMCAwIDAgMzYuNDA4ODg5LTQ1LjI4MzU1NWwtMjUyLjU4NjY2Ny0yMDIuOTc5NTU2IDI1My44MzgyMjItMjA0LjIzMTExMWEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NC01MS43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icG9pLWxvYWQiIHVuaWNvZGU9IiYjNTkwNDg7IiBkPSJNMjEyLjMzMzcxNCA1NjYuODU3MTQzaDQzOC4zNDUxNDNjMjEuOTQyODU3IDAgMzYuNTcxNDI5IDE0LjYyODU3MSAzNi41NzE0MjkgMzYuNTcxNDI4cy0xNC42Mjg1NzEgMzYuNTcxNDI5LTM2LjU3MTQyOSAzNi41NzE0MjlIMjEyLjMzMzcxNGMtMjEuOTQyODU3IDAtMzYuNTcxNDI5LTE0LjYyODU3MS0zNi41NzE0MjgtMzYuNTcxNDI5czE0LjYyODU3MS0zNi41NzE0MjkgMzYuNTcxNDI4LTM2LjU3MTQyOHpNNjg3LjI1MDI4NiAzODRjMCAyMS45NDI4NTctMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjkgMzYuNTcxNDI5SDIxMi4zMzM3MTRjLTIxLjk0Mjg1NyAwLTM2LjU3MTQyOS0xNC42Mjg1NzEtMzYuNTcxNDI4LTM2LjU3MTQyOXMxNC42Mjg1NzEtMzYuNTcxNDI5IDM2LjU3MTQyOC0zNi41NzE0MjloNDM4LjM0NTE0M2MyMS45NDI4NTcgMCAzNi41NzE0MjkgMTQuNjI4NTcxIDM2LjU3MTQyOSAzNi41NzE0Mjl6TTIxMi4zMzM3MTQgMjAxLjE0Mjg1N2MtMjEuOTQyODU3IDAtMzYuNTcxNDI5LTE0LjYyODU3MS0zNi41NzE0MjgtMzYuNTcxNDI4czE0LjYyODU3MS0zNi41NzE0MjkgMzYuNTcxNDI4LTM2LjU3MTQyOWgyNTUuNzA3NDI5YzIxLjk0Mjg1NyAwIDM2LjU3MTQyOSAxNC42Mjg1NzEgMzYuNTcxNDI4IDM2LjU3MTQyOXMtMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjggMzYuNTcxNDI4ek0xMDA4LjY0IDE1Ny4yNTcxNDNjLTE0LjU1NTQyOSAxNC42Mjg1NzEtMzYuNDk4Mjg2IDE0LjYyODU3MS01MS4wNTM3MTQgMGwtODAuNDU3MTQzLTgwLjQ1NzE0M1Y3NDkuNzE0Mjg2YzAgODAuNDU3MTQzLTY1LjY4MjI4NiAxNDYuMjg1NzE0LTE0Ni4wNjYyODYgMTQ2LjI4NTcxNEgxNDYuNTc4Mjg2QzY2LjE5NDI4NiA4OTYgMC40Mzg4NTcgODMwLjE3MTQyOSAwLjQzODg1NyA3NDkuNzE0Mjg2di03MzEuNDI4NTcyYzAtODAuNDU3MTQzIDY1LjgyODU3MS0xNDYuMjg1NzE0IDE0Ni4xMzk0MjktMTQ2LjI4NTcxNGg1MDQuMTAwNTcxYzIxLjk0Mjg1NyAwIDM2LjU3MTQyOSAxNC42Mjg1NzEgMzYuNTcxNDI5IDM2LjU3MTQyOXMtMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjkgMzYuNTcxNDI4SDE0Ni41NzgyODZjLTQzLjg4NTcxNCAwLTczLjA2OTcxNCAzNi41NzE0MjktNzMuMDY5NzE1IDczLjE0Mjg1N1Y3NDkuNzE0Mjg2YzAgNDMuODg1NzE0IDM2LjU3MTQyOSA3My4xNDI4NTcgNzMuMDY5NzE1IDczLjE0Mjg1N2g1ODQuNDg0NTcxYzQzLjg4NTcxNCAwIDczLjA2OTcxNC0yOS4yNTcxNDMgNzMuMDY5NzE0LTczLjE0Mjg1N3YtNjgwLjIyODU3MmwtODAuMzg0IDgwLjQ1NzE0M2MtMTQuNjI4NTcxIDE0LjYyODU3MS0zNi41NzE0MjkgMTQuNjI4NTcxLTUxLjEyNjg1NyAwLTE0LjYyODU3MS0xNC42Mjg1NzEtMTQuNjI4NTcxLTM2LjU3MTQyOSAwLTUxLjJsMTQ2LjEzOTQyOS0xNDYuMjg1NzE0czcuMzE0Mjg2LTcuMzE0Mjg2IDE0LjYyODU3MS03LjMxNDI4NmgyOS4yNTcxNDNjNy4yNDExNDMgMCA3LjI0MTE0MyA3LjMxNDI4NiAxNC41NTU0MjkgNy4zMTQyODZsMTQ2LjEzOTQyOCAxNDYuMjg1NzE0Yy03LjMxNDI4NiAxNC42Mjg1NzEtNy4zMTQyODYgNDMuODg1NzE0LTE0LjYyODU3MSA1OC41MTQyODZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icG9pLXNhdmUiIHVuaWNvZGU9IiYjNTkwNDk7IiBkPSJNODY3LjY5MzcxNCA4MjIuMjcySDIyOS40NDkxNDNjLTg2LjAxNiAwLTE1NS43OTQyODYtNjkuNzA1MTQzLTE1NS43OTQyODYtMTU1Ljc5NDI4NnYtNjM4LjY4MzQyOGMwLTg2LjA4OTE0MyA2OS43NzgyODYtMTU1Ljc5NDI4NiAxNTUuNzk0Mjg2LTE1NS43OTQyODZoNjM4LjI0NDU3MWM4Ni4wMTYgMCAxNTUuNzk0Mjg2IDY5LjcwNTE0MyAxNTUuNzk0Mjg2IDE1NS43OTQyODZWNjY2LjU1MDg1N2MwIDg2LjAxNi02OS43NzgyODYgMTU1Ljc5NDI4Ni0xNTUuNzk0Mjg2IDE1NS43OTQyODZ6IG0tNTg0Ljg1MDI4NS02OC4wMjI4NTdoNTMxLjQ1NnYtMjM3LjQ5NDg1N2MwLTMyLjEwOTcxNC0zMy4yMDY4NTctNTguMjIxNzE0LTc0LjAyMDU3Mi01OC4yMjE3MTVIMzU2Ljg2NGMtNDAuODEzNzE0IDAtNzQuMDIwNTcxIDI2LjExMi03NC4wMjA1NzEgNTguMjIxNzE1eiBtNjcyLjU0ODU3MS03MjUuOTQyODU3YzAtNDguNDkzNzE0LTM5LjIwNDU3MS04Ny42OTgyODYtODcuNzcxNDI5LTg3LjY5ODI4NkgyMjkuNTIyMjg2YTg3LjYyNTE0MyA4Ny42MjUxNDMgMCAwIDAtODcuNjk4Mjg2IDg3Ljc3MTQyOVY2NjYuNDc3NzE0YzAgNDMuNTIgMzEuNTk3NzE0IDc5LjUwNjI4NiA3Mi45OTY1NzEgODYuMDE2di0yMzYuMzI0NTcxYzAtNjkuNzA1MTQzIDYzLjcwNzQyOS0xMjYuMzE3NzE0IDE0Mi4xMTY1NzItMTI2LjMxNzcxNGgzODMuNDE0ODU3Yzc4LjQwOTE0MyAwIDE0Mi4xMTY1NzEgNTYuNjEyNTcxIDE0Mi4xMTY1NzEgMTI2LjMxNzcxNFY3NTMuMTUyYzQxLjM5ODg1Ny03LjA5NDg1NyA3Mi45OTY1NzEtNDMuMDgxMTQzIDcyLjk5NjU3Mi04Ni4wODkxNDN6TTcwNS45NzQ4NTcgNTA5LjczMjU3MWEzMy42NDU3MTQgMzMuNjQ1NzE0IDAgMCAxIDMzLjcxODg1NyAzMy43MTg4NThWNjYwLjU1MzE0M2EzMy42NDU3MTQgMzMuNjQ1NzE0IDAgMCAxLTMzLjcxODg1NyAzMy43OTIgMzQuMDg0NTcxIDM0LjA4NDU3MSAwIDAgMS0zNC4zNzcxNDMtMzMuNzkydi0xMTcuMDI4NTcyYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMzQuMzc3MTQzLTMzLjc5MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJmb2xkIiB1bmljb2RlPSImIzU5MDUwOyIgZD0iTTUxMi0xMjhBNTEyIDUxMiAwIDEgMSA1MTIgODk2YTUxMiA1MTIgMCAwIDEgMC0xMDI0ek0yNzMuNTc4NjY3IDQyNC4yNzczMzNsMTk1LjQxMzMzMyAxNTguMjkzMzM0QTY3LjkyNTMzMyA2Ny45MjUzMzMgMCAwIDAgNTEyIDU5Ni45MDY2NjdjMTUuNTMwNjY3IDAgMzEuMTQ2NjY3LTQuNjkzMzMzIDQzLjAwOC0xNC4zMzZsMTk1LjQxMzMzMy0xNTguMjkzMzM0YzIzLjQ2NjY2Ny0xOS4xMTQ2NjcgMjMuNDY2NjY3LTUwLjAwNTMzMyAwLTY5LjEyYTcwLjU3MDY2NyA3MC41NzA2NjcgMCAwIDAtODUuMzMzMzMzIDBMNTEyIDQ3OS4yMzIgMzU4LjkxMiAzNTUuMTU3MzMzYTcwLjY1NiA3MC42NTYgMCAwIDAtODUuMzMzMzMzIDBjLTIzLjQ2NjY2NyAxOS4xMTQ2NjctMjMuNDY2NjY3IDUwLjAwNTMzMyAwIDY5LjEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxhYmVsLWRlbGV0ZSIgdW5pY29kZT0iJiM1OTA1MTsiIGQ9Ik04NzQuMDY5MzMzIDgxNy4xNTJINjg5LjE1MmMwIDM1LjY2OTMzMy0yNy4wNTA2NjcgNzguNjc3MzMzLTYwLjU4NjY2NyA3OC42NzczMzNINDE2LjkzODY2N2MtMzMuNDUwNjY3IDAtNjAuNTg2NjY3LTQzLjAwOC02MC41ODY2NjctNzguNjc3MzMzSDE3MS41MmMtNDAuODc0NjY3IDAtODUuODQ1MzMzLTYuMjI5MzMzLTg1Ljg0NTMzMy00OC4wNDI2Njd2LTY0Ljc2OEg5MzguNjY2NjY3djY0Ljc2OGMwIDQxLjgxMzMzMy0yMy42MzczMzMgNDguMDQyNjY3LTY0LjUxMiA0OC4wNDI2Njd6TTE2MS4wMjQgNjI4LjY1MDY2N3YtNjE2LjM2MjY2N2MwLTYyLjYzNDY2NyA2MC4wNzQ2NjctMTM5LjA5MzMzMyAxMjEuMzQ0LTEzOS4wOTMzMzNoNDgwLjc2OGM2MS4yNjkzMzMgMCAxMDEuNDYxMzMzIDc2LjQ1ODY2NyAxMDEuNDYxMzMzIDEzOS4wOTMzMzNWNjI4LjY1MDY2N3ogbTIwMi4wNjkzMzMtNjI5LjI0OGgtNzQuMDY5MzMzVjU0NC44NTMzMzNoNzQuMDY5MzMzeiBtMTg1LjM0NCAwSDQ3NC40NTMzMzNWNTQ0Ljg1MzMzM2g3My45ODR6IG0xODUuNDI5MzM0IDBoLTc0LjA2OTMzNFY1NDQuODUzMzMzSDczMy44NjY2Njd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idXBsb2FkIiB1bmljb2RlPSImIzU5MDUyOyIgZD0iTTk1Mi4wMjc0MjkgNzYuOGMtMzIuMTgyODU3IDAtNTguMjk0ODU3IDI1LjAxNDg1Ny01OC4yOTQ4NTggNTUuODgxMTQzIDAgMzAuNzkzMTQzIDI2LjExMiA1NS44MDggNTguMjk0ODU4IDU1LjgwOCA5Ni41NDg1NzEgMCAxNzQuODExNDI5IDc1LjA0NDU3MSAxNzQuODExNDI4IDE2Ny41NzAyODZhMTY0LjEzMjU3MSAxNjQuMTMyNTcxIDAgMCAxLTcwLjU4Mjg1NyAxMzQuMjkwMjg1bC0wLjczMTQyOSAwLjU4NTE0M2ExODEuMzk0Mjg2IDE4MS4zOTQyODYgMCAwIDEtMTEuNzAyODU3IDcuNTMzNzE0bC0xLjkwMTcxNCAxLjA5NzE0M2ExODEuNjEzNzE0IDE4MS42MTM3MTQgMCAwIDEtMTEuNDEwMjg2IDYuMDcwODU3bC0zLjIxODI4NSAxLjQ2Mjg1OGExODguODU0ODU3IDE4OC44NTQ4NTcgMCAwIDEtMTAuOTcxNDI5IDQuNjgxMTQybC00LjgyNzQyOSAxLjY4MjI4NmExODYuMjIxNzE0IDE4Ni4yMjE3MTQgMCAwIDEtMTAuMDkzNzE0IDMuMjkxNDI5Yy0yLjI2NzQyOSAwLjY1ODI4Ni00LjYwOCAxLjA5NzE0My02Ljg3NTQyOCAxLjY4MjI4NS0yLjkyNTcxNCAwLjczMTQyOS01Ljg1MTQyOSAxLjQ2Mjg1Ny04Ljg1MDI4NiAyLjA0OC0zLjIxODI4NiAwLjU4NTE0My02LjQzNjU3MSAwLjk1MDg1Ny05LjY1NDg1NyAxLjM4OTcxNS0yLjI2NzQyOSAwLjI5MjU3MS00LjUzNDg1NyAwLjczMTQyOS02Ljg3NTQyOSAwLjk1MDg1N2ExODYuMzY4IDE4Ni4zNjggMCAwIDEtMTcuMTE1NDI4IDAuODA0NTcxYy0xLjgyODU3MSAwLTMuNjU3MTQzLTAuMjE5NDI5LTUuNDEyNTcyLTAuMjE5NDI4YTI5NS4yMDQ1NzEgMjk1LjIwNDU3MSAwIDAgMS02LjY1NiAyOC4wODY4NTdjLTAuNjU4Mjg2IDIuMjY3NDI5LTEuNDYyODU3IDQuMzg4NTcxLTIuMTk0Mjg2IDYuNjU2LTIuMTk0Mjg2IDcuMDIxNzE0LTQuMzg4NTcxIDEzLjg5NzE0My03LjA5NDg1NyAyMC42OTk0MjgtMC44MDQ1NzEgMi4wNDgtMS44Mjg1NzEgNC4wMjI4NTctMi42MzMxNDMgNi4wNzA4NThhMzI2LjIxNzE0MyAzMjYuMjE3MTQzIDAgMCAxLTkuMjE2IDIwLjMzMzcxNGMtMC43MzE0MjkgMS42MDkxNDMtMS43NTU0MjkgMy4xNDUxNDMtMi41NiA0LjY4MTE0M2EzMTguOTc2IDMxOC45NzYgMCAwIDEtMTEuNjI5NzE0IDIwLjQ4Yy01Ny42MzY1NzEgOTIuMTYtMTYyLjY2OTcxNCAxNTMuODkyNTcxLTI4Mi45MTY1NzEgMTUzLjg5MjU3MS0xMjAuMzIgMC0yMjUuMjgtNjEuODA1NzE0LTI4Mi45MTY1NzItMTUzLjg5MjU3MS00LjE2OTE0My02LjY1Ni03Ljk3MjU3MS0xMy41MzE0MjktMTEuNzAyODU3LTIwLjQ4LTAuNzMxNDI5LTEuNTM2LTEuNjgyMjg2LTMuMDcyLTIuNDg2ODU3LTQuNjgxMTQzYTMxNi43MDg1NzEgMzE2LjcwODU3MSAwIDAgMS05LjIxNi0yMC4zMzM3MTRjLTAuODA0NTcxLTIuMDQ4LTEuODI4NTcxLTQuMDIyODU3LTIuNjMzMTQzLTYuMDcwODU4YTMwMC4xMDUxNDMgMzAwLjEwNTE0MyAwIDAgMS03LjA5NDg1Ny0yMC42OTk0MjhsLTIuMTk0Mjg2LTYuNTgyODU3YTI5NC42MTk0MjkgMjk0LjYxOTQyOSAwIDAgMS02LjU4Mjg1Ny0yOC4xNmMtMS45MDE3MTQgMC0zLjY1NzE0MyAwLjIxOTQyOS01LjQ4NTcxNCAwLjIxOTQyOC01Ljc3ODI4NiAwLTExLjQ4MzQyOS0wLjI5MjU3MS0xNy4xMTU0MjktMC44MDQ1NzEtMi4zNDA1NzEtMC4yMTk0MjktNC42MDgtMC42NTgyODYtNi44NzU0MjgtMC45NTA4NTctMy4yMTgyODYtMC40Mzg4NTctNi40MzY1NzEtMC44MDQ1NzEtOS42NTQ4NTctMS40NjI4NTctMi45MjU3MTQtMC41MTItNS44NTE0MjktMS4yNDM0MjktOC43NzcxNDMtMS45NzQ4NTgtMi4zNDA1NzEtMC41ODUxNDMtNC42ODExNDMtMS4wMjQtNi45NDg1NzItMS42ODIyODVhMTg2LjY2MDU3MSAxODYuNjYwNTcxIDAgMCAxLTEwLjA5MzcxNC0zLjI5MTQyOWwtNC45MDA1NzEtMS42ODIyODZjLTMuNjU3MTQzLTEuNDYyODU3LTcuMzE0Mjg2LTIuOTI1NzE0LTEwLjg5ODI4Ni00LjYwOGwtMy4yMTgyODYtMS40NjI4NTdhMTczLjg2MDU3MSAxNzMuODYwNTcxIDAgMCAxLTExLjQxMDI4Ni02LjE0NGwtMS45MDE3MTQtMS4wOTcxNDNhMTg1LjU2MzQyOSAxODUuNTYzNDI5IDAgMCAxLTExLjcwMjg1Ny03LjUzMzcxNGwtMC43MzE0MjktMC41ODUxNDNhMTY0LjIwNTcxNCAxNjQuMjA1NzE0IDAgMCAxLTcwLjU4Mjg1Ny0xMzQuMjkwMjg1YzAtOTIuNTI1NzE0IDc4LjI2Mjg1Ny0xNjcuNDk3MTQzIDE3NC44MTE0MjktMTY3LjQ5NzE0MyAzMi4xODI4NTcgMCA1OC4yOTQ4NTctMjUuMDg4IDU4LjI5NDg1Ny01NS44ODExNDMgMC0zMC44NjYyODYtMjYuMTEyLTU1Ljg4MTE0My01OC4yOTQ4NTctNTUuODgxMTQzQzEzMC40ODY4NTcgNzYuOCAwIDIwMS44NzQyODYgMCAzNTYuMDU5NDI5YzAgMTI1LjgwNTcxNCA4Ni44MjA1NzEgMjMyLjE1NTQyOSAyMDYuMjYyODU3IDI2Ny4xMTc3MTRDMjcwLjk5NDI4NiA3ODIuNjI4NTcxIDQzMi4yNzQyODYgODk2IDYyMS43MTQyODYgODk2czM1MC42NDY4NTctMTEzLjM3MTQyOSA0MTUuNTI0NTcxLTI3Mi44MjI4NTdDMTE1Ni42MDggNTg4LjIxNDg1NyAxMjQzLjQyODU3MSA0ODEuODY1MTQzIDEyNDMuNDI4NTcxIDM1Ni4wNTk0MjljMC0xNTQuMTg1MTQzLTEzMC40ODY4NTctMjc5LjI1OTQyOS0yOTEuNDAxMTQyLTI3OS4yNTk0Mjl6TTQwMy41MjkxNDMgMjA3LjI4Njg1N2wwLjA3MzE0MyAwLjA3MzE0MyAwLjE0NjI4NSAwLjE0NjI4Nkw1NzguNDEzNzE0IDM5My41MDg1NzFsMC4xNDYyODYtMC4xNDYyODVhNTkuMDk5NDI5IDU5LjA5OTQyOSAwIDAgMCA4Ni4zMDg1NzEgMGwwLjE0NjI4NiAwLjE0NjI4NSAxNzQuNjY1MTQzLTE4NS45MjkxNDJ2LTAuMDczMTQzbDAuMjE5NDI5LTAuMTQ2Mjg2YzguMTE4ODU3LTguNzA0IDEzLjQ1ODI4Ni0xOS43NDg1NzEgMTQuNjI4NTcxLTMyLjAzNjU3MXYtMC4xNDYyODZhNDguNDIwNTcxIDQ4LjQyMDU3MSAwIDAgMCAwLjM2NTcxNC01LjEyYzAtMzAuOTM5NDI5LTI2LjExMi01NS45NTQyODYtNTguMjk0ODU3LTU1Ljk1NDI4NmgtMS45MDE3MTRsLTEuMTcwMjg2IDAuMDczMTQzLTEuMjQzNDI4IDAuMDczMTQzLTEuOTAxNzE1IDAuMjE5NDI4aC0wLjczMTQyOGwtMi40ODY4NTcgMC4zNjU3MTVhNTguODA2ODU3IDU4LjgwNjg1NyAwIDAgMC0zMy45MzgyODYgMTcuNzczNzE0TDY4MC4wMDkxNDMgMjEwLjUwNTE0M3YtMjgyLjYyNGMwLTMwLjg2NjI4Ni0yNi4xMTItNTUuODgxMTQzLTU4LjI5NDg1Ny01NS44ODExNDMtMzIuMTgyODU3IDAtNTguMjk0ODU3IDI1LjAxNDg1Ny01OC4yOTQ4NTcgNTUuODgxMTQzVjIxMC41MDUxNDNsLTczLjIxNi03Ny45NzAyODZhNTguNTg3NDI5IDU4LjU4NzQyOSAwIDAgMC0zMy44NjUxNDMtMTcuNzAwNTcxYy0wLjg3NzcxNC0wLjIxOTQyOS0xLjY4MjI4Ni0wLjI5MjU3MS0yLjU2LTAuMzY1NzE1YTEzLjY3NzcxNCAxMy42Nzc3MTQgMCAwIDAtMC43MzE0MjktMC4wNzMxNDJsLTEuOTAxNzE0LTAuMjE5NDI5aC0xLjI0MzQyOWwtMS4wOTcxNDMtMC4wNzMxNDNoLTEuOTc0ODU3YTU4LjY2MDU3MSA1OC42NjA1NzEgMCAwIDAtNTEuMiAyOS4xODQgNTMuNjg2ODU3IDUzLjY4Njg1NyAwIDAgMCA3Ljg5OTQyOSA2NHoiICBob3Jpei1hZHYteD0iMTI0MyIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJ1bmZvbGQiIHVuaWNvZGU9IiYjNTkwNTM7IiBkPSJNNTEyIDg5NmE1MTIgNTEyIDAgMSAwIDAtMTAyNEE1MTIgNTEyIDAgMCAwIDUxMiA4OTZ6TTI3My41Nzg2NjcgMzQzLjcyMjY2N2wxOTUuNDEzMzMzLTE1OC4yOTMzMzRBNjcuOTI1MzMzIDY3LjkyNTMzMyAwIDAgMSA1MTIgMTcxLjA5MzMzM2E2OC4wMTA2NjcgNjguMDEwNjY3IDAgMCAxIDQzLjAwOCAxNC4zMzZsMTk1LjQxMzMzMyAxNTguMjkzMzM0YzIzLjQ2NjY2NyAxOS4xMTQ2NjcgMjMuNDY2NjY3IDUwLjAwNTMzMyAwIDY5LjEyYTcwLjU3MDY2NyA3MC41NzA2NjcgMCAwIDEtODUuMzMzMzMzIDBMNTEyIDI4OC43NjggMzU4LjkxMiA0MTIuODQyNjY3YTcwLjY1NiA3MC42NTYgMCAwIDEtODUuMzMzMzMzIDBjLTIzLjQ2NjY2Ny0xOS4xMTQ2NjctMjMuNDY2NjY3LTUwLjAwNTMzMyAwLTY5LjEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImNsb3NlIiB1bmljb2RlPSImIzU5MDU0OyIgZD0iTTY0MS4zNjUzMzMgMzg0bDM1NS40MTMzMzQtMzU1LjMyOGMzNi4wMTA2NjctMzYuMDEwNjY3IDM2LjQzNzMzMy05My44NjY2NjcgMC40MjY2NjYtMTI5Ljg3NzMzM2E5MS43MzMzMzMgOTEuNzMzMzMzIDAgMCAwLTEyOS44NzczMzMgMC40MjY2NjZMNTEyIDI1NC42MzQ2NjdsLTM1NS4zMjgtMzU1LjQxMzMzNGMtMzYuMDEwNjY3LTM2LjAxMDY2Ny05My44NjY2NjctMzYuNDM3MzMzLTEyOS44NzczMzMtMC40MjY2NjZhOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMCAwLjQyNjY2NiAxMjkuODc3MzMzTDM4Mi42MzQ2NjcgMzg0IDI3LjIyMTMzMyA3MzkuMzI4QTkxLjY0OCA5MS42NDggMCAwIDAgMjYuNzk0NjY3IDg2OS4yMDUzMzNhOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMCAxMjkuODc3MzMzLTAuNDI2NjY2TDUxMiA1MTMuMzY1MzMzIDg2Ny4zMjggODY4Ljc3ODY2N2E5MS42NDggOTEuNjQ4IDAgMCAwIDEyOS44NzczMzMgMC40MjY2NjYgOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMC0wLjQyNjY2Ni0xMjkuODc3MzMzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im1hcmsiIHVuaWNvZGU9IiYjNTkwNTU7IiBkPSJNMjU2IDE4LjY1MTQyOWE1MS4zNDYyODYgNTEuMzQ2Mjg2IDAgMCAwLTQ0LjM5NzcxNCAyNS4zODA1NzFMNy42OCAzOTQuMzg2Mjg2Yy0xNC4xMTY1NzEgMjQuMTM3MTQzLTUuNDg1NzE0IDU0Ljg1NzE0MyAxOS4wMTcxNDMgNjguNjgxMTQzczU1Ljg4MTE0MyA1LjQxMjU3MSA2OS45MjQ1NzEtMTguNzI0NTcybDE3MC40OTYtMjkzLjE1NjU3MSA2MjguNTE2NTcyIDYxOS4xNTQyODVhNTEuOTMxNDI5IDUxLjkzMTQyOSAwIDAgMCA3Mi40MTE0MjggMC4wNzMxNDMgNDkuNzM3MTQzIDQ5LjczNzE0MyAwIDAgMCAwLjE0NjI4Ni03MS4xNjhMMjk0LjYxOTQyOSAzNS44NGwtMi40MTM3MTUtMi40MTM3MTRhNTEuNjM4ODU3IDUxLjYzODg1NyAwIDAgMC0zNi4yMDU3MTQtMTQuNjI4NTcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InRyYWZmaWMiIHVuaWNvZGU9IiYjNTkwNTY7IiBkPSJNNTEyIDY5MS4yYy04NC44Mzg0IDAtMTUzLjYtNDkuNjY0LTE1My42LTExMC45NTA0di00NDMuNjk5MkMzNTguNCA3NS4yNjQgNDI3LjE2MTYgMjUuNiA1MTIgMjUuNnMxNTMuNiA0OS42NjQgMTUzLjYgMTEwLjk1MDRWNTgwLjI0OTZDNjY1LjYgNjQxLjUzNiA1OTYuODM4NCA2OTEuMiA1MTIgNjkxLjJ6IG0wIDEwMi40YzE0MS4zNjMyIDAgMjU2LTk3LjQzMzYgMjU2LTIxNy42di00MzUuMmMwLTEyMC4xNjY0LTExNC42MzY4LTIxNy42LTI1Ni0yMTcuNnMtMjU2IDk3LjQzMzYtMjU2IDIxNy42djQzNS4yQzI1NiA2OTYuMTY2NCAzNzAuNjM2OCA3OTMuNiA1MTIgNzkzLjZ6TTUxMiA1NjMuMm0tNzYuOCAwYTc2LjggNzYuOCAwIDEgMSAxNTMuNiAwIDc2LjggNzYuOCAwIDEgMS0xNTMuNiAwWk01MTIgMzU4LjRtLTc2LjggMGE3Ni44IDc2LjggMCAxIDEgMTUzLjYgMCA3Ni44IDc2LjggMCAxIDEtMTUzLjYgMFpNNTEyIDE1My42bS03Ni44IDBhNzYuOCA3Ni44IDAgMSAxIDE1My42IDAgNzYuOCA3Ni44IDAgMSAxLTE1My42IDBaIiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZnVsbC1maWd1cmUiIHVuaWNvZGU9IiYjNTkwNTc7IiBkPSJNMjYwLjYwOCA2NDBDMjI5LjgzNjggNjQwIDIwNC44IDYxNC41NTM2IDIwNC44IDU4My4xMTY4di0zOTguMjMzNkMyMDQuOCAxNTMuNDQ2NCAyMjkuNzg1NiAxMjggMjYwLjYwOCAxMjhoNTAyLjc4NGMzMC44MjI0IDAgNTUuODA4IDI1LjQ0NjQgNTUuODA4IDU2Ljg4MzJWNTgzLjE2OEM4MTkuMiA2MTQuNTUzNiA3OTQuMjE0NCA2NDAgNzYzLjM5MiA2NDB6IG01LjYzMiAxMDIuNGg0OTEuNTJDODQ4LjIzMDQgNzQyLjQgOTIxLjYgNjY4LjM2NDggOTIxLjYgNTc3LjAyNHYtMzg2LjA0OGMwLTkxLjM0MDgtNzMuMzY5Ni0xNjUuMzc2LTE2My44NC0xNjUuMzc2SDI2Ni4yNEMxNzUuNzY5NiAyNS42IDEwMi40IDk5LjYzNTIgMTAyLjQgMTkwLjk3NlY1NzcuMDI0QzEwMi40IDY2OC4zMTM2IDE3NS43Njk2IDc0Mi40IDI2Ni4yNCA3NDIuNHpNMzIzLjg5MTIgNDE4LjY2MjRhMzUuODQgMzUuODQgMCAwIDAtMzUuODQgMzUuNDMwNFY1MjUuMDA0OGEzNS44NCAzNS44NCAwIDAgMCAzNS44NCAzNS40MzA0bDcxLjY4LTAuNjE0NGMxOS42MDk2IDAgMzUuNzg4OC0xNS4zNiAzNS43ODg4LTM0LjgxNnMtMTYuMTc5Mi0zNS40MzA0LTM1Ljg0LTM1LjQzMDRoLTM1Ljg0di0zNS40ODE2YTM1Ljg0IDM1Ljg0IDAgMCAwLTM1Ljc4ODgtMzUuNDMwNHogbTcxLjY4LTIxMi42ODQ4aC03MS42OGEzNS44NCAzNS44NCAwIDAgMC0zNS44NCAzNS40ODE2VjMxMi4zMmEzNS44NCAzNS44NCAwIDAgMCA3MS42OCAwdi0zNS40MzA0aDM1Ljg0YzE5LjYwOTYgMCAzNS43ODg4LTE2LjAyNTYgMzUuNzg4OC0zNS40MzA0cy0xNi4xNzkyLTM1LjQ4MTYtMzUuODQtMzUuNDgxNnogbTMxMC4zNzQ0IDIxMi42ODQ4YTM1Ljg0IDM1Ljg0IDAgMCAwLTM1Ljg0IDM1LjQzMDR2MzUuNDgxNmgtMzUuNzg4OGMtMTkuNjYwOCAwLTM1Ljg0IDE1Ljk3NDQtMzUuODQgMzUuNDMwNHMxNi4xNzkyIDM1LjQzMDQgMzUuODQgMzUuNDMwNGg3MS42OGEzNS44NCAzNS44NCAwIDAgMCAzNS43ODg4LTM1LjQzMDR2LTcwLjkxMmEzNS44NCAzNS44NCAwIDAgMC0zNS44NC0zNS40MzA0eiBtMC0yMTIuNjg0OEg2MzQuMzY4Yy0xOS42NjA4IDAtMzUuODQgMTYuMDI1Ni0zNS44NCAzNS40ODE2czE2LjE3OTIgMzUuNDMwNCAzNS44NCAzNS40MzA0aDM1Ljg0VjMxMi4zMmEzNS44NCAzNS44NCAwIDAgMCA3MS42Mjg4IDB2LTcwLjg2MDhhMzUuODQgMzUuODQgMCAwIDAtMzUuODQtMzUuNDgxNnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJtZWFzdXJlIiB1bmljb2RlPSImIzU5MDU4OyIgZD0iTTEyOS4xMjY0IDIwMy4wMDhhMTAyLjI5NzYgMTAyLjI5NzYgMCAwIDAtMC4yMDQ4IDE0NC41ODg4bDQzNC44NDE2IDQzNC44NDE2YTEwMS45OTA0IDEwMS45OTA0IDAgMCAwIDE0NC41ODg4LTAuMjA0OGwyMTcuMjQxNi0yMTcuMjQxNmMzOS45ODcyLTM5LjkzNiA0MC4wMzg0LTEwNC43NTUyIDAuMjA0OC0xNDQuNTg4OEw0OTEuMDA4LTE0LjQzODRhMTAxLjk5MDQgMTAxLjk5MDQgMCAwIDAtMTQ0LjU4ODggMC4yMDQ4eiBtMTA4LjI4OCAzNi41MDU2bDE0NS40NTkyLTE0NS40NTkyYTUxLjI1MTIgNTEuMjUxMiAwIDAgMSA3Mi4xOTIgMC40MDk2bDM2MS44MzA0IDM2MS44MzA0YTUxLjI1MTIgNTEuMjUxMiAwIDAgMSAwLjQwOTYgNzIuMTkybC0xNDUuNDU5MiAxNDUuNDU5MmE1MS4yNTEyIDUxLjI1MTIgMCAwIDEtNzIuMTkyLTAuNDA5NmwtMzYxLjgzMDQtMzYxLjgzMDRhNTEuMjUxMiA1MS4yNTEyIDAgMCAxLTAuNDA5Ni03Mi4xOTJ6TTI0Ny45NjE2IDMyNi45NjMybDM2LjE5ODQgMzYuMTk4NCAxMDguNjQ2NC0xMDguNTk1Mi0zNi4yNDk2LTM2LjI0OTZ6TTMyMC4zNTg0IDM5OS4zNmwzNi4xOTg0IDM2LjE5ODQgMTQ0Ljg0NDgtMTQ0Ljc5MzYtMzYuMTk4NC0zNi4xOTg0eiBtNzIuNDQ4IDcyLjM5NjhsMzYuMTk4NCAzNi4xOTg0TDUzNy42IDM5OS4zNmwtMzYuMTk4NC0zNi4xOTg0ek01MzcuNiA2MTYuNjAxNmwzNi4xOTg0IDM2LjE5ODQgMTA4LjU5NTItMTA4LjY0NjQtMzYuMTk4NC0zNi4xOTg0ek00NjUuMjAzMiA1NDQuMTUzNmwzNi4xOTg0IDM2LjI0OTYgMTQ0Ljc5MzYtMTQ0Ljg0NDgtMzYuMTk4NC0zNi4xOTg0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImRpc3BsYXktbGlzdCIgdW5pY29kZT0iJiM1OTA1OTsiIGQ9Ik0wIDc5LjI3NDY2N2gyNTZWLTQyLjY2NjY2N0gweiBtMzg0IDBoMjU2Vi00Mi42NjY2NjdoLTI1NnogbTM4NCAwaDI1NlYtNDIuNjY2NjY3SDc2OHpNMCAzMjMuMDcyaDI1NnYtMTIxLjk0MTMzM0gweiBtMzg0IDBoMjU2di0xMjEuOTQxMzMzaC0yNTZ6IG0zODQgMGgyNTZ2LTEyMS45NDEzMzNINzY4ek01MTIgNjg4LjY0TDAgNDQ0LjkyOFY1NjYuODY5MzMzTDUxMiA4MTAuNjY2NjY3eiBtNTEyLTI0My43OTczMzNMNTEyIDY4OC43MjUzMzNWODEwLjY2NjY2N2w1MTItMjQzLjc5NzMzNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJoaWRlLWxpc3QiIHVuaWNvZGU9IiYjNTkwNjA7IiBkPSJNMCA2ODguNzI1MzMzaDI1NlY4MTAuNjY2NjY3SDB6IG0zODQgMGgyNTZWODEwLjY2NjY2N2gtMjU2eiBtMzg0IDBoMjU2VjgxMC42NjY2NjdINzY4ek0wIDQ0NC45MjhoMjU2VjU2Ni44NjkzMzNIMHogbTM4NCAwaDI1NlY1NjYuODY5MzMzaC0yNTZ6IG0zODQgMGgyNTZWNTY2Ljg2OTMzM0g3Njh6TTUxMiA3OS4zNkwwIDMyMy4wNzJ2LTEyMS45NDEzMzNMNTEyLTQyLjY2NjY2N3ogbTUxMiAyNDMuNzk3MzMzTDUxMiA3OS4yNzQ2NjdWLTQyLjY2NjY2N2w1MTIgMjQzLjc5NzMzNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJyZW5hbWUiIHVuaWNvZGU9IiYjNTkwNjE7IiBkPSJNOTYwIDY4Mi42NjY2NjdoLTk5LjU4NHYtOTkuNTg0aDQ5LjgzNDY2N3YtMzk4LjE2NTMzNGgtNDkuODM0NjY3Vjg1LjMzMzMzM2g5OS41ODRhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMSA0OS43NDkzMzMgNDkuNzQ5MzM0VjYzMi45MTczMzNhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMS00OS43NDkzMzMgNDkuNzQ5MzM0eiBtLTg5Ni01OTcuMzMzMzM0aDQ5Ny43NDkzMzNWMTg0LjkxNzMzM2gtNDQ4VjU4My4wODI2NjdoNDQ4VjY4Mi42NjY2NjdINjRhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMS00OS43NDkzMzMtNDkuNzQ5MzM0di00OTcuODM0NjY2YzAtMjcuNDc3MzMzIDIyLjE4NjY2Ny00OS43NDkzMzMgNDkuNzQ5MzMzLTQ5Ljc0OTMzNHpNMjEzLjMzMzMzMyA0ODMuNTg0aDM0OC40MTZ2LTE5OS4xNjhIMjEzLjMzMzMzM3pNNzYwLjkxNzMzMyA2ODEuNDcyYzAuNTk3MzMzIDE2LjgxMDY2NyAxMC45MjI2NjcgMTAwLjY5MzMzMyAxNDkuMzMzMzM0IDEwMC42OTMzMzNWODgxLjgzNDY2N2MtOTguOTAxMzMzIDAtMTYxLjI4LTMzLjI4LTE5OC44MjY2NjctNzUuMTc4NjY3QzY3NC4xMzMzMzMgODQ4LjM4NCA2MTEuNTg0IDg4MS43NDkzMzMgNTEyIDg4MS43NDkzMzN2LTk5LjQ5ODY2NmMxMzkuMzQ5MzMzIDAgMTQ4LjgyMTMzMy04My42MjY2NjcgMTQ5LjMzMzMzMy05OS41ODR2LTU5Ny4yNDhjMC00LjA5Ni0xLjg3NzMzMy05OS42NjkzMzMtMTQ5LjMzMzMzMy05OS42NjkzMzR2LTk5LjQ5ODY2NmM5OS42NjkzMzMgMCAxNjIuMTMzMzMzIDMzLjQ1MDY2NyAxOTkuNjggNzUuNTIgMi4zODkzMzMtMi43MzA2NjcgNC4zNTItNS41NDY2NjcgNy4wODI2NjctOC4yNzczMzQgNDQuNDU4NjY3LTQ0LjYyOTMzMyAxMDguODg1MzMzLTY3LjI0MjY2NyAxOTEuNDg4LTY3LjI0MjY2NnY5OS40OTg2NjZjLTEzOS41MiAwLTE0OC45MDY2NjcgODMuNDU2LTE0OS4zMzMzMzQgOTkuNDk4NjY3eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImNvcHkiIHVuaWNvZGU9IiYjNTkwNjI7IiBkPSJNNjM5Ljg3MiA2MzkuNjhIMTkyLjM4NGMtMzUuMiAwLTYzLjg3Mi0yOC44LTYzLjg3Mi02My44NzJ2LTU3NS4zNmMwLTM1LjIgMjguOC02NCA2My44NzItNjRoNDQ3LjQ4OGMzNS4yIDAgNjMuOTM2IDI4LjggNjMuOTM2IDY0djU3NS4zNmMwIDM1LjA3Mi0yOC44IDYzLjg3Mi02My45MzYgNjMuODcyeiBtMC02MzkuMjk2SDE5Mi4zODR2NTc1LjM2aDQ0Ny40ODh2LTU3NS4zNnogbTE5MS43NDQgODMxLjEwNEgzODQuMTI4Yy0zNS4yIDAtNjMuOTM2LTI4LjgtNjMuOTM2LTYzLjg3MnYtNjMuOTM2aDYzLjkzNnY2My45MzZoNDQ3LjQ4OHYtNTc1LjM2aC02My45MzZ2LTY0aDYzLjkzNmMzNS4yIDAgNjMuODcyIDI4LjggNjMuODcyIDY0djU3NS4zNmE2NCA2NCAwIDAgMS02My44NzIgNjMuODcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InFxLXpvbmUiIHVuaWNvZGU9IiYjNTkwNjM7IiBkPSJNNTEyIDg5NkMyMjkuMDE3NiA4OTYgMCA2NjYuOTgyNCAwIDM4NHMyMjkuMDE3Ni01MTIgNTEyLTUxMiA1MTIgMjI5LjAxNzYgNTEyIDUxMlM3OTQuOTgyNCA4OTYgNTEyIDg5NnogbTM1NC4xNTA0LTQxOC44MTZsLTE4My42NTQ0LTE1NS40OTQ0IDYuMjQ2NC0yNC42Nzg0Yy0xMjkuNTM2LTEuMjI4OC0yMTUuMDkxMiAxMS4xMTA0LTIxNS4wOTEyIDExLjExMDRsMjEzLjg2MjQgMTQ5LjI5OTJjLTE3My42MTkyIDM1Ljc4ODgtNDA4Ljg4MzItNi4xNDQtMzkwLjA0MTYtNy40MjQgMjY1LjQ3Mi04LjY1MjggMjczLjA0OTYtMjIuMjIwOCAyNzMuMDQ5Ni0yMi4yMjA4TDM1Ny44ODggMjc4LjUyOGMyOTMuMTItMTguNTM0NCAzNzQuODg2NCAxOS43MTIgMzc0Ljg4NjQgMTkuNzEycy0yMC4xMjE2LTE2LjAyNTYtMzguOTYzMi0yNC42Nzg0bDQ0LjAzMi0xODIuNTc5MmMxLjIyODgtMy42ODY0LTEuMjgtOC42NTI4LTMuNzg4OC0xMS4xMTA0LTIuNTYtMS4yMjg4LTMuNzg4OC0yLjQ1NzYtNi4yOTc2LTIuNDU3NnMtMy43ODg4IDAtNi4yOTc2IDEuMjI4OGwtMjA4Ljg0NDggMTIyLjE2MzItMjA4Ljg0NDgtMTIyLjE2MzJhMTEuNjIyNCAxMS42MjI0IDAgMCAwLTEyLjU0NCAwIDkuODMwNCA5LjgzMDQgMCAwIDAtMy43ODg4IDExLjExMDRsNTUuMzQ3MiAyMzEuOTM2TDE1Ny44NDk2IDQ3Ny4xODRjLTMuNzg4OCAyLjQ1NzYtNS4wMTc2IDcuNDI0LTMuNzg4OCAxMS4xMTA0czUuMDY4OCA3LjQyNCAxMC4wODY0IDcuNDI0bDI0Mi43OTA0IDE5LjcxMkw1MDIuNTc5MiA3MzYuMjU2YzEuMjI4OCAzLjY4NjQgNi4yOTc2IDYuMTQ0IDEwLjAzNTIgNi4xNDQgNS4wNjg4IDAgOC44MDY0LTIuNDU3NiAxMC4wODY0LTYuMTQ0bDk0LjM2MTYtMjE4LjQxOTIgMjQyLjc5MDQtMTkuNzEyYzUuMDE3NiAwIDguODA2NC0zLjY4NjQgMTAuMDg2NC03LjQyNCAxLjIyODgtMy42ODY0IDAtMTEuMTEwNC0zLjc4ODgtMTMuNTY4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNpbmEtd2VpYm8iIHVuaWNvZGU9IiYjNTkwNjQ7IiBkPSJNMzk5Ljg3MiAyODAuMDY0Yy0yMi44MzUyIDAtNDMuODI3Mi0xOC43OTA0LTQ0LjE4NTYtMzkuNDc1Mi0wLjMwNzItMTcuNjY0IDE0LjU0MDgtMzEuMTI5NiAzNC40NTc2LTMxLjEyOTYgMjMuNjU0NCAwIDQzLjUyIDE3LjgxNzYgNDMuNjIyNCAzOS4yMTkyIDAuMjA0OCAxOC4yNzg0LTE0LjA4IDMxLjM4NTYtMzMuOTQ1NiAzMS4zODU2eiBtNTYuNzI5NiAxNS43MTg0Yy02Ljc1ODQtMy4zMjgtMTMuMzEyLTguMTkyLTE3Ljk3MTItMTQuMTMxMi0xLjAyNC0xLjI4IDUuOTM5Mi04LjgwNjQgMTEuNTcxMi0xNi44OTYgNy4yMTkyIDcuOTM2IDEzLjc3MjggMTIuNDkyOCAxNi4xNzkyIDE4LjY4OCAxLjAyNCAyLjYxMTItOC42NTI4IDEyLjk1MzYtOS43MjggMTIuMzM5MnogbTE0My4zMDg4IDg5LjgwNDhhMjI1LjY4OTYgMjI1LjY4OTYgMCAwIDEtMzQuOTY5NiAxNy41MTA0Yy00MC40NDggMTYuMTc5Mi04Mi45NDQgMjAuOTkyLTEyNi4xMDU2IDE3LjIwMzItNjUuMjgtNS42MzItMTI1LjU0MjQtMjQuODgzMi0xNzIuNDQxNi03My4zMTg0LTU0LjM3NDQtNTYuMDY0LTQ3LjAwMTYtMTI3LjA3ODQgMTYuOTk4NC0xNzEuNTcxMiA0My4zMTUyLTMwLjEwNTYgOTIuNTE4NC00MC40NDggMTQ0LjQ4NjQtMzkuMTY4IDkuNDIwOCAwIDE4Ljk0NC0wLjc2OCAyOC4yNjI0IDAuMTAyNCA1OS4xODcyIDUuNjMyIDExMy42NjQgMjMuNjAzMiAxNTguODIyNCA2My42NDE2IDY1Ljk5NjggNTguMzY4IDU5LjM5MiAxMzguODAzMi0xNS4wNTI4IDE4NS42eiBtLTczLjIxNi0xNjQuOTE1MmMtMjIuNDc2OC0zNC4wNDgtNjIuMjU5Mi01NC43MzI4LTEwNS40NzItNTQuOTM3Ni01NC40MjU2LTAuMzU4NC05NS4yODMyIDMwLjIwOC0xMDIuNTUzNiA3Ny44MjRhNzkuMjA2NCA3OS4yMDY0IDAgMCAwIDEuMDc1MiAyOS45NTJjMTAuOTU2OCA0Ni42OTQ0IDQzLjMxNTIgNzIuNzU1MiA4Ny4yOTYgODQuNTMxMiA0My40Njg4IDExLjUyIDgzLjg2NTYgMy45OTM2IDExNS41MDcyLTMwLjUxNTIgMjYuMTEyLTI4LjU2OTYgMjcuMTg3Mi03Mi4xNDA4IDQuMDk2LTEwNi44NTQ0ek01MTIgODk2QzIyOS4yMjI0IDg5NiAwIDY2Ni43Nzc2IDAgMzg0czIyOS4yMjI0LTUxMiA1MTItNTEyYzI4Mi43MjY0IDAgNTEyIDIyOS4yMjI0IDUxMiA1MTIgMCAyODIuNzI2NC0yMjkuMjIyNCA1MTItNTEyIDUxMnogbTI0NC4xMjE2LTY2NC44ODMyYy00My43MjQ4LTY3LjI3NjgtMTEwLjk1MDQtMTAwLjY1OTItMTg2LjAwOTYtMTE5LjA0LTM2LjM1Mi04Ljk2LTc0LjI0LTExLjcyNDgtOTMuOTUyLTE0Ljc0NTYtOTMuMDgxNiAyLjMwNC0xNjUuMDY4OCAxNi4wNzY4LTIyOS45OTA0IDU2LjQyMjQtODEuODE3NiA1MC44NDE2LTEwNS42NzY4IDEyNy4wMjcyLTYyLjg3MzYgMjEzLjQ1MjggNDUuOTI2NCA5Mi42NzIgMTE3LjQwMTYgMTYxLjIyODggMjExLjI1MTIgMjA1LjMxMiAxNy40MDggOC4xNDA4IDM3LjIyMjQgMTIuOCA1Ni4zMiAxNS4xMDQgMzkuMzcyOCA0LjkxNTIgNjIuMzEwNC0xNy40MDggNjEuMzM3Ni01Ny4wMzY4LTAuMjA0OC04LjcwNC0yLjIwMTYtMTcuMjAzMi0yLjY2MjQtMjUuOTU4NC0wLjQwOTYtNy40MjQgMC4xNTM2LTE1LjA1MjggMC4zMDcyLTIyLjUyOCA3LjY4IDEuMjggMTUuMzYgMi4wNDggMjIuODg2NCAzLjczNzYgMzAuMzEwNCA2LjUwMjQgNjAuMzEzNiAxNy4zMDU2IDkwLjg4IDE4Ljk0NCA1My4wOTQ0IDIuODE2IDc2LjgtMjkuMjg2NCA2MC43MjMyLTc5LjcxODQtNi45NjMyLTIxLjQ1MjgtMS43NDA4LTI4LjY3MiAxOC4yNzg0LTM1Ljg0IDc1LjQ2ODgtMjcuMjM4NCA5Ny4yMjg4LTkwLjkzMTIgNTMuNTA0LTE1OC4xMDU2eiBtLTM5LjU3NzYgMjgyLjU3MjhjLTEyLjQ5MjggMTUuODcyLTQwLjgwNjQgMTkuNTA3Mi00OS43NjY0IDE5LjYwOTZhMjMuOTYxNiAyMy45NjE2IDAgMCAwIDAuMTUzNiA0Ny45NzQ0aDAuMjA0OGM1LjgzNjggMCA1OC4zNjgtMS41MzYgODcuMDQtMzcuOTM5MiAxMS40MTc2LTE0LjQzODQgMjMuMDkxMi00MC4wODk2IDEzLjgyNC04MC4wMjU2YTI0LjAxMjggMjQuMDEyOCAwIDEgMC00Ni42OTQ0IDEwLjc1MmM0LjA5NiAxNy41MTA0IDIuNDU3NiAzMC40NjQtNC43NjE2IDM5LjYyODh6TTg1Ny43MDI0IDQzNS4yYTI0LjA2NCAyNC4wNjQgMCAwIDAtMjcuNDQzMi0xOS45NjggMjMuOTYxNiAyMy45NjE2IDAgMCAwLTE5Ljk2OCAyNy40NDMyYzguOTA4OCA1Ni41NzYtMC4xNTM2IDEwMC42MDgtMjcuMDMzNiAxMzAuNzEzNi00Ni43OTY4IDUyLjQyODgtMTMyLjU1NjggNDkuMzA1Ni0xMzMuNDI3MiA0OS4zMDU2YTIzLjk2MTYgMjMuOTYxNiAwIDEgMC0yLjA0OCA0Ny45MjMyYzQuNDU0NCAwLjE1MzYgMTA5LjQxNDQgMy44NCAxNzEuMjY0LTY1LjI4IDM2Ljg2NC00MS4zNjk2IDQ5Ljg2ODgtOTguNjExMiAzOC42NTYtMTcwLjEzNzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY29sb3ItY2hhbmdlIiB1bmljb2RlPSImIzU5MDY1OyIgZD0iTTQ4LjcxMzE0MyA0NzEuNzcxNDI5aDkyNi45Mzk0MjhhNDkuMDA1NzE0IDQ5LjAwNTcxNCAwIDEgMSAzMC4xMzQ4NTggODcuMjU5NDI4IDQ4Ljg1OTQyOSA0OC44NTk0MjkgMCAwIDEtMTAuMzg2Mjg2IDkuODc0Mjg2bC0zNDYuMjU4Mjg2IDI0NS4wMjg1NzFhNDguMjAxMTQzIDQ4LjIwMTE0MyAwIDAgMS00OC40MjA1NzEgNC4zODg1NzIgNDkuMDc4ODU3IDQ5LjA3ODg1NyAwIDAgMS03LjMxNDI4Ni04NC40OGwyMzIuMDA5MTQzLTE2NC4yMDU3MTVINDguNjRjLTI2Ljc3MDI4NiAwLTQ4LjQ5MzcxNC0yMS45NDI4NTctNDguNDkzNzE0LTQ4LjkzMjU3MSAwLTI3LjA2Mjg1NyAyMS43MjM0MjktNDguOTMyNTcxIDQ4LjU2Njg1Ny00OC45MzI1NzF6IG05MjYuOTM5NDI4LTE3NS41NDI4NThINDguNjRhNDguMjc0Mjg2IDQ4LjI3NDI4NiAwIDAgMS0zNC4zMDQtMTQuMzM2IDQ5LjE1MiA0OS4xNTIgMCAwIDEgNC4yNDIyODYtNzIuOTIzNDI4YzIuODUyNTcxLTMuNjU3MTQzIDYuMjkwMjg2LTcuMDIxNzE0IDEwLjI0LTkuODc0Mjg2bDM0Ni4zMzE0MjgtMjQ1LjAyODU3MWE0OC4yMDExNDMgNDguMjAxMTQzIDAgMCAxIDY3LjU4NCAxMS45MjIyODUgNDkuMjI1MTQzIDQ5LjIyNTE0MyAwIDAgMS0xMS44NDkxNDMgNjguMTY5MTQzTDE5OC44NzU0MjkgMTk4LjM2MzQyOWg3NzYuNzc3MTQyYzI2Ljc3MDI4NiAwIDQ4LjQ5MzcxNCAyMS45NDI4NTcgNDguNDkzNzE1IDQ4LjkzMjU3MWE0OC43MTMxNDMgNDguNzEzMTQzIDAgMCAxLTQ4LjQ5MzcxNSA0OC45MzI1NzF6IiAgaG9yaXotYWR2LXg9IjEwNTUiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY3JlYXQtY3VzdG9tLW1hcCIgdW5pY29kZT0iJiM1OTA2NjsiIGQ9Ik03NzAuOTI1NzE0LTU0LjcxMDg1N0gyNTMuMDc0Mjg2YTE3OS45MzE0MjkgMTc5LjkzMTQyOSAwIDAgMC0xNzkuNzEyIDE3OS43MTJWNjQyLjkyNTcxNGExNzkuOTMxNDI5IDE3OS45MzE0MjkgMCAwIDAgMTc5LjcxMiAxNzkuNzEyaDI1MS4zOTJhNTAuMTc2IDUwLjE3NiAwIDEgMCAwLTEwMC40MjUxNDNIMjUzLjAwMTE0M2MtNDMuNzM5NDI5IDAtNzkuMjg2ODU3LTM1LjU0NzQyOS03OS4yODY4NTctNzkuMjg2ODU3di01MTcuOTk3NzE0YzAtNDMuNzM5NDI5IDM1LjU0NzQyOS03OS4yODY4NTcgNzkuMjg2ODU3LTc5LjI4Njg1N2g1MTcuOTk3NzE0YzQzLjczOTQyOSAwIDc5LjI4Njg1NyAzNS41NDc0MjkgNzkuMjg2ODU3IDc5LjI4Njg1N1YzODguMTY5MTQzYTUwLjE3NiA1MC4xNzYgMCAxIDAgMTAwLjQyNTE0MyAwdi0yNjMuMTY4YTE3OS45MzE0MjkgMTc5LjkzMTQyOSAwIDAgMC0xNzkuNzEyLTE3OS43MTJ6TTkwMC41MzQ4NTcgNTUyLjM3NDg1N0g1NjAuNTY2ODU3YTUwLjE3NiA1MC4xNzYgMCAwIDAgMCAxMDAuMzUyaDMzOS45NjhhNTAuMjQ5MTQzIDUwLjI0OTE0MyAwIDAgMCAwLTEwMC4zNTJ6TTczMC41NTA4NTcgMzgyLjM5MDg1N2E1MC4xNzYgNTAuMTc2IDAgMCAwLTUwLjE3NiA1MC4xNzZWNzcyLjUzNDg1N2E1MC4xNzYgNTAuMTc2IDAgMSAwIDEwMC4zNTIgMHYtMzM5Ljk2OGE1MC4yNDkxNDMgNTAuMjQ5MTQzIDAgMCAwLTUwLjE3Ni01MC4xNzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY3VzdG9tLW1hcCIgdW5pY29kZT0iJiM1OTA2NzsiIGQ9Ik05MzYuNTUwNCA3ODMuMzZMNzUyLjUzNzYgODMwLjcyYTI4LjA1NzYgMjguMDU3NiAwIDAgMS0xOS43NjMyLTIuMjI3MmwtMjE1LjYyODgtMTEwLjA4LTE5OC40IDkyLjI4OGEyOC4wNTc2IDI4LjA1NzYgMCAwIDEtMjMuMDY1NiAwLjMwNzJMODIuMTc2IDcxOC4xODI0Yy0xMS44NTI4LTUuMTQ1Ni0xOS42MDk2LTE3LjkyLTE5LjYwOTYtMzIuMDUxMnYtNjUzLjUxNjhjMC0xMS4zNjY0IDQuOTkyLTIyLjAxNiAxMy40MTQ0LTI4LjQxNiA4LjM5NjgtNi40IDE5LjA5NzYtNy43MzEyIDI4LjU2OTYtMy42MzUybDIwMS45MzI4IDg3Ljc4MjQgMTk5LjM0NzItOTIuNzc0NGMzLjc4ODgtMS43NDA4IDcuODMzNi0yLjYzNjggMTEuODc4NC0yLjYzNjggNC4zNzc2IDAgOC43NTUyIDEuMDQ5NiAxMi44NTEyIDMuMTIzMmwxNS45NzQ0IDguMTY2NC0yNy4zNDA4IDYxLjY5Ni0yLjA0OC0xLjA0OTYtMTk4LjQgOTIuMjg4YTI4LjE2IDI4LjE2IDAgMCAxLTIzLjA2NTYgMC4zMzI4TDEyNC4yMTEyIDgyLjk0NFY2NjIuNjA0OGwxODIuMjcyIDc5LjI1NzYgMTk5LjM0NzItOTIuNzQ4OGM3LjkzNi0zLjcxMiAxNi44OTYtMy41MzI4IDI0LjcyOTYgMC40NjA4bDIxOC4zNDI0IDExMS40NjI0IDE0OS44ODgtMzguNTUzNnYtNTgyLjkxMmwtMjkuMDMwNCA3LjQ0OTYtMTQuNjY4OC0zMy4wNzUyYy0yLjMwNC01Ljc4NTYtNC44NjQtMTEuNTItNy42MDMyLTE3LjA3NTJsLTAuNDYwOC0xLjEwMDgtNS4zNzYtMTIuMTA4OCA4MS4wNDk2LTIwLjgzODRhMjguNDE2IDI4LjQxNiAwIDAgMSAyNi4xMTIgNi42MDQ4YzcuMzcyOCA2LjUwMjQgMTEuNjQ4IDE2LjQwOTYgMTEuNjQ4IDI2LjkzMTJWNzQ5LjgyNGMwIDE2LjAyNTYtOS45MDcyIDI5LjkwMDgtMjMuOTEwNCAzMy41MzZ6TTI4Ny44MjA4IDY1My4yODY0di00MTQuNzJjMC03LjYwMzIgOC41NTA0LTEzLjc0NzIgMTkuMDQ2NC0xMy43NDcyczE5LjA0NjQgNi4xNDQgMTkuMDQ2NCAxMy43NDcydjQxNC43MmMwIDcuNjAzMi04LjU1MDQgMTMuNzcyOC0xOS4wNDY0IDEzLjc3MjhzLTE5LjA0NjQtNi4xNjk2LTE5LjA0NjQtMTMuNzcyOHogbTIxMC44NDE2LTkxLjYyMjR2LTIwOC42OTEyYzAtNy42MDMyIDguNTUwNC0xMy43NzI4IDE5LjA0NjQtMTMuNzcyOHMxOS4wNDY0IDYuMTQ0IDE5LjA0NjQgMTMuNzcyOHYyMDguNjkxMmMwIDcuNjAzMi04LjU1MDQgMTMuNzk4NC0xOS4wNDY0IDEzLjc5ODRzLTE5LjA0NjQtNi4xOTUyLTE5LjA0NjQtMTMuNzk4NHogbTI3MC4wOC0xMzAuOTY5NlY2ODIuNzAwOGMwIDcuNjAzMi04LjUyNDggMTMuNzcyOC0xOS4wNDY0IDEzLjc3MjgtMTAuNTQ3MiAwLTE5LjA0NjQtNi4xNjk2LTE5LjA0NjQtMTYuNjE0NHYtMjUyLjAzMmMwLTQuNzM2IDguNDk5Mi0xMC45MzEyIDE5LjA0NjQtMTAuOTMxMiAxMC41MjE2IDAgMTkuMDcyIDYuMTk1MiAxOS4wNzIgMTMuNzcyOHogbS0xNzguNTA4OC00OTAuOTA1Nmw4MS40MDggNTkuOTA0LTYzLjg5NzYgNDguNDM1Mi0xNy41MTA0LTEwOC4zMzkyeiBtMjI0LjIzMDQgMjg1LjQxNDRsLTY2LjQ1NzYgNTIuOTY2NC0xMzIuOTQwOC0yMTEuNDA0OCA2OS4xMi01NS40NDk2IDEzMC4yNzg0IDIxMy44ODh6IG0zMy40ODQ4IDg2LjM0ODhzLTE3Ljc5MiAxNS4yNTc2LTM3LjEyIDI1LjY3NjhjLTE5LjMwMjQgMTAuNDE5Mi0zMC4xMzEyLTYuMTQ0LTMwLjEzMTItNi4xNDRsLTIzLjU1Mi0zOC4wNDE2IDY5LjE3MTItNTMuMTQ1NnMyMC4xNDcyIDMyLjgxOTIgMjYuMTg4OCA0My44NTI4YzYuMDQxNiAxMS4wNTkyLTQuNTU2OCAyNy44MDE2LTQuNTU2OCAyNy44MDE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxlZ2VuZC1mb2xkIiB1bmljb2RlPSImIzU5MDY4OyIgZD0iTTUxMiA2NzYuNTcxNDI5YTYwLjYzNTQyOSA2MC42MzU0MjkgMCAwIDEtNDMuNDQ2ODU3LTE4LjQzMmwtMzc3LjQxNzE0My0zODYuMTk0Mjg2YTYzLjkyNjg1NyA2My45MjY4NTcgMCAwIDEgMC04OC45NDE3MTQgNjAuNDg5MTQzIDYwLjQ4OTE0MyAwIDAgMSA4Ni45NjY4NTcgMEw1MTIgNTI0LjcyNjg1N2wzMzMuODk3MTQzLTM0MS43MjM0MjhhNjAuNDg5MTQzIDYwLjQ4OTE0MyAwIDAgMSA4Ni45NjY4NTcgMCA2My45MjY4NTcgNjMuOTI2ODU3IDAgMCAxIDAgODguOTQxNzE0bC0zNzcuNDE3MTQzIDM4Ni4xOTQyODZBNjAuNTYyMjg2IDYwLjU2MjI4NiAwIDAgMSA1MTIgNjc2LjU3MTQyOXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsZWdlbmQtdW5mb2xkIiB1bmljb2RlPSImIzU5MDY5OyIgZD0iTTUxMiA5MS40Mjg1NzFhNjAuNjM1NDI5IDYwLjYzNTQyOSAwIDAgMC00My40NDY4NTcgMTguNDMybC0zNzcuNDE3MTQzIDM4Ni4xOTQyODZhNjMuOTI2ODU3IDYzLjkyNjg1NyAwIDAgMCAwIDg4Ljk0MTcxNCA2MC40ODkxNDMgNjAuNDg5MTQzIDAgMCAwIDg2Ljk2Njg1NyAwTDUxMiAyNDMuMjczMTQzbDMzMy44OTcxNDMgMzQxLjcyMzQyOGE2MC40ODkxNDMgNjAuNDg5MTQzIDAgMCAwIDg2Ljk2Njg1NyAwIDYzLjkyNjg1NyA2My45MjY4NTcgMCAwIDAgMC04OC45NDE3MTRsLTM3Ny40MTcxNDMtMzg2LjE5NDI4NkE2MC41NjIyODYgNjAuNTYyMjg2IDAgMCAwIDUxMiA5MS40Mjg1NzF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGVnZW5kLWJpZyIgdW5pY29kZT0iJiM1OTA3MDsiIGQ9Ik0zMDcuMiA0ODYuNGgxMDIuNFY1ODguOEgzMDcuMnogbTAtMTUzLjZoMTAyLjRWNDM1LjJIMzA3LjJ6IG0wLTE1My42aDEwMi40djEwMi40SDMwNy4yeiBtMTUzLjYgMzA3LjJoMjU2VjU4OC44SDQ2MC44eiBtMzA3LjIgMzA3LjJIMjU2YTE1My42IDE1My42IDAgMCAxLTE1My42LTE1My42di01MTJhMTUzLjYgMTUzLjYgMCAwIDEgMTUzLjYtMTUzLjZoNTEyYTE1My42IDE1My42IDAgMCAxIDE1My42IDE1My42VjY0MGExNTMuNiAxNTMuNiAwIDAgMS0xNTMuNiAxNTMuNnogbTUxLjItNjY1LjZhNTEuMiA1MS4yIDAgMCAwLTUxLjItNTEuMkgyNTZhNTEuMiA1MS4yIDAgMCAwLTUxLjIgNTEuMlY2NDBhNTEuMiA1MS4yIDAgMCAwIDUxLjIgNTEuMmg1MTJhNTEuMiA1MS4yIDAgMCAwIDUxLjItNTEuMnogbS0zNTguNCAyMDQuOGgyNTZWNDM1LjJINDYwLjh6IG0wLTE1My42aDI1NnYxMDIuNEg0NjAuOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJhdHRyaWJ1dGUiIHVuaWNvZGU9IiYjNTkwNzE7IiBkPSJNMTAyNCA1MTEuMzQxNzE0VjcyNC42MjYyODZDMTAyNCA4MDMuMTA4NTcxIDk1OC40NjQgODY2Ljc0Mjg1NyA4NzcuNzE0Mjg2IDg2Ni43NDI4NTdIMTQ2LjI4NTcxNEM2NS41MzYgODY2Ljc0Mjg1NyAwIDgwMy4xMDg1NzEgMCA3MjQuNjI2Mjg2di03MTAuNTA5NzE1QzAtNjQuMzY1NzE0IDY1LjUzNi0xMjggMTQ2LjI4NTcxNC0xMjhoNzMxLjQyODU3MmM4MC43NDk3MTQgMCAxNDYuMjg1NzE0IDYzLjYzNDI4NiAxNDYuMjg1NzE0IDE0Mi4xMTY1NzF6TTk0LjU3MzcxNCA3NzQuODc1NDI5YzEzLjY3NzcxNCAxMy4zODUxNDMgMzIuMzI5MTQzIDIwLjkxODg1NyA1MS43ODUxNDMgMjAuODQ1NzE0aDczMS41MDE3MTRjMTkuNDU2IDAgMzguMDM0Mjg2LTcuNTMzNzE0IDUxLjcxMi0yMC44NDU3MTQgMTMuNzUwODU3LTEzLjM4NTE0MyAyMS4zNTc3MTQtMzEuNDUxNDI5IDIxLjM1NzcxNS01MC4zMjIyODZ2LTE0Mi4xODk3MTRINzMuMDY5NzE0VjcyNC41NTMxNDNjMCAxOC44NzA4NTcgNy42OCAzNy4wMTAyODYgMjEuNTA0IDUwLjMyMjI4NnogbTMwNy41NjU3MTUtNTEyLjIxOTQyOXYyNDguNjg1NzE0aDIxOS43MjExNDJ2LTI0OC42ODU3MTR6IG0yMTkuNzIxMTQyLTcwLjk0ODU3MXYtMjQ4LjY4NTcxNUg0MDIuMTM5NDI5djI0OC42ODU3MTV6IG0tMjkyLjc5MDg1NyA3MC45NDg1NzFINzMuMTQyODU3djI0OC42ODU3MTRoMjU2eiBtLTIzNC40OTYtMjk4LjkzNDg1N2E2OS40ODU3MTQgNjkuNDg1NzE0IDAgMCAwLTIxLjUwNCA1MC4xNzZWMTkxLjYzNDI4NmgyNTZ2LTI0OC42ODU3MTVIMTQ2LjM1ODg1N2E3My44NzQyODYgNzMuODc0Mjg2IDAgMCAwLTUxLjc4NTE0MyAyMC43NzI1NzJ6TTk1MC44NTcxNDMgMTMuODk3MTQzYzAtMTguNzk3NzE0LTcuNjgtMzYuODY0LTIxLjM1NzcxNC01MC4xNzZzLTMyLjMyOTE0My0yMC43NzI1NzEtNTEuNzEyLTIwLjY5OTQyOUg2OTQuOTMwMjg2djI0OC42ODU3MTVIOTUwLjg1NzE0M3ogbTAgMjQ4Ljc1ODg1N0g2OTQuODU3MTQzdjI0OC42ODU3MTRIOTUwLjg1NzE0M3oiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsZWdlbmQtc21hbGwiIHVuaWNvZGU9IiYjNTkwNzI7IiBkPSJNMjczLjM0Njg1MSAxODUuNTY0Mjc5Yy0xOS4wMTcwNjEgMC0zOC4xMDcyNjUtMTkuMTYzMzQ2LTM4LjEwNzI2NS0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xMDcyNjUtMzguMzk5ODM2IDM4LjEwNzI2NSAxOS4yMzY0ODkgMzguMTA3MjY2IDM4LjM5OTgzNmMwIDI1LjU5OTg5LTEyLjY1MzY2IDM4LjM5OTgzNS0zOC4xMDcyNjYgMzguMzk5ODM1eiBtMCA0NzMuNTk3OTdjLTE5LjAxNzA2MSAwLTM4LjEwNzI2NS0xOS4xNjMzNDYtMzguMTA3MjY1LTM4LjM5OTgzNXMxOS4wMTcwNjEtMzguMzk5ODM1IDM4LjEwNzI2NS0zOC4zOTk4MzYgMzguMTA3MjY1IDE5LjIzNjQ4OSAzOC4xMDcyNjYgMzguMzk5ODM2LTEyLjY1MzY2IDM4LjM5OTgzNS0zOC4xMDcyNjYgMzguMzk5ODM1eiBtMC0yMzYuNzYyNDE0Yy0xOS4wMTcwNjEgMC0zOC4xMDcyNjUtMTkuMjM2NDg5LTM4LjEwNzI2NS0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xMDcyNjUtMzguMzk5ODM1IDM4LjEwNzI2NSAxOS4xNjMzNDYgMzguMTA3MjY2IDM4LjM5OTgzNS0xMi42NTM2NiAzOC4zOTk4MzUtMzguMTA3MjY2IDM4LjM5OTgzNXpNODU4LjEyMTQ4OCA4OTUuOTk3ODA2aC02OTkuMjQyNzE3QTE1Ny45MTQ3NTIgMTU3LjkxNDc1MiAwIDAgMSAwLjAxMzE2NiA3MzUuOTYxOTJWMjUuNjAxNTM2QzAuMDEzMTY2LTU3LjYzNDY3OSA2OS45Mzc0MzctMTI3Ljk5NzgwNiAxNTguOTUxOTEzLTEyNy45OTc4MDZoNzA1LjUzMjk3NmExNTcuOTE0NzUyIDE1Ny45MTQ3NTIgMCAwIDEgMTU4LjkzODc0OCAxNTkuOTYyNzQzVjczNS45NjE5MkMxMDE3LjA2MDIzNiA4MjUuNTYxNTM2IDk0Ny4xMzU5NjQgODk1Ljk5NzgwNiA4NTguMTIxNDg4IDg5NS45OTc4MDZ6IG04Mi42NTEwNzQtODY0LjAzMjg2OWE3Ny41MzEwOTYgNzcuNTMxMDk2IDAgMCAwLTc2LjI4NzY3My03Ni43OTk2NzFIMTU4Ljk1MTkxM2MtNDQuNTQzODA5IDAtNzYuMjg3NjczIDM4LjM5OTgzNS03Ni4yODc2NzMgNzYuNzk5NjcxVjczNi4wMzUwNjNjMCA0NC43NjMyMzcgMzguMTA3MjY1IDc2Ljc5OTY3MSA3Ni4yODc2NzMgNzYuNzk5NjcxaDcwNS41MzI5NzZjNDQuNTQzODA5IDAgNzYuMjg3NjczLTM4LjM5OTgzNSA3Ni4yODc2NzMtNzYuNzk5NjcxeiBtLTE5Ny4wNDYwMTIgNjI3LjE5NzMxMkg0MzIuMjg1NTk5Yy0yNS40NTM2MDUgMC0zOC4xODA0MDgtMTkuMTYzMzQ2LTM4LjE4MDQwOC0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xODA0MDgtMzguMzk5ODM2aDMxMS40NDA5NTFjMTkuMDE3MDYxIDAgMzguMTA3MjY1IDE5LjIzNjQ4OSAzOC4xMDcyNjUgMzguMzk5ODM2cy0xOS4wMTcwNjEgMzguMzk5ODM1LTM4LjEwNzI2NSAzOC4zOTk4MzV6IG0wLTIzNi43NjI0MTRINDMyLjI4NTU5OWMtMjUuNDUzNjA1IDAtMzguMTgwNDA4LTE5LjIzNjQ4OS0zOC4xODA0MDgtMzguMzk5ODM1czE5LjAxNzA2MS0zOC4zOTk4MzUgMzguMTgwNDA4LTM4LjM5OTgzNWgzMTEuNDQwOTUxYzE5LjAxNzA2MSAwIDM4LjEwNzI2NSAxOS4xNjMzNDYgMzguMTA3MjY1IDM4LjM5OTgzNXMtMTkuMDE3MDYxIDM4LjM5OTgzNS0zOC4xMDcyNjUgMzguMzk5ODM1eiBtMC0yMzYuODM1NTU2SDQzMi4yODU1OTljLTE5LjA5MDIwNCAwLTM4LjE4MDQwOC0xOS4xNjMzNDYtMzguMTgwNDA4LTM4LjM5OTgzNXMxOS4wMTcwNjEtMzguMzk5ODM1IDM4LjE4MDQwOC0zOC4zOTk4MzZoMzExLjQ0MDk1MWMxOS4wMTcwNjEgMCAzOC4xMDcyNjUgMTkuMjM2NDg5IDM4LjEwNzI2NSAzOC4zOTk4MzYgMCAyNS41OTk4OS0xOS4wMTcwNjEgMzguMzk5ODM1LTM4LjEwNzI2NSAzOC4zOTk4MzV6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY2xvc2UtbGVnZW5kIiB1bmljb2RlPSImIzU5MDczOyIgZD0iTTY0My4xNDUxNDMgNTg2Ljg5ODI4Nkw1MTIgNDU1LjY4IDM4MC44NTQ4NTcgNTg2Ljg5ODI4NmwtNzEuNjgtNzEuNzUzMTQzTDQ0MC4xNzM3MTQgMzg0IDMwOS4xMDE3MTQgMjUyLjg1NDg1N2w3MS43NTMxNDMtNzEuNjhMNTEyIDMxMi4xNzM3MTRsMTMxLjE0NTE0My0xMzEuMTQ1MTQzIDcxLjY4IDcxLjc1MzE0M0w1ODMuODI2Mjg2IDM4NGwxMzEuMTQ1MTQzIDEzMS4xNDUxNDN6TTUxMiA4OTEuMTcyNTcxQTUwNy4wOTk0MjkgNTA3LjA5OTQyOSAwIDAgMSA0Ljc1NDI4NiAzODQgNTA3LjA5OTQyOSA1MDcuMDk5NDI5IDAgMCAxIDUxMi0xMjMuMjQ1NzE0IDUwNy4wOTk0MjkgNTA3LjA5OTQyOSAwIDAgMSAxMDE5LjI0NTcxNCAzODQgNTA3LjA5OTQyOSA1MDcuMDk5NDI5IDAgMCAxIDUxMiA4OTEuMjQ1NzE0eiBtMC05MTIuOTY5MTQyQTQwNi4zMDg1NzEgNDA2LjMwODU3MSAwIDAgMCAxMDYuMjAzNDI5IDM4NCA0MDYuMzA4NTcxIDQwNi4zMDg1NzEgMCAwIDAgNTEyIDc4OS43OTY1NzEgNDA2LjMwODU3MSA0MDYuMzA4NTcxIDAgMCAwIDkxNy43OTY1NzEgMzg0IDQwNi4zMDg1NzEgNDA2LjMwODU3MSAwIDAgMCA1MTItMjEuNzk2NTcxeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZvbnQtY29sb3IiIHVuaWNvZGU9IiYjNTkwNzQ7IiBkPSJNNDk1Ljg3MiA4MzJMMjQ0LjIyNCAxNjBoMTE5LjY4bDUyLjIyNCAxNTYuOGgyNTUuNzQ0bDU2LjMyLTE1Ni44aDExOS42OEw1OTYuMjg4IDgzMkg0OTUuODcyek01NDQgNjg5LjE1Mmw5Mi4xNi0yNzguNTI4SDQ0Ny43NDRMNTQ0IDY4OS4yMTZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYm9sZCIgdW5pY29kZT0iJiM1OTA3NTsiIGQ9Ik0zODQgMzk3LjgyNGgyMDguODk2YzMwLjcyIDAgNTYuMzIgOC43MDQgNzYuOCAyNi4xMTIgMjAuNDggMTcuNDA4IDMwLjcyIDQyLjQ5NiAzMC43MiA3NS4yNjQgMCAzNi44NjQtOS4yMTYgNjIuNzg0LTI3LjY0OCA3Ny44MjQtMTguNDMyIDE1LjA0LTQ1LjA1NiAyMi41MjgtNzkuODcyIDIyLjUyOEgzODR2LTIwMS43Mjh6TTI1NiA3MDRoMzU1LjMyOGM2NS41MzYgMCAxMTguMDgtMTUuMDQgMTU3LjY5Ni00NS4wNTYgMzkuNjE2LTMwLjA4IDU5LjM5Mi03NS40NTYgNTkuMzkyLTEzNi4xOTIgMC0zNi44NjQtOS4wMjQtNjguNDgtMjcuMTM2LTk0LjcyLTE4LjExMi0yNi4yNC00My44NC00Ni41OTItNzcuMzEyLTYwLjkyOHYtMi4wNDhjNDUuMDU2LTkuNiA3OS4xNjgtMzAuOTEyIDEwMi40LTY0czM0LjgxNi03NC41NiAzNC44MTYtMTI0LjQxNmMwLTI4LjY3Mi01LjEyLTU1LjQ4OC0xNS4zNi04MC4zODQtMTAuMjQtMjQuOTYtMjYuMjQtNDYuNC00OC4xMjgtNjQuNTEyLTIxLjgyNC0xOC4xMTItNDkuODU2LTMyLjQ0OC04My45NjgtNDMuMDA4LTM0LjExMi0xMC41Ni03NC43NTItMTUuODcyLTEyMS44NTYtMTUuODcySDI1NlY3MDR6IG0xMjgtNjI2LjY4OGgyMjYuMzA0YzM4LjkxMiAwIDY5LjEyIDEwLjA0OCA5MC42MjQgMzAuMjA4IDIxLjUwNCAyMC4xNiAzMi4yNTYgNDguNjQgMzIuMjU2IDg1LjUwNCAwIDM2LjE2LTEwLjc1MiA2NC0zMi4yNTYgODMuNDU2LTIxLjUwNCAxOS40NTYtNTEuNzEyIDI5LjE4NC05MC42MjQgMjkuMTg0SDM4NHYtMjI4LjM1MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJpdGFsaWNzIiB1bmljb2RlPSImIzU5MDc2OyIgZD0iTTYxNi41MTIgNTc2bC03OS4wNC00NDhINzA0di0xMjhIMjU2djEyOGgxNTEuNDg4bDc5LjA0IDQ0OEgzMjBWNzA0aDQ0OHYtMTI4SDYxNi41MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZm9udCIgdW5pY29kZT0iJiM1OTA3NzsiIGQ9Ik04NzUuMjY0IDBoLTEwNi42ODhhMjAuNjA4IDIwLjYwOCAwIDAgMC0xOS4zMjggMTMuNTY4bC03Ny40NCAyMDYuMjA4SDQwNC40OGwtNzIuODMyLTIwNS43NmEyMC43MzYgMjAuNzM2IDAgMCAwLTE5LjQ1Ni0xNC4wMTZIMjEyLjczNmEyMC44IDIwLjggMCAwIDAtMTcuMTUyIDkuMjE2IDIxLjY5NiAyMS42OTYgMCAwIDAtMi4xNzYgMTkuNjQ4TDQ2NS4yMTYgNzU0LjQzMkEyMC42NzIgMjAuNjcyIDAgMCAwIDQ4NC42MDggNzY4aDEwMC45MjhjOC4zMiAwIDE2LTUuMTg0IDE5LjItMTMuMTg0bDI4OS43MjgtNzI1LjUwNGEyMS40NCAyMS40NCAwIDAgMC0xLjk4NC0xOS44NCAyMC42NzIgMjAuNjcyIDAgMCAwLTE3LjIxNi05LjQ3MnpNNDQ2Ljg0OCAzNDAuNDE2aDE4MC4yMjRsLTYzLjM2IDE3Mi4yMjRjLTEwLjU2IDI4LjgtMTkuOTY4IDU1LjI5Ni0yOC4wOTYgNzkuMzYtNi4yNzItMjIuNTI4LTEzLjQ0LTQ0Ljk5Mi0yMS40NC02Ny4zMjhsLTY3LjMyOC0xODQuMzJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ianVzdGlmeS1hbGlnbiIgdW5pY29kZT0iJiM1OTA3ODsiIGQ9Ik0xMjggMzg0VjUxMmg3Njh2LTEyOEgxMjh6IG0wIDE5MlY3MDRoNzY4di0xMjhIMTI4eiBtMC01NzZ2MTI4aDc2OHYtMTI4SDEyOHogbTc2OCAzMjB2LTEyOEgxMjhWMzIwaDc2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJtaWRkbGUtYWxpZ25tZW4iIHVuaWNvZGU9IiYjNTkwNzk7IiBkPSJNMjU2IDM4NFY1MTJoNTEydi0xMjhIMjU2ek0xMjggNTc2VjcwNGg3Njh2LTEyOEgxMjh6IG0wLTU3NnYxMjhoNzY4di0xMjhIMTI4eiBtNjQwIDMyMHYtMTI4SDI1NlYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZvbnQtc2l6ZSIgdW5pY29kZT0iJiM1OTA4MDsiIGQ9Ik0yNjEuNTA0IDI5My42MzJsMTAzLjY4IDM0Mi44NDggMTA0LjA2NC0zNDIuODQ4SDI2MS41MDRNNDU4LjY4OCA3NjhoLTE1OC4wOEw2NCAwaDEwOS42MzJsNTUuOTM2IDE4Mi43ODRINTAzLjY4TDU2MC42NCAwaDEzNy4yOEw0NTguNjg4IDc2OG0yNDguNTc2LTU5MC4wOGw2MC4xNiAxNjMuODQgNjAuMjI0LTE2My44NGgtMTIwLjM4NG0xMTQuMzA0IDI0MC4xMjhoLTkxLjU4NGwtNzMuNi0yMDMuNDU2IDMxLjg3Mi0xMDIuNDY0IDAuNTEyIDEuNDcyaDE1OC43ODRsMzMuMDI0LTEwNS43OTJIOTYwbC0xMzguNDMyIDQxMC4yNCIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InN0cmlrZW91dCIgdW5pY29kZT0iJiM1OTA4MTsiIGQ9Ik0zMzIuNDggMzg0QzI4NS41MDQgNDI0LjE5MiAyNTYgNDgwLjQ0OCAyNTYgNTQ0IDI1NiA2NzAuNTI4IDM3Mi45MjggNzY4IDUxMiA3NjhzMjU2LTk3LjQ3MiAyNTYtMjI0aC0xMjhDNjQwIDU5NC4xNzYgNTg0Ljk2IDY0MCA1MTIgNjQwYy03Mi45NiAwLTEyOC00NS44MjQtMTI4LTk2UzQzOS4wNCA0NDggNTEyIDQ0OGM2OS4yNDggMCAxMzIuOTI4LTI0LjEyOCAxNzkuNTItNjRIODMydi02NGgtODguMzJjMTUuNTUyLTI4Ljg2NCAyNC4zMi02MS4zNzYgMjQuMzItOTYgMC0xMjYuNTI4LTExNi45MjgtMjI0LTI1Ni0yMjRzLTI1NiA5Ny40NzItMjU2IDIyNGgxMjhjMC01MC4xNzYgNTUuMDQtOTYgMTI4LTk2IDcyLjk2IDAgMTI4IDQ1LjgyNCAxMjggOTZTNTg0Ljk2IDMyMCA1MTIgMzIwSDI1NlYzODRoNzYuNDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idGV4dC1sYXllciIgdW5pY29kZT0iJiM1OTA4MjsiIGQ9Ik01NzYgNjQwdi03NjhINDQ4VjY0MEg2NFY4MzJoODk2di0xOTJINTc2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJpZ2h0LWFsaWdubWVudCIgdW5pY29kZT0iJiM1OTA4MzsiIGQ9Ik0zODQgNTc2VjcwNGg1MTJ2LTEyOEgzODR6IG0xMjgtMTkyVjUxMmgzODR2LTEyOEg1MTJ6IG0tMzg0LTM4NHYxMjhoNzY4di0xMjhIMTI4eiBtNzY4IDMyMHYtMTI4SDM4NFYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxlZnQtYWxpZ25tZW50IiB1bmljb2RlPSImIzU5MDg0OyIgZD0iTTEyOCA1NzZWNzA0aDUxMnYtMTI4SDEyOHogbTAtMTkyVjUxMmgzODR2LTEyOEgxMjh6IG0wLTM4NHYxMjhoNzY4di0xMjhIMTI4eiBtNTEyIDMyMHYtMTI4SDEyOFYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InRyYW5zcGFyZW50LWJhY2tncm91IiB1bmljb2RlPSImIzU5MDg1OyIgZD0iTTIyMC44IDgzMkw2NCA2NzUuMnYtNzEuMTY4TDI5MS45NjggODMySDIyMC44NjR6IG0xOTMuMzQ0IDBMNjQgNDgxLjg1NnYtNzEuMTY4TDQ4NS4zMTIgODMySDQxNC4wOHogbTE5My4yOCAwTDY0IDI4OC41MTJ2LTcxLjEwNEw2NzguNTkyIDgzMkg2MDcuNDg4eiBtMTkzLjM0NCAwTDY0IDk1LjIzMnYtNzEuMTY4TDg3MS45MzYgODMyaC03MS4xNjh6TTk2MCA3OTUuMzkyYTQ0LjggNDQuOCAwIDAgMS05Ljc5Mi03LjI5NkwxMDAuNjcyLTYxLjQ0Yy0wLjgzMi0wLjc2OC0xLjIxNi0xLjcyOC0xLjkyLTIuNTZoNzAuNDY0TDk2MCA3MjYuNzg0Vjc5NS4zOTJ6IG0wLTE5MC43ODRMMjkxLjM5Mi02NGg3MS4xNjhMOTYwIDUzMy40NFY2MDQuNjA4eiBtMC0xOTMuMjhMNDg0LjczNi02NGg3MS4xMDRMOTYwIDM0MC4xNlY0MTEuMjY0eiBtMC0xOTMuMzQ0TDY3OC4wMTYtNjRoNzEuMTY4TDk2MCAxNDYuODE2djcxLjE2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJ1bmRlcmxpbmUiIHVuaWNvZGU9IiYjNTkwODY7IiBkPSJNNjQwIDcwNGgxMjh2LTM1OC40YzAtMTE5LjI5Ni05Mi4xNi0yMTcuNi0yMDgtMjE3LjZoLTk2QzM0OC4xNiAxMjggMjU2IDIyNi4zMDQgMjU2IDM0NS42VjcwNGgxMjh2LTM1OC40YzAtNTAuMzY4IDM2LjgtODkuNiA4MC04OS42aDk2QzYwMy4yIDI1NiA2NDAgMjk1LjIzMiA2NDAgMzQ1LjZWNzA0ek0yNTYgNjRoNTEydi02NEgyNTZ2NjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icXVlcnkiIHVuaWNvZGU9IiYjNTkwODc7IiBkPSJNNTEyIDg5NC45NzZDMjI5LjIyOTcxNCA4OTQuOTc2IDAgNjY2LjE4NTE0MyAwIDM4NGMwLTI4Mi4xODUxNDMgMjI5LjIyOTcxNC01MTAuOTc2IDUxMi01MTAuOTc2UzEwMjQgMTAxLjgxNDg1NyAxMDI0IDM4NEMxMDI0IDY2Ni4xODUxNDMgNzk0Ljc3MDI4NiA4OTQuOTc2IDUxMiA4OTQuOTc2eiBtNDkuNzM3MTQzLTgwNS44MTQ4NTdhMjUuNiAyNS42IDAgMCAwLTI1LjYtMjUuNkg0NTkuMzM3MTQzYTI1LjYgMjUuNiAwIDAgMC0yNS42IDI1LjZWMTY1LjgxNDg1N2EyNS42IDI1LjYgMCAwIDAgMjUuNiAyNS41MjY4NTdoNzYuOGEyNS42IDI1LjYgMCAwIDAgMjUuNi0yNS42di03Ni41ODA1NzF6IG0xMjYuODI5NzE0IDM1MS42NzA4NTdjLTEwLjI0LTE0LjYyODU3MS0zMy42NDU3MTQtMzMuMjgtNjIuOTAyODU3LTU2LjAyNzQyOWwtMzIuNDAyMjg2LTIyLjM4MTcxNGMtMTUuNzI1NzE0LTEyLjE0MTcxNC0yOS42OTYtMjYuMzMxNDI5LTM0LjgxNi00Mi41NjkxNDNhMTMwLjE5NDI4NiAxMzAuMTk0Mjg2IDAgMCAxLTMuOTQ5NzE0LTI0LjQyOTcxNGMtMC41MTItNC45NzM3MTQtNC45MDA1NzEtMTUuMDY3NDI5LTE1LjI4Njg1Ny0xNS4wNjc0MjloLTgzLjM4Mjg1N2MtMTMuNDU4Mjg2IDAtMTUuODcyIDEwLjYwNTcxNC0xNS42NTI1NzIgMTUuNzk4ODU4IDEuNDYyODU3IDMzLjkzODI4NiA0LjYwOCA2NC4wNzMxNDMgMTguNDMyIDgwLjMxMDg1NyAyOC4wODY4NTcgMzIuODQxMTQzIDkxLjk0MDU3MSA3My43MjggOTEuOTQwNTcyIDczLjcyOCA5LjcyOCA3LjMxNDI4NiAxNy41NTQyODYgMTUuMjg2ODU3IDIzLjU1MiAyMy45MTc3MTQgMTAuODI1MTQzIDE0LjkyMTE0MyAxOS43NDg1NzEgMzEuMjMyIDE5Ljc0ODU3MSA0OS4xNTIgMCAyMC40OC01Ljk5NzcxNCAzOS4yNzc3MTQtMTguMDY2Mjg2IDU2LjE3MzcxNC0xMi4wNjg1NzEgMTYuODk2LTM0LjA4NDU3MSAyNS4zODA1NzEtNjYuMDQ4IDI1LjM4MDU3Mi0zMS40NTE0MjkgMC01My42ODY4NTctMTAuNDU5NDI5LTY2Ljg1MjU3MS0zMS4yMzItOS43MjgtMTUuMzYtMTUuNzk4ODU3LTI5LjU0OTcxNC0xOC4yODU3MTQtNDQuOTA5NzE1LTAuOTUwODU3LTUuNDg1NzE0LTQuMzg4NTcxLTE2Ljk2OTE0My0xNi4wOTE0MjktMTYuOTY5MTQySDMyNy4xNjhjLTE3LjI2MTcxNCAwLTIxLjA2NTE0MyAxMS4xOTA4NTctMjAuNjI2Mjg2IDE2LjYwMzQyOCA2LjI5MDI4NiA2OC4wMjI4NTcgMzIuOTE0Mjg2IDExNC40Njg1NzEgODAuMDE4Mjg2IDE0NC4zMTA4NTcgMzEuOTYzNDI5IDIwLjQ4IDcxLjM4NzQyOSAzMC44NjYyODYgMTE4LjEyNTcxNCAzMC44NjYyODYgNjEuMzY2ODU3IDAgMTEyLjM0NzQyOS0xNC42Mjg1NzEgMTUyLjk0MTcxNS00My44ODU3MTQgNDAuNTk0Mjg2LTI5LjI1NzE0MyA2MC45MjgtNzIuNDg0NTcxIDYwLjkyOC0xMjkuOTAxNzE1IDAtMzUuMTA4NTcxLTEyLjQzNDI4Ni02NC44MDQ1NzEtMjkuOTg4NTcyLTg4Ljg2ODU3MXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKCgogIDwvZm9udD4KPC9kZWZzPjwvc3ZnPgo=#supermapol-icons) format('svg'); /* iOS 4.1- */ +} + +[class^="supermapol-icons-"], [class*=" supermapol-icons-"] { + font-family:"supermapol-icons" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.supermapol-icons-map:before { content: ""; } + +.supermapol-icons-more:before { content: "\e61d"; } + +.supermapol-icons-delete:before { content: "\e61f"; } + +.supermapol-icons-visible:before { content: "\e620"; } + +.supermapol-icons-zoom-to:before { content: "\e621"; } + +.supermapol-icons-output:before { content: "\e622"; } + +.supermapol-icons-opacity:before { content: "\e625"; } + +.supermapol-icons-layer-info:before { content: "\e627"; } + +.supermapol-icons-save:before { content: "\e628"; } + +.supermapol-icons-layer-style:before { content: "\e629"; } + +.supermapol-icons-line-layer:before { content: "\e62a"; } + +.supermapol-icons-skin:before { content: "\e62b"; } + +.supermapol-icons-marker-layer:before { content: "\e62c"; } + +.supermapol-icons-point-layer:before { content: "\e62d"; } + +.supermapol-icons-polygon-layer:before { content: "\e62e"; } + +.supermapol-icons-invisible:before { content: "\e62f"; } + +.supermapol-icons-search:before { content: "\e630"; } + +.supermapol-icons-edit:before { content: "\e633"; } + +.supermapol-icons-layers:before { content: "\e634"; } + +.supermapol-icons-baselayer:before { content: "\e635"; } + +.supermapol-icons-setting:before { content: "\e636"; } + +.supermapol-icons-add:before { content: "\e638"; } + +.supermapol-icons-preview:before { content: "\e637"; } + +.supermapol-icons-refresh:before { content: "\e639"; } + +.supermapol-icons-solid-triangle:before { content: "\e63a"; } + +.supermapol-icons-roadnetwork:before { content: "\e63b"; } + +.supermapol-icons-return:before { content: "\e63c"; } + +.supermapol-icons-packup:before { content: "\e63d"; } + +.supermapol-icons-share:before { content: "\e63e"; } + +.supermapol-icons-backhomepage:before { content: "\e659"; } + +.supermapol-icons-MyMaps:before { content: "\e65a"; } + +.supermapol-icons-CreateMap:before { content: "\e65b"; } + +.supermapol-icons-feedback:before { content: "\e65c"; } + +.supermapol-icons-skin1:before { content: "\e65d"; } + +.supermapol-icons-Shape-:before { content: "\e65e"; } + +.supermapol-icons-account:before { content: "\e65f"; } + +.supermapol-icons-Shape-1:before { content: "\e660"; } + +.supermapol-icons-Shape-2:before { content: "\e661"; } + +.supermapol-icons-Shape-3:before { content: "\e662"; } + +.supermapol-icons-Shape-4:before { content: "\e663"; } + +.supermapol-icons-Shape-5:before { content: "\e664"; } + +.supermapol-icons-Shape-6:before { content: "\e665"; } + +.supermapol-icons-Shape-7:before { content: "\e666"; } + +.supermapol-icons-Shape-8:before { content: "\e667"; } + +.supermapol-icons-Shape-9:before { content: "\e668"; } + +.supermapol-icons-Shape-10:before { content: "\e669"; } + +.supermapol-icons-Shape-11:before { content: "\e66a"; } + +.supermapol-icons-Shape-12:before { content: "\e66b"; } + +.supermapol-icons-Shape-13:before { content: "\e66c"; } + +.supermapol-icons-Shape-14:before { content: "\e66d"; } + +.supermapol-icons-Shape-15:before { content: "\e66e"; } + +.supermapol-icons-Shape-16:before { content: "\e66f"; } + +.supermapol-icons-Shape-17:before { content: "\e670"; } + +.supermapol-icons-Shape-18:before { content: "\e671"; } + +.supermapol-icons-Shape-19:before { content: "\e672"; } + +.supermapol-icons-Shape-20:before { content: "\e673"; } + +.supermapol-icons-Shape-21:before { content: "\e674"; } + +.supermapol-icons-Shape-22:before { content: "\e675"; } + +.supermapol-icons-Shape-23:before { content: "\e676"; } + +.supermapol-icons-Shape-24:before { content: "\e677"; } + +.supermapol-icons-Shape-25:before { content: "\e678"; } + +.supermapol-icons-Shape-26:before { content: "\e679"; } + +.supermapol-icons-Shape-27:before { content: "\e67a"; } + +.supermapol-icons-Shape-28:before { content: "\e67b"; } + +.supermapol-icons-Shape-29:before { content: "\e67c"; } + +.supermapol-icons-Shape-30:before { content: "\e67d"; } + +.supermapol-icons-Shape-31:before { content: "\e67e"; } + +.supermapol-icons-Shape-32:before { content: "\e67f"; } + +.supermapol-icons-Shape-33:before { content: "\e680"; } + +.supermapol-icons-Shape-34:before { content: "\e681"; } + +.supermapol-icons-Shape-35:before { content: "\e682"; } + +.supermapol-icons-Shape-36:before { content: "\e683"; } + +.supermapol-icons-Shape-37:before { content: "\e684"; } + +.supermapol-icons-Shape-38:before { content: "\e685"; } + +.supermapol-icons-Shape-39:before { content: "\e686"; } + +.supermapol-icons-Shape-40:before { content: "\e687"; } + +.supermapol-icons-Shape-41:before { content: "\e688"; } + +.supermapol-icons-Shape-42:before { content: "\e689"; } + +.supermapol-icons-Shape-43:before { content: "\e68a"; } + +.supermapol-icons-Shape-44:before { content: "\e68b"; } + +.supermapol-icons-Shape-45:before { content: "\e68c"; } + +.supermapol-icons-Shape-46:before { content: "\e68d"; } + +.supermapol-icons-Shape-47:before { content: "\e68e"; } + +.supermapol-icons-Shape-48:before { content: "\e68f"; } + +.supermapol-icons-Shape-49:before { content: "\e690"; } + +.supermapol-icons-Shape-50:before { content: "\e691"; } + +.supermapol-icons-Shape-51:before { content: "\e692"; } + +.supermapol-icons-Shape-52:before { content: "\e693"; } + +.supermapol-icons-Shape-53:before { content: "\e694"; } + +.supermapol-icons-Shape-54:before { content: "\e695"; } + +.supermapol-icons-Shape-55:before { content: "\e696"; } + +.supermapol-icons-Shape-56:before { content: "\e697"; } + +.supermapol-icons-Shape-57:before { content: "\e698"; } + +.supermapol-icons-Shape-58:before { content: "\e699"; } + +.supermapol-icons-Shape-59:before { content: "\e69a"; } + +.supermapol-icons-Oval:before { content: "\e69b"; } + +.supermapol-icons-Rectangle:before { content: "\e69c"; } + +.supermapol-icons-Star:before { content: "\e69d"; } + +.supermapol-icons-Triangle:before { content: "\e69e"; } + +.supermapol-icons-restoredefault:before { content: "\e6a0"; } + +.supermapol-icons-uploading:before { content: "\e6a1"; } + +.supermapol-icons-error:before { content: "\e69f"; } + +.supermapol-icons-zoomin:before { content: "\e6a2"; } + +.supermapol-icons-zoomout:before { content: "\e6a3"; } + +.supermapol-icons-first:before { content: "\e6a4"; } + +.supermapol-icons-next:before { content: "\e6a5"; } + +.supermapol-icons-last:before { content: "\e6a6"; } + +.supermapol-icons-prev:before { content: "\e6a7"; } + +.supermapol-icons-poi-load:before { content: "\e6a8"; } + +.supermapol-icons-poi-save:before { content: "\e6a9"; } + +.supermapol-icons-fold:before { content: "\e6aa"; } + +.supermapol-icons-label-delete:before { content: "\e6ab"; } + +.supermapol-icons-upload:before { content: "\e6ac"; } + +.supermapol-icons-unfold:before { content: "\e6ad"; } + +.supermapol-icons-close:before { content: "\e6ae"; } + +.supermapol-icons-mark:before { content: "\e6af"; } + +.supermapol-icons-traffic:before { content: "\e6b0"; } + +.supermapol-icons-full-figure:before { content: "\e6b1"; } + +.supermapol-icons-measure:before { content: "\e6b2"; } + +.supermapol-icons-display-list:before { content: "\e6b3"; } + +.supermapol-icons-hide-list:before { content: "\e6b4"; } + +.supermapol-icons-rename:before { content: "\e6b5"; } + +.supermapol-icons-copy:before { content: "\e6b6"; } + +.supermapol-icons-qq-zone:before { content: "\e6b7"; } + +.supermapol-icons-sina-weibo:before { content: "\e6b8"; } + +.supermapol-icons-color-change:before { content: "\e6b9"; } + +.supermapol-icons-creat-custom-map:before { content: "\e6ba"; } + +.supermapol-icons-custom-map:before { content: "\e6bb"; } + +.supermapol-icons-legend-fold:before { content: "\e6bc"; } + +.supermapol-icons-legend-unfold:before { content: "\e6bd"; } + +.supermapol-icons-legend-big:before { content: "\e6be"; } + +.supermapol-icons-attribute:before { content: "\e6bf"; } + +.supermapol-icons-legend-small:before { content: "\e6c0"; } + +.supermapol-icons-close-legend:before { content: "\e6c1"; } + +.supermapol-icons-font-color:before { content: "\e6c2"; } + +.supermapol-icons-bold:before { content: "\e6c3"; } + +.supermapol-icons-italics:before { content: "\e6c4"; } + +.supermapol-icons-font:before { content: "\e6c5"; } + +.supermapol-icons-justify-align:before { content: "\e6c6"; } + +.supermapol-icons-middle-alignmen:before { content: "\e6c7"; } + +.supermapol-icons-font-size:before { content: "\e6c8"; } + +.supermapol-icons-strikeout:before { content: "\e6c9"; } + +.supermapol-icons-text-layer:before { content: "\e6ca"; } + +.supermapol-icons-right-alignment:before { content: "\e6cb"; } + +.supermapol-icons-left-alignment:before { content: "\e6cc"; } + +.supermapol-icons-transparent-backgrou:before { content: "\e6cd"; } + +.supermapol-icons-underline:before { content: "\e6ce"; } + +.supermapol-icons-query:before { content: "\e6cf"; } + + +@font-face { + font-family: 'supermapol-icons'; + src: url(data:application/vnd.ms-fontobject;base64,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); + src: url(data:application/vnd.ms-fontobject;base64,qFEAAOBQAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA5WrGjQAAAAAAAAAAAAAAAAAAAAAAACAAcwB1AHAAZQByAG0AYQBwAG8AbAAtAGkAYwBvAG4AcwAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADMALgA4AAAAIABzAHUAcABlAHIAbQBhAHAAbwBsAC0AaQBjAG8AbgBzAAAAAAAAAQAAAAsAgAADADBPUy8yDxIGxQAAALwAAABgY21hcBdW0xIAAAEcAAAAVGdhc3AAAAAQAAABcAAAAAhnbHlmdeYTjwAAAXgAAEl0aGVhZA/ijoIAAErsAAAANmhoZWEJSgXnAABLJAAAACRobXR4QQVEjAAAS0gAAAJAbG9jYeYq03gAAE2IAAABIm1heHAAogD4AABOrAAAACBuYW1l+uYTjQAATswAAAHycG9zdAADAAAAAFDAAAAAIAADBBABkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOmLA8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAA4AAAACgAIAAIAAgABACDpi//9//8AAAAAACDpAP/9//8AAf/jFwQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAMAhgBNA3oDMwAOABoAHgAAASEiBhURFBYzITI2NREnAyImNTQ2MzIWFRQGEyE1IQLO/gwjMTEjAkwjMazPNEpKNDVJSUr+XAGkAzMwIv2+IjAwIgHsqP1pSTMzSUkzM0kBnaUAAAAABACJAEkDdwM3ABQARQBZAHgAAAEiDgIVFB4CMzI+AjU0LgIjAzQmNTQmNTQ2Jy4BJz4DNw4BBw4BBw4BFRQWNzYyFx4BBw4BBw4BFQYWIyImNTEXIiYnPgE3MjY3PgE3NhYXDgEjMTcuATc+AScuASMuAScmNicmBic0NjceAxUUBgcxAgBOiGY7O2aITk6IZjs7ZohOvwszGgUEOA8NLDlEJgUWCBETCQorFwcIIgsMbxsJOgoCCAEJDAwvvBoyFw4LDQ4bEA8wFxQ9CyZYMPwICwgHBQIBExYVIA0aVBoIOAYHBSpHMx0fGwM3O2aITk6IZjs7ZohOTohmO/3lCTQZGhQiHyQPDwYCKEQ0IgYLDAkSCBESKwwNFgIDBQUkVRsSLAcqCQ5MQgmPBwcGDQEHBAITAgEIEBYXiAcgEhNFERE7ARMcOy0gCSY9BQwHDzlMXDM1XycAAAAAAgDNAAQDMwN8ABQAIAAAASIOAhUUHgIxMD4CNTQuAiMTFAYjIiY1NDYzMhYCAEBwUzBgc2Bgc2AwU3BAq2RHR2RkR0dkA3w0V3M/S8WxenqxxUs/c1c0/s1HZGRHRmRkAAAAAAEAagAsA5MDVQAPAAABISIGFREUFjMhMjY1ETQmAyD9vjBERDACQjBDQwNVRDD9vjBDQzACQjBEAAAAAAIAbAAsA5UDVQAPABUAAAEhIgYVERQWMyEyNjURNCYBJzcXJRcDIf2/MEREMAJBMERE/nzsN7UBGDsDVUQw/b4wQ0MwAkIwRP2m7TeT/TsAAQBAACsDdQNVACAAAAEjNTQmIyIGHQEjIgYVFBY7ARUUFjMyNj0BMzI2NTQmIwMT5jAiIjHmKTk5KeYxIiIw5ik5OSkCE+EoOTko4TEiIjHhKDk5KOExIiIxAAABAIgARgN4AzYACwAAAScJAQcJARcJATcBA3hU/tz+3FQBJf7bVAEkASRU/twC4lT+2wElVP7c/ttTAST+3FMBJQAAAAMAgABBA4ADQAALAFQAYAAAASIGFRQWMzI2NTQmBTUjLgEnNycHLgEnNycHLgEnNSMVDgEHJwcXDgEHJwcXDgEHIxUzHgEXBxc3HgEXBxc3HgEXFTM1PgE3FzcnPgE3FzcnPgE3MwUiJjU0NjMyFhUUBgIAHysrHx8rKwFhOQMLCDItMg0eEB1MHhMoFVgUJxIhTCEQGww6LTsHCgNERAMKBzstOgwbECFMIRInFFgVKBMeTB0QHg0yLTIICwM5/oBQcHBQT3FxAgorHh8rKx8eK3ZZFSgUHE0dEB0MMy01CAoCPj8DCwg4LTgNHBAiTSISJRRZEyYSIkwhEBwMOSw3CAoDQD4CCgg0LDMMHREdTB0TKBWTcFBPcHBPT3EAAAUAhQBDA3gDNgAGAAwAEwAZACUAAAEjFTMVMxEDIxUhESMBETM1MzUjESMRITUjASM1IxUjFTMVMzUzAzn8/D8//AE7P/1MP/z8PwE7/AH3fn1+fn1+AzY/+wE6/Uw/ATwBt/7G+z/+Sf7EPwF6e3t9e3sAAwBuAGYDkgMbABoAUwBYAAABISIGFRE6ATMRIREjHgExDgEHMzI2NRE0JiMDMCYnJiIjDgEHIy4BJzMwNjU8ATEwJiMqASsBKgEjKgEjKgExFTAeAjMwPgI3PgE3MCYnLgEnBTMRIxEDZv3uEhoJFg0CEjgGCAMFAjQSGhoSeA8EBQMCDSIbtAkPBmQcBRcHSC0WDxwNDhoKEBI+VVkZNlFgKwIGAwkHBhAJ/YBjYwMbGhH+uwED/pMNFAMFAhkSAa8RGv4bDAEBAykTBxEJBBARJxztExYSARQtLAMGAxYODhsJ0AFF/rsAAAAEAD0AowPIAt0ADAAYACYANAAAATI2NTQmIyIGFRQWMyEyNjU0JiMiBhUUFhciDgIxFSE1MC4CIyUqASMzMBYfATM1MCYnAqczSUkzM0lJM/62M0lJMzNJSTNccT4VAkEUPXFfASYCAgIBRgcF+F/mAelHMzNHRzMzR0czM0dHMzNHWicvJ29vJy8nCEAwhG9+BwAABgCwAD8DUANAAA4AEgAeACMAKQAuAAABNTQmKwEiBh0BIxUhNSMrATUzBREUFjMhMjY1ESEVBTUzESMnNTMRIzUjNTMRIwJgHBRgFBzwAqDwMGBg/rA4KAGAKDj9wAGAYGCQYGCQYGAC4DAUHBwUMDAwMMD+Tyg4OCgB4TDxwf5/wMH+f8DB/n8AAAABAM8ASALmAzEABgAACQEzESERMwHb/vSLAQKKAzH+nv55AYcAAAAAAwB/AEADfwNBABQAIQA+AAABDgMXHgM3PgMnLgMHFzIWFRQGIyImNzQ2MwMiJj8BNjQjIgYHJz4BMzIWDwEGFjMyNjcXDgEjAfpPi2c7AQE/aY1PUItnOgEBPmqMUCsdFSUhGxsBIidkFBYOHwQEBioPDjFjGBQICiMFAwQGIxMPL1sUA0EBP2mNUE+LZzsBAT9pjVBPi2c7AYAdFBgmGhcUKv4PIjZ+Dw0RChYoLiwlhBIODw8UMCgAAAACAIUAZAN1AzUABAALAAA3ITUhFQkBNwkBFwGyAsH9PwFSAR5T/o/+gVMBLGReXgIr/uJTAXH+gVQBLQACAJoAUANVA0IAJwAzAAAlJzgBMSc+ATU0LgIjIg4CFRQeAjMyNjcXMBQxMxcWMj8BNjQnJSImNTQ2MzIWFRQGA1V/FBUXL1BtPj5sUS8vUWw+IDscPAFeEjERKxER/m9KaWlKSmlp04QUJFEtQHFUMDBUcUBAcVQxDgw+AWISEiwSMxKAbU1NbGxNTW0AAAABAX8BQAJ/AkAAAgAAATMRAX//AUABAAABAGQBbwOZAhEADQAAASEiBhUUFjMhMjY1NCYDN/2PKDo6KAJxKTk5AhEvIiIvLyIiLwAAAwCUAD0DbgNDAAQACwASAAABJQ0BJQElBwUlJwUVJQcFJScFA27+k/6TAW0Bbf6T/r4rAW0BbSz+v/6+KwFtAW0s/r8CSvn5+vr+ztQs+vot1YrVLfn5LtYAAAABAIgARwN4AzcAIAAAASERNCYjIgYVESEiBhUUFjMhERQWMzI2NREhMjY1NCYjA1H+8CYbGyb+8BsMDBsBECYbGyYBEBsMDBsB/wERGwwMG/7vJhobJv7vGgwMGgERJhsaJgAAAgBrAH4DjgMeACUAMgAAATAGBzAOAgcmBjEGFgcOATEXMDY3MjYxMDYnPgMxPgMjARQGMTAeATY3JzAGFQOOOGkwSVUlIR0eBQYQE4MLERgjFgkfRDgkESkjFQT9YINXeoIre4ADHg9OKDxHHwcdGSAFDQ+EERUcMwkmUUMsFT46Kv3KXA4nBj1jeiZdAAAAAwBAAFkDwAMAAA0AGAAsAAABNxcBJzcuATEwPgIXCQEuASMiBhUUFhclHgEXDgMnNzIWMzI2NTQmNTcCll9a/bRbWFpmWZ/bg/7CAQUVLxlPcQwMAdkjRyVKjoV7ODsFCwVPcQFyAqJeWv2zW1c3eG9wPDP+wQEFDAxwUBkvFeQcRitUaDcKCjoBcFAFCwVyAAAAAAEAuAAnAv0DUQAGAAAlATMRIREzAdv+3ZcBGJYnAYEBqf5XAAMAuwBdA0UDIgAaACYAMwAAASYGBw4BFwEmBgcGFhcWNjc+AScBFjY3NiYnAQ4BJy4BNz4BFx4BAQ4BJy4BNz4BFx4BBwM5K3MmIgId/vsqYyEmBysrcyYiAx4BBipiISYHK/4gBCUXFxsEBCYWFxsBtwQmFhcbBAQlFxcbBAMiJwgrJmMn/tgYDyYrcyYmBysmYycBKBgPJitzJv2aFxsEBCUXFxsEBCYB3hYbBAMmFxYbBAMmFwADAIoASgNoAygAAwAUABkAAD8BJwcBJyYiBwEOAR8BFjY3ATY0JwUnNxcHisB3SQLeZQ4nDv5qDjkOfQ5JDgGVDg7+6iKrIapKSHe/AnhmDg7+ag5JDn0OOg4BlQ4nDs4iqySpAAAAAAIAgABCA30DPgAMABoAAAEyNjU0JiMiBhUUFjMXIg4CMRUhNTAuAiMB/E5ubk5Obm5OAnqWUhwC/RpRln4Bw29PTm9vTk9vZjU/NXJyNT81AAAAAAEAzABGAuoDMwALAAAlITUzAzMRIREzAzMC6v3i4OCMAQWM4OFGPwEjAYv+df7dAAEA0QBHAu8DNQALAAABIRUzAzMRIREzAzMC7/3i4eCMAQWL3+ADNUD+3f51AYsBIwAAAAACAKsAawNVAxUABAAJAAATIRUhNQUzESMRqwKq/VYBEYiIAxWIiIj93gIiAAQAgABCA4ADQAARAB0AMgBGAAABLgEjIgYHMz4BNwczJx4BFzMnMjY1NCYjIgYVFBYTIg4CFRQeAjMyPgI1NC4CIxEiLgI1ND4CMzIeAhUUDgICzQJFfX1FA0IFDwoB0AIJDQVBwyUzMyUkNDQaUItoPT1oi1BPjGg9PWiMTz5sUS8vUWw+Pm1RLy9RbQEkXH1vahclD4F6DiIU4DMlJDQ0JCUzATw9aItPUItoPDxoi1BPjGc9/VcvUWw+PmxRLy9RbD4+bFEvAAAAAAYAnABeA2QDJwAgACwAPQBqAHsAhwAAATYmJyYGBwYWFx4BFxEOAQcGFhcWNjc2JicuAScRPgE3Aw4BJy4BNz4BFx4BAzEqAScuATc+ARceAQcOAQcBET4BNzYmJyYGBw4BByEVIR4BFx4BFxEOAQcOAQchFSEeARcWNjc2JicuAScDPgEXHgEHDgEHMSImIy4BNxMOAScuATc+ARceAQFeJAcoKWsjJAcoDR8QFCUOJAcoKGskJAcoDh4QFCQPLgQjFRUZBAMjFRUZNAMFAxUZBAMjFRUZAwMcEgIeFCUOJAcoKGwjDA4D/vsBBQQUEA4eEBQlDgwOA/77AQUEFBApayMkBygNHxBNBCMVFRkEAxwSAwUCFhgDZgMjFRYZBAQjFRUZAnAoayQjBikoayQLDgT+9wQVEChrJCMGKShrIwwOBAEJBBQR/kYVGQQDIxUVGQMEIwHGAQMjFhUZBAMjFhIYAf6tAQkEFBEoayQjBikNHxA0FCQPCw4E/vcEFRANHxA0FCQPIwYpKGsjDA4EAZAVGQQDIxYSGAEBAyMW/egVGQQDIxUVGQMEIwAAAAIAgABAA4ADQAACAAYAAAERAQEzESMBkAHw/QCxsQNA/QABgP6AAwAAAAAAAgCJAI0DdwLzAAgADQAAEzcFJREFJQcRFxEFESWJtgE4AQD/AP7ItswBEf7vArs4ODj93kQ4OAIuDP5XNQGpNQAAAAADAM0AjQMzAzcADAAZACUAAAEyNjU0JiMiBhUUFjMFMjY1NCYjIgYVFBYzBTI2NTQmIyIGFRQWAkRHZGRHRmRkRv7vKzw8Kyo8PCoBmio8PCorPDwB4mRHR2NjR0dkzTwrKjw8Kis8iDwqKzw8Kyo8AAAAAAMAgACAA4ADAAADAAcACwAAEyE1IREhNSERFSE1gAMA/QADAP0AAwABgID+gIACAICAAAABAVMBEwKtAm0AAgAAASERAVMBWgETAVoAAAAAAgCJAEkDdwM3AA8AOAAAAQ4BBxEeARchPgE3ES4BJyUhPgEzMhYVFAYHER4BFRQGIyImJyEOASMiJjU0NjcRLgE1NDYzMhYXAVAIIRYWIQgBYAghFhYhCP6gAWALNSEqPCYeHiY8KiE1C/6gCzUhKjwmHh4mPCohNQsCrxYhCP6gCCEWFiEIAWAIIRZEHiY8KiE1C/6gCzUhKjwmHh4mPCohNQsBYAs1ISo8Jh4AAAACAIAAQAOAA0AAAgAGAAAlEQEBETMRAnD+EAJPsUADAP6AAYD9AAMAAAAAAAEAgABAA4ADQAAfAAABIRE0JiMiBhURISIGFRQWMyERFBYzMjY1ESEyNjU0JgNa/uYjHR0j/uYcCgocARojHR0jARMiCwoCAAEaHAoKHP7mIx0dI/7tIgsKHAEaIx0dIwAAAAABASABQALgAkAAAgAAARsBASDg4AJA/wABAAAAAQDeAJ4DIgLiABoAAAEmBgcGFBcWMjc+AScBFjY3NjQnJiIHDgEXAQFTHUAYHh4eVR4YCg4BKh1AGB4eHlUeGAoO/tYBQw4KGB5VHh4eGEAdASoOChgeVR4eHhhAHf7WAAAAAAX////ABTMDwAAQABwAKAA0ADgAAAEhIgYVERQWMyEyNjURNCYjBzIWFRQGIyImNTQ2IzIWFRQGIyImNTQ2IzIWFRQGIyImNTQ2ASERIQTa+34lNDQlBIIlNDQlZA4TEw4OExNWDhQUDg4TE1YOFBQODRQUATn7fgSCA8AzJPyuJDMzJANSJDNXEw4NExMNDhMTDg0TEw0OExMODRMTDQ4T/K4CugAAAAMAAf/EBV0DvAAGAA0AHAAAJTUJATUJAQEVCQEVCQEnJgYHAwYWFxY2NxM2JicBlP8AAQD+bQGTAi4BBP78AZv+ZYwaMQjtCBgaGjEI7QgYGiCWAQIBApX+af5oAzaU/v7+/pQBlgGWZggZGvyHGzEICBkaA3oaMQgAAAADAAD/wAWIA8AAGAAdACkAACUyNjURNCYjISIGFREUFjMjFBYzITI2NSMBIREhEQEiJjU0NjMyFhUUBgScMUVFMfxQMUVFMexFMQScMUXs/FADsPxQAdgYIyMYGSIiOEcyApcyRkYy/WkyRjJHRzEDEP1pApf8tCQZGCQkGBkkAAIAM//mA74DcQAJAA4AAAE2NC8BJiIPARcBFTMBJwO+Dw94DisPXsD808ACNsACsQ8rDngPD17A/lPAAjfAAAABADMAQAPNA0AACgAACQEzETMRMxEzETMCAP4ziue454oDQP5p/pcBD/7xAWkAAAACAI0ASwN1AzMABwAWAAABFSE1IxEhERElFSIOAjE+AzMVJQMd/cdXAuj++HiYWCEiU2JxQQEIAVKvr/75AQcBEdB9YXZiNT4fCYzXAAAAAAIATQANA7MDcwAJAB0AABMBNwEzNSERMzUlIRUhESERIxEUFjMhMjY1ETQmI60B3ET+Ja3+rmACpf6uAVL9W2A4KAKlKTg4KQLO/iVEAdth/q6tpWH9WwFT/q4pODgpAqQoOQACASAAwALgAsAABgANAAABNycHJwcXJwcXNycHJwIA4DOtrTPgrTPg4DOtrQGm5zOtrTPnNDTm5jStrQACASAAwALgAsAABQALAAAlFzcXNyc1FzcnBxcBIDOtrTPgrTPg4DPzM62tM+d5rTTm5jQAAQFAAIACwAMAAAUAAAEHFwcXAQGGRu3tRgE6AwBN8/NNAUAAAQFAAIACwAMAAAUAAAEXBxcHAQJ6Ru3tRv7GAwBN8/NNAUAAAgCAAEADgANAABoAJgAACQEuASMhIgYVERQWFwEeATMyNjcBPgE1NCYnJSImNTQ2MzIWFQ4BA2j+qg4cEf72Hy4KDgFWDhoNDh8JAQkSDAoO/aAWJSAbFiUEIQHSAVYOCi4f/vARGwn+pAkJCg4BDwkbEg0aDrEgGxYlIBsbIAABAG8AZAORAxwACgAACQEzETM1MxUzETMCAP5ve8agxnsDHP6P/rn29gFHAAIAAP/ABAADwAATABkAAAEiDgIVFB4CMzI+AjU0LgITJREzERcCAGq7i1BQi7tqaruLUFCLu1v+7E/sA8BQi7tqaruLUFCLu2pqu4tQ/Oy9AWv+xZ4AAAADAAD/wAQAA8AAEwAXABsAAAEiDgIVFB4CMzI+AjU0LgIDIxEzNSM1MwIAarqLUVGLumpquotRUYu6N2ZmZmYDwFGLumpquotRUYu6amq6i1H9AAEzZ2YAEQAA/8AFPAPAAAYADgAXAB0AJAAqADIAOwBEAE0AVABdAGQAbQB2AH8A9QAAAScOAQcXNyciBgcXPgE3FzcuASMOAQcXFycHFz4BBycHFz4BNwUXNycOASUuAScWBgcXJzYmJy4BJwcXDwEeATM+ATcnHwE+ATcnDgEHBzI2NycOAQEnDgEHFz4BNQUeARcuATcXBhYXHgEXNyc3Jw4BBxc+ATcHDgEfAT4BNyclLgMjIgYHLgMjIg4CBw4DFRQeAhc5ATI2NTQmIzE1LgE1ND4CMzEyFjMyNjU0NjcxPgEzMhYXMx4BMzI2NzM+ATMyFhUwFBU5ARQGFRQWOwEeARUUBiM5ASMiBhUUFjMxMzAyMzI+AjUuAScCrnANFg55KCQ1YihmGy0RKDYRIhAUNBpvgW8oeAoPIngobw4ZCv7acCh5Cg4BvwYyJQMBB2JzCgMDDRwROnDWNRAiEBQ0Gm+OZxQgCngKFQ5iNl0oYRsuARFrAxIKeAoI/bkGNCgEAgoSCgIDDhwQNmtHbxQhCn0KGg2yCgcEagQSCn0DIQMpQ1gyESANDzhKWjI3Yk41CjpoTi0pR2A3FB0dFEpgHjVIKQcNBxcjAQMOcUpNcg4EBx4QBxIHBA0bDj9cBB4XBS9ARS9rEBgYEGcBAypKOCEDX0MBUSwUMB4sYrImISksMxGcjgcHDjYsLEcsZi0bNGUtZywaMRsELWYtGzRTM1ohF0QvJC0yShcKEAqPKNqKBwcONiwoHygULhstHjAUfSYhJCg2ASYoFzQbLRg4GzoyXiIYRC4JMk0UCg4HjyP+KBQvGi0bMxRHGzoaKBc0GzHRMVVBJQUELUw2HiRBWDMEMU9oOjllTzIHHRQUHQQKcUkoRzYfBCIYAwwHRmNkShAYBgMDBlg/AQQDBwMUHQNBKy9FHBEQHB82SSpDaw0AAAAAAQCGAGACvgMgACUAAAE0IjE0IjE0IjE1LgEjIgYVES4BBhYxHgMxITQ+Aj0BNCIxAnhHRkcDKh0eKUI8FAUoQS4ZAR4hKCFGAewaGxqfHSkpHf7mQgUuPBtpak8NR09GDXwaAAEAoABgA2ADIAATAAABFA4CIyIuAjU0PgIzMh4CA2A3YIBJSYBgNzdggElJgGA3AcBJgGA3N2CASUmAYDc3YIAAAAAAAQCUAAADbAOAAB0AAAEiJiMiBgc1NCYjIgYVETMRMDYzMhYzMjYxETAGIwKoRz1tNmQqHBEQIl9XbUg8bW1XV20C6WUcES0VHR0V/LIBW2VlZQGOZQAAAAMAAP/ABAADwAALAB8AMwAAASIGFRQWMzI2NTQmAyIOAhUUHgIzMj4CNTQuAgMiLgI1ND4CMzIeAhUUDgICAD5cXD4+XFw+arqLUVGLumpquotRUYu6alSVcEFBcJVUVJVwQUFwlQJaXD4+XFw+PlwBZlGLumpquotRUYu6amq6i1H8ZkFwlVRUlXBBQXCVVFSVcEEAAAAAAgClAEAEgANAABEAGQAAASEnISIGFREUFjMhMjY1ETQmAxUjNSM3FyMEHf51Yv7XKTk5KQMWKTo67mOf0NGfAuNdOCX9wCk6OikB3Sk6/qzAwMvLAAAAAAYA0QBgBGoDIAALABcAIwAoAC0AMgAAASIGFRQWMzI2NTQmAyIGFRQWMzI2NTQmAyIGFRQWMzI2NTQmExUhNSERITUhFREhNSEVAR0gLCwgISsrISAsLCAhKyshICwsICErK3ECu/1FArv9RQK7/UUDICocHSoqHRwq/uYqHBwqKhwcKv7nKh0cKiocHSoCHVxc/WxcXAEZYmIAAAUAmgBABDMDQAAKAA4AEgAWABoAABMRFBYzITI2NREhASERIQEhNSE1ITUhNSE1IZo3JQLhJTf8ZwGb/sEBPwGi/roBRv66AUb9HwLhA0D9Yio4OCoCnv1iAR7+4mJaYmKLAAAFAKAAYANgAyAAAwAHAAsADwATAAATMxUjOwEVIyMzFSMBMxUjFTMVI6Dr6+vq6uvr6wHV6+vr6wMg6+rrAsDr6usAAAEBNQE9AssCSwAMAAABBwYiLwEmNjMhMhYHAsu7BhQGuwoMDwF0DwwKAh7hCAjhDSAgDQACAEABQAPAAkAACQAVAAATMD4BBBcGBC4BJSIGFRQWMzI2NTQmQIzzAUe6uv6584wBwDVLSzU1S0sBuqZuN93TNWqehks1NUtLNTVLAAAAAAIAgABAA4ADQAATACsAAAEyHgIVFA4CIyIuAjU0PgIDFx4BMzI2PwE2NCcmIg8BJyYiBwYUFzECAFCLaTw8aYtQUItpPDxpi2OTBhEJCREGkw0NDSYNc3MNJg0NDQNAPGmLUFCLaTw8aYtQUItpPP5idwUGBgV3Cx4LCgpdXQoKCx4LABEARABJA7wDNwADAAcACwAPABQAGQAeACIAJgArADAANQA6AD4AQwBIAEwAABMVMzUhFTM1BRUzNScVMzUFFTM1IyEVMzUjJTMVIzUhMxUjNzMVIxMzESMRFzMVIzUBIRUhNREhFSE1ETMVIyUzFSM1ETMVIzUhMxUjRM0B3oj+I4iIiP4izc0Cq4iI/VVFRQERRUXNRESJRETMRUX8zQN4/IgDePyIRUUDM0VFRUX8zUVFAiZEREREiEREiEREzEVFRUWIiIjNzc0BEf7vARFEiIgBVURE/VZERAJmiIiIiP3eREREAAAMAIkArwN3AtEACwAXACMALwA8AEgAVABgAG0AeQCGAJIAABMiJjU0NjMyFhUUBgciJjU0NjMyFhUUBgciJjU0NjMyFhUUBiEiJjU0NjMyFhUUBiMiJjU0NjMyFhUUBiMjIiY1NDYzMhYVFAYDIiY1NDYzMhYVFAYHIiY1NDYzMhYVFAY3IiY1NDYzMhYVFAYjMyImNTQ2MzIWFRQGByImNTQ2MzIWFRQGIzMiJjU0NjMyFhUUBs0cKCgcHCgoHBwoKBwcKCgcHCgoHBwoKAJKHCgoHBwoKOkcKCgcHSgoHcwdKCgdHCgoHB0oKB0cKCgcHSgoHRwoKLAcKCgcHSgoHc0cKCgcHCgo6RwoKBwdKCgdzRwoKBwcKCgCSSgcHCgoHBwozSgcHCgoHBwozSgcHCgoHBwoKBwcKCgcHCgoHBwoKBwcKCgcHCgoHBwoAZooHBwoKBwcKM0oHBwoKBwcKM0oHBwoKBwcKCgcHCgoHBwozSgcHCgoHBwoKBwcKCgcHCgABgBEAEkDvAM3AAUAEgAXABwAIQAmAAA3GwE3EyEBIiY1NDYzMhYVFAYjASEVITURIRUhNQEzESMRITMRIxHNiKtmzf2aAd4dKCgdHCgoHP2ZA3j8iAN4/IgDM0VF/M1FRdEBVf7vzf7vAVUoHRwoKBwdKAERRET9VkREAmb9mgJm/ZoCZgAAAAQAeACAA/gDAAAFAAkADwAVAAABBSU3JQUhBS0BBRcFJTcFJRcFJTcFA9P+Zf5AJQGbAcD9FQErASv+1QF1S/5A/kBLAXUBdUv+QP5ASwF1AjCwwBCwwICAgOAgwMAgoCAgwMAgoAAAAwB/AE4DcwNBABMAKAA2AAABIg4CFRQeAjMyPgI1NC4CAyIuAjU0PgIzMh4CFRQOAiMFNjIfARYUBwYiLwEmNAHWR31dNjZdfUdHfV02Nl19RzNZQicnQlkzM1lDJiZDWTMBEg4pDkYODg8oD0UOA0E2XX1HR31dNjZdfUdHfV02/bQmQ1kzM1lCJydCWTMzWUMmHQ4ORQ4pDg8PRQ4pAAMAQAAAA8ADgAATACcAOAAAASIOAhUUHgIzMj4CNTQuAgMiLgI1ND4CMzIeAhUUDgInBwYmNRE0Nh8CHgEVFAYHAgBdo3pGRnqjXV2jekZGeqNdUItpPDxpi1BQi2k8PGmLWUwPHBwPTLgICQkIA4BGeqNdXaN6RkZ6o11do3pG/MA8aYtQUItpPDxpi1BQi2k88S0JFRQBOBQVCS1vBREKChEFAAAAAAQAQAAAA8ADgAATACcANQBDAAABIg4CFRQeAjMyPgI1NC4CAyIuAjU0PgIzMh4CFRQOAgMyFhURFAYjIiY1ETQ2MzIWFREUBiMiJjURNDYCAF2jekZGeqNdXaN6RkZ6o11Qi2k8PGmLUFCLaTw8aYuwDRMTDQ0TE80NExMNDRMTA4BGeqNdXaN6RkZ6o11do3pG/MA8aYtQUItpPDxpi1BQi2k8AiATDf8ADRMTDQEADRMTDf8ADRMTDQEADRMAAAIAOwAAA3ADgAARACIAACUjETQmKwE1NDYzITIWFREUBgMRFAYjISImNRE0NjMhMhYVAwRsPyzYPy0BQy0/P9s/Lf68LD8/LAFELT/gAYguQjguQkIu/kAuQgFQ/kAuQkIuAcAuQkIuAAAAAAIAQAAAA8ADgABUAGgAAAE1JjY/ATYmLwEuAS8BJiIPAQ4BDwEOAR8BHgEPAQYWPwE2Mh8BFjYvAT4BNwcOASMiJicuAScmNjE3MDYjLgErAT4BMzIWFzAWFxYGMQcwBhceARcDIi4CNTQ+AjMyHgIVFA4CAosBBgZrBgQIkwgRBEIECgRCBBEIkwgEBmsGBgEZAgkHhAcWB4QHCQIVBg8IDCJLJRIiEA4cDQQFqAMDNHA1BiVaMR43GhYHBQWpAwQjUCeLXaN6RkZ6o11do3pGRnqjAX8BCBQGaAYKARUCDAeGBweGBwwCFQEKBmgGFAiTCAYERQQERQQGCH4CCAQCBgYBAQEDAQEFdwMIBggJAwMDAQEEdQIBBQUB/oFGeqNdXaN6RkZ6o11do3pGAAACAIUAXwN7AzsAHwBHAAABHgEVFAYPAQ4BJy4BPQEjIiY9ATQ2OwE1NDY3NjIfAQUyFh0BFAYjISImNRE3ITIWFREUBisBIiY1ESMVFAYrAREhNTQ2OwEDeAIBAQKcAwYCAwKPBgUFBo0DBAIFA53+/wgHBwj+HQgH3AEWCAcHCDYIB7MIB5cBWQcINgFJAQQEAwQBcAIBAQEFBDUGBWAFBTUEBQECAnBuBwhgBgcHBgH12gYH/oUHBwcHATSVCAf+cRgIBwAAAAMAQAAAA8ADgAATAC0AXwAAASIOAhUUHgIzMj4CNTQuAgMjIiY1JjY3JjY3PgEXHgEHDgEnDgEXFAYjNyImJy4BNz4BFx4BMzI2NTQmIyIGFRQWFxYGBwYmJy4BNTQ+AjMyHgIVFA4CIzECAF2jekZGeqNdXaN6RkZ6o+QBCAwDQh4MAw8VQRoZCBQSOhkaOwMMCI0LFQoICQIBDwgIEAk/WVk/QFkEBAIHCAgPAwUFHjVHKChGNR4eNUYoA4BGeqNdXaN6RkZ6o11do3pG/RwMCGd9HhUyFBsIFRVCGxgLDxluXAkNeQMCAg4JCAoCAgJcQEFbW0EMGQwJDwMDCAgPIBApSDYfHzZIKSlINh8ACABAAAEDwAN/AAwAGgAtADoATwBpAJAAqQAAAQ4BFx4BNz4BJy4BBwcGJjc+ATMyFgcOAQcxNxQWFxYyNz4BNTQmJyYiBw4BFQciBhcUFjc+ATU0JgcTIg4CFRQeAjMyPgI1NC4CIxM4ATEjIiY1NDYzNhYxDgEjIiY1PAE3NiYHFxQGBw4BLgEnLgE3PgE3PgEXHgEHBhY3PgE3NhYXFgYxMAYXHgEVNw4BIyImNTQ2NzYmMSMiJjU+ATczHgE5AQHVQFUFBGFBQFUFBGFBASIvAgIxISEuAgEwIQgCAwIGAgIDAwICBgIDAh8MEgEQDAsRDg1DXaN6RkZ6o11do3lHR3mjXYEDBgkIBkkEAQcEBQcBASwHSxQ5KWplVBMECAwHUBEOSBUUDAYDCwYFCxEXHRITDAUINAxIAQwHCAwBAQxzAwgLAQkHBYUIAd4HRCkpMAcHQykpMQe1AiggICsqHR4qAlQDBAIBAQIEAwMFAQEBAQUDBA8KCw0BAQ4KCg4BAgZGeqNcXaN5RkZ5o11co3pG/q8IBgUIBU8EBQcFAgIBJAUCpwk4JhoQDzAnCjAdEmIIDx8GBSYRCwkDAgoFBAENDSkLAhIsCWkHCA0IAgICWRcNCAcLAQicAAAABgB4AQkDiAKrAAMACAAMABAAFAAYAAATIREhExUhNSE7ARUjNzMVIzczFSM3MxUjeAMQ/PBpAj79wmg0NGk0NGg0NGk0NAKr/l4BOtHRaWmdnWlpnQAAAAIAwABgBA0DIAAEAAgAABMhFSE1BTMRI8ADTfyzAWCNjQMgjY2N/c0AAAAABgCGACAFEwNgAAQACQAOABMAGAAdAAABIRUhNREhFSE1ESEVITUBMxUjNREzFSM1ETMVIzUCJgLt/RMC7f0TAu39E/5g+vr6+vr6A2Cmpv6zpqb+s6amApqmpv6zpqb+s6amAAIAUAAFAu8DQQBDAFkAABMhMhYXHgEVFAYHDgEHFR4BFx4BFx4BFx4BFx4BFR4BFx4BFx4BFyMuAScuATUuASc0JicuAScuAScuAScuASMhESMRATI2Nz4BNz4BNz4BNTQmJy4BIyERM1ABhjtdISEiEhERNyUSHQsMEgYHCgMDBQIBAgEDAgIHBAUNCXsGCAICAwEBAQQDAgYDBAsHCBMNDCAV/vNuAVQTJRERHw0NFQgIBxEREjgn/u7mA0EdHR1QMiZCHB0nCgIEDAgIEwwLGQ4OHQ8PHw8QHw8PHQ0OGAoGEQsLGQ4NHg8QHw8PHA4OFwsKEAYGBv6fAzz+ggMDAwsICRcODiUWIDMTFBT+3wAAAAMAAP/ABIkDwAAJAA0AFwAAASUmBhURFBYXBTMlEQUBBRY2NRE0JiclAVX+6holJRoBFkUBU/6tAZkBFhomJRv+6gM3cAoZHP0RHTYLb4YDeon9EnAKGRwC7x02C28AAAIAAP/ABAADwAATADMAAAEiDgIVFB4CMzI+AjU0LgIDNSMwJjU0NjEzNTA2MzIWMRUzMhYVFAYrARUwBiMiJgIAaruLUFCLu2pqu4tQUIu7o+M5OeMOKysO4xQlJRTjDisrDgPAUIu7amq7i1BQi7tqaruLUPzk4w4rKw7jOTnjJBUVJOM5OQADAAD/wASAA8AAEgAgAC8AABMiBhURFBY7ARU3ITI2NRE0JiMDITAmNTQ2MSEwFhUUBgEwJjU0NjEhMBYVFAYxIYAwUFAwQMACgDBQUDC1/eo1NQIWNTX96jU1AhY1Nf3qA8BRL/3AL1HAwFEvAkAvUf3AEDAwEBAwMBABABAwMBAQMDAQAAAAAQAN/9gDvAOvACYAABMGFjsBERQWOwEyNj0BNDY7ATIWHQEUFhczMjY1ETMyNicBJiIHAQ0RChdyIhhwGCIhGHEYISIYcRcichcKEf5RES8R/lECABEX/jkXISEY4hghIRjiGCEBIRcByBcRAa8REf5RAAACAID/6wOAA5UAEQAYAAABISIGFREUFhcFJT4BNRE0JiMBJzcXARcBAyv9qiMyFREBWgFaERUyI/6A1jyaAUQ8/oADlTIj/dgWJQzm5gwlFgIoIzL9gNY8mQFEPf6AAAACAFYAIgOrA2sAGQAmAAAJAS4BIyIGBwEOARUUFhcBFjI3AT4BNTQmJwU1IxUjNTQ2OwE1FwcDnv6ABRAJCQ8G/oAGBgYGAYANIwwBgAYHBwb+t6pWGRLVlpYB3gGABgcHBv6ABRAJCQ8G/oAMDAGABg8JCRAFiWuAqxEZa5WWAAYAAAAVBAADjQALAB8AKwBEAFgAZAAAATI2NTQmIyIGFRQWEyIOAhUUHgIzMj4CNTQuAgMiJjU0NjMyFhUUBgMzNSMnLgEjIgYPAQ4BFRQWHwEVMxEnNxcFIg4CFRQeAjMyPgI1NC4CAyImNTQ2MzIWFRQGAqsfLS0fIC0toCxOOiIiOk4sLE45IiI5Tiw+WFg+PVhY8bSJUgohEw8bCp4KCxMRj01gY0n+XixOOSIiOU4sLE46IiI6Tiw9WFg9PlhYAvMtICAtLSAgLf7NIjlOLCxOOiIiOk4sLE45Iv6VWD49WFg9PlgBwE2MEBMLCp4KGg8UIQpX1QEUSGNqVSI5TiwsTjoiIjpOLCxOOSL+lVg+PVhYPT5YAAAABACrAEADVQNrACUAMQA9AEIAABMUFhcVFBY7ATI2PQEhFRQWOwEyNj0BPgE1ETQuAiMiDgIVERciJjU0NjMyFhUUBiEiJjU0NjMyFhUUBhMhNSEVqxcTGRIrERkBVhkRKxIZExc1XXxHR3xdNZUbJSUbGyUlAWUbJSUbGyUlJf4AAgABFRwxEUwSGRkSKioSGRkSTBExHAGrOEMkDAwkQzj+VSolGxomJhobJSUbGiYmGhslAQDV1QAAAAAEAIAAQAOAAusAHAAoADQAOQAAAS4BIyEiBgcDERQWOwEyNj0BIRUUFjsBMjY1EQMBIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYlNyEXIQMnBiEV/ioVIQZZGRIqEhkCABkSKhIZWf3uGiYmGhslJQG7GyUlGxomJv3QQAHWQP2qAsASGRkS/wD+qxIZGRIqKhIZGRIBVQEA/lUmGhslJRsaJiYaGyUlGxom1sDAAAAAAAMAVf/rA6sDlQAeAEsAUAAAJSImJw4BIiYnDgErARUzMjY3HgEzMjY3Bx4BOwE1IyUzMjY3HgEzMjY3HgE7ARM2JicuAS8BNTQmKwE1IRUjIgYdAQcOARUUFhcjExMhFSUFA1UsVycnWFhYJydXLFZWLFYoJlYvL1cnAihWLFZW/VQCM1gfIFgzM1ggH1gzAlEDAgMEDgg3MiOA/wCAIzI3DhEBAgFSVwIA/wD/AEAdGxsbGxsbHVUVFRQVFhQBFRVVVTIkJDIyJCQyAR0JEQgHCwMSxSMygIAyI8USBBcOBAcD/uMCK6lUVAAAAwCrAEADVQOVABcAIwAnAAATFBYzBxUhNScyNjURNC4CIyIOAhURBSImNTQ2MzIWFRQGEyE1IatXPkACAEA+VzVdfEdHfF01AVUjMjIjIzIy3f4AAgABKz5YQBUVQFg+AcA4QyQLCyRDOP5AQDIjIzIyIyMyASrWAAAAAAUAqwBAA1UDawAXACMAKAA0ADkAAAEiDgIVERQWMwcVITUnMjY1ETQuAiMDIiY1NDYzMhYVFAYTIzUzFRMiJjU0NjMyFhUUBhMjNTMVAgBHfF01Vz5AAgBAPlc1XXxHwBslJRsbJSV61dXrGyUlGxslJSXV1QNrDCRDOP5rPlhAFRVAWD4BlThDJAz9gCUbGiYmGhslAQDV1f8AJRsaJiYaGyUBANXVAAIBAAAVAysDtwANACcAAAEyNjU0JiMiBhUxFBYzEzM1IycuASMiBg8BFTM1NwMzExcVMxEnNxcCVSAtLSAfLSwgBdGbVQohEwYLBOhNWqdNemRMah8uAx4tIB8tLR8gLf73TY4QFAIBSN6cHP1yAVqE1gESwnpOAAEAVQAVA4ADawAVAAABNSU1NCYjIgYdAQUVJRUHFTcXNSc1A4D+qyYaGyX+qgFWVpaVVQEVVtXrGiYmGuvVVmvrQEArK0BA6wAAAAACACsAawPVAusACwAbAAABMjY1NCYjIgYVFBYBIREhESMRMzUhFTMRNCYjASs1S0s1NUtLAjX+qv6rVVUDAFVkRgGVSzU1S0s1NUsBAP7WAYD9gICAAYBGZAAAAAEAVQAVA4ADawAVAAABNSU1NCYjIgYdAQUVJRUHFTcXNSc1A4D+qyYaGyX+qgFWVpaVVQEVVtXrGiYmGuvVVmvrQEArK0BA6wAAAAADAFUAawOrAxUAIAAxADUAACUzNTMyNj0BNCYrATUzNSM1IxUjIgYdARQWOwEVIxUzFQEhIgYVAxQWMyEyNjURNCYjESERIQHVVioSGRkSgKtVVioSGRkSgKtVAYD9ViQxATIkAqokMjIk/VYCqusqGRKAEhkqVioqGRKAEhkqVioCKjEk/gAkMTEkAgAkMf2rAgAAAgBVAGsDqwMVAB0AKAAAATQ2MzU0JiMhIgYdATIWFRQGIxUUFjMhMjY9ASImBycHNyc/AR8BBxcDVTIkMiT9ViQxIzIyJDIkAqokMiQyvJmZLoy1QkK1jS8BwCMyqyMyMiOrMiMjMqsjMjIjqzKqYmKwcwqpqQtysAAAAAIAgABAA4ADQAALABAAAAERIxUhNSMRATUhFRcnIQchAdXVAgDVAVX9AMBVAipV/oABlf8AVVUBAAFWVVVWVlYAAAAAAwBVAEADqwNAABIAFgAbAAABIREUFjMhMjY9ATMyNj0BNCYjFSM1MwEhNSEVA1X9VmRGAQBHZFUkMjIkVVX9AAMA/QADQP5VRmRkRoAyJIAjMtWA/VVVVQAAAAAHAID/6wOAA54ACwAXACMAQABMAFgAXQAAATI2NTQmMTAGFRQWIzI2NTQmMTAGFRQWIzI2NTQmMTAGFRQWBS4BIyEiBg8BERQWOwEyNj0BIRUUFjsBMjY1EScBIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYlNyEXIQLVGyVAQCa7GyVAQCW6GiZAQCUCFwYhFf4qFSEGWRkSKhIZAgAZEioSGVn97homJhobJSUBuxslJRsaJib90EAB1kD9qgLrJRsgU1MgGyUlGyBTUyAbJSUbIFNTIBslgRMYGBP//qoRGRkRKysRGRkRAVb//lYlGxslJRsbJSUbGyUlGxsl1cDAAAAAAAMAVQBrA6sDFQAMABkAJAAAATUhFSMRITUzFSERIwUjFTMVIzUzNSM1MxUXIzUjNTMVMzUzFQMr/aqAAVaqAVaA/qpVVYBWVoDWK1UqKysClYCA/daqqgIqgCorgCsqgFVVgFVV1QAAAwCAABUDgANrAAoAGgAeAAAbAR4BMyEyNjcTIQEiJjU0PgIxMB4CFRQGEyEnIYBWBDAhAaohMARW/QABgDVLKDAoKDAoS9n95BMCQQNr/PYgLCwgAwr9Kks1IFBHMDBHUCA1SwHWqgAEAIAAFQOAA5UACwBMAFsAZwAAJTI+AjUxIg4CFQE4ATEUFjMyNjcjBxQWMzI2NTEnHgEzMjY1MTQmJz4BNTgBMTQmIyIGBz8BNCYjIgYVMRcuASMiBhUxFBYXDgEVJTIWFRQGIzEiJjU0NjMxARQeAjMxNC4CIwIAUItpPFCLaTz+7z4tER8NAQE/LCw/AQ0eES0+IhsbIj4tER8NAQE/LCw/AQ0eES0+IhsbIgERLD8/LCw/Pyz+gDxpi1A8aYtQFT1ojE88aIxQAfYtPgoJCC0+Pi0ICQo+LSAzDQw0ICw+CgkBCCw+PiwICQk+LCA0DA0zIMo+LC0+Pi0sPv7AT4xoPVCMaDwAAAAAAwCrAEADawNAADIANgBDAAABMScHFw4BFRQWMzEyNjcRFAYjIiY9ATQmKwERNCYjISIGFREhETMVFBYzMjY1MRE0JicFITUhBSImNTQ2MzIWFRQGIwNMny1aHic/LAwVChkSEhkyIysyI/8AIzIBqkA/LCw/EQ7+tP8AAQABABIZGRISGRkSAoyfLloLNiIsPwUE/s0SGRkSwCMyASsjMjIj/VUBQNUtPj4tAZUWJw931tYZEhIZGRISGQADACsAFQOAA2sADAAtADkAACUiBhUUFjMyNjU0JiMBFTMTBw4BFRQWMyE1ISImNT8BITI2NxM+ATU0JiMhJyMBIgYVFBYzMjY1NCYBKyQxMSQjMjIj/wBVmjoFBjIkAgD+EgUGAScBPRgoC5kCAxkS/YkoiwKqIzIyIyQyMsAyIyQyMiQjMgKrVv68aAkVCyMyVQYFBUUYFAEVBQoGERlW/VUyIyQyMiQjMgAAAgCAAEADgANAABAAHAAAASEiBhURFBYzITI2NRE0JiMDIxUjNSM1MzUzFTMDK/2qIzIyIwJWIzIyIyurqqurqqsDQDIj/aojMjIjAlYjMv4rq6uqq6sAAAUAqwAVA1UDawAPACAALQA6AE4AACUeATMyNjcxPgE1NCYnMQcBJSIGFREUFjMhMjY1ETQmIwUyFhUUBiMiJjU0NjMjMhYVFAYjIiY1NDYzEyIuAjU0PgIzMh4CFRQOAgGHFz8jIz8XFxsbF/IBef4AJDExJAIAJDExJP6rERkZERIZGRKAERkZERIZGRLVNV1GKChGXTU1XUYoKEZd8hcbGxcXPiQjPhfxAngBMiT9ViQyMiQCqiQxVRkREhkZEhEZGRESGRkSERn9VihFXjU1XUUpKUVdNTVeRSgAAAAAAgCA//4DgANrABYAIgAAAS4DIxEyHgIXPgMzESIOAgc1MjY1NCYjIgYVFBYCACZXYmk4OGliVyYmV2JpODhpYlcmNUtLNTVLSwHTIzknFf4qFSc4IyM4JxUB1hUnOSOYSzU1S0s1NUsAAAAAAwCAABUDgAOVABsAIgA0AAABIzQuAiMiDgIVIyIGFREUFjMhMjY1ETQmIyUyFhUhNDYTIi4CNTMUFjMyNjUzFA4CAytWITpOLCxOOiFWIzIyIwJWIzIyI/7VNUv/AEs1LE46IVVLNTVLVSE6TgLALE46ISE6TiwyI/4AJDIyJAIAIzKASzU1S/5VIjpOLDVLSzUsTjoiAAAHAKsAQANVA0AAFAAZAB4AIwAnACsALwAAARUjNSEVIzUjETM1MxUhNTMVMxEjASM1MxU1IzUzFTUjNTMVASM1MzUjNTM1IzUzAwBV/qpVVVVVAVZVVVX+VVVVVVVVVQGrVVVVVVVVA0BVVVVV/QBVVVVVAwD9q1VVqlZWq1VV/qtVVVZVVQAAAgBVABUDqwNrABoAJwAACQEuASMhIgYVERQWFwEeATMyNjcBPgE1NCYnJSImNTQ2MzIWFRQGIwOR/oALHxL+1iQyDgwBgAsfEhEfDAEqDA4ODP1aGyUlGxomJhoB0gGACw4yJP7WEh8M/oALDg4MASoMHxESHwzDJhobJSUbGiYAAAAAAgEAAEADKwNAAA4AGAAAASERMxEzMj4CNTQuAgMjNTMyFhUUBiMCK/7Vq4A1XUUpKUVdLYiIIzMzIwNA/QABAChGXTU1XUYo/quqMiMjMgACAIAAQAOAA5UADgAaAAABIzcnByEVEwMVITUDEzUDIxUjNSM1MzUzFTMDgHExZD/941VVAwBVVdWAVoCAVoAC64Ykqlb/AP8AVVUBAAEAVv6AgIBVgIAAAQCAAEADgANAACYAAAEeAxc3PgEXHgEzMhYdARQGIyIkJgI1NDY7ATIWFRQWFxYGDwEBGhc8R1IuXQkYCyRNJxIZGRKW/vjFchkSlRIZDAwEBgleAfQuUUg7GF4JBQMMDRkRlRIZcsUBCJYSGRkSKEwkCxgJXQAAAwCAABUDgANrAAsAGAAkAAABIg4CBwkBLgMFNDYzMhYVFAYjIiY1EyImNTQ2MzIWFRQGAgA5bGFWJAGAAYAkVmFs/vIyIyMyMiMjMtUjMjIjIzIyA2sYLEAn/VUCqyc/LRjWJDIyJCMyMiP+qzIjJDIyJCMyAAAAAgBVAGsDqwMVAB0AKAAAATQ2MzU0JiMhIgYdATIWFRQGIxUUFjMhMjY9ASImBycHNyc/AR8BBxcDVTIkMiT9ViQxIzIyJDIkAqokMiQyvJmZLoy1QkK1jS8BwCMyqyMyMiOrMiMjMqsjMjIjqzKqYmKwcwqpqQtysAAAAAIAVQBrA6sDFQAQABYAAAEhIgYVAxQWMyEyNjURNCYjFQUlNQUlA1X9ViQxATIkAqokMjIk/qv+qwFVAVUDFTIj/gAjMjIjAgAjMqrW1lXV1QAAAAQAVQBAA6sDQAAOABIAHgAiAAABISIGFREzFSE1MxE0JiMDITUhNyImNTQ2MzIWFRQGAyEVIQMr/ao1S6sCAKtLNYD+qgFWgBIZGRIRGRk8/gACAAJrSzX/AKurAQA1S/4q1lUZEhEZGRESGQGAqwACAHUANAN+AysACgAeAAABNwEOARUUFhcxFyUWNjc+AScmBgcOARcBFwkBNwE3AVp4/tUXGxsXswEhMX0zPRQvLpk+Mx4W/mA8ASYBJjz+2j8Bh3kBKxg+IyM/F7JNFx8zPZkvLxQ+Mn0x/l88ASX+2zwBJT8AAAADAFUAawOrA2sADQAiADYAAAEUFjMyNjUxNCYjIgYVEwcjIgYVERQWMyEyNjURNCYrASchEyIuAjU0PgIzMh4CFRQOAgF3UDk5UFA5OVAJTockMjIkAqokMjIkh07/AIAsTjohITpOLCxOOiEhOk4BwDlQUDk5UFA5AatWMiP+ACMyMiMCACMyVv2AITpOLCxOOiEhOk4sLE46IQAEACsAawPVAxUAGAAkACkANQAAASM1ISIGFREzFBYzMjY1IRQWMzI2NTM1JwEiJjU0NjMyFhUUBgEXIzUzAyImNTQ2MzIWFRQGA1WA/asjMlVLNTVLAQBLNTVLVYD9qxslJRsbJSUCJVS/a0AbJSUbGyUlAmuqMiP+KzVLSzU1S0s11av+QCUbGiYmGhslAYBra/6AJRsaJiYaGyUAAAAABACAAEADgANAACAALAA4AD0AAAEuASsBNSEVIyIGBwMRFBY7ATI2PQEhFRQWOwEyNjURAwEiJjU0NjMyFhUUBiEiJjU0NjMyFhUUBiU3IRchAycGIRVr/wBrFSEGWRkSKhIZAgAZEioSGVn97homJhobJSUBuxslJRsaJib90EAB1kD9qgLAEhlVVRkS/wD+qxIZGRIqKhIZGRIBVQEA/lUmGhslJRsaJiYaGyUlGxom1sDAAAAAAAMAgP/rA4ADawAUACAALQAAASEiBhURFBYzMTMXNzMyNjURNCYjBTIWFRQGIyImNTQ2ASE1ND4CMzIeAhUDK/2qIzIyI6uAgKsjMjIj/tUwQ0MwMENDATD+ADhQWCAgWFA4A2syJP2rIzKAgDIjAlUkMo1ELzBERDAvRP43JyAxIhERIjEgAAADACv/6wPVA5UADAAxAEYAAAEiBhUUFjMyNjU0JiMFLgMnIzUjFQ4DBxUjFTMeAxczFTM1PgM3NTM1IwEiLgI1ND4CMzIeAhUUDgIjAgBHZGRHR2RkRwF9BzpZdEMBVkN0WjoHWFgHOll0QwFWQ3RaOgdYWP6DPm1RLy9RbT4+bVEvL1FtPgJrZEdHZGRHR2SAQ3RaOgdYWAc6WXRDAVZDdFo6B1hYBzpZdEMBVv6qL1FtPj5tUS8vUW0+Pm1RLwABAMAAQANAA2sABQAACQEXJQU3AgD+wB4BIgEiHgNr/PMegIAeAAAAAwDVABUDKwNrABMAIQAmAAABNC4CIyIOAhUUHgIxMD4CJTQ2MzIWFRQGIyImNTEDFSE1IQMAKEZdNTVdRihQYFBQYFD+qzIjIzIyIyMy1gJW/aoCazVdRSkpRV01SKWMXV2MpUgjMjIjJDIyJP4AVlYAAAACANUAFQMrA2sAFAAjAAABIg4CFRQeAjEwPgI1NC4CIxEiJjU0NjMxMhYVFAYjMQIAPm1RL15wXV1wXi9RbT4sPz8sLD8/LANrL1FtPlTCpm9vpsJUPm1RL/5qPywsPz8sLD8AAwBVABUDqwNrAA4AGgAeAAABISIGFQM3ITI2NRE0JiMBNQE2Mh8BFhQHASMpATczA1X9ViQxAasCVSQyMiT9qwEmBhEHSwcH/tppAgD+wFXrA2syJP0AqzIjAgAkMv4AaQEmBgZMBhIG/ttVAAAAAAIAdQA0A34DKwAKAB4AAAE3AQ4BFRQWFzEXJRY2Nz4BJyYGBw4BFwEXCQE3ATcBWnj+1RcbGxezASExfTM9FC8umT4zHhb+YDwBJgEmPP7aPwGHeQErGD4jIz8Xsk0XHzM9mS8vFD4yfTH+XzwBJf7bPAElPwAAAAQAgABAA4ADQAAPABUAIgAoAAABISIGFREUFjMhMjY1ETQmBTMUBiM1ETUyPgI1MxQOAiMRNxc3EyEDK/2qIzIyIwJWIzIy/YeASzUsTjoiVS9RbT6WapbA/aoDQDIj/aojMjIjAlYjMlU1S4D+1VUiOk4sPm1RL/8AwIDA/wAAAwCAAGsDgAMVAAMAEgAWAAABIRUhEzUnIQcVMxEhETMRMxEzBSE1IQNV/VYCqisr/VYrKwGqq1Ur/oD/AAEAAxVV/qtV1dVV/wABAP8AAQCrqwAAAQArAMAD1QLAAAsAAAEHFwcuAzEBIQECVaB6RBtDOyf/AAOq/oACwNWiNCRZTjX+qwIAAAQAqwBAA1UDQAAuAEMAWABmAAABIzU+ATUjNTQmIyEiBh0BIxQWFxUjFBYXFSMUFhcVFBYzITI2PQE+ATUjNT4BNQEwIiMiJjU0NjM6ATkBHgEVFAYHMTUwIiMiJjU0NjM6ATkBHgEVFAYjMTUiJjUxNDYzMhYVFAYjA1WAN0mAGRH+qhEZgEk3gEk3gEk3GREBVhEZN0mAN0n+qwEBIzIyIwEBIzAwIwEBIzIyIwEBIzAwIyMyMSQjMjIjAhUxDls8KhIZGRIqPFsOMTtbDjE8Wg8wEhkZEjAPWjwxDls7/oAyJCMyATIiIzIB1jIjIzIBMSMjMtUyIyQyMiQjMgADACABYAPgAiAAFAAuAEEAABMuASMxIgYVFBYzMTI2Nz4BNTQmJyEuASMxIgYHDgEVFBYXHgEzMjY3PgE1NCYnJSIGBw4BFRQWFx4BMzI2NTQmI7AKGQ0oODgoDRgLFRsbFQGAChkNDRgLFRsbFQsYDQ0YCxUbGxUBUA0YCxUbGxULGA0oODgoAhMGBzgoKDgHBg0rGxsrDQYHBwYNKxsbKw0GBwcGDSsbGysNDQcGDSsbGysNBgc4KCg4AAYAegAgBJ0DYAARAB4AMAA9AE8AXAAAEyEyFh0BFAYjISImPQE0NjMxBTI2NTQmIyIGFRQWMwUhMhYdARQGIyEiJj0BNDYzMQUyNjU0JiMiBhUUFjMFITIWHQEUBiMhIiY9ATQ2MzEFMjY1NCYjIgYVFBYzxgOLICwsIPx1ICwsIAL0Hy0tHx8sLB/9DAOLICwsIPx1ICwsIAL0Hy0tHx8sLB/9DAOLICwsIPx1ICwsIAL0Hy0tHx8sLB8DYCwgSyAsLCBLICy9LCAfLCwfICxyLB9MHywsH0wfLL0tHx8tLR8fLXEsIEsgLCwgSyAsvSwfICwsIB8sAAAAAAEAAAADzM2NxmrlXw889QALBAAAAAAA1Zy+nAAAAADVnL6c////wAWIA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABZr////8BYgAAQAAAAAAAAAAAAAAAAAAAJAEAAAAAAAAAAAAAAACAAAABAAAhgQAAIkEAADNA/4AagP+AGwD/gBABAAAiAQAAIAD/gCFBAAAbgQCAD0EAACwA7UAzwQAAH8EAACFBAAAmgP+AX8D/gBkBAIAlAQAAIgEAABrBAAAQAO1ALgEAAC7BAAAigP+AIADtQDMA/4A0QP+AKsEAACABAAAnAQAAIAEAACJBAAAzQQAAIAEAAFTBAAAiQQAAIAEAACABAABIAQAAN4FMv//BV0AAQWIAAAEAAAzBAAAMwQCAI0EAABNBAABIAQAASAEAAFABAABQAQAAIAEAABvBAAAAAQAAAAFOAAAA0AAhgQAAKAEAACUBAAAAAUlAKUFOwDRBM0AmgQAAKAEAAE1BAAAQAQAAIAEAABEBAAAiQQAAEQE2gB4BAAAfwQAAEAEAABAA6sAOwQAAEAEAACFBAAAQAQAAEAEAAB4BM0AwAWaAIYDYgBQBIkAAAQAAAAEgAAAA8cADQQAAIAEAABWBAAAAAQAAKsEAACABAAAVQQAAKsEAACrBAABAAQAAFUEAAArBAAAVQQAAFUEAABVBAAAgAQAAFUEAACABAAAVQQAAIAEAACABAAAqwQAACsEAACABAAAqwQAAIAEAACABAAAqwQAAFUEAAEABAAAgAQAAIAEAACABAAAVQQAAFUEAABVBAAAdQQAAFUEAAArBAAAgAQAAIAEAAArBAAAwAQAANUEAADVBAAAVQQAAHUEAACABAAAgAQAACsEAACrBAAAIAUXAHoAAAAAAAoAFAAeAFIBAAEyAVABeAGmAcgCWAKSAwgDUgOYA6wECgQoBHAEfASWBMQE9gU+BYgFmgX2BioGVAZsBoYGnAcCB9oH8AgSCEwIZgh0CMwI4gkUCSIJVAmoCeYKJgpGCl4Khgq4CtYK8AsCCxQLVAtqC5YLwg0kDVYNeA2kDfAOHA5qDpwOvg7YDwAPQg+2EHgQvBDwEUARlBH0EioSwhMmE64UnhTKFOAVEhWcFcwWEBZUFo4Wvhb+F4wX6hhCGLgY9hlKGYYZrBnaGgAaShqIGqoa2BtaG44bwhxIHKYc/B0oHZgdzh4aHl4eoB7IHvQfMB9sH6of1CAMIEggliDmIUIhhiHmIfoiNCJmIp4i2iMaI0QjXiPeJDwkugAAAAEAAACQAPYAEQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAQAAAAAQAAAAAAAgAHALEAAQAAAAAAAwAQAFEAAQAAAAAABAAQAMYAAQAAAAAABQALADAAAQAAAAAABgAQAIEAAQAAAAAACgAaAPYAAwABBAkAAQAgABAAAwABBAkAAgAOALgAAwABBAkAAwAgAGEAAwABBAkABAAgANYAAwABBAkABQAWADsAAwABBAkABgAgAJEAAwABBAkACgA0ARBzdXBlcm1hcG9sLWljb25zAHMAdQBwAGUAcgBtAGEAcABvAGwALQBpAGMAbwBuAHNWZXJzaW9uIDMuOABWAGUAcgBzAGkAbwBuACAAMwAuADhzdXBlcm1hcG9sLWljb25zAHMAdQBwAGUAcgBtAGEAcABvAGwALQBpAGMAbwBuAHNzdXBlcm1hcG9sLWljb25zAHMAdQBwAGUAcgBtAGEAcABvAGwALQBpAGMAbwBuAHNSZWd1bGFyAFIAZQBnAHUAbABhAHJzdXBlcm1hcG9sLWljb25zAHMAdQBwAGUAcgBtAGEAcABvAGwALQBpAGMAbwBuAHNGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#iefix) format('embedded-opentype'), + url(data:font/ttf;base64,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) format('truetype'), + url(data:font/woff;base64,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) format('woff'), + url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+Cjxqc29uPgo8IVtDREFUQVsKewoJImZvbnRGYW1pbHkiOiAic3VwZXJtYXBvbC1pY29ucyIsCgkibWFqb3JWZXJzaW9uIjogMywKCSJtaW5vclZlcnNpb24iOiA4LAoJInZlcnNpb24iOiAiVmVyc2lvbiAzLjgiLAoJImZvbnRJZCI6ICJzdXBlcm1hcG9sLWljb25zIiwKCSJwc05hbWUiOiAic3VwZXJtYXBvbC1pY29ucyIsCgkic3ViRmFtaWx5IjogIlJlZ3VsYXIiLAoJImZ1bGxOYW1lIjogInN1cGVybWFwb2wtaWNvbnMiLAoJImRlc2NyaXB0aW9uIjogIkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uIgp9Cl1dPgo8L2pzb24+CjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0ic3VwZXJtYXBvbC1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiPgo8Zm9udC1mYWNlIHVuaXRzLXBlci1lbT0iMTAyNCIgYXNjZW50PSI5NjAiIGRlc2NlbnQ9Ii02NCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjEwMjQiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gyMDsiIGhvcml6LWFkdi14PSI1MTIiIGQ9IiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MDA7IiBnbHlwaC1uYW1lPSJzYXZlIiBkYXRhLXRhZ3M9IuS/neWtmCIgZD0iTTcxOC4xNzEgODE5LjIwNGgtNTAwLjEyYy00Ni4zNzggMC04My45OC0zNi45NDUtODMuOTgtODIuNDk1di01NzcuNDYyYzAtNDUuNTUgMzcuNjAxLTgyLjQ5NSA4My45OC04Mi40OTVoNTg3Ljg1NWM0Ni40MjIgMCA4My45OCAzNi45NDUgODMuOTggODIuNDk1djQ5MS4yNTVsLTE3MS43MTQgMTY4LjcwMnpNNTExLjQzMiAxNTYuMTAzYy02OS41NjggMC0xMjUuOTkxIDU1LjQxOS0xMjUuOTkxIDEyMy43NjMgMCA2OC4zMDEgNTYuNDIyIDEyMy43MiAxMjUuOTkxIDEyMy43MnMxMjUuOTkxLTU1LjQxOSAxMjUuOTkxLTEyMy43MmMwLTY4LjM0Ni01Ni40MjItMTIzLjc2My0xMjUuOTkxLTEyMy43NjN6TTYzNy44NiA1NjkuMjc0aC00MTkuODk3djE2NC45OWg0MTkuODk3di0xNjQuOTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwMTsiIGdseXBoLW5hbWU9ImJhc2VsYXllciIgZGF0YS10YWdzPSLlupXlm74iIGQ9Ik01MTEuOTMyIDgyMy40NjdjLTIwNi45ODUgMC0zNzUuMzk4LTE2OC40MTQtMzc1LjM5OC0zNzUuNDY3czE2OC40MTQtMzc1LjQ2NyAzNzUuMzk4LTM3NS40NjdjMjA3LjEyMSAwIDM3NS41MzUgMTY4LjQxNCAzNzUuNTM1IDM3NS40NjdzLTE2OC40MTQgMzc1LjQ2Ny0zNzUuNTM1IDM3NS40Njd6TTMyMC45OSAyODQuMDkyYzAgMTEuNjA1LTExLjE5NiA1MS44ODMtMTEuMTk2IDg2LjM1NyAwIDM0LjU0My01MS4yIDMzLjkyOS01MS4yIDc5Ljg3MiAwIDQxLjM3IDI3Ljc4NSA2MS45MTggMjEuNTA0IDgxLjcxNS02LjA3NiAxOS43OTctNTQuOTU1IDIwLjQ4LTc1LjI5OCAyMi45MzggMzUuNTY3IDEwNS44MTMgMTE5LjI2MiAxODQuMjUyIDIyMC4xNiAyMDAuMjI2LTYuNjIyLTE0Ljc0Ni0yNC4wOTgtMjAuNzUzLTM0LjY3OS0zMS44MTItMjMuMDc0LTI0LjAzMC0zMy4wNDEtMjAuNjg1LTQ1LjUzNC00My43NTktMTIuNDkzLTIyLjkzOC01Mi45MDctNTYuMTE1LTUyLjkwNy03Mi43MDQgMC0xNi42NTcgMjAuNDEyLTM2LjI1IDMwLjU4My0zMi40OTUgMTAuMTcyIDMuODkxIDM3LjEzNyAzLjY4NiA1Mi45NzUtMi42NjIgMTUuODM4LTYuNDE3IDEzMi4zMDEtMTIuODM0IDk1LjIzMi0xMjUuNTQyLTExLjc0Mi0zNS45MDgtNjMuMzUxLTI5LjkwMS03Ny4wMDUtODkuMjI1LTIuMDQ4LTguNzM4LTkuMTQ4LTQ1Ljg3NS05LjY5NC01OC4wOTUtMC44MTktMTguODQyIDExLjYwNS04OS44MzktNC4yMzMtODkuODM5LTE1LjkwNiAwLTU4LjcwOSA2My40ODgtNTguNzA5IDc1LjAyNXYwek01MDguNzIzIDE0MC44Yy0zNC42NzkgMC02Ny45MjUgNC44NDctOTkuMTIzIDEzLjc5IDE4LjkxIDguNjAyIDIwLjgyMSAxOS42NjEgMzcuOTU2IDIwLjM0MyAxOS43MjkgMC42ODMgMzUuNzAzIDYuNDg1IDU3Ljc1NCAxMC43MTggMTkuNzI5IDMuNjE4IDU0Ljg4NiAyMC44MjEgODUuODc5IDIzLjAwNiAyNi4wNzggMS43NzUgNzcuNTUxLTEuMjI5IDkxLjQ3Ny0yMi44MDEtNDkuOTcxLTI4LjUzNS0xMDkuNzA1LTQ1LjA1Ni0xNzMuOTQzLTQ1LjA1NnYwek03NjAuNTU5IDI3Ny4zMzNjLTEwLjM3NyA4LjgwNi0yMS4zNjcgMzIuNDk1LTEwLjk5MSA1Ny4xMzkgMTAuNDQ1IDI0Ljc4MSAxMy4xNzUgODIuMDU3IDEwLjg1NCAxMDQuMzExLTIuMzIxIDIyLjMyMy0xMy4wMzkgNzUuOTgxLTQyLjA1MiA3Ni41MjctMjkuMDEzIDAuNDEtNDguODc5IDEwLjg1NC02Ni4wODIgNDguMTI4LTM1LjcwMyA3Ny41NTEgNjcuMTA2IDkyLjUwMSAzMS4zMzQgMTM1LjQ0MS0xMC4wMzUgMTIuMDE1LTYxLjY0NS00OS42My02OS4xNTQgMzIuNTYzLTAuNTQ2IDUuODAzIDQuNjQyIDE0LjYwOSAxMS41MzcgMjMuNzU3IDExMi4xNjItNDAuODkyIDE5My4xOTUtMTU1Ljg1MyAxOTMuMTk1LTI5MS4wODkgMC03MC4xNzgtMjEuOTE0LTEzNC45NjMtNTguNTczLTE4Ni43NzhoLTAuMDY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MDI7IiBnbHlwaC1uYW1lPSJtYXJrZXIiIGRhdGEtdGFncz0i54K5IiBkPSJNNTEyIDg5MS43MzNjLTE2OS42NDMgMC0zMDcuMi0xNDkuMDI2LTMwNy4yLTMxNi45NjIgMC0xOTkuNjEyIDMwNy4yLTU3MC41MDUgMzA3LjItNTcwLjUwNXMzMDcuMiAzNzAuODkzIDMwNy4yIDU3MC41MDVjMCAxNjcuOTM2LTEzNy41NTcgMzE2Ljk2Mi0zMDcuMiAzMTYuOTYyek02ODIuNjY3IDU4NC41MzNjMC05NC4yMDgtNzYuMzktMTcwLjY2Ny0xNzAuNjY3LTE3MC42NjdzLTE3MC42NjcgNzYuNDU5LTE3MC42NjcgMTcwLjY2N2MwIDk0LjI3NiA3Ni4zOSAxNzAuNjY3IDE3MC42NjcgMTcwLjY2N3MxNzAuNjY3LTc2LjM5IDE3MC42NjctMTcwLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTAzOyIgZ2x5cGgtbmFtZT0idW5jaGVjayIgZGF0YS10YWdzPSLlpJrpgIlf5pyq6YCJ5LitIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc5OS42NjggODUyLjUzM2gtNTc3Ljc4OGMtNjMuODk4IDAtMTE1LjU4OC01MS43OTItMTE1LjU4OC0xMTUuNTg4di01NzcuODM5YzAtNjMuNzk2IDUxLjY5LTExNS41ODggMTE1LjU4OC0xMTUuNTg4aDU3Ny44MzljNjMuNzk2IDAgMTE1LjU4OCA1MS43OTIgMTE1LjU4OCAxMTUuNTg4djU3Ny44MzljLTAuMDUxIDYzLjc5Ni01MS44NDQgMTE1LjU4OC0xMTUuNjM5IDExNS41ODh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNDsiIGdseXBoLW5hbWU9ImNoZWNrZWQiIGRhdGEtdGFncz0i5aSa6YCJX+mAieS4rSIgaG9yaXotYWR2LXg9IjEwMjIiIGQ9Ik04MDEuMzU0IDg1Mi41MzNoLTU3Ny43ODhjLTYzLjg5OCAwLTExNS41ODgtNTEuNzkyLTExNS41ODgtMTE1LjU4OHYtNTc3LjgzOWMwLTYzLjc5NiA1MS42OS0xMTUuNTg4IDExNS41ODgtMTE1LjU4OGg1NzcuODM5YzYzLjc5NiAwIDExNS41ODggNTEuNzkyIDExNS41ODggMTE1LjU4OHY1NzcuODM5Yy0wLjA1MSA2My43OTYtNTEuODQ0IDExNS41ODgtMTE1LjYzOSAxMTUuNTg4ek00NjEuMjI5IDI1MC44OTJsLTIzNi42OTMgMjM2Ljc0NCA1NS42MjMgNTUuNjc0IDE4MS4xMjEtMTQ3LjE1NCAyODAuMjExIDI1Mi45MzUgNTguOTQzLTU4Ljk0My0zMzkuMjA1LTMzOS4yNTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNTsiIGdseXBoLW5hbWU9Inpvb20taW4iIGRhdGEtdGFncz0i5pS+5aSnIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc4Ny40NiA1MzAuNzQ1aC0yMzAuMzA4djIyNS43MTFjMCA1My4yNzQtMzYuOTggOTYuNDM0LTgyLjM4OCA5Ni40MzQtNDUuNTYxIDAtODIuNDM5LTQzLjE2LTgyLjQzOS05Ni40MzR2LTIyNS43MTFoLTIzMC4zMDhjLTU0LjA0MCAwLTk3LjcxMS0zNy4wODItOTcuNzExLTgyLjY5NCAwLTQ1Ljc2NSA0My42NzEtODIuNzQ1IDk3LjcxMS04Mi43NDVoMjMwLjMwOHYtMjI1LjY2YzAtNTMuMjc0IDM2LjkyOS05Ni40ODUgODIuNDM5LTk2LjQ4NSA0NS40NTkgMCA4Mi4zODggNDMuMjExIDgyLjM4OCA5Ni40ODV2MjI1LjY2aDIzMC4zMDhjNTMuOTg5IDAgOTcuNjYgMzcuMDMxIDk3LjY2IDgyLjc0NSAwIDQ1LjYxMi00My42NzEgODIuNjk0LTk3LjY2IDgyLjY5NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA2OyIgZ2x5cGgtbmFtZT0iY2xlYXIiIGRhdGEtdGFncz0i5YWz6ZetIiBkPSJNODg3LjgxNCA3MzguMDM1bC04My40NjcgODMuNTE0LTI5Mi4zLTI5Mi4zOTQtMjkyLjMgMjkyLjM5NC04My41MTQtODMuNTE0IDI5Mi4zLTI5Mi4zNDctMjkyLjMtMjkyLjM5NCA4My41MTQtODMuNTE0IDI5Mi4zIDI5Mi40NDIgMjkyLjMtMjkyLjQ0MiA4My40NjcgODMuNTE0LTI5Mi4zIDI5Mi4zOTR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNzsiIGdseXBoLW5hbWU9InNldHRpbmciIGRhdGEtdGFncz0i566h55CGIiBkPSJNNTEyIDUyMi4zMDNjLTQwLjcyMiAwLTczLjgwNi0zMi45NjktNzMuODA2LTczLjY5IDAtNDAuNjQ1IDMzLjA4Mi03My42OSA3My44MDYtNzMuNjkgNDAuNzk4IDAgNzMuODQ1IDMzLjA0NiA3My44NDUgNzMuNjkgMCA0MC42ODQtMzMuMDQ2IDczLjY5LTczLjg0NSA3My42OXpNODk1LjkxOCA0MDQuMzYydjg4LjQ2N2gtNTYuOTE4Yy0zLjg3NSAyOC4xNzItMTEuMDU0IDU1LjMwNy0yMS42MDkgODAuNjc0bDQ5LjIwMiAyOC40LTQ0LjIxNCA3Ni42MDctNTAuMjQxLTI4Ljg2MmMtMTcuMTk0IDIxLjY0NS0zNy4xNTMgNDAuOTktNTkuMjk2IDU3LjY0NmwyOS40MzggNTEuMDQ0LTc2LjY4MyA0NC4yMTQtMzAuMDUyLTUyLjA4MmMtMjUuMDYyIDkuNzQ5LTUxLjYyIDE2LjU4LTc5LjE3OCAxOS44ODJ2NjEuNDQ3aC04OC41ODJ2LTYzLjEzNmMtMjYuOTgyLTQuMTg1LTUyLjg4OS0xMS4yNDYtNzcuMTgzLTIxLjU3bC0zMi4xMjQgNTUuNDYtNzYuNzIxLTQ0LjIxNCAzMi44NTQtNTYuODA0Yy0yMC41NzEtMTYuNTA0LTM4Ljk1Ni0zNS40NjUtNTQuOTk4LTU2LjM4MWwtNTcuODM4IDMzLjM1My00NC4yOS03Ni42MDcgNTguMzc1LTMzLjY1OGMtOS40NzgtMjMuOTEtMTYuMTU5LTQ5LjE2NC0xOS42OS03NS40MTZoLTY3Ljk3MXYtODguNDY3aDY3Ljk3MWMzLjUzLTI2LjI1MyAxMC4yMDktNTEuNTA2IDE5LjY5LTc1LjQxNmwtNTguMzc1LTMzLjY1OCA0NC4yOS03Ni41MjkgNTcuODc4IDMzLjM1M2MxNi4wNDItMjAuOTE2IDM0LjM4Ny0zOS44NzcgNTQuOTk4LTU2LjQ1N2wtMzIuODU0LTU2LjgwNCA3Ni42ODMtNDQuMjE0IDMyLjEyNCA1NS41MzVjMjQuMjk0LTEwLjM2NCA1MC4yMDItMTcuNDY0IDc3LjE4My0yMS42MDl2LTYzLjE3NWg4OC41ODJ2NjEuNDg2YzI3LjU5NyAzLjI5OSA1NC4xMTYgMTAuMTMzIDc5LjE3OCAxOS44ODJsMzAuMDUyLTUyLjA4MiA3Ni42ODMgNDQuMTc1LTI5LjQ3NyA1MS4wNDRjMjIuMTQ2IDE2LjY1NyA0Mi4xMDIgMzYuMDM5IDU5LjI5NiA1Ny43MjVsNTAuMjQxLTI4Ljg2MiA0NC4yMTQgNzYuNTI5LTQ5LjIwMiAyOC40YzEwLjU1NiAyNS40MDYgMTcuNzcgNTIuNTQxIDIxLjYwOSA4MC42NzRoNTYuOTU3ek01MTEuNzY5IDI1Ny4yODljLTEwNi4wMDYgMC0xOTEuOSA4NS43NDEtMTkxLjkgMTkxLjUxNiAwIDEwNS44NTQgODUuODk0IDE5MS42NjkgMTkxLjkgMTkxLjY2OXMxOTEuOTM5LTg1LjgxOSAxOTEuOTM5LTE5MS42NjljMC0xMDUuNzM2LTg1LjkzMy0xOTEuNTE2LTE5MS45MzktMTkxLjUxNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA4OyIgZ2x5cGgtbmFtZT0iem9vbS10byIgZGF0YS10YWdzPSLpnaIiIGhvcml6LWFkdi14PSIxMDIyIiBkPSJNODI1LjMyOSA4MjIuMDU0aC0yNTIuNzEydi02My4wMDJoMjUyLjcxMnYtMjUxLjNoNjMuMDAydjMxNC4zMDJ6TTgyNS4zMjkgMTI5Ljk3OGgtMjUyLjcxMnYtNjMuMDAyaDMxNS43MTR2MzE1LjcxNGgtNjMuMDAyek0xMzMuMjA2IDgyMi4wNTR2LTMxNC4zMDJoNjMuMDAydjI1MS4zaDI1MS4zdjYzLjAwMmgtMjUxLjN6TTE5Ni4yMDggMzgyLjY5MmgtNjMuMDAydi0zMTUuNzE0aDMxNC4zMDJ2NjMuMDAyaC0yNTEuM3pNNjk5LjEzOCA1MDcuNzUyaC0xMjYuNTIxdjEyMy4yNzJoLTEyNS4xMDl2LTEyMy4yNzJoLTEyNS4wNjJ2LTEyNS4wNjJoMTI1LjA2MnYtMTIyLjQ3MWgxMjUuMTA5djEyMi40NzFoMTI2LjUyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA5OyIgZ2x5cGgtbmFtZT0iZGVmYXVsdC1sYXllciIgZGF0YS10YWdzPSLpu5jorqTlupXlm74iIGQ9Ik04NjkuNzA3IDc5NC41MzloLTUyOS42MTFjLTI0LjQ2NyAwLTQ0LjE5MS0xOS4yODQtNDQuMTkxLTQzLjAyN3YtMzI0LjQwM2MxMi4zMzQgMCAyNy4zNTggMCA0NC4xOTEgMHYyNTkuMjgyaDUyOS42MTF2LTM2NS41MDFoLTU1Ljc2MWM4LjM5Ny0xNy43NTYgMTMuNzM5LTMyLjc0MyAxMy43MzktMzIuNzQzLTMuMjUzLTMuNjk2LTYuNTg4LTYuODY5LTkuOTIyLTEwLjM2Nmg1MS45NDZjMjQuMjY1IDAgNDQuMDcwIDE5LjI4NCA0NC4wNzAgNDMuMTA2djQzMC42MjFjMCAyMy43NDMtMTkuNzY2IDQzLjAyNy00NC4wNzAgNDMuMDI3ek03NDkuNjI4IDMxMC4yODNjMCAwLTEyLjY5NSAxMS4wODgtMTkuMTIyIDEyLjQxMy02LjQ2NyAxLjQ0Ny02LjQ2NyAxLjQ0Ny05LjY4MSAwLjg0NC0xNi43OTQtMi45MzQtMzguMzY2LTM3LjMyMy03NC4wNDAtNjMuMDMyaC0xNzkuODk4Yy0xMS4yODggOS44ODMtMjEuMzczIDIwLjg5MS0yOS40ODcgMzMuNDYzaDk5LjU5MmMwIDAgMjguNDAyLTEuODQ4IDI4LjQwMiAyMC4zMjcgMCAyMi4yNTcgMCA1NS41NjEgMCA1NS41NjFzMS44MDggMjcuNzU5LTI4LjQwMiAyNy43NTljLTkuODgzIDAtNjQuNTYgMC0xMjMuNTM0IDBoLTIyLjgxOGMtMTkuMjg0IDAtMzguMjg1IDAtNTYuMDAzIDAtMTguODQxIDAtMzUuNzk0IDAtNDkuNjU0IDAtMjAuNzI5IDAtMzQuNDI4IDAtMzQuNDI4IDB2LTIzNi44NjVjMCAwIDE5My40NzYtNTkuMTc2IDI2MS42OTEtNTkuMTc2IDAgMCAxNTkuODUyLTYuNTg4IDI3My4zODMgMTEwLjQ3OSAzLjY5NiAzLjg1NiA3LjU1MyA3LjQ3IDExLjA4OCAxMS41NjkgMCAwLTUuOTA2IDE2Ljk1My0xNS40MjkgMzYuODQtOC4yNzYgMTcuMzk1LTE5LjI4NCAzNy4wODEtMzEuNjU4IDQ5LjgxNXpNMTEwLjI2MiAxMDEuNTgxaDk4LjYyN3YzMjUuNTI4aC05OC42Mjd2LTMyNS41Mjh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwYTsiIGdseXBoLW5hbWU9Imdyb3VwIiBkYXRhLXRhZ3M9Iue+pOe7hCIgaG9yaXotYWR2LXg9IjEwMjYiIGQ9Ik02NzguOTA5IDQ4OC43NTljNjguMzk3IDAgMTIzLjcxMiA1NC43MDIgMTIzLjcxMiAxMjIuMTQxIDAgNjcuNTE1LTU1LjI3OSAxMjIuMTc5LTEyMy43MTIgMTIyLjE3OS02OC4yNDMgMC0xMjMuNjM3LTU0LjY2NC0xMjMuNjM3LTEyMi4xNzkgMC02Ny40MzggNTUuMzk0LTEyMi4xNDEgMTIzLjYzNy0xMjIuMTQxek0zNDkuMTYxIDQ4OC43NTljNjguMzIgMCAxMjMuNzEyIDU0LjcwMiAxMjMuNzEyIDEyMi4xNDEgMCA2Ny41MTUtNTUuMzU0IDEyMi4xNzktMTIzLjcxMiAxMjIuMTc5LTY4LjI0MyAwLTEyMy43MTItNTQuNjY0LTEyMy43MTItMTIyLjE3OSAwLjAzOS02Ny40MzggNTUuNDY5LTEyMi4xNDEgMTIzLjcxMi0xMjIuMTQxek0zNDkuMTYxIDM5OS4zMDJjLTI0NS41ODQgMC0yODguNTg4LTEyNS42MzEtMjg4LjU4OC0xMjUuNjMxdi0xMTAuNzA5aDU3Ny4xMzZ2MTEwLjcwOWMwIDAtMzYuNTU3IDEyNS42MzEtMjg4LjU0OCAxMjUuNjMxek02NDIuODg5IDQwNy4zMTljLTEuOTU1IDAuMDM5LTMuODM1IDAuMDM5LTUuNzU0IDAuMDM5bDAuNjEzLTAuMDM5YzAgMCA2Ny44OTktNDcuODM2IDc3LjMzNS0xMTIuMDE0bDQuOTQ4LTEzMi4zNDNoMjQ3LjU0MnYxMTAuNzA5Yy0wLjAzOSAwLTE4LjI1OSAxMjMuNTk3LTMyNC42ODUgMTMzLjY0OXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTBiOyIgZ2x5cGgtbmFtZT0iZGVsZXRlIiBkYXRhLXRhZ3M9IuWIoOmZpCIgZD0iTTYwOC4xNSA3MzUuOTg2djQ4LjA5NGMwIDI2LjU0My0yMS41ODggNDguMDU1LTQ4LjA1NSA0OC4wNTVoLTk2LjE1Yy0yNi41NDMgMC00OC4wNTUtMjEuNTEyLTQ4LjA1NS00OC4wNTV2LTQ4LjA5NGgtMjQwLjM1NHYtNDguMDU1aDY3Mi45MjZ2NDguMDU1aC0yNDAuMzE1ek01NjAuMDk0IDczNS45ODZoLTk2LjE1djQ4LjA5NGg5Ni4xNXYtNDguMDk0ek0yMjMuNTkgNTkxLjc4MnYtNDMyLjU3NWMwLTUzLjEyNiA0My4wNjItOTYuMTUgOTYuMTUtOTYuMTVoMzg0LjUyYzUzLjEyNiAwIDk2LjE1IDQzLjAyNCA5Ni4xNSA5Ni4xNXY0ODAuNjY3aC01NzYuODE1di00OC4wOTR6TTYwOC4xNSAzNTEuNDY2djE5Mi4yNmg5Ni4xMXYtMzg0LjUyaC05Ni4xMXYxOTIuMjZ6TTQ2My45NDUgMzUxLjQ2NnYxOTIuMjZoOTYuMTV2LTM4NC41MmgtOTYuMTV2MTkyLjI2ek0zMTkuNzQgMzUxLjQ2NnYxOTIuMjZoOTYuMTV2LTM4NC41MmgtOTYuMTV2MTkyLjI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MGM7IiBnbHlwaC1uYW1lPSJ1cCIgZGF0YS10YWdzPSLkuIrnp7siIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik00NzQuNjQ5IDgxNy4zNjFsLTI2Ny41MTgtMzU0LjY4NGgxMzguNDg3di0zOTEuMDQ3aDI1OC4wNjR2MzkxLjA0N2gxMzguNDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwZDsiIGdseXBoLW5hbWU9Indhcm5pbmciIGRhdGEtdGFncz0i6K6+572uIiBkPSJNNTA2LjIyOCA4MzIuNzU2Yy0yMTIuMTU1LTIuOTIzLTM4MS43NTQtMTc3LjE4LTM3OC45NDgtMzg5LjQ5IDIuODEtMjEyLjE1NSAxNzcuMTAzLTM4MS44MzMgMzg5LjE4MS0zNzkuMDYyIDIxMi4xMTggMi44NDkgMzgxLjc5NCAxNzcuMTggMzc4Ljk4NCAzODkuNDExLTIuODEgMjEyLjE1NS0xNzcuMTQgMzgxLjkxMS0zODkuMjE5IDM3OS4xNDF6TTU0OC43ODMgNzA0LjYzMmMzOS4wNTIgMCA1MC41OTYtMjIuNjI1IDUwLjU5Ni00OC41NTcgMC0zMi4zOTYtMjUuOTcyLTYyLjI5My03MC4xMDItNjIuMjkzLTM3LjAxNCAwLTU0LjU5NyAxOC42Mi01My41OTggNDkuMzY2IDAuMDM5IDI1LjkzMyAyMS43NCA2MS40ODUgNzMuMTA0IDYxLjQ4NXpNNDQ4LjcwOCAyMDguMzM1Yy0yNi43MDEgMC00Ni4zMjUgMTYuMTYtMjcuNjI2IDg3LjM3OWwzMC42NjYgMTI2LjMxN2M1LjI3IDIwLjIgNi4xNTYgMjguMzE5IDAgMjguMzE5LTguMDQxIDAtNDIuNjY5LTEzLjk2Ni02My4xNzgtMjcuNzQxbC0xMy4zMSAyMS45MzJjNjQuOTQ2IDU0LjI1MiAxMzkuNTkgODYuMDMxIDE3MS41NjQgODYuMDMxIDI2LjY2MyAwIDMxLjEyOC0zMS41NTEgMTcuNzczLTgwLjE4NmwtMzUuMDEyLTEzMi43NzljLTYuMjM0LTIzLjUwOC0zLjU3OC0zMS42MjYgMi42NTQtMzEuNjI2IDguMDQxIDAgMzQuMjQ0IDkuNzczIDYwLjAyMiAzMC4wNTBsMTUuMTIyLTIwLjI3N2MtNjMuMTM5LTYzLjEzOS0xMzEuOTcyLTg3LjQxOS0xNTguNjczLTg3LjQxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTBlOyIgZ2x5cGgtbmFtZT0icmV0cmFjdCIgZGF0YS10YWdzPSLmlLbotbfpnaLmnb8iIGQ9Ik0xNzcuOTY4IDEwMC4xOWg3MDUuNDAydjk0LjA1NGgtNzA1LjQwMnYtOTQuMDU0ek01MTYuNDY4IDY1NS4xNTNsMjg1Ljc4Mi0yODUuNzgyIDgzLjA5NiA4My4wOTYtMzY4Ljg3OCAzNjguOTI1LTM4My44OC0zODMuODggODMuMDk2LTgzLjE0NCAzMDAuNzgzIDMwMC43ODN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwZjsiIGdseXBoLW5hbWU9InNlYXJjaCIgZGF0YS10YWdzPSLmkJzntKIiIGQ9Ik04NTIuNiAyMTEuMjc1bC0xMjYuNDkxIDEzMS4zMDhjMCAwLjA3OC0wLjA3OCAwLjA3OC0wLjA3OCAwLjA3OGwtMjAuMDM2IDIwLjc2OWMyNy44NTggNDcuMDQzIDQ0LjMwOCAxMDIuMDI2IDQ0LjMwOCAxNjEuMjgzIDAgMTcwLjk5NC0xMzMuNTA0IDMwOS41MDYtMjk4LjEzOSAzMDkuNTA2LTE2NC43MTIgMC0yOTguMjE2LTEzOC41NTEtMjk4LjIxNi0zMDkuNTA2czEzMy41MDQtMzA5LjU4NCAyOTguMjE2LTMwOS41ODRjNDIuMjI3IDAgODIuMDI5IDkuNzEgMTE4LjM2MiAyNi4yNzhsNjAuNDkyLTYyLjc2NWMwLjA3OC0wLjA3OCAwLjA3OC0wLjE1MyAwLjE1My0wLjE1M2wwLjc3Mi0wLjgwOSA5NC4xMjYtOTcuNjcyYzIzLjI3My0yNC4yMzUgNjEuMDI5LTI0LjIzNSA4NC4zNDEgMGw0Mi4xNTIgNDMuNzMyYzIzLjI3MyAyNC4xOTggMjMuMjczIDYzLjM0MSAwLjAzOSA4Ny41Mzh6TTQ1Mi4xNjMgMzM4LjkyNWMtOTguODY3IDAtMTc4Ljg5MSA4My4xNDYtMTc4Ljg5MSAxODUuNzg3IDAgMTAyLjU2NiA3OS45ODcgMTg1LjcxMiAxNzguODkxIDE4NS43MTIgOTguNzg5IDAgMTc4Ljg5MS04My4xNDYgMTc4Ljg5MS0xODUuNzEyIDAtMTAyLjY0MS04MC4wNjQtMTg1Ljc4Ny0xNzguODkxLTE4NS43ODd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxMDsiIGdseXBoLW5hbWU9InRyaWFuZ2xlLW9sZCIgZGF0YS10YWdzPSLlm77lsYLlvLnnqpfkuInop5IiIGhvcml6LWFkdi14PSIxMDIyIiBkPSJNMzgzLjEgMzIwLjI3NWgyNTUuNHYyNTUuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTExOyIgZ2x5cGgtbmFtZT0iem9vbS1vdXQiIGRhdGEtdGFncz0i57yp5bCPIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTgyMy40NjkgNTI5LjI2NGgtNjI1LjQ0NGMtNTMuOTM4IDAtOTcuNjYtMzYuNDY4LTk3LjY2LTgxLjI2NCAwLTQ0Ljk0OSA0My43MjItODEuMzY2IDk3LjY2LTgxLjM2Nmg2MjUuNDQ0YzUzLjk5IDAgOTcuNzYzIDM2LjQxNyA5Ny43NjMgODEuMzY2IDAgNDQuODQ2LTQzLjc3MyA4MS4yNjQtOTcuNzYzIDgxLjI2NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTEyOyIgZ2x5cGgtbmFtZT0ibGF5ZXJzIiBkYXRhLXRhZ3M9IuaJgOacieW6leWbviIgaG9yaXotYWR2LXg9IjEwMjYiIGQ9Ik04NzcuNzk1IDU4NS42MjJsLTM2NC45ODcgMjQ5LjgxMy0zNjQuOTA0LTI0OS44MTMgMzY0LjkwNC0yNDkuODEzIDM2NC45ODcgMjQ5LjgxM3pNNTEyLjgwOCAyODAuMDM5bC0zMjIuMDgwIDIxMi4zODgtNDIuNzg3LTQ0LjQwMyAzNjQuOTA0LTI0OS44MTMgMzY0Ljk4NyAyNDkuODEzLTQzLjM2NyA0NS4zNjUtMzIxLjY1Ni0yMTMuMzV6TTUxMi44MDggMTQyLjQzNGwtMzIyLjA4MCAyMTIuNDI0LTQyLjc4Ny00NC40ODIgMzY0LjkwNC0yNDkuODEzIDM2NC45ODcgMjQ5LjgxMy00My4zNjcgNDUuNDQ5LTMyMS42NTYtMjEzLjM4NnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTEzOyIgZ2x5cGgtbmFtZT0iYWRkLW9sZCIgZGF0YS10YWdzPSLmt7vliqDlm77lsYIiIGQ9Ik04NDkuMTMzIDUxMS40NjNoLTI3Mi4zMDF2MjcyLjI1NGMwIDM1LjgxMy0yOS4wMTggMzguODgtNjQuODMyIDM4Ljg4cy02NC44MzItMy4wNjctNjQuODMyLTM4Ljg4di0yNzIuMzAxaC0yNzIuMzAxYy0zNS44MTMgMC0zOC44OC0yOS4wMTgtMzguODgtNjQuODMyczMuMDY3LTY0LjgzMiAzOC44OC02NC44MzJoMjcyLjMwMXYtMjcyLjMwMWMwLTM1LjgxMyAyOS4wMTgtMzguODggNjQuODMyLTM4Ljg4czY0LjgzMiAzLjA2NyA2NC44MzIgMzguODh2MjcyLjMwMWgyNzIuMzAxYzM1LjgxMyAwIDM4Ljg4IDI5LjAxOCAzOC44OCA2NC44MzJzLTMuMTE0IDY0Ljg3OS0zOC44OCA2NC44Nzl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxNDsiIGdseXBoLW5hbWU9ImJydXNoIiBkYXRhLXRhZ3M9IuWbvuWxguagt+W8jyIgZD0iTTkxMC4xNzUgNzk3Ljk1MmMwIDAtMjEuMDU4IDEwLjU1LTE2MS40OC05Mi42ODQgMCAwLTE0My40ODgtMTE5LjgwMi0yNDMuMTY2LTIwMS45MzYtNDIuODAzIDkuNDE5LTYxLjYwMS0yMi4zNTQtNjEuNjAxLTIyLjM1NC0zOS40ODgtMzMuMjY1LTIzLjM2NC01NS4yNTctMzEuMTY1LTYxLjcxOS0yMS4yMjMtMTcuNTQ0LTM0LjM5Ny0yOC4zNzMtMzQuMzk3LTI4LjM3M2wxMzAuMTktMTMxLjg5MmMwIDAgNS45ODQgMTAuNzExIDI4LjI1NiAzNy44MzUgMzIuNDE2IDAuMTI0IDU5LjU3OSAyOC4yNTYgNTkuNTc5IDI4LjI1NnMyNC4wMDkgNDcuMjkgMTIuODkzIDYwLjE0NWM4Mi44NiAxMDEuMDA5IDE5MC45NDMgMjI5LjUwNiAxOTAuOTQzIDIyOS41MDYgNDQuMDE3IDU3LjAzMyAxMjEuMDE3IDE4Mi4wMTAgMTA5Ljk0MyAxODMuMjI0ek0yMzguNDc5IDIzMi4yODFjMC0xMjMuMTk5LTEzMS40ODktMTA2LjU4Ny0xMzEuNDg5LTEwNi41ODdzMjY2Ljc3LTE0OS4xOSAzODEuODAyIDExNS42NDJsLTEyMi40MzEgMTIxLjc4NmMwIDAtMTI3Ljg4OC03LjU2LTEyNy44ODgtMTMwLjgzOXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE1OyIgZ2x5cGgtbmFtZT0iZXllLWNsb3NlZCIgZGF0YS10YWdzPSLlt7LpmpDol49pY29uIiBkPSJNNjYyLjQ2NCA2NzMuODA0bDk0LjI3MiA5NC4yMDggOTAuNDk2LTkwLjQ5Ni01ODguMzUyLTU4OC4zNTItOTAuNDk2IDkwLjQ5NiA4Ny42MTYgODcuNjhjLTEyMC4zODQgNzMuNTM2LTE5MiAxNzQuNTI4LTE5MiAxNzQuNTI4czI0OC44MzIgMzY4LjA2NCA1OTguNDY0IDIzMS45MzZ6TTM0My44NzIgMzU1LjIxMmwyNjAuOTI4IDI2MC45MjhjLTI3LjUyIDE1LjE2OC01OS4xMzYgMjMuODcyLTkyLjggMjMuODcyLTEwNS45ODQgMC0xOTItODUuOTUyLTE5Mi0xOTIgMC0zMy42NjQgOC42NC02NS4zNDQgMjMuODcyLTkyLjh6TTgxNi43NjggNTgzLjA1MmM0Ni41OTItMzYuOCA5NC40NjQtODMuMzI4IDE0My4yMzItMTQxLjE4NC0xOTcuNzYtMjIzLjYxNi0zNzkuOTY4LTI2OS4zNzYtNTI3Ljc0NC0yNDMuMzI4bDU4LjYyNCA1OC42MjRjNi45MTItMC43NjggMTMuOTUyLTEuMTUyIDIxLjEyLTEuMTUyIDEwNS45ODQgMCAxOTIgODUuOTUyIDE5MiAxOTIgMCA3LjEwNC0wLjM4NCAxNC4yMDgtMS4xNTIgMjEuMTJsMTEzLjkyIDExMy45MnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE2OyIgZ2x5cGgtbmFtZT0iZG93biIgZGF0YS10YWdzPSLkuIvnp7siIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik00NzQuNzEzIDM5LjMzbC0yOTAuNDc3IDM4NS4xMjRoMTUwLjM3MnY0MjQuNjA3aDI4MC4yMTF2LTQyNC42MDdoMTUwLjMyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE3OyIgZ2x5cGgtbmFtZT0ibGluZSIgZGF0YS10YWdzPSLnur8iIGQ9Ik04MjQuOTc3IDgwMi40NjJjLTU3LjYgNTAuODI3LTE0NS41NTIgNDUuMzAxLTE5Ni4zNzktMTIuMjYtNDQuNTk5LTUwLjU5Mi00NS43NjctMTI0LjQ5Ny02LjQxOS0xNzYuMTgxbC0yNjEuNDEtMjk2LjI4MmMtNTYuMTk3IDMyLjU3NC0xMjkuMzI1IDIyLjE4NC0xNzQuMDAxLTI4LjM3MS01MC44MjctNTcuNjM4LTQ1LjMwMS0xNDUuNTEzIDEyLjMzOC0xOTYuNDE4IDU3LjYtNTAuODI3IDE0NS41NTItNDUuMzAxIDE5Ni4zNzkgMTIuMzM4IDQ0LjQ0NCA1MC40MDEgNDUuODA2IDEyMy45NTIgNi45MjYgMTc1LjYzNmwyNjEuNTY3IDI5Ni4zOThjNTYuMTE4LTMyLjEwOCAxMjguODk0LTIxLjU2MSAxNzMuMzQxIDI4LjggNTAuODI3IDU3LjYgNDUuMzAxIDE0NS41NTItMTIuMzM4IDE5Ni4zNHpNMzQ1LjAwNSAxODcuNjAxYy01LjA2MC0zMC4zMTctMzMuNzQyLTUwLjc0OS02NC4wNTktNDUuNjg5LTMwLjIzOCA1LjA5OS01MC43ODggMzMuNzgyLTQ1LjY1IDY0LjA5OCA1LjA2MCAzMC4yNzggMzMuNzQyIDUwLjc4OCA2NC4wNTkgNDUuNjUgMzAuMzE3LTUuMDYwIDUwLjc4OC0zMy43NDIgNDUuNjUtNjQuMDU5ek03ODcuODEgNjg4LjI3NmMtNS4wNjAtMzAuMzE3LTMzLjc0Mi01MC43ODgtNjQuMDU5LTQ1LjcyOC0zMC4zMTcgNS4xMzgtNTAuNzg4IDMzLjgyMS00NS43MjggNjQuMTM4IDUuMTM4IDMwLjIzOCAzMy44MjEgNTAuNzg4IDY0LjEzOCA0NS42NSAzMC4yMzgtNS4wNjAgNTAuNzQ5LTMzLjc0MiA0NS42NS02NC4wNTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxODsiIGdseXBoLW5hbWU9InBlbiIgZGF0YS10YWdzPSLkv67mlLnmoLflvI8iIGQ9Ik0xMzcuNjA2IDc0LjM3bDE5Mi40NjkgNzEuNjU1LTExOS4zNjIgMTE5LjM2Mi03My4xMDctMTkxLjAxOHpNODcyLjM3NyA3MDYuMzU3bC0xMDEuMjIgMTAxLjMzNGMtMTguNjM5IDE4LjYwMi00OC45MjggMTguNjAyLTY3LjYwOCAwbC00MDUuMjU4LTQwNS4yMjFjLTE4LjYzOS0xOC42MzktNzYuMzE0LTgyLjY1Ny01Ny42NzYtMTAxLjI1N2wxMjUuMTY2LTEyNS4xNjZjMTguNjM5LTE4LjY3NyA4Mi43MzEgMzguOTYgMTAxLjM3MyA1Ny42MzdsNDA1LjIyMSA0MDUuMTQyYzE4LjcxNiAxOC42NzcgMTguNzE2IDQ4Ljg5MiAwIDY3LjUzek01OTQuMDA2IDUwMC40MDZsLTMzLjgwNCAzMy44MDQgMTcwLjMxNyAxNzAuMzE3IDMzLjgwNC0zNS4yNTQtMTcwLjMxNy0xNjguODYzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MTk7IiBnbHlwaC1uYW1lPSJ1c2VyIiBkYXRhLXRhZ3M9IueUqOaItyIgaG9yaXotYWR2LXg9IjEwMjIiIGQ9Ik01MDcuODQ2IDQ1MS4yMTVjMTAzLjkyMiAwIDE4OC4xMDIgODQuODY5IDE4OC4xMDIgMTg5LjQ3OSAwIDEwNC42NDktODQuMTc4IDE4OS41MTgtMTg4LjEwMiAxODkuNTE4LTEwMy44ODQgMC0xODguMTAyLTg0Ljg2OS0xODguMTAyLTE4OS41MThzODQuMjE3LTE4OS40NzkgMTg4LjEwMi0xODkuNDc5ek01MTAuMzczIDM0OC41MTVjLTMyNS4zMTYgMC0zODIuMTczLTE2OC40MzUtMzgyLjE3My0xNjguNDM1di0xMTQuMjkyaDc2NC40MjV2MTE0LjI5MmMwIDAtNDguNDc5IDE2OC40MzUtMzgyLjI1MSAxNjguNDM1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWE7IiBnbHlwaC1uYW1lPSJkb3duLWVuZCIgZGF0YS10YWdzPSLnva7lupUiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik03NDUuNzkxIDY5Ljk0NmgtNTQyLjE4OXY2My4yOTFoMjI0LjU1NWwtMjIzLjcwOCAyOTAuODExaDEzOS44NTN2Mzk0Ljk0OGgyNjAuNjAxdi0zOTQuOTQ4aDEzOS44NTNsLTIyMy44MDItMjkwLjgxMWgyMjQuODM4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWI7IiBnbHlwaC1uYW1lPSJ1cC1lbmQiIGRhdGEtdGFncz0i572u6aG2IiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc1MS40ODcgODIwLjUwMmgtNTQyLjE4OXYtNjMuMjkxaDIyNC41NTVsLTIyMy42NjEtMjkwLjgxMWgxMzkuODA2di0zOTQuOTQ4aDI2MC42MDF2Mzk0Ljk0OGgxMzkuOWwtMjIzLjg0OSAyOTAuODExaDIyNC44Mzh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxYzsiIGdseXBoLW5hbWU9InRleHQiIGRhdGEtdGFncz0i6YeN5ZG95ZCNIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTE3MC42NjcgNzg5LjMzM2g2ODIuNjY3di0xMzYuNTMzaC02ODIuNjY3djEzNi41MzN6TTQ0My43MzMgNjUyLjhoMTM2LjUzM3YtNTQ2LjEzM2gtMTM2LjUzM3Y1NDYuMTMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWQ7IiBnbHlwaC1uYW1lPSJjdXN0b21pemUiIGRhdGEtdGFncz0i6Ieq5a6a5LmJ5bqV5Zu+IiBkPSJNNzE3LjQ0IDI5Mi4xMzhjLTMuOTE0IDEyMi44MjctMjkuNjYyIDIxNi44NzQtMTk2LjU3NCAyMTYuODc0LTE2Ni4zNCAwLTE5Mi43MzgtNzUuNjMtMTk2LjYxMy0yMTYuODc0aDY1LjM0NmM2Ljc5IDI5Ljk2NyAxNi44MDYgNTUuMTc4IDMwLjYyMiA3NC44NjNsLTEuNDU4LTEyOC41NDRoMjA4LjIwM2wtMS43NjUgMTIxLjEzOGMxMS41NTEtMTguNTczIDIwLjQ4OS00MC45NDIgMjYuNjI5LTY3LjQ1OGg2NS42MTZ6TTUyMi4wNTQgNTE2LjA2OWM0OC42MTYgMCA4Ny45ODYgMzkuMjkzIDg3Ljk4NiA4Ny43OTRzLTM5LjM2OCA4Ny44Ny04Ny45ODYgODcuODctODguMDI1LTM5LjM2OC04OC4wMjUtODcuODcgMzkuNDA2LTg3Ljc5NCA4OC4wMjUtODcuNzk0ek01MTEuODg2IDgzMS41OTZjLTIxMS44MDggMC0zODMuNTk2LTE3MS40NDItMzgzLjU5Ni0zODIuODNzMTcxLjc4Ni0zODIuODY2IDM4My41OTYtMzgyLjg2NmMyMTEuODQ3IDAgMzgzLjYzNCAxNzEuNDQyIDM4My42MzQgMzgyLjg2NnMtMTcxLjc0OSAzODIuODMtMzgzLjYzNCAzODIuODN6TTUxMi4yMzEgMTUxLjA4M2MtMTY0LjkxOCAwLTI5OC42MDMgMTMzLjQ1NC0yOTguNjAzIDI5OC4xMDUgMCAxNjQuNTczIDEzMy42ODUgMjk4LjAyOSAyOTguNjAzIDI5OC4wMjkgMTY0Ljk5NiAwIDI5OC42ODEtMTMzLjQ1NCAyOTguNjgxLTI5OC4wMjkgMC0xNjQuNjktMTMzLjY4NS0yOTguMTA1LTI5OC42ODEtMjk4LjEwNXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTFlOyIgZ2x5cGgtbmFtZT0icG9seWdvbiIgZGF0YS10YWdzPSLpnaIiIGQ9Ik0zNTAuMDA3IDYyMy44NzFjNDcuMzUgNTMuNjg3IDQyLjIxOSAxMzUuNTU4LTExLjQ2OCAxODIuOTA4LTUzLjY4NyA0Ny4zMS0xMzUuNTU4IDQyLjIxOS0xODIuOTA4LTExLjQ2OC00Ny4zMS01My42NDgtNDIuMjE5LTEzNS41MTkgMTEuNDY4LTE4Mi44NjkgMTcuNTctMTUuNTEyIDM4LjIxNC0yNC44NDEgNTkuNzExLTI5LjIzNHYtMjY1LjUxNmMtMjYuNjY3LTUuNDQ0LTUxLjgyMi0xOC43MzgtNzEuMTc5LTQwLjcwMi00Ny4zMS01My42ODctNDIuMjE5LTEzNS41NTggMTEuNDY4LTE4Mi45MDggNTMuNjg3LTQ3LjQyOCAxMzUuNDgtNDIuMjE5IDE4Mi45MDggMTEuNDY4IDQ3LjM1IDUzLjYwOSA0Mi4yMTkgMTM1LjUxOS0xMS40NjggMTgyLjgzLTE3LjY0OSAxNS41NS0zOC40MSAyNC45MTktNTkuOTA3IDI5LjIzNHYyNjUuNTE2YzI2LjcwNiA1LjQwNSA1MS45NzUgMTguNzc4IDcxLjM3NSA0MC43NDJ6TTMwMy45MDIgMTgyLjA5NWMtNC43MDMtMjguMjYyLTMxLjQ0OS00Ny4zMS01OS42NzItNDIuNTI5LTI4LjI2MiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNTI5IDU5LjY3MiA0LjcwMyAyOC4yMjMgMzEuNDg4IDQ3LjIzMiA1OS42NzIgNDIuNTI5IDI4LjE0NS00LjcwMyA0Ny4zMS0zMS40MSA0Mi41MjktNTkuNjcyek0yNTQuODAxIDY1Ny4yMjZoLTAuMjMzYy0zLjM4Mi0wLjExOC02Ljg0MyAwLjExOC0xMC4zNzggMC43LTI4LjI2MiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNTI5IDU5LjY3MiA0LjcwMyAyOC4yMjMgMzEuNDg4IDQ3LjMxIDU5LjY3MiA0Mi41MjkgMjguMTg0LTQuNzAzIDQ3LjMxLTMxLjQ0OSA0Mi41MjktNTkuNjcyLTQuMDQ0LTI0LjcyMy0yNC45OTgtNDIuMzczLTQ5LjA2MC00My4yM3pNNzk2Ljk5NCAzMTcuNjEydjI2NS41MTZjMjYuNzA2IDUuNDQ0IDUxLjk3NSAxOC43NzggNzEuMzc1IDQwLjc4MSA0Ny4zMSA1My42ODcgNDIuMjE5IDEzNS41NTgtMTEuNTA3IDE4Mi45MDgtNTMuNjQ4IDQ3LjMxLTEzNS41NTggNDIuMjE5LTE4Mi44NjktMTEuNDY4LTE1LjY2Ni0xNy43NjYtMjUuMTE0LTM4LjY4LTI5LjM1Mi02MC4zNzRoLTI2MC42OTV2LTUxLjg2MWgyNjAuODEzYzUuNTk3LTI2LjQzNiAxOC44NTYtNTEuMzk0IDQwLjY2My03MC42MzUgMTcuNTctMTUuNTEyIDM4LjI1My0yNC44NDEgNTkuNzExLTI5LjIzNHYtMjY1LjQ3N2MtMjYuNjI4LTUuNDgyLTUxLjgyMi0xOC43NzgtNzEuMTQtNDAuNzgxLTE1LjY2Ni0xNy43NjYtMjUuMTE0LTM4LjcxOS0yOS4zOTEtNjAuNDEzaC0yNjAuNjU2di01MS44MjJoMjYwLjgxM2M1LjU5Ny0yNi40MzYgMTguODU2LTUxLjM5NCA0MC42NjMtNzAuNTk3IDUzLjcyNi00Ny40NjcgMTM1LjUxOS00Mi4yOTggMTgyLjk0NyAxMS4zOSA0Ny4zMSA1My42ODcgNDIuMjE5IDEzNS41OTgtMTEuNTA3IDE4Mi45MDgtMTcuNjEgMTUuNTUtMzguMzcgMjQuODQxLTU5Ljg2OCAyOS4xNTZ6TTcyMC4wNTggNzE3LjZjNC43MDMgMjguMjIzIDMxLjQ4OCA0Ny4zMSA1OS42NzIgNDIuNTI5IDI4LjI2Mi00LjcwMyA0Ny4zMS0zMS40NDkgNDIuNTI5LTU5LjY3Mi00LjA0NC0yNC42ODUtMjUuMDc2LTQyLjMzNi00OS4xMzctNDMuMTkxaC0wLjIzM2MtMy4zODItMC4xMTgtNi44NDMgMC4xMTgtMTAuMzM5IDAuNy0yOC4yMjMgNC42NjQtNDcuMjMyIDMxLjM3Mi00Mi40OSA1OS42MzN6TTgyMi4yMjQgMTgyLjA5NWMtNC43MDMtMjguMjYyLTMxLjQ4OC00Ny4zMS01OS42NzItNDIuNTI5LTI4LjMwMiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNjA3IDU5LjY3MiA0Ljc4MiAyOC4yMjMgMzEuNTI3IDQ3LjIzMiA1OS43MTEgNDIuNTI5czQ3LjM4OS0zMS40MSA0Mi41NjgtNTkuNjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWY7IiBnbHlwaC1uYW1lPSJvcGVuIiBkYXRhLXRhZ3M9IuaJk+W8gOmdouadvyIgZD0iTTM5OS43NTQgODMydi03NjhsNDk2LjI0NiAzODQtNDk2LjI0NiAzODR6TTEyOCA2NGgxNzcuMjMxdjc2OGgtMTc3LjIzMXYtNzY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjA7IiBnbHlwaC1uYW1lPSJvdmVybGF5IiBkYXRhLXRhZ3M9IuWcsOWbvuacjeWKoeWbvuWxgiIgZD0iTTEzNi41MzMgNjk5LjM1OGwxODIuMDY3IDU1Ljg0MiAzMTIuODY2LTU1Ljg0MiAyNTYgNTUuODQydi01NDYuMTMzbC0yNTYtNjguMjY3LTMxMi44NjYgNTUuODQyLTE4Mi4wNjctNTUuODQydjU1OC41NTh6TTM0MS4zMzMgNjg2LjkzM3YtNDI0Ljc1NWwyNzMuMDY3LTUzLjExMXY0MjQuNzU1bC0yNzMuMDY3IDUzLjExMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTIxOyIgZ2x5cGgtbmFtZT0icG9pbnQtbGF5ZXIiIGRhdGEtdGFncz0i54K55Zu+5bGCIiBkPSJNNTgwLjI2NyA0ODIuMTMzYzk0LjI3NiAwIDE3MC42NjcgNzYuMzkgMTcwLjY2NyAxNzAuNjY3cy03Ni4zOSAxNzAuNjY3LTE3MC42NjcgMTcwLjY2N2MtOTQuMjc2IDAtMTcwLjY2Ny03Ni4zOS0xNzAuNjY3LTE3MC42NjdzNzYuMzktMTcwLjY2NyAxNzAuNjY3LTE3MC42Njd6TTMwNy4yIDI3Ny4zMzNjNTYuNTI1IDAgMTAyLjQgNDUuODc1IDEwMi40IDEwMi40cy00NS44NzUgMTAyLjQtMTAyLjQgMTAyLjRjLTU2LjUyNSAwLTEwMi40LTQ1Ljg3NS0xMDIuNC0xMDIuNHM0NS44NzUtMTAyLjQgMTAyLjQtMTAyLjR6TTcxNi44IDE0MC44YzU2LjUyNSAwIDEwMi40IDQ1Ljg3NSAxMDIuNCAxMDIuNHMtNDUuODc1IDEwMi40LTEwMi40IDEwMi40Yy01Ni41MjUgMC0xMDIuNC00NS44NzUtMTAyLjQtMTAyLjRzNDUuODc1LTEwMi40IDEwMi40LTEwMi40eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjI7IiBnbHlwaC1uYW1lPSJoYW1idXJnIiBkYXRhLXRhZ3M9IuaxieWgoeWMhSIgZD0iTTEyOCAzODRoNzY4djEyOGgtNzY4di0xMjh6TTEyOCAxMjhoNzY4djEyOGgtNzY4di0xMjh6TTEyOCA3Njh2LTEyOGg3Njh2MTI4aC03Njh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyMzsiIGdseXBoLW5hbWU9InRyaWFuZ2xlIiBkYXRhLXRhZ3M9IuaJqeWxleS4ieinkiIgZD0iTTMzOS4yIDI3NS4yaDM0NS42djM0NS42eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjQ7IiBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiBkYXRhLXRhZ3M9IumdouWbvuWxgiIgZD0iTTMzNS41MzEgNjg2LjkzM2MtMTAuMzA4LTI5LjA4Mi0zMy4zODItNTIuMTU2LTYyLjQ2NC02Mi40NjR2LTM1Mi45MzljMjkuMDgyLTEwLjMwOCA1Mi4xNTYtMzMuMzgyIDYyLjQ2NC02Mi40NjRoMzUyLjkzOWMxMC4zMDggMjkuMDgyIDMzLjM4MiA1Mi4xNTYgNjIuNDY0IDYyLjQ2NHYzNTIuOTM5Yy0yOS4wODIgMTAuMzA4LTUyLjE1NiAzMy4zODItNjIuNDY0IDYyLjQ2NGgtMzUyLjkzOXpNMzM1LjUzMSA3NTUuMmgzNTIuOTM5YzE0LjA2MyAzOS43OTkgNTIuMDE5IDY4LjI2NyA5Ni41OTcgNjguMjY3IDU2LjUyNSAwIDEwMi40LTQ1Ljg3NSAxMDIuNC0xMDIuNCAwLTQ0LjU3OC0yOC40NjctODIuNTM0LTY4LjI2Ny05Ni41OTd2LTM1Mi45MzljMzkuNzk5LTE0LjA2MyA2OC4yNjctNTIuMDE5IDY4LjI2Ny05Ni41OTcgMC01Ni41MjUtNDUuODc1LTEwMi40LTEwMi40LTEwMi40LTQ0LjU3OCAwLTgyLjUzNCAyOC40NjctOTYuNTk3IDY4LjI2N2gtMzUyLjkzOWMtMTQuMDYzLTM5Ljc5OS01Mi4wMTktNjguMjY3LTk2LjU5Ny02OC4yNjctNTYuNTI1IDAtMTAyLjQgNDUuODc1LTEwMi40IDEwMi40IDAgNDQuNTc4IDI4LjQ2NyA4Mi41MzQgNjguMjY3IDk2LjU5N3YzNTIuOTM5Yy0zOS43OTkgMTQuMDYzLTY4LjI2NyA1Mi4wMTktNjguMjY3IDk2LjU5NyAwIDU2LjUyNSA0NS44NzUgMTAyLjQgMTAyLjQgMTAyLjQgNDQuNTc4IDAgODIuNTM0LTI4LjQ2NyA5Ni41OTctNjguMjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjU7IiBnbHlwaC1uYW1lPSJjbG9zZSIgZGF0YS10YWdzPSLmlLbotbfpnaLmnb8iIGQ9Ik02MjQuMjQ2IDY0djc2OGwtNDk2LjI0Ni0zODQgNDk2LjI0Ni0zODR6TTcxOC43NjkgODMydi03NjhoMTc3LjIzMXY3NjhoLTE3Ny4yMzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyNjsiIGdseXBoLW5hbWU9ImFkZCIgZGF0YS10YWdzPSLmt7vliqDlm77lsYIiIGQ9Ik04NTcuNiA1MTJoLTI4MS42djI4MS42YzAgMzguNC0yNS42IDM4LjQtNjQgMzguNHMtNjQgMC02NC0zOC40di0yODEuNmgtMjgxLjZjLTM4LjQgMC0zOC40LTI1LjYtMzguNC02NHMwLTY0IDM4LjQtNjRoMjgxLjZ2LTI3NS4yYzAtNDQuOCAyNS42LTQ0LjggNjQtNDQuOHM2NCAwIDY0IDM4LjR2MjgxLjZoMjc1LjJjNDQuOCAwIDQ0LjggMjUuNiA0NC44IDY0czAgNjQtMzguNCA2NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI3OyIgZ2x5cGgtbmFtZT0ibW9yZSIgZGF0YS10YWdzPSLkuIvmi4nkuInop5IiIGQ9Ik0yODggNTc2bDIyNC0yNTYgMjI0IDI1NnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI4OyIgZ2x5cGgtbmFtZT0ibGluZS1sYXllciIgZGF0YS10YWdzPSLnur/lm77lsYIiIGQ9Ik0zMzguOTI0IDMyMy4xNjhjLTM4LjAyNSAxOC4yMjctODUuMDYwIDExLjUzNy0xMTYuNTMxLTIwLjAwMi00MC4wMDQtNDAuMDA0LTQwLjAwNC0xMDQuNzg5IDAtMTQ0Ljc5NCAzOS45MzYtNDAuMDA0IDEwNC43ODktNDAuMDA0IDE0NC43OTQgMCAzMS41MzkgMzEuNTM5IDM4LjIyOSA3OC41MDcgMjAuMDAyIDExNi41MzFsMjk3LjkxNiAyOTcuOTE2YzM4LjAyNS0xOC4yMjcgODQuOTkyLTExLjUzNyAxMTYuNTMxIDIwLjAwMiA0MC4wMDQgNDAuMDA0IDQwLjAwNCAxMDQuNzg5IDAgMTQ0Ljc5NHMtMTA0Ljg1OCA0MC4wMDQtMTQ0Ljc5NCAwYy0zMS41MzktMzEuNTM5LTM4LjIyOS03OC41MDctMjAuMDcwLTExNi41MzFsLTI5Ny44NDctMjk3LjkxNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI5OyIgZ2x5cGgtbmFtZT0icmVzdC1hcGkiIGRhdGEtdGFncz0iV2Vi5pyN5Yqh5o6l5Y+jIiBob3Jpei1hZHYteD0iMTMzMCIgZD0iTTEyNDEuOTA3IDk2MC40MWgtMTE1My42NzljLTQ5LjAyOSAwLTg4Ljc2LTM5LjAzNS04OC43Ni04Ny4yNDV2LTg1MC4zNzFjMC00OC4xNjkgMzkuNzMxLTg3LjIwNCA4OC43Ni04Ny4yMDRoMTE1My42NzljNDkuMDcwIDAgODguODAxIDM5LjAzNSA4OC44MDEgODcuMjA0djg1MC4zNzFjMCA0OC4yMS0zOS43MzEgODcuMjQ1LTg4LjgwMSA4Ny4yNDV6TTExNDIuMTI5IDg3My4xMjRjMTguMzA5IDAgMzMuMy0xNC42MjMgMzMuMy0zMi42ODZzLTE0Ljk1LTMyLjY4Ni0zMy4zLTMyLjY4NmMtMTguNDMyIDAtMzMuMyAxNC42MjMtMzMuMyAzMi42ODZzMTQuODY4IDMyLjY4NiAzMy4zIDMyLjY4NnpNMTA0Mi4zMDkgODczLjEyNGMxOC4zMDkgMCAzMy4zLTE0LjYyMyAzMy4zLTMyLjY4NnMtMTQuOTUtMzIuNjg2LTMzLjMtMzIuNjg2Yy0xOC40MzIgMC0zMy4zIDE0LjYyMy0zMy4zIDMyLjY4NnMxNC44NjggMzIuNjg2IDMzLjMgMzIuNjg2ek05NDIuNDQ5IDg3My4xMjRjMTguMzA5IDAgMzMuMy0xNC42MjMgMzMuMy0zMi42ODZzLTE0Ljk1LTMyLjY4Ni0zMy4zLTMyLjY4NmMtMTguNDMyIDAtMzMuMyAxNC42MjMtMzMuMyAzMi42ODZzMTQuODY4IDMyLjY4NiAzMy4zIDMyLjY4NnpNMTI0MS45MDcgMjIuNzk0aC0xMTUzLjY3OXY2OTcuNzk1aDExNTMuNjc5di02OTcuNzk1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmE7IiBnbHlwaC1uYW1lPSJqYXZhc2NyaXB0LWFwaSIgZGF0YS10YWdzPSJXZWLlvIDlj5EiIGhvcml6LWFkdi14PSIxMzczIiBkPSJNNDAzLjkwNyAzMi4yMTV2MTQ5LjI5OWwtMjU1LjYzMSAyNTguMjEyIDI1NS42MzEgMjU4LjIxMnYxNDkuMjk5bC00MDMuMzc0LTQwNy41MTEgNDAzLjM3NC00MDcuNTExek05NjIuMTA5IDg1NC40ODd2LTE0OC45MzFsMjYwLjIxOS0yNTcuNTU2LTI2MC4yMTktMjU3LjU1NnYtMTQ4LjkzMWw0MTAuNTQyIDQwNi40ODctNDEwLjU0MiA0MDYuNDg3ek04MjEuNjk5IDk1NS45ODZjLTM0LjUyOSAxMS4yMjMtNzEuNTE2LTcuOTQ2LTgyLjY1Ny00Mi44MDNsLTIzNy4xNTgtODg5LjY1MWMtMTEuMS0zNC44OTggNy44NjQtNzIuMjk0IDQyLjM5NC04My40NzYgMzQuNTI5LTExLjIyMyA3MS41NTcgNy45MDUgODIuNjU3IDQyLjg0NGwyMzcuMTU4IDg4OS42NTFjMTEuMSAzNC44MTYtNy44MjMgNzIuMTcyLTQyLjM5NCA4My40MzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyYjsiIGdseXBoLW5hbWU9ImRlc2t0b3AtZGV2IiBkYXRhLXRhZ3M9IuahjOmdouW8gOWPkSIgaG9yaXotYWR2LXg9IjE0MTYiIGQ9Ik0xMTgwLjA1OCA1Ni40NjNjNjUuMjA4IDAgMTE4LjAwNiA1My45MDMgMTE4LjAwNiAxMjAuNDYzdjY2Mi42MWMwIDY2Ljg0Ny01My4xMjUgMTIwLjQ2My0xMTguMDA2IDEyMC40NjNoLTk0NC4wNDZjLTY1LjQ5NSAwLTExOC4wMDYtNTMuNjE3LTExOC4wMDYtMTIwLjQ2M3YtNjYyLjU2OWMwLTY2LjU2IDUyLjgzOC0xMjAuNDYzIDExOC4wMDYtMTIwLjQ2M2gtMjM2LjAxMmMwLTY2LjU2IDUyLjgzOC0xMjAuNTA0IDExOC4wMDYtMTIwLjUwNGgxMTgwLjA1OGM2NS4yMDggMCAxMTguMDg4IDUzLjk0NCAxMTguMDg4IDEyMC40NjNoLTIzNi4wOTN6TTIzNi4wMTIgODM5LjUzN2g5NDQuMDQ2di02NjIuNTY5aC05NDQuMDQ2djY2Mi41Njl6TTcwOC4wMzUtMy43NDhjLTMyLjU2MyAwLTU4Ljk4MiAyNi45NTItNTguOTgyIDYwLjI1MnMyNi40NiA2MC4yNTIgNTguOTgyIDYwLjI1MmMzMi42NDUgMCA1OC45ODItMjYuOTUyIDU4Ljk4Mi02MC4yNTJzLTI2LjMzNy02MC4yNTItNTguOTgyLTYwLjI1MnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTJjOyIgZ2x5cGgtbmFtZT0iZWRpdCIgZGF0YS10YWdzPSLnvJbovpEiIGQ9Ik05NTcuOTAxIDY4OS4xNTJjMTkuOTY4IDIwLjAxOSAxOS45NjggNTMuMjQ4IDAgNzIuMTkybC0xMTkuODA4IDExOS44MDhjLTE4Ljk0NCAyMC4wMTktNTIuMjc1IDIwLjAxOS03Mi4xOTIgMGwtOTQuMjA4LTkzLjY5NiAxOTItMTkyek01MS4xNDkgMTY2LjR2LTE5MmgxOTJsNTY2LjMyMyA1NjYuNzMzLTE5MiAxOTItNTY2LjMyMy01NjYuNzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmQ7IiBnbHlwaC1uYW1lPSJob21lIiBkYXRhLXRhZ3M9Iui/lOWbnuS4u+mhtSIgZD0iTTUxMiA4MzJsLTQ2MC44LTQwNi41NzloMTM4LjI0di0zNjEuNDIxaDIzMC4zNDl2MjcxLjA1M2gxODQuMzcxdi0yNzEuMDUzaDIzMC40djM2MS40MjFoMTM4LjI0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmU7IiBnbHlwaC1uYW1lPSJzaGFyZSIgZGF0YS10YWdzPSLliIbkuqsiIGhvcml6LWFkdi14PSIxMDI2IiBkPSJNNzk3LjI0NSAzMzcuNTk2di0xNzVoLTU2OC43NTF2MTc1aC04Ny41MDF2LTI2Mi41MDFoNzQzLjc1MXYyNjIuNTAxek04ODQuNzQ0IDYxMS4yMWwtMjYzLjQyIDIwNy42Mzh2LTEyNC4zODJjLTMxOS45NDUgMC0zOTIuODMyLTMxMy4xMTktMzkyLjgzMi0zMTMuMTE5IDkwLjUxOSAxNDEuMjI2IDIxOS4xODggMTU0Ljc4OCAzOTIuODMyIDE1NC43ODh2LTE0MC4xNzVsMjYzLjQyIDIxNS4yNTF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyZjsiIGdseXBoLW5hbWU9ImJhY2siIGRhdGEtdGFncz0i5pS26LW357yW6L6R6Z2i5p2/IiBkPSJNMTczLjQ2NiA3MTguMjg1bDQ3NS4zNDEtNDc1LjM0MSA2OC4xOTggNjguMTk4LTQ3NS4zNDEgNDc1LjM0MWgxNzMuNTY4djk2LjcxN2gtMzM4LjQ4M3YtMzM4LjQ4M2g5Ni43MTd2MTczLjU2OHpNODUwLjM4MSA4ODMuMmgtMzM4LjQzMnYtOTYuNzE3aDMzOC40MzJ2LTY3Ny4wMThoLTY3Ni45MTV2MzM4LjUzNGgtOTYuNzE3di0zMzguNDgzYzAtNTMuNDAyIDQzLjMxNS05Ni43MTcgOTYuNzE3LTk2LjcxN2g2NzYuOTY2YzUzLjQ1MyAwIDk2Ljc2OCA0My4zMTUgOTYuNzY4IDk2LjcxN3Y2NzYuOTY2Yy0wLjA1MSA1My4xOTctNDMuMTEgOTYuNzE3LTk2LjgxOSA5Ni43MTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMDsiIGdseXBoLW5hbWU9InVuZm9sZCIgZGF0YS10YWdzPSLmiZPlvIDlm77moIfmoYYiIGQ9Ik01MTIgNDIyLjRsMjI0IDIzMC40LTUxLjIgNTEuMi0xNzIuOC0xNzIuOC0xNzIuOCAxNzIuOC01MS4yLTUxLjIgMjI0LTIzMC40ek0zMzkuMiA0NzMuNmwtNTEuMi01MS4yIDIyNC0yMzAuNCAyMjQgMjMwLjQtNTEuMiA1MS4yLTE3Mi44LTE3Mi44LTE3Mi44IDE3Mi44eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzE7IiBnbHlwaC1uYW1lPSJmb2xkIiBkYXRhLXRhZ3M9IuaUtui1t+Wbvuagh+ahhiIgZD0iTTI4OCAyNDMuMmw1MS4yLTUxLjIgMTcyLjggMTcyLjggMTcyLjgtMTcyLjggNTEuMiA1MS4yLTIyNCAyMzAuNC0yMjQtMjMwLjR6TTUxMiA1OTUuMmwxNzIuOC0xNzIuOCA1MS4yIDUxLjItMjI0IDIzMC40LTIyNC0yMzAuNCA1MS4yLTUxLjIgMTcyLjggMTcyLjh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMjsiIGdseXBoLW5hbWU9InJpZ2h0IiBkYXRhLXRhZ3M9IuWQkeWPsyIgZD0iTTM5MC40IDc2OGwtNzAuNC03Ni44IDIzNi44LTI0My4yLTIzNi44LTI0My4yIDcwLjQtNzYuOCAzMTMuNiAzMjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMzsiIGdseXBoLW5hbWU9ImxlZnQiIGRhdGEtdGFncz0i5ZCR5bemIiBkPSJNNjMzLjYgNzY4bDcwLjQtNzYuOC0yMzYuOC0yNDMuMiAyMzYuOC0yNDMuMi03MC40LTc2LjgtMzEzLjYgMzIweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzQ7IiBnbHlwaC1uYW1lPSJ0YWciIGRhdGEtdGFncz0i5qCH562+IiBkPSJNODcyLjM2OCA0NjUuNzIzbC0zNDIuNjQ2IDM0Mi42NDZjLTE3LjcyMyAxNy43MjMtMzUuNDQ2IDIzLjYzMi01OS4wNzcgMjMuNjMyaC0yNjUuODQ2Yy00MS4zNTQgMC03Ni44LTM1LjQ0Ni03Ni44LTc2Ljh2LTI3MS43NTRjMC0yMy42MzIgNS45MDktNDEuMzU0IDIzLjYzMi01My4xNjhsMzQyLjY0Ni0zNDguNTU0YzE3LjcyMy0xMS44MTQgMzUuNDQ2LTE3LjcyMyA1My4xNjgtMTcuNzIzczQxLjM1NCA1LjkwOSA1My4xNjggMjMuNjMybDI2NS44NDYgMjcxLjc1NGMyMy42MzIgMTEuODE0IDI5LjUzOCAyOS41MzggMjkuNTM4IDUzLjE2OCAwIDE3LjcyMy01LjkwOSAzNS40NDYtMjMuNjMyIDUzLjE2OHpNMjYzLjg3NyA2NDIuOTU0Yy0yOS41MzggMC01OS4wNzcgMjMuNjMyLTU5LjA3NyA1OS4wNzcgMCAyOS41MzggMjMuNjMyIDU5LjA3NyA1OS4wNzcgNTkuMDc3IDI5LjUzOCAwIDU5LjA3Ny0yMy42MzIgNTkuMDc3LTU5LjA3Ny01LjkwOS0zNS40NDYtMjkuNTM4LTU5LjA3Ny01OS4wNzctNTkuMDc3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzU7IiBnbHlwaC1uYW1lPSJuZXdfaG9tZSIgZGF0YS10YWdzPSLov5Tlm57pppbpobUiIGQ9Ik01MTIgNzk1LjczM2wtNDAxLjIzMS0zNjkuMTMzaDEyMy4wNDR2LTMyNi4zMzRoMTk3Ljk0MXYyNDYuMDg5aDE2MC40OTN2LTI0Ni4wODloMTk3Ljk0MXYzMjYuMzM0aDEyMy4wNDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzNjsiIGdseXBoLW5hbWU9InVwZGF0ZSIgZGF0YS10YWdzPSLmm7TmlrDml7bpl7QiIGQ9Ik01MTIgOTYwYy0yODMuNTY5IDAtNTEyLTIyOC40MzEtNTEyLTUxMnMyMjguNDMxLTUxMiA1MTItNTEyYzI4My41NjkgMCA1MTIgMjI4LjQzMSA1MTIgNTEycy0yMjguNDMxIDUxMi01MTIgNTEyek03MDguOTIzIDE3Mi4zMDhsLTI3NS42OTIgMTg5LjA0NnYzNjIuMzM4aDc4Ljc2OXYtMzE1LjA3N2wyMzYuMzA4LTE1Ny41MzgtMzkuMzg1LTc4Ljc2OXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTM3OyIgZ2x5cGgtbmFtZT0iaW5mbyIgZGF0YS10YWdzPSLkv6Hmga8iIGQ9Ik01MTIgOTYwYy0yODEuNiAwLTUxMi0yMzAuNC01MTItNTEyczIzMC40LTUxMiA1MTItNTEyYzI4MS42IDAgNTEyIDIzMC40IDUxMiA1MTJzLTIzMC40IDUxMi01MTIgNTEyek01NjMuMiAxOTJoLTEwMi40djMwNy4yaDEwMi40di0zMDcuMnpNNTYzLjIgNjAxLjZoLTEwMi40djEwMi40aDEwMi40di0xMDIuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTM4OyIgZ2x5cGgtbmFtZT0ibG9nbyIgZGF0YS10YWdzPSJsb2dvIiBob3Jpei1hZHYteD0iMTMzNiIgZD0iTTY4NS42MzUgMzM2LjY5NmwtMTExLjMwNCA0NC41MjJjLTE3LjgwOS0yNi43MTMtMzEuMTY1LTU3Ljg3OC00OC45NzQtOTcuOTQ4bDEyMC4yMDktNDQuNTIyIDQwLjA3MCA5Ny45NDh6TTY1MC4wMTcgNTE0Ljc4M2MtNzEuMjM1IDAtMTM4LjAxNy0yNi43MTMtMTkxLjQ0My03MS4yMzVsMTAyLjQtNDAuMDcwYzM1LjYxNyA1Ny44NzggNjYuNzgzIDg5LjA0MyA4OS4wNDMgMTExLjMwNHpNNjkwLjA4NyAzNTguOTU3bDUzLjQyNiAxNDIuNDdjLTIyLjI2MSA4LjkwNC00NC41MjIgMTMuMzU3LTY2Ljc4MyAxMy4zNTctMjYuNzEzLTE3LjgwOS02Mi4zMy01My40MjYtOTcuOTQ4LTExMS4zMDRsMTExLjMwNC00NC41MjJ6TTgxOS4yIDI4Ny43MjJsLTExMS4zMDQgNDQuNTIyLTQwLjA3MC0xMDIuNCAxMjAuMjA5LTQ0LjUyMmMxMy4zNTcgMzUuNjE3IDIyLjI2MSA3MS4yMzUgMzEuMTY1IDEwMi40ek03NzkuMTMgMTYzLjA2MWwtMTIwLjIwOSA0NC41MjItNDAuMDcwLTEwMi40IDExMS4zMDQtNDQuNTIyYzE3LjgwOSAzNS42MTcgMzUuNjE3IDY2Ljc4MyA0OC45NzQgMTAyLjR6TTQ4NS4yODcgMTU4LjYwOWwxMTEuMzA0LTQ0LjUyMiA0MC4wNzAgMTAyLjQtMTIwLjIwOSA0NC41MjJjLTEzLjM1Ny0zNS42MTctMjIuMjYxLTcxLjIzNS0zMS4xNjUtMTAyLjR6TTkzOS40MDkgMjY1LjQ2MWMtOC45MDQgNjYuNzgzLTQ0LjUyMiAxMjkuMTEzLTkzLjQ5NiAxNzMuNjM1IDQuNDUyLTMxLjE2NSA0LjQ1Mi03NS42ODctNC40NTItMTM4LjAxN2w5Ny45NDgtMzUuNjE3ek04MjMuNjUyIDMwOS45ODNjMTMuMzU3IDY2Ljc4MyA4LjkwNCAxMTUuNzU3IDQuNDUyIDE0Ni45MjItMTcuODA5IDEzLjM1Ny0zNS42MTcgMjIuMjYxLTU3Ljg3OCAzNS42MTdsLTU3Ljg3OC0xNDIuNDcgMTExLjMwNC00MC4wNzB6TTYwOS45NDggOTEuODI2bC01My40MjYtMTM4LjAxN2MyMi4yNjEtOC45MDQgNDQuNTIyLTEzLjM1NyA2Ni43ODMtMTMuMzU3IDI2LjcxMyAxNy44MDkgNjIuMzMgNTMuNDI2IDk3Ljk0OCAxMTEuMzA0bC0xMTEuMzA0IDQwLjA3MHpNNzUyLjQxNyA2MC42NjFsMTAyLjQtNDAuMDcwYzI2LjcxMyAyNi43MTMgNDguOTc0IDU3Ljg3OCA2Mi4zMyA5My40OTZsLTEyMC4yMDkgNDQuNTIyYy0xMy4zNTctNDAuMDcwLTI2LjcxMy03MS4yMzUtNDQuNTIyLTk3Ljk0OHpNNjU0LjQ3LTY0YzcxLjIzNSAwIDEzMy41NjUgMjYuNzEzIDE4Ni45OTEgNzEuMjM1bC05Ny45NDggMzUuNjE3Yy0zNS42MTctNTMuNDI2LTY2Ljc4My04OS4wNDMtODkuMDQzLTEwNi44NTJ6TTk0My44NjEgMjQzLjJsLTEwNi44NTIgNDAuMDcwYy00LjQ1Mi0zMS4xNjUtMTcuODA5LTY2Ljc4My0zMS4xNjUtMTAyLjRsMTIwLjIwOS00NC41MjJjMTMuMzU3IDMxLjE2NSAxNy44MDkgNzEuMjM1IDE3LjgwOSAxMDYuODUyek0zNjAuNjI2IDE4NS4zMjJjOC45MDQtNjYuNzgzIDQ0LjUyMi0xMzMuNTY1IDk3Ljk0OC0xNzguMDg3LTQuNDUyIDMxLjE2NS04LjkwNCA3NS42ODcgNC40NTIgMTM4LjAxN2wtMTAyLjQgNDAuMDcwek00ODAuODM1IDEzNi4zNDhjLTEzLjM1Ny02Ni43ODMtOC45MDQtMTIwLjIwOS00LjQ1Mi0xNDYuOTIyIDE3LjgwOS0xMy4zNTcgMzUuNjE3LTIyLjI2MSA1Ny44NzgtMzEuMTY1bDUzLjQyNiAxNDIuNDctMTA2Ljg1MiAzNS42MTd6TTU1Mi4wNzAgMzkwLjEyMmwtMTExLjMwNCA0MC4wNzBjLTI2LjcxMy0yNi43MTMtNDguOTc0LTU3Ljg3OC02Mi4zMy05My40OTZsMTI0LjY2MS00NC41MjJjMTMuMzU3IDM1LjYxNyAzMS4xNjUgNzEuMjM1IDQ4Ljk3NCA5Ny45NDh6TTM3My45ODMgMzE4Ljg4N2MtMTMuMzU3LTM1LjYxNy0xNy44MDktNzUuNjg3LTEzLjM1Ny0xMTEuMzA0bDEwNi44NTItNDAuMDcwYzQuNDUyIDMxLjE2NSAxNy44MDkgNjYuNzgzIDMxLjE2NSAxMDIuNGwtMTI0LjY2MSA0OC45NzR6TTExNzUuMzc0IDUyOC4xMzljLTguOTA0IDEyOS4xMTMtMTE1Ljc1NyAyMzUuOTY1LTI0OS4zMjIgMjM1Ljk2NS0yMi4yNjEgMC00NC41MjItNC40NTItNjIuMzMtOC45MDQtNDAuMDcwIDEyMC4yMDktMTUxLjM3NCAyMDQuOC0yODQuOTM5IDIwNC44LTE0Ni45MjIgMC0yNjcuMTMtMTAyLjQtMjkzLjg0My0yNDAuNDE3LTE1NS44MjYtOC45MDQtMjg0LjkzOS0xMzguMDE3LTI4NC45MzktMjkzLjg0MyAwLTE1MS4zNzQgMTE1Ljc1Ny0yNzYuMDM1IDI2Mi42NzgtMjkzLjg0M3YwIDBjMjYuNzEzIDAgNDguOTc0IDIyLjI2MSA0OC45NzQgNDguOTc0cy0yMi4yNjEgNDguOTc0LTQ4Ljk3NCA0OC45NzR2MCA0LjQ1MmMtOTcuOTQ4IDEzLjM1Ny0xNjkuMTgzIDk3Ljk0OC0xNjkuMTgzIDE5NS44OTYgMCAxMDYuODUyIDg0LjU5MSAxOTUuODk2IDE5NS44OTYgMTk1Ljg5NnYwYzguOTA0IDAgMTcuODA5LTQuNDUyIDI2LjcxMy00LjQ1MiAzMS4xNjUgMCA1Ny44NzggMjYuNzEzIDU3Ljg3OCA1Ny44NzggMCA0LjQ1MiAwIDEzLjM1NyA0LjQ1MiAyMi4yNjF2MGMxNy44MDkgOTMuNDk2IDEwMi40IDE2OS4xODMgMjAwLjM0OCAxNjkuMTgzIDEwMi40IDAgMTg2Ljk5MS03NS42ODcgMjA0LjgtMTczLjYzNWg0LjQ1MmM4LjkwNC0yMi4yNjEgMzEuMTY1LTQwLjA3MCA1My40MjYtNDAuMDcwIDguOTA0IDAgMjIuMjYxIDQuNDUyIDMxLjE2NSA4LjkwNGg0LjQ1MmMxNy44MDkgNC40NTIgMzUuNjE3IDguOTA0IDUzLjQyNiA4LjkwNCA4NC41OTEgMCAxNTUuODI2LTY2Ljc4MyAxNTUuODI2LTE1MS4zNzQgMCAwIDAgMCAwLTQuNDUydjAgMGMwLTQuNDUyLTQuNDUyLTguOTA0LTQuNDUyLTEzLjM1NyAwLTI2LjcxMyAyMi4yNjEtNDguOTc0IDUzLjQyNi00OC45NzRoNC40NTJjNjIuMzMtNC40NTIgMTExLjMwNC01My40MjYgMTExLjMwNC0xMTEuMzA0IDAtNjIuMzMtNTMuNDI2LTExNS43NTctMTE1Ljc1Ny0xMTUuNzU3djAgMGgtMTA2Ljg1MmMtMjIuMjYxIDAtNDAuMDcwLTIyLjI2MS00MC4wNzAtNDQuNTIyczE3LjgwOS00NC41MjIgNDAuMDcwLTQ0LjUyMnYwaDEwMi40YzAgMCAwIDAgNC40NTIgMCAxMTEuMzA0IDAgMjA0LjggODkuMDQzIDIwNC44IDIwMC4zNDgtNC40NTIgODkuMDQzLTc1LjY4NyAxNjkuMTgzLTE2NC43MyAxODYuOTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5Mzk7IiBnbHlwaC1uYW1lPSJzZWxlY3QiIGRhdGEtdGFncz0i6YCJ5oup5a+56LGhIiBob3Jpei1hZHYteD0iODMyIiBkPSJNNjMxLjYgNDkyYzAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40IDAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40IDAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40djE1OC40Yy00LjQgMzkuNi0zNS4yIDcwLjQtNzQuOCA3MC40cy03MC40LTMwLjgtNzAuNC03MC40di0yODEuNmMtMTc2IDE3Ni0xNDAuOC0zNS4yLTE0MC44LTM1LjIgMTA1LjYtNzAuNCAxNzYtMzE2LjggMTc2LTMxNi44aDI4NmMwIDM1LjIgMTA1LjYgMjExLjIgMTA1LjYgMjQ2LjR2MTIzLjJjMCAzNS4yLTcwLjQgMjYuNC03MC40IDI2LjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzYTsiIGdseXBoLW5hbWU9InNvbGlkLXBvaW50IiBkYXRhLXRhZ3M9IueCueagt+W8jzEiIGQ9Ik04NjQgNDQ4YzAtMTk0LjQwNC0xNTcuNTk2LTM1Mi0zNTItMzUycy0zNTIgMTU3LjU5Ni0zNTIgMzUyYzAgMTk0LjQwNCAxNTcuNTk2IDM1MiAzNTIgMzUyczM1Mi0xNTcuNTk2IDM1Mi0zNTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzYjsiIGdseXBoLW5hbWU9ImZsYWciIGRhdGEtdGFncz0i54K55qC35byPMiIgZD0iTTY4MCA3NDQuOGMtOTUuMiAwLTk1LjIgMTAwLjgtMjQwLjggMTAwLjgtNzIuOCAwLTE0MC0yMi40LTE5Ni00NC44djQ0LjhjMCAyOC0yMi40IDUwLjQtNDQuOCA1MC40cy01MC40LTIyLjQtNTAuNC01MC40di04NDUuNmg5NS4ydjM0Ny4yYzAgMCA1MC40IDEwMC44IDE5NiAxMDAuOCA5NS4yIDAgOTUuMi0xMDAuOCAyNDAuOC0xMDAuOHMxOTYgMTAwLjggMTk2IDEwMC44djM5Ny42YzAgMC01MC40LTEwMC44LTE5Ni0xMDAuOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTNjOyIgZ2x5cGgtbmFtZT0idGFyZ2V0IiBkYXRhLXRhZ3M9IueCueagt+W8jzMiIGQ9Ik01MTIgNjAxLjZjLTgzLjIgMC0xNTMuNi03MC40LTE1My42LTE1My42czcwLjQtMTUzLjYgMTUzLjYtMTUzLjZjODMuMiAwIDE1My42IDcwLjQgMTUzLjYgMTUzLjZzLTcwLjQgMTUzLjYtMTUzLjYgMTUzLjZ6TTUxMiA5NjBjLTI4MS42IDAtNTEyLTIzMC40LTUxMi01MTJzMjMwLjQtNTEyIDUxMi01MTJjMjgxLjYgMCA1MTIgMjMwLjQgNTEyIDUxMnMtMjMwLjQgNTEyLTUxMiA1MTJ6TTUxMiAzOC40Yy0yMjQgMC00MDkuNiAxODUuNi00MDkuNiA0MDkuNnMxODUuNiA0MDkuNiA0MDkuNiA0MDkuNmMyMjQgMCA0MDkuNi0xODUuNiA0MDkuNi00MDkuNnMtMTg1LjYtNDA5LjYtNDA5LjYtNDA5LjZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZDsiIGdseXBoLW5hbWU9InVwbG9hZCIgZGF0YS10YWdzPSLpgInmi6nmlofku7YiIGhvcml6LWFkdi14PSIxMzE3IiBkPSJNMTA1My4zMSA3MzguNzQyaC0zOTQuOTczbC05OC43NDIgOTMuMjU4aC0yOTYuMjI3Yy01NC44NTggMC05OC43NDItNDMuODg2LTk4Ljc0Mi05My4yNTh2LTU3NmMwLTU0Ljg1OCA0My44ODYtOTguNzQyIDk4Ljc0Mi05OC43NDJoNzg5Ljk0MmM1NC44NTggMCA5OC43NDIgNDMuODg2IDk4Ljc0MiA5OC43NDJ2NDc3LjI1OGMwIDU0Ljg1OC00My44ODYgOTguNzQyLTk4Ljc0MiA5OC43NDJ6TTg1NS44MjQgMzk4LjYyN3YtMTkyaC05OC43NDJ2MTkyaC0xNTkuMDg2bDIwOC40NTggMjAyLjk3MyAyMDguNDU4LTIwMi45NzNoLTE1OS4wODZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZTsiIGdseXBoLW5hbWU9ImxlZ2VuZCIgZGF0YS10YWdzPSLlm77kvosiIGhvcml6LWFkdi14PSIxMzM5IiBkPSJNMjg1LjAzNCA4MDBjLTQzLjMyMyAwLTc1LjgxNy0zMi40OTItNzUuODE3LTcwLjRzMzIuNDkyLTcwLjQgNzUuODE3LTcwLjQgNzUuODE3IDMyLjQ5MiA3NS44MTcgNzAuNC0zMi40OTIgNzAuNC03NS44MTcgNzAuNHpNMjg1LjAzNCA1MTguNGMtNDMuMzIzIDAtNzUuODE3LTMyLjQ5Mi03NS44MTctNzAuNHMzMi40OTItNzAuNCA3NS44MTctNzAuNCA3NS44MTcgMzIuNDkyIDc1LjgxNyA3MC40LTMyLjQ5MiA3MC40LTc1LjgxNyA3MC40ek0yODUuMDM0IDIzNi44Yy00My4zMjMgMC03NS44MTctMzIuNDkyLTc1LjgxNy03MC40czMyLjQ5Mi03MC40IDc1LjgxNy03MC40IDc1LjgxNyAzMi40OTIgNzUuODE3IDcwLjRjMCAzNy45MDgtMzIuNDkyIDcwLjQtNzUuODE3IDcwLjR6TTQzMS4yNDkgNzc4LjMzN3YtOTIuMDYzaDY5OC41ODN2OTIuMDYzaC02OTguNTgzek00MzEuMjQ5IDExNy42NjNoNjk4LjU4M3Y5Mi4wNjNoLTY5OC41ODN2LTkyLjA2M3pNNDMxLjI0OSAzOTkuMjYzaDY5OC41ODN2OTcuNDc2aC02OTguNTgzdi05Ny40NzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZjsiIGdseXBoLW5hbWU9InRhYmxlIiBkYXRhLXRhZ3M9IuWxnuaAp+ihqCIgaG9yaXotYWR2LXg9IjEyMjkiIGQ9Ik0xNTMuNjI0IDgzMnYtNjcwLjI0OGMwLTU1Ljg0OCA0Mi41MjItOTcuNzUyIDkyLjE2My05Ny43NTJoNzM3LjI3NGM0OS42MTQgMCA5Mi4xNjMgNDEuODggOTIuMTYzIDk3Ljc1MnY2NzAuMjQ4aC05MjEuNjAxek01NjQuNzk5IDE2MS43NTJoLTMxOS4wMTJ2Mjg2LjI0OGgzMTkuMDEydi0yODYuMjQ4ek05ODMuMDM4IDE2MS43NTJoLTMyNi4xMDN2OTcuNzUyaDMyNi4xMDN2LTk3Ljc1MnpNOTgzLjAzOCAzNTAuMjQ4aC0zMjYuMTAzdjk3Ljc1MmgzMjYuMTAzdi05Ny43NTJ6TTk4My4wMzggNTQ1Ljc1MmgtNzM3LjI3NHYxMzkuNjMyaDczNy4yNzR2LTEzOS42MzJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0MDsiIGdseXBoLW5hbWU9Im9wYWNpdHkiIGRhdGEtdGFncz0i6YCP5piO5bqmIiBkPSJNMTYwIDgwMGgyMzQuNjczdi0yMzQuNjczaC0yMzQuNjczdjIzNC42NzN6TTM5NC42NzMgNTY1LjMyN2gyMzQuNjczdi0yMzQuNjczaC0yMzQuNjczdjIzNC42NzN6TTE2MCAzMzAuNjczaDIzNC42NzN2LTIzNC42NzNoLTIzNC42NzN2MjM0LjY3M3pNNjI5LjMyNyA4MDBoMjM0LjY3M3YtMjM0LjY3M2gtMjM0LjY3M3YyMzQuNjczek02MjkuMzI3IDMzMC42NzNoMjM0LjY3M3YtMjM0LjY3M2gtMjM0LjY3M3YyMzQuNjczeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NDE7IiBnbHlwaC1uYW1lPSJzb2xpZC10cmlhbmdsZSIgZGF0YS10YWdzPSLkuInop5JpY29uIiBkPSJNNzE0LjU3NSA1NDIuMzM2bC0xODYuMzQ0LTIyNS41NjdjLTguODUtMTAuNzk3LTIzLjYxMy0xMC43OTctMzIuNDYzIDBsLTE4Ni4zNDQgMjI1LjU2N2MtMTMuOTM2IDE2Ljc4NS0zLjY5MSA0NS4wMDMgMTYuMjk5IDQ1LjAwM2gzNzIuNTU2YzE5Ljk5MiAwIDMwLjIzOC0yOC4yMTYgMTYuMjk5LTQ1LjAwM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQyOyIgZ2x5cGgtbmFtZT0iZXllIiBkYXRhLXRhZ3M9IumakOiXj2ljb24iIGQ9Ik02NCA0NDEuODU2YzAgMCAzOTguNzg0IDU4OS44MjQgODk2IDAtNDk3LjIxNi01NjIuMTc2LTg5NiAwLTg5NiAwek01MTIgNTc2Yy03MC42NTYgMC0xMjgtNTcuMjgtMTI4LTEyOHM1Ny4zNDQtMTI4IDEyOC0xMjhjNzAuNjU2IDAgMTI4IDU3LjI4IDEyOCAxMjhzLTU3LjM0NCAxMjgtMTI4IDEyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQzOyIgZ2x5cGgtbmFtZT0iZHJvcGRvd24iIGRhdGEtdGFncz0i5LiL5ouJ5bGV5byAaWNvbiIgZD0iTTUxMiA4MzIuMDAxYzIxMi4wOTYgMCAzODQtMTcxLjkwNCAzODQtMzg0cy0xNzEuOTA0LTM4NC0zODQtMzg0Yy0yMTIuMDk2IDAtMzg0IDE3MS45MDQtMzg0IDM4NHMxNzEuOTA0IDM4NCAzODQgMzg0ek0zMzMuMTg0IDQxNy43OTNsMTQ2LjYyNC0xMTguNzJjOC44OTYtNy4yMzIgMjAuNTQ0LTEwLjgxNiAzMi4xOTItMTAuNzUyIDExLjY0OC0wLjA2NCAyMy4zNiAzLjUyIDMyLjI1NiAxMC43NTJsMTQ2LjQ5NiAxMTguNzJjMTcuNjY0IDE0LjMzNiAxNy42NjQgMzcuNTA0IDAgNTEuODQtMTcuNjY0IDE0LjI3Mi00Ni4yNzIgMTQuMjcyLTYzLjg3MiAwbC0xMTQuODgtOTMuMDU2LTExNC44MTYgOTMuMDU2Yy0xNy42NjQgMTQuMjcyLTQ2LjMzNiAxNC4yNzItNjQgMC0xNy42LTE0LjMzNi0xNy42LTM3LjUwNCAwLTUxLjg0djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0NDsiIGdseXBoLW5hbWU9ImNhZCIgZGF0YS10YWdzPSJjYWQiIGQ9Ik02OC4yNjcgNTUwLjR2LTY4LjI2N2gyMDQuOHY2OC4yNjdoLTIwNC44ek03NTAuOTMzIDU1MC40di02OC4yNjdoMTM2LjUzM3Y2OC4yNjdoLTEzNi41MzN6TTQwOS42IDQxMy44Njd2LTY4LjI2N2gxMzYuNTMzdjY4LjI2N2gtMTM2LjUzM3pNNDA5LjYgNTUwLjR2LTY4LjI2N2gxMzYuNTMzdjY4LjI2N2gtMTM2LjUzM3pNNjguMjY3IDM0NS42di02OC4yNjdoMjA0Ljh2NjguMjY3aC0yMDQuOHpNNzUwLjkzMyAzNDUuNnYtNjguMjY3aDEzNi41MzN2NjguMjY3aC0xMzYuNTMzek02OC4yNjcgNDgyLjEzM2g2OC4yNjd2LTEzNi41MzNoLTY4LjI2N3YxMzYuNTMzek0zNDEuMzMzIDQ4Mi4xMzNoNjguMjY3di0yMDQuOGgtNjguMjY3djIwNC44ek01NDYuMTMzIDQ4Mi4xMzNoNjguMjY3di0yMDQuOGgtNjguMjY3djIwNC44ek02ODIuNjY3IDU1MC40aDY4LjI2N3YtMjczLjA2N2gtNjguMjY3djI3My4wNjd6TTg4Ny40NjcgNDgyLjEzM2g2OC4yNjd2LTEzNi41MzNoLTY4LjI2N3YxMzYuNTMzek02OC4yNjcgODIzLjQ2N2g4ODcuNDY3di02OC4yNjdoLTg4Ny40Njd2NjguMjY3ek02OC4yNjcgMTQwLjhoODg3LjQ2N3YtNjguMjY3aC04ODcuNDY3djY4LjI2N3pNNjguMjY3IDc1NS4yaDY4LjI2N3YtMTM2LjUzM2gtNjguMjY3djEzNi41MzN6TTg4Ny40NjcgNzU1LjJoNjguMjY3di0xMzYuNTMzaC02OC4yNjd2MTM2LjUzM3pNODg3LjQ2NyAyMDkuMDY3aDY4LjI2N3YtNjguMjY3aC02OC4yNjd2NjguMjY3ek02OC4yNjcgMjA5LjA2N2g2OC4yNjd2LTY4LjI2N2gtNjguMjY3djY4LjI2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ1OyIgZ2x5cGgtbmFtZT0iZ3JpZCIgZGF0YS10YWdzPSLmoIXmoLwiIGQ9Ik0yMDQuOCA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek0yMDQuOCAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek0yMDQuOCAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NDY7IiBnbHlwaC1uYW1lPSJpbWFnZSIgZGF0YS10YWdzPSLlvbHlg48iIGQ9Ik0yMDQuOCAyMDkuMDY3bDEzNi41MzMgMzQxLjMzMyAxNzAuNjY3LTI3My4wNjcgMTAyLjQgMjA0LjggMjA0LjgtMjczLjA2N2gtNjE0LjR6TTY4Mi42NjcgNTUwLjRjLTM3LjY4MyAwLTY4LjI2NyAzMC41ODMtNjguMjY3IDY4LjI2N3MzMC41ODMgNjguMjY3IDY4LjI2NyA2OC4yNjdjMzcuNjgzIDAgNjguMjY3LTMwLjU4MyA2OC4yNjctNjguMjY3cy0zMC41ODMtNjguMjY3LTY4LjI2Ny02OC4yNjd6TTY4LjI2NyA4MjMuNDY3aDg4Ny40Njd2LTY4LjI2N2gtODg3LjQ2N3Y2OC4yNjd6TTY4LjI2NyAxNDAuOGg4ODcuNDY3di02OC4yNjdoLTg4Ny40Njd2NjguMjY3ek04ODcuNDY3IDc1NS4yaDY4LjI2N3YtNjE0LjRoLTY4LjI2N3Y2MTQuNHpNNjguMjY3IDc1NS4yaDY4LjI2N3YtNjE0LjRoLTY4LjI2N3Y2MTQuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ3OyIgZ2x5cGgtbmFtZT0ibGF5ZXJTdHlsZSIgZGF0YS10YWdzPSLlm77lsYLmoLflvI8iIGhvcml6LWFkdi14PSIxMjQyIiBkPSJNOTc4Ljc4OSA1NjBsLTQxMC44OC0xNzYtNDQ4IDE5MiAzNy4xMiAxNiA0MTAuODggMTc2IDQ0OC0xOTJ6TTI2OS4wMjkgNTc2bDI5OC44OC0xMjggMjk4Ljg4IDEyOC0yOTguODggMTI4ek05NDEuMDI2IDQ4MGw3NC44OC0zMi00NDgtMTkyLTQ0OCAxOTIgNzQuODggMzIgMzczLjEyLTE2MCAzNzMuMTIgMTYwek05NDEuMDI2IDM1Mmw3NC44OC0zMi00NDgtMTkyLTQ0OCAxOTIgNzQuODggMzIgMzczLjEyLTE2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ4OyIgZ2x5cGgtbmFtZT0ic2VhcmNoLXRoaW4iIGRhdGEtdGFncz0i5pCc57SiLee7huagt+W8jyIgZD0iTTQ3MC4xMTggODMyLjc4OGMtMTg5LjM4MiAwLTM0Mi45MDYtMTUzLjUyMy0zNDIuOTA2LTM0Mi45MDZzMTUzLjUyMy0zNDIuOTA2IDM0Mi45MDYtMzQyLjkwNmMxODkuMzgyIDAgMzQyLjkwNiAxNTMuNTIzIDM0Mi45MDYgMzQyLjkwNnMtMTUzLjUyMyAzNDIuOTA2LTM0Mi45MDYgMzQyLjkwNnpNNDcwLjExOCAyNDQuOTUxYy0xMzUuMjc0IDAtMjQ0LjkzMSAxMDkuNjYxLTI0NC45MzEgMjQ0LjkzMXMxMDkuNjYxIDI0NC45MzEgMjQ0LjkzMSAyNDQuOTMxYzEzNS4yNzQgMCAyNDQuOTMxLTEwOS42NjEgMjQ0LjkzMS0yNDQuOTMxcy0xMDkuNjYxLTI0NC45MzEtMjQ0LjkzMS0yNDQuOTMxek03NDMuOTgyIDIxNi4xMjZjMTkuMTMxIDE5LjEzMSA1MC4xNDYgMTkuMTMxIDY5LjI3NiAwbDY5LjI3Ni02OS4yNzZjMTkuMTMxLTE5LjEzMSAxOS4xMzEtNTAuMTQ2IDAtNjkuMjc2cy01MC4xNDYtMTkuMTMxLTY5LjI3NiAwbC02OS4yNzYgNjkuMjc2Yy0xOS4xMzEgMTkuMTMxLTE5LjEzMSA1MC4xNDYgMCA2OS4yNzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0OTsiIGdseXBoLW5hbWU9InBsYXkiIGRhdGEtdGFncz0i5pKt5pS+IiBkPSJNNTEyIDg5NmMtMjQ3LjQyNCAwLTQ0OC0yMDAuNTc2LTQ0OC00NDhzMjAwLjU3Ni00NDggNDQ4LTQ0OGMyNDcuNDI0IDAgNDQ4IDIwMC41NzYgNDQ4IDQ0OHMtMjAwLjU3NiA0NDgtNDQ4IDQ0OHpNNTEyIDY0LjAwMWMtMjEyLjA3OCAwLTM4My45OTkgMTcxLjkyMy0zODMuOTk5IDM4My45OTlzMTcxLjkyMyAzODMuOTk5IDM4My45OTkgMzgzLjk5OWMyMTIuMDc4IDAgMzgzLjk5OS0xNzEuOTIzIDM4My45OTktMzgzLjk5OXMtMTcxLjkyMy0zODMuOTk5LTM4My45OTktMzgzLjk5OXpNNTAzLjA0MCAzMDUuMjc5bC03Ni4xNi00NS40MzljLTE5Ljg0LTEyLjE1OS00Mi44OCA1LjExOS00Mi44OCAzMS45OTl2MzEyLjMxOWMwIDI2LjI0MSAyMy4wMzkgNDMuNTE5IDQyLjg4IDMxLjk5OWw3Ni4xNi00NS40MzkgMTg0LjMxOS0xMTAuNzE5YzEwLjEzNy03LjE0OSAxNi42NzctMTguODExIDE2LjY3Ny0zMS45OTlzLTYuNTQtMjQuODUtMTYuNTU1LTMxLjkxN3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRhOyIgZ2x5cGgtbmFtZT0icGF1c2UiIGRhdGEtdGFncz0i5pqC5YGcIiBkPSJNNTEyIDg5NmMtMjQ3LjQyNCAwLTQ0OC0yMDAuNTc2LTQ0OC00NDhzMjAwLjU3Ni00NDggNDQ4LTQ0OGMyNDcuNDI0IDAgNDQ4IDIwMC41NzYgNDQ4IDQ0OHMtMjAwLjU3NiA0NDgtNDQ4IDQ0OHpNNTEyIDY0LjAwMWMtMjEyLjA3OCAwLTM4My45OTkgMTcxLjkyMy0zODMuOTk5IDM4My45OTlzMTcxLjkyMyAzODMuOTk5IDM4My45OTkgMzgzLjk5OWMyMTIuMDc4IDAgMzgzLjk5OS0xNzEuOTIzIDM4My45OTktMzgzLjk5OXMtMTcxLjkyMy0zODMuOTk5LTM4My45OTktMzgzLjk5OXpNNDE2IDYwNy45OTljMTcuNjc0IDAgMzEuOTk5LTE0LjMyOCAzMS45OTktMzEuOTk5di0yNTUuOTk5YzAtMTcuNjc0LTE0LjMyOC0zMS45OTktMzEuOTk5LTMxLjk5OXMtMzEuOTk5IDE0LjMyOC0zMS45OTkgMzEuOTk5djI1NS45OTljMCAxNy42NzQgMTQuMzI4IDMxLjk5OSAzMS45OTkgMzEuOTk5ek02MDggNjA3Ljk5OWMxNy42NzQgMCAzMS45OTktMTQuMzI4IDMxLjk5OS0zMS45OTl2LTI1NS45OTljMC0xNy42NzQtMTQuMzI4LTMxLjk5OS0zMS45OTktMzEuOTk5cy0zMS45OTkgMTQuMzI4LTMxLjk5OSAzMS45OTl2MjU1Ljk5OWMwIDE3LjY3NCAxNC4zMjggMzEuOTk5IDMxLjk5OSAzMS45OTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0YjsiIGdseXBoLW5hbWU9ImNvcHkiIGRhdGEtdGFncz0i5aSN5Yi2IiBob3Jpei1hZHYteD0iOTM5IiBkPSJNNzcyLjIyMSAyMjRoLTEwNy44djM5MmMwIDYxLjg1Ny00OC4yNjQgMTEyLTEwNy44IDExMmgtMjE1LjZ2NTZjMCA2MS44NTcgNDguMjY0IDExMiAxMDcuOCAxMTJoMzIzLjRjNTkuNTM0IDAgMTA3LjgtNTAuMTQzIDEwNy44LTExMnYtNDQ4YzAtNjEuODU3LTQ4LjI2NC0xMTItMTA3LjgtMTEyek01OTcuNjg4IDU2MHYtNDQ4YzAtNjEuODU3LTQ4LjI2NC0xMTItMTA3LjgtMTEyaC0zMjMuNGMtNTkuNTM2IDAtMTA3LjggNTAuMTQzLTEwNy44IDExMnY0NDhjMCA2MS44NTcgNDguMjY0IDExMiAxMDcuOCAxMTJoMzIzLjRjNTkuNTM2IDAgMTA3LjgtNTAuMTQzIDEwNy44LTExMnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NGM7IiBnbHlwaC1uYW1lPSJ6b25lIiBkYXRhLXRhZ3M9IuepuumXtCIgZD0iTTY1MS4wOTYgMzgzLjM3bC0wLjEwNCAwLjYxMmMtMS44ODQgMTAuOTY4IDMuMDcxIDI2LjI5OCAxMS4wODMgMzQuMTFsMTA2LjU1MiAxMDMuODYyYzcuOTcgNy43NjggNS41MzIgMTUuNDQ3LTUuNTQxIDE3LjA1NmwtMTQ3LjI1MiAyMS4zOThjLTExLjAxMyAxLjYwMS0yNC4wNjQgMTEuMDQ4LTI5LjAxNCAyMS4wODFsLTY1Ljg1MyAxMzMuNDMyYy00LjkyNSA5Ljk4LTEyLjk4MSAxMC4wMzQtMTcuOTMzIDBsLTY1Ljg1My0xMzMuNDMyYy00LjkyNS05Ljk4LTE3Ljk0My0xOS40NzItMjkuMDE0LTIxLjA4MWwtMTQ3LjI1Mi0yMS4zOThjLTExLjAxMy0xLjYwMS0xMy41NTUtOS4yNDgtNS41NDEtMTcuMDU2bDEwNi41NTItMTAzLjg2MmM3Ljk3LTcuNzY4IDEyLjk3NC0yMy4wODIgMTEuMDgzLTM0LjExbC0yNS4xNTMtMTQ2LjY1OGMtMS44ODItMTAuOTcgNC42MDQtMTUuNzQ3IDE0LjUwOS0xMC41NDFsMTMxLjcwNCA2OS4yNDJjOS44NSA1LjE3OSAyNS45NjIgNS4yMDcgMzUuODY2IDBsMTMxLjcwNi02OS4yNDJjOS44NDgtNS4xNzkgMTYuNC0wLjQ4NyAxNC41MDkgMTAuNTQxbC0yMS41MTYgMTI1LjQ1YzguOTczIDIuOTY4IDE5LjI3IDguMzI0IDI5LjEwNyAxNC40OTNsLTEyLjEzLTIuNzA0Yy00NC4yMjItNy40ODktOTYuNTMyLTExLjg4OC0xNDUuODA0LTExLjg4OC0yMy40OTggMC00Ni4xMDMgMC45MzctNjcuNzcgMi4yODEtMTkuMDIwIDEuMzQ0LTM3LjU1MSAzLjEzNi01NC42OTcgNS40MTctNi4zMTMgMC44OTYgMC40NDggNS40MTcgMC40NDggNS40MTdsMTY4LjEyMiAxMTkuMzI4YzAgMCA0LjUyMSAyLjcyOSAwIDMuMTM2LTY5LjE1MiAxMC44NzQtMTQ1LjU1OSAxMy41NjItMjE3LjQwMiAxMy41NjJoLTUuNDE3YzQ4Ljc5MSAxMS4zMjIgMTA5LjgwMSAxNy42MzQgMTc2LjI2OCAxNy42MzQgMzkuMzQzIDAgNzYuMzYyLTIuMjgxIDExMC43MzctNi4zMTMgMCAwIDE5LjQyNC0yLjcyOSAyOC40Ny00LjA3MyA3LjI0OS0wLjg5NiAwLjQ0OC01LjQ1NyAwLjQ0OC01LjQ1N2wtMTY4LjU3LTExNi41NjFjMCAwLTQuMTEzLTIuMjgxIDAuNDQ4LTMuMTc3IDQ2LjMyOS02LjQ2MiAxMDIuMDEwLTkuMzAxIDE1NC4yMDgtMTAuNTA0ek01MTIgMGMtMjQ3LjQyNCAwLTQ0OCAyMDAuNTc2LTQ0OCA0NDhzMjAwLjU3NiA0NDggNDQ4IDQ0OGMyNDcuNDI0IDAgNDQ4LTIwMC41NzYgNDQ4LTQ0OHMtMjAwLjU3Ni00NDgtNDQ4LTQ0OHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRkOyIgZ2x5cGgtbmFtZT0iZXhwb3J0IiBkYXRhLXRhZ3M9IuWvvOWHuiIgZD0iTTg4OC4wNTIgMzI4LjcyMmMyLjIwOS0xLjEwNCAzLjMxMi0zLjg2NSAzLjMxMi04LjI4M3MtMS4xMDQtNy4xNzktMy4zMTItOC4yODNsLTE1NS43MjItMTEyLjY1MWMtNC40MTgtMi4yMDktOC4yODMtMi43NjItMTEuNTk2LTEuNjU2cy00Ljk3MSA0LjQxOC00Ljk3MSA5LjkzOXY1My4wMTJoLTE0Mi40N2MtNy43MyAwLTExLjU5NiAzLjg2NS0xMS41OTYgMTEuNTk2djk2LjA4NWMwIDYuNjI3IDMuODY1IDkuOTM5IDExLjU5NiA5LjkzOWgxNDAuODEydjUzLjAxMmMwIDQuNDE4IDIuMjA5IDcuNzMgNi42MjcgOS45MzkgMy4zMTIgMi4yMDkgNi42MjcgMi4yMDkgOS45MzkgMGwxNTcuMzc4LTExMi42NTF6TTYzMS4yNzggMjE5LjM4NmM5LjkzOSAwIDE0LjkxLTQuOTcxIDE0LjkxLTE0Ljkxdi05Ni4wODVjMC04LjgzNi00Ljk3MS0xMy4yNTUtMTQuOTEtMTMuMjU1aC00ODMuNzM1Yy05LjkzOSAwLTE0LjkxIDQuNDE4LTE0LjkxIDEzLjI1NXY1MDAuMzAybDIyMC4zMyAyMTguNjc1aDI3OC4zMTJjOS45MzkgMCAxNC45MS00LjQxOCAxNC45MS0xMy4yNTR2LTM3OS4zNjhjMC04LjgzNi00Ljk3MS0xMy4yNTQtMTQuOTEtMTMuMjU0aC01NC42N2MtOS45MzkgMC0xNC45MSA0LjQxOC0xNC45MSAxMy4yNTR2MzA4LjEzMmgtMTc4LjkxNXYtMTQ5LjA5NWMwLTkuOTM5LTQuOTcxLTE0LjkxLTE0LjkxLTE0LjkxaC0xNTAuNzU0di0zOTkuMjQ2aDM0NC41Nzh2MjQuODQ5YzAgOS45MzkgNC45NzEgMTQuOTEgMTQuOTEgMTQuOTFoNTQuNjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0ZTsiIGdseXBoLW5hbWU9InFxYmxvZyIgZGF0YS10YWdzPSLohb7orq/lvq7ljZoiIGQ9Ik01MTEuOTc3IDg5NmMtMjQ3LjQwOCAwLTQ0Ny45NzctMjAwLjU0NC00NDcuOTc3LTQ0OCAwLTI0Ny40MjQgMjAwLjU3Mi00NDggNDQ3Ljk3Ny00NDggMjQ3LjQyIDAgNDQ4LjAyMyAyMDAuNTc2IDQ0OC4wMjMgNDQ4IDAgMjQ3LjQ1OS0yMDAuNjAzIDQ0OC00NDguMDIzIDQ0OHpNMzc2Ljg1NSAxNTUuOTYyaC0wLjU2Yy0xMS4wNzUgMC0yMC4xODIgOS4wMTQtMjAuNDcgMjAuMzU3LTMuNzI1IDEzNy4wNzQgNTIuNTA2IDIxNy40NDggOTMuNjM4IDI1Ny42MjItMTYuMjMyIDI3Ljk5Ni0xNS4wMjIgNjQuMzAyIDUuODE2IDkxLjQzNSAyNy4wNzAgMzUuMTIyIDc2Ljk1NCA0MS4xNjQgMTExLjM5MiAxMy41MTYgMzQuNDM0LTI3LjYxMiA0MC4zMzItNzguNTUzIDEzLjI5NC0xMTMuNzA4LTI0LjQ5Ny0zMS44My02Ny43MzYtMzkuNzI0LTEwMS4yLTIwLjQyMi0zNC44OTctMzMuNjQ4LTg1LjM2My0xMDMuODk3LTgxLjk3NC0yMjcuMjYgMC4zMjQtMTEuNTcyLTguNjI0LTIxLjIxOC0xOS45MzctMjEuNTR6TTUxNy42NjUgMjc3LjM0M2MtMTMuOTAzIDAtMjcuOSAxLjUzMi00MS4zNTQgNC41MzUtMTEuMDU3IDIuMzk4LTE4LjA1OCAxMy41NTItMTUuNjc1IDI0Ljg2NyAyLjQxMyAxMS4zMTMgMTMuMzc4IDE4LjQ0MiAyNC4zODIgMTUuOTgyIDEwLjY1OS0yLjMzNCAyMS42MjEtMy41MTYgMzIuNjQ3LTMuNTE2IDg0LjI3NCAwIDE1Mi44MSA2OS45NTkgMTUyLjgxIDE1Ni4wODkgMCA4Ni4wMzEtNjguNTAzIDE1Ni4wODktMTUyLjgxIDE1Ni4wODlzLTE1Mi44ODYtNzAuMDU3LTE1Mi44ODYtMTU2LjA4OWMwLTE3LjAzNCAyLjcxNy0zMy43NDggNy45MjItNDkuNzY0IDMuNTk3LTEwLjkzLTIuMTcyLTIyLjg1LTEyLjkxMS0yNi40OTMtMTAuNzA3LTMuNjc0LTIyLjM0IDIuMjA2LTI1LjkxOSAxMy4xMzYtNi42NDcgMjAuMjk1LTEwLjA2OCA0MS41MTgtMTAuMDY4IDYzLjExOCAwIDEwOS4wNzYgODYuOTI4IDE5Ny44OTEgMTkzLjg2MiAxOTcuODkxIDEwNi44MDMgMCAxOTMuNzk0LTg4LjgxNSAxOTMuNzk0LTE5Ny44OTEgMC4wMDMtMTA5LjE3NC04Ni45ODgtMTk3Ljk1Mi0xOTMuNzk0LTE5Ny45NTJ2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRmOyIgZ2x5cGgtbmFtZT0ic2luYSIgZGF0YS10YWdzPSLmlrDmtarlvq7ljZoiIGQ9Ik00NjkuNDQ5IDQ3Ny42MTVjLTg1LjYyNi05LjQxNS0xNTAuODI5LTYwLjQxNS0xNDQuNTQ3LTExNS4zMzcgNS41MDEtNTQuOTIzIDgwLjEyOS05MS44MDIgMTY1Ljc1Ni04Mi4zODRzMTUwLjgyOSA2MC40MTUgMTQ0LjU0NyAxMTUuMzM3Yy01LjUwMSA1NC45MjItODAuMTI5IDkxLjgwMi0xNjUuNzU2IDgyLjM4M3pNNDY3Ljg4IDI5Ny4xNTRjLTQ0Ljc3OC0yLjM1Ni04MS42OTkgMjcuNDYxLTc4LjU1NyA2OS44MjkgMi4zNTYgNDIuMzY5IDM5LjI3OCA3NC41MzkgODMuMjcxIDc0LjUzOSA0NC43NzcgMCA3OS4zNDMtMzEuMzg0IDc3Ljc3LTcwLjYxNS0xLjU3MS0zOS4yMzEtMzcuNzA3LTcxLjM5OS04Mi40ODQtNzMuNzU0djB6TTQ3NS43MzYgMzgxLjEwOGMtMC4wMDEtMy42NDUgMS45NDUtNy4wMTMgNS4xMDYtOC44MzdzNy4wNTMtMS44MjUgMTAuMjE0IDBjMy4xNjEgMS44MjUgNS4xMDcgNS4xOTEgNS4xMDYgOC44MzcgMC4wMDEgMy42NDQtMS45NDUgNy4wMTItNS4xMDYgOC44MzZzLTcuMDUzIDEuODI1LTEwLjIxNCAwYy0zLjE2MS0xLjgyNS01LjEwNy01LjE5MS01LjEwNi04LjgzNnYwek00NDUuMDk4IDM3Ny4xODVjLTE2LjUgMC0yOS44NTItMTEuNzY5LTI5LjA2Ni0yNS4xMDkgMC0xNC4xMjQgMTIuNTctMjQuMzIzIDI3LjQ5Ni0yMi43NTQgMTQuOTI2IDAuNzg2IDI4LjI3OSAxMS43NjkgMjguMjc5IDI0LjMyNCAwLjc4NyAxMy4zNDEtOS40MjggMjQuMzIzLTI2LjcwOSAyMy41Mzl6TTUxMS44NzIgODk1LjAyOGMtMjQ3LjQ1NSAwLTQ0Ny43NzYtMjAwLjA3NS00NDcuNzc2LTQ0Ny4yMjkgMC0yNDcuMTUyIDIwMC4zMjEtNDQ3LjIyNyA0NDcuNzc2LTQ0Ny4yMjdzNDQ3Ljc3NCAyMDAuMDc1IDQ0Ny43NzQgNDQ3LjIyN2MwIDI0Ny4xNTMtMjAwLjMyMSA0NDcuMjI5LTQ0Ny43NzQgNDQ3LjIyOXpNNjQxLjQ5MSA1NTguNDI5Yy0wLjc4NiAwLTAuNzg2IDAgMCAwaC0zLjE0MmMtOC42NDIgMC0xNC45MjUgNi4yNzgtMTQuOTI1IDEzLjM0MXM1LjUwMSAxMi41NTQgMTMuMzU1IDEzLjM0MWM5OC4xOTcgNi4yNzYgNzYuOTg1LTczLjc1NCA3Ni45ODUtNzMuNzU0LTAuNzg3LTUuNDkzLTYuMjg0LTkuNDE1LTExLjc4NS05LjQxNS03LjA3MCAwLTExLjc4NCA1LjQ5Mi0xMS43ODQgMTIuNTU0IDAgMS41NyAwIDMuMTM5IDAuNzg3IDQuNzA3IDAuNzg2IDQ3LjA3OS00MC44NSA0MS41ODQtNDkuNDkyIDM5LjIzMXpNNzE2LjEyMSAzOTEuMzA4YzAtMTEuNzY5LTAuNzg3LTUyLjU2OS03Ni45ODUtMTAzLjU2Ny0xMTAuNzY3LTY3LjQ3Ny0yOTkuMjk5LTQzLjkzOC0zNTEuMTUyIDYwLjQxNS01LjUwMSAxMi41NTUtMTYuNSA0Ny44NTkgMCA4Ny4wOTIgOS40MjggMjQuMzIzIDgxLjY5OSAxMTIuOTg1IDEwMy42OTUgMTIzLjk2OCAxOC44NTQgMTkuNjE0IDc5LjM0MyA0Ny4wNzkgMTA2Ljg0IDQwLjAxNnMzMy43NzktMzcuNjYyIDI2LjcwOS02MC40MTVjLTQuNzE0LTE0LjEyNCA1LjUwMS0yMC4zOTkgMTMuMzU1LTE2LjQ3OCA3LjA3MCAxLjU3IDEwLjIxMyA5LjQxNiAzMy43OCAxNi40NzggMzAuNjM3IDUuNDkyIDQ1LjU2MyA3Ljg0NiA2OS45MTMtMTAuMiAyNS4xMzgtMTcuMjYxIDYuMjgxLTUzLjM1NCA2LjI4MS01My4zNTRzLTcuMDcwLTEwLjk4NSAzLjE0My0xMy4zNDFjNjkuOTEzLTIzLjUzOSA2NC40MTctNTguODQ0IDY0LjQxNy03MC42MTJ6TTc4OC4zOTUgNDk2LjQ0NmMtMi4zNTYtOS40MTUtMTAuOTk4LTE1LjY5MS0yMC40MjctMTUuNjkxLTEwLjk5OCAwLjc4NC0xOS42NCAxMC4xOTktMTkuNjQgMjEuMTg0IDAgMi4zNTYgMC43ODcgMy45MjIgMS41NzEgNi4yNzYgMTUuNzEyIDExOC40NzctMTAyLjkxIDExMS40MTUtMTAyLjkxIDExMS40MTVoLTMuMTQzYy0xMC45OTcgMC43ODYtMTguODU0IDEwLjItMTguODU0IDIxLjE4NCAwLjc4NyAxMC4yIDcuODU3IDE4LjA0NyAxNy4yOCAxOC44MzFoNC43MTRjMTc2Ljc1My0xMC4yIDE0MS40MDItMTYzLjIgMTQxLjQwMi0xNjMuMnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTA7IiBnbHlwaC1uYW1lPSJydWxlciIgZGF0YS10YWdzPSLmoIflsLoiIGQ9Ik0xMjAgNjgzLjJoNzg0di00MTguMTMzaC03ODR2NDE4LjEzM3pNMjI0LjUzMyA1NzguNjY3di0yMDkuMDY3aDU3NC45MzN2MjA5LjA2N2gtNTc0LjkzM3pNMzI5LjA2NyA1NzguNjY3aDUyLjI2N3YtMTA0LjUzM2gtNTIuMjY3djEwNC41MzN6TTQzMy42IDU3OC42NjdoNTIuMjY3di0xNTYuOGgtNTIuMjY3djE1Ni44ek01MzguMTMzIDU3OC42NjdoNTIuMjY3di0xMDQuNTMzaC01Mi4yNjd2MTA0LjUzM3pNNjQyLjY2NyA1NzguNjY3aDUyLjI2N3YtMTU2LjhoLTUyLjI2N3YxNTYuOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTUxOyIgZ2x5cGgtbmFtZT0iZmllbGQiIGRhdGEtdGFncz0i5a2X5q61aWNvbiIgaG9yaXotYWR2LXg9IjEyMjkiIGQ9Ik0xOTIuMDMwIDgwMGg4NDQuOHYtMTQwLjhoLTg0NC44djE0MC44ek01NDQuMDMwIDY1OS4yaDE0MC44di01NjMuMmgtMTQwLjh2NTYzLjJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1MjsiIGdseXBoLW5hbWU9Im1lbnUiIGRhdGEtdGFncz0i6I+c5Y2VIiBob3Jpei1hZHYteD0iMTQzNCIgZD0iTTU1MC40MzggODY0aDc0OC44di0xNjYuNGgtNzQ4Ljh2MTY2LjR6TTU1MC40MzggNTMxLjJoNzQ4Ljh2LTE2Ni40aC03NDguOHYxNjYuNHpNNTUwLjQzOCAxOTguNGg3NDguOHYtMTY2LjRoLTc0OC44djE2Ni40ek0xMzQuNDM4IDg2NGgyNDkuNnYtMTY2LjRoLTI0OS42djE2Ni40ek0xMzQuNDM4IDUzMS4yaDI0OS42di0xNjYuNGgtMjQ5LjZ2MTY2LjR6TTEzNC40MzggMTk4LjRoMjQ5LjZ2LTE2Ni40aC0yNDkuNnYxNjYuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTUzOyIgZ2x5cGgtbmFtZT0icmVuYW1lIiBkYXRhLXRhZ3M9IlIiIGhvcml6LWFkdi14PSI4NjYiIGQ9Ik04MC4yMDkgODMyLjY0N2gzODkuNjk0Yzc4Ljg2OCAwIDE0MC41MjktMTkuMzMgMTg0Ljk4OS01Ny45OXM2Ni42ODktOTEuNjI1IDY2LjY4OS0xNTguODk0YzAtNTAuMjU5LTExLjQwNS05NC4zMzEtMzQuMjE1LTEzMi4yMThzLTU5LjM0NC02My43ODktMTA5LjYwMS03Ny43MDZ2LTIuMzJjMjMuOTctNC42MzkgNDMuNDkzLTEyLjM3MSA1OC41NjktMjMuMTk2czI3LjA2Mi0yMy43NzYgMzUuOTUzLTM4Ljg1M2M4Ljg5Mi0xNS4wNzggMTUuNDY0LTMxLjg5NSAxOS43MTYtNTAuNDUyczcuNTM4LTM3Ljg4NyA5Ljg1OC01Ny45OWMxLjU0Ni0yMC4xMDMgMi43MDctNDAuNTk0IDMuNDc5LTYxLjQ2OXMyLjcwNi00MS4zNjYgNS43OTktNjEuNDY5YzMuMDkzLTIwLjEwMyA3LjUzOC0zOS4yMzkgMTMuMzM3LTU3LjQxczE0LjQ5OC0zNC4yMTUgMjYuMDk1LTQ4LjEzMmgtMTIyLjk0Yy03LjczMSA4LjUwNi0xMi45NTEgMjAuMTAzLTE1LjY1OCAzNC43OTRzLTQuNDQ1IDMxLjEyMi01LjIyIDQ5LjI5MmMtMC43NzMgMTguMTcxLTEuNTQ2IDM3LjY5NC0yLjMyIDU4LjU2OXMtMy4wOTMgNDEuMzY2LTYuOTU4IDYxLjQ2OWMtMy4wOTMgMjAuMTAzLTYuOTU4IDM5LjIzOS0xMS41OTkgNTcuNDFzLTExLjk4NSAzNC4wMjItMjIuMDM2IDQ3LjU1MmMtMTAuMDUxIDEzLjUzMS0yMy4xOTUgMjQuMzU3LTM5LjQzMyAzMi40NzRzLTM3Ljg4NyAxMi4xNzgtNjQuOTQ4IDEyLjE3OGgtMjY5LjA3NXYtMzUzLjc0aC0xMTAuMTgydjgyOC4xMDF6TTQyMC4wMzIgNDUxLjA3MWMyNS41MTYgMCA0OS44NzIgMS45MzQgNzMuMDY4IDUuNzk5czQzLjQ5MyAxMS40MDYgNjAuODkgMjIuNjE2YzE3LjM5NyAxMS4yMTIgMzEuMzE1IDI2LjI4OCA0MS43NTMgNDUuMjMyczE1LjY1OCA0My40OTMgMTUuNjU4IDczLjY0N2MwIDQxLjc1My0xMS41OTkgNzUuNzc0LTM0Ljc5NCAxMDIuMDYzcy02MC42OTYgMzkuNDMzLTExMi41IDM5LjQzM2gtMjczLjcxNHYtMjg4Ljc5MmgyMjkuNjQxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTQ7IiBnbHlwaC1uYW1lPSJtYXBzIiBkYXRhLXRhZ3M9IuaIkeeahOWcsOWbviIgaG9yaXotYWR2LXg9IjExNjEiIGQ9Ik0zNDEuMzMzIDgyMy40NjdsLTI3Ny45MzEgMTExLjE3MmMtMzUuMDE2IDE0LjAwNi02My40MDItNS4xODgtNjMuNDAyLTQyLjgwNHYtNzUxLjEzOGMwLTM3LjY0NiAyNy45MzMtNzkuMzM4IDYzLjQwMi05My41MjVsMjc3LjkzMS0xMTEuMTcydjg4Ny40Njd6TTQwOS42LTY0bDMzOS4wNDggMTM0LjM3MXY4ODkuNjI5bC0zMzkuMDQ4LTEzNi41MzN2LTg4Ny40Njd6TTgxOS4yIDcyLjUzM2wyNzcuOTMxLTExMS4xNzJjMzUuMDE2LTE0LjAwNiA2My40MDIgNS4xODggNjMuNDAyIDQyLjgwNHY3NTEuMTM4YzAgMzcuNjQ2LTI3LjkzMyA3OS4zMzgtNjMuNDAyIDkzLjUyNWwtMjc3LjkzMSAxMTEuMTcydi04ODcuNDY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTU7IiBnbHlwaC1uYW1lPSJuZXciIGRhdGEtdGFncz0i5Yib5bu6IiBkPSJNNTEyIDk2MGMtMjgyLjc3IDAtNTEyLTIyOS4yMy01MTItNTEyczIyOS4yMy01MTIgNTEyLTUxMmMyODIuNzcgMCA1MTIgMjI5LjIzIDUxMiA1MTJzLTIyOS4yMyA1MTItNTEyIDUxMnpNNDU1LjExMSAxNjMuNTU2djIyNy41NTZoLTIyNy41NTZjMCAwLTU2Ljg4OSAwLTU2Ljg4OSA1Ni44ODlzNTYuODg5IDU2Ljg4OSA1Ni44ODkgNTYuODg5aDIyNy41NTZ2MjI3LjU1NmMwIDAgMCA1Ni44ODkgNTYuODg5IDU2Ljg4OXM1Ni44ODktNTYuODg5IDU2Ljg4OS01Ni44ODl2LTIyNy41NTZoMjI3LjU1NmMyNi42NCAwLjA4MCA1Ni44ODktMjguNDQ0IDU2Ljg4OS01Ni44ODlzLTMwLjMyLTU2LjgwOS01Ni44ODktNTYuODg5aC0yMjcuNTU2di0yMjcuNTU2YzAgMCAwLTU2Ljg4OS01Ni44ODktNTYuODg5cy01Ni44ODkgNTYuODg5LTU2Ljg4OSA1Ni44ODl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1NjsiIGdseXBoLW5hbWU9ImZlZWRiYWNrIiBkYXRhLXRhZ3M9IuWPjemmiCIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik0xMjggOTYwYy02My42MjcgMC0xMjgtNjUuMTU4LTEyOC0xMjh2LTU3NmMwLTYyLjgzOCA2NC4zNzMtMTI4IDEyOC0xMjhoNjR2LTE5MmwxOTIgMTkyaDY0MGM2My42MjEgMCAxMjggNjUuMTYyIDEyOCAxMjh2NTc2YzAgNjIuODQyLTY0LjM3OSAxMjgtMTI4IDEyOHpNODQyLjY2NyAzODRoLTUzMy4zMzNjMCAwLTUzLjMzMyAwLTUzLjMzMyA2NHM1My4zMzMgNjQgNTMuMzMzIDY0aDUzMy4zMzNjMCAwIDUzLjMzMyAwIDUzLjMzMy02NHMtNTMuMzMzLTY0LTUzLjMzMy02NHpNMzA5LjMzMyA2NDBjMCAwLTUzLjMzMyAwLTUzLjMzMyA2NHM1My4zMzMgNjQgNTMuMzMzIDY0aDUzMy4zMzNjMCAwIDUzLjMzMyAwIDUzLjMzMy02NHMtNTMuMzMzLTY0LTUzLjMzMy02NGgtNTMzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTU3OyIgZ2x5cGgtbmFtZT0iaG9tZXBhZ2UiIGRhdGEtdGFncz0i6aaW6aG1IiBob3Jpei1hZHYteD0iOTY3IiBkPSJNMTIuODQ1IDUxMS43OThjLTIyLjE4OC0yMi4xODgtMTQuOTkzLTQwLjE3NiAxNi42NTQtNDAuMTc2aDExMy44Mzd2LTQ1NC4yMWMwLTMxLjI3IDI1LjIyMi01Ni42MiA1Ny40MjItNTYuNjJoMTEyLjcxMmMzMS43MTMgMCA1Ny40MjIgMjUuNTY4IDU3LjQyMiA1Ni45MzZ2MjI2LjI5MmMwIDMxLjQ0NSAyNS4yMjIgNTYuOTM2IDU3LjQyMiA1Ni45MzZoMTEyLjcxMmMzMS43MTMgMCA1Ny40MjItMjUuNTY4IDU3LjQyMi01Ni45MzZ2LTIyNi4yOTJjMC0zMS40NDUgMjUuMjIyLTU3LjA2NSA1Ny40MjItNTcuMjMxbDExMi43MTItMC41OGMzMS43MTMtMC4xNjMgNTcuNDIyIDI1LjA5NSA1Ny40MjIgNTYuNDU0djQ1NS4yNTFoMTEzLjgzN2MzMS4zODYgMCAzOC42MDcgMTguMjIyIDE2LjY1NCA0MC4xNzZsLTQzMS42NDggNDMxLjY0OGMtMjIuMTg4IDIyLjE4OC01OC4zOTggMjEuOTUzLTgwLjM1MiAwbC00MzEuNjQ4LTQzMS42NDh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1ODsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9iZWVuaGVyZSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fYmVlbmhlcmUiIGQ9Ik04MTAuNjY3IDkxNy4zMzNoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTU1MS42OGMwLTI5LjQ0IDE0LjkzMy01NS40NjcgMzcuNTQ3LTcwLjgyN2wzNDYuNDUzLTIzMC44MjcgMzQ2LjAyNyAyMzAuODI3YzIyLjYxMyAxNS4zNiAzNy41NDcgNDEuMzg3IDM3LjU0NyA3MC44MjdsMC40MjcgNTUxLjY4YzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTQyNi42NjcgMjc3LjMzM2wtMjEzLjMzMyAyMTMuMzMzIDYwLjE2IDYwLjE2IDE1My4xNzMtMTUyLjc0NyAzMjMuODQgMzIzLjg0IDYwLjE2LTYwLjU4Ny0zODQtMzg0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTk7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9ucyIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9ucyIgZD0iTTkyNi4yOTMgNDc4LjI5M2wtMzg0IDM4NGMtNy42OTMgNy43MDktMTguMzMgMTIuNDc4LTMwLjA4MCAxMi40NzhzLTIyLjM4Ny00Ljc2OS0zMC4wNzktMTIuNDc3bC0zODQuMDAxLTM4NC4wMDFjLTcuNzA5LTcuNjkzLTEyLjQ3OC0xOC4zMy0xMi40NzgtMzAuMDgwczQuNzY5LTIyLjM4NyAxMi40NzctMzAuMDc5bDM4NC4wMDEtMzg0LjAwMWMxNi42NC0xNi42NCA0My41Mi0xNi42NCA2MC4xNiAwbDM4NCAzODRjNy43MDkgNy42OTMgMTIuNDc4IDE4LjMzIDEyLjQ3OCAzMC4wODBzLTQuNzY5IDIyLjM4Ny0xMi40NzcgMzAuMDc5bC0wLjAwMSAwLjAwMXpNNTk3LjMzMyAzNDEuMzMzdjEwNi42NjdoLTE3MC42Njd2LTEyOGgtODUuMzMzdjE3MC42NjdjMCAyMy40NjcgMTkuMiA0Mi42NjcgNDIuNjY3IDQyLjY2N2gyMTMuMzMzdjEwNi42NjdsMTQ5LjMzMy0xNDkuMzMzLTE0OS4zMzMtMTQ5LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTVhOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfYmlrZSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19iaWtlXzI0cHgiIGQ9Ik02ODIuNjY3IDc1NS4yYzQyLjI0IDAgNzYuOCAzNC41NiA3Ni44IDc2LjhzLTM0LjU2IDc2LjgtNzYuOCA3Ni44Yy00Mi42NjcgMC03Ni44LTM0LjU2LTc2LjgtNzYuOHMzNC4xMzMtNzYuOCA3Ni44LTc2Ljh6TTgxMC42NjcgNDQ4Yy0xMTcuNzYgMC0yMTMuMzMzLTk1LjU3My0yMTMuMzMzLTIxMy4zMzNzOTUuNTczLTIxMy4zMzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzMgOTUuNTczIDIxMy4zMzMgMjEzLjMzMy05NS41NzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzN6TTgxMC42NjcgODUuMzMzYy04Mi4zNDcgMC0xNDkuMzMzIDY2Ljk4Ny0xNDkuMzMzIDE0OS4zMzNzNjYuOTg3IDE0OS4zMzMgMTQ5LjMzMyAxNDkuMzMzIDE0OS4zMzMtNjYuOTg3IDE0OS4zMzMtMTQ5LjMzMy02Ni45ODctMTQ5LjMzMy0xNDkuMzMzLTE0OS4zMzN6TTYzMS40NjcgNTMzLjMzM2gxNzkuMnY3Ni44aC0xMzYuNTMzbC04Mi4zNDcgMTM5LjUyYy0xMi44NTggMjEuMzI1LTM1Ljg5NyAzNS4zNjctNjIuMjE1IDM1LjM2Ny0yMC4wMzQgMC0zOC4xNjgtOC4xMzctNTEuMjc3LTIxLjI4NWwtMTU3Ljg2OS0xNTcuODY5Yy0xMy42NTMtMTIuOC0yMS43Ni0zMS4xNDctMjEuNzYtNTEuMiAwLTI2Ljg4IDE0LjA4MC00OS40OTMgMzYuMjY3LTYyLjcybDE0Mi45MzMtODYuNjEzdi0yMTMuMzMzaDc2Ljh2Mjc2LjQ4bC05NiA3MS4yNTMgOTguOTg3IDk5LjQxMyA3My44MTMtMTA1LjgxM3pNMjEzLjMzMyA0NDhjLTExNy43NiAwLTIxMy4zMzMtOTUuNTczLTIxMy4zMzMtMjEzLjMzM3M5NS41NzMtMjEzLjMzMyAyMTMuMzMzLTIxMy4zMzMgMjEzLjMzMyA5NS41NzMgMjEzLjMzMyAyMTMuMzMzLTk1LjU3MyAyMTMuMzMzLTIxMy4zMzMgMjEzLjMzM3pNMjEzLjMzMyA4NS4zMzNjLTgyLjM0NyAwLTE0OS4zMzMgNjYuOTg3LTE0OS4zMzMgMTQ5LjMzM3M2Ni45ODcgMTQ5LjMzMyAxNDkuMzMzIDE0OS4zMzMgMTQ5LjMzMy02Ni45ODcgMTQ5LjMzMy0xNDkuMzMzLTY2Ljk4Ny0xNDkuMzMzLTE0OS4zMzMtMTQ5LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTViOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfYnVzIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX2J1c18yNHB4IiBkPSJNMTcwLjY2NyAyNzcuMzMzYzAtMzcuNTQ3IDE2LjY0LTcxLjI1MyA0Mi42NjctOTQuNzJ2LTc1Ljk0N2MwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDQyLjY2N2MyMy40NjcgMCA0Mi42NjcgMTkuMiA0Mi42NjcgNDIuNjY3djQyLjY2N2gzNDEuMzMzdi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y3NS45NDdjMjYuMDI3IDIzLjQ2NyA0Mi42NjcgNTcuMTczIDQyLjY2NyA5NC43MnY0MjYuNjY3YzAgMTQ5LjMzMy0xNTIuNzQ3IDE3MC42NjctMzQxLjMzMyAxNzAuNjY3cy0zNDEuMzMzLTIxLjMzMy0zNDEuMzMzLTE3MC42Njd2LTQyNi42Njd6TTMyMCAyMzQuNjY3Yy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTcwNCAyMzQuNjY3Yy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc2OCA0OTAuNjY3aC01MTJ2MjEzLjMzM2g1MTJ2LTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1YzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX2NhciIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19jYXJfMjRweCIgZD0iTTgwNy4yNTMgNzAzLjU3M2MtOC41MzMgMjUuMTczLTMyLjQyNyA0My4wOTMtNjAuNTg3IDQzLjA5M2gtNDY5LjMzM2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAyNzcuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc0Ni42NjcgMjc3LjMzM2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0ek0yMTMuMzMzIDQ5MC42NjdsNjQgMTkyaDQ2OS4zMzNsNjQtMTkyaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NWQ7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19mZXJyeSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19mZXJyeV8yNHB4IiBkPSJNODUzLjMzMyA2NGMtNTkuMzA3IDAtMTE4LjYxMyAyMC4wNTMtMTcwLjY2NyA1Ni4zMi0xMDQuMTA3LTcyLjk2LTIzNy4yMjctNzIuOTYtMzQxLjMzMyAwLTUyLjA1My0zNi4yNjctMTExLjM2LTU2LjMyLTE3MC42NjctNTYuMzJoLTg1LjMzM3YtODUuMzMzaDg1LjMzM2M1OC44OCAwIDExNi45MDcgMTQuOTMzIDE3MC42NjcgNDIuMjQgNDkuNTkzLTI2LjAxNiAxMDguMzQ3LTQxLjI4MyAxNzAuNjY3LTQxLjI4M3MxMjEuMDczIDE1LjI2NiAxNzIuNzI2IDQyLjI2MmwtMi4wNTktMC45OGM1My43Ni0yNy43MzMgMTExLjc4Ny00Mi4yNCAxNzAuNjY3LTQyLjI0aDg1LjMzM3Y4NS4zMzNoLTg1LjMzM3pNMTY4LjUzMyAxNDkuMzMzaDIuMTMzYzY4LjI2NyAwIDEyOC44NTMgMzcuNTQ3IDE3MC42NjcgODUuMzMzIDQxLjgxMy00Ny43ODcgMTAyLjQtODUuMzMzIDE3MC42NjctODUuMzMzczEyOC44NTMgMzcuNTQ3IDE3MC42NjcgODUuMzMzYzQxLjgxMy00Ny43ODcgMTAyLjQtODUuMzMzIDE3MC42NjctODUuMzMzaDIuMTMzbDgwLjY0IDI4NS4wMTNjMy40MTMgMTEuMDkzIDIuNTYgMjMuMDQwLTIuNTYgMzMuMjhzLTE0LjUwNyAxNy45Mi0yNS42IDIxLjMzM2wtNTQuNjEzIDE3LjkydjE5Ny4xMmMwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzaC0xMjh2MTI4aC0yNTZ2LTEyOGgtMTI4Yy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi0xOTcuMTJsLTU1LjA0MC0xNy45MmMtMTcuNzItNS41NjctMzAuMzUtMjEuODQ0LTMwLjM1LTQxLjA3MiAwLTQuODQ0IDAuODAyLTkuNSAyLjI3OS0xMy44NDRsLTAuMDg5IDAuMzAzIDgxLjA2Ny0yODUuMDEzek0yNTYgNzA0aDUxMnYtMTY5LjM4N2wtMjU2IDg0LjA1My0yNTYtODQuMDUzdjE2OS4zODd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1ZTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3RyYWluIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3RyYWluXzI0cHgiIGQ9Ik0xNzAuNjY3IDI5OC42NjdjMC04Mi4zNDcgNjYuOTg3LTE0OS4zMzMgMTQ5LjMzMy0xNDkuMzMzbC02NC02NHYtMjEuMzMzaDUxMnYyMS4zMzNsLTY0IDY0YzgyLjM0NyAwIDE0OS4zMzMgNjYuOTg3IDE0OS4zMzMgMTQ5LjMzM3Y0NDhjMCAxNDkuMzMzLTE1Mi43NDcgMTcwLjY2Ny0zNDEuMzMzIDE3MC42NjdzLTM0MS4zMzMtMjEuMzMzLTM0MS4zMzMtMTcwLjY2N3YtNDQ4ek01MTIgMjM0LjY2N2MtNDYuOTMzIDAtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3MzOC40IDg1LjMzMyA4NS4zMzMgODUuMzMzIDg1LjMzMy0zOC40IDg1LjMzMy04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzLTg1LjMzM3pNNzY4IDUzMy4zMzNoLTUxMnYyMTMuMzMzaDUxMnYtMjEzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTVmOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfdHJhbnNpdCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fX2RpcmVjdGlvbnNfdHJhbnNpdCIgZD0iTTUxMiA4NzQuNjY3Yy0xODguNTg3IDAtMzQxLjMzMy0yMS4zMzMtMzQxLjMzMy0xNzAuNjY3di00MDUuMzMzYzAtODIuMzQ3IDY2Ljk4Ny0xNDkuMzMzIDE0OS4zMzMtMTQ5LjMzM2wtNjQtNjR2LTIxLjMzM2g1MTJ2MjEuMzMzbC02NCA2NGM4Mi4zNDcgMCAxNDkuMzMzIDY2Ljk4NyAxNDkuMzMzIDE0OS4zMzN2NDA1LjMzM2MwIDE0OS4zMzMtMTUyLjc0NyAxNzAuNjY3LTM0MS4zMzMgMTcwLjY2N3pNMzIwIDIzNC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNDY5LjMzMyA0OTAuNjY3aC0yMTMuMzMzdjIxMy4zMzNoMjEzLjMzM3YtMjEzLjMzM3pNNzA0IDIzNC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNzY4IDQ5MC42NjdoLTIxMy4zMzN2MjEzLjMzM2gyMTMuMzMzdi0yMTMuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NjA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc193YWxrIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3dhbGtfMjRweCIgZD0iTTU5Ny4zMzMgNzk3Ljg2N2M0Mi4zNzQgMC4wMjQgNzYuNzE1IDM0LjM4IDc2LjcxNSA3Ni43NTcgMCA0Mi4zOTItMzQuMzY1IDc2Ljc1Ny03Ni43NTcgNzYuNzU3LTQyLjM3NyAwLTc2LjczMy0zNC4zNDEtNzYuNzU3LTc2LjcxMnYtMC4wMDJjMC00Mi4yNCAzNC4xMzMtNzYuOCA3Ni44LTc2Ljh6TTYwMi40NTMgNTMzLjMzM2gyMDguMjEzdjc2LjhoLTE1NC40NTNsLTg1LjMzMyAxNDIuMDgwYy0xMi44IDIxLjMzMy0zNS44NCAzNS40MTMtNjIuMjkzIDM1LjQxMy03LjI1MyAwLTE0LjUwNy0xLjI4LTIwLjkwNy0yLjk4N2wtMjMxLjY4LTcyLjEwN3YtMjIxLjg2N2g3Ni44djE1Ni41ODdsOTAuMDI3IDI4LjE2LTE2Ni44MjctNjU0LjA4MGg3Ni44bDEyMi40NTMgMzQ2LjAyNyA5OS40MTMtMTMyLjY5M3YtMjEzLjMzM2g3Ni44djI3My40OTNsLTEwNi4yNCAxOTMuNzA3IDMxLjE0NyAxMjIuNDUzIDQ2LjA4MC03Ny42NTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2MTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9mbGlnaHQiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2ZsaWdodF8yNHB4IiBkPSJNODk2IDI3Ny4zMzN2ODUuMzMzbC0zNDEuMzMzIDIxMy4zMzN2MjM0LjY2N2MwIDM1LjQxMy0yOC41ODcgNjQtNjQgNjRzLTY0LTI4LjU4Ny02NC02NHYtMjM0LjY2N2wtMzQxLjMzMy0yMTMuMzMzdi04NS4zMzNsMzQxLjMzMyAxMDYuNjY3di0yMzQuNjY3bC04NS4zMzMtNjR2LTY0bDE0OS4zMzMgNDIuNjY3IDE0OS4zMzMtNDIuNjY3djY0bC04NS4zMzMgNjR2MjM0LjY2N2wzNDEuMzMzLTEwNi42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2MjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9ob3RlbCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25faG90ZWxfMjRweCIgZD0iTTI5OC42NjcgNDA1LjMzM2M3MC44MjcgMCAxMjggNTcuMTczIDEyOCAxMjhzLTU3LjE3MyAxMjgtMTI4IDEyOC0xMjgtNTcuMTczLTEyOC0xMjggNTcuMTczLTEyOCAxMjgtMTI4ek04MTAuNjY3IDY2MS4zMzNoLTM0MS4zMzN2LTI5OC42NjdoLTM0MS4zMzN2Mzg0aC04NS4zMzN2LTY0MGg4NS4zMzN2MTI4aDc2OHYtMTI4aDg1LjMzM3YzODRjMCA5NC4yOTMtNzYuMzczIDE3MC42NjctMTcwLjY2NyAxNzAuNjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NjM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfYWlycG9ydCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfYWlycG9ydF8yNHB4IiBkPSJNODk2IDI3Ny4zMzN2ODUuMzMzbC0zNDEuMzMzIDIxMy4zMzN2MjM0LjY2N2MwIDM1LjQxMy0yOC41ODcgNjQtNjQgNjRzLTY0LTI4LjU4Ny02NC02NHYtMjM0LjY2N2wtMzQxLjMzMy0yMTMuMzMzdi04NS4zMzNsMzQxLjMzMyAxMDYuNjY3di0yMzQuNjY3bC04NS4zMzMtNjR2LTY0bDE0OS4zMzMgNDIuNjY3IDE0OS4zMzMtNDIuNjY3djY0bC04NS4zMzMgNjR2MjM0LjY2N2wzNDEuMzMzLTEwNi42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2NDsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9hdG0iIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0bV8yNHB4IiBkPSJNNDY5LjMzMyAyMzQuNjY3aDg1LjMzM3Y0Mi42NjdoNDIuNjY3YzIzLjQ2NyAwIDQyLjY2NyAxOS4yIDQyLjY2NyA0Mi42Njd2MTI4YzAgMjMuNDY3LTE5LjIgNDIuNjY3LTQyLjY2NyA0Mi42NjdoLTEyOHY0Mi42NjdoMTcwLjY2N3Y4NS4zMzNoLTg1LjMzM3Y0Mi42NjdoLTg1LjMzM3YtNDIuNjY3aC00Mi42NjdjLTIzLjQ2NyAwLTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42Njd2LTEyOGMwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDEyOHYtNDIuNjY3aC0xNzAuNjY3di04NS4zMzNoODUuMzMzdi00Mi42Njd6TTg1My4zMzMgNzg5LjMzM2gtNjgyLjY2N2MtNDcuMzYgMC04NC45MDctMzcuOTczLTg0LjkwNy04NS4zMzNsLTAuNDI3LTUxMmMwLTQ3LjM2IDM3Ljk3My04NS4zMzMgODUuMzMzLTg1LjMzM2g2ODIuNjY3YzQ3LjM2IDAgODUuMzMzIDM3Ljk3MyA4NS4zMzMgODUuMzMzdjUxMmMwIDQ3LjM2LTM3Ljk3MyA4NS4zMzMtODUuMzMzIDg1LjMzM3pNODUzLjMzMyAxOTJoLTY4Mi42Njd2NTEyaDY4Mi42Njd2LTUxMnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY1OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0dHJhY3Rpb24iIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0dHJhY3Rpb25fMjRweCIgZD0iTTg1My4zMzMgNDQ4YzAgNDYuOTMzIDM4LjQgODUuMzMzIDg1LjMzMyA4NS4zMzN2MTcwLjY2N2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzaC02ODIuNjY3Yy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzdi0xNzAuNjY3YzQ2LjkzMyAwIDg0LjkwNy0zOC40IDg0LjkwNy04NS4zMzNzLTM3Ljk3My04NS4zMzMtODUuMzMzLTg1LjMzM3YtMTcwLjY2N2MwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDY4Mi42NjdjNDYuOTMzIDAgODUuMzMzIDM4LjQgODUuMzMzIDg1LjMzM3YxNzAuNjY3Yy00Ni45MzMgMC04NS4zMzMgMzguNC04NS4zMzMgODUuMzMzek02NjQuNzQ3IDI0My4ybC0xNTIuNzQ3IDk4LjEzMy0xNTIuNzQ3LTk4LjEzMyA0Ni4wODAgMTc1Ljc4Ny0xNDAuMzczIDExNC43NzMgMTgwLjkwNyAxMC42NjcgNjYuMTMzIDE2OC4xMDcgNjUuNzA3LTE2OC41MzMgMTgwLjkwNy0xMC42NjctMTQwLjM3My0xMTQuNzczIDQ2LjUwNy0xNzUuMzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2NjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9iYXIiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2Jhcl8yNHB4IiBkPSJNNDY5LjMzMyA0MDUuMzMzdi0yNTZoLTIxMy4zMzN2LTg1LjMzM2g1MTJ2ODUuMzMzaC0yMTMuMzMzdjI1NmwzNDEuMzMzIDM0MS4zMzN2ODUuMzMzaC03Njh2LTg1LjMzM2wzNDEuMzMzLTM0MS4zMzN6TTMyMCA2NjEuMzMzbC04NS4zMzMgODUuMzMzaDU1NC42NjdsLTg1LjMzMy04NS4zMzNoLTM4NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY3OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NhZmUiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NhZmVfMjRweCIgZD0iTTg1My4zMzMgODMyaC02ODIuNjY3di00MjYuNjY3YzAtOTQuMjkzIDc2LjM3My0xNzAuNjY3IDE3MC42NjctMTcwLjY2N2gyNTZjOTQuMjkzIDAgMTcwLjY2NyA3Ni4zNzMgMTcwLjY2NyAxNzAuNjY3djEyOGg4NS4zMzNjNDcuMzYgMCA4NS4zMzMgMzcuOTczIDg1LjMzMyA4NS4zMzN2MTI4YzAgNDcuMzYtMzcuOTczIDg1LjMzMy04NS4zMzMgODUuMzMzek04NTMuMzMzIDYxOC42NjdoLTg1LjMzM3YxMjhoODUuMzMzdi0xMjh6TTg1LjMzMyA2NGg3Njh2ODUuMzMzaC03Njh2LTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY4OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2Nhcl93YXNoIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9jYXJfd2FzaF8yNHB4IiBkPSJNNzI1LjMzMyA3NDYuNjY3YzM1LjQxMyAwIDY0IDI4LjU4NyA2NCA2NCAwIDQyLjY2Ny02NCAxMTUuMi02NCAxMTUuMnMtNjQtNzIuNTMzLTY0LTExNS4yYzAtMzUuNDEzIDI4LjU4Ny02NCA2NC02NHpNNTEyIDc0Ni42NjdjMzUuNDEzIDAgNjQgMjguNTg3IDY0IDY0IDAgNDIuNjY3LTY0IDExNS4yLTY0IDExNS4ycy02NC03Mi41MzMtNjQtMTE1LjJjMC0zNS40MTMgMjguNTg3LTY0IDY0LTY0ek0yOTguNjY3IDc0Ni42NjdjMzUuNDEzIDAgNjQgMjguNTg3IDY0IDY0IDAgNDIuNjY3LTY0IDExNS4yLTY0IDExNS4ycy02NC03Mi41MzMtNjQtMTE1LjJjMC0zNS40MTMgMjguNTg3LTY0IDY0LTY0ek04MDcuMjUzIDYxOC4yNGMtOC41MzMgMjUuMTczLTMyLjQyNyA0My4wOTMtNjAuNTg3IDQzLjA5M2gtNDY5LjMzM2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAxOTJjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNzQ2LjY2NyAxOTJjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNMjEzLjMzMyA0MDUuMzMzbDY0IDE5Mmg0NjkuMzMzbDY0LTE5MmgtNTk3LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY5OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NvbnZlbmllbmNlX3N0b3JlIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9jb252ZW5pZW5jZV9zdG9yZV8yNHB4IiBkPSJNODEwLjY2NyA2NjEuMzMzdjEyOGgtNTk3LjMzM3YtMTI4aC0xMjh2LTU1NC42NjdoMzQxLjMzM3YxNzAuNjY3aDE3MC42Njd2LTE3MC42NjdoMzQxLjMzM3Y1NTQuNjY3aC0xMjh6TTQ2OS4zMzMgNTMzLjMzM2gtODUuMzMzdi00Mi42NjdoODUuMzMzdi00Mi42NjdoLTEyOHYxMjhoODUuMzMzdjQyLjY2N2gtODUuMzMzdjQyLjY2N2gxMjh2LTEyOHpNNjgyLjY2NyA0NDhoLTQyLjY2N3Y4NS4zMzNoLTg1LjMzM3YxMjhoNDIuNjY3di04NS4zMzNoNDIuNjY3djg1LjMzM2g0Mi42Njd2LTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9kcmluayIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfZHJpbmtfMjRweCIgZD0iTTEyOCA4NzQuNjY3bDg1Ljc2LTc3Ny44MTNjNS4xMi00Mi42NjcgNDAuOTYtNzUuNTIgODQuOTA3LTc1LjUyaDQyNi42NjdjNDMuOTQ3IDAgNzkuNzg3IDMyLjg1MyA4NC45MDcgNzUuNTJsODUuNzYgNzc3LjgxM2gtNzY4ek01MTIgMTQ5LjMzM2MtNzAuODI3IDAtMTI4IDU3LjE3My0xMjggMTI4IDAgODUuMzMzIDEyOCAyMzAuNCAxMjggMjMwLjRzMTI4LTE0NS4wNjcgMTI4LTIzMC40YzAtNzAuODI3LTU3LjE3My0xMjgtMTI4LTEyOHpNNzgyLjA4MCA2MTguNjY3aC01NDAuMTZsLTE4Ljc3MyAxNzAuNjY3aDU3Ny4yOGwtMTguMzQ3LTE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9mbG9yaXN0IiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9mbG9yaXN0XzI0cHgiIGQ9Ik01MTIgMjEuMzMzYzIxMi4wNzcgMCAzODQgMTcxLjkyMyAzODQgMzg0djBjLTIxMi4wNzcgMC0zODQtMTcxLjkyMy0zODQtMzg0djB6TTIzOC45MzMgNTIyLjY2N2MwLTAuMDMxIDAtMC4wNjcgMC0wLjEwNCAwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2NyAyMi42NTUgMCA0My42NiA3LjA2MyA2MC45MzQgMTkuMTA2bC0wLjM0OC0wLjIyOS0wLjg1My04LjEwN2MwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2N3MxMDYuNjY3IDQ3Ljc1NiAxMDYuNjY3IDEwNi42Njd2MGwtMC44NTMgOC4xMDdjMTcuMDY3LTExLjk0NyAzNy45NzMtMTguNzczIDYwLjU4Ny0xOC43NzMgNTguOTEgMCAxMDYuNjY3IDQ3Ljc1NiAxMDYuNjY3IDEwNi42Njd2MGMwIDQyLjY2Ny0yNS4xNzMgNzguOTMzLTYxLjAxMyA5NiAzNS44NCAxNy4wNjcgNjEuMDEzIDUzLjMzMyA2MS4wMTMgOTYgMCAwLjAzMSAwIDAuMDY3IDAgMC4xMDQgMCA1OC45MS00Ny43NTYgMTA2LjY2Ny0xMDYuNjY3IDEwNi42NjctMjIuNjU1IDAtNDMuNjYtNy4wNjMtNjAuOTM0LTE5LjEwNmwwLjM0OCAwLjIyOSAwLjg1MyA4LjEwN2MwIDU4LjkxLTQ3Ljc1NiAxMDYuNjY3LTEwNi42NjcgMTA2LjY2N3MtMTA2LjY2Ny00Ny43NTYtMTA2LjY2Ny0xMDYuNjY3djBsMC44NTMtOC4xMDdjLTE3LjA2NyAxMS45NDctMzcuOTczIDE4Ljc3My02MC41ODcgMTguNzczLTU4LjkxIDAtMTA2LjY2Ny00Ny43NTYtMTA2LjY2Ny0xMDYuNjY3djBjMC00Mi42NjcgMjUuMTczLTc4LjkzMyA2MS4wMTMtOTYtMzUuODQtMTcuMDY3LTYxLjAxMy01My4zMzMtNjEuMDEzLTk2ek01MTIgNzI1LjMzM2M1OC45MDYtMC4wMDYgMTA2LjY1Ni00Ny43NiAxMDYuNjU2LTEwNi42NjdzLTQ3Ljc1LTEwNi42NjEtMTA2LjY1Ni0xMDYuNjY3aC0wLjAwMWMtNTguOTA2IDAuMDA2LTEwNi42NTYgNDcuNzYtMTA2LjY1NiAxMDYuNjY3czQ3Ljc1IDEwNi42NjEgMTA2LjY1NiAxMDYuNjY3aDAuMDAxek0xMjggNDA1LjMzM2MwLTIxMi4wNzcgMTcxLjkyMy0zODQgMzg0LTM4NHYwYzAgMjEyLjA3Ny0xNzEuOTIzIDM4NC0zODQgMzg0djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9nYXNfc3RhdGlvbiIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfZ2FzX3N0YXRpb25fMjRweCIgZD0iTTg0My41MiA2NTEuNTJsMC40MjcgMC40MjctMTU4LjcyIDE1OC43Mi00NS4yMjctNDUuMjI3IDkwLjAyNy05MC4wMjdjLTQwLjEwNy0xNS4zNi02OC42OTMtNTMuNzYtNjguNjkzLTk5LjQxMyAwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2N3YwYzE1LjM2IDAgMjkuNDQgMy40MTMgNDIuNjY3IDguOTZ2LTMwNy42MjdjMC0yMy40NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2N3MtNDIuNjY3IDE5LjItNDIuNjY3IDQyLjY2N3YxOTJjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM2gtNDIuNjY3djI5OC42NjdjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM2gtMjU2Yy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi02ODIuNjY3aDQyNi42Njd2MzIwaDY0di0yMTMuMzMzYzAtNTguOTEgNDcuNzU2LTEwNi42NjcgMTA2LjY2Ny0xMDYuNjY3czEwNi42NjcgNDcuNzU2IDEwNi42NjcgMTA2LjY2N3YwIDQwNS4zMzNjMCAyOS40NC0xMS45NDcgNTYuMzItMzEuMTQ3IDc1LjUyek01MTIgNTMzLjMzM2gtMjU2djIxMy4zMzNoMjU2di0yMTMuMzMzek03NjggNTMzLjMzM2MtMjMuNDY3IDAtNDIuNjY3IDE5LjItNDIuNjY3IDQyLjY2N3MxOS4yIDQyLjY2NyA0Mi42NjcgNDIuNjY3IDQyLjY2Ny0xOS4yIDQyLjY2Ny00Mi42NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTZkOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2dyb2Nlcnlfc3RvcmUiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2dyb2Nlcnlfc3RvcmVfMjRweCIgZD0iTTI5OC42NjcgMTkyYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzczM3Ljk3My04NS4zMzMgODQuOTA3LTg1LjMzMyA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTQyLjY2NyA4NzQuNjY3di04NS4zMzNoODUuMzMzbDE1My42LTMyMy44NC01Ny42LTEwNC41MzNjLTYuODI3LTExLjk0Ny0xMC42NjctMjYuMDI3LTEwLjY2Ny00MC45NiAwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDUxMnY4NS4zMzNoLTQ5NC4wODBjLTUuOTczIDAtMTAuNjY3IDQuNjkzLTEwLjY2NyAxMC42NjdsMS4yOCA1LjEyIDM4LjQgNjkuNTQ3aDMxNy44NjdjMzIgMCA2MC4xNiAxNy40OTMgNzQuNjY3IDQzLjk0N2wxNTIuNzQ3IDI3Ni45MDdjMy4yNDIgNS44ODMgNS4xNDkgMTIuODk1IDUuMTQ5IDIwLjM1MiAwIDIzLjYtMTkuMTA0IDQyLjczOC00Mi42OTEgNDIuNzk1aC02MzEuMDQ1bC00MC4xMDcgODUuMzMzaC0xMzkuNTJ6TTcyNS4zMzMgMTkyYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzczM3Ljk3My04NS4zMzMgODQuOTA3LTg1LjMzMyA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2ZTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9ob3NwaXRhbCIgZGF0YS10YWdzPSJpY19sb2NhbF9ob3NwaXRhbF8yNHB4IiBkPSJNODEwLjY2NyA4MzJoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTU5Ny4zMzNjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek03NjggMzYyLjY2N2gtMTcwLjY2N3YtMTcwLjY2N2gtMTcwLjY2N3YxNzAuNjY3aC0xNzAuNjY3djE3MC42NjdoMTcwLjY2N3YxNzAuNjY3aDE3MC42Njd2LTE3MC42NjdoMTcwLjY2N3YtMTcwLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTZmOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2xhdW5kcnlfc2VydmljZSIgZGF0YS10YWdzPSJpY19sb2NhbF9sYXVuZHJ5X3NlcnZpY2VfMjRweCIgZD0iTTM5MS4yNTMgMjQxLjkyYzMwLjkyOS0zMC44NDIgNzMuNjExLTQ5LjkxMyAxMjAuNzQ3LTQ5LjkxM3M4OS44MTggMTkuMDcxIDEyMC43NTEgNDkuOTE3bC0wLjAwNC0wLjAwNGMzMC44NDIgMzAuOTI5IDQ5LjkxMyA3My42MTEgNDkuOTEzIDEyMC43NDdzLTE5LjA3MSA4OS44MTgtNDkuOTE3IDEyMC43NTFsMC4wMDQtMC4wMDQtMjQxLjQ5My0yNDEuNDkzek03NjggODc0LjI0bC01MTIgMC40MjdjLTQ3LjM2IDAtODUuMzMzLTM3Ljk3My04NS4zMzMtODUuMzMzdi02ODIuNjY3YzAtNDcuMzYgMzcuOTczLTg1LjMzMyA4NS4zMzMtODUuMzMzaDUxMmM0Ny4zNiAwIDg1LjMzMyAzNy45NzMgODUuMzMzIDg1LjMzM3Y2ODIuNjY3YzAgNDcuMzYtMzcuOTczIDg0LjkwNy04NS4zMzMgODQuOTA3ek00MjYuNjY3IDc4OS4zMzNjMjMuNDY3IDAgNDIuNjY3LTE5LjIgNDIuNjY3LTQyLjY2N3MtMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2Ny00Mi42NjcgMTkuMi00Mi42NjcgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42Njd6TTI5OC42NjcgNzg5LjMzM2MyMy40NjcgMCA0Mi42NjctMTkuMiA0Mi42NjctNDIuNjY3cy0xOS4yLTQyLjY2Ny00Mi42NjctNDIuNjY3LTQyLjY2NyAxOS4yLTQyLjY2NyA0Mi42NjcgMTkuMiA0Mi42NjcgNDIuNjY3IDQyLjY2N3pNNTEyIDEwNi42NjdjLTE0MS4yMjcgMC0yNTYgMTE0Ljc3My0yNTYgMjU2czExNC43NzMgMjU2IDI1NiAyNTYgMjU2LTExNC43NzMgMjU2LTI1Ni0xMTQuNzczLTI1Ni0yNTYtMjU2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfbGlicmFyeSIgZGF0YS10YWdzPSJpY19sb2NhbF9saWJyYXJ5XzI0cHgiIGQ9Ik01MTIgNDY3LjJjLTEwMC42OTMgOTMuODY3LTIzNS41MiAxNTEuNDY3LTM4NCAxNTEuNDY3di00NjkuMzMzYzE0OC40OCAwIDI4My4zMDctNTcuNiAzODQtMTUxLjQ2NyAxMDAuNjkzIDkzLjQ0IDIzNS41MiAxNTEuNDY3IDM4NCAxNTEuNDY3djQ2OS4zMzNjLTE0OC40OCAwLTI4My4zMDctNTcuNi0zODQtMTUxLjQ2N3pNNTEyIDYxOC42NjdjNzAuODI3IDAgMTI4IDU3LjE3MyAxMjggMTI4cy01Ny4xNzMgMTI4LTEyOCAxMjgtMTI4LTU3LjE3My0xMjgtMTI4IDU3LjE3My0xMjggMTI4LTEyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTcxOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX21hbGwiIGRhdGEtdGFncz0iaWNfbG9jYWxfbWFsbF8yNHB4IiBkPSJNODEwLjY2NyA3MDRoLTg1LjMzM2MwIDExNy43Ni05NS41NzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzNzLTIxMy4zMzMtOTUuNTczLTIxMy4zMzMtMjEzLjMzM2gtODUuMzMzYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzbC0wLjQyNy01MTJjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTUxMiA4MzJjNzAuODI3IDAgMTI4LTU3LjE3MyAxMjgtMTI4aC0yNTZjMCA3MC44MjcgNTcuMTczIDEyOCAxMjggMTI4ek01MTIgNDA1LjMzM2MtMTE3Ljc2IDAtMjEzLjMzMyA5NS41NzMtMjEzLjMzMyAyMTMuMzMzaDg1LjMzM2MwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDg1LjMzM2MwLTExNy43Ni05NS41NzMtMjEzLjMzMy0yMTMuMzMzLTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3MjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9tb3ZpZXMiIGRhdGEtdGFncz0iaWNfbG9jYWxfbW92aWVzXzI0cHgiIGQ9Ik03NjggODMydi04NS4zMzNoLTg1LjMzM3Y4NS4zMzNoLTM0MS4zMzN2LTg1LjMzM2gtODUuMzMzdjg1LjMzM2gtODUuMzMzdi03NjhoODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM2gzNDEuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM2g4NS4zMzN2NzY4aC04NS4zMzN6TTM0MS4zMzMgMjM0LjY2N2gtODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM3pNMzQxLjMzMyA0MDUuMzMzaC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzek0zNDEuMzMzIDU3NmgtODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM3pNNzY4IDIzNC42NjdoLTg1LjMzM3Y4NS4zMzNoODUuMzMzdi04NS4zMzN6TTc2OCA0MDUuMzMzaC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzek03NjggNTc2aC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfb2ZmZXIiIGRhdGEtdGFncz0iaWNfbG9jYWxfb2ZmZXJfMjRweCIgZD0iTTkxMy40OTMgNDY1LjkybC0zODQgMzg0Yy0xNS4zNiAxNS4zNi0zNi42OTMgMjQuNzQ3LTYwLjE2IDI0Ljc0N2gtMjk4LjY2N2MtNDYuOTMzIDAtODUuMzMzLTM4LjQtODUuMzMzLTg1LjMzM3YtMjk4LjY2N2MwLTIzLjQ2NyA5LjM4Ny00NC44IDI1LjE3My02MC41ODdsMzg0LTM4NGMxNS4zNi0xNS4zNiAzNi42OTMtMjQuNzQ3IDYwLjE2LTI0Ljc0N3M0NC44IDkuMzg3IDYwLjE2IDI1LjE3M2wyOTguNjY3IDI5OC42NjdjMTUuNzg3IDE1LjM2IDI1LjE3MyAzNi42OTMgMjUuMTczIDYwLjE2cy05LjgxMyA0NS4yMjctMjUuMTczIDYwLjU4N3pNMjM0LjY2NyA2NjEuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3NDsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9wYXJraW5nIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3BhcmtpbmdfMjRweCIgZD0iTTU1NC42NjcgODMyaC0yOTguNjY3di03NjhoMTcwLjY2N3YyNTZoMTI4YzE0MS4yMjcgMCAyNTYgMTE0Ljc3MyAyNTYgMjU2cy0xMTQuNzczIDI1Ni0yNTYgMjU2ek01NjMuMiA0OTAuNjY3aC0xMzYuNTMzdjE3MC42NjdoMTM2LjUzM2M0Ni45MzMgMCA4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzcy0zOC40LTg1LjMzMy04NS4zMzMtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzU7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfcGhhcm1hY3kiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGhhcm1hY3lfMjRweCIgZD0iTTg5NiA3NDYuNjY3aC0xMTIuNjRsNDguNjQgMTMzLjk3My0xMDAuMjY3IDM2LjY5My02Mi4yOTMtMTcwLjY2N2gtNTQxLjQ0di04NS4zMzNsODUuMzMzLTI1Ni04NS4zMzMtMjU2di04NS4zMzNoNzY4djg1LjMzM2wtODUuMzMzIDI1NiA4NS4zMzMgMjU2djg1LjMzM3pNNjgyLjY2NyAzNjIuNjY3aC0xMjh2LTEyOGgtODUuMzMzdjEyOGgtMTI4djg1LjMzM2gxMjh2MTI4aDg1LjMzM3YtMTI4aDEyOHYtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzY7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfcGhvbmUiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGhvbmVfMjRweCIgZD0iTTI4Mi40NTMgNDk5LjYyN2M2MS40NC0xMjAuNzQ3IDE2MC40MjctMjE5LjMwNyAyODEuMTczLTI4MS4xNzNsOTMuODY3IDkzLjg2N2MxMS41MiAxMS41MiAyOC41ODcgMTUuMzYgNDMuNTIgMTAuMjQgNDcuNzg3LTE1Ljc4NyA5OS40MTMtMjQuMzIgMTUyLjMyLTI0LjMyIDIzLjQ2NyAwIDQyLjY2Ny0xOS4yIDQyLjY2Ny00Mi42Njd2LTE0OC45MDdjMC0yMy40NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2Ny00MDAuNjQgMC03MjUuMzMzIDMyNC42OTMtNzI1LjMzMyA3MjUuMzMzIDAgMjMuNDY3IDE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42NjdoMTQ5LjMzM2MyMy40NjcgMCA0Mi42NjctMTkuMiA0Mi42NjctNDIuNjY3IDAtNTMuMzMzIDguNTMzLTEwNC41MzMgMjQuMzItMTUyLjMyIDQuNjkzLTE0LjkzMyAxLjI4LTMxLjU3My0xMC42NjctNDMuNTJsLTkzLjg2Ny05My44Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3NzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9waXp6YSIgZGF0YS10YWdzPSJpY19sb2NhbF9waXp6YV8yNHB4IiBkPSJNNTEyIDg3NC42NjdjLTE1Mi4zMiAwLTI4OC44NTMtNjUuNzA3LTM4My41NzMtMTcwLjY2N2wzODMuNTczLTY4Mi42NjcgMzgzLjU3MyA2ODIuNjY3Yy05NC4yOTMgMTA0LjUzMy0yMzEuMjUzIDE3MC42NjctMzgzLjU3MyAxNzAuNjY3ek0yOTguNjY3IDY2MS4zMzNjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3M4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzLTM4LjQtODUuMzMzLTg1LjMzMy04NS4zMzMtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3pNNTEyIDMyMGMtNDYuOTMzIDAtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3MzOC40IDg1LjMzMyA4NS4zMzMgODUuMzMzIDg1LjMzMy0zOC40IDg1LjMzMy04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzLTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTc4OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3BsYXkiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGxheV8yNHB4IiBkPSJNODUzLjMzMyA0NDhjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3YxNzAuNjY3YzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzNoLTY4Mi42NjdjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzN2LTE3MC42NjdjNDYuOTMzIDAgODQuOTA3LTM4LjQgODQuOTA3LTg1LjMzM3MtMzcuOTczLTg1LjMzMy04NS4zMzMtODUuMzMzdi0xNzAuNjY3YzAtNDYuOTMzIDM4LjQtODUuMzMzIDg1LjMzMy04NS4zMzNoNjgyLjY2N2M0Ni45MzMgMCA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzdjE3MC42NjdjLTQ2LjkzMyAwLTg1LjMzMyAzOC40LTg1LjMzMyA4NS4zMzN6TTY2NC43NDcgMjQzLjJsLTE1Mi43NDcgOTguMTMzLTE1Mi43NDctOTguMTMzIDQ2LjA4MCAxNzUuNzg3LTE0MC4zNzMgMTE0Ljc3MyAxODAuOTA3IDEwLjY2NyA2Ni4xMzMgMTY4LjEwNyA2NS43MDctMTY4LjUzMyAxODAuOTA3LTEwLjY2Ny0xNDAuMzczLTExNC43NzMgNDYuNTA3LTE3NS4zNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTc5OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3Bvc3Rfb2ZmaWNlIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3Bvc3Rfb2ZmaWNlXzI0cHgiIGQ9Ik04NTMuMzMzIDc4OS4zMzNoLTY4Mi42NjdjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTUxMmMwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDY4Mi42NjdjNDYuOTMzIDAgODUuMzMzIDM4LjQgODUuMzMzIDg1LjMzM3Y1MTJjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM3pNODUzLjMzMyA2MTguNjY3bC0zNDEuMzMzLTIxMy4zMzMtMzQxLjMzMyAyMTMuMzMzdjg1LjMzM2wzNDEuMzMzLTIxMy4zMzMgMzQxLjMzMyAyMTMuMzMzdi04NS4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3YTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9wcmludF9zaG9wIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3ByaW50X3Nob3BfMjRweCIgZD0iTTgxMC42NjcgNjE4LjY2N2gtNTk3LjMzM2MtNzAuODI3IDAtMTI4LTU3LjE3My0xMjgtMTI4di0yNTZoMTcwLjY2N3YtMTcwLjY2N2g1MTJ2MTcwLjY2N2gxNzAuNjY3djI1NmMwIDcwLjgyNy01Ny4xNzMgMTI4LTEyOCAxMjh6TTY4Mi42NjcgMTQ5LjMzM2gtMzQxLjMzM3YyMTMuMzMzaDM0MS4zMzN2LTIxMy4zMzN6TTgxMC42NjcgNDQ4Yy0yMy40NjcgMC00Mi42NjcgMTkuMi00Mi42NjcgNDIuNjY3czE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42NjcgNDIuNjY3LTE5LjIgNDIuNjY3LTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42NjctNDIuNjY3ek03NjggODMyaC01MTJ2LTE3MC42NjdoNTEydjE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3YjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9yZXN0YXVyYW50IiBkYXRhLXRhZ3M9ImljX2xvY2FsX3Jlc3RhdXJhbnRfMjRweCIgZD0iTTM0NS42IDM5MC44MjdsMTIwLjc0NyAxMjAuNzQ3LTI5OS41MiAyOTkuMDkzYy0zMC44NDItMzAuOTI5LTQ5LjkxMy03My42MTEtNDkuOTEzLTEyMC43NDdzMTkuMDcxLTg5LjgxOCA0OS45MTctMTIwLjc1MWwtMC4wMDQgMC4wMDQgMTc4Ljc3My0xNzguMzQ3ek02MzQuODggNDY4LjA1M2M2NS4yOC0zMC4yOTMgMTU3LjAxMy04Ljk2IDIyNC44NTMgNTguODggODEuNDkzIDgxLjQ5MyA5Ny4yOCAxOTguNCAzNC41NiAyNjEuMTItNjIuMjkzIDYyLjI5My0xNzkuMiA0Ni45MzMtMjYxLjEyLTM0LjU2LTY3Ljg0LTY3Ljg0LTg5LjE3My0xNTkuNTczLTU4Ljg4LTIyNC44NTNsLTQxNi40MjctNDE2LjQyNyA2MC4xNi02MC4xNiAyOTMuOTczIDI5My4xMiAyOTMuNTQ3LTI5My41NDcgNjAuMTYgNjAuMTYtMjkzLjU0NyAyOTMuNTQ3IDYyLjcyIDYyLjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2M7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfc2VlIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3NlZV8yNHB4IiBkPSJNMzc1LjQ2NyA0NDhjMC03NS40MDUgNjEuMTI4LTEzNi41MzMgMTM2LjUzMy0xMzYuNTMzczEzNi41MzMgNjEuMTI4IDEzNi41MzMgMTM2LjUzM3YwYzAgNzUuNDA1LTYxLjEyOCAxMzYuNTMzLTEzNi41MzMgMTM2LjUzM3MtMTM2LjUzMy02MS4xMjgtMTM2LjUzMy0xMzYuNTMzdjB6TTM4NCA4NzQuNjY3bC03OC4wODAtODUuMzMzaC0xMzUuMjUzYy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi01MTJjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g2ODIuNjY3YzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzNoLTEzNS4yNTNsLTc4LjA4MCA4NS4zMzNoLTI1NnpNNTEyIDIzNC42NjdjLTExNy43NiAwLTIxMy4zMzMgOTUuNTczLTIxMy4zMzMgMjEzLjMzM3M5NS41NzMgMjEzLjMzMyAyMTMuMzMzIDIxMy4zMzMgMjEzLjMzMy05NS41NzMgMjEzLjMzMy0yMTMuMzMzLTk1LjU3My0yMTMuMzMzLTIxMy4zMzMtMjEzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTdkOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3NoaXBwaW5nIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3NoaXBwaW5nXzI0cHgiIGQ9Ik04NTMuMzMzIDYxOC42NjdoLTEyOHYxNzAuNjY3aC01OTcuMzMzYy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi00NjkuMzMzaDg1LjMzM2MwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDI1NmMwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDg1LjMzM3YyMTMuMzMzbC0xMjggMTcwLjY2N3pNMjU2IDE3MC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNODMyIDU1NC42NjdsODMuNjI3LTEwNi42NjdoLTE5MC4yOTN2MTA2LjY2N2gxMDYuNjY3ek03NjggMTcwLjY2N2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2U7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfdGF4aSIgZGF0YS10YWdzPSJpY19sb2NhbF90YXhpXzI0cHgiIGQ9Ik04MDcuMjUzIDcwMy41NzNjLTguNTMzIDI1LjE3My0zMi40MjcgNDMuMDkzLTYwLjU4NyA0My4wOTNoLTEwNi42Njd2ODUuMzMzaC0yNTZ2LTg1LjMzM2gtMTA2LjY2N2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAyNzcuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc0Ni42NjcgMjc3LjMzM2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0ek0yMTMuMzMzIDQ5MC42NjdsNjQgMTkyaDQ2OS4zMzNsNjQtMTkyaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2Y7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYXRpb25faGlzdG9yeSIgZGF0YS10YWdzPSJpY19sb2NhdGlvbl9oaXN0b3J5XzI0cHgiIGQ9Ik04MTAuNjY3IDg3NC42NjdoLTU5Ny4zMzNjLTQ3LjEyOCAwLTg1LjMzMy0zOC4yMDUtODUuMzMzLTg1LjMzM3YtNTk3LjMzM2MwLTQ3LjEyOCAzOC4yMDUtODUuMzMzIDg1LjMzMy04NS4zMzN2MGgxNzAuNjY3bDEyOC0xMjggMTI4IDEyOGgxNzAuNjY3YzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek01MTIgNzMzLjg2N2M2My41NzMgMCAxMTUuMi01MS42MjcgMTE1LjItMTE1LjJzLTUxLjYyNy0xMTUuMi0xMTUuMi0xMTUuMmMtNjMuNTczIDAtMTE1LjIgNTEuNjI3LTExNS4yIDExNS4yczUxLjYyNyAxMTUuMiAxMTUuMiAxMTUuMnpNNzY4IDI3Ny4zMzNoLTUxMnYzOC40YzAgODUuMzMzIDE3MC42NjcgMTMyLjI2NyAyNTYgMTMyLjI2N3MyNTYtNDYuOTMzIDI1Ni0xMzIuMjY3di0zOC40eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbXlfbG9jYXRpb24iIGRhdGEtdGFncz0iaWNfbXlfbG9jYXRpb25fMjRweCIgZD0iTTUxMiA2MTguNjY3Yy05NC4yOTMgMC0xNzAuNjY3LTc2LjM3My0xNzAuNjY3LTE3MC42NjdzNzYuMzczLTE3MC42NjcgMTcwLjY2Ny0xNzAuNjY3IDE3MC42NjcgNzYuMzczIDE3MC42NjcgMTcwLjY2Ny03Ni4zNzMgMTcwLjY2Ny0xNzAuNjY3IDE3MC42Njd6TTg5My40NCA0OTAuNjY3Yy0yMC40ODcgMTc4LjI1LTE2MC41MjQgMzE4LjI4Ny0zMzYuOTk4IDMzOC42MDdsLTEuNzc2IDAuMTY2djg3Ljg5M2gtODUuMzMzdi04Ny44OTNjLTE3OC4yNS0yMC40ODctMzE4LjI4Ny0xNjAuNTI0LTMzOC42MDctMzM2Ljk5OGwtMC4xNjYtMS43NzZoLTg3Ljg5M3YtODUuMzMzaDg3Ljg5M2MyMC40ODctMTc4LjI1IDE2MC41MjQtMzE4LjI4NyAzMzYuOTk4LTMzOC42MDdsMS43NzYtMC4xNjZ2LTg3Ljg5M2g4NS4zMzN2ODcuODkzYzE3OC4yNSAyMC40ODcgMzE4LjI4NyAxNjAuNTI0IDMzOC42MDcgMzM2Ljk5OGwwLjE2NiAxLjc3Nmg4Ny44OTN2ODUuMzMzaC04Ny44OTN6TTUxMiAxNDkuMzMzYy0xNjUuMTIgMC0yOTguNjY3IDEzMy41NDctMjk4LjY2NyAyOTguNjY3czEzMy41NDcgMjk4LjY2NyAyOTguNjY3IDI5OC42NjcgMjk4LjY2Ny0xMzMuNTQ3IDI5OC42NjctMjk4LjY2Ny0xMzMuNTQ3LTI5OC42NjctMjk4LjY2Ny0yOTguNjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODE7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbmF2aWdhdGlvbiIgZGF0YS10YWdzPSJpY19uYXZpZ2F0aW9uXzI0cHgiIGQ9Ik01MTIgODc0LjY2N2wtMzIwLTc4MC4zNzMgMzAuMjkzLTMwLjI5MyAyODkuNzA3IDEyOCAyODkuNzA3LTEyOCAzMC4yOTMgMzAuMjkzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODI7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcGluX2Ryb3AiIGRhdGEtdGFncz0iaWNfcGluX2Ryb3BfMjRweCIgZD0iTTc2OCA2MTguNjY3YzAgMTQxLjIyNy0xMTQuNzczIDI1Ni0yNTYgMjU2cy0yNTYtMTE0Ljc3My0yNTYtMjU2YzAtMTkyIDI1Ni00NjkuMzMzIDI1Ni00NjkuMzMzczI1NiAyNzcuMzMzIDI1NiA0NjkuMzMzek00MjYuNjY3IDYxOC42NjdjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3M4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzYzAtNDcuMTI4LTM4LjIwNS04NS4zMzMtODUuMzMzLTg1LjMzM3MtODUuMzMzIDM4LjIwNS04NS4zMzMgODUuMzMzdjB6TTIxMy4zMzMgMTA2LjY2N3YtODUuMzMzaDU5Ny4zMzN2ODUuMzMzaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcGxhY2UiIGRhdGEtdGFncz0iaWNfcGxhY2VfMjRweCIgZD0iTTUxMiA4NzQuNjY3Yy0xNjUuMTIgMC0yOTguNjY3LTEzMy41NDctMjk4LjY2Ny0yOTguNjY3IDAtMjI0IDI5OC42NjctNTU0LjY2NyAyOTguNjY3LTU1NC42NjdzMjk4LjY2NyAzMzAuNjY3IDI5OC42NjcgNTU0LjY2N2MwIDE2NS4xMi0xMzMuNTQ3IDI5OC42NjctMjk4LjY2NyAyOTguNjY3ek01MTIgNDY5LjMzM2MtNTguOTEgMC0xMDYuNjY3IDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjdzNDcuNzU2IDEwNi42NjcgMTA2LjY2NyAxMDYuNjY3djBjNTguOTEgMCAxMDYuNjY3LTQ3Ljc1NiAxMDYuNjY3LTEwNi42NjdzLTQ3Ljc1Ni0xMDYuNjY3LTEwNi42NjctMTA2LjY2N3YweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODQ7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcmF0ZV9yZXZpZXciIGRhdGEtdGFncz0iaWNfcmF0ZV9yZXZpZXdfMjRweCIgZD0iTTg1My4zMzMgODc0LjY2N2gtNjgyLjY2N2MtNDYuOTMzIDAtODQuOTA3LTM4LjQtODQuOTA3LTg1LjMzM2wtMC40MjctNzY4IDE3MC42NjcgMTcwLjY2N2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTI1NiAzNjIuNjY3djEwNS4zODdsMjkzLjU0NyAyOTMuNTQ3YzguNTMzIDguNTMzIDIxLjc2IDguNTMzIDMwLjI5MyAwbDc1LjUyLTc1LjUyYzguNTMzLTguNTMzIDguNTMzLTIxLjc2IDAtMzAuMjkzbC0yOTMuOTczLTI5My4xMmgtMTA1LjM4N3pNNzY4IDM2Mi42NjdoLTMyMGw4NS4zMzMgODUuMzMzaDIzNC42Njd2LTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTg1OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX3Jlc3RhdXJhbnRfbWVudSIgZGF0YS10YWdzPSJpY19yZXN0YXVyYW50X21lbnVfMjRweCIgZD0iTTM0NS42IDM5MC44MjdsMTIwLjc0NyAxMjAuNzQ3LTI5OS41MiAyOTkuMDkzYy0zMC44NDItMzAuOTI5LTQ5LjkxMy03My42MTEtNDkuOTEzLTEyMC43NDdzMTkuMDcxLTg5LjgxOCA0OS45MTctMTIwLjc1MWwtMC4wMDQgMC4wMDQgMTc4Ljc3My0xNzguMzQ3ek02MzQuODggNDY4LjA1M2M2NS4yOC0zMC4yOTMgMTU3LjAxMy04Ljk2IDIyNC44NTMgNTguODggODEuNDkzIDgxLjQ5MyA5Ny4yOCAxOTguNCAzNC41NiAyNjEuMTItNjIuMjkzIDYyLjI5My0xNzkuMiA0Ni45MzMtMjYxLjEyLTM0LjU2LTY3Ljg0LTY3Ljg0LTg5LjE3My0xNTkuNTczLTU4Ljg4LTIyNC44NTNsLTQxNi40MjctNDE2LjQyNyA2MC4xNi02MC4xNiAyOTMuOTczIDI5My4xMiAyOTMuNTQ3LTI5My41NDcgNjAuMTYgNjAuMTYtMjkzLjU0NyAyOTMuNTQ3IDYyLjcyIDYyLjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODY7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fc2F0ZWxsaXRlIiBkYXRhLXRhZ3M9ImljX3NhdGVsbGl0ZV8yNHB4IiBkPSJNODEwLjY2NyA4MzJoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg1LjMzMy0zOC40LTg1LjMzMy04NS4zMzN2LTU5Ny4zMzNjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek0yMTMuMzMzIDc0Ny4wOTNoMTI4YzAtNzAuODI3LTU3LjE3My0xMjguNDI3LTEyOC0xMjguNDI3djEyOC40Mjd6TTIxMy4zMzMgNDQ4djg1LjMzM2MxMTcuNzYgMCAyMTMuMzMzIDk2IDIxMy4zMzMgMjEzLjc2aDg1LjMzM2MwLTE2NS4xMi0xMzMuNTQ3LTI5OS4wOTMtMjk4LjY2Ny0yOTkuMDkzek0yMTMuMzMzIDE5MmwxNDkuMzMzIDE5MiAxMDYuNjY3LTEyOC40MjcgMTQ5LjMzMyAxOTIuNDI3IDE5Mi0yNTZoLTU5Ny4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk4NzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9zdG9yZV9tYWxsX2RpcmVjdG9yeSIgZGF0YS10YWdzPSJpY19zdG9yZV9tYWxsX2RpcmVjdG9yeV8yNHB4IiBkPSJNODUzLjMzMyA3ODkuMzMzaC02ODIuNjY3di04NS4zMzNoNjgyLjY2N3Y4NS4zMzN6TTg5NiAzNjIuNjY3djg1LjMzM2wtNDIuNjY3IDIxMy4zMzNoLTY4Mi42NjdsLTQyLjY2Ny0yMTMuMzMzdi04NS4zMzNoNDIuNjY3di0yNTZoNDI2LjY2N3YyNTZoMTcwLjY2N3YtMjU2aDg1LjMzM3YyNTZoNDIuNjY3ek01MTIgMTkyaC0yNTZ2MTcwLjY2N2gyNTZ2LTE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk4ODsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl90ZXJyYWluIiBkYXRhLXRhZ3M9ImljX3RlcnJhaW5fMjRweCIgZD0iTTU5Ny4zMzMgNzA0bC0xNjAtMjEzLjMzMyAxMjEuNi0xNjIuMTMzLTY4LjI2Ny01MS4yYy03Mi4xMDcgOTYtMTkyIDI1Ni0xOTIgMjU2bC0yNTYtMzQxLjMzM2g5MzguNjY3bC0zODQgNTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODk7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fdHJhZmZpYyIgZGF0YS10YWdzPSJpY190cmFmZmljXzI0cHgiIGQ9Ik04NTMuMzMzIDUzMy4zMzNoLTEyOHY0OC42NGM3My4zODcgMTkuMiAxMjggODUuMzMzIDEyOCAxNjQuNjkzaC0xMjh2NDIuNjY3YzAgMjMuNDY3LTE5LjIgNDIuNjY3LTQyLjY2NyA0Mi42NjdoLTM0MS4zMzNjLTIzLjQ2NyAwLTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42Njd2LTQyLjY2N2gtMTI4YzAtNzkuMzYgNTQuNjEzLTE0NS40OTMgMTI4LTE2NC42OTN2LTQ4LjY0aC0xMjhjMC03OS4zNiA1NC42MTMtMTQ1LjQ5MyAxMjgtMTY0LjY5M3YtNDguNjRoLTEyOGMwLTc5LjM2IDU0LjYxMy0xNDUuNDkzIDEyOC0xNjQuNjkzdi00OC42NGMwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDM0MS4zMzNjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0OC42NGM3My4zODcgMTkuMiAxMjggODUuMzMzIDEyOCAxNjQuNjkzaC0xMjh2NDguNjRjNzMuMzg3IDE5LjIgMTI4IDg1LjMzMyAxMjggMTY0LjY5M3pNNTEyIDE0OS4zMzNjLTAuNTc0LTAuMDE0LTEuMjUxLTAuMDIyLTEuOTI5LTAuMDIyLTQ3LjEyOCAwLTg1LjMzMyAzOC4yMDUtODUuMzMzIDg1LjMzM3MzOC4yMDUgODUuMzMzIDg1LjMzMyA4NS4zMzNjMC42NjMgMCAxLjMyNS0wLjAwOCAxLjk4NS0wLjAyM2wtMC4wOTggMC4wMDJjNDYuMzEtMS4wNTYgODMuNDQ3LTM4Ljg0OCA4My40NDctODUuMzEyIDAtNDYuNDUtMzcuMTEzLTg0LjIzMi04My4zMDQtODUuMzFsLTAuMS0wLjAwMnpNNTEyIDM2Mi42NjdjLTAuNTc0LTAuMDE0LTEuMjUxLTAuMDIyLTEuOTI5LTAuMDIyLTQ3LjEyOCAwLTg1LjMzMyAzOC4yMDUtODUuMzMzIDg1LjMzM3MzOC4yMDUgODUuMzMzIDg1LjMzMyA4NS4zMzNjMC42NjMgMCAxLjMyNS0wLjAwOCAxLjk4NS0wLjAyM2wtMC4wOTggMC4wMDJjNDYuMzEtMS4wNTYgODMuNDQ3LTM4Ljg0OCA4My40NDctODUuMzEyIDAtNDYuNDUtMzcuMTEzLTg0LjIzMi04My4zMDQtODUuMzFsLTAuMS0wLjAwMnpNNTEyIDU3NmMtNDcuMTI4IDAtODUuMzMzIDM4LjIwNS04NS4zMzMgODUuMzMzdjBjMCA0Ny4zNiAzNy45NzMgODUuMzMzIDg1LjMzMyA4NS4zMzMgNDcuMTI4IDAgODUuMzMzLTM4LjIwNSA4NS4zMzMtODUuMzMzcy0zOC4yMDUtODUuMzMzLTg1LjMzMy04NS4zMzN2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOThhOyIgZ2x5cGgtbmFtZT0ib3RoZXJzIiBkYXRhLXRhZ3M9IuabtOWkmiIgZD0iTTE3NiA1MzAuNzA0Yy0xMy43MjIgOC4yOC0zMC4yNzYgMTMuMjExLTQ3Ljk3NiAxMy4yOTZoLTAuMDI0Yy01My4wMTkgMC05Ni00Mi45ODEtOTYtOTZzNDIuOTgxLTk2IDk2LTk2djBjMTcuNTY4IDAgMzMuODQgNS4wODggNDggMTMuMzQ0IDI4LjU2IDE2LjYwOCA0OCA0Ny4yMzIgNDggODIuNjU2IDAgMzUuNDcyLTE5LjQ0IDY2LjA5Ni00OCA4Mi43MDR6TTU2MCA1MzAuNzA0Yy0xMy43MjIgOC4yOC0zMC4yNzYgMTMuMjExLTQ3Ljk3NiAxMy4yOTZoLTAuMDI0Yy0xNy41NjggMC0zMy44NC01LjA0MC00OC0xMy4yOTYtMjguNTYtMTYuNjA4LTQ4LTQ3LjIzMi00OC04Mi43MDQgMC0zNS40MjQgMTkuNDQtNjYuMDQ4IDQ4LTgyLjY1NiAxNC4xNi04LjI1NiAzMC40MzItMTMuMzQ0IDQ4LTEzLjM0NHMzMy44NCA1LjA4OCA0OCAxMy4zNDRjMjguNTYgMTYuNjA4IDQ4IDQ3LjIzMiA0OCA4Mi42NTYgMCAzNS40NzItMTkuNDQgNjYuMDk2LTQ4IDgyLjcwNHpNODk2IDU0NGMtMTcuNTY4IDAtMzMuODQtNS4wODgtNDgtMTMuMjk2LTI4LjU2LTE2LjY1Ni00OC00Ny4yOC00OC04Mi43MDRzMTkuNDQtNjYuMDQ4IDQ4LTgyLjcwNGMxNC4xNi04LjIwOCAzMC40MzItMTMuMjk2IDQ4LTEzLjI5NiA1My4wMTkgMCA5NiA0Mi45ODEgOTYgOTZzLTQyLjk4MSA5Ni05NiA5NnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OGI7IiBnbHlwaC1uYW1lPSJzZXJ2ZXIiIGRhdGEtdGFncz0i5pyN5Yqh5ZmoIiBob3Jpei1hZHYteD0iMTMwMyIgZD0iTTE5Ny43OTIgODY0aDkwNy42MzdjNDEuNzc0IDAgNzUuNjM3LTMzLjg2MyA3NS42MzctNzUuNjM3di03NS42MzdjMC00MS43NzQtMzMuODYzLTc1LjYzNy03NS42MzctNzUuNjM3aC05MDcuNjM3Yy00MS43NzQgMC03NS42MzcgMzMuODYzLTc1LjYzNyA3NS42Mzd2NzUuNjM3YzAgNDEuNzc0IDMzLjg2MyA3NS42MzcgNzUuNjM3IDc1LjYzN3Ywek05NTQuMTU3IDY3NC45MDljNDEuNzc0IDAgNzUuNjM3IDMzLjg2MyA3NS42MzcgNzUuNjM3cy0zMy44NjMgNzUuNjM3LTc1LjYzNyA3NS42MzdjLTQxLjc3NCAwLTc1LjYzNy0zMy44NjMtNzUuNjM3LTc1LjYzN3MzMy44NjMtNzUuNjM3IDc1LjYzNy03NS42Mzd6TTE5Ny43OTIgNTYxLjQ1NWg5MDcuNjM3YzQxLjc3NCAwIDc1LjYzNy0zMy44NjMgNzUuNjM3LTc1LjYzN3YtNzUuNjM3YzAtNDEuNzc0LTMzLjg2My03NS42MzctNzUuNjM3LTc1LjYzN2gtOTA3LjYzN2MtNDEuNzc0IDAtNzUuNjM3IDMzLjg2My03NS42MzcgNzUuNjM3djc1LjYzN2MwIDQxLjc3NCAzMy44NjMgNzUuNjM3IDc1LjYzNyA3NS42Mzd2MHpNOTU0LjE1NyAzNzIuMzYzYzQxLjc3NCAwIDc1LjYzNyAzMy44NjMgNzUuNjM3IDc1LjYzN3MtMzMuODYzIDc1LjYzNy03NS42MzcgNzUuNjM3Yy00MS43NzQgMC03NS42MzctMzMuODYzLTc1LjYzNy03NS42MzdzMzMuODYzLTc1LjYzNyA3NS42MzctNzUuNjM3ek0xOTcuNzkyIDI1OC45MDhoOTA3LjYzN2M0MS43NzQgMCA3NS42MzctMzMuODYzIDc1LjYzNy03NS42Mzd2LTc1LjYzN2MwLTQxLjc3NC0zMy44NjMtNzUuNjM3LTc1LjYzNy03NS42MzdoLTkwNy42MzdjLTQxLjc3NCAwLTc1LjYzNyAzMy44NjMtNzUuNjM3IDc1LjYzN3Y3NS42MzdjMCA0MS43NzQgMzMuODYzIDc1LjYzNyA3NS42MzcgNzUuNjM3djB6TTk1NC4xNTcgNjkuODE4YzQxLjc3NCAwIDc1LjYzNyAzMy44NjMgNzUuNjM3IDc1LjYzN3MtMzMuODYzIDc1LjYzNy03NS42MzcgNzUuNjM3Yy00MS43NzQgMC03NS42MzctMzMuODYzLTc1LjYzNy03NS42MzdzMzMuODYzLTc1LjYzNyA3NS42MzctNzUuNjM3eiIgLz4KPC9mb250PjwvZGVmcz48L3N2Zz4=#supermapol-icons) format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="supermapol-icons-"], [class*=" supermapol-icons-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'supermapol-icons', 'sans-serif' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.supermapol-icons-material_design_beenhere:before { + content: "\e958"; +} +.supermapol-icons-material_design_directions:before { + content: "\e959"; +} +.supermapol-icons-material_design_directions_bike:before { + content: "\e95a"; +} +.supermapol-icons-material_design_directions_bus:before { + content: "\e95b"; +} +.supermapol-icons-material_design_directions_car:before { + content: "\e95c"; +} +.supermapol-icons-material_design_directions_ferry:before { + content: "\e95d"; +} +.supermapol-icons-material_design_directions_train:before { + content: "\e95e"; +} +.supermapol-icons-material_design_directions_transit:before { + content: "\e95f"; +} +.supermapol-icons-material_design_directions_walk:before { + content: "\e960"; +} +.supermapol-icons-material_design_flight:before { + content: "\e961"; +} +.supermapol-icons-material_design_hotel:before { + content: "\e962"; +} +.supermapol-icons-material_design_local_airport:before { + content: "\e963"; +} +.supermapol-icons-material_design_local_atm:before { + content: "\e964"; +} +.supermapol-icons-material_design_local_attraction:before { + content: "\e965"; +} +.supermapol-icons-material_design_local_bar:before { + content: "\e966"; +} +.supermapol-icons-material_design_local_cafe:before { + content: "\e967"; +} +.supermapol-icons-material_design_local_car_wash:before { + content: "\e968"; +} +.supermapol-icons-material_design_local_convenience_store:before { + content: "\e969"; +} +.supermapol-icons-material_design_local_drink:before { + content: "\e96a"; +} +.supermapol-icons-material_design_local_florist:before { + content: "\e96b"; +} +.supermapol-icons-material_design_local_gas_station:before { + content: "\e96c"; +} +.supermapol-icons-material_design_local_grocery_store:before { + content: "\e96d"; +} +.supermapol-icons-material_design_local_hospital:before { + content: "\e96e"; +} +.supermapol-icons-material_design_local_laundry_service:before { + content: "\e96f"; +} +.supermapol-icons-material_design_local_library:before { + content: "\e970"; +} +.supermapol-icons-material_design_local_mall:before { + content: "\e971"; +} +.supermapol-icons-material_design_local_movies:before { + content: "\e972"; +} +.supermapol-icons-material_design_local_offer:before { + content: "\e973"; +} +.supermapol-icons-material_design_local_parking:before { + content: "\e974"; +} +.supermapol-icons-material_design_local_pharmacy:before { + content: "\e975"; +} +.supermapol-icons-material_design_local_phone:before { + content: "\e976"; +} +.supermapol-icons-material_design_local_pizza:before { + content: "\e977"; +} +.supermapol-icons-material_design_local_play:before { + content: "\e978"; +} +.supermapol-icons-material_design_local_post_office:before { + content: "\e979"; +} +.supermapol-icons-material_design_local_print_shop:before { + content: "\e97a"; +} +.supermapol-icons-material_design_local_restaurant:before { + content: "\e97b"; +} +.supermapol-icons-material_design_local_see:before { + content: "\e97c"; +} +.supermapol-icons-material_design_local_shipping:before { + content: "\e97d"; +} +.supermapol-icons-material_design_local_taxi:before { + content: "\e97e"; +} +.supermapol-icons-material_design_location_history:before { + content: "\e97f"; +} +.supermapol-icons-material_design_my_location:before { + content: "\e980"; +} +.supermapol-icons-material_design_navigation:before { + content: "\e981"; +} +.supermapol-icons-material_design_pin_drop:before { + content: "\e982"; +} +.supermapol-icons-material_design_place:before { + content: "\e983"; +} +.supermapol-icons-material_design_rate_review:before { + content: "\e984"; +} +.supermapol-icons-material_design_restaurant_menu:before { + content: "\e985"; +} +.supermapol-icons-material_design_satellite:before { + content: "\e986"; +} +.supermapol-icons-material_design_store_mall_directory:before { + content: "\e987"; +} +.supermapol-icons-material_design_terrain:before { + content: "\e988"; +} +.supermapol-icons-material_design_traffic:before { + content: "\e989"; +} +.supermapol-icons-server:before { + content: "\e98b"; +} +.supermapol-icons-others:before { + content: "\e98a"; +} +.supermapol-icons-maps:before { + content: "\e954"; +} +.supermapol-icons-new:before { + content: "\e955"; +} +.supermapol-icons-feedback:before { + content: "\e956"; +} +.supermapol-icons-homepage:before { + content: "\e957"; +} +.supermapol-icons-ruler:before { + content: "\e950"; +} +.supermapol-icons-menu:before { + content: "\e952"; +} +.supermapol-icons-rename:before { + content: "\e953"; +} +.supermapol-icons-field:before { + content: "\e951"; +} +.supermapol-icons-export:before { + content: "\e94d"; +} +.supermapol-icons-zone:before { + content: "\e94c"; +} +.supermapol-icons-copy:before { + content: "\e94b"; +} +.supermapol-icons-qqblog:before { + content: "\e94e"; +} +.supermapol-icons-sina:before { + content: "\e94f"; +} +.supermapol-icons-play:before { + content: "\e949"; +} +.supermapol-icons-pause:before { + content: "\e94a"; +} +.supermapol-icons-search-thin:before { + content: "\e948"; +} +.supermapol-icons-layerStyle:before { + content: "\e947"; +} +.supermapol-icons-cad:before { + content: "\e944"; +} +.supermapol-icons-grid:before { + content: "\e945"; +} +.supermapol-icons-image:before { + content: "\e946"; +} +.supermapol-icons-eye-closed:before { + content: "\e915"; +} +.supermapol-icons-dropdown:before { + content: "\e943"; +} +.supermapol-icons-solid-triangle:before { + content: "\e941"; +} +.supermapol-icons-eye:before { + content: "\e942"; +} +.supermapol-icons-opacity:before { + content: "\e940"; +} +.supermapol-icons-table:before { + content: "\e93f"; +} +.supermapol-icons-upload:before { + content: "\e93d"; +} +.supermapol-icons-solid-point:before { + content: "\e93a"; +} +.supermapol-icons-flag:before { + content: "\e93b"; +} +.supermapol-icons-target:before { + content: "\e93c"; +} +.supermapol-icons-legend:before { + content: "\e93e"; +} +.supermapol-icons-select:before { + content: "\e939"; +} +.supermapol-icons-logo:before { + content: "\e938"; +} +.supermapol-icons-tag:before { + content: "\e934"; +} +.supermapol-icons-new_home:before { + content: "\e935"; +} +.supermapol-icons-update:before { + content: "\e936"; +} +.supermapol-icons-info:before { + content: "\e937"; +} +.supermapol-icons-unfold:before { + content: "\e930"; +} +.supermapol-icons-fold:before { + content: "\e931"; +} +.supermapol-icons-right:before { + content: "\e932"; +} +.supermapol-icons-left:before { + content: "\e933"; +} +.supermapol-icons-edit:before { + content: "\e92c"; +} +.supermapol-icons-home:before { + content: "\e92d"; +} +.supermapol-icons-share:before { + content: "\e92e"; +} +.supermapol-icons-back:before { + content: "\e92f"; +} +.supermapol-icons-rest-api:before { + content: "\e929"; +} +.supermapol-icons-javascript-api:before { + content: "\e92a"; +} +.supermapol-icons-desktop-dev:before { + content: "\e92b"; +} +.supermapol-icons-open:before { + content: "\e91f"; +} +.supermapol-icons-overlay:before { + content: "\e920"; +} +.supermapol-icons-point-layer:before { + content: "\e921"; +} +.supermapol-icons-hamburg:before { + content: "\e922"; +} +.supermapol-icons-triangle:before { + content: "\e923"; +} +.supermapol-icons-polygon-layer:before { + content: "\e924"; +} +.supermapol-icons-close:before { + content: "\e925"; +} +.supermapol-icons-add:before { + content: "\e926"; +} +.supermapol-icons-more:before { + content: "\e927"; +} +.supermapol-icons-line-layer:before { + content: "\e928"; +} +.supermapol-icons-polygon:before { + content: "\e91e"; +} +.supermapol-icons-triangle-old:before { + content: "\e910"; + color: #474747; +} +.supermapol-icons-save:before { + content: "\e900"; +} +.supermapol-icons-baselayer:before { + content: "\e901"; +} +.supermapol-icons-marker:before { + content: "\e902"; +} +.supermapol-icons-uncheck:before { + content: "\e903"; +} +.supermapol-icons-checked:before { + content: "\e904"; +} +.supermapol-icons-zoom-in:before { + content: "\e905"; +} +.supermapol-icons-clear:before { + content: "\e906"; +} +.supermapol-icons-setting:before { + content: "\e907"; +} +.supermapol-icons-zoom-to:before { + content: "\e908"; +} +.supermapol-icons-default-layer:before { + content: "\e909"; +} +.supermapol-icons-group:before { + content: "\e90a"; +} +.supermapol-icons-delete:before { + content: "\e90b"; +} +.supermapol-icons-up:before { + content: "\e90c"; +} +.supermapol-icons-warning:before { + content: "\e90d"; +} +.supermapol-icons-retract:before { + content: "\e90e"; +} +.supermapol-icons-search:before { + content: "\e90f"; +} +.supermapol-icons-zoom-out:before { + content: "\e911"; +} +.supermapol-icons-layers:before { + content: "\e912"; +} +.supermapol-icons-add-old:before { + content: "\e913"; +} +.supermapol-icons-brush:before { + content: "\e914"; +} +.supermapol-icons-down:before { + content: "\e916"; +} +.supermapol-icons-line:before { + content: "\e917"; +} +.supermapol-icons-pen:before { + content: "\e918"; +} +.supermapol-icons-user:before { + content: "\e919"; +} +.supermapol-icons-down-end:before { + content: "\e91a"; +} +.supermapol-icons-up-end:before { + content: "\e91b"; +} +.supermapol-icons-text:before { + content: "\e91c"; +} +.supermapol-icons-customize:before { + content: "\e91d"; +} +@font-face { + font-family: 'supermapol-icons'; + src: url(data:application/vnd.ms-fontobject;base64,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); + src: url(data:application/vnd.ms-fontobject;base64,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#iefix) format('embedded-opentype'), + url(data:font/ttf;base64,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HgIO/riVDQgHCBwNvwkJAgMBAwIBAWgLHgoLCwEyKCiLXl1qal1eiygoKCiLXl1qal1eiygo/MkeMBASERERETAeHkYoKFYtLVYoJ0ceHjAQEhEREREvHx5GKChWLS1WKCdHHgADAAD/QAQAA0AAJwBEAHUAAAEmIg8BJyYiBwYUHwEHBhQXHgEzMjY/ARceATMyNjc2NC8BNzY0JzEDIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIwEOAQcOASMiJicuAScuAScuATU0Njc+ATc+ATc+ATMyFhceARceARceARUUBgcOAQcCzQoeC5qaCx4KCwuamgsLBQ0HBw0GmpoGDQcHDQULC5qaCwvNal1eiygoKCiLXl1qal1eiygoKCiLXl1qATceRigoVi0tVignRx4eMBASERERES8fHkYoKFYtLVYoJ0ceHjAQEhEREREwHgIOCgqbmwoKCx4Km5sKHgsFBQUFm5sFBQUFCx0Lm5sKHgsBMigoi15dampdXosoKCgoi15dampdXosoKPzJHjAQEhEREREwHh5GKChWLS1WKCdHHh4wEBIRERERLx8eRigoVi0tVignRx4AAAAABAAA/0AEAANAADAATgBdAGoAAAEyFhceARceARceARUUBgcOAQcOAQcOASMiJicuAScuAScuATU0Njc+ATc+ATc+ATM1IgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIzERIiY1ETQ2MzIWFREUBiMHNDYzMhYVFAYjIiY1AgAtVignRx4eMBASERERES8fHkYoKFYtLVYoJ0ceHjAQEhEREREvHx5GKChWLWpdXosoKCgoi15dampdXosoKCgoi15dahEXFxERFxcRLRoTExoaExMaAvgREREvHx5GKChWLS1WKCdHHh4wEBIRERERMB4eRigoVi0tVignRx4eMBASEUgoKIteXWpqXV6LKCgoKIteXWpqXV6LKCj9gBcRAXERFxcR/o8RF20TGhoTExoaEwABAAAABMzN0lEM/18PPPUACwQAAAAAANelXzEAAAAA16VfMQAA/0AE2wNAAAAACAACAAAAAAAAAAEAAAMz/zQAAATbAAAAAATbAAEAAAAAAAAAAAAAAAAAAAAWBAAAAAAAAAAAAAAAAAAAAAQAAAAEAABVBAAAAAQAAAAEPwBeBAAA4QQAAOEEAAEcBAABVQQAAR0EAAFVBAAAAAQAAEoE2wAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AVACYAPABVgHqAgQCHgJWAogC0AMCA4wD+AVmBbwGXgcOB6gAAAABAAAAFgEWAAgAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADQAAAAEAAAAAAAIABwDkAAEAAAAAAAMADQCWAAEAAAAAAAQADQD5AAEAAAAAAAUACwB1AAEAAAAAAAYADQC9AAEAAAAAAAoAGgAnAAMAAQQJAAEAGgANAAMAAQQJAAIADgDrAAMAAQQJAAMAGgCjAAMAAQQJAAQAGgEGAAMAAQQJAAUAFgCAAAMAAQQJAAYAGgDKAAMAAQQJAAoANABBd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuVmVyc2lvbiA0LjgAVgBlAHIAcwBpAG8AbgAgADQALgA4d2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'), + url(data:font/woff;base64,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) format('woff'), + url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+Cjxqc29uPgo8IVtDREFUQVsKewoJImZvbnRGYW1pbHkiOiAiY29tcG9uZW50cy1pY29ucyIsCgkiZGVzY3JpcHRpb24iOiAiRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4iLAoJIm1ham9yVmVyc2lvbiI6IDQsCgkibWlub3JWZXJzaW9uIjogOCwKCSJ2ZXJzaW9uIjogIlZlcnNpb24gNC44IiwKCSJmb250SWQiOiAiY29tcG9uZW50cy1pY29ucyIsCgkicHNOYW1lIjogImNvbXBvbmVudHMtaWNvbnMiLAoJInN1YkZhbWlseSI6ICJSZWd1bGFyIiwKCSJmdWxsTmFtZSI6ICJjb21wb25lbnRzLWljb25zIgp9Cl1dPgo8L2pzb24+CjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0iY29tcG9uZW50cy1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiPgo8Zm9udC1mYWNlIHVuaXRzLXBlci1lbT0iMTAyNCIgYXNjZW50PSI4MTkuMiIgZGVzY2VudD0iLTIwNC44IiAvPgo8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMTAyNCIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwOyIgaG9yaXotYWR2LXg9IjAiIGQ9IiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmE7IiBnbHlwaC1uYW1lPSJsaW5lLWxheWVyIiBkYXRhLXRhZ3M9ImxpbmUtbGF5ZXIiIGQ9Ik03NjcuMzA3IDUxMy44NDlsLTQ0OS4xNzYtNDQ5LjE3NmMxNC42MTYtMjQuNjM4IDIzLjI1NC01NC4zMTEgMjMuMjU0LTg2LjAwMSAwLTk0LjI1My03Ni40MDctMTcwLjY2LTE3MC42Ni0xNzAuNjZzLTE3MC42NiA3Ni40MDctMTcwLjY2IDE3MC42NmMwIDk0LjI1MyA3Ni40MDcgMTcwLjY2IDE3MC42NiAxNzAuNjYgMzguMzY4IDAgNzMuNzc5LTEyLjY2MiAxMDIuMjgyLTM0LjAzNGwtMC40NDIgMC4zMTcgNDQzLjcxNSA0NDMuODg2Yy0yMS4wNTUgMjguMDYxLTMzLjcxNyA2My40NzItMzMuNzE3IDEwMS44NCAwIDk0LjI1MyA3Ni40MDcgMTcwLjY2IDE3MC42NiAxNzAuNjZzMTcwLjY2LTc2LjQwNyAxNzAuNjYtMTcwLjY2YzAtOTQuMjUzLTc2LjQwNy0xNzAuNjYtMTcwLjY2LTE3MC42Ni0zMS42OSAwLTYxLjM2MyA4LjYzOC04Ni43OTMgMjMuNjg3bDAuNzkyLTAuNDM0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmM7IiBnbHlwaC1uYW1lPSJtYXJrZXItbGF5ZXIiIGRhdGEtdGFncz0ibWFya2VyLWxheWVyIiBkPSJNNTEyIDgzMmMtMjM1LjYwNSAwLTQyNi42NjctMTg2LjI4My00MjYuNjY3LTQxNnM0MjYuNjY3LTYwOCA0MjYuNjY3LTYwOCA0MjYuNjY3IDM3OC4yODMgNDI2LjY2NyA2MDgtMTkxLjA2MSA0MTYtNDI2LjY2NyA0MTZ6TTUxMiAyMzQuNjY3Yy0wLjAwNCAwLTAuMDA4IDAtMC4wMTMgMC05NC4yNTcgMC0xNzAuNjY3IDc2LjQxLTE3MC42NjcgMTcwLjY2N3M3Ni40MSAxNzAuNjY3IDE3MC42NjcgMTcwLjY2N2MwLjAwNSAwIDAuMDA5IDAgMC4wMTQgMGgtMC4wMDFjOTQuMjUxLTAuMDA3IDE3MC42NTQtNzYuNDE1IDE3MC42NTQtMTcwLjY2N3MtNzYuNDAzLTE3MC42NTktMTcwLjY1My0xNzAuNjY3aC0wLjAwMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNjJkOyIgZ2x5cGgtbmFtZT0icG9pbnQtbGF5ZXIiIGRhdGEtdGFncz0icG9pbnQtbGF5ZXIiIGQ9Ik02ODIuNjY3IDMyMGMtMTQxLjM4NSAwLTI1NiAxMTQuNjE1LTI1NiAyNTZzMTE0LjYxNSAyNTYgMjU2IDI1NnYwYzE0MS4zODUgMCAyNTYtMTE0LjYxNSAyNTYtMjU2cy0xMTQuNjE1LTI1Ni0yNTYtMjU2djB6TTE3MC42NjcgNjRjLTAuMDA0IDAtMC4wMDggMC0wLjAxMyAwLTk0LjI1NyAwLTE3MC42NjcgNzYuNDEtMTcwLjY2NyAxNzAuNjY3czc2LjQxIDE3MC42NjcgMTcwLjY2NyAxNzAuNjY3YzAuMDA1IDAgMC4wMDkgMCAwLjAxNCAwaC0wLjAwMWM5NC4yNTEtMC4wMDcgMTcwLjY1NC03Ni40MTUgMTcwLjY1NC0xNzAuNjY3cy03Ni40MDMtMTcwLjY1OS0xNzAuNjUzLTE3MC42NjdoLTAuMDAxek03MjUuMzMzLTEwNi42NjdjLTcwLjY5MiAwLTEyOCA1Ny4zMDgtMTI4IDEyOHM1Ny4zMDggMTI4IDEyOCAxMjh2MGM3MC42OTIgMCAxMjgtNTcuMzA4IDEyOC0xMjhzLTU3LjMwOC0xMjgtMTI4LTEyOHYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmU7IiBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiBkYXRhLXRhZ3M9InBvbHlnb24tbGF5ZXIiIGQ9Ik0xNjAgNTEyYy04OC4zNjYgMC0xNjAgNzEuNjM0LTE2MCAxNjBzNzEuNjM0IDE2MCAxNjAgMTYwdjBjODguMzY2IDAgMTYwLTcxLjYzNCAxNjAtMTYwcy03MS42MzQtMTYwLTE2MC0xNjB2MHpNODY0IDUxMmMtODguMzY2IDAtMTYwIDcxLjYzNC0xNjAgMTYwczcxLjYzNCAxNjAgMTYwIDE2MHYwYzg4LjM2NiAwIDE2MC03MS42MzQgMTYwLTE2MHMtNzEuNjM0LTE2MC0xNjAtMTYwdjB6TTg2NC0xOTJjLTg4LjM2NiAwLTE2MCA3MS42MzQtMTYwIDE2MHM3MS42MzQgMTYwIDE2MCAxNjB2MGM4OC4zNjYgMCAxNjAtNzEuNjM0IDE2MC0xNjBzLTcxLjYzNC0xNjAtMTYwLTE2MHYwek0xNjAtMTkyYy04OC4zNjYgMC0xNjAgNzEuNjM0LTE2MCAxNjBzNzEuNjM0IDE2MCAxNjAgMTYwdjBjODguMzY2IDAgMTYwLTcxLjYzNCAxNjAtMTYwcy03MS42MzQtMTYwLTE2MC0xNjB2MHpNMzIwIDcwNGgzODR2LTY0aC0zODR6TTMyMCAwaDM4NHYtNjRoLTM4NHpNMTkyIDUxMnYtMzg0aC02NHYzODR6TTg5NiA1MTJ2LTM4NGgtNjR2Mzg0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MzA7IiBnbHlwaC1uYW1lPSJzZWFyY2giIGRhdGEtdGFncz0ic2VhcmNoIiBob3Jpei1hZHYteD0iMTA4NyIgZD0iTTc3MC42NiA2MTguMzEyYy02My42MDkgNjQuMzUxLTE1MS44ODIgMTA0LjIwNC0yNDkuNDYzIDEwNC4yMDRzLTE4NS44NTQtMzkuODUzLTI0OS40My0xMDQuMTdsLTAuMDMzLTAuMDM0Yy02My44NzYtNjQuNTkxLTEwMy4zMzUtMTUzLjQ0My0xMDMuMzM1LTI1MS41MTFzMzkuNDYtMTg2LjkxOSAxMDMuMzY4LTI1MS41NDNsLTAuMDMyIDAuMDMzYzYzLjYxNy02NC4zMzUgMTUxLjg4Ny0xMDQuMTc3IDI0OS40NjMtMTA0LjE3N3MxODUuODQ3IDM5Ljg0MiAyNDkuNDMxIDEwNC4xNDVsMC4wMzIgMC4wMzJjNjMuODc2IDY0LjU5MSAxMDMuMzM1IDE1My40NDMgMTAzLjMzNSAyNTEuNTExcy0zOS40NiAxODYuOTE5LTEwMy4zNjggMjUxLjU0M2wwLjAzMi0wLjAzM3pNMTk0LjkzNyAzNy44NTNjLTE4MC4xNTMgMTgxLjc1My0xODAuMTUzIDQ3Ni4yMDYgMCA2NTcuODk2IDgzLjIxNiA4NC4xMzQgMTk4LjY3IDEzNi4yMzUgMzI2LjI5MiAxMzYuMjM1czI0My4wNzYtNTIuMTAxIDMyNi4yNTEtMTM2LjE5NGwwLjA0MS0wLjA0MWMxODAuMTUzLTE4MS42ODkgMTgwLjE1My00NzYuMTQyIDAtNjU3Ljg5Ni04My4yMTYtODQuMTM0LTE5OC42Ny0xMzYuMjM1LTMyNi4yOTItMTM2LjIzNXMtMjQzLjA3NiA1Mi4xMDEtMzI2LjI1MSAxMzYuMTk0bC0wLjA0MSAwLjA0MXpNMTA1Ni45ODUtMTczLjMzOWMtMTEuMzcyLTExLjQ4NS0yNy4xNDMtMTguNTk3LTQ0LjU3NC0xOC41OTdzLTMzLjIwMyA3LjExMi00NC41NjkgMTguNTkybC0wLjAwNSAwLjAwNS04OS4xNDkgODkuODUzYy0xMS40MDMgMTEuNTQxLTE4LjQ0NiAyNy40MTEtMTguNDQ2IDQ0LjkyNnM3LjA0MyAzMy4zODUgMTguNDUyIDQ0LjkzM2wtMC4wMDYtMC4wMDZjMTEuMzcyIDExLjQ4NSAyNy4xNDMgMTguNTk3IDQ0LjU3NCAxOC41OTdzMzMuMjAzLTcuMTEyIDQ0LjU2OS0xOC41OTJsMC4wMDUtMC4wMDUgODkuMTQ5LTg5Ljg1M2MxMS40MTgtMTEuNTM0IDE4LjQ3Mi0yNy40MDYgMTguNDcyLTQ0LjkyNnMtNy4wNTQtMzMuMzkyLTE4LjQ3Ny00NC45MzJsMC4wMDUgMC4wMDV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTYzYTsiIGdseXBoLW5hbWU9InNvbGlkLS11cC10cmlhbmdsZSIgZGF0YS10YWdzPSJzb2xpZC11cC10cmlhbmdsZSIgZD0iTTU1Mi44NTggNTgxLjgzN2MtMjIuNTI4IDI1LjA4OC01OC42NzUgMjUuNi04MS43MTUgMGwtMjQ1Ljk2NS0yNzMuNDA4Yy00NS4xNTgtNTAuMTc2LTI2LjQxOS05MC44MjkgNDEuNTc0LTkwLjgyOWg0OTAuNDk2YzY4LjA5NiAwIDg2LjczMyA0MC43NTUgNDEuNTc0IDkwLjkzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNjNiOyIgZ2x5cGgtbmFtZT0ic29saWQtZG93bi10cmlhbmdsZSIgZGF0YS10YWdzPSJzb2xpZC1kb3duLXRyaWFuZ2xlIiBkPSJNNDcxLjE0MiA1OC4xNjNjMjIuNTI4LTI1LjA4OCA1OC42NzUtMjUuNiA4MS43MTUgMGwyNDUuOTY1IDI3My40MDhjNDUuMTU4IDUwLjE3NiAyNi40MTkgOTAuODI5LTQxLjU3NCA5MC44MjloLTQ5MC40OTZjLTY4LjA5NiAwLTg2LjczMy00MC43NTUtNDEuNTc0LTkwLjkzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNmE0OyIgZ2x5cGgtbmFtZT0iZmlyc3QiIGRhdGEtdGFncz0iZmlyc3QiIGQ9Ik0yODQuNDQ0IDU0Ny41NTZoNTYuODg5di01MTJoLTU2Ljg4OXpNNzEwLjk0IDM2LjIzOGMtNi45MTYgMC4wMzYtMTMuMjYgMi40NTMtMTguMjYyIDYuNDczbDAuMDU3LTAuMDQ0LTI4Mi4xMTIgMjI2LjgxNmMtNi42MzQgNS4zODMtMTAuODM5IDEzLjUzNS0xMC44MzkgMjIuNjdzNC4yMDUgMTcuMjg3IDEwLjc4NSAyMi42MjhsMC4wNTQgMC4wNDIgMjgwLjgwNCAyMjUuNjc4YzQuOTM2IDMuOTkgMTEuMjg4IDYuNDA1IDE4LjIwNCA2LjQwNSAxNi4wNTggMCAyOS4wNzUtMTMuMDE3IDI5LjA3NS0yOS4wNzUgMC05LjE0MS00LjIxOS0xNy4yOTctMTAuODE1LTIyLjYyN2wtMC4wNTUtMC4wNDMtMjUyLjU4Ny0yMDIuOTggMjUzLjgzOC0yMDQuMjMxYzYuNjMzLTUuMzcyIDEwLjgzOC0xMy41MTYgMTAuODM4LTIyLjY0MiAwLTE2LjA0NS0xMi45OTktMjkuMDU0LTI5LjA0MS0yOS4wNzBoLTAuMDAyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTU7IiBnbHlwaC1uYW1lPSJuZXh0IiBkYXRhLXRhZ3M9Im5leHQiIGQ9Ik0zNzAuNDA0IDM2LjkyMWM2LjkxNiAwLjAzNiAxMy4yNiAyLjQ1MyAxOC4yNjIgNi40NzNsLTAuMDU3LTAuMDQ0IDI4Mi4wNTUgMjI2LjgxNmM2LjYzNCA1LjM4MyAxMC44MzkgMTMuNTM1IDEwLjgzOSAyMi42N3MtNC4yMDUgMTcuMjg3LTEwLjc4NSAyMi42MjhsLTAuMDU0IDAuMDQyLTI4MC44MDQgMjI1LjYyMWMtNC43OTMgMy42MTctMTAuODUgNS43OTQtMTcuNDE1IDUuNzk0LTE2LjA1NSAwLTI5LjA3MC0xMy4wMTUtMjkuMDcwLTI5LjA3MCAwLTguNzc3IDMuODktMTYuNjQ2IDEwLjA0MC0yMS45NzZsMC4wMzYtMC4wMzEgMjUyLjU4Ny0yMDIuOTgtMjUzLjgzOC0yMDQuMjMxYy02LjYzMy01LjM3Mi0xMC44MzgtMTMuNTE2LTEwLjgzOC0yMi42NDIgMC0xNi4wNDUgMTIuOTk5LTI5LjA1NCAyOS4wNDEtMjkuMDcwaDAuMDAyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTY7IiBnbHlwaC1uYW1lPSJsYXN0IiBkYXRhLXRhZ3M9Imxhc3QiIGQ9Ik03MDkuNTE4IDU0Ny41NTZjMTUuNzA5IDAgMjguNDQ0LTEyLjczNSAyOC40NDQtMjguNDQ0djAtNDU1LjExMWMwLTE1LjcwOS0xMi43MzUtMjguNDQ0LTI4LjQ0NC0yOC40NDRzLTI4LjQ0NCAxMi43MzUtMjguNDQ0IDI4LjQ0NHYwIDQ1NS4xMTFjMCAxNS43MDkgMTIuNzM1IDI4LjQ0NCAyOC40NDQgMjguNDQ0djB6TTMxMy41NzIgMzYuMjM4Yy0xNi4wNDMgMC4wMTYtMjkuMDQyIDEzLjAyNS0yOS4wNDIgMjkuMDcwIDAgOS4xMjYgNC4yMDUgMTcuMjcgMTAuNzgzIDIyLjU5OWwwLjA1NCAwLjA0MyAyNTMuODM4IDIwNC4yMzEtMjUyLjU4NyAyMDIuOThjLTYuMjY0IDUuMzY1LTEwLjIwOSAxMy4yODItMTAuMjA5IDIyLjEyMSAwIDE2LjA1NSAxMy4wMTUgMjkuMDcwIDI5LjA3MCAyOS4wNzAgNi41OTggMCAxMi42ODQtMi4xOTggMTcuNTYzLTUuOTAzbC0wLjA3MiAwLjA1MiAyODAuODA0LTIyNS42NzhjNi42NzMtNS4zNjIgMTAuOTA3LTEzLjUyMSAxMC45MDctMjIuNjdzLTQuMjM1LTE3LjMwOS0xMC44NTEtMjIuNjI2bC0wLjA1Ni0wLjA0NC0yODEuOTk4LTIyNi44MTZjLTQuOTQ0LTMuOTc1LTExLjI4OS02LjM5Mi0xOC4xOTYtNi40MjhoLTAuMDA4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTc7IiBnbHlwaC1uYW1lPSJwcmV2IiBkYXRhLXRhZ3M9InByZXYiIGQ9Ik02NTIuNDU5IDM2LjkyMWMtNi45MTYgMC4wMzYtMTMuMjYgMi40NTMtMTguMjYyIDYuNDczbDAuMDU3LTAuMDQ0LTI4Mi4xMTIgMjI2LjgxNmMtNi42MzQgNS4zODMtMTAuODM5IDEzLjUzNS0xMC44MzkgMjIuNjdzNC4yMDUgMTcuMjg3IDEwLjc4NSAyMi42MjhsMC4wNTQgMC4wNDIgMjgwLjgwNCAyMjUuNjIxYzQuNzkzIDMuNjE3IDEwLjg1IDUuNzk0IDE3LjQxNSA1Ljc5NCAxNi4wNTUgMCAyOS4wNzAtMTMuMDE1IDI5LjA3MC0yOS4wNzAgMC04Ljc3Ny0zLjg5LTE2LjY0Ni0xMC4wNDAtMjEuOTc2bC0wLjAzNi0wLjAzMS0yNTIuNTg3LTIwMi45OCAyNTMuODM4LTIwNC4yMzFjNi42MzMtNS4zNzIgMTAuODM4LTEzLjUxNiAxMC44MzgtMjIuNjQyIDAtMTYuMDQ1LTEyLjk5OS0yOS4wNTQtMjkuMDQxLTI5LjA3MGgtMC4wMDJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTZhODsiIGdseXBoLW5hbWU9InBvaS1sb2FkIiBkYXRhLXRhZ3M9InBvaS1sb2FkIiBkPSJNMjEyLjMzNCA1MDIuODU3aDQzOC4zNDVjMjEuOTQzIDAgMzYuNTcxIDE0LjYyOSAzNi41NzEgMzYuNTcxcy0xNC42MjkgMzYuNTcxLTM2LjU3MSAzNi41NzFoLTQzOC4zNDVjLTIxLjk0MyAwLTM2LjU3MS0xNC42MjktMzYuNTcxLTM2LjU3MXMxNC42MjktMzYuNTcxIDM2LjU3MS0zNi41NzF6TTY4Ny4yNSAzMjBjMCAyMS45NDMtMTQuNjI5IDM2LjU3MS0zNi41NzEgMzYuNTcxaC00MzguMzQ1Yy0yMS45NDMgMC0zNi41NzEtMTQuNjI5LTM2LjU3MS0zNi41NzFzMTQuNjI5LTM2LjU3MSAzNi41NzEtMzYuNTcxaDQzOC4zNDVjMjEuOTQzIDAgMzYuNTcxIDE0LjYyOSAzNi41NzEgMzYuNTcxek0yMTIuMzM0IDEzNy4xNDNjLTIxLjk0MyAwLTM2LjU3MS0xNC42MjktMzYuNTcxLTM2LjU3MXMxNC42MjktMzYuNTcxIDM2LjU3MS0zNi41NzFoMjU1LjcwN2MyMS45NDMgMCAzNi41NzEgMTQuNjI5IDM2LjU3MSAzNi41NzFzLTE0LjYyOSAzNi41NzEtMzYuNTcxIDM2LjU3MXpNMTAwOC42NCA5My4yNTdjLTE0LjU1NSAxNC42MjktMzYuNDk4IDE0LjYyOS01MS4wNTQgMGwtODAuNDU3LTgwLjQ1N3Y2NzIuOTE0YzAgODAuNDU3LTY1LjY4MiAxNDYuMjg2LTE0Ni4wNjYgMTQ2LjI4NmgtNTg0LjQ4NWMtODAuMzg0IDAtMTQ2LjEzOS02NS44MjktMTQ2LjEzOS0xNDYuMjg2di03MzEuNDI5YzAtODAuNDU3IDY1LjgyOS0xNDYuMjg2IDE0Ni4xMzktMTQ2LjI4Nmg1MDQuMTAxYzIxLjk0MyAwIDM2LjU3MSAxNC42MjkgMzYuNTcxIDM2LjU3MXMtMTQuNjI5IDM2LjU3MS0zNi41NzEgMzYuNTcxaC01MDQuMTAxYy00My44ODYgMC03My4wNzAgMzYuNTcxLTczLjA3MCA3My4xNDN2NzMxLjQyOWMwIDQzLjg4NiAzNi41NzEgNzMuMTQzIDczLjA3MCA3My4xNDNoNTg0LjQ4NWM0My44ODYgMCA3My4wNzAtMjkuMjU3IDczLjA3MC03My4xNDN2LTY4MC4yMjlsLTgwLjM4NCA4MC40NTdjLTE0LjYyOSAxNC42MjktMzYuNTcxIDE0LjYyOS01MS4xMjcgMC0xNC42MjktMTQuNjI5LTE0LjYyOS0zNi41NzEgMC01MS4ybDE0Ni4xMzktMTQ2LjI4NnM3LjMxNC03LjMxNCAxNC42MjktNy4zMTRoMjkuMjU3YzcuMjQxIDAgNy4yNDEgNy4zMTQgMTQuNTU1IDcuMzE0bDE0Ni4xMzkgMTQ2LjI4NmMtNy4zMTQgMTQuNjI5LTcuMzE0IDQzLjg4Ni0xNC42MjkgNTguNTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTk7IiBnbHlwaC1uYW1lPSJwb2ktc2F2ZSIgZGF0YS10YWdzPSJwb2ktc2F2ZSIgZD0iTTg2Ny42OTQgNzU4LjI3MmgtNjM4LjI0NWMtODYuMDE2IDAtMTU1Ljc5NC02OS43MDUtMTU1Ljc5NC0xNTUuNzk0di02MzguNjgzYzAtODYuMDg5IDY5Ljc3OC0xNTUuNzk0IDE1NS43OTQtMTU1Ljc5NGg2MzguMjQ1Yzg2LjAxNiAwIDE1NS43OTQgNjkuNzA1IDE1NS43OTQgMTU1Ljc5NHY2MzguNzU3YzAgODYuMDE2LTY5Ljc3OCAxNTUuNzk0LTE1NS43OTQgMTU1Ljc5NHpNMjgyLjg0MyA2OTAuMjQ5aDUzMS40NTZ2LTIzNy40OTVjMC0zMi4xMS0zMy4yMDctNTguMjIyLTc0LjAyMS01OC4yMjJoLTM4My40MTVjLTQwLjgxNCAwLTc0LjAyMSAyNi4xMTItNzQuMDIxIDU4LjIyMnpNOTU1LjM5Mi0zNS42OTRjMC00OC40OTQtMzkuMjA1LTg3LjY5OC04Ny43NzEtODcuNjk4aC02MzguMDk4Yy0wLjAyMiAwLTAuMDQ4IDAtMC4wNzMgMC00OC4zOTQgMC04Ny42MjUgMzkuMjMxLTg3LjYyNSA4Ny42MjUgMCAwLjA1MSAwIDAuMTAzIDAgMC4xNTR2LTAuMDA4IDYzOC4wOThjMCA0My41MiAzMS41OTggNzkuNTA2IDcyLjk5NyA4Ni4wMTZ2LTIzNi4zMjVjMC02OS43MDUgNjMuNzA3LTEyNi4zMTggMTQyLjExNy0xMjYuMzE4aDM4My40MTVjNzguNDA5IDAgMTQyLjExNyA1Ni42MTMgMTQyLjExNyAxMjYuMzE4djIzNi45ODNjNDEuMzk5LTcuMDk1IDcyLjk5Ny00My4wODEgNzIuOTk3LTg2LjA4OXpNNzA1Ljk3NSA0NDUuNzMzYzAuMDIyIDAgMC4wNDcgMCAwLjA3MyAwIDE4LjU4MiAwIDMzLjY0NiAxNS4wNjQgMzMuNjQ2IDMzLjY0NiAwIDAuMDI2IDAgMC4wNTEgMCAwLjA3N3YtMC4wMDQgMTE3LjEwMmMwIDAuMDQzIDAgMC4wOTUgMCAwLjE0NiAwIDE4LjU4Mi0xNS4wNjQgMzMuNjQ2LTMzLjY0NiAzMy42NDYtMC4wMjYgMC0wLjA1MiAwLTAuMDc3IDBoMC4wMDRjLTAuMDg3IDAuMDAxLTAuMTkxIDAuMDAxLTAuMjk0IDAuMDAxLTE4LjcyMiAwLTMzLjkxOC0xNS4wOTUtMzQuMDgzLTMzLjc3OHYtMTE3LjA0NWMwLjUyNi0xOC42NTIgMTUuNjc0LTMzLjU5NiAzNC4zNTgtMzMuNzkyaDAuMDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YWM7IiBnbHlwaC1uYW1lPSJ1cGxvYWQiIGRhdGEtdGFncz0idXBsb2FkIiBob3Jpei1hZHYteD0iMTI0MyIgZD0iTTk1Mi4wMjcgMTIuOGMtMzIuMTgzIDAtNTguMjk1IDI1LjAxNS01OC4yOTUgNTUuODgxIDAgMzAuNzkzIDI2LjExMiA1NS44MDggNTguMjk1IDU1LjgwOCA5Ni41NDkgMCAxNzQuODExIDc1LjA0NSAxNzQuODExIDE2Ny41Ny0wLjIgNTUuNDMzLTI3Ljg0OSAxMDQuMzY3LTcwLjA1NSAxMzMuOTRsLTAuNTI3IDAuMzUtMC43MzEgMC41ODVjLTMuMTQ2IDIuMjQzLTYuOTY0IDQuNzMxLTEwLjg3OCA3LjA3NmwtMC44MjUgMC40NTgtMS45MDIgMS4wOTdjLTIuODAxIDEuNjgyLTYuNTM5IDMuNzA0LTEwLjM1MiA1LjU5NmwtMS4wNTggMC40NzUtMy4yMTggMS40NjNjLTIuNDA3IDEuMTk0LTYuMDIzIDIuNzctOS42OTYgNC4yMzNsLTEuMjc1IDAuNDQ4LTQuODI3IDEuNjgyYy0yLjAyMCAwLjc5OS01LjM3NyAxLjkyMS04Ljc3NSAyLjk0OWwtMS4zMTkgMC4zNDNjLTIuMjY3IDAuNjU4LTQuNjA4IDEuMDk3LTYuODc1IDEuNjgyLTIuOTI2IDAuNzMxLTUuODUxIDEuNDYzLTguODUgMi4wNDgtMy4yMTggMC41ODUtNi40MzcgMC45NTEtOS42NTUgMS4zOS0yLjI2NyAwLjI5My00LjUzNSAwLjczMS02Ljg3NSAwLjk1MS01LjEyMiAwLjUwNi0xMS4wODAgMC43OTgtMTcuMTA1IDAuODA1aC0wLjAxMGMtMS44MjkgMC0zLjY1Ny0wLjIxOS01LjQxMy0wLjIxOS0yLjEzNCAxMS40NjQtNC40NCAyMC45MTUtNy4xODggMzAuMTc1bDAuNTMyLTIuMDg5Yy0wLjY1OCAyLjI2Ny0xLjQ2MyA0LjM4OS0yLjE5NCA2LjY1Ni0yLjE5NCA3LjAyMi00LjM4OSAxMy44OTctNy4wOTUgMjAuNjk5LTAuODA1IDIuMDQ4LTEuODI5IDQuMDIzLTIuNjMzIDYuMDcxLTMuNjcgOC45NTItNi43NjMgMTUuNjQyLTEwLjA3MSAyMi4yMDVsMC44NTUtMS44NzFjLTAuNzMxIDEuNjA5LTEuNzU1IDMuMTQ1LTIuNTYgNC42ODEtNC40NTcgOC41ODEtOC4zMTggMTUuMjc5LTEyLjQxIDIxLjgxOGwwLjc4MS0xLjMzOGMtNTcuNjM3IDkyLjE2LTE2Mi42NyAxNTMuODkzLTI4Mi45MTcgMTUzLjg5My0xMjAuMzIgMC0yMjUuMjgtNjEuODA2LTI4Mi45MTctMTUzLjg5My00LjE2OS02LjY1Ni03Ljk3My0xMy41MzEtMTEuNzAzLTIwLjQ4LTAuNzMxLTEuNTM2LTEuNjgyLTMuMDcyLTIuNDg3LTQuNjgxLTIuNDg0LTQuNzQ3LTUuNTc3LTExLjQzNy04LjQzOS0xOC4yNDhsLTAuNzc3LTIuMDg2Yy0wLjgwNS0yLjA0OC0xLjgyOS00LjAyMy0yLjYzMy02LjA3MS0xLjk0Ny00LjcxNi00LjM2MS0xMS41OS02LjUyNy0xOC41NzNsLTAuNTY4LTIuMTI2LTIuMTk0LTYuNTgzYy0yLjIwMy03LjIwNi00LjQ4NS0xNi42ODYtNi4yOTctMjYuMzMybC0wLjI4NS0xLjgyOGMtMS45MDIgMC0zLjY1NyAwLjIxOS01LjQ4NiAwLjIxOS01Ljc3OCAwLTExLjQ4My0wLjI5My0xNy4xMTUtMC44MDUtMi4zNDEtMC4yMTktNC42MDgtMC42NTgtNi44NzUtMC45NTEtMy4yMTgtMC40MzktNi40MzctMC44MDUtOS42NTUtMS40NjMtMi45MjYtMC41MTItNS44NTEtMS4yNDMtOC43NzctMS45NzUtMi4zNDEtMC41ODUtNC42ODEtMS4wMjQtNi45NDktMS42ODItNC43Mi0xLjM3MS04LjA3Ny0yLjQ5My0xMS4zOS0zLjcwN2wxLjI5NiAwLjQxNS00LjkwMS0xLjY4MmMtMy42NTctMS40NjMtNy4zMTQtMi45MjYtMTAuODk4LTQuNjA4bC0zLjIxOC0xLjQ2M2MtNC44MjEtMi4zNjQtOC41NTgtNC40MDktMTIuMjA4LTYuNTg0bDAuNzk3IDAuNDQtMS45MDItMS4wOTdjLTQuNzUzLTIuODE2LTguNTcxLTUuMzA0LTEyLjI4OS03LjkyNmwwLjU4NiAwLjM5Mi0wLjczMS0wLjU4NWMtNDIuNzI1LTI5LjkzMi03MC4zNy03OC44Ni03MC41ODMtMTM0LjI1N3YtMC4wMzNjMC05Mi41MjYgNzguMjYzLTE2Ny40OTcgMTc0LjgxMS0xNjcuNDk3IDMyLjE4MyAwIDU4LjI5NS0yNS4wODggNTguMjk1LTU1Ljg4MSAwLTMwLjg2Ni0yNi4xMTItNTUuODgxLTU4LjI5NS01NS44ODEtMTYwLjkxNCAwLTI5MS40MDEgMTI1LjA3NC0yOTEuNDAxIDI3OS4yNTkgMCAxMjUuODA2IDg2LjgyMSAyMzIuMTU1IDIwNi4yNjMgMjY3LjExOCA2NC43MzEgMTU5LjQ1MSAyMjYuMDExIDI3Mi44MjMgNDE1LjQ1MSAyNzIuODIzczM1MC42NDctMTEzLjM3MSA0MTUuNTI1LTI3Mi44MjNjMTE5LjM2OS0zNC45NjIgMjA2LjE5LTE0MS4zMTIgMjA2LjE5LTI2Ny4xMTggMC0xNTQuMTg1LTEzMC40ODctMjc5LjI1OS0yOTEuNDAxLTI3OS4yNTl6TTQwMy41MjkgMTQzLjI4N2wwLjIxOSAwLjIxOSAxNzQuNjY1IDE4Ni4wMDIgMC4xNDYtMC4xNDZjMTAuODEzIDExLjUzNCAyNi4xNDQgMTguNzIxIDQzLjE1NCAxOC43MjFzMzIuMzQyLTcuMTg2IDQzLjEyNC0xOC42ODhsMC4wMzAtMC4wMzIgMC4xNDYgMC4xNDYgMTc0Ljg4NS0xODYuMTQ5YzguMTE5LTguNzA0IDEzLjQ1OC0xOS43NDkgMTQuNjI5LTMyLjAzN3YtMC4xNDZjMC4xOTktMS41MDMgMC4zMzEtMy4yNzYgMC4zNjUtNS4wNzNsMC4wMDEtMC4wNDdjMC0zMC45MzktMjYuMTEyLTU1Ljk1NC01OC4yOTUtNTUuOTU0aC0xLjkwMmwtMS4xNyAwLjA3My0xLjI0MyAwLjA3My0xLjkwMiAwLjIxOWgtMC43MzFsLTIuNDg3IDAuMzY2Yy0xMy40NzUgMi4wOTgtMjUuMTc2IDguNTA2LTMzLjkxMiAxNy43NDZsLTAuMDI2IDAuMDI4LTczLjIxNiA3Ny44OTd2LTI4Mi42MjRjMC0zMC44NjYtMjYuMTEyLTU1Ljg4MS01OC4yOTUtNTUuODgxcy01OC4yOTUgMjUuMDE1LTU4LjI5NSA1NS44ODF2MjgyLjYyNGwtNzMuMjE2LTc3Ljk3Yy04Ljc0NC05LjI0LTIwLjQyMS0xNS42MjUtMzMuNTM3LTE3LjY1OWwtMC4zMjktMC4wNDJjLTAuODc4LTAuMjE5LTEuNjgyLTAuMjkzLTIuNTYtMC4zNjYtMC4xOC0wLjAyNS0wLjQzMi0wLjA1MS0wLjY4Ni0wLjA3MGwtMC4wNDYtMC4wMDMtMS45MDItMC4yMTloLTEuMjQzbC0xLjA5Ny0wLjA3M2gtMS45NzVjLTAuMTQzLTAuMDAxLTAuMzEzLTAuMDAyLTAuNDgyLTAuMDAyLTIxLjU0IDAtNDAuMzY4IDExLjYwOS01MC41NjkgMjguOTEybC0wLjE0OSAwLjI3NGMtNC40ODYgNy42NzYtNy4xMzQgMTYuODk5LTcuMTM0IDI2Ljc0MiAwIDE0LjQ3OCA1LjczMSAyNy42MTggMTUuMDQ5IDM3LjI3NGwtMC4wMTUtMC4wMTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTZhZTsiIGdseXBoLW5hbWU9ImNsb3NlIiBkYXRhLXRhZ3M9ImNsb3NlIiBkPSJNNjQxLjM2NSAzMjBsMzU1LjQxMy0zNTUuMzI4YzM2LjAxMS0zNi4wMTEgMzYuNDM3LTkzLjg2NyAwLjQyNy0xMjkuODc3LTE2LjU4Ni0xNi41MTctMzkuNDY0LTI2LjcyOS02NC43MjYtMjYuNzI5LTI1LjQ3NCAwLTQ4LjUyMyAxMC4zODQtNjUuMTQ1IDI3LjE0OWwtMzU1LjMzNCAzNTUuNDE5LTM1NS4zMjgtMzU1LjQxM2MtMzYuMDExLTM2LjAxMS05My44NjctMzYuNDM3LTEyOS44NzctMC40MjctMTYuNTE3IDE2LjU4Ni0yNi43MjkgMzkuNDY0LTI2LjcyOSA2NC43MjYgMCAyNS40NzQgMTAuMzg0IDQ4LjUyMyAyNy4xNDkgNjUuMTQ1bDM1NS40MTkgMzU1LjMzNC0zNTUuNDEzIDM1NS4zMjhjLTE2Ljc5MyAxNi42MTktMjcuMTkxIDM5LjY3MS0yNy4xOTEgNjUuMTUxIDAgMjUuMjY5IDEwLjIyNiA0OC4xNDkgMjYuNzY2IDY0LjcyOGwtMC4wMDItMC4wMDJjMTYuNTg2IDE2LjUxNyAzOS40NjQgMjYuNzI5IDY0LjcyNiAyNi43MjkgMjUuNDc0IDAgNDguNTIzLTEwLjM4NCA2NS4xNDUtMjcuMTQ5bDM1NS4zMzQtMzU1LjQxOSAzNTUuMzI4IDM1NS40MTNjMTYuNjE5IDE2Ljc5MyAzOS42NzEgMjcuMTkxIDY1LjE1MSAyNy4xOTEgMjUuMjY5IDAgNDguMTQ5LTEwLjIyNiA2NC43MjgtMjYuNzY2bC0wLjAwMiAwLjAwMmMxNi41MTctMTYuNTg2IDI2LjcyOS0zOS40NjQgMjYuNzI5LTY0LjcyNiAwLTI1LjQ3NC0xMC4zODQtNDguNTIzLTI3LjE0OS02NS4xNDVsLTAuMDA2LTAuMDA2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OTE7IiBnbHlwaC1uYW1lPSJtZXNzYWdlLXN1Y2Nlc3MiIGRhdGEtdGFncz0i5oiQ5YqfaWNvbiIgZD0iTTcyMS4zIDUyNi40bC0zMjcuNS0zMjguNS04NS40IDE0OS41Yy05LjkgMTcuMy0zMS44IDIzLjMtNDkuMSAxMy40cy0yMy4zLTMxLjgtMTMuNC00OS4xbDEwOC44LTE5MC41YzYuNi0xMS42IDE4LjgtMTguMiAzMS4zLTE4LjIgNi4xIDAgMTIuMiAxLjUgMTcuOCA0LjcgMy4yIDEuOSA2LjEgNC4xIDguNSA2LjcgMC4xIDAuMSAwLjMgMC4zIDAuNCAwLjRsMzU5LjUgMzYwLjZjMTQgMTQuMSAxNCAzNi45LTAuMSA1MC45LTE0IDE0LjItMzYuNyAxNC4yLTUwLjggMC4xdjB6TTUxMiA4MzJjLTI4Mi44IDAtNTEyLTIyOS4yLTUxMi01MTJzMjI5LjItNTEyIDUxMi01MTJjMjgyLjggMCA1MTIgMjI5LjIgNTEyIDUxMnMtMjI5LjIgNTEyLTUxMiA1MTJ2MHpNODIzLjEgOC45Yy00MC40LTQwLjQtODcuNS03Mi4yLTEzOS45LTk0LjMtNTQuMi0yMy0xMTEuOC0zNC42LTE3MS4yLTM0LjZzLTExNyAxMS42LTE3MS4yIDM0LjVjLTUyLjQgMjIuMi05OS40IDUzLjktMTM5LjkgOTQuMy00MC40IDQwLjQtNzIuMiA4Ny41LTk0LjMgMTM5LjktMjMgNTQuMy0zNC42IDExMS45LTM0LjYgMTcxLjNzMTEuNiAxMTcgMzQuNSAxNzEuMmMyMi4yIDUyLjQgNTMuOSA5OS40IDk0LjMgMTM5LjkgNDAuNCA0MC40IDg3LjUgNzIuMiAxMzkuOSA5NC4zIDU0LjMgMjMgMTExLjkgMzQuNiAxNzEuMyAzNC42czExNy0xMS42IDE3MS4yLTM0LjVjNTIuNC0yMi4yIDk5LjQtNTMuOSAxMzkuOS05NC4zIDQwLjQtNDAuNCA3Mi4yLTg3LjUgOTQuMy0xMzkuOSAyMy01NC4zIDM0LjYtMTExLjkgMzQuNi0xNzEuM3MtMTEuNi0xMTctMzQuNS0xNzEuMmMtMjIuMi01Mi40LTUzLjktOTkuNS05NC40LTEzOS45djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk5MzsiIGdseXBoLW5hbWU9Im1lc3NhZ2UtZmFpbHVyZSIgZGF0YS10YWdzPSLlpLHotKVpY29uIiBkPSJNNzE3LjIgNTI1LjhjLTE0LjEgMTQtMzYuOSAxNC01MC45LTAuMWwtMTU0LjMtMTU0LjctMTU0LjMgMTU0LjdjLTE0IDE0LjEtMzYuOCAxNC4xLTUwLjkgMC4xcy0xNC4xLTM2LjgtMC4xLTUwLjlsMTU0LjUtMTU0LjktMTU0LjUtMTU0LjljLTE0LTE0LjEtMTQtMzYuOSAwLjEtNTAuOSA3LTcgMTYuMi0xMC41IDI1LjQtMTAuNXMxOC41IDMuNSAyNS41IDEwLjZsMTU0LjMgMTU0LjcgMTU0LjMtMTU0LjhjNy03LjEgMTYuMy0xMC42IDI1LjUtMTAuNnMxOC40IDMuNSAyNS40IDEwLjVjMTQuMSAxNCAxNC4xIDM2LjggMC4xIDUwLjlsLTE1NC41IDE1NSAxNTQuNCAxNTQuOWMxNC4xIDE0LjEgMTQuMSAzNi45IDAgNTAuOXYwek01MTIgODMyYy0yODIuOCAwLTUxMi0yMjkuMi01MTItNTEyczIyOS4yLTUxMiA1MTItNTEyYzI4Mi44IDAgNTEyIDIyOS4yIDUxMiA1MTJzLTIyOS4yIDUxMi01MTIgNTEydjB6TTgyMy4xIDguOWMtNDAuNC00MC40LTg3LjUtNzIuMi0xMzkuOS05NC4zLTU0LjItMjMtMTExLjgtMzQuNi0xNzEuMi0zNC42cy0xMTcgMTEuNi0xNzEuMiAzNC41Yy01Mi40IDIyLjItOTkuNCA1My45LTEzOS45IDk0LjMtNDAuNCA0MC40LTcyLjIgODcuNS05NC4zIDEzOS45LTIzIDU0LjMtMzQuNiAxMTEuOS0zNC42IDE3MS4zczExLjYgMTE3IDM0LjUgMTcxLjJjMjIuMiA1Mi40IDUzLjkgOTkuNCA5NC4zIDEzOS45IDQwLjQgNDAuNCA4Ny41IDcyLjIgMTM5LjkgOTQuMyA1NC4zIDIzIDExMS45IDM0LjYgMTcxLjMgMzQuNnMxMTctMTEuNiAxNzEuMi0zNC41YzUyLjQtMjIuMiA5OS40LTUzLjkgMTM5LjktOTQuMyA0MC40LTQwLjQgNzIuMi04Ny41IDk0LjMtMTM5LjkgMjMtNTQuMyAzNC42LTExMS45IDM0LjYtMTcxLjNzLTExLjYtMTE3LTM0LjUtMTcxLjJjLTIyLjItNTIuNC01My45LTk5LjUtOTQuNC0xMzkuOXYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OTQ7IiBnbHlwaC1uYW1lPSJtZXNzYWdlLXdhcm5pbmciIGRhdGEtdGFncz0i5byC5bi4aWNvbiIgZD0iTTUxMiA3NjBjNTkuNCAwIDExNy0xMS42IDE3MS4yLTM0LjUgNTIuNC0yMi4yIDk5LjQtNTMuOSAxMzkuOS05NC4zIDQwLjQtNDAuNCA3Mi4yLTg3LjUgOTQuMy0xMzkuOSAyMy01NC4zIDM0LjYtMTExLjkgMzQuNi0xNzEuM3MtMTEuNi0xMTctMzQuNS0xNzEuMmMtMjIuMi01Mi40LTUzLjktOTkuNC05NC4zLTEzOS45LTQwLjQtNDAuNC04Ny41LTcyLjItMTM5LjktOTQuMy01NC4zLTIzLTExMS45LTM0LjYtMTcxLjMtMzQuNnMtMTE3IDExLjYtMTcxLjIgMzQuNWMtNTIuNCAyMi4yLTk5LjQgNTMuOS0xMzkuOSA5NC4zLTQwLjQgNDAuNC03Mi4yIDg3LjUtOTQuMyAxMzkuOS0yMyA1NC4zLTM0LjYgMTExLjktMzQuNiAxNzEuM3MxMS42IDExNyAzNC41IDE3MS4yYzIyLjIgNTIuNCA1My45IDk5LjQgOTQuMyAxMzkuOSA0MC40IDQwLjQgODcuNSA3Mi4yIDEzOS45IDk0LjMgNTQuMyAyMyAxMTEuOSAzNC42IDE3MS4zIDM0LjZ2MHpNNTEyIDgzMmMtMjgyLjggMC01MTItMjI5LjItNTEyLTUxMnMyMjkuMi01MTIgNTEyLTUxMmMyODIuOCAwIDUxMiAyMjkuMiA1MTIgNTEycy0yMjkuMiA1MTItNTEyIDUxMnYwIDB6TTUxMiAxOTJjLTIyLjEgMC00MCAxNy45LTQwIDQwdjM2OWMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwdi0zNjljMC0yMi4xLTE3LjktNDAtNDAtNDB2MHpNNDY3IDgzYzAgMjQuODUzIDIwLjE0NyA0NSA0NSA0NXM0NS0yMC4xNDcgNDUtNDVjMC0yNC44NTMtMjAuMTQ3LTQ1LTQ1LTQ1cy00NSAyMC4xNDctNDUgNDV2MHoiIC8+CjwvZm9udD48L2RlZnM+PC9zdmc+#components-icon) format('svg'); + font-weight: normal; + font-style: normal; +} + +.supermapol-icons { + font-family:"supermapol-icons" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.supermapol-icons-line-layer:before { + content: "\e62a"; +} +.supermapol-icons-marker-layer:before { + content: "\e62c"; +} +.supermapol-icons-point-layer:before { + content: "\e62d"; +} +.supermapol-icons-polygon-layer:before { + content: "\e62e"; +} +.supermapol-icons-search:before { + content: "\e630"; +} +.supermapol-icons-solid-up-triangle:before { + content: "\e63a"; +} +.supermapol-icons-solid-down-triangle:before { + content: "\e63b"; +} +.supermapol-icons-first:before { + content: "\e6a4"; +} +.supermapol-icons-next:before { + content: "\e6a5"; +} +.supermapol-icons-last:before { + content: "\e6a6"; +} +.supermapol-icons-prev:before { + content: "\e6a7"; +} +.supermapol-icons-poi-load:before { + content: "\e6a8"; +} +.supermapol-icons-poi-save:before { + content: "\e6a9"; +} +.supermapol-icons-upload:before { + content: "\e6ac"; +} +.supermapol-icons-close:before { + content: "\e6ae"; +} +.supermapol-icons-message-success:before { + content: "\e991"; +} +.supermapol-icons-message-failure:before { + content: "\e993"; +} +.supermapol-icons-message-warning:before { + content: "\e994"; +} + +/** 未有相应字体图样的图片样式 **/ +.component-checkbox-default-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAKxJREFUKBXVU8ENwyAMxObDBB0qU2SzTtFhADFAswA8EC1HigoE8eivfhBz5zvZFiHn3BZjfAit9QtBSJj5INwEolIAEJnlozD5CCGIoqnAV5cRrii+3eXienqfZ1/ZelxsBpKstc+U0m3AhZRy61prC4wxQ3ctm/PfG1orsb1ZlA1jFO99u5hljlpoGPMrpWbGUwy10Cx7nSo/4B8JCS8+D3ufPZLZjOVfINrfB86l+5fF8g4AAAAASUVORK5CYII=) no-repeat; +} + +.component-checkbox-selected-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAXdJREFUKBWFUr8vQ1EU/u7rK61I9bbRQWIgEWI0iIkYWzGIIF1Ewsbib7BXYjJYDAxCYqCd7BYSMYmNSGilbSR+9rXXPef2vb6Kpmc495zzne/e8+MKuZ1PKqWyFqkuGxDRzIsSEI/ix6mpxE7BRKClMwB8VwGLYAqQQ8IcY2rUNUqbCeM8bfRCv9Oc1sRxKe7Jd6RHQxjoCSCsq6IrqDoSj3k6H8XcSRnKxA0oM/kHBdXvi7FpBUTS+g8gtFZVOa9ul3m7GsdeKmLYpKkhkou0xOtnDWvZN/aZeV90cLUSg6296cMSA6QYHN8vYlDamDpoAB5IBo3HL7yAVq34E//aRGzZpj85qAu7XI4h0iE4TKOpD9ikhfS2v+oLpgit4XxRYjhm4043q3+HSdTaI66PhbE12Y3rZwezxyWcLUiMxG3QdIZ2C/hwPA4b3i7Jm+gLIrckGbjJVzBzVMZ7pfEKA3XVRPQD7WxLCJFyP3C7ZMJ5ovrz/AKWB4FZ7esInwAAAABJRU5ErkJggg==) no-repeat; +} + +.component-analyst-buffer-img { + background: url(data:image/png;base64,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) no-repeat; +} + +.component-analyst-isoline-img { + background: url(data:image/png;base64,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) no-repeat; +} + +.component-triangle-down-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAAXNSR0IArs4c6QAAAK1JREFUGBljDA0NZf706VMwExOTAAMe8P////e8vLzrWAQFBZmAGlz+/fsniUc9SOo5UO0GRhDL09NTFKihFcjEpek50AXV27dvf80M0nDnzp1venp6x/78+WMK5PKBxGCAkZHxKRcXV9XmzZvfgMTAGkCMGzdufFdXVz8KdKsxkMsPEgMqfsTMzFy9adOmdyA+CICdBGFCSBcXF36golIQ7+/fv9179uz5iCwPACiFOzeuZwjoAAAAAElFTkSuQmCC) no-repeat; +} + +.component-triangle-up-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAAXNSR0IArs4c6QAAAIdJREFUGBljYMACvLy87EAYixQDM7qgu7t77P///9OA2FpFRYXl7t27l5DVoGjw9PRMAioMQVKgraamxnnnzp3zMDG4BqDitH///vnDJGA00ABNVVVVPqCmsyAxsAagMzKAEj4wRVhoNaDz+IHOO8Po4ODAAQRTgBoEsCiECzEyMn748eNHDgB9NzNjSerR7QAAAABJRU5ErkJggg==) no-repeat; +} + +.component-single-default-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAIVBMVEUAAADf39/a2tra2trb29vg4ODa2trp6enu7u709PT39/f55+/dAAAACHRSTlMAGGbDzvP3+8NM9hYAAAA4SURBVAjXY2BgcktRYGBgNO2cESzAwFy1atVyAwbVVUAQxOABoloYMkHUNBgFFYQqgWqAaocYBgAJPR7RKZkaAQAAAABJRU5ErkJggg==) no-repeat; +} + +.component-single-checked-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAMFBMVEUAAAAxm9YkldMKiM4Kj9YpmNQ9odiy2vDm8/p6v+T9///////5/f53veQZkNEAg8soFNrEAAAABnRSTlMAfen9GeE1grYoAAAAPklEQVQI12NkYFTiv/eBkSUISN1mZJ2qyPBuOaPYNCP+u9MZ1ac5MdyZzmjR5sjwZgaMggpClUA1QLVDDAMAeFYb2eH90LsAAAAASUVORK5CYII=) no-repeat; +} + +.component-default-marker-icon { + height: 41px !important; + width: 25px !important; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=) no-repeat; +} + +.component-select-marker-icon { + height: 42px !important; + width: 30px !important; + background: url(data:image/png;base64,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) no-repeat; +} + +.component-analyst-density-img { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAqCAMAAADCkShIAAAAElBMVEVNXXNcvv8zp/8hg9mF0v+t5P+bmLduAAAANklEQVR42u3LMQoAIBADQU/P/39ZCBaBNGK9U4bswJ+SKUsI8hrBRdDGA0ewJTO/EmTmOwEeHNAtB+F8eBWwAAAAAElFTkSuQmCC) no-repeat; +} +/*--打开文件组件样式--*/ +.component-openfile__span--select { + position: relative; + /* margin: 20px auto;*/ + width: 110px; + height: 32px; + font-size: 14px; + color: #595959; + text-align: center; + letter-spacing: 0.75px; + line-height: 32px; + border: 1px solid #D9D9D9; + border-radius: 4px; + cursor: pointer; + background-color: #fff; + display: block; +} + +.component-openfile__span--select:hover { + border: 1px solid #38ADF5; + color: #38ADF5; + cursor: pointer; +} + +.component-openfile__span--select .supermapol-icons-upload { + position: absolute; + top: 8px; + left: 10px; + height: 14px; + width: 18px; + color: #1591EA; + margin: auto auto; + padding-right: 5px; +} + +.component-openfile__span--select .component-openfile__span { + display: block; + position: absolute; + left: 32px; +} + +.component-openfile__input { + position: relative; + left: 190px; + top: 49px; + height: 32px; + width: 160px; + display: none !important; +} +/** 提示框样式 **/ +.component-messageboxcontainer { + position: absolute; + top: 20px; + + /*绝对定位左右居中(注:该方法需要设置最大宽度)*/ + left: 0; + right: 0; + margin: auto; + + min-height: 50px; + max-width: 500px; + border-radius: 2px; + background-color: white; + z-index: 1000; +} + +.component-border-bottom-orange { + border-bottom: orange solid 1.5px; +} + +.component-border-bottom-red { + border-bottom: red solid 1.5px; +} + +.component-border-bottom-green { + border-bottom: green solid 1.5px; +} + +.component-messageboxcontainer .icon { + float: left; + font-size: 24px; + margin-left: 20px; + margin-top: 6px; + display: inline-block; +} + +.component-messageboxcontainer .supermapol-icons-message-success { + color: green; +} + +.component-messageboxcontainer .supermapol-icons-message-failure { + color: red; +} + +.component-messageboxcontainer .supermapol-icons-message-warning { + color: orange; +} + +.component-messagebox { + float: left; + color: #595959; + font-size: 12px; + margin: 15px 10px; +} + +.component-messagebox__cancelbtncontainer { + position: relative; + height: 5px; +} + +.component-messagebox__cancelBtn { + position: absolute; + top: 15px; + right: 5px; + border: none; + background: transparent; + color: #A4A4A4; + cursor: pointer; +} + +.component-messagebox__cancelBtn:hover { + border: none; + font-weight: 600; +} +/** dataFlow 数据流服务样式**/ +.component-init-center { + text-align: center; +} + +.component-dataflow__container { + line-height: 36px; +} + +.component-dataflow__container div { + float: left; + min-width: 300px; +} + +/*输入框*/ +.component-input-default { + position: relative; + border: #D9D9D9 solid 0.2px; + background-color: #ffffff; +} + +.component-input-default:hover { + border: #108FE9 solid 0.2px; +} + +.component-input-default input[type='text'] { + margin: 2px; + font-family: MicrosoftYaHei; + font-size: 12px; + color: #919191; + height: 18px; + min-width: 292px; + line-height: 18px; + padding-left: 8px; + padding-right: 25px; + border: none !important; + outline: none !important; +} + +/*组件输入框清除按钮*/ +.component-dataflow__container .supermapol-icons-close:before { + content: "\e6ae"; +} + +.component-input-default input[type='text'] ~ span.supermapol-icons-close { + position: absolute; + right: 5px; + cursor: pointer; + color: #E9E9E9; + width: 20px; + height: 20px; + line-height: 20px; + top: 9px; + text-align: center; + z-index: 10; +} + +/*组件按钮默认样式*/ +.component-button-default { + position: relative; + margin: 0 5px; + padding: 0 10px; + height: 36px; + font-size: 16px; + color: #ffffff; + text-align: center; + letter-spacing: .75px; + line-height: 32px; + border-radius: 4px; + cursor: pointer; + background-color: #108EE9; + outline: none; + border: none; +} + +.component-button-default:hover { + background-color: #38ADF5; + color: #ffffff; + border: none; + cursor: pointer; +} + +/*复选框 todo 统一采用空间分析复选框样式*/ +.component-checkbox-container { + margin: 10px auto; +} + +.component-checkbox-default { + position: absolute; + margin-top: 1px; + height: 14px; + width: 14px; +} + +.component-checkbox-default:hover { + cursor: pointer; +} + +.component-label { + margin-left: 20px; + line-height: 16px; + font-size: 12px; + color: #919191; +} + +.component-label-selected { + color: #595959 !important; +} +/**图层查询组件样式 search**/ +.component-search-container { + position: absolute; + top: 32px; + right: 96px; + width: 385px; +} + +.component-search { + float: right; + min-width: 290px; + height: 36px; + line-height: 36px; + background: #FFFFFF; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.26); + border-radius: 4px; + z-index: 999; + font-size: 12px; +} + +.component-search > div { + float: left; +} + +/*下拉框*/ +.component-search__settings { + position: relative; +} + +.component-search__settings .component-search__settings__name { + background-color: #F5F5F5; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + max-width: 120px; + padding-left: 12px; + padding-right: 24px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; +} + +.component-search__settings__name > div:first-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-search__settings .supermapol-icons-solid-down-triangle { + position: absolute; + right: 8px; + top: 10px; + margin-left: 4px; +} + +/*搜索框*/ +.component-search input[type='text'] { + font-family: MicrosoftYaHei; + font-size: 12px; + color: #919191; + height: 18px; + width: 155px; + line-height: 18px; + padding-left: 8px; + padding-right: 24px; + border: none !important; + outline: none !important; +} + +.component-search__input input[type='text'] ~ span.supermapol-icons-close { + position: absolute; + right: 2px; + cursor: pointer; + color: #E9E9E9; + width: 20px; + height: 20px; + line-height: 20px; + top: 9px; + text-align: center; + z-index: 10; +} + +/*搜索*/ +.component-search__input { + position: relative; +} + +.component-search .supermapol-icons-search { + font-size: 16px; + cursor: pointer; + height: 16px; + width: 39px; + line-height: 16px; + text-align: center; + color: #4A90E2; + margin-top: 10px; + border-left: 1px solid #E9E9E9; +} + +/*图层查询*/ + +.component-search__layers { + box-sizing: border-box; + padding-top: 2px; + margin: 0 auto; + width: 488px; + max-height: 364px; +} + +.component-search__layers__header { + width: 100%; + height: 41px; + border-bottom: 1px solid #E9E9E9; +} + +.component-search__layers__header > div { + float: left; + height: 100%; + line-height: 42px; + cursor: pointer; +} + +.component-search__layers__header > div > span { + display: inline-block; + vertical-align: middle; + margin-right: 16px; +} + +.component-search__layers__header > div > span:first-child { + font-size: 16px; + color: #0083CB; + margin-right: 8px; +} + +.component-search__layers__body { + position: relative; + overflow: hidden; + width: 490px; + max-height: 310px; + padding-bottom: 8px; +} + +.component-search__layers__itme { + width: 100%; + margin-top: 8px; + line-height: 24px; +} + +.component-search__layers__itme > div { + display: inline-block; + vertical-align: middle; + margin-right: 20px; +} + +/*单选框*/ +.component-search__layers__itme__singleselect { + width: 145px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + height: 24px; + line-height: 24px; + font-weight: normal; + cursor: pointer; +} + +.component-search__layers__itme__singleselect > div { + float: left; +} + +.component-search__layers__itme__singleselect > .single-label { + float: left; + margin-left: 6px; +} + +.component-search__layers__itme__singleselect > div:first-child { + width: 12px; + height: 12px; +} + +.component-search__layers__itme__singleselect .component-single-checked-img, .component-search__layers__itme__singleselect .component-single-default-img { + margin-top: 6px; + width: 12px; + height: 12px; +} + +.component-search__layers__itme > .component-search__layers__itme--select { + float: right; + /* 复写模板的margin 后续确认模板margin是否删除*/ + margin-right: 20px; + margin-top: 0; + margin-bottom: 0; + position: relative; + width: 280px; + height: 22px; + background: #FFFFFF; + border: 1px solid #D9D9D9; + border-radius: 4px; + line-height: 22px; + outline: none; +} + +/*查询结果单元样式*/ +.component-search__resultitme { + width: 100%; + height: 56px; + margin: 8px auto; + cursor: pointer; +} + +.component-search__resultitme:hover, .component-search__resultitme.selected { + background-color: #F5F5F5; +} + +.component-search__resultitme > div { + float: left; + height: 100%; + cursor: pointer; +} + +.component-search__resultitme > .component-search-result-icon { + width: 34px; + height: 20px; + font-size: 20px; + line-height: 43px; + text-align: right; + color: #0083CB; +} + +.component-search__resultitme > .component-search__resultitme-selected { + color: red; + font-size: 24px; +} + +.component-search-result-info { + width: 180px; + padding-left: 11px; + margin-right: 48px; +} + +.component-search-result-info > div { + height: 18px; + line-height: 18px; + width: 100%; + margin-top: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-search-result-info > div:first-child { + color: #292929; +} + +.component-search-result-info > div:last-child { + color: #919191; +} + +.component-search__resultitme > div.component-checkbox { + float: right; + margin: 14px 16px 14px 0; + width: 14px; + height: 14px; +} + +/**组件通用外界面样式**/ +.component-container { + position: absolute; + top: 30px; + right: 56px; + background: #F1F3F3; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.26); + z-index: 999; +} + +.component-title { + padding: 0 18px; + height: 34px; + color: #108EE9; + line-height: 36px; + font-weight: bold; + font-size: 15px; + border-top: 1px solid #E9E9E9; + border-bottom: 1px solid #E9E9E9; + background: #ffffff; +} + +.component-content { + /*min-width: 314px;*/ + /*padding: 10px;*/ + color: #595959; + border-radius: 4px; + font-size: 12px; +} + +.component-title div { + height: 33px; + width: fit-content; + border-bottom: 2px solid #108EE9;; +} +/**下拉框组件样式**/ +.component-dropdownbox--container { + position: relative; + width: 200px; + height: 58px; + margin-bottom: 16px; +} + +.component-dropdownbox { + width: 192px; + height: 50px; + background: #FFFFFF; + margin: 0 auto; + padding: 8px 0 0 8px; + border: 1px solid #D9D9D9; + border-radius: 2px; +} + +.component-dropdownbox:hover { + border: 1px solid #108EE9; +} + +.component-dropdownbox__triangle-btn { + position: relative; + bottom: 46px; + left: 173px; + width: 10px; + height: 10px; + cursor: pointer; +} + +.component-dropdownbox__triangle-btn > div { + width: 105%; + height: 100%; +} + +.component-dropdownbox__content { + position: absolute !important; + top: 61px; + left: 0; + width: 184px; + /* height: 92px; */ + background: #FFFFFF; + padding: 8px; + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); + border: 1px solid #D9D9D9; + border-radius: 2px; + z-index: 10001; +} + +.component-dropdownbox__item { + width: 177px; + height: 42px; + margin-bottom: 8px; + cursor: pointer; + color: #595959; +} + +.component-dropdownbox__content .component-dropdownbox__item:hover .component-dropdownbox__item__title { + color: #108EE9; +} + +.component-dropdownbox__content .component-dropdownbox__item:hover .component-dropdownbox__item__remark { + color: #108EE9; +} + +.component-dropdownbox__item__img div { + width: 48px; + height: 42px; +} + +.component-dropdownbox__item__title { + position: relative; + bottom: 40px; + left: 57px; + width: 120px; + height: 16px; + font-size: 12px; + font-weight: bold; + color: #595959; + overflow: hidden; +} + +.component-dropdownbox__item__remark { + position: relative; + bottom: 32px; + left: 57px; + width: 120px; + height: 16px; + font-size: 12px; + color: #919191; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-dropdownbox__content--chart { + display: none; +} +/**下拉选择器组件**/ +.component-selecttool { + width: 100%; + height: 100%; + font-size: 12px; +} + +.component-selecttool__lable--describe { + display: inline-block; + margin-bottom: 5px; + max-width: 100%; + height: 16px; + font-size: 12px; + color: #595959; + font-weight: 400; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.component-selecttool, +.component-selecttool .component-selecttool__content { + width: 100%; + left: 0; + min-height: 28px; +} + +.component-selecttool__scrollarea__content { + margin-top: 0; + margin-left: 0; + padding-bottom: 5px; +} + +.component-selecttool__option { + width: 99%; + height: 17px; + line-height: 20px; + padding: 5px 8px 7px 8px; + font-size: 12px; + color: #595959; + cursor: pointer; + background: white; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-selecttool__option:hover { + background-color: #E6F9FF; +} + +.component-selecttool .component-selecttool--chart { + left: 0; + height: 26px; + position: relative; +} + +.component-selecttool--chart { + height: 28px; + width: 192px; + background: #FFFFFF; + border: 1px solid #D9D9D9; + border-radius: 2px; + padding-left: 8px; + font-size: 12px; + color: #595959; +} + +/* test */ +.component-selecttool--chart:hover { + border: 1px solid #108EE9; +} + +.component-selecttool__name { + width: 170px; + height: 26px; + line-height: 26px; + overflow: hidden; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-selecttool__trianglebtn--chart { + position: relative; + bottom: 18px; + left: 173px; + width: 13px; + height: 10px; + cursor: pointer; +} + +.component-selecttool__trianglebtn--chart > div { + width: 100%; + height: 100%; +} + +.component-selecttool__content { + position: absolute; + left: 0; + top: 30px; + width: 200px; + padding: 5px 0 0; + background: #fff; + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .15); + border-radius: 2px; + z-index: 10000; + display: none; + overflow: hidden scroll; + max-height: 200px; +} + +.component-selecttool__content--chart { + width: 186px; +} + +::-webkit-scrollbar { + width: 6px; + height: 6px; + background-color: rgb(255, 255, 255); +} + +::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: rgb(200, 204, 209); +} +/**CityTabsPage 样式**/ +.component-tabpage { + width: 488px; + margin: 3px auto 0 auto; + box-shadow: 0 1px 3px rgba(0, 0, 0, .2); +} + +/*header*/ +.component-tabpage ul { + margin: 0; + padding: 0; + height: 39px; + line-height: 31px; + overflow: hidden; +} + +.component-tabpage ul li { + float: left; + list-style: none; + padding: 7px 7px 0 7px; + border-bottom: 1px solid transparent; + cursor: pointer; + display: inline; + color: #0083CB; +} + +.component-tabpage ul li.on { + border-bottom-color: #0083cb; + position: relative; +} + +/*content*/ +.component-tabpage__content { + border-top: 1px solid #DDD; + margin-top: -1px; + clear: left; + overflow: hidden; + padding-bottom: 10px; + padding-top: 10px; +} + +.component-tabpage__content div { + float: left; +} + +/** CityTabsPage 样式**/ +.component-citytabpage--noneBoxShadow { + box-shadow: none; +} + +.component-citytabpag__py-key { + display: inline-block; + padding-left: 7px; + font-weight: bold; + font-size: 12px; + color: #0083CB; + vertical-align: top; +} + +.component-citytabpag__content { + margin-left: 14px; + max-width: 450px; +} + +.component-citytabpag__content > span { + display: inline-block; + float: left; + height: 18px; + line-height: 18px; + margin: 8px 24px 8px 0; + text-align: left; + cursor: pointer; +} + +.component-citytabpag__content > span:hover { + color: #0083CB; +} + +/** NavTabsPage 标签组件样式**/ +.component-navtabspage { + position: absolute; + overflow: hidden; + min-width: 520px; + background: #FFFFFF; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.26); + border-radius: 4px; + font-family: MicrosoftYaHei-Bold; + font-size: 12px; + color: #595959; + top: 44px; + right: 0; + z-index: 1000; +} + +.component-navtabspage .supermapol-icons-close { + position: absolute; + cursor: pointer; + top: 11px; + right: 15px; + color: #BFBFBF; +} + +.component-navtabspage__title { + height: 35px; + line-height: 36px; + background-color: #F5F5F5; + box-shadow: 0 1px 0 0 #E9E9E9; +} + +.component-navtabspage__title > span { + float: left; + color: #919191; + cursor: pointer; + height: 100%; + width: 90px; + text-align: center; +} + +.component-navtabspage__title > span.component-navtabspage__tabs--select { + color: #595959; + background: white; + border-bottom: 2px solid transparent; +} + +/**分页组件样式**/ +.component-pagination { + line-height: normal; + width: 303px; + background: #FFFFFF; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.26); + border-radius: 4px; + max-height: 610px; +} + +.component-pagination__content { + max-height: 505px; +} + +.component-pagination__link { + display: table; + padding: 0; + margin: 10px auto; + text-align: center; +} + +.component-pagination__link li { + float: left; + display: inline; + width: 5px; + height: 10px; + list-style: none; + padding: 0 7px 7px 5px; + margin: 0 2px; + color: #0083CB; + cursor: pointer; + border-radius: 2px; + border-bottom: 1px solid transparent; +} + +.component-pagination__link li.disable { + color: #919191; +} + +.component-pagination__link li.disable:hover { + cursor: not-allowed; +} + +.component-pagination__link li.active { + color: #FFFFFF; + background-color: #0083CB; +} + +/**弹框组件样式**/ +.component-popcontainer { + /*width: 300px;*/ + background-color: #fff; + box-shadow: 1px 2px 1px 0 rgba(0, 0, 0, 0.15); +} + +.component-popcontainer__header { + position: relative; + width: 100%; + height: 36px; + background-color: #0083cb; + left: 0; + top: 0; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +.component-popcontainer__header__title { + color: #fff; + font-size: 14px; + margin-left: 16px; + margin-bottom: 0; + overflow: hidden; + font-weight: bold; + line-height: 36px; + text-overflow: ellipsis; +} + +.component-popcontainer__header__close { + position: absolute; + right: 10px; + top: 10px; + font-size: 15px; + color: #fff; + opacity: 0.6; + cursor: pointer; + z-index: 1000; +} + +/*.component-pop-delete:hover { + opacity: 1; +}*/ + +.component-popcontainer__content { + position: relative; + /*padding: 5px 16px;*/ + max-height: 200px; + overflow-x: hidden; + overflow-y: overlay; + padding-bottom: 15px; +} + +.component-popcontainer__content__table { + font-size: 12px; + line-height: 18px; + word-wrap: break-word; + color: #919191; + border-spacing: 0; + border-collapse: collapse; +} + +.component-popcontainer__content__table span { + display: inline-block; + color: #595959; + overflow: hidden; + max-width: 133px; + text-overflow: ellipsis; + font-weight: bold; +} + +.component-popcontainer__content__table td { + /*width: 50%;*/ + min-height: 28px; + padding: 4px 18px; +} + +.component-popcontainer__content__td--color{ + background-color: #f9f9f9; +} +/**分析组件公共样式**/ +.hidden, +.display_none { + display: none; +} + +/**分析面板滚动条**/ +.component-content--scroll { + max-height: 500px; + overflow: auto; + padding: 16px 10px 16px 16px; + font-size: 12px; + overflow-x: hidden; +} + +/**分析组件相关样式**/ +.component-analysis { + position: absolute; + right: 10px; + top: 32px; + font-size: 12px; +} + +.component-content--analysis { + font-size: 12px; + padding: 16px 10px 16px 16px; +} + +.component-analysis__container__analysisbtn { + position: relative; + font-size: 12px; + margin-bottom: 12px; + margin-top: 16px; + z-index: 100; +} + +.component-analysis__container .component-textarea { + display: block; + width: 183px; + margin-top: 8px; + padding-left: 8px; + padding-right: 8px; + outline: none; + font-size: 12px; + color: #595959; + letter-spacing: 0.14px; + background: #FFFFFF; + border: 1px solid #D9D9D9; + border-radius: 2px; +} + +.component-analysis__container span, +.component-analysis__container input, +.component-analysis__container select { + display: block; + color: #595959; + letter-spacing: 0.14px; +} + +.component-analysis__container input, +.component-analysis__container select { + margin-top: 8px; + height: 28px; + width: 183px; + padding-left: 8px; + padding-right: 8px; + background: #FFFFFF; + border: 1px solid #D9D9D9; + border-radius: 2px; + outline: none; + font-size: 12px; + /* margin-bottom: 16px; */ +} + +.component-analysis__container input:hover, +.component-analysis__container select:hover { + border: 1px solid #108EE9; +} + +.component-analysis__container .component-textarea:hover { + border: 1px solid #108EE9; +} + +.component-analysis__container input:focus, +.component-analysis__container select:focus, +.component-textarea:focus { + border: 1px solid #108EE9; +} + +.component-analysis__container__selectpram .clip-layer, +.component-analysis__container__selectpram .operateLayer, +.component-analysis__container__analysisLayer { + margin-bottom: 16px; +} + +.component-clientcomputation__buffer > div, .component-clientcomputation__isoline > div { + margin-bottom: 16px; +} + +/* 分析按钮 */ +.component-analysis__analysisbtn button { + border: none; + border-radius: 2px; + color: #FFFFFF; + padding-right: 0; + line-height: 2em; + text-transform: none; + +} + +.component-analysis__analysisbtn button.disabled { + cursor: not-allowed; + background-color: #80B5CF; +} + +.component-analysis__analysisbtn--analysis, +.component-analysis__analysisbtn--analysising-container { + width: 100%; + height: 28px; + padding-right: 0; + background: #108EE9; + outline: none; +} + +.component-analysis__analysisbtn--analysis:hover { + background: #38ADF5; +} + +.component-analysis__analysisbtn--analysising { + position: relative; + width: 64%; + height: 28px; + line-height: 28px; + /* padding-left: 25px; */ + display: inline-block; + border-radius: 2px; + background: #38ADF5; + cursor: not-allowed; + text-align: center; + vertical-align: bottom; +} + +.component-analysis__analysisbtn--cancel { + width: 29%; + height: 28px; + margin-left: 12px; + padding-left: 0; + line-height: 27px; + text-align: center; + background: #485465; +} + +.component-analysis__analysisbtn--cancel:hover { + background: #747D8A; +} + +.component-analysis__analysisbtn--cancel:focus { + background: #3E4857; + outline: none; +} + +.component-analysis__analysisbtn--analysising span { + position: relative; + /* left: 30px; */ + height: 28px; + line-height: 28px; + vertical-align: bottom; + display: inline-block; + margin-left: 10px; + color: #FFFFFF; +} + +.component-analysis__svg-container { + position: relative; + /* left: 30px; */ + /* top: 4px; */ + display: inline-block; + cursor: not-allowed; + vertical-align: bottom; +} + +svg:not(:root) { + overflow: hidden; +} + +.component-analysis__svg-rotate { + position: relative; + top: 4px; + animation-name: svgrotate; + animation-duration: 1s; + animation-iteration-count: infinite; + animation-timing-function: linear; + -ms-animation-name: svgrotate; + -ms-animation-duration: 1s; + -ms-animation-iteration-count: infinite; + -ms-animation-timing-function: linear; + -moz-animation-name: svgrotate; + -moz-animation-duration: 1s; + -moz-animation-iteration-count: infinite; + -moz-animation-timing-function: linear; + -webkit-animation-name: svgrotate; + -webkit-animation-duration: 1s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; +} + +@keyframes svgrotate { + 0% { + -webkit-transform: rotate(0deg) translateZ(0); + transform: rotate(0deg) translateZ(0); + } + 50% { + -webkit-transform: rotate(180deg) translateZ(0); + transform: rotate(180deg) translateZ(0); + } + 100% { + -webkit-transform: rotate(1turn) translateZ(0); + transform: rotate(1turn) translateZ(0); + } +} + +@-webkit-keyframes svgrotate { + 0% { + -webkit-transform: rotate(0deg) translateZ(0); + transform: rotate(0deg) translateZ(0); + } + 50% { + -webkit-transform: rotate(180deg) translateZ(0); + transform: rotate(180deg) translateZ(0); + } + 100% { + -webkit-transform: rotate(1turn) translateZ(0); + transform: rotate(1turn) translateZ(0); + } +} + +@-moz-keyframes svgrotate { + 0% { + -webkit-transform: rotate(0deg) translateZ(0); + transform: rotate(0deg) translateZ(0); + } + 50% { + -webkit-transform: rotate(180deg) translateZ(0); + transform: rotate(180deg) translateZ(0); + } + 100% { + -webkit-transform: rotate(1turn) translateZ(0); + transform: rotate(1turn) translateZ(0); + } +} + +select.component-select-options { + width: 202px; + height: 28px; + margin-top: -3px; + margin-bottom: 16px; +} + +select.component-select-options > option { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.component-content--scroll::-webkit-scrollbar { + width: 6px; + height: 6px; + background-color: #F5F5F5; +} + +.component-content--scroll::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: rgb(191, 195, 201); +} + +.component-content--analysis .component-selecttool { + margin-bottom: 16px; +} + +.component-analysis__analysisbtn--deletelayers { + margin-top: 10px; +} +/**分布式分析样式**/ +.component-distributeanalysis__input { + height: 24px; + margin-bottom: 16px; +} +/**客户端分析样式**/ +/**-----------分析面板滚动条----------------*/ +.component-textarea { + height: 200px; + padding-right: 0; + overflow: hidden; +} + +.component-scrollarea-content { + margin-top: 0; + margin-left: 0; + overflow: visible; + width: 188px; + min-height: 28px; +} + +.component-textarea__content { + overflow: scroll; + text-align: left; + font-family: "Microsoft Yahei"; + line-height: 1; + height: 200px; + color: rgb(89, 89, 89); + letter-spacing: 0.14px; + border: 0; + width: 96%; + font-size: 12px; +} + +.component-textarea__content:focus { + border: 1px solid transparent; + outline: none; +} + +/* 缓冲区 */ +.component-clientcomputation__buffer--radius > div { + line-height: 28px; + margin-top: 8px; + vertical-align: middle; + margin-bottom: 16px; +} + +.component-clientcomputation__buffer--radius > div > input { + width: 112px; + height: 24px; + margin-right: 5px; + margin-top: 0; + display: inline-block; +} + +.component-clientcomputation__buffer--unit { + position: relative; + width: 62px; + height: 28px; + display: inline-block; + vertical-align: bottom; +} + +/* --------- 复选框 保留原对象字段属性 start --------- */ +.component-clientcomputation__buffer--isunion .checkbox, +.component-clientcomputation__buffer--issaveattrs .checkbox { + position: absolute; + margin-top: 1px; + height: 14px; + width: 14px; +} + +.component-clientcomputation__buffer--isunion .lable, +.component-clientcomputation__buffer--issaveattrs .lable { + margin-left: 20px; + line-height: 16px; + font-size: 12px; + color: #919191; +} + +.component-clientcomputation__buffer--isunion, +.component-clientcomputation__buffer--issaveattrs { + height: 16px; + width: 100%; + margin-top: 8px; + position: relative; +} + +/* -------- 复选框两种状态随意切换 -------- */ +.component-clientcomputation__buffer--isunion .checkbox-fault, +.component-clientcomputation__buffer--issaveattrs .checkbox-fault { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAKxJREFUKBXVU8ENwyAMxObDBB0qU2SzTtFhADFAswA8EC1HigoE8eivfhBz5zvZFiHn3BZjfAit9QtBSJj5INwEolIAEJnlozD5CCGIoqnAV5cRrii+3eXienqfZ1/ZelxsBpKstc+U0m3AhZRy61prC4wxQ3ctm/PfG1orsb1ZlA1jFO99u5hljlpoGPMrpWbGUwy10Cx7nSo/4B8JCS8+D3ufPZLZjOVfINrfB86l+5fF8g4AAAAASUVORK5CYII=) no-repeat center; +} + +.component-clientcomputation__buffer--isunion .checkbox-active, +.component-clientcomputation__buffer--issaveattrs .checkbox-active { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAXdJREFUKBWFUr8vQ1EU/u7rK61I9bbRQWIgEWI0iIkYWzGIIF1Ewsbib7BXYjJYDAxCYqCd7BYSMYmNSGilbSR+9rXXPef2vb6Kpmc495zzne/e8+MKuZ1PKqWyFqkuGxDRzIsSEI/ix6mpxE7BRKClMwB8VwGLYAqQQ8IcY2rUNUqbCeM8bfRCv9Oc1sRxKe7Jd6RHQxjoCSCsq6IrqDoSj3k6H8XcSRnKxA0oM/kHBdXvi7FpBUTS+g8gtFZVOa9ul3m7GsdeKmLYpKkhkou0xOtnDWvZN/aZeV90cLUSg6296cMSA6QYHN8vYlDamDpoAB5IBo3HL7yAVq34E//aRGzZpj85qAu7XI4h0iE4TKOpD9ikhfS2v+oLpgit4XxRYjhm4043q3+HSdTaI66PhbE12Y3rZwezxyWcLUiMxG3QdIZ2C/hwPA4b3i7Jm+gLIrckGbjJVzBzVMZ7pfEKA3XVRPQD7WxLCJFyP3C7ZMJ5ovrz/AKWB4FZ7esInwAAAABJRU5ErkJggg==) no-repeat center; +} + +/* -------- 合并缓冲区 start -------- */ +.component-clientcomputation__buffer--isunion .selected, +.component-clientcomputation__buffer--issaveattrs .selected { + color: #595959 !important; +} + +/* -------- end -------- */ +.component-clientcomputation__buffer--unit .component-select-options { + width: 100%; + outline: none; +} + +.component-clientcomputation__buffer--unit .__selecttool { + width: 65px; +} + +.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__name { + width: 32px; +} + +.component-clientcomputation__buffer--unit .component-selecttool__trianglebtn--chart { + left: 39px; +} + +.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__content--chart { + width: 62px; +} + +.component-clientcomputation__buffer--unit .component-selecttool--chart { + width: 57px; +} + +.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__content { + overflow: unset; +} + +.component-clientcomputation__buffer--unit .component-selecttool__scrollarea__content .component-selecttool__option { + width: unset; +} + +.component-servicequery__rangeicon { + /* display: inline-block; */ + width: 12px; + height: 12px; + cursor: pointer; + border: 1px solid #d9d9d9; + padding: 5px; + color: #0083CB; +} + +.component-servicequery__rangeicon.bounds { + position: relative; + top: -47px; +} + +.component-textarea.component-textarea--rangequery { + height: 70px; + padding-left: 5px; + display: inline-block; + width: 76%; +} + +.component-textarea .component-textarea--rangequery__content { + height: 73px; + width: 85%; +} + +.component-servicequery__rangeicon-container { + display: inline-block; + margin-right: 5px; + position: relative; + bottom: 8px; +} + +.component-servicequery__spatialquerymode-container { + margin-top: 16px; +} + +.component-servicequery__spatialquerymode__selectcontent { + margin-bottom: 16px; +} + +.component-content-container.component-scroll-content.data-services { + padding-bottom: 0; + height: unset; +} + +.component-servicequery__container.component-container { + position: absolute; + right: 17px; + top: 110px; + font-size: 12px; +} + +.component-servicequery__title { + font-size: 12px; +} + +.component-textarea--dataservice__container { + margin-top: 16px; +} + +.component-servicequery__analysistype { + margin-top: 0; +} + +.component-textarea.component-textarea--dataservice { + height: 40px; + padding-left: 5px; + width: unset; +} + +.component-textarea--dataservice textarea { + height: 43px; + padding-left: 5px; +} + +.component-servicequery__maxfeatures-container { + margin-top: 16px; +} + +.component-servicequery__distance-container { + margin-top: 16px; +} + +.component-analysis__analysisbtn--analysising.component-servicequery__querybtn--querying { + width: 100%; +} + +.component-servicequery__querymode-selectname { + /* font-weight: bolder; */ + margin: 8px 0 0 0; + border: 1px solid #D9D9D9; + padding: 5px 5px 5px 7px; + background: #d4d1d13d; +} + +.component-servicequery__rangeicon:hover { + border: 1px solid #108EE9; +} + +.leaflet-control-ctv { + box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.4); + background: none repeat scroll 0% 0% #FFF; + border: 1px solid #dddddd; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +a.leaflet-control-ctv-toggle { + width: 34px; + height: 34px; + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + line-height: 34px !important; + font-weight: bolder; + text-align: center; + text-decoration: none; + color: #000; + font-size: 1.3em; +} + +.leaflet-control-ctv p.leaflet-control-ctv-value { + line-height: 26px; + text-align: center; + text-decoration: none; + color: #000; + font-weight: bold; + font-size: 1.1em; + display: none; + overflow: hidden; + text-overflow: ellipsis; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal p.leaflet-control-ctv-value { + line-height: 34px; + height: 34px; + margin: 0px 0px 0px 0px; + border-right: 1px solid #CCC; + min-width: 35px; + max-width: 100px; + float: left; + clear: none; + white-space: nowrap; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical p.leaflet-control-ctv-value { + min-height: 25px; + max-height: 100px; + line-height: 26px; + margin: 0px 0px 5px 0px; + border-bottom: 1px solid #CCC; + width: 34px; + white-space: pre-wrap; +} + +.leaflet-control-ctv input.leaflet-ctv-slider { + margin: 0px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-main { + display: inline; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-main { + display: block; +} + +.leaflet-control-ctv input.leaflet-ctv-slider, +.leaflet-control-ctv .leaflet-ctv-slider-container { + display: none; + padding: 0px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-container { + float: right; + clear: none; + width: 90%; + height: 34px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal input.leaflet-ctv-slider { + height: 34px; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical input.leaflet-ctv-slider { + writing-mode: bt-lr; + width: 34px; + height: 100%; +} + +.leaflet-control-ctv.leaflet-control-ctv-expanded p.leaflet-control-ctv-value { + display: block; +} + +.leaflet-control-ctv.leaflet-control-ctv-expanded a.leaflet-control-ctv-toggle { + display: none; +} + +.leaflet-control-ctv.leaflet-control-ctv-expanded input.leaflet-ctv-slider, +.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-container { + display: inherit; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-container { + width: 34px; + transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-container { + margin: 10px 0px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-container { + margin: 0px 10px; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical.leaflet-control-ctv-incdec .leaflet-ctv-slider-container { + margin: 0px 0px; +} + +.leaflet-control-ctv input[type=range] { + -webkit-appearance: none; + width: 100%; +} + +.leaflet-control-ctv input[type=range]:focus { + outline: none; +} + +.leaflet-control-ctv input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 5px; + cursor: pointer; + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); + background: #dddddd; + border-radius: 25px; + border: 0px solid rgba(0, 0, 0, 0); +} + +.leaflet-control-ctv input[type=range]::-webkit-slider-thumb { + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); + border: 0px solid rgba(0, 0, 0, 0); + height: 16px; + width: 16px; + border-radius: 8px; + background: #a4a4a4; + cursor: pointer; + -webkit-appearance: none; + margin-top: -5.5px; +} + +.leaflet-control-ctv input[type=range]:focus::-webkit-slider-runnable-track { + background: #eaeaea; +} + +.leaflet-control-ctv input[type=range]::-moz-range-track { + width: 100%; + height: 5px; + cursor: pointer; + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); + background: #dddddd; + border-radius: 25px; + border: 0px solid rgba(0, 0, 0, 0); +} + +.leaflet-control-ctv input[type=range]::-moz-range-thumb { + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); + border: 0px solid rgba(0, 0, 0, 0); + height: 16px; + width: 16px; + border-radius: 8px; + background: #a4a4a4; + cursor: pointer; +} + +.leaflet-control-ctv input[type=range]::-ms-track { + width: 100%; + height: 5px; + cursor: pointer; + background: transparent; + border-color: transparent; + color: transparent; +} + +.leaflet-control-ctv input[type=range]::-ms-fill-lower { + background: #d0d0d0; + border: 0px solid rgba(0, 0, 0, 0); + border-radius: 50px; + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); +} + +.leaflet-control-ctv input[type=range]::-ms-fill-upper { + background: #dddddd; + border: 0px solid rgba(0, 0, 0, 0); + border-radius: 50px; + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); +} + +.leaflet-control-ctv input[type=range]::-ms-thumb { + box-shadow: 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px rgba(13, 13, 13, 0); + border: 0px solid rgba(0, 0, 0, 0); + width: 16px; + border-radius: 8px; + background: #a4a4a4; + cursor: pointer; + height: 5px; +} + +.leaflet-control-ctv input[type=range]:focus::-ms-fill-lower { + background: #dddddd; +} + +.leaflet-control-ctv input[type=range]:focus::-ms-fill-upper { + background: #eaeaea; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical input[type=range]::-moz-range-track { + height: 100%; + width: 5px; +} + +.leaflet-ctv-slider-next, .leaflet-ctv-slider-last { + width: 34px; + height: 34px; + background-position: 50% 50%; + background-repeat: no-repeat; + line-height: 32px !important; + font-weight: bolder; + text-align: center; + vertical-align: middle; + text-decoration: none; + color: #000; + font-size: 1.3em; + display: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-next, +.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-last { + display: block; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-next, +.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-last { + float: right; +} + +.leaflet-control-ctv input[type=range]::-moz-focus-outer { + border: 0; +} + +.leaflet-ctv-slider-incdec { + cursor: pointer; +} + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + .leaflet-control-ctv.leaflet-control-ctv-vertical input[type=range] { + transform-origin: 17px 17px; + -webkit-transform-origin: 17px 17px; + -moz-transform-origin: 17px 17px; + transform: rotate(90deg); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + height: 34px; + } +} + +.leaflet-control-ctv .tooltip .tooltip-text { + display: none; + width: 120px; + background-color: black; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 0; + position: absolute; + z-index: 1; +} + +.leaflet-control-ctv .tooltip .tooltip-text::after { + content: ""; + position: absolute; + margin-left: -5px; + border-width: 5px; + border-style: solid; +} + +/* 提示在下侧 */ +.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-bottom { + top: 120%; + left: 50%; + margin-left: -60px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-bottom::after { + bottom: 100%; + left: 50%; + border-color: transparent transparent black transparent; +} + +/* 提示在上侧 */ +.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-top { + bottom: 120%; + left: 50%; + margin-left: -60px; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-top::after { + top: 100%; + left: 50%; + border-color: black transparent transparent transparent; +} + +/* 提示在右侧 */ +.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-right { + top: 50%; + left: 120%; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-right::after { + top: 33%; + right: 100%; + border-color: transparent black transparent transparent; +} + +/* 提示在左侧 */ +.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-left { + top: 50%; + right: 110%; +} + +.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-left::after { + top: 33%; + left: 104%; + border-color: transparent transparent transparent black; +} + +.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip:hover .tooltip-text, +.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip:hover .tooltip-text { + display: block; +} diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.js b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.js new file mode 100644 index 00000000..cb3d28db --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.js @@ -0,0 +1,116468 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */ +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 525: +/***/ (function(module) { + +"use strict"; + + +module.exports = Point; +/** + * A standalone point geometry with useful accessor, comparison, and + * modification methods. + * + * @class Point + * @param {Number} x the x-coordinate. this could be longitude or screen + * pixels, or any other sort of unit. + * @param {Number} y the y-coordinate. this could be latitude or screen + * pixels, or any other sort of unit. + * @example + * var point = new Point(-77, 38); + */ + +function Point(x, y) { + this.x = x; + this.y = y; +} + +Point.prototype = { + /** + * Clone this point, returning a new point that can be modified + * without affecting the old one. + * @return {Point} the clone + */ + clone: function clone() { + return new Point(this.x, this.y); + }, + + /** + * Add this point's x & y coordinates to another point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + add: function add(p) { + return this.clone()._add(p); + }, + + /** + * Subtract this point's x & y coordinates to from point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + sub: function sub(p) { + return this.clone()._sub(p); + }, + + /** + * Multiply this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + multByPoint: function multByPoint(p) { + return this.clone()._multByPoint(p); + }, + + /** + * Divide this point's x & y coordinates by point, + * yielding a new point. + * @param {Point} p the other point + * @return {Point} output point + */ + divByPoint: function divByPoint(p) { + return this.clone()._divByPoint(p); + }, + + /** + * Multiply this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + mult: function mult(k) { + return this.clone()._mult(k); + }, + + /** + * Divide this point's x & y coordinates by a factor, + * yielding a new point. + * @param {Point} k factor + * @return {Point} output point + */ + div: function div(k) { + return this.clone()._div(k); + }, + + /** + * Rotate this point around the 0, 0 origin by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @return {Point} output point + */ + rotate: function rotate(a) { + return this.clone()._rotate(a); + }, + + /** + * Rotate this point around p point by an angle a, + * given in radians + * @param {Number} a angle to rotate around, in radians + * @param {Point} p Point to rotate around + * @return {Point} output point + */ + rotateAround: function rotateAround(a, p) { + return this.clone()._rotateAround(a, p); + }, + + /** + * Multiply this point by a 4x1 transformation matrix + * @param {Array} m transformation matrix + * @return {Point} output point + */ + matMult: function matMult(m) { + return this.clone()._matMult(m); + }, + + /** + * Calculate this point but as a unit vector from 0, 0, meaning + * that the distance from the resulting point to the 0, 0 + * coordinate will be equal to 1 and the angle from the resulting + * point to the 0, 0 coordinate will be the same as before. + * @return {Point} unit vector point + */ + unit: function unit() { + return this.clone()._unit(); + }, + + /** + * Compute a perpendicular point, where the new y coordinate + * is the old x coordinate and the new x coordinate is the old y + * coordinate multiplied by -1 + * @return {Point} perpendicular point + */ + perp: function perp() { + return this.clone()._perp(); + }, + + /** + * Return a version of this point with the x & y coordinates + * rounded to integers. + * @return {Point} rounded point + */ + round: function round() { + return this.clone()._round(); + }, + + /** + * Return the magitude of this point: this is the Euclidean + * distance from the 0, 0 coordinate to this point's x and y + * coordinates. + * @return {Number} magnitude + */ + mag: function mag() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + /** + * Judge whether this point is equal to another point, returning + * true or false. + * @param {Point} other the other point + * @return {boolean} whether the points are equal + */ + equals: function equals(other) { + return this.x === other.x && this.y === other.y; + }, + + /** + * Calculate the distance from this point to another point + * @param {Point} p the other point + * @return {Number} distance + */ + dist: function dist(p) { + return Math.sqrt(this.distSqr(p)); + }, + + /** + * Calculate the distance from this point to another point, + * without the square root step. Useful if you're comparing + * relative distances. + * @param {Point} p the other point + * @return {Number} distance + */ + distSqr: function distSqr(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + /** + * Get the angle from the 0, 0 coordinate to this point, in radians + * coordinates. + * @return {Number} angle + */ + angle: function angle() { + return Math.atan2(this.y, this.x); + }, + + /** + * Get the angle from this point to another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleTo: function angleTo(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + /** + * Get the angle between this point and another point, in radians + * @param {Point} b the other point + * @return {Number} angle + */ + angleWith: function angleWith(b) { + return this.angleWithSep(b.x, b.y); + }, + + /* + * Find the angle of the two vectors, solving the formula for + * the cross product a x b = |a||b|sin(θ) for θ. + * @param {Number} x the x-coordinate + * @param {Number} y the y-coordinate + * @return {Number} the angle in radians + */ + angleWithSep: function angleWithSep(x, y) { + return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y); + }, + _matMult: function _matMult(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + _add: function _add(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + _sub: function _sub(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + _mult: function _mult(k) { + this.x *= k; + this.y *= k; + return this; + }, + _div: function _div(k) { + this.x /= k; + this.y /= k; + return this; + }, + _multByPoint: function _multByPoint(p) { + this.x *= p.x; + this.y *= p.y; + return this; + }, + _divByPoint: function _divByPoint(p) { + this.x /= p.x; + this.y /= p.y; + return this; + }, + _unit: function _unit() { + this._div(this.mag()); + + return this; + }, + _perp: function _perp() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + _rotate: function _rotate(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + _rotateAround: function _rotateAround(angle, p) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), + y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y); + this.x = x; + this.y = y; + return this; + }, + _round: function _round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; +/** + * Construct a point from an array if necessary, otherwise if the input + * is already a Point, or an unknown type, return it unchanged + * @param {Array|Point|*} a any kind of input value + * @return {Point} constructed point, or passed-through value. + * @example + * // this + * var point = Point.convert([0, 1]); + * // is equivalent to + * var point = new Point(0, 1); + */ + +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + + return a; +}; + +/***/ }), + +/***/ 721: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +module.exports.VectorTile = __webpack_require__(473); +/* unused reexport */ __webpack_require__(233); +/* unused reexport */ __webpack_require__(557); + +/***/ }), + +/***/ 473: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var VectorTileLayer = __webpack_require__(557); + +module.exports = VectorTile; + +function VectorTile(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) layers[layer.name] = layer; + } +} + +/***/ }), + +/***/ 233: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var Point = __webpack_require__(525); + +module.exports = VectorTileFeature; + +function VectorTileFeature(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; // Private + + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) feature.id = pbf.readVarint();else if (tag == 2) readTag(pbf, feature);else if (tag == 3) feature.type = pbf.readVarint();else if (tag == 4) feature._geometry = pbf.pos; +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + + feature.properties[key] = value; + } +} + +VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature.prototype.loadGeometry = function () { + var pbf = this._pbf; + pbf.pos = this._geometry; + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (length <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { + // moveTo + if (line) lines.push(line); + line = []; + } + + line.push(new Point(x, y)); + } else if (cmd === 7) { + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) lines.push(line); + return lines; +}; + +VectorTileFeature.prototype.bbox = function () { + var pbf = this._pbf; + pbf.pos = this._geometry; + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (length <= 0) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) x1 = x; + if (x > x2) x2 = x; + if (y < y1) y1 = y; + if (y > y2) y2 = y; + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature.prototype.toGeoJSON = function (x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature.types[this.type], + i, + j; + + function project(line) { + for (var j = 0; j < line.length; j++) { + var p = line[j], + y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [(p.x + x0) * 360 / size - 180, 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90]; + } + } + + switch (this.type) { + case 1: + var points = []; + + for (i = 0; i < coords.length; i++) { + points[i] = coords[i][0]; + } + + coords = points; + project(coords); + break; + + case 2: + for (i = 0; i < coords.length; i++) { + project(coords[i]); + } + + break; + + case 3: + coords = classifyRings(coords); + + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + project(coords[i][j]); + } + } + + break; + } + + if (coords.length === 1) { + coords = coords[0]; + } else { + type = 'Multi' + type; + } + + var result = { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; + + if ('id' in this) { + result.id = this.id; + } + + return result; +}; // classifies an array of rings into polygons with outer rings and holes + + +function classifyRings(rings) { + var len = rings.length; + if (len <= 1) return [rings]; + var polygons = [], + polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = signedArea(rings[i]); + if (area === 0) continue; + if (ccw === undefined) ccw = area < 0; + + if (ccw === area < 0) { + if (polygon) polygons.push(polygon); + polygon = [rings[i]]; + } else { + polygon.push(rings[i]); + } + } + + if (polygon) polygons.push(polygon); + return polygons; +} + +function signedArea(ring) { + var sum = 0; + + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + + return sum; +} + +/***/ }), + +/***/ 557: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var VectorTileFeature = __webpack_require__(233); + +module.exports = VectorTileLayer; + +function VectorTileLayer(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; // Private + + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + pbf.readFields(readLayer, this, end); + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) layer.version = pbf.readVarint();else if (tag === 1) layer.name = pbf.readString();else if (tag === 5) layer.extent = pbf.readVarint();else if (tag === 2) layer._features.push(pbf.pos);else if (tag === 3) layer._keys.push(pbf.readString());else if (tag === 4) layer._values.push(readValueMessage(pbf)); +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} // return feature `i` from this layer as a `VectorTileFeature` + + +VectorTileLayer.prototype.feature = function (i) { + if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + + return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); +}; + +/***/ }), + +/***/ 937: +/***/ (function(module) { + +(function (self) { + 'use strict'; // if __disableNativeFetch is set to true, the it will always polyfill fetch + // with Ajax. + + if (!self.__disableNativeFetch && self.fetch) { + return; + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name); + } + + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name'); + } + + return name.toLowerCase(); + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value); + } + + return value; + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers) { + headers.forEach(function (value, name) { + this.append(name, value); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function (name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function (name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var list = this.map[name]; + + if (!list) { + list = []; + this.map[name] = list; + } + + list.push(value); + }; + + Headers.prototype['delete'] = function (name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function (name) { + var values = this.map[normalizeName(name)]; + return values ? values[0] : null; + }; + + Headers.prototype.getAll = function (name) { + return this.map[normalizeName(name)] || []; + }; + + Headers.prototype.has = function (name) { + return this.map.hasOwnProperty(normalizeName(name)); + }; + + Headers.prototype.set = function (name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)]; + }; + + Headers.prototype.forEach = function (callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function (name) { + this.map[name].forEach(function (value) { + callback.call(thisArg, value, name, this); + }, this); + }, this); + }; + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')); + } + + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function (resolve, reject) { + reader.onload = function () { + resolve(reader.result); + }; + + reader.onerror = function () { + reject(reader.error); + }; + }); + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + reader.readAsArrayBuffer(blob); + return fileReaderReady(reader); + } + + function readBlobAsText(blob, options) { + var reader = new FileReader(); + var contentType = options.headers.map['content-type'] ? options.headers.map['content-type'].toString() : ''; + var regex = /charset\=[0-9a-zA-Z\-\_]*;?/; + + var _charset = blob.type.match(regex) || contentType.match(regex); + + var args = [blob]; + + if (_charset) { + args.push(_charset[0].replace(/^charset\=/, '').replace(/;$/, '')); + } + + reader.readAsText.apply(reader, args); + return fileReaderReady(reader); + } + + var support = { + blob: 'FileReader' in self && 'Blob' in self && function () { + try { + new Blob(); + return true; + } catch (e) { + return false; + } + }(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + }; + + function Body() { + this.bodyUsed = false; + + this._initBody = function (body, options) { + this._bodyInit = body; + + if (typeof body === 'string') { + this._bodyText = body; + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body; + this._options = options; + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body; + } else if (!body) { + this._bodyText = ''; + } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {// Only support ArrayBuffers for POST method. + // Receiving ArrayBuffers happens via Blobs, instead. + } else { + throw new Error('unsupported BodyInit type'); + } + }; + + if (support.blob) { + this.blob = function () { + var rejected = consumed(this); + + if (rejected) { + return rejected; + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob); + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob'); + } else { + return Promise.resolve(new Blob([this._bodyText])); + } + }; + + this.arrayBuffer = function () { + return this.blob().then(readBlobAsArrayBuffer); + }; + + this.text = function () { + var rejected = consumed(this); + + if (rejected) { + return rejected; + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob, this._options); + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text'); + } else { + return Promise.resolve(this._bodyText); + } + }; + } else { + this.text = function () { + var rejected = consumed(this); + return rejected ? rejected : Promise.resolve(this._bodyText); + }; + } + + if (support.formData) { + this.formData = function () { + return this.text().then(decode); + }; + } + + this.json = function () { + return this.text().then(JSON.parse); + }; + + return this; + } // HTTP methods whose capitalization should be normalized + + + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return methods.indexOf(upcased) > -1 ? upcased : method; + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + + if (Request.prototype.isPrototypeOf(input)) { + if (input.bodyUsed) { + throw new TypeError('Already read'); + } + + this.url = input.url; + this.credentials = input.credentials; + + if (!options.headers) { + this.headers = new Headers(input.headers); + } + + this.method = input.method; + this.mode = input.mode; + + if (!body) { + body = input._bodyInit; + input.bodyUsed = true; + } + } else { + this.url = input; + } + + this.credentials = options.credentials || this.credentials || 'omit'; + + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers); + } + + this.method = normalizeMethod(options.method || this.method || 'GET'); + this.mode = options.mode || this.mode || null; + this.referrer = null; + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests'); + } + + this._initBody(body, options); + } + + Request.prototype.clone = function () { + return new Request(this); + }; + + function decode(body) { + var form = new FormData(); + body.trim().split('&').forEach(function (bytes) { + if (bytes) { + var split = bytes.split('='); + var name = split.shift().replace(/\+/g, ' '); + var value = split.join('=').replace(/\+/g, ' '); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form; + } + + function headers(xhr) { + var head = new Headers(); + var pairs = xhr.getAllResponseHeaders().trim().split('\n'); + pairs.forEach(function (header) { + var split = header.trim().split(':'); + var key = split.shift().trim(); + var value = split.join(':').trim(); + head.append(key, value); + }); + return head; + } + + Body.call(Request.prototype); + + function Response(bodyInit, options) { + if (!options) { + options = {}; + } + + this._initBody(bodyInit, options); + + this.type = 'default'; + this.status = options.status; + this.ok = this.status >= 200 && this.status < 300; + this.statusText = options.statusText; + this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers); + this.url = options.url || ''; + } + + Body.call(Response.prototype); + + Response.prototype.clone = function () { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }); + }; + + Response.error = function () { + var response = new Response(null, { + status: 0, + statusText: '' + }); + response.type = 'error'; + return response; + }; + + var redirectStatuses = [301, 302, 303, 307, 308]; + + Response.redirect = function (url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code'); + } + + return new Response(null, { + status: status, + headers: { + location: url + } + }); + }; + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function (input, init) { + return new Promise(function (resolve, reject) { + var request; + + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input; + } else { + request = new Request(input, init); + } + + var xhr = new XMLHttpRequest(); + + function responseURL() { + if ('responseURL' in xhr) { + return xhr.responseURL; + } // Avoid security warnings on getResponseHeader when not allowed by CORS + + + if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader('X-Request-URL'); + } + + return; + } + + var __onLoadHandled = false; + + function onload() { + if (xhr.readyState !== 4) { + return; + } + + var status = xhr.status === 1223 ? 204 : xhr.status; + + if (status < 100 || status > 599) { + if (__onLoadHandled) { + return; + } else { + __onLoadHandled = true; + } + + reject(new TypeError('Network request failed')); + return; + } + + var options = { + status: status, + statusText: xhr.statusText, + headers: headers(xhr), + url: responseURL() + }; + var body = 'response' in xhr ? xhr.response : xhr.responseText; + + if (__onLoadHandled) { + return; + } else { + __onLoadHandled = true; + } + + resolve(new Response(body, options)); + } + + xhr.onreadystatechange = onload; + xhr.onload = onload; + + xhr.onerror = function () { + if (__onLoadHandled) { + return; + } else { + __onLoadHandled = true; + } + + reject(new TypeError('Network request failed')); + }; + + xhr.open(request.method, request.url, true); // `withCredentials` should be setted after calling `.open` in IE10 + // http://stackoverflow.com/a/19667959/1219343 + + try { + if (request.credentials === 'include') { + if ('withCredentials' in xhr) { + xhr.withCredentials = true; + } else { + console && console.warn && console.warn('withCredentials is not supported, you can ignore this warning'); + } + } + } catch (e) { + console && console.warn && console.warn('set withCredentials error:' + e); + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob'; + } + + request.headers.forEach(function (value, name) { + xhr.setRequestHeader(name, value); + }); + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); + }); + }; + + self.fetch.polyfill = true; // Support CommonJS + + if ( true && module.exports) { + module.exports = self.fetch; + } +})(typeof self !== 'undefined' ? self : this); + +/***/ }), + +/***/ 238: +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var mod; } +})(this, function (exports, module) { + 'use strict'; + + var defaultOptions = { + timeout: 5000, + jsonpCallback: 'callback', + jsonpCallbackFunction: null + }; + + function generateCallbackFunction() { + return 'jsonp_' + Date.now() + '_' + Math.ceil(Math.random() * 100000); + } + + function clearFunction(functionName) { + // IE8 throws an exception when you try to delete a property on window + // http://stackoverflow.com/a/1824228/751089 + try { + delete window[functionName]; + } catch (e) { + window[functionName] = undefined; + } + } + + function removeScript(scriptId) { + var script = document.getElementById(scriptId); + + if (script) { + document.getElementsByTagName('head')[0].removeChild(script); + } + } + + function fetchJsonp(_url) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // to avoid param reassign + + var url = _url; + var timeout = options.timeout || defaultOptions.timeout; + var jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback; + var timeoutId = undefined; + return new Promise(function (resolve, reject) { + var callbackFunction = options.jsonpCallbackFunction || generateCallbackFunction(); + var scriptId = jsonpCallback + '_' + callbackFunction; + + window[callbackFunction] = function (response) { + resolve({ + ok: true, + // keep consistent with fetch API + json: function json() { + return Promise.resolve(response); + } + }); + if (timeoutId) clearTimeout(timeoutId); + removeScript(scriptId); + clearFunction(callbackFunction); + }; // Check if the user set their own params, and if not add a ? to start a list of params + + + url += url.indexOf('?') === -1 ? '?' : '&'; + var jsonpScript = document.createElement('script'); + jsonpScript.setAttribute('src', '' + url + jsonpCallback + '=' + callbackFunction); + + if (options.charset) { + jsonpScript.setAttribute('charset', options.charset); + } + + jsonpScript.id = scriptId; + document.getElementsByTagName('head')[0].appendChild(jsonpScript); + timeoutId = setTimeout(function () { + reject(new Error('JSONP request to ' + _url + ' timed out')); + clearFunction(callbackFunction); + removeScript(scriptId); + + window[callbackFunction] = function () { + clearFunction(callbackFunction); + }; + }, timeout); // Caught if got 404/500 + + jsonpScript.onerror = function () { + reject(new Error('JSONP request to ' + _url + ' failed')); + clearFunction(callbackFunction); + removeScript(scriptId); + if (timeoutId) clearTimeout(timeoutId); + }; + }); + } // export as global function + + /* + let local; + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + local.fetchJsonp = fetchJsonp; + */ + + + module.exports = fetchJsonp; +}); + +/***/ }), + +/***/ 299: +/***/ (function(__unused_webpack_module, exports) { + +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? nBytes - 1 : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + i += d; + e = s & (1 << -nBits) - 1; + s >>= -nBits; + nBits += eLen; + + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & (1 << -nBits) - 1; + e >>= -nBits; + nBits += mLen; + + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); +}; + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE ? 0 : nBytes - 1; + var d = isLE ? 1 : -1; + var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = e << mLen | m; + eLen += mLen; + + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; +}; + +/***/ }), + +/***/ 879: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } + +var utils = __webpack_require__(99); + +var AND = '&&', + OR = '||', + AND_STR = 'and', + OR_STR = 'or', + NOT = '!', + EQUAL = '=', + LIKE = '~', + NOTEQUAL = NOT + EQUAL, + NOTLIKE = NOT + LIKE, + GT = '>', + GE = '>=', + LT = '<', + LE = '<=', + WILDCARD = '*', + COMMA = ',', + DELIMITER = '.', + LEFT = '(', + RIGHT = ')', + WHERE = 'where', + synopsis = { + pathway: [], + groups: {} +}, + AST = {}, + options = {}; +var print = console.log; // ------------------ splitter -------------------- // + +function Tokenize(query) { + var parts = __splitTrim(query, WHERE); + + var pathway = parts[0]; + var where = parts[1]; + synopsis.pathway = __splitTrim(pathway, COMMA); + + for (var i = 0, len = synopsis.pathway.length; i < len; i++) { + synopsis.pathway[i] = __splitTrim(synopsis.pathway[i], DELIMITER); + if (synopsis.pathway[i][0] == WILDCARD) synopsis.pathway[i].shift(); + if (synopsis.pathway[i].length === 0) synopsis.pathway.splice(i, 1); + } + + var lastLeft = -1, + lastRight = -1, + current = 0; + + while (current < where.length) { + if (where[current] === LEFT) { + lastLeft = current; + } else if (where[current] === RIGHT) { + lastRight = current; + + if (lastRight > lastLeft && lastLeft !== -1) { + var k = 'gr' + '_' + new Date().getTime(); + synopsis.groups[k] = where.substring(lastLeft + 1, lastRight); + where = where.replace(LEFT + synopsis.groups[k] + RIGHT, k); + current = -1; + } + } + + current += 1; + } + + LogicalGrouping(AST, where); +} + +function LogicalGrouping(current, where) { + var lastAnd = __findIndex(where, AND), + lastOr = __findIndex(where, OR); + + if (lastAnd !== Number.MAX_VALUE || lastOr !== Number.MAX_VALUE) { + if (lastAnd < lastOr) { + current.and = current.and || []; + + var parts = __splitTrim(where, AND); + + current.and.push(parts[0]); + LogicalGrouping(current.and, parts[1]); + } else { + current.or = current.or || []; + + var parts = __splitTrim(where, OR); + + current.or.push(parts[0]); + LogicalGrouping(current.or, parts[1]); + } + } else { + if (synopsis.groups[where]) { + where = synopsis.groups[where]; + LogicalGrouping(current, where); + } else { + if (Array.isArray(current)) current.push(where);else current.or = [where]; + ExtractExpression(AST.or ? AST.or : AST.and); + } + } +} + +function ExtractExpression(logicalGroup) { + for (var k in logicalGroup) { + if (logicalGroup.hasOwnProperty(k)) { + if (Array.isArray(logicalGroup[k])) { + ExtractExpression(logicalGroup[k]); + } else if (typeof logicalGroup[k] === 'string') { + if (__contains(logicalGroup[k], NOTEQUAL)) { + var parts = __splitTrim(logicalGroup[k], NOTEQUAL); + + logicalGroup[k] = { + ne: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], NOTLIKE)) { + var parts = __splitTrim(logicalGroup[k], NOTLIKE); + + logicalGroup[k] = { + nreq: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], LIKE)) { + var parts = __splitTrim(logicalGroup[k], LIKE); + + logicalGroup[k] = { + // rough eq + req: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], GE)) { + var parts = __splitTrim(logicalGroup[k], GE); + + logicalGroup[k] = { + // greater than or equal + ge: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], GT)) { + var parts = __splitTrim(logicalGroup[k], GT); + + logicalGroup[k] = { + // greater than + gt: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], LE)) { + var parts = __splitTrim(logicalGroup[k], LE); + + logicalGroup[k] = { + // less than or equal + le: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], LT)) { + var parts = __splitTrim(logicalGroup[k], LT); + + logicalGroup[k] = { + // less than + lt: [parts[0], parts[1]] + }; + } else if (__contains(logicalGroup[k], EQUAL)) { + var parts = __splitTrim(logicalGroup[k], EQUAL); + + logicalGroup[k] = { + eq: [parts[0], parts[1]] + }; + } + } + } + } +} + +function __findIndex(str, token) { + var index = str.indexOf(token); + return index === -1 ? Number.MAX_VALUE : index; +} + +function __splitTrim(str, token) { + return str.split(token).map(function (p) { + return p.trim(); + }); +} + +function __contains(a, b) { + return a.indexOf(b) > -1; +} + +function __hierarchize(obj, dottedPath) { + var parts = __splitTrim(dottedPath, DELIMITER); + + var res = obj; + + for (var p in parts) { + if (res.hasOwnProperty(parts[p])) res = res[parts[p]];else return ''; + } // support comparison for Date/DateString + + + if (utils.isDate(res)) res = res.valueOf();else if (utils.isDateString(res)) res = utils.parseDateFromString(res);else res = res.toString(); + return res; +} + +function FilterOR(ASTNode, row) { + var res = false; + + for (var k in ASTNode) { + var filterFunc = k === AND_STR ? FilterAND : k === OR_STR ? FilterOR : Filter; + res = res || filterFunc(ASTNode[k], row); + if (options.trace) print(synopsis.step, '======((( or', ASTNode[k], res); + if (res) return res; + } + + return res; +} + +function FilterAND(ASTNode, row) { + var res = true; + + for (var k in ASTNode) { + var filterFunc = k === AND_STR ? FilterAND : k === OR_STR ? FilterOR : Filter; + res = res && filterFunc(ASTNode[k], row); + if (options.trace) print(synopsis.step, '======((( and', ASTNode[k], res); + if (!res) return res; + } + + return res; +} + +function Filter(ASTNode, row) { + synopsis.step += 1; + + if (ASTNode.or) { + var res = FilterOR(ASTNode.or, row); + if (options.trace) print(synopsis.step, 'OR', ASTNode, res); + return res; + } else if (ASTNode.and) { + var res = FilterAND(ASTNode.and, row); + if (options.trace) print(synopsis.step, 'AND', ASTNode, res); + return res; + } else if (_typeof(ASTNode) === 'object') { + if (ASTNode.eq) { + // = + return __hierarchize(row, ASTNode.eq[0]) === ASTNode.eq[1]; + } else if (ASTNode.ne) { + // != + return __hierarchize(row, ASTNode.ne[0]) !== ASTNode.ne[1]; + } else if (ASTNode.req) { + // ~ + return __contains(__hierarchize(row, ASTNode.req[0]), ASTNode.req[1]); + } else if (ASTNode.nreq) { + // ~ + return !__contains(__hierarchize(row, ASTNode.nreq[0]), ASTNode.nreq[1]); + } else if (ASTNode.gt) { + // > + return __hierarchize(row, ASTNode.gt[0]) > ASTNode.gt[1]; + } else if (ASTNode.ge) { + // >= + return __hierarchize(row, ASTNode.ge[0]) >= ASTNode.ge[1]; + } else if (ASTNode.lt) { + // < + return __hierarchize(row, ASTNode.lt[0]) < ASTNode.lt[1]; + } else if (ASTNode.le) { + // <= + return __hierarchize(row, ASTNode.le[0]) <= ASTNode.le[1]; + } else { + return Filter(ASTNode, row); + } + } +} + +function Parse(dataSource) { + var result = []; + + for (var k in dataSource) { + if (Filter(AST, dataSource[k])) result.push(dataSource[k]); + } + + return result; +} + +function Fields(result) { + if (result && synopsis.pathway.length > 0) { + //print(synopsis.pathway); + return result.map(function (ele) { + var res = {}; + + for (var i = 0, len = synopsis.pathway.length; i < len; i++) { + var key = synopsis.pathway[i].join(DELIMITER); + res[key] = __hierarchize(ele, key); + } + + return res; + }); + } + + return result; +} + +function Query(dataSource, query, opts) { + synopsis = { + pathway: [], + groups: {}, + step: 0 + }; + AST = {}; + opts = opts || { + trace: false + }; + options = opts; + Tokenize(query); + return Fields(Parse(dataSource)); +} + +if ( true && typeof module.exports != 'undefined') module.exports = Query; +if (typeof window != 'undefined') window.Query = Query; + +/***/ }), + +/***/ 99: +/***/ (function(module) { + +function getObjectType(obj) { + return Object.prototype.toString.call(obj); +} + +function isDate(obj) { + return getObjectType(obj) === '[object Date]'; +} + +function isString(obj) { + return getObjectType(obj) === '[object String]'; +} + +function isDateString(obj) { + return isString(obj) && !isNaN(Date.parse(obj)); +} + +function isNumber(obj) { + return typeof obj === 'number'; +} + +function parseDateFromString(str) { + return Date.parse(str); +} + +module.exports = { + getObjectType: getObjectType, + isDate: isDate, + isString: isString, + isDateString: isDateString, + parseDateFromString: parseDateFromString, + isNumber: isNumber +}; + +/***/ }), + +/***/ 820: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } + +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; +/** `Object#toString` result references. */ + +var argsTag = '[object Arguments]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; +var dataViewTag = '[object DataView]'; +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; +/** Used to detect host constructors (Safari). */ + +var reIsHostCtor = /^\[object .+?Constructor\]$/; +/** Used to detect unsigned integer values. */ + +var reIsUint = /^(?:0|[1-9]\d*)$/; +/** Detect free variable `global` from Node.js. */ + +var freeGlobal = (typeof __webpack_require__.g === "undefined" ? "undefined" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; +/** Detect free variable `self`. */ + +var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self; +/** Used as a reference to the global object. */ + +var root = freeGlobal || freeSelf || Function('return this')(); +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + +function arrayMap(array, iteratee) { + var index = -1, + length = array ? array.length : 0, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + + return result; +} +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + + +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + + return result; +} +/** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + + +function baseToPairs(object, props) { + return arrayMap(props, function (key) { + return [key, object[key]]; + }); +} +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + + +function getValue(object, key) { + return object == null ? undefined : object[key]; +} +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ + + +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + + return result; +} +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + + +function mapToArray(map) { + var index = -1, + result = Array(map.size); + map.forEach(function (value, key) { + result[++index] = [key, value]; + }); + return result; +} +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + + +function overArg(func, transform) { + return function (arg) { + return func(transform(arg)); + }; +} +/** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + + +function setToPairs(set) { + var index = -1, + result = Array(set.size); + set.forEach(function (value) { + result[++index] = [value, value]; + }); + return result; +} +/** Used for built-in method references. */ + + +var funcProto = Function.prototype, + objectProto = Object.prototype; +/** Used to detect overreaching core-js shims. */ + +var coreJsData = root['__core-js_shared__']; +/** Used to detect methods masquerading as native. */ + +var maskSrcKey = function () { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? 'Symbol(src)_1.' + uid : ''; +}(); +/** Used to resolve the decompiled source of functions. */ + + +var funcToString = funcProto.toString; +/** Used to check objects for own properties. */ + +var hasOwnProperty = objectProto.hasOwnProperty; +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + +var objectToString = objectProto.toString; +/** Used to detect if a method is native. */ + +var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'); +/** Built-in value references. */ + +var propertyIsEnumerable = objectProto.propertyIsEnumerable; +/* Built-in method references for those with the same name as other `lodash` methods. */ + +var nativeKeys = overArg(Object.keys, Object); +/* Built-in method references that are verified to be native. */ + +var DataView = getNative(root, 'DataView'), + Map = getNative(root, 'Map'), + Promise = getNative(root, 'Promise'), + Set = getNative(root, 'Set'), + WeakMap = getNative(root, 'WeakMap'); +/** Used to detect maps, sets, and weakmaps. */ + +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + +function arrayLikeKeys(value, inherited) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + // Safari 9 makes `arguments.length` enumerable in strict mode. + var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : []; + var length = result.length, + skipIndexes = !!length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == 'length' || isIndex(key, length)))) { + result.push(key); + } + } + + return result; +} +/** + * The base implementation of `getTag`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + + +function baseGetTag(value) { + return objectToString.call(value); +} +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + + +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + + var pattern = isFunction(value) || isHostObject(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + + +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + + var result = []; + + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + + return result; +} +/** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + + +function createToPairs(keysFunc) { + return function (object) { + var tag = getTag(object); + + if (tag == mapTag) { + return mapToArray(object); + } + + if (tag == setTag) { + return setToPairs(object); + } + + return baseToPairs(object, keysFunc(object)); + }; +} +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + + +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + + +var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11, +// for data views in Edge < 14, and promises in Node.js. + +if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) { + getTag = function getTag(value) { + var result = objectToString.call(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : undefined; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag; + + case mapCtorString: + return mapTag; + + case promiseCtorString: + return promiseTag; + + case setCtorString: + return setTag; + + case weakMapCtorString: + return weakMapTag; + } + } + + return result; + }; +} +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + + +function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (typeof value == 'number' || reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length; +} +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + + +function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; +} +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + + +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = typeof Ctor == 'function' && Ctor.prototype || objectProto; + return value === proto; +} +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ + + +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + + try { + return func + ''; + } catch (e) {} + } + + return ''; +} +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + + +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + + +var isArray = Array.isArray; +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + + +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + + +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + + +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + + +function isObject(value) { + var type = _typeof(value); + + return !!value && (type == 'object' || type == 'function'); +} +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + + +function isObjectLike(value) { + return !!value && _typeof(value) == 'object'; +} +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + + +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} +/** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + + +var toPairs = createToPairs(keys); +module.exports = toPairs; + +/***/ }), + +/***/ 943: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +module.exports = Pbf; + +var ieee754 = __webpack_require__(299); + +function Pbf(buf) { + this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); + this.pos = 0; + this.type = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum + +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 + +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields + +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; // Threshold chosen based on both benchmarking and knowledge about browser string +// data structures (which currently switch structure types at 12 bytes or more) + +var TEXT_DECODER_MIN_LENGTH = 12; +var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8'); +Pbf.prototype = { + destroy: function destroy() { + this.buf = null; + }, + // === READING ================================================================= + readFields: function readFields(readField, result, end) { + end = end || this.length; + + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; + this.type = val & 0x7; + readField(tag, result, this); + if (this.pos === startPos) this.skip(val); + } + + return result; + }, + readMessage: function readMessage(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + readFixed32: function readFixed32() { + var val = readUInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + readSFixed32: function readSFixed32() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + readFixed64: function readFixed64() { + var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + readSFixed64: function readSFixed64() { + var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + readFloat: function readFloat() { + var val = ieee754.read(this.buf, this.pos, true, 23, 4); + this.pos += 4; + return val; + }, + readDouble: function readDouble() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, + readVarint: function readVarint(isSigned) { + var buf = this.buf, + val, + b; + b = buf[this.pos++]; + val = b & 0x7f; + if (b < 0x80) return val; + b = buf[this.pos++]; + val |= (b & 0x7f) << 7; + if (b < 0x80) return val; + b = buf[this.pos++]; + val |= (b & 0x7f) << 14; + if (b < 0x80) return val; + b = buf[this.pos++]; + val |= (b & 0x7f) << 21; + if (b < 0x80) return val; + b = buf[this.pos]; + val |= (b & 0x0f) << 28; + return readVarintRemainder(val, isSigned, this); + }, + readVarint64: function readVarint64() { + // for compatibility with v2.0.1 + return this.readVarint(true); + }, + readSVarint: function readSVarint() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + readBoolean: function readBoolean() { + return Boolean(this.readVarint()); + }, + readString: function readString() { + var end = this.readVarint() + this.pos; + var pos = this.pos; + this.pos = end; + + if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) { + // longer strings are fast with the built-in browser TextDecoder API + return readUtf8TextDecoder(this.buf, pos, end); + } // short strings are fast with our custom implementation + + + return readUtf8(this.buf, pos, end); + }, + readBytes: function readBytes() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + // verbose for performance reasons; doesn't affect gzipped size + readPackedVarint: function readPackedVarint(arr, isSigned) { + if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned)); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readVarint(isSigned)); + } + + return arr; + }, + readPackedSVarint: function readPackedSVarint(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readSVarint()); + } + + return arr; + }, + readPackedBoolean: function readPackedBoolean(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readBoolean()); + } + + return arr; + }, + readPackedFloat: function readPackedFloat(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFloat()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readFloat()); + } + + return arr; + }, + readPackedDouble: function readPackedDouble(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readDouble()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readDouble()); + } + + return arr; + }, + readPackedFixed32: function readPackedFixed32(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readFixed32()); + } + + return arr; + }, + readPackedSFixed32: function readPackedSFixed32(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readSFixed32()); + } + + return arr; + }, + readPackedFixed64: function readPackedFixed64(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readFixed64()); + } + + return arr; + }, + readPackedSFixed64: function readPackedSFixed64(arr) { + if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64()); + var end = readPackedEnd(this); + arr = arr || []; + + while (this.pos < end) { + arr.push(this.readSFixed64()); + } + + return arr; + }, + skip: function skip(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;else if (type === Pbf.Fixed32) this.pos += 4;else if (type === Pbf.Fixed64) this.pos += 8;else throw new Error('Unimplemented type: ' + type); + }, + // === WRITING ================================================================= + writeTag: function writeTag(tag, type) { + this.writeVarint(tag << 3 | type); + }, + realloc: function realloc(min) { + var length = this.length || 16; + + while (length < this.pos + min) { + length *= 2; + } + + if (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, + finish: function finish() { + this.length = this.pos; + this.pos = 0; + return this.buf.subarray(0, this.length); + }, + writeFixed32: function writeFixed32(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + writeSFixed32: function writeSFixed32(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + writeFixed64: function writeFixed64(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + writeSFixed64: function writeSFixed64(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + writeVarint: function writeVarint(val) { + val = +val || 0; + + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); + if (val <= 0x7f) return; + this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0); + if (val <= 0x7f) return; + this.buf[this.pos++] = (val >>>= 7) & 0x7f | (val > 0x7f ? 0x80 : 0); + if (val <= 0x7f) return; + this.buf[this.pos++] = val >>> 7 & 0x7f; + }, + writeSVarint: function writeSVarint(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + writeBoolean: function writeBoolean(val) { + this.writeVarint(Boolean(val)); + }, + writeString: function writeString(str) { + str = String(str); + this.realloc(str.length * 4); + this.pos++; // reserve 1 byte for short string length + + var startPos = this.pos; // write the string directly to the buffer and see how much was written + + this.pos = writeUtf8(this.buf, str, this.pos); + var len = this.pos - startPos; + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position + + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + writeFloat: function writeFloat(val) { + this.realloc(4); + ieee754.write(this.buf, val, this.pos, true, 23, 4); + this.pos += 4; + }, + writeDouble: function writeDouble(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, + writeBytes: function writeBytes(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + + for (var i = 0; i < len; i++) { + this.buf[this.pos++] = buffer[i]; + } + }, + writeRawMessage: function writeRawMessage(fn, obj) { + this.pos++; // reserve 1 byte for short message length + // write the message directly to the buffer and see how much was written + + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position + + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + writeMessage: function writeMessage(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + writePackedVarint: function writePackedVarint(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedVarint, arr); + }, + writePackedSVarint: function writePackedSVarint(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedSVarint, arr); + }, + writePackedBoolean: function writePackedBoolean(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedBoolean, arr); + }, + writePackedFloat: function writePackedFloat(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedFloat, arr); + }, + writePackedDouble: function writePackedDouble(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedDouble, arr); + }, + writePackedFixed32: function writePackedFixed32(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedFixed, arr); + }, + writePackedSFixed32: function writePackedSFixed32(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedSFixed, arr); + }, + writePackedFixed64: function writePackedFixed64(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedFixed2, arr); + }, + writePackedSFixed64: function writePackedSFixed64(tag, arr) { + if (arr.length) this.writeMessage(tag, _writePackedSFixed2, arr); + }, + writeBytesField: function writeBytesField(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function writeFixed32Field(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function writeSFixed32Field(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function writeFixed64Field(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function writeSFixed64Field(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function writeVarintField(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function writeSVarintField(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function writeStringField(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function writeFloatField(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function writeDoubleField(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function writeBooleanField(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function readVarintRemainder(l, s, p) { + var buf = p.buf, + h, + b; + b = buf[p.pos++]; + h = (b & 0x70) >> 4; + if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 0x7f) << 3; + if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 0x7f) << 10; + if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 0x7f) << 17; + if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 0x7f) << 24; + if (b < 0x80) return toNum(l, h, s); + b = buf[p.pos++]; + h |= (b & 0x01) << 31; + if (b < 0x80) return toNum(l, h, s); + throw new Error('Expected varint not more than 10 bytes'); +} + +function readPackedEnd(pbf) { + return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1; +} + +function toNum(low, high, isSigned) { + if (isSigned) { + return high * 0x100000000 + (low >>> 0); + } + + return (high >>> 0) * 0x100000000 + (low >>> 0); +} + +function writeBigVarint(val, pbf) { + var low, high; + + if (val >= 0) { + low = val % 0x100000000 | 0; + high = val / 0x100000000 | 0; + } else { + low = ~(-val % 0x100000000); + high = ~(-val / 0x100000000); + + if (low ^ 0xffffffff) { + low = low + 1 | 0; + } else { + low = 0; + high = high + 1 | 0; + } + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +function writeBigVarintLow(low, high, pbf) { + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; + low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; + low >>>= 7; + pbf.buf[pbf.pos] = low & 0x7f; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); + if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); + if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); + if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); + if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); + if (!high) return; + pbf.buf[pbf.pos++] = high & 0x7f; +} + +function makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right + + pbf.realloc(extraLen); + + for (var i = pbf.pos - 1; i >= startPos; i--) { + pbf.buf[i + extraLen] = pbf.buf[i]; + } +} + +function _writePackedVarint(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeVarint(arr[i]); + } +} + +function _writePackedSVarint(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeSVarint(arr[i]); + } +} + +function _writePackedFloat(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeFloat(arr[i]); + } +} + +function _writePackedDouble(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeDouble(arr[i]); + } +} + +function _writePackedBoolean(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeBoolean(arr[i]); + } +} + +function _writePackedFixed(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeFixed32(arr[i]); + } +} + +function _writePackedSFixed(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeSFixed32(arr[i]); + } +} + +function _writePackedFixed2(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeFixed64(arr[i]); + } +} + +function _writePackedSFixed2(arr, pbf) { + for (var i = 0; i < arr.length; i++) { + pbf.writeSFixed64(arr[i]); + } +} // Buffer code below from https://github.com/feross/buffer, MIT-licensed + + +function readUInt32(buf, pos) { + return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 0x1000000; +} + +function writeInt32(buf, val, pos) { + buf[pos] = val; + buf[pos + 1] = val >>> 8; + buf[pos + 2] = val >>> 16; + buf[pos + 3] = val >>> 24; +} + +function readInt32(buf, pos) { + return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24); +} + +function readUtf8(buf, pos, end) { + var str = ''; + var i = pos; + + while (i < end) { + var b0 = buf[i]; + var c = null; // codepoint + + var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1; + if (i + bytesPerSequence > end) break; + var b1, b2, b3; + + if (bytesPerSequence === 1) { + if (b0 < 0x80) { + c = b0; + } + } else if (bytesPerSequence === 2) { + b1 = buf[i + 1]; + + if ((b1 & 0xC0) === 0x80) { + c = (b0 & 0x1F) << 0x6 | b1 & 0x3F; + + if (c <= 0x7F) { + c = null; + } + } + } else if (bytesPerSequence === 3) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | b2 & 0x3F; + + if (c <= 0x7FF || c >= 0xD800 && c <= 0xDFFF) { + c = null; + } + } + } else if (bytesPerSequence === 4) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + b3 = buf[i + 3]; + + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | b3 & 0x3F; + + if (c <= 0xFFFF || c >= 0x110000) { + c = null; + } + } + } + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; + } + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function readUtf8TextDecoder(buf, pos, end) { + return utf8TextDecoder.decode(buf.subarray(pos, end)); +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + if (lead) { + if (c < 0xDC00) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = c; + continue; + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + } else { + if (c > 0xDBFF || i + 1 === str.length) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + } else { + lead = c; + } + + continue; + } + } else if (lead) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = null; + } + + if (c < 0x80) { + buf[pos++] = c; + } else { + if (c < 0x800) { + buf[pos++] = c >> 0x6 | 0xC0; + } else { + if (c < 0x10000) { + buf[pos++] = c >> 0xC | 0xE0; + } else { + buf[pos++] = c >> 0x12 | 0xF0; + buf[pos++] = c >> 0xC & 0x3F | 0x80; + } + + buf[pos++] = c >> 0x6 & 0x3F | 0x80; + } + + buf[pos++] = c & 0x3F | 0x80; + } + } + + return pos; +} + +/***/ }), + +/***/ 957: +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } + +(function (global, factory) { + ( false ? 0 : _typeof(exports)) === 'object' && "object" !== 'undefined' ? factory() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : + __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : 0; +})(this, function () { + 'use strict'; + /** + * @this {Promise} + */ + + function finallyConstructor(callback) { + var constructor = this.constructor; + return this.then(function (value) { + // @ts-ignore + return constructor.resolve(callback()).then(function () { + return value; + }); + }, function (reason) { + // @ts-ignore + return constructor.resolve(callback()).then(function () { + // @ts-ignore + return constructor.reject(reason); + }); + }); + } + + function allSettled(arr) { + var P = this; + return new P(function (resolve, reject) { + if (!(arr && typeof arr.length !== 'undefined')) { + return reject(new TypeError(_typeof(arr) + ' ' + arr + ' is not iterable(cannot read property Symbol(Symbol.iterator))')); + } + + var args = Array.prototype.slice.call(arr); + if (args.length === 0) return resolve([]); + var remaining = args.length; + + function res(i, val) { + if (val && (_typeof(val) === 'object' || typeof val === 'function')) { + var then = val.then; + + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, function (e) { + args[i] = { + status: 'rejected', + reason: e + }; + + if (--remaining === 0) { + resolve(args); + } + }); + return; + } + } + + args[i] = { + status: 'fulfilled', + value: val + }; + + if (--remaining === 0) { + resolve(args); + } + } + + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + } // Store setTimeout reference so promise-polyfill will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + + + var setTimeoutFunc = setTimeout; // @ts-ignore + + var setImmediateFunc = typeof setImmediate !== 'undefined' ? setImmediate : null; + + function isArray(x) { + return Boolean(x && typeof x.length !== 'undefined'); + } + + function noop() {} // Polyfill for Function.prototype.bind + + + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + /** + * @constructor + * @param {Function} fn + */ + + + function Promise(fn) { + if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') throw new TypeError('not a function'); + /** @type {!number} */ + + this._state = 0; + /** @type {!boolean} */ + + this._handled = false; + /** @type {Promise|undefined} */ + + this._value = undefined; + /** @type {!Array} */ + + this._deferreds = []; + doResolve(fn, this); + } + + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + + if (self._state === 0) { + self._deferreds.push(deferred); + + return; + } + + self._handled = true; + + Promise._immediateFn(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + + var ret; + + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + + resolve(deferred.promise, ret); + }); + } + + function resolve(self, newValue) { + try { + // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure + if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); + + if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + Promise._immediateFn(function () { + if (!self._handled) { + Promise._unhandledRejectionFn(self._value); + } + }); + } + + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + + self._deferreds = null; + } + /** + * @constructor + */ + + + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + /** + * Take a potentially misbehaving resolver function and make sure + * onFulfilled and onRejected are only called once. + * + * Makes no guarantees about asynchrony. + */ + + + function doResolve(fn, self) { + var done = false; + + try { + fn(function (value) { + if (done) return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) return; + done = true; + reject(self, ex); + } + } + + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + + Promise.prototype.then = function (onFulfilled, onRejected) { + // @ts-ignore + var prom = new this.constructor(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + + Promise.prototype['finally'] = finallyConstructor; + + Promise.all = function (arr) { + return new Promise(function (resolve, reject) { + if (!isArray(arr)) { + return reject(new TypeError('Promise.all accepts an array')); + } + + var args = Array.prototype.slice.call(arr); + if (args.length === 0) return resolve([]); + var remaining = args.length; + + function res(i, val) { + try { + if (val && (_typeof(val) === 'object' || typeof val === 'function')) { + var then = val.then; + + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + + args[i] = val; + + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + + Promise.allSettled = allSettled; + + Promise.resolve = function (value) { + if (value && _typeof(value) === 'object' && value.constructor === Promise) { + return value; + } + + return new Promise(function (resolve) { + resolve(value); + }); + }; + + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + + Promise.race = function (arr) { + return new Promise(function (resolve, reject) { + if (!isArray(arr)) { + return reject(new TypeError('Promise.race accepts an array')); + } + + for (var i = 0, len = arr.length; i < len; i++) { + Promise.resolve(arr[i]).then(resolve, reject); + } + }); + }; // Use polyfill for setImmediate for performance gains + + + Promise._immediateFn = // @ts-ignore + typeof setImmediateFunc === 'function' && function (fn) { + // @ts-ignore + setImmediateFunc(fn); + } || function (fn) { + setTimeoutFunc(fn, 0); + }; + + Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { + if (typeof console !== 'undefined' && console) { + console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console + } + }; + /** @suppress {undefinedVars} */ + + + var globalNS = function () { + // the only reliable means to get the global object is + // `Function('return this')()` + // However, this causes CSP violations in Chrome apps. + if (typeof self !== 'undefined') { + return self; + } + + if (typeof window !== 'undefined') { + return window; + } + + if (typeof __webpack_require__.g !== 'undefined') { + return __webpack_require__.g; + } + + throw new Error('unable to locate global object'); + }(); // Expose the polyfill if Promise is undefined or set to a + // non-function value. The latter can be due to a named HTMLElement + // being exposed by browsers for legacy reasons. + // https://github.com/taylorhakes/promise-polyfill/issues/114 + + + if (typeof globalNS['Promise'] !== 'function') { + globalNS['Promise'] = Promise; + } else { + if (!globalNS.Promise.prototype['finally']) { + globalNS.Promise.prototype['finally'] = finallyConstructor; + } + + if (!globalNS.Promise.allSettled) { + globalNS.Promise.allSettled = allSettled; + } + } +}); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ !function() { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +!function() { +"use strict"; + +// UNUSED EXPORTS: AddressMatchService, AggregationParameter, AggregationTypes, AlongLineDirection, AnalystAreaUnit, AnalystSizeUnit, AreaSolarRadiationParameters, ArrayStatistic, AttributesPopContainer, BaiduCRS, BaiduTileLayer, Bounds, Browser, BucketAggParameter, BucketAggType, BufferAnalystParameters, BufferDistance, BufferEndType, BufferRadiusUnit, BufferSetting, BuffersAnalystJobsParameter, BurstPipelineAnalystParameters, CRS, CartoCSS, ChangeTileVersion, ChartQueryFilterParameter, ChartQueryParameters, ChartService, ChartType, ChartView, ChartViewModel, CircleStyle, CityTabsPage, ClientComputationLayer, ClientComputationView, ClientComputationViewModel, ClientType, ClipAnalystMode, ClipParameter, CloudTileLayer, CloverStyle, ColorDictionary, ColorGradientType, ColorSpaceType, ColorsPickerUtil, CommonContainer, CommonServiceBase, CommonTheme, CommonUtil, CommontypesConversion, ComponentsUtil, ComponentsViewBase, ComputeWeightMatrixParameters, CreateDatasetParameters, Credential, DataFlowLayer, DataFlowService, DataFlowView, DataFlowViewModel, DataFormat, DataItemOrderBy, DataItemType, DataReturnMode, DataReturnOption, DataServiceQueryView, DataServiceQueryViewModel, DatasetBufferAnalystParameters, DatasetInfo, DatasetOverlayAnalystParameters, DatasetService, DatasetSurfaceAnalystParameters, DatasetThiessenAnalystParameters, DatasourceConnectionInfo, DatasourceService, DensityKernelAnalystParameters, DirectionType, DistributedAnalysisView, DistributedAnalysisViewModel, DropDownBox, EchartsLayer, EditFeaturesParameters, EditType, ElasticSearch, EngineType, EntityType, Event, Events, Exponent, FacilityAnalyst3DParameters, FacilityAnalystSinks3DParameters, FacilityAnalystSources3DParameters, FacilityAnalystStreamParameters, FacilityAnalystTracedown3DParameters, FacilityAnalystTraceup3DParameters, FacilityAnalystUpstream3DParameters, Feature, FeatureService, FeatureShapeFactory, FeatureTheme, FeatureThemeGraph, FeatureThemeRankSymbol, FeatureThemeVector, FeatureVector, FetchRequest, FieldParameters, FieldService, FieldStatisticsParameters, FieldsFilter, FileReaderUtil, FillGradientMode, FilterField, FilterParameter, FindClosestFacilitiesParameters, FindLocationParameters, FindMTSPPathsParameters, FindPathParameters, FindServiceAreasParameters, FindTSPPathsParameters, Format, GenerateSpatialDataParameters, GeoCodingParameter, GeoDecodingParameter, GeoFeatureThemeLayer, GeoHashGridAggParameter, GeoJSONFormat, GeoJSONLayerWithName, GeoJsonLayerDataModel, GeoRelationAnalystParameters, Geometry, GeometryBufferAnalystParameters, GeometryCollection, GeometryCurve, GeometryGeoText, GeometryLineString, GeometryLinearRing, GeometryMultiLineString, GeometryMultiPoint, GeometryMultiPolygon, GeometryOverlayAnalystParameters, GeometryPoint, GeometryPolygon, GeometryRectangle, GeometrySurfaceAnalystParameters, GeometryThiessenAnalystParameters, GeometryType, GeoprocessingService, GetFeatureMode, GetFeaturesByBoundsParameters, GetFeaturesByBufferParameters, GetFeaturesByGeometryParameters, GetFeaturesByIDsParameters, GetFeaturesBySQLParameters, GetFeaturesParametersBase, GetFeaturesServiceBase, GetGridCellInfosParameters, GetResolutionFromScaleDpi, GraduatedMode, GraphAxesTextDisplayMode, GraphThemeLayer, Graphic, GraphicLayer, Grid, GridCellInfosService, GridType, HeatMapFeature, HeatMapLayer, HillshadeParameter, IManager, IManagerCreateNodeParam, IManagerServiceBase, IPortal, IPortalAddDataParam, IPortalAddResourceParam, IPortalDataConnectionInfoParam, IPortalDataMetaInfoParam, IPortalDataStoreInfoParam, IPortalQueryParam, IPortalQueryResult, IPortalRegisterServiceParam, IPortalResource, IPortalServiceBase, IPortalShareEntity, IPortalShareParam, IPortalUser, ImageCollectionService, ImageGFAspect, ImageGFHillShade, ImageGFOrtho, ImageGFSlope, ImageMapLayer, ImageRenderingRule, ImageSearchParameter, ImageService, ImageStretchOption, ImageStyle, ImageTileLayer, IndexTabsPageContainer, InterpolationAlgorithmType, InterpolationAnalystParameters, InterpolationDensityAnalystParameters, InterpolationIDWAnalystParameters, InterpolationKrigingAnalystParameters, InterpolationRBFAnalystParameters, JSONFormat, JoinItem, JoinType, KernelDensityJobParameter, KeyServiceParameter, LabelBackShape, LabelImageCell, LabelMatrixCell, LabelMixedTextStyle, LabelOverLengthMode, LabelSymbolCell, LabelThemeCell, LabelThemeLayer, Lang, LayerInfoService, LayerStatus, LayerType, LinkItem, Logo, LonLat, MapService, MapVLayer, MapVRenderer, MappingParameters, MapvRenderer, MathExpressionAnalysisParameters, MeasureMode, MeasureParameters, MeasureService, MessageBox, MetricsAggParameter, MetricsAggType, NDVIParameter, NavTabsPage, NetworkAnalyst3DService, NetworkAnalystService, NetworkAnalystServiceBase, NonEarthCRS, NormalRenderer, NormalizeScale, Online, OnlineData, OnlineQueryDatasParameter, OnlineServiceBase, OpenFileView, OpenFileViewModel, OrderBy, OrderType, OutputSetting, OutputType, OverlapDisplayedOptions, OverlayAnalystParameters, OverlayGeoJobParameter, OverlayOperationType, PaginationContainer, PermissionType, Pixel, PixelFormat, PointWithMeasure, PopContainer, ProcessingService, ProcessingServiceBase, QueryByBoundsParameters, QueryByDistanceParameters, QueryByGeometryParameters, QueryBySQLParameters, QueryOption, QueryParameters, QueryService, RangeMode, RangeThemeLayer, RankSymbolThemeLayer, RasterFunctionParameter, RasterFunctionType, ResourceType, Route, RouteCalculateMeasureParameters, RouteLocatorParameters, SVGRenderer, SearchMode, SearchType, SearchView, SearchViewModel, SecurityManager, Select, ServerColor, ServerFeature, ServerGeometry, ServerInfo, ServerStyle, ServerTextStyle, ServerTheme, ServerType, ServiceBase, ServiceStatus, SetDatasourceParameters, SetLayerInfoParameters, SetLayerStatusParameters, SetLayersInfoParameters, ShapeParameters, ShapeParametersCircle, ShapeParametersImage, ShapeParametersLabel, ShapeParametersLine, ShapeParametersPoint, ShapeParametersPolygon, ShapeParametersRectangle, ShapeParametersSector, SideType, SingleObjectQueryJobsParameter, Size, SmoothMethod, Sortby, SpatialAnalystBase, SpatialAnalystService, SpatialQueryMode, SpatialRelationType, StatisticAnalystMode, StatisticMode, StopQueryParameters, SummaryAttributesJobsParameter, SummaryMeshJobParameter, SummaryRegionJobParameter, SummaryType, SuperMap, SupplyCenter, SupplyCenterType, SurfaceAnalystMethod, SurfaceAnalystParameters, SurfaceAnalystParametersSetting, TemplateBase, TerrainCurvatureCalculationParameters, TextAlignment, ThemeDotDensity, ThemeFeature, ThemeGraduatedSymbol, ThemeGraduatedSymbolStyle, ThemeGraph, ThemeGraphAxes, ThemeGraphItem, ThemeGraphSize, ThemeGraphText, ThemeGraphTextFormat, ThemeGraphType, ThemeGridRange, ThemeGridRangeItem, ThemeGridUnique, ThemeGridUniqueItem, ThemeLabel, ThemeLabelAlongLine, ThemeLabelBackground, ThemeLabelItem, ThemeLabelText, ThemeLabelUniqueItem, ThemeLayer, ThemeMemoryData, ThemeOffset, ThemeParameters, ThemeRange, ThemeRangeItem, ThemeService, ThemeStyle, ThemeType, ThemeUnique, ThemeUniqueItem, ThiessenAnalystParameters, TianDiTu_MercatorCRS, TianDiTu_WGS84CRS, TiandituTileLayer, TileVectorLayer, TiledMapLayer, TiledVectorLayer, TimeControlBase, TimeFlowControl, TokenServiceParameter, TopologyValidatorJobsParameter, TopologyValidatorRule, TrafficTransferAnalystService, TransferLine, TransferPathParameters, TransferPreference, TransferSolutionParameters, TransferTactic, TransportationAnalystParameter, TransportationAnalystResultSetting, TurfLayer, TurnType, UGCLayer, UGCLayerType, UGCMapLayer, UGCSubLayer, UnicodeMarker, UniqueThemeLayer, Unit, UpdateDatasetParameters, UpdateEdgeWeightParameters, UpdateTurnNodeWeightParameters, VariogramMode, Vector, VectorClipJobsParameter, VectorGrid, VectorTileFormat, WKTFormat, WMTSLayer, WebExportFormatType, WebMap, WebPrintingJobContent, WebPrintingJobCustomItems, WebPrintingJobExportOptions, WebPrintingJobImage, WebPrintingJobLayers, WebPrintingJobLayoutOptions, WebPrintingJobLegendOptions, WebPrintingJobLittleMapOptions, WebPrintingJobNorthArrowOptions, WebPrintingJobParameters, WebPrintingJobScaleBarOptions, WebPrintingJobService, WebScaleOrientationType, WebScaleType, WebScaleUnit, addressMatchService, baiduTileLayer, changeTileVersion, chartService, circleStyle, clientComputationLayer, clientComputationView, cloudTileLayer, cloverStyle, componentsViewBase, conversionDegree, crs, dataFlowLayer, dataFlowService, dataFlowView, dataFlowViewModel, dataServiceQueryView, dataServiceQueryViewModel, datasetService, datasourceService, distributedAnalysisView, echartsLayer, featureService, fieldService, geoJSONLayerWithName, geoprocessingService, getMeterPerMapUnit, getResolutionFromScaleDpi, getWrapNum, graphThemeLayer, graphic, graphicLayer, gridCellInfosService, heatMapFeature, heatMapLayer, imageMapLayer, imageStyle, imageTileLayer, isCORS, labelThemeLayer, layerInfoService, logo, mapService, mapVLayer, measureService, networkAnalyst3DService, networkAnalystService, nonEarthCRS, normalizeScale, openFileView, openFileViewModel, processingService, queryService, rangeThemeLayer, rankSymbolThemeLayer, resolutionToScale, scaleToResolution, searchView, searchViewModel, setCORS, spatialAnalystService, themeFeature, themeService, tiandituTileLayer, tiledMapLayer, tiledVectorLayer, toGeoJSON, toSuperMapGeometry, trafficTransferAnalystService, transform, turfLayer, unicodeMarker, uniqueThemeLayer, webMap, webPrintingJobService, wmtsLayer + +;// CONCATENATED MODULE: ./src/common/SuperMap.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var SuperMap = window.SuperMap = window.SuperMap || {}; +SuperMap.Components = window.SuperMap.Components || {}; +;// CONCATENATED MODULE: ./src/common/REST.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** +* @enum DataFormat +* @description 服务请求返回结果数据类型 +* @category BaseTypes Constant +* @type {string} +* @usage +* ``` +* // 浏览器 +* +* +* // ES6 Import +* import { DataFormat } from '{npm}'; +* +* const result = DataFormat.GEOJSON; +* ``` +*/ +var DataFormat = { + /** GEOJSON */ + GEOJSON: "GEOJSON", + + /** ISERVER */ + ISERVER: "ISERVER" +}; +/** + * @enum ServerType + * @description 服务器类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ServerType } from '{npm}'; + * + * const result = ServerType.ISERVER; + * ``` + */ + +var ServerType = { + /** ISERVER */ + ISERVER: "ISERVER", + + /** IPORTAL */ + IPORTAL: "IPORTAL", + + /** ONLINE */ + ONLINE: "ONLINE" +}; +/** + * @enum GeometryType + * @description 几何对象枚举,定义了一系列几何对象类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GeometryType } from '{npm}'; + * + * const result = GeometryType.LINE; + * ``` + */ + +var GeometryType = { + /** LINE */ + LINE: "LINE", + + /** LINEM */ + LINEM: "LINEM", + + /** POINT */ + POINT: "POINT", + + /** REGION */ + REGION: "REGION", + + /** POINTEPS */ + POINTEPS: "POINTEPS", + + /** LINEEPS */ + LINEEPS: "LINEEPS", + + /** REGIONEPS */ + REGIONEPS: "REGIONEPS", + + /** ELLIPSE */ + ELLIPSE: "ELLIPSE", + + /** CIRCLE */ + CIRCLE: "CIRCLE", + + /** TEXT */ + TEXT: "TEXT", + + /** RECTANGLE */ + RECTANGLE: "RECTANGLE", + + /** UNKNOWN */ + UNKNOWN: "UNKNOWN", + + /** GEOCOMPOUND */ + GEOCOMPOUND: "GEOCOMPOUND" +}; +/** + * @enum QueryOption + * @description 查询结果类型枚举,描述查询结果返回类型,包括只返回属性、只返回几何实体以及返回属性和几何实体。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { QueryOption } from '{npm}'; + * + * const result = QueryOption.ATTRIBUTE; + * ``` + */ + +var QueryOption = { + /** 属性 */ + ATTRIBUTE: "ATTRIBUTE", + + /** 属性和几何对象 */ + ATTRIBUTEANDGEOMETRY: "ATTRIBUTEANDGEOMETRY", + + /** 几何对象 */ + GEOMETRY: "GEOMETRY" +}; +/** + * @enum JoinType + * @description 关联查询时的关联类型常量。 + * 该类定义了两个表之间的连接类型常量,决定了对两个表之间进行连接查询时,查询结果中得到的记录的情况。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { JoinType } from '{npm}'; + * + * const result = JoinType.INNERJOIN; + * ``` + */ + +var JoinType = { + /** 内连接 */ + INNERJOIN: "INNERJOIN", + + /** 左连接 */ + LEFTJOIN: "LEFTJOIN" +}; +/** + * @enum SpatialQueryMode + * @description 空间查询模式枚举。该类定义了空间查询操作模式常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SpatialQueryMode } from '{npm}'; + * + * const result = SpatialQueryMode.CONTAIN; + * ``` + */ + +var SpatialQueryMode = { + /** 包含空间查询模式 */ + CONTAIN: "CONTAIN", + + /** 交叉空间查询模式 */ + CROSS: "CROSS", + + /** 分离空间查询模式 */ + DISJOINT: "DISJOINT", + + /** 重合空间查询模式 */ + IDENTITY: "IDENTITY", + + /** 相交空间查询模式 */ + INTERSECT: "INTERSECT", + + /** 无空间查询 */ + NONE: "NONE", + + /** 叠加空间查询模式 */ + OVERLAP: "OVERLAP", + + /** 邻接空间查询模式 */ + TOUCH: "TOUCH", + + /** 被包含空间查询模式 */ + WITHIN: "WITHIN" +}; +/** + * @enum SpatialRelationType + * @description 数据集对象间的空间关系枚举。 + * 该类定义了数据集对象间的空间关系类型常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SpatialRelationType } from '{npm}'; + * + * const result = {namespace}.SpatialRelationType.CONTAIN; + * ``` + */ + +var SpatialRelationType = { + /** 包含关系 */ + CONTAIN: "CONTAIN", + + /** 相交关系 */ + INTERSECT: "INTERSECT", + + /** 被包含关系 */ + WITHIN: "WITHIN" +}; +/** + * @enum MeasureMode + * @type {string} + * @description 量算模式枚举。 + * @category BaseTypes Constant + * 该类定义了两种测量模式:距离测量和面积测量。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { MeasureMode } from '{npm}'; + * + * const result = MeasureMode.DISTANCE; + * ``` + */ + +var MeasureMode = { + /** 距离测量 */ + DISTANCE: "DISTANCE", + + /** 面积测量 */ + AREA: "AREA" +}; +/** + * @enum Unit + * @description 距离单位枚举。 + * 该类定义了一系列距离单位类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Unit } from '{npm}'; + * + * const result = Unit.METER; + * ``` + */ + +var Unit = { + /** 米 */ + METER: "METER", + + /** 千米 */ + KILOMETER: "KILOMETER", + + /** 英里 */ + MILE: "MILE", + + /** 码 */ + YARD: "YARD", + + /** 度 */ + DEGREE: "DEGREE", + + /** 毫米 */ + MILLIMETER: "MILLIMETER", + + /** 厘米 */ + CENTIMETER: "CENTIMETER", + + /** 英寸 */ + INCH: "INCH", + + /** 分米 */ + DECIMETER: "DECIMETER", + + /** 英尺 */ + FOOT: "FOOT", + + /** 秒 */ + SECOND: "SECOND", + + /** 分 */ + MINUTE: "MINUTE", + + /** 弧度 */ + RADIAN: "RADIAN" +}; +/** + * @enum BufferRadiusUnit + * @description 缓冲区距离单位枚举。该类定义了一系列缓冲距离单位类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BufferRadiusUnit } from '{npm}'; + * + * const result = BufferRadiusUnit.CENTIMETER; + * ``` + */ + +var BufferRadiusUnit = { + /** 厘米 */ + CENTIMETER: "CENTIMETER", + + /** 分米 */ + DECIMETER: "DECIMETER", + + /** 英尺 */ + FOOT: "FOOT", + + /** 英寸 */ + INCH: "INCH", + + /** 千米 */ + KILOMETER: "KILOMETER", + + /** 米 */ + METER: "METER", + + /** 英里 */ + MILE: "MILE", + + /** 毫米 */ + MILLIMETER: "MILLIMETER", + + /** 码 */ + YARD: "YARD" +}; +/** + * @enum EngineType + * @description 数据源引擎类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EngineType } from '{npm}'; + * + * const result = EngineType.IMAGEPLUGINS; + * ``` + */ + +var EngineType = { + /** 影像只读引擎类型,文件引擎,针对通用影像格式如 BMP,JPG,TIFF 以及超图自定义影像格式 SIT 等。 */ + IMAGEPLUGINS: "IMAGEPLUGINS", + + /** OGC 引擎类型,针对于 Web 数据源,Web 引擎,目前支持的类型有 WMS,WFS,WCS。 */ + OGC: "OGC", + + /** Oracle 引擎类型,针对 Oracle 数据源,数据库引擎。 */ + ORACLEPLUS: "ORACLEPLUS", + + /** SDB 引擎类型,文件引擎,即 SDB 数据源。 */ + SDBPLUS: "SDBPLUS", + + /** SQL Server 引擎类型,针对 SQL Server 数据源,数据库引擎 */ + SQLPLUS: "SQLPLUS", + + /** UDB 引擎类型,文件引擎。 */ + UDB: "UDB" +}; +/** + * @enum ThemeGraphTextFormat + * @description 统计专题图文本显示格式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeGraphTextFormat } from '{npm}'; + * + * const result = ThemeGraphTextFormat.CAPTION; + * ``` + */ + +var ThemeGraphTextFormat = { + /** 标题。以各子项的标题来进行标注。 */ + CAPTION: "CAPTION", + + /** 标题 + 百分数。以各子项的标题和所占的百分比来进行标注。 */ + CAPTION_PERCENT: "CAPTION_PERCENT", + + /** 标题 + 实际数值。以各子项的标题和真实数值来进行标注。 */ + CAPTION_VALUE: "CAPTION_VALUE", + + /** 百分数。以各子项所占的百分比来进行标注。 */ + PERCENT: "PERCENT", + + /** 实际数值。以各子项的真实数值来进行标注。 */ + VALUE: "VALUE" +}; +/** + * @enum ThemeGraphType + * @description 统计专题图类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeGraphType } from '{npm}'; + * + * const result = ThemeGraphType.AREA; + * ``` + */ + +var ThemeGraphType = { + /** 面积图。 */ + AREA: "AREA", + + /** 柱状图。 */ + BAR: "BAR", + + /** 三维柱状图。 */ + BAR3D: "BAR3D", + + /** 折线图。 */ + LINE: "LINE", + + /** 饼图。 */ + PIE: "PIE", + + /** 三维饼图。 */ + PIE3D: "PIE3D", + + /** 点状图。 */ + POINT: "POINT", + + /** 环状图。 */ + RING: "RING", + + /** 玫瑰图。 */ + ROSE: "ROSE", + + /** 三维玫瑰图。 */ + ROSE3D: "ROSE3D", + + /** 堆叠柱状图。 */ + STACK_BAR: "STACK_BAR", + + /** 三维堆叠柱状图。 */ + STACK_BAR3D: "STACK_BAR3D", + + /** 阶梯图。 */ + STEP: "STEP" +}; +/** + * @enum GraphAxesTextDisplayMode + * @description 统计专题图坐标轴文本显示模式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GraphAxesTextDisplayMode } from '{npm}'; + * + * const result = GraphAxesTextDisplayMode.ALL; + * ``` + */ + +var GraphAxesTextDisplayMode = { + /** 显示全部文本。 */ + ALL: "ALL", + + /** 不显示。 */ + NONE: "NONE", + + /** 显示Y轴的文本。 */ + YAXES: "YAXES" +}; +/** + * @enum GraduatedMode + * @description 专题图分级模式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GraduatedMode } from '{npm}'; + * + * const result = GraduatedMode.CONSTANT; + * ``` + */ + +var GraduatedMode = { + /** 常量分级模式。 */ + CONSTANT: "CONSTANT", + + /** 对数分级模式。 */ + LOGARITHM: "LOGARITHM", + + /** 平方根分级模式。 */ + SQUAREROOT: "SQUAREROOT" +}; +/** + * @enum RangeMode + * @description 范围分段专题图分段方式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { RangeMode } from '{npm}'; + * + * const result = RangeMode.CUSTOMINTERVAL; + * ``` + */ + +var RangeMode = { + /** 自定义分段法。 */ + CUSTOMINTERVAL: "CUSTOMINTERVAL", + + /** 等距离分段法。 */ + EQUALINTERVAL: "EQUALINTERVAL", + + /** 对数分段法。 */ + LOGARITHM: "LOGARITHM", + + /** 等计数分段法。 */ + QUANTILE: "QUANTILE", + + /** 平方根分段法。 */ + SQUAREROOT: "SQUAREROOT", + + /** 标准差分段法。 */ + STDDEVIATION: "STDDEVIATION" +}; +/** + * @enum ThemeType + * @description 专题图类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ThemeType } from '{npm}'; + * + * const result = ThemeType.DOTDENSITY; + * ``` + */ + +var ThemeType = { + /** 点密度专题图。 */ + DOTDENSITY: "DOTDENSITY", + + /** 等级符号专题图。 */ + GRADUATEDSYMBOL: "GRADUATEDSYMBOL", + + /** 统计专题图。 */ + GRAPH: "GRAPH", + + /** 标签专题图。 */ + LABEL: "LABEL", + + /** 分段专题图。 */ + RANGE: "RANGE", + + /** 単值专题图。 */ + UNIQUE: "UNIQUE" +}; +/** + * @enum ColorGradientType + * @description 渐变颜色枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ColorGradientType } from '{npm}'; + * + * const result = ColorGradientType.BLACK_WHITE; + * ``` + */ + +var ColorGradientType = { + /** 黑白渐变色。 */ + BLACK_WHITE: "BLACKWHITE", + + /** 蓝黑渐变色。 */ + BLUE_BLACK: "BLUEBLACK", + + /** 蓝红渐变色。 */ + BLUE_RED: "BLUERED", + + /** 蓝白渐变色。 */ + BLUE_WHITE: "BLUEWHITE", + + /** 青黑渐变色。 */ + CYAN_BLACK: "CYANBLACK", + + /** 青蓝渐变色。 */ + CYAN_BLUE: "CYANBLUE", + + /** 青绿渐变色。 */ + CYAN_GREEN: "CYANGREEN", + + /** 青白渐变色。 */ + CYAN_WHITE: "CYANWHITE", + + /** 绿黑渐变色。 */ + GREEN_BLACK: "GREENBLACK", + + /** 绿蓝渐变色。 */ + GREEN_BLUE: "GREENBLUE", + + /** 绿橙紫渐变色。 */ + GREEN_ORANGE_VIOLET: "GREENORANGEVIOLET", + + /** 绿红渐变色。 */ + GREEN_RED: "GREENRED", + + /** 蓝红渐变色。 */ + GREEN_WHITE: "GREENWHITE", + + /** 粉黑渐变色。 */ + PINK_BLACK: "PINKBLACK", + + /** 粉蓝渐变色。 */ + PINK_BLUE: "PINKBLUE", + + /** 粉红渐变色。 */ + PINK_RED: "PINKRED", + + /** 粉白渐变色。 */ + PINK_WHITE: "PINKWHITE", + + /** 彩虹色。 */ + RAIN_BOW: "RAINBOW", + + /** 红黑渐变色。 */ + RED_BLACK: "REDBLACK", + + /** 红白渐变色。 */ + RED_WHITE: "REDWHITE", + + /** 光谱渐变。 */ + SPECTRUM: "SPECTRUM", + + /** 地形渐变,用于三维显示效果较好。 */ + TERRAIN: "TERRAIN", + + /** 黄黑渐变色。 */ + YELLOW_BLACK: "YELLOWBLACK", + + /** 黄蓝渐变色。 */ + YELLOW_BLUE: "YELLOWBLUE", + + /** 黄绿渐变色。 */ + YELLOW_GREEN: "YELLOWGREEN", + + /** 黄红渐变色。 */ + YELLOW_RED: "YELLOWRED", + + /** 黄白渐变色。 */ + YELLOW_WHITE: "YELLOWWHITE" +}; +/** + * @enum TextAlignment + * @description 文本对齐枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TextAlignment } from '{npm}'; + * + * const result = TextAlignment.TOPLEFT; + * ``` + */ + +var TextAlignment = { + /** 左上角对齐。 */ + TOPLEFT: "TOPLEFT", + + /** 顶部居中对齐。 */ + TOPCENTER: "TOPCENTER", + + /** 右上角对齐。 */ + TOPRIGHT: "TOPRIGHT", + + /** 基准线左对齐。 */ + BASELINELEFT: "BASELINELEFT", + + /** 基准线居中对齐。 */ + BASELINECENTER: "BASELINECENTER", + + /** 基准线右对齐。 */ + BASELINERIGHT: "BASELINERIGHT", + + /** 左下角对齐。 */ + BOTTOMLEFT: "BOTTOMLEFT", + + /** 底部居中对齐。 */ + BOTTOMCENTER: "BOTTOMCENTER", + + /** 右下角对齐。 */ + BOTTOMRIGHT: "BOTTOMRIGHT", + + /** 左中对齐。 */ + MIDDLELEFT: "MIDDLELEFT", + + /** 中心对齐。 */ + MIDDLECENTER: "MIDDLECENTER", + + /** 右中对齐。 */ + MIDDLERIGHT: "MIDDLERIGHT" +}; +/** + * @enum FillGradientMode + * @description 渐变填充风格的渐变类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { FillGradientMode } from '{npm}'; + * + * const result = FillGradientMode.NONE; + * ``` + */ + +var FillGradientMode = { + /** 无渐变。 */ + NONE: "NONE", + + /** 线性渐变填充。 */ + LINEAR: "LINEAR", + + /** 辐射渐变填充。 */ + RADIAL: "RADIAL", + + /** 圆锥渐变填充。 */ + CONICAL: "CONICAL", + + /** 四角渐变填充。 */ + SQUARE: "SQUARE" +}; +/** + * @enum AlongLineDirection + * @description 标签沿线标注方向枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AlongLineDirection } from '{npm}'; + * + * const result = AlongLineDirection.NORMAL; + * ``` + */ + +var AlongLineDirection = { + /** 沿线的法线方向放置标签。 */ + NORMAL: "ALONG_LINE_NORMAL", + + /** 从下到上,从左到右放置。 */ + LB_TO_RT: "LEFT_BOTTOM_TO_RIGHT_TOP", + + /** 从上到下,从左到右放置。 */ + LT_TO_RB: "LEFT_TOP_TO_RIGHT_BOTTOM", + + /** 从下到上,从右到左放置。 */ + RB_TO_LT: "RIGHT_BOTTOM_TO_LEFT_TOP", + + /** 从上到下,从右到左放置。 */ + RT_TO_LB: "RIGHT_TOP_TO_LEFT_BOTTOM" +}; +/** + * @enum LabelBackShape + * @description 标签专题图中标签背景的形状枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LabelBackShape } from '{npm}'; + * + * const result = LabelBackShape.DIAMOND; + * ``` + */ + +var LabelBackShape = { + /** 菱形背景,即标签背景的形状为菱形。 */ + DIAMOND: "DIAMOND", + + /** 椭圆形背景,即标签背景的行状为椭圆形。 */ + ELLIPSE: "ELLIPSE", + + /** 符号背景,即标签背景的形状为设定的符号。 */ + MARKER: "MARKER", + + /** 空背景,即不使用任何形状作为标签的背景。 */ + NONE: "NONE", + + /** 矩形背景,即标签背景的形状为矩形。 */ + RECT: "RECT", + + /** 圆角矩形背景,即标签背景的形状为圆角矩形。 */ + ROUNDRECT: "ROUNDRECT", + + /** 三角形背景,即标签背景的形状为三角形。 */ + TRIANGLE: "TRIANGLE" +}; +/** + * @enum LabelOverLengthMode + * @description 标签专题图中超长标签的处理模式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LabelOverLengthMode } from '{npm}'; + * + * const result = LabelOverLengthMode.NEWLINE; + * ``` + */ + +var LabelOverLengthMode = { + /** 换行显示。 */ + NEWLINE: "NEWLINE", + + /** 对超长标签不进行处理。 */ + NONE: "NONE", + + /** 省略超出部分。 */ + OMIT: "OMIT" +}; +/** + * @enum DirectionType + * @description 网络分析中方向枚举。 + * 在行驶引导子项中使用。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DirectionType } from '{npm}'; + * + * const result = DirectionType.EAST; + * ``` + */ + +var DirectionType = { + /** 东。 */ + EAST: "EAST", + + /** 无方向。 */ + NONE: "NONE", + + /** 北。 */ + NORTH: "NORTH", + + /** 南。 */ + SOURTH: "SOURTH", + + /** 西。 */ + WEST: "WEST" +}; +/** + * @enum SideType + * @description 行驶位置枚举。 + * 表示在行驶在路的左边、右边或者路上的枚举,该类用在行驶导引子项类中。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SideType } from '{npm}'; + * + * const result = SideType.LEFT; + * ``` + */ + +var SideType = { + /** 路的左侧。 */ + LEFT: "LEFT", + + /** 在路上(即路的中间)。 */ + MIDDLE: "MIDDLE", + + /** 无效值。 */ + NONE: "NONE", + + /** 路的右侧。 */ + RIGHT: "RIGHT" +}; +/** + * @enum SupplyCenterType + * @description 资源供给中心类型枚举。 + * 该枚举定义了网络分析中资源中心点的类型,主要用于资源分配和选址分区。 + * 资源供给中心点的类型包括非中心,固定中心和可选中心。固定中心用于资源分配分析; 固定中心和可选中心用于选址分析;非中心在两种网络分析时都不予考虑。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SupplyCenterType } from '{npm}'; + * + * const result = SupplyCenterType.FIXEDCENTER; + * ``` + */ + +var SupplyCenterType = { + /** 固定中心点。 */ + FIXEDCENTER: "FIXEDCENTER", + + /** 非中心点。 */ + NULL: "NULL", + + /** 可选中心点。 */ + OPTIONALCENTER: "OPTIONALCENTER" +}; +/** + * @enum TurnType + * @description 转弯方向枚举。 + * 用在行驶引导子项类中,表示转弯的方向。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TurnType } from '{npm}'; + * + * const result = TurnType.AHEAD; + * ``` + */ + +var TurnType = { + /** 向前直行。 */ + AHEAD: "AHEAD", + + /** 掉头。 */ + BACK: "BACK", + + /** 终点,不拐弯。 */ + END: "END", + + /** 左转弯。 */ + LEFT: "LEFT", + + /** 无效值。 */ + NONE: "NONE", + + /** 右转弯。 */ + RIGHT: "RIGHT" +}; +/** + * @enum BufferEndType + * @description 缓冲区分析BufferEnd类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BufferEndType } from '{npm}'; + * + * const result = BufferEndType.FLAT; + * ``` + */ + +var BufferEndType = { + /** FLAT */ + FLAT: "FLAT", + + /** ROUND */ + ROUND: "ROUND" +}; +/** + * @enum OverlayOperationType + * @description 叠加分析类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OverlayOperationType } from '{npm}'; + * + * const result = OverlayOperationType.CLIP; + * ``` + */ + +var OverlayOperationType = { + /** 操作数据集(几何对象)裁剪被操作数据集(几何对象)。 */ + CLIP: "CLIP", + + /** 在被操作数据集(几何对象)上擦除掉与操作数据集(几何对象)相重合的部分。 */ + ERASE: "ERASE", + + /**对被操作数据集(几何对象)进行同一操作,即操作执行后,被操作数据集(几何对象)包含来自操作数据集(几何对象)的几何形状。 */ + IDENTITY: "IDENTITY", + + /** 对两个数据集(几何对象)求交,返回两个数据集(几何对象)的交集。 */ + INTERSECT: "INTERSECT", + + /** 对两个面数据集(几何对象)进行合并操作。 */ + UNION: "UNION", + + /** 对两个面数据集(几何对象)进行更新操作。 */ + UPDATE: "UPDATE", + + /** 对两个面数据集(几何对象)进行对称差操作。 */ + XOR: "XOR" +}; +/** + * @enum OutputType + * @description 分布式分析输出类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OutputType } from '{npm}'; + * + * const result = OutputType.INDEXEDHDFS; + * ``` + */ + +var OutputType = { + /** INDEXEDHDFS */ + INDEXEDHDFS: "INDEXEDHDFS", + + /** UDB */ + UDB: "UDB", + + /** MONGODB */ + MONGODB: "MONGODB", + + /** PG */ + PG: "PG" +}; +/** + * @enum SmoothMethod + * @description 光滑方法枚举。 + * 用于从Grid 或DEM数据生成等值线或等值面时对等值线或者等值面的边界线进行平滑处理的方法。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SmoothMethod } from '{npm}'; + * + * const result = SmoothMethod.BSPLINE; + * ``` + */ + +var SmoothMethod = { + /** B 样条法。 */ + BSPLINE: "BSPLINE", + + /** 磨角法。 */ + POLISH: "POLISH" +}; +/** + * @enum SurfaceAnalystMethod + * @description 表面分析方法枚举。 + * 通过对数据进行表面分析,能够挖掘原始数据所包含的信息,使某些细节明显化,易于分析。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SurfaceAnalystMethod } from '{npm}'; + * + * const result = SurfaceAnalystMethod.ISOLINE; + * ``` + */ + +var SurfaceAnalystMethod = { + /** 等值线提取。 */ + ISOLINE: "ISOLINE", + + /** 等值面提取。 */ + ISOREGION: "ISOREGION" +}; +/** + * @enum DataReturnMode + * @description 数据返回模式枚举。 + * 该枚举用于指定空间分析返回结果模式,包含返回数据集标识和记录集、只返回数据集标识(数据集名称@数据源名称)及只返回记录集三种模式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataReturnMode } from '{npm}'; + * + * const result = DataReturnMode.DATASET_AND_RECORDSET; + * ``` + */ + +var DataReturnMode = { + /** 返回结果数据集标识(数据集名称@数据源名称)和记录集(RecordSet)。 */ + DATASET_AND_RECORDSET: "DATASET_AND_RECORDSET", + + /** 只返回数据集标识(数据集名称@数据源名称)。 */ + DATASET_ONLY: "DATASET_ONLY", + + /** 只返回记录集(RecordSet)。 */ + RECORDSET_ONLY: "RECORDSET_ONLY" +}; +/** + * @enum EditType + * @description 要素集更新模式枚举。 + * 该枚举用于指定数据服务中要素集更新模式,包含添加要素集、更新要素集和删除要素集。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EditType } from '{npm}'; + * + * const result = {namespace}.EditType.ADD; + * ``` + */ + +var EditType = { + /** 增加操作。 */ + ADD: "add", + + /** 修改操作。 */ + UPDATE: "update", + + /** 删除操作。 */ + DELETE: "delete" +}; +/** + * @enum TransferTactic + * @description 公交换乘策略枚举。 + * 该枚举用于指定公交服务中要素集更新模式,包含添加要素集、更新要素集和删除要素集。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TransferTactic } from '{npm}'; + * + * const result = TransferTactic.LESS_TIME; + * ``` + */ + +var TransferTactic = { + /** 时间短。 */ + LESS_TIME: "LESS_TIME", + + /** 少换乘。 */ + LESS_TRANSFER: "LESS_TRANSFER", + + /** 少步行。 */ + LESS_WALK: "LESS_WALK", + + /** 距离最短。 */ + MIN_DISTANCE: "MIN_DISTANCE" +}; +/** + * @enum TransferPreference + * @description 公交换乘策略枚举。 + * 该枚举用于指定交通换乘服务中设置地铁优先、公交优先、不乘地铁、无偏好等偏好设置。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TransferPreference } from '{npm}'; + * + * const result = TransferPreference.BUS; + * ``` + */ + +var TransferPreference = { + /** 公交汽车优先。 */ + BUS: "BUS", + + /** 地铁优先。 */ + SUBWAY: "SUBWAY", + + /** 不乘坐地铁。 */ + NO_SUBWAY: "NO_SUBWAY", + + /** 无乘车偏好。 */ + NONE: "NONE" +}; +/** + * @enum GridType + * @description 地图背景格网类型枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GridType } from '{npm}'; + * + * const result = GridType.CROSS; + * ``` + */ + +var GridType = { + /** 十字叉丝。 */ + CROSS: "CROSS", + + /** 网格线。 */ + GRID: "GRID", + + /** 点。 */ + POINT: "POINT" +}; +/** + * @enum ColorSpaceType + * @description 色彩空间枚举。 + * 由于成色原理的不同,决定了显示器、投影仪这类靠色光直接合成颜色的颜色设备和打印机、 + * 印刷机这类靠使用颜料的印刷设备在生成颜色方式上的区别。 + * 针对上述不同成色方式,SuperMap 提供两种色彩空间, + * 分别为 RGB 和 CMYK。RGB 主要用于显示系统中,CMYK 主要用于印刷系统中。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ColorSpaceType } from '{npm}'; + * + * const result = ColorSpaceType.CMYK; + * ``` + */ + +var ColorSpaceType = { + /** 该类型主要在印刷系统使用。 */ + CMYK: "CMYK", + + /** 该类型主要在显示系统中使用。 */ + RGB: "RGB" +}; +/** + * @enum LayerType + * @description 图层类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { LayerType } from '{npm}'; + * + * const result = LayerType.UGC; + * ``` + */ + +var LayerType = { + /** SuperMap UGC 类型图层。如矢量图层、栅格(Grid)图层、影像图层。 */ + UGC: "UGC", + + /** WMS 图层。 */ + WMS: "WMS", + + /** WFS 图层。 */ + WFS: "WFS", + + /** 自定义图层。 */ + CUSTOM: "CUSTOM" +}; +/** + * @enum UGCLayerType + * @description SuperMap 图层类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { UGCLayerType } from '{npm}'; + * + * const result = UGCLayerType.THEME; + * ``` + */ + +var UGCLayerType = { + /** 专题图层。 */ + THEME: "THEME", + + /** 矢量图层。 */ + VECTOR: "VECTOR", + + /** 栅格图层。。 */ + GRID: "GRID", + + /** 影像图层。 */ + IMAGE: "IMAGE" +}; +/** + * @enum StatisticMode + * @description 字段统计方法类型。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { StatisticMode } from '{npm}'; + * + * const result = StatisticMode.AVERAGE; + * ``` + */ + +var StatisticMode = { + /** 统计所选字段的平均值。 */ + AVERAGE: "AVERAGE", + + /** 统计所选字段的最大值。 */ + MAX: "MAX", + + /** 统计所选字段的最小值。 */ + MIN: "MIN", + + /** 统计所选字段的标准差 */ + STDDEVIATION: "STDDEVIATION", + + /** 统计所选字段的总和。 */ + SUM: "SUM", + + /** 统计所选字段的方差。 */ + VARIANCE: "VARIANCE" +}; +/** + * @enum PixelFormat + * @description 栅格与影像数据存储的像素格式枚举。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { PixelFormat } from '{npm}'; + * + * const result = PixelFormat.BIT16; + * ``` + */ + +var PixelFormat = { + /** 每个像元用16个比特(即2个字节)表示。 */ + BIT16: "BIT16", + + /** 每个像元用32个比特(即4个字节)表示。 */ + BIT32: "BIT32", + + /** 每个像元用64个比特(即8个字节)表示,只提供给栅格数据集使用。 */ + BIT64: "BIT64", + + /** 每个像元用4个字节来表示,只提供给栅格数据集使用。 */ + SINGLE: "SINGLE", + + /** 每个像元用8个字节来表示,只提供给栅格数据集使用。 */ + DOUBLE: "DOUBLE", + + /** 每个像元用1个比特表示。 */ + UBIT1: "UBIT1", + + /** 每个像元用4个比特来表示。 */ + UBIT4: "UBIT4", + + /** 每个像元用8个比特(即1个字节)来表示。 */ + UBIT8: "UBIT8", + + /** 每个像元用24个比特(即3个字节)来表示。 */ + UBIT24: "UBIT24", + + /** 每个像元用32个比特(即4个字节)来表示。 */ + UBIT32: "UBIT32" +}; +/** + * @enum SearchMode + * @description 内插时使用的样本点的查找方式枚举 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SearchMode } from '{npm}'; + * + * const result = SearchMode.KDTREE_FIXED_COUNT; + * ``` + */ + +var SearchMode = { + /** 使用 KDTREE 的固定点数方式查找参与内插分析的点。 */ + KDTREE_FIXED_COUNT: "KDTREE_FIXED_COUNT", + + /** 使用 KDTREE 的定长方式查找参与内插分析的点。 */ + KDTREE_FIXED_RADIUS: "KDTREE_FIXED_RADIUS", + + /** 不进行查找,使用所有的输入点进行内插分析。 */ + NONE: "NONE", + + /** 使用 QUADTREE 方式查找参与内插分析的点,仅对样条(RBF)插值和普通克吕金(Kriging)有用。 */ + QUADTREE: "QUADTREE" +}; +/** + * @enum InterpolationAlgorithmType + * @description 插值分析的算法的类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { InterpolationAlgorithmType } from '{npm}'; + * + * const result = InterpolationAlgorithmType.KRIGING; + * ``` + */ + +var InterpolationAlgorithmType = { + /** 普通克吕金插值法。 */ + KRIGING: "KRIGING", + + /** 简单克吕金插值法。 */ + SimpleKriging: "SimpleKriging", + + /** 泛克吕金插值法。 */ + UniversalKriging: "UniversalKriging" +}; +/** + * @enum VariogramMode + * @description 克吕金(Kriging)插值时的半变函数类型枚举 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { VariogramMode } from '{npm}'; + * + * const result = VariogramMode.EXPONENTIAL; + * ``` + */ + +var VariogramMode = { + /** 指数函数。 */ + EXPONENTIAL: "EXPONENTIAL", + + /** 高斯函数。 */ + GAUSSIAN: "GAUSSIAN", + + /** 球型函数。 */ + SPHERICAL: "SPHERICAL" +}; +/** + * @enum Exponent + * @description 定义了泛克吕金(UniversalKriging)插值时样点数据中趋势面方程的阶数 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Exponent } from '{npm}'; + * + * const result = Exponent.EXP1; + * ``` + */ + +var Exponent = { + /** 阶数为1。 */ + EXP1: "EXP1", + + /** 阶数为2。 */ + EXP2: "EXP2" +}; +/** + * @enum ClientType + * @description token申请的客户端标识类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ClientType } from '{npm}'; + * + * const result = ClientType.IP; + * ``` + */ + +var ClientType = { + /** 指定的 IP 地址。 */ + IP: "IP", + + /** 指定的 URL。 */ + REFERER: "Referer", + + /** 发送申请令牌请求的客户端 IP。 */ + REQUESTIP: "RequestIP", + + /** 不做任何验证。 */ + NONE: "NONE", + + /** SERVER。 */ + SERVER: "SERVER", + + /** WEB。 */ + WEB: "WEB" +}; +/** + * @enum ChartType + * @description 客户端专题图图表类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ChartType } from '{npm}'; + * + * const result = ChartType.BAR; + * ``` + */ + +var ChartType = { + /** 柱状图。 */ + BAR: "Bar", + + /** 三维柱状图。 */ + BAR3D: "Bar3D", + + /** 圆形图。 */ + CIRCLE: "Circle", + + /** 饼图。 */ + PIE: "Pie", + + /** 散点图。 */ + POINT: "Point", + + /** 折线图。 */ + LINE: "Line", + + /** 环状图。 */ + RING: "Ring" +}; +/** + * @enum ClipAnalystMode + * @description 裁剪分析模式 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ClipAnalystMode } from '{npm}'; + * + * const result = ClipAnalystMode.CLIP; + * ``` + */ + +var ClipAnalystMode = { + /** CLIP。 */ + CLIP: "clip", + + /** INTERSECT。 */ + INTERSECT: "intersect" +}; +/** + * @enum AnalystAreaUnit + * @description 分布式分析面积单位 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AnalystAreaUnit } from '{npm}'; + * + * const result = AnalystAreaUnit.SQUAREMETER; + * ``` + */ + +var AnalystAreaUnit = { + /** 平方米。 */ + "SQUAREMETER": "SquareMeter", + + /** 平方千米。 */ + "SQUAREKILOMETER": "SquareKiloMeter", + + /** 公顷。 */ + "HECTARE": "Hectare", + + /** 公亩。 */ + "ARE": "Are", + + /** 英亩。 */ + "ACRE": "Acre", + + /** 平方英尺。 */ + "SQUAREFOOT": "SquareFoot", + + /** 平方码。 */ + "SQUAREYARD": "SquareYard", + + /** 平方英里。 */ + "SQUAREMILE": "SquareMile" +}; +/** + * @enum AnalystSizeUnit + * @description 分布式分析单位 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AnalystSizeUnit } from '{npm}'; + * + * const result = AnalystSizeUnit.METER; + * ``` + */ + +var AnalystSizeUnit = { + /** 米。 */ + "METER": "Meter", + + /** 千米。 */ + "KILOMETER": "Kilometer", + + /** 码。 */ + "YARD": "Yard", + + /** 英尺。 */ + "FOOT": "Foot", + + /** 英里。 */ + "MILE": "Mile" +}; +/** + * @enum StatisticAnalystMode + * @description 分布式分析统计模式 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { StatisticAnalystMode } from '{npm}'; + * + * const result = StatisticAnalystMode.MAX; + * ``` + */ + +var StatisticAnalystMode = { + /** 统计所选字段的最大值。 */ + "MAX": "max", + + /** 统计所选字段的最小值。 */ + "MIN": "min", + + /** 统计所选字段的平均值。 */ + "AVERAGE": "average", + + /** 统计所选字段的总和。 */ + "SUM": "sum", + + /** 统计所选字段的方差。 */ + "VARIANCE": "variance", + + /** 统计所选字段的标准差 */ + "STDDEVIATION": "stdDeviation" +}; +/** + * @enum SummaryType + * @description 分布式分析聚合类型 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SummaryType } from '{npm}'; + * + * const result = SummaryType.SUMMARYMESH; + * ``` + */ + +var SummaryType = { + /** 格网聚合。 */ + "SUMMARYMESH": "SUMMARYMESH", + + /** 多边形聚合。 */ + "SUMMARYREGION": "SUMMARYREGION" +}; +/** + * @enum TopologyValidatorRule + * @description 拓扑检查模式枚举。该类定义了拓扑检查操作模式常量。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { TopologyValidatorRule } from '{npm}'; + * + * const result = TopologyValidatorRule.REGIONNOOVERLAP; + * ``` + */ + +var TopologyValidatorRule = { + /** 面内无重叠,用于对面数据进行拓扑检查。 */ + REGIONNOOVERLAP: "REGIONNOOVERLAP", + + /** 面与面无重叠,用于对面数据进行拓扑检查。 */ + REGIONNOOVERLAPWITH: "REGIONNOOVERLAPWITH", + + /** 面被面包含,用于对面数据进行拓扑检查。 */ + REGIONCONTAINEDBYREGION: "REGIONCONTAINEDBYREGION", + + /** 面被面覆盖,用于对面数据进行拓扑检查。 */ + REGIONCOVEREDBYREGION: "REGIONCOVEREDBYREGION", + + /** 线与线无重叠,用于对线数据进行拓扑检查。 */ + LINENOOVERLAP: "LINENOOVERLAP", + + /** 线内无重叠,用于对线数据进行拓扑检查。 */ + LINENOOVERLAPWITH: "LINENOOVERLAPWITH", + + /** 点不相同,用于对点数据进行拓扑检查。 */ + POINTNOIDENTICAL: "POINTNOIDENTICAL" +}; +/** + * @enum BucketAggType + * @description 格网聚合查询枚举类,该类定义了Elasticsearch数据服务中聚合查询模式常量 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { BucketAggType } from '{npm}'; + * + * const result = BucketAggType.GEOHASH_GRID; + * ``` + */ + +var BucketAggType = { + /** 格网聚合类型 */ + GEOHASH_GRID: "geohash_grid" +}; +/** + * @enum MetricsAggType + * @description 指标聚合类型枚举类,该类定义了Elasticsearch数据服务中聚合查询模式常量 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { MetricsAggType } from '{npm}'; + * + * const result = MetricsAggType.AVG; + * ``` + */ + +var MetricsAggType = { + /** 平均值聚合类型 */ + AVG: 'avg', + + /** 最大值聚合类型 */ + MAX: 'max', + + /** 最小值聚合类型 */ + MIN: 'min', + + /** 求和聚合类型 */ + SUM: 'sum' +}; +/** + * @enum GetFeatureMode + * @description feature 查询方式。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.BOUNDS; + * ``` + */ + +var GetFeatureMode = { + /** 通过范围查询来获取要素。 */ + BOUNDS: "BOUNDS", + + /** 通过几何对象的缓冲区来获取要素。 */ + BUFFER: "BUFFER", + + /** 通过 ID 来获取要素。 */ + ID: "ID", + + /** 通过空间查询模式来获取要素。 */ + SPATIAL: "SPATIAL", + + /** 通过 SQL 查询来获取要素。 */ + SQL: 'SQL' +}; +/** + * @enum RasterFunctionType + * @description 栅格分析方法。 + * @category BaseTypes Constant + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.NDVI; + * ``` + */ + +var RasterFunctionType = { + /** 归一化植被指数。 */ + NDVI: "NDVI", + + /** 阴影面分析。 */ + HILLSHADE: "HILLSHADE" +}; +/** + * @enum ResourceType + * @description iportal资源类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { GetFeatureMode } from '{npm}'; + * + * const result = GetFeatureMode.MAP; + * ``` + */ + +var ResourceType = { + /** 地图。 */ + MAP: "MAP", + + /** 服务。 */ + SERVICE: "SERVICE", + + /** 场景。 */ + SCENE: "SCENE", + + /** 数据。 */ + DATA: "DATA", + + /** 洞察。 */ + INSIGHTS_WORKSPACE: "INSIGHTS_WORKSPACE", + + /** 大屏。 */ + MAP_DASHBOARD: "MAP_DASHBOARD" +}; +/** + * @enum OrderBy + * @description iportal资源排序字段。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OrderBy } from '{npm}'; + * + * const result = OrderBy.UPDATETIME; + * ``` + */ + +var OrderBy = { + /** 按更新时间排序 */ + UPDATETIME: "UPDATETIME", + + /** 按热度(可能是访问量、下载量)排序 */ + HEATLEVEL: "HEATLEVEL", + + /** 按相关性排序 */ + RELEVANCE: "RELEVANCE" +}; +/** + * @enum OrderType + * @description iportal资源升序还是降序过滤 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { OrderType } from '{npm}'; + * + * const result = OrderType.ASC; + * ``` + */ + +var OrderType = { + /** 升序 */ + ASC: "ASC", + + /** 降序 */ + DESC: "DESC" +}; +/** + * @enum SearchType + * @description iportal资源查询的范围进行过滤 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { SearchType } from '{npm}'; + * + * const result = SearchType.PUBLIC; + * ``` + */ + +var SearchType = { + /** 公开资源。 */ + PUBLIC: "PUBLIC", + + /** 我的资源。 */ + MY_RES: "MY_RES", + + /** 我的群组资源。 */ + MYGROUP_RES: "MYGROUP_RES", + + /** 我的部门资源。 */ + MYDEPARTMENT_RES: "MYDEPARTMENT_RES", + + /** 分享给我的资源。 */ + SHARETOME_RES: "SHARETOME_RES" +}; +/** + * @enum AggregationTypes + * @description iportal资源聚合查询的类型 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { AggregationTypes } from '{npm}'; + * + * const result = AggregationTypes.TAG; + * ``` + */ + +var AggregationTypes = { + /** 标签 */ + TAG: "TAG", + + /** 资源类型 */ + TYPE: "TYPE" +}; +/** + * @enum PermissionType + * @description iportal资源权限类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { PermissionType } from '{npm}'; + * + * const result = PermissionType.SEARCH; + * ``` + */ + +var PermissionType = { + /** 可检索 */ + SEARCH: "SEARCH", + + /** 可查看 */ + READ: "READ", + + /** 可编辑 */ + READWRITE: "READWRITE", + + /** 可删除 */ + DELETE: "DELETE", + + /** 可下载,包括可读、可检索 */ + DOWNLOAD: "DOWNLOAD" +}; +/** + * @enum EntityType + * @description iportal资源实体类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { EntityType } from '{npm}'; + * + * const result = EntityType.DEPARTMENT; + * ``` + */ + +var EntityType = { + /** 部门 */ + DEPARTMENT: "DEPARTMENT", + + /** 用户组 */ + GROUP: "GROUP", + + /** 群组 */ + IPORTALGROUP: "IPORTALGROUP", + + /** 角色 */ + ROLE: "ROLE", + + /** 用户 */ + USER: "USER" +}; +/** + * @enum DataItemType + * @description iportal数据类型。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataItemType } from '{npm}'; + * + * const result = DataItemType.GEOJSON; + * ``` + */ + +var DataItemType = { + /** geojson数据。 */ + GEOJSON: "GEOJSON", + + /** UGCV5_MVT */ + UGCV5_MVT: "UGCV5_MVT", + + /** json数据 */ + JSON: "JSON", + + /** AUDIO */ + AUDIO: "AUDIO", + + /** COLOR */ + COLOR: "COLOR", + + /** COLORSCHEME */ + COLORSCHEME: "COLORSCHEME", + + /** CSV */ + CSV: "CSV", + + /** EXCEL */ + EXCEL: "EXCEL", + + /** FILLSYMBOL */ + FILLSYMBOL: "FILLSYMBOL", + + /** IMAGE */ + IMAGE: "IMAGE", + + /** LAYERTEMPLATE */ + LAYERTEMPLATE: "LAYERTEMPLATE", + + /** LAYOUTTEMPLATE */ + LAYOUTTEMPLATE: "LAYOUTTEMPLATE", + + /** LINESYMBOL */ + LINESYMBOL: "LINESYMBOL", + + /** MAPTEMPLATE */ + MAPTEMPLATE: "MAPTEMPLATE", + + /** MARKERSYMBOL */ + MARKERSYMBOL: "MARKERSYMBOL", + + /** MBTILES */ + MBTILES: "MBTILES", + + /** PHOTOS */ + PHOTOS: "PHOTOS", + + /** SHP */ + SHP: "SHP", + + /** SMTILES */ + SMTILES: "SMTILES", + + /** SVTILES */ + SVTILES: "SVTILES", + + /** THEMETEMPLATE */ + THEMETEMPLATE: "THEMETEMPLATE", + + /** TPK */ + TPK: "TPK", + + /** UDB */ + UDB: "UDB", + + /** UGCV5 */ + UGCV5: "UGCV5", + + /** UNKNOWN */ + UNKNOWN: "UNKNOWN", + + /** VIDEO */ + VIDEO: "VIDEO", + + /** WORKENVIRONMENT */ + WORKENVIRONMENT: "WORKENVIRONMENT", + + /** WORKSPACE */ + WORKSPACE: "WORKSPACE" +}; +/** + * @enum WebExportFormatType + * @description Web 打印输出的格式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebExportFormatType } from '{npm}'; + * + * const result = WebExportFormatType.PNG; + * ``` + */ + +var WebExportFormatType = { + /** png */ + PNG: "PNG", + + /** pdf */ + PDF: "PDF" +}; +/** + * @enum WebScaleOrientationType + * @description Web 比例尺的方位样式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleOrientationType } from '{npm}'; + * + * const result = WebScaleOrientationType.HORIZONTALLABELSBELOW; + * ``` + */ + +var WebScaleOrientationType = { + /** horizontal labels below */ + HORIZONTALLABELSBELOW: "HORIZONTALLABELSBELOW", + + /** horizontal labels above */ + HORIZONTALLABELSABOVE: "HORIZONTALLABELSABOVE", + + /** vertical labels left */ + VERTICALLABELSLEFT: "VERTICALLABELSLEFT", + + /** vertical labels right */ + VERTICALLABELSRIGHT: "VERTICALLABELSRIGHT" +}; +/** + * @enum WebScaleType + * @description Web 比例尺的样式。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleType } from '{npm}'; + * + * const result = WebScaleType.LINE; + * ``` + */ + +var WebScaleType = { + /** line */ + LINE: "LINE", + + /** bar */ + BAR: "BAR", + + /** bar sub */ + BAR_SUB: "BAR_SUB" +}; +/** + * @enum WebScaleUnit + * @description Web 比例尺的单位制。 + * @category BaseTypes Constant + * @version 10.0.1 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { WebScaleUnit } from '{npm}'; + * + * const result = WebScaleUnit.METER; + * ``` + */ + +var WebScaleUnit = { + /** 米 */ + METER: "METER", + + /** 英尺 */ + FOOT: "FOOT", + + /** 度 */ + DEGREES: "DEGREES" +}; + +;// CONCATENATED MODULE: ./src/common/commontypes/Size.js +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Size + * @deprecatedclass SuperMap.Size + * @category BaseTypes Style + * @classdesc 此类描绘一对高宽值的实例。 + * @param {number} [w=0.0] - 宽度。 + * @param {number} [h=0.0] - 高度。 + * + * @example + * var size = new Size(31,46); + * @usage + */ +var Size = /*#__PURE__*/function () { + function Size(w, h) { + _classCallCheck(this, Size); + + /** + * @member {number} [Size.prototype.w=0.0] + * @description 宽度。 + */ + this.w = w ? parseFloat(w) : 0.0; + /** + * @member {number} [Size.prototype.h=0.0] + * @description 高度。 + */ + + this.h = w ? parseFloat(h) : 0.0; + this.CLASS_NAME = "SuperMap.Size"; + } + /** + * @function Size.prototype.toString + * @description 返回字符串形式。 + * @example + * var size = new Size(10,5); + * var str = size.toString(); + * @returns {string} 例如:"w=10,h=5"。 + */ + + + _createClass(Size, [{ + key: "toString", + value: function toString() { + return "w=" + this.w + ",h=" + this.h; + } + /** + * @function Size.prototype.clone + * @description 克隆当前size对象。 + * @example + * var size = new Size(31,46); + * var size2 = size.clone(); + * @returns {Size} 新的与当前 size 对象有相同宽、高的 Size 对象。 + */ + + }, { + key: "clone", + value: function clone() { + return new Size(this.w, this.h); + } + /** + * + * @function Size.prototype.equals + * @description 比较两个 size 对象是否相等。 + * @example + * var size = new Size(31,46); + * var size2 = new Size(31,46); + * var isEquals = size.equals(size2); + * + * @param {Size} sz - 用于比较相等的 Size 对象。 + * @returns {boolean} 传入的 size 和当前 size 高宽相等,注意:如果传入的 size 为空则返回 false。 + * + */ + + }, { + key: "equals", + value: function equals(sz) { + var equals = false; + + if (sz != null) { + equals = this.w === sz.w && this.h === sz.h || isNaN(this.w) && isNaN(this.h) && isNaN(sz.w) && isNaN(sz.h); + } + + return equals; + } + /** + * + * @function Size.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var size = new Size(31,46); + * size.destroy(); + */ + + }, { + key: "destroy", + value: function destroy() { + this.w = null; + this.h = null; + } + }]); + + return Size; +}(); +;// CONCATENATED MODULE: ./src/common/commontypes/Pixel.js +function Pixel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Pixel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Pixel_createClass(Constructor, protoProps, staticProps) { if (protoProps) Pixel_defineProperties(Constructor.prototype, protoProps); if (staticProps) Pixel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Pixel + * @deprecatedclass SuperMap.Pixel + * @category BaseTypes Geometry + * @classdesc 用 x,y 坐标描绘屏幕坐标(像素点)。 + * @param {number} [x=0.0] - x 坐标。 + * @param {number} [y=0.0] - y 坐标。 + * @param {Pixel.Mode} [mode=Pixel.Mode.LeftTop] - 坐标模式。 + * + * @example + * //单独创建一个对象 + * var pixcel = new Pixel(100,50); + * + * //依据 size 创建 + * var size = new Size(21,25); + * var offset = new Pixel(-(size.w/2), -size.h); + * @usage + */ +var Pixel = /*#__PURE__*/function () { + function Pixel(x, y, mode) { + Pixel_classCallCheck(this, Pixel); + + /** + * @member {number} [Pixel.prototype.x=0.0] + * @description x 坐标。 + */ + this.x = x ? parseFloat(x) : 0.0; + /** + * @member {number} [Pixel.prototype.y=0.0] + * @description y 坐标。 + */ + + this.y = y ? parseFloat(y) : 0.0; + /** + * @member {Pixel.Mode} [Pixel.prototype.mode=Pixel.Mode.LeftTop] + * @description 坐标模式,有左上、右上、右下、左下这几种模式,分别表示相对于左上角、右上角、右下角、左下角的坐标。 + */ + + this.mode = mode; + this.CLASS_NAME = 'SuperMap.Pixel'; + } + /** + * @function Pixel.prototype.toString + * @description 返回此对象的字符串形式。 + * @example + * + * var pixcel = new Pixel(100,50); + * var str = pixcel.toString(); + * + * @returns {string} 例如: "x=200.4,y=242.2" + */ + + + Pixel_createClass(Pixel, [{ + key: "toString", + value: function toString() { + return 'x=' + this.x + ',y=' + this.y; + } + /** + * @function Pixel.prototype.clone + * @description 克隆当前的 pixel 对象。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = pixcel.clone(); + * @returns {Pixel} 新的与当前 pixel 对象有相同 x、y 坐标的 pixel 对象。 + */ + + }, { + key: "clone", + value: function clone() { + return new Pixel(this.x, this.y, this.mode); + } + /** + * @function Pixel.prototype.equals + * @description 比较两 pixel 是否相等。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(100,50); + * var isEquals = pixcel.equals(pixcel2); + * + * @param {Pixel} px - 用于比较相等的 pixel 对象。 + * @returns {boolean} 如果传入的像素点和当前像素点相同返回 true,如果不同或传入参数为 NULL 则返回 false。 + */ + + }, { + key: "equals", + value: function equals(px) { + var equals = false; + + if (px != null) { + equals = this.x == px.x && this.y == px.y || isNaN(this.x) && isNaN(this.y) && isNaN(px.x) && isNaN(px.y); + } + + return equals; + } + /** + * @function Pixel.prototype.distanceTo + * @description 返回两个 pixel 的距离。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(110,30); + * var distance = pixcel.distanceTo(pixcel2); + * + * @param {Pixel} px - 需要计算的 pixel。 + * @returns {number} 作为参数传入的像素与当前像素点的距离。 + */ + + }, { + key: "distanceTo", + value: function distanceTo(px) { + return Math.sqrt(Math.pow(this.x - px.x, 2) + Math.pow(this.y - px.y, 2)); + } + /** + * @function Pixel.prototype.add + * @description 在原来像素坐标基础上,x 值加上传入的 x 参数,y 值加上传入的 y 参数。 + * @example + * var pixcel = new Pixel(100,50); + * //pixcel2是新的对象 + * var pixcel2 = pixcel.add(20,30); + * + * @param {number} x - 传入的 x 值。 + * @param {number} y - 传入的 y 值。 + * @returns {Pixel} 新的 pixel 对象,该 pixel 是由当前的 pixel 与传入的 x,y 相加得到。 + */ + + }, { + key: "add", + value: function add(x, y) { + if (x == null || y == null) { + throw new TypeError('Pixel.add cannot receive null values'); + } + + return new Pixel(this.x + x, this.y + y); + } + /** + * @function Pixel.prototype.offset + * @description 通过传入的 {@link Pixel} 参数对原屏幕坐标进行偏移。 + * @example + * var pixcel = new Pixel(100,50); + * var pixcel2 = new Pixel(130,20); + * //pixcel3 是新的对象 + * var pixcel3 = pixcel.offset(pixcel2); + * + * @param {Pixel} px - 传入的 {@link Pixel} 对象。 + * @returns {Pixel} 新的 pixel,该 pixel 是由当前的 pixel 对象的 x,y 值与传入的 Pixel 对象的 x,y 值相加得到。 + */ + + }, { + key: "offset", + value: function offset(px) { + var newPx = this.clone(); + + if (px) { + newPx = this.add(px.x, px.y); + } + + return newPx; + } + /** + * + * @function Pixel.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var pixcel = new Pixel(100,50); + * pixcel.destroy(); + */ + + }, { + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.mode = null; + } + }]); + + return Pixel; +}(); +/** + * @enum Mode + * @memberOf Pixel + * @readonly + * @description 模式。 + * @type {string} + */ + +Pixel.Mode = { + /** 左上模式。*/ + LeftTop: 'lefttop', + + /** 右上模式。 */ + RightTop: 'righttop', + + /** 右下模式。 */ + RightBottom: 'rightbottom', + + /** 左下模式。 */ + LeftBottom: 'leftbottom' +}; +;// CONCATENATED MODULE: ./src/common/commontypes/BaseTypes.js +function BaseTypes_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BaseTypes_createClass(Constructor, protoProps, staticProps) { if (protoProps) BaseTypes_defineProperties(Constructor.prototype, protoProps); if (staticProps) BaseTypes_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function BaseTypes_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @function inherit + * @description 除了 C 和 P 两个必要参数外,可以传递任意数量的对象,这些对象都将继承C。 + * @param {Object} C - 继承的类。 + * @param {Object} P - 被继承的父类。 + * @private + */ + +var inheritExt = function inheritExt(C, P) { + var F = function F() {}; + + F.prototype = P.prototype; + C.prototype = new F(); + var i, l, o; + + for (i = 2, l = arguments.length; i < l; i++) { + o = arguments[i]; + + if (typeof o === "function") { + o = o.prototype; + } + + Util.extend(C.prototype, o); + } +}; +/** + * @function mixinExt + * @description 实现多重继承。 + * @param {Class|Object} ...mixins - 继承的类。 + * @private + */ + +var mixinExt = function mixinExt() { + for (var _len = arguments.length, mixins = new Array(_len), _key = 0; _key < _len; _key++) { + mixins[_key] = arguments[_key]; + } + + var Mix = /*#__PURE__*/BaseTypes_createClass(function Mix(options) { + BaseTypes_classCallCheck(this, Mix); + + for (var index = 0; index < mixins.length; index++) { + copyProperties(this, new mixins[index](options)); + } + }); + + for (var index = 0; index < mixins.length; index++) { + var mixin = mixins[index]; + copyProperties(Mix, mixin); + copyProperties(Mix.prototype, mixin.prototype); + copyProperties(Mix.prototype, new mixin()); + } + + return Mix; + + function copyProperties(target, source) { + var ownKeys = Object.getOwnPropertyNames(source); + + if (Object.getOwnPropertySymbols) { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source)); + } + + for (var index = 0; index < ownKeys.length; index++) { + var key = ownKeys[index]; + + if (key !== "constructor" && key !== "prototype" && key !== "name" && key !== "length") { + var desc = Object.getOwnPropertyDescriptor(source, key); + + if (window["ActiveXObject"]) { + Object.defineProperty(target, key, desc || {}); + } else { + Object.defineProperty(target, key, desc); + } + } + } + } +}; +/** + * @name String + * @namespace + * @category BaseTypes Util + * @description 字符串操作的一系列常用扩展函数。 + * @private + */ + +var StringExt = { + /** + * @function StringExt.startsWith + * @description 判断目标字符串是否以指定的子字符串开头。 + * @param {string} str - 目标字符串。 + * @param {string} sub - 查找的子字符串。 + * @returns {boolean} 目标字符串以指定的子字符串开头,则返回 true;否则返回 false。 + */ + startsWith: function startsWith(str, sub) { + return str.indexOf(sub) == 0; + }, + + /** + * @function StringExt.contains + * @description 判断目标字符串是否包含指定的子字符串。 + * @param {string} str - 目标字符串。 + * @param {string} sub - 查找的子字符串。 + * @returns {boolean} 目标字符串中包含指定的子字符串,则返回 true;否则返回 false。 + */ + contains: function contains(str, sub) { + return str.indexOf(sub) != -1; + }, + + /** + * @function StringExt.trim + * @description 删除一个字符串的开头和结尾处的所有空白字符。 + * @param {string} str - (可能)存在空白字符填塞的字符串。 + * @returns {string} 删除开头和结尾处空白字符后的字符串。 + */ + trim: function trim(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + }, + + /** + * @function StringExt.camelize + * @description 骆驼式("-")连字符的字符串处理。 + * 例如:"chicken-head" becomes "chickenHead", + * "-chicken-head" becomes "ChickenHead"。 + * @param {string} str - 要处理的字符串,原始内容不应被修改。 + * @returns {string} + */ + camelize: function camelize(str) { + var oStringList = str.split('-'); + var camelizedString = oStringList[0]; + + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + + return camelizedString; + }, + + /** + * @function StringExt.format + * @description 提供带 ${token} 标记的字符串, 返回 context 对象属性中指定标记的属性值。 + * @example + * 示例: + * (code) + * 1、template = "${value,getValue}"; + * context = {value: {getValue:function(){return Math.max.apply(null,argument);}}}; + * args = [2,23,12,36,21]; + * 返回值:36 + * (end) + * 示例: + * (code) + * 2、template = "$${{value,getValue}}"; + * context = {value: {getValue:function(){return Math.max.apply(null,argument);}}}; + * args = [2,23,12,36,21]; + * 返回值:"${36}" + * (end) + * 示例: + * (code) + * 3、template = "${a,b}"; + * context = {a: {b:"format"}}; + * args = null; + * 返回值:"format" + * (end) + * 示例: + * (code) + * 3、template = "${a,b}"; + * context = null; + * args = null; + * 返回值:"${a.b}" + * (end) + * @param {string} template - 带标记的字符串将要被替换。参数 template 格式为"${token}",此处的 token 标记会替换为 context["token"] 属性的值。 + * @param {Object} [context=window] - 带有属性的可选对象的属性用于匹配格式化字符串中的标记。如果该参数为空,将使用 window 对象。 + * @param {Array.} [args] - 可选参数传递给在 context 对象上找到的函数。 + * @returns {string} 从 context 对象属性中替换字符串标记位的字符串。 + */ + format: function format(template, context, args) { + if (!context) { + context = window; + } // Example matching: + // str = ${foo.bar} + // match = foo.bar + + + var replacer = function replacer(str, match) { + var replacement; // Loop through all subs. Example: ${a.b.c} + // 0 -> replacement = context[a]; + // 1 -> replacement = context[a][b]; + // 2 -> replacement = context[a][b][c]; + + var subs = match.split(/\.+/); + + for (var i = 0; i < subs.length; i++) { + if (i == 0) { + replacement = context; + } + + replacement = replacement[subs[i]]; + } + + if (typeof replacement === "function") { + replacement = args ? replacement.apply(null, args) : replacement(); + } // If replacement is undefined, return the string 'undefined'. + // This is a workaround for a bugs in browsers not properly + // dealing with non-participating groups in regular expressions: + // http://blog.stevenlevithan.com/archives/npcg-javascript + + + if (typeof replacement == 'undefined') { + return 'undefined'; + } else { + return replacement; + } + }; + + return template.replace(StringExt.tokenRegEx, replacer); + }, + + /** + * @member {RegExp} [StringExt.tokenRegEx] + * @description 寻找带 token 的字符串,默认为 tokenRegEx=/\$\{([\w.]+?)\}/g。 + * @example + * Examples: ${a}, ${a.b.c}, ${a-b}, ${5} + */ + tokenRegEx: /\$\{([\w.]+?)\}/g, + + /** + * @member {RegExp} [StringExt.numberRegEx] + * @description 判断一个字符串是否只包含一个数值,默认为 numberRegEx=/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/。 + */ + numberRegEx: /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/, + + /** + * @function StringExt.isNumeric + * @description 判断一个字符串是否只包含一个数值。 + * @example + * (code) + * StringExt.isNumeric("6.02e23") // true + * StringExt.isNumeric("12 dozen") // false + * StringExt.isNumeric("4") // true + * StringExt.isNumeric(" 4 ") // false + * (end) + * @returns {boolean} 字符串包含唯一的数值,返回 true;否则返回 false。 + */ + isNumeric: function isNumeric(value) { + return StringExt.numberRegEx.test(value); + }, + + /** + * @function StringExt.numericIf + * @description 把一个看似数值型的字符串转化为一个数值。 + * @returns {(number|string)} 如果能转换为数值则返回数值,否则返回字符串本身。 + */ + numericIf: function numericIf(value) { + return StringExt.isNumeric(value) ? parseFloat(value) : value; + } +}; +/** + * @name Number + * @namespace + * @category BaseTypes Util + * @description 数值操作的一系列常用扩展函数。 + * @private + */ + +var NumberExt = { + /** + * @member {string} [NumberExt.decimalSeparator='.'] + * @description 格式化数字时默认的小数点分隔符。 + * @constant + */ + decimalSeparator: ".", + + /** + * @member {string} [NumberExt.thousandsSeparator=','] + * @description 格式化数字时默认的千位分隔符。 + * @constant + */ + thousandsSeparator: ",", + + /** + * @function NumberExt.limitSigDigs + * @description 限制浮点数的有效数字位数。 + * @param {number} num - 浮点数。 + * @param {number} sig - 有效位数。 + * @returns {number} 将数字四舍五入到指定数量的有效位数。 + */ + limitSigDigs: function limitSigDigs(num, sig) { + var fig = 0; + + if (sig > 0) { + fig = parseFloat(num.toPrecision(sig)); + } + + return fig; + }, + + /** + * @function NumberExt.format + * @description 数字格式化输出。 + * @param {number} num - 数字。 + * @param {number} [dec=0] - 数字的小数部分四舍五入到指定的位数。设置为 null 值时小数部分不变。 + * @param {string} [tsep=','] - 千位分隔符。 + * @param {string} [dsep='.'] - 小数点分隔符。 + * @returns {string} 数字格式化后的字符串。 + */ + format: function format(num, dec, tsep, dsep) { + dec = typeof dec != "undefined" ? dec : 0; + tsep = typeof tsep != "undefined" ? tsep : NumberExt.thousandsSeparator; + dsep = typeof dsep != "undefined" ? dsep : NumberExt.decimalSeparator; + + if (dec != null) { + num = parseFloat(num.toFixed(dec)); + } + + var parts = num.toString().split("."); + + if (parts.length === 1 && dec == null) { + // integer where we do not want to touch the decimals + dec = 0; + } + + var integer = parts[0]; + + if (tsep) { + var thousands = /(-?[0-9]+)([0-9]{3})/; + + while (thousands.test(integer)) { + integer = integer.replace(thousands, "$1" + tsep + "$2"); + } + } + + var str; + + if (dec == 0) { + str = integer; + } else { + var rem = parts.length > 1 ? parts[1] : "0"; + + if (dec != null) { + rem = rem + new Array(dec - rem.length + 1).join("0"); + } + + str = integer + dsep + rem; + } + + return str; + } +}; + +if (!Number.prototype.limitSigDigs) { + /** + * APIMethod: Number.limitSigDigs + * 限制浮点数的有效数字位数. + * @param {number} sig -有效位数。 + * @returns {number} 将数字四舍五入到指定数量的有效位数。 + * 如果传入值 为 null、0、或者是负数, 返回值 0。 + */ + Number.prototype.limitSigDigs = function (sig) { + return NumberExt.limitSigDigs(this, sig); + }; +} +/** + * @name Function + * @namespace + * @category BaseTypes Util + * @description 函数操作的一系列常用扩展函数。 + * @private + */ + + +var FunctionExt = { + /** + * @function FunctionExt.bind + * @description 绑定函数到对象。方便创建 this 的作用域。 + * @param {function} func - 输入函数。 + * @param {Object} object - 对象绑定到输入函数(作为输入函数的 this 对象)。 + * @returns {function} object 参数作为 func 函数的 this 对象。 + */ + bind: function bind(func, object) { + // create a reference to all arguments past the second one + var args = Array.prototype.slice.apply(arguments, [2]); + return function () { + // Push on any additional arguments from the actual function call. + // These will come after those sent to the bind call. + var newArgs = args.concat(Array.prototype.slice.apply(arguments, [0])); + return func.apply(object, newArgs); + }; + }, + + /** + * @function FunctionExt.bindAsEventListener + * @description 绑定函数到对象,在调用该函数时配置并使用事件对象作为第一个参数。 + * @param {function} func - 用于监听事件的函数。 + * @param {Object} object - this 对象的引用。 + * @returns {function} + */ + bindAsEventListener: function bindAsEventListener(func, object) { + return function (event) { + return func.call(object, event || window.event); + }; + }, + + /** + * @function FunctionExt.False + * @description 该函数仅仅返回 false。该函数主要是避免在 IE8 以下浏览中 DOM 事件句柄的匿名函数问题。 + * @example + * document.onclick = FunctionExt.False; + * @returns {boolean} + */ + False: function False() { + return false; + }, + + /** + * @function FunctionExt.True + * @description 该函数仅仅返回 true。该函数主要是避免在 IE8 以下浏览中 DOM 事件句柄的匿名函数问题。 + * @example + * document.onclick = FunctionExt.True; + * @returns {boolean} + */ + True: function True() { + return true; + }, + + /** + * @function FunctionExt.Void + * @description 可重用函数,仅仅返回 "undefined"。 + * @returns {undefined} + */ + Void: function Void() {} +}; +/** + * @name Array + * @namespace + * @category BaseTypes Util + * @description 数组操作的一系列常用扩展函数。 + * @private + */ + +var ArrayExt = { + /** + * @function ArrayExt.filter + * @description 过滤数组,提供了 ECMA-262 标准中 Array.prototype.filter 函数的扩展。详见:{@link http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter} + * @param {Array} array - 要过滤的数组。 + * @param {function} callback - 数组中的每一个元素调用该函数。
+ * 如果函数的返回值为 true,该元素将包含在返回的数组中。该函数有三个参数: 数组中的元素,元素的索引,数组自身。
+ * 如果设置了可选参数 caller,在调用 callback 时,使用可选参数 caller 设置为 callback 的参数。
+ * @param {Object} [caller] - 在调用 callback 时,使用参数 caller 设置为 callback 的参数。 + * @returns {Array} callback 函数返回 true 时的元素将作为返回数组中的元素。 + */ + filter: function filter(array, callback, caller) { + var selected = []; + + if (Array.prototype.filter) { + selected = array.filter(callback, caller); + } else { + var len = array.length; + + if (typeof callback != "function") { + throw new TypeError(); + } + + for (var i = 0; i < len; i++) { + if (i in array) { + var val = array[i]; + + if (callback.call(caller, val, i, array)) { + selected.push(val); + } + } + } + } + + return selected; + } +}; +;// CONCATENATED MODULE: ./src/common/commontypes/Geometry.js +function Geometry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Geometry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Geometry_createClass(Constructor, protoProps, staticProps) { if (protoProps) Geometry_defineProperties(Constructor.prototype, protoProps); if (staticProps) Geometry_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +// import {WKT} from '../format/WKT'; +// import {Vector} from './Vector'; + +/** + * @class Geometry + * @deprecatedclass SuperMap.Geometry + * @category BaseTypes Geometry + * @classdesc 几何对象类,描述地理对象的几何图形。 + * @usage + */ + +var Geometry = /*#__PURE__*/function () { + function Geometry() { + Geometry_classCallCheck(this, Geometry); + + this.CLASS_NAME = "SuperMap.Geometry"; + /** + * @member {string} Geometry.prototype.id + * @description 几何对象的唯一标示符。 + * + */ + + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + /** + * @member {Geometry} Geometry.prototype.parent + * @description 父类几何对象。 + */ + + this.parent = null; + /** + * @member {Bounds} Geometry.prototype.bounds + * @description 几何对象的范围。 + * + */ + + this.bounds = null; + /** + * @member {number} Geometry.prototype.SRID + * @description 投影坐标参数。通过该参数,服务器判断 Geometry 对象的坐标参考系是否与数据集相同,如果不同,则在数据入库前进行投影变换。 + * @example + * var geometry= new Geometry(); + * geometry. SRID=4326; + * + */ + + this.SRID = null; + } + /** + * @function Geometry.prototype.destroy + * @description 解构 Geometry 类,释放资源。 + */ + + + Geometry_createClass(Geometry, [{ + key: "destroy", + value: function destroy() { + this.id = null; + this.bounds = null; + this.SRID = null; + } + /** + * @function Geometry.prototype.clone + * @description 克隆几何图形。克隆的几何图形不设置非标准的属性。 + * @returns {Geometry} 克隆的几何图形。 + */ + + }, { + key: "clone", + value: function clone() { + return new Geometry(); + } + /** + * @function Geometry.prototype.setBounds + * @description 设置几何对象的 bounds。 + * @param {Bounds} bounds - 范围。 + */ + + }, { + key: "setBounds", + value: function setBounds(bounds) { + if (bounds) { + this.bounds = bounds.clone(); + } + } + /** + * @function Geometry.prototype.clearBounds + * @description 清除几何对象的 bounds。 + * 如果该对象有父类,也会清除父类几何对象的 bounds。 + */ + + }, { + key: "clearBounds", + value: function clearBounds() { + this.bounds = null; + + if (this.parent) { + this.parent.clearBounds(); + } + } + /** + * @function Geometry.prototype.extendBounds + * @description 扩展现有边界以包含新边界。如果尚未设置几何边界,则设置新边界。 + * @param {Bounds} newBounds - 几何对象的 bounds。 + */ + + }, { + key: "extendBounds", + value: function extendBounds(newBounds) { + var bounds = this.getBounds(); + + if (!bounds) { + this.setBounds(newBounds); + } else { + this.bounds.extend(newBounds); + } + } + /** + * @function Geometry.prototype.getBounds + * @description 获得几何图形的边界。如果没有设置边界,可通过计算获得。 + * @returns {Bounds} 几何对象的边界。 + */ + + }, { + key: "getBounds", + value: function getBounds() { + if (this.bounds == null) { + this.calculateBounds(); + } + + return this.bounds; + } + /** + * @function Geometry.prototype.calculateBounds + * @description 重新计算几何图形的边界(需要在子类中实现此方法)。 + */ + + }, { + key: "calculateBounds", + value: function calculateBounds() {// + // This should be overridden by subclasses. + // + } + /** + * @function Geometry.prototype.getVertices + * @description 返回几何图形的所有顶点的列表(需要在子类中实现此方法)。 + * @param {boolean} [nodes] - 如果是 true,线则只返回线的末端点,如果 false,仅仅返回顶点,如果没有设置,则返回顶点。 + * @returns {Array} 几何图形的顶点列表。 + */ + + }, { + key: "getVertices", + value: function getVertices(nodes) {// eslint-disable-line no-unused-vars + } + /** + * @function Geometry.prototype.getArea + * @description 计算几何对象的面积 ,此方法需要在子类中定义。 + * @returns {number} 计算后的对象面积。 + */ + + }, { + key: "getArea", + value: function getArea() { + //to be overridden by geometries that actually have an area + // + return 0.0; + } // /** + // * @function Geometry.prototype.toString + // * @description 返回geometry对象的字符串表述,需要引入{@link WKTFormat}。此方法只能在子类实现,在父类使用会报错。 + // * @returns {string} geometry对象的字符串表述(Well-Known Text) + // */ + // toString() { + // var string; + // if (WKT) { + // var wkt = new WKT(); + // string = wkt.write(new Vector(this)); + // } else { + // string = Object.prototype.toString.call(this); + // } + // return string; + // } + + }]); + + return Geometry; +}(); +;// CONCATENATED MODULE: ./src/common/commontypes/Util.js +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @description 浏览器名称,依赖于 userAgent 属性,BROWSER_NAME 可以是空,或者以下浏览器: + * * "opera" -- Opera + * * "msie" -- Internet Explorer + * * "safari" -- Safari + * * "firefox" -- Firefox + * * "mozilla" -- Mozilla + * @category BaseTypes Constant + * @constant {Object} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { Browser } from '{npm}'; + * + * const result = Browser.name; + * ``` + */ + +var Browser = function () { + var name = '', + version = '', + device = 'pc', + uaMatch; //以下进行测试 + + var ua = navigator.userAgent.toLowerCase(); + + if (ua.indexOf('msie') > -1 || ua.indexOf('trident') > -1 && ua.indexOf('rv') > -1) { + name = 'msie'; + uaMatch = ua.match(/msie ([\d.]+)/) || ua.match(/rv:([\d.]+)/); + } else if (ua.indexOf('chrome') > -1) { + name = 'chrome'; + uaMatch = ua.match(/chrome\/([\d.]+)/); + } else if (ua.indexOf('firefox') > -1) { + name = 'firefox'; + uaMatch = ua.match(/firefox\/([\d.]+)/); + } else if (ua.indexOf('opera') > -1) { + name = 'opera'; + uaMatch = ua.match(/version\/([\d.]+)/); + } else if (ua.indexOf('safari') > -1) { + name = 'safari'; + uaMatch = ua.match(/version\/([\d.]+)/); + } + + version = uaMatch ? uaMatch[1] : ''; + + if (ua.indexOf('ipad') > -1 || ua.indexOf('ipod') > -1 || ua.indexOf('iphone') > -1) { + device = 'apple'; + } else if (ua.indexOf('android') > -1) { + uaMatch = ua.match(/version\/([\d.]+)/); + version = uaMatch ? uaMatch[1] : ''; + device = 'android'; + } + + return { + name: name, + version: version, + device: device + }; +}(); + +var isSupportCanvas = function () { + var checkRes = true, + broz = Browser; + + if (document.createElement('canvas').getContext) { + if (broz.name === 'firefox' && parseFloat(broz.version) < 5) { + checkRes = false; + } + + if (broz.name === 'safari' && parseFloat(broz.version) < 4) { + checkRes = false; + } + + if (broz.name === 'opera' && parseFloat(broz.version) < 10) { + checkRes = false; + } + + if (broz.name === 'msie' && parseFloat(broz.version) < 9) { + checkRes = false; + } + } else { + checkRes = false; + } + + return checkRes; +}(); +/** + * @description 如果 userAgent 捕获到浏览器使用的是 Gecko 引擎则返回 true。 + * @constant {number} + * @private + */ + + +var IS_GECKO = function () { + var ua = navigator.userAgent.toLowerCase(); + return ua.indexOf('webkit') === -1 && ua.indexOf('gecko') !== -1; +}(); +/** + * @constant {number} + * @default + * @description 分辨率与比例尺之间转换的常量。 + * @private + */ + + +var DOTS_PER_INCH = 96; +/** + * @name CommonUtil + * @namespace + * @category BaseTypes Util + * @description common 工具类。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { CommonUtil } from '{npm}'; + * + * const result = CommonUtil.getElement(); + * ``` + */ + +var Util = { + /** + * @memberOf CommonUtil + * @description 复制源对象的所有属性到目标对象上,源对象上的没有定义的属性在目标对象上也不会被设置。 + * @example + * 要复制 Size 对象的所有属性到自定义对象上,使用方法如下: + * var size = new Size(100, 100); + * var obj = {}; + * CommonUtil.extend(obj, size); + * @param {Object} [destination] - 目标对象。 + * @param {Object} source - 源对象,其属性将被设置到目标对象上。 + * @returns {Object} 目标对象。 + */ + extend: function extend(destination, source) { + destination = destination || {}; + + if (source) { + for (var property in source) { + var value = source[property]; + + if (value !== undefined) { + destination[property] = value; + } + } + /** + * IE doesn't include the toString property when iterating over an object's + * properties with the for(property in object) syntax. Explicitly check if + * the source has its own toString property. + */ + + /* + * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative + * prototype object" when calling hawOwnProperty if the source object + * is an instance of window.Event. + */ + + + var sourceIsEvt = typeof window.Event === 'function' && source instanceof window.Event; + + if (!sourceIsEvt && source.hasOwnProperty && source.hasOwnProperty('toString')) { + destination.toString = source.toString; + } + } + + return destination; + }, + + /** + * @memberOf CommonUtil + * @description 对象拷贝。 + * @param {Object} [des] - 目标对象。 + * @param {Object} soc - 源对象。 + */ + copy: function copy(des, soc) { + des = des || {}; + var v; + + if (soc) { + for (var p in des) { + v = soc[p]; + + if (typeof v !== 'undefined') { + des[p] = v; + } + } + } + }, + + /** + * @memberOf CommonUtil + * @description 销毁对象,将其属性置空。 + * @param {Object} [obj] - 目标对象。 + */ + reset: function reset(obj) { + obj = obj || {}; + + for (var p in obj) { + if (obj.hasOwnProperty(p)) { + if (_typeof(obj[p]) === 'object' && obj[p] instanceof Array) { + for (var i in obj[p]) { + if (obj[p][i].destroy) { + obj[p][i].destroy(); + } + } + + obj[p].length = 0; + } else if (_typeof(obj[p]) === 'object' && obj[p] instanceof Object) { + if (obj[p].destroy) { + obj[p].destroy(); + } + } + + obj[p] = null; + } + } + }, + + /** + * @memberOf CommonUtil + * @description 获取 HTML 元素数组。 + * @returns {Array.} HTML 元素数组。 + */ + getElement: function getElement() { + var elements = []; + + for (var i = 0, len = arguments.length; i < len; i++) { + var element = arguments[i]; + + if (typeof element === 'string') { + element = document.getElementById(element); + } + + if (arguments.length === 1) { + return element; + } + + elements.push(element); + } + + return elements; + }, + + /** + * @memberOf CommonUtil + * @description instance of 的跨浏览器实现。 + * @param {Object} o - 对象。 + * @returns {boolean} 是否是页面元素。 + */ + isElement: function isElement(o) { + return !!(o && o.nodeType === 1); + }, + + /** + * @memberOf CommonUtil + * @description 判断一个对象是否是数组。 + * @param {Object} a - 对象。 + * @returns {boolean} 是否是数组。 + */ + isArray: function isArray(a) { + return Object.prototype.toString.call(a) === '[object Array]'; + }, + + /** + * @memberOf CommonUtil + * @description 从数组中删除某一项。 + * @param {Array} array - 数组。 + * @param {Object} item - 数组中要删除的一项。 + * @returns {Array} 执行删除操作后的数组。 + */ + removeItem: function removeItem(array, item) { + for (var i = array.length - 1; i >= 0; i--) { + if (array[i] === item) { + array.splice(i, 1); //break;more than once?? + } + } + + return array; + }, + + /** + * @memberOf CommonUtil + * @description 获取某对象在数组中的索引值。 + * @param {Array.} array - 数组。 + * @param {Object} obj - 对象。 + * @returns {number} 某对象在数组中的索引值。 + */ + indexOf: function indexOf(array, obj) { + if (array == null) { + return -1; + } else { + // use the build-in function if available. + if (typeof array.indexOf === 'function') { + return array.indexOf(obj); + } else { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === obj) { + return i; + } + } + + return -1; + } + } + }, + + /** + * @memberOf CommonUtil + * @description 修改某 DOM 元素的许多属性。 + * @param {HTMLElement} element - 待修改的 DOM 元素。 + * @param {string} [id] - DOM 元素的 ID。 + * @param {Pixel} [px] - DOM 元素的 style 属性的 left 和 top 属性。 + * @param {Size} [sz] - DOM 元素的 width 和 height 属性。 + * @param {string} [position] - DOM 元素的 position 属性。 + * @param {string} [border] - DOM 元素的 style 属性的 border 属性。 + * @param {string} [overflow] - DOM 元素的 style 属性的 overflow 属性。 + * @param {number} [opacity] - 不透明度值。取值范围为(0.0 - 1.0)。 + */ + modifyDOMElement: function modifyDOMElement(element, id, px, sz, position, border, overflow, opacity) { + if (id) { + element.id = id; + } + + if (px) { + element.style.left = px.x + 'px'; + element.style.top = px.y + 'px'; + } + + if (sz) { + element.style.width = sz.w + 'px'; + element.style.height = sz.h + 'px'; + } + + if (position) { + element.style.position = position; + } + + if (border) { + element.style.border = border; + } + + if (overflow) { + element.style.overflow = overflow; + } + + if (parseFloat(opacity) >= 0.0 && parseFloat(opacity) < 1.0) { + element.style.filter = 'alpha(opacity=' + opacity * 100 + ')'; + element.style.opacity = opacity; + } else if (parseFloat(opacity) === 1.0) { + element.style.filter = ''; + element.style.opacity = ''; + } + }, + + /** + * @memberOf CommonUtil + * @description 比较两个对象并合并。 + * @param {Object} [to] - 目标对象。 + * @param {Object} from - 源对象。 + * @returns {Object} 返回合并后的对象。 + */ + applyDefaults: function applyDefaults(to, from) { + to = to || {}; + /* + * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative + * prototype object" when calling hawOwnProperty if the source object is an + * instance of window.Event. + */ + + var fromIsEvt = typeof window.Event === 'function' && from instanceof window.Event; + + for (var key in from) { + if (to[key] === undefined || !fromIsEvt && from.hasOwnProperty && from.hasOwnProperty(key) && !to.hasOwnProperty(key)) { + to[key] = from[key]; + } + } + /** + * IE doesn't include the toString property when iterating over an object's + * properties with the for(property in object) syntax. Explicitly check if + * the source has its own toString property. + */ + + + if (!fromIsEvt && from && from.hasOwnProperty && from.hasOwnProperty('toString') && !to.hasOwnProperty('toString')) { + to.toString = from.toString; + } + + return to; + }, + + /** + * @memberOf CommonUtil + * @description 将参数对象转换为 HTTP 的 GET 请求中的参数字符串。例如:"key1=value1&key2=value2&key3=value3"。 + * @param {Object} params - 参数对象。 + * @returns {string} HTTP 的 GET 请求中的参数字符串。 + */ + getParameterString: function getParameterString(params) { + var paramsArray = []; + + for (var key in params) { + var value = params[key]; + + if (value != null && typeof value !== 'function') { + var encodedValue; + + if (Array.isArray(value) || value.toString() === '[object Object]') { + encodedValue = encodeURIComponent(JSON.stringify(value)); + } else { + /* value is a string; simply encode */ + encodedValue = encodeURIComponent(value); + } + + paramsArray.push(encodeURIComponent(key) + '=' + encodedValue); + } + } + + return paramsArray.join('&'); + }, + + /** + * @memberOf CommonUtil + * @description 给 URL 追加查询参数。 + * @param {string} url - 待追加参数的 URL 字符串。 + * @param {string} paramStr - 待追加的查询参数。 + * @returns {string} 新的 URL。 + */ + urlAppend: function urlAppend(url, paramStr) { + var newUrl = url; + + if (paramStr) { + if (paramStr.indexOf('?') === 0) { + paramStr = paramStr.substring(1); + } + + var parts = (url + ' ').split(/[?&]/); + newUrl += parts.pop() === ' ' ? paramStr : parts.length ? '&' + paramStr : '?' + paramStr; + } + + return newUrl; + }, + + /** + * @memberOf CommonUtil + * @description 给 URL 追加 path 参数。 + * @param {string} url - 待追加参数的 URL 字符串。 + * @param {string} paramStr - 待追加的path参数。 + * @returns {string} 新的 URL。 + */ + urlPathAppend: function urlPathAppend(url, pathStr) { + var newUrl = url; + + if (!pathStr) { + return newUrl; + } + + if (pathStr.indexOf('/') === 0) { + pathStr = pathStr.substring(1); + } + + var parts = url.split('?'); + + if (parts[0].indexOf('/', parts[0].length - 1) < 0) { + parts[0] += '/'; + } + + newUrl = "".concat(parts[0]).concat(pathStr).concat(parts.length > 1 ? "?".concat(parts[1]) : ''); + return newUrl; + }, + + /** + * @memberOf CommonUtil + * @description 为了避免浮点精度错误而保留的有效位数。 + * @type {number} + * @default 14 + */ + DEFAULT_PRECISION: 14, + + /** + * @memberOf CommonUtil + * @description 将字符串以接近的精度转换为数字。 + * @param {string} number - 字符串。 + * @param {number} [precision=14] - 精度。 + * @returns {number} 转化后的数字。 + */ + toFloat: function toFloat(number, precision) { + if (precision == null) { + precision = Util.DEFAULT_PRECISION; + } + + if (typeof number !== 'number') { + number = parseFloat(number); + } + + return precision === 0 ? number : parseFloat(number.toPrecision(precision)); + }, + + /** + * @memberOf CommonUtil + * @description 角度转弧度。 + * @param {number} x - 角度。 + * @returns {number} 转化后的弧度。 + */ + rad: function rad(x) { + return x * Math.PI / 180; + }, + + /** + * @memberOf CommonUtil + * @description 从 URL 字符串中解析出参数对象。 + * @param {string} url - URL。 + * @returns {Object} 解析出的参数对象。 + */ + getParameters: function getParameters(url) { + // if no url specified, take it from the location bar + url = url === null || url === undefined ? window.location.href : url; //parse out parameters portion of url string + + var paramsString = ''; + + if (StringExt.contains(url, '?')) { + var start = url.indexOf('?') + 1; + var end = StringExt.contains(url, '#') ? url.indexOf('#') : url.length; + paramsString = url.substring(start, end); + } + + var parameters = {}; + var pairs = paramsString.split(/[&;]/); + + for (var i = 0, len = pairs.length; i < len; ++i) { + var keyValue = pairs[i].split('='); + + if (keyValue[0]) { + var key = keyValue[0]; + + try { + key = decodeURIComponent(key); + } catch (err) { + key = unescape(key); + } // being liberal by replacing "+" with " " + + + var value = (keyValue[1] || '').replace(/\+/g, ' '); + + try { + value = decodeURIComponent(value); + } catch (err) { + value = unescape(value); + } // follow OGC convention of comma delimited values + + + value = value.split(','); //if there's only one value, do not return as array + + if (value.length == 1) { + value = value[0]; + } + + parameters[key] = value; + } + } + + return parameters; + }, + + /** + * @memberOf CommonUtil + * @description 不断递增计数变量,用于生成唯一 ID。 + * @type {number} + * @default 0 + */ + lastSeqID: 0, + + /** + * @memberOf CommonUtil + * @description 创建唯一 ID 值。 + * @param {string} [prefix] - 前缀。 + * @returns {string} 唯一的 ID 值。 + */ + createUniqueID: function createUniqueID(prefix) { + if (prefix == null) { + prefix = 'id_'; + } + + Util.lastSeqID += 1; + return prefix + Util.lastSeqID; + }, + + /** + * @memberOf CommonUtil + * @description 判断并转化比例尺。 + * @param {number} scale - 比例尺。 + * @returns {number} 正常的 scale 值。 + */ + normalizeScale: function normalizeScale(scale) { + var normScale = scale > 1.0 ? 1.0 / scale : scale; + return normScale; + }, + + /** + * @memberOf CommonUtil + * @description 比例尺转分辨率。 + * @param {number} scale - 比例尺。 + * @param {string} [units='degrees'] - 比例尺单位。 + * @returns {number} 转化后的分辨率。 + */ + getResolutionFromScale: function getResolutionFromScale(scale, units) { + var resolution; + + if (scale) { + if (units == null) { + units = 'degrees'; + } + + var normScale = Util.normalizeScale(scale); + resolution = 1 / (normScale * INCHES_PER_UNIT[units] * DOTS_PER_INCH); + } + + return resolution; + }, + + /** + * @memberOf CommonUtil + * @description 分辨率转比例尺。 + * @param {number} resolution - 分辨率。 + * @param {string} [units='degrees'] - 分辨率单位。 + * @returns {number} 转化后的比例尺。 + */ + getScaleFromResolution: function getScaleFromResolution(resolution, units) { + if (units == null) { + units = 'degrees'; + } + + var scale = resolution * INCHES_PER_UNIT[units] * DOTS_PER_INCH; + return scale; + }, + + /** + * @memberOf CommonUtil + * @description 获取浏览器相关信息。支持的浏览器包括:Opera,Internet Explorer,Safari,Firefox。 + * @returns {Object} 浏览器名称、版本、设备名称。对应的属性分别为 name, version, device。 + */ + getBrowser: function getBrowser() { + return Browser; + }, + + /** + * @memberOf CommonUtil + * @description 浏览器是否支持 Canvas。 + * @returns {boolean} 当前浏览器是否支持 HTML5 Canvas。 + */ + isSupportCanvas: isSupportCanvas, + + /** + * @memberOf CommonUtil + * @description 判断;浏览器是否支持 Canvas。 + * @returns {boolean} 当前浏览器是否支持 HTML5 Canvas 。 + */ + supportCanvas: function supportCanvas() { + return Util.isSupportCanvas; + }, + + /** + * @memberOf CommonUtil + * @description 判断一个 URL 请求是否在当前域中。 + * @param {string} url - URL 请求字符串。 + * @returns {boolean} URL 请求是否在当前域中。 + */ + isInTheSameDomain: function isInTheSameDomain(url) { + if (!url) { + return true; + } + + var index = url.indexOf('//'); + var documentUrl = document.location.toString(); + var documentIndex = documentUrl.indexOf('//'); + + if (index === -1) { + return true; + } else { + var protocol; + var substring = protocol = url.substring(0, index); + var documentSubString = documentUrl.substring(documentIndex + 2); + documentIndex = documentSubString.indexOf('/'); + var documentPortIndex = documentSubString.indexOf(':'); + var documentDomainWithPort = documentSubString.substring(0, documentIndex); //var documentPort; + + var documentprotocol = document.location.protocol; + + if (documentPortIndex !== -1) {// documentPort = +documentSubString.substring(documentPortIndex, documentIndex); + } else { + documentDomainWithPort += ':' + (documentprotocol.toLowerCase() === 'http:' ? 80 : 443); + } + + if (documentprotocol.toLowerCase() !== substring.toLowerCase()) { + return false; + } + + substring = url.substring(index + 2); + var portIndex = substring.indexOf(':'); + index = substring.indexOf('/'); + var domainWithPort = substring.substring(0, index); + var domain; + + if (portIndex !== -1) { + domain = substring.substring(0, portIndex); + } else { + domain = substring.substring(0, index); + domainWithPort += ':' + (protocol.toLowerCase() === 'http:' ? 80 : 443); + } + + var documentDomain = document.domain; + + if (domain === documentDomain && domainWithPort === documentDomainWithPort) { + return true; + } + } + + return false; + }, + + /** + * @memberOf CommonUtil + * @description 计算 iServer 服务的 REST 图层的显示分辨率,需要从 iServer 的 REST 图层表述中获取 viewBounds、viewer、scale、coordUnit、datumAxis 五个参数,来进行计算。 + * @param {Bounds} viewBounds - 地图的参照可视范围,即地图初始化时默认的地图显示范围。 + * @param {Size} viewer - 地图初始化时默认的地图图片的尺寸。 + * @param {number} scale - 地图初始化时默认的显示比例尺。 + * @param {string} [coordUnit='degrees'] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则系统默认为 WGS84 参考系的椭球体长半轴 6378137。 + * @returns {number} 图层显示分辨率。 + */ + calculateDpi: function calculateDpi(viewBounds, viewer, scale, coordUnit, datumAxis) { + //10000 是 0.1毫米与米的转换。DPI的计算公式:Viewer / DPI * 0.0254 * 10000 = ViewBounds * scale ,公式中的10000是为了提高计算结果的精度,以下出现的ratio皆为如此。 + if (!viewBounds || !viewer || !scale) { + return; + } + + var ratio = 10000, + rvbWidth = viewBounds.getWidth(), + rvbHeight = viewBounds.getHeight(), + rvWidth = viewer.w, + rvHeight = viewer.h; //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || 'degrees'; + var dpi; + + if (coordUnit.toLowerCase() === 'degree' || coordUnit.toLowerCase() === 'degrees' || coordUnit.toLowerCase() === 'dd') { + var num1 = rvbWidth / rvWidth, + num2 = rvbHeight / rvHeight, + resolution = num1 > num2 ? num1 : num2; + dpi = 0.0254 * ratio / resolution / scale / (Math.PI * 2 * datumAxis / 360) / ratio; + } else { + var _resolution = rvbWidth / rvWidth; + + dpi = 0.0254 * ratio / _resolution / scale / ratio; + } + + return dpi; + }, + + /** + * @memberOf CommonUtil + * @description 将对象转换成 JSON 字符串。 + * @param {Object} obj - 要转换成 JSON 的 Object 对象。 + * @returns {string} 转换后的 JSON 对象。 + */ + toJSON: function toJSON(obj) { + var objInn = obj; + + if (objInn == null) { + return null; + } + + switch (objInn.constructor) { + case String: + //s = "'" + str.replace(/(["\\])/g, "\\$1") + "'"; string含有单引号出错 + objInn = '"' + objInn.replace(/(["\\])/g, '\\$1') + '"'; + objInn = objInn.replace(/\n/g, '\\n'); + objInn = objInn.replace(/\r/g, '\\r'); + objInn = objInn.replace('<', '<'); + objInn = objInn.replace('>', '>'); + objInn = objInn.replace(/%/g, '%25'); + objInn = objInn.replace(/&/g, '%26'); + return objInn; + + case Array: + var arr = ''; + + for (var i = 0, len = objInn.length; i < len; i++) { + arr += Util.toJSON(objInn[i]); + + if (i !== objInn.length - 1) { + arr += ','; + } + } + + return "[" + arr + "]"; + + case Number: + return isFinite(objInn) ? String(objInn) : null; + + case Boolean: + return String(objInn); + + case Date: + var dateStr = '{' + '\'__type\':"System.DateTime",' + "'Year':" + objInn.getFullYear() + ',' + "'Month':" + (objInn.getMonth() + 1) + ',' + "'Day':" + objInn.getDate() + ',' + "'Hour':" + objInn.getHours() + ',' + "'Minute':" + objInn.getMinutes() + ',' + "'Second':" + objInn.getSeconds() + ',' + "'Millisecond':" + objInn.getMilliseconds() + ',' + "'TimezoneOffset':" + objInn.getTimezoneOffset() + '}'; + return dateStr; + + default: + if (objInn['toJSON'] != null && typeof objInn['toJSON'] === 'function') { + return objInn.toJSON(); + } + + if (_typeof(objInn) === 'object') { + if (objInn.length) { + var _arr2 = []; + + for (var _i = 0, _len = objInn.length; _i < _len; _i++) { + _arr2.push(Util.toJSON(objInn[_i])); + } + + return '[' + _arr2.join(',') + ']'; + } + + var _arr = []; + + for (var attr in objInn) { + //为解决Geometry类型头json时堆栈溢出的问题,attr == "parent"时不进行json转换 + if (typeof objInn[attr] !== 'function' && attr !== 'CLASS_NAME' && attr !== 'parent') { + _arr.push("'" + attr + "':" + Util.toJSON(objInn[attr])); + } + } + + if (_arr.length > 0) { + return '{' + _arr.join(',') + '}'; + } else { + return '{}'; + } + } + + return objInn.toString(); + } + }, + + /** + * @memberOf CommonUtil + * @description 根据比例尺和 dpi 计算屏幕分辨率。 + * @category BaseTypes Util + * @param {number} scale - 比例尺。 + * @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 + * @param {string} [coordUnit] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 + * @returns {number} 当前比例尺下的屏幕分辨率。 + */ + getResolutionFromScaleDpi: function getResolutionFromScaleDpi(scale, dpi, coordUnit, datumAxis) { + var resolution = null, + ratio = 10000; //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + + if (scale > 0 && dpi > 0) { + scale = Util.normalizeScale(scale); + + if (coordUnit.toLowerCase() === 'degree' || coordUnit.toLowerCase() === 'degrees' || coordUnit.toLowerCase() === 'dd') { + //scale = Util.normalizeScale(scale); + resolution = 0.0254 * ratio / dpi / scale / (Math.PI * 2 * datumAxis / 360) / ratio; + return resolution; + } else { + resolution = 0.0254 * ratio / dpi / scale / ratio; + return resolution; + } + } + + return -1; + }, + + /** + * @memberOf CommonUtil + * @description 根据 resolution、dpi、coordUnit 和 datumAxis 计算比例尺。 + * @param {number} resolution - 用于计算比例尺的地图分辨率。 + * @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 + * @param {string} [coordUnit] - 投影坐标系统的地图单位。 + * @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 + * @returns {number} 当前屏幕分辨率下的比例尺。 + */ + getScaleFromResolutionDpi: function getScaleFromResolutionDpi(resolution, dpi, coordUnit, datumAxis) { + var scale = null, + ratio = 10000; //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + + if (resolution > 0 && dpi > 0) { + if (coordUnit.toLowerCase() === 'degree' || coordUnit.toLowerCase() === 'degrees' || coordUnit.toLowerCase() === 'dd') { + scale = 0.0254 * ratio / dpi / resolution / (Math.PI * 2 * datumAxis / 360) / ratio; + return scale; + } else { + scale = 0.0254 * ratio / dpi / resolution / ratio; + return scale; + } + } + + return -1; + }, + + /** + * @memberOf CommonUtil + * @description 转换查询结果。 + * @param {Object} result - 查询结果。 + * @returns {Object} 转换后的查询结果。 + */ + transformResult: function transformResult(result) { + if (result.responseText && typeof result.responseText === 'string') { + result = JSON.parse(result.responseText); + } + + return result; + }, + + /** + * @memberOf CommonUtil + * @description 属性拷贝,不拷贝方法类名(CLASS_NAME)等。 + * @param {Object} [destination] - 拷贝目标。 + * @param {Object} source - 源对象。 + * + */ + copyAttributes: function copyAttributes(destination, source) { + destination = destination || {}; + + if (source) { + for (var property in source) { + var value = source[property]; + + if (value !== undefined && property !== 'CLASS_NAME' && typeof value !== 'function') { + destination[property] = value; + } + } + } + + return destination; + }, + + /** + * @memberOf CommonUtil + * @description 将源对象上的属性拷贝到目标对象上。(不拷贝 CLASS_NAME 和方法) + * @param {Object} [destination] - 目标对象。 + * @param {Object} source - 源对象。 + * @param {Array.} clip - 源对象中禁止拷贝到目标对象的属性,目的是防止目标对象上不可修改的属性被篡改。 + * + */ + copyAttributesWithClip: function copyAttributesWithClip(destination, source, clip) { + destination = destination || {}; + + if (source) { + for (var property in source) { + //去掉禁止拷贝的属性 + var isInClip = false; + + if (clip && clip.length) { + for (var i = 0, len = clip.length; i < len; i++) { + if (property === clip[i]) { + isInClip = true; + break; + } + } + } + + if (isInClip === true) { + continue; + } + + var value = source[property]; + + if (value !== undefined && property !== 'CLASS_NAME' && typeof value !== 'function') { + destination[property] = value; + } + } + } + + return destination; + }, + + /** + * @memberOf CommonUtil + * @description 克隆一个 Object 对象 + * @param {Object} obj - 需要克隆的对象。 + * @returns {Object} 对象的拷贝对象,注意是新的对象,不是指向。 + */ + cloneObject: function cloneObject(obj) { + // Handle the 3 simple types, and null or undefined + if (null === obj || 'object' !== _typeof(obj)) { + return obj; + } // Handle Date + + + if (obj instanceof Date) { + var copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } // Handle Array + + + if (obj instanceof Array) { + var _copy = obj.slice(0); + + return _copy; + } // Handle Object + + + if (obj instanceof Object) { + var _copy2 = {}; + + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) { + _copy2[attr] = Util.cloneObject(obj[attr]); + } + } + + return _copy2; + } + + throw new Error("Unable to copy obj! Its type isn't supported."); + }, + + /** + * @memberOf CommonUtil + * @description 判断两条线段是不是有交点。 + * @param {GeometryPoint} a1 - 第一条线段的起始节点。 + * @param {GeometryPoint} a2 - 第一条线段的结束节点。 + * @param {GeometryPoint} b1 - 第二条线段的起始节点。 + * @param {GeometryPoint} b2 - 第二条线段的结束节点。 + * @returns {Object} 如果相交返回交点,如果不相交返回两条线段的位置关系。 + */ + lineIntersection: function lineIntersection(a1, a2, b1, b2) { + var intersectValue = null; + var k1; + var k2; + var b = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); + var a = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); + var ab = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); //ab==0代表两条线断的斜率一样 + + if (ab != 0) { + k1 = b / ab; + k2 = a / ab; + + if (k1 >= 0 && k2 <= 1 && k1 <= 1 && k2 >= 0) { + intersectValue = new Geometry.Point(a1.x + k1 * (a2.x - a1.x), a1.y + k1 * (a2.y - a1.y)); + } else { + intersectValue = 'No Intersection'; + } + } else { + if (b == 0 && a == 0) { + var maxy = Math.max(a1.y, a2.y); + var miny = Math.min(a1.y, a2.y); + var maxx = Math.max(a1.x, a2.x); + var minx = Math.min(a1.x, a2.x); + + if ((b1.y >= miny && b1.y <= maxy || b2.y >= miny && b2.y <= maxy) && b1.x >= minx && b1.x <= maxx || b2.x >= minx && b2.x <= maxx) { + intersectValue = 'Coincident'; //重合 + } else { + intersectValue = 'Parallel'; //平行 + } + } else { + intersectValue = 'Parallel'; //平行 + } + } + + return intersectValue; + }, + + /** + * @memberOf CommonUtil + * @description 获取文本外接矩形宽度与高度。 + * @param {ThemeStyle} style - 文本样式。 + * @param {string} text - 文本内容。 + * @param {Object} element - DOM 元素。 + * @returns {Object} 裁剪后的宽度,高度信息。 + */ + getTextBounds: function getTextBounds(style, text, element) { + document.body.appendChild(element); + element.style.width = 'auto'; + element.style.height = 'auto'; + + if (style.fontSize) { + element.style.fontSize = style.fontSize; + } + + if (style.fontFamily) { + element.style.fontFamily = style.fontFamily; + } + + if (style.fontWeight) { + element.style.fontWeight = style.fontWeight; + } + + element.style.position = 'relative'; + element.style.visibility = 'hidden'; //fix 在某些情况下,element内的文本变成竖起排列,导致宽度计算不正确的bug + + element.style.display = 'inline-block'; + element.innerHTML = text; + var textWidth = element.clientWidth; + var textHeight = element.clientHeight; + document.body.removeChild(element); + return { + textWidth: textWidth, + textHeight: textHeight + }; + }, + + /** + * @memberOf CommonUtil + * @description 获取转换后的path路径。 + * @param {string} path - 待转换的path, 包含`{param}`。 + * @param {Object} pathParams - path中待替换的参数。 + * @returns {string} 转换后的path路径 + */ + convertPath: function convertPath(path, pathParams) { + if (!pathParams) { + return path; + } + + return path.replace(/\{([\w-\.]+)\}/g, function (fullMatch, key) { + var value; + + if (pathParams.hasOwnProperty(key)) { + value = paramToString(pathParams[key]); + } else { + value = fullMatch; + } + + return encodeURIComponent(value); + }); + } +}; +/** + * @enum INCHES_PER_UNIT + * @description 每单位的英尺数。 + * @type {number} + * @private + */ + +var INCHES_PER_UNIT = { + inches: 1.0, + ft: 12.0, + mi: 63360.0, + m: 39.3701, + km: 39370.1, + dd: 4374754, + yd: 36 +}; +INCHES_PER_UNIT['in'] = INCHES_PER_UNIT.inches; +INCHES_PER_UNIT['degrees'] = INCHES_PER_UNIT.dd; +INCHES_PER_UNIT['nmi'] = 1852 * INCHES_PER_UNIT.m; // Units from CS-Map + +var METERS_PER_INCH = 0.0254000508001016002; +Util.extend(INCHES_PER_UNIT, { + Inch: INCHES_PER_UNIT.inches, + Meter: 1.0 / METERS_PER_INCH, + //EPSG:9001 + Foot: 0.30480060960121920243 / METERS_PER_INCH, + //EPSG:9003 + IFoot: 0.3048 / METERS_PER_INCH, + //EPSG:9002 + ClarkeFoot: 0.3047972651151 / METERS_PER_INCH, + //EPSG:9005 + SearsFoot: 0.30479947153867624624 / METERS_PER_INCH, + //EPSG:9041 + GoldCoastFoot: 0.30479971018150881758 / METERS_PER_INCH, + //EPSG:9094 + IInch: 0.0254 / METERS_PER_INCH, + MicroInch: 0.0000254 / METERS_PER_INCH, + Mil: 0.0000000254 / METERS_PER_INCH, + Centimeter: 0.01 / METERS_PER_INCH, + Kilometer: 1000.0 / METERS_PER_INCH, + //EPSG:9036 + Yard: 0.91440182880365760731 / METERS_PER_INCH, + SearsYard: 0.914398414616029 / METERS_PER_INCH, + //EPSG:9040 + IndianYard: 0.91439853074444079983 / METERS_PER_INCH, + //EPSG:9084 + IndianYd37: 0.91439523 / METERS_PER_INCH, + //EPSG:9085 + IndianYd62: 0.9143988 / METERS_PER_INCH, + //EPSG:9086 + IndianYd75: 0.9143985 / METERS_PER_INCH, + //EPSG:9087 + IndianFoot: 0.30479951 / METERS_PER_INCH, + //EPSG:9080 + IndianFt37: 0.30479841 / METERS_PER_INCH, + //EPSG:9081 + IndianFt62: 0.3047996 / METERS_PER_INCH, + //EPSG:9082 + IndianFt75: 0.3047995 / METERS_PER_INCH, + //EPSG:9083 + Mile: 1609.34721869443738887477 / METERS_PER_INCH, + IYard: 0.9144 / METERS_PER_INCH, + //EPSG:9096 + IMile: 1609.344 / METERS_PER_INCH, + //EPSG:9093 + NautM: 1852.0 / METERS_PER_INCH, + //EPSG:9030 + 'Lat-66': 110943.316488932731 / METERS_PER_INCH, + 'Lat-83': 110946.25736872234125 / METERS_PER_INCH, + Decimeter: 0.1 / METERS_PER_INCH, + Millimeter: 0.001 / METERS_PER_INCH, + Dekameter: 10.0 / METERS_PER_INCH, + Decameter: 10.0 / METERS_PER_INCH, + Hectometer: 100.0 / METERS_PER_INCH, + GermanMeter: 1.0000135965 / METERS_PER_INCH, + //EPSG:9031 + CaGrid: 0.999738 / METERS_PER_INCH, + ClarkeChain: 20.1166194976 / METERS_PER_INCH, + //EPSG:9038 + GunterChain: 20.11684023368047 / METERS_PER_INCH, + //EPSG:9033 + BenoitChain: 20.116782494375872 / METERS_PER_INCH, + //EPSG:9062 + SearsChain: 20.11676512155 / METERS_PER_INCH, + //EPSG:9042 + ClarkeLink: 0.201166194976 / METERS_PER_INCH, + //EPSG:9039 + GunterLink: 0.2011684023368047 / METERS_PER_INCH, + //EPSG:9034 + BenoitLink: 0.20116782494375872 / METERS_PER_INCH, + //EPSG:9063 + SearsLink: 0.2011676512155 / METERS_PER_INCH, + //EPSG:9043 + Rod: 5.02921005842012 / METERS_PER_INCH, + IntnlChain: 20.1168 / METERS_PER_INCH, + //EPSG:9097 + IntnlLink: 0.201168 / METERS_PER_INCH, + //EPSG:9098 + Perch: 5.02921005842012 / METERS_PER_INCH, + Pole: 5.02921005842012 / METERS_PER_INCH, + Furlong: 201.1684023368046 / METERS_PER_INCH, + Rood: 3.778266898 / METERS_PER_INCH, + CapeFoot: 0.3047972615 / METERS_PER_INCH, + Brealey: 375.0 / METERS_PER_INCH, + ModAmFt: 0.304812252984505969011938 / METERS_PER_INCH, + Fathom: 1.8288 / METERS_PER_INCH, + 'NautM-UK': 1853.184 / METERS_PER_INCH, + '50kilometers': 50000.0 / METERS_PER_INCH, + '150kilometers': 150000.0 / METERS_PER_INCH +}); //unit abbreviations supported by PROJ.4 + +Util.extend(INCHES_PER_UNIT, { + mm: INCHES_PER_UNIT['Meter'] / 1000.0, + cm: INCHES_PER_UNIT['Meter'] / 100.0, + dm: INCHES_PER_UNIT['Meter'] * 100.0, + km: INCHES_PER_UNIT['Meter'] * 1000.0, + kmi: INCHES_PER_UNIT['nmi'], + //International Nautical Mile + fath: INCHES_PER_UNIT['Fathom'], + //International Fathom + ch: INCHES_PER_UNIT['IntnlChain'], + //International Chain + link: INCHES_PER_UNIT['IntnlLink'], + //International Link + 'us-in': INCHES_PER_UNIT['inches'], + //U.S. Surveyor's Inch + 'us-ft': INCHES_PER_UNIT['Foot'], + //U.S. Surveyor's Foot + 'us-yd': INCHES_PER_UNIT['Yard'], + //U.S. Surveyor's Yard + 'us-ch': INCHES_PER_UNIT['GunterChain'], + //U.S. Surveyor's Chain + 'us-mi': INCHES_PER_UNIT['Mile'], + //U.S. Surveyor's Statute Mile + 'ind-yd': INCHES_PER_UNIT['IndianYd37'], + //Indian Yard + 'ind-ft': INCHES_PER_UNIT['IndianFt37'], + //Indian Foot + 'ind-ch': 20.11669506 / METERS_PER_INCH //Indian Chain + +}); //将服务端的地图单位转成SuperMap的地图单位 + +INCHES_PER_UNIT['degree'] = INCHES_PER_UNIT.dd; +INCHES_PER_UNIT['meter'] = INCHES_PER_UNIT.m; +INCHES_PER_UNIT['foot'] = INCHES_PER_UNIT.ft; +INCHES_PER_UNIT['inch'] = INCHES_PER_UNIT.inches; +INCHES_PER_UNIT['mile'] = INCHES_PER_UNIT.mi; +INCHES_PER_UNIT['kilometer'] = INCHES_PER_UNIT.km; +INCHES_PER_UNIT['yard'] = INCHES_PER_UNIT.yd; + +function paramToString(param) { + if (param == undefined || param == null) { + return ''; + } + + if (param instanceof Date) { + return param.toJSON(); + } + + if (canBeJsonified(param)) { + return JSON.stringify(param); + } + + return param.toString(); +} + +function canBeJsonified(str) { + if (typeof str !== 'string' && _typeof(str) !== 'object') { + return false; + } + + try { + var type = str.toString(); + return type === '[object Object]' || type === '[object Array]'; + } catch (err) { + return false; + } +} + + +;// CONCATENATED MODULE: ./src/common/commontypes/LonLat.js +function LonLat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LonLat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LonLat_createClass(Constructor, protoProps, staticProps) { if (protoProps) LonLat_defineProperties(Constructor.prototype, protoProps); if (staticProps) LonLat_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LonLat + * @category BaseTypes Geometry + * @classdesc 这个类用来表示经度和纬度对。 + * @param {number|Array.} [lon=0.0] - 地图单位上的 X 轴坐标或者横纵坐标组成的数组;如果地图是地理投影,则此值是经度,否则,此值是地图地理位置的 x 坐标。 + * @param {number} [lat=0.0] - 地图单位上的 Y 轴坐标,如果地图是地理投影,则此值是纬度,否则,此值是地图地理位置的 y 坐标。 + * @example + * var lonLat = new LonLat(30,45); + * @usage + */ + +var LonLat = /*#__PURE__*/function () { + function LonLat(lon, lat) { + LonLat_classCallCheck(this, LonLat); + + if (Util.isArray(lon)) { + lat = lon[1]; + lon = lon[0]; + } + /** + * @member {number} [LonLat.prototype.lon=0.0] + * @description 地图的单位的 X 轴(横轴)坐标。 + */ + + + this.lon = lon ? Util.toFloat(lon) : 0.0; + /** + * @member {number} [LonLat.prototype.lat=0.0] + * @description 地图的单位的 Y 轴(纵轴)坐标。 + */ + + this.lat = lat ? Util.toFloat(lat) : 0.0; + this.CLASS_NAME = "SuperMap.LonLat"; + } + /** + * @function LonLat.prototype.toString + * @description 返回此对象的字符串形式 + * @example + * var lonLat = new LonLat(100,50); + * var str = lonLat.toString(); + * @returns {string} 例如: "lon=100,lat=50" + */ + + + LonLat_createClass(LonLat, [{ + key: "toString", + value: function toString() { + return "lon=" + this.lon + ",lat=" + this.lat; + } + /** + * @function LonLat.prototype.toShortString + * @description 将经度纬度转换成简单字符串。 + * @example + * var lonLat = new LonLat(100,50); + * var str = lonLat.toShortString(); + * @returns {string} 处理后的经纬度字符串。例如:"100,50" + */ + + }, { + key: "toShortString", + value: function toShortString() { + return this.lon + "," + this.lat; + } + /** + * @function LonLat.prototype.clone + * @description 复制坐标对象,并返回复制后的新对象。 + * @example + * var lonLat1 = new LonLat(100,50); + * var lonLat2 = lonLat1.clone(); + * @returns {LonLat} 相同坐标值的新的坐标对象。 + */ + + }, { + key: "clone", + value: function clone() { + return new LonLat(this.lon, this.lat); + } + /** + * @function LonLat.prototype.add + * @description 在已有坐标对象的经纬度基础上加上新的坐标经纬度,并返回新的坐标对象。 + * @example + * var lonLat1 = new LonLat(100,50); + * //lonLat2 是新的对象 + * var lonLat2 = lonLat1.add(100,50); + * @param {number} lon - 经度参数。 + * @param {number} lat - 纬度参数。 + * @returns {LonLat} 新的 LonLat 对象,此对象的经纬度是由传入的经纬度与当前的经纬度相加所得。 + */ + + }, { + key: "add", + value: function add(lon, lat) { + if (lon == null || lat == null) { + throw new TypeError('LonLat.add cannot receive null values'); + } + + return new LonLat(this.lon + Util.toFloat(lon), this.lat + Util.toFloat(lat)); + } + /** + * @function LonLat.prototype.equals + * @description 判断两个坐标对象是否相等。 + * @example + * var lonLat1 = new LonLat(100,50); + * var lonLat2 = new LonLat(100,50); + * var isEquals = lonLat1.equals(lonLat2); + * @param {LonLat} ll - 需要进行比较的坐标对象。 + * @returns {boolean} 如果LonLat对象的经纬度和传入的经纬度一致则返回true,不一 + * 致或传入的ll参数为NULL则返回false。 + */ + + }, { + key: "equals", + value: function equals(ll) { + var equals = false; + + if (ll != null) { + equals = this.lon === ll.lon && this.lat === ll.lat || isNaN(this.lon) && isNaN(this.lat) && isNaN(ll.lon) && isNaN(ll.lat); + } + + return equals; + } + /** + * @function LonLat.prototype.wrapDateLine + * @description 通过传入的范围对象对坐标对象转换到该范围内。 + * 如果经度小于给定范围最小精度,则在原经度基础上加上范围宽度,直到精度在范围内为止,如果经度大于给定范围则在原经度基础上减去范围宽度。 + * 即指将不在经度范围内的坐标转换到范围以内(只会转换 lon,不会转换 lat,主要用于转移到日界线以内)。 + * @example + * var lonLat1 = new LonLat(420,50); + * var lonLat2 = lonLat1.wrapDateLine( + * new Bounds(-180,-90,180,90) + * ); + * @param {Bounds} maxExtent - 最大边界的范围。 + * @returns {LonLat} 将坐标转换到范围对象以内,并返回新的坐标。 + */ + + }, { + key: "wrapDateLine", + value: function wrapDateLine(maxExtent) { + var newLonLat = this.clone(); + + if (maxExtent) { + //shift right? + while (newLonLat.lon < maxExtent.left) { + newLonLat.lon += maxExtent.getWidth(); + } //shift left? + + + while (newLonLat.lon > maxExtent.right) { + newLonLat.lon -= maxExtent.getWidth(); + } + } + + return newLonLat; + } + /** + * + * @function LonLat.prototype.destroy + * @description 销毁此对象。 + * 销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var lonLat = new LonLat(100,50); + * lonLat.destroy(); + */ + + }, { + key: "destroy", + value: function destroy() { + this.lon = null; + this.lat = null; + } + /** + * @function LonLat.fromString + * @description 通过字符串生成一个 {@link LonLat} 对象。 + * @example + * var str = "100,50"; + * var lonLat = LonLat.fromString(str); + * @param {string} str - 字符串的格式:Lon+","+Lat。如:"100,50"。 + * @returns {LonLat} {@link LonLat} 对象。 + */ + + }], [{ + key: "fromString", + value: function fromString(str) { + var pair = str.split(","); + return new LonLat(pair[0], pair[1]); + } + /** + * @function LonLat.fromArray + * @description 通过数组生成一个 {@link LonLat} 对象。 + * @param {Array.} arr - 数组的格式,长度只能为2,:[Lon,Lat]。如:[5,-42]。 + * @returns {LonLat} {@link LonLat} 对象。 + */ + + }, { + key: "fromArray", + value: function fromArray(arr) { + var gotArr = Util.isArray(arr), + lon = gotArr && arr[0], + lat = gotArr && arr[1]; + return new LonLat(lon, lat); + } + }]); + + return LonLat; +}(); +;// CONCATENATED MODULE: ./src/common/commontypes/Bounds.js +function Bounds_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Bounds_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Bounds_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bounds_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bounds_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class Bounds + * @deprecatedclass SuperMap.Bounds + * @category BaseTypes Geometry + * @classdesc 表示边界类实例。使用 bounds 之前需要设置 left,bottom,right,top 四个属性,这些属性的初始值为 null。 + * @param {number|Array.} [left] - 如果是number,则表示左边界,注意考虑宽度,理论上小于 right 值。如果是数组,则表示 [left, bottom, right, top] 左下右上组成的数组。 + * @param {number} [bottom] - 下边界。考虑高度,理论上小于 top 值。 + * @param {number} [right] - 右边界。 + * @param {number} [top] - 上边界。 + * @example + * var bounds = new Bounds(); + * bounds.extend(new LonLat(4,5)); + * bounds.extend(new LonLat(5,6)); + * bounds.toBBOX(); // returns 4,5,5,6 + * @usage + */ + +var Bounds = /*#__PURE__*/function () { + function Bounds(left, bottom, right, top) { + Bounds_classCallCheck(this, Bounds); + + if (Util.isArray(left)) { + top = left[3]; + right = left[2]; + bottom = left[1]; + left = left[0]; + } + /** + * @member {number} Bounds.prototype.left + * @description 最小的水平坐标系。 + */ + + + this.left = left != null ? Util.toFloat(left) : this.left; + /** + * @member {number} Bounds.prototype.bottom + * @description 最小的垂直坐标系。 + */ + + this.bottom = bottom != null ? Util.toFloat(bottom) : this.bottom; + /** + * @member {number} Bounds.prototype.right + * @description 最大的水平坐标系。 + */ + + this.right = right != null ? Util.toFloat(right) : this.right; + /** + * @member {number} Bounds.prototype.top + * @description 最大的垂直坐标系。 + */ + + this.top = top != null ? Util.toFloat(top) : this.top; + /** + * @member {LonLat} Bounds.prototype.centerLonLat + * @description bounds 的地图空间的中心点。用 getCenterLonLat() 获得。 + */ + + this.centerLonLat = null; + this.CLASS_NAME = "SuperMap.Bounds"; + } + /** + * @function Bounds.prototype.clone + * @description 复制当前 bounds 对象。 + * @example + * var bounds1 = new Bounds(-180,-90,180,90); + * var bounds2 = bounds1.clone(); + * @returns {Bounds} 克隆后的 bounds。 + */ + + + Bounds_createClass(Bounds, [{ + key: "clone", + value: function clone() { + return new Bounds(this.left, this.bottom, this.right, this.top); + } + /** + * @function Bounds.prototype.equals + * @description 判断两个 bounds 对象是否相等。 + * @example + * var bounds1 = new Bounds(-180,-90,180,90); + * var bounds2 = new Bounds(-180,-90,180,90); + * var isEquals = bounds1.equals(bounds2); + * @param {Bounds} bounds - 需要进行计较的 bounds。 + * @returns {boolean} 如果 bounds 对象的边和传入的 bounds 一致则返回 true,不一致或传入的 bounds 参数为 NULL 则返回 false。 + */ + + }, { + key: "equals", + value: function equals(bounds) { + var equals = false; + + if (bounds != null) { + equals = this.left === bounds.left && this.right === bounds.right && this.top === bounds.top && this.bottom === bounds.bottom; + } + + return equals; + } + /** + * @function Bounds.prototype.toString + * @description 返回此对象的字符串形式。 + * @example + * var bounds = new Bounds(-180,-90,180,90); + * var str = bounds.toString(); + * @returns {string} 边界对象的字符串表示形式(left,bottom,right,top),例如: "-180,-90,180,90"。 + */ + + }, { + key: "toString", + value: function toString() { + return [this.left, this.bottom, this.right, this.top].join(","); + } + /** + * @function Bounds.prototype.toArray + * @description 边界对象的数组表示形式。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //array1 = [-180,-90,100,80]; + * var array1 = bounds.toArray(); + * //array1 = [-90,-180,80,100]; + * var array2 = bounds.toArray(true); + * @param {boolean} [reverseAxisOrder=false] - 是否反转轴顺序。 + * 如果设为 true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Array.} left, bottom, right, top 数组。 + */ + + }, { + key: "toArray", + value: function toArray(reverseAxisOrder) { + if (reverseAxisOrder === true) { + return [this.bottom, this.left, this.top, this.right]; + } else { + return [this.left, this.bottom, this.right, this.top]; + } + } + /** + * @function Bounds.prototype.toBBOX + * @description 取小数点后 decimal 位数字进行四舍五入再转换为 BBOX 字符串。 + * @example + * var bounds = new Bounds(-1.1234567,-1.7654321,1.4444444,1.5555555); + * //str1 = "-1.123457,-1.765432,1.444444,1.555556"; + * var str1 = bounds.toBBOX(); + * //str2 = "-1.1,-1.8,1.4,1.6"; + * var str2 = bounds.toBBOX(1); + * //str2 = "-1.8,-1.1,1.6,1.4"; + * var str2 = bounds.toBBOX(1,true); + * @param {number} [decimal=6] - 边界方位坐标的有效数字个数。 + * @param {boolean} [reverseAxisOrder=false] - 是否是反转轴顺序。 + * 如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {string} 边界对象的字符串表示形式,如:"5,42,10,45"。 + */ + + }, { + key: "toBBOX", + value: function toBBOX(decimal, reverseAxisOrder) { + if (decimal == null) { + decimal = 6; + } + + var mult = Math.pow(10, decimal); + var xmin = Math.round(this.left * mult) / mult; + var ymin = Math.round(this.bottom * mult) / mult; + var xmax = Math.round(this.right * mult) / mult; + var ymax = Math.round(this.top * mult) / mult; + + if (reverseAxisOrder === true) { + return ymin + "," + xmin + "," + ymax + "," + xmax; + } else { + return xmin + "," + ymin + "," + xmax + "," + ymax; + } + } ///** + // * @function Bounds.prototype.toGeometry + // * @description 基于当前边界范围创建一个新的多边形对象。 + // * @example + // * var bounds = new Bounds(-180,-90,100,80); + // * // Polygon对象 + // * var geo = bounds.toGeometry(); + // * @returns {GeometryPolygon} 基于当前 bounds 坐标创建的新的多边形。 + // */ + // toGeometry() { + // return new Polygon([ + // new LinearRing([ + // new Point(this.left, this.bottom), + // new Point(this.right, this.bottom), + // new Point(this.right, this.top), + // new Point(this.left, this.top) + // ]) + // ]); + // } + + /** + * @function Bounds.prototype.getWidth + * @description 获取 bounds 的宽度。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //width = 280; + * var width = bounds.getWidth(); + * @returns {number} 获取当前 bounds 的宽度(right 减去 left)。 + */ + + }, { + key: "getWidth", + value: function getWidth() { + return this.right - this.left; + } + /** + * @function Bounds.prototype.getHeight + * @description 获取 bounds 的高度。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //height = 170; + * var height = bounds.getHeight(); + * @returns {number} 边界高度(top 减去 bottom)。 + */ + + }, { + key: "getHeight", + value: function getHeight() { + return this.top - this.bottom; + } + /** + * @function Bounds.prototype.getSize + * @description 获取边框大小。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var size = bounds.getSize(); + * @returns {Size} 边框大小。 + */ + + }, { + key: "getSize", + value: function getSize() { + return new Size(this.getWidth(), this.getHeight()); + } + /** + * @function Bounds.prototype.getCenterPixel + * @description 获取像素格式的范围中心点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var pixel = bounds.getCenterPixel(); + * @returns {Pixel} 像素格式的当前范围的中心点。 + */ + + }, { + key: "getCenterPixel", + value: function getCenterPixel() { + return new Pixel((this.left + this.right) / 2, (this.bottom + this.top) / 2); + } + /** + * @function Bounds.prototype.getCenterLonLat + * @description 获取地理格式的范围中心点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var lonlat = bounds.getCenterLonLat(); + * @returns {LonLat} 当前地理范围的中心点。 + */ + + }, { + key: "getCenterLonLat", + value: function getCenterLonLat() { + if (!this.centerLonLat) { + this.centerLonLat = new LonLat((this.left + this.right) / 2, (this.bottom + this.top) / 2); + } + + return this.centerLonLat; + } + /** + * @function Bounds.prototype.scale + * @description 按照比例扩大/缩小出一个新的 bounds。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * var bounds2 = bounds.scale(2); + * @param {number} [ratio=1] - 需要扩大的比例。 + * @param {(Pixel|LonLat)} [origin] - 扩大时的基准点,默认为当前 bounds 的中心点。 + * @returns {Bounds} 通过 ratio、origin 计算得到的新的边界范围。 + */ + + }, { + key: "scale", + value: function scale(ratio, origin) { + ratio = ratio ? ratio : 1; + + if (origin == null) { + origin = this.getCenterLonLat(); + } + + var origx, origy; // get origin coordinates + + if (origin.CLASS_NAME === "SuperMap.LonLat") { + origx = origin.lon; + origy = origin.lat; + } else { + origx = origin.x; + origy = origin.y; + } + + var left = (this.left - origx) * ratio + origx; + var bottom = (this.bottom - origy) * ratio + origy; + var right = (this.right - origx) * ratio + origx; + var top = (this.top - origy) * ratio + origy; + return new Bounds(left, bottom, right, top); + } + /** + * @function Bounds.prototype.add + * @description 在当前的 Bounds 上按照传入的坐标点进行平移,返回新的范围。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //bounds2 是新的 bounds + * var bounds2 = bounds.add(20,10); + * @param {number} x - 坐标点的 x 坐标。 + * @param {number} y - 坐标点的 y 坐标。 + * @returns {Bounds} 新的 bounds,此 bounds 的坐标是由传入的 x,y 参数与当前 bounds 坐标计算所得。 + */ + + }, { + key: "add", + value: function add(x, y) { + if (x == null || y == null) { + throw new TypeError('Bounds.add cannot receive null values'); + } + + return new Bounds(this.left + x, this.bottom + y, this.right + x, this.top + y); + } + /** + * @function Bounds.prototype.extend + * @description 在当前 bounds 上扩展 bounds,支持 point,lanlat 和 bounds。扩展后的 bounds 的范围是两者的结合。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //bounds 改变 + * bounds.extend(new LonLat(50,60)); + * @param {GeometryPoint|LonLat|Bounds} object - 可以是 point、lonlat 和 bounds。 + */ + + }, { + key: "extend", + value: function extend(object) { + var bounds = null; + + if (object) { + // clear cached center location + switch (object.CLASS_NAME) { + case "SuperMap.LonLat": + bounds = new Bounds(object.lon, object.lat, object.lon, object.lat); + break; + + case "SuperMap.Geometry.Point": + bounds = new Bounds(object.x, object.y, object.x, object.y); + break; + + case "SuperMap.Bounds": + bounds = object; + break; + } + + if (bounds) { + this.centerLonLat = null; + + if (this.left == null || bounds.left < this.left) { + this.left = bounds.left; + } + + if (this.bottom == null || bounds.bottom < this.bottom) { + this.bottom = bounds.bottom; + } + + if (this.right == null || bounds.right > this.right) { + this.right = bounds.right; + } + + if (this.top == null || bounds.top > this.top) { + this.top = bounds.top; + } + } + } + } + /** + * @function Bounds.prototype.containsLonLat + * @description 判断传入的坐标是否在范围内。 + * @example + * var bounds1 = new Bounds(-50,-50,40,40); + * //isContains1 = true + * //这里的第二个参数可以直接为 boolean 类型,也就是inclusive + * var isContains1 = bounds.containsLonLat(new LonLat(40,40),true); + * + * //(40,40)在范围内,同样(40+360,40)也在范围内 + * var bounds2 = new Bounds(-50,-50,40,40); + * //isContains2 = true; + * var isContains2 = bounds2.containsLonLat( + * new LonLat(400,40), + * { + * inclusive:true, + * //全球的范围 + * worldBounds: new Bounds(-180,-90,180,90) + * } + * ); + * @param {(LonLat|Object)} ll - 对象或者是一个包含 'lon' 与 'lat' 属性的对象。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.inclusive=true] - 是否包含边界。 + * @param {Bounds} [options.worldBounds] - 如果提供 worldBounds 参数, 如果 ll 参数提供的坐标超出了世界边界(worldBounds), + * 但是通过日界线的转化可以被包含, 它将被认为是包含在该范围内的。 + * @returns {boolean} 传入坐标是否包含在范围内。 + */ + + }, { + key: "containsLonLat", + value: function containsLonLat(ll, options) { + if (typeof options === "boolean") { + options = { + inclusive: options + }; + } + + options = options || {}; + var contains = this.contains(ll.lon, ll.lat, options.inclusive), + worldBounds = options.worldBounds; //日界线以外的也有可能算包含, + + if (worldBounds && !contains) { + var worldWidth = worldBounds.getWidth(); + var worldCenterX = (worldBounds.left + worldBounds.right) / 2; //这一步很关键 + + var worldsAway = Math.round((ll.lon - worldCenterX) / worldWidth); + contains = this.containsLonLat({ + lon: ll.lon - worldsAway * worldWidth, + lat: ll.lat + }, { + inclusive: options.inclusive + }); + } + + return contains; + } + /** + * @function Bounds.prototype.containsPixel + * @description 判断传入的像素是否在范围内。直接匹配大小,不涉及像素和地理转换。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * //isContains = true + * var isContains = bounds.containsPixel(new Pixel(40,40),true); + * @param {Pixel} px - 提供的像素参数。 + * @param {boolean} [inclusive=true] - 是否包含边界。 + * @returns {boolean} 传入的 pixel 在当前边界范围之内。 + */ + + }, { + key: "containsPixel", + value: function containsPixel(px, inclusive) { + return this.contains(px.x, px.y, inclusive); + } + /** + * @function Bounds.prototype.contains + * @description 判断传入的 x,y 坐标值是否在范围内。 + * @example + * var bounds = new Bounds(-50,-50,40,40); + * //isContains = true + * var isContains = bounds.contains(40,40,true); + * @param {number} x - x 坐标值。 + * @param {number} y - y 坐标值。 + * @param {boolean} [inclusive=true] - 是否包含边界。 + * @returns {boolean} 传入的 x,y 坐标是否在当前范围内。 + */ + + }, { + key: "contains", + value: function contains(x, y, inclusive) { + //set default + if (inclusive == null) { + inclusive = true; + } + + if (x == null || y == null) { + return false; + } //x = Util.toFloat(x); + //y = Util.toFloat(y); + + + var contains = false; + + if (inclusive) { + contains = x >= this.left && x <= this.right && y >= this.bottom && y <= this.top; + } else { + contains = x > this.left && x < this.right && y > this.bottom && y < this.top; + } + + return contains; + } + /** + * @function Bounds.prototype.intersectsBounds + * @description 判断目标边界范围是否与当前边界范围相交。如果两个边界范围中的任意 + * 边缘相交或者一个边界包含了另外一个就认为这两个边界相交。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var isIntersects = bounds.intersectsBounds( + * new Bounds(-170,-90,120,80) + * ); + * @param {Bounds} bounds - 目标边界。 + * @param {Object} options - 参数。 + * @param {boolean} [options.inclusive=true] - 边缘重合也看成相交。如果是false, + * 两个边界范围没有重叠部分仅仅是在边缘相接(重合), + * 这种情况被认为没有相交。 + * @param {Bounds} [options.worldBounds] - 提供了 worldBounds 参数, 如果他们相交时 + * 是在全球范围内, 两个边界将被视为相交。这仅适用于交叉或完全不在世界范围的边界。 + * @returns {boolean} 传入的 bounds 对象与当前 bounds 相交。 + */ + + }, { + key: "intersectsBounds", + value: function intersectsBounds(bounds, options) { + if (typeof options === "boolean") { + options = { + inclusive: options + }; + } + + options = options || {}; + + if (options.worldBounds) { + var self = this.wrapDateLine(options.worldBounds); + bounds = bounds.wrapDateLine(options.worldBounds); + } else { + self = this; + } + + if (options.inclusive == null) { + options.inclusive = true; + } + + var intersects = false; + var mightTouch = self.left === bounds.right || self.right === bounds.left || self.top === bounds.bottom || self.bottom === bounds.top; // if the two bounds only touch at an edge, and inclusive is false, + // then the bounds don't *really* intersect. + + if (options.inclusive || !mightTouch) { + // otherwise, if one of the boundaries even partially contains another, + // inclusive of the edges, then they do intersect. + var inBottom = bounds.bottom >= self.bottom && bounds.bottom <= self.top || self.bottom >= bounds.bottom && self.bottom <= bounds.top; + var inTop = bounds.top >= self.bottom && bounds.top <= self.top || self.top > bounds.bottom && self.top < bounds.top; + var inLeft = bounds.left >= self.left && bounds.left <= self.right || self.left >= bounds.left && self.left <= bounds.right; + var inRight = bounds.right >= self.left && bounds.right <= self.right || self.right >= bounds.left && self.right <= bounds.right; + intersects = (inBottom || inTop) && (inLeft || inRight); + } // document me + + + if (options.worldBounds && !intersects) { + var world = options.worldBounds; + var width = world.getWidth(); + var selfCrosses = !world.containsBounds(self); + var boundsCrosses = !world.containsBounds(bounds); + + if (selfCrosses && !boundsCrosses) { + bounds = bounds.add(-width, 0); + intersects = self.intersectsBounds(bounds, { + inclusive: options.inclusive + }); + } else if (boundsCrosses && !selfCrosses) { + self = self.add(-width, 0); + intersects = bounds.intersectsBounds(self, { + inclusive: options.inclusive + }); + } + } + + return intersects; + } + /** + * @function Bounds.prototype.containsBounds + * @description 判断目标边界是否被当前边界包含在内。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var isContains = bounds.containsBounds( + * new Bounds(-170,-90,100,80),true,true + * ); + * @param {Bounds} bounds - 目标边界。 + * @param {boolean} [partial=false] - 目标边界的任意部分都包含在当前边界中则被认为是包含关系。 + * 如果设为 false,整个目标边界全部被包含在当前边界范围内。 + * @param {boolean} [inclusive=true] - 边缘共享是否被视为包含。 + * @returns {boolean} 传入的边界是否被当前边界包含。 + */ + + }, { + key: "containsBounds", + value: function containsBounds(bounds, partial, inclusive) { + if (partial == null) { + partial = false; + } + + if (inclusive == null) { + inclusive = true; + } + + var bottomLeft = this.contains(bounds.left, bounds.bottom, inclusive); + var bottomRight = this.contains(bounds.right, bounds.bottom, inclusive); + var topLeft = this.contains(bounds.left, bounds.top, inclusive); + var topRight = this.contains(bounds.right, bounds.top, inclusive); + return partial ? bottomLeft || bottomRight || topLeft || topRight : bottomLeft && bottomRight && topLeft && topRight; + } + /** + * @function Bounds.prototype.determineQuadrant + * @description 判断传入坐标是否在 bounds 范围内的象限。以 bounds 中心点为坐标原点。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * //str = "tr"; + * var str = bounds.determineQuadrant( + * new LonLat(20,20) + * ); + * @param {LonLat} lonlat - 传入的坐标对象。 + * @returns {string} 传入坐标所在的象限("br" "tr" "tl" "bl" 分别对应"右下","右上","左上" "左下")。 + */ + + }, { + key: "determineQuadrant", + value: function determineQuadrant(lonlat) { + var quadrant = ""; + var center = this.getCenterLonLat(); + quadrant += lonlat.lat < center.lat ? "b" : "t"; + quadrant += lonlat.lon < center.lon ? "l" : "r"; + return quadrant; + } + /** + * @function Bounds.prototype.wrapDateLine + * @description 将当前 bounds 移动到最大边界范围内部(所谓的内部是相交或者内部)。 + * @example + * var bounds = new Bounds(380,-40,400,-20); + * var maxExtent = new Bounds(-180,-90,100,80); + * //新的bounds + * var newBounds = bounds.wrapDateLine(maxExtent); + * @param {Bounds} maxExtent - 最大的边界范围(一般是全球范围)。 + * @param {Object} options - 可选选项参数。 + * @param {number} [options.leftTolerance=0] - left 允许的误差。 + * @param {number} [options.rightTolerance=0] - right 允许的误差。 + * @returns {Bounds} 克隆当前边界。如果当前边界完全在最大范围之外此函数则返回一个不同值的边界, + * 若落在最大边界的左边,则给当前的bounds值加上最大范围的宽度,即向右移动, + * 若落在右边,则向左移动,即给当前的bounds值加上负的最大范围的宽度。 + */ + + }, { + key: "wrapDateLine", + value: function wrapDateLine(maxExtent, options) { + options = options || {}; + var leftTolerance = options.leftTolerance || 0; + var rightTolerance = options.rightTolerance || 0; + var newBounds = this.clone(); + + if (maxExtent) { + var width = maxExtent.getWidth(); //如果 newBounds 在 maxExtent 的左边,那么一直向右移动,直到相交或者包含为止,每次移动width + //shift right? + + while (newBounds.left < maxExtent.left && newBounds.right - rightTolerance <= maxExtent.left) { + newBounds = newBounds.add(width, 0); + } //如果 newBounds 在 maxExtent 的右边,那么一直向左移动,直到相交或者包含为止,每次移动width + //shift left? + + + while (newBounds.left + leftTolerance >= maxExtent.right && newBounds.right > maxExtent.right) { + newBounds = newBounds.add(-width, 0); + } //如果和右边相交,左边又在内部,那么再次向左边移动一次 + // crosses right only? force left + + + var newLeft = newBounds.left + leftTolerance; + + if (newLeft < maxExtent.right && newLeft > maxExtent.left && newBounds.right - rightTolerance > maxExtent.right) { + newBounds = newBounds.add(-width, 0); + } + } + + return newBounds; + } + /** + * @function Bounds.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * var obj = bounds.toServerJSONObject(); + * @returns {Object} JSON 格式的 Object 对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = { + rightTop: { + x: this.right, + y: this.top + }, + leftBottom: { + x: this.left, + y: this.bottom + }, + left: this.left, + right: this.right, + top: this.top, + bottom: this.bottom + }; + return jsonObject; + } + /** + * + * @function Bounds.prototype.destroy + * @description 销毁此对象。 + * 销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var bounds = new Bounds(-180,-90,100,80); + * bounds.destroy(); + */ + + }, { + key: "destroy", + value: function destroy() { + this.left = null; + this.right = null; + this.top = null; + this.bottom = null; + this.centerLonLat = null; + } + /** + * @function Bounds.fromString + * @description 通过字符串参数创建新的 bounds 的构造函数。 + * @example + * var bounds = Bounds.fromString("-180,-90,100,80"); + * @param {string} str - 边界字符串,用逗号隔开(e.g. "5,42,10,45")。 + * @param {boolean} [reverseAxisOrder=false] - 是否反转轴顺序。 + * 如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Bounds} 给定的字符串创建的新的边界对象。 + */ + + }], [{ + key: "fromString", + value: function fromString(str, reverseAxisOrder) { + var bounds = str.split(","); + return Bounds.fromArray(bounds, reverseAxisOrder); + } + /** + * @function Bounds.fromArray + * @description 通过边界框数组创建 Bounds。 + * @example + * var bounds = Bounds.fromArray([-180,-90,100,80]); + * @param {Array.} bbox - 边界值数组。(e.g. [5,42,10,45])。 + * @param {boolean} [reverseAxisOrder=false] - 是否是反转轴顺序。如果设为true,则倒转顺序(bottom,left,top,right),否则按正常轴顺序(left,bottom,right,top)。 + * @returns {Bounds} 根据传入的数组创建的新的边界对象。 + */ + + }, { + key: "fromArray", + value: function fromArray(bbox, reverseAxisOrder) { + return reverseAxisOrder === true ? new Bounds(bbox[1], bbox[0], bbox[3], bbox[2]) : new Bounds(bbox[0], bbox[1], bbox[2], bbox[3]); + } + /** + * @function Bounds.fromSize + * @description 通过传入的边界大小来创建新的边界。 + * @example + * var bounds = Bounds.fromSize(new Size(20,10)); + * @param {Size} size - 边界大小。 + * @returns {Bounds} 根据传入的边界大小的创建新的边界。 + */ + + }, { + key: "fromSize", + value: function fromSize(size) { + return new Bounds(0, size.h, size.w, 0); + } + /** + * @function Bounds.oppositeQuadrant + * @description 反转象限。"t"和"b" 交换,"r"和"l"交换, 如:"tl"变为"br"。 + * @param {string} quadrant - 代表象限的字符串,如:"tl"。 + * @returns {string} 反转后的象限。 + */ + + }, { + key: "oppositeQuadrant", + value: function oppositeQuadrant(quadrant) { + var opp = ""; + opp += quadrant.charAt(0) === 't' ? 'b' : 't'; + opp += quadrant.charAt(1) === 'l' ? 'r' : 'l'; + return opp; + } + }]); + + return Bounds; +}(); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Collection.js +function Collection_typeof(obj) { "@babel/helpers - typeof"; return Collection_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Collection_typeof(obj); } + +function Collection_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Collection_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Collection_createClass(Constructor, protoProps, staticProps) { if (protoProps) Collection_defineProperties(Constructor.prototype, protoProps); if (staticProps) Collection_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); } + +function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (Collection_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryCollection + * @aliasclass Geometry.Collection + * @deprecatedclass SuperMap.Geometry.Collection + * @classdesc 几何对象集合类,存储在本地的 components 属性中(可作为参数传递给构造函数)。
+ * 随着新的几何图形添加到集合中,将不能被克隆,当移动几何图形时,需要指定参照物。
+ * getArea 和 getLength 函数只能通过遍历存储几何对象的 components 数组,总计所有几何图形的面积和长度。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {Array.} components - 几何对象数组。 + * @example + * var point1 = new GeometryPoint(10,20); + * var point2 = new GeometryPoint(30,40); + * var col = new GeometryCollection([point1,point2]); + * @usage + */ + +var Collection = /*#__PURE__*/function (_Geometry) { + _inherits(Collection, _Geometry); + + var _super = _createSuper(Collection); + + function Collection(components) { + var _this; + + Collection_classCallCheck(this, Collection); + + _this = _super.call(this); + /** + * @description 存储几何对象的数组。 + * @member {Array.} GeometryCollection.prototype.components + */ + + _this.components = []; + /** + * @member {Array.} GeometryCollection.prototype.componentTypes + * @description components 存储的的几何对象所支持的几何类型数组,为空表示类型不受限制。 + */ + + _this.componentTypes = null; + + if (components != null) { + _this.addComponents(components); + } + + _this.CLASS_NAME = "SuperMap.Geometry.Collection"; + _this.geometryType = "Collection"; + return _this; + } + /** + * @function GeometryCollection.prototype.destroy + * @description 销毁几何图形。 + */ + + + Collection_createClass(Collection, [{ + key: "destroy", + value: function destroy() { + this.components.length = 0; + this.components = null; + + _get(_getPrototypeOf(Collection.prototype), "destroy", this).call(this); + } + /** + * @function GeometryCollection.prototype.clone + * @description 克隆当前几何对象。 + * @returns {GeometryCollection} 克隆的几何对象集合。 + */ + + }, { + key: "clone", + value: function clone() { + var geometry = new Collection(); + + for (var i = 0, len = this.components.length; i < len; i++) { + geometry.addComponent(this.components[i].clone()); + } // catch any randomly tagged-on properties + + + Util.applyDefaults(geometry, this); + return geometry; + } + /** + * @function GeometryCollection.prototype.getComponentsString + * @description 获取 components 字符串。 + * @returns {string} components 字符串。 + */ + + }, { + key: "getComponentsString", + value: function getComponentsString() { + var strings = []; + + for (var i = 0, len = this.components.length; i < len; i++) { + strings.push(this.components[i].toShortString()); + } + + return strings.join(","); + } + /** + * @function GeometryCollection.prototype.calculateBounds + * @description 通过遍历数组重新计算边界,在遍历每一子项中时调用 extend 方法。 + */ + + }, { + key: "calculateBounds", + value: function calculateBounds() { + this.bounds = null; + var bounds = new Bounds(); + var components = this.components; + + if (components) { + for (var i = 0, len = components.length; i < len; i++) { + bounds.extend(components[i].getBounds()); + } + } // to preserve old behavior, we only set bounds if non-null + // in the future, we could add bounds.isEmpty() + + + if (bounds.left != null && bounds.bottom != null && bounds.right != null && bounds.top != null) { + this.setBounds(bounds); + } + } + /** + * @function GeometryCollection.prototype.addComponents + * @description 给几何图形对象添加元素。 + * @param {Array.} components - 几何对象组件。 + * @example + * var geometryCollection = new GeometryCollection(); + * geometryCollection.addComponents(new SuerpMap.Geometry.Point(10,10)); + */ + + }, { + key: "addComponents", + value: function addComponents(components) { + if (!Util.isArray(components)) { + components = [components]; + } + + for (var i = 0, len = components.length; i < len; i++) { + this.addComponent(components[i]); + } + } + /** + * @function GeometryCollection.prototype.addComponent + * @description 添加几何对象到集合中。如果设置了 componentTypes 类型,则添加的几何对象必须是 componentTypes 中的类型。 + * @param {Geometry} component - 待添加的几何对象。 + * @param {number} [index] - 几何对象插入的位置。 + * @returns {boolean} 是否添加成功。 + */ + + }, { + key: "addComponent", + value: function addComponent(component, index) { + var added = false; + + if (component) { + if (this.componentTypes == null || Util.indexOf(this.componentTypes, component.CLASS_NAME) > -1) { + if (index != null && index < this.components.length) { + var components1 = this.components.slice(0, index); + var components2 = this.components.slice(index, this.components.length); + components1.push(component); + this.components = components1.concat(components2); + } else { + this.components.push(component); + } + + component.parent = this; + this.clearBounds(); + added = true; + } + } + + return added; + } + /** + * @function GeometryCollection.prototype.removeComponents + * @description 清除几何对象。 + * @param {Array.} components - 需要清除的几何对象。 + * @returns {boolean} 元素是否被删除。 + */ + + }, { + key: "removeComponents", + value: function removeComponents(components) { + var removed = false; + + if (!Util.isArray(components)) { + components = [components]; + } + + for (var i = components.length - 1; i >= 0; --i) { + removed = this.removeComponent(components[i]) || removed; + } + + return removed; + } + /** + * @function GeometryCollection.prototype.removeComponent + * @description 从集合中移除几何对象。 + * @param {Geometry} component - 要移除的几何对象。 + * @returns {boolean} 几何对象是否移除成功。 + */ + + }, { + key: "removeComponent", + value: function removeComponent(component) { + Util.removeItem(this.components, component); // clearBounds() so that it gets recalculated on the next call + // to this.getBounds(); + + this.clearBounds(); + return true; + } + /** + * @function GeometryCollection.prototype.getArea + * @description 计算几何对象的面积。注意,这个方法在 {@link GeometryPolygon} 类中需要重写。 + * @returns {number} 几何图形的面积,是几何对象中所有组成部分的面积之和。 + */ + + }, { + key: "getArea", + value: function getArea() { + var area = 0.0; + + for (var i = 0, len = this.components.length; i < len; i++) { + area += this.components[i].getArea(); + } + + return area; + } + /** + * @function GeometryCollection.prototype.equals + * @description 判断两个几何图形是否相等。如果所有的 components 具有相同的坐标,则认为是相等的。 + * @param {Geometry} geometry - 需要判断的几何图形。 + * @returns {boolean} 输入的几何图形与当前几何图形是否相等。 + */ + + }, { + key: "equals", + value: function equals(geometry) { + var equivalent = true; + + if (!geometry || !geometry.CLASS_NAME || this.CLASS_NAME !== geometry.CLASS_NAME) { + equivalent = false; + } else if (!Util.isArray(geometry.components) || geometry.components.length !== this.components.length) { + equivalent = false; + } else { + for (var i = 0, len = this.components.length; i < len; ++i) { + if (!this.components[i].equals(geometry.components[i])) { + equivalent = false; + break; + } + } + } + + return equivalent; + } + /** + * @function GeometryCollection.prototype.getVertices + * @description 返回几何对象的所有结点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false,则返回非端点的顶点如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何对象的顶点列表。 + */ + + }, { + key: "getVertices", + value: function getVertices(nodes) { + var vertices = []; + + for (var i = 0, len = this.components.length; i < len; ++i) { + Array.prototype.push.apply(vertices, this.components[i].getVertices(nodes)); + } + + return vertices; + } + }]); + + return Collection; +}(Geometry); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiPoint.js +function MultiPoint_typeof(obj) { "@babel/helpers - typeof"; return MultiPoint_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MultiPoint_typeof(obj); } + +function MultiPoint_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MultiPoint_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MultiPoint_createClass(Constructor, protoProps, staticProps) { if (protoProps) MultiPoint_defineProperties(Constructor.prototype, protoProps); if (staticProps) MultiPoint_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MultiPoint_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MultiPoint_setPrototypeOf(subClass, superClass); } + +function MultiPoint_setPrototypeOf(o, p) { MultiPoint_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MultiPoint_setPrototypeOf(o, p); } + +function MultiPoint_createSuper(Derived) { var hasNativeReflectConstruct = MultiPoint_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MultiPoint_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MultiPoint_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MultiPoint_possibleConstructorReturn(this, result); }; } + +function MultiPoint_possibleConstructorReturn(self, call) { if (call && (MultiPoint_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MultiPoint_assertThisInitialized(self); } + +function MultiPoint_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MultiPoint_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MultiPoint_getPrototypeOf(o) { MultiPoint_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MultiPoint_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeometryMultiPoint + * @aliasclass Geometry.MultiPoint + * @deprecatedclass SuperMap.Geometry.MultiPoint + * @classdesc 几何对象多点类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 点对象数组。 + * @example + * var point1 = new GeometryPoint(5,6); + * var poine2 = new GeometryMultiPoint(7,8); + * var multiPoint = new MultiPoint([point1,point2]); + * @usage + */ + +var MultiPoint = /*#__PURE__*/function (_Collection) { + MultiPoint_inherits(MultiPoint, _Collection); + + var _super = MultiPoint_createSuper(MultiPoint); + + function MultiPoint(components) { + var _this; + + MultiPoint_classCallCheck(this, MultiPoint); + + _this = _super.call(this, components); + /** + * @member {Array.} [GeometryMultiPoint.prototype.componentTypes=["SuperMap.Geometry.Point"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.Point"]; + _this.CLASS_NAME = "SuperMap.Geometry.MultiPoint"; + _this.geometryType = "MultiPoint"; + return _this; + } + /** + * @function GeometryMultiPoint.prototype.addPoint + * @description 添加点,封装了 {@link GeometryCollection|GeometryCollection.addComponent} 方法。 + * @param {GeometryPoint} point - 添加的点。 + * @param {number} [index] - 下标。 + */ + + + MultiPoint_createClass(MultiPoint, [{ + key: "addPoint", + value: function addPoint(point, index) { + this.addComponent(point, index); + } + /** + * @function GeometryMultiPoint.prototype.removePoint + * @description 移除点,封装了 {@link GeometryCollection|GeometryCollection.removeComponent} 方法。 + * @param {GeometryPoint} point - 移除的点对象。 + */ + + }, { + key: "removePoint", + value: function removePoint(point) { + this.removeComponent(point); + } + }]); + + return MultiPoint; +}(Collection); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Curve.js +function Curve_typeof(obj) { "@babel/helpers - typeof"; return Curve_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Curve_typeof(obj); } + +function Curve_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Curve_createClass(Constructor, protoProps, staticProps) { if (protoProps) Curve_defineProperties(Constructor.prototype, protoProps); if (staticProps) Curve_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Curve_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Curve_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Curve_setPrototypeOf(subClass, superClass); } + +function Curve_setPrototypeOf(o, p) { Curve_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Curve_setPrototypeOf(o, p); } + +function Curve_createSuper(Derived) { var hasNativeReflectConstruct = Curve_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Curve_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Curve_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Curve_possibleConstructorReturn(this, result); }; } + +function Curve_possibleConstructorReturn(self, call) { if (call && (Curve_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Curve_assertThisInitialized(self); } + +function Curve_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Curve_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Curve_getPrototypeOf(o) { Curve_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Curve_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeometryCurve + * @aliasclass Geometry.Curve + * @deprecatedclass SuperMap.Geometry.Curve + * @classdesc 几何对象曲线类。 + * @category BaseTypes Geometry + * @extends GeometryMultiPoint + * @param {Array.} components - 几何对象数组。 + * @example + * var point1 = new GeometryPoint(10,20); + * var point2 = new GeometryPoint(30,40); + * var curve = new Curve([point1,point2]); + * @usage + */ + +var Curve = /*#__PURE__*/function (_MultiPoint) { + Curve_inherits(Curve, _MultiPoint); + + var _super = Curve_createSuper(Curve); + + function Curve(components) { + var _this; + + Curve_classCallCheck(this, Curve); + + _this = _super.call(this, components); + /** + * @member {Array.} [GeometryCurve.prototype.componentTypes=["SuperMap.Geometry.Point", "SuperMap.PointWithMeasure"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.Point", "SuperMap.PointWithMeasure"]; + _this.CLASS_NAME = "SuperMap.Geometry.Curve"; + _this.geometryType = "Curve"; + return _this; + } + + return Curve_createClass(Curve); +}(MultiPoint); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Point.js +function Point_typeof(obj) { "@babel/helpers - typeof"; return Point_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Point_typeof(obj); } + +function Point_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Point_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Point_createClass(Constructor, protoProps, staticProps) { if (protoProps) Point_defineProperties(Constructor.prototype, protoProps); if (staticProps) Point_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Point_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Point_get = Reflect.get; } else { Point_get = function _get(target, property, receiver) { var base = Point_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Point_get.apply(this, arguments); } + +function Point_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Point_getPrototypeOf(object); if (object === null) break; } return object; } + +function Point_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Point_setPrototypeOf(subClass, superClass); } + +function Point_setPrototypeOf(o, p) { Point_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Point_setPrototypeOf(o, p); } + +function Point_createSuper(Derived) { var hasNativeReflectConstruct = Point_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Point_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Point_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Point_possibleConstructorReturn(this, result); }; } + +function Point_possibleConstructorReturn(self, call) { if (call && (Point_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Point_assertThisInitialized(self); } + +function Point_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Point_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Point_getPrototypeOf(o) { Point_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Point_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryPoint + * @aliasclass Geometry.Point + * @deprecatedclass SuperMap.Geometry.Point + * @classdesc 点几何对象类。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {number} x - x 坐标。 + * @param {number} y - y 坐标。 + * @param {string} [type = 'Point'] - 点的类型。 + * @param {number} [tag] - 额外的属性,比如差值分析中的 Z 值。 + * @example + * var point = new GeometryPoint(-111.04, 45.68); + * @usage + */ + +var Point = /*#__PURE__*/function (_Geometry) { + Point_inherits(Point, _Geometry); + + var _super = Point_createSuper(Point); + + function Point(x, y, type, tag) { + var _this; + + Point_classCallCheck(this, Point); + + _this = _super.call(this, x, y, type, tag); + /** + * @member {number} GeometryPoint.prototype.x + * @description 横坐标。 + */ + + _this.x = parseFloat(x); + /** + * @member {number} GeometryPoint.prototype.y + * @description 纵坐标。 + */ + + _this.y = parseFloat(y); + /** + * @member {string} GeometryPoint.prototype.tag + * @description 用来存储额外的属性,比如差值分析中的 Z 值。 + */ + + _this.tag = tag || tag == 0 ? parseFloat(tag) : null; + /** + * @member {string} GeometryPoint.prototype.type + * @description 用来存储点的类型 + */ + + _this.type = type || "Point"; + _this.CLASS_NAME = "SuperMap.Geometry.Point"; + _this.geometryType = "Point"; + return _this; + } + /** + * @function GeometryPoint.prototype.clone + * @description 克隆点对象。 + * @returns {GeometryPoint} 克隆后的点对象。 + */ + + + Point_createClass(Point, [{ + key: "clone", + value: function clone(obj) { + if (obj == null) { + obj = new Point(this.x, this.y); + } // catch any randomly tagged-on properties + + + Util.applyDefaults(obj, this); + return obj; + } + /** + * @function GeometryPoint.prototype.calculateBounds + * @description 计算点对象的范围。 + */ + + }, { + key: "calculateBounds", + value: function calculateBounds() { + this.bounds = new Bounds(this.x, this.y, this.x, this.y); + } + /** + * @function GeometryPoint.prototype.equals + * @description 判断两个点对象是否相等。如果两个点对象具有相同的坐标,则认为是相等的。 + * @example + * var point= new GeometryPoint(0,0); + * var point1={x:0,y:0}; + * var result= point.equals(point1); + * @param {GeometryPoint} geom - 需要判断的点对象。 + * @returns {boolean} 两个点对象是否相等(true 为相等,false 为不等)。 + */ + + }, { + key: "equals", + value: function equals(geom) { + var equals = false; + + if (geom != null) { + equals = this.x === geom.x && this.y === geom.y || isNaN(this.x) && isNaN(this.y) && isNaN(geom.x) && isNaN(geom.y); + } + + return equals; + } + /** + * @function GeometryPoint.prototype.move + * @description 沿着 x、y 轴的正方向上按照给定的位移移动点对象,move 不仅改变了几何对象的位置并且清理了边界缓存。 + * @param {number} x - x 轴正方向上的偏移量。 + * @param {number} y - y 轴正方向上偏移量。 + */ + + }, { + key: "move", + value: function move(x, y) { + this.x = this.x + x; + this.y = this.y + y; + this.clearBounds(); + } + /** + * @function GeometryPoint.prototype.toShortString + * @description 将 x/y 坐标转换成简单字符串。 + * @returns {string} 字符串代表点对象。(ex. "5, 42") + */ + + }, { + key: "toShortString", + value: function toShortString() { + return this.x + ", " + this.y; + } + /** + * @function GeometryPoint.prototype.destroy + * @description 释放点对象的资源。 + */ + + }, { + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.tag = null; + + Point_get(Point_getPrototypeOf(Point.prototype), "destroy", this).call(this); + } + /** + * @function GeometryPoint.prototype.getVertices + * @description 获取几何图形所有顶点的列表。 + * @returns {Array} 几何图形的顶点列表。 + */ + + }, { + key: "getVertices", + value: function getVertices() { + return [this]; + } + }]); + + return Point; +}(Geometry); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/LineString.js +function LineString_typeof(obj) { "@babel/helpers - typeof"; return LineString_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, LineString_typeof(obj); } + +function LineString_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LineString_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LineString_createClass(Constructor, protoProps, staticProps) { if (protoProps) LineString_defineProperties(Constructor.prototype, protoProps); if (staticProps) LineString_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LineString_get() { if (typeof Reflect !== "undefined" && Reflect.get) { LineString_get = Reflect.get; } else { LineString_get = function _get(target, property, receiver) { var base = LineString_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return LineString_get.apply(this, arguments); } + +function LineString_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = LineString_getPrototypeOf(object); if (object === null) break; } return object; } + +function LineString_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) LineString_setPrototypeOf(subClass, superClass); } + +function LineString_setPrototypeOf(o, p) { LineString_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return LineString_setPrototypeOf(o, p); } + +function LineString_createSuper(Derived) { var hasNativeReflectConstruct = LineString_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = LineString_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = LineString_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return LineString_possibleConstructorReturn(this, result); }; } + +function LineString_possibleConstructorReturn(self, call) { if (call && (LineString_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return LineString_assertThisInitialized(self); } + +function LineString_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function LineString_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function LineString_getPrototypeOf(o) { LineString_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return LineString_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryLineString + * @aliasclass Geometry.LineString + * @deprecatedclass SuperMap.Geometry.LineString + * @classdesc 几何对象线串类。 + * @category BaseTypes Geometry + * @param {Array.} points - 用来生成线串的点数组。 + * @extends GeometryCurve + * @example + * var points = [new GeometryPoint(4933.319287022352, -3337.3849141502124), + * new GeometryPoint(4960.9674060199022, -3349.3316322355736), + * new GeometryPoint(5006.0235999418364, -3358.8890067038628), + * new GeometryPoint(5075.3145648369318, -3378.0037556404409), + * new GeometryPoint(5305.19551436013, -3376.9669111768926)], + * var roadLine = new GeometryLineString(points); + * @usage + */ + +var LineString = /*#__PURE__*/function (_Curve) { + LineString_inherits(LineString, _Curve); + + var _super = LineString_createSuper(LineString); + + function LineString(points) { + var _this; + + LineString_classCallCheck(this, LineString); + + _this = _super.call(this, points); + _this.CLASS_NAME = "SuperMap.Geometry.LineString"; + _this.geometryType = "LineString"; + return _this; + } + /** + * @function GeometryLineString.prototype.removeComponent + * @description 只有在线串上有三个或更多的点的时候,才会允许移除点(否则结果将会是单一的点)。 + * @param {GeometryPoint} point - 将被删除的点。 + * @returns {boolean} 删除的点。 + */ + + + LineString_createClass(LineString, [{ + key: "removeComponent", + value: function removeComponent(point) { + // eslint-disable-line no-unused-vars + var removed = this.components && this.components.length > 2; + + if (removed) { + LineString_get(LineString_getPrototypeOf(LineString.prototype), "removeComponent", this).apply(this, arguments); + } + + return removed; + } + /** + * @function GeometryLineString.prototype.getSortedSegments + * @description 获取升序排列的点坐标对象数组。 + * @returns {Array} 升序排列的点坐标对象数组。 + */ + + }, { + key: "getSortedSegments", + value: function getSortedSegments() { + var numSeg = this.components.length - 1; + var segments = new Array(numSeg), + point1, + point2; + + for (var i = 0; i < numSeg; ++i) { + point1 = this.components[i]; + point2 = this.components[i + 1]; + + if (point1.x < point2.x) { + segments[i] = { + x1: point1.x, + y1: point1.y, + x2: point2.x, + y2: point2.y + }; + } else { + segments[i] = { + x1: point2.x, + y1: point2.y, + x2: point1.x, + y2: point1.y + }; + } + } // more efficient to define this somewhere static + + + function byX1(seg1, seg2) { + return seg1.x1 - seg2.x1; + } + + return segments.sort(byX1); + } + /** + * @function GeometryLineString.prototype.getVertices + * @description 返回几何图形的所有顶点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false,则返回非端点的顶点。如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何图形的顶点列表。 + */ + + }, { + key: "getVertices", + value: function getVertices(nodes) { + var vertices; + + if (nodes === true) { + vertices = [this.components[0], this.components[this.components.length - 1]]; + } else if (nodes === false) { + vertices = this.components.slice(1, this.components.length - 1); + } else { + vertices = this.components.slice(); + } + + return vertices; + } + /** + * @function GeometryLineString.calculateCircle + * @description 三点画圆弧。 + * @param {Array.} points - 传入的待计算的初始点串。 + * @returns {Array.} 计算出相应的圆弧控制点。 + * @example + * var points = []; + * points.push(new GeometryPoint(-50,30)); + * points.push(new GeometryPoint(-30,50)); + * points.push(new GeometryPoint(2,60)); + * var circle = GeometryLineString.calculateCircle(points); + */ + + }], [{ + key: "calculateCircle", + value: function calculateCircle(points) { + if (points.length < 3) { + return points; + } + + var centerPoint = {}, + p1 = points[0], + p2 = points[1], + p3 = points[2]; + var R = 0, + dStep = 0, + direc = true, + dRotation = 0, + dRotationBegin = 0, + dRotationAngle = 0, + nSegmentCount = 72, + circlePoints = []; + var KTan13 = (p3.y - p1.y) / (p3.x - p1.x); + var B13 = p3.y - KTan13 * p3.x; + + if (p3.x != p1.x && p3.y != p1.y && p2.y == KTan13 * p2.x + B13 || p3.x == p1.x && p2.x == p1.x || p3.y == p1.y && p2.y == p1.y || p3.x == p1.x && p3.y == p1.y || p3.x == p2.x && p3.y == p2.y || p1.x == p2.x && p1.y == p2.y) { + circlePoints.push(p1); + circlePoints.push(p2); + circlePoints.push(p3); + } else { + var D = (p2.x * p2.x + p2.y * p2.y - (p1.x * p1.x + p1.y * p1.y)) * (2 * (p3.y - p1.y)) - (p3.x * p3.x + p3.y * p3.y - (p1.x * p1.x + p1.y * p1.y)) * (2 * (p2.y - p1.y)); + var E = 2 * (p2.x - p1.x) * (p3.x * p3.x + p3.y * p3.y - (p1.x * p1.x + p1.y * p1.y)) - 2 * (p3.x - p1.x) * (p2.x * p2.x + p2.y * p2.y - (p1.x * p1.x + p1.y * p1.y)); + var F = 4 * ((p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y)); + centerPoint.x = D / F; + centerPoint.y = E / F; + R = Math.sqrt((p1.x - centerPoint.x) * (p1.x - centerPoint.x) + (p1.y - centerPoint.y) * (p1.y - centerPoint.y)); + var dis = (p1.x - p3.x) * (p1.x - p3.x) + (p1.y - p3.y) * (p1.y - p3.y); + var cons = (2 * R * R - dis) / (2 * R * R); + cons = cons >= 1 ? 1 : cons; + cons = cons <= -1 ? -1 : cons; + dRotationAngle = Math.acos(cons) * 180 / Math.PI; + + if (p3.x == p1.x) { + dRotationAngle = centerPoint.x > p1.x && p2.x > p1.x || centerPoint.x < p1.x && p2.x < p1.x ? 360 - dRotationAngle : dRotationAngle; + } else { + dRotationAngle = centerPoint.y > KTan13 * centerPoint.x + B13 && p2.y > KTan13 * p2.x + B13 || centerPoint.y < KTan13 * centerPoint.x + B13 && p2.y < KTan13 * p2.x + B13 ? 360 - dRotationAngle : dRotationAngle; + } + + dStep = dRotationAngle / 72; + + if (p3.y != p1.y) { + if (p3.x == p1.x) { + if (p3.y > p1.y) { + if (p2.x < p1.x) { + direc = false; + } + } else { + if (p2.x > p1.x) { + direc = false; + } + } + } else if (p3.x < p1.x) { + if (p2.y < KTan13 * p2.x + B13) { + direc = false; + } + } else { + if (p2.y > KTan13 * p2.x + B13) { + direc = false; + } + } + } else { + if (p3.x > p1.x) { + if (p2.y > p1.y) { + direc = false; + } + } else { + if (p2.y < p1.y) { + direc = false; + } + } + } + + var K10 = (p1.y - centerPoint.y) / (p1.x - centerPoint.x); + var atan10 = K10 >= 0 ? Math.atan(K10) * 180 / Math.PI : Math.abs(Math.atan(K10) * 180 / Math.PI) + 90; + var CY = Math.abs(centerPoint.y); + + if (p1.y == CY && CY == p3.y) { + if (p1.x < p3.x) { + atan10 = atan10 + 180; + } + } + + var newPY = p1.y - centerPoint.y; + circlePoints.push(p1); + + for (var i = 1; i < nSegmentCount; i++) { + dRotation = dStep * i; + dRotationBegin = atan10; + + if (direc) { + if (newPY >= 0) { + if (K10 >= 0) { + dRotationBegin = dRotationBegin + dRotation; + } else { + dRotationBegin = 180 - (dRotationBegin - 90) + dRotation; + } + } else { + if (K10 > 0) { + dRotationBegin = dRotationBegin - 180 + dRotation; + } else { + dRotationBegin = 90 - dRotationBegin + dRotation; + } + } + } else { + if (newPY >= 0) { + if (K10 >= 0) { + dRotationBegin = dRotationBegin - dRotation; + } else { + dRotationBegin = 180 - (dRotationBegin - 90) - dRotation; + } + } else { + if (K10 >= 0) { + dRotationBegin = dRotationBegin - 180 - dRotation; + } else { + dRotationBegin = 90 - dRotationBegin - dRotation; + } + } + } + + dRotationBegin = dRotationBegin * Math.PI / 180; + var x = centerPoint.x + R * Math.cos(dRotationBegin); + var y = centerPoint.y + R * Math.sin(dRotationBegin); + circlePoints.push(new Point(x, y)); + } + + circlePoints.push(p3); + } + + return circlePoints; + } + /** + * @function GeometryLineString.createLineEPS + * @description 根据点的类型画出不同类型的曲线。 + * 点的类型有三种:LTypeArc,LTypeCurve,NONE。 + * @param {Array.} points - 传入的待计算的初始点串。 + * @returns {Array.} 计算出相应的 lineEPS 控制点。 + * @example + * var points = []; + * points.push(new GeometryPoint(-50,30)); + * points.push(new GeometryPoint(-30,50,"LTypeArc")); + * points.push(new GeometryPoint(2,60)); + * points.push(new GeometryPoint(8,20)); + * var lineEPS = GeometryLineString.createLineEPS(points); + */ + + }, { + key: "createLineEPS", + value: function createLineEPS(points) { + var list = [], + len = points.length; + + if (len < 2) { + return points; + } + + for (var i = 0; i < len;) { + var type = points[i].type; + + if (type == 'LTypeArc') { + var listObj = LineString.createLineArc(list, i, len, points); + list = listObj[0]; + i = listObj[1]; + } else { + list.push(points[i]); + i++; + } + } + + return list; + } + }, { + key: "createLineArc", + value: function createLineArc(list, i, len, points) { + if (i == 0) { + var bezierPtsObj = LineString.addPointEPS(points, i, len, 'LTypeArc'); + Array.prototype.push.apply(list, bezierPtsObj[0]); + i = bezierPtsObj[1] + 1; + } else if (i == len - 1) { + var bezierP = [points[i - 1], points[i]], + bezierPts = LineString.calculateCircle(bezierP); + Array.prototype.push.apply(list, bezierPts); + i++; + } else { + var _bezierPtsObj = LineString.addPointEPS(points, i, len, 'LTypeArc'); + + list.pop(); + Array.prototype.push.apply(list, _bezierPtsObj[0]); + i = _bezierPtsObj[1] + 1; + } + + return [list, i]; + } + }, { + key: "addPointEPS", + value: function addPointEPS(points, i, len, type) { + var bezierP = [], + j = i + 1; + + if (i == 0) { + Array.prototype.push.apply(bezierP, [points[i], points[i + 1]]); + } else if (i == len - 1) { + Array.prototype.push.apply(bezierP, [points[i - 1], points[i]]); + } else { + Array.prototype.push.apply(bezierP, [points[i - 1], points[i], points[i + 1]]); + } + + var bezierPts; + + if (type == 'LTypeCurve') { + bezierPts = LineString.calculatePointsFBZN(bezierP); + } else if (type == 'LTypeArc') { + bezierPts = LineString.calculateCircle(bezierP); + } + + return [bezierPts, j]; + } + }]); + + return LineString; +}(Curve); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/GeoText.js +function GeoText_typeof(obj) { "@babel/helpers - typeof"; return GeoText_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeoText_typeof(obj); } + +function GeoText_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoText_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoText_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoText_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoText_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoText_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeoText_get = Reflect.get; } else { GeoText_get = function _get(target, property, receiver) { var base = GeoText_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeoText_get.apply(this, arguments); } + +function GeoText_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeoText_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeoText_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeoText_setPrototypeOf(subClass, superClass); } + +function GeoText_setPrototypeOf(o, p) { GeoText_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeoText_setPrototypeOf(o, p); } + +function GeoText_createSuper(Derived) { var hasNativeReflectConstruct = GeoText_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeoText_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeoText_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeoText_possibleConstructorReturn(this, result); }; } + +function GeoText_possibleConstructorReturn(self, call) { if (call && (GeoText_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeoText_assertThisInitialized(self); } + +function GeoText_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeoText_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeoText_getPrototypeOf(o) { GeoText_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeoText_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class GeometryGeoText + * @aliasclass Geometry.GeoText + * @deprecatedclass SuperMap.Geometry.GeoText + * @classdesc 文本标签类。 + * @category BaseTypes Geometry + * @extends {Geometry} + * @param {number} x - x 坐标。 + * @param {number} y - y 坐标。 + * @param {string} text - 标签中的文本内容。 + * @usage + */ + +var GeoText = /*#__PURE__*/function (_Geometry) { + GeoText_inherits(GeoText, _Geometry); + + var _super = GeoText_createSuper(GeoText); + + function GeoText(x, y, text) { + var _this; + + GeoText_classCallCheck(this, GeoText); + + _this = _super.call(this, x, y, text); + /** + * @member {number} GeometryGeoText.prototype.x + * @description 横坐标。 + */ + + _this.x = parseFloat(x); + /** + * @member {number} GeometryGeoText.prototype.y + * @description 纵坐标。 + */ + + _this.y = parseFloat(y); + /** + * @member {string} GeometryGeoText.prototype.text + * @description 标签中的文本内容。 + */ + + _this.text = text.toString(); + /** + * @member {Object} GeometryGeoText.prototype.bsInfo + * @description 标签范围的基础信息。 + * @property {number} w - bounds 的宽。 + * @property {number} h - bounds 的高度。 + */ + + _this.bsInfo = { + "h": null, + "w": null + }; + _this.element = document.createElement('span'); + _this.CLASS_NAME = "SuperMap.Geometry.GeoText"; + _this.geometryType = "GeoText"; + return _this; + } + /** + * @function GeometryGeoText.prototype.destroy + * @description 销毁文本标签类。 + */ + + + GeoText_createClass(GeoText, [{ + key: "destroy", + value: function destroy() { + GeoText_get(GeoText_getPrototypeOf(GeoText.prototype), "destroy", this).call(this); + + this.x = null; + this.y = null; + this.text = null; + } + /** + * @function GeometryGeoText.prototype.getCentroid + * @description 获取标签对象的质心。 + * @returns {GeometryPoint} 标签对象的质心。 + */ + + }, { + key: "getCentroid", + value: function getCentroid() { + return new Point(this.x, this.y); + } + /** + * @function GeometryGeoText.prototype.clone + * @description 克隆标签对象。 + * @returns {GeometryGeoText} 克隆后的标签对象。 + */ + + }, { + key: "clone", + value: function clone(obj) { + if (obj == null) { + obj = new GeoText(this.x, this.y, this.text); + } + + Util.applyDefaults(obj, this); + return obj; + } + /** + * @function GeometryGeoText.prototype.calculateBounds + * @description 计算标签对象的范围。 + */ + + }, { + key: "calculateBounds", + value: function calculateBounds() { + this.bounds = new Bounds(this.x, this.y, this.x, this.y); + } + /** + * @function GeometryGeoText.prototype.getLabelPxBoundsByLabel + * @description 根据绘制好的标签获取文字标签的像素范围,参数的单位是像素;此方法相对于 getLabelPxBoundsByText 效率较低,但支持所有格式的文本。 + * @param {Object} locationPixel - 标签的位置点,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {string} labelWidth - 标签的宽度,如:“90px”。 + * @param {string} labelHeight - 标签的高度。 + * @param {Object} style - 标签的 style。 + * @returns {Bounds} 标签的像素范围。 + */ + + }, { + key: "getLabelPxBoundsByLabel", + value: function getLabelPxBoundsByLabel(locationPixel, labelWidth, labelHeight, style) { + var labelPxBounds, left, bottom, top, right; + var locationPx = Util.cloneObject(locationPixel); //计算文本行数 + + var theText = style.label || this.text; + var textRows = theText.split('\n'); + var laberRows = textRows.length; //处理文字对齐 + + labelWidth = parseFloat(labelWidth); + labelHeight = parseFloat(labelHeight); + + if (laberRows > 1) { + labelHeight = parseFloat(labelHeight) * laberRows; + } + + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelWidth / 2; + locationPx.y += labelHeight / 2; + break; + + case "lm": + locationPx.x += labelWidth / 2; + break; + + case "lb": + locationPx.x += labelWidth / 2; + locationPx.y -= labelHeight / 2; + break; + + case "ct": + locationPx.y += labelHeight / 2; + break; + + case "cb": + locationPx.y -= labelHeight / 2; + break; + + case "rt": + locationPx.x -= labelWidth / 2; + locationPx.y += labelHeight / 2; + break; + + case "rm": + locationPx.x -= labelWidth / 2; + break; + + case "rb": + locationPx.x -= labelWidth / 2; + locationPx.y -= labelHeight / 2; + break; + + default: + break; + } + } + + this.bsInfo.h = labelHeight; + this.bsInfo.w = labelWidth; //bounds的四边 + + left = locationPx.x - parseFloat(labelWidth) / 2; + bottom = locationPx.y + parseFloat(labelHeight) / 2; + right = locationPx.x + parseFloat(labelWidth) / 2; + top = locationPx.y - parseFloat(labelHeight) / 2; + labelPxBounds = new Bounds(left, bottom, right, top); + return labelPxBounds; + } + /** + * @function GeometryGeoText.prototype.getLabelPxBoundsByText + * @description 根据文本内容获取文字标签的像素范围。 + * @param {Object} locationPixel - 标签的位置点,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Object} style - 标签的样式。 + * @returns {Bounds} 标签的像素范围。 + */ + + }, { + key: "getLabelPxBoundsByText", + value: function getLabelPxBoundsByText(locationPixel, style) { + var labelPxBounds, left, bottom, top, right; + var labelSize = this.getLabelPxSize(style); + var locationPx = Util.cloneObject(locationPixel); //处理文字对齐 + + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + + case "lm": + locationPx.x += labelSize.w / 2; + break; + + case "lb": + locationPx.x += labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + + case "ct": + locationPx.y += labelSize.h / 2; + break; + + case "cb": + locationPx.y -= labelSize.h / 2; + break; + + case "rt": + locationPx.x -= labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + + case "rm": + locationPx.x -= labelSize.w / 2; + break; + + case "rb": + locationPx.x -= labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + + default: + break; + } + } + + this.bsInfo.h = labelSize.h; + this.bsInfo.w = labelSize.w; + left = locationPx.x - labelSize.w / 2; + bottom = locationPx.y + labelSize.h / 2; //处理斜体字 + + if (style.fontStyle && style.fontStyle === "italic") { + right = locationPx.x + labelSize.w / 2 + parseInt(parseFloat(style.fontSize) / 2); + } else { + right = locationPx.x + labelSize.w / 2; + } + + top = locationPx.y - labelSize.h / 2; + labelPxBounds = new Bounds(left, bottom, right, top); + return labelPxBounds; + } + /** + * @function GeometryGeoText.prototype.getLabelPxSize + * @description 获取 label 的像素大小。 + * @param {Object} style - 标签样式。 + * @returns {Object} 标签大小对象,属性 w 表示标签的宽度,属性 h 表示标签的高度。 + */ + + }, { + key: "getLabelPxSize", + value: function getLabelPxSize(style) { + var text, + //文本内容 + fontSize, + //字体大小 + spacing = 1, + //两个字符间的间距(单位:px) + lineSpacing = 0.2, + bgstrokeWidth = parseFloat(style.strokeWidth); //标签背景框边框的宽度 + + text = style.label || this.text; + + if (style.fontSize) { + fontSize = parseFloat(style.fontSize); + } else { + fontSize = parseFloat("12px"); + } //标签宽高 + + + var labelW, labelH; + var textRows = text.split('\n'); + var numRows = textRows.length; + + if (numRows > 1) { + labelH = fontSize * numRows + numRows + bgstrokeWidth + lineSpacing * fontSize; + } else { + labelH = fontSize + bgstrokeWidth + lineSpacing * fontSize + 1; + } //取最大宽度 + + + labelW = 0; + + if (this.labelWTmp && labelW < this.labelWTmp) { + labelW = this.labelWTmp; + } + + for (var i = 0; i < numRows; i++) { + var textCharC = this.getTextCount(textRows[i]); + var labelWTmp = this.labelWTmp = Util.getTextBounds(style, textRows[i], this.element).textWidth + textCharC.textC * spacing + bgstrokeWidth; + + if (labelW < labelWTmp) { + labelW = labelWTmp; + } + } + + var labelSize = new Object(); //标签大小 + + labelSize.h = labelH; + labelSize.w = labelW; + return labelSize; + } + /** + * @function GeometryGeoText.prototype.getTextCount + * @description 获取 text 中的字符个数。 + * @param {string} text - 字符串。 + * @returns {Object} 字符个数统计结果,属性 cnC 表示中文字符个数,属性 enC 表示英文字符个数,属性 textC 表示字符总个数。 + */ + + }, { + key: "getTextCount", + value: function getTextCount(text) { + var textCharCount = {}; + var cnCount = 0; + var enCount = 0; + + for (var i = 0; i < text.length; i++) { + if (text.charCodeAt(i) > 255) { + //遍历判断字符串中每个字符的Unicode码,大于255则为中文 + cnCount++; + } else { + enCount++; + } + } //中午字符个数 + + + textCharCount.cnC = cnCount; //英文字符个数 + + textCharCount.enC = enCount; //字符总个数 + + textCharCount.textC = text.length; + return textCharCount; + } + }]); + + return GeoText; +}(Geometry); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/LinearRing.js +function LinearRing_typeof(obj) { "@babel/helpers - typeof"; return LinearRing_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, LinearRing_typeof(obj); } + +function LinearRing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LinearRing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LinearRing_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinearRing_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinearRing_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LinearRing_get() { if (typeof Reflect !== "undefined" && Reflect.get) { LinearRing_get = Reflect.get; } else { LinearRing_get = function _get(target, property, receiver) { var base = LinearRing_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return LinearRing_get.apply(this, arguments); } + +function LinearRing_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = LinearRing_getPrototypeOf(object); if (object === null) break; } return object; } + +function LinearRing_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) LinearRing_setPrototypeOf(subClass, superClass); } + +function LinearRing_setPrototypeOf(o, p) { LinearRing_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return LinearRing_setPrototypeOf(o, p); } + +function LinearRing_createSuper(Derived) { var hasNativeReflectConstruct = LinearRing_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = LinearRing_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = LinearRing_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return LinearRing_possibleConstructorReturn(this, result); }; } + +function LinearRing_possibleConstructorReturn(self, call) { if (call && (LinearRing_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return LinearRing_assertThisInitialized(self); } + +function LinearRing_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function LinearRing_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function LinearRing_getPrototypeOf(o) { LinearRing_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return LinearRing_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeometryLinearRing + * @aliasclass Geometry.LinearRing + * @deprecatedclass SuperMap.Geometry.LinearRing + * @classdesc 几何对象线环类,是一个特殊的封闭的线串,在每次 addPoint/removePoint 之后会通过添加一个点(此点是复制的第一个点得到的) + * 作为最后的一个点来自动关闭线环。 + * @category BaseTypes Geometry + * @extends GeometryLineString + * @param {Array.} points - 组成线性环的点。 + * @example + * var points = [new GeometryPoint(4933.319287022352, -3337.3849141502124), + * new GeometryPoint(4960.9674060199022, -3349.3316322355736), + * new GeometryPoint(5006.0235999418364, -3358.8890067038628), + * new GeometryPoint(5075.3145648369318, -3378.0037556404409), + * new GeometryPoint(5305.19551436013, -3376.9669111768926)], + * var linearRing = new GeometryLinearRing(points); + * @usage + */ + +var LinearRing = /*#__PURE__*/function (_LineString) { + LinearRing_inherits(LinearRing, _LineString); + + var _super = LinearRing_createSuper(LinearRing); + + function LinearRing(points) { + var _this; + + LinearRing_classCallCheck(this, LinearRing); + + _this = _super.call(this, points); + /** + * @member {Array.} [GeometryLinearRing.prototype.componentTypes=["SuperMap.Geometry.Point"]] + * @description components 存储的的几何对象所支持的几何类型数组,为空表示类型不受限制。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.Point"]; + _this.CLASS_NAME = "SuperMap.Geometry.LinearRing"; + _this.geometryType = "LinearRing"; + return _this; + } + /** + * @function GeometryLinearRing.prototype.addComponent + * @description 添加一个点到几何图形数组中,如果这个点将要被添加到组件数组的末端,并且与数组中已经存在的最后一个点相同, + * 重复的点是不能被添加的。这将影响未关闭环的关闭。 + * 这个方法可以通过将非空索引(组件数组的下标)作为第二个参数重写。 + * @param {GeometryPoint} point - 点对象。 + * @param {number} [index] - 插入组件数组的下标。 + * @returns {boolean} 点对象是否添加成功。 + */ + + + LinearRing_createClass(LinearRing, [{ + key: "addComponent", + value: function addComponent(point, index) { + var added = false; //remove last point + + var lastPoint = this.components.pop(); // given an index, add the point + // without an index only add non-duplicate points + + if (index != null || !point.equals(lastPoint)) { + added = LinearRing_get(LinearRing_getPrototypeOf(LinearRing.prototype), "addComponent", this).apply(this, arguments); + } //append copy of first point + + + var firstPoint = this.components[0]; + + LinearRing_get(LinearRing_getPrototypeOf(LinearRing.prototype), "addComponent", this).apply(this, [firstPoint]); + + return added; + } + /** + * @function GeometryLinearRing.prototype.removeComponent + * @description 从几何组件中删除一个点。 + * @param {GeometryPoint} point - 点对象。 + * @returns {boolean} 点对象是否删除。 + */ + + }, { + key: "removeComponent", + value: function removeComponent(point) { + // eslint-disable-line no-unused-vars + var removed = this.components && this.components.length > 3; + + if (removed) { + //remove last point + this.components.pop(); //remove our point + + LinearRing_get(LinearRing_getPrototypeOf(LinearRing.prototype), "removeComponent", this).apply(this, arguments); //append copy of first point + + + var firstPoint = this.components[0]; + + LinearRing_get(LinearRing_getPrototypeOf(LinearRing.prototype), "addComponent", this).apply(this, [firstPoint]); + } + + return removed; + } + /** + * @function GeometryLinearRing.prototype.getArea + * @description 获得当前几何对象区域大小,如果是沿顺时针方向的环则是正值,否则为负值。 + * @returns {number} 环的面积。 + */ + + }, { + key: "getArea", + value: function getArea() { + var area = 0.0; + + if (this.components && this.components.length > 2) { + var sum = 0.0; + + for (var i = 0, len = this.components.length; i < len - 1; i++) { + var b = this.components[i]; + var c = this.components[i + 1]; + sum += (b.x + c.x) * (c.y - b.y); + } + + area = -sum / 2.0; + } + + return area; + } + /** + * @function GeometryLinearRing.prototype.getVertices + * @description 返回几何图形的所有点的列表。 + * @param {boolean} [nodes] - 对于线来说,仅仅返回作为端点的顶点,如果设为 false ,则返回非端点的顶点,如果没有设置此参数,则返回所有顶点。 + * @returns {Array} 几何对象所有点的列表。 + */ + + }, { + key: "getVertices", + value: function getVertices(nodes) { + return nodes === true ? [] : this.components.slice(0, this.components.length - 1); + } + }]); + + return LinearRing; +}(LineString); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiLineString.js +function MultiLineString_typeof(obj) { "@babel/helpers - typeof"; return MultiLineString_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MultiLineString_typeof(obj); } + +function MultiLineString_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MultiLineString_createClass(Constructor, protoProps, staticProps) { if (protoProps) MultiLineString_defineProperties(Constructor.prototype, protoProps); if (staticProps) MultiLineString_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MultiLineString_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MultiLineString_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MultiLineString_setPrototypeOf(subClass, superClass); } + +function MultiLineString_setPrototypeOf(o, p) { MultiLineString_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MultiLineString_setPrototypeOf(o, p); } + +function MultiLineString_createSuper(Derived) { var hasNativeReflectConstruct = MultiLineString_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MultiLineString_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MultiLineString_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MultiLineString_possibleConstructorReturn(this, result); }; } + +function MultiLineString_possibleConstructorReturn(self, call) { if (call && (MultiLineString_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MultiLineString_assertThisInitialized(self); } + +function MultiLineString_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MultiLineString_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MultiLineString_getPrototypeOf(o) { MultiLineString_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MultiLineString_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryMultiLineString + * @aliasclass Geometry.MultiLineString + * @deprecatedclass SuperMap.Geometry.MultiLineString + * @classdesc 几何对象多线类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - GeometryLineString 数组。 + * @example + * var multi = new GeometryMultiLineString([ + * new GeometryLineString([ + * new GeometryPoint(1, 0), + * new GeometryPoint(0, 1) + * ]) + * ]); + * @usage + */ + +var MultiLineString = /*#__PURE__*/function (_Collection) { + MultiLineString_inherits(MultiLineString, _Collection); + + var _super = MultiLineString_createSuper(MultiLineString); + + function MultiLineString(components) { + var _this; + + MultiLineString_classCallCheck(this, MultiLineString); + + _this = _super.call(this, components); + /** + * @member {Array.} [GeometryMultiLineString.prototype.componentTypes=["SuperMap.Geometry.LineString"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.LineString"]; + _this.CLASS_NAME = "SuperMap.Geometry.MultiLineString"; + _this.geometryType = "MultiLineString"; + return _this; + } + + return MultiLineString_createClass(MultiLineString); +}(Collection); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/MultiPolygon.js +function MultiPolygon_typeof(obj) { "@babel/helpers - typeof"; return MultiPolygon_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MultiPolygon_typeof(obj); } + +function MultiPolygon_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MultiPolygon_createClass(Constructor, protoProps, staticProps) { if (protoProps) MultiPolygon_defineProperties(Constructor.prototype, protoProps); if (staticProps) MultiPolygon_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MultiPolygon_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MultiPolygon_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MultiPolygon_setPrototypeOf(subClass, superClass); } + +function MultiPolygon_setPrototypeOf(o, p) { MultiPolygon_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MultiPolygon_setPrototypeOf(o, p); } + +function MultiPolygon_createSuper(Derived) { var hasNativeReflectConstruct = MultiPolygon_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MultiPolygon_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MultiPolygon_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MultiPolygon_possibleConstructorReturn(this, result); }; } + +function MultiPolygon_possibleConstructorReturn(self, call) { if (call && (MultiPolygon_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MultiPolygon_assertThisInitialized(self); } + +function MultiPolygon_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MultiPolygon_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MultiPolygon_getPrototypeOf(o) { MultiPolygon_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MultiPolygon_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeometryMultiPolygon + * @aliasclass Geometry.MultiPolygon + * @deprecatedclass SuperMap.Geometry.MultiPolygon + * @classdesc 几何对象多多边形类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 形成 GeometryMultiPolygon 的多边形数组。 + * @example + * var points1 = [new GeometryPoint(10,10),new GeometryPoint(0,0)]; + * var points2 = [new GeometryPoint(10,10),new GeometryPoint(0,0),new GeometryPoint(3,3),new GeometryPoint(10,10)]; + * + * var linearRing1 = new GeometryLinearRing(points1); + * var linearRing2 = new GeometryLinearRing(points2); + * + * var polygon1 = new GeometryPolygon([linearRing1]); + * var polygon2 = new GeometryPolygon([linearRing2]); + * + * var multiPolygon1 = new GeometryMultiPolygon([polygon1,polygon2]); + * @usage + */ + +var MultiPolygon = /*#__PURE__*/function (_Collection) { + MultiPolygon_inherits(MultiPolygon, _Collection); + + var _super = MultiPolygon_createSuper(MultiPolygon); + + function MultiPolygon(components) { + var _this; + + MultiPolygon_classCallCheck(this, MultiPolygon); + + _this = _super.call(this, components); + /** + * @member {Array.} [GeometryMultiPolygon.prototype.componentTypes=["SuperMap.Geometry.Polygon"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.Polygon"]; + _this.CLASS_NAME = "SuperMap.Geometry.MultiPolygon"; + _this.geometryType = "MultiPolygon"; + return _this; + } + + return MultiPolygon_createClass(MultiPolygon); +}(Collection); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Polygon.js +function Polygon_typeof(obj) { "@babel/helpers - typeof"; return Polygon_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Polygon_typeof(obj); } + +function Polygon_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Polygon_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Polygon_createClass(Constructor, protoProps, staticProps) { if (protoProps) Polygon_defineProperties(Constructor.prototype, protoProps); if (staticProps) Polygon_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Polygon_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Polygon_setPrototypeOf(subClass, superClass); } + +function Polygon_setPrototypeOf(o, p) { Polygon_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Polygon_setPrototypeOf(o, p); } + +function Polygon_createSuper(Derived) { var hasNativeReflectConstruct = Polygon_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Polygon_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Polygon_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Polygon_possibleConstructorReturn(this, result); }; } + +function Polygon_possibleConstructorReturn(self, call) { if (call && (Polygon_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Polygon_assertThisInitialized(self); } + +function Polygon_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Polygon_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Polygon_getPrototypeOf(o) { Polygon_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Polygon_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GeometryPolygon + * @aliasclass Geometry.Polygon + * @deprecatedclass SuperMap.Geometry.Polygon + * @classdesc 多边形几何对象类。 + * @category BaseTypes Geometry + * @extends GeometryCollection + * @param {Array.} components - 多边形的线环数组。 + * @example + * var points =[new GeometryPoint(0,4010338), + * new GeometryPoint(1063524,4010338), + * new GeometryPoint(1063524,3150322), + * new GeometryPoint(0,3150322) + * ], + * var linearRings = new GeometryLinearRing(points), + * var region = new GeometryPolygon([linearRings]); + * @usage + */ + +var Polygon = /*#__PURE__*/function (_Collection) { + Polygon_inherits(Polygon, _Collection); + + var _super = Polygon_createSuper(Polygon); + + function Polygon(components) { + var _this; + + Polygon_classCallCheck(this, Polygon); + + _this = _super.call(this, components); + /** + * @member {Array.} [GeometryPolygon.prototype.componentTypes=["SuperMap.Geometry.LinearRing"]] + * @description components 存储的的几何对象所支持的几何类型数组。 + * @readonly + */ + + _this.componentTypes = ["SuperMap.Geometry.LinearRing"]; + _this.CLASS_NAME = "SuperMap.Geometry.Polygon"; + _this.geometryType = "Polygon"; + return _this; + } + /** + * @function GeometryMultiPoint.prototype.getArea + * @description 获得区域面积,从区域的外部口径减去计此区域内部口径算所得的面积。 + * @returns {number} 几何对象的面积。 + */ + + + Polygon_createClass(Polygon, [{ + key: "getArea", + value: function getArea() { + var area = 0.0; + + if (this.components && this.components.length > 0) { + area += Math.abs(this.components[0].getArea()); + + for (var i = 1, len = this.components.length; i < len; i++) { + area -= Math.abs(this.components[i].getArea()); + } + } + + return area; + } + }]); + + return Polygon; +}(Collection); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/Rectangle.js +function Rectangle_typeof(obj) { "@babel/helpers - typeof"; return Rectangle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Rectangle_typeof(obj); } + +function Rectangle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Rectangle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Rectangle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Rectangle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Rectangle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Rectangle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Rectangle_setPrototypeOf(subClass, superClass); } + +function Rectangle_setPrototypeOf(o, p) { Rectangle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Rectangle_setPrototypeOf(o, p); } + +function Rectangle_createSuper(Derived) { var hasNativeReflectConstruct = Rectangle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Rectangle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Rectangle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Rectangle_possibleConstructorReturn(this, result); }; } + +function Rectangle_possibleConstructorReturn(self, call) { if (call && (Rectangle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Rectangle_assertThisInitialized(self); } + +function Rectangle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Rectangle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Rectangle_getPrototypeOf(o) { Rectangle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Rectangle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometryRectangle + * @aliasclass Geometry.Rectangle + * @deprecatedclass SuperMap.Geometry.Rectangle + * @classdesc 矩形几何对象类。 + * @category BaseTypes Geometry + * @param {number} x - 矩形左下角点的横坐标。 + * @param {number} y - 矩形左下角点的纵坐标。 + * @param {number} width - 矩形的宽度。 + * @param {number} height - 矩形的高度。 + * @extends {Geometry} + * @example + * //x 为矩形左下角点的横坐标;y 为矩形左下角点的纵坐标;w 为矩形的宽度;h 为矩形的高度 + * var x = 1; + * var y = 2; + * var w = 10; + * var h = 20; + * var recttangle = new GeometryRectangle(x, y, w, h); + * @usage + */ + +var Rectangle = /*#__PURE__*/function (_Geometry) { + Rectangle_inherits(Rectangle, _Geometry); + + var _super = Rectangle_createSuper(Rectangle); + + function Rectangle(x, y, width, height) { + var _this; + + Rectangle_classCallCheck(this, Rectangle); + + _this = _super.call(this, x, y, width, height); + /** + * @member {number} GeometryRectangle.prototype.x + * @description 矩形左下角点的横坐标。 + */ + + _this.x = x; + /** + * @member {number} GeometryRectangle.prototype.y + * @description 矩形左下角点的纵坐标。 + */ + + _this.y = y; + /** + * @member {number} GeometryRectangle.prototype.width + * @description 矩形的宽度。 + */ + + _this.width = width; + /** + * @member {number} GeometryRectangle.prototype.height + * @description 矩形的高度。 + */ + + _this.height = height; + _this.CLASS_NAME = "SuperMap.Geometry.Rectangle"; + _this.geometryType = "Rectangle"; + return _this; + } + /** + * @function GeometryRectangle.prototype.calculateBounds + * @description 计算出此矩形对象的 bounds。 + */ + + + Rectangle_createClass(Rectangle, [{ + key: "calculateBounds", + value: function calculateBounds() { + this.bounds = new Bounds(this.x, this.y, this.x + this.width, this.y + this.height); + } + /** + * @function GeometryRectangle.prototype.getArea + * @description 获取矩形对象的面积。 + * @returns {number} 矩形对象面积。 + */ + + }, { + key: "getArea", + value: function getArea() { + var area = this.width * this.height; + return area; + } + }]); + + return Rectangle; +}(Geometry); +;// CONCATENATED MODULE: ./src/common/commontypes/geometry/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/commontypes/Credential.js +function Credential_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Credential_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Credential_createClass(Constructor, protoProps, staticProps) { if (protoProps) Credential_defineProperties(Constructor.prototype, protoProps); if (staticProps) Credential_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Credential + * @deprecatedclass SuperMap.Credential + * @category Security + * @classdesc SuperMap 的安全证书类,其中包括 token 等安全验证信息。
+ * 需要使用用户名和密码在:"http://localhost:8090/iserver/services/security/tokens" 下申请 value。
+ * 获得形如:"2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ.." 的 value。
+ * 目前支持的功能包括:地图服务、专题图、量算、查询、公交换乘、空间分析、网络分析,不支持轮询功能。
+ * @param {string} value - 访问受安全限制的服务时用于通过安全认证的验证信息。 + * @param {string} [name='token'] - 验证信息前缀,name=value 部分的 name 部分。 + * @example + * var pixcel = new Credential("valueString","token"); + * pixcel.destroy(); + * @usage + */ +var Credential = /*#__PURE__*/function () { + function Credential(value, name) { + Credential_classCallCheck(this, Credential); + + /** + * @member {string} Credential.prototype.value + * @description 访问受安全限制的服务时用于通过安全认证的验证信息。 + */ + this.value = value ? value : ""; + /** + * @member {string} [Credential.prototype.name='token'] + * @description 验证信息前缀,name=value 部分的 name 部分。 + */ + + this.name = name ? name : "token"; + this.CLASS_NAME = "SuperMap.Credential"; + } + /** + * @function Credential.prototype.getUrlParameters + * @description 获取 name=value 的表达式。 + * @example + * var credential = new Credential("valueString","token"); + * //这里 str = "token=valueString"; + * var str = credential.getUrlParameters(); + * @returns {string} 安全信息组成的 url 片段。 + */ + + + Credential_createClass(Credential, [{ + key: "getUrlParameters", + value: function getUrlParameters() { + //当需要其他安全信息的时候,则需要return this.name + "=" + this.value + "&" + "...";的形式添加。 + return this.name + "=" + this.value; + } + /** + * @function Credential.prototype.getValue + * @description 获取 value。 + * @example + * var credential = new Credential("2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ..","token"); + * //这里 str = "2OMwGmcNlrP2ixqv1Mk4BuQMybOGfLOrljruX6VcYMDQKc58Sl9nMHsqQaqeBx44jRvKSjkmpZKK1L596y7skQ.."; + * var str = credential.getValue(); + * @returns {string} value 字符串,在 iServer 服务下该 value 值即为 token 值。 + */ + + }, { + key: "getValue", + value: function getValue() { + return this.value; + } + /** + * + * @function Credential.prototype.destroy + * @description 销毁此对象。销毁后此对象的所有属性为 null,而不是初始值。 + * @example + * var credential = new Credential("valueString","token"); + * credential.destroy(); + */ + + }, { + key: "destroy", + value: function destroy() { + this.value = null; + this.name = null; + } + }]); + + return Credential; +}(); +/** + * @member {Credential} Credential.CREDENTIAL + * @description 这个对象保存一个安全类的实例,在服务端需要安全验证的时候必须进行设置。 + * @example + * 代码实例: + * // 当iServer启用服务安全的时候,下边的代码是必须的。安全证书类能够接收一个value和一个name参数。 + * var value = "(以iServer为例,这里是申请的token值)"; + * var name = "token"; + * // 默认name参数为token,所以当使用iServer服务的时候可以不进行设置。 + * Credential.CREDENTIAL = new Credential(value, name); + * + */ + +Credential.CREDENTIAL = null; +;// CONCATENATED MODULE: ./src/common/commontypes/Date.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @name Date + * @namespace + * @category BaseTypes Util + * @description 包含 parse、toISOString 方法的实现,两个方法用来解析 RFC 3339 日期,遵循 ECMAScript 5 规范。 + * @private + */ +var DateExt = { + /** + * @description 生成代表一个具体的日期字符串,该日期遵循 ISO 8601 标准(详情查看{@link http://tools.ietf.org/html/rfc3339})。 + * @example + * var dateString = DateExt.toISOString(new Date()); + * @param {Date} date - 日期对象。 + * @returns {string} 一个代表日期的字符串。(例如 "2010-08-07T16:58:23.123Z")。 + */ + toISOString: function () { + //标准的Date会存在toISOString方法,可以直接调用 + if ("toISOString" in Date.prototype) { + return function (date) { + return date.toISOString(); + }; + } else { + // 部分浏览器没有,就得自己组合,组合后的字符串规则不变 + var pad = function pad(num, len) { + var str = num + ""; + + while (str.length < len) { + str = "0" + str; + } + + return str; + }; + + return function (date) { + var str; + + if (isNaN(date.getTime())) { + // ECMA-262 says throw RangeError, Firefox returns + // "Invalid Date" + str = "Invalid Date"; + } else { + str = date.getUTCFullYear() + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + "T" + pad(date.getUTCHours(), 2) + ":" + pad(date.getUTCMinutes(), 2) + ":" + pad(date.getUTCSeconds(), 2) + "." + pad(date.getUTCMilliseconds(), 3) + "Z"; + } + + return str; + }; + } + }(), + + /** + * @description 从一个字符串生成一个日期对象。 + * @example + * var date = DateExt.parse("2010-08-07"); + * @param {string} str - 日期的字符串。(例如: "2010", "2010-08", "2010-08-07", "2010-08-07T16:58:23.123Z","2010-08-07T11:58:23.123-06")。 + * @returns {Date} 日期对象,如果字符串无法被解析,则返回一个无效的日期。(例如 isNaN(date.getTime()))。 + */ + parse: function parse(str) { + var date; + var match = str.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))|Z)?$/); + + if (match && (match[1] || match[7])) { + // must have at least year or time + var year = parseInt(match[1], 10) || 0; + var month = parseInt(match[2], 10) - 1 || 0; + var day = parseInt(match[3], 10) || 1; + date = new Date(Date.UTC(year, month, day)); // optional time + + var type = match[7]; + + if (type) { + var hours = parseInt(match[4], 10); + var minutes = parseInt(match[5], 10); + var secFrac = parseFloat(match[6]); + var seconds = secFrac | 0; + var milliseconds = Math.round(1000 * (secFrac - seconds)); + date.setUTCHours(hours, minutes, seconds, milliseconds); // check offset + + if (type !== "Z") { + var hoursOffset = parseInt(type, 10); + var minutesOffset = parseInt(match[8], 10) || 0; + var offset = -1000 * (60 * (hoursOffset * 60) + minutesOffset * 60); + date = new Date(date.getTime() + offset); + } + } + } else { + date = new Date("invalid"); + } + + return date; + } +}; +;// CONCATENATED MODULE: ./src/common/commontypes/Event.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @name Event + * @namespace + * @category BaseTypes Events + * @description 事件处理函数. + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { Event } from '{npm}'; + * + * const result = Event.element(); + * ``` + */ + +var Event = { + /** + * @description 事件观察者列表。 + * @type {Object} + * @default false + */ + observers: false, + + /** + * @description KEY_SPACE + * @type {number} + * @default 32 + */ + KEY_SPACE: 32, + + /** + * @description KEY_BACKSPACE + * @type {number} + * @default 8 + */ + KEY_BACKSPACE: 8, + + /** + * @description KEY_TAB + * @type {number} + * @default 9 + */ + KEY_TAB: 9, + + /** + * @description KEY_RETURN + * @type {number} + * @default 13 + */ + KEY_RETURN: 13, + + /** + * @description KEY_ESC + * @type {number} + * @default 27 + */ + KEY_ESC: 27, + + /** + * @description KEY_LEFT + * @type {number} + * @default 37 + */ + KEY_LEFT: 37, + + /** + * @description KEY_UP + * @type {number} + * @default 38 + */ + KEY_UP: 38, + + /** + * @description KEY_RIGHT + * @type {number} + * @default 39 + */ + KEY_RIGHT: 39, + + /** + * @description KEY_DOWN + * @type {number} + * @default 40 + */ + KEY_DOWN: 40, + + /** + * @description KEY_DELETE + * @type {number} + * @default 46 + */ + KEY_DELETE: 46, + + /** + * @description 监听浏览器 DOM 事件。 + * @param {Event} event - Event 对象。 + * @returns {HTMLElement} 触发事件的 DOM 元素。 + */ + element: function element(event) { + return event.target || event.srcElement; + }, + + /** + * @description 判断事件是否由单次触摸引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否有且只有一个当前在与触摸表面接触的 Touch 对象。 + */ + isSingleTouch: function isSingleTouch(event) { + return event.touches && event.touches.length === 1; + }, + + /** + * @description 判断事件是否由多点触控引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否存在多个当前在与触摸表面接触的 Touch 对象。 + */ + isMultiTouch: function isMultiTouch(event) { + return event.touches && event.touches.length > 1; + }, + + /** + * @description 确定事件是否由左键单击引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否点击鼠标左键。 + */ + isLeftClick: function isLeftClick(event) { + return event.which && event.which === 1 || event.button && event.button === 1; + }, + + /** + * @description 确定事件是否由鼠标右键单击引起。 + * @param {Event} event - Event 对象。 + * @returns {boolean} 是否点击鼠标右键。 + */ + isRightClick: function isRightClick(event) { + return event.which && event.which === 3 || event.button && event.button === 2; + }, + + /** + * @description 阻止事件冒泡。 + * @param {Event} event - Event 对象。 + * @param {boolean} allowDefault - 默认为 false,表示阻止事件的默认行为。 + */ + stop: function stop(event, allowDefault) { + if (!allowDefault) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + + if (event.stopPropagation) { + event.stopPropagation(); + } else { + event.cancelBubble = true; + } + }, + + /** + * @description 查询触发指定事件的 DOM 元素。 + * @param {Event} event - Event 对象。 + * @param {string} tagName - html 标签名。 + * @returns {HTMLElement} DOM 元素。 + */ + findElement: function findElement(event, tagName) { + var element = Event.element(event); + + while (element.parentNode && (!element.tagName || element.tagName.toUpperCase() != tagName.toUpperCase())) { + element = element.parentNode; + } + + return element; + }, + + /** + * @description 监听事件,注册事件处理方法。 + * @param {(HTMLElement|string)} elementParam - 待监听的 DOM 对象或者其 ID 标识。 + * @param {string} name - 监听事件的类别名称。 + * @param {function} observer - 注册的事件处理方法。 + * @param {boolean} [useCapture=false] - 是否捕获。 + */ + observe: function observe(elementParam, name, observer, useCapture) { + var element = Util.getElement(elementParam); + useCapture = useCapture || false; + + if (name === 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) { + name = 'keydown'; + } //if observers cache has not yet been created, create it + + + if (!this.observers) { + this.observers = {}; + } //if not already assigned, make a new unique cache ID + + + if (!element._eventCacheID) { + var idPrefix = "eventCacheID_"; + + if (element.id) { + idPrefix = element.id + "_" + idPrefix; + } + + element._eventCacheID = Util.createUniqueID(idPrefix); + } + + var cacheID = element._eventCacheID; //if there is not yet a hash entry for this element, add one + + if (!this.observers[cacheID]) { + this.observers[cacheID] = []; + } //add a new observer to this element's list + + + this.observers[cacheID].push({ + 'element': element, + 'name': name, + 'observer': observer, + 'useCapture': useCapture + }); //add the actual browser event listener + + if (element.addEventListener) { + if (name === 'mousewheel') { + // https://www.chromestatus.com/features/6662647093133312 + element.addEventListener(name, observer, { + useCapture: useCapture, + passive: false + }); + } else { + element.addEventListener(name, observer, useCapture); + } + } else if (element.attachEvent) { + element.attachEvent('on' + name, observer); + } + }, + + /** + * @description 移除给定 DOM 元素的监听事件。 + * @param {(HTMLElement|string)} elementParam - 待监听的 DOM 对象或者其 ID 标识。 + */ + stopObservingElement: function stopObservingElement(elementParam) { + var element = Util.getElement(elementParam); + var cacheID = element._eventCacheID; + + this._removeElementObservers(Event.observers[cacheID]); + }, + _removeElementObservers: function _removeElementObservers(elementObservers) { + if (elementObservers) { + for (var i = elementObservers.length - 1; i >= 0; i--) { + var entry = elementObservers[i]; + var args = new Array(entry.element, entry.name, entry.observer, entry.useCapture); + Event.stopObserving.apply(this, args); + } + } + }, + + /** + * @description 移除事件监听和注册的事件处理方法。注意:事件的移除和监听相对应,移除时的各属性信息必须监听时 + * 保持一致才能确保事件移除成功。 + * @param {(HTMLElement|string)} elementParam - 被监听的 DOM 元素或者其 ID。 + * @param {string} name - 需要移除的被监听事件名称。 + * @param {function} observer - 需要移除的事件处理方法。 + * @param {boolean} [useCapture=false] - 是否捕获。 + * @returns {boolean} 监听事件是否被移除。 + */ + stopObserving: function stopObserving(elementParam, name, observer, useCapture) { + useCapture = useCapture || false; + var element = Util.getElement(elementParam); + var cacheID = element._eventCacheID; + + if (name === 'keypress') { + if (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent) { + name = 'keydown'; + } + } // find element's entry in this.observers cache and remove it + + + var foundEntry = false; + var elementObservers = Event.observers[cacheID]; + + if (elementObservers) { + // find the specific event type in the element's list + var i = 0; + + while (!foundEntry && i < elementObservers.length) { + var cacheEntry = elementObservers[i]; + + if (cacheEntry.name === name && cacheEntry.observer === observer && cacheEntry.useCapture === useCapture) { + elementObservers.splice(i, 1); + + if (elementObservers.length == 0) { + delete Event.observers[cacheID]; + } + + foundEntry = true; + break; + } + + i++; + } + } //actually remove the event listener from browser + + + if (foundEntry) { + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element && element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } + + return foundEntry; + }, + + /** + * @description 移除缓存中的监听事件。 + */ + unloadCache: function unloadCache() { + // check for Event before checking for observers, because + // Event may be undefined in IE if no map instance was + // created + if (Event && Event.observers) { + for (var cacheID in Event.observers) { + var elementObservers = Event.observers[cacheID]; + + Event._removeElementObservers.apply(this, [elementObservers]); + } + + Event.observers = false; + } + }, + CLASS_NAME: "SuperMap.Event" +}; +/* prevent memory leaks in IE */ + +Event.observe(window, 'resize', Event.unloadCache, false); +;// CONCATENATED MODULE: ./src/common/commontypes/Events.js +function Events_typeof(obj) { "@babel/helpers - typeof"; return Events_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Events_typeof(obj); } + +function Events_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Events_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Events_createClass(Constructor, protoProps, staticProps) { if (protoProps) Events_defineProperties(Constructor.prototype, protoProps); if (staticProps) Events_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class Events + * @deprecatedclass SuperMap.Events + * @classdesc 事件类。 + * @category BaseTypes Events + * @param {Object} object - 当前事件对象被添加到的 JS 对象。 + * @param {HTMLElement} element - 响应浏览器事件的 DOM 元素。 + * @param {Array.} eventTypes - 自定义应用事件的数组。 + * @param {boolean} [fallThrough=false] - 是否允许事件处理之后向上传递(冒泡),为 false 的时候阻止事件冒泡。 + * @param {Object} options - 事件对象选项。 + * @usage + */ + +var Events = /*#__PURE__*/function () { + function Events(object, element, eventTypes, fallThrough, options) { + Events_classCallCheck(this, Events); + + /** + * @member {Array.} Events.prototype.BROWSER_EVENTS + * @description 支持的事件。 + * @constant + * @default [ + "mouseover", "mouseout","mousedown", "mouseup", "mousemove", + "click", "dblclick", "rightclick", "dblrightclick","resize", + "focus", "blur","touchstart", "touchmove", "touchend","keydown", + "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", + "MSGestureStart", "MSGestureChange", "MSGestureEnd","contextmenu" + ] + */ + this.BROWSER_EVENTS = ["mouseover", "mouseout", "mousedown", "mouseup", "mousemove", "click", "dblclick", "rightclick", "dblrightclick", "resize", "focus", "blur", "touchstart", "touchmove", "touchend", "keydown", "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", "MSGestureStart", "MSGestureChange", "MSGestureEnd", "contextmenu"]; + /** + * @member {Object} Events.prototype.listeners + * @description 事件监听器函数 + */ + + this.listeners = {}; + /** + * @member {Object} Events.prototype.object + * @description 发布应用程序事件的对象。 + */ + + this.object = object; + /** + * @member {HTMLElement} Events.prototype.element + * @description 接受浏览器事件的 DOM 节点。 + */ + + this.element = null; + /** + * @member {Array.} Events.prototype.eventTypes + * @description 支持的事件类型列表。 + */ + + this.eventTypes = []; + /** + * @member {function} Events.prototype.eventHandler + * @description 绑定在元素上的事件处理器对象。 + */ + + this.eventHandler = null; + /** + * @member {boolean} [Events.prototype.fallThrough=false] + * @description 是否允许事件处理之后向上传递(冒泡),为 false 的时候阻止事件冒泡。 + */ + + this.fallThrough = fallThrough; + /** + * @member {boolean} [Events.prototype.includeXY=false] + * @description 判断是否让 xy 属性自动创建到浏览器上的鼠标事件,一般设置为 false,如果设置为 true,鼠标事件将会在事件传递过程中自动产生 xy 属性。 + * 可根据事件对象的 'evt.object' 属性在相关的事件句柄上调用 getMousePosition 函数。这个选项习惯默认为 false 的原因在于,当创建一个 + * 事件对象,其主要目的是管理。在一个 div 的相对定位的鼠标事件,将其设为 true 也是有意义的。这个选项也可以用来控制是否抵消缓存。如果 + * 设为 false 不抵消,如果设为 true,用 this.clearMouseCache() 清除缓存偏移(边界元素偏移,元素在页面的位置偏移)。 + * @example + * function named(evt) { + * this.xy = this.object.events.getMousePosition(evt); + * } + */ + + this.includeXY = false; + /** + * @member {Object} Events.prototype.extensions + * @description 事件扩展。Keys 代表事件类型,values 代表事件对象。 + */ + + this.extensions = {}; + /** + * @member {Object} Events.prototype.extensionCount + * @description 事件扩展数量。 + */ + + this.extensionCount = {}; + /** + * @member {Object} Events.prototype.clearMouseListener + * @description 待移除的鼠标监听事件。 + */ + + this.clearMouseListener = null; + Util.extend(this, options); + + if (eventTypes != null) { + for (var i = 0, len = eventTypes.length; i < len; i++) { + this.addEventType(eventTypes[i]); + } + } + + if (element != null) { + this.attachToElement(element); + } + + this.CLASS_NAME = "SuperMap.Events"; + } + /** + * @function Events.prototype.destroy + * @description 移除当前要素 element 上的所有事件监听和处理。 + */ + + + Events_createClass(Events, [{ + key: "destroy", + value: function destroy() { + for (var e in this.extensions) { + if (typeof this.extensions[e] !== "boolean") { + this.extensions[e].destroy(); + } + } + + this.extensions = null; + + if (this.element) { + Event.stopObservingElement(this.element); + + if (this.element.hasScrollEvent) { + Event.stopObserving(window, "scroll", this.clearMouseListener); + } + } + + this.element = null; + this.listeners = null; + this.object = null; + this.eventTypes = null; + this.fallThrough = null; + this.eventHandler = null; + } + /** + * @function Events.prototype.addEventType + * @description 在此事件对象中添加新的事件类型,如果这个事件类型已经添加过了,则不做任何事情。 + * @param {string} eventName - 事件名。 + */ + + }, { + key: "addEventType", + value: function addEventType(eventName) { + if (!this.listeners[eventName]) { + this.eventTypes.push(eventName); + this.listeners[eventName] = []; + } + } + /** + * @function Events.prototype.attachToElement + * @description 给 DOM 元素绑定浏览器事件。 + * @param {HTMLElement} element - 绑定浏览器事件的 DOM 元素。 + */ + + }, { + key: "attachToElement", + value: function attachToElement(element) { + if (this.element) { + Event.stopObservingElement(this.element); + } else { + // keep a bound copy of handleBrowserEvent() so that we can + // pass the same function to both Event.observe() and .stopObserving() + this.eventHandler = FunctionExt.bindAsEventListener(this.handleBrowserEvent, this); // to be used with observe and stopObserving + + this.clearMouseListener = FunctionExt.bind(this.clearMouseCache, this); + } + + this.element = element; + + for (var i = 0, len = this.BROWSER_EVENTS.length; i < len; i++) { + var eventType = this.BROWSER_EVENTS[i]; // every browser event has a corresponding application event + // (whether it's listened for or not). + + this.addEventType(eventType); // use Prototype to register the event cross-browser + + Event.observe(element, eventType, this.eventHandler); + } // disable dragstart in IE so that mousedown/move/up works normally + + + Event.observe(element, "dragstart", Event.stop); + } + /** + * @function Events.prototype.on + * @description 在一个相同的范围内注册监听器的方法,此方法调用 register 函数。 + * @example + * // 注册一个 "loadstart" 监听事件 + * events.on({"loadstart": loadStartListener}); + * + * // 同样注册一个 "loadstart" 监听事件 + * events.register("loadstart", undefined, loadStartListener); + * + * // 同时为对象注册多个监听事件 + * events.on({ + * "loadstart": loadStartListener, + * "loadend": loadEndListener, + * scope: object + * }); + * + * // 同时为对象注册多个监听事件,多次调用 register 方法 + * events.register("loadstart", object, loadStartListener); + * events.register("loadend", object, loadEndListener); + * + * + * @param {Object} object - 添加监听的对象。 + */ + + }, { + key: "on", + value: function on(object) { + for (var type in object) { + if (type !== "scope" && object.hasOwnProperty(type)) { + this.register(type, object.scope, object[type]); + } + } + } + /** + * @function Events.prototype.register + * @description 在事件对象上注册一个事件。当事件被触发时,'func' 函数被调用,假设我们触发一个事件, + * 指定 Bounds 作为 "obj",当事件被触发时,回调函数的上下文作为 Bounds 对象。 + * @param {string} type - 事件注册者的名字。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + * @param {(boolean|Object)} [priority] - 当为 true 时将新的监听加在事件队列的前面。 + */ + + }, { + key: "register", + value: function register(type, obj, func, priority) { + if (type in Events && !this.extensions[type]) { + this.extensions[type] = new Events[type](this); + } + + if (func != null && Util.indexOf(this.eventTypes, type) !== -1) { + if (obj == null) { + obj = this.object; + } + + var listeners = this.listeners[type]; + + if (!listeners) { + listeners = []; + this.listeners[type] = listeners; + this.extensionCount[type] = 0; + } + + var listener = { + obj: obj, + func: func + }; + + if (priority) { + listeners.splice(this.extensionCount[type], 0, listener); + + if (Events_typeof(priority) === "object" && priority.extension) { + this.extensionCount[type]++; + } + } else { + listeners.push(listener); + } + } + } + /** + * @function Events.prototype.registerPriority + * @description 相同的注册方法,但是在前面增加新的监听者事件查询而代替到方法的结束。 + * @param {string} type - 事件注册者的名字。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + */ + + }, { + key: "registerPriority", + value: function registerPriority(type, obj, func) { + this.register(type, obj, func, true); + } + /** + * @function Events.prototype.un + * @description 在一个相同的范围内取消注册监听器的方法,此方法调用 unregister 函数。 + * @example + * // 移除 "loadstart" 事件监听 + * events.un({"loadstart": loadStartListener}); + * + * // 使用 "unregister" 方法移除 "loadstart" 事件监听 + * events.unregister("loadstart", undefined, loadStartListener); + * + * // 取消对象多个事件监听 + * events.un({ + * "loadstart": loadStartListener, + * "loadend": loadEndListener, + * scope: object + * }); + * + * // 取消对象多个事件监听,多次调用unregister方法。 + * events.unregister("loadstart", object, loadStartListener); + * events.unregister("loadend", object, loadEndListener); + * + * @param {Object} object - 移除监听的对象。 + */ + + }, { + key: "un", + value: function un(object) { + for (var type in object) { + if (type !== "scope" && object.hasOwnProperty(type)) { + this.unregister(type, object.scope, object[type]); + } + } + } + /** + * @function Events.prototype.unregister + * @description 取消注册。 + * @param {string} type - 事件类型。 + * @param {Object} [obj=this.object] - 对象绑定的回调。 + * @param {function} [func] - 回调函数,如果没有特定的回调,则这个函数不做任何事情。 + */ + + }, { + key: "unregister", + value: function unregister(type, obj, func) { + if (obj == null) { + obj = this.object; + } + + var listeners = this.listeners[type]; + + if (listeners != null) { + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].obj === obj && listeners[i].func === func) { + listeners.splice(i, 1); + break; + } + } + } + } + /** + * @function Events.prototype.remove + * @description 删除某个事件类型的所有监听,如果该事件类型没有注册,则不做任何操作。 + * @param {string} type - 事件类型。 + */ + + }, { + key: "remove", + value: function remove(type) { + if (this.listeners[type] != null) { + this.listeners[type] = []; + } + } + /** + * @function Events.prototype.triggerEvent + * @description 触发一个特定的注册事件。 + * @param {string} type - 触发事件类型。 + * @param {Event} evt - 事件对象。 + * @returns {Event|boolean} 监听对象,如果返回是 false,则停止监听。 + */ + + }, { + key: "triggerEvent", + value: function triggerEvent(type, evt) { + var listeners = this.listeners[type]; // fast path + + if (!listeners || listeners.length == 0) { + return undefined; + } // prep evt object with object & div references + + + if (evt == null) { + evt = {}; + } + + evt.object = this.object; + evt.element = this.element; + + if (!evt.type) { + evt.type = type; + } // execute all callbacks registered for specified type + // get a clone of the listeners array to + // allow for splicing during callbacks + + + listeners = listeners.slice(); + var continueChain; + + for (var i = 0, len = listeners.length; i < len; i++) { + var callback = listeners[i]; // bind the context to callback.obj + + continueChain = callback.func.apply(callback.obj, [evt]); + + if (continueChain != undefined && continueChain === false) { + // if callback returns false, execute no more callbacks. + break; + } + } // don't fall through to other DOM elements + + + if (!this.fallThrough) { + Event.stop(evt, true); + } + + return continueChain; + } + /** + * @function Events.prototype.handleBrowserEvent + * @description 对 triggerEvent 函数的包装,给事件对象设置了 xy 属性(即当前鼠标点的 xy 坐标)。 + * @param {Event} evt - 事件对象。 + */ + + }, { + key: "handleBrowserEvent", + value: function handleBrowserEvent(evt) { + var type = evt.type, + listeners = this.listeners[type]; + + if (!listeners || listeners.length == 0) { + // noone's listening, bail out + return; + } // add clientX & clientY to all events - corresponds to average x, y + + + var touches = evt.touches; + + if (touches && touches[0]) { + var x = 0; + var y = 0; + var num = touches.length; + var touch; + + for (var i = 0; i < num; ++i) { + touch = touches[i]; + x += touch.clientX; + y += touch.clientY; + } + + evt.clientX = x / num; + evt.clientY = y / num; + } + + if (this.includeXY) { + evt.xy = this.getMousePosition(evt); + } + + this.triggerEvent(type, evt); + } + /** + * @function Events.prototype.clearMouseCache + * @description 清除鼠标缓存。 + */ + + }, { + key: "clearMouseCache", + value: function clearMouseCache() { + this.element.scrolls = null; + this.element.lefttop = null; + var body = document.body; + + if (body && !((body.scrollTop != 0 || body.scrollLeft != 0) && navigator.userAgent.match(/iPhone/i))) { + this.element.offsets = null; + } + } + /** + * @function Events.prototype.getMousePosition + * @description 获取当前鼠标的位置。 + * @param {Event} evt - 事件对象。 + * @returns {Pixel} 当前的鼠标的 xy 坐标点。 + */ + + }, { + key: "getMousePosition", + value: function getMousePosition(evt) { + if (!this.includeXY) { + this.clearMouseCache(); + } else if (!this.element.hasScrollEvent) { + Event.observe(window, "scroll", this.clearMouseListener); + this.element.hasScrollEvent = true; + } + + if (!this.element.scrolls) { + var viewportElement = Util.getViewportElement(); + this.element.scrolls = [viewportElement.scrollLeft, viewportElement.scrollTop]; + } + + if (!this.element.lefttop) { + this.element.lefttop = [document.documentElement.clientLeft || 0, document.documentElement.clientTop || 0]; + } + + if (!this.element.offsets) { + this.element.offsets = Util.pagePosition(this.element); + } + + return new Pixel(evt.clientX + this.element.scrolls[0] - this.element.offsets[0] - this.element.lefttop[0], evt.clientY + this.element.scrolls[1] - this.element.offsets[1] - this.element.lefttop[1]); + } + }]); + + return Events; +}(); +Events.prototype.BROWSER_EVENTS = ["mouseover", "mouseout", "mousedown", "mouseup", "mousemove", "click", "dblclick", "rightclick", "dblrightclick", "resize", "focus", "blur", "touchstart", "touchmove", "touchend", "keydown", "MSPointerDown", "MSPointerUp", "pointerdown", "pointerup", "MSGestureStart", "MSGestureChange", "MSGestureEnd", "contextmenu"]; +;// CONCATENATED MODULE: ./src/common/commontypes/Feature.js +function Feature_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Feature_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Feature_createClass(Constructor, protoProps, staticProps) { if (protoProps) Feature_defineProperties(Constructor.prototype, protoProps); if (staticProps) Feature_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Feature + * @deprecatedclass SuperMap.Feature + * @category BaseTypes Geometry + * @classdesc 要素类组合了地理和属性,Feature 类同时具有 marker 和 lonlat 属性。 + * @param {SuperMap.Layer} layer - 图层。 + * @param {LonLat} lonlat - 经纬度。 + * @param {Object} data - 数据对象。 + * @usage + */ + +var Feature = /*#__PURE__*/function () { + function Feature(layer, lonlat, data) { + Feature_classCallCheck(this, Feature); + + this.CLASS_NAME = "SuperMap.Feature"; + /** + * @deprecated + * @member {SuperMap.Layer} Feature.prototype.layer + * @description 图层。 + */ + + this.layer = layer; + /** + * @member {string} Feature.prototype.id + * @description 要素 ID。 + */ + + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + /** + * @member {LonLat} Feature.prototype.lonlat + * @description 经纬度。 + * + */ + + this.lonlat = lonlat; + /** + * @member {Object} Feature.prototype.data + * @description 数据对象。 + */ + + this.data = data != null ? data : {}; + } + /** + * @function Feature.prototype.destroy + * @description 释放相关资源。 + */ + + + Feature_createClass(Feature, [{ + key: "destroy", + value: function destroy() { + this.id = null; + this.lonlat = null; + this.data = null; + } + }]); + + return Feature; +}(); +;// CONCATENATED MODULE: ./src/common/commontypes/Vector.js +function Vector_typeof(obj) { "@babel/helpers - typeof"; return Vector_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Vector_typeof(obj); } + +function Vector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Vector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Vector_createClass(Constructor, protoProps, staticProps) { if (protoProps) Vector_defineProperties(Constructor.prototype, protoProps); if (staticProps) Vector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Vector_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Vector_get = Reflect.get; } else { Vector_get = function _get(target, property, receiver) { var base = Vector_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Vector_get.apply(this, arguments); } + +function Vector_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Vector_getPrototypeOf(object); if (object === null) break; } return object; } + +function Vector_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Vector_setPrototypeOf(subClass, superClass); } + +function Vector_setPrototypeOf(o, p) { Vector_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Vector_setPrototypeOf(o, p); } + +function Vector_createSuper(Derived) { var hasNativeReflectConstruct = Vector_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Vector_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Vector_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Vector_possibleConstructorReturn(this, result); }; } + +function Vector_possibleConstructorReturn(self, call) { if (call && (Vector_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Vector_assertThisInitialized(self); } + +function Vector_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Vector_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Vector_getPrototypeOf(o) { Vector_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Vector_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FeatureVector + * @aliasclass Feature.Vector + * @deprecatedclass SuperMap.Feature.Vector + * @category BaseTypes Geometry + * @classdesc 矢量要素类。该类具有 Geometry 属性存放几何信息, + * attributes 属性存放非几何信息,另外还包含了 style 属性,用来定义矢量要素的样式, + * 其中,默认的样式在 {@link FeatureVector.style} 类中定义,如果没有特别的指定将使用默认的样式。 + * @extends {Feature} + * @param {Geometry} geometry - 要素的几何信息。 + * @param {Object} [attributes] - 描述要素的任意的可序列化属性,将要映射到 attributes 属性中的对象。 + * @param {Object} [style] - 样式对象。 + * @example + * var geometry = new GeometryPoint(-115,10); + * var style = { + * strokeColor:"#339933", + * strokeOpacity:1, + * strokeWidth:3, + * pointRadius:6 + * } + * var pointFeature = new FeatureVector(geometry,null,style); + * vectorLayer.addFeatures(pointFeature); + * @usage + */ +// TRASH THIS + +var State = { + /** states */ + UNKNOWN: 'Unknown', + INSERT: 'Insert', + UPDATE: 'Update', + DELETE: 'Delete' +}; +var Vector = /*#__PURE__*/function (_Feature) { + Vector_inherits(Vector, _Feature); + + var _super = Vector_createSuper(Vector); + + function Vector(geometry, attributes, style) { + var _this; + + Vector_classCallCheck(this, Vector); + + _this = _super.call(this, null, null, attributes); + /** + * @member {string} FeatureVector.prototype.fid + * @description fid + */ + + _this.fid = null; + /** + * @member {Geometry} FeatureVector.prototype.geometry + * @description 存放几何信息。 + */ + + _this.geometry = geometry ? geometry : null; + /** + * @member {Object} FeatureVector.prototype.attributes + * @description 描述要素的任意的可序列化属性。 + */ + + _this.attributes = {}; + + if (attributes) { + _this.attributes = Util.extend(_this.attributes, attributes); + } + /** + * @member {Bounds} FeatureVector.prototype.bounds + * @description 限制要素几何的边界。 + */ + + + _this.bounds = null; + /** + * @member {string} FeatureVector.prototype.state + * @description state + */ + + _this.state = null; + /** + * @member {Object} FeatureVector.prototype.style + * @description 要素的样式属性,地图查询返回的 feature 的 style,8C 变为null。 + */ + + _this.style = style ? style : null; + /** + * @member {string} FeatureVector.prototype.url + * @description 如果设置了这个属性,在更新或者删除要素时需要考虑 {@link HTTP} 。 + */ + + _this.url = null; + _this.lonlat = null; + _this.CLASS_NAME = "SuperMap.Feature.Vector"; + Vector.style = { + 'default': { + fillColor: "#ee9900", + fillOpacity: 0.4, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "#ee9900", + strokeOpacity: 1, + strokeWidth: 1, + strokeLinecap: "round", + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + cursor: "inherit", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + }, + 'select': { + fillColor: "blue", + fillOpacity: 0.4, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "blue", + strokeOpacity: 1, + strokeWidth: 2, + strokeLinecap: "round", + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + cursor: "pointer", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + }, + 'temporary': { + fillColor: "#66cccc", + fillOpacity: 0.2, + hoverFillColor: "white", + hoverFillOpacity: 0.8, + strokeColor: "#66cccc", + strokeOpacity: 1, + strokeLinecap: "round", + strokeWidth: 2, + strokeDashstyle: "solid", + hoverStrokeColor: "red", + hoverStrokeOpacity: 1, + hoverStrokeWidth: 0.2, + pointRadius: 6, + hoverPointRadius: 1, + hoverPointUnit: "%", + pointerEvents: "visiblePainted", + //cursor:"inherit", + cursor: "default", + fontColor: "#000000", + labelAlign: "cm", + labelOutlineColor: "white", + labelOutlineWidth: 3 + }, + 'delete': { + display: "none" + } + }; + return _this; + } + /** + * @function FeatureVector.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + Vector_createClass(Vector, [{ + key: "destroy", + value: function destroy() { + if (this.layer) { + this.layer.removeFeatures(this); + this.layer = null; + } + + this.geometry = null; + + Vector_get(Vector_getPrototypeOf(Vector.prototype), "destroy", this).call(this); + } + /** + * @function FeatureVector.prototype.clone + * @description 复制矢量要素,并返回复制后的新对象。 + * @returns {FeatureVector} 相同要素的新的矢量要素。 + */ + + }, { + key: "clone", + value: function clone() { + return new Vector(this.geometry ? this.geometry.clone() : null, this.attributes, this.style); + } + /** + * @function FeatureVector.prototype.toState + * @description 设置新状态。 + * @param {string} state - 状态。 + */ + + }, { + key: "toState", + value: function toState(state) { + if (state === State.UPDATE) { + switch (this.state) { + case State.UNKNOWN: + case State.DELETE: + this.state = state; + break; + + case State.UPDATE: + case State.INSERT: + break; + } + } else if (state === State.INSERT) { + switch (this.state) { + case State.UNKNOWN: + break; + + default: + this.state = state; + break; + } + } else if (state === State.DELETE) { + switch (this.state) { + case State.INSERT: + // the feature should be destroyed + break; + + case State.DELETE: + break; + + case State.UNKNOWN: + case State.UPDATE: + this.state = state; + break; + } + } else if (state === State.UNKNOWN) { + this.state = state; + } + } + }]); + + return Vector; +}(Feature); +/** + * + * @typedef {Object} FeatureVector.style + * @description Feature 有大量的样式属性,如果没有特别的指定将使用默认的样式, + * 大部分样式通过 SVG 标准定义属性。 + * - fill properties 资料介绍:{@link http://www.w3.org/TR/SVG/painting.html#FillProperties} + * - stroke properties 资料介绍:{@link http://www.w3.org/TR/SVG/painting.html#StrokeProperties} + * @property {boolean} [fill] - 不需要填充则设置为 false。 + * @property {string} [fillColor='#ee9900'] - 十六进制填充颜色。 + * @property {number} [fillOpacity=0.4] - 填充不透明度。 + * @property {boolean} [stroke] - 不需要描边则设为 false。 + * @property {string} [strokeColor='#ee9900'] - 十六进制描边颜色。 + * @property {number} [strokeOpacity=0.4] - 描边的不透明度(0-1)。 + * @property {number} [strokeWidth=1] - 像素描边宽度。 + * @property {string} [strokeLinecap='round'] - strokeLinecap 有三种类型 butt,round,square。 + * @property {string} [strokeDashstyle='solid'] - 有 dot,dash,dashdot,longdash,longdashdot,solid 几种样式。 + * @property {boolean} [graphic] - 不需要则设置为 false。 + * @property {number} [pointRadius=6] - 像素点半径。 + * @property {string} [pointerEvents='visiblePainted'] - pointerEvents。 + * @property {string} [cursor] - cursor。 + * @property {boolean} [allowRotate='false'] - 是否允许图标随着运行方向旋转。用于时空数据图层。 + * @property {string} [externalGraphic] - 连接到用来渲染点的外部的图形。 + * @property {number} [graphicWidth] - 外部图表的像素宽度。 + * @property {number} [graphicHeight] - 外部图表的高宽度。 + * @property {number} [graphicOpacity] - 外部图表的不透明度(0-1)。 + * @property {number} [graphicXOffset] - 外部图表沿着x方向的偏移量。 + * @property {number} [graphicYOffset] - 外部图表沿着y方向的偏移量 Pixel。 + * @property {number} [rotation] - 一个图表沿着其中心点(或者偏移中心指定点)在顺时针方向旋转。 + * @property {number} [graphicZIndex] - 渲染时使用的索引值。 + * @property {string} [graphicName='circle'] - 渲染点时图标使用的名字。支持"circle" , "square", "star", "x", "cross", "triangle"。 + * @property {string} [graphicTitle] - 外部图表的提示框。 + * @property {string} [backgroundGraphic] - 外部图表的背景。 + * @property {number} [backgroundGraphicZIndex] - 背景图渲染时使用的索引值。 + * @property {number} [backgroundXOffset] - 背景图在 x 轴的偏移量。 + * @property {number} [backgroundYOffset] - 背景图在 y 轴的偏移量。 + * @property {number} [backgroundHeight] - 背景图的高度。如果没有设置,将用 graphicHeight。 + * @property {number} [backgroundWidth] - 背景图的宽度。如果没有设置,将用 graphicWidth。 + * @property {boolean} [isUnicode=false] - 这个属性要配合 label 属性来用,当为 true时,label 就可以使用 unicode 编码, + * 比如 "a" 的 unicode 十六进制编码为 61,则 label 属性可以为 "a",其中 "&#" 为前缀,标志这个为 unicode 编码, + * "x" 是指 16 进制,这时页面显示的是 "a";当此值为 false 的时候,label 的内容会被直接输出, + * 比如,label 为 "a",这时页面显示的也是 "a"。 + * @property {string} [label] - 可选的标签文本。 + * @property {string} [labelAlign='cm'] - 标签对齐,是由两个字符组成的字符串,如:"lt", "cm", "rb", + * 其中第一个字符代表水平方向上的对齐,"l"=left, "c"=center, "r"=right; + * 第二个字符代表垂直方向上的对齐,"t"=top, "m"=middle, "b"=bottom。 + * @property {number} [labelXOffset] - 标签在 x 轴方向的偏移量。 + * @property {number} [labelYOffset] - 标签在 y 轴方向的偏移量。 + * @property {boolean} [labelSelect=false] - 如果设为 true,标签可以选用 SelectFeature 或者 similar 控件。 + * @property {string} [fontColor='#000000'] - 标签字体颜色。 + * @property {number} [fontOpacity] - 标签透明度 (0-1)。 + * @property {string} [fontFamily] - 标签的字体类型。 + * @property {string} [fontSize] - 标签的字体大小。 + * @property {string} [fontStyle] - 标签的字体样式。 + * @property {string} [fontWeight] - 标签的字体粗细。 + * @property {string} [display] - 如果 display 属性设置为 “none”,符号将没有任何效果。 + * @example + * // label的用法如下: + * function addGeoTest(){ + * var geometry = new GeometryPoint(105, 35); + * var pointFeature = new FeatureVector(geometry); + * var styleTest = { + * label:"supermap", + * fontColor:"#0000ff", + * fontOpacity:"0.5", + * fontFamily:"隶书", + * fontSize:"8em", + * fontWeight:"bold", + * fontStyle:"italic", + * labelSelect:"true", + * } + * pointFeature.style = styleTest; + * vectorLayer.addFeatures([pointFeature]); + * } + */ +;// CONCATENATED MODULE: ./src/common/commontypes/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/format/Format.js +function Format_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Format_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Format_createClass(Constructor, protoProps, staticProps) { if (protoProps) Format_defineProperties(Constructor.prototype, protoProps); if (staticProps) Format_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Format + * @deprecatedclass SuperMap.Format + * @classdesc 读写各种格式的格式类基类。其子类应该包含并实现 read 和 write 方法。 + * @category BaseTypes Format + * @param {Object} options - 可选参数。 + * @param {boolean} [options.keepData=false] - 如果设置为 true, data 属性会指向被解析的对象(例如 JSON 或 xml 数据对象)。 + * @param {Object} [options.data] - 当 keepData 属性设置为 true,这是传递给 read 操作的要被解析的字符串。 + * @usage + */ + +var Format = /*#__PURE__*/function () { + function Format(options) { + Format_classCallCheck(this, Format); + + /** + * @member {Object} Format.prototype.data + * @description 当 keepData 属性设置为 true,这是传递给 read 操作的要被解析的字符串。 + */ + this.data = null; + /** + * @member {Object} [Format.prototype.keepData=false] + * @description 保持最近读到的数据的引用(通过 data 属性)。 + */ + + this.keepData = false; + Util.extend(this, options); + this.options = options; + this.CLASS_NAME = "SuperMap.Format"; + } + /** + * @function Format.prototype.destroy + * @description 销毁该格式类,释放相关资源。 + */ + + + Format_createClass(Format, [{ + key: "destroy", + value: function destroy() {//用来销毁该格式类,释放相关资源 + } + /** + * @function Format.prototype.read + * @description 来从字符串中读取数据。 + * @param {string} data - 读取的数据。 + */ + + }, { + key: "read", + value: function read(data) {// eslint-disable-line no-unused-vars + //用来从字符串中读取数据 + } + /** + * @function Format.prototype.write + * @description 将对象写成字符串。 + * @param {Object} object - 可序列化的对象。 + * @returns {string} 对象转化后的字符串。 + */ + + }, { + key: "write", + value: function write(object) {// eslint-disable-line no-unused-vars + //用来写字符串 + } + }]); + + return Format; +}(); +;// CONCATENATED MODULE: ./src/common/format/JSON.js +function JSON_typeof(obj) { "@babel/helpers - typeof"; return JSON_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, JSON_typeof(obj); } + +function JSON_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function JSON_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function JSON_createClass(Constructor, protoProps, staticProps) { if (protoProps) JSON_defineProperties(Constructor.prototype, protoProps); if (staticProps) JSON_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function JSON_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) JSON_setPrototypeOf(subClass, superClass); } + +function JSON_setPrototypeOf(o, p) { JSON_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return JSON_setPrototypeOf(o, p); } + +function JSON_createSuper(Derived) { var hasNativeReflectConstruct = JSON_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = JSON_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = JSON_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return JSON_possibleConstructorReturn(this, result); }; } + +function JSON_possibleConstructorReturn(self, call) { if (call && (JSON_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return JSON_assertThisInitialized(self); } + +function JSON_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function JSON_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function JSON_getPrototypeOf(o) { JSON_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return JSON_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class JSONFormat + * @aliasclass Format.JSON + * @deprecatedclass SuperMap.Format.JSON + * @classdesc 安全的读写 JSON 的解析类。使用 {@link JSONFormat} 构造函数创建新实例。 + * @category BaseTypes Format + * @param {Object} [options] - 可选参数。 + * @param {string} [options.indent=" "] - 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + * @param {string} [options.space=" "] - 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + * @param {string} [options.newline="\n"] - 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + * @param {number} [options.level=0] - 用于格式化输出, 表示的是缩进级别。 + * @param {boolean} [options.pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @param {boolean} [options.nativeJSON] - 需要被注册的监听器对象。 + * @extends {Format} + * @usage + */ + +var JSONFormat = /*#__PURE__*/function (_Format) { + JSON_inherits(JSONFormat, _Format); + + var _super = JSON_createSuper(JSONFormat); + + function JSONFormat(options) { + var _this; + + JSON_classCallCheck(this, JSONFormat); + + _this = _super.call(this, options); + /** + * @member {string} [JSONFormat.prototype.indent=" "] + * @description 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + */ + + _this.indent = " "; + /** + * @member {string} [JSONFormat.prototype.space=" "] + * @description 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + */ + + _this.space = " "; + /** + * @member {string} [JSONFormat.prototype.newline="\n"] + * @description 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + */ + + _this.newline = "\n"; + /** + * @member {number} [JSONFormat.prototype.level=0] + * @description 用于格式化输出, 表示的是缩进级别。 + */ + + _this.level = 0; + /** + * @member {boolean} [JSONFormat.prototype.pretty=false] + * @description 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + */ + + _this.pretty = false; + /** + * @member {boolean} JSONFormat.prototype.nativeJSON + * @description 判断浏览器是否原生支持 JSON 格式数据。 + */ + + _this.nativeJSON = function () { + return !!(window.JSON && typeof JSON.parse === "function" && typeof JSON.stringify === "function"); + }(); + + _this.CLASS_NAME = "SuperMap.Format.JSON"; + /** + * @member JSONFormat.prototype.serialize + * @description 提供一些类型对象转 JSON 字符串的方法。 + */ + + _this.serialize = { + /** + * @function JSONFormat.serialize.object + * @description 把对象转换为 JSON 字符串。 + * @param {Object} object - 可序列化的对象。 + * @returns {string} JSON 字符串。 + */ + 'object': function object(_object) { + // three special objects that we want to treat differently + if (_object == null) { + return "null"; + } + + if (_object.constructor === Date) { + return this.serialize.date.apply(this, [_object]); + } + + if (_object.constructor === Array) { + return this.serialize.array.apply(this, [_object]); + } + + var pieces = ['{']; + this.level += 1; + var key, keyJSON, valueJSON; + var addComma = false; + + for (key in _object) { + if (_object.hasOwnProperty(key)) { + // recursive calls need to allow for sub-classing + keyJSON = this.write.apply(this, [key, this.pretty]); + valueJSON = this.write.apply(this, [_object[key], this.pretty]); + + if (keyJSON != null && valueJSON != null) { + if (addComma) { + pieces.push(','); + } + + pieces.push(this.writeNewline(), this.writeIndent(), keyJSON, ':', this.writeSpace(), valueJSON); + addComma = true; + } + } + } + + this.level -= 1; + pieces.push(this.writeNewline(), this.writeIndent(), '}'); + return pieces.join(''); + }, + + /** + * @function JSONFormat.serialize.array + * @description 把数组转换成 JSON 字符串。 + * @param {Array} array - 可序列化的数组。 + * @returns {string} JSON 字符串。 + */ + 'array': function array(_array) { + var json; + var pieces = ['[']; + this.level += 1; + + for (var i = 0, len = _array.length; i < len; ++i) { + // recursive calls need to allow for sub-classing + json = this.write.apply(this, [_array[i], this.pretty]); + + if (json != null) { + if (i > 0) { + pieces.push(','); + } + + pieces.push(this.writeNewline(), this.writeIndent(), json); + } + } + + this.level -= 1; + pieces.push(this.writeNewline(), this.writeIndent(), ']'); + return pieces.join(''); + }, + + /** + * @function JSONFormat.serialize.string + * @description 把字符串转换成 JSON 字符串。 + * @param {string} string - 可序列化的字符串。 + * @returns {string} JSON 字符串。 + */ + 'string': function string(_string) { + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can simply slap some quotes around it. + // Otherwise we must also replace the offending characters with safe + // sequences. + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"': '\\"', + '\\': '\\\\' + }; + /*eslint-disable no-control-regex*/ + + if (/["\\\x00-\x1f]/.test(_string)) { + return '"' + _string.replace(/([\x00-\x1f\\"])/g, function (a, b) { + var c = m[b]; + + if (c) { + return c; + } + + c = b.charCodeAt(); + return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }) + '"'; + } + + return '"' + _string + '"'; + }, + + /** + * @function JSONFormat.serialize.number + * @description 把数字转换成 JSON 字符串。 + * @param {number} number - 可序列化的数字。 + * @returns {string} JSON 字符串。 + */ + 'number': function number(_number) { + return isFinite(_number) ? String(_number) : "null"; + }, + + /** + * @function JSONFormat.serialize.boolean + * @description Transform a boolean into a JSON string. + * @param {boolean} bool - The boolean to be serialized. + * @returns {string} A JSON string representing the boolean. + */ + 'boolean': function boolean(bool) { + return String(bool); + }, + + /** + * @function JSONFormat.serialize.object + * @description 将日期对象转换成 JSON 字符串。 + * @param {Date} date - 可序列化的日期对象。 + * @returns {string} JSON 字符串。 + */ + 'date': function date(_date) { + function format(number) { + // Format integers to have at least two digits. + return number < 10 ? '0' + number : number; + } + + return '"' + _date.getFullYear() + '-' + format(_date.getMonth() + 1) + '-' + format(_date.getDate()) + 'T' + format(_date.getHours()) + ':' + format(_date.getMinutes()) + ':' + format(_date.getSeconds()) + '"'; + } + }; + return _this; + } + /** + * @function JSONFormat.prototype.read + * @description 将一个符合 JSON 结构的字符串进行解析。 + * @param {string} json - 符合 JSON 结构的字符串。 + * @param {function} filter - 过滤方法,最终结果的每一个键值对都会调用该过滤方法,并在对应的值的位置替换成该方法返回的值。 + * @returns {(Object|string|Array|number|boolean)} 对象,数组,字符串或数字。 + */ + + + JSON_createClass(JSONFormat, [{ + key: "read", + value: function read(json, filter) { + var object; + + if (this.nativeJSON) { + try { + object = JSON.parse(json, filter); + } catch (e) {// Fall through if the regexp test fails. + } + } + + if (this.keepData) { + this.data = object; + } + + return object; + } + /** + * @function JSONFormat.prototype.write + * @description 序列化一个对象到一个符合 JSON 格式的字符串。 + * @param {Object|string|Array|number|boolean} value - 需要被序列化的对象,数组,字符串,数字,布尔值。 + * @param {boolean} [pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @returns {string} 符合 JSON 格式的字符串。 + * + */ + + }, { + key: "write", + value: function write(value, pretty) { + this.pretty = !!pretty; + var json = null; + + var type = JSON_typeof(value); + + if (this.serialize[type]) { + try { + json = !this.pretty && this.nativeJSON ? JSON.stringify(value) : this.serialize[type].apply(this, [value]); + } catch (err) {//console.error("Trouble serializing: " + err); + } + } + + return json; + } + /** + * @function JSONFormat.prototype.writeIndent + * @description 根据缩进级别输出一个缩进字符串。 + * @private + * @returns {string} 一个适当的缩进字符串。 + */ + + }, { + key: "writeIndent", + value: function writeIndent() { + var pieces = []; + + if (this.pretty) { + for (var i = 0; i < this.level; ++i) { + pieces.push(this.indent); + } + } + + return pieces.join(''); + } + /** + * @function JSONFormat.prototype.writeNewline + * @description 在格式化输出模式情况下输出代表新一行的字符串。 + * @private + * @returns {string} 代表新的一行的字符串。 + */ + + }, { + key: "writeNewline", + value: function writeNewline() { + return this.pretty ? this.newline : ''; + } + /** + * @function JSONFormat.prototype.writeSpace + * @private + * @description 在格式化输出模式情况下输出一个代表空格的字符串。 + * @returns {string} 空格字符串。 + */ + + }, { + key: "writeSpace", + value: function writeSpace() { + return this.pretty ? this.space : ''; + } + }]); + + return JSONFormat; +}(Format); +;// CONCATENATED MODULE: ./src/common/iServer/ServerColor.js +function ServerColor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerColor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerColor_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerColor_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerColor_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ServerColor + * @deprecatedclass SuperMap.ServerColor + * @category iServer Map Theme + * @classdesc 颜色类。该类使用三原色( RGB )来表达颜色。 + * @param {Object} options - 可选参数。 + * @param {number} [options.red=255] - 获取或设置红色值。 + * @param {number} [options.green=0] - 获取或设置绿色值。 + * @param {number} [options.blue=0] - 获取或设置蓝色值。 + * @usage + */ +var ServerColor = /*#__PURE__*/function () { + function ServerColor(red, green, blue) { + ServerColor_classCallCheck(this, ServerColor); + + /** + * @member {number} [ServerColor.prototype.red=255] + * @description 获取或设置红色值。 + */ + this.red = !red && red != 0 ? 255 : red; + /** + * @member {number} [ServerColor.prototype.green=0] + * @description 获取或设置绿色值。 + */ + + this.green = green || 0; + /** + * @member {number} [ServerColor.prototype.blue=0] + * @description 获取或设置蓝色值。 + */ + + this.blue = blue || 0; + this.CLASS_NAME = "SuperMap.ServerColor"; + } + /** + * @function ServerColor.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ServerColor_createClass(ServerColor, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.red = null; + me.green = null; + me.blue = null; + } + /** + * @function ServerColor.formJson + * @description 将 JSON 对象转化为 ServerColor 对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerColor} 转化后的 ServerColor 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + var color = new ServerColor(); + var red = 255; + + if (jsonObject.red !== null) { + red = Number(jsonObject.red); + } + + color.red = red; + var green = 0; + + if (jsonObject.green !== null) { + green = Number(jsonObject.green); + } + + color.green = green; + var blue = 0; + + if (jsonObject.blue !== null) { + blue = Number(jsonObject.blue); + } + + color.blue = blue; + return color; + } + }]); + + return ServerColor; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ServerStyle.js +function ServerStyle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerStyle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerStyle_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerStyle_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerStyle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ServerStyle + * @deprecatedclass SuperMap.ServerStyle + * @category iServer Map Theme + * @classdesc 服务端矢量要素风格类。该类用于定义点状符号、线状符号、填充符号风格及其相关属性。 + * @param {Object} options - 参数。 + * @param {FillGradientMode} options.fillGradientMode - 渐变填充风格的渐变类型。 + * @param {ServerColor} [options.fillBackColor=[255,255,255]] - 填充背景颜色。 + * @param {boolean} [options.fillBackOpaque=false] - 背景是否不透明。 + * @param {ServerColor} [options.fillForeColor=[255,0,0]] - 填充颜色。 + * @param {number} [options.fillGradientAngle=0] - 渐变填充的旋转角度。 + * @param {number} [options.fillGradientOffsetRatioX=0] - 渐变填充中心点相对于填充区域范围中心点的水平偏移百分比。 + * @param {number} [options.fillGradientOffsetRatioY=0] - 填充中心点相对于填充区域范围中心点的垂直偏移百分比。 + * @param {number} [options.fillOpaqueRate=100] - 填充不透明度。 + * @param {number} [options.fillSymbolID=0] - 填充符号的编码。 + * @param {ServerColor} [options.lineColor] - 矢量要素的边线颜色。默认 lineColor = new ServerColor(0, 0, 0)。 + * @param {number} [options.lineSymbolID=0] - 线状符号的编码。 + * @param {number} [options.lineWidth=1] - 边线的宽度。 + * @param {number} [options.markerAngle=0] - 点状符号的旋转角度。 + * @param {number} [options.markerSize=1] - 点状符号的大小。 + * @param {number} [options.markerSymbolID=-1] - 点状符号的编码。 + * @usage + */ + +var ServerStyle = /*#__PURE__*/function () { + function ServerStyle(options) { + ServerStyle_classCallCheck(this, ServerStyle); + + /** + * @member {ServerColor} ServerStyle.prototype.fillBackColor + * @description 填充背景颜色。当填充模式为渐变填充时,该颜色为填充终止色。 + */ + this.fillBackColor = new ServerColor(255, 255, 255); + /** + * @member {boolean} [ServerStyle.prototype.fillBackOpaque=false] + * @description 背景是否不透明。false 表示透明。 + */ + + this.fillBackOpaque = false; + /** + * @member {ServerColor} ServerStyle.prototype.fillForeColor + * @description 填充颜色。当填充模式为渐变填充时,该颜色为填充起始颜色。 + */ + + this.fillForeColor = new ServerColor(255, 0, 0); + /** + * @member {FillGradientMode} ServerStyle.prototype.fillGradientMode + * @description 渐变填充风格的渐变类型。 + */ + + this.fillGradientMode = null; + /** + * @member {number} ServerStyle.prototype.fillGradientAngle - + * @description 渐变填充的旋转角度。单位为度,精确到 0.1 度,逆时针方向为正方向。 + */ + + this.fillGradientAngle = 0; + /** + * @member {number} ServerStyle.prototype.fillGradientOffsetRatioX + * @description 渐变填充中心点相对于填充区域范围中心点的水平偏移百分比。它们的关系如下:设填充区域范围中心点的坐标为(x0, y0), + * 填充中心点的坐标为(x, y),填充区域范围的宽度为 a,水平偏移百分比为 dx,则 x=x0 + a*dx/100。 + */ + + this.fillGradientOffsetRatioX = 0; + /** + * @member {number} ServerStyle.prototype.fillGradientOffsetRatioY + * @description 填充中心点相对于填充区域范围中心点的垂直偏移百分比。它们的关系如下:
+ * 设填充区域范围中心点的坐标为(x0, y0),填充中心点的坐标为(x, y),填充区域范围的高度为 b,垂直偏移百分比为 dy,则 y=y0 + b*dx/100。 + */ + + this.fillGradientOffsetRatioY = 0; + /** + * @member {number} [ServerStyle.prototype.fillOpaqueRate=100] + * @description 填充不透明度。合法值为 0 - 100 的数值。其中为 0 表示完全透明; + * 100 表示完全不透明。赋值小于 0 时按照 0 处理,大于 100 时按照 100 处理。 + */ + + this.fillOpaqueRate = 100; + /** + * @member {number} ServerStyle.prototype.fillSymbolID + * @description 填充符号的编码。此编码用于唯一标识各普通填充风格的填充符号。 + * 关于填充符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + + this.fillSymbolID = 0; + /** + * @member {ServerColor} ServerStyle.prototype.lineColor + * @description 矢量要素的边线颜色。如果等级符号是点符号,点符号的颜色由 lineColor 控制。 + */ + + this.lineColor = new ServerColor(0, 0, 0); + /** + * @member {number} [ServerStyle.prototype.lineSymbolID=0] + * @description 线状符号的编码。此编码用于唯一标识各普通填充风格的填充符号。 + * 关于线状符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + + this.lineSymbolID = 0; + /** + * @member {number} [ServerStyle.prototype.lineWidth=1.0] + * @description 边线的宽度。单位为毫米,精度到 0.1。 + */ + + this.lineWidth = 1; + /** + * @member {number} [ServerStyle.prototype.markerAngle=0] + * @description 点状符号的旋转角度。以度为单位,精确到 0.1 度,逆时针方向为正方向。 + */ + + this.markerAngle = 0; + /** + * @member {number} [ServerStyle.prototype.markerSize=1.0] + * @description 点状符号的大小。单位为毫米,精度为 0.1。当该属性设置为0时,采用符号默认大小 1.0 显示。 + * 当该属性设置为非法值时,交由服务器默认处理。 + */ + + this.markerSize = 1; + /** + * @member {number} [ServerStyle.prototype.markerSymbolID=-1] + * @description 点状符号的编码。此编码用于唯一标识各点状符号。 + * 关于线状符号的样式与对应的 ID 号请在 SuperMap 桌面软件中查找。 + */ + + this.markerSymbolID = -1; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerStyle"; + } + /** + * @function ServerStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ServerStyle_createClass(ServerStyle, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.fillBackColor) { + me.fillBackColor.destroy(); + me.fillBackColor = null; + } + + me.fillBackOpaque = null; + + if (me.fillForeColor) { + me.fillForeColor.destroy(); + me.fillForeColor = null; + } + + me.fillGradientMode = null; + me.fillGradientAngle = null; + me.fillGradientOffsetRatioX = null; + me.fillGradientOffsetRatioY = null; + me.fillOpaqueRate = null; + me.fillSymbolID = null; + + if (me.lineColor) { + me.lineColor.destroy(); + me.lineColor = null; + } + + me.lineSymbolID = null; + me.lineWidth = null; + me.markerAngle = null; + me.markerSize = null; + me.markerSymbolID = null; + } + /** + * @function ServerStyle.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象. + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var styleObj = {}; + styleObj = Util.copyAttributes(styleObj, this); //暂时先忽略serverColor往Json的转换 + + return styleObj; + } + /** + * @function ServerStyle.fromJson + * @description 将JSON对象转换为 ServerStyle 对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerStyle} 转化后的 ServerStyle 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + return new ServerStyle({ + fillBackColor: ServerColor.fromJson(jsonObject.fillBackColor), + fillBackOpaque: jsonObject.fillBackOpaque, + fillForeColor: ServerColor.fromJson(jsonObject.fillForeColor), + fillGradientMode: jsonObject.fillGradientMode, + fillGradientAngle: jsonObject.fillGradientAngle, + fillGradientOffsetRatioX: jsonObject.fillGradientOffsetRatioX, + fillGradientOffsetRatioY: jsonObject.fillGradientOffsetRatioY, + fillOpaqueRate: jsonObject.fillOpaqueRate, + fillSymbolID: jsonObject.fillSymbolID, + lineColor: ServerColor.fromJson(jsonObject.lineColor), + lineSymbolID: jsonObject.lineSymbolID, + lineWidth: jsonObject.lineWidth, + markerAngle: jsonObject.markerAngle, + markerSize: jsonObject.markerSize, + markerSymbolID: jsonObject.markerSymbolID + }); + } + }]); + + return ServerStyle; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/PointWithMeasure.js +function PointWithMeasure_typeof(obj) { "@babel/helpers - typeof"; return PointWithMeasure_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, PointWithMeasure_typeof(obj); } + +function PointWithMeasure_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function PointWithMeasure_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function PointWithMeasure_createClass(Constructor, protoProps, staticProps) { if (protoProps) PointWithMeasure_defineProperties(Constructor.prototype, protoProps); if (staticProps) PointWithMeasure_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function PointWithMeasure_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) PointWithMeasure_setPrototypeOf(subClass, superClass); } + +function PointWithMeasure_setPrototypeOf(o, p) { PointWithMeasure_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return PointWithMeasure_setPrototypeOf(o, p); } + +function PointWithMeasure_createSuper(Derived) { var hasNativeReflectConstruct = PointWithMeasure_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = PointWithMeasure_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = PointWithMeasure_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return PointWithMeasure_possibleConstructorReturn(this, result); }; } + +function PointWithMeasure_possibleConstructorReturn(self, call) { if (call && (PointWithMeasure_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return PointWithMeasure_assertThisInitialized(self); } + +function PointWithMeasure_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function PointWithMeasure_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function PointWithMeasure_getPrototypeOf(o) { PointWithMeasure_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return PointWithMeasure_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class PointWithMeasure + * @deprecatedclass SuperMap.PointWithMeasure + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由点类。路由点是指具有线性度量值 (Measure) 的二维地理坐标点。 + * @param {Object} options - 参数。 + * @param {number} options.measure - 度量值,即路由对象属性值 M。 + * @param {number} options.x - 地理坐标系下的 X 坐标值。 + * @param {number} options.y - 地理坐标系下的 Y 坐标值。 + * @extends {GeometryPoint} + * @usage + */ + +var PointWithMeasure = /*#__PURE__*/function (_Point) { + PointWithMeasure_inherits(PointWithMeasure, _Point); + + var _super = PointWithMeasure_createSuper(PointWithMeasure); + + function PointWithMeasure(options) { + var _this; + + PointWithMeasure_classCallCheck(this, PointWithMeasure); + + _this = _super.call(this, options); + /** + * @member {number} PointWithMeasure.prototype.measure + * @description 度量值,即路由对象属性值 M。 + */ + + _this.measure = null; + + if (options) { + Util.extend(PointWithMeasure_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.PointWithMeasure"; + return _this; + } + /** + * @function PointWithMeasure.prototype.equals + * @description 判断两个路由点对象是否相等。如果两个路由点对象具有相同的坐标以及度量值,则认为是相等的。 + * @param {PointWithMeasure} geom - 需要判断的路由点对象。 + * @returns {boolean} 两个路由点对象是否相等(true 为相等,false 为不等)。 + */ + + + PointWithMeasure_createClass(PointWithMeasure, [{ + key: "equals", + value: function equals(geom) { + var equals = false; + + if (geom != null) { + var isValueEquals = this.x === geom.x && this.y === geom.y && this.measure === geom.measure; + var isNaNValue = isNaN(this.x) && isNaN(this.y) && isNaN(this.measure); + var isNaNGeometry = isNaN(geom.x) && isNaN(geom.y) && isNaN(geom.measure); + equals = isValueEquals || isNaNValue && isNaNGeometry; + } + + return equals; + } + /** + * @function PointWithMeasure.prototype.toJson + * @description 转换为 JSON 对象。 + * */ + + }, { + key: "toJson", + value: function toJson() { + var result = "{"; + + if (this.measure != null && this.measure != undefined) { + result += "\"measure\":" + this.measure + ","; + } + + result += "\"x\":" + this.x + ","; + result += "\"y\":" + this.y; + result += "}"; + return result; + } + /** + * @function PointWithMeasure.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + }, { + key: "destroy", + value: function destroy() { + var me = this; + me.measure = null; + me.x = null; + me.y = null; + } + /** + * @function PointWithMeasure.fromJson + * @description 将 JSON 对象转换为{@link PointWithMeasure} 对象。 + * @param {Object} jsonObject - JSON 对象表示的路由点。 + * @returns {PointWithMeasure} 转化后的 PointWithMeasure 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + return new PointWithMeasure({ + x: jsonObject.x, + y: jsonObject.y, + measure: jsonObject.measure + }); + } + }]); + + return PointWithMeasure; +}(Point); +;// CONCATENATED MODULE: ./src/common/iServer/Route.js +function Route_typeof(obj) { "@babel/helpers - typeof"; return Route_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Route_typeof(obj); } + +function Route_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Route_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Route_createClass(Constructor, protoProps, staticProps) { if (protoProps) Route_defineProperties(Constructor.prototype, protoProps); if (staticProps) Route_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Route_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Route_setPrototypeOf(subClass, superClass); } + +function Route_setPrototypeOf(o, p) { Route_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Route_setPrototypeOf(o, p); } + +function Route_createSuper(Derived) { var hasNativeReflectConstruct = Route_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Route_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Route_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Route_possibleConstructorReturn(this, result); }; } + +function Route_possibleConstructorReturn(self, call) { if (call && (Route_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Route_assertThisInitialized(self); } + +function Route_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Route_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Route_getPrototypeOf(o) { Route_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Route_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class Route + * @deprecatedclass SuperMap.Route + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 路由对象类。路由对象为一系列有序的带有属性值 M 的 x,y 坐标对,其中 M 值为该结点的距离属性(到已知点的距离)。 + * @param {Array.} points - 形成路由对象的线数组。 + * @param {Object} options - 参数。 + * @param {number} options.id - 路由对象在数据库中的 id。 + * @param {number} options.length - 路由对象的长度。单位与数据集的单位相同。 + * @param {number} [options.maxM] - 最大线性度量值,即所有结点到起始点的量算距离中最大值。 + * @param {number} [options.minM] - 最小线性度量值,即所有结点到起始点的量算距离中最小值。 + * @param {string} [options.type] - 数据类型,如:"LINEM"。 + * @extends GeometryCollection + * @usage + */ + +var Route = /*#__PURE__*/function (_Collection) { + Route_inherits(Route, _Collection); + + var _super = Route_createSuper(Route); + + function Route(points, options) { + var _this; + + Route_classCallCheck(this, Route); + + _this = _super.call(this, points, options); + /** + * @member {number} Route.prototype.id + * @description 路由对象在数据库中的 ID。 + */ + + _this.id = null; + /** + * @member {number} Route.prototype.center + * @description 路由对象的中心点。 + */ + + _this.center = null; + /** + * @member {string} Route.prototype.style + * @description 路由对象的样式。 + */ + + _this.style = null; + /** + * @member {number} Route.prototype.length + * @description 路由对象的长度。单位与数据集的单位相同。 + */ + + _this.length = null; + /** + * @member {number} Route.prototype.maxM + * @description 最大线性度量值,即所有结点到起始点的量算距离中最大值。 + */ + + _this.maxM = null; + /** + * @member {number} Route.prototype.minM + * @description 最小线性度量值,即所有结点到起始点的量算距离中最小值。 + */ + + _this.minM = null; + /** + * @member {Array.} Route.prototype.parts + * @description 服务端几何对象中各个子对象所包含的节点个数。 + */ + + _this.parts = null; + /** + * @member {Array.} Route.prototype.points + * @description 路由对象的所有路由点。 + * @example + * (start code) + * [ + * { + * "measure": 0, + * "y": -4377.027184298267, + * "x": 4020.0045221720466 + * }, + * { + * "measure": 37.33288381391519, + * "y": -4381.569363260499, + * "x": 4057.0600591960642 + * } + * ] + * (end) + */ + + _this.points = null; + /** + * @member {string} Route.prototype.type + * @description 服务端几何对象类型。 + */ + + _this.type = null; + /** + * @member {Array.} [Route.prototype.componentTypes=LineString] + * @description components 存储的的几何对象所支持的几何类型数组。 + */ + + _this.componentTypes = ["SuperMap.Geometry.LinearRing", "SuperMap.Geometry.LineString"]; + + if (options) { + Util.extend(Route_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.Route"; + _this.geometryType = "LINEM"; + return _this; + } + /** + * + * @function Route.prototype.toJson + * @description 转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + + Route_createClass(Route, [{ + key: "toJson", + value: function toJson() { + var result = "{"; + + if (this.id != null && this.id != undefined) { + result += "\"id\":" + this.id + ","; + } + + if (this.center != null && this.center != undefined) { + result += "\"center\":" + this.center + ","; + } + + if (this.style != null && this.style != undefined) { + result += "\"style\":" + this.style + ","; + } + + if (this.length != null && this.length != undefined) { + result += "\"length\":" + this.length + ","; + } + + if (this.maxM != null && this.maxM != undefined) { + result += "\"maxM\":" + this.maxM + ","; + } + + if (this.minM != null && this.minM != undefined) { + result += "\"minM\":" + this.minM + ","; + } + + if (this.type != null && this.type != undefined) { + result += "\"type\":\"" + this.type + "\","; + } + + if (this.parts != null && this.parts != undefined) { + result += "\"parts\":[" + this.parts[0]; + + for (var i = 1; i < this.parts.length; i++) { + result += "," + this.parts[i]; + } + + result += "],"; + } + + if (this.components != null && this.components.length > 0) { + result += "\"points\":["; + + for (var j = 0, len = this.components.length; j < len; j++) { + for (var k = 0, len2 = this.components[j].components.length; k < len2; k++) { + result += this.components[j].components[k].toJson() + ","; + } + } + + result = result.replace(/,$/g, ''); + result += "]"; + } + + result = result.replace(/,$/g, ''); + result += "}"; + return result; + } + /** + * @function Route.prototype.destroy + * @override + */ + + }, { + key: "destroy", + value: function destroy() { + var me = this; + me.id = null; + me.center = null; + me.style = null; + me.length = null; + me.maxM = null; + me.minM = null; + me.type = null; + me.parts = null; + me.components.length = 0; + me.components = null; + me.componentTypes = null; + } + /** + * @function Route.fromJson + * @description 将 JSON 对象转换为 Route 对象。 + * @param {Object} [jsonObject] - JSON 对象表示的路由对象。 + * @returns {Route} 转化后的 Route 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + var geoParts = jsonObject.parts || [], + geoPoints = jsonObject.points || [], + len = geoParts.length, + lineList = []; + + if (len > 0) { + for (var i = 0, pointIndex = 0, pointList = []; i < len; i++) { + for (var j = 0; j < geoParts[i]; j++) { + pointList.push(PointWithMeasure.fromJson(geoPoints[pointIndex + j])); + } + + pointIndex += geoParts[i]; //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + + if (pointList[0].equals(pointList[geoParts[i] - 1])) { + lineList.push(new LinearRing(pointList)); + } else { + lineList.push(new LineString(pointList)); + } + + pointList = []; + } + } else { + return null; + } + + return new Route(lineList, { + id: jsonObject.id, + center: jsonObject.center, + style: jsonObject.style, + length: jsonObject.length, + maxM: jsonObject.maxM, + minM: jsonObject.minM, + type: jsonObject.type, + parts: jsonObject.parts + }); + } + }]); + + return Route; +}(Collection); +;// CONCATENATED MODULE: ./src/common/iServer/ServerGeometry.js +function ServerGeometry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerGeometry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerGeometry_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerGeometry_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerGeometry_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +/** + * @class ServerGeometry + * @deprecatedclass SuperMap.ServerGeometry + * @category iServer Data Feature + * @classdesc 服务端几何对象类。该类描述几何对象(矢量)的特征数据(坐标点对、几何对象的类型等)。基于服务端的空间分析、空间关系运算、查询等 GIS 服务功能使用服务端几何对象。 + * @param {Object} options - 参数。 + * @param {string} options.id - 服务端几何对象唯一标识符。 + * @param {Array.} options.parts - 服务端几何对象中各个子对象所包含的节点个数。 + * @param {Array.} options.points - 组成几何对象的节点的坐标对数组。 + * @param {GeometryType} options.type - 几何对象的类型。 + * @param {ServerStyle} [options.style] - 服务端几何对象的风格。 + * @usage + */ + +var ServerGeometry = /*#__PURE__*/function () { + function ServerGeometry(options) { + ServerGeometry_classCallCheck(this, ServerGeometry); + + /** + * @member {string} ServerGeometry.prototype.id + * @description 服务端几何对象唯一标识符。 + */ + this.id = 0; + /** + * @member {ServerStyle} [ServerGeometry.prototype.style] + * @description 服务端几何对象的风格(ServerStyle)。 + */ + + this.style = null; + /** + * @member {Array.} ServerGeometry.prototype.parts + * @description 服务端几何对象中各个子对象所包含的节点个数。
+ * 1.几何对象从结构上可以分为简单几何对象和复杂几何对象。 + * 简单几何对象与复杂几何对象的区别:简单的几何对象一般为单一对象, + * 而复杂的几何对象由多个简单对象组成或经过一定的空间运算之后产生, + * 如:矩形为简单的区域对象,而中空的矩形为复杂的区域对象。
+ * 2.通常情况,一个简单几何对象的子对象就是它本身, + * 因此对于简单对象来说的该字段为长度为1的整型数组, + * 该字段的值就是这个简单对象节点的个数。 + * 如果一个几何对象是由几个简单对象组合而成的, + * 例如,一个岛状几何对象由 3 个简单的多边形组成而成, + * 那么这个岛状的几何对象的 Parts 字段值就是一个长度为 3 的整型数组, + * 数组中每个成员的值分别代表这三个多边形所包含的节点个数。 + */ + + this.parts = null; + /** + * @member {Array.} ServerGeometry.prototype.points + * @description 组成几何对象的节点的坐标对数组。
+ * 1.所有几何对象(点、线、面)都是由一些简单的点坐标组成的, + * 该字段存放了组成几何对象的点坐标的数组。 + * 对于简单的面对象,他的起点和终点的坐标点相同。
+ * 2.对于复杂的几何对象,根据 Parts 属性来确定每一个组成复杂几何对象的简单对象所对应的节点的个数, + * 从而确定 Points 字段中坐标对的分配归属问题。 + */ + + this.points = null; + /** + * @member {GeometryType} ServerGeometry.prototype.type + * @description 几何对象的类型(GeometryType)。 + */ + + this.type = null; + /** + * @member {Object} ServerGeometry.prototype.prjCoordSys + * @description 投影坐标参数,现仅在缓冲区分析中有效。 + */ + + this.prjCoordSys = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = 'SuperMap.ServerGeometry'; + } + /** + * @function ServerGeometry.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ServerGeometry_createClass(ServerGeometry, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.id = null; + me.style = null; + me.parts = null; + me.partTopo = null; + me.points = null; + me.type = null; + me.prjCoordSys = null; + } + /** + * @function ServerGeometry.prototype.toGeometry + * @description 将服务端几何对象 ServerGeometry 转换为客户端几何对象 Geometry。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeometry", + value: function toGeometry() { + var me = this, + geoType = me.type; + + switch (geoType.toUpperCase()) { + case GeometryType.POINT: + return me.toGeoPoint(); + + case GeometryType.LINE: + return me.toGeoLine(); + + case GeometryType.LINEM: + return me.toGeoLinem(); + + case GeometryType.REGION: + return me.toGeoRegion(); + + case GeometryType.POINTEPS: + return me.toGeoPoint(); + + case GeometryType.LINEEPS: + return me.toGeoLineEPS(); + + case GeometryType.REGIONEPS: + return me.toGeoRegionEPS(); + + case GeometryType.GEOCOMPOUND: + return me.transformGeoCompound(); + } + } + /** + * @function ServerGeometry.prototype.toGeoPoint + * @description 将服务端的点几何对象转换为客户端几何对象。包括 Point、MultiPoint。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoPoint", + value: function toGeoPoint() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + len = geoParts.length; + + if (len > 0) { + if (len === 1) { + return new Point(geoPoints[0].x, geoPoints[0].y); + } else { + var pointList = []; + + for (var i = 0; i < len; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + + return new MultiPoint(pointList); + } + } else { + return null; + } + } + /** + * @function ServerGeometry.prototype.toGeoLine + * @description 将服务端的线几何对象转换为客户端几何对象。包括 GeometryLinearRing、GeometryLineString、GeometryMultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoLine", + value: function toGeoLine() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + len = geoParts.length; + + if (len > 0) { + if (len === 1) { + var pointList = []; + + for (var i = 0; i < geoParts[0]; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + + + if (pointList[0].equals(pointList[geoParts[0] - 1])) { + return new LinearRing(pointList); + } else { + return new LineString(pointList); + } + } else { + var lineList = []; + + for (var _i = 0; _i < len; _i++) { + var _pointList = []; + + for (var j = 0; j < geoParts[_i]; j++) { + _pointList.push(new Point(geoPoints[j].x, geoPoints[j].y)); + } + + lineList.push(new LineString(_pointList)); + geoPoints.splice(0, geoParts[_i]); + } + + return new MultiLineString(lineList); + } + } else { + return null; + } + } + /** + * @function ServerGeometry.prototype.toGeoLineEPS + * @description 将服务端的线几何对象转换为客户端几何对象。包括 GeometryLinearRing、GeometryLineString、GeometryMultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoLineEPS", + value: function toGeoLineEPS() { + var me = this, + geoParts = me.parts || [], + geoPoints = me.points || [], + i, + j, + pointList, + lineList, + lineEPS, + len = geoParts.length; + + if (len > 0) { + if (len === 1) { + for (i = 0, pointList = []; i < geoParts[0]; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y, geoPoints[i].type)); + } //判断线是否闭合,如果闭合,则返回LinearRing,否则返回LineString + + + if (pointList[0].equals(pointList[geoParts[0] - 1])) { + lineEPS = LineString.createLineEPS(pointList); + return new LinearRing(lineEPS); + } else { + lineEPS = LineString.createLineEPS(pointList); + return new LineString(lineEPS); + } + } else { + for (i = 0, lineList = []; i < len; i++) { + for (j = 0, pointList = []; j < geoParts[i]; j++) { + pointList.push(new Point(geoPoints[j].x, geoPoints[j].y)); + } + + lineEPS = LineString.createLineEPS(pointList); + lineList.push(new LineString(lineEPS)); + geoPoints.splice(0, geoParts[i]); + } + + return new MultiLineString(lineList); + } + } else { + return null; + } + } + /** + * @function ServerGeometry.prototype.toGeoLinem + * @description 将服务端的路由线几何对象转换为客户端几何对象。包括 LinearRing、LineString、MultiLineString。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoLinem", + value: function toGeoLinem() { + var me = this; + return Route.fromJson(me); + } + /** + * @function ServerGeometry.prototype.toGeoRegion + * @description 将服务端的面几何对象转换为客户端几何对象。类型为 GeometryPolygon。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoRegion", + value: function toGeoRegion() { + var me = this, + geoParts = me.parts || [], + geoTopo = me.partTopo || [], + geoPoints = me.points || [], + len = geoParts.length; + + if (len <= 0) { + return null; + } + + var polygonArray = []; + var pointList = []; + + if (len == 1) { + for (var i = 0; i < geoPoints.length; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + + polygonArray.push(new Polygon([new LinearRing(pointList)])); + return new MultiPolygon(polygonArray); + } //处理复杂面 + + + var CCWArray = []; + var areaArray = []; + var polygonArrayTemp = []; + var polygonBounds = []; //polyon岛洞标识数组,初始都是岛。 + + var CCWIdent = []; + + for (var _i2 = 0, pointIndex = 0; _i2 < len; _i2++) { + for (var j = 0; j < geoParts[_i2]; j++) { + pointList.push(new Point(geoPoints[pointIndex + j].x, geoPoints[pointIndex + j].y)); + } + + pointIndex += geoParts[_i2]; + var polygon = new Polygon([new LinearRing(pointList)]); + pointList = []; + polygonArrayTemp.push(polygon); + + if (geoTopo.length === 0) { + polygonBounds.push(polygon.getBounds()); + } + + CCWIdent.push(1); + areaArray.push(polygon.getArea()); + } //iServer 9D新增字段 + + + if (geoTopo.length === 0) { + //根据面积排序 + ServerGeometry.bubbleSort(areaArray, polygonArrayTemp, geoTopo, polygonBounds); //岛洞底层判断原则:将所有的子对象按照面积排序,面积最大的直接判定为岛(1),从面积次大的开始处理, + // 如果发现该对象在某个面积大于它的对象之中(即被包含),则根据包含它的对象的标识(1 or -1),指定其标识(-1 or 1), + // 依次处理完所有对象,就得到了一个标识数组,1表示岛,-1表示洞 + //目标polygon索引列表 -1标示没有被任何polygon包含, + + var targetArray = []; + + for (var _i3 = 1; _i3 < polygonArrayTemp.length; _i3++) { + for (var _j = _i3 - 1; _j >= 0; _j--) { + targetArray[_i3] = -1; + + if (polygonBounds[_j].containsBounds(polygonBounds[_i3])) { + CCWIdent[_i3] = CCWIdent[_j] * -1; + + if (CCWIdent[_i3] < 0) { + targetArray[_i3] = _j; + } + + break; + } + } + } + + for (var _i4 = 0; _i4 < polygonArrayTemp.length; _i4++) { + if (CCWIdent[_i4] > 0) { + polygonArray.push(polygonArrayTemp[_i4]); + } else { + polygonArray[targetArray[_i4]].components = polygonArray[targetArray[_i4]].components.concat(polygonArrayTemp[_i4].components); //占位 + + polygonArray.push(''); + } + } + } else { + polygonArray = new Array(); + + for (var _i5 = 0; _i5 < polygonArrayTemp.length; _i5++) { + if (geoTopo[_i5] && geoTopo[_i5] == -1) { + CCWArray = CCWArray.concat(polygonArrayTemp[_i5].components); + } else { + if (CCWArray.length > 0 && polygonArray.length > 0) { + polygonArray[polygonArray.length - 1].components = polygonArray[polygonArray.length - 1].components.concat(CCWArray); + CCWArray = []; + } + + polygonArray.push(polygonArrayTemp[_i5]); + } + + if (_i5 == len - 1) { + var polyLength = polygonArray.length; + + if (polyLength) { + polygonArray[polyLength - 1].components = polygonArray[polyLength - 1].components.concat(CCWArray); + } else { + for (var k = 0, length = CCWArray.length; k < length; k++) { + polygonArray.push(new Polygon(CCWArray)); + } + } + } + } + } + + return new MultiPolygon(polygonArray); + } + /** + * @function ServerGeometry.prototype.toGeoRegionEPS + * @description 将服务端的面几何对象转换为客户端几何对象。类型为 Polygon。 + * @returns {Geometry} 转换后的客户端几何对象。 + */ + + }, { + key: "toGeoRegionEPS", + value: function toGeoRegionEPS() { + var me = this, + geoParts = me.parts || [], + geoTopo = me.partTopo || [], + geoPoints = me.points || [], + len = geoParts.length; + + if (len <= 0) { + return null; + } + + var polygonArray = []; + var pointList = []; + var lineEPS; + + if (len == 1) { + for (var i = 0; i < geoPoints.length; i++) { + pointList.push(new Point(geoPoints[i].x, geoPoints[i].y)); + } + + lineEPS = LineString.createLineEPS(pointList); + polygonArray.push(new Polygon([new LinearRing(lineEPS)])); + return new MultiPolygon(polygonArray); + } //处理复杂面 + + + var CCWArray = []; + var areaArray = []; + var polygonArrayTemp = []; + var polygonBounds = []; //polyon岛洞标识数组,初始都是岛。 + + var CCWIdent = []; + + for (var _i6 = 0, pointIndex = 0; _i6 < len; _i6++) { + for (var j = 0; j < geoParts[_i6]; j++) { + pointList.push(new Point(geoPoints[pointIndex + j].x, geoPoints[pointIndex + j].y)); + } + + pointIndex += geoParts[_i6]; + lineEPS = LineString.createLineEPS(pointList); + var polygon = new Polygon([new LinearRing(lineEPS)]); + pointList = []; + polygonArrayTemp.push(polygon); + + if (geoTopo.length === 0) { + polygonBounds.push(polygon.getBounds()); + } + + CCWIdent.push(1); + areaArray.push(polygon.getArea()); + } //iServer 9D新增字段 + + + if (geoTopo.length === 0) { + //根据面积排序 + ServerGeometry.bubbleSort(areaArray, polygonArrayTemp, geoTopo, polygonBounds); //岛洞底层判断原则:将所有的子对象按照面积排序,面积最大的直接判定为岛(1),从面积次大的开始处理, + // 如果发现该对象在某个面积大于它的对象之中(即被包含),则根据包含它的对象的标识(1 or -1),指定其标识(-1 or 1), + // 依次处理完所有对象,就得到了一个标识数组,1表示岛,-1表示洞 + //目标polygon索引列表 -1标示没有被任何polygon包含, + + var targetArray = []; + + for (var _i7 = 1; _i7 < polygonArrayTemp.length; _i7++) { + for (var _j2 = _i7 - 1; _j2 >= 0; _j2--) { + targetArray[_i7] = -1; + + if (polygonBounds[_j2].containsBounds(polygonBounds[_i7])) { + CCWIdent[_i7] = CCWIdent[_j2] * -1; + + if (CCWIdent[_i7] < 0) { + targetArray[_i7] = _j2; + } + + break; + } + } + } + + for (var _i8 = 0; _i8 < polygonArrayTemp.length; _i8++) { + if (CCWIdent[_i8] > 0) { + polygonArray.push(polygonArrayTemp[_i8]); + } else { + polygonArray[targetArray[_i8]].components = polygonArray[targetArray[_i8]].components.concat(polygonArrayTemp[_i8].components); //占位 + + polygonArray.push(''); + } + } + } else { + polygonArray = new Array(); + + for (var _i9 = 0; _i9 < polygonArrayTemp.length; _i9++) { + if (geoTopo[_i9] && geoTopo[_i9] == -1) { + CCWArray = CCWArray.concat(polygonArrayTemp[_i9].components); + } else { + if (CCWArray.length > 0 && polygonArray.length > 0) { + polygonArray[polygonArray.length - 1].components = polygonArray[polygonArray.length - 1].components.concat(CCWArray); + CCWArray = []; + } + + polygonArray.push(polygonArrayTemp[_i9]); + } + + if (_i9 == len - 1) { + var polyLength = polygonArray.length; + + if (polyLength) { + polygonArray[polyLength - 1].components = polygonArray[polyLength - 1].components.concat(CCWArray); + } else { + for (var k = 0, length = CCWArray.length; k < length; k++) { + polygonArray.push(new Polygon(CCWArray)); + } + } + } + } + } + + return new MultiPolygon(polygonArray); + } + }, { + key: "transformGeoCompound", + value: function transformGeoCompound() { + var me = this, + geoParts = me.geoParts || [], + len = geoParts.length; + + if (len <= 0) { + return null; + } + + var geometryList = []; + + for (var index = 0; index < len; index++) { + var geometry = geoParts[index]; + geometryList.push(new ServerGeometry(geometry).toGeometry()); + } + + return new Collection(geometryList); + } + /** + * @function ServerGeometry.prototype.fromJson + * @description 将 JSON 对象表示服务端几何对象转换为 ServerGeometry。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerGeometry} 转换后的 ServerGeometry 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + return new ServerGeometry({ + id: jsonObject.id, + style: ServerStyle.fromJson(jsonObject.style), + parts: jsonObject.parts, + partTopo: jsonObject.partTopo, + points: jsonObject.points, + center: jsonObject.center, + length: jsonObject.length, + maxM: jsonObject.maxM, + minM: jsonObject.minM, + type: jsonObject.type + }); + } + /** + * @function ServerGeometry.prototype.fromGeometry + * @description 将客户端 Geometry 转换成服务端 ServerGeometry。 + * @param {Geometry} geometry - 要转换的客户端 Geometry 对象。 + * @returns {ServerGeometry} 转换后的 ServerGeometry 对象。 + */ + + }, { + key: "fromGeometry", + value: function fromGeometry(geometry) { + if (!geometry) { + return; + } + + var id = 0, + parts = [], + points = [], + type = null, + icomponents = geometry.components, + className = geometry.CLASS_NAME, + prjCoordSys = { + epsgCode: geometry.SRID + }; + + if (!isNaN(geometry.id)) { + id = geometry.id; + } //坑爹的改法,没法,为了支持态势标绘,有时间就得全改 + + + if (className != 'SuperMap.Geometry.LinearRing' && className != 'SuperMap.Geometry.LineString' && (geometry instanceof MultiPoint || geometry instanceof MultiLineString)) { + var ilen = icomponents.length; + + for (var i = 0; i < ilen; i++) { + var vertices = icomponents[i].getVertices(); + var partPointsCount = vertices.length; + parts.push(partPointsCount); + + for (var j = 0; j < partPointsCount; j++) { + points.push(new Point(vertices[j].x, vertices[j].y)); + } + } //这里className不是多点就全部是算线 + + + type = className == 'SuperMap.Geometry.MultiPoint' ? GeometryType.POINT : GeometryType.LINE; + } else if (geometry instanceof MultiPolygon) { + var _ilen = icomponents.length; + + for (var _i10 = 0; _i10 < _ilen; _i10++) { + var polygon = icomponents[_i10], + linearRingOfPolygon = polygon.components, + linearRingOfPolygonLen = linearRingOfPolygon.length; + + for (var _j3 = 0; _j3 < linearRingOfPolygonLen; _j3++) { + var _vertices = linearRingOfPolygon[_j3].getVertices(); + + var _partPointsCount = _vertices.length + 1; + + parts.push(_partPointsCount); + + for (var k = 0; k < _partPointsCount - 1; k++) { + points.push(new Point(_vertices[k].x, _vertices[k].y)); + } + + points.push(new Point(_vertices[0].x, _vertices[0].y)); + } + } + + type = GeometryType.REGION; + } else if (geometry instanceof Polygon) { + var _ilen2 = icomponents.length; + + for (var _i11 = 0; _i11 < _ilen2; _i11++) { + var _vertices2 = icomponents[_i11].getVertices(); + + var _partPointsCount2 = _vertices2.length + 1; + + parts.push(_partPointsCount2); + + for (var _j4 = 0; _j4 < _partPointsCount2 - 1; _j4++) { + points.push(new Point(_vertices2[_j4].x, _vertices2[_j4].y)); + } + + points.push(new Point(_vertices2[0].x, _vertices2[0].y)); + } + + type = GeometryType.REGION; + } else { + var _vertices3 = geometry.getVertices(); + + var geometryVerticesCount = _vertices3.length; + + for (var _j5 = 0; _j5 < geometryVerticesCount; _j5++) { + points.push(new Point(_vertices3[_j5].x, _vertices3[_j5].y)); + } + + if (geometry instanceof LinearRing) { + points.push(new Point(_vertices3[0].x, _vertices3[0].y)); + geometryVerticesCount++; + } + + parts.push(geometryVerticesCount); + type = geometry instanceof Point ? GeometryType.POINT : GeometryType.LINE; + } + + return new ServerGeometry({ + id: id, + style: null, + parts: parts, + points: points, + type: type, + prjCoordSys: prjCoordSys + }); + } + /** + * @function ServerGeometry.prototype.IsClockWise + * @description 判断 linearRing 中的点的顺序。返回值大于 0,逆时针;小于 0,顺时针。 + * @param {Geometry} geometry - 要转换的客户端 Geometry 对象。 + * @returns {number} 返回值大于 0,逆时针;小于 0,顺时针。 + */ + + }, { + key: "IsClockWise", + value: function IsClockWise(points) { + var length = points.length; + + if (length < 3) { + return 0.0; + } + + var s = points[0].y * (points[length - 1].x - points[1].x); + points.push(points[0]); + + for (var i = 1; i < length; i++) { + s += points[i].y * (points[i - 1].x - points[i + 1].x); + } + + return s * 0.5; + } + }, { + key: "bubbleSort", + value: function bubbleSort(areaArray, pointList, geoTopo, polygonBounds) { + for (var i = 0; i < areaArray.length; i++) { + for (var j = 0; j < areaArray.length; j++) { + if (areaArray[i] > areaArray[j]) { + var d = areaArray[j]; + areaArray[j] = areaArray[i]; + areaArray[i] = d; + var b = pointList[j]; + pointList[j] = pointList[i]; + pointList[i] = b; + + if (geoTopo && geoTopo.length > 0) { + var c = geoTopo[j]; + geoTopo[j] = geoTopo[i]; + geoTopo[i] = c; + } + + if (polygonBounds && polygonBounds.length > 0) { + var f = polygonBounds[j]; + polygonBounds[j] = polygonBounds[i]; + polygonBounds[i] = f; + } + } + } + } + } + }]); + + return ServerGeometry; +}(); +;// CONCATENATED MODULE: ./src/common/format/GeoJSON.js +function GeoJSON_typeof(obj) { "@babel/helpers - typeof"; return GeoJSON_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeoJSON_typeof(obj); } + +function GeoJSON_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoJSON_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoJSON_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoJSON_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoJSON_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoJSON_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeoJSON_get = Reflect.get; } else { GeoJSON_get = function _get(target, property, receiver) { var base = GeoJSON_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeoJSON_get.apply(this, arguments); } + +function GeoJSON_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeoJSON_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeoJSON_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeoJSON_setPrototypeOf(subClass, superClass); } + +function GeoJSON_setPrototypeOf(o, p) { GeoJSON_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeoJSON_setPrototypeOf(o, p); } + +function GeoJSON_createSuper(Derived) { var hasNativeReflectConstruct = GeoJSON_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeoJSON_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeoJSON_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeoJSON_possibleConstructorReturn(this, result); }; } + +function GeoJSON_possibleConstructorReturn(self, call) { if (call && (GeoJSON_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeoJSON_assertThisInitialized(self); } + +function GeoJSON_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeoJSON_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeoJSON_getPrototypeOf(o) { GeoJSON_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeoJSON_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +/** + * @class GeoJSONFormat + * @aliasclass Format.GeoJSON + * @deprecatedclass SuperMap.Format.GeoJSON + * @classdesc GeoJSON 的读和写。使用 {@link GeoJSONObject} 构造器创建一个 GeoJSON 解析器。 + * @category BaseTypes Format + * @param {Object} [options] - 可选参数。 + * @param {string} [options.indent=" "] - 用于格式化输出,indent 字符串会在每次缩进的时候使用一次。 + * @param {string} [options.space=" "] - 用于格式化输出,space 字符串会在名值对的 ":" 后边添加。 + * @param {string} [options.newline="\n"] - 用于格式化输出, newline 字符串会用在每一个名值对或数组项末尾。 + * @param {number} [options.level=0] - 用于格式化输出, 表示的是缩进级别。 + * @param {boolean} [options.pretty=false] - 是否在序列化的时候使用额外的空格控制结构。在 write 方法中使用。 + * @param {boolean} [options.nativeJSON] - 需要被注册的监听器对象。 + * @param {boolean} [options.ignoreExtraDims=true] - 忽略维度超过 2 的几何要素。 + * @extends {JSONFormat} + * @usage + */ + +var GeoJSON = /*#__PURE__*/function (_JSONFormat) { + GeoJSON_inherits(GeoJSON, _JSONFormat); + + var _super = GeoJSON_createSuper(GeoJSON); + + function GeoJSON(options) { + var _this; + + GeoJSON_classCallCheck(this, GeoJSON); + + _this = _super.call(this, options); + /** + * @member {boolean} [GeoJSONFormat.prototype.ignoreExtraDims=true] + * @description 忽略维度超过 2 的几何要素。 + */ + + _this.ignoreExtraDims = true; + _this.CLASS_NAME = "SuperMap.Format.GeoJSON"; + /** + * @member {Object} GeoJSONFormat.prototype.parseCoords + * @private + * @description 一个属性名对应着 GeoJSON 对象的几何类型的对象。每个属性其实都是一个实际上做解析用的方法。 + */ + + _this.parseCoords = { + /** + * @function GeoJSONFormat.parseCoords.point + * @description 将一组坐标转成一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的一组坐标。 + * @returns {Geometry} 一个几何对象。 + */ + "point": function point(array) { + if (this.ignoreExtraDims === false && array.length != 2) { + throw "Only 2D points are supported: " + array; + } + + return new Point(array[0], array[1]); + }, + + /** + * @function GeoJSONFormat.parseCoords.multipoint + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multipoint": function multipoint(array) { + var points = []; + var p = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + points.push(p); + } + + return new MultiPoint(points); + }, + + /** + * @function GeoJSONFormat.parseCoords.linestring + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "linestring": function linestring(array) { + var points = []; + var p = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + points.push(p); + } + + return new LineString(points); + }, + + /** + * @function GeoJSONFormat.parseCoords.multilinestring + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multilinestring": function multilinestring(array) { + var lines = []; + var l = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + l = this.parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + lines.push(l); + } + + return new MultiLineString(lines); + }, + + /** + * @function GeoJSONFormat.parseCoords.polygon + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @returns {Geometry} 一个几何对象。 + */ + "polygon": function polygon(array) { + var rings = []; + var r, l; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + l = this.parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + r = new LinearRing(l.components); + rings.push(r); + } + + return new Polygon(rings); + }, + + /** + * @function GeoJSONFormat.parseCoords.multipolygon + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Object} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "multipolygon": function multipolygon(array) { + var polys = []; + var p = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = this.parseCoords["polygon"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + polys.push(p); + } + + return new MultiPolygon(polys); + }, + + /** + * @function GeoJSONFormat.parseCoords.box + * @description 将坐标组数组转化成为一个 {@link Geometry} 对象。 + * @param {Array} array - GeoJSON 片段中的坐标组数组。 + * @returns {Geometry} 一个几何对象。 + */ + "box": function box(array) { + if (array.length != 2) { + throw "GeoJSON box coordinates must have 2 elements"; + } + + return new Polygon([new LinearRing([new Point(array[0][0], array[0][1]), new Point(array[1][0], array[0][1]), new Point(array[1][0], array[1][1]), new Point(array[0][0], array[1][1]), new Point(array[0][0], array[0][1])])]); + } + }; + /** + * @member {Object} GeoJSONFormat.prototype.extract + * @private + * @description 一个属性名对应着GeoJSON类型的对象。其值为相应的实际的解析方法。 + */ + + _this.extract = { + /** + * @function GeoJSONFormat.extract.feature + * @description 返回一个表示单个要素对象的 GeoJSON 的一部分。 + * @param {SuperMap.ServerFeature} feature - iServer 要素对象。 + * @returns {Object} 一个表示点的对象。 + */ + 'feature': function feature(_feature) { + var geom = this.extract.geometry.apply(this, [_feature.geometry]); + var json = { + "type": "Feature", + "properties": this.createAttributes(_feature), + "geometry": geom + }; + + if (_feature.geometry && _feature.geometry.type === 'TEXT') { + json.properties.texts = _feature.geometry.texts; + json.properties.textStyle = _feature.geometry.textStyle; + } + + if (_feature.fid) { + json.id = _feature.fid; + } + + if (_feature.ID) { + json.id = _feature.ID; + } + + return json; + }, + + /** + * @function GeoJSONFormat.extract.geometry + * @description 返回一个表示单个几何对象的 GeoJSON 的一部分。 + * @param {Object} geometry - iServer 几何对象。 + * @returns {Object} 一个表示几何体的对象。 + */ + 'geometry': function geometry(_geometry) { + if (_geometry == null) { + return null; + } + + if (!_geometry.parts && _geometry.points) { + _geometry.parts = [_geometry.points.length]; + } + + var geo = _geometry.hasOwnProperty('geometryType') ? _geometry : new ServerGeometry(_geometry).toGeometry() || _geometry; + var geometryType = geo.geometryType || geo.type; + var data; + + if (geometryType === "LinearRing") { + geometryType = "LineString"; + } + + if (geometryType === "LINEM") { + geometryType = "MultiLineString"; + } + + data = this.extract[geometryType.toLowerCase()].apply(this, [geo]); + geometryType = geometryType === 'TEXT' ? 'Point' : geometryType; + var json; + + if (geometryType === "Collection") { + json = { + "type": "GeometryCollection", + "geometries": data + }; + } else { + json = { + "type": geometryType, + "coordinates": data + }; + } + + return json; + }, + + /** + * @function GeoJSONFormat.extract.point + * @description 从一个点对象中返回一个坐标组。 + * @param {GeometryPoint} point - 一个点对象。 + * @returns {Array} 一个表示一个点的坐标组。 + */ + 'point': function point(_point) { + var p = [_point.x, _point.y]; + + for (var name in _point) { + if (name !== "x" && name !== "y" && _point[name] !== null && !isNaN(_point[name])) { + p.push(_point[name]); + } + } + + return p; + }, + + /** + * @function GeoJSONFormat.extract.point + * @description 从一个文本对象中返回一个坐标组。 + * @param {Object} geo - 一个文本对象。 + * @returns {Array} 一个表示一个点的坐标组。 + */ + 'text': function text(geo) { + return [geo.points[0].x, geo.points[0].y]; + }, + + /** + * @function GeoJSONFormat.extract.multipoint + * @description 从一个多点对象中返一个坐标组数组。 + * @param {GeometryMultiPoint} multipoint - 多点对象。 + * @returns {Array} 一个表示多点的坐标组数组。 + */ + 'multipoint': function multipoint(_multipoint) { + var array = []; + + for (var i = 0, len = _multipoint.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [_multipoint.components[i]])); + } + + return array; + }, + + /** + * @function GeoJSONFormat.extract.linestring + * @description 从一个线对象中返回一个坐标组数组。 + * @param {Linestring} linestring - 线对象。 + * @returns {Array} 一个表示线对象的坐标组数组。 + */ + 'linestring': function linestring(_linestring) { + var array = []; + + for (var i = 0, len = _linestring.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [_linestring.components[i]])); + } + + return array; + }, + + /** + * @function GeoJSONFormat.extract.multilinestring + * @description 从一个多线对象中返回一个线数组。 + * @param {GeometryMultiLineString} multilinestring - 多线对象。 + * + * @returns {Array} 一个表示多线的线数组。 + */ + 'multilinestring': function multilinestring(_multilinestring) { + var array = []; + + for (var i = 0, len = _multilinestring.components.length; i < len; ++i) { + array.push(this.extract.linestring.apply(this, [_multilinestring.components[i]])); + } + + return array; + }, + + /** + * @function GeoJSONFormat.extract.polygon + * @description 从一个面对象中返回一组线环。 + * @param {GeometryPolygon} polygon - 面对象。 + * @returns {Array} 一组表示面的线环。 + */ + 'polygon': function polygon(_polygon) { + var array = []; + + for (var i = 0, len = _polygon.components.length; i < len; ++i) { + array.push(this.extract.linestring.apply(this, [_polygon.components[i]])); + } + + return array; + }, + + /** + * @function GeoJSONFormat.extract.multipolygon + * @description 从一个多面对象中返回一组面。 + * @param {GeometryMultiPolygon} multipolygon - 多面对象。 + * @returns {Array} 一组表示多面的面。 + */ + 'multipolygon': function multipolygon(_multipolygon) { + var array = []; + + for (var i = 0, len = _multipolygon.components.length; i < len; ++i) { + array.push(this.extract.polygon.apply(this, [_multipolygon.components[i]])); + } + + return array; + }, + + /** + * @function GeoJSONFormat.extract.collection + * @description 从一个几何要素集合中一组几何要素数组。 + * @param {GeometryCollection} collection - 几何要素集合。 + * @returns {Array} 一组表示几何要素集合的几何要素数组。 + */ + 'collection': function collection(_collection) { + var len = _collection.components.length; + var array = new Array(len); + + for (var i = 0; i < len; ++i) { + array[i] = this.extract.geometry.apply(this, [_collection.components[i]]); + } + + return array; + } + }; + return _this; + } + /** + * @function GeoJSONFormat.prototype.read + * @description 将 GeoJSON 对象或者GeoJSON 对象字符串转换为 SuperMap Feature 对象。 + * @param {GeoJSONObject} json - GeoJSON 对象。 + * @param {string} [type='FeaureCollection'] - 可选的字符串,它决定了输出的格式。支持的值有:"Geometry","Feature",和 "FeatureCollection",如果此值为null。 + * @param {function} filter - 对象中每个层次每个键值对都会调用此函数得出一个结果。每个值都会被 filter 函数的结果所替换掉。这个函数可被用来将某些对象转化成某个类相应的对象,或者将日期字符串转化成Date对象。 + * @returns {Object} 返回值依赖于 type 参数的值。 + * -如果 type 等于 "FeatureCollection",返回值将会是 {@link FeatureVector} 数组。 + * -如果 type 为 "Geometry",输入的 JSON 对象必须表示一个唯一的几何体,然后返回值就会是 {@link Geometry}。 + * -如果 type 为 "Feature",输入的 JSON 对象也必须表示的一个要素,这样返回值才会是 {@link FeatureVector}。 + */ + + + GeoJSON_createClass(GeoJSON, [{ + key: "read", + value: function read(json, type, filter) { + type = type ? type : "FeatureCollection"; + var results = null; + var obj = null; + + if (typeof json == "string") { + obj = GeoJSON_get(GeoJSON_getPrototypeOf(GeoJSON.prototype), "read", this).call(this, json, filter); + } else { + obj = json; + } + + if (!obj) {//console.error("Bad JSON: " + json); + } else if (typeof obj.type != "string") {//console.error("Bad GeoJSON - no type: " + json); + } else if (this.isValidType(obj, type)) { + switch (type) { + case "Geometry": + try { + results = this.parseGeometry(obj); + } catch (err) {//console.error(err); + } + + break; + + case "Feature": + try { + results = this.parseFeature(obj); + results.type = "Feature"; + } catch (err) {//console.error(err); + } + + break; + + case "FeatureCollection": + // for type FeatureCollection, we allow input to be any type + results = []; + + switch (obj.type) { + case "Feature": + try { + results.push(this.parseFeature(obj)); + } catch (err) { + results = null; //console.error(err); + } + + break; + + case "FeatureCollection": + for (var i = 0, len = obj.features.length; i < len; ++i) { + try { + results.push(this.parseFeature(obj.features[i])); + } catch (err) { + results = null; // console.error(err); + } + } + + break; + + default: + try { + var geom = this.parseGeometry(obj); + results.push(new Vector(geom)); + } catch (err) { + results = null; //console.error(err); + } + + } + + break; + + default: + break; + } + } + + return results; + } + /** + * @function GeoJSONFormat.prototype.write + * @description iServer Geometry JSON 对象 转 GeoJSON对象字符串。 + * @param {Object} obj - iServer Geometry JSON 对象。 + * @param {boolean} [pretty=false] - 是否使用换行和缩进来控制输出。 + * @returns {GeoJSONObject} 一个 GeoJSON 字符串,它表示了输入的几何对象,要素对象,或者要素对象数组。 + */ + + }, { + key: "write", + value: function write(obj, pretty) { + return GeoJSON_get(GeoJSON_getPrototypeOf(GeoJSON.prototype), "write", this).call(this, this.toGeoJSON(obj), pretty); + } + /** + * @function GeoJSONFormat.prototype.fromGeoJSON + * @version 9.1.1 + * @description 将 GeoJSON 对象或者GeoJSON 对象字符串转换为iServer Feature JSON。 + * @param {GeoJSONObject} json - GeoJSON 对象。 + * @param {string} [type='FeaureCollection'] - 可选的字符串,它决定了输出的格式。支持的值有:"Geometry","Feature",和 "FeatureCollection",如果此值为null。 + * @param {function} filter - 对象中每个层次每个键值对都会调用此函数得出一个结果。每个值都会被 filter 函数的结果所替换掉。这个函数可被用来将某些对象转化成某个类相应的对象,或者将日期字符串转化成Date对象。 + * @returns {Object} iServer Feature JSON。 + */ + + }, { + key: "fromGeoJSON", + value: function fromGeoJSON(json, type, filter) { + var _this2 = this; + + var feature = this.read(json, type, filter); + + if (!Util.isArray(feature)) { + return this._toiSevrerFeature(feature); + } + + return feature.map(function (element) { + return _this2._toiSevrerFeature(element); + }); + } + /** + * @function GeoJSONFormat.prototype.toGeoJSON + * @version 9.1.1 + * @description 将 iServer Feature JSON 对象转换为 GeoJSON 对象。 + * @param {Object} obj - iServer Feature JSON。 + * @returns {GeoJSONObject} GeoJSON 对象。 + */ + + }, { + key: "toGeoJSON", + value: function toGeoJSON(obj) { + var geojson = { + "type": null + }; + + if (Util.isArray(obj)) { + geojson.type = "FeatureCollection"; + var numFeatures = obj.length; + geojson.features = new Array(numFeatures); + + for (var i = 0; i < numFeatures; ++i) { + var element = obj[i]; + + if (isGeometry(element)) { + var feature = {}; + feature.geometry = element; + geojson.features[i] = this.extract.feature.apply(this, [feature]); + } else { + geojson.features[i] = this.extract.feature.apply(this, [element]); + } + } + } else if (isGeometry(obj)) { + var _feature2 = {}; + _feature2.geometry = obj; + geojson = this.extract.feature.apply(this, [_feature2]); + } else { + geojson = this.extract.feature.apply(this, [obj]); + } + + function isGeometry(input) { + return input.hasOwnProperty("parts") && input.hasOwnProperty("points") || input.hasOwnProperty("geoParts"); + } + + return geojson; + } + /** + * @function GeoJSONFormat.prototype.isValidType + * @description 检查一个 GeoJSON 对象是否和给定的类型相符的合法的对象。 + * @returns {boolean} GeoJSON 是否是给定类型的合法对象。 + * @private + */ + + }, { + key: "isValidType", + value: function isValidType(obj, type) { + var valid = false; + + switch (type) { + case "Geometry": + if (Util.indexOf(["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "Box", "GeometryCollection"], obj.type) == -1) {// unsupported geometry type + //console.error("Unsupported geometry type: " + + // obj.type); + } else { + valid = true; + } + + break; + + case "FeatureCollection": + // allow for any type to be converted to a feature collection + valid = true; + break; + + default: + // for Feature types must match + if (obj.type == type) { + valid = true; + } else {//console.error("Cannot convert types from " + + //obj.type + " to " + type); + } + + } + + return valid; + } + /** + * @function GeoJSONFormat.prototype.parseFeature + * @description 将一个 GeoJSON 中的 feature 转化成 {@link FeatureVector}> 对象。 + * @private + * @param {GeoJSONObject} obj - 从 GeoJSON 对象中创建一个对象。 + * @returns {FeatureVector} 一个要素。 + */ + + }, { + key: "parseFeature", + value: function parseFeature(obj) { + var feature, geometry, attributes, bbox; + attributes = obj.properties ? obj.properties : {}; + bbox = obj.geometry && obj.geometry.bbox || obj.bbox; + + try { + geometry = this.parseGeometry(obj.geometry); + } catch (err) { + // deal with bad geometries + throw err; + } + + feature = new Vector(geometry, attributes); + + if (bbox) { + feature.bounds = Bounds.fromArray(bbox); + } + + if (obj.id) { + feature.fid = obj.id; + } + + return feature; + } + /** + * @function GeoJSONFormat.prototype.parseGeometry + * @description 将一个 GeoJSON 中的几何要素转化成 {@link Geometry} 对象。 + * @param {GeoJSONObject} obj - 从 GeoJSON 对象中创建一个对象。 + * @returns {Geometry} 一个几何要素。 + * @private + */ + + }, { + key: "parseGeometry", + value: function parseGeometry(obj) { + if (obj == null) { + return null; + } + + var geometry; + + if (obj.type == "GeometryCollection") { + if (!Util.isArray(obj.geometries)) { + throw "GeometryCollection must have geometries array: " + obj; + } + + var numGeom = obj.geometries.length; + var components = new Array(numGeom); + + for (var i = 0; i < numGeom; ++i) { + components[i] = this.parseGeometry.apply(this, [obj.geometries[i]]); + } + + geometry = new Collection(components); + } else { + if (!Util.isArray(obj.coordinates)) { + throw "Geometry must have coordinates array: " + obj; + } + + if (!this.parseCoords[obj.type.toLowerCase()]) { + throw "Unsupported geometry type: " + obj.type; + } + + try { + geometry = this.parseCoords[obj.type.toLowerCase()].apply(this, [obj.coordinates]); + } catch (err) { + // deal with bad coordinates + throw err; + } + } + + return geometry; + } + /** + * @function GeoJSONFormat.prototype.createCRSObject + * @description 从一个要素对象中创建一个坐标参考系对象。 + * @param {FeatureVector} object - 要素对象。 + * @private + * @returns {GeoJSONObject} 一个可作为 GeoJSON 对象的 CRS 属性使用的对象。 + */ + + }, { + key: "createCRSObject", + value: function createCRSObject(object) { + var proj = object.layer.projection.toString(); + var crs = {}; + + if (proj.match(/epsg:/i)) { + var code = parseInt(proj.substring(proj.indexOf(":") + 1)); + + if (code == 4326) { + crs = { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }; + } else { + crs = { + "type": "name", + "properties": { + "name": "EPSG:" + code + } + }; + } + } + + return crs; + } + }, { + key: "_toiSevrerFeature", + value: function _toiSevrerFeature(feature) { + var attributes = feature.attributes; + var attrNames = []; + var attrValues = []; + + for (var attr in attributes) { + attrNames.push(attr); + attrValues.push(attributes[attr]); + } + + var newFeature = { + fieldNames: attrNames, + fieldValues: attrValues, + geometry: ServerGeometry.fromGeometry(feature.geometry) + }; + newFeature.geometry.id = feature.fid; + return newFeature; + } + }, { + key: "createAttributes", + value: function createAttributes(feature) { + if (!feature) { + return null; + } + + var attr = {}; + processFieldsAttributes(feature, attr); + var exceptKeys = ["fieldNames", "fieldValues", "geometry", "stringID", "ID"]; + + for (var key in feature) { + if (exceptKeys.indexOf(key) > -1) { + continue; + } + + attr[key] = feature[key]; + } + + function processFieldsAttributes(feature, attributes) { + if (!(feature.hasOwnProperty("fieldNames") && feature.hasOwnProperty("fieldValues"))) { + return; + } + + var names = feature.fieldNames, + values = feature.fieldValues; + + for (var i in names) { + attributes[names[i]] = values[i]; + } + } + + return attr; + } + }]); + + return GeoJSON; +}(JSONFormat); +;// CONCATENATED MODULE: ./src/common/format/WKT.js +function WKT_typeof(obj) { "@babel/helpers - typeof"; return WKT_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, WKT_typeof(obj); } + +function WKT_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WKT_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WKT_createClass(Constructor, protoProps, staticProps) { if (protoProps) WKT_defineProperties(Constructor.prototype, protoProps); if (staticProps) WKT_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function WKT_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) WKT_setPrototypeOf(subClass, superClass); } + +function WKT_setPrototypeOf(o, p) { WKT_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return WKT_setPrototypeOf(o, p); } + +function WKT_createSuper(Derived) { var hasNativeReflectConstruct = WKT_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = WKT_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = WKT_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return WKT_possibleConstructorReturn(this, result); }; } + +function WKT_possibleConstructorReturn(self, call) { if (call && (WKT_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return WKT_assertThisInitialized(self); } + +function WKT_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function WKT_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function WKT_getPrototypeOf(o) { WKT_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return WKT_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class WKTFormat + * @aliasclass Format.WKT + * @deprecatedclass SuperMap.Format.WKT + * @classdesc 用于读写常见文本的类。通过 {@link WKTFormat} 构造器来创建一个新的实例。 + * @category BaseTypes Format + * @extends {Format} + * @param {Object} options - 可选的选项对象,其属性将被设置到实例。option 具体配置项继承自 {@link Format}。 + * @usage + */ + +var WKT = /*#__PURE__*/function (_Format) { + WKT_inherits(WKT, _Format); + + var _super = WKT_createSuper(WKT); + + function WKT(options) { + var _this; + + WKT_classCallCheck(this, WKT); + + _this = _super.call(this, options); + _this.regExes = { + 'typeStr': /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/, + 'spaces': /\s+/, + 'parenComma': /\)\s*,\s*\(/, + 'doubleParenComma': /\)\s*\)\s*,\s*\(\s*\(/, + // can't use {2} here + 'trimParens': /^\s*\(?(.*?)\)?\s*$/ + }; + _this.CLASS_NAME = "SuperMap.Format.WKT"; + /** + * @private + * @description Object with properties corresponding to the geometry types. + * Property values are functions that do the actual data extraction. + */ + + _this.extract = { + /** + * @description Return a space delimited string of point coordinates. + * @param {GeometryPoint} point + * @returns {string} A string of coordinates representing the point + */ + 'point': function point(_point) { + return _point.x + ' ' + _point.y; + }, + + /** + * @description Return a comma delimited string of point coordinates from a multipoint. + * @param {GeometryMultiPoint} multipoint + * @returns {string} A string of point coordinate strings representing + * the multipoint + */ + 'multipoint': function multipoint(_multipoint) { + var array = []; + + for (var i = 0, len = _multipoint.components.length; i < len; ++i) { + array.push('(' + this.extract.point.apply(this, [_multipoint.components[i]]) + ')'); + } + + return array.join(','); + }, + + /** + * @description Return a comma delimited string of point coordinates from a line. + * @param {GeometryLineString} linestring + * @returns {string} A string of point coordinate strings representing + * the linestring + */ + 'linestring': function linestring(_linestring) { + var array = []; + + for (var i = 0, len = _linestring.components.length; i < len; ++i) { + array.push(this.extract.point.apply(this, [_linestring.components[i]])); + } + + return array.join(','); + }, + + /** + * @description Return a comma delimited string of linestring strings from a multilinestring. + * @param {GeometryMultiLineString} multilinestring + * @returns {string} A string of of linestring strings representing + * the multilinestring + */ + 'multilinestring': function multilinestring(_multilinestring) { + var array = []; + + for (var i = 0, len = _multilinestring.components.length; i < len; ++i) { + array.push('(' + this.extract.linestring.apply(this, [_multilinestring.components[i]]) + ')'); + } + + return array.join(','); + }, + + /** + * @description Return a comma delimited string of linear ring arrays from a polygon. + * @param {GeometryPolygon} polygon + * @returns {string} An array of linear ring arrays representing the polygon + */ + 'polygon': function polygon(_polygon) { + var array = []; + + for (var i = 0, len = _polygon.components.length; i < len; ++i) { + array.push('(' + this.extract.linestring.apply(this, [_polygon.components[i]]) + ')'); + } + + return array.join(','); + }, + + /** + * @description Return an array of polygon arrays from a multipolygon. + * @param {GeometryMultiPolygon} multipolygon + * @returns {string} An array of polygon arrays representing + * the multipolygon + */ + 'multipolygon': function multipolygon(_multipolygon) { + var array = []; + + for (var i = 0, len = _multipolygon.components.length; i < len; ++i) { + array.push('(' + this.extract.polygon.apply(this, [_multipolygon.components[i]]) + ')'); + } + + return array.join(','); + }, + + /** + * @description Return the WKT portion between 'GEOMETRYCOLLECTION(' and ')' for an + * @param {GeometryCollection} collection + * @returns {string} internal WKT representation of the collection + */ + 'collection': function collection(_collection) { + var array = []; + + for (var i = 0, len = _collection.components.length; i < len; ++i) { + array.push(this.extractGeometry.apply(this, [_collection.components[i]])); + } + + return array.join(','); + } + }; + /** + * @private + * @description Object with properties corresponding to the geometry types. + * Property values are functions that do the actual parsing. + */ + + _this.parse = { + /** + * @private + * @description Return point feature given a point WKT fragment. + * @param {string} str A WKT fragment representing the point + * @returns {FeatureVector} A point feature + * + */ + 'point': function point(str) { + var coords = StringExt.trim(str).split(this.regExes.spaces); + return new Vector(new Point(coords[0], coords[1])); + }, + + /** + * @description Return a multipoint feature given a multipoint WKT fragment. + * @param {string} A WKT fragment representing the multipoint + * @returns {FeatureVector} A multipoint feature + * @private + */ + 'multipoint': function multipoint(str) { + var point; + var points = StringExt.trim(str).split(','); + var components = []; + + for (var i = 0, len = points.length; i < len; ++i) { + point = points[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.point.apply(this, [point]).geometry); + } + + return new Vector(new MultiPoint(components)); + }, + + /** + * @description Return a linestring feature given a linestring WKT fragment. + * @param {string} A WKT fragment representing the linestring + * @returns {FeatureVector} A linestring feature + * @private + */ + 'linestring': function linestring(str) { + var points = StringExt.trim(str).split(','); + var components = []; + + for (var i = 0, len = points.length; i < len; ++i) { + components.push(this.parse.point.apply(this, [points[i]]).geometry); + } + + return new Vector(new LineString(components)); + }, + + /** + * @description Return a multilinestring feature given a multilinestring WKT fragment. + * @param {string} A WKT fragment representing the multilinestring + * @returns {FeatureVector} A multilinestring feature + * @private + */ + 'multilinestring': function multilinestring(str) { + var line; + var lines = StringExt.trim(str).split(this.regExes.parenComma); + var components = []; + + for (var i = 0, len = lines.length; i < len; ++i) { + line = lines[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.linestring.apply(this, [line]).geometry); + } + + return new Vector(new MultiLineString(components)); + }, + + /** + * @description Return a polygon feature given a polygon WKT fragment. + * @param {string} A WKT fragment representing the polygon + * @returns {FeatureVector} A polygon feature + * @private + */ + 'polygon': function polygon(str) { + var ring, linestring, linearring; + var rings = StringExt.trim(str).split(this.regExes.parenComma); + var components = []; + + for (var i = 0, len = rings.length; i < len; ++i) { + ring = rings[i].replace(this.regExes.trimParens, '$1'); + linestring = this.parse.linestring.apply(this, [ring]).geometry; + linearring = new LinearRing(linestring.components); + components.push(linearring); + } + + return new Vector(new Polygon(components)); + }, + + /** + * @private + * @description Return a multipolygon feature given a multipolygon WKT fragment. + * @param {string} A WKT fragment representing the multipolygon + * @returns {FeatureVector} A multipolygon feature + * + */ + 'multipolygon': function multipolygon(str) { + var polygon; + var polygons = StringExt.trim(str).split(this.regExes.doubleParenComma); + var components = []; + + for (var i = 0, len = polygons.length; i < len; ++i) { + polygon = polygons[i].replace(this.regExes.trimParens, '$1'); + components.push(this.parse.polygon.apply(this, [polygon]).geometry); + } + + return new Vector(new MultiPolygon(components)); + }, + + /** + * @description Return an array of features given a geometrycollection WKT fragment. + * @param {string} A WKT fragment representing the geometrycollection + * @returns {Array} An array of FeatureVector + * @private + */ + 'geometrycollection': function geometrycollection(str) { + // separate components of the collection with | + str = str.replace(/,\s*([A-Za-z])/g, '|$1'); + var wktArray = StringExt.trim(str).split('|'); + var components = []; + + for (var i = 0, len = wktArray.length; i < len; ++i) { + components.push(this.read(wktArray[i])); + } + + return components; + } + }; + return _this; + } + /** + * @function WKTFormat.prototype.read + * @description 反序列化 WKT 字符串并返回向量特征或向量特征数组。 支持 POINT、MULTIPOINT、LINESTRING、MULTILINESTRING、POLYGON、MULTIPOLYGON 和 GEOMETRYCOLLECTION 的 WKT。 + * @param {string} wkt - WKT 字符串。 + * @returns {FeatureVector|Array} GEOMETRYCOLLECTION WKT 的矢量要素或者矢量要素数组。 + */ + + + WKT_createClass(WKT, [{ + key: "read", + value: function read(wkt) { + var features, type, str; + wkt = wkt.replace(/[\n\r]/g, " "); + var matches = this.regExes.typeStr.exec(wkt); + + if (matches) { + type = matches[1].toLowerCase(); + str = matches[2]; + + if (this.parse[type]) { + features = this.parse[type].apply(this, [str]); + } + } + + return features; + } + /** + * @function WKTFormat.prototype.write + * @description 将矢量要素或矢量要素数组序列化为 WKT 字符串。 + * @param {(FeatureVector|Array)} features - 矢量要素或矢量要素数组。 + * @returns {string} 表示几何的 WKT 字符串。 + */ + + }, { + key: "write", + value: function write(features) { + var collection, geometry, isCollection; + + if (features.constructor === Array) { + collection = features; + isCollection = true; + } else { + collection = [features]; + isCollection = false; + } + + var pieces = []; + + if (isCollection) { + pieces.push('GEOMETRYCOLLECTION('); + } + + for (var i = 0, len = collection.length; i < len; ++i) { + if (isCollection && i > 0) { + pieces.push(','); + } + + geometry = collection[i].geometry; + pieces.push(this.extractGeometry(geometry)); + } + + if (isCollection) { + pieces.push(')'); + } + + return pieces.join(''); + } + /** + * @function WKTFormat.prototype.extractGeometry + * @description 为单个 Geometry 对象构造 WKT 的入口点。 + * @param {Geometry} geometry - Geometry 对象。 + * @returns {string} 表示几何的 WKT 字符串。 + */ + + }, { + key: "extractGeometry", + value: function extractGeometry(geometry) { + var type = geometry.CLASS_NAME.split('.')[2].toLowerCase(); + + if (!this.extract[type]) { + return null; + } + + var wktType = type === 'collection' ? 'GEOMETRYCOLLECTION' : type.toUpperCase(); + var data = wktType + '(' + this.extract[type].apply(this, [geometry]) + ')'; + return data; + } + }]); + + return WKT; +}(Format); +;// CONCATENATED MODULE: ./src/common/format/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +;// CONCATENATED MODULE: ./src/common/control/TimeControlBase.js +function TimeControlBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TimeControlBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TimeControlBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) TimeControlBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) TimeControlBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TimeControlBase + * @deprecatedclass SuperMap.TimeControlBase + * @classdesc 时间控制基类类。 + * @category Control + * @param {Object} options - 可选参数。 + * @param {number} [options.speed=1] - 速度。不能小于 0,(每帧渲染的数据之间的间隔为1),设置越大速度越快。 + * @param {number} [options.frequency=1000] - 刷新频率(单位 ms),服务器刷新的时间间隔。 + * @param {number} [options.startTime=0] - 起始时间,必须为数字,且小于等于 endTime。如果不设置,初始化时为 0,建议设置。 + * @param {number} [options.endTime] - 结束时间,必须为数字,且大于等于 startTime。如果不设置,初始化时以当前时间进行设置,建议设置。 + * @param {boolean} [options.repeat=true] - 是否重复循环。 + * @param {boolean} [options.reverse=false] - 是否反向。 + * @usage + */ + +var TimeControlBase = /*#__PURE__*/function () { + function TimeControlBase(options) { + TimeControlBase_classCallCheck(this, TimeControlBase); + + //设置步长,刷新频率、开始结束时间、是否循环、是否反向 + var me = this; + options = options || {}; + /** + * @member {number} [TimeControlBase.prototype.speed=1] + * @description 步长,必须为非负数,默认为1(表示前后两次渲染的数据之间的间隔为1) + */ + + this.speed = options.speed && options.speed >= 0 ? options.speed : 1; + /** + * @member {number} [TimeControlBase.prototype.frequency=1000] + * @description 刷新频率(单位ms),服务器刷新的时间间隔。 + */ + + this.frequency = options.speed && options.frequency >= 0 ? options.frequency : 1000; + /** + * @member {number} [TimeControlBase.prototype.startTime=0] + * @description 记录的起始时间,必须为数字, + * 如果不设置,初始化时为0,建议设置 + */ + + this.startTime = options.startTime && options.startTime != null ? options.startTime : 0; + /** + * @member {number} TimeControlBase.prototype.endTime + * @description 记录的结束时间,必须为数字, + * 如果不设置,初始化时以当前时间进行设置,建议设置 + */ + + this.endTime = options.endTime && options.endTime != null && options.endTime >= me.startTime ? options.endTime : +new Date(); + /** + * @member {boolean} [TimeControlBase.prototype.repeat=true] + * @description 是否重复循环。 + */ + + this.repeat = options.repeat !== undefined ? options.repeat : true; + /** + * @member {boolean} [TimeControlBase.prototype.reverse=false] + * @description 是否反向。 + */ + + this.reverse = options.reverse !== undefined ? options.reverse : false; + /** + * @member {number} TimeControlBase.prototype.currentTime + * @description 记录近期的时间,也就是当前帧运行到的时间。 + */ + + this.currentTime = null; + /** + * @member {number} TimeControlBase.prototype.oldTime + * @description 记录上一帧的时间,也就是之前运行到的时间。 + */ + + this.oldTime = null; + /** + * @member {boolean} [TimeControlBase.prototype.running=false] + * @description 记录当前是否处于运行中。 + */ + + this.running = false; + /** + * @private + * @member {Array.} TimeControlBase.prototype.EVENT_TYPES + * @description 此类支持的事件类型。 + * + */ + + this.EVENT_TYPES = ["start", "pause", "stop"]; + /** + * @private + * @member {Events} TimeControlBase.prototype.events + * @description 事件 + */ + + me.events = new Events(this, null, this.EVENT_TYPES); + me.speed = Number(me.speed); + me.frequency = Number(me.frequency); + me.startTime = Number(me.startTime); + me.endTime = Number(me.endTime); + me.startTime = Date.parse(new Date(me.startTime)); + me.endTime = Date.parse(new Date(me.endTime)); //初始化当前时间 + + me.currentTime = me.startTime; + this.CLASS_NAME = "SuperMap.TimeControlBase"; + } + /** + * @function TimeControlBase.prototype.updateOptions + * @description 更新参数。 + * @param {Object} options - 设置参数得可选参数。设置步长,刷新频率、开始结束时间、是否循环、是否反向。 + */ + + + TimeControlBase_createClass(TimeControlBase, [{ + key: "updateOptions", + value: function updateOptions(options) { + //设置步长,刷新频率、开始结束时间、是否循环、是否反向 + var me = this; + options = options || {}; + + if (options.speed && options.speed >= 0) { + me.speed = options.speed; + me.speed = Number(me.speed); + } + + if (options.speed && options.frequency >= 0) { + me.frequency = options.frequency; + me.frequency = Number(me.frequency); + } + + if (options.startTime && options.startTime != null) { + me.startTime = options.startTime; + me.startTime = Date.parse(new Date(me.startTime)); + } + + if (options.endTime && options.endTime != null && options.endTime >= me.startTime) { + me.endTime = options.endTime; + me.endTime = Date.parse(new Date(me.endTime)); + } + + if (options.repeat != null) { + me.repeat = options.repeat; + } + + if (options.reverse != null) { + me.reverse = options.reverse; + } + } + /** + * @function TimeControlBase.prototype.start + * @description 开始。 + */ + + }, { + key: "start", + value: function start() { + var me = this; + + if (!me.running) { + me.running = true; + me.tick(); + me.events.triggerEvent('start', me.currentTime); + } + } + /** + * @function TimeControlBase.prototype.pause + * @description 暂停。 + */ + + }, { + key: "pause", + value: function pause() { + var me = this; + me.running = false; + me.events.triggerEvent('pause', me.currentTime); + } + /** + * @function TimeControlBase.prototype.stop + * @description 停止,停止后返回起始状态。 + */ + + }, { + key: "stop", + value: function stop() { + var me = this; //停止时 时间设置为开始时间 + + me.currentTime = me.startTime; //如果正在运行,修改为初始时间即可绘制一帧 + + if (me.running) { + me.running = false; + } + + me.events.triggerEvent('stop', me.currentTime); + } + /** + * @function TimeControlBase.prototype.toggle + * @description 开关切换,切换的是开始和暂停。 + */ + + }, { + key: "toggle", + value: function toggle() { + var me = this; + + if (me.running) { + me.pause(); + } else { + me.start(); + } + } + /** + * @function TimeControlBase.prototype.setSpeed + * @description 设置步长。 + * @param {number} [speed=1] - 步长,必须为非负数。 + * @returns {boolean} true 代表设置成功,false 设置失败(speed 小于 0 时失败)。 + */ + + }, { + key: "setSpeed", + value: function setSpeed(speed) { + var me = this; + + if (speed >= 0) { + me.speed = speed; + return true; + } + + return false; + } + /** + * @function TimeControlBase.prototype.getSpeed + * @description 获取步长。 + * @returns {number} 返回当前的步长 + */ + + }, { + key: "getSpeed", + value: function getSpeed() { + return this.speed; + } + /** + * @function TimeControlBase.prototype.setFrequency + * @description 设置刷新频率。 + * @param {number} [frequency=1000] - 刷新频率,单位为 ms。 + * @returns {boolean} true 代表设置成功,false 设置失败(frequency 小于 0 时失败)。 + */ + + }, { + key: "setFrequency", + value: function setFrequency(frequency) { + var me = this; + + if (frequency >= 0) { + me.frequency = frequency; + return true; + } + + return false; + } + /** + * @function TimeControlBase.prototype.getFrequency + * @description 获取刷新频率。 + * @returns {number} 返回当前的刷新频率。 + */ + + }, { + key: "getFrequency", + value: function getFrequency() { + return this.frequency; + } + /** + * @function TimeControlBase.prototype.setStartTime + * @description 设置起始时间,设置完成后如果当前时间小于起始时间,则从起始时间开始。 + * @param {number} startTime - 需要设置的起始时间。 + * @returns {boolean} true 代表设置成功,false 设置失败(startTime 大于结束时间时失败)。 + */ + + }, { + key: "setStartTime", + value: function setStartTime(startTime) { + var me = this; + startTime = Date.parse(new Date(startTime)); //起始时间不得大于结束时间 + + if (startTime > me.endTime) { + return false; + } + + me.startTime = startTime; //如果当前时间小于了起始时间,则从当前起始时间开始 + + if (me.currentTime < me.startTime) { + me.currentTime = me.startTime; + me.tick(); + } + + return true; + } + /** + * @function TimeControlBase.prototype.getStartTime + * @description 获取起始时间。 + * @returns {number} 返回当前的起始时间。 + */ + + }, { + key: "getStartTime", + value: function getStartTime() { + return this.startTime; + } + /** + * @function TimeControlBase.prototype.setEndTime + * @description 设置结束时间,设置完成后如果当前时间大于结束,则从起始时间开始。 + * @param {number} endTime - 需要设置的结束时间。 + * @returns {boolean} true 代表设置成功,false 设置失败(endTime 小于开始时间时失败)。 + */ + + }, { + key: "setEndTime", + value: function setEndTime(endTime) { + var me = this; + me.endTime = Date.parse(new Date(me.endTime)); //结束时间不得小于开始时间 + + if (endTime < me.startTime) { + return false; + } + + me.endTime = endTime; //如果当前时间大于了结束时间,则从起始时间开始 + + if (me.currentTime >= me.endTime) { + me.currentTime = me.startTime; + me.tick(); + } + + return true; + } + /** + * @function TimeControlBase.prototype.getEndTime + * @description 获取结束时间。 + * @returns {number} 返回当前的结束时间。 + */ + + }, { + key: "getEndTime", + value: function getEndTime() { + return this.endTime; + } + /** + * @function TimeControlBase.prototype.setCurrentTime + * @description 设置当前时间。 + * @param {number} currentTime - 需要设置的当前时间。 + * @returns {boolean} true 代表设置成功,false 设置失败。 + */ + + }, { + key: "setCurrentTime", + value: function setCurrentTime(currentTime) { + var me = this; + me.currentTime = Date.parse(new Date(me.currentTime)); //结束时间不得小于开始时间 + + if (currentTime >= me.startTime && currentTime <= me.endTime) { + me.currentTime = currentTime; + me.startTime = me.currentTime; + me.tick(); + return true; + } + + return false; + } + /** + * @function TimeControlBase.prototype.getCurrentTime + * @description 获取当前时间。 + * @returns {number} 返回当前时间。 + */ + + }, { + key: "getCurrentTime", + value: function getCurrentTime() { + return this.currentTime; + } + /** + * @function TimeControlBase.prototype.setRepeat + * @description 设置是否重复循环。 + * @param {boolean} [repeat=true] - 是否重复循环。 + */ + + }, { + key: "setRepeat", + value: function setRepeat(repeat) { + this.repeat = repeat; + } + /** + * @function TimeControlBase.prototype.getRepeat + * @description 获取是否重复循环,默认是 true。 + * @returns {boolean} 返回是否重复循环。 + */ + + }, { + key: "getRepeat", + value: function getRepeat() { + return this.repeat; + } + /** + * @function TimeControlBase.prototype.setReverse + * @description 设置是否反向。 + * @param {boolean} [reverse=false] - 是否反向。 + */ + + }, { + key: "setReverse", + value: function setReverse(reverse) { + this.reverse = reverse; + } + /** + * @function TimeControlBase.prototype.getReverse + * @description 获取是否反向,默认是false。 + * @returns {boolean} 返回是否反向。 + */ + + }, { + key: "getReverse", + value: function getReverse() { + return this.reverse; + } + /** + * @function TimeControlBase.prototype.getRunning + * @description 获取运行状态。 + * @returns {boolean} true 代表正在运行,false 发表没有运行。 + */ + + }, { + key: "getRunning", + value: function getRunning() { + return this.running; + } + /** + * @function TimeControlBase.prototype.destroy + * @description 销毁 Animator 对象,释放资源。 + */ + + }, { + key: "destroy", + value: function destroy() { + var me = this; + me.speed = null; + me.frequency = null; + me.startTime = null; + me.endTime = null; + me.currentTime = null; + me.repeat = null; + me.running = false; + me.reverse = null; + } + }, { + key: "tick", + value: function tick() {//TODO 每次刷新执行的操作。子类实现 + } + }]); + + return TimeControlBase; +}(); +;// CONCATENATED MODULE: ./src/common/control/TimeFlowControl.js +function TimeFlowControl_typeof(obj) { "@babel/helpers - typeof"; return TimeFlowControl_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TimeFlowControl_typeof(obj); } + +function TimeFlowControl_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TimeFlowControl_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TimeFlowControl_createClass(Constructor, protoProps, staticProps) { if (protoProps) TimeFlowControl_defineProperties(Constructor.prototype, protoProps); if (staticProps) TimeFlowControl_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TimeFlowControl_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TimeFlowControl_get = Reflect.get; } else { TimeFlowControl_get = function _get(target, property, receiver) { var base = TimeFlowControl_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TimeFlowControl_get.apply(this, arguments); } + +function TimeFlowControl_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TimeFlowControl_getPrototypeOf(object); if (object === null) break; } return object; } + +function TimeFlowControl_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TimeFlowControl_setPrototypeOf(subClass, superClass); } + +function TimeFlowControl_setPrototypeOf(o, p) { TimeFlowControl_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TimeFlowControl_setPrototypeOf(o, p); } + +function TimeFlowControl_createSuper(Derived) { var hasNativeReflectConstruct = TimeFlowControl_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TimeFlowControl_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TimeFlowControl_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TimeFlowControl_possibleConstructorReturn(this, result); }; } + +function TimeFlowControl_possibleConstructorReturn(self, call) { if (call && (TimeFlowControl_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TimeFlowControl_assertThisInitialized(self); } + +function TimeFlowControl_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TimeFlowControl_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TimeFlowControl_getPrototypeOf(o) { TimeFlowControl_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TimeFlowControl_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TimeFlowControl + * @deprecatedclass SuperMap.TimeFlowControl + * @category Control + * @classdesc 时间管理类。此类只负责时间上的控制,具体执行的操作需要用户在初始化时的回调函数内部进行实现。 + * 如设置起始时间为 1000,结束时间是 2000,步长设置为 1, + * 那么表示按照每次1年(可以通过 setSpeed 进行修改)的变化从公元 1000 年开始到公元 2000 年为止,默认每 1 秒会 1 次(通过 setFrequency 修改) + * @extends {TimeControlBase} + * @param {function} callback - 每次刷新回调函数。具体的效果需要用户在此回调函数里面实现。 + * @param {Object} options - 可选参数。 + * @param {number} [options.speed=1] - 步长(单位 ms)。不能小于 0,(每次刷新的数据之间的间隔为 1ms)。 + * @param {number} [options.frequency=1000] - 刷新频率(单位 ms)。 + * @param {number} [options.startTime=0] - 起始时间,必须为数字,且小于等于 endTime。如果不设置,初始化时为 0,建议设置。 + * @param {number} [options.endTime] - 结束时间,必须为数字,且大于等于 startTime。如果不设置,初始化时使用 new Date() 以当前时间进行设置,建议设置。 + * @param {boolean} [options.repeat=true] - 是否重复循环。 + * @param {boolean} [options.reverse=false] - 是否反向。 + * @usage + */ + +var TimeFlowControl = /*#__PURE__*/function (_TimeControlBase) { + TimeFlowControl_inherits(TimeFlowControl, _TimeControlBase); + + var _super = TimeFlowControl_createSuper(TimeFlowControl); + + function TimeFlowControl(callback, options) { + var _this; + + TimeFlowControl_classCallCheck(this, TimeFlowControl); + + _this = _super.call(this, options); + + var me = TimeFlowControl_assertThisInitialized(_this); + /** + * @member TimeFlowControl.prototype.callback -{function} + * @description 每次刷新执行的回调函数。 + */ + + + me.callback = callback; //先让IE下支持bind方法 + + if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== "function") { + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function fNOP() {//empty Function + }, + fBound = function fBound() { + return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + return fBound; + }; + } //保证 this.tick 的上下文还是 TimeControl 这个对象 + + + me.update = me.update.bind(me); + me.oldTime = me.currentTime; + me.CLASS_NAME = "SuperMap.TimeFlowControl"; + return _this; + } + /** + * @function TimeFlowControl.prototype.updateOptions + * @override + */ + + + TimeFlowControl_createClass(TimeFlowControl, [{ + key: "updateOptions", + value: function updateOptions(options) { + options = options || {}; + + TimeFlowControl_get(TimeFlowControl_getPrototypeOf(TimeFlowControl.prototype), "updateOptions", this).call(this, options); + } + /** + * @function TimeFlowControl.prototype.start + * @override + */ + + }, { + key: "start", + value: function start() { + var me = this; + + if (me.running) { + return; + } + + me.running = true; + + if (me.reverse) { + if (me.currentTime === me.startTime) { + me.oldTime = me.endTime; + me.currentTime = me.oldTime; + } + } else { + if (me.oldTime === me.endTime) { + me.currentTime = me.startTime; + me.oldTime = me.currentTime; + } + } + + me.tick(); + } + /** + * @function TimeFlowControl.prototype.stop + * @override + */ + + }, { + key: "stop", + value: function stop() { + TimeFlowControl_get(TimeFlowControl_getPrototypeOf(TimeFlowControl.prototype), "stop", this).call(this); + + var me = this; + me.oldTime = me.currentTime; + + if (me.running) { + me.running = false; + } //清除定时tick + + + me.intervalId && window.clearTimeout(me.intervalId); + } + /** + * @function TimeFlowControl.prototype.destroy + * @override + */ + + }, { + key: "destroy", + value: function destroy() { + TimeFlowControl_get(TimeFlowControl_getPrototypeOf(TimeFlowControl.prototype), "destroy", this).call(this); + + var me = this; + me.oldTime = null; + me.callback = null; + } + /** + * @function TimeFlowControl.prototype.tick + * @description 定时刷新。 + */ + + }, { + key: "tick", + value: function tick() { + var me = this; + me.intervalId && window.clearInterval(me.intervalId); + me.intervalId = null; + me.update(); + me.intervalId = window.setInterval(me.update, me.frequency); + } + /** + * @function TimeFlowControl.prototype.update + * @description 更新控件。 + */ + + }, { + key: "update", + value: function update() { + var me = this; //判定是否还需要继续 + + if (!me.running) { + return; + } //调用回调函数 + + + me.callback && me.callback(me.currentTime); //destroy之后callback就为空,所以需要判定一下 + + if (!me.reverse) { + //如果相等,则代表上一帧已经运行到了最后,下一帧运行初始化的状态 + if (me.currentTime === me.endTime) { + //不循环时 + if (!me.repeat) { + me.running = false; + me.stop(); + return null; + } + + me.stop(); + me.currentTime = me.startTime; + me.oldTime = me.currentTime; + me.start(); + } else { + //否则时间递增 + me.oldTime = me.currentTime; + me.currentTime += me.speed; + } + + if (me.currentTime >= me.endTime) { + me.currentTime = me.endTime; + } + } else { + //如果相等,则代表上一帧已经运行到了最前,下一帧运行结束的状态 + if (me.currentTime === me.startTime) { + //不循环时 + if (!me.repeat) { + me.running = false; + return null; + } + + me.oldTime = me.endTime; + me.currentTime = me.oldTime; + } else { + //否则时间递减 + me.currentTime = me.oldTime; + me.oldTime -= me.speed; + } + + if (me.oldTime <= me.startTime) { + me.oldTime = me.startTime; + } + } + } + }]); + + return TimeFlowControl; +}(TimeControlBase); +;// CONCATENATED MODULE: ./src/common/control/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +// EXTERNAL MODULE: ./node_modules/promise-polyfill/dist/polyfill.js +var polyfill = __webpack_require__(957); +// EXTERNAL MODULE: ./node_modules/fetch-ie8/fetch.js +var fetch = __webpack_require__(937); +// EXTERNAL MODULE: ./node_modules/fetch-jsonp/build/fetch-jsonp.js +var fetch_jsonp = __webpack_require__(238); +var fetch_jsonp_default = /*#__PURE__*/__webpack_require__.n(fetch_jsonp); +;// CONCATENATED MODULE: ./src/common/util/FetchRequest.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +var FetchRequest_fetch = window.fetch; +var setFetch = function setFetch(newFetch) { + FetchRequest_fetch = newFetch; +}; +var RequestJSONPPromise = { + limitLength: 1500, + queryKeys: [], + queryValues: [], + supermap_callbacks: {}, + addQueryStrings: function addQueryStrings(values) { + var me = this; + + for (var key in values) { + me.queryKeys.push(key); + + if (typeof values[key] !== 'string') { + values[key] = Util.toJSON(values[key]); + } + + var tempValue = encodeURIComponent(values[key]); + me.queryValues.push(tempValue); + } + }, + issue: function issue(config) { + var me = this, + uid = me.getUid(), + url = config.url, + splitQuestUrl = []; + var p = new Promise(function (resolve) { + me.supermap_callbacks[uid] = function (response) { + delete me.supermap_callbacks[uid]; + resolve(response); + }; + }); // me.addQueryStrings({ + // callback: "RequestJSONPPromise.supermap_callbacks[" + uid + "]" + // }); + + var sectionURL = url, + keysCount = 0; //此次sectionURL中有多少个key + + var length = me.queryKeys ? me.queryKeys.length : 0; + + for (var i = 0; i < length; i++) { + if (sectionURL.length + me.queryKeys[i].length + 2 >= me.limitLength) { + //+2 for ("&"or"?")and"=" + if (keysCount == 0) { + return false; + } + + splitQuestUrl.push(sectionURL); + sectionURL = url; + keysCount = 0; + i--; + } else { + if (sectionURL.length + me.queryKeys[i].length + 2 + me.queryValues[i].length > me.limitLength) { + var leftValue = me.queryValues[i]; + + while (leftValue.length > 0) { + var leftLength = me.limitLength - sectionURL.length - me.queryKeys[i].length - 2; //+2 for ("&"or"?")and"=" + + if (sectionURL.indexOf('?') > -1) { + sectionURL += '&'; + } else { + sectionURL += '?'; + } + + var tempLeftValue = leftValue.substring(0, leftLength); //避免 截断sectionURL时,将类似于%22这样的符号截成两半,从而导致服务端组装sectionURL时发生错误 + + if (tempLeftValue.substring(leftLength - 1, leftLength) === '%') { + leftLength -= 1; + tempLeftValue = leftValue.substring(0, leftLength); + } else if (tempLeftValue.substring(leftLength - 2, leftLength - 1) === '%') { + leftLength -= 2; + tempLeftValue = leftValue.substring(0, leftLength); + } + + sectionURL += me.queryKeys[i] + '=' + tempLeftValue; + leftValue = leftValue.substring(leftLength); + + if (tempLeftValue.length > 0) { + splitQuestUrl.push(sectionURL); + sectionURL = url; + keysCount = 0; + } + } + } else { + keysCount++; + + if (sectionURL.indexOf('?') > -1) { + sectionURL += '&'; + } else { + sectionURL += '?'; + } + + sectionURL += me.queryKeys[i] + '=' + me.queryValues[i]; + } + } + } + + splitQuestUrl.push(sectionURL); + me.send(splitQuestUrl, 'RequestJSONPPromise.supermap_callbacks[' + uid + ']', config && config.proxy); + return p; + }, + getUid: function getUid() { + var uid = new Date().getTime(), + random = Math.floor(Math.random() * 1e17); + return uid * 1000 + random; + }, + send: function send(splitQuestUrl, callback, proxy) { + var len = splitQuestUrl.length; + + if (len > 0) { + var jsonpUserID = new Date().getTime(); + + for (var i = 0; i < len; i++) { + var url = splitQuestUrl[i]; + + if (url.indexOf('?') > -1) { + url += '&'; + } else { + url += '?'; + } + + url += 'sectionCount=' + len; + url += '§ionIndex=' + i; + url += '&jsonpUserID=' + jsonpUserID; + + if (proxy) { + url = decodeURIComponent(url); + url = proxy + encodeURIComponent(url); + } + + fetch_jsonp_default()(url, { + jsonpCallbackFunction: callback, + timeout: 30000 + }); + } + } + }, + GET: function GET(config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings(config.params); + return me.issue(config); + }, + POST: function POST(config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + }, + PUT: function PUT(config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + }, + DELETE: function DELETE(config) { + var me = this; + me.queryKeys.length = 0; + me.queryValues.length = 0; + me.addQueryStrings({ + requestEntity: config.data + }); + return me.issue(config); + } +}; +var CORS; +var RequestTimeout; +/** + * @function setCORS + * @description 设置是否允许跨域请求,全局配置,优先级低于 service 下的 crossOring 参数。 + * @category BaseTypes Util + * @param {boolean} cors - 是否允许跨域请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { setCORS } from '{npm}'; + * + * setCORS(cors); + * ``` + */ + +var setCORS = function setCORS(cors) { + CORS = cors; +}; +/** + * @function isCORS + * @description 是是否允许跨域请求。 + * @category BaseTypes Util + * @returns {boolean} 是否允许跨域请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { isCORS } from '{npm}'; + * + * const result = isCORS(); + * ``` + */ + +var isCORS = function isCORS() { + if (CORS != undefined) { + return CORS; + } + + return window.XMLHttpRequest && 'withCredentials' in new window.XMLHttpRequest(); +}; +/** + * @function setRequestTimeout + * @description 设置请求超时时间。 + * @param {number} [timeout=45] - 请求超时时间,单位秒。 + * @private + * @usage + * ``` + * // 浏览器 + + + + // ES6 Import + import { setRequestTimeout } from '{npm}'; + + setRequestTimeout(timeout); + * ``` + */ + +var setRequestTimeout = function setRequestTimeout(timeout) { + return RequestTimeout = timeout; +}; +/** + * @function getRequestTimeout + * @description 获取请求超时时间。 + * @returns {number} 请求超时时间。 + * @private + * @usage + * ``` + * // 浏览器 + + + + // ES6 Import + import { getRequestTimeout } from '{npm}'; + + getRequestTimeout(); + * ``` + */ + +var getRequestTimeout = function getRequestTimeout() { + return RequestTimeout || 45000; +}; +/** + * @name FetchRequest + * @namespace + * @category BaseTypes Util + * @description 获取请求。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { FetchRequest } from '{npm}'; + * + * const result = FetchRequest.commit(method, url, params, options); + * + * ``` + */ + +var FetchRequest = { + /** + * @function FetchRequest.commit + * @description commit 请求。 + * @param {string} method - 请求方法。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + commit: function commit(method, url, params, options) { + method = method ? method.toUpperCase() : method; + + switch (method) { + case 'GET': + return this.get(url, params, options); + + case 'POST': + return this.post(url, params, options); + + case 'PUT': + return this.put(url, params, options); + + case 'DELETE': + return this["delete"](url, params, options); + + default: + return this.get(url, params, options); + } + }, + + /** + * @function FetchRequest.supportDirectRequest + * @description supportDirectRequest 请求。 + * @param {string} url - 请求地址。 + * @param {Object} options - 请求的配置属性。 + * @returns {boolean} 是否允许跨域请求。 + */ + supportDirectRequest: function supportDirectRequest(url, options) { + if (Util.isInTheSameDomain(url)) { + return true; + } + + if (options.crossOrigin != undefined) { + return options.crossOrigin; + } else { + return isCORS() || options.proxy; + } + }, + + /** + * @function FetchRequest.get + * @description get 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + get: function get(url, params, options) { + options = options || {}; + var type = 'GET'; + url = Util.urlAppend(url, this._getParameterString(params || {})); + url = this._processUrl(url, options); + + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url, + data: params + }; + return RequestJSONPPromise.GET(config); + } + + if (!this.urlIsLong(url)) { + return this._fetch(url, params, options, type); + } else { + return this._postSimulatie(type, url.substring(0, url.indexOf('?') - 1), params, options); + } + }, + + /** + * @function FetchRequest.delete + * @description delete 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options -请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + "delete": function _delete(url, params, options) { + options = options || {}; + var type = 'DELETE'; + url = Util.urlAppend(url, this._getParameterString(params || {})); + url = this._processUrl(url, options); + + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=DELETE", + data: params + }; + return RequestJSONPPromise.DELETE(config); + } + + if (this.urlIsLong(url)) { + return this._postSimulatie(type, url.substring(0, url.indexOf('?') - 1), params, options); + } + + return this._fetch(url, params, options, type); + }, + + /** + * @function FetchRequest.post + * @description post 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + post: function post(url, params, options) { + options = options || {}; + + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=POST", + data: params + }; + return RequestJSONPPromise.POST(config); + } + + return this._fetch(this._processUrl(url, options), params, options, 'POST'); + }, + + /** + * @function FetchRequest.put + * @description put 请求。 + * @param {string} url - 请求地址。 + * @param {string} params - 请求参数。 + * @param {Object} options - 请求的配置属性。 + * @returns {Promise} Promise 对象。 + */ + put: function put(url, params, options) { + options = options || {}; + url = this._processUrl(url, options); + + if (!this.supportDirectRequest(url, options)) { + url = url.replace('.json', '.jsonp'); + var config = { + url: url += "&_method=PUT", + data: params + }; + return RequestJSONPPromise.PUT(config); + } + + return this._fetch(url, params, options, 'PUT'); + }, + + /** + * @function FetchRequest.urlIsLong + * @description url 的字节长度是否太长。 + * @param {string} url - 请求地址。 + * @returns {boolean} url 的字节长度是否太长。 + */ + urlIsLong: function urlIsLong(url) { + //当前url的字节长度。 + var totalLength = 0, + charCode = null; + + for (var i = 0, len = url.length; i < len; i++) { + //转化为Unicode编码 + charCode = url.charCodeAt(i); + + if (charCode < 0x007f) { + totalLength++; + } else if (0x0080 <= charCode && charCode <= 0x07ff) { + totalLength += 2; + } else if (0x0800 <= charCode && charCode <= 0xffff) { + totalLength += 3; + } + } + + return totalLength < 2000 ? false : true; + }, + _postSimulatie: function _postSimulatie(type, url, params, options) { + var separator = url.indexOf('?') > -1 ? '&' : '?'; + url += separator + '_method=' + type; + + if (typeof params !== 'string') { + params = JSON.stringify(params); + } + + return this.post(url, params, options); + }, + _processUrl: function _processUrl(url, options) { + if (this._isMVTRequest(url)) { + return url; + } + + if (url.indexOf('.json') === -1 && !options.withoutFormatSuffix) { + if (url.indexOf('?') < 0) { + url += '.json'; + } else { + var urlArrays = url.split('?'); + + if (urlArrays.length === 2) { + url = urlArrays[0] + '.json?' + urlArrays[1]; + } + } + } + + if (options && options.proxy) { + if (typeof options.proxy === 'function') { + url = options.proxy(url); + } else { + url = decodeURIComponent(url); + url = options.proxy + encodeURIComponent(url); + } + } + + return url; + }, + _fetch: function _fetch(url, params, options, type) { + options = options || {}; + options.headers = options.headers || {}; + + if (!options.headers['Content-Type'] && !FormData.prototype.isPrototypeOf(params)) { + options.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; + } + + if (options.timeout) { + return this._timeout(options.timeout, FetchRequest_fetch(url, { + method: type, + headers: options.headers, + body: type === 'PUT' || type === 'POST' ? params : undefined, + credentials: this._getWithCredentials(options), + mode: 'cors', + timeout: getRequestTimeout() + }).then(function (response) { + return response; + })); + } + + return FetchRequest_fetch(url, { + method: type, + body: type === 'PUT' || type === 'POST' ? params : undefined, + headers: options.headers, + credentials: this._getWithCredentials(options), + mode: 'cors', + timeout: getRequestTimeout() + }).then(function (response) { + return response; + }); + }, + _getWithCredentials: function _getWithCredentials(options) { + if (options.withCredentials === true) { + return 'include'; + } + + if (options.withCredentials === false) { + return 'omit'; + } + + return 'same-origin'; + }, + _fetchJsonp: function _fetchJsonp(url, options) { + options = options || {}; + return fetch_jsonp_default()(url, { + method: 'GET', + timeout: options.timeout + }).then(function (response) { + return response; + }); + }, + _timeout: function _timeout(seconds, promise) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + reject(new Error('timeout')); + }, seconds); + promise.then(resolve, reject); + }); + }, + _getParameterString: function _getParameterString(params) { + var paramsArray = []; + + for (var key in params) { + var value = params[key]; + + if (value != null && typeof value !== 'function') { + var encodedValue; + + if (Array.isArray(value) || value.toString() === '[object Object]') { + encodedValue = encodeURIComponent(JSON.stringify(value)); + } else { + encodedValue = encodeURIComponent(value); + } + + paramsArray.push(encodeURIComponent(key) + '=' + encodedValue); + } + } + + return paramsArray.join('&'); + }, + _isMVTRequest: function _isMVTRequest(url) { + return url.indexOf('.mvt') > -1 || url.indexOf('.pbf') > -1; + } +}; +;// CONCATENATED MODULE: ./src/common/security/SecurityManager.js +function SecurityManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SecurityManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SecurityManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SecurityManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SecurityManager_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SecurityManager + * @deprecatedclass SuperMap.SecurityManager + * @category Security + * @classdesc 安全管理中心,提供 iServer,iPortal,Online 统一权限认证管理。 + * > 使用说明: + * > 创建任何一个服务之前调用 {@link SecurityManager.registerToken}或 + * > {@link SecurityManager.registerKey}注册凭据。 + * > 发送请求时根据 url 或者服务 id 获取相应的 key 或者 token 并自动添加到服务地址中。 + * @usage + */ + +var SecurityManager = /*#__PURE__*/function () { + function SecurityManager() { + SecurityManager_classCallCheck(this, SecurityManager); + } + + SecurityManager_createClass(SecurityManager, null, [{ + key: "generateToken", + value: + /** + * @description 从服务器获取一个token,在此之前要注册服务器信息。 + * @function SecurityManager.generateToken + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @param {TokenServiceParameter} tokenParam - token 申请参数。 + * @returns {Promise} 包含 token 信息的 Promise 对象。 + */ + function generateToken(url, tokenParam) { + var serverInfo = this.servers[url]; + + if (!serverInfo) { + return; + } + + return FetchRequest.post(serverInfo.tokenServiceUrl, JSON.stringify(tokenParam.toJSON())).then(function (response) { + return response.text(); + }); + } + /** + * @description 注册安全服务器相关信息。 + * @function SecurityManager.registerServers + * @param {ServerInfo} serverInfos - 服务器信息。 + */ + + }, { + key: "registerServers", + value: function registerServers(serverInfos) { + this.servers = this.servers || {}; + + if (!Util.isArray(serverInfos)) { + serverInfos = [serverInfos]; + } + + for (var i = 0; i < serverInfos.length; i++) { + var serverInfo = serverInfos[i]; + this.servers[serverInfo.server] = serverInfo; + } + } + /** + * @description 服务请求都会自动带上这个 token。 + * @function SecurityManager.registerToken + * @param {string} url -服务器域名+端口:如http://localhost:8090。 + * @param {string} token - token + */ + + }, { + key: "registerToken", + value: function registerToken(url, token) { + this.tokens = this.tokens || {}; + + if (!url || !token) { + return; + } + + var domain = this._getTokenStorageKey(url); + + this.tokens[domain] = token; + } + /** + * @description 注册 key,ids 为数组(存在一个 key 对应多个服务)。 + * @function SecurityManager.registerKey + * @param {Array} ids - 可以是服务 id 数组或者 url 地址数组或者 webAPI 类型数组。 + * @param {string} key - key + */ + + }, { + key: "registerKey", + value: function registerKey(ids, key) { + this.keys = this.keys || {}; + + if (!ids || ids.length < 1 || !key) { + return; + } + + ids = Util.isArray(ids) ? ids : [ids]; + + for (var i = 0; i < ids.length; i++) { + var id = this._getUrlRestString(ids[0]) || ids[0]; + this.keys[id] = key; + } + } + /** + * @description 获取服务器信息。 + * @function SecurityManager.getServerInfo + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @returns {ServerInfo} 服务器信息。 + */ + + }, { + key: "getServerInfo", + value: function getServerInfo(url) { + this.servers = this.servers || {}; + return this.servers[url]; + } + /** + * @description 根据 Url 获取token。 + * @function SecurityManager.getToken + * @param {string} url - 服务器域名+端口,如:http://localhost:8092。 + * @returns {string} token + */ + + }, { + key: "getToken", + value: function getToken(url) { + if (!url) { + return; + } + + this.tokens = this.tokens || {}; + + var domain = this._getTokenStorageKey(url); + + return this.tokens[domain]; + } + /** + * @description 根据 Url 获取 key。 + * @function SecurityManager.getKey + * @param {string} id - id + * @returns {string} key + */ + + }, { + key: "getKey", + value: function getKey(id) { + this.keys = this.keys || {}; + var key = this._getUrlRestString(id) || id; + return this.keys[key]; + } + /** + * @description iServer 登录验证。 + * @function SecurityManager.loginiServer + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + * @param {string} username - 用户名。 + * @param {string} password - 密码。 + * @param {boolean} [rememberme=false] - 是否记住。 + * @returns {Promise} 包含 iServer 登录请求结果的 Promise 对象。 + */ + + }, { + key: "loginiServer", + value: function loginiServer(url, username, password, rememberme) { + url = Util.urlPathAppend(url, 'services/security/login'); + var loginInfo = { + username: username && username.toString(), + password: password && password.toString(), + rememberme: rememberme + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + } + }; + return FetchRequest.post(url, loginInfo, requestOptions).then(function (response) { + return response.json(); + }); + } + /** + * @description iServer登出。 + * @function SecurityManager.logoutiServer + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + * @returns {Promise} 是否登出成功。 + */ + + }, { + key: "logoutiServer", + value: function logoutiServer(url) { + url = Util.urlPathAppend(url, 'services/security/logout'); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withoutFormatSuffix: true + }; + return FetchRequest.get(url, '', requestOptions).then(function () { + return true; + })["catch"](function () { + return false; + }); + } + /** + * @description Online 登录验证。 + * @function SecurityManager.loginOnline + * @param {string} callbackLocation - 跳转位置。 + * @param {boolean} [newTab=true] - 是否新窗口打开。 + */ + + }, { + key: "loginOnline", + value: function loginOnline(callbackLocation, newTab) { + var loginUrl = SecurityManager.SSO + '/login?service=' + callbackLocation; + + this._open(loginUrl, newTab); + } + /** + * @description iPortal登录验证。 + * @function SecurityManager.loginiPortal + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + * @param {string} username - 用户名。 + * @param {string} password - 密码。 + * @returns {Promise} 包含 iPortal 登录请求结果的 Promise 对象。 + */ + + }, { + key: "loginiPortal", + value: function loginiPortal(url, username, password) { + url = Util.urlPathAppend(url, 'web/login'); + var loginInfo = { + username: username && username.toString(), + password: password && password.toString() + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withCredentials: true + }; + return FetchRequest.post(url, loginInfo, requestOptions).then(function (response) { + return response.json(); + }); + } + /** + * @description iPortal 登出。 + * @function SecurityManager.logoutiPortal + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + * @returns {Promise} 如果登出成功,返回 true;否则返回 false。 + */ + + }, { + key: "logoutiPortal", + value: function logoutiPortal(url) { + url = Util.urlPathAppend(url, 'services/security/logout'); + var requestOptions = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + withCredentials: true, + withoutFormatSuffix: true + }; + return FetchRequest.get(url, '', requestOptions).then(function () { + return true; + })["catch"](function () { + return false; + }); + } + /** + * @description iManager 登录验证。 + * @function SecurityManager.loginManager + * @param {string} url - iManager 地址。地址参数为 iManager 首页地址,如: http://localhost:8390/imanager。 + * @param {Object} [loginInfoParams] - iManager 登录参数。 + * @param {string} loginInfoParams.userName - 用户名。 + * @param {string} loginInfoParams.password - 密码。 + * @param {Object} options + * @param {boolean} [options.isNewTab=true] - 不同域时是否在新窗口打开登录页面。 + * @returns {Promise} 包含 iManager 登录请求结果的 Promise 对象。 + */ + + }, { + key: "loginManager", + value: function loginManager(url, loginInfoParams, options) { + if (!Util.isInTheSameDomain(url)) { + var isNewTab = options ? options.isNewTab : true; + + this._open(url, isNewTab); + + return; + } + + var requestUrl = Util.urlPathAppend(url, 'icloud/security/tokens'); + var params = loginInfoParams || {}; + var loginInfo = { + username: params.userName && params.userName.toString(), + password: params.password && params.password.toString() + }; + loginInfo = JSON.stringify(loginInfo); + var requestOptions = { + headers: { + Accept: '*/*', + 'Content-Type': 'application/json' + } + }; + var me = this; + return FetchRequest.post(requestUrl, loginInfo, requestOptions).then(function (response) { + response.text().then(function (result) { + me.imanagerToken = result; + return result; + }); + }); + } + /** + * @description 清空全部验证信息。 + * @function SecurityManager.destroyAllCredentials + */ + + }, { + key: "destroyAllCredentials", + value: function destroyAllCredentials() { + this.keys = null; + this.tokens = null; + this.servers = null; + } + /** + * @description 清空令牌信息。 + * @function SecurityManager.destroyToken + * @param {string} url - iportal 首页地址,如:http://localhost:8092/iportal. + */ + + }, { + key: "destroyToken", + value: function destroyToken(url) { + if (!url) { + return; + } + + var domain = this._getTokenStorageKey(url); + + this.tokens = this.tokens || {}; + + if (this.tokens[domain]) { + delete this.tokens[domain]; + } + } + /** + * @description 清空服务授权码。 + * @function SecurityManager.destroyKey + * @param {string} url - iServer 首页地址,如:http://localhost:8090/iserver。 + */ + + }, { + key: "destroyKey", + value: function destroyKey(url) { + if (!url) { + return; + } + + this.keys = this.keys || {}; + var key = this._getUrlRestString(url) || url; + + if (this.keys[key]) { + delete this.keys[key]; + } + } + /** + * @description 服务URL追加授权信息,授权信息需先通过SecurityManager.registerKey或SecurityManager.registerToken注册。 + * @version 10.1.2 + * @function SecurityManager.appendCredential + * @param {string} url - 服务URL + * @returns {string} 绑定了token或者key的服务URL + */ + + }, { + key: "appendCredential", + value: function appendCredential(url) { + var newUrl = url; + var value = this.getToken(url); + var credential = value ? new Credential(value, 'token') : null; + + if (!credential) { + value = this.getKey(url); + credential = value ? new Credential(value, 'key') : null; + } + + if (credential) { + newUrl = Util.urlAppend(newUrl, credential.getUrlParameters()); + } + + return newUrl; + } + }, { + key: "_open", + value: function _open(url, newTab) { + newTab = newTab != null ? newTab : true; + var offsetX = window.screen.availWidth / 2 - this.INNER_WINDOW_WIDTH / 2; + var offsetY = window.screen.availHeight / 2 - this.INNER_WINDOW_HEIGHT / 2; + var options = 'height=' + this.INNER_WINDOW_HEIGHT + ', width=' + this.INNER_WINDOW_WIDTH + ',top=' + offsetY + ', left=' + offsetX + ',toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no'; + + if (newTab) { + window.open(url, 'login'); + } else { + window.open(url, 'login', options); + } + } + }, { + key: "_getTokenStorageKey", + value: function _getTokenStorageKey(url) { + var patten = /(.*?):\/\/([^\/]+)/i; + var result = url.match(patten); + + if (!result) { + return url; + } + + return result[0]; + } + }, { + key: "_getUrlRestString", + value: function _getUrlRestString(url) { + if (!url) { + return url; + } // var patten = /http:\/\/(.*\/rest)/i; + + + var patten = /(http|https):\/\/(.*\/rest)/i; + var result = url.match(patten); + + if (!result) { + return url; + } + + return result[0]; + } + }]); + + return SecurityManager; +}(); +SecurityManager.INNER_WINDOW_WIDTH = 600; +SecurityManager.INNER_WINDOW_HEIGHT = 600; +SecurityManager.SSO = 'https://sso.supermap.com'; +SecurityManager.ONLINE = 'https://www.supermapol.com'; +;// CONCATENATED MODULE: ./src/common/iManager/iManagerServiceBase.js +function iManagerServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iManagerServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iManagerServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) iManagerServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) iManagerServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IManagerServiceBase + * @aliasclass iManagerServiceBase + * @deprecatedclass SuperMap.iManagerServiceBase + * @classdesc iManager 服务基类(有权限限制的类需要实现此类)。 + * @category iManager + * @param {string} url - iManager 首页地址,如:http://localhost:8390/imanager。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var IManagerServiceBase = /*#__PURE__*/function () { + function IManagerServiceBase(url, options) { + iManagerServiceBase_classCallCheck(this, IManagerServiceBase); + + if (url) { + var end = url.substr(url.length - 1, 1); + this.serviceUrl = end === "/" ? url.substr(0, url.length - 2) : url; + } + + this.options = options || {}; + this.CLASS_NAME = "SuperMap.iManagerServiceBase"; + } + /** + * @function IManagerServiceBase.prototype.request + * @description 子类统一通过该方法发送请求。 + * @param {string} url - 请求 URL。 + * @param {string} [method='GET'] - 请求类型。 + * @param {Object} [requestOptions] - 请求选项。 + * @param {Object} param - 请求参数。 + * @description 发送请求。 + * @returns {Promise} Promise 对象。 + */ + + + iManagerServiceBase_createClass(IManagerServiceBase, [{ + key: "request", + value: function request(method, url, param, requestOptions) { + requestOptions = requestOptions || { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json' + } + }; + + if (!requestOptions.hasOwnProperty("withCredentials")) { + requestOptions['withCredentials'] = true; + } + + requestOptions['crossOrigin'] = this.options.crossOrigin; + requestOptions['headers'] = this.options.headers; + var token = SecurityManager.imanagerToken; + + if (token) { + if (!requestOptions.headers) { + requestOptions.headers = []; + } + + requestOptions.headers['X-Auth-Token'] = token; + } + + if (param) { + param = JSON.stringify(param); + } + + return FetchRequest.commit(method, url, param, requestOptions).then(function (response) { + return response.json(); + }); + } + }]); + + return IManagerServiceBase; +}(); +;// CONCATENATED MODULE: ./src/common/iManager/iManagerCreateNodeParam.js +function iManagerCreateNodeParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iManagerCreateNodeParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iManagerCreateNodeParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iManagerCreateNodeParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iManagerCreateNodeParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IManagerCreateNodeParam + * @aliasclass iManagerCreateNodeParam + * @deprecatedclass SuperMap.iManagerCreateNodeParam + * @classdesc iManager 创建节点参数。 + * @category iManager + * @param {Object} [params] - 节点参数。 + * @usage + */ + +var IManagerCreateNodeParam = /*#__PURE__*/iManagerCreateNodeParam_createClass(function IManagerCreateNodeParam(params) { + iManagerCreateNodeParam_classCallCheck(this, IManagerCreateNodeParam); + + params = params || {}; + this.nodeSpec = 'SMALL'; //取值范围: ['SMALL','MEDIUM','LARGE'] 以及自定义的环境规格名称 + + this.nodeCount = 1; //要创建vm的个数 + + this.nodeName = ''; //vm名称 + + this.password = ''; //vm的密码,空表示随机分配 + + this.description = ''; //描述信息 + + this.physicalMachineName = ''; //vm所属的物理机名称. + + this.ips = []; //vm的ip,空数组表示随机分配 + + this.userName = ''; //vm所属用户 + + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iManager/iManager.js +function iManager_typeof(obj) { "@babel/helpers - typeof"; return iManager_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, iManager_typeof(obj); } + +function iManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) iManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) iManager_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iManager_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) iManager_setPrototypeOf(subClass, superClass); } + +function iManager_setPrototypeOf(o, p) { iManager_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return iManager_setPrototypeOf(o, p); } + +function iManager_createSuper(Derived) { var hasNativeReflectConstruct = iManager_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = iManager_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = iManager_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return iManager_possibleConstructorReturn(this, result); }; } + +function iManager_possibleConstructorReturn(self, call) { if (call && (iManager_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return iManager_assertThisInitialized(self); } + +function iManager_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function iManager_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function iManager_getPrototypeOf(o) { iManager_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return iManager_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IManager + * @aliasclass iManager + * @deprecatedclass SuperMap.iManager + * @classdesc iManager 服务类。 + * @category iManager + * @param {string} serviceUrl - iManager 首页地址。 + * @usage + */ + +var IManager = /*#__PURE__*/function (_IManagerServiceBase) { + iManager_inherits(IManager, _IManagerServiceBase); + + var _super = iManager_createSuper(IManager); + + function IManager(iManagerUrl) { + iManager_classCallCheck(this, IManager); + + return _super.call(this, iManagerUrl); + } + /** + * @function IManager.prototype.load + * @description 获取所有服务接口,验证是否已登录授权。 + * @returns {Promise} Promise 对象。 + */ + + + iManager_createClass(IManager, [{ + key: "load", + value: function load() { + return this.request("GET", this.serviceUrl + '/web/api/service.json'); + } + /** + * @function IManager.prototype.createIServer + * @param {IManagerCreateNodeParam} createParam - 创建参数。 + * @description 创建 iServer。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "createIServer", + value: function createIServer(createParam) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/server.json', new IManagerCreateNodeParam(createParam)); + } + /** + * @function IManager.prototype.createIPortal + * @param {IManagerCreateNodeParam} createParam - 创建参数。 + * @description 创建 iPortal。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "createIPortal", + value: function createIPortal(createParam) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/portal.json', new IManagerCreateNodeParam(createParam)); + } + /** + * @function IManager.prototype.iServerList + * @description 获取所有创建的 iServer。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "iServerList", + value: function iServerList() { + return this.request("GET", this.serviceUrl + '/icloud/web/nodes/server.json'); + } + /** + * @function IManager.prototype.iPortalList + * @description 获取所有创建的 iPortal。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "iPortalList", + value: function iPortalList() { + return this.request("GET", this.serviceUrl + '/icloud/web/nodes/portal.json'); + } + /** + * @function IManager.prototype.startNodes + * @param {Array.} ids - 需要启动节点的 ID 数组。e.g:['1']。 + * @description 启动节点。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "startNodes", + value: function startNodes(ids) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/started.json', ids); + } + /** + * @function IManager.prototype.stopNodes + * @param {Array.} ids - 需要停止节点的 ID 数组。e.g:['1']。 + * @description 停止节点。 + * @returns {Promise} Promise 对象。 + */ + + }, { + key: "stopNodes", + value: function stopNodes(ids) { + return this.request("POST", this.serviceUrl + '/icloud/web/nodes/stopped.json', ids); + } + }]); + + return IManager; +}(IManagerServiceBase); +;// CONCATENATED MODULE: ./src/common/iManager/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalServiceBase.js +function iPortalServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iPortalServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalServiceBase + * @aliasclass iPortalServiceBase + * @deprecatedclass SuperMap.iPortalServiceBase + * @classdesc iPortal 服务基类(有权限限制的类需要实现此类)。 + * @category iPortal/Online Core + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var IPortalServiceBase = /*#__PURE__*/function () { + function IPortalServiceBase(url, options) { + iPortalServiceBase_classCallCheck(this, IPortalServiceBase); + + options = options || {}; + this.serviceUrl = url; + this.CLASS_NAME = "SuperMap.iPortalServiceBase"; + this.withCredentials = options.withCredentials || false; + this.crossOrigin = options.crossOrigin; + this.headers = options.headers; + } + /** + * @function IPortalServiceBase.prototype.request + * @description 子类统一通过该方法发送请求。 + * @param {string} [method='GET'] - 请求类型。 + * @param {string} url - 服务地址。 + * @param {Object} param - 请求参数。 + * @param {Object} [requestOptions] - fetch 请求配置项。 + * @returns {Promise} 返回包含请求结果的 Promise 对象。 + */ + + + iPortalServiceBase_createClass(IPortalServiceBase, [{ + key: "request", + value: function request(method, url, param) { + var requestOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { + headers: this.headers, + crossOrigin: this.crossOrigin, + withCredentials: this.withCredentials + }; + url = SecurityManager.appendCredential(url); + return FetchRequest.commit(method, url, param, requestOptions).then(function (response) { + return response.json(); + }); + } + }]); + + return IPortalServiceBase; +}(); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalQueryParam.js +function iPortalQueryParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalQueryParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalQueryParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalQueryParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalQueryParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalQueryParam + * @aliasclass iPortalQueryParam + * @deprecatedclass SuperMap.iPortalQueryParam + * @classdesc iPortal 资源查询参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesQuery + * @param {Object} params - 可选参数。 + * @param {ResourceType} [params.resourceType] - 资源类型 + * @param {number} [params.pageSize] - 分页中每页大小。 + * @param {number} [params.currentPage] - 分页页码。 + * @param {OrderBy} [params.orderBy] - 排序字段。 + * @param {OrderType} [params.orderType] - 根据升序还是降序过滤。 + * @param {SearchType} [params.searchType] - 根据查询的范围进行过滤。 + * @param {Array} [params.tags] - 标签。 + * @param {Array} [params.dirIds] - 目录 id + * @param {Array} [params.resourceSubTypes] - 根据资源的子类型进行过滤。 + * @param {AggregationTypes} [params.aggregationTypes] - 聚合查询的类型。 + * @param {string} [params.text] - 搜索的关键词。 + * @param {Array} [params.groupIds] - 根据群组进行过滤。 + * @param {Array} [params.departmentIds] - 根据部门进行过滤。 + * @usage + */ + +var IPortalQueryParam = /*#__PURE__*/iPortalQueryParam_createClass(function IPortalQueryParam(params) { + iPortalQueryParam_classCallCheck(this, IPortalQueryParam); + + params = params || {}; + this.resourceType = ""; // 空为全部 MAP SERVICE SCENE DATA INSIGHTS_WORKSPACE MAP_DASHBOARD + + this.pageSize = 12; // 每页多少条 + + this.currentPage = 1; // 第几页 + + this.orderBy = "UPDATETIME"; // UPDATETIME HEATLEVEL + + this.orderType = "DESC"; // DESC ASC + + this.searchType = "PUBLIC"; // PUBLIC SHARETOME_RES MYDEPARTMENT_RES MYGROUP_RES MY_RES + + this.tags = []; // 标签 + + this.dirIds = []; // 类别 + + this.resourceSubTypes = []; // 类型 + + this.aggregationTypes = []; // TAG TYPE SUBTYPE + + this.text = ""; // 搜索字段 + + this.groupIds = []; // 群组Id过滤 + + this.departmentIds = []; // 部门Id过滤 + + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalQueryResult.js +function iPortalQueryResult_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalQueryResult_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalQueryResult_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalQueryResult_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalQueryResult_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalQueryResult + * @aliasclass iPortalQueryResult + * @deprecatedclass SuperMap.iPortalQueryResult + * @classdesc iPortal 资源结果集封装类。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesQuery + * @param {Object} queryResult - 可选参数。 + * @param {Array} [queryResult.content] - 页面内容。 + * @param {number} [queryResult.total] - 总记录数。 + * @param {number} [queryResult.currentPage] - 当前第几页。 + * @param {number} [queryResult.pageSize] - 每页大小。 + * @param {Object} [queryResult.aggregations] - 聚合查询的结果。 + * @usage + */ + +var IPortalQueryResult = /*#__PURE__*/iPortalQueryResult_createClass(function IPortalQueryResult(queryResult) { + iPortalQueryResult_classCallCheck(this, IPortalQueryResult); + + queryResult = queryResult || {}; + this.content = []; + this.total = 0; + this.currentPage = 1; + this.pageSize = 12; + this.aggregations = null; + Util.extend(this, queryResult); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalResource.js +function iPortalResource_typeof(obj) { "@babel/helpers - typeof"; return iPortalResource_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, iPortalResource_typeof(obj); } + +function iPortalResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iPortalResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalResource_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalResource_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) iPortalResource_setPrototypeOf(subClass, superClass); } + +function iPortalResource_setPrototypeOf(o, p) { iPortalResource_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return iPortalResource_setPrototypeOf(o, p); } + +function iPortalResource_createSuper(Derived) { var hasNativeReflectConstruct = iPortalResource_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = iPortalResource_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = iPortalResource_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return iPortalResource_possibleConstructorReturn(this, result); }; } + +function iPortalResource_possibleConstructorReturn(self, call) { if (call && (iPortalResource_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return iPortalResource_assertThisInitialized(self); } + +function iPortalResource_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function iPortalResource_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function iPortalResource_getPrototypeOf(o) { iPortalResource_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return iPortalResource_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class IPortalResource + * @aliasclass iPortalResource + * @deprecatedclass SuperMap.iPortalResource + * @classdesc iPortal 资源详情类。 + * @version 10.0.1 + * @category iPortal/Online Resources + * @param {string} portalUrl - 服务地址。 + * @param {Object} resourceInfo - 可选参数。 + * @param {Array} [resourceInfo.authorizeSetting] - 资源的授权信息 + * @param {string} [resourceInfo.bounds] - 资源的坐标范围 + * @param {string} [resourceInfo.bounds4326] - 资源的坐标范围,转换为EPSG 4326坐标系统后的地理范围。 + * @param {string} [resourceInfo.checkStatus] - 资源的审核状态,可以是:空,SUCCESSFUL,UNCHECKED,FAILED + * @param {Date} [resourceInfo.createTime] - 资源的创建时间 + * @param {string} [resourceInfo.description] - 资源描述 + * @param {number} [resourceInfo.dirId] - 资源所在的门户目录的id + * @param {number} [resourceInfo.epsgCode] - 门户资源基于的坐标系的EPSG值。 + * @param {number} [resourceInfo.heatLevel] - 记录资源的访问量或下载量。 + * @param {string} [resourceInfo.id] - 资源存储到ElasticSearch中的文档id + * @param {string} [resourceInfo.name] - 资源名称 + * @param {number} [resourceInfo.personalDirId] - 资源所在的个人目录的id + * @param {number} [resourceInfo.resourceId] - 资源表(maps,services等)里的id + * @param {string} [resourceInfo.resourceSubType] - 某类资源的具体子类型。 + * @param {ResourceType} [resourceInfo.resourceType] - 资源类型 + * @param {number} [resourceInfo.serviceRootUrlId] - 批量注册服务时,服务根地址的ID + * @param {Array} [resourceInfo.tags] - 资源的标签 + * @param {string} [resourceInfo.thumbnail] - 资源的缩略图 + * @param {Date} [resourceInfo.updateTime] - 资源的更新时间 + * @param {string} [resourceInfo.userName] - 搜索的关键词 + * @param {Object} [resourceInfo.sourceJSON] - 提供了门户项目返回的所有信息。 + * @extends {IPortalServiceBase} + * @usage + */ + +var IPortalResource = /*#__PURE__*/function (_IPortalServiceBase) { + iPortalResource_inherits(IPortalResource, _IPortalServiceBase); + + var _super = iPortalResource_createSuper(IPortalResource); + + function IPortalResource(portalUrl, resourceInfo) { + var _this; + + iPortalResource_classCallCheck(this, IPortalResource); + + _this = _super.call(this, portalUrl); + resourceInfo = resourceInfo || {}; + _this.authorizeSetting = []; + _this.bounds = ""; + _this.bounds4326 = ""; + _this.checkStatus = ""; + _this.createTime = 0; + _this.description = null; + _this.dirId = null; + _this.epsgCode = 0; + _this.heatLevel = 0; + _this.id = 0; + _this.name = ""; + _this.personalDirId = null; + _this.resourceId = 0; + _this.resourceSubType = null; + _this.resourceType = null; + _this.serviceRootUrlId = null; + _this.tags = null; + _this.thumbnail = null; + _this.updateTime = 0; + _this.userName = ""; + _this.sourceJSON = {}; //返回门户资源详细信息 + + Util.extend(iPortalResource_assertThisInitialized(_this), resourceInfo); // INSIGHTS_WORKSPACE MAP_DASHBOARD + + _this.resourceUrl = portalUrl + "/web/" + _this.resourceType.replace("_", "").toLowerCase() + "s/" + _this.resourceId; + + if (_this.withCredentials) { + _this.resourceUrl = portalUrl + "/web/mycontent/" + _this.resourceType.replace("_", "").toLowerCase() + "s/" + _this.resourceId; + } // if (this.id) { + // this.mapUrl = mapUrl + "/" + this.id; + // } + + + return _this; + } + /** + * @function IPortalResource.prototype.load + * @description 加载资源信息。 + * @returns {Promise} 返回 Promise 对象。如果成功,Promise 没有返回值,请求返回结果自动填充到该类的属性中;如果失败,Promise 返回值包含错误信息。 + */ + + + iPortalResource_createClass(IPortalResource, [{ + key: "load", + value: function load() { + var me = this; + return me.request("GET", me.resourceUrl + ".json").then(function (resourceInfo) { + if (resourceInfo.error) { + return resourceInfo; + } + + me.sourceJSON = resourceInfo; + }); + } + /** + * @function IPortalResource.prototype.update + * @description 更新资源属性信息。 + * @returns {Promise} 返回包含更新操作状态的 Promise 对象。 + */ + + }, { + key: "update", + value: function update() { + var resourceName = this.resourceType.replace("_", "").toLowerCase(); + var options = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }; + + if (resourceName === 'data') { + this.resourceUrl = this.resourceUrl + "/attributes.json"; + } + + var entity = JSON.stringify(this.sourceJSON); //对服务资源进行编辑时,请求体内容只留关键字字段(目前如果是全部字段 更新返回成功 但其实没有真正的更新) + + if (resourceName === 'service') { + var serviceInfo = { + authorizeSetting: this.sourceJSON.authorizeSetting, + metadata: this.sourceJSON.metadata, + tags: this.sourceJSON.tags, + thumbnail: this.sourceJSON.thumbnail, + tokenRefreshUrl: this.sourceJSON.tokenRefreshUrl + }; + entity = JSON.stringify(serviceInfo); + } + + return this.request("PUT", this.resourceUrl, entity, options); + } + }]); + + return IPortalResource; +}(IPortalServiceBase); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalShareParam.js +function iPortalShareParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalShareParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalShareParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalShareParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalShareParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalShareParam + * @aliasclass iPortalShareParam + * @deprecatedclass SuperMap.iPortalShareParam + * @classdesc iPortal 资源共享参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} params - 可选参数。 + * @param {ResourceType} [params.resourceType] - 资源类型。 + * @param {Array} [params.ids] - 资源的id数组。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @usage + */ + +var IPortalShareParam = /*#__PURE__*/iPortalShareParam_createClass(function IPortalShareParam(params) { + iPortalShareParam_classCallCheck(this, IPortalShareParam); + + params = params || {}; + this.ids = []; + this.entities = []; + this.resourceType = ""; // MAP SERVICE SCENE DATA INSIGHTS_WORKSPACE MAP_DASHBOARD + + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortal.js +function iPortal_typeof(obj) { "@babel/helpers - typeof"; return iPortal_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, iPortal_typeof(obj); } + +function iPortal_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iPortal_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortal_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortal_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortal_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortal_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) iPortal_setPrototypeOf(subClass, superClass); } + +function iPortal_setPrototypeOf(o, p) { iPortal_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return iPortal_setPrototypeOf(o, p); } + +function iPortal_createSuper(Derived) { var hasNativeReflectConstruct = iPortal_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = iPortal_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = iPortal_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return iPortal_possibleConstructorReturn(this, result); }; } + +function iPortal_possibleConstructorReturn(self, call) { if (call && (iPortal_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return iPortal_assertThisInitialized(self); } + +function iPortal_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function iPortal_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function iPortal_getPrototypeOf(o) { iPortal_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return iPortal_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class IPortal + * @aliasclass iPortal + * @deprecatedclass SuperMap.iPortal + * @classdesc 对接 SuperMap iPortal 基础服务。 + * @category iPortal/Online Resources + * @extends {IPortalServiceBase} + * @param {string} iportalUrl - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.withCredentials] - 请求是否携带 cookie。 + * @usage + */ + +var IPortal = /*#__PURE__*/function (_IPortalServiceBase) { + iPortal_inherits(IPortal, _IPortalServiceBase); + + var _super = iPortal_createSuper(IPortal); + + function IPortal(iportalUrl, options) { + var _this; + + iPortal_classCallCheck(this, IPortal); + + _this = _super.call(this, iportalUrl, options); + _this.iportalUrl = iportalUrl; + options = options || {}; + _this.withCredentials = options.withCredentials || false; + return _this; + } + /** + * @function IPortal.prototype.load + * @description 加载页面。 + * @returns {Promise} 包含 iportal web 资源信息的 Promise 对象。 + */ + + + iPortal_createClass(IPortal, [{ + key: "load", + value: function load() { + return FetchRequest.get(this.iportalUrl + "/web"); + } + /** + * @function IPortal.prototype.queryResources + * @description 查询资源。 + * @version 10.0.1 + * @param {IPortalQueryParam} queryParams - 查询参数。 + * @returns {Promise} 包含所有资源结果的 Promise 对象。 + */ + + }, { + key: "queryResources", + value: function queryResources(queryParams) { + if (!(queryParams instanceof IPortalQueryParam)) { + return new Promise(function (resolve) { + resolve("queryParams is not instanceof iPortalQueryParam !"); + }); + } + + var me = this; + var resourceUrl = this.iportalUrl + "/gateway/catalog/resource/search.json"; + queryParams.t = new Date().getTime(); + return this.request("GET", resourceUrl, queryParams).then(function (result) { + var content = []; + result.content.forEach(function (item) { + content.push(new IPortalResource(me.iportalUrl, item)); + }); + var queryResult = new IPortalQueryResult(); + queryResult.content = content; + queryResult.total = result.total; + queryResult.currentPage = result.currentPage; + queryResult.pageSize = result.pageSize; + queryResult.aggregations = result.aggregations; + return queryResult; + }); + } + /** + * @function IPortal.prototype.updateResourcesShareSetting + * @description 更新共享设置。 + * @version 10.0.1 + * @param {IPortalShareParam} shareParams - 共享的参数。 + * @returns {Promise} 包含共享资源结果的 Promise 对象。 + */ + + }, { + key: "updateResourcesShareSetting", + value: function updateResourcesShareSetting(shareParams) { + if (!(shareParams instanceof IPortalShareParam)) { + return new Promise(function (resolve) { + resolve("shareParams is not instanceof iPortalShareParam !"); + }); + } + + var resourceUrlName = shareParams.resourceType.replace("_", "").toLowerCase() + "s"; + + if (resourceUrlName === "datas") { + resourceUrlName = "mycontent/" + resourceUrlName; + } + + var cloneShareParams = { + ids: shareParams.ids, + entities: shareParams.entities + }; + var shareUrl = this.iportalUrl + "/web/" + resourceUrlName + "/sharesetting.json"; + return this.request("PUT", shareUrl, JSON.stringify(cloneShareParams)).then(function (result) { + return result; + }); + } + }]); + + return IPortal; +}(IPortalServiceBase); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalShareEntity.js +function iPortalShareEntity_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalShareEntity_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalShareEntity_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalShareEntity_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalShareEntity_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalShareEntity + * @aliasclass iPortalShareEntity + * @deprecatedclass SuperMap.iPortalShareEntity + * @classdesc iPortal 资源共享实体参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} shareEntity - 可选参数。 + * @param {PermissionType} [shareEntity.permissionType] - 权限类型。 + * @param {EntityType} [shareEntity.entityType] - 实体类型。 + * @param {string} [shareEntity.entityName] - 实体 Name。对应的 USER(用户)、 ROLE(角色)、GROUP(用户组)、IPORTALGROUP(群组)的名称。 + * @param {number} [shareEntity.entityId] - 实体的 id。用于群组的授权。 + * @usage + */ + +var IPortalShareEntity = /*#__PURE__*/iPortalShareEntity_createClass(function IPortalShareEntity(shareEntity) { + iPortalShareEntity_classCallCheck(this, IPortalShareEntity); + + shareEntity = shareEntity || {}; + this.permissionType = ""; // SEARCH READ READWRITE DOWNLOAD + + this.entityType = ""; // USER DEPARTMENT IPORTALGROUP + + this.entityName = "GUEST"; // GUEST or 具体用户 name + + this.entityId = null; + Util.extend(this, shareEntity); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalAddResourceParam.js +function iPortalAddResourceParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalAddResourceParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalAddResourceParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalAddResourceParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalAddResourceParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalAddResourceParam + * @aliasclass iPortalAddResourceParam + * @deprecatedclass SuperMap.iPortalAddResourceParam + * @classdesc iPortal 添加资源参数。 + * @version 10.0.1 + * @category iPortal/Online Resources ResourcesShare + * @param {Object} params - 可选参数。 + * @param {string} [params.rootUrl] - 服务地址。 + * @param {Array} [params.tags] - 标签。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @usage + */ + +var IPortalAddResourceParam = /*#__PURE__*/iPortalAddResourceParam_createClass(function IPortalAddResourceParam(params) { + iPortalAddResourceParam_classCallCheck(this, IPortalAddResourceParam); + + params = params || {}; + this.rootUrl = ""; + this.tags = []; + this.entities = []; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalRegisterServiceParam.js +function iPortalRegisterServiceParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalRegisterServiceParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalRegisterServiceParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalRegisterServiceParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalRegisterServiceParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalRegisterServiceParam + * @aliasclass iPortalRegisterServiceParam + * @deprecatedclass SuperMap.iPortalRegisterServiceParam + * @classdesc iPortal 注册服务参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 可选参数。 + * @param {string} [params.type] - 服务类型。 + * @param {Array} [params.tags] - 服务标签。 + * @param {IPortalShareEntity} [params.entities] - 资源的实体共享参数 + * @param {Object} [params.metadata] - 服务元信息。 + * @param {Array} [params.addedMapNames] - 地图服务列表。 + * @param {Array} [params.addedSceneNames] - 场景服务列表。 + * @usage + */ + +var IPortalRegisterServiceParam = /*#__PURE__*/iPortalRegisterServiceParam_createClass(function IPortalRegisterServiceParam(params) { + iPortalRegisterServiceParam_classCallCheck(this, IPortalRegisterServiceParam); + + params = params || {}; + this.type = ""; // SUPERMAP_REST ARCGIS_REST WMS WFS WCS WPS WMTS OTHERS + + this.tags = []; + this.entities = []; + this.metadata = {}; + this.addedMapNames = []; + this.addedSceneNames = []; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalAddDataParam.js +function iPortalAddDataParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalAddDataParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalAddDataParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalAddDataParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalAddDataParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalAddDataParam + * @aliasclass iPortalAddDataParam + * @deprecatedclass SuperMap.iPortalAddDataParam + * @classdesc iPortal 上传/注册数据所需的参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.fileName - 文件名称 + * @param {DataItemType} params.type - 数据类型。 + * @param {Array} [params.tags] - 数据的标签 + * @param {IPortalDataMetaInfoParam} [params.dataMetaInfo] - 数据元信息 + * @usage + */ + +var IPortalAddDataParam = /*#__PURE__*/iPortalAddDataParam_createClass(function IPortalAddDataParam(params) { + iPortalAddDataParam_classCallCheck(this, IPortalAddDataParam); + + params = params || {}; + this.fileName = ""; + this.type = ""; + this.tags = []; + this.dataMetaInfo = {}; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataMetaInfoParam.js +function iPortalDataMetaInfoParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalDataMetaInfoParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalDataMetaInfoParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalDataMetaInfoParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalDataMetaInfoParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalDataMetaInfoParam + * @aliasclass iPortalDataMetaInfoParam + * @deprecatedclass SuperMap.iPortalDataMetaInfoParam + * @classdesc iPortal 上传数据/注册数据元信息所需的参数。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.xField - X 坐标字段 + * @param {string} params.yField - Y 坐标字段 + * @param {number} params.xIndex - x所在列(关系型存储下CSV或EXCEL数据时必填) + * @param {number} params.yIndex - y所在列(关系型存储下CSV或EXCEL数据时必填) + * @param {Array.} [params.fieldTypes] - 设置字段类型(关系型存储下CSV或EXCEL数据时可选填)。默认类型为:WTEXT。该参数按照CSV文件字段顺序从左到右依次设置,其中默认字段类型可省略不设置。例如,CSV文件中有10个字段,如果只需设定第1,2,4个字段,可设置为['a','b',,'c']。 + * @param {string} params.separator - 分隔符(关系型存储下CSV数据时必填) + * @param {boolean} params.firstRowIsHead - 是否带表头(关系型存储下CSV数据时必填) + * @param {boolean} params.url - HDFS注册目录地址 + * @param {IPortalDataStoreInfoParam} params.dataStoreInfo - 注册数据时的数据存储信息 + * @usage + */ + +var IPortalDataMetaInfoParam = /*#__PURE__*/iPortalDataMetaInfoParam_createClass(function IPortalDataMetaInfoParam(params) { + iPortalDataMetaInfoParam_classCallCheck(this, IPortalDataMetaInfoParam); + + params = params || {}; + this.xField = ""; + this.yField = ""; + this.fileEncoding = "UTF-8"; + this.xIndex = 1; + this.yIndex = 1; + this.fieldTypes = []; + this.separator = ""; + this.firstRowIsHead = true; + this.url = ""; + this.dataStoreInfo = {}; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataStoreInfoParam.js +function iPortalDataStoreInfoParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalDataStoreInfoParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalDataStoreInfoParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalDataStoreInfoParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalDataStoreInfoParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalDataStoreInfoParam + * @aliasclass iPortalDataStoreInfoParam + * @deprecatedclass SuperMap.iPortalDataStoreInfoParam + * @classdesc iPortal 注册一个HBASE HDFS数据存储类。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.type - 大数据文件共享类型和空间数据库类型,包括大数据文件共享HDFS 目录(HDFS)和空间数据库HBASE + * @param {string} params.url - HDFS数据存储目录地址 + * @param {IPortalDataConnectionInfoParam} [params.connectionInfo] - HBASE空间数据库服务的连接信息 + * @usage + */ + +var IPortalDataStoreInfoParam = /*#__PURE__*/iPortalDataStoreInfoParam_createClass(function IPortalDataStoreInfoParam(params) { + iPortalDataStoreInfoParam_classCallCheck(this, IPortalDataStoreInfoParam); + + params = params || {}; + this.type = ""; + this.url = ""; + this.connectionInfo = {}; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalDataConnectionInfoParam.js +function iPortalDataConnectionInfoParam_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalDataConnectionInfoParam_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalDataConnectionInfoParam_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalDataConnectionInfoParam_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalDataConnectionInfoParam_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IPortalDataConnectionInfoParam + * @aliasclass iPortalDataConnectionInfoParam + * @deprecatedclass SuperMap.iPortalDataConnectionInfoParam + * @classdesc iPortal HBASE数据源连接信息类。 + * @version 10.0.1 + * @category iPortal/Online Resources Data + * @param {Object} params - 参数。 + * @param {string} params.dataBase - 数据源连接的数据库名。 + * @param {string} params.server - 服务地址。 + * @usage + */ + +var IPortalDataConnectionInfoParam = /*#__PURE__*/iPortalDataConnectionInfoParam_createClass(function IPortalDataConnectionInfoParam(params) { + iPortalDataConnectionInfoParam_classCallCheck(this, IPortalDataConnectionInfoParam); + + params = params || {}; + this.dataBase = ""; + this.server = ""; + Util.extend(this, params); +}); +;// CONCATENATED MODULE: ./src/common/iPortal/iPortalUser.js +function iPortalUser_typeof(obj) { "@babel/helpers - typeof"; return iPortalUser_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, iPortalUser_typeof(obj); } + +function iPortalUser_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iPortalUser_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iPortalUser_createClass(Constructor, protoProps, staticProps) { if (protoProps) iPortalUser_defineProperties(Constructor.prototype, protoProps); if (staticProps) iPortalUser_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iPortalUser_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) iPortalUser_setPrototypeOf(subClass, superClass); } + +function iPortalUser_setPrototypeOf(o, p) { iPortalUser_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return iPortalUser_setPrototypeOf(o, p); } + +function iPortalUser_createSuper(Derived) { var hasNativeReflectConstruct = iPortalUser_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = iPortalUser_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = iPortalUser_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return iPortalUser_possibleConstructorReturn(this, result); }; } + +function iPortalUser_possibleConstructorReturn(self, call) { if (call && (iPortalUser_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return iPortalUser_assertThisInitialized(self); } + +function iPortalUser_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function iPortalUser_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function iPortalUser_getPrototypeOf(o) { iPortalUser_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return iPortalUser_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class IPortalUser + * @aliasclass iPortalUser + * @deprecatedclass SuperMap.iPortalUser + * @classdesc iPortal 门户中用户信息的封装类。用于管理用户资源,包括可删除,添加资源。 + * @version 10.0.1 + * @category iPortal/Online Resources + * @param {string} iportalUrl - 服务地址。 + * @extends {IPortalServiceBase} + * @usage + */ + +var IPortalUser = /*#__PURE__*/function (_IPortalServiceBase) { + iPortalUser_inherits(IPortalUser, _IPortalServiceBase); + + var _super = iPortalUser_createSuper(IPortalUser); + + function IPortalUser(iportalUrl) { + var _this; + + iPortalUser_classCallCheck(this, IPortalUser); + + _this = _super.call(this, iportalUrl); + _this.iportalUrl = iportalUrl; + return _this; + } + /** + * @function IPortalUser.prototype.deleteResources + * @description 删除资源。 + * @param {Object} params - 删除资源所需的参数对象:{ids,resourceType}。 + * @returns {Promise} 返回包含删除操作状态的 Promise 对象。 + */ + + + iPortalUser_createClass(IPortalUser, [{ + key: "deleteResources", + value: function deleteResources(params) { + var resourceName = params.resourceType.replace("_", "").toLowerCase(); + var deleteResourceUrl = this.iportalUrl + "/web/" + resourceName + "s.json?ids=" + encodeURI(JSON.stringify(params.ids)); + + if (resourceName === 'data') { + deleteResourceUrl = this.iportalUrl + "/web/mycontent/datas/delete.json"; + return this.request("POST", deleteResourceUrl, JSON.stringify(params.ids)); + } + + return this.request("DELETE", deleteResourceUrl); + } + /** + * @function IPortalUser.prototype.addMap + * @description 添加地图。 + * @version 10.1.0 + * @param {IPortalAddResourceParam} addMapParams - 添加地图的参数。 + * @returns {Promise} 返回包含添加地图结果的 Promise 对象。 + */ + + }, { + key: "addMap", + value: function addMap(addMapParams) { + if (!(addMapParams instanceof IPortalAddResourceParam)) { + return this.getErrMsgPromise("addMapParams is not instanceof IPortalAddResourceParam !"); + } + + var cloneAddMapParams = { + rootUrl: addMapParams.rootUrl, + tags: addMapParams.tags, + authorizeSetting: addMapParams.entities + }; + var addMapUrl = this.iportalUrl + "/web/maps/batchaddmaps.json"; + return this.request("POST", addMapUrl, JSON.stringify(cloneAddMapParams)).then(function (result) { + return result; + }); + } + /** + * @function IPortalUser.prototype.addScene + * @description 添加场景。 + * @version 10.1.0 + * @param {IPortalAddResourceParam} addSceneParams - 添加场景的参数。 + * @returns {Promise} 返回包含添加场景结果的 Promise 对象。 + */ + + }, { + key: "addScene", + value: function addScene(addSceneParams) { + if (!(addSceneParams instanceof IPortalAddResourceParam)) { + return this.getErrMsgPromise("addSceneParams is not instanceof IPortalAddResourceParam !"); + } + + var cloneAddSceneParams = { + rootUrl: addSceneParams.rootUrl, + tags: addSceneParams.tags, + authorizeSetting: addSceneParams.entities + }; + var addSceneUrl = this.iportalUrl + "/web/scenes/batchaddscenes.json"; + return this.request("POST", addSceneUrl, JSON.stringify(cloneAddSceneParams)).then(function (result) { + return result; + }); + } + /** + * @function IPortalUser.prototype.registerService + * @description 注册服务。 + * @version 10.1.0 + * @param {IPortalRegisterServiceParam} registerParams - 注册服务的参数。 + * @returns {Promise} 返回包含注册服务结果的 Promise 对象。 + */ + + }, { + key: "registerService", + value: function registerService(registerParams) { + if (!(registerParams instanceof IPortalRegisterServiceParam)) { + return this.getErrMsgPromise("registerParams is not instanceof IPortalRegisterServiceParam !"); + } + + var cloneRegisterParams = { + type: registerParams.type, + tags: registerParams.tags, + authorizeSetting: registerParams.entities, + metadata: registerParams.metadata, + addedMapNames: registerParams.addedMapNames, + addedSceneNames: registerParams.addedSceneNames + }; + var registerUrl = this.iportalUrl + "/web/services.json"; + return this.request("POST", registerUrl, JSON.stringify(cloneRegisterParams)).then(function (result) { + return result; + }); + } + /** + * @function IPortalUser.prototype.getErrMsgPromise + * @description 获取包含错误信息的Promise对象。 + * @version 10.1.0 + * @param {string} errMsg - 传入的错误信息。 + * @returns {Promise} 返回包含错误信息的 Promise 对象。 + */ + + }, { + key: "getErrMsgPromise", + value: function getErrMsgPromise(errMsg) { + return new Promise(function (resolve) { + resolve(errMsg); + }); + } + /** + * @function IPortalUser.prototype.uploadDataRequest + * @description 上传数据。 + * @version 10.1.0 + * @param {number} id - 上传数据的资源id。 + * @param {Object} formData - 请求体为文本数据流。 + * @returns {Promise} 返回包含上传数据操作的 Promise 对象。 + */ + + }, { + key: "uploadDataRequest", + value: function uploadDataRequest(id, formData) { + var uploadDataUrl = this.iportalUrl + "/web/mycontent/datas/" + id + "/upload.json"; + return this.request("POST", uploadDataUrl, formData); + } + /** + * @function IPortalUser.prototype.addData + * @description 上传/注册数据。 + * @version 10.1.0 + * @param {IPortalAddDataParam} params - 上传/注册数据所需的参数。 + * @param {Object} [formData] - 请求体为文本数据流(上传数据时传入)。 + * @returns {Promise} 返回上传/注册数据的 Promise 对象。 + */ + + }, { + key: "addData", + value: function addData(params, formData) { + var _this2 = this; + + if (!(params instanceof IPortalAddDataParam)) { + return this.getErrMsgPromise("params is not instanceof iPortalAddDataParam !"); + } + + var datasUrl = this.iportalUrl + "/web/mycontent/datas.json"; + var entity = { + fileName: params.fileName, + tags: params.tags, + type: params.type + }; + var type = params.type.toLowerCase(); + var dataMetaInfo; + + if (type === "excel" || type === "csv") { + if (!(params.dataMetaInfo instanceof IPortalDataMetaInfoParam)) { + return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !"); + } + + dataMetaInfo = { + xField: params.dataMetaInfo.xField, + yField: params.dataMetaInfo.yField + }; + + if (type === 'csv') { + dataMetaInfo.fileEncoding = params.dataMetaInfo.fileEncoding; + } + + entity.coordType = "WGS84"; + entity.dataMetaInfo = dataMetaInfo; + } else if (type === "hdfs" || type === "hbase") { + if (!(params.dataMetaInfo instanceof IPortalDataMetaInfoParam)) { + return this.getErrMsgPromise("params.dataMetaInfo is not instanceof iPortalDataMetaInfoParam !"); + } + + if (!(params.dataMetaInfo.dataStoreInfo instanceof IPortalDataStoreInfoParam)) { + return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo is not instanceof iPortalDataStoreInfoParam !"); + } + + var dataStoreInfo = { + type: params.dataMetaInfo.dataStoreInfo.type + }; + + switch (type) { + case "hdfs": + dataStoreInfo.url = params.dataMetaInfo.dataStoreInfo.url; + dataMetaInfo = { + url: params.dataMetaInfo.url, + dataStoreInfo: dataStoreInfo + }; + break; + + case "hbase": + if (!(params.dataMetaInfo.dataStoreInfo.connectionInfo instanceof IPortalDataConnectionInfoParam)) { + return this.getErrMsgPromise("params.dataMetaInfo.dataStoreInfo.connectionInfo is not instanceof iPortalDataConnectionInfoParam !"); + } + + dataStoreInfo.connectionInfo = { + dataBase: params.dataMetaInfo.dataStoreInfo.connectionInfo.dataBase, + server: params.dataMetaInfo.dataStoreInfo.connectionInfo.server, + engineType: 'HBASE' + }; + dataStoreInfo.datastoreType = "SPATIAL"; //该字段SPATIAL表示HBASE注册 + + dataMetaInfo = { + dataStoreInfo: dataStoreInfo + }; + break; + } + + entity.dataMetaInfo = dataMetaInfo; + } + + return this.request("POST", datasUrl, JSON.stringify(entity)).then(function (res) { + if (type === "hdfs" || type === "hbase") { + return res; + } else { + if (res.childID) { + return _this2.uploadDataRequest(res.childID, formData); + } else { + return res.customResult; + } + } + }); + } + /** + * @function IPortalUser.prototype.publishOrUnpublish + * @description 发布/取消发布。 + * @version 10.1.0 + * @param {Object} options - 发布/取消发布数据服务所需的参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @param {boolean} forPublish - 是否取消发布。 + * @returns {Promise} 返回发布/取消发布数据服务的 Promise 对象。 + */ + + }, { + key: "publishOrUnpublish", + value: function publishOrUnpublish(option, forPublish) { + if (!option.dataId || !option.serviceType) { + return this.getErrMsgPromise("option.dataID and option.serviceType are Required!"); + } + + var dataId = option.dataId; + var dataServiceId = option.dataServiceId; + var serviceType = option.serviceType; + var publishUrl = this.iportalUrl + "/web/mycontent/datas/" + dataId + "/publishstatus.json?serviceType=" + serviceType; + + if (dataServiceId) { + publishUrl += "&dataServiceId=" + dataServiceId; + } + + return this.request("PUT", publishUrl, JSON.stringify(forPublish)).then(function (res) { + // 发起服务状态查询 + if (forPublish) { + // 发布服务的结果异步处理 + // var publishStateUrl = this.iportalUrl + "web/mycontent/datas/" + dataId + "/publishstatus.rjson"; + if (!dataServiceId) { + // 发布服务时会回传serviceIDs,发布服务之前serviceIDs为空 + dataServiceId = res.customResult; + } + + return dataServiceId; + } else { + // 取消发布的结果同步处理 + return res; + } + }); + } + /** + * @function IPortalUser.prototype.getDataPublishedStatus + * @description 查询服务状态,发起服务状态查询。 + * @version 10.1.0 + * @param {number} dataId - 查询服务状态的数据项id。 + * @param {string} dataServiceId - 发布的服务id。 + * @returns {Promise} 返回查询服务状态的 Promise 对象。 + */ + + }, { + key: "getDataPublishedStatus", + value: function getDataPublishedStatus(dataId, dataServiceId) { + var publishStateUrl = this.iportalUrl + "/web/mycontent/datas/" + dataId + "/publishstatus.json?dataServiceId=" + dataServiceId + "&forPublish=true"; + return this.request("GET", publishStateUrl); + } + /** + * @function IPortalUser.prototype.unPublishedDataService + * @description 取消发布。 + * @version 10.1.0 + * @param {Object} options - 取消发布服务具体参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @returns {Promise} 返回取消发布数据服务的 Promise 对象。 + */ + + }, { + key: "unPublishDataService", + value: function unPublishDataService(option) { + return this.publishOrUnpublish(option, false); + } + /** + * @function IPortalUser.prototype.publishedDataService + * @description 发布数据服务。 + * @version 10.1.0 + * @param {Object} options - 发布数据服务具体参数。 + * @param {Object} options.dataId - 数据项id。 + * @param {Object} options.serviceType - 发布的服务类型,目前支持发布的服务类型包括:RESTDATA, RESTMAP, RESTREALSPACE, RESTSPATIALANALYST。 + * @param {Object} [options.dataServiceId] - 发布的服务 id。 + * @returns {Promise} 返回发布数据服务的 Promise 对象。 + */ + + }, { + key: "publishDataService", + value: function publishDataService(option) { + return this.publishOrUnpublish(option, true); + } + }]); + + return IPortalUser; +}(IPortalServiceBase); +;// CONCATENATED MODULE: ./src/common/iPortal/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/iServer/CommonServiceBase.js +function CommonServiceBase_typeof(obj) { "@babel/helpers - typeof"; return CommonServiceBase_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, CommonServiceBase_typeof(obj); } + +function CommonServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CommonServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CommonServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) CommonServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) CommonServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class CommonServiceBase + * @deprecatedclass SuperMap.CommonServiceBase + * @category iServer Core + * @classdesc 对接 iServer 各种服务的 Service 的基类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var CommonServiceBase = /*#__PURE__*/function () { + function CommonServiceBase(url, options) { + CommonServiceBase_classCallCheck(this, CommonServiceBase); + + var me = this; + this.EVENT_TYPES = ['processCompleted', 'processFailed']; + this.events = null; + this.eventListeners = null; + this.url = null; + this.urls = null; + this.proxy = null; + this.index = null; + this.length = null; + this.options = null; + this.totalTimes = null; + this.POLLING_TIMES = 3; + this._processSuccess = null; + this._processFailed = null; + this.isInTheSameDomain = null; + this.withCredentials = false; + + if (Util.isArray(url)) { + me.urls = url; + me.length = url.length; + me.totalTimes = me.length; + + if (me.length === 1) { + me.url = url[0]; + } else { + me.index = parseInt(Math.random() * me.length); + me.url = url[me.index]; + } + } else { + me.totalTimes = 1; + me.url = url; + } + + if (Util.isArray(url) && !me.isServiceSupportPolling()) { + me.url = url[0]; + me.totalTimes = 1; + } + + options = options || {}; + this.crossOrigin = options.crossOrigin; + this.headers = options.headers; + Util.extend(this, options); + me.isInTheSameDomain = Util.isInTheSameDomain(me.url); + me.events = new Events(me, null, me.EVENT_TYPES, true); + + if (me.eventListeners instanceof Object) { + me.events.on(me.eventListeners); + } + + this.CLASS_NAME = 'SuperMap.CommonServiceBase'; + } + /** + * @function CommonServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + + + CommonServiceBase_createClass(CommonServiceBase, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (Util.isArray(me.urls)) { + me.urls = null; + me.index = null; + me.length = null; + me.totalTimes = null; + } + + me.url = null; + me.options = null; + me._processSuccess = null; + me._processFailed = null; + me.isInTheSameDomain = null; + me.EVENT_TYPES = null; + + if (me.events) { + me.events.destroy(); + me.events = null; + } + + if (me.eventListeners) { + me.eventListeners = null; + } + } + /** + * @function CommonServiceBase.prototype.request + * @description: 该方法用于向服务发送请求。 + * @param {Object} options - 参数。 + * @param {string} [options.method='GET'] - 请求方式,包括 "GET","POST","PUT","DELETE"。 + * @param {string} [options.url] - 发送请求的地址。 + * @param {Object} [options.params] - 作为查询字符串添加到 URL 中的一组键值对,此参数只适用于 GET 方式发送的请求。 + * @param {string} [options.data] - 发送到服务器的数据。 + * @param {function} options.success - 请求成功后的回调函数。 + * @param {function} options.failure - 请求失败后的回调函数。 + * @param {Object} [options.scope] - 如果回调函数是对象的一个公共方法,设定该对象的范围。 + * @param {boolean} [options.isInTheSameDomain] - 请求是否在当前域中。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + */ + + }, { + key: "request", + value: function request(options) { + var me = this; + options.url = options.url || me.url; + options.proxy = options.proxy || me.proxy; + options.withCredentials = options.withCredentials != undefined ? options.withCredentials : me.withCredentials; + options.crossOrigin = options.crossOrigin != undefined ? options.crossOrigin : me.crossOrigin; + options.headers = options.headers || me.headers; + options.isInTheSameDomain = me.isInTheSameDomain; //为url添加安全认证信息片段 + + options.url = SecurityManager.appendCredential(options.url); + me.calculatePollingTimes(); + me._processSuccess = options.success; + me._processFailed = options.failure; + options.scope = me; + options.success = me.getUrlCompleted; + options.failure = me.getUrlFailed; + me.options = options; + + me._commit(me.options); + } + /** + * @function CommonServiceBase.prototype.getUrlCompleted + * @description 请求成功后执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "getUrlCompleted", + value: function getUrlCompleted(result) { + var me = this; + + me._processSuccess(result); + } + /** + * @function CommonServiceBase.prototype.getUrlFailed + * @description 请求失败后执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "getUrlFailed", + value: function getUrlFailed(result) { + var me = this; + + if (me.totalTimes > 0) { + me.totalTimes--; + me.ajaxPolling(); + } else { + me._processFailed(result); + } + } + /** + * + * @function CommonServiceBase.prototype.ajaxPolling + * @description 请求失败后,如果剩余请求失败次数不为 0,重新获取 URL 发送请求 + */ + + }, { + key: "ajaxPolling", + value: function ajaxPolling() { + var me = this, + url = me.options.url, + re = /^http:\/\/([a-z]{9}|(\d+\.){3}\d+):\d{0,4}/; + me.index = parseInt(Math.random() * me.length); + me.url = me.urls[me.index]; + url = url.replace(re, re.exec(me.url)[0]); + me.options.url = url; + me.options.isInTheSameDomain = Util.isInTheSameDomain(url); + + me._commit(me.options); + } + /** + * @function CommonServiceBase.prototype.calculatePollingTimes + * @description 计算剩余请求失败执行次数。 + */ + + }, { + key: "calculatePollingTimes", + value: function calculatePollingTimes() { + var me = this; + + if (me.times) { + if (me.totalTimes > me.POLLING_TIMES) { + if (me.times > me.POLLING_TIMES) { + me.totalTimes = me.POLLING_TIMES; + } else { + me.totalTimes = me.times; + } + } else { + if (me.times < me.totalTimes) { + me.totalTimes = me.times; + } + } + } else { + if (me.totalTimes > me.POLLING_TIMES) { + me.totalTimes = me.POLLING_TIMES; + } + } + + me.totalTimes--; + } + /** + * @function CommonServiceBase.prototype.isServiceSupportPolling + * @description 判断服务是否支持轮询。 + */ + + }, { + key: "isServiceSupportPolling", + value: function isServiceSupportPolling() { + var me = this; + return !(me.CLASS_NAME === 'SuperMap.REST.ThemeService' || me.CLASS_NAME === 'SuperMap.REST.EditFeaturesService'); + } + /** + * @function CommonServiceBase.prototype.serviceProcessCompleted + * @description 状态完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + result = Util.transformResult(result); + this.events.triggerEvent('processCompleted', { + result: result + }); + } + /** + * @function CommonServiceBase.prototype.serviceProcessFailed + * @description 状态失败,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessFailed", + value: function serviceProcessFailed(result) { + result = Util.transformResult(result); + var error = result.error || result; + this.events.triggerEvent('processFailed', { + error: error + }); + } + }, { + key: "_commit", + value: function _commit(options) { + if (options.method === 'POST' || options.method === 'PUT' || options.method === 'PATCH') { + if (options.params) { + options.url = Util.urlAppend(options.url, Util.getParameterString(options.params || {})); + } + + if (CommonServiceBase_typeof(options.data) === 'object') { + try { + options.params = Util.toJSON(options.data); + } catch (e) { + console.log('不是json对象'); + } + } else { + options.params = options.data; + } + } + + FetchRequest.commit(options.method, options.url, options.params, { + headers: options.headers, + withCredentials: options.withCredentials, + crossOrigin: options.crossOrigin, + timeout: options.async ? 0 : null, + proxy: options.proxy + }).then(function (response) { + if (response.text) { + return response.text(); + } + + if (response.json) { + return response.json(); + } + + return response; + }).then(function (text) { + var requestResult = text; + + if (typeof text === 'string') { + requestResult = new JSONFormat().read(text); + } + + if (!requestResult || requestResult.error || requestResult.code >= 300 && requestResult.code !== 304) { + if (requestResult && requestResult.error) { + requestResult = { + error: requestResult.error + }; + } else { + requestResult = { + error: requestResult + }; + } + } + + return requestResult; + })["catch"](function (e) { + return { + error: e + }; + }).then(function (requestResult) { + if (requestResult.error) { + var failure = options.scope ? FunctionExt.bind(options.failure, options.scope) : options.failure; + failure(requestResult); + } else { + requestResult.succeed = requestResult.succeed == undefined ? true : requestResult.succeed; + var success = options.scope ? FunctionExt.bind(options.success, options.scope) : options.success; + success(requestResult); + } + }); + } + }]); + + return CommonServiceBase; +}(); +/** + * 服务器请求回调函数 + * @callback RequestCallback + * @category BaseTypes Util + * @example + * var requestCallback = function (serviceResult){ + * console.log(serviceResult.result); + * } + * new QueryService(url).queryByBounds(param, requestCallback); + * @param {Object} serviceResult + * @param {Object} serviceResult.result 服务器返回结果。 + * @param {Object} serviceResult.object 发布应用程序事件的对象。 + * @param {Object} serviceResult.type 事件类型。 + * @param {Object} serviceResult.element 接受浏览器事件的 DOM 节点。 + */ +;// CONCATENATED MODULE: ./src/common/iServer/GeoCodingParameter.js +function GeoCodingParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoCodingParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoCodingParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoCodingParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoCodingParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeoCodingParameter + * @deprecatedclass SuperMap.GeoCodingParameter + * @category iServer AddressMatch + * @classdesc 地理正向匹配参数类。 + * @param {Object} options - 参数。 + * @param {string} options.address - 地点关键词。 + * @param {number} [options.fromIndex] - 设置返回对象的起始索引值。 + * @param {number} [options.toIndex] - 设置返回对象的结束索引值。 + * @param {Array.} [options.filters] - 过滤字段,限定查询区域。 + * @param {string} [options.prjCoordSys] - 查询结果的坐标系。 + * @param {number} [options.maxReturn] - 最大返回结果数。 + * @usage + */ + +var GeoCodingParameter = /*#__PURE__*/function () { + function GeoCodingParameter(options) { + GeoCodingParameter_classCallCheck(this, GeoCodingParameter); + + if (options.filters && typeof options.filters === 'string') { + options.filters = options.filters.split(','); + } + /** + * @member {string} GeoCodingParameter.prototype.address + * @description 地点关键词。 + */ + + + this.address = null; + /** + * @member {number} [GeoCodingParameter.prototype.fromIndex] + * @description 设置返回对象的起始索引值。 + */ + + this.fromIndex = null; + /** + * @member {number} [GeoCodingParameter.prototype.toIndex] + * @description 设置返回对象的结束索引值。 + */ + + this.toIndex = null; + /** + * @member {Array.} [GeoCodingParameter.prototype.filters] + * @description 过滤字段,限定查询区域。 + */ + + this.filters = null; + /** + * @member {string} [GeoCodingParameter.prototype.prjCoordSys] + * @description 查询结果的坐标系。 + */ + + this.prjCoordSys = null; + /** + * @member {number} [GeoCodingParameter.prototype.maxReturn] + * @description 最大返回结果数。 + */ + + this.maxReturn = null; + Util.extend(this, options); + } + /** + * @function GeoCodingParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GeoCodingParameter_createClass(GeoCodingParameter, [{ + key: "destroy", + value: function destroy() { + this.address = null; + this.fromIndex = null; + this.toIndex = null; + this.filters = null; + this.prjCoordSys = null; + this.maxReturn = null; + } + }]); + + return GeoCodingParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/GeoDecodingParameter.js +function GeoDecodingParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoDecodingParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoDecodingParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoDecodingParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoDecodingParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeoDecodingParameter + * @deprecatedclass SuperMap.GeoDecodingParameter + * @category iServer AddressMatch + * @classdesc 地理反向匹配参数类。 + * @param {Object} options - 参数。 + * @param {number} options.x - 查询位置的横坐标。 + * @param {number} options.y - 查询位置的纵坐标。 + * @param {number} [options.fromIndex] - 设置返回对象的起始索引值。 + * @param {Array.} [options.filters] - 过滤字段,限定查询区域。 + * @param {string} [options.prjCoordSys] - 查询结果的坐标系。 + * @param {number} [options.maxReturn] - 最大返回结果数。 + * @param {number} [options.geoDecodingRadius] - 查询半径。 + * @usage + */ + +var GeoDecodingParameter = /*#__PURE__*/function () { + function GeoDecodingParameter(options) { + GeoDecodingParameter_classCallCheck(this, GeoDecodingParameter); + + if (options.filters) { + options.filters = options.filters.split(','); + } + /** + * @member {number} GeoDecodingParameter.prototype.x + * @description 查询位置的横坐标。 + */ + + + this.x = null; + /** + * @member {number} GeoDecodingParameter.prototype.y + * @description 查询位置的纵坐标。 + */ + + this.y = null; + /** + * @member {number} [GeoDecodingParameter.prototype.fromIndex] + * @description 设置返回对象的起始索引值。 + */ + + this.fromIndex = null; + /** + * @member {number} [GeoDecodingParameter.prototype.toIndex] + * @description 设置返回对象的结束索引值。 + */ + + this.toIndex = null; + /** + * @member {Array.} [GeoDecodingParameter.prototype.filters] + * @description 过滤字段,限定查询区域。 + */ + + this.filters = null; + /** + * @member {string} [GeoDecodingParameter.prototype.prjCoordSys] + * @description 查询结果的坐标系。 + */ + + this.prjCoordSys = null; + /** + * @member {number} [GeoDecodingParameter.prototype.maxReturn] + * @description 最大返回结果数。 + */ + + this.maxReturn = null; + /** + * @member {number} GeoDecodingParameter.prototype.geoDecodingRadius + * @description 查询半径。 + */ + + this.geoDecodingRadius = null; + Util.extend(this, options); + } + /** + * @function GeoDecodingParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GeoDecodingParameter_createClass(GeoDecodingParameter, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.fromIndex = null; + this.toIndex = null; + this.filters = null; + this.prjCoordSys = null; + this.maxReturn = null; + this.geoDecodingRadius = null; + } + }]); + + return GeoDecodingParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/AddressMatchService.js +function AddressMatchService_typeof(obj) { "@babel/helpers - typeof"; return AddressMatchService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, AddressMatchService_typeof(obj); } + +function AddressMatchService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AddressMatchService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AddressMatchService_createClass(Constructor, protoProps, staticProps) { if (protoProps) AddressMatchService_defineProperties(Constructor.prototype, protoProps); if (staticProps) AddressMatchService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function AddressMatchService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { AddressMatchService_get = Reflect.get; } else { AddressMatchService_get = function _get(target, property, receiver) { var base = AddressMatchService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return AddressMatchService_get.apply(this, arguments); } + +function AddressMatchService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = AddressMatchService_getPrototypeOf(object); if (object === null) break; } return object; } + +function AddressMatchService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) AddressMatchService_setPrototypeOf(subClass, superClass); } + +function AddressMatchService_setPrototypeOf(o, p) { AddressMatchService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return AddressMatchService_setPrototypeOf(o, p); } + +function AddressMatchService_createSuper(Derived) { var hasNativeReflectConstruct = AddressMatchService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = AddressMatchService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = AddressMatchService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return AddressMatchService_possibleConstructorReturn(this, result); }; } + +function AddressMatchService_possibleConstructorReturn(self, call) { if (call && (AddressMatchService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return AddressMatchService_assertThisInitialized(self); } + +function AddressMatchService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function AddressMatchService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function AddressMatchService_getPrototypeOf(o) { AddressMatchService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return AddressMatchService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class AddressMatchService + * @deprecatedclass SuperMap.AddressMatchService + * @category iServer AddressMatch + * @classdesc 地址匹配服务,包括正向匹配和反向匹配。 + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var AddressMatchService = /*#__PURE__*/function (_CommonServiceBase) { + AddressMatchService_inherits(AddressMatchService, _CommonServiceBase); + + var _super = AddressMatchService_createSuper(AddressMatchService); + + function AddressMatchService(url, options) { + var _this; + + AddressMatchService_classCallCheck(this, AddressMatchService); + + _this = _super.call(this, url, options); + _this.options = options || {}; + _this.CLASS_NAME = 'SuperMap.AddressMatchService'; + return _this; + } + /** + * @function AddressMatchService.prototype.destroy + * @override + */ + + + AddressMatchService_createClass(AddressMatchService, [{ + key: "destroy", + value: function destroy() { + AddressMatchService_get(AddressMatchService_getPrototypeOf(AddressMatchService.prototype), "destroy", this).call(this); + } + /** + * @function AddressMatchService.prototype.code + * @param {string} url - 正向地址匹配服务地址。 + * @param {GeoCodingParameter} params - 正向地址匹配服务参数。 + */ + + }, { + key: "code", + value: function code(url, params) { + if (!(params instanceof GeoCodingParameter)) { + return; + } + + this.processAsync(url, params); + } + /** + * @function AddressMatchService.prototype.decode + * @param {string} url - 反向地址匹配服务地址。 + * @param {GeoDecodingParameter} params - 反向地址匹配服务参数。 + */ + + }, { + key: "decode", + value: function decode(url, params) { + if (!(params instanceof GeoDecodingParameter)) { + return; + } + + this.processAsync(url, params); + } + /** + * @function AddressMatchService.prototype.processAsync + * @description 负责将客户端的动态分段服务参数传递到服务端。 + * @param {string} url - 服务地址。 + * @param {Object} params - 参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(url, params) { + this.request({ + method: 'GET', + url: url, + params: params, + scope: this, + success: this.serviceProcessCompleted, + failure: this.serviceProcessFailed + }); + } + /** + * @function AddressMatchService.prototype.serviceProcessCompleted + * @param {Object} result - 服务器返回的结果对象。 + * @description 服务流程是否完成 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + if (result.succeed) { + delete result.succeed; + } + + AddressMatchService_get(AddressMatchService_getPrototypeOf(AddressMatchService.prototype), "serviceProcessCompleted", this).call(this, result); + } + /** + * @function AddressMatchService.prototype.serviceProcessCompleted + * @param {Object} result - 服务器返回的结果对象。 + * @description 服务流程是否失败 + */ + + }, { + key: "serviceProcessFailed", + value: function serviceProcessFailed(result) { + AddressMatchService_get(AddressMatchService_getPrototypeOf(AddressMatchService.prototype), "serviceProcessFailed", this).call(this, result); + } + }]); + + return AddressMatchService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/AggregationParameter.js +function AggregationParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AggregationParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AggregationParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) AggregationParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) AggregationParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class AggregationParameter + * @deprecatedclass SuperMap.AggregationParameter + * @classdesc 聚合查询参数设置,该参数仅支持数据来源 Elasticsearch 服务的数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 参数。 + * @param {string} options.aggName - 聚合名称。 + * @param {string} options.aggFieldName - 聚合字段。 + * @usage + */ + +var AggregationParameter = /*#__PURE__*/function () { + function AggregationParameter(options) { + AggregationParameter_classCallCheck(this, AggregationParameter); + + /** + * @member {string} AggregationParameter.prototype.aggName + * @description 聚合名称。 + */ + this.aggName = null; + /** + * @member {string} AggregationParameter.prototype.aggFieldName + * @description 聚合字段。 + */ + + this.aggFieldName = null; + this.CLASS_NAME = 'SuperMap.AggregationParameter'; + Util.extend(this, options); + } + + AggregationParameter_createClass(AggregationParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.aggName = null; + me.aggFieldName = null; + me.aggType = null; + } + }]); + + return AggregationParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/BucketAggParameter.js +function BucketAggParameter_typeof(obj) { "@babel/helpers - typeof"; return BucketAggParameter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, BucketAggParameter_typeof(obj); } + +function BucketAggParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BucketAggParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BucketAggParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) BucketAggParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) BucketAggParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function BucketAggParameter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) BucketAggParameter_setPrototypeOf(subClass, superClass); } + +function BucketAggParameter_setPrototypeOf(o, p) { BucketAggParameter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return BucketAggParameter_setPrototypeOf(o, p); } + +function BucketAggParameter_createSuper(Derived) { var hasNativeReflectConstruct = BucketAggParameter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = BucketAggParameter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = BucketAggParameter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return BucketAggParameter_possibleConstructorReturn(this, result); }; } + +function BucketAggParameter_possibleConstructorReturn(self, call) { if (call && (BucketAggParameter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return BucketAggParameter_assertThisInitialized(self); } + +function BucketAggParameter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function BucketAggParameter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function BucketAggParameter_getPrototypeOf(o) { BucketAggParameter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return BucketAggParameter_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class BucketAggParameter + * @deprecatedclass SuperMap.BucketAggParameter + * @classdesc 子聚合类查询参数设置,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 参数。 + * @param {Array.} options.subAggs - 子聚合类集合。 + * @extends {AggregationParameter} + * @usage + */ + +var BucketAggParameter = /*#__PURE__*/function (_AggregationParameter) { + BucketAggParameter_inherits(BucketAggParameter, _AggregationParameter); + + var _super = BucketAggParameter_createSuper(BucketAggParameter); + + function BucketAggParameter(options) { + var _this; + + BucketAggParameter_classCallCheck(this, BucketAggParameter); + + _this = _super.call(this); + /** + * @member {Array.} BucketAggParameter.prototype.subAggs + * @description 子聚合类集合。 + */ + + _this.subAggs = null; + _this.aggType = null; + _this.CLASS_NAME = 'SuperMap.BucketAggParameter'; + Util.extend(BucketAggParameter_assertThisInitialized(_this), options); + return _this; + } + + BucketAggParameter_createClass(BucketAggParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.subAggs) { + me.subAggs = null; + } + } + }]); + + return BucketAggParameter; +}(AggregationParameter); +;// CONCATENATED MODULE: ./src/common/iServer/MetricsAggParameter.js +function MetricsAggParameter_typeof(obj) { "@babel/helpers - typeof"; return MetricsAggParameter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MetricsAggParameter_typeof(obj); } + +function MetricsAggParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MetricsAggParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MetricsAggParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) MetricsAggParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) MetricsAggParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MetricsAggParameter_get() { if (typeof Reflect !== "undefined" && Reflect.get) { MetricsAggParameter_get = Reflect.get; } else { MetricsAggParameter_get = function _get(target, property, receiver) { var base = MetricsAggParameter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return MetricsAggParameter_get.apply(this, arguments); } + +function MetricsAggParameter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = MetricsAggParameter_getPrototypeOf(object); if (object === null) break; } return object; } + +function MetricsAggParameter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MetricsAggParameter_setPrototypeOf(subClass, superClass); } + +function MetricsAggParameter_setPrototypeOf(o, p) { MetricsAggParameter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MetricsAggParameter_setPrototypeOf(o, p); } + +function MetricsAggParameter_createSuper(Derived) { var hasNativeReflectConstruct = MetricsAggParameter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MetricsAggParameter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MetricsAggParameter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MetricsAggParameter_possibleConstructorReturn(this, result); }; } + +function MetricsAggParameter_possibleConstructorReturn(self, call) { if (call && (MetricsAggParameter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MetricsAggParameter_assertThisInitialized(self); } + +function MetricsAggParameter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MetricsAggParameter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MetricsAggParameter_getPrototypeOf(o) { MetricsAggParameter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MetricsAggParameter_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class MetricsAggParameter + * @deprecatedclass SuperMap.MetricsAggParameter + * @classdesc 指标聚合查询参数类,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 可选参数。 + * @param {MetricsAggType} [options.aggType = 'avg'] - 聚合类型。 + * @extends {AggregationParameter} + * @usage + */ + +var MetricsAggParameter = /*#__PURE__*/function (_AggregationParameter) { + MetricsAggParameter_inherits(MetricsAggParameter, _AggregationParameter); + + var _super = MetricsAggParameter_createSuper(MetricsAggParameter); + + function MetricsAggParameter(option) { + var _this; + + MetricsAggParameter_classCallCheck(this, MetricsAggParameter); + + _this = _super.call(this); + /** + * @member {MetricsAggType} [MetricsAggParameter.prototype.aggType=MetricsAggType.AVG] + * @description 指标聚合类型。 + */ + + _this.aggType = MetricsAggType.AVG; + Util.extend(MetricsAggParameter_assertThisInitialized(_this), option); + _this.CLASS_NAME = 'SuperMap.MetricsAggParameter'; + return _this; + } + + MetricsAggParameter_createClass(MetricsAggParameter, [{ + key: "destroy", + value: function destroy() { + MetricsAggParameter_get(MetricsAggParameter_getPrototypeOf(MetricsAggParameter.prototype), "destroy", this).call(this); + + var me = this; + me.aggType = null; + } + }]); + + return MetricsAggParameter; +}(AggregationParameter); +;// CONCATENATED MODULE: ./src/common/iServer/AreaSolarRadiationParameters.js +function AreaSolarRadiationParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AreaSolarRadiationParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AreaSolarRadiationParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) AreaSolarRadiationParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) AreaSolarRadiationParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class AreaSolarRadiationParameters + * @deprecatedclass SuperMap.AreaSolarRadiationParameters + * @category iServer SpatialAnalyst SolarRadiationAnalyst + * @classdesc 地区太阳辐射参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做地区太阳辐射数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"的形式来表示,例如:JingjinTerrain@Jingjin。 + * @param {string} options.targetDatasourceName - 指定的存储结果数据集的数据源名称, 例如:"Jingjin"。 + * @param {string} options.totalGridName - 指定地区太阳辐射总辐射量数据集的名称。 + * @param {string} options.diffuseDatasetGridName - 指定地区太阳辐射散射辐射量数据集的名称。 + * @param {string} options.durationDatasetGridName - 指定地区太阳辐射太阳直射持续时间数据集的名称。 + * @param {string} options.directDatasetGridName - 指定地区太阳辐射直射辐射量数据集的名称。 + * @param {number} options.latitude - 待计算区域的纬度值。 + * @param {string} [options.timeMode = 'MULTIDAYS'] - 时间模式。可选值"WITHINDAY"(单日)或"MULTIDAYS"(多日)。 + * @param {number} options.dayStart - 起始日期(年内的第几天)。 + * @param {number} options.dayEnd - 结束日期(年内的第几天)。 + * @param {number} [options.hourStart] - 起始时间(一天中的第几个小时)。 + * @param {number} [options.hourEnd] - 结束时间(一天中的第几个小时)。 + * @param {number} [options.transmittance] - 太阳辐射穿过大气的透射率。 + * @param {number} [options.hourInterval=0.5] - 计算时的小时间隔(设置的越小计算量越大并且计算结果更精确,如果修改此参数,必须使用整数)。 + * @param {number} [options.dayInterval=5] - 计算时的天数间隔(设置的越小计算量越大并且计算结果更精确,必须使用整数)。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ + +var AreaSolarRadiationParameters = /*#__PURE__*/function () { + function AreaSolarRadiationParameters(options) { + AreaSolarRadiationParameters_classCallCheck(this, AreaSolarRadiationParameters); + + /** + * @member {string} AreaSolarRadiationParameters.prototype.dataset + * @description 要用来做地区太阳辐射数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示,例如:JingjinTerrain@Jingjin。注:地区太阳辐射数据必须为栅格数据集。 + */ + this.dataset = null; + /** + * @member {string} AreaSolarRadiationParameters.prototype.targetDatasourceName + * @description 指定的存储结果数据集的数据源名称,例如:"Jingjin"。 + */ + + this.targetDatasourceName = null; + /** + * @member {string} AreaSolarRadiationParameters.prototype.totalGridName + * @description 指定地区太阳辐射总辐射量数据集的名称。 + */ + + this.totalGridName = null; + /** + * @member {string} AreaSolarRadiationParameters.prototype.diffuseDatasetGridName + * @description 指定地区太阳辐射散射辐射量数据集的名称。 + */ + + this.diffuseDatasetGridName = null; + /** + * @member {string} AreaSolarRadiationParameters.prototype.durationDatasetGridName + * @description 指定地区太阳辐射太阳直射持续时间数据集的名称。 + */ + + this.durationDatasetGridName = null; + /** + * @member {string} AreaSolarRadiationParameters.prototype.directDatasetGridName + * @description 指定地区太阳辐射直射辐射量数据集的名称。 + */ + + this.directDatasetGridName = null; + /** + * @member {number} AreaSolarRadiationParameters.prototype.latitude + * @description 待计算区域的纬度值。 + */ + + this.latitude = null; + /** + * @member {string} [AreaSolarRadiationParameters.prototype.timeMode='MULTIDAYS'] + * @description 时间模式。可选值"WITHINDAY"(单日)或"MULTIDAYS"(多日)。 + */ + + this.timeMode = "MULTIDAYS"; + /** + * @member {number} AreaSolarRadiationParameters.prototype.dayStart + * @description 起始日期(年内的第几天)。 + */ + + this.dayStart = null; + /** + * @member {number} AreaSolarRadiationParameters.prototype.dayEnd + * @description 结束日期(年内的第几天)。 + */ + + this.dayEnd = null; + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourStart] + * @description 起始时间(一天中的第几个小时)。 + */ + + this.hourStart = null; + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourEnd] + * @description 结束时间(一天中的第几个小时)。 + */ + + this.hourEnd = null; + /** + * @member {number} [AreaSolarRadiationParameters.prototype.transmittance] + * @description 太阳辐射穿过大气的透射率。 + */ + + this.transmittance = null; + /** + * @member {number} [AreaSolarRadiationParameters.prototype.hourInterval=0.5] + * @description 计算时的小时间隔(设置的越小计算量越大并且计算结果更精确, 如果修改此参数,必须使用整数) + */ + + this.hourInterval = null; + /** + * @member {number} [AreaSolarRadiationParameters.prototype.dayInterval=5] + * @description 计算时的天数间隔(设置的越小计算量越大并且计算结果更精确, 必须使用整数) + */ + + this.dayInterval = null; + /** + * @member {boolean} [AreaSolarRadiationParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + + this.deleteExistResultDataset = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.AreaSolarRadiationParameters"; + } + /** + * @function AreaSolarRadiationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + AreaSolarRadiationParameters_createClass(AreaSolarRadiationParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dataset = null; + me.zFactor = 1.0; + me.averageCurvatureName = null; + me.profileCurvatureName = null; + me.planCurvatureName = null; + me.deleteExistResultDataset = true; + } + /** + * @function AreaSolarRadiationParameters.toObject + * @param {AreaSolarRadiationParameters} param - 地区太阳辐射参数类。 + * @param {AreaSolarRadiationParameters} tempObj - 地区太阳辐射参数对象。 + * @returns {Object} JSON对象。 + * @description 将AreaSolarRadiationParameters对象转换成JSON对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(param, tempObj) { + var parameter = {}; + + for (var name in param) { + if (name !== "dataset") { + var name1 = name === "latitude" || name === "timeMode" || name === "dayStart"; + var name2 = name === "dayEnd" || name === "hourStart" || name === "hourEnd"; + var name3 = name === "transmittance" || name === "hourInterval" || name === "dayInterval"; + + if (name1 || name2 || name3) { + parameter[name] = param[name]; + } else { + tempObj[name] = param[name]; + } + } + } + + tempObj["parameter"] = parameter; + } + }]); + + return AreaSolarRadiationParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SpatialAnalystBase.js +function SpatialAnalystBase_typeof(obj) { "@babel/helpers - typeof"; return SpatialAnalystBase_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SpatialAnalystBase_typeof(obj); } + +function SpatialAnalystBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SpatialAnalystBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SpatialAnalystBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) SpatialAnalystBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) SpatialAnalystBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SpatialAnalystBase_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SpatialAnalystBase_get = Reflect.get; } else { SpatialAnalystBase_get = function _get(target, property, receiver) { var base = SpatialAnalystBase_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SpatialAnalystBase_get.apply(this, arguments); } + +function SpatialAnalystBase_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SpatialAnalystBase_getPrototypeOf(object); if (object === null) break; } return object; } + +function SpatialAnalystBase_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SpatialAnalystBase_setPrototypeOf(subClass, superClass); } + +function SpatialAnalystBase_setPrototypeOf(o, p) { SpatialAnalystBase_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SpatialAnalystBase_setPrototypeOf(o, p); } + +function SpatialAnalystBase_createSuper(Derived) { var hasNativeReflectConstruct = SpatialAnalystBase_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SpatialAnalystBase_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SpatialAnalystBase_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SpatialAnalystBase_possibleConstructorReturn(this, result); }; } + +function SpatialAnalystBase_possibleConstructorReturn(self, call) { if (call && (SpatialAnalystBase_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SpatialAnalystBase_assertThisInitialized(self); } + +function SpatialAnalystBase_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SpatialAnalystBase_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SpatialAnalystBase_getPrototypeOf(o) { SpatialAnalystBase_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SpatialAnalystBase_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SpatialAnalystBase + * @deprecatedclass SuperMap.SpatialAnalystBase + * @category iServer Core + * @classdesc 空间分析服务基类。 + * @param {string} url - 地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ + +var SpatialAnalystBase = /*#__PURE__*/function (_CommonServiceBase) { + SpatialAnalystBase_inherits(SpatialAnalystBase, _CommonServiceBase); + + var _super = SpatialAnalystBase_createSuper(SpatialAnalystBase); + + function SpatialAnalystBase(url, options) { + var _this; + + SpatialAnalystBase_classCallCheck(this, SpatialAnalystBase); + + _this = _super.call(this, url, options); + /** + * @member {DataFormat} [SpatialAnalystBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为 "ISERVER","GEOJSON"。 + */ + + _this.format = DataFormat.GEOJSON; + _this.CLASS_NAME = "SuperMap.SpatialAnalystBase"; + return _this; + } + /** + * @function SpatialAnalystBase.prototype.destroy + * @override + */ + + + SpatialAnalystBase_createClass(SpatialAnalystBase, [{ + key: "destroy", + value: function destroy() { + SpatialAnalystBase_get(SpatialAnalystBase_getPrototypeOf(SpatialAnalystBase.prototype), "destroy", this).call(this); + + this.format = null; + } + /** + * @function SpatialAnalystBase.prototype.serviceProcessCompleted + * @description 分析完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this, + analystResult; + result = Util.transformResult(result); + + if (result && me.format === DataFormat.GEOJSON && typeof me.toGeoJSONResult === 'function') { + //批量分析时会返回多个结果 + if (Util.isArray(result)) { + for (var i = 0; i < result.length; i++) { + result[i] = me.toGeoJSONResult(result[i]); + } + + analystResult = result; + } else { + analystResult = me.toGeoJSONResult(result); + } + } + + if (!analystResult) { + analystResult = result; + } + + me.events.triggerEvent("processCompleted", { + result: analystResult + }); + } + /** + * @function SpatialAnalystBase.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + * + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result) { + return null; + } //批量叠加分析时结果这样处理 + + + if (result.result && result.result.resultGeometry) { + result = result.result; + } + + var geoJSONFormat = new GeoJSON(); + + if (result.recordsets) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + } else if (result.recordset && result.recordset.features) { + result.recordset.features = geoJSONFormat.toGeoJSON(result.recordset.features); + } + + if (result.resultGeometry) { + result.resultGeometry = geoJSONFormat.toGeoJSON(result.resultGeometry); + } + + if (result.regions) { + result.regions = geoJSONFormat.toGeoJSON(result.regions); + } + + return result; + } + }]); + + return SpatialAnalystBase; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/AreaSolarRadiationService.js +function AreaSolarRadiationService_typeof(obj) { "@babel/helpers - typeof"; return AreaSolarRadiationService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, AreaSolarRadiationService_typeof(obj); } + +function AreaSolarRadiationService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AreaSolarRadiationService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AreaSolarRadiationService_createClass(Constructor, protoProps, staticProps) { if (protoProps) AreaSolarRadiationService_defineProperties(Constructor.prototype, protoProps); if (staticProps) AreaSolarRadiationService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function AreaSolarRadiationService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { AreaSolarRadiationService_get = Reflect.get; } else { AreaSolarRadiationService_get = function _get(target, property, receiver) { var base = AreaSolarRadiationService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return AreaSolarRadiationService_get.apply(this, arguments); } + +function AreaSolarRadiationService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = AreaSolarRadiationService_getPrototypeOf(object); if (object === null) break; } return object; } + +function AreaSolarRadiationService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) AreaSolarRadiationService_setPrototypeOf(subClass, superClass); } + +function AreaSolarRadiationService_setPrototypeOf(o, p) { AreaSolarRadiationService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return AreaSolarRadiationService_setPrototypeOf(o, p); } + +function AreaSolarRadiationService_createSuper(Derived) { var hasNativeReflectConstruct = AreaSolarRadiationService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = AreaSolarRadiationService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = AreaSolarRadiationService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return AreaSolarRadiationService_possibleConstructorReturn(this, result); }; } + +function AreaSolarRadiationService_possibleConstructorReturn(self, call) { if (call && (AreaSolarRadiationService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return AreaSolarRadiationService_assertThisInitialized(self); } + +function AreaSolarRadiationService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function AreaSolarRadiationService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function AreaSolarRadiationService_getPrototypeOf(o) { AreaSolarRadiationService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return AreaSolarRadiationService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class AreaSolarRadiationService + * @deprecatedclass SuperMap.AreaSolarRadiationService + * @category iServer SpatialAnalyst SolarRadiationAnalyst + * @classdesc 地区太阳辐射服务类。 + * @param {string} url - 服务的访问地址。如:
http://localhost:8090/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst。
+ * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myAreaSolarRadiationService = new AreaSolarRadiationService(url); + * myAreaSolarRadiationService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ + +var AreaSolarRadiationService = /*#__PURE__*/function (_SpatialAnalystBase) { + AreaSolarRadiationService_inherits(AreaSolarRadiationService, _SpatialAnalystBase); + + var _super = AreaSolarRadiationService_createSuper(AreaSolarRadiationService); + + function AreaSolarRadiationService(url, options) { + var _this; + + AreaSolarRadiationService_classCallCheck(this, AreaSolarRadiationService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.AreaSolarRadiationService"; + return _this; + } + /** + * @function AreaSolarRadiationService.prototype.destroy + * @override + */ + + + AreaSolarRadiationService_createClass(AreaSolarRadiationService, [{ + key: "destroy", + value: function destroy() { + AreaSolarRadiationService_get(AreaSolarRadiationService_getPrototypeOf(AreaSolarRadiationService.prototype), "destroy", this).call(this); + } + /** + * @function AreaSolarRadiationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {AreaSolarRadiationParameters} parameter - 地区太阳辐射参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + if (!(parameter instanceof AreaSolarRadiationParameters)) { + return; + } + + var me = this; + var parameterObject = {}; + + if (parameter instanceof AreaSolarRadiationParameters) { + me.url = Util.urlPathAppend(me.url, "datasets/".concat(parameter.dataset, "/solarradiation")); + } + + me.url = Util.urlAppend(me.url, 'returnContent=true'); + AreaSolarRadiationParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.request({ + method: 'POST', + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return AreaSolarRadiationService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/BufferDistance.js +function BufferDistance_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BufferDistance_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BufferDistance_createClass(Constructor, protoProps, staticProps) { if (protoProps) BufferDistance_defineProperties(Constructor.prototype, protoProps); if (staticProps) BufferDistance_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class BufferDistance + * @deprecatedclass SuperMap.BufferDistance + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析的缓冲距离类。通过该类可以设置缓冲区分析的缓冲距离,距离可以是数值也可以是数值型的字段表达式。 + * @param {Object} options - 可选参数。 + * @param {string} [options.exp] - 以数值型的字段表达式作为缓冲区分析的距离值。 + * @param {number} [options.value=100] - 以数值作为缓冲区分析的距离值。单位:米。 + * @usage + */ + +var BufferDistance = /*#__PURE__*/function () { + function BufferDistance(options) { + BufferDistance_classCallCheck(this, BufferDistance); + + /** + * @member {string} [BufferDistance.prototype.exp] + * @description 以数值型的字段表达式作为缓冲区分析的距离值。 + */ + this.exp = null; + /** + * @member {number} [BufferDistance.prototype.value=100] + * @description 以数值作为缓冲区分析的距离值。单位:米。 + */ + + this.value = 100; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.BufferDistance"; + } + /** + * @function BufferDistance.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + BufferDistance_createClass(BufferDistance, [{ + key: "destroy", + value: function destroy() { + this.exp = null; + this.value = null; + } + }]); + + return BufferDistance; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/BufferSetting.js +function BufferSetting_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BufferSetting_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BufferSetting_createClass(Constructor, protoProps, staticProps) { if (protoProps) BufferSetting_defineProperties(Constructor.prototype, protoProps); if (staticProps) BufferSetting_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BufferSetting + * @deprecatedclass SuperMap.BufferSetting + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析通用设置类。 + * @param {Object} options - 可选参数。 + * @param {BufferEndType} [options.endType=BufferEndType.FLAT] - 缓冲区端点枚举值。 + * @param {BufferDistance} [options.leftDistance=100] - 左侧缓冲距离。 + * @param {BufferDistance} [options.rightDistance=100] - 右侧缓冲距离。 + * @param {number} [options.semicircleLineSegment=4] - 圆头缓冲圆弧处线段的个数。 + * @param {BufferRadiusUnit} [options.radiusUnit=BufferRadiusUnit.METER] - 缓冲半径单位。 + * @usage + */ + +var BufferSetting = /*#__PURE__*/function () { + function BufferSetting(options) { + BufferSetting_classCallCheck(this, BufferSetting); + + /** + * @member {BufferEndType} [BufferSetting.prototype.endType = BufferEndType.FLAT] + * @description 缓冲区端点枚举值。分为平头和圆头两种。 + */ + this.endType = BufferEndType.FLAT; + /** + * @member {BufferDistance} [BufferSetting.prototype.leftDistance=100] + * @description 左侧缓冲距离。 + * 当为 GeometryBufferAnalyst 时,单位为默认地图的投影系的单位(如3857为米,4326为度), + * 当为 DatasetBufferAnalyst 时,单位通过{@link BufferSetting.radiusUnit}设置(默认全部为米)。 + */ + + this.leftDistance = new BufferDistance(); + /** + * @member {BufferDistance} [BufferSetting.prototype.rightDistance=100] + * @description 右侧缓冲距离。 + * 当为 GeometryBufferAnalyst 时,单位为默认地图的投影系的单位(如3857为米,4326为度), + * 当为 DatasetBufferAnalyst 时,单位通过{@link BufferSetting#radiusUnit}设置(默认全部为米)。 + */ + + this.rightDistance = new BufferDistance(); + /** + * @member {number} [BufferSetting.prototype.semicircleLineSegment=4] + * @description 圆头缓冲圆弧处线段的个数。即用多少个线段来模拟一个半圆。 + */ + + this.semicircleLineSegment = 4; + /** + * @member {BufferRadiusUnit} [BufferSetting.prototype.radiusUnit = BufferRadiusUnit.METER] + * @description 缓冲半径单位,可以是{@link BufferRadiusUnit.METER}、{@link BufferRadiusUnit.MILLIMETER}、 + * {@link BufferRadiusUnit.CENTIMETER}、{@link BufferRadiusUnit.DECIMETER}、{@link BufferRadiusUnit.KILOMETER}、 + * {@link BufferRadiusUnit.FOOT}、{@link BufferRadiusUnit.INCH}、{@link BufferRadiusUnit.MILE}、{@link BufferRadiusUnit.YARD}。 + * 仅对BufferAnalyst有效。 + */ + + this.radiusUnit = BufferRadiusUnit.METER; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.BufferSetting"; + } + /** + * @function BufferSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + BufferSetting_createClass(BufferSetting, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.endType = null; + + if (me.leftDistance) { + me.leftDistance.destroy(); + me.leftDistance = null; + } + + if (me.rightDistance) { + me.rightDistance.destroy(); + me.rightDistance = null; + } + + me.semicircleLineSegment = null; + me.radiusUnit = null; + } + }]); + + return BufferSetting; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/BufferAnalystParameters.js +function BufferAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BufferAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BufferAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) BufferAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) BufferAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class BufferAnalystParameters + * @deprecatedclass SuperMap.BufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析参数基类。 + * @param {Object} options - 参数。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。为缓冲区分析提供必要的参数信息,包括左缓冲距离、右缓冲距离、端点类型、圆头缓冲圆弧处线段的个数信息。 + * @usage + */ + +var BufferAnalystParameters = /*#__PURE__*/function () { + function BufferAnalystParameters(options) { + BufferAnalystParameters_classCallCheck(this, BufferAnalystParameters); + + var me = this; + /** + * @member {BufferSetting} [BufferAnalystParameters.prototype.bufferSetting] + * @description 设置缓冲区通用参数。为缓冲区分析提供必要的参数信息,包括左缓冲距离、右缓冲距离、端点类型、圆头缓冲圆弧处线段的个数信息。 + */ + + me.bufferSetting = new BufferSetting(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.BufferAnalystParameters"; + } + /** + * @function BufferAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + BufferAnalystParameters_createClass(BufferAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.bufferSetting) { + me.bufferSetting.destroy(); + me.bufferSetting = null; + } + } + }]); + + return BufferAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DataReturnOption.js +function DataReturnOption_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DataReturnOption_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DataReturnOption_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataReturnOption_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataReturnOption_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DataReturnOption + * @deprecatedclass SuperMap.DataReturnOption + * @category iServer Data Dataset + * @classdesc 数据返回设置类。 + * @param {Object} options - 参数。 + * @param {number} [options.expectCount=1000] - 设置返回的最大记录数,小于或者等于 0 时表示返回所有记录数。 + * @param {string} [options.dataset] - 设置结果数据集标识,当 dataReturnMode 为 {@link DataReturnMode.DATASET_ONLY}或{@link DataReturnMode.DATASET_AND_RECORDSET}时有效, + * 作为返回数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + * @param {DataReturnMode} [options.dataReturnMode=DataReturnMode.RECORDSET_ONLY] - 数据返回模式。 + * @param {boolean} [options.deleteExistResultDataset=true] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ + +var DataReturnOption = /*#__PURE__*/function () { + function DataReturnOption(options) { + DataReturnOption_classCallCheck(this, DataReturnOption); + + /** + * @member {number} [DataReturnOption.prototype.expectCount=1000] + * @description 设置返回的最大记录数,小于或者等于0时表示返回所有记录数。 + */ + this.expectCount = 1000; + /** + * @member {string} [DataReturnOption.prototype.dataset] + * @description 设置结果数据集标识,当dataReturnMode为 {@link DataReturnMode.DATASET_ONLY} + * 或{@link DataReturnMode.DATASET_AND_RECORDSET}时有效, + * 作为返回数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示。 + */ + + this.dataset = null; + /** + * @member {DataReturnMode} [DataReturnOption.prototype.dataReturnMode=DataReturnMode.RECORDSET_ONLY] + * @description 数据返回模式。 + */ + + this.dataReturnMode = DataReturnMode.RECORDSET_ONLY; + /** + * @member {boolean} [DataReturnOption.prototype.deleteExistResultDataset=true] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + + this.deleteExistResultDataset = true; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.DataReturnOption"; + } + /** + * @function DataReturnOption.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + DataReturnOption_createClass(DataReturnOption, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.expectCount = null; + me.dataset = null; + me.dataReturnMode = null; + me.deleteExistResultDataset = null; + } + }]); + + return DataReturnOption; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FilterParameter.js +function FilterParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FilterParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FilterParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) FilterParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) FilterParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FilterParameter + * @deprecatedclass SuperMap.FilterParameter + * @category iServer Data FeatureResults + * @classdesc 查询过滤条件参数类。该类用于设置查询数据集的查询过滤参数。 + * @param {Object} options - 参数。 + * @param {string} options.attributeFilter - 属性过滤条件。 + * @param {string} options.name - 查询数据集名称或者图层名称。 + * @param {Array.} [options.joinItems] - 与外部表的连接信息 JoinItem 数组。 + * @param {Array.} [options.linkItems] - 与外部表的关联信息 LinkItem 数组。 + * @param {Array.} [options.ids] - 查询 id 数组,即属性表中的 SmID 值。 + * @param {string} [options.orderBy] - 查询排序的字段,orderBy 的字段须为数值型的。 + * @param {string} [options.groupBy] - 查询分组条件的字段。 + * @param {Array.} [options.fields] - 查询字段数组。 + * @usage + */ + +var FilterParameter = /*#__PURE__*/function () { + function FilterParameter(options) { + FilterParameter_classCallCheck(this, FilterParameter); + + /** + * @member {string} FilterParameter.prototype.attributeFilter + * @description 属性过滤条件。 + * 相当于 SQL 语句中的 WHERE 子句,其格式为:WHERE <条件表达式>, + * attributeFilter 就是其中的“条件表达式”。 + * 该字段的用法为 attributeFilter = "过滤条件"。 + * 例如,要查询字段 fieldValue 小于100的记录,设置 attributeFilter = "fieldValue < 100"; + * 要查询字段 name 的值为“酒店”的记录,设置 attributeFilter = "name like '%酒店%'",等等。 + */ + this.attributeFilter = null; + /** + * @member {string} FilterParameter.prototype.name + * @description 查询数据集名称或者图层名称,根据实际的查询对象而定。 + * 一般情况下该字段为数据集名称,但在进行与地图相关功能的操作时, + * 需要设置为图层名称(图层名称格式:数据集名称@数据源别名)。 + * 因为一个地图的图层可能是来自于不同数据源的数据集, + * 而不同的数据源中可能存在同名的数据集, + * 使用数据集名称不能唯一的确定数据集, + * 所以在进行与地图相关功能的操作时,该值需要设置为图层名称。 + */ + + this.name = null; + /** + * @member {Array.} [FilterParameter.prototype.joinItems] + * @description 与外部表的连接信息 JoinItem 数组。 + */ + + this.joinItems = null; + /** + * @member {Array.} [FilterParameter.prototype.linkItems] + * @description 与外部表的关联信息 LinkItem 数组。 + */ + + this.linkItems = null; + /** + * @member {Array.} [FilterParameter.prototype.ids] + * @description 查询 id 数组,即属性表中的 SmID 值。 + */ + + this.ids = null; + /** + * @member {string} [FilterParameter.prototype.orderBy] + * @description 查询排序的字段,orderBy的字段须为数值型的。 + * 相当于 SQL 语句中的 ORDER BY 子句,其格式为:ORDER BY <列名>, + * 列名即属性表中每一列的名称,列又可称为属性,在 SuperMap 中又称为字段。 + * 对单个字段排序时,该字段的用法为 orderBy = "字段名"; + * 对多个字段排序时,字段之间以英文逗号进行分割,用法为 orderBy = "字段名1, 字段名2"。 + * 例如,现有一个国家数据集,它有两个字段分别为“SmArea”和“pop_1994”, + * 分别表示国家的面积和1994年的各国人口数量。 + * 如果要按照各国人口数量对记录进行排序,则 orderBy = "pop_1994"; + * 如果要以面积和人口进行排序,则 orderBy = "SmArea, pop_1994"。 + */ + + this.orderBy = null; + /** + * @member {string} [FilterParameter.prototype.groupBy] + * @description 查询分组条件的字段。 + * 相当于 SQL 语句中的 GROUP BY 子句,其格式为:GROUP BY <列名>, + * 列名即属性表中每一列的名称,列又可称为属性,在 SuperMap 中又称为字段。 + * 对单个字段分组时,该字段的用法为 groupBy = "字段名"; + * 对多个字段分组时,字段之间以英文逗号进行分割,用法为 groupBy = "字段名1, 字段名2"。 + * 例如,现有一个全球城市数据集,该数据集有两个字段分别为“Continent”和“Country”, + * 分别表示某个城市所属的洲和国家。 + * 如果要按照国家对全球的城市进行分组, 可以设置 groupBy = "Country"; + * 如果以洲和国家对城市进行分组,设置 groupBy = "Continent, Country"。 + */ + + this.groupBy = null; + /** + * @member {Array.} [FilterParameter.prototype.fields] + * @description 查询字段数组,如果不设置则使用系统返回的所有字段。 + */ + + this.fields = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FilterParameter"; + } + /** + * @function FilterParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FilterParameter_createClass(FilterParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.attributeFilter = null; + me.name = null; + + if (me.joinItems) { + for (var i = 0, joinItems = me.joinItems, len = joinItems.length; i < len; i++) { + joinItems[i].destroy(); + } + + me.joinItems = null; + } + + if (me.linkItems) { + for (var _i = 0, linkItems = me.linkItems, _len = linkItems.length; _i < _len; _i++) { + linkItems[_i].destroy(); + } + + me.linkItems = null; + } + + me.ids = null; + me.orderBy = null; + me.groupBy = null; + me.fields = null; + } + }]); + + return FilterParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetBufferAnalystParameters.js +function DatasetBufferAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return DatasetBufferAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasetBufferAnalystParameters_typeof(obj); } + +function DatasetBufferAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetBufferAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetBufferAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetBufferAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetBufferAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasetBufferAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasetBufferAnalystParameters_get = Reflect.get; } else { DatasetBufferAnalystParameters_get = function _get(target, property, receiver) { var base = DatasetBufferAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasetBufferAnalystParameters_get.apply(this, arguments); } + +function DatasetBufferAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasetBufferAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasetBufferAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasetBufferAnalystParameters_setPrototypeOf(subClass, superClass); } + +function DatasetBufferAnalystParameters_setPrototypeOf(o, p) { DatasetBufferAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasetBufferAnalystParameters_setPrototypeOf(o, p); } + +function DatasetBufferAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = DatasetBufferAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasetBufferAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasetBufferAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasetBufferAnalystParameters_possibleConstructorReturn(this, result); }; } + +function DatasetBufferAnalystParameters_possibleConstructorReturn(self, call) { if (call && (DatasetBufferAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasetBufferAnalystParameters_assertThisInitialized(self); } + +function DatasetBufferAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasetBufferAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasetBufferAnalystParameters_getPrototypeOf(o) { DatasetBufferAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasetBufferAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DatasetBufferAnalystParameters + * @deprecatedclass SuperMap.DatasetBufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 数据集缓冲区分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + * @param {FilterParameter} [options.filterQueryParameter] - 设置数据集中几何对象的过滤条件。只有满足此条件的几何对象才参与缓冲区分析。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {boolean} [options.isAttributeRetained=true] - 是否保留进行缓冲区分析的对象的字段属性。当 isUnion 字段为 false 时该字段有效。 + * @param {boolean} [options.isUnion=false] - 是否将缓冲区与源记录集中的对象合并后返回。对于面对象而言,要求源数据集中的面对象不相交。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。 + * + * @extends {BufferAnalystParameters} + * @usage + */ + +var DatasetBufferAnalystParameters = /*#__PURE__*/function (_BufferAnalystParamet) { + DatasetBufferAnalystParameters_inherits(DatasetBufferAnalystParameters, _BufferAnalystParamet); + + var _super = DatasetBufferAnalystParameters_createSuper(DatasetBufferAnalystParameters); + + function DatasetBufferAnalystParameters(options) { + var _this; + + DatasetBufferAnalystParameters_classCallCheck(this, DatasetBufferAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {string} DatasetBufferAnalystParameters.prototype.dataset + * @description 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如“数据集名称@数据源别名”形式来表示。 + */ + + _this.dataset = null; + /** + * @member {FilterParameter} [DatasetBufferAnalystParameters.prototype.filterQueryParameter] + * @description 设置数据集中几何对象的过滤条件。只有满足此条件的几何对象才参与缓冲区分析。 + */ + + _this.filterQueryParameter = new FilterParameter(); + /** + * @member {DataReturnOption} [DatasetBufferAnalystParameters.prototype.resultSetting] + * @description 结果返回设置类。 + */ + + _this.resultSetting = new DataReturnOption(); + /** + * @member {boolean} [DatasetBufferAnalystParameters.prototype.isAttributeRetained=true] + * @description 是否保留进行缓冲区分析的对象的字段属性。当 isUnion 字段为 false 时该字段有效。 + */ + + _this.isAttributeRetained = true; + /** + * @member {boolean} [DatasetBufferAnalystParameters.prototype.isUnion=false] + * @description 是否将缓冲区与源记录集中的对象合并后返回。对于面对象而言,要求源数据集中的面对象不相交。 + */ + + _this.isUnion = false; + Util.extend(DatasetBufferAnalystParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.DatasetBufferAnalystParameters"; + return _this; + } + /** + * @function DatasetBufferAnalystParameters.prototype.destroy + * @override + */ + + + DatasetBufferAnalystParameters_createClass(DatasetBufferAnalystParameters, [{ + key: "destroy", + value: function destroy() { + DatasetBufferAnalystParameters_get(DatasetBufferAnalystParameters_getPrototypeOf(DatasetBufferAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.dataset = null; + + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + + me.isAttributeRetained = null; + me.isUnion = null; + } + /** + * @function DatasetBufferAnalystParameters.toObject + * @param {DatasetBufferAnalystParameters} datasetBufferAnalystParameters - 数据集缓冲区分析参数类。 + * @param {DatasetBufferAnalystParameters} tempObj - 数据集缓冲区分析参数对象。 + * @description 将数据集缓冲区分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(datasetBufferAnalystParameters, tempObj) { + for (var name in datasetBufferAnalystParameters) { + if (name === "bufferSetting") { + datasetBufferAnalystParameters.bufferSetting.radiusUnit = datasetBufferAnalystParameters.bufferSetting.radiusUnit.toUpperCase(); + tempObj.bufferAnalystParameter = datasetBufferAnalystParameters.bufferSetting; + } else if (name === "resultSetting") { + tempObj.dataReturnOption = datasetBufferAnalystParameters.resultSetting; + } else if (name === "dataset") { + continue; + } else { + tempObj[name] = datasetBufferAnalystParameters[name]; + } + } + } + }]); + + return DatasetBufferAnalystParameters; +}(BufferAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/GeometryBufferAnalystParameters.js +function GeometryBufferAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return GeometryBufferAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeometryBufferAnalystParameters_typeof(obj); } + +function GeometryBufferAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeometryBufferAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeometryBufferAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeometryBufferAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeometryBufferAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeometryBufferAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeometryBufferAnalystParameters_get = Reflect.get; } else { GeometryBufferAnalystParameters_get = function _get(target, property, receiver) { var base = GeometryBufferAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeometryBufferAnalystParameters_get.apply(this, arguments); } + +function GeometryBufferAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeometryBufferAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeometryBufferAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeometryBufferAnalystParameters_setPrototypeOf(subClass, superClass); } + +function GeometryBufferAnalystParameters_setPrototypeOf(o, p) { GeometryBufferAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeometryBufferAnalystParameters_setPrototypeOf(o, p); } + +function GeometryBufferAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = GeometryBufferAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeometryBufferAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeometryBufferAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeometryBufferAnalystParameters_possibleConstructorReturn(this, result); }; } + +function GeometryBufferAnalystParameters_possibleConstructorReturn(self, call) { if (call && (GeometryBufferAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeometryBufferAnalystParameters_assertThisInitialized(self); } + +function GeometryBufferAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeometryBufferAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeometryBufferAnalystParameters_getPrototypeOf(o) { GeometryBufferAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeometryBufferAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryBufferAnalystParameters + * @deprecatedclass SuperMap.GeometryBufferAnalystParameters + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 几何对象缓冲区分析参数类 + * 对指定的某个几何对象做缓冲区分析。通过该类可以指定要做缓冲区分析的几何对象、缓冲区参数等。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.sourceGeometry - 要做缓冲区分析的几何对象。 + * @param {number} options.sourceGeometrySRID - 缓冲区几何对象投影坐标参数, 如 4326,3857。 + * @param {BufferSetting} [options.bufferSetting] - 设置缓冲区通用参数。 + * @extends {BufferAnalystParameters} + * @usage + */ + +var GeometryBufferAnalystParameters = /*#__PURE__*/function (_BufferAnalystParamet) { + GeometryBufferAnalystParameters_inherits(GeometryBufferAnalystParameters, _BufferAnalystParamet); + + var _super = GeometryBufferAnalystParameters_createSuper(GeometryBufferAnalystParameters); + + function GeometryBufferAnalystParameters(options) { + var _this; + + GeometryBufferAnalystParameters_classCallCheck(this, GeometryBufferAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {GeoJSONObject} GeometryBufferAnalystParameters.prototype.sourceGeometry + * @description 要做缓冲区分析的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}。 + */ + + _this.sourceGeometry = null; + /** + * @member {number} GeometryBufferAnalystParameters.prototype.sourceGeometrySRID + * @description 缓冲区几何对象投影坐标参数, 如 4326,3857。 + */ + + _this.sourceGeometrySRID = null; + + if (options) { + Util.extend(GeometryBufferAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = " SuperMap.GeometryBufferAnalystParameters"; + return _this; + } + /** + * @function GeometryBufferAnalystParameters.prototype.destroy + * @override + */ + + + GeometryBufferAnalystParameters_createClass(GeometryBufferAnalystParameters, [{ + key: "destroy", + value: function destroy() { + GeometryBufferAnalystParameters_get(GeometryBufferAnalystParameters_getPrototypeOf(GeometryBufferAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + } + /** + * @function GeometryBufferAnalystParameters.toObject + * @param {GeometryBufferAnalystParameters} geometryBufferAnalystParameters - 几何对象缓冲区分析参数类。 + * @param {GeometryBufferAnalystParameters} tempObj - 几何对象缓冲区分析参数对象。 + * @description 将几何对象缓冲区分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(geometryBufferAnalystParameters, tempObj) { + for (var name in geometryBufferAnalystParameters) { + if (name === "bufferSetting") { + var tempBufferSetting = {}; + + for (var key in geometryBufferAnalystParameters.bufferSetting) { + tempBufferSetting[key] = geometryBufferAnalystParameters.bufferSetting[key]; + } + + tempObj.analystParameter = tempBufferSetting; + } else if (name === "sourceGeometry") { + tempObj.sourceGeometry = ServerGeometry.fromGeometry(geometryBufferAnalystParameters.sourceGeometry); + } else { + tempObj[name] = geometryBufferAnalystParameters[name]; + } + } + } + }]); + + return GeometryBufferAnalystParameters; +}(BufferAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/BufferAnalystService.js +function BufferAnalystService_typeof(obj) { "@babel/helpers - typeof"; return BufferAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, BufferAnalystService_typeof(obj); } + +function BufferAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BufferAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BufferAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) BufferAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) BufferAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function BufferAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { BufferAnalystService_get = Reflect.get; } else { BufferAnalystService_get = function _get(target, property, receiver) { var base = BufferAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return BufferAnalystService_get.apply(this, arguments); } + +function BufferAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = BufferAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function BufferAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) BufferAnalystService_setPrototypeOf(subClass, superClass); } + +function BufferAnalystService_setPrototypeOf(o, p) { BufferAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return BufferAnalystService_setPrototypeOf(o, p); } + +function BufferAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = BufferAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = BufferAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = BufferAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return BufferAnalystService_possibleConstructorReturn(this, result); }; } + +function BufferAnalystService_possibleConstructorReturn(self, call) { if (call && (BufferAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return BufferAnalystService_assertThisInitialized(self); } + +function BufferAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function BufferAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function BufferAnalystService_getPrototypeOf(o) { BufferAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return BufferAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class BufferAnalystService + * @deprecatedclass SuperMap.BufferAnalystService + * @category iServer SpatialAnalyst BufferAnalyst + * @classdesc 缓冲区分析服务类。 + * 该类负责将客户设置的缓冲区分析参数传递给服务端,并接收服务端返回的缓冲区分析结果数据。 + * 缓冲区分析结果通过该类支持的事件的监听函数参数获取。 + * @param {string} url - 服务的访问地址。如:http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myBufferAnalystService = new BufferAnalystService(url, { + * eventListeners: { + * "processCompleted": bufferCompleted, + * "processFailed": bufferFailed + * } + * }); + * (end) + * @usage + */ + +var BufferAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + BufferAnalystService_inherits(BufferAnalystService, _SpatialAnalystBase); + + var _super = BufferAnalystService_createSuper(BufferAnalystService); + + function BufferAnalystService(url, options) { + var _this; + + BufferAnalystService_classCallCheck(this, BufferAnalystService); + + _this = _super.call(this, url, options); + /** + * @member {string} BufferAnalystService.prototype.mode + * @description 缓冲区分析类型 + */ + + _this.mode = null; + + if (options) { + Util.extend(BufferAnalystService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.BufferAnalystService"; + return _this; + } + /** + * @function BufferAnalystService.prototype.destroy + * @override + */ + + + BufferAnalystService_createClass(BufferAnalystService, [{ + key: "destroy", + value: function destroy() { + BufferAnalystService_get(BufferAnalystService_getPrototypeOf(BufferAnalystService.prototype), "destroy", this).call(this); + + this.mode = null; + } + /** + * @method BufferAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {BufferAnalystParameters} parameter - 缓冲区分析参数 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof DatasetBufferAnalystParameters) { + me.mode = 'datasets'; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/buffer'); + DatasetBufferAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryBufferAnalystParameters) { + me.mode = 'geometry'; + me.url = Util.urlPathAppend(me.url, 'geometry/buffer'); + GeometryBufferAnalystParameters.toObject(parameter, parameterObject); + } + + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return BufferAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/DatasourceConnectionInfo.js +function DatasourceConnectionInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasourceConnectionInfo_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasourceConnectionInfo_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasourceConnectionInfo_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasourceConnectionInfo_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + // eslint-disable-line no-unused-vars + +/** + * @class DatasourceConnectionInfo + * @deprecatedclass SuperMap.DatasourceConnectionInfo + * @category iServer Data Datasource + * @classdesc 数据源连接信息类。该类包括了进行数据源连接的所有信息,如所要连接的服务器名称、数据库名称、用户名以及密码等。 + * 当保存为工作空间时, 工作空间中的数据源的连接信息都将存储到工作空间文件中。对于不同类型的数据源,其连接信息有所区别。 + * 所以在使 用该类所包含的成员时,请注意该成员所适用的数据源类型。对于从数据源对象中返回的数据连接信息对象,只有 connect 方法可以被修改, + * 其他内容是不可以被修改的。对于用户创建的数据源连接信息对象,其内容都可以修改。 + * @param {Object} options - 参数。 + * @param {string} options.alias - 数据源别名。 + * @param {string} options.dataBase - 数据源连接的数据库名。 + * @param {boolean} [options.connect] - 数据源是否自动连接数据。 + * @param {string} [options.driver] - 使用 ODBC(Open Database Connectivity,开放数据库互连)的数据库的驱动程序名。 + * @param {EngineType} [options.engineType] - 数据源连接的引擎类型。 + * @param {boolean} [options.exclusive] - 是否以独占方式打开数据源。 + * @param {boolean} [options.OpenLinkTable] - 是否把数据库中的其他非 SuperMap 数据表作为 LinkTable 打开。 + * @param {string} [options.password] - 登录数据源连接的数据库或文件的密码。 + * @param {boolean} [options.readOnly] - 是否以只读方式打开数据源。 + * @param {string} [options.server] - 数据库服务器名或 SDB 文件名。 + * @param {string} [options.user] - 登录数据库的用户名。 + * @usage + */ + +var DatasourceConnectionInfo = /*#__PURE__*/function () { + function DatasourceConnectionInfo(options) { + DatasourceConnectionInfo_classCallCheck(this, DatasourceConnectionInfo); + + /** + * @member {string} DatasourceConnectionInfo.prototype.alias + * @description 数据源别名。 + */ + this.alias = null; + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.connect] + * @description 数据源是否自动连接数据。 + */ + + this.connect = null; + /** + * @member {string} DatasourceConnectionInfo.prototype.dataBase + * @description 数据源连接的数据库名。 + */ + + this.dataBase = null; + /** + * @member {string} [DatasourceConnectionInfo.prototype.driver] + * @description 使用 ODBC(Open Database Connectivity,开放数据库互连) 的数据库的驱动程序名。 + * 其中,对于 SQL Server 数据库与 iServer 发布的 WMTS 服务,此为必设参数。 + * 对于 SQL Server 数据库,它使用 ODBC 连接,所设置的驱动程序名为 "SQL Server" 或 "SQL Native Client"; + * 对于 iServer 发布的 WMTS 服务,设置的驱动名称为 "WMTS"。 + */ + + this.driver = null; + /** + * @member {EngineType} [DatasourceConnectionInfo.prototype.engineType] + * @description 数据源连接的引擎类型。 + */ + + this.engineType = null; + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.exclusive] + * @description 是否以独占方式打开数据源。 + */ + + this.exclusive = null; + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.OpenLinkTable] + * @description 是否把数据库中的其他非 SuperMap 数据表作为 LinkTable 打开。 + */ + + this.OpenLinkTable = null; + /** + * @member {string} [DatasourceConnectionInfo.prototype.password] + * @description 登录数据源连接的数据库或文件的密码。 + */ + + this.password = null; + /** + * @member {boolean} [DatasourceConnectionInfo.prototype.readOnly] + * @description 是否以只读方式打开数据源。 + */ + + this.readOnly = null; + /** + * @member {string} [DatasourceConnectionInfo.prototype.server] + * @description 数据库服务器名、文件名或服务地址。 + * 1.对于 SDB 和 UDB 文件,为其文件的绝对路径。注意:当绝对路径的长度超过 UTF-8 编码格式的 260 字节长度,该数据源无法打开。 + * 2.对于 Oracle 数据库,其服务器名为其 TNS 服务名称。 + * 3.对于 SQL Server 数据库,其服务器名为其系统的 DSN(Database Source Name) 名称。 + * 4.对于 PostgreSQL 数据库,其服务器名为 “IP:端口号”,默认的端口号是 5432。 + * 5.对于 DB2 数据库,已经进行了编目,所以不需要进行服务器的设置。 + * 6.对于 Kingbase 数据库,其服务器名为其 IP 地址。 + * 7.对于 GoogleMaps 数据源,其服务器地址,默认设置为 “{@link http://maps.google.com}”,且不可更改。 + * 8.对于 SuperMapCould 数据源,为其服务地址。 + * 9.对于 MAPWORLD 数据源,为其服务地址,默认设置为 “{@link http://www.tianditu.cn}”,且不可更改。 + * 10.对于 OGC 和 REST 数据源,为其服务地址。 + */ + + this.server = null; + /** + * @member {string} DatasourceConnectionInfo.prototype.user + * @description 登录数据库的用户名。 + */ + + this.user = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.DatasourceConnectionInfo"; + } + /** + * @function DatasourceConnectionInfo.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + DatasourceConnectionInfo_createClass(DatasourceConnectionInfo, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.alias = null; + me.connect = null; + me.dataBase = null; + me.driver = null; + me.engineType = null; + me.exclusive = null; + me.OpenLinkTable = null; + me.password = null; + me.readOnly = null; + me.server = null; + me.user = null; + } + }]); + + return DatasourceConnectionInfo; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/OutputSetting.js +function OutputSetting_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OutputSetting_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OutputSetting_createClass(Constructor, protoProps, staticProps) { if (protoProps) OutputSetting_defineProperties(Constructor.prototype, protoProps); if (staticProps) OutputSetting_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OutputSetting + * @deprecatedclass SuperMap.OutputSetting + * @category iServer ProcessingService + * @classdesc 分布式分析输出类型设置类。 + * @param {Object} options - 参数。 + * @param {DatasourceConnectionInfo} options.datasourceInfo - 数据源连接信息。 + * @param {string} [options.datasetName='analystResult'] - 结果数据集名称。 + * @param {OutputType} [options.type=OutputType.UDB] - 输出类型。 + * @param {string} [options.outputPath] - 分析结果输出路径。 + * @usage + */ + +var OutputSetting = /*#__PURE__*/function () { + function OutputSetting(options) { + OutputSetting_classCallCheck(this, OutputSetting); + + /** + * @member {OutputType} OutputSetting.prototype.type + * @description 分布式分析的输出类型。 + */ + this.type = OutputType.UDB; + /** + * @member {string} [OutputSetting.prototype.datasetName='analystResult'] + * @description 分布式分析的输出结果数据集名称。 + */ + + this.datasetName = "analystResult"; + /** + * @member {DatasourceConnectionInfo} OutputSetting.prototype.datasourceInfo + * @description 分布式分析的输出结果数据源连接信息。 + */ + + this.datasourceInfo = null; + /** + * @member {string} [OutputSetting.prototype.outputPath] + * @description 分布式分析的分析结果输出路径。 + */ + + this.outputPath = ""; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OutputSetting"; + } + /** + * @function OutputSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + OutputSetting_createClass(OutputSetting, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.type = null; + me.datasetName = null; + me.outputPath = null; + + if (me.datasourceInfo instanceof DatasourceConnectionInfo) { + me.datasourceInfo.destroy(); + me.datasourceInfo = null; + } + } + }]); + + return OutputSetting; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/MappingParameters.js +function MappingParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MappingParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MappingParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) MappingParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) MappingParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class MappingParameters + * @deprecatedclass SuperMap.MappingParameters + * @category iServer ProcessingService + * @classdesc 分析后结果可视化的参数类。 + * @param {Object} options - 参数。 + * @param {Array.} [options.items] - 栅格分段专题图子项数组。 + * @param {number} [options.numericPrecision=1] - 精度,此字段用于设置分析结果标签专题图中标签数值的精度,如“1”表示精确到小数点的后一位。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 专题图分段模式。 + * @param {number} [options.rangeCount] - 专题图分段个数。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 专题图颜色渐变模式。 + * @usage + */ + +var MappingParameters = /*#__PURE__*/function () { + function MappingParameters(options) { + MappingParameters_classCallCheck(this, MappingParameters); + + /** + * @member {Array.} [MappingParameters.prototype.items] + * @description 栅格分段专题图子项数组。 + */ + this.items = null; + /** + * @member {number} [MappingParameters.prototype.numericPrecision=1] + * @description 精度,此字段用于设置分析结果标签专题图中标签数值的精度,如“1”表示精确到小数点的后一位。 + */ + + this.numericPrecision = 1; + /** + * @member {RangeMode} [MappingParameters.prototype.RangeMode=RangeMode.EQUALINTERVAL] + * @description 专题图分段模式。 + */ + + this.rangeMode = RangeMode.EQUALINTERVAL; + /** + * @member {number} [MappingParameters.prototype.rangeCount] + * @description 专题图分段个数。 + */ + + this.rangeCount = ""; + /** + * @member {ColorGradientType} [MappingParameters.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 专题图颜色渐变模式。 + */ + + this.colorGradientType = ColorGradientType.YELLOW_RED; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.MappingParameters"; + } + /** + * @function MappingParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + MappingParameters_createClass(MappingParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + + me.items = null; + } + + me.numericPrecision = null; + me.rangeMode = null; + me.rangeCount = null; + me.colorGradientType = null; + } + }]); + + return MappingParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/BuffersAnalystJobsParameter.js +function BuffersAnalystJobsParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BuffersAnalystJobsParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BuffersAnalystJobsParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) BuffersAnalystJobsParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) BuffersAnalystJobsParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class BuffersAnalystJobsParameter + * @deprecatedclass SuperMap.BuffersAnalystJobsParameter + * @category iServer ProcessingService BufferAnalyst + * @classdesc 缓冲区分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.bounds] - 分析范围(默认为全图范围)。 + * @param {string} [options.distance='15'] - 缓冲距离,或缓冲区半径。 + * @param {string} [options.distanceField='pickup_latitude'] - 缓冲区分析距离字段。 + * @param {AnalystSizeUnit} [options.distanceUnit=AnalystSizeUnit.METER] - 缓冲距离单位单位。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var BuffersAnalystJobsParameter = /*#__PURE__*/function () { + function BuffersAnalystJobsParameter(options) { + BuffersAnalystJobsParameter_classCallCheck(this, BuffersAnalystJobsParameter); + + /** + * @member {string} BuffersAnalystJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + this.datasetName = ''; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} BuffersAnalystJobsParameter.prototype.bounds + * @description 分析范围。 + */ + + this.bounds = ''; + /** + * @member {string} [BuffersAnalystJobsParameter.prototype.distance='15'] + * @description 缓冲距离,或称为缓冲区半径。当缓冲距离字段位空时,此参数有效。 + */ + + this.distance = ''; + /** + * @member {string} [BuffersAnalystJobsParameter.prototype.distanceField='pickup_latitude'] + * @description 缓冲距离字段。 + */ + + this.distanceField = ''; + /** + * @member {AnalystSizeUnit} [BuffersAnalystJobsParameter.prototype.distanceUnit=AnalystSizeUnit.METER] + * @description 缓冲距离单位。 + */ + + this.distanceUnit = AnalystSizeUnit.METER; + /** + * @member {string} BuffersAnalystJobsParameter.prototype.dissolveField + * @description 融合字段,根据字段值对缓冲区结果面对象进行融合。 + */ + + this.dissolveField = ''; + /** + * @member {OutputSetting} [BuffersAnalystJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [BuffersAnalystJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + + if (!options) { + return this; + } + + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.BuffersAnalystJobsParameter'; + } + /** + * @function BuffersAnalystJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + BuffersAnalystJobsParameter_createClass(BuffersAnalystJobsParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.bounds = null; + this.distance = null; + this.distanceField = null; + this.distanceUnit = null; + this.dissolveField = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function BuffersAnalystJobsParameter.toObject + * @param {BuffersAnalystJobsParameter} BuffersAnalystJobsParameter - 缓冲区分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成缓冲区分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(_BuffersAnalystJobsParameter, tempObj) { + for (var name in _BuffersAnalystJobsParameter) { + if (name === 'datasetName') { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = _BuffersAnalystJobsParameter[name]; + continue; + } + + if (name === 'output') { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = _BuffersAnalystJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + + if (name === 'bounds' && _BuffersAnalystJobsParameter[name]) { + tempObj['analyst'][name] = _BuffersAnalystJobsParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = _BuffersAnalystJobsParameter[name]; + } + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = _BuffersAnalystJobsParameter[name]; + } + } + } + }]); + + return BuffersAnalystJobsParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ProcessingServiceBase.js +function ProcessingServiceBase_typeof(obj) { "@babel/helpers - typeof"; return ProcessingServiceBase_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ProcessingServiceBase_typeof(obj); } + +function ProcessingServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ProcessingServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ProcessingServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) ProcessingServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) ProcessingServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ProcessingServiceBase_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ProcessingServiceBase_get = Reflect.get; } else { ProcessingServiceBase_get = function _get(target, property, receiver) { var base = ProcessingServiceBase_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ProcessingServiceBase_get.apply(this, arguments); } + +function ProcessingServiceBase_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ProcessingServiceBase_getPrototypeOf(object); if (object === null) break; } return object; } + +function ProcessingServiceBase_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ProcessingServiceBase_setPrototypeOf(subClass, superClass); } + +function ProcessingServiceBase_setPrototypeOf(o, p) { ProcessingServiceBase_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ProcessingServiceBase_setPrototypeOf(o, p); } + +function ProcessingServiceBase_createSuper(Derived) { var hasNativeReflectConstruct = ProcessingServiceBase_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ProcessingServiceBase_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ProcessingServiceBase_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ProcessingServiceBase_possibleConstructorReturn(this, result); }; } + +function ProcessingServiceBase_possibleConstructorReturn(self, call) { if (call && (ProcessingServiceBase_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ProcessingServiceBase_assertThisInitialized(self); } + +function ProcessingServiceBase_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ProcessingServiceBase_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ProcessingServiceBase_getPrototypeOf(o) { ProcessingServiceBase_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ProcessingServiceBase_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ProcessingServiceBase + * @deprecatedclass SuperMap.ProcessingServiceBase + * @category iServer Core + * @classdesc 分布式分析服务基类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {number} options.index - 服务访问地址在数组中的位置。 + * @param {number} options.length - 服务访问地址数组长度。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ProcessingServiceBase = /*#__PURE__*/function (_CommonServiceBase) { + ProcessingServiceBase_inherits(ProcessingServiceBase, _CommonServiceBase); + + var _super = ProcessingServiceBase_createSuper(ProcessingServiceBase); + + function ProcessingServiceBase(url, options) { + var _this; + + ProcessingServiceBase_classCallCheck(this, ProcessingServiceBase); + + options = options || {}; + /* + * Constant: EVENT_TYPES + * {Array.} + * 此类支持的事件类型 + * - *processCompleted* 创建成功后触发的事件。 + * - *processFailed* 创建失败后触发的事件 。 + * - *processRunning* 创建过程的整个阶段都会触发的事件,用于获取创建过程的状态 。 + */ + + options.EVENT_TYPES = ["processCompleted", "processFailed", "processRunning"]; + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.ProcessingServiceBase"; + return _this; + } + /** + * @function ProcessingServiceBase.prototype.destroy + * @override + */ + + + ProcessingServiceBase_createClass(ProcessingServiceBase, [{ + key: "destroy", + value: function destroy() { + ProcessingServiceBase_get(ProcessingServiceBase_getPrototypeOf(ProcessingServiceBase.prototype), "destroy", this).call(this); + } + /** + * @function ProcessingServiceBase.prototype.getJobs + * @description 获取分布式分析任务。 + * @param {string} url - 资源地址。 + */ + + }, { + key: "getJobs", + value: function getJobs(url) { + var me = this; + FetchRequest.get(SecurityManager.appendCredential(url), null, { + proxy: me.proxy + }).then(function (response) { + return response.json(); + }).then(function (result) { + me.events.triggerEvent("processCompleted", { + result: result + }); + })["catch"](function (e) { + me.eventListeners.processFailed({ + error: e + }); + }); + } + /** + * @function ProcessingServiceBase.prototype.addJob + * @description 添加分布式分析任务。 + * @param {string} url - 资源根地址。 + * @param {Object} params - 创建一个空间分析的请求参数。 + * @param {string} paramType - 请求参数类型。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addJob", + value: function addJob(url, params, paramType, seconds) { + var me = this, + parameterObject = null; + + if (params && params instanceof paramType) { + parameterObject = new Object(); + paramType.toObject(params, parameterObject); + } + + var headers = Object.assign({ + 'Content-Type': 'application/x-www-form-urlencoded' + }, me.headers || {}); + var options = { + proxy: me.proxy, + headers: headers, + withCredentials: me.withCredentials, + crossOrigin: me.crossOrigin, + isInTheSameDomain: me.isInTheSameDomain + }; + FetchRequest.post(SecurityManager.appendCredential(url), JSON.stringify(parameterObject), options).then(function (response) { + return response.json(); + }).then(function (result) { + if (result.succeed) { + me.serviceProcessCompleted(result, seconds); + } else { + me.serviceProcessFailed(result); + } + })["catch"](function (e) { + me.serviceProcessFailed({ + error: e + }); + }); + } + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result, seconds) { + result = Util.transformResult(result); + seconds = seconds || 1000; + var me = this; + + if (result) { + var id = setInterval(function () { + FetchRequest.get(SecurityManager.appendCredential(result.newResourceLocation), { + _t: new Date().getTime() + }).then(function (response) { + return response.json(); + }).then(function (job) { + me.events.triggerEvent("processRunning", { + id: job.id, + state: job.state + }); + + if (job.state.runState === 'LOST' || job.state.runState === 'KILLED' || job.state.runState === 'FAILED') { + clearInterval(id); + me.events.triggerEvent("processFailed", { + error: job.state.errorMsg, + state: job.state.runState + }); + } + + if (job.state.runState === 'FINISHED' && job.setting.serviceInfo) { + clearInterval(id); + me.events.triggerEvent("processCompleted", { + result: job + }); + } + })["catch"](function (e) { + clearInterval(id); + me.events.triggerEvent("processFailed", { + error: e + }); + }); + }, seconds); + } + } + }, { + key: "serviceProcessFailed", + value: function serviceProcessFailed(result) { + ProcessingServiceBase_get(ProcessingServiceBase_getPrototypeOf(ProcessingServiceBase.prototype), "serviceProcessFailed", this).call(this, result); + } + }]); + + return ProcessingServiceBase; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/BuffersAnalystJobsService.js +function BuffersAnalystJobsService_typeof(obj) { "@babel/helpers - typeof"; return BuffersAnalystJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, BuffersAnalystJobsService_typeof(obj); } + +function BuffersAnalystJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BuffersAnalystJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BuffersAnalystJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) BuffersAnalystJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) BuffersAnalystJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function BuffersAnalystJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { BuffersAnalystJobsService_get = Reflect.get; } else { BuffersAnalystJobsService_get = function _get(target, property, receiver) { var base = BuffersAnalystJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return BuffersAnalystJobsService_get.apply(this, arguments); } + +function BuffersAnalystJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = BuffersAnalystJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function BuffersAnalystJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) BuffersAnalystJobsService_setPrototypeOf(subClass, superClass); } + +function BuffersAnalystJobsService_setPrototypeOf(o, p) { BuffersAnalystJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return BuffersAnalystJobsService_setPrototypeOf(o, p); } + +function BuffersAnalystJobsService_createSuper(Derived) { var hasNativeReflectConstruct = BuffersAnalystJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = BuffersAnalystJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = BuffersAnalystJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return BuffersAnalystJobsService_possibleConstructorReturn(this, result); }; } + +function BuffersAnalystJobsService_possibleConstructorReturn(self, call) { if (call && (BuffersAnalystJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return BuffersAnalystJobsService_assertThisInitialized(self); } + +function BuffersAnalystJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function BuffersAnalystJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function BuffersAnalystJobsService_getPrototypeOf(o) { BuffersAnalystJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return BuffersAnalystJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BuffersAnalystJobsService + * @deprecatedclass SuperMap.BuffersAnalystJobsService + * @category iServer ProcessingService BufferAnalyst + * @classdesc 缓冲区分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var BuffersAnalystJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + BuffersAnalystJobsService_inherits(BuffersAnalystJobsService, _ProcessingServiceBas); + + var _super = BuffersAnalystJobsService_createSuper(BuffersAnalystJobsService); + + function BuffersAnalystJobsService(url, options) { + var _this; + + BuffersAnalystJobsService_classCallCheck(this, BuffersAnalystJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/buffers'); + _this.CLASS_NAME = 'SuperMap.BuffersAnalystJobsService'; + return _this; + } + /** + *@override + */ + + + BuffersAnalystJobsService_createClass(BuffersAnalystJobsService, [{ + key: "destroy", + value: function destroy() { + BuffersAnalystJobsService_get(BuffersAnalystJobsService_getPrototypeOf(BuffersAnalystJobsService.prototype), "destroy", this).call(this); + } + /** + * @function BuffersAnalystJobsService.prototype.getBufferJobs + * @description 获取缓冲区分析所有任务 + */ + + }, { + key: "getBuffersJobs", + value: function getBuffersJobs() { + BuffersAnalystJobsService_get(BuffersAnalystJobsService_getPrototypeOf(BuffersAnalystJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function BuffersAnalystJobsService.prototype.getBufferJob + * @description 获取指定id的缓冲区分析服务 + * @param {string} id - 指定要获取数据的id。 + */ + + }, { + key: "getBuffersJob", + value: function getBuffersJob(id) { + BuffersAnalystJobsService_get(BuffersAnalystJobsService_getPrototypeOf(BuffersAnalystJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function BuffersAnalystJobsService.prototype.addBufferJob + * @description 新建缓冲区分析服务 + * @param {BuffersAnalystJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addBuffersJob", + value: function addBuffersJob(params, seconds) { + BuffersAnalystJobsService_get(BuffersAnalystJobsService_getPrototypeOf(BuffersAnalystJobsService.prototype), "addJob", this).call(this, this.url, params, BuffersAnalystJobsParameter, seconds); + } + }]); + + return BuffersAnalystJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/BurstPipelineAnalystParameters.js +function BurstPipelineAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BurstPipelineAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BurstPipelineAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) BurstPipelineAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) BurstPipelineAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class BurstPipelineAnalystParameters + * @deprecatedclass SuperMap.BurstPipelineAnalystParameters + * @category iServer NetworkAnalyst BurstAnalyse + * @classdesc 爆管分析参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} [options.edgeID] - 指定的弧段ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。 + * @usage + */ + +var BurstPipelineAnalystParameters = /*#__PURE__*/function () { + function BurstPipelineAnalystParameters(options) { + BurstPipelineAnalystParameters_classCallCheck(this, BurstPipelineAnalystParameters); + + var me = this; + /** + * @member {Array.} BurstPipelineAnalystParameters.prototype.sourceNodeIDs + * @description 指定的设施点 ID 数组。 + */ + + this.sourceNodeIDs = null; + /** + * @member {number} [BurstPipelineAnalystParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + + this.edgeID = null; + /** + * @member {number} [BurstPipelineAnalystParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + + this.nodeID = null; + /** + * @member {boolean} [BurstPipelineAnalystParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。 + * 指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行。 + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + */ + + this.isUncertainDirectionValid = false; + Util.extend(me, options); + this.CLASS_NAME = "SuperMap.BurstPipelineAnalystParameters"; + } + /** + * @function BurstPipelineAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + BurstPipelineAnalystParameters_createClass(BurstPipelineAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.sourceNodeIDs = null; + me.edgeID = null; + me.nodeID = null; + me.isUncertainDirectionValid = null; + } + }]); + + return BurstPipelineAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/NetworkAnalystServiceBase.js +function NetworkAnalystServiceBase_typeof(obj) { "@babel/helpers - typeof"; return NetworkAnalystServiceBase_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, NetworkAnalystServiceBase_typeof(obj); } + +function NetworkAnalystServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function NetworkAnalystServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function NetworkAnalystServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) NetworkAnalystServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) NetworkAnalystServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function NetworkAnalystServiceBase_get() { if (typeof Reflect !== "undefined" && Reflect.get) { NetworkAnalystServiceBase_get = Reflect.get; } else { NetworkAnalystServiceBase_get = function _get(target, property, receiver) { var base = NetworkAnalystServiceBase_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return NetworkAnalystServiceBase_get.apply(this, arguments); } + +function NetworkAnalystServiceBase_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = NetworkAnalystServiceBase_getPrototypeOf(object); if (object === null) break; } return object; } + +function NetworkAnalystServiceBase_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) NetworkAnalystServiceBase_setPrototypeOf(subClass, superClass); } + +function NetworkAnalystServiceBase_setPrototypeOf(o, p) { NetworkAnalystServiceBase_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return NetworkAnalystServiceBase_setPrototypeOf(o, p); } + +function NetworkAnalystServiceBase_createSuper(Derived) { var hasNativeReflectConstruct = NetworkAnalystServiceBase_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = NetworkAnalystServiceBase_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = NetworkAnalystServiceBase_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return NetworkAnalystServiceBase_possibleConstructorReturn(this, result); }; } + +function NetworkAnalystServiceBase_possibleConstructorReturn(self, call) { if (call && (NetworkAnalystServiceBase_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return NetworkAnalystServiceBase_assertThisInitialized(self); } + +function NetworkAnalystServiceBase_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function NetworkAnalystServiceBase_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function NetworkAnalystServiceBase_getPrototypeOf(o) { NetworkAnalystServiceBase_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return NetworkAnalystServiceBase_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class NetworkAnalystServiceBase + * @deprecatedclass SuperMap.NetworkAnalystServiceBase + * @category iServer Core + * @classdesc 网络分析服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var NetworkAnalystServiceBase = /*#__PURE__*/function (_CommonServiceBase) { + NetworkAnalystServiceBase_inherits(NetworkAnalystServiceBase, _CommonServiceBase); + + var _super = NetworkAnalystServiceBase_createSuper(NetworkAnalystServiceBase); + + function NetworkAnalystServiceBase(url, options) { + var _this; + + NetworkAnalystServiceBase_classCallCheck(this, NetworkAnalystServiceBase); + + _this = _super.call(this, url, options); + /** + * @member {DataFormat} [NetworkAnalystServiceBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为 "ISERVER","GEOJSON" + */ + + _this.format = DataFormat.GEOJSON; + _this.CLASS_NAME = "SuperMap.NetworkAnalystServiceBase"; + return _this; + } + /** + * @function NetworkAnalystServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + + + NetworkAnalystServiceBase_createClass(NetworkAnalystServiceBase, [{ + key: "destroy", + value: function destroy() { + NetworkAnalystServiceBase_get(NetworkAnalystServiceBase_getPrototypeOf(NetworkAnalystServiceBase.prototype), "destroy", this).call(this); + + this.format = null; + } + /** + * @function NetworkAnalystServiceBase.prototype.serviceProcessCompleted + * @description 分析完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this, + analystResult; + result = Util.transformResult(result); + + if (result && me.format === DataFormat.GEOJSON && typeof me.toGeoJSONResult === 'function') { + analystResult = me.toGeoJSONResult(result); + } + + if (!analystResult) { + analystResult = result; + } + + me.events.triggerEvent("processCompleted", { + result: analystResult + }); + } + /** + * @function NetworkAnalystServiceBase.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。只处理结果中的路由,由子类实现。 + * @param {Object} result - 服务器返回的结果对象。 + * @returns {GeoJSONObject} GeoJSON 对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + // eslint-disable-line no-unused-vars + return null; + } + }]); + + return NetworkAnalystServiceBase; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/BurstPipelineAnalystService.js +function BurstPipelineAnalystService_typeof(obj) { "@babel/helpers - typeof"; return BurstPipelineAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, BurstPipelineAnalystService_typeof(obj); } + +function BurstPipelineAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function BurstPipelineAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function BurstPipelineAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) BurstPipelineAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) BurstPipelineAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function BurstPipelineAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { BurstPipelineAnalystService_get = Reflect.get; } else { BurstPipelineAnalystService_get = function _get(target, property, receiver) { var base = BurstPipelineAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return BurstPipelineAnalystService_get.apply(this, arguments); } + +function BurstPipelineAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = BurstPipelineAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function BurstPipelineAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) BurstPipelineAnalystService_setPrototypeOf(subClass, superClass); } + +function BurstPipelineAnalystService_setPrototypeOf(o, p) { BurstPipelineAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return BurstPipelineAnalystService_setPrototypeOf(o, p); } + +function BurstPipelineAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = BurstPipelineAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = BurstPipelineAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = BurstPipelineAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return BurstPipelineAnalystService_possibleConstructorReturn(this, result); }; } + +function BurstPipelineAnalystService_possibleConstructorReturn(self, call) { if (call && (BurstPipelineAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return BurstPipelineAnalystService_assertThisInitialized(self); } + +function BurstPipelineAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function BurstPipelineAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function BurstPipelineAnalystService_getPrototypeOf(o) { BurstPipelineAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return BurstPipelineAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BurstPipelineAnalystService + * @deprecatedclass SuperMap.BurstPipelineAnalystService + * @category iServer NetworkAnalyst BurstAnalyse + * @classdesc 爆管分析服务类,即将给定弧段或节点作为爆管点来进行分析,返回关键结点 ID 数组、普通结点 ID 数组及其上下游弧段 ID 数组。 + * @extends {NetworkAnalystServiceBase} + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}, + * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var BurstPipelineAnalystService = /*#__PURE__*/function (_NetworkAnalystServic) { + BurstPipelineAnalystService_inherits(BurstPipelineAnalystService, _NetworkAnalystServic); + + var _super = BurstPipelineAnalystService_createSuper(BurstPipelineAnalystService); + + function BurstPipelineAnalystService(url, options) { + var _this; + + BurstPipelineAnalystService_classCallCheck(this, BurstPipelineAnalystService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.BurstPipelineAnalystService"; + return _this; + } + /** + * @function BurstPipelineAnalystService.prototype.destroy + * @override + */ + + + BurstPipelineAnalystService_createClass(BurstPipelineAnalystService, [{ + key: "destroy", + value: function destroy() { + BurstPipelineAnalystService_get(BurstPipelineAnalystService_getPrototypeOf(BurstPipelineAnalystService.prototype), "destroy", this).call(this); + } + /** + * @function BurstPipelineAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @params {BurstPipelineAnalystParameters} params - 爆管分析参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof BurstPipelineAnalystParameters)) { + return null; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'burstAnalyse'); + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; //必传参数不正确,就终止 + + if (params.edgeID !== null && params.nodeID !== null) { + throw new Error('edgeID and nodeID cannot be null at the same time.'); + } + + if (params.edgeID === null && params.nodeID === null) { + throw new Error('edgeID and nodeID cannot be null at the same time.'); + } + + if (params.edgeID !== null) { + jsonObject.edgeID = params.edgeID; + } else { + jsonObject.nodeID = params.nodeID; + } + + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return BurstPipelineAnalystService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/ChartFeatureInfoSpecsService.js +function ChartFeatureInfoSpecsService_typeof(obj) { "@babel/helpers - typeof"; return ChartFeatureInfoSpecsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ChartFeatureInfoSpecsService_typeof(obj); } + +function ChartFeatureInfoSpecsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartFeatureInfoSpecsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartFeatureInfoSpecsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartFeatureInfoSpecsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartFeatureInfoSpecsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ChartFeatureInfoSpecsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ChartFeatureInfoSpecsService_get = Reflect.get; } else { ChartFeatureInfoSpecsService_get = function _get(target, property, receiver) { var base = ChartFeatureInfoSpecsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ChartFeatureInfoSpecsService_get.apply(this, arguments); } + +function ChartFeatureInfoSpecsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ChartFeatureInfoSpecsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ChartFeatureInfoSpecsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ChartFeatureInfoSpecsService_setPrototypeOf(subClass, superClass); } + +function ChartFeatureInfoSpecsService_setPrototypeOf(o, p) { ChartFeatureInfoSpecsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ChartFeatureInfoSpecsService_setPrototypeOf(o, p); } + +function ChartFeatureInfoSpecsService_createSuper(Derived) { var hasNativeReflectConstruct = ChartFeatureInfoSpecsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ChartFeatureInfoSpecsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ChartFeatureInfoSpecsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ChartFeatureInfoSpecsService_possibleConstructorReturn(this, result); }; } + +function ChartFeatureInfoSpecsService_possibleConstructorReturn(self, call) { if (call && (ChartFeatureInfoSpecsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ChartFeatureInfoSpecsService_assertThisInitialized(self); } + +function ChartFeatureInfoSpecsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ChartFeatureInfoSpecsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ChartFeatureInfoSpecsService_getPrototypeOf(o) { ChartFeatureInfoSpecsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ChartFeatureInfoSpecsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ChartFeatureInfoSpecsService + * @deprecatedclass SuperMap.ChartFeatureInfoSpecsService + * @category iServer Map Chart + * @classdesc 海图物标信息服务类,通过该服务类可以查询到服务端支持的所有海图物标信息。 + * 用户可以通过两种方式获取查询结果: + * 一种是通过监听 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE 事件; + * 另一种是使用 AsyncResponder 类实现异步处理。 + * @extends {CommonServiceBase} + * @param {string} url - 地图(特指海图)服务地址。 + * 如:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图"。 + * 发送请求格式类似于:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图/chartFeatureInfoSpecs.json"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式,参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ChartFeatureInfoSpecsService = /*#__PURE__*/function (_CommonServiceBase) { + ChartFeatureInfoSpecsService_inherits(ChartFeatureInfoSpecsService, _CommonServiceBase); + + var _super = ChartFeatureInfoSpecsService_createSuper(ChartFeatureInfoSpecsService); + + function ChartFeatureInfoSpecsService(url, options) { + var _this; + + ChartFeatureInfoSpecsService_classCallCheck(this, ChartFeatureInfoSpecsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.ChartFeatureInfoSpecsService"; + return _this; + } + /** + * @function ChartFeatureInfoSpecsService.prototype.destroy + * @override + */ + + + ChartFeatureInfoSpecsService_createClass(ChartFeatureInfoSpecsService, [{ + key: "destroy", + value: function destroy() { + ChartFeatureInfoSpecsService_get(ChartFeatureInfoSpecsService_getPrototypeOf(ChartFeatureInfoSpecsService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function ChartFeatureInfoSpecsService.prototype.processAsync + * @description 根据地图(特指海图)服务地址与服务端完成异步通讯,获取物标信息。 + * 当查询物标信息成功时,将触发 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE + * 事件。用可以通过户两种方式获取图层信息: + * 1. 通过 AsyncResponder 类获取(推荐使用); + * 2. 通过监听 ChartFeatureInfoSpecsEvent.PROCESS_COMPLETE 事件获取。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + var me = this, + method = "GET"; + + if (!me.isTempLayers) { + Util.urlPathAppend(me.url, 'chartFeatureInfoSpecs'); + } + + me.request({ + method: method, + params: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return ChartFeatureInfoSpecsService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryFilterParameter.js +function ChartQueryFilterParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartQueryFilterParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartQueryFilterParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartQueryFilterParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartQueryFilterParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ChartQueryFilterParameter + * @deprecatedclass SuperMap.ChartQueryFilterParameter + * @category iServer Map Chart + * @classdesc 海图查询过滤参数类,用于设置海图查询的过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + * @param {Object} options - 参数。 + * @param {string} options.attributeFilter - 属性字段过滤条件。 + * @param {number} options.chartFeatureInfoSpecCode - 查询的物标代号。 + * @param {boolean} [options.isQueryPoint] - 是否查询点。 + * @param {boolean} [options.isQueryLine] - 是否查询线。 + * @param {boolean} [options.isQueryRegion] - 是否查询面。 + * @usage + */ + +var ChartQueryFilterParameter = /*#__PURE__*/function () { + function ChartQueryFilterParameter(options) { + ChartQueryFilterParameter_classCallCheck(this, ChartQueryFilterParameter); + + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryPoint] + * @description 是否查询点。 + */ + this.isQueryPoint = null; + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryLine] + * @description 是否查询线。 + */ + + this.isQueryLine = null; + /** + * @member {boolean} [ChartQueryFilterParameter.prototype.isQueryRegion] + * @description 是否查询面。 + */ + + this.isQueryRegion = null; + /** + * @member {string} ChartQueryFilterParameter.prototype.attributeFilter + * @description 属性字段过滤条件。 + */ + + this.attributeFilter = null; + /** + * @member {number} ChartQueryFilterParameter.prototype.chartFeatureInfoSpecCode + * @description 查询的物标代号。 + */ + + this.chartFeatureInfoSpecCode = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.ChartQueryFilterParameter"; + } + /** + * @function ChartQueryFilterParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ChartQueryFilterParameter_createClass(ChartQueryFilterParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isQueryPoint = null; + me.isQueryLine = null; + me.isQueryRegion = null; + me.attributeFilter = null; + me.chartFeatureInfoSpecCode = null; + } + /** + * @function ChartQueryFilterParameter.prototype.toJson + * @description 将属性信息转化成 JSON 格式字符串。 + */ + + }, { + key: "toJson", + value: function toJson() { + var json = ""; + json += "\"isQueryPoint\":" + this.isQueryPoint + ","; + json += "\"isQueryLine\":" + this.isQueryLine + ","; + json += "\"isQueryRegion\":" + this.isQueryRegion + ","; + + if (this.attributeFilter) { + json += "\"attributeFilter\": \"" + this.attributeFilter + "\","; + } + + json += "\"chartFeatureInfoSpecCode\":" + this.chartFeatureInfoSpecCode; + json = "{" + json + "}"; + return json; + } + }]); + + return ChartQueryFilterParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryParameters.js +function ChartQueryParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartQueryParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartQueryParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartQueryParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartQueryParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ChartQueryParameters + * @deprecatedclass SuperMap.ChartQueryParameters + * @category iServer Map Chart + * @classdesc 海图查询参数类,该类用于设置海图查询时的相关参数,海图查询分为海图属性查询和海图范围查询两类,通过属性 queryMode 指定查询模式。 + * 必设属性有:queryMode、chartLayerNames、chartQueryFilterParameters。当进行海图范围查询时,必设属性还包括 bounds。 + * @param {Object} options - 参数。 + * @param {string} options.queryMode - 海图查询模式类型,支持两种查询方式:海图属性查询("ChartAttributeQuery")和海图空间查询("ChartBoundsQuery")。 + * @param {Array.} options.chartLayerNames - 查询的海图图层的名称。 + * @param {Array.} options.chartQueryFilterParameters - 海图查询过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 海图查询范围。当进行海图范围查询时,此为必选参数。 + * @param {boolean} [options.returnContent=true] - 获取或设置是返回查询结果记录集 recordsets,还是返回查询结果的资源 resourceInfo。 + * @param {number} [options.startRecord=0] - 查询起始记录位置。 + * @param {number} [options.expectCount] - 期望查询结果返回的记录数,该值大于0。 + * @usage + */ + +var ChartQueryParameters = /*#__PURE__*/function () { + function ChartQueryParameters(options) { + ChartQueryParameters_classCallCheck(this, ChartQueryParameters); + + /** + * @member {string} ChartQueryParameters.prototype.queryMode + * @description 海图查询模式类型,支持两种查询方式:海图属性查询("ChartAttributeQuery")和海图空间查询("ChartBoundsQuery") 。 + */ + this.queryMode = null; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} ChartQueryParameters.prototype.bounds + * @description 海图查询范围。 + */ + + this.bounds = null; + /** + * @member {Array.} ChartQueryParameters.prototype.chartLayerNames + * @description 查询的海图图层的名称。 + */ + + this.chartLayerNames = null; + /** + * @member {Array.} ChartQueryParameters.prototype.chartQueryFilterParameters + * @description 海图查询过滤参数。包括:物标代码、物标可应用对象的选择(是否查询点、线或面)、属性字段过滤条件。 + */ + + this.chartQueryFilterParameters = null; + /** + * @member {boolean} [ChartQueryParameters.prototype.returnContent=true] + * @description 获取或设置是返回查询结果记录集 recordsets,还是返回查询结果的资源 resourceInfo。 + */ + + this.returnContent = true; + /** + * @member {number} [ChartQueryParameters.prototype.startRecord=0] + * @description 查询起始记录位置。 + */ + + this.startRecord = 0; + /** + * @member {number} [ChartQueryParameters.prototype.expectCount] + * @description 期望查询结果返回的记录数,该值大于0。 + */ + + this.expectCount = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.ChartQueryParameters"; + } + /** + * @function ChartQueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ChartQueryParameters_createClass(ChartQueryParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.queryMode = null; + me.bounds = null; + me.chartLayerNames = null; + me.chartQueryFilterParameters = null; + me.returnContent = true; + me.startRecord = 0; + me.expectCount = null; + } + /** + * @function ChartQueryParameters.prototype.getVariablesJson + * @description 将属性信息转换成能够被服务识别的 JSON 格式字符串。 + * @returns {string} JSON 字符串。 + */ + + }, { + key: "getVariablesJson", + value: function getVariablesJson() { + var json = ""; + json += "\"queryMode\":\"" + this.queryMode + "\","; + + if (this.chartLayerNames && this.chartLayerNames.length) { + var chartLayersArray = []; + var layerLength = this.chartLayerNames.length; + + for (var i = 0; i < layerLength; i++) { + chartLayersArray.push("\"" + this.chartLayerNames[i] + "\""); + } + + var layerNames = "[" + chartLayersArray.join(",") + "]"; + json += "\"chartLayerNames\":" + layerNames + ","; + } + + if (this.queryMode === "ChartBoundsQuery" && this.bounds) { + json += "\"bounds\":" + "{" + "\"leftBottom\":" + "{" + "\"x\":" + this.bounds.left + "," + "\"y\":" + this.bounds.bottom + "}" + "," + "\"rightTop\":" + "{" + "\"x\":" + this.bounds.right + "," + "\"y\":" + this.bounds.top + "}" + "},"; + } + + if (this.chartQueryFilterParameters && this.chartQueryFilterParameters.length) { + var chartParamArray = []; + var chartLength = this.chartQueryFilterParameters.length; + + for (var j = 0; j < chartLength; j++) { + var chartQueryFilterParameter = this.chartQueryFilterParameters[j]; + + if (!(chartQueryFilterParameter instanceof ChartQueryFilterParameter)) { + continue; + } + + chartParamArray.push(chartQueryFilterParameter.toJson()); + } + + var chartParamsJson = "[" + chartParamArray.join(",") + "]"; + chartParamsJson = "\"chartQueryParams\":" + chartParamsJson + ","; + chartParamsJson += "\"startRecord\":" + this.startRecord + ","; + chartParamsJson += "\"expectCount\":" + this.expectCount; + chartParamsJson = "{" + chartParamsJson + "}"; + json += "\"chartQueryParameters\":" + chartParamsJson; + } + + json = "{" + json + "}"; + return json; + } + }]); + + return ChartQueryParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/QueryParameters.js +function QueryParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class QueryParameters + * @deprecatedclass SuperMap.QueryParameters + * @category iServer Map QueryResults + * @classdesc 查询参数基类。距离查询、SQL 查询、几何地物查询等各自的参数均继承此类。 + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] - 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ + +var QueryParameters = /*#__PURE__*/function () { + function QueryParameters(options) { + QueryParameters_classCallCheck(this, QueryParameters); + + if (!options) { + return; + } + /** + * @member {string} [QueryParameters.prototype.customParams] + * @description 自定义参数,供扩展使用。 + */ + + + this.customParams = null; + /** + * @member {Object} [QueryParameters.prototype.prjCoordSys] + * @description 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857} + */ + + this.prjCoordSys = null; + /** + * @member {number} [QueryParameters.prototype.expectCount=100000] + * @description 期望返回结果记录个数,默认返回100000条查询记录, + * 如果实际不足100000条则返回实际记录条数。 + */ + + this.expectCount = 100000; + /** + * @member {GeometryType} [QueryParameters.prototype.networkType=GeometryType.LINE] + * @description 网络数据集对应的查询类型,分为点和线两种类型。 + */ + + this.networkType = GeometryType.LINE; + /** + * @member {QueryOption} [QueryParameters.prototype.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] + * @description 查询结果类型枚举类。 + * 该类描述查询结果返回类型,包括只返回属性、 + * 只返回几何实体以及返回属性和几何实体。 + */ + + this.queryOption = QueryOption.ATTRIBUTEANDGEOMETRY; + /** + * @member {Array.} QueryParameters.prototype.queryParams + * @description 查询过滤条件参数数组。 + * 该类用于设置查询数据集的查询过滤参数。 + */ + + this.queryParams = null; + /** + * @member {number} [QueryParameters.prototype.startRecord=0] + * @description 查询起始记录号。 + */ + + this.startRecord = 0; + /** + * @member {number} [QueryParameters.prototype.holdTime=10] + * @description 资源在服务端保存的时间,单位为分钟。 + */ + + this.holdTime = 10; + /** + * @member {boolean} [QueryParameters.prototype.returnCustomResult=false] + * @description 仅供三维使用。 + */ + + this.returnCustomResult = false; + /** + * @member {boolean} [QueryParameters.prototype.returnFeatureWithFieldCaption=false] + * @description 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + */ + + this.returnFeatureWithFieldCaption = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.QueryParameters"; + } + /** + * @function QueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryParameters_createClass(QueryParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.customParams = null; + me.expectCount = null; + me.networkType = null; + me.queryOption = null; + + if (me.queryParams) { + for (var i = 0, qps = me.queryParams, len = qps.length; i < len; i++) { + qps[i].destroy(); + } + + me.queryParams = null; + } + + me.startRecord = null; + me.holdTime = null; + me.returnCustomResult = null; + me.prjCoordSys = null; + } + }]); + + return QueryParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ChartQueryService.js +function ChartQueryService_typeof(obj) { "@babel/helpers - typeof"; return ChartQueryService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ChartQueryService_typeof(obj); } + +function ChartQueryService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartQueryService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartQueryService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartQueryService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartQueryService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ChartQueryService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ChartQueryService_setPrototypeOf(subClass, superClass); } + +function ChartQueryService_setPrototypeOf(o, p) { ChartQueryService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ChartQueryService_setPrototypeOf(o, p); } + +function ChartQueryService_createSuper(Derived) { var hasNativeReflectConstruct = ChartQueryService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ChartQueryService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ChartQueryService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ChartQueryService_possibleConstructorReturn(this, result); }; } + +function ChartQueryService_possibleConstructorReturn(self, call) { if (call && (ChartQueryService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ChartQueryService_assertThisInitialized(self); } + +function ChartQueryService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ChartQueryService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ChartQueryService_getPrototypeOf(o) { ChartQueryService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ChartQueryService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class ChartQueryService + * @deprecatedclass SuperMap.ChartQueryService + * @category iServer Map Chart + * @classdesc 海图查询服务类。该类负责将海图查询所需参数(ChartQueryParameters)传递至服务端,并获取服务端的返回结果。 + * 用户可以通过两种方式获取查询结果: + * 1.通过 AsyncResponder 类获取(推荐使用); + * 2.通过监听 QueryEvent.PROCESS_COMPLETE 事件获取。 + * @extends {CommonServiceBase} + * @param {string} url - 地图查询服务访问地址。如:"http://localhost:8090/iserver/services/map-ChartW/rest/maps/海图"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * 下面示例显示了如何进行海图属性查询: + * var nameArray = ["GB4X0000_52000"]; + * var chartQueryFilterParameter = new ChartQueryFilterParameter({ + * isQueryPoint:true, + * isQueryLine:true, + * isQueryRegion:true, + * attributeFilter:"SmID<10", + * chartFeatureInfoSpecCode:1 + * }); + * + * var chartQueryParameters = new ChartQueryParameters({ + * queryMode:"ChartAttributeQuery", + * chartLayerNames:nameArray, + * returnContent:true, + * chartQueryFilterParameters:[chartQueryFilterParameter] + * }); + * + * var chartQueryService = new ChartQueryService(url); + * + * chartQueryService.events.on({ + * "processCompleted":processCompleted, + * "processFailed":processFailed + * }); + * chartQueryService.processAsync(chartQueryParameters); + * @usage + */ + +var ChartQueryService = /*#__PURE__*/function (_CommonServiceBase) { + ChartQueryService_inherits(ChartQueryService, _CommonServiceBase); + + var _super = ChartQueryService_createSuper(ChartQueryService); + + function ChartQueryService(url, options) { + var _this; + + ChartQueryService_classCallCheck(this, ChartQueryService); + + _this = _super.call(this, url, options); + options = options || {}; + /** + * @member {boolean} ChartQueryService.prototype.returnContent + * @description 是否立即返回新创建资源的表述还是返回新资源的URI。 + */ + + _this.returnContent = null; + /** + * @member {DataFormat} ChartQueryService.prototype.format + * @description 查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式 + * 参数格式为"ISERVER","GEOJSON",GEOJSON + */ + + _this.format = DataFormat.GEOJSON; + Util.extend(ChartQueryService_assertThisInitialized(_this), options); + + var me = ChartQueryService_assertThisInitialized(_this); + + if (options.format) { + me.format = options.format.toUpperCase(); + } + + if (!me.url) { + return ChartQueryService_possibleConstructorReturn(_this); + } + + me.url = Util.urlPathAppend(me.url, 'queryResults'); + _this.CLASS_NAME = "SuperMap.ChartQueryService"; + return _this; + } + /** + * @function ChartQueryService.prototype.destroy + * @override + */ + + + ChartQueryService_createClass(ChartQueryService, [{ + key: "destroy", + value: function destroy() { + var me = this; + CommonServiceBase.prototype.destroy.apply(this, arguments); + me.returnContent = null; + me.format = null; + } + /** + * @function ChartQueryService.prototype.processAsync + * @description 使用服务地址 URL 实例化 ChartQueryService 对象。 + * @param {ChartQueryParameters} params - 查询参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + //todo重点需要添加代码的地方 + if (!(params instanceof ChartQueryParameters)) { + return; + } + + var me = this, + jsonParameters; + me.returnContent = params.returnContent; + jsonParameters = params.getVariablesJson(); + + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=true'); + } + + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ChartQueryService.prototype.serviceProcessCompleted + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + + if (result && result.recordsets && me.format === DataFormat.GEOJSON) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + var geoJSONFormat = new GeoJSON(); + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + } + + me.events.triggerEvent("processCompleted", { + result: result + }); + } + /** + * @function ChartQueryService.prototype.getQueryParameters + * @description 将 JSON 对象表示的查询参数转化为 QueryParameters 对象。 + * @param {Object} params - JSON 字符串表示的查询参数。 + * @returns {QueryParameters} 返回查询结果 + */ + + }, { + key: "getQueryParameters", + value: function getQueryParameters(params) { + return new QueryParameters({ + queryMode: params.queryMode, + bounds: params.bounds, + chartLayerNames: params.chartLayerNames, + chartQueryFilterParameters: params.chartQueryFilterParameters, + returnContent: params.returnContent + }); + } + }]); + + return ChartQueryService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/ClipParameter.js +function ClipParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ClipParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ClipParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) ClipParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) ClipParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ClipParameter + * @deprecatedclass SuperMap.ClipParameter + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 用于裁剪的参数。优先使用用户指定的裁剪区域多边形进行裁剪,也可以通过指定数据源和数据集名,从而使用指定数据集的边界多边形进行裁剪。 + * @param {Object} options - 可选参数。 + * @param {string} [options.clipDatasetName] - 裁剪的数据集名。 + * @param {string} [options.clipDatasourceName] - 裁剪的数据集所在数据源的名字。 + * @param {GeometryPolygon|L.Polygon|L.GeoJSON|ol.geom.Polygon|ol.format.GeoJSON|GeoJSONObject}} [options.clipRegion] - 用户指定的裁剪区域。 + * @param {boolean} [options.isClipInRegion=true] - 是否对裁剪区内的数据集进行裁剪。 + * @param {boolean} [options.isExactClip=true] - 是否使用精确裁剪。 + * @usage + */ + +var ClipParameter = /*#__PURE__*/function () { + function ClipParameter(options) { + ClipParameter_classCallCheck(this, ClipParameter); + + /** + * @member {string} ClipParameter.prototype.clipDatasetName + * @description 用于裁剪的数据集名,clipDatasetName 与 clipRegion 必须设置一个。 + */ + this.clipDatasetName = null; + /** + * @member {string} ClipParameter.prototype.clipDatasourceName + * @description 用于裁剪的数据集所在数据源的名字。当 clipRegion 不设置时起作用。 + */ + + this.clipDatasourceName = null; + /** + * @member {GeometryPolygon|L.Polygon|L.GeoJSON|ol.geom.Polygon|ol.format.GeoJSON|GeoJSONObject} ClipParameter.prototype.clipRegion + * @description 用户指定的裁剪区域,优先使用,clipDatasetName 与 clipRegion 必须设置一个。 + */ + + this.clipRegion = null; + /** + * @member {boolean} [ClipParameter.prototype.isClipInRegion=true] + * @description 是否对裁剪区内的数据集进行裁剪。若为 true,则对裁剪区域内的结果进行裁剪,若为 false,则对裁剪区域外的结果进行裁剪。 + */ + + this.isClipInRegion = true; + /** + * @member {boolean} [ClipParameter.prototype.isExactClip=true] + * @description 是否使用精确裁剪。 + */ + + this.isExactClip = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ClipParameter"; + } + /** + * @function ClipParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ClipParameter_createClass(ClipParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.clipDatasetName = null; + me.clipDatasourceName = null; + me.clipRegion = null; + me.isClipInRegion = null; + me.isExactClip = null; + } + /** + * @function ClipParameter.prototype.toJSON + * @description 将 ClipParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return Util.toJSON({ + isClipInRegion: this.isClipInRegion, + clipDatasetName: this.clipDatasetName, + clipDatasourceName: this.clipDatasourceName, + isExactClip: this.isExactClip, + clipRegion: ServerGeometry.fromGeometry(this.clipRegion) + }); + } + }]); + + return ClipParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ColorDictionary.js +function ColorDictionary_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ColorDictionary_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ColorDictionary_createClass(Constructor, protoProps, staticProps) { if (protoProps) ColorDictionary_defineProperties(Constructor.prototype, protoProps); if (staticProps) ColorDictionary_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ColorDictionary + * @deprecatedclass SuperMap.ColorDictionary + * @category iServer Map Theme + * @classdesc 颜色对照表类。颜色对照表中的键名为具体的高程值,键值表示该高程值要显示的颜色。 + * 对于栅格图层中高程值小于颜色对照表中高程最小值的点使用颜色对照表中高程最小值对应的颜色, + * 对于栅格图层中高程值大于颜色对照表中高程最大值的点使用颜色对照表中高程最大值对应的颜色, + * 对于栅格图层中高程值在颜色对照表中没有对应颜色的点,则查找颜色对照表中与当前高程值相邻的两个高程对应的颜色, + * 然后通过渐变运算要显示的颜色。如果设置了颜色对照表的话,则颜色表设置无效。 + * @param {Object} options - 参数。 + * @param {number} options.elevation - 高程值。 + * @param {ServerColor} options.color - 服务端颜色类。 + * @usage + */ + +var ColorDictionary = /*#__PURE__*/function () { + function ColorDictionary(options) { + ColorDictionary_classCallCheck(this, ColorDictionary); + + options = options || {}; + /** + * @member {number} ColorDictionary.prototype.elevation + * @description 高程值。 + */ + + this.elevation = null; + /** + * @member {ServerColor} ColorDictionary.prototype.color + * @description 服务端颜色类。 + */ + + this.color = null; + Util.extend(this, options); + var me = this, + c = me.color; + + if (c) { + me.color = new ServerColor(c.red, c.green, c.blue); + } + + this.CLASS_NAME = "SuperMap.ColorDictionary"; + } + /** + * @function ColorDictionary.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ColorDictionary_createClass(ColorDictionary, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function ColorDictionary.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} JSON 对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); + return dataObj; + } + }]); + + return ColorDictionary; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TransportationAnalystResultSetting.js +function TransportationAnalystResultSetting_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransportationAnalystResultSetting_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransportationAnalystResultSetting_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransportationAnalystResultSetting_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransportationAnalystResultSetting_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TransportationAnalystResultSetting + * @deprecatedclass SuperMap.TransportationAnalystResultSetting + * @category iServer NetworkAnalyst + * @classdesc 交通网络分析结果参数类。通过该类设置交通网络分析返回的结果,包括是否返回图片、是否返回弧段空间信息、是否返回结点空间信息等。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.returnEdgeFeatures=false] - 是否在分析结果中包含弧段要素集合。 + * @param {boolean} [options.returnEdgeGeometry=false] - 返回的弧段要素集合中是否包含几何对象信息。 + * @param {boolean} [options.returnEdgeIDs=false] - 返回结果中是否包含经过弧段 ID 集合。 + * @param {boolean} [options.returnNodeFeatures=false] - 是否在分析结果中包含结点要素集合。 + * @param {boolean} [options.returnNodeGeometry=false] - 返回的结点要素集合中是否包含几何对象信息。 + * @param {boolean} [options.returnNodeIDs=false] - 返回结果中是否包含经过结点 ID 集合。 + * @param {boolean} [options.returnPathGuides=false] - 返回分析结果中是否包含行驶导引集合。 + * @param {boolean} [options.returnRoutes=false] - 返回分析结果中是否包含路由对象的集合。 + * @usage + */ + +var TransportationAnalystResultSetting = /*#__PURE__*/function () { + function TransportationAnalystResultSetting(options) { + TransportationAnalystResultSetting_classCallCheck(this, TransportationAnalystResultSetting); + + if (!options) { + return; + } + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnEdgeFeatures + * @description 是否在分析结果中包含弧段要素集合。弧段要素包括弧段的空间信息和属性信息。 + */ + + + this.returnEdgeFeatures = false; + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnEdgeGeometry=false] + * @description 返回的弧段要素集合中是否包含几何对象信息。 + */ + + this.returnEdgeGeometry = false; + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnEdgeIDs=false] + * @description 返回结果中是否包含经过弧段 ID 集合。 + */ + + this.returnEdgeIDs = false; + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeFeatures=false] + * @description 是否在分析结果中包含结点要素集合。 + * 结点要素包括结点的空间信息和属性信息。其中返回的结点要素是否包含空间信息可通过 returnNodeGeometry 字段设置。 + */ + + this.returnNodeFeatures = false; + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeGeometry=false] + * @description 返回的结点要素集合中是否包含几何对象信息。 + */ + + this.returnNodeGeometry = false; + /** + * @member {boolean} [TransportationAnalystResultSetting.prototype.returnNodeIDs=false] + * @description 返回结果中是否包含经过结点 ID 集合。 + */ + + this.returnNodeIDs = false; + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnPathGuides + * @description 返回分析结果中是否包含行驶导引集合。 + */ + + this.returnPathGuides = false; + /** + * @member {boolean} TransportationAnalystResultSetting.prototype.returnRoutes + * @description 返回分析结果中是否包含路由对象的集合。 + */ + + this.returnRoutes = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TransportationAnalystResultSetting"; + } + /** + * @function TransportationAnalystResultSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TransportationAnalystResultSetting_createClass(TransportationAnalystResultSetting, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.returnEdgeFeatures = null; + me.returnEdgeGeometry = null; + me.returnEdgeIDs = null; + me.returnNodeFeatures = null; + me.returnNodeGeometry = null; + me.returnNodeIDs = null; + me.returnPathGuides = null; + me.returnRoutes = null; + } + }]); + + return TransportationAnalystResultSetting; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TransportationAnalystParameter.js +function TransportationAnalystParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransportationAnalystParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransportationAnalystParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransportationAnalystParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransportationAnalystParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TransportationAnalystParameter + * @deprecatedclass SuperMap.TransportationAnalystParameter + * @category iServer NetworkAnalyst + * @classdesc 交通网络分析通用参数类。该类主要用来提供交通网络分析所需的通用参数。 + * 通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息,还可以对分析结果包含的内容进行一些设置。 + * @param {Object} options - 参数。 + * @param {Array.} options.barrierEdgeIDs - 网络分析中障碍弧段的 ID 数组。 + * @param {Array.} options.barrierNodeIDs - 网络分析中障碍点的 ID 数组。 + * @param {string} options.turnWeightField - 转向权重字段的名称。 + * @param {TransportationAnalystResultSetting} options.resultSetting - 分析结果返回内容。 + * @param {Array.>} [options.barrierPoints] - 网络分析中 Point2D 类型的障碍点数组。 + * @param {string} [options.weightFieldName] - 阻力字段的名称。 + * @usage + */ + +var TransportationAnalystParameter = /*#__PURE__*/function () { + function TransportationAnalystParameter(options) { + TransportationAnalystParameter_classCallCheck(this, TransportationAnalystParameter); + + if (!options) { + return; + } + /** + * @member {Array.} TransportationAnalystParameter.prototype.barrierEdgeIDs + * @description 网络分析中障碍弧段的 ID 数组。弧段设置为障碍边之后,表示双向都不通。 + */ + + + this.barrierEdgeIDs = null; + /** + * @member {Array.} TransportationAnalystParameter.prototype.barrierNodeIDs + * @description 网络分析中障碍点的 ID 数组。结点设置为障碍点之后,表示任何方向都不能通过此结点。 + */ + + this.barrierNodeIDs = null; + /** + * @member {Array.>} TransportationAnalystParameter.prototype.barrierPoints + * @description 网络分析中 Point2D 类型的障碍点数组。障碍点表示任何方向都不能通过此点。
+ * 当各网络分析参数类中的 isAnalyzeById 属性设置为 false 时,该属性才生效。 + */ + + this.barrierPoints = null; + /** + * @member {string} [TransportationAnalystParameter.prototype.weightFieldName] + * @description 阻力字段的名称,标识了进行网络分析时所使用的阻力字段,例如表示时间、长度等的字段都可以用作阻力字段。 + * 该字段默值为服务器发布的所有耗费字段的第一个字段。 + */ + + this.weightFieldName = null; + /** + * @member {string} TransportationAnalystParameter.prototype.turnWeightField + * @description 转向权重字段的名称。 + */ + + this.turnWeightField = null; + /** + * @member {TransportationAnalystResultSetting} TransportationAnalystParameter.prototype.resultSetting + * @description 分析结果返回内容。 + */ + + this.resultSetting = new TransportationAnalystResultSetting(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TransportationAnalystParameter"; + } + /** + * @function TransportationAnalystParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TransportationAnalystParameter_createClass(TransportationAnalystParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.barrierEdgeIDs = null; + me.barrierNodeIDs = null; + me.weightFieldName = null; + me.turnWeightField = null; + + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + + if (me.barrierPoints && me.barrierPoints.length) { + for (var i in me.barrierPoints) { + me.barrierPoints[i].destroy(); + } + } + + me.barrierPoints = null; + } + }]); + + return TransportationAnalystParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ComputeWeightMatrixParameters.js +function ComputeWeightMatrixParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ComputeWeightMatrixParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ComputeWeightMatrixParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) ComputeWeightMatrixParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) ComputeWeightMatrixParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ComputeWeightMatrixParameters + * @deprecatedclass SuperMap.ComputeWeightMatrixParameters + * @category iServer NetworkAnalyst WeightMatrix + * @classdesc 耗费矩阵分析参数类。根据交通网络分析参数中的耗费字段返回一个耗费矩阵。该矩阵是一个二维数组,用来存储任意两点间的资源消耗。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {Array.>} options.nodes - 要计算耗费矩阵的点数组。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var ComputeWeightMatrixParameters = /*#__PURE__*/function () { + function ComputeWeightMatrixParameters(options) { + ComputeWeightMatrixParameters_classCallCheck(this, ComputeWeightMatrixParameters); + + /** + * @member {boolean} [ComputeWeightMatrixParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点,即通过坐标点指定。 + */ + this.isAnalyzeById = false; + /** + * @member {Array.>} ComputeWeightMatrixParameters.prototype.nodes + * @description 要计算耗费矩阵的点数组。 + * 当 {@link ComputeWeightMatrixParameters.isAnalyzeById} = false 时,nodes 应为点的坐标数组; + * 当 {@link ComputeWeightMatrixParameters.isAnalyzeById} = true 时,nodes 应为点的 ID 数组。 + */ + + this.nodes = null; + /** + * @member {TransportationAnalystParameter} ComputeWeightMatrixParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.ComputeWeightMatrixParameters"; + } + /** + * @function ComputeWeightMatrixParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ComputeWeightMatrixParameters_createClass(ComputeWeightMatrixParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isAnalyzeById = null; + me.nodes = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return ComputeWeightMatrixParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ComputeWeightMatrixService.js +function ComputeWeightMatrixService_typeof(obj) { "@babel/helpers - typeof"; return ComputeWeightMatrixService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ComputeWeightMatrixService_typeof(obj); } + +function ComputeWeightMatrixService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ComputeWeightMatrixService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ComputeWeightMatrixService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ComputeWeightMatrixService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ComputeWeightMatrixService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ComputeWeightMatrixService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ComputeWeightMatrixService_get = Reflect.get; } else { ComputeWeightMatrixService_get = function _get(target, property, receiver) { var base = ComputeWeightMatrixService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ComputeWeightMatrixService_get.apply(this, arguments); } + +function ComputeWeightMatrixService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ComputeWeightMatrixService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ComputeWeightMatrixService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ComputeWeightMatrixService_setPrototypeOf(subClass, superClass); } + +function ComputeWeightMatrixService_setPrototypeOf(o, p) { ComputeWeightMatrixService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ComputeWeightMatrixService_setPrototypeOf(o, p); } + +function ComputeWeightMatrixService_createSuper(Derived) { var hasNativeReflectConstruct = ComputeWeightMatrixService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ComputeWeightMatrixService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ComputeWeightMatrixService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ComputeWeightMatrixService_possibleConstructorReturn(this, result); }; } + +function ComputeWeightMatrixService_possibleConstructorReturn(self, call) { if (call && (ComputeWeightMatrixService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ComputeWeightMatrixService_assertThisInitialized(self); } + +function ComputeWeightMatrixService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ComputeWeightMatrixService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ComputeWeightMatrixService_getPrototypeOf(o) { ComputeWeightMatrixService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ComputeWeightMatrixService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ComputeWeightMatrixService + * @deprecatedclass SuperMap.ComputeWeightMatrixService + * @category iServer NetworkAnalyst WeightMatrix + * @classdesc 耗费矩阵分析服务类。 + * 耗费矩阵是根据交通网络分析参数中的耗费字段来计算一个二维数组, + * 用来存储指定的任意两点间的资源消耗。 + * 耗费矩阵分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var mycomputeWeightMatrixService = new ComputeWeightMatrixService(url,{ + * eventListeners: { + * "processCompleted": computeWeightMatrixCompleted, + * "processFailed": computeWeightMatrixnError + * } + * }); + * @param {string} url - 耗费矩阵分析服务地址。请求服务的URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ComputeWeightMatrixService = /*#__PURE__*/function (_NetworkAnalystServic) { + ComputeWeightMatrixService_inherits(ComputeWeightMatrixService, _NetworkAnalystServic); + + var _super = ComputeWeightMatrixService_createSuper(ComputeWeightMatrixService); + + function ComputeWeightMatrixService(url, options) { + var _this; + + ComputeWeightMatrixService_classCallCheck(this, ComputeWeightMatrixService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.ComputeWeightMatrixService"; + return _this; + } + /** + * @function ComputeWeightMatrixService.prototype.destroy + * @override + */ + + + ComputeWeightMatrixService_createClass(ComputeWeightMatrixService, [{ + key: "destroy", + value: function destroy() { + ComputeWeightMatrixService_get(ComputeWeightMatrixService_getPrototypeOf(ComputeWeightMatrixService.prototype), "destroy", this).call(this); + } + /** + * @function ComputeWeightMatrixService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {ComputeWeightMatrixParameters} params - 耗费矩阵分析参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof ComputeWeightMatrixParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'weightmatrix'); + jsonObject = { + parameter: Util.toJSON(params.parameter), + nodes: me.getJson(params.isAnalyzeById, params.nodes) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ComputeWeightMatrixService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array.} params - 分析参数数组 + * @returns {string} 转化后的JSON字符串。 + */ + + }, { + key: "getJson", + value: function getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (var i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (var _i = 0; _i < len; _i++) { + if (_i > 0) { + jsonString += ","; + } + + jsonString += params[_i]; + } + } + + jsonString += ']'; + return jsonString; + } + }]); + + return ComputeWeightMatrixService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/DataFlowService.js +function DataFlowService_typeof(obj) { "@babel/helpers - typeof"; return DataFlowService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DataFlowService_typeof(obj); } + +function DataFlowService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DataFlowService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DataFlowService_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataFlowService_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataFlowService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DataFlowService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DataFlowService_setPrototypeOf(subClass, superClass); } + +function DataFlowService_setPrototypeOf(o, p) { DataFlowService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataFlowService_setPrototypeOf(o, p); } + +function DataFlowService_createSuper(Derived) { var hasNativeReflectConstruct = DataFlowService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DataFlowService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DataFlowService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DataFlowService_possibleConstructorReturn(this, result); }; } + +function DataFlowService_possibleConstructorReturn(self, call) { if (call && (DataFlowService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DataFlowService_assertThisInitialized(self); } + +function DataFlowService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DataFlowService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DataFlowService_getPrototypeOf(o) { DataFlowService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataFlowService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DataFlowService + * @deprecatedclass SuperMap.DataFlowService + * @category iServer DataFlow + * @classdesc 数据流服务类 + * @extends {CommonServiceBase} + * @param {string} url - 数据流服务地址 + * @param {Object} options - 参数。 + * @param {function} options.style - 设置数据加载样式。 + * @param {function} [options.onEachFeature] - 设置每个数据加载popup等。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.excludeField] - -排除字段。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var DataFlowService = /*#__PURE__*/function (_CommonServiceBase) { + DataFlowService_inherits(DataFlowService, _CommonServiceBase); + + var _super = DataFlowService_createSuper(DataFlowService); + + function DataFlowService(url, options) { + var _this; + + DataFlowService_classCallCheck(this, DataFlowService); + + options = options || {}; + /* + * @constant EVENT_TYPES + * {Array.} + * 此类支持的事件类型 + */ + + options.EVENT_TYPES = ["broadcastSocketConnected", "broadcastSocketError", "broadcastFailed", "broadcastSucceeded", "subscribeSocketConnected", "subscribeSocketError", "messageSucceeded", "setFilterParamSucceeded"]; + _this = _super.call(this, url, options); + /** + * @member {GeoJSONObject} DataFlowService.prototype.geometry + * @description 指定几何范围,该范围内的要素才能被订阅。 + */ + + _this.geometry = null; + /** + * @member {Object} DataFlowService.prototype.prjCoordSys + * @description 动态投影参数 + */ + + _this.prjCoordSys = null; + /** + * @member {Object} DataFlowService.prototype.excludeField + * @description 排除字段 + */ + + _this.excludeField = null; + Util.extend(DataFlowService_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.DataFlowService"; + return _this; + } + /** + * @function DataFlowService.prototype.initBroadcast + * @description 初始化广播 + * @returns {DataFlowService} + */ + + + DataFlowService_createClass(DataFlowService, [{ + key: "initBroadcast", + value: function initBroadcast() { + var me = this; + this.broadcastWebSocket = this._connect(Util.urlPathAppend(me.url, 'broadcast')); + + this.broadcastWebSocket.onopen = function (e) { + me.broadcastWebSocket.isOpen = true; + e.eventType = 'broadcastSocketConnected'; + me.events.triggerEvent('broadcastSocketConnected', e); + }; + + this.broadcastWebSocket.onclose = function (e) { + me.broadcastWebSocket.isOpen = false; + e.eventType = 'broadcastSocketConnected'; + me.events.triggerEvent('broadcastSocketConnected', e); + }; + + this.broadcastWebSocket.onerror = function (e) { + e.eventType = 'broadcastSocketError'; + me.events.triggerEvent('broadcastSocketError', e); + }; + + return this; + } + /** + * @function DataFlowService.prototype.broadcast + * @description 加载广播数据。 + * @param {GeoJSONObject} geoJSONFeature - JSON 格式的要素数据。 + */ + + }, { + key: "broadcast", + value: function broadcast(geoJSONFeature) { + if (!this.broadcastWebSocket || !this.broadcastWebSocket.isOpen) { + this.events.triggerEvent('broadcastFailed'); + return; + } + + this.broadcastWebSocket.send(JSON.stringify(geoJSONFeature)); + this.events.triggerEvent('broadcastSucceeded'); + } + /** + * @function DataFlowService.prototype.initSubscribe + * @description 初始化订阅数据 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + + }, { + key: "initSubscribe", + value: function initSubscribe() { + var me = this; + this.subscribeWebSocket = this._connect(Util.urlPathAppend(me.url, 'subscribe')); + + this.subscribeWebSocket.onopen = function (e) { + me.subscribeWebSocket.send(me._getFilterParams()); + e.eventType = 'subscribeSocketConnected'; + me.events.triggerEvent('subscribeSocketConnected', e); + }; + + this.subscribeWebSocket.onerror = function (e) { + e.eventType = 'subscribeSocketError'; + me.events.triggerEvent('subscribeSocketError', e); + }; + + this.subscribeWebSocket.onmessage = function (e) { + me._onMessage(e); + }; + + return this; + } + /** + * @function DataFlowService.prototype.setExcludeField + * @description 设置排除字段 + * @param {Object} excludeField - 排除字段 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + + }, { + key: "setExcludeField", + value: function setExcludeField(excludeField) { + this.excludeField = excludeField; + this.subscribeWebSocket.send(this._getFilterParams()); + return this; + } + /** + * @function DataFlowService.prototype.setGeometry + * @description 设置添加的几何要素数据 + * @param {GeoJSONObject} geometry - 指定几何范围,该范围内的要素才能被订阅。 + * @returns {DataFlowService} DataFlowService的实例对象。 + */ + + }, { + key: "setGeometry", + value: function setGeometry(geometry) { + this.geometry = geometry; + this.subscribeWebSocket.send(this._getFilterParams()); + return this; + } + /** + * @function DataFlowService.prototype.unSubscribe + * @description 结束订阅数据 + */ + + }, { + key: "unSubscribe", + value: function unSubscribe() { + if (!this.subscribeWebSocket) { + return; + } + + this.subscribeWebSocket.close(); + this.subscribeWebSocket = null; + } + /** + * @function DataFlowService.prototype.unBroadcast + * @description 结束加载广播 + */ + + }, { + key: "unBroadcast", + value: function unBroadcast() { + if (!this.broadcastWebSocket) { + return; + } + + this.broadcastWebSocket.close(); + this.broadcastWebSocket = null; + } + /** + * @function DataFlowService.prototype.destroy + * @override + */ + + }, { + key: "destroy", + value: function destroy() { + CommonServiceBase.prototype.destroy.apply(this, arguments); + var me = this; + me.geometry = null; + me.prjCoordSys = null; + me.excludeField = null; + this.unBroadcast(); + this.unSubscribe(); + } + }, { + key: "_getFilterParams", + value: function _getFilterParams() { + var filter = { + filterParam: { + prjCoordSys: this.prjCoordSys, + excludeField: this.excludeField, + geometry: this.geometry + } + }; + return Util.toJSON(filter); + } + }, { + key: "_onMessage", + value: function _onMessage(e) { + if (e.data && e.data.indexOf("filterParam") >= 0) { + var filterParam = JSON.parse(e.data); + e.filterParam = filterParam; + e.eventType = 'setFilterParamSucceeded'; + this.events.triggerEvent('setFilterParamSucceeded', e); + return; + } + + var feature = JSON.parse(e.data); + e.featureResult = feature; + e.eventType = 'messageSucceeded'; + this.events.triggerEvent('messageSucceeded', e); + } + }, { + key: "_connect", + value: function _connect(url) { + url = SecurityManager.appendCredential(url); + + if ("WebSocket" in window) { + return new WebSocket(url); + } else if ("MozWebSocket" in window) { + var mozWebSocket = window.MozWebSocket; + return new mozWebSocket(url); + } else { + console.log("no WebSocket"); + return null; + } + } + }]); + + return DataFlowService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetInfo.js +function DatasetInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetInfo_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetInfo_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetInfo_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetInfo_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DatasetInfo + * @deprecatedclass SuperMap.DatasetInfo + * @category iServer Data Dataset + * @classdesc 数据集信息类。 + * 数据集一般为存储在一起的相关数据的集合;根据数据类型的不同,分为矢量数据集、栅格数据集(griddataset)和 + * 影像数据集(image dataset),以及为了处理特定问题而设计的数据集,如拓扑数据集,网络数据集等。 + * 数据集是 GIS 数据组织的最小单位。其中矢量数据集是由同种类型空间要素组成的集合, + * 所以也可以称为要素集。根据要素的空间特征的不同,矢量数据集又分为点数据集, + * 线数据集,面数据集等,各矢量数据集是空间特征和性质相同的数据组织起来的集合。 + * 目前版本支持的数据集主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、 + * 网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + * @param {Object} options - 参数。 + * @param {Bounds} [options.bounds] - 数据集范围。 + * @param {string} [options.dataSourceName] - 数据源名称。 + * @param {string} [options.description] - 数据集的描述信息。 + * @param {string} [options.encodeType] - 数据集存储时的压缩编码方式。 + * @param {boolean} [options.isReadOnly] - 数据集是否为只读。 + * @param {string} options.name - 数据集名称。 + * @param {Object} [options.prjCoordSys] - 数据集的投影信息。如:prjCoordSys={"epsgCode":3857}。 + * @param {string} [options.tableName] - 表名。 + * @param {string} options.type - 数据集类型。主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + * @usage + */ + +var DatasetInfo = /*#__PURE__*/function () { + function DatasetInfo(options) { + DatasetInfo_classCallCheck(this, DatasetInfo); + + options = options || {}; + /** + * @member {Bounds} [DatasetInfo.prototype.bounds] + * @description 数据集范围,该字段只读。 + */ + + this.bounds = null; + /** + * @member {string} [DatasetInfo.prototype.dataSourceName] + * @description 数据源名称,该字段只读。 + */ + + this.dataSourceName = null; + /** + * @member {string} [DatasetInfo.prototype.description] + * @description 数据集的描述信息。 + */ + + this.description = null; + /** + * @member {string} [DatasetInfo.prototype.encodeType] + * @description 数据集存储时的压缩编码方式,该字段只读。 + */ + + this.encodeType = null; + /** + * @member {boolean} [DatasetInfo.prototype.isReadOnly] + * @description 数据集是否为只读。 + */ + + this.isReadOnly = null; + /** + * @member {string} DatasetInfo.prototype.name + * @description 数据集名称,该字段必须且只读。 + */ + + this.name = null; + /** + * @member {Object} [DatasetInfo.prototype.prjCoordSys] + * @description 数据集的投影信息。 + */ + + this.prjCoordSys = null; + /** + * @member {string} [DatasetInfo.prototype.tableName] + * @description 表名,该字段只读。 + */ + + this.tableName = null; + /** + * @member {string} DatasetInfo.prototype.type + * @description 数据集类型,该字段必设。主要有点数据集,线数据集,面数据集,文本数据集,复合数据集(CAD 数据集)、网络数据集,栅格数据集(grid dataset)和影像数据集(image dataset)。 + */ + + this.type = null; + Util.extend(this, options); + var b = this.bounds; + + if (b) { + this.bounds = new Bounds(b.leftBottom.x, b.leftBottom.y, b.rightTop.x, b.rightTop.y); + } + + this.CLASS_NAME = "SuperMap.DatasetInfo"; + } + /** + * @function DatasetInfo.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + DatasetInfo_createClass(DatasetInfo, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function DatasetInfo.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} JSON 对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); + + if (dataObj.bounds) { + if (dataObj.bounds.toServerJSONObject) { + dataObj.bounds = dataObj.bounds.toServerJSONObject(); + } + } + + return dataObj; + } + }]); + + return DatasetInfo; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/OverlayAnalystParameters.js +function OverlayAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OverlayAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OverlayAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) OverlayAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) OverlayAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class OverlayAnalystParameters + * @deprecatedclass SuperMap.OverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 叠加分析参数基类。数据集叠加分析参数和几何对象叠加分析参数均继承此基类。 + * @param {Object} options - 参数。 + * @usage + */ + +var OverlayAnalystParameters = /*#__PURE__*/function () { + function OverlayAnalystParameters(options) { + OverlayAnalystParameters_classCallCheck(this, OverlayAnalystParameters); + + /** + * @member {OverlayOperationType} [OverlayAnalystParameters.prototype.operation=OverlayOperationType.UNION] + * @description 指定叠加分析操作类型。 + */ + this.operation = OverlayOperationType.UNION; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.OverlayAnalystParameters"; + } + /** + * @function OverlayAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + OverlayAnalystParameters_createClass(OverlayAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.operation = null; + } + }]); + + return OverlayAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetOverlayAnalystParameters.js +function DatasetOverlayAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return DatasetOverlayAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasetOverlayAnalystParameters_typeof(obj); } + +function DatasetOverlayAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetOverlayAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetOverlayAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetOverlayAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetOverlayAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasetOverlayAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasetOverlayAnalystParameters_get = Reflect.get; } else { DatasetOverlayAnalystParameters_get = function _get(target, property, receiver) { var base = DatasetOverlayAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasetOverlayAnalystParameters_get.apply(this, arguments); } + +function DatasetOverlayAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasetOverlayAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasetOverlayAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasetOverlayAnalystParameters_setPrototypeOf(subClass, superClass); } + +function DatasetOverlayAnalystParameters_setPrototypeOf(o, p) { DatasetOverlayAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasetOverlayAnalystParameters_setPrototypeOf(o, p); } + +function DatasetOverlayAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = DatasetOverlayAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasetOverlayAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasetOverlayAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasetOverlayAnalystParameters_possibleConstructorReturn(this, result); }; } + +function DatasetOverlayAnalystParameters_possibleConstructorReturn(self, call) { if (call && (DatasetOverlayAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasetOverlayAnalystParameters_assertThisInitialized(self); } + +function DatasetOverlayAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasetOverlayAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasetOverlayAnalystParameters_getPrototypeOf(o) { DatasetOverlayAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasetOverlayAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DatasetOverlayAnalystParameters + * @deprecatedclass SuperMap.DatasetOverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 数据集叠加分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.operateDataset -数据集名称。 + * @param {string} options.sourceDataset - 源数据集名称。 + * @param {Array.} [options.operateDatasetFields] - 叠加分析中操作数据集保留在结果数据集中的字段名列表。 + * @param {FilterParameter} [options.operateDatasetFilter] - 设置操作数据集中空间对象过滤条件。 + * @param {Array.} [options.operateRegions] - 操作面对象集合,表示与这些面对象进行叠加分析。与 operateDataset 参数互斥,冲突时以 operateDataset 为准。 + * @param {Array.} [options.sourceDatasetFields] - 叠加分析中源数据集保留在结果数据集中的字段名列表。 + * @param {FilterParameter} [options.sourceDatasetFilter] - 设置源数据集中空间对象过滤条件。 + * @param {number} [options.tolerance=0] - 容限。 + * @param {OverlayOperationType} options.operation - 叠加操作枚举值。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var DatasetOverlayAnalystParameters = /*#__PURE__*/function (_OverlayAnalystParame) { + DatasetOverlayAnalystParameters_inherits(DatasetOverlayAnalystParameters, _OverlayAnalystParame); + + var _super = DatasetOverlayAnalystParameters_createSuper(DatasetOverlayAnalystParameters); + + function DatasetOverlayAnalystParameters(options) { + var _this; + + DatasetOverlayAnalystParameters_classCallCheck(this, DatasetOverlayAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {string} DatasetOverlayAnalystParameters.prototype.operateDataset + * @description 叠加分析中操作数据集的名称。 + */ + + _this.operateDataset = null; + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.operateDatasetFields] + * @description 叠加分析中操作数据集保留在结果数据集中的字段名列表。 + */ + + _this.operateDatasetFields = []; + /** + * @member {FilterParameter} DatasetOverlayAnalystParameters.prototype.operateDatasetFilter + * @description 设置操作数据集中空间对象过滤条件。 + */ + + _this.operateDatasetFilter = new FilterParameter(); + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.operateRegions] + * @description 操作面对象集合,表示与这些面对象进行叠加分析。与 operateDataset 参数互斥,冲突时以 operateDataset 为准。 + */ + + _this.operateRegions = []; + /** + * @member {string} DatasetOverlayAnalystParameters.prototype.sourceDataset + * @description 叠加分析中源数据集的名称。 + */ + + _this.sourceDataset = null; + /** + * @member {Array.} [DatasetOverlayAnalystParameters.prototype.sourceDatasetFields] + * @description 叠加分析中源数据集保留在结果数据集中的字段名列表。 + */ + + _this.sourceDatasetFields = []; + /** + * @member {FilterParameter} [DatasetOverlayAnalystParameters.prototype.filterQueryParameter] + * @description 设置源数据集中空间对象过滤条件。 + */ + + _this.sourceDatasetFilter = new FilterParameter(); + /** + * @member {number} [DatasetOverlayAnalystParameters.prototype.tolerance=0] + * @description 容限。 + */ + + _this.tolerance = 0; + /** + * @member {DataReturnOption} [DatasetOverlayAnalystParameters.prototype.resultSetting] + * @description 结果返回设置类。 + */ + + _this.resultSetting = new DataReturnOption(); + Util.extend(DatasetOverlayAnalystParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.DatasetOverlayAnalystParameters"; + return _this; + } + /** + * @function DatasetOverlayAnalystParameters.prototype.destroy + * @override + */ + + + DatasetOverlayAnalystParameters_createClass(DatasetOverlayAnalystParameters, [{ + key: "destroy", + value: function destroy() { + DatasetOverlayAnalystParameters_get(DatasetOverlayAnalystParameters_getPrototypeOf(DatasetOverlayAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.operateDataset = null; + me.operateDatasetFields = null; + + if (me.operateDatasetFilter) { + me.operateDatasetFilter.destroy(); + me.operateDatasetFilter = null; + } + + if (me.operateRegions) { + for (var i = 0, opRegions = me.operateRegions, len = opRegions.length; i < len; i++) { + opRegions[i].destroy(); + } + + me.operateRegions = null; + } + + me.sourceDataset = null; + me.sourceDatasetFields = null; + + if (me.sourceDatasetFilter) { + me.sourceDatasetFilter.destroy(); + me.sourceDatasetFilter = null; + } + + me.tolerance = null; + + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + } + /** + * @function DatasetOverlayAnalystParameters.toObject + * @param {DatasetOverlayAnalystParameters} datasetOverlayAnalystParameters - 数据集叠加分析参数类。 + * @param {DatasetOverlayAnalystParameters} tempObj - 数据集叠加分析参数对象。 + * @description 将数据集叠加分析参数类转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(datasetOverlayAnalystParameters, tempObj) { + for (var name in datasetOverlayAnalystParameters) { + if (name === "sourceDataset") { + continue; + } else if (name === "operateRegions") { + tempObj.operateRegions = []; + var ors = datasetOverlayAnalystParameters.operateRegions; + + for (var index in ors) { + if (ors.hasOwnProperty(index)) { + //icl542 + tempObj.operateRegions[index] = ServerGeometry.fromGeometry(ors[index]); + } + } + } else if (name === "resultSetting") { + tempObj.dataReturnOption = datasetOverlayAnalystParameters.resultSetting; + } else { + tempObj[name] = datasetOverlayAnalystParameters[name]; + } + } + } + }]); + + return DatasetOverlayAnalystParameters; +}(OverlayAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystParametersSetting.js +function SurfaceAnalystParametersSetting_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SurfaceAnalystParametersSetting_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SurfaceAnalystParametersSetting_createClass(Constructor, protoProps, staticProps) { if (protoProps) SurfaceAnalystParametersSetting_defineProperties(Constructor.prototype, protoProps); if (staticProps) SurfaceAnalystParametersSetting_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SurfaceAnalystParametersSetting + * @deprecatedclass SuperMap.SurfaceAnalystParametersSetting + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析参数设置类。 + * 通过该类可以设置表面分析提取等值线、提取等值面的一些参数,包括基准值、等值距、光滑度、光滑方法等。 + * @param {Object} options - 参数。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.clipRegion] - 裁剪面对象,如果不需要对操作结果进行裁剪,可以使用 null 值取代该参数。 + * @param {number} [options.datumValue=0] - 提取等值线、提取等值面的基准值。 + * @param {Array.} options.expectedZValues - 期望分析结果的 Z 值集合。 + * @param {number} [options.interval=0] - 等值距。等值距是两条等值线之间的间隔值。 + * @param {number} [options.resampleTolerance=0] - 重采样容限。 + * @param {SmoothMethod} [options.smoothMethod=SmoothMethod.BSPLINE] - 光滑处理所使用的方法。 + * @param {number} [options.smoothness=0] - 等值线或等值面的边界线的光滑度。 + * @usage + */ + +var SurfaceAnalystParametersSetting = /*#__PURE__*/function () { + function SurfaceAnalystParametersSetting(options) { + SurfaceAnalystParametersSetting_classCallCheck(this, SurfaceAnalystParametersSetting); + + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [SurfaceAnalystParametersSetting.prototype.clipRegion] + * @description 获取或设置裁剪面对象,如果不需要对操作结果进行裁剪,可以使用 null 值取代该参数。 + */ + this.clipRegion = null; + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.datumValue=0] + * @description 获取或设置表面分析中提取等值线、提取等值面的基准值。 + * 基准值是作为一个生成等值线的初始起算值,并不一定是最小等值线的值。 例如,高程范围为 220 -1550 的 DEM 栅格数据, + * 如果设基准值为 0, 等值距为 50,则提取等值线时,以基准值 0 为起点,等值距 50 为间隔提取等值线, + * 因为给定高程的最小值是 220,所以,在给定范围内提取等值线的最小高程是 250。 + * 提取等值线的结果是:最小等值线值为 250,最大等值线值为 1550。 + */ + + this.datumValue = 0; + /** + * @member {Array.} SurfaceAnalystParametersSetting.prototype.expectedZValues + * @description 获取或设置期望分析结果的 Z 值集合。 + * Z 值集合存储一系列数值,该数值为待提取等值线的值。即仅高程值在 Z 值集合中的等值线会被提取。 + */ + + this.expectedZValues = null; + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.interval=0] + * @description 获取或设置等值距。等值距是两条等值线之间的间隔值。 + */ + + this.interval = 0; + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.resampleTolerance=0] + * @description 获取或设置重采样容限。 + * 容限值越大,采样结果数据越简化。当分析结果出现交叉时,可通过调整重采样容限为较小的值来处理。 + */ + + this.resampleTolerance = 0; + /** + * @member {SmoothMethod} [SurfaceAnalystParametersSetting.prototype.smoothMethod=SmoothMethod.BSPLINE] + * @description 获取或设置光滑处理所使用的方法。 + */ + + this.smoothMethod = SmoothMethod.BSPLINE; + /** + * @member {number} [SurfaceAnalystParametersSetting.prototype.smoothness=0] + * @description 获取或设置表面分析中等值线或等值面的边界线的光滑度。 + * 以为 0-5 为例,光滑度为 0 表示不进行光滑操作,值越大表示光滑度越高。 + * 随着光滑度的增加,提取的等值线越光滑.当然光滑度越大, + * 计算所需的时间和占用的内存也就越大。而且,当等值距较小时, + * 光滑度太高会出现等值线相交的问题。 + */ + + this.smoothness = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SurfaceAnalystParametersSetting"; + } + /** + * @function SurfaceAnalystParametersSetting.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SurfaceAnalystParametersSetting_createClass(SurfaceAnalystParametersSetting, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.clipRegion) { + me.clipRegion.destroy(); + me.clipRegion = null; + } + + me.datumValue = null; + me.expectedZValues = null; + me.interval = null; + me.resampleTolerance = null; + me.smoothMethod = null; + me.smoothness = null; + } + /** + * @function SurfaceAnalystParametersSetting.prototype.toJSON + * @description 将对象转化为 JSON 字符串。 + * @returns {string} 对象 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var json = "'datumValue':" + Util.toJSON(this.datumValue); + json += ",'interval':" + Util.toJSON(this.interval); + json += ",'resampleTolerance':" + Util.toJSON(this.resampleTolerance); + json += ",'smoothMethod':" + Util.toJSON(this.smoothMethod); + json += ",'smoothness':" + Util.toJSON(this.smoothness); + + if (this.expectedZValues != null) { + json += "," + "'expectedZValues':" + Util.toJSON(this.expectedZValues); + } + + if (this.clipRegion != null) { + var serverGeometry = this.clipRegion; + + if (this.clipRegion instanceof Geometry && this.clipRegion.components) { + serverGeometry = ServerGeometry.fromGeometry(this.clipRegion); + } + + json += ",'clipRegion':" + Util.toJSON(serverGeometry); + } + + return "{" + json + "}"; + } + }]); + + return SurfaceAnalystParametersSetting; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystParameters.js +function SurfaceAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SurfaceAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SurfaceAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) SurfaceAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) SurfaceAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SurfaceAnalystParameters + * @deprecatedclass SuperMap.SurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析提取操作参数类。通过该类可以为进行表面分析提供参数信息,包括表面分析的方法提取等值线、提取等值面和中间结果的分辨率, + * {@link DatasetSurfaceAnalystParameters} 和 {@link GeometrySurfaceAnalystParameters} 继承自该类。 + * @param {Object} options - 参数。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 表面分析参数设置类。 + * @param {number} options.resolution - 指定中间结果(栅格数据集)的分辨率。 + * @param {DataReturnOption} options.resultSetting - 结果返回设置类。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] - 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + * @usage + */ + +var SurfaceAnalystParameters = /*#__PURE__*/function () { + function SurfaceAnalystParameters(options) { + SurfaceAnalystParameters_classCallCheck(this, SurfaceAnalystParameters); + + /** + * @member {number} SurfaceAnalystParameters.prototype.resolution + * @description 获取或设置指定中间结果(栅格数据集)的分辨率。 + */ + this.resolution = 0; + /** + * @member {SurfaceAnalystParametersSetting} SurfaceAnalystParameters.prototype.extractParameter + * @description 获取或设置表面分析参数。 + * 在进行点数据集进行提取等值面分析时,暂时不支持 SurfaceAnalystParametersSetting 类中的 expectedZValues 字段。 + */ + + this.extractParameter = new SurfaceAnalystParametersSetting(); + /** + * @member {DataReturnOption} SurfaceAnalystParameters.prototype.resultSetting + * @description 结果返回设置类。 + */ + + this.resultSetting = new DataReturnOption(); + /** + * @member {SurfaceAnalystMethod} [SurfaceAnalystParameters.prototype.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] + * @description 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + */ + + this.surfaceAnalystMethod = SurfaceAnalystMethod.ISOLINE; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SurfaceAnalystParameters"; + } + /** + * @function SurfaceAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SurfaceAnalystParameters_createClass(SurfaceAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.resolution = null; + + if (me.extractParameter) { + me.extractParameter.destroy(); + me.extractParameter = null; + } + + if (me.resultSetting) { + me.resultSetting.destroy(); + me.resultSetting = null; + } + + me.surfaceAnalystMethod = null; + } + }]); + + return SurfaceAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetSurfaceAnalystParameters.js +function DatasetSurfaceAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return DatasetSurfaceAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasetSurfaceAnalystParameters_typeof(obj); } + +function DatasetSurfaceAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetSurfaceAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetSurfaceAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetSurfaceAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetSurfaceAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasetSurfaceAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasetSurfaceAnalystParameters_get = Reflect.get; } else { DatasetSurfaceAnalystParameters_get = function _get(target, property, receiver) { var base = DatasetSurfaceAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasetSurfaceAnalystParameters_get.apply(this, arguments); } + +function DatasetSurfaceAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasetSurfaceAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasetSurfaceAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasetSurfaceAnalystParameters_setPrototypeOf(subClass, superClass); } + +function DatasetSurfaceAnalystParameters_setPrototypeOf(o, p) { DatasetSurfaceAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasetSurfaceAnalystParameters_setPrototypeOf(o, p); } + +function DatasetSurfaceAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = DatasetSurfaceAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasetSurfaceAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasetSurfaceAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasetSurfaceAnalystParameters_possibleConstructorReturn(this, result); }; } + +function DatasetSurfaceAnalystParameters_possibleConstructorReturn(self, call) { if (call && (DatasetSurfaceAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasetSurfaceAnalystParameters_assertThisInitialized(self); } + +function DatasetSurfaceAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasetSurfaceAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasetSurfaceAnalystParameters_getPrototypeOf(o) { DatasetSurfaceAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasetSurfaceAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DatasetSurfaceAnalystParameters + * @deprecatedclass SuperMap.DatasetSurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 数据集表面分析参数类。该类对数据集表面分析所用到的参数进行设置。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.zValueFieldName - 字段名称。 + * @param {number} options.resolution - 指定中间结果(栅格数据集)的分辨率。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 表面分析参数设置类。获取或设置表面分析参数。 + * @param {FilterParameter} [options.filterQueryParameter] - 查询过滤条件参数。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod=SurfaceAnalystMethod.ISOLINE] - 表面分析的提取方法,提取等值线和提取等值面。 + * @extends {SurfaceAnalystParameters} + * @usage + */ + +var DatasetSurfaceAnalystParameters = /*#__PURE__*/function (_SurfaceAnalystParame) { + DatasetSurfaceAnalystParameters_inherits(DatasetSurfaceAnalystParameters, _SurfaceAnalystParame); + + var _super = DatasetSurfaceAnalystParameters_createSuper(DatasetSurfaceAnalystParameters); + + function DatasetSurfaceAnalystParameters(options) { + var _this; + + DatasetSurfaceAnalystParameters_classCallCheck(this, DatasetSurfaceAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {string} DatasetSurfaceAnalystParameters.prototype.dataset + * @description 要用来做数据集表面分析的数据源中数据集的名称。该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:Country@World。 + */ + + _this.dataset = null; + /** + * @member {FilterParameter} DatasetSurfaceAnalystParameters.prototype.filterQueryParameter + * @description 获取或设置查询过滤条件参数。 + */ + + _this.filterQueryParameter = new FilterParameter(); + /** + * @member {string} DatasetSurfaceAnalystParameters.prototype.zValueFieldName + * @description 获取或设置用于提取操作的字段名称。提取等值线时,将使用该字段中的值,对点记录集中的点数据进行插值分析,得到栅格数据集(中间结果),接着从栅格数据集提取等值线。 + */ + + _this.zValueFieldName = null; + + if (options) { + Util.extend(DatasetSurfaceAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.DatasetSurfaceAnalystParameters"; + return _this; + } + /** + * @function DatasetSurfaceAnalystParameters.prototype.destroy + * @override + */ + + + DatasetSurfaceAnalystParameters_createClass(DatasetSurfaceAnalystParameters, [{ + key: "destroy", + value: function destroy() { + DatasetSurfaceAnalystParameters_get(DatasetSurfaceAnalystParameters_getPrototypeOf(DatasetSurfaceAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.dataset = null; + + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + + me.zValueFieldName = null; + } + /** + * @function DatasetSurfaceAnalystParameters.toObject + * @param {DatasetSurfaceAnalystParameters} datasetSurfaceAnalystParameters - 数据集表面分析参数类。 + * @param {DatasetSurfaceAnalystParameters} tempObj - 数据集表面分析参数对象。 + * @description 将数据集表面分析参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(datasetSurfaceAnalystParameters, tempObj) { + for (var name in datasetSurfaceAnalystParameters) { + if (name === "filterQueryParameter") { + tempObj.filterQueryParameter = datasetSurfaceAnalystParameters.filterQueryParameter; + } + + if (name === "extractParameter") { + if (datasetSurfaceAnalystParameters.extractParameter.clipRegion instanceof Geometry && datasetSurfaceAnalystParameters.extractParameter.clipRegion.components) { + datasetSurfaceAnalystParameters.extractParameter.clipRegion = ServerGeometry.fromGeometry(datasetSurfaceAnalystParameters.extractParameter.clipRegion); + } + + tempObj.extractParameter = datasetSurfaceAnalystParameters.extractParameter; + } else if (name === "dataset") { + continue; + } else if (name === "surfaceAnalystMethod") { + continue; + } else { + tempObj[name] = datasetSurfaceAnalystParameters[name]; + } + } + } + }]); + + return DatasetSurfaceAnalystParameters; +}(SurfaceAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/ThiessenAnalystParameters.js +function ThiessenAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThiessenAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThiessenAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThiessenAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThiessenAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThiessenAnalystParameters + * @deprecatedclass SuperMap.ThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc 泰森多边形分析参数基类。 + * @param {Object} options - 可选参数。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.clipRegion] - 结果数据裁剪区域,可以为 null,表示不对结果进行裁剪。 + * @param {boolean} [options.createResultDataset=false] - 是否返回结果数据集。 + * @param {string} [options.resultDatasetName] - 指定结果数据集名称。 + * @param {string} [options.resultDatasourceName] - 指定结果数据集所在数据源,默认为当前数据源。 + * @param {boolean} [options.returnResultRegion=true] - 是否返回分析得到的多边形面数组。 + * @usage + */ + +var ThiessenAnalystParameters = /*#__PURE__*/function () { + function ThiessenAnalystParameters(options) { + ThiessenAnalystParameters_classCallCheck(this, ThiessenAnalystParameters); + + if (!options) { + return; + } + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [ThiessenAnalystParameters.prototype.clipRegion] + * @description 结果数据裁剪区域,可以为 null,表示不对结果进行裁剪。 + */ + + + this.clipRegion = null; + /** + * @member {boolean} [ThiessenAnalystParameters.prototype.createResultDataset=false] + * @description 是否返回结果数据集。如果为 true,则必须设置属性 resultDatasetName 和 resultDatasourceName。 + */ + + this.createResultDataset = false; + /** + * @member {string} ThiessenAnalystParameters.prototype.resultDatasetName + * @description 指定结果数据集名称。 + */ + + this.resultDatasetName = null; + /** + * @member {string} ThiessenAnalystParameters.prototype.resultDatasourceName + * @description 指定结果数据集所在数据源。 + */ + + this.resultDatasourceName = null; + /** + * @member {boolean} ThiessenAnalystParameters.prototype.returnResultRegion + * @description 是否返回分析得到的多边形面数组。 + */ + + this.returnResultRegion = true; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.ThiessenAnalystParameters"; + } + /** + * @function ThiessenAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThiessenAnalystParameters_createClass(ThiessenAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.clipRegion) { + me.clipRegion.destroy(); + me.clipRegion = null; + } + + me.createResultDataset = null; + me.resultDatasetName = null; + me.resultDatasourceName = null; + me.returnResultRegion = null; + } + }]); + + return ThiessenAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetThiessenAnalystParameters.js +function DatasetThiessenAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return DatasetThiessenAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasetThiessenAnalystParameters_typeof(obj); } + +function DatasetThiessenAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetThiessenAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetThiessenAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetThiessenAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetThiessenAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasetThiessenAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasetThiessenAnalystParameters_get = Reflect.get; } else { DatasetThiessenAnalystParameters_get = function _get(target, property, receiver) { var base = DatasetThiessenAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasetThiessenAnalystParameters_get.apply(this, arguments); } + +function DatasetThiessenAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasetThiessenAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasetThiessenAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasetThiessenAnalystParameters_setPrototypeOf(subClass, superClass); } + +function DatasetThiessenAnalystParameters_setPrototypeOf(o, p) { DatasetThiessenAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasetThiessenAnalystParameters_setPrototypeOf(o, p); } + +function DatasetThiessenAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = DatasetThiessenAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasetThiessenAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasetThiessenAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasetThiessenAnalystParameters_possibleConstructorReturn(this, result); }; } + +function DatasetThiessenAnalystParameters_possibleConstructorReturn(self, call) { if (call && (DatasetThiessenAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasetThiessenAnalystParameters_assertThisInitialized(self); } + +function DatasetThiessenAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasetThiessenAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasetThiessenAnalystParameters_getPrototypeOf(o) { DatasetThiessenAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasetThiessenAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DatasetThiessenAnalystParameters + * @deprecatedclass SuperMap.DatasetThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenAnalyst + * @classdesc 数据集泰森多边形分析参数类。 + * @param {Object} options - 参数。 + * @param {FilterParameter} [options.filterQueryParameter] - 过滤参数类,即对数据集中的所有点进行分析。 + * @extends {ThiessenAnalystParameters} + * @usage + */ + +var DatasetThiessenAnalystParameters = /*#__PURE__*/function (_ThiessenAnalystParam) { + DatasetThiessenAnalystParameters_inherits(DatasetThiessenAnalystParameters, _ThiessenAnalystParam); + + var _super = DatasetThiessenAnalystParameters_createSuper(DatasetThiessenAnalystParameters); + + function DatasetThiessenAnalystParameters(options) { + var _this; + + DatasetThiessenAnalystParameters_classCallCheck(this, DatasetThiessenAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {FilterParameter} [DatasetThiessenAnalystParameters.prototype.filterQueryParameter] + * @description 过滤条件,对待分析数据集中的点进行过滤,即对数据集中的所有点进行分析。 + * @example + * var filterQueryParameter = new FilterParameter({ + * name: "Countries@World", + * attributeFilter: "SmID>100" + * }); + */ + + _this.filterQueryParameter = null; + /** + * @member {string} DatasetThiessenAnalystParameters.prototype.dataset + * @description 数据集名称待分析的数据集名称,请使用 "datasetName@datasourceName" 格式来表示。 + */ + + _this.dataset = null; + + if (options) { + Util.extend(DatasetThiessenAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.DatasetThiessenAnalystParameters"; + return _this; + } + /** + * @function DatasetThiessenAnalystParameters.prototype.destroy + * @override + */ + + + DatasetThiessenAnalystParameters_createClass(DatasetThiessenAnalystParameters, [{ + key: "destroy", + value: function destroy() { + DatasetThiessenAnalystParameters_get(DatasetThiessenAnalystParameters_getPrototypeOf(DatasetThiessenAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.filterQueryParameter) { + me.filterQueryParameter.destroy(); + me.filterQueryParameter = null; + } + } + /** + * @function DatasetThiessenAnalystParameters.toObject + * @param {DatasetThiessenAnalystParameters} datasetThiessenAnalystParameters - 泰森多边形分析服务参数类。 + * @param {DatasetThiessenAnalystParameters} tempObj - 泰森多边形分析服务参数对象。 + * @description 将泰森多边形分析服务参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(datasetThiessenAnalystParameters, tempObj) { + for (var name in datasetThiessenAnalystParameters) { + if (name === "clipRegion") { + tempObj.clipRegion = ServerGeometry.fromGeometry(datasetThiessenAnalystParameters.clipRegion); + } else { + tempObj[name] = datasetThiessenAnalystParameters[name]; + } + } + } + }]); + + return DatasetThiessenAnalystParameters; +}(ThiessenAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/DatasourceService.js +function DatasourceService_typeof(obj) { "@babel/helpers - typeof"; return DatasourceService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasourceService_typeof(obj); } + +function DatasourceService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasourceService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasourceService_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasourceService_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasourceService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasourceService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasourceService_get = Reflect.get; } else { DatasourceService_get = function _get(target, property, receiver) { var base = DatasourceService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasourceService_get.apply(this, arguments); } + +function DatasourceService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasourceService_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasourceService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasourceService_setPrototypeOf(subClass, superClass); } + +function DatasourceService_setPrototypeOf(o, p) { DatasourceService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasourceService_setPrototypeOf(o, p); } + +function DatasourceService_createSuper(Derived) { var hasNativeReflectConstruct = DatasourceService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasourceService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasourceService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasourceService_possibleConstructorReturn(this, result); }; } + +function DatasourceService_possibleConstructorReturn(self, call) { if (call && (DatasourceService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasourceService_assertThisInitialized(self); } + +function DatasourceService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasourceService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasourceService_getPrototypeOf(o) { DatasourceService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasourceService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DatasourceService + * @deprecatedclass SuperMap.DatasourceService + * @category iServer Data Datasource + * @classdesc 数据源查询服务。 + * @param {string} url - 服务地址。如访问World Data服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string} options.datasource - 要查询的数据集所在的数据源名称。 + * @param {string} options.dataset - 要查询的数据集名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ + +var DatasourceService = /*#__PURE__*/function (_CommonServiceBase) { + DatasourceService_inherits(DatasourceService, _CommonServiceBase); + + var _super = DatasourceService_createSuper(DatasourceService); + + function DatasourceService(url, options) { + var _this; + + DatasourceService_classCallCheck(this, DatasourceService); + + _this = _super.call(this, url, options); + + if (options) { + Util.extend(DatasourceService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.DatasourceService"; + return _this; + } + /** + * @function DatasourceService.prototype.destroy + * @override + */ + + + DatasourceService_createClass(DatasourceService, [{ + key: "destroy", + value: function destroy() { + DatasourceService_get(DatasourceService_getPrototypeOf(DatasourceService.prototype), "destroy", this).call(this); + } + /** + * @function DatasourceService.prototype.getDatasourceService + * @description 获取指定数据源信息。 + */ + + }, { + key: "getDatasourceService", + value: function getDatasourceService(datasourceName) { + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources/name/".concat(datasourceName)); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasourceService.prototype.getDatasourcesService + * @description 获取所有数据源信息。 + */ + + }, { + key: "getDatasourcesService", + value: function getDatasourcesService() { + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources"); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasourceService.prototype.setDatasourceService + * @description 更新数据源信息。 + */ + + }, { + key: "setDatasourceService", + value: function setDatasourceService(params) { + if (!params) { + return; + } + + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return DatasourceService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/DensityKernelAnalystParameters.js +function DensityKernelAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DensityKernelAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DensityKernelAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) DensityKernelAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) DensityKernelAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class DensityKernelAnalystParameters + * @deprecatedclass SuperMap.DensityKernelAnalystParameters + * @category iServer SpatialAnalyst DensityAnalyst + * @classdesc 核密度分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 要用来做核密度分析数据源中数据集的名称。该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:BaseMap_P@Jingjin。 + * @param {string} options.fieldName - 用于进行核密度分析的测量值的字段名称,核密度分析不支持文本类型的字段。 + * @param {string} options.resultGridName - 指定结果数据集名称。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.bounds] - 核密度分析的范围,用于确定结果栅格数据集的范围。如果缺省,则默认为原数据集的范围。 + * @param {number} [options.searchRadius] - 栅格邻域内用于计算密度的查找半径,单位与当前数据集相同。默认值为当前数据集的长宽中的最大值除30。 + * @param {number} [options.resultGridDatasetResolution] - 密度分析结果栅格数据的分辨率,单位与当前数据集相同。默认值为当前数据集的长宽中的最小值除500。 + * @param {string} [options.targetDatasource] - 指定的存储结果数据集的数据源,默认为当前分析的数据集所在的数据源。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ + +var DensityKernelAnalystParameters = /*#__PURE__*/function () { + function DensityKernelAnalystParameters(options) { + DensityKernelAnalystParameters_classCallCheck(this, DensityKernelAnalystParameters); + + /** + * @member {string} DensityKernelAnalystParameters.prototype.dataset + * @description 要用来做核密度分析数据源中数据集的名称。 + * 该名称用形如 "数据集名称@数据源别名" 形式来表示,例如:Railway@Changchun。 + * 注:核密度分析支持点数据集和线数据集。 + */ + this.dataset = null; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [DensityKernelAnalystParameters.prototype.bounds] + * @description 核密度分析的范围,用于确定结果栅格数据集的范围。 + * 如果缺省,则默认为原数据集的范围。 + */ + + this.bounds = null; + /** + * @member {string} DensityKernelAnalystParameters.prototype.fieldName + * @description 用于进行核密度分析的测量值的字段名称,核密度分析不支持文本类型的字段。 + */ + + this.fieldName = null; + /** + * @member {number} [DensityKernelAnalystParameters.prototype.resultGridDatasetResolution] + * @description 密度分析结果栅格数据的分辨率,单位与当前数据集相同。默认值为当前数据集的长宽中的最小值除500。 + */ + + this.resultGridDatasetResolution = null; + /** + * @member {number} [DensityKernelAnalystParameters.prototype.searchRadius] + * @description 栅格邻域内用于计算密度的查找半径,单位与当前数据集相同。默认值为当前数据集的长宽中的最大值除30。 + */ + + this.searchRadius = null; + /** + * @member {string} [DensityKernelAnalystParameters.prototype.targetDatasource] + * @description 指定的存储结果数据集的数据源,默认为当前分析的数据集所在的数据源。 + */ + + this.targetDatasource = null; + /** + * @member {string} DensityKernelAnalystParameters.prototype.resultGridName + * @description 指定结果数据集名称。 + */ + + this.resultGridName = null; + /** + * @member {boolean} [DensityKernelAnalystParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + + this.deleteExistResultDataset = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.DensityKernelAnalystParameters"; + } + /** + * @function DensityKernelAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + DensityKernelAnalystParameters_createClass(DensityKernelAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dataset = null; + me.bounds = null; + me.fieldName = null; + me.resultGridDatasetResolution = null; + me.searchRadius = null; + me.targetDatasource = null; + me.resultGridName = null; + me.deleteExistResultDataset = null; + } + /** + * @function DensityKernelAnalystParameters.toObject + * @param {DensityKernelAnalystParameters} densityKernelAnalystParameters -核密度分析参数类。 + * @param {DensityKernelAnalystParameters} tempObj - 核密度分析参数对象。 + * @description 将核密度分析参数对象转换成 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(densityKernelAnalystParameters, tempObj) { + for (var name in densityKernelAnalystParameters) { + if (name !== "dataset") { + tempObj[name] = densityKernelAnalystParameters[name]; + } + } + } + }]); + + return DensityKernelAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/DensityAnalystService.js +function DensityAnalystService_typeof(obj) { "@babel/helpers - typeof"; return DensityAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DensityAnalystService_typeof(obj); } + +function DensityAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DensityAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DensityAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) DensityAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) DensityAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DensityAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DensityAnalystService_get = Reflect.get; } else { DensityAnalystService_get = function _get(target, property, receiver) { var base = DensityAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DensityAnalystService_get.apply(this, arguments); } + +function DensityAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DensityAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function DensityAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DensityAnalystService_setPrototypeOf(subClass, superClass); } + +function DensityAnalystService_setPrototypeOf(o, p) { DensityAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DensityAnalystService_setPrototypeOf(o, p); } + +function DensityAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = DensityAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DensityAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DensityAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DensityAnalystService_possibleConstructorReturn(this, result); }; } + +function DensityAnalystService_possibleConstructorReturn(self, call) { if (call && (DensityAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DensityAnalystService_assertThisInitialized(self); } + +function DensityAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DensityAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DensityAnalystService_getPrototypeOf(o) { DensityAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DensityAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DensityAnalystService + * @deprecatedclass SuperMap.DensityAnalystService + * @category iServer SpatialAnalyst DensityAnalyst + * @classdesc + * 密度分析服务类,密度分析可计算每个输出栅格像元周围圆形邻域内输入的点或线对象的密度。 + * 密度分析,在某种意义上来说,相当于在表面上将输入的点线对象的测量值散开来,将每个点或线对象的测量量分布在整个研究区域,并计算输出栅格中每个像元的密度值。目前提供1种密度分析:核密度分析(Kernel)。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * var myDensityAnalystService = new DensityAnalystService(url); + * myDensityAnalystService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * @usage + */ + +var DensityAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + DensityAnalystService_inherits(DensityAnalystService, _SpatialAnalystBase); + + var _super = DensityAnalystService_createSuper(DensityAnalystService); + + function DensityAnalystService(url, options) { + var _this; + + DensityAnalystService_classCallCheck(this, DensityAnalystService); + + _this = _super.call(this, url, options); + /** + * @member {string} DensityAnalystService.prototype.mode + * @description 密度分析类型。 + */ + + _this.mode = null; + + if (options) { + Util.extend(DensityAnalystService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.DensityAnalystService"; + return _this; + } + /** + * @function DensityAnalystService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + DensityAnalystService_createClass(DensityAnalystService, [{ + key: "destroy", + value: function destroy() { + DensityAnalystService_get(DensityAnalystService_getPrototypeOf(DensityAnalystService.prototype), "destroy", this).call(this); + + this.mode = null; + } + /** + * @function DensityAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {DensityKernelAnalystParameters} parameter - 核密度分析参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var me = this; + var parameterObject = new Object(); + + if (parameter instanceof DensityKernelAnalystParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/densityanalyst/kernel'); + me.mode = "kernel"; + } + + DensityKernelAnalystParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return DensityAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/EditFeaturesParameters.js +function EditFeaturesParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function EditFeaturesParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function EditFeaturesParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) EditFeaturesParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) EditFeaturesParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class EditFeaturesParameters + * @deprecatedclass SuperMap.EditFeaturesParameters + * @category iServer Data Feature + * @classdesc 数据集添加、修改、删除参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.features - 当前需要创建或者是修改的要素集。 + * @param {boolean} [options.returnContent=false] - 是否返回要素内容。如果为true则返回创建要素的 ID 数组,否则返回 featureResult 资源的 URI。 + * @param {EditType} [options.editType=EditType.ADD] - POST 动作类型 (ADD、UPDATE、DELETE)。 + * @param {Array.} [options.IDs] - 删除要素时的要素的 ID 数组。 + * @usage + */ + +var EditFeaturesParameters = /*#__PURE__*/function () { + function EditFeaturesParameters(options) { + EditFeaturesParameters_classCallCheck(this, EditFeaturesParameters); + + /** + * @member {string} EditFeaturesParameters.prototype.dataSourceName + * @description 当前需要创建或者是修改的要素的数据源。 + */ + this.dataSourceName = null; + /** + * @member {string} EditFeaturesParameters.prototype.dataSetName + * @description 当前需要创建或者是修改的要素的数据集。 + */ + + this.dataSetName = null; + /** + * @member {Array.} EditFeaturesParameters.prototype.features + * @description 当前需要创建或者是修改的要素集。 + */ + + this.features = null; + /** + * @member {EditType} [EditFeaturesParameters.prototype.editType=EditType.ADD] + * @description 要素集更新类型 (add、update、delete)。 + */ + + this.editType = EditType.ADD; + /** + * @member {Array.} [EditFeaturesParameters.prototype.IDs] + * @description 执行删除时要素集 ID 集合。 + */ + + this.IDs = null; + /** + * @member {boolean} [EditFeaturesParameters.prototype.returnContent=false] + * @description 要素添加时,isUseBatch 不传或传为 false 的情况下有效。 + * true 表示直接返回新创建的要素的 ID 数组;false 表示返回创建的 featureResult 资源的 URI。 + */ + + this.returnContent = false; + /** + * @member {boolean} [EditFeaturesParameters.prototype.isUseBatch=false] + * @description 是否使用批量添加要素功能,要素添加时有效。批量添加能够提高要素编辑效率。true 表示批量添加;false 表示不使用批量添加。 + */ + + this.isUseBatch = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.EditFeaturesParameters"; + } + /** + * @function EditFeaturesParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + EditFeaturesParameters_createClass(EditFeaturesParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dataSourceName = null; + me.dataSetName = null; + me.features = null; + me.editType = null; + me.IDs = null; + me.returnContent = null; + } + /** + * @function EditFeaturesParameters.prototype.toJsonParameters + * @description 将 EditFeaturesParameters 对象参数转换为 JSON 字符串。 + * @param {EditFeaturesParameters} params - 地物编辑参数。 + * @returns {string} JSON 字符串。 + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var feature, + len, + features, + editType = params.editType; + + if (editType === EditType.DELETE) { + if (params.IDs === null) { + return; + } + + features = { + ids: params.IDs + }; + } else { + features = []; + + if (params.features) { + len = params.features.length; + + for (var i = 0; i < len; i++) { + feature = params.features[i]; + feature.geometry = ServerGeometry.fromGeometry(feature.geometry); + features.push(feature); + } + } + } + + return Util.toJSON(features); + } + }]); + + return EditFeaturesParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/EditFeaturesService.js +function EditFeaturesService_typeof(obj) { "@babel/helpers - typeof"; return EditFeaturesService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, EditFeaturesService_typeof(obj); } + +function EditFeaturesService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function EditFeaturesService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function EditFeaturesService_createClass(Constructor, protoProps, staticProps) { if (protoProps) EditFeaturesService_defineProperties(Constructor.prototype, protoProps); if (staticProps) EditFeaturesService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function EditFeaturesService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { EditFeaturesService_get = Reflect.get; } else { EditFeaturesService_get = function _get(target, property, receiver) { var base = EditFeaturesService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return EditFeaturesService_get.apply(this, arguments); } + +function EditFeaturesService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = EditFeaturesService_getPrototypeOf(object); if (object === null) break; } return object; } + +function EditFeaturesService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) EditFeaturesService_setPrototypeOf(subClass, superClass); } + +function EditFeaturesService_setPrototypeOf(o, p) { EditFeaturesService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return EditFeaturesService_setPrototypeOf(o, p); } + +function EditFeaturesService_createSuper(Derived) { var hasNativeReflectConstruct = EditFeaturesService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = EditFeaturesService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = EditFeaturesService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return EditFeaturesService_possibleConstructorReturn(this, result); }; } + +function EditFeaturesService_possibleConstructorReturn(self, call) { if (call && (EditFeaturesService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return EditFeaturesService_assertThisInitialized(self); } + +function EditFeaturesService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function EditFeaturesService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function EditFeaturesService_getPrototypeOf(o) { EditFeaturesService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return EditFeaturesService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class EditFeaturesService + * @deprecatedclass SuperMap.EditFeaturesService + * @category iServer Data Feature + * @classdesc 数据服务中数据集添加、更新、删除服务类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务端的数据服务资源地址。请求数据服务中数据集编辑服务,URL 应为:
+ * http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/datasources/name/{数据源名}/datasets/name/{数据集名} 。
+ * 例如:http://localhost:8090/iserver/services/data-jingjin/rest/data/datasources/name/Jingjin/datasets/name/Landuse_R + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [format] -查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式。参数格式为"ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new EditFeaturesService(url, {eventListeners: { + * "processCompleted": editFeatureCompleted, + * "processFailed": editFeatureError + * } + * }; + * @usage + */ + +var EditFeaturesService = /*#__PURE__*/function (_CommonServiceBase) { + EditFeaturesService_inherits(EditFeaturesService, _CommonServiceBase); + + var _super = EditFeaturesService_createSuper(EditFeaturesService); + + function EditFeaturesService(url, options) { + var _this; + + EditFeaturesService_classCallCheck(this, EditFeaturesService); + + _this = _super.call(this, url, options); + /** + * @member {boolean} [EditFeaturesService.prototype.returnContent=false] + * @description要素添加时,isUseBatch 不传或传为 false 的情况下有效。true 表示直接返回新创建的要素的 ID 数组;false 表示返回创建的 featureResult 资源的 URI。 + */ + + _this.returnContent = false; + /** + * @member {boolean} [EditFeaturesService.prototype.isUseBatch=false] + * @description 是否使用批量添加要素功能,要素添加时有效。 + * 批量添加能够提高要素编辑效率。 + * true 表示批量添加;false 表示不使用批量添加。 + */ + + _this.isUseBatch = false; + + if (options) { + Util.extend(EditFeaturesService_assertThisInitialized(_this), options); + } + + _this.url = Util.urlPathAppend(_this.url, 'features'); + _this.CLASS_NAME = "SuperMap.EditFeaturesService"; + return _this; + } + /** + * @function EditFeaturesService.prototype.destroy + * @override + */ + + + EditFeaturesService_createClass(EditFeaturesService, [{ + key: "destroy", + value: function destroy() { + EditFeaturesService_get(EditFeaturesService_getPrototypeOf(EditFeaturesService.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + me.isUseBatch = null; + me.fromIndex = null; + me.toIndex = null; + } + /** + * @function EditFeaturesService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {EditFeaturesParameters} params - 编辑要素参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof EditFeaturesParameters)) { + return; + } + + var me = this, + method = "POST", + ids = "", + editType = params.editType, + jsonParameters = null; + me.returnContent = params.returnContent; + me.isUseBatch = params.isUseBatch; + jsonParameters = EditFeaturesParameters.toJsonParameters(params); + + if (editType === EditType.DELETE) { + ids = Util.toJSON(params.IDs); + me.url = Util.urlAppend(me.url, Util.getParameterString({ + ids: ids + })); + method = "DELETE"; + jsonParameters = ids; + } else if (editType === EditType.UPDATE) { + method = "PUT"; + } else { + if (me.isUseBatch) { + me.url = Util.urlAppend(me.url, "isUseBatch=".concat(me.isUseBatch)); + me.returnContent = false; + } + + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=true'); + method = "POST"; + } + } + + me.request({ + method: method, + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return EditFeaturesService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalyst3DParameters.js +function FacilityAnalyst3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalyst3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalyst3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalyst3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalyst3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalyst3DParameters + * @deprecatedclass SuperMap.FacilityAnalyst3DParameters + * @category iServer FacilityAnalyst3D + * @classdesc 最近设施分析参数基类。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在 10 分钟内能到达的最近医院, + * 超过 10 分钟能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起 + * 作用的障碍边、障碍点、转向表、耗费等属性在最近设施分析时同样可设置。 + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalyst3DParameters = /*#__PURE__*/function () { + function FacilityAnalyst3DParameters(options) { + FacilityAnalyst3DParameters_classCallCheck(this, FacilityAnalyst3DParameters); + + /** + * @member {number} [FacilityAnalyst3DParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + this.edgeID = null; + /** + * @member {number} [FacilityAnalyst3DParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + + this.nodeID = null; + /** + * @member {string} FacilityAnalyst3DParameters.prototype.weightName + * @description 指定的权值字段信息对象的名称。 + */ + + this.weightName = null; + /** + * @member {boolean} [FacilityAnalyst3DParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找 + */ + + this.isUncertainDirectionValid = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FacilityAnalyst3DParameters"; + } + /** + * @function FacilityAnalyst3DParameters.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + FacilityAnalyst3DParameters_createClass(FacilityAnalyst3DParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.edgeID = null; + me.nodeID = null; + me.weightName = null; + me.isUncertainDirectionValid = null; + } + }]); + + return FacilityAnalyst3DParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSinks3DParameters.js +function FacilityAnalystSinks3DParameters_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystSinks3DParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystSinks3DParameters_typeof(obj); } + +function FacilityAnalystSinks3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystSinks3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystSinks3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystSinks3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystSinks3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystSinks3DParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystSinks3DParameters_get = Reflect.get; } else { FacilityAnalystSinks3DParameters_get = function _get(target, property, receiver) { var base = FacilityAnalystSinks3DParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystSinks3DParameters_get.apply(this, arguments); } + +function FacilityAnalystSinks3DParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystSinks3DParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystSinks3DParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystSinks3DParameters_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystSinks3DParameters_setPrototypeOf(o, p) { FacilityAnalystSinks3DParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystSinks3DParameters_setPrototypeOf(o, p); } + +function FacilityAnalystSinks3DParameters_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystSinks3DParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystSinks3DParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystSinks3DParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystSinks3DParameters_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystSinks3DParameters_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystSinks3DParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystSinks3DParameters_assertThisInitialized(self); } + +function FacilityAnalystSinks3DParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystSinks3DParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystSinks3DParameters_getPrototypeOf(o) { FacilityAnalystSinks3DParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystSinks3DParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalystSinks3DParameters + * @deprecatedclass SuperMap.FacilityAnalystSinks3DParameters + * @category iServer FacilityAnalyst3D Sinks + * @classdesc 最近设施分析参数类(汇查找资源)。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在10分钟内能到达的最近医院,超过10分钟 + * 能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起作用的障碍边、障碍点、 + * 转向表、耗费等属性在最近设施分析时同样可设置。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalystSinks3DParameters = /*#__PURE__*/function (_FacilityAnalyst3DPar) { + FacilityAnalystSinks3DParameters_inherits(FacilityAnalystSinks3DParameters, _FacilityAnalyst3DPar); + + var _super = FacilityAnalystSinks3DParameters_createSuper(FacilityAnalystSinks3DParameters); + + function FacilityAnalystSinks3DParameters(options) { + var _this; + + FacilityAnalystSinks3DParameters_classCallCheck(this, FacilityAnalystSinks3DParameters); + + _this = _super.call(this, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystSinks3DParameters"; + return _this; + } + /** + * @function FacilityAnalystSinks3DParameters.prototype.destroy + * @override + */ + + + FacilityAnalystSinks3DParameters_createClass(FacilityAnalystSinks3DParameters, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystSinks3DParameters_get(FacilityAnalystSinks3DParameters_getPrototypeOf(FacilityAnalystSinks3DParameters.prototype), "destroy", this).call(this); + } + }]); + + return FacilityAnalystSinks3DParameters; +}(FacilityAnalyst3DParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSinks3DService.js +function FacilityAnalystSinks3DService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystSinks3DService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystSinks3DService_typeof(obj); } + +function FacilityAnalystSinks3DService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystSinks3DService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystSinks3DService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystSinks3DService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystSinks3DService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystSinks3DService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystSinks3DService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystSinks3DService_setPrototypeOf(o, p) { FacilityAnalystSinks3DService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystSinks3DService_setPrototypeOf(o, p); } + +function FacilityAnalystSinks3DService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystSinks3DService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystSinks3DService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystSinks3DService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystSinks3DService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystSinks3DService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystSinks3DService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystSinks3DService_assertThisInitialized(self); } + +function FacilityAnalystSinks3DService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystSinks3DService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystSinks3DService_getPrototypeOf(o) { FacilityAnalystSinks3DService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystSinks3DService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystSinks3DService + * @deprecatedclass SuperMap.FacilityAnalystSinks3DService + * @category iServer FacilityAnalyst3D Sinks + * @classdesc 最近设施分析服务类(汇查找资源)
+ * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @example + * var myFacilityAnalystSinks3DService = new FacilityAnalystSinks3DService(url, { + * eventListeners: { + * "processCompleted": facilityAnalystSinks3DCompleted, + * "processFailed": facilityAnalystSinks3DError + * } + * }); + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为:
+ * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源};
+ * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。
+ * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystSinks3DService = /*#__PURE__*/function (_CommonServiceBase) { + FacilityAnalystSinks3DService_inherits(FacilityAnalystSinks3DService, _CommonServiceBase); + + var _super = FacilityAnalystSinks3DService_createSuper(FacilityAnalystSinks3DService); + + function FacilityAnalystSinks3DService(url, options) { + var _this; + + FacilityAnalystSinks3DService_classCallCheck(this, FacilityAnalystSinks3DService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystSinks3DService"; + return _this; + } + /** + * @function FacilityAnalystSinks3DService.prototype.destroy + * @override + */ + + + FacilityAnalystSinks3DService_createClass(FacilityAnalystSinks3DService, [{ + key: "destroy", + value: function destroy() { + CommonServiceBase.prototype.destroy.apply(this, arguments); + } + /** + * @function FacilityAnalystSinks3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystSinks3DParameters} params - 最近设施分析参数类(汇查找资源) + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystSinks3DParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'sinks'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystSinks3DService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSources3DParameters.js +function FacilityAnalystSources3DParameters_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystSources3DParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystSources3DParameters_typeof(obj); } + +function FacilityAnalystSources3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystSources3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystSources3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystSources3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystSources3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystSources3DParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystSources3DParameters_get = Reflect.get; } else { FacilityAnalystSources3DParameters_get = function _get(target, property, receiver) { var base = FacilityAnalystSources3DParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystSources3DParameters_get.apply(this, arguments); } + +function FacilityAnalystSources3DParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystSources3DParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystSources3DParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystSources3DParameters_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystSources3DParameters_setPrototypeOf(o, p) { FacilityAnalystSources3DParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystSources3DParameters_setPrototypeOf(o, p); } + +function FacilityAnalystSources3DParameters_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystSources3DParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystSources3DParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystSources3DParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystSources3DParameters_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystSources3DParameters_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystSources3DParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystSources3DParameters_assertThisInitialized(self); } + +function FacilityAnalystSources3DParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystSources3DParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystSources3DParameters_getPrototypeOf(o) { FacilityAnalystSources3DParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystSources3DParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalystSources3DParameters + * @deprecatedclass SuperMap.FacilityAnalystSources3DParameters + * @category iServer FacilityAnalyst3D Sources + * @classdesc 最近设施分析参数类(源查找资源)。最近设施分析是指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 设施点一般为学校、超市、加油站等服务设施;事件点为需要服务设施的事件位置。例如事件发生点是一起交通事故,要求查找在10分钟内能到达的最近医院,超过10分 + * 钟能到达的都不予考虑。此例中,事故发生地即是一个事件点,周边的医院则是设施点。最近设施查找实际上也是一种路径分析,因此对路径分析起作用的障碍边、障碍 + * 点、转向表、耗费等属性在最近设施分析时同样可设置。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalystSources3DParameters = /*#__PURE__*/function (_FacilityAnalyst3DPar) { + FacilityAnalystSources3DParameters_inherits(FacilityAnalystSources3DParameters, _FacilityAnalyst3DPar); + + var _super = FacilityAnalystSources3DParameters_createSuper(FacilityAnalystSources3DParameters); + + function FacilityAnalystSources3DParameters(options) { + var _this; + + FacilityAnalystSources3DParameters_classCallCheck(this, FacilityAnalystSources3DParameters); + + _this = _super.call(this, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystSources3DParameters"; + return _this; + } + /** + * @function FacilityAnalystSources3DParameters.prototype.destroy + * @override + */ + + + FacilityAnalystSources3DParameters_createClass(FacilityAnalystSources3DParameters, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystSources3DParameters_get(FacilityAnalystSources3DParameters_getPrototypeOf(FacilityAnalystSources3DParameters.prototype), "destroy", this).call(this); + } + }]); + + return FacilityAnalystSources3DParameters; +}(FacilityAnalyst3DParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystSources3DService.js +function FacilityAnalystSources3DService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystSources3DService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystSources3DService_typeof(obj); } + +function FacilityAnalystSources3DService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystSources3DService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystSources3DService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystSources3DService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystSources3DService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystSources3DService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystSources3DService_get = Reflect.get; } else { FacilityAnalystSources3DService_get = function _get(target, property, receiver) { var base = FacilityAnalystSources3DService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystSources3DService_get.apply(this, arguments); } + +function FacilityAnalystSources3DService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystSources3DService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystSources3DService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystSources3DService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystSources3DService_setPrototypeOf(o, p) { FacilityAnalystSources3DService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystSources3DService_setPrototypeOf(o, p); } + +function FacilityAnalystSources3DService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystSources3DService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystSources3DService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystSources3DService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystSources3DService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystSources3DService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystSources3DService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystSources3DService_assertThisInitialized(self); } + +function FacilityAnalystSources3DService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystSources3DService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystSources3DService_getPrototypeOf(o) { FacilityAnalystSources3DService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystSources3DService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystSources3DService + * @deprecatedclass SuperMap.FacilityAnalystSources3DService + * @category iServer FacilityAnalyst3D Sources + * @classdesc 最近设施分析服务类(源查找资源) + * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystSources3DService = /*#__PURE__*/function (_CommonServiceBase) { + FacilityAnalystSources3DService_inherits(FacilityAnalystSources3DService, _CommonServiceBase); + + var _super = FacilityAnalystSources3DService_createSuper(FacilityAnalystSources3DService); + + function FacilityAnalystSources3DService(url, options) { + var _this; + + FacilityAnalystSources3DService_classCallCheck(this, FacilityAnalystSources3DService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystSources3DService"; + return _this; + } + /** + * @function FacilityAnalystSources3DService.prototype.destroy + * @override + */ + + + FacilityAnalystSources3DService_createClass(FacilityAnalystSources3DService, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystSources3DService_get(FacilityAnalystSources3DService_getPrototypeOf(FacilityAnalystSources3DService.prototype), "destroy", this).call(this); + } + /** + * @function FacilityAnalystSources3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystSources3DParameters} params - 最近设施分析参数类(源查找资源) + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystSources3DParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'sources'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystSources3DService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystStreamParameters.js +function FacilityAnalystStreamParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystStreamParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystStreamParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystStreamParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystStreamParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalystStreamParameters + * @deprecatedclass SuperMap.FacilityAnalystStreamParameters + * @category iServer NetworkAnalyst UpstreamCirticalFaclilities + * @classdesc 上游/下游关键设施查找资源参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} options.queryType - 分析类型,只能是 0 (上游关键设施查询) 或者是 1(下游关键设施查询)。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。 + * @usage + */ + +var FacilityAnalystStreamParameters = /*#__PURE__*/function () { + function FacilityAnalystStreamParameters(options) { + FacilityAnalystStreamParameters_classCallCheck(this, FacilityAnalystStreamParameters); + + /** + * @member {Array.} [FacilityAnalystStreamParameters.prototype.sourceNodeIDs] + * @description 指定的设施点 ID 数组。 + */ + this.sourceNodeIDs = null; + /** + * @member {number} [FacilityAnalystStreamParameters.prototype.edgeID] + * @description 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + */ + + this.edgeID = null; + /** + * @member {number} [FacilityAnalystStreamParameters.prototype.nodeID] + * @description 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + */ + + this.nodeID = null; + /** + * @member {boolean} [FacilityAnalystStreamParameters.prototype.isUncertainDirectionValid=false] + * @description 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + */ + + this.isUncertainDirectionValid = false; + /** + * @member {number} FacilityAnalystStreamParameters.prototype.queryType + * @description 分析类型,只能是 0 (上游关键设施查询) 或者是 1(下游关键设施查询)。 + */ + + this.queryType = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FacilityAnalystStreamParameters"; + } + /** + * @function FacilityAnalystStreamParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FacilityAnalystStreamParameters_createClass(FacilityAnalystStreamParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.edgeID = null; + me.nodeID = null; + me.weightName = null; + me.isUncertainDirectionValid = null; + me.type = null; + } + }]); + + return FacilityAnalystStreamParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystStreamService.js +function FacilityAnalystStreamService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystStreamService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystStreamService_typeof(obj); } + +function FacilityAnalystStreamService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystStreamService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystStreamService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystStreamService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystStreamService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystStreamService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystStreamService_get = Reflect.get; } else { FacilityAnalystStreamService_get = function _get(target, property, receiver) { var base = FacilityAnalystStreamService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystStreamService_get.apply(this, arguments); } + +function FacilityAnalystStreamService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystStreamService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystStreamService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystStreamService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystStreamService_setPrototypeOf(o, p) { FacilityAnalystStreamService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystStreamService_setPrototypeOf(o, p); } + +function FacilityAnalystStreamService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystStreamService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystStreamService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystStreamService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystStreamService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystStreamService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystStreamService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystStreamService_assertThisInitialized(self); } + +function FacilityAnalystStreamService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystStreamService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystStreamService_getPrototypeOf(o) { FacilityAnalystStreamService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystStreamService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystStreamService + * @deprecatedclass SuperMap.FacilityAnalystStreamService + * @category iServer NetworkAnalyst UpstreamCirticalFaclilities + * @classdesc 上游/下游 关键设施查找资源服务类;即查找给定弧段或节点的上游/下游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。 + * @extends NetworkAnalystServiceBase + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystStreamService = /*#__PURE__*/function (_NetworkAnalystServic) { + FacilityAnalystStreamService_inherits(FacilityAnalystStreamService, _NetworkAnalystServic); + + var _super = FacilityAnalystStreamService_createSuper(FacilityAnalystStreamService); + + function FacilityAnalystStreamService(url, options) { + var _this; + + FacilityAnalystStreamService_classCallCheck(this, FacilityAnalystStreamService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystStreamService"; + return _this; + } + /** + * @function FacilityAnalystStreamService.prototype.destroy + * @override + */ + + + FacilityAnalystStreamService_createClass(FacilityAnalystStreamService, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystStreamService_get(FacilityAnalystStreamService_getPrototypeOf(FacilityAnalystStreamService.prototype), "destroy", this).call(this); + } + /** + * @function FacilityAnalystStreamService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystStreamParameters} params - 上游/下游关键设施查找资源参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystStreamParameters)) { + return; + } + + var me = this, + jsonObject; //URL 通过参数类型来判断是 上游 还是下游 查询 + + if (params.queryType === 0) { + me.url = Util.urlPathAppend(me.url, 'upstreamcirticalfaclilities'); + } else if (params.queryType === 1) { + me.url = Util.urlPathAppend(me.url, 'downstreamcirticalfaclilities'); + } else { + return; + } + + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + + if (params.edgeID !== null && params.nodeID !== null) { + return; + } + + if (params.edgeID === null && params.nodeID === null) { + return; + } + + if (params.edgeID !== null) { + jsonObject.edgeID = params.edgeID; + } else { + jsonObject.nodeID = params.nodeID; + } + + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystStreamService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTracedown3DParameters.js +function FacilityAnalystTracedown3DParameters_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystTracedown3DParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystTracedown3DParameters_typeof(obj); } + +function FacilityAnalystTracedown3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystTracedown3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystTracedown3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystTracedown3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystTracedown3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystTracedown3DParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystTracedown3DParameters_get = Reflect.get; } else { FacilityAnalystTracedown3DParameters_get = function _get(target, property, receiver) { var base = FacilityAnalystTracedown3DParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystTracedown3DParameters_get.apply(this, arguments); } + +function FacilityAnalystTracedown3DParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystTracedown3DParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystTracedown3DParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystTracedown3DParameters_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystTracedown3DParameters_setPrototypeOf(o, p) { FacilityAnalystTracedown3DParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystTracedown3DParameters_setPrototypeOf(o, p); } + +function FacilityAnalystTracedown3DParameters_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystTracedown3DParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystTracedown3DParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystTracedown3DParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystTracedown3DParameters_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystTracedown3DParameters_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystTracedown3DParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystTracedown3DParameters_assertThisInitialized(self); } + +function FacilityAnalystTracedown3DParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystTracedown3DParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystTracedown3DParameters_getPrototypeOf(o) { FacilityAnalystTracedown3DParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystTracedown3DParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalystTracedown3DParameters + * @deprecatedclass SuperMap.FacilityAnalystTracedown3DParameters + * @category iServer FacilityAnalyst3D TraceDownResult + * @classdesc 下游追踪资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段 ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点 ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalystTracedown3DParameters = /*#__PURE__*/function (_FacilityAnalyst3DPar) { + FacilityAnalystTracedown3DParameters_inherits(FacilityAnalystTracedown3DParameters, _FacilityAnalyst3DPar); + + var _super = FacilityAnalystTracedown3DParameters_createSuper(FacilityAnalystTracedown3DParameters); + + function FacilityAnalystTracedown3DParameters(options) { + var _this; + + FacilityAnalystTracedown3DParameters_classCallCheck(this, FacilityAnalystTracedown3DParameters); + + _this = _super.call(this, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystTracedown3DParameters"; + return _this; + } + /** + * @function FacilityAnalystTracedown3DParameters.prototype.destroy + * @override + */ + + + FacilityAnalystTracedown3DParameters_createClass(FacilityAnalystTracedown3DParameters, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystTracedown3DParameters_get(FacilityAnalystTracedown3DParameters_getPrototypeOf(FacilityAnalystTracedown3DParameters.prototype), "destroy", this).call(this); + } + }]); + + return FacilityAnalystTracedown3DParameters; +}(FacilityAnalyst3DParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTracedown3DService.js +function FacilityAnalystTracedown3DService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystTracedown3DService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystTracedown3DService_typeof(obj); } + +function FacilityAnalystTracedown3DService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystTracedown3DService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystTracedown3DService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystTracedown3DService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystTracedown3DService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystTracedown3DService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystTracedown3DService_get = Reflect.get; } else { FacilityAnalystTracedown3DService_get = function _get(target, property, receiver) { var base = FacilityAnalystTracedown3DService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystTracedown3DService_get.apply(this, arguments); } + +function FacilityAnalystTracedown3DService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystTracedown3DService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystTracedown3DService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystTracedown3DService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystTracedown3DService_setPrototypeOf(o, p) { FacilityAnalystTracedown3DService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystTracedown3DService_setPrototypeOf(o, p); } + +function FacilityAnalystTracedown3DService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystTracedown3DService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystTracedown3DService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystTracedown3DService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystTracedown3DService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystTracedown3DService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystTracedown3DService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystTracedown3DService_assertThisInitialized(self); } + +function FacilityAnalystTracedown3DService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystTracedown3DService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystTracedown3DService_getPrototypeOf(o) { FacilityAnalystTracedown3DService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystTracedown3DService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystTracedown3DService + * @deprecatedclass SuperMap.FacilityAnalystTracedown3DService + * @category iServer FacilityAnalyst3D TraceDownResult + * @classdesc 下游追踪资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystTracedown3DService = /*#__PURE__*/function (_CommonServiceBase) { + FacilityAnalystTracedown3DService_inherits(FacilityAnalystTracedown3DService, _CommonServiceBase); + + var _super = FacilityAnalystTracedown3DService_createSuper(FacilityAnalystTracedown3DService); + + function FacilityAnalystTracedown3DService(url, options) { + var _this; + + FacilityAnalystTracedown3DService_classCallCheck(this, FacilityAnalystTracedown3DService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystTracedown3DService"; + return _this; + } + /** + * @function FacilityAnalystTracedown3DService.prototype.destroy + * @override + */ + + + FacilityAnalystTracedown3DService_createClass(FacilityAnalystTracedown3DService, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystTracedown3DService_get(FacilityAnalystTracedown3DService_getPrototypeOf(FacilityAnalystTracedown3DService.prototype), "destroy", this).call(this); + } + /** + * @function FacilityAnalystTracedown3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystTracedown3DParameters} params - 下游追踪资源参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystTracedown3DParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'tracedownresult'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystTracedown3DService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTraceup3DParameters.js +function FacilityAnalystTraceup3DParameters_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystTraceup3DParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystTraceup3DParameters_typeof(obj); } + +function FacilityAnalystTraceup3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystTraceup3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystTraceup3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystTraceup3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystTraceup3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystTraceup3DParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystTraceup3DParameters_get = Reflect.get; } else { FacilityAnalystTraceup3DParameters_get = function _get(target, property, receiver) { var base = FacilityAnalystTraceup3DParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystTraceup3DParameters_get.apply(this, arguments); } + +function FacilityAnalystTraceup3DParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystTraceup3DParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystTraceup3DParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystTraceup3DParameters_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystTraceup3DParameters_setPrototypeOf(o, p) { FacilityAnalystTraceup3DParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystTraceup3DParameters_setPrototypeOf(o, p); } + +function FacilityAnalystTraceup3DParameters_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystTraceup3DParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystTraceup3DParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystTraceup3DParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystTraceup3DParameters_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystTraceup3DParameters_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystTraceup3DParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystTraceup3DParameters_assertThisInitialized(self); } + +function FacilityAnalystTraceup3DParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystTraceup3DParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystTraceup3DParameters_getPrototypeOf(o) { FacilityAnalystTraceup3DParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystTraceup3DParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FacilityAnalystTraceup3DParameters + * @deprecatedclass SuperMap.FacilityAnalystTraceup3DParameters + * @category iServer FacilityAnalyst3D TraceUpResult + * @classdesc 上游追踪资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {string} options.weightName - 指定的权值字段信息对象的名称。 + * @param {number} [options.edgeID] - 指定的弧段ID,edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID,edgeID 与 nodeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalystTraceup3DParameters = /*#__PURE__*/function (_FacilityAnalyst3DPar) { + FacilityAnalystTraceup3DParameters_inherits(FacilityAnalystTraceup3DParameters, _FacilityAnalyst3DPar); + + var _super = FacilityAnalystTraceup3DParameters_createSuper(FacilityAnalystTraceup3DParameters); + + function FacilityAnalystTraceup3DParameters(options) { + var _this; + + FacilityAnalystTraceup3DParameters_classCallCheck(this, FacilityAnalystTraceup3DParameters); + + _this = _super.call(this, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystTraceup3DParameters"; + return _this; + } + /** + * @function FacilityAnalystTraceup3DParameters.prototype.destroy + * @override + */ + + + FacilityAnalystTraceup3DParameters_createClass(FacilityAnalystTraceup3DParameters, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystTraceup3DParameters_get(FacilityAnalystTraceup3DParameters_getPrototypeOf(FacilityAnalystTraceup3DParameters.prototype), "destroy", this).call(this); + } + }]); + + return FacilityAnalystTraceup3DParameters; +}(FacilityAnalyst3DParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystTraceup3DService.js +function FacilityAnalystTraceup3DService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystTraceup3DService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystTraceup3DService_typeof(obj); } + +function FacilityAnalystTraceup3DService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystTraceup3DService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystTraceup3DService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystTraceup3DService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystTraceup3DService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystTraceup3DService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystTraceup3DService_get = Reflect.get; } else { FacilityAnalystTraceup3DService_get = function _get(target, property, receiver) { var base = FacilityAnalystTraceup3DService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystTraceup3DService_get.apply(this, arguments); } + +function FacilityAnalystTraceup3DService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystTraceup3DService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystTraceup3DService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystTraceup3DService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystTraceup3DService_setPrototypeOf(o, p) { FacilityAnalystTraceup3DService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystTraceup3DService_setPrototypeOf(o, p); } + +function FacilityAnalystTraceup3DService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystTraceup3DService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystTraceup3DService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystTraceup3DService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystTraceup3DService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystTraceup3DService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystTraceup3DService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystTraceup3DService_assertThisInitialized(self); } + +function FacilityAnalystTraceup3DService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystTraceup3DService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystTraceup3DService_getPrototypeOf(o) { FacilityAnalystTraceup3DService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystTraceup3DService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystTraceup3DService + * @deprecatedclass SuperMap.FacilityAnalystTraceup3DService + * @category iServer FacilityAnalyst3D TraceUpResult + * @classdesc 上游追踪资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystTraceup3DService = /*#__PURE__*/function (_CommonServiceBase) { + FacilityAnalystTraceup3DService_inherits(FacilityAnalystTraceup3DService, _CommonServiceBase); + + var _super = FacilityAnalystTraceup3DService_createSuper(FacilityAnalystTraceup3DService); + + function FacilityAnalystTraceup3DService(url, options) { + var _this; + + FacilityAnalystTraceup3DService_classCallCheck(this, FacilityAnalystTraceup3DService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystTraceup3DService"; + return _this; + } + /** + * @function FacilityAnalystTraceup3DService.prototype.destroy + * @override + */ + + + FacilityAnalystTraceup3DService_createClass(FacilityAnalystTraceup3DService, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystTraceup3DService_get(FacilityAnalystTraceup3DService_getPrototypeOf(FacilityAnalystTraceup3DService.prototype), "destroy", this).call(this); + } + /** + * @function FacilityAnalystTraceup3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystTraceup3DParameters} params - 上游追踪资源参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystTraceup3DParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'traceupresult'); + jsonObject = { + edgeID: params.edgeID, + nodeID: params.nodeID, + weightName: params.weightName, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystTraceup3DService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystUpstream3DParameters.js +function FacilityAnalystUpstream3DParameters_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystUpstream3DParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystUpstream3DParameters_typeof(obj); } + +function FacilityAnalystUpstream3DParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystUpstream3DParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystUpstream3DParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystUpstream3DParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystUpstream3DParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystUpstream3DParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystUpstream3DParameters_get = Reflect.get; } else { FacilityAnalystUpstream3DParameters_get = function _get(target, property, receiver) { var base = FacilityAnalystUpstream3DParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystUpstream3DParameters_get.apply(this, arguments); } + +function FacilityAnalystUpstream3DParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystUpstream3DParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystUpstream3DParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystUpstream3DParameters_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystUpstream3DParameters_setPrototypeOf(o, p) { FacilityAnalystUpstream3DParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystUpstream3DParameters_setPrototypeOf(o, p); } + +function FacilityAnalystUpstream3DParameters_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystUpstream3DParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystUpstream3DParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystUpstream3DParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystUpstream3DParameters_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystUpstream3DParameters_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystUpstream3DParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystUpstream3DParameters_assertThisInitialized(self); } + +function FacilityAnalystUpstream3DParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystUpstream3DParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystUpstream3DParameters_getPrototypeOf(o) { FacilityAnalystUpstream3DParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystUpstream3DParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FacilityAnalystUpstream3DParameters + * @deprecatedclass SuperMap.FacilityAnalystUpstream3DParameters + * @category iServer FacilityAnalyst3D UpstreamCirticalFaclilities + * @classdesc 上游关键设施查找资源参数类。 + * @extends {FacilityAnalyst3DParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.sourceNodeIDs - 指定的设施点 ID 数组。 + * @param {number} [options.edgeID] - 指定的弧段ID。edgeID 与 nodeID 必须指定一个。 + * @param {number} [options.nodeID] - 指定的结点ID。edgeID 与 edgeID 必须指定一个。 + * @param {boolean} [options.isUncertainDirectionValid=false] - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行; + * 指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。 + * @usage + */ + +var FacilityAnalystUpstream3DParameters = /*#__PURE__*/function (_FacilityAnalyst3DPar) { + FacilityAnalystUpstream3DParameters_inherits(FacilityAnalystUpstream3DParameters, _FacilityAnalyst3DPar); + + var _super = FacilityAnalystUpstream3DParameters_createSuper(FacilityAnalystUpstream3DParameters); + + function FacilityAnalystUpstream3DParameters(options) { + var _this; + + FacilityAnalystUpstream3DParameters_classCallCheck(this, FacilityAnalystUpstream3DParameters); + + _this = _super.call(this, options); + options = options || {}; + _this.sourceNodeIDs = null; + Util.extend(FacilityAnalystUpstream3DParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystUpstream3DParameters"; + return _this; + } + /** + * @function FacilityAnalystUpstream3DParameters.prototype.destroy + * @override + */ + + + FacilityAnalystUpstream3DParameters_createClass(FacilityAnalystUpstream3DParameters, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystUpstream3DParameters_get(FacilityAnalystUpstream3DParameters_getPrototypeOf(FacilityAnalystUpstream3DParameters.prototype), "destroy", this).call(this); + + this.sourceNodeIDs = null; + } + }]); + + return FacilityAnalystUpstream3DParameters; +}(FacilityAnalyst3DParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FacilityAnalystUpstream3DService.js +function FacilityAnalystUpstream3DService_typeof(obj) { "@babel/helpers - typeof"; return FacilityAnalystUpstream3DService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FacilityAnalystUpstream3DService_typeof(obj); } + +function FacilityAnalystUpstream3DService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FacilityAnalystUpstream3DService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FacilityAnalystUpstream3DService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FacilityAnalystUpstream3DService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FacilityAnalystUpstream3DService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FacilityAnalystUpstream3DService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FacilityAnalystUpstream3DService_get = Reflect.get; } else { FacilityAnalystUpstream3DService_get = function _get(target, property, receiver) { var base = FacilityAnalystUpstream3DService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FacilityAnalystUpstream3DService_get.apply(this, arguments); } + +function FacilityAnalystUpstream3DService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FacilityAnalystUpstream3DService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FacilityAnalystUpstream3DService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FacilityAnalystUpstream3DService_setPrototypeOf(subClass, superClass); } + +function FacilityAnalystUpstream3DService_setPrototypeOf(o, p) { FacilityAnalystUpstream3DService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FacilityAnalystUpstream3DService_setPrototypeOf(o, p); } + +function FacilityAnalystUpstream3DService_createSuper(Derived) { var hasNativeReflectConstruct = FacilityAnalystUpstream3DService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FacilityAnalystUpstream3DService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FacilityAnalystUpstream3DService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FacilityAnalystUpstream3DService_possibleConstructorReturn(this, result); }; } + +function FacilityAnalystUpstream3DService_possibleConstructorReturn(self, call) { if (call && (FacilityAnalystUpstream3DService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FacilityAnalystUpstream3DService_assertThisInitialized(self); } + +function FacilityAnalystUpstream3DService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FacilityAnalystUpstream3DService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FacilityAnalystUpstream3DService_getPrototypeOf(o) { FacilityAnalystUpstream3DService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FacilityAnalystUpstream3DService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FacilityAnalystUpstream3DService + * @deprecatedclass SuperMap.FacilityAnalystUpstream3DService + * @category iServer FacilityAnalyst3D UpstreamCirticalFaclilities + * @classdesc 上游关键设施查找资源服务类 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FacilityAnalystUpstream3DService = /*#__PURE__*/function (_CommonServiceBase) { + FacilityAnalystUpstream3DService_inherits(FacilityAnalystUpstream3DService, _CommonServiceBase); + + var _super = FacilityAnalystUpstream3DService_createSuper(FacilityAnalystUpstream3DService); + + function FacilityAnalystUpstream3DService(url, options) { + var _this; + + FacilityAnalystUpstream3DService_classCallCheck(this, FacilityAnalystUpstream3DService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FacilityAnalystUpstream3DService"; + return _this; + } + /** + * @function FacilityAnalystUpstream3DService.prototype.destroy + * @override + */ + + + FacilityAnalystUpstream3DService_createClass(FacilityAnalystUpstream3DService, [{ + key: "destroy", + value: function destroy() { + FacilityAnalystUpstream3DService_get(FacilityAnalystUpstream3DService_getPrototypeOf(FacilityAnalystUpstream3DService.prototype), "destroy", this).call(this); + } + /** + * @function FacilityAnalystUpstream3DService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FacilityAnalystUpstream3DParameters} params - 上游关键设施查找资源参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FacilityAnalystUpstream3DParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'upstreamcirticalfaclilities'); + jsonObject = { + sourceNodeIDs: params.sourceNodeIDs, + edgeID: params.edgeID, + nodeID: params.nodeID, + isUncertainDirectionValid: params.isUncertainDirectionValid + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FacilityAnalystUpstream3DService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FieldParameters.js +function FieldParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FieldParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FieldParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FieldParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FieldParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FieldParameters + * @deprecatedclass SuperMap.FieldParameters + * @category iServer Data Field + * @classdesc 字段信息查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasource - 数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @usage + */ + +var FieldParameters = /*#__PURE__*/function () { + function FieldParameters(options) { + FieldParameters_classCallCheck(this, FieldParameters); + + /** + * @member {string} FieldParameters.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + this.datasource = null; + /** + * @member {string} FieldParameters.prototype.dataset + * @description 要查询的数据集名称。 + */ + + this.dataset = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.FieldParameters"; + } + /** + * @function FieldParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FieldParameters_createClass(FieldParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasource = null; + me.dataset = null; + } + }]); + + return FieldParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FieldStatisticsParameters.js +function FieldStatisticsParameters_typeof(obj) { "@babel/helpers - typeof"; return FieldStatisticsParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FieldStatisticsParameters_typeof(obj); } + +function FieldStatisticsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FieldStatisticsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FieldStatisticsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FieldStatisticsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FieldStatisticsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FieldStatisticsParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FieldStatisticsParameters_setPrototypeOf(subClass, superClass); } + +function FieldStatisticsParameters_setPrototypeOf(o, p) { FieldStatisticsParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FieldStatisticsParameters_setPrototypeOf(o, p); } + +function FieldStatisticsParameters_createSuper(Derived) { var hasNativeReflectConstruct = FieldStatisticsParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FieldStatisticsParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FieldStatisticsParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FieldStatisticsParameters_possibleConstructorReturn(this, result); }; } + +function FieldStatisticsParameters_possibleConstructorReturn(self, call) { if (call && (FieldStatisticsParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FieldStatisticsParameters_assertThisInitialized(self); } + +function FieldStatisticsParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FieldStatisticsParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FieldStatisticsParameters_getPrototypeOf(o) { FieldStatisticsParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FieldStatisticsParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FieldStatisticsParameters + * @deprecatedclass SuperMap.FieldStatisticsParameters + * @category iServer Data Field + * @classdesc 字段统计信息查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasource - 数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.fieldName - 字段名。 + * @param {(string.|Array.>)} statisticMode - 字段统计方法类型。 + * @extends {FieldParameters} + * @usage + */ + +var FieldStatisticsParameters = /*#__PURE__*/function (_FieldParameters) { + FieldStatisticsParameters_inherits(FieldStatisticsParameters, _FieldParameters); + + var _super = FieldStatisticsParameters_createSuper(FieldStatisticsParameters); + + function FieldStatisticsParameters(options) { + var _this; + + FieldStatisticsParameters_classCallCheck(this, FieldStatisticsParameters); + + _this = _super.call(this, options); + /** + * @member {string} FieldStatisticsParameters.prototype.fieldName + * @description 字段名 + */ + + _this.fieldName = null; + /** + * @member {(string.|Array.>)} FieldStatisticsParameters.prototype.statisticMode + * @description 字段统计方法类型 + */ + + _this.statisticMode = null; + + if (options) { + Util.extend(FieldStatisticsParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.FieldStatisticsParameters"; + return _this; + } + /** + * @function FieldStatisticsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FieldStatisticsParameters_createClass(FieldStatisticsParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.fieldName = null; + me.statisticMode = null; + } + }]); + + return FieldStatisticsParameters; +}(FieldParameters); +;// CONCATENATED MODULE: ./src/common/iServer/FieldStatisticService.js +function FieldStatisticService_typeof(obj) { "@babel/helpers - typeof"; return FieldStatisticService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FieldStatisticService_typeof(obj); } + +function FieldStatisticService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FieldStatisticService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FieldStatisticService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FieldStatisticService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FieldStatisticService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FieldStatisticService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FieldStatisticService_get = Reflect.get; } else { FieldStatisticService_get = function _get(target, property, receiver) { var base = FieldStatisticService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FieldStatisticService_get.apply(this, arguments); } + +function FieldStatisticService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FieldStatisticService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FieldStatisticService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FieldStatisticService_setPrototypeOf(subClass, superClass); } + +function FieldStatisticService_setPrototypeOf(o, p) { FieldStatisticService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FieldStatisticService_setPrototypeOf(o, p); } + +function FieldStatisticService_createSuper(Derived) { var hasNativeReflectConstruct = FieldStatisticService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FieldStatisticService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FieldStatisticService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FieldStatisticService_possibleConstructorReturn(this, result); }; } + +function FieldStatisticService_possibleConstructorReturn(self, call) { if (call && (FieldStatisticService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FieldStatisticService_assertThisInitialized(self); } + +function FieldStatisticService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FieldStatisticService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FieldStatisticService_getPrototypeOf(o) { FieldStatisticService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FieldStatisticService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FieldStatisticService + * @deprecatedclass SuperMap.FieldStatisticService + * @category iServer Data Field + * @classdesc 字段查询统计服务类。用来完成对指定数据集指定字段的查询统计分析,即求平均值,最大值等。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。如访问 World Map 服务,只需将 url 设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format] - 查询结果返回格式,目前支持 iServerJSON 和GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string} options.datasource - 数据集所在的数据源名称。 + * @param {string} options.dataset - 数据集名称。 + * @param {string} options.field - 查询统计的目标字段名称。 + * @param {StatisticMode} options.statisticMode - 字段查询统计的方法类型。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new FieldStatisticService(url, {eventListeners: { + * "processCompleted": fieldStatisticCompleted, + * "processFailed": fieldStatisticError + * }, + * datasource: "World", + * dataset: "Countries", + * field: "SmID", + * statisticMode: StatisticMode.AVERAGE + * }; + * @usage + */ + +var FieldStatisticService = /*#__PURE__*/function (_CommonServiceBase) { + FieldStatisticService_inherits(FieldStatisticService, _CommonServiceBase); + + var _super = FieldStatisticService_createSuper(FieldStatisticService); + + function FieldStatisticService(url, options) { + var _this; + + FieldStatisticService_classCallCheck(this, FieldStatisticService); + + _this = _super.call(this, url, options); + /** + * @member {string} FieldStatisticService.prototype.datasource + * @description 数据集所在的数据源名称。 + */ + + _this.datasource = null; + /** + * @member {string} FieldStatisticService.prototype.dataset + * @description 数据集名称。 + */ + + _this.dataset = null; + /** + * @member {string} FieldStatisticService.prototype.field + * @description 查询统计的目标字段名称。 + */ + + _this.field = null; + /** + * @member {StatisticMode} FieldStatisticService.prototype.statisticMode + * @description 字段查询统计的方法类型。 + */ + + _this.statisticMode = null; + + if (options) { + Util.extend(FieldStatisticService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.FieldStatisticService"; + return _this; + } + /** + * @function FieldStatisticService.prototype.destroy + * @override + */ + + + FieldStatisticService_createClass(FieldStatisticService, [{ + key: "destroy", + value: function destroy() { + FieldStatisticService_get(FieldStatisticService_getPrototypeOf(FieldStatisticService.prototype), "destroy", this).call(this); + + var me = this; + me.datasource = null; + me.dataset = null; + me.field = null; + me.statisticMode = null; + } + /** + * @function FieldStatisticService.prototype.processAsync + * @description 执行服务,进行指定字段的查询统计。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + var me = this, + fieldStatisticURL = "datasources/" + me.datasource + "/datasets/" + me.dataset + "/fields/" + me.field + "/" + me.statisticMode; + me.url = Util.urlPathAppend(me.url, fieldStatisticURL); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return FieldStatisticService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindClosestFacilitiesParameters.js +function FindClosestFacilitiesParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindClosestFacilitiesParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindClosestFacilitiesParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindClosestFacilitiesParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindClosestFacilitiesParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindClosestFacilitiesParameters + * @deprecatedclass SuperMap.FindClosestFacilitiesParameters + * @category iServer NetworkAnalyst ClosestFacility + * @classdesc 最近设施分析参数类。 + * @param {Object} options - 参数。 + * @param {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} options.event - 事件点,一般为需要获得服务设施服务的事件位置。 + * @param {Array.>} options.facilities - 设施点集合,一般为提供服务的服务设施位置。 + * @param {number} [options.expectFacilityCount=1] - 要查找的设施点数量。 + * @param {boolean} [options.fromEvent=false] - 是否从事件点到设施点进行查找。 + * @param {boolean} [options.isAnalyzeById=false] - 事件点和设施点是否通过节点 ID 号来指定。 + * @param {number} [options.maxWeight=0] - 查找半径。单位与该类中 parameter 字段(交通网络分析通用参数)中设置的耗费字段一致。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var FindClosestFacilitiesParameters = /*#__PURE__*/function () { + function FindClosestFacilitiesParameters(options) { + FindClosestFacilitiesParameters_classCallCheck(this, FindClosestFacilitiesParameters); + + /** + * @member {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} FindClosestFacilitiesParameters.prototype.event + * @description 事件点,一般为需要获得服务设施服务的事件位置。 + * 可以通过两种方式赋予事件点:当该类中字段 isAnalyzeById = true 时,应输入事件点 ID 号;当 isAnalyzeById = false 时,应输入事件点坐标。 + */ + this.event = null; + /** + * @member {number} [FindClosestFacilitiesParameters.prototype.expectFacilityCount=1] + * @description 要查找的设施点数量。 + */ + + this.expectFacilityCount = 1; + /** + * @member {Array.>} [FindClosestFacilitiesParameters.prototype.facilities=false] + * @description 设施点集合,一般为提供服务的服务设施位置。 + * 可以通过两种方式赋予设施点:当该类中字段 isAnalyzeById = true 时,应输入设施点 ID 号;当 isAnalyzeById = false 时,应输入设施点坐标。 + */ + + this.facilities = null; + /** + * @member {boolean} [FindClosestFacilitiesParameters.prototype.fromEvent=false] + * @description 是否从事件点到设施点进行查找。最近设施分析主要是通过设施点和事件点之间最优的路线来分析在一定范围内哪个或哪些设施与事件点有最优路线的关系。 + * 这个行走线路是通过网络图层进行网络分析算法计算出来的两点间的最优路线。由于存在从 A 点到 B 点与从 B 点到 A 点的耗费不一样的情况,因此起止点 + * 不同可能会得到不同的最优路线。因此在进行最近设施分析之前,需要设置获取的最优路线的方向,即是以事件点作为起点到最近设施点的方向分析,还是以最 + * 近设施点为起点到事件点的方向分析。如果需要以事件点作为起点到设施点方向进行查找,设置该字段值为 true;设置为 false,表示从设施点到事件点进行查找。 + */ + + this.fromEvent = false; + /** + * @member {boolean} [FindClosestFacilitiesParameters.prototype.isAnalyzeById=false] + * @description 事件点和设施点是否通过节点 ID 号来指定,设置为 false,表示通过坐标点指定事件点和设施点。 + */ + + this.isAnalyzeById = false; + /** + * @member {number} [FindClosestFacilitiesParameters.prototype.maxWeight=0] + * @description 查找半径。单位与该类中 parameter 字段(交通网络分析通用参数)中设置的耗费字段一致。 + * 例如事件发生点是一起交通事故,要求查找在 10 分钟内能到达的最近医院,超过 10 分钟能到达的都不予考虑。 + * 那么需要将网络分析参数中 parameter.weightFieldName 设置为表示时间的字段,然后设置查找范围的半径值为10。 + */ + + this.maxWeight = 0; + /** + * @member {TransportationAnalystParameter} [FindClosestFacilitiesParameters.prototype.parameter] + * @description 交通网络分析通用参数。通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * 它为 TransportationAnalystParameter 类型,虽然为可选参数,但是如果不设置其中的 resultSetting 字段, + * 则返回结果空间信息等都为空。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindClosestFacilitiesParameters"; + } + /** + * @function FindClosestFacilitiesParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindClosestFacilitiesParameters_createClass(FindClosestFacilitiesParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.event = null; + me.expectFacilityCount = null; + me.facilities = null; + me.fromEvent = null; + me.isAnalyzeById = null; + me.maxWeight = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return FindClosestFacilitiesParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindClosestFacilitiesService.js +function FindClosestFacilitiesService_typeof(obj) { "@babel/helpers - typeof"; return FindClosestFacilitiesService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindClosestFacilitiesService_typeof(obj); } + +function FindClosestFacilitiesService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindClosestFacilitiesService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindClosestFacilitiesService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindClosestFacilitiesService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindClosestFacilitiesService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindClosestFacilitiesService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindClosestFacilitiesService_get = Reflect.get; } else { FindClosestFacilitiesService_get = function _get(target, property, receiver) { var base = FindClosestFacilitiesService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindClosestFacilitiesService_get.apply(this, arguments); } + +function FindClosestFacilitiesService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindClosestFacilitiesService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindClosestFacilitiesService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindClosestFacilitiesService_setPrototypeOf(subClass, superClass); } + +function FindClosestFacilitiesService_setPrototypeOf(o, p) { FindClosestFacilitiesService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindClosestFacilitiesService_setPrototypeOf(o, p); } + +function FindClosestFacilitiesService_createSuper(Derived) { var hasNativeReflectConstruct = FindClosestFacilitiesService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindClosestFacilitiesService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindClosestFacilitiesService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindClosestFacilitiesService_possibleConstructorReturn(this, result); }; } + +function FindClosestFacilitiesService_possibleConstructorReturn(self, call) { if (call && (FindClosestFacilitiesService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindClosestFacilitiesService_assertThisInitialized(self); } + +function FindClosestFacilitiesService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindClosestFacilitiesService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindClosestFacilitiesService_getPrototypeOf(o) { FindClosestFacilitiesService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindClosestFacilitiesService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindClosestFacilitiesService + * @deprecatedclass SuperMap.FindClosestFacilitiesService + * @category iServer NetworkAnalyst ClosestFacility + * @classdesc 最近设施分析服务类。 + * 最近设施分析是指在网络上给定一个事件点和一组设施点, + * 查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * 该类负责将客户端指定的最近设施分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最近设施分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myfindClosestFacilitiesService = new FindClosestFacilitiesService(url, { + * eventListeners: { + * "processCompleted": findClosestFacilitiesCompleted, + * "processFailed": findClosestFacilitiesError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindClosestFacilitiesService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindClosestFacilitiesService_inherits(FindClosestFacilitiesService, _NetworkAnalystServic); + + var _super = FindClosestFacilitiesService_createSuper(FindClosestFacilitiesService); + + function FindClosestFacilitiesService(url, options) { + var _this; + + FindClosestFacilitiesService_classCallCheck(this, FindClosestFacilitiesService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindClosestFacilitiesService"; + return _this; + } + /** + * @function FindClosestFacilitiesService.prototype.destroy + * @override + */ + + + FindClosestFacilitiesService_createClass(FindClosestFacilitiesService, [{ + key: "destroy", + value: function destroy() { + FindClosestFacilitiesService_get(FindClosestFacilitiesService_getPrototypeOf(FindClosestFacilitiesService.prototype), "destroy", this).call(this); + } + /** + * @function FindClosestFacilitiesService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindClosestFacilitiesParameters} params - 最近设施分析服务参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindClosestFacilitiesParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'closestfacility'); + jsonObject = { + expectFacilityCount: params.expectFacilityCount, + fromEvent: params.fromEvent, + maxWeight: params.maxWeight, + parameter: Util.toJSON(params.parameter), + event: Util.toJSON(params.event), + facilities: me.getJson(params.isAnalyzeById, params.facilities) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindClosestFacilitiesService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过ID来分析 + * @param {Array.} params - 分析参数数组 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJson", + value: function getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (var i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (var _i = 0; _i < len; _i++) { + if (_i > 0) { + jsonString += ","; + } + + jsonString += params[_i]; + } + } + + jsonString += ']'; + return jsonString; + } + /** + * @function FindClosestFacilitiesService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result || !result.facilityPathList) { + return result; + } + + var geoJSONFormat = new GeoJSON(); + result.facilityPathList.map(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + + return path; + }); + return result; + } + }]); + + return FindClosestFacilitiesService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindLocationParameters.js +function FindLocationParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindLocationParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindLocationParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindLocationParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindLocationParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FindLocationParameters + * @deprecatedclass SuperMap.FindLocationParameters + * @category iServer NetworkAnalyst Location + * @classdesc 选址分区分析参数类。 + * @param {Object} options - 参数。 + * @param {string} options.turnWeightField - 转向权值字段的名称。 + * @param {string} options.weightName - 阻力字段的名称,标识了进行网络分析时所使用的阻力字段。 + * @param {Array.} options.supplyCenters - 资源供给中心集合。 + * @param {number} [options.expectedSupplyCenterCount=1] - 期望用于最终设施选址的资源供给中心数量。 + * @param {boolean} [options.isFromCenter=false] - 是否从中心点开始分配资源。 + * @usage + */ + +var FindLocationParameters = /*#__PURE__*/function () { + function FindLocationParameters(options) { + FindLocationParameters_classCallCheck(this, FindLocationParameters); + + /** + * @member {number} [FindLocationParameters.prototype.expectedSupplyCenterCount=1] + * @description 期望用于最终设施选址的资源供给中心数量。 + * 当输入值为 0 时,最终设施选址的资源供给中心数量默认为覆盖分析区域内的所需最少的供给中心数。 + */ + this.expectedSupplyCenterCount = null; + /** + * @member {boolean} [FindLocationParameters.prototype.isFromCenter=false] + * @description 是否从中心点开始分配资源。 + * 由于网路数据中的弧段具有正反阻力,即弧段的正向阻力值与其反向阻力值可能不同, + * 因此,在进行分析时,从资源供给中心开始分配资源到需求点与从需求点向资源供给中心分配这两种分配形式下,所得的分析结果会不同。 + */ + + this.isFromCenter = false; + /** + * @member {Array.} FindLocationParameters.prototype.supplyCenters + * @description 资源供给中心集合。 + * 资源供给中心是提供资源和服务的设施,对应于网络结点, + * 资源供给中心的相关信息包括资源量、最大阻力值、资源供给中心类型,资源供给中心在网络中所处结点的 ID 等,以便在进行选址分区分析时使用。 + */ + + this.supplyCenters = null; + /** + * @member {string} FindLocationParameters.prototype.turnWeightField + * @description 转向权值字段的名称。 + */ + + this.turnWeightField = null; + /** + * @member {string} FindLocationParameters.prototype.weightName + * @description 阻力字段的名称,标识了进行网络分析时所使用的阻力字段。 + */ + + this.weightName = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindLocationParameters"; + } + /** + * @function FindLocationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindLocationParameters_createClass(FindLocationParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.expectedSupplyCenterCount = null; + me.isFromCenter = null; + me.turnWeightField = null; + me.weightName = null; + + if (me.supplyCenters) { + for (var i = 0, supplyCenters = me.supplyCenters, len = supplyCenters.length; i < len; i++) { + supplyCenters[i].destroy(); + } + + me.supplyCenters = null; + } + } + }]); + + return FindLocationParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindLocationService.js +function FindLocationService_typeof(obj) { "@babel/helpers - typeof"; return FindLocationService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindLocationService_typeof(obj); } + +function FindLocationService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindLocationService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindLocationService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindLocationService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindLocationService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindLocationService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindLocationService_get = Reflect.get; } else { FindLocationService_get = function _get(target, property, receiver) { var base = FindLocationService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindLocationService_get.apply(this, arguments); } + +function FindLocationService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindLocationService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindLocationService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindLocationService_setPrototypeOf(subClass, superClass); } + +function FindLocationService_setPrototypeOf(o, p) { FindLocationService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindLocationService_setPrototypeOf(o, p); } + +function FindLocationService_createSuper(Derived) { var hasNativeReflectConstruct = FindLocationService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindLocationService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindLocationService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindLocationService_possibleConstructorReturn(this, result); }; } + +function FindLocationService_possibleConstructorReturn(self, call) { if (call && (FindLocationService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindLocationService_assertThisInitialized(self); } + +function FindLocationService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindLocationService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindLocationService_getPrototypeOf(o) { FindLocationService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindLocationService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindLocationService + * @deprecatedclass SuperMap.FindLocationService + * @category iServer NetworkAnalyst Location + * @classdesc 选址分区分析服务类。 + * 选址分区分析是为了确定一个或多个待建设施的最佳或最优位置,使得设施可以用一种最经济有效的方式为需求方提供服务或者商品。 + * 选址分区不仅仅是一个选址过程,还要将需求点的需求分配到相应的新建设施的服务区中,因此称之为选址与分区。 + * 选址分区分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * (start code) + * var findLocationService = new FindLocationService(url, { + * eventListeners: { + * "processCompleted": findLocationCompleted, + * "processFailed": findLocationError + * } + * }); + * (end) + * @param {string} url - 服务地址。 + * 如 http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindLocationService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindLocationService_inherits(FindLocationService, _NetworkAnalystServic); + + var _super = FindLocationService_createSuper(FindLocationService); + + function FindLocationService(url, options) { + var _this; + + FindLocationService_classCallCheck(this, FindLocationService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindLocationService"; + return _this; + } + /** + * @function FindLocationService.prototype.destroy + * @override + */ + + + FindLocationService_createClass(FindLocationService, [{ + key: "destroy", + value: function destroy() { + FindLocationService_get(FindLocationService_getPrototypeOf(FindLocationService.prototype), "destroy", this).call(this); + } + /** + * @function FindLocationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindLocationParameters} params - 选址分区分析服务参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindLocationParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'location'); + jsonObject = { + isFromCenter: params.isFromCenter, + expectedSupplyCenterCount: params.expectedSupplyCenterCount, + weightName: params.weightName, + turnWeightField: params.turnWeightField, + returnEdgeFeature: true, + returnEdgeGeometry: true, + returnNodeFeature: true, + mapParameter: Util.toJSON(params.mapParameter), + supplyCenters: me.getCentersJson(params.supplyCenters) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindLocationService.prototype.getCentersJson + * @description 将数组对象转化为JSON字符串。 + * @param {Array} params - 需要转换的参数 + * @returns {string} 转化后的JSON字符串。 + */ + + }, { + key: "getCentersJson", + value: function getCentersJson(params) { + var json = "[", + len = params ? params.length : 0; + + for (var i = 0; i < len; i++) { + if (i > 0) { + json += ","; + } + + json += Util.toJSON(params[i]); + } + + json += "]"; + return json; + } + /** + * @function FindLocationService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result) { + return null; + } + + var geoJSONFormat = new GeoJSON(); + + if (result.demandResults) { + result.demandResults = geoJSONFormat.toGeoJSON(result.demandResults); + } + + if (result.supplyResults) { + result.supplyResults = geoJSONFormat.toGeoJSON(result.supplyResults); + } + + return result; + } + }]); + + return FindLocationService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindMTSPPathsParameters.js +function FindMTSPPathsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindMTSPPathsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindMTSPPathsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindMTSPPathsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindMTSPPathsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindMTSPPathsParameters + * @deprecatedclass SuperMap.FindMTSPPathsParameters + * @category iServer NetworkAnalyst MTSPPath + * @classdesc 多旅行商分析参数类 + * @param {Object} options - 参数。 + * @param {Array.>} options.centers - 配送中心集合。 + * @param {Array.>} options.nodes - 配送目标集合。 + * @param {boolean} [options.hasLeastTotalCost=false] - 配送模式是否为总花费最小方案。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 号来指定配送中心点和配送目的点,即通过坐标点指定。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var FindMTSPPathsParameters = /*#__PURE__*/function () { + function FindMTSPPathsParameters(options) { + FindMTSPPathsParameters_classCallCheck(this, FindMTSPPathsParameters); + + /** + * @member {Array.>} FindMTSPPathsParameters.prototype.centers + * @description 配送中心集合。 + * 当 FindMTSPPathsParameters.isAnalyzeById = false 时,centers 应为点的坐标数组; + * 当 FindMTSPPathsParameters.isAnalyzeById = true 时,centers 应为点的 ID 数组。 + */ + this.centers = null; + /** + * @member {boolean} [FindMTSPPathsParameters.prototype.hasLeastTotalCost=false] + * @description 配送模式是否为总花费最小方案。 + * 若为 true,则按照总花费最小的模式进行配送,此时可能会出现某几个配送中心点配送的花费较多而其他配送中心点的花费很少的情况。 + * 若为 false,则为局部最优,此方案会控制每个配送中心点的花费,使各个中心点花费相对平均,此时总花费不一定最小。 + */ + + this.hasLeastTotalCost = false; + /** + * @member {boolean} [FindMTSPPathsParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 号来指定配送中心点和配送目的点,即通过坐标点指定。 + */ + + this.isAnalyzeById = false; + /** + * @member {Array.>} FindMTSPPathsParameters.prototype.nodes + * @description 配送目标集合。 + * 当 FindMTSPPathsParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindMTSPPathsParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + + this.nodes = null; + /** + * @member {TransportationAnalystParameter} [FindMTSPPathsParameters.prototype.parameter] + * @description 交通网络分析通用参数。 + * 通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * TransportationAnalystParameter 类型,它虽然为可选参数,但是如果不设置其中的 resultSetting 字段,则返回结果空间信息等都为空。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindMTSPPathsParameters"; + } + /** + * @function FindMTSPPathsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindMTSPPathsParameters_createClass(FindMTSPPathsParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.centers = null; + me.hasLeastTotalCost = null; + me.isAnalyzeById = null; + me.nodes = null; + me.maxWeight = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return FindMTSPPathsParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindMTSPPathsService.js +function FindMTSPPathsService_typeof(obj) { "@babel/helpers - typeof"; return FindMTSPPathsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindMTSPPathsService_typeof(obj); } + +function FindMTSPPathsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindMTSPPathsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindMTSPPathsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindMTSPPathsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindMTSPPathsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindMTSPPathsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindMTSPPathsService_get = Reflect.get; } else { FindMTSPPathsService_get = function _get(target, property, receiver) { var base = FindMTSPPathsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindMTSPPathsService_get.apply(this, arguments); } + +function FindMTSPPathsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindMTSPPathsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindMTSPPathsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindMTSPPathsService_setPrototypeOf(subClass, superClass); } + +function FindMTSPPathsService_setPrototypeOf(o, p) { FindMTSPPathsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindMTSPPathsService_setPrototypeOf(o, p); } + +function FindMTSPPathsService_createSuper(Derived) { var hasNativeReflectConstruct = FindMTSPPathsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindMTSPPathsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindMTSPPathsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindMTSPPathsService_possibleConstructorReturn(this, result); }; } + +function FindMTSPPathsService_possibleConstructorReturn(self, call) { if (call && (FindMTSPPathsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindMTSPPathsService_assertThisInitialized(self); } + +function FindMTSPPathsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindMTSPPathsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindMTSPPathsService_getPrototypeOf(o) { FindMTSPPathsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindMTSPPathsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindMTSPPathsService + * @deprecatedclass SuperMap.FindMTSPPathsService + * @category iServer NetworkAnalyst MTSPPath + * @classdesc 多旅行商分析服务类 + * 多旅行商分析也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数)。 + * 查找经济有效的配送路径,并给出相应的行走路线。 + * 物流配送功能就是解决如何合理分配配送次序和送货路线,使配送总花费达到最小或每个配送中心的花费达到最小。 + * 该类负责将客户端指定的多旅行商分析参数传递给服务端,并接收服务端返回的结果数据。 + * 多旅行商分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindMTSPPathsService = new FindMTSPPathsService(url, { + * eventListeners: { + * "processCompleted": findMTSPPathsCompleted, + * "processFailed": findMTSPPathsError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 互服务时所需可选参数。如: + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindMTSPPathsService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindMTSPPathsService_inherits(FindMTSPPathsService, _NetworkAnalystServic); + + var _super = FindMTSPPathsService_createSuper(FindMTSPPathsService); + + function FindMTSPPathsService(url, options) { + var _this; + + FindMTSPPathsService_classCallCheck(this, FindMTSPPathsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindMTSPPathsService"; + return _this; + } + /** + * @function FindMTSPPathsService.prototype.destroy + * @override + */ + + + FindMTSPPathsService_createClass(FindMTSPPathsService, [{ + key: "destroy", + value: function destroy() { + FindMTSPPathsService_get(FindMTSPPathsService_getPrototypeOf(FindMTSPPathsService.prototype), "destroy", this).call(this); + } + /** + * @function FindMTSPPathsService..prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindMTSPPathsParameters} params - 多旅行商分析服务参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindMTSPPathsParameters)) { + return; + } + + var me = this, + jsonObject, + //end = me.url.substr(me.url.length - 1, 1), + centers = me.getJson(params.isAnalyzeById, params.centers), + nodes = me.getJson(params.isAnalyzeById, params.nodes); + me.url = Util.urlPathAppend(me.url, 'mtsppath'); + jsonObject = { + centers: centers, + nodes: nodes, + parameter: Util.toJSON(params.parameter), + hasLeastTotalCost: params.hasLeastTotalCost + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindMTSPPathsService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJson", + value: function getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (var i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (var _i = 0; _i < len; _i++) { + if (_i > 0) { + jsonString += ","; + } + + jsonString += params[_i]; + } + } + + jsonString += ']'; + return jsonString; + } + /** + * @function FindMTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result || !result.pathList) { + return null; + } + + var geoJSONFormat = new GeoJSON(); + result.pathList.map(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + + return path; + }); + return result; + } + }]); + + return FindMTSPPathsService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindPathParameters.js +function FindPathParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindPathParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindPathParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindPathParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindPathParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindPathParameters + * @deprecatedclass SuperMap.FindPathParameters + * @category iServer NetworkAnalyst Path + * @classdesc 最佳路径分析参数类。最佳路径是在网络数据集中指定一些结点,按照顺序访问结点从而求解起止点之间阻抗最小的路径。 + * 例如如果要顺序访问 1、2、3、4 四个结点,则需要分别找到1、2结点间的最佳路径 R1—2,2、3 间的最佳路径 R2—3 和 3、4 结点间的最佳路径 R3—4, + * 顺序访问 1、2、3、4 四个结点的最佳路径就是 R = R1—2 + R2—3 + R3—4。 + * 阻抗就是指从一点到另一点的耗费,在实际应用中我们可以将距离、时间、花费等作为阻抗条件。 + * 阻抗最小也就可以理解为从一点到另一点距离最短、时间最少、花费最低等。当两点间距离最短时为最短路径,它是最佳路径问题的一个特例。 + * 阻抗值通过 {@link TransportationAnalystParameter#weightFieldName}设置。 + * 计算最佳路径除了受阻抗影响外,还受转向字段的影响。转向值通过 {@link TransportationAnalystParameter#turnWeightField} 设置。 + * + * @param {Object} options - 参数。 + * @param {Array.>} options.nodes - 最佳路径分析经过的结点或设施点数组。该字段至少包含两个点。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {boolean} [options.hasLeastEdgeCount=false] - 是否按照弧段数最少的进行最佳路径分析。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var FindPathParameters = /*#__PURE__*/function () { + function FindPathParameters(options) { + FindPathParameters_classCallCheck(this, FindPathParameters); + + /** + * @member {boolean} [FindPathParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点。 + * 指定路径分析经过的结点或设施点有两种方式:输入结点 ID 号或直接输入点坐标。 + * 当该字段为 true 时,表示通过结点 ID 指定途经点,即 FindPathParameters.nodes = [ID1,ID2,...]; + * 反之表示通过结点坐标指定途经点,即 FindPathParameters.nodes = [{x1,y1},{x2,y2},...] 。 + */ + this.isAnalyzeById = false; + /** + * @member {boolean} [FindPathParameters.prototype.hasLeastEdgeCount=false] + * @description 是否按照弧段数最少的进行最佳路径分析。 + * true 表示按照弧段数最少进行分析,返回弧段数最少的路径中一个阻抗最小的最佳路径; + * false 表示直接返回阻抗最小的路径,而不考虑弧段的多少。 + */ + + this.hasLeastEdgeCount = null; + /** + * @member {Array.>} FindPathParameters.prototype.nodes + * @description 最佳路径分析经过的结点或设施点数组,必设字段。该字段至少包含两个点。 + * 当 FindPathParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindPathParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + + this.nodes = null; + /** + * @member {TransportationAnalystParameter} FindPathParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindPathParameters"; + } + /** + * @function FindPathParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindPathParameters_createClass(FindPathParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isAnalyzeById = null; + me.hasLeastEdgeCount = null; + me.nodes = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return FindPathParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindPathService.js +function FindPathService_typeof(obj) { "@babel/helpers - typeof"; return FindPathService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindPathService_typeof(obj); } + +function FindPathService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindPathService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindPathService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindPathService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindPathService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindPathService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindPathService_get = Reflect.get; } else { FindPathService_get = function _get(target, property, receiver) { var base = FindPathService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindPathService_get.apply(this, arguments); } + +function FindPathService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindPathService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindPathService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindPathService_setPrototypeOf(subClass, superClass); } + +function FindPathService_setPrototypeOf(o, p) { FindPathService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindPathService_setPrototypeOf(o, p); } + +function FindPathService_createSuper(Derived) { var hasNativeReflectConstruct = FindPathService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindPathService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindPathService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindPathService_possibleConstructorReturn(this, result); }; } + +function FindPathService_possibleConstructorReturn(self, call) { if (call && (FindPathService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindPathService_assertThisInitialized(self); } + +function FindPathService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindPathService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindPathService_getPrototypeOf(o) { FindPathService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindPathService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindPathService + * @deprecatedclass SuperMap.FindPathService + * @category iServer NetworkAnalyst Path + * @classdesc 最佳路径分析服务类。 + * 最佳路径是在网络数据集中指定一些节点,按照节点的选择顺序, + * 顺序访问这些节点从而求解起止点之间阻抗最小的路经。 + * 该类负责将客户端指定的最佳路径分析参数传递给服务端,并接收服务端返回的结果数据。 + * 最佳路径分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindPathService = new FindPathService(url, { + * eventListeners: { + * "processCompleted": findPathCompleted, + * "processFailed": findPathError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindPathService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindPathService_inherits(FindPathService, _NetworkAnalystServic); + + var _super = FindPathService_createSuper(FindPathService); + + function FindPathService(url, options) { + var _this; + + FindPathService_classCallCheck(this, FindPathService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindPathService"; + return _this; + } + /** + * @function FindPathService.prototype.destroy + * @override + */ + + + FindPathService_createClass(FindPathService, [{ + key: "destroy", + value: function destroy() { + FindPathService_get(FindPathService_getPrototypeOf(FindPathService.prototype), "destroy", this).call(this); + } + /** + * @function FindPathService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindPathParameters} params - 最佳路径分析服务参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindPathParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'path'); + jsonObject = { + hasLeastEdgeCount: params.hasLeastEdgeCount, + parameter: Util.toJSON(params.parameter), + nodes: me.getJson(params.isAnalyzeById, params.nodes) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindPathService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJson", + value: function getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (var i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (var _i = 0; _i < len; _i++) { + if (_i > 0) { + jsonString += ","; + } + + jsonString += params[_i]; + } + } + + jsonString += ']'; + return jsonString; + } + /** + * @function FindMTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result || !result.pathList || result.pathList.length < 1) { + return null; + } + + var geoJSONFormat = new GeoJSON(); + result.pathList.forEach(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + }); + return result; + } + }]); + + return FindPathService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindServiceAreasParameters.js +function FindServiceAreasParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindServiceAreasParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindServiceAreasParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindServiceAreasParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindServiceAreasParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindServiceAreasParameters + * @deprecatedclass SuperMap.FindServiceAreasParameters + * @category iServer NetworkAnalyst ServiceArea + * @classdesc 服务区分析参数类。 + * 服务区分析是以指定服务站点为中心,在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * 例如:计算某快餐店能够在30分钟内送达快餐的区域。 + * @param {Object} options - 参数。 + * @param {Array.} options.weights - 每个服务站点提供服务的阻力半径,超过这个阻力半径的区域不予考虑,其单位与阻力字段一致。 + * @param {Array.>} options.centers - 服务站点数组。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 指定路径分析的结点。 + * @param {boolean} [options.isCenterMutuallyExclusive=false] - 是否中心点互斥。 + * @param {boolean} [options.isFromCenter=false] - 是否从中心点开始分析。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var FindServiceAreasParameters = /*#__PURE__*/function () { + function FindServiceAreasParameters(options) { + FindServiceAreasParameters_classCallCheck(this, FindServiceAreasParameters); + + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 指定路径分析的结点。 + * 指定路径分析经过的结点或设施点有两种方式:输入结点 ID 号或直接输入点坐标。 + * 当该字段为 true 时,表示通过结点 ID 指定途经点,即 FindServiceAreasParameters.centers = [ID1,ID2,...]; + * 反之表示通过结点坐标指定途经点,即 FindServiceAreasParameters.centers = [{x1,y1},{x2,y2},...]。 + */ + this.isAnalyzeById = false; + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isCenterMutuallyExclusive=false] + * @description 是否中心点互斥,即按照中心点的距离进行判断是否要进行互斥处理。 + * 若分析出的服务区有重叠的部分,则通过设置该参数进行互斥处理。 + */ + + this.isCenterMutuallyExclusive = false; + /** + * @member {Array.>} FindServiceAreasParameters.prototype.centers + * @description 服务站点数组。 + * 当该类的 iSAnalyzeById = true 时,通过结点 ID 号指定服务站点;当 iSAnalyzeById = false 时,通过点坐标指定服务站点。 + */ + + this.centers = null; + /** + * @member {boolean} [FindServiceAreasParameters.prototype.isFromCenter=false] + * @description 是否从中心点开始分析。 + * 从中心点开始分析和不从中心点开始分析,体现了服务中心和需要该服务的需求地的关系模式。 + * 从中心点开始分析,是一个服务中心向服务需求地提供服务; + * 而不从中心点开始分析,是一个服务需求地主动到服务中心获得服务。 + */ + + this.isFromCenter = false; + /** + * APIProperty: weights + * @member {Array.} FindServiceAreasParameters.prototype.weights + * @description 每个服务站点提供服务的阻力半径,即超过这个阻力半径的区域不予考虑,其单位与阻力字段一致。 + * 该字段为一个数组,数组长度跟服务中心个数一致,按照索引顺序与站点一一对应,每个元素表示了在对每个服务中心进行服务区分析时,所用的服务半径。 + */ + + this.weights = null; + /** + * @member {TransportationAnalystParameter} FindServiceAreasParameters.prototype.parameter + * @description 交通网络分析通用参数。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindServiceAreasParameters"; + } + /** + * @function FindServiceAreasParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindServiceAreasParameters_createClass(FindServiceAreasParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isAnalyzeById = null; + me.isCenterMutuallyExclusive = null; + me.centers = null; + me.isFromCenter = null; + me.weights = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return FindServiceAreasParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindServiceAreasService.js +function FindServiceAreasService_typeof(obj) { "@babel/helpers - typeof"; return FindServiceAreasService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindServiceAreasService_typeof(obj); } + +function FindServiceAreasService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindServiceAreasService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindServiceAreasService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindServiceAreasService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindServiceAreasService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindServiceAreasService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindServiceAreasService_get = Reflect.get; } else { FindServiceAreasService_get = function _get(target, property, receiver) { var base = FindServiceAreasService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindServiceAreasService_get.apply(this, arguments); } + +function FindServiceAreasService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindServiceAreasService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindServiceAreasService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindServiceAreasService_setPrototypeOf(subClass, superClass); } + +function FindServiceAreasService_setPrototypeOf(o, p) { FindServiceAreasService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindServiceAreasService_setPrototypeOf(o, p); } + +function FindServiceAreasService_createSuper(Derived) { var hasNativeReflectConstruct = FindServiceAreasService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindServiceAreasService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindServiceAreasService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindServiceAreasService_possibleConstructorReturn(this, result); }; } + +function FindServiceAreasService_possibleConstructorReturn(self, call) { if (call && (FindServiceAreasService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindServiceAreasService_assertThisInitialized(self); } + +function FindServiceAreasService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindServiceAreasService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindServiceAreasService_getPrototypeOf(o) { FindServiceAreasService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindServiceAreasService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindServiceAreasService + * @deprecatedclass SuperMap.FindServiceAreasService + * @category iServer NetworkAnalyst ServiceArea + * @classdesc 服务区分析服务类。 + * 服务区分析是以指定服务站点为中心, + * 在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * 该类负责将客户端指定的服务区分析参数传递给服务端,并接收服务端返回的结果数据。 + * 服务区分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * var myFindServiceAreasService = new FindServiceAreasService(url, { + * eventListeners: { + * "processCompleted": findServiceAreasCompleted, + * "processFailed": findServiceAreasError + * } + * }); + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 互服务时所需可选参数。如: + * @param {Object} options.eventListeners - 需要被注册的监听器对象 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindServiceAreasService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindServiceAreasService_inherits(FindServiceAreasService, _NetworkAnalystServic); + + var _super = FindServiceAreasService_createSuper(FindServiceAreasService); + + function FindServiceAreasService(url, options) { + var _this; + + FindServiceAreasService_classCallCheck(this, FindServiceAreasService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindServiceAreasService"; + return _this; + } + /** + * @function FindServiceAreasService.prototype.destroy + * @override + */ + + + FindServiceAreasService_createClass(FindServiceAreasService, [{ + key: "destroy", + value: function destroy() { + FindServiceAreasService_get(FindServiceAreasService_getPrototypeOf(FindServiceAreasService.prototype), "destroy", this).call(this); + } + /** + * @function FindServiceAreasService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindServiceAreasParameters} params - 服务区分析服务参数类 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindServiceAreasParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'servicearea'); + jsonObject = { + isFromCenter: params.isFromCenter, + isCenterMutuallyExclusive: params.isCenterMutuallyExclusive, + parameter: Util.toJSON(params.parameter), + centers: me.getJson(params.isAnalyzeById, params.centers), + weights: me.getJson(true, params.weights) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindServiceAreasService.prototype.getJson + * @description 将对象转化为JSON字符串。 + * @param {boolean} isAnalyzeById - 是否通过id分析 + * @param {Array} params - 需要转换的数字 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJson", + value: function getJson(isAnalyzeById, params) { + var jsonString = "[", + len = params ? params.length : 0; + + if (isAnalyzeById === false) { + for (var i = 0; i < len; i++) { + if (i > 0) { + jsonString += ","; + } + + jsonString += '{"x":' + params[i].x + ',"y":' + params[i].y + '}'; + } + } else if (isAnalyzeById === true) { + for (var _i = 0; _i < len; _i++) { + if (_i > 0) { + jsonString += ","; + } + + jsonString += params[_i]; + } + } + + jsonString += ']'; + return jsonString; + } + /** + * @function FindServiceAreasService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result || !result.serviceAreaList) { + return result; + } + + var geoJSONFormat = new GeoJSON(); + result.serviceAreaList.map(function (serviceArea) { + if (serviceArea.serviceRegion) { + serviceArea.serviceRegion = geoJSONFormat.toGeoJSON(serviceArea.serviceRegion); + } + + if (serviceArea.edgeFeatures) { + serviceArea.edgeFeatures = geoJSONFormat.toGeoJSON(serviceArea.edgeFeatures); + } + + if (serviceArea.nodeFeatures) { + serviceArea.nodeFeatures = geoJSONFormat.toGeoJSON(serviceArea.nodeFeatures); + } + + if (serviceArea.routes) { + serviceArea.routes = geoJSONFormat.toGeoJSON(serviceArea.routes); + } + + return serviceArea; + }); + return result; + } + }]); + + return FindServiceAreasService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/FindTSPPathsParameters.js +function FindTSPPathsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindTSPPathsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindTSPPathsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindTSPPathsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindTSPPathsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class FindTSPPathsParameters + * @deprecatedclass SuperMap.FindTSPPathsParameters + * @category iServer NetworkAnalyst TSPPath + * @classdesc 旅行商分析参数类。 + * 旅行商分析是路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * 旅行商分析也可以指定到达的终点,这时查找从起点能够遍历所有途经点最后到达终点,且花费最小的路径。 + * 旅行商分析和最佳路径分析都是在网络中寻找遍历所有站点的最经济的路径,区别是在遍历网络所有站点的过程中对结点访问顺序不同 + * 最佳路径分析必须按照指定顺序对站点进行访问,而旅行商分析是无序的路径分析。 + * @param {Object} options - 参数。 + * @param {boolean} [options.endNodeAssigned=false] - 是否指定终止点,将指定的途经点的最后一个点作为终止点。true 表示指定终止点,则旅行商必须最后一个访问终止点。 + * @param {boolean} [options.isAnalyzeById=false] - 是否通过节点 ID 号来指定配送中心点和配送目的点。 + * @param {Array.>} options.nodes - 配送目标集合。 + * @param {TransportationAnalystParameter} [options.parameter] - 交通网络分析通用参数。 + * @usage + */ + +var FindTSPPathsParameters = /*#__PURE__*/function () { + function FindTSPPathsParameters(options) { + FindTSPPathsParameters_classCallCheck(this, FindTSPPathsParameters); + + /** + * @member {boolean} [FindTSPPathsParameters.prototype.endNodeAssigned=false] + * @description 是否指定终止点,将指定的途经点的最后一个点作为终止点。 + * true 表示指定终止点,则旅行商必须最后一个访问终止点。 + */ + this.endNodeAssigned = false; + /** + * @member {boolean} [FindTSPPathsParameters.prototype.isAnalyzeById=false] + * @description 是否通过节点 ID 号来指定途经点。 + */ + + this.isAnalyzeById = false; + /** + * @member {Array.>} FindTSPPathsParameters.prototype.nodes + * @description 旅行商分析途经点数组。 + * 当 FindTSPPathsParameters.isAnalyzeById = false 时,nodes 应为点的坐标数组; + * 当 FindTSPPathsParameters.isAnalyzeById = true 时,nodes 应为点的 ID 数组。 + */ + + this.nodes = null; + /** + * @member {TransportationAnalystParameter} [FindTSPPathsParameters.prototype.parameter] + * @description 交通网络分析通用参数。通过本类可以设置障碍边、障碍点、权值字段信息的名称标识、转向权值字段等信息。 + * TransportationAnalystParameter 类型,它虽然为可选参数,但是如果不设置其中的 resultSetting + * 字段,则返回结果空间信息等都为空。 + */ + + this.parameter = new TransportationAnalystParameter(); + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.FindTSPPathsParameters"; + } + /** + * @function FindTSPPathsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FindTSPPathsParameters_createClass(FindTSPPathsParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.endNodeAssigned = null; + me.isAnalyzeById = null; + me.nodes = null; + + if (me.parameter) { + me.parameter.destroy(); + me.parameter = null; + } + } + }]); + + return FindTSPPathsParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/FindTSPPathsService.js +function FindTSPPathsService_typeof(obj) { "@babel/helpers - typeof"; return FindTSPPathsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, FindTSPPathsService_typeof(obj); } + +function FindTSPPathsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FindTSPPathsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FindTSPPathsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) FindTSPPathsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) FindTSPPathsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function FindTSPPathsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { FindTSPPathsService_get = Reflect.get; } else { FindTSPPathsService_get = function _get(target, property, receiver) { var base = FindTSPPathsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return FindTSPPathsService_get.apply(this, arguments); } + +function FindTSPPathsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = FindTSPPathsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function FindTSPPathsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) FindTSPPathsService_setPrototypeOf(subClass, superClass); } + +function FindTSPPathsService_setPrototypeOf(o, p) { FindTSPPathsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FindTSPPathsService_setPrototypeOf(o, p); } + +function FindTSPPathsService_createSuper(Derived) { var hasNativeReflectConstruct = FindTSPPathsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = FindTSPPathsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = FindTSPPathsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return FindTSPPathsService_possibleConstructorReturn(this, result); }; } + +function FindTSPPathsService_possibleConstructorReturn(self, call) { if (call && (FindTSPPathsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return FindTSPPathsService_assertThisInitialized(self); } + +function FindTSPPathsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function FindTSPPathsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function FindTSPPathsService_getPrototypeOf(o) { FindTSPPathsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FindTSPPathsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FindTSPPathsService + * @deprecatedclass SuperMap.FindTSPPathsService + * @category iServer NetworkAnalyst TSPPath + * @classdesc 旅行商分析服务类 + * 旅行商分析是路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * 旅行商分析也可以指定到达的终点,这时查找从起点能够遍历所有途经点最后到达终点,且花费最小的路径。 + * 该类负责将客户端指定的旅行商分析参数传递给服务端,并接收服务端返回的结果数据。 + * 旅行商分析结果通过该类支持的事件的监听函数参数获取 + * @extends {NetworkAnalystServiceBase} + * @example + * (start code) + * var myFindTSPPathsService = new FindTSPPathsService(url, { + * eventListeners: { + * "processCompleted": findTSPPathsCompleted, + * "processFailed": findTSPPathsError + * } + * }); + * (end) + * @param {string} url - 网络分析服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}; + * 例如:"http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FindTSPPathsService = /*#__PURE__*/function (_NetworkAnalystServic) { + FindTSPPathsService_inherits(FindTSPPathsService, _NetworkAnalystServic); + + var _super = FindTSPPathsService_createSuper(FindTSPPathsService); + + function FindTSPPathsService(url, options) { + var _this; + + FindTSPPathsService_classCallCheck(this, FindTSPPathsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.FindTSPPathsService"; + return _this; + } + /** + * @function FindTSPPathsService.prototype.destroy + * @override + */ + + + FindTSPPathsService_createClass(FindTSPPathsService, [{ + key: "destroy", + value: function destroy() { + FindTSPPathsService_get(FindTSPPathsService_getPrototypeOf(FindTSPPathsService.prototype), "destroy", this).call(this); + } + /** + * @function FindTSPPathsService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof FindTSPPathsParameters)) { + return; + } + + var me = this, + jsonObject; + me.url = Util.urlPathAppend(me.url, 'tsppath'); + jsonObject = { + parameter: Util.toJSON(params.parameter), + endNodeAssigned: params.endNodeAssigned, + nodes: me.getNodesJson(params) + }; + me.request({ + method: "GET", + params: jsonObject, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function FindTSPPathsService.prototype.getNodesJson + * @description 将节点对象转化为JSON字符串。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + * @returns {string} 转化后的JSON字符串。 + */ + + }, { + key: "getNodesJson", + value: function getNodesJson(params) { + var jsonParameters = "", + nodesString, + i, + len, + nodes; + + if (params.isAnalyzeById === false) { + for (nodesString = "[", i = 0, nodes = params.nodes, len = nodes.length; i < len; i++) { + if (i > 0) { + nodesString += ","; + } + + nodesString += '{"x":' + nodes[i].x + ',"y":' + nodes[i].y + '}'; + } + + nodesString += ']'; + jsonParameters += nodesString; + } else if (params.isAnalyzeById === true) { + var nodeIDsString = "[", + _nodes = params.nodes, + _len = _nodes.length; + + for (var _i = 0; _i < _len; _i++) { + if (_i > 0) { + nodeIDsString += ","; + } + + nodeIDsString += _nodes[_i]; + } + + nodeIDsString += ']'; + jsonParameters += nodeIDsString; + } + + return jsonParameters; + } + /** + * @function FindTSPPathsService.prototype.toGeoJSONResult + * @description 将含有 geometry 的数据转换为 GeoJSON 格式。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "toGeoJSONResult", + value: function toGeoJSONResult(result) { + if (!result || !result.tspPathList) { + return null; + } + + var geoJSONFormat = new GeoJSON(); + result.tspPathList.forEach(function (path) { + if (path.route) { + path.route = geoJSONFormat.toGeoJSON(path.route); + } + + if (path.pathGuideItems) { + path.pathGuideItems = geoJSONFormat.toGeoJSON(path.pathGuideItems); + } + + if (path.edgeFeatures) { + path.edgeFeatures = geoJSONFormat.toGeoJSON(path.edgeFeatures); + } + + if (path.nodeFeatures) { + path.nodeFeatures = geoJSONFormat.toGeoJSON(path.nodeFeatures); + } + }); + return result; + } + }]); + + return FindTSPPathsService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GenerateSpatialDataParameters.js +function GenerateSpatialDataParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GenerateSpatialDataParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GenerateSpatialDataParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GenerateSpatialDataParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GenerateSpatialDataParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GenerateSpatialDataParameters + * @deprecatedclass SuperMap.GenerateSpatialDataParameters + * @category iServer SpatialAnalyst GenerateSpatialData + * @classdesc 动态分段操作参数类。通过该类可以为动态分段提供参数信息。 + * @param {Object} options - 参数。 + * @param {string} options.routeTable - 路由数据集。 + * @param {string} options.routeIDField - 路由数据集的标识字段。 + * @param {string} options.eventTable - 用于生成空间数据的事件表名。 + * @param {DataReturnOption} options.dataReturnOption - 设置数据返回选项。 + * @param {string} [options.attributeFilter] - 属性过滤条件。 + * @param {string} options.eventRouteIDField - 用于生成空间数据的事件表的路由标识字段。 + * @param {string} [options.measureField] - 用于生成空间数据的事件表的刻度字段,只有当事件为点事件的时候该属性才有意义。 + * @param {string} [options.measureStartField] - 用于生成空间数据的事件表的起始刻度字段,只有当事件为线事件的时候该属性才有意义。 + * @param {string} [options.measureEndField] - 用于生成空间数据的事件表的终止刻度字段,只有当事件为线事件的时候该属性才有意义。 + * @param {string} [options.measureOffsetField] - 刻度偏移量字段。 + * @param {string} [options.errorInfoField] - 错误信息字段,直接写入原事件表,用于描述事件未能生成对应的点或线时的错误信息。 + * @param {Array.} [options.retainedFields] - 欲保留到结果空间数据中的字段集合(系统字段除外)。 + * @usage + */ + +var GenerateSpatialDataParameters = /*#__PURE__*/function () { + function GenerateSpatialDataParameters(options) { + GenerateSpatialDataParameters_classCallCheck(this, GenerateSpatialDataParameters); + + /** + * @member {string} GenerateSpatialDataParameters.prototype.routeTable + * @description 路由数据集。 + */ + this.routeTable = null; + /** + * @member {string} GenerateSpatialDataParameters.prototype.routeIDField + * @description 路由数据集的标识字段。 + */ + + this.routeIDField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.attributeFilter] + * @description 属性过滤条件。 + * 当 {@link GenerateSpatialDataParameters.prototype.dataReturnOption.dataReturnMode} 为 {@link DataReturnMode.DATASET_AND_RECORDSET} 或 {@link DataReturnMode.RECORDSET_ONLY} 时有效。 + */ + + this.attributeFilter = null; + /** + * @member {string} GenerateSpatialDataParameters.prototype.eventTable + * @description 用于生成空间数据的事件表名。 + */ + + this.eventTable = null; + /** + * @member {string} GenerateSpatialDataParameters.prototype.eventRouteIDField + * @description 用于生成空间数据的事件表的路由标识字段。 + */ + + this.eventRouteIDField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureField] + * @description 用于生成空间数据的事件表的刻度字段,只有当事件为点事件的时候该属性才有意义 + */ + + this.measureField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureStartField] + * @description 用于生成空间数据的事件表的起始刻度字段,只有当事件为线事件的时候该属性才有意义。 + */ + + this.measureStartField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureEndField] + * @description 用于生成空间数据的事件表的终止刻度字段,只有当事件为线事件的时候该属性才有意义。 + */ + + this.measureEndField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.measureOffsetField] + * @description 刻度偏移量字段。 + */ + + this.measureOffsetField = null; + /** + * @member {string} [GenerateSpatialDataParameters.prototype.errorInfoField] + * @description 错误信息字段,直接写入原事件表,用于描述事件未能生成对应的点或线时的错误信息。 + */ + + this.errorInfoField = null; + /** + * @member {Array.} [GenerateSpatialDataParameters.prototype.retainedFields] + * @description 欲保留到结果空间数据中的字段集合(系统字段除外)。 + * 生成空间数据时,无论是否指定保留字段,路由 ID 字段、刻度偏移量字段、刻度值字段(点事件为刻度字段,线事件是起始和终止刻度字段)都会保留到结果空间数据中; + * 如果没有指定 retainedFields 参数或者 retainedFields 参数数组长度为 0,则返回所有用户字段。 + */ + + this.retainedFields = null; + /** + * @member {DataReturnOption} GenerateSpatialDataParameters.prototype.dataReturnOption + * @description 设置数据返回的选项。 + */ + + this.dataReturnOption = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GenerateSpatialDataParameters"; + } + /** + * @function GenerateSpatialDataParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GenerateSpatialDataParameters_createClass(GenerateSpatialDataParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.routeTable) { + me.routeTable = null; + } + + me.routeIDField = null; + me.attributeFilter = null; + me.eventTable = null; + me.eventRouteIDField = null; + me.measureField = null; + me.measureStartField = null; + me.measureEndField = null; + me.measureOffsetField = null; + me.errorInfoField = null; + + if (me.dataReturnOption) { + me.dataReturnOption.destroy(); + me.dataReturnOption = null; + } + } + }]); + + return GenerateSpatialDataParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/GenerateSpatialDataService.js +function GenerateSpatialDataService_typeof(obj) { "@babel/helpers - typeof"; return GenerateSpatialDataService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GenerateSpatialDataService_typeof(obj); } + +function GenerateSpatialDataService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GenerateSpatialDataService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GenerateSpatialDataService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GenerateSpatialDataService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GenerateSpatialDataService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GenerateSpatialDataService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GenerateSpatialDataService_get = Reflect.get; } else { GenerateSpatialDataService_get = function _get(target, property, receiver) { var base = GenerateSpatialDataService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GenerateSpatialDataService_get.apply(this, arguments); } + +function GenerateSpatialDataService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GenerateSpatialDataService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GenerateSpatialDataService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GenerateSpatialDataService_setPrototypeOf(subClass, superClass); } + +function GenerateSpatialDataService_setPrototypeOf(o, p) { GenerateSpatialDataService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GenerateSpatialDataService_setPrototypeOf(o, p); } + +function GenerateSpatialDataService_createSuper(Derived) { var hasNativeReflectConstruct = GenerateSpatialDataService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GenerateSpatialDataService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GenerateSpatialDataService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GenerateSpatialDataService_possibleConstructorReturn(this, result); }; } + +function GenerateSpatialDataService_possibleConstructorReturn(self, call) { if (call && (GenerateSpatialDataService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GenerateSpatialDataService_assertThisInitialized(self); } + +function GenerateSpatialDataService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GenerateSpatialDataService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GenerateSpatialDataService_getPrototypeOf(o) { GenerateSpatialDataService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GenerateSpatialDataService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GenerateSpatialDataService + * @deprecatedclass SuperMap.GenerateSpatialDataService + * @category iServer SpatialAnalyst GenerateSpatialData + * @classdesc 动态分段分析服务类。该类负责将客户设置的动态分段分析服务参数传递给服务端,并接收服务端返回的动态分段分析结果数据。 + * 获取的结果数据包括 originResult 、result 两种,其中,originResult 为服务端返回的用 JSON 对象表示的动态分段分析结果数据,result 为服务端返回的动态分段分析结果数据。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 实例化该类如下例所示: + * (start code) + * function GenerateSpatialData(){ + * + * //配置数据返回选项(option) + * var option = new DataReturnOption({ + * expectCount: 1000, + * dataset: "generateSpatialData", + * deleteExistResultDataset: true, + * dataReturnMode: DataReturnMode.DATASET_ONLY + * }), + * //配置动态分段参数(Parameters) + * parameters = new GenerateSpatialDataParameters({ + * routeTable: "RouteDT_road@Changchun", + * routeIDField: "RouteID", + * eventTable: "LinearEventTabDT@Changchun", + * eventRouteIDField: "RouteID", + * measureField: "", + * measureStartField: "LineMeasureFrom", + * measureEndField: "LineMeasureTo", + * measureOffsetField: "", + * errorInfoField: "", + * retainedFields:[], + * dataReturnOption: option + * }), + * //配置动态分段iService + * iService = new GenerateSpatialDataService(Changchun_spatialanalyst, { + * eventListeners: { + * processCompleted: generateCompleted, + * processFailed: generateFailded + * } + * }); + * //执行 + * iService.processAsync(parameters); + * function Completed(generateSpatialDataEventArgs){//todo}; + * function Error(generateSpatialDataEventArgs){//todo}; + * (end) + * @usage + */ + +var GenerateSpatialDataService = /*#__PURE__*/function (_SpatialAnalystBase) { + GenerateSpatialDataService_inherits(GenerateSpatialDataService, _SpatialAnalystBase); + + var _super = GenerateSpatialDataService_createSuper(GenerateSpatialDataService); + + function GenerateSpatialDataService(url, options) { + var _this; + + GenerateSpatialDataService_classCallCheck(this, GenerateSpatialDataService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GenerateSpatialDataService"; + return _this; + } + /** + * @function GenerateSpatialDataService.prototype.destroy + * @override + */ + + + GenerateSpatialDataService_createClass(GenerateSpatialDataService, [{ + key: "destroy", + value: function destroy() { + GenerateSpatialDataService_get(GenerateSpatialDataService_getPrototypeOf(GenerateSpatialDataService.prototype), "destroy", this).call(this); + } + /** + * @function GenerateSpatialDataService.prototype.processAsync + * @description 负责将客户端的动态分段服务参数传递到服务端。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof GenerateSpatialDataParameters)) { + return; + } + + var me = this, + jsonParameters; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function GenerateSpatialDataService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + * @returns {string}转化后的JSON字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + var jsonParameters = "", + jsonStr = "datasets/" + params.routeTable + "/linearreferencing/generatespatialdata", + me = this; + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + }]); + + return GenerateSpatialDataService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/GeoHashGridAggParameter.js +function GeoHashGridAggParameter_typeof(obj) { "@babel/helpers - typeof"; return GeoHashGridAggParameter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeoHashGridAggParameter_typeof(obj); } + +function GeoHashGridAggParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoHashGridAggParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoHashGridAggParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoHashGridAggParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoHashGridAggParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoHashGridAggParameter_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeoHashGridAggParameter_get = Reflect.get; } else { GeoHashGridAggParameter_get = function _get(target, property, receiver) { var base = GeoHashGridAggParameter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeoHashGridAggParameter_get.apply(this, arguments); } + +function GeoHashGridAggParameter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeoHashGridAggParameter_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeoHashGridAggParameter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeoHashGridAggParameter_setPrototypeOf(subClass, superClass); } + +function GeoHashGridAggParameter_setPrototypeOf(o, p) { GeoHashGridAggParameter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeoHashGridAggParameter_setPrototypeOf(o, p); } + +function GeoHashGridAggParameter_createSuper(Derived) { var hasNativeReflectConstruct = GeoHashGridAggParameter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeoHashGridAggParameter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeoHashGridAggParameter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeoHashGridAggParameter_possibleConstructorReturn(this, result); }; } + +function GeoHashGridAggParameter_possibleConstructorReturn(self, call) { if (call && (GeoHashGridAggParameter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeoHashGridAggParameter_assertThisInitialized(self); } + +function GeoHashGridAggParameter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeoHashGridAggParameter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeoHashGridAggParameter_getPrototypeOf(o) { GeoHashGridAggParameter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeoHashGridAggParameter_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeoHashGridAggParameter + * @deprecatedclass SuperMap.GeoHashGridAggParameter + * @classdesc 格网聚合查询参数类,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @category iServer Data FeatureResults + * @param {Object} options - 可选参数。 + * @param {number} [options.precision=5] - 精度。 + * @extends {BucketAggParameter} + * @usage + */ + +var GeoHashGridAggParameter = /*#__PURE__*/function (_BucketAggParameter) { + GeoHashGridAggParameter_inherits(GeoHashGridAggParameter, _BucketAggParameter); + + var _super = GeoHashGridAggParameter_createSuper(GeoHashGridAggParameter); + + function GeoHashGridAggParameter(options) { + var _this; + + GeoHashGridAggParameter_classCallCheck(this, GeoHashGridAggParameter); + + _this = _super.call(this); + /** + * @member {number} [GeoHashGridAggParameter.prototype.precision=5] + * @description 网格中数字的精度。 + */ + + _this.precision = 5; + Util.extend(GeoHashGridAggParameter_assertThisInitialized(_this), options); + /** + * @member {BucketAggType} [GeoHashGridAggParameter.prototype.aggType=BucketAggType.GEOHASH_GRID] + * @description 格网聚合类型。 + */ + + _this.aggType = BucketAggType.GEOHASH_GRID; + _this.CLASS_NAME = 'SuperMap.GeoHashGridAggParameter'; + return _this; + } + + GeoHashGridAggParameter_createClass(GeoHashGridAggParameter, [{ + key: "destroy", + value: function destroy() { + GeoHashGridAggParameter_get(GeoHashGridAggParameter_getPrototypeOf(GeoHashGridAggParameter.prototype), "destroy", this).call(this); + + this.aggType = null; + this.precision = null; + } + /** + * @function GeoHashGridAggParameter.toJsonParameters + * @description 将对象转为 JSON 格式。 + * @param param 转换对象。 + * @returns {Object} + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(param) { + var parameters = { + aggName: param.aggName, + aggFieldName: param.aggFieldName, + aggType: param.aggType, + precision: param.precision + }; + return Util.toJson(parameters); + } + }]); + + return GeoHashGridAggParameter; +}(BucketAggParameter); +;// CONCATENATED MODULE: ./src/common/iServer/GeometryOverlayAnalystParameters.js +function GeometryOverlayAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return GeometryOverlayAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeometryOverlayAnalystParameters_typeof(obj); } + +function GeometryOverlayAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeometryOverlayAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeometryOverlayAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeometryOverlayAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeometryOverlayAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeometryOverlayAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeometryOverlayAnalystParameters_get = Reflect.get; } else { GeometryOverlayAnalystParameters_get = function _get(target, property, receiver) { var base = GeometryOverlayAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeometryOverlayAnalystParameters_get.apply(this, arguments); } + +function GeometryOverlayAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeometryOverlayAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeometryOverlayAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeometryOverlayAnalystParameters_setPrototypeOf(subClass, superClass); } + +function GeometryOverlayAnalystParameters_setPrototypeOf(o, p) { GeometryOverlayAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeometryOverlayAnalystParameters_setPrototypeOf(o, p); } + +function GeometryOverlayAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = GeometryOverlayAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeometryOverlayAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeometryOverlayAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeometryOverlayAnalystParameters_possibleConstructorReturn(this, result); }; } + +function GeometryOverlayAnalystParameters_possibleConstructorReturn(self, call) { if (call && (GeometryOverlayAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeometryOverlayAnalystParameters_assertThisInitialized(self); } + +function GeometryOverlayAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeometryOverlayAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeometryOverlayAnalystParameters_getPrototypeOf(o) { GeometryOverlayAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeometryOverlayAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryOverlayAnalystParameters + * @deprecatedclass SuperMap.GeometryOverlayAnalystParameters + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc + * 几何对象叠加分析参数类。对指定的某两个几何对象做叠加分析。通过该类可以指定要做叠加分析的几何对象、叠加操作类型。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.operateGeometry - 叠加分析的操作几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link GeoJSONObject}。
+ * @param {GeoJSONObject} options.sourceGeometry - 叠加分析的源几何对象。 + * @param {Array.} [options.operateGeometries] - 批量叠加分析的操作几何对象数组。 + * @param {Array.} [options.sourceGeometries] -批量叠加分析的源几何对象数组。 + * @param {OverlayOperationType} [options.operation] - 叠加操作枚举值。 + * @extends {OverlayAnalystParameters} + * @usage + */ + +var GeometryOverlayAnalystParameters = /*#__PURE__*/function (_OverlayAnalystParame) { + GeometryOverlayAnalystParameters_inherits(GeometryOverlayAnalystParameters, _OverlayAnalystParame); + + var _super = GeometryOverlayAnalystParameters_createSuper(GeometryOverlayAnalystParameters); + + function GeometryOverlayAnalystParameters(options) { + var _this; + + GeometryOverlayAnalystParameters_classCallCheck(this, GeometryOverlayAnalystParameters); + + _this = _super.call(this, options); + + if (options && options.operateGeometry) { + _this.operateGeometry = options.operateGeometry; + } + + if (options && options.sourceGeometry) { + _this.sourceGeometry = options.sourceGeometry; + } + + if (options && options.operateGeometries) { + _this.operateGeometries = options.operateGeometries; + } + + if (options && options.sourceGeometries) { + _this.sourceGeometries = options.sourceGeometries; + } + + if (options) { + Util.extend(GeometryOverlayAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GeometryOverlayAnalystParameters"; + return _this; + } + /** + * @function GeometryOverlayAnalystParameters.prototype.destroy + * @override + */ + + + GeometryOverlayAnalystParameters_createClass(GeometryOverlayAnalystParameters, [{ + key: "destroy", + value: function destroy() { + GeometryOverlayAnalystParameters_get(GeometryOverlayAnalystParameters_getPrototypeOf(GeometryOverlayAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + + if (me.sourceGeometries) { + me.sourceGeometries.destroy(); + me.sourceGeometries = null; + } + + if (me.sourceGeometry) { + me.sourceGeometry.destroy(); + me.sourceGeometry = null; + } + + if (me.operateGeometries) { + me.operateGeometries.destroy(); + me.operateGeometries = null; + } + } + /** + * @function GeometryOverlayAnalystParameters.toObject + * @param {GeometryOverlayAnalystParameters} geometryOverlayAnalystParameters - 几何对象叠加分析参数类。 + * @param {GeometryOverlayAnalystParameters} tempObj - 几何对象叠加分析参数对象。 + * @description 将几何对象叠加分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(geometryOverlayAnalystParameters, tempObj) { + for (var name in geometryOverlayAnalystParameters) { + if (name === "sourceGeometry") { + tempObj.sourceGeometry = ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.sourceGeometry); + } else if (name === "sourceGeometries") { + var sourceGeometries = []; + + for (var i = 0; i < geometryOverlayAnalystParameters.sourceGeometries.length; i++) { + sourceGeometries.push(ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.sourceGeometries[i])); + } + + tempObj.sourceGeometries = sourceGeometries; + } else if (name === "operateGeometry") { + tempObj.operateGeometry = ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.operateGeometry); + } else if (name === "operateGeometries") { + var operateGeometries = []; + + for (var j = 0; j < geometryOverlayAnalystParameters.operateGeometries.length; j++) { + operateGeometries.push(ServerGeometry.fromGeometry(geometryOverlayAnalystParameters.operateGeometries[j])); + } + + tempObj.operateGeometries = operateGeometries; + } else { + tempObj[name] = geometryOverlayAnalystParameters[name]; + } + } + } + }]); + + return GeometryOverlayAnalystParameters; +}(OverlayAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/GeometrySurfaceAnalystParameters.js +function GeometrySurfaceAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return GeometrySurfaceAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeometrySurfaceAnalystParameters_typeof(obj); } + +function GeometrySurfaceAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeometrySurfaceAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeometrySurfaceAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeometrySurfaceAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeometrySurfaceAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeometrySurfaceAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeometrySurfaceAnalystParameters_get = Reflect.get; } else { GeometrySurfaceAnalystParameters_get = function _get(target, property, receiver) { var base = GeometrySurfaceAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeometrySurfaceAnalystParameters_get.apply(this, arguments); } + +function GeometrySurfaceAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeometrySurfaceAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeometrySurfaceAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeometrySurfaceAnalystParameters_setPrototypeOf(subClass, superClass); } + +function GeometrySurfaceAnalystParameters_setPrototypeOf(o, p) { GeometrySurfaceAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeometrySurfaceAnalystParameters_setPrototypeOf(o, p); } + +function GeometrySurfaceAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = GeometrySurfaceAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeometrySurfaceAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeometrySurfaceAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeometrySurfaceAnalystParameters_possibleConstructorReturn(this, result); }; } + +function GeometrySurfaceAnalystParameters_possibleConstructorReturn(self, call) { if (call && (GeometrySurfaceAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeometrySurfaceAnalystParameters_assertThisInitialized(self); } + +function GeometrySurfaceAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeometrySurfaceAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeometrySurfaceAnalystParameters_getPrototypeOf(o) { GeometrySurfaceAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeometrySurfaceAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeometrySurfaceAnalystParameters + * @deprecatedclass SuperMap.GeometrySurfaceAnalystParameters + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 几何对象表面分析参数类。该类对几何对象表面分析所用到的参数进行设置。 + * @param {Object} options - 参数。 + * @param {Array.>} options.points - 表面分析的坐标点数组。 + * @param {Array.} options.zValues - 表面分析的坐标点的 Z 值数组。 + * @param {number} [options.resolution] - 获取或设置指定中间结果(栅格数据集)的分辨率。 + * @param {DataReturnOption} [options.resultSetting] - 结果返回设置类。 + * @param {SurfaceAnalystParametersSetting} options.extractParameter - 获取或设置表面分析参数。 + * @param {SurfaceAnalystMethod} [options.surfaceAnalystMethod = SurfaceAnalystMethod.ISOLINE] - 获取或设置表面分析的提取方法,提取等值线和提取等值面。 + * @extends {SurfaceAnalystParameters} + * @usage + */ + +var GeometrySurfaceAnalystParameters = /*#__PURE__*/function (_SurfaceAnalystParame) { + GeometrySurfaceAnalystParameters_inherits(GeometrySurfaceAnalystParameters, _SurfaceAnalystParame); + + var _super = GeometrySurfaceAnalystParameters_createSuper(GeometrySurfaceAnalystParameters); + + function GeometrySurfaceAnalystParameters(options) { + var _this; + + GeometrySurfaceAnalystParameters_classCallCheck(this, GeometrySurfaceAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {Array.>} GeometrySurfaceAnalystParameters.prototype.points + * @description 获取或设置用于表面分析的坐标点数组。 + */ + + _this.points = null; + /** + * @member {Array.} GeometrySurfaceAnalystParameters.prototype.zValues + * @description 获取或设置用于提取操作的值。提取等值线时,将使用该数组中的值, + * 对几何对象中的坐标点数组进行插值分析,得到栅格数据集(中间结果),接着从栅格数据集提取等值线。 + */ + + _this.zValues = null; + + if (options) { + Util.extend(GeometrySurfaceAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GeometrySurfaceAnalystParameters"; + return _this; + } + /** + * @function GeometrySurfaceAnalystParameters.prototype.destroy + * @override + */ + + + GeometrySurfaceAnalystParameters_createClass(GeometrySurfaceAnalystParameters, [{ + key: "destroy", + value: function destroy() { + GeometrySurfaceAnalystParameters_get(GeometrySurfaceAnalystParameters_getPrototypeOf(GeometrySurfaceAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.points) { + for (var i = 0, points = me.points, len = points.length; i < len; i++) { + points[i].destroy(); + } + + me.points = null; + } + + me.zValues = null; + } + }]); + + return GeometrySurfaceAnalystParameters; +}(SurfaceAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/GeometryThiessenAnalystParameters.js +function GeometryThiessenAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return GeometryThiessenAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeometryThiessenAnalystParameters_typeof(obj); } + +function GeometryThiessenAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeometryThiessenAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeometryThiessenAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeometryThiessenAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeometryThiessenAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeometryThiessenAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeometryThiessenAnalystParameters_get = Reflect.get; } else { GeometryThiessenAnalystParameters_get = function _get(target, property, receiver) { var base = GeometryThiessenAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeometryThiessenAnalystParameters_get.apply(this, arguments); } + +function GeometryThiessenAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeometryThiessenAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeometryThiessenAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeometryThiessenAnalystParameters_setPrototypeOf(subClass, superClass); } + +function GeometryThiessenAnalystParameters_setPrototypeOf(o, p) { GeometryThiessenAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeometryThiessenAnalystParameters_setPrototypeOf(o, p); } + +function GeometryThiessenAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = GeometryThiessenAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeometryThiessenAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeometryThiessenAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeometryThiessenAnalystParameters_possibleConstructorReturn(this, result); }; } + +function GeometryThiessenAnalystParameters_possibleConstructorReturn(self, call) { if (call && (GeometryThiessenAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeometryThiessenAnalystParameters_assertThisInitialized(self); } + +function GeometryThiessenAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeometryThiessenAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeometryThiessenAnalystParameters_getPrototypeOf(o) { GeometryThiessenAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeometryThiessenAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeometryThiessenAnalystParameters + * @deprecatedclass SuperMap.GeometryThiessenAnalystParameters + * @constructs GeometryThiessenAnalystParameters + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc 几何对象泰森多边形分析参数类。对指定的某个几何对象做泰森多边形分析。通过该类可以指定要做泰森多边形分析的几何对象、返回数据集名称等。 + * @param {Object} options - 参数。 + * @param {Array.>} options.points - 使用点数组进行分析时使用的几何对象。 + * @extends {ThiessenAnalystParameters} + * @usage + */ + +var GeometryThiessenAnalystParameters = /*#__PURE__*/function (_ThiessenAnalystParam) { + GeometryThiessenAnalystParameters_inherits(GeometryThiessenAnalystParameters, _ThiessenAnalystParam); + + var _super = GeometryThiessenAnalystParameters_createSuper(GeometryThiessenAnalystParameters); + + function GeometryThiessenAnalystParameters(options) { + var _this; + + GeometryThiessenAnalystParameters_classCallCheck(this, GeometryThiessenAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {Array.>} GeometryThiessenAnalystParameters.prototype.points + * @description 使用点数组进行分析时使用的几何对象。 + */ + + _this.points = null; + + if (options) { + Util.extend(GeometryThiessenAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GeometryThiessenAnalystParameters"; + return _this; + } + /** + * @function GeometryThiessenAnalystParameters.prototype.destroy + * @override + */ + + + GeometryThiessenAnalystParameters_createClass(GeometryThiessenAnalystParameters, [{ + key: "destroy", + value: function destroy() { + GeometryThiessenAnalystParameters_get(GeometryThiessenAnalystParameters_getPrototypeOf(GeometryThiessenAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.points) { + for (var i = me.points.length - 1; i >= 0; i--) { + me.points[i].destroy(); + } + + me.points = null; + } + } + /** + * @function GeometryThiessenAnalystParameters.toObject + * @param {GeometryThiessenAnalystParameters} geometryThiessenAnalystParameters - 几何对象泰森多边形分析参数类。 + * @param {GeometryThiessenAnalystParameters} tempObj - 几何对象泰森多边形分析参数对象。 + * @description 将几何对象泰森多边形分析参数对象转换为 JSON 对象。 + * @returns {Object} JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(geometryThiessenAnalystParameters, tempObj) { + for (var name in geometryThiessenAnalystParameters) { + if (name === "clipRegion") { + tempObj.clipRegion = ServerGeometry.fromGeometry(geometryThiessenAnalystParameters.clipRegion); + } else { + tempObj[name] = geometryThiessenAnalystParameters[name]; + } + } + } + }]); + + return GeometryThiessenAnalystParameters; +}(ThiessenAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/GeoprocessingService.js +function GeoprocessingService_typeof(obj) { "@babel/helpers - typeof"; return GeoprocessingService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeoprocessingService_typeof(obj); } + +function GeoprocessingService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoprocessingService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoprocessingService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoprocessingService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoprocessingService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoprocessingService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeoprocessingService_setPrototypeOf(subClass, superClass); } + +function GeoprocessingService_setPrototypeOf(o, p) { GeoprocessingService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeoprocessingService_setPrototypeOf(o, p); } + +function GeoprocessingService_createSuper(Derived) { var hasNativeReflectConstruct = GeoprocessingService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeoprocessingService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeoprocessingService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeoprocessingService_possibleConstructorReturn(this, result); }; } + +function GeoprocessingService_possibleConstructorReturn(self, call) { if (call && (GeoprocessingService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeoprocessingService_assertThisInitialized(self); } + +function GeoprocessingService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeoprocessingService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeoprocessingService_getPrototypeOf(o) { GeoprocessingService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeoprocessingService_getPrototypeOf(o); } + + +/** + * @class GeoprocessingService + * @deprecatedclass SuperMap.GeoprocessingService + * @category iServer ProcessingAutomationService + * @classdesc 处理自动化服务接口的基类。 + * @version 10.1.0 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @usage + */ + +var GeoprocessingService = /*#__PURE__*/function (_CommonServiceBase) { + GeoprocessingService_inherits(GeoprocessingService, _CommonServiceBase); + + var _super = GeoprocessingService_createSuper(GeoprocessingService); + + function GeoprocessingService(url, options) { + var _this; + + GeoprocessingService_classCallCheck(this, GeoprocessingService); + + options = options || {}; + options.EVENT_TYPES = ['processCompleted', 'processFailed', 'processRunning']; + _this = _super.call(this, url, options); + _this.CLASS_NAME = 'SuperMap.GeoprocessingService'; + _this.headers = {}; + _this.crossOrigin = true; + return _this; + } + /** + * @function GeoprocessingService.prototype.getTools + * @description 获取处理自动化工具列表。 + */ + + + GeoprocessingService_createClass(GeoprocessingService, [{ + key: "getTools", + value: function getTools() { + this._get("".concat(this.url, "/list")); + } + /** + * @function GeoprocessingService.prototype.getTool + * @description 获取处理自动化工具的ID、名称、描述、输入参数、环境参数和输出结果等相关参数。 + * @param {string} identifier - 处理自动化工具ID。 + */ + + }, { + key: "getTool", + value: function getTool(identifier) { + this._get("".concat(this.url, "/").concat(identifier)); + } + /** + * @function GeoprocessingService.prototype.execute + * @description 同步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + */ + + }, { + key: "execute", + value: function execute(identifier, parameter, environment) { + parameter = parameter ? parameter : null; + environment = environment ? environment : null; + var executeParamter = { + parameter: parameter, + environment: environment + }; + + this._get("".concat(this.url, "/").concat(identifier, "/execute"), executeParamter); + } + /** + * @function GeoprocessingService.prototype.submitJob + * @description 异步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environments - 处理自动化工具的环境参数。 + */ + + }, { + key: "submitJob", + value: function submitJob(identifier, parameter, environments) { + parameter = parameter ? parameter : null; + environments = environments ? environments : null; + var asyncParamter = { + parameter: parameter, + environments: environments + }; + this.request({ + url: "".concat(this.url, "/").concat(identifier, "/jobs"), + headers: { + 'Content-type': 'application/json' + }, + method: 'POST', + data: JSON.stringify(asyncParamter), + scope: this, + success: this.serviceProcessCompleted, + failure: this.serviceProcessFailed + }); + } + /** + * @function GeoprocessingService.prototype.waitForJobCompletion + * @description 获取处理自动化异步执行状态信息。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} options - 状态信息参数。 + * @param {number} options.interval - 定时器时间间隔。 + * @param {function} options.statusCallback - 任务状态的回调函数。 + */ + + }, { + key: "waitForJobCompletion", + value: function waitForJobCompletion(jobId, identifier, options) { + var me = this; + var timer = setInterval(function () { + var serviceProcessCompleted = function serviceProcessCompleted(serverResult) { + var state = serverResult.state.runState; + + if (options.statusCallback) { + options.statusCallback(state); + } + + switch (state) { + case 'FINISHED': + clearInterval(timer); + me.events.triggerEvent('processCompleted', { + result: serverResult + }); + break; + + case 'FAILED': + clearInterval(timer); + me.events.triggerEvent('processFailed', { + result: serverResult + }); + break; + + case 'CANCELED': + clearInterval(timer); + me.events.triggerEvent('processFailed', { + result: serverResult + }); + break; + } + }; + + me._get("".concat(me.url, "/").concat(identifier, "/jobs/").concat(jobId), null, serviceProcessCompleted); + }, options.interval); + } + /** + * @function GeoprocessingService.prototype.getJobInfo + * @description 获取处理自动化任务的执行信息。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + */ + + }, { + key: "getJobInfo", + value: function getJobInfo(identifier, jobId) { + this._get("".concat(this.url, "/").concat(identifier, "/jobs/").concat(jobId)); + } + /** + * @function GeoprocessingService.prototype.cancelJob + * @description 取消处理自动化任务的异步执行。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + */ + + }, { + key: "cancelJob", + value: function cancelJob(identifier, jobId) { + this._get("".concat(this.url, "/").concat(identifier, "/jobs/").concat(jobId, "/cancel")); + } + /** + * @function GeoprocessingService.prototype.getJobs + * @description 获取处理自动化服务任务列表。 + * @param {string} identifier - 处理自动化工具ID。(传参代表identifier算子的任务列表,不传参代表所有任务的列表) + */ + + }, { + key: "getJobs", + value: function getJobs(identifier) { + var url = "".concat(this.url, "/jobs"); + + if (identifier) { + url = "".concat(this.url, "/").concat(identifier, "/jobs"); + } + + this._get(url); + } + /** + * @function GeoprocessingService.prototype.getResults + * @description 处理自动化工具执行的结果等,支持结果过滤。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} filter - 输出异步结果的id。(可选,传入filter参数时对该处理自动化工具执行的结果进行过滤获取,不填参时显示所有的执行结果) + */ + + }, { + key: "getResults", + value: function getResults(identifier, jobId, filter) { + var url = "".concat(this.url, "/").concat(identifier, "/jobs/").concat(jobId, "/results"); + + if (filter) { + url = "".concat(url, "/").concat(filter); + } + + this._get(url); + } + }, { + key: "_get", + value: function _get(url, paramter, serviceProcessCompleted, serviceProcessFailed) { + this.request({ + url: url, + method: 'GET', + params: paramter, + headers: { + 'Content-type': 'application/json' + }, + scope: this, + success: serviceProcessCompleted ? serviceProcessCompleted : this.serviceProcessCompleted, + failure: serviceProcessFailed ? serviceProcessFailed : this.serviceProcessFailed + }); + } + }]); + + return GeoprocessingService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GeoRelationAnalystParameters.js +function GeoRelationAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoRelationAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoRelationAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoRelationAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoRelationAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeoRelationAnalystParameters + * @deprecatedclass SuperMap.GeoRelationAnalystParameters + * @category iServer SpatialAnalyst GeoRelationAnalyst + * @classdesc 空间关系分析服务参数类。使用该类可以为空间关系分析服务提供所需的参数信息。 + * @param {Object} options - 参数。 + * @param {FilterParameter} options.sourceFilter - 空间关系分析中的源数据集查询参数。仅 name, ids, attributeFilter 和 fields 字段有效。 + * @param {FilterParameter} options.referenceFilter - 空间关系分析中的参考数据集查询参数。仅 name, ids, attributeFilter 和 fields 字段有效。 + * @param {SpatialRelationType} options.spatialRelationType - 指定的空间关系类型。 + * @param {boolean} [options.isBorderInside] - 边界处理方式,即位于面边线上的点是否被面包含。此参数仅用于空间关系为包含或被包含的情况。 + * @param {boolean} [options.returnFeature] - 是否返回 Feature 信息。 + * @param {boolean} [options.returnGeoRelatedOnly=true] - 仅返回满足指定空间关系的空间对象。 + * @param {number} [options.startRecord=0] - 分析结果起始记录位置。 + * @param {number} [options.expectCount=500] - 空间关系分析期望返回结果记录数,如果实际不足500条结果则返回所有分析结果。 + * @usage + */ + +var GeoRelationAnalystParameters = /*#__PURE__*/function () { + function GeoRelationAnalystParameters(options) { + GeoRelationAnalystParameters_classCallCheck(this, GeoRelationAnalystParameters); + + /** + * @member {string} GeoRelationAnalystParameters.prototype.dataset + * @description 源数据集名称。 + */ + this.dataset = null; + /** + * @member {FilterParameter} GeoRelationAnalystParameters.prototype.sourceFilter + * @description 空间关系分析中的源数据集查询参数。仅 ids、attributeFilter 和 fields 字段有效。 + */ + + this.sourceFilter = null; + /** + * @member {FilterParameter} GeoRelationAnalystParameters.prototype.referenceFilter + * @description 空间关系分析中的参考数据集查询参数。仅 name,ids,attributeFilter 和 fields 字段有效。 + */ + + this.referenceFilter = null; + /** + * @member {SpatialRelationType} GeoRelationAnalystParameters.prototype.spatialRelationType + * @description 指定的空间关系类型。 + */ + + this.spatialRelationType = null; + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.isBorderInside] + * @description 边界处理方式,即位于面边线上的点是否被面包含。此参数仅用于空间关系为包含或被包含的情况。 + */ + + this.isBorderInside = null; + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.returnFeature] + * @description 是否返回 Feature 信息。 + */ + + this.returnFeature = null; + /** + * @member {boolean} [GeoRelationAnalystParameters.prototype.returnGeoRelatedOnly=true] + * @description 是否仅返回满足指定空间关系的空间对象。 + */ + + this.returnGeoRelatedOnly = null; + /** + * @member {number} [GeoRelationAnalystParameters.prototype.returnGeoRelatedOnly=0] + * @description 分析结果起始记录位置。 + */ + + this.startRecord = 0; + /** + * @member {number} [GeoRelationAnalystParameters.prototype.expectCount=500] + * @description 空间关系分析期望返回结果记录数,如果实际不足 500 条结果则返回所有分析结果。 + */ + + this.expectCount = 500; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.GeoRelationAnalystParameters"; + } + /** + * @function GeoRelationAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GeoRelationAnalystParameters_createClass(GeoRelationAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.sourceFilter) { + me.sourceFilter.destroy(); + } + + me.sourceFilter = null; + + if (me.referenceFilter) { + me.referenceFilter.destroy(); + } + + me.referenceFilter = null; + me.dataset = null; + me.spatialRelationType = null; + me.isBorderInside = null; + me.returnFeature = null; + me.returnGeoRelatedOnly = null; + me.startRecord = null; + me.expectCount = null; + } + }]); + + return GeoRelationAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/GeoRelationAnalystService.js +function GeoRelationAnalystService_typeof(obj) { "@babel/helpers - typeof"; return GeoRelationAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeoRelationAnalystService_typeof(obj); } + +function GeoRelationAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoRelationAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoRelationAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoRelationAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoRelationAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoRelationAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeoRelationAnalystService_get = Reflect.get; } else { GeoRelationAnalystService_get = function _get(target, property, receiver) { var base = GeoRelationAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeoRelationAnalystService_get.apply(this, arguments); } + +function GeoRelationAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeoRelationAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeoRelationAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeoRelationAnalystService_setPrototypeOf(subClass, superClass); } + +function GeoRelationAnalystService_setPrototypeOf(o, p) { GeoRelationAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeoRelationAnalystService_setPrototypeOf(o, p); } + +function GeoRelationAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = GeoRelationAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeoRelationAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeoRelationAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeoRelationAnalystService_possibleConstructorReturn(this, result); }; } + +function GeoRelationAnalystService_possibleConstructorReturn(self, call) { if (call && (GeoRelationAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeoRelationAnalystService_assertThisInitialized(self); } + +function GeoRelationAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeoRelationAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeoRelationAnalystService_getPrototypeOf(o) { GeoRelationAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeoRelationAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GeoRelationAnalystService + * @deprecatedclass SuperMap.GeoRelationAnalystService + * @category iServer SpatialAnalyst GeoRelationAnalyst + * @classdesc 空间关系分析服务类。该类负责将客户设置的空间关系分析服务参数传递给服务端,并接收服务端返回的空间关系分析结果数据。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 实例化该类如下例所示: + * (start code) + * function datasetGeoRelationAnalystProcess() { + * var referenceFilter = new FilterParameter({ + * name:"Frame_R@Changchun", + * attributeFilter:"SmID>0"}); + * var sourceFilter = new FilterParameter({ + * attributeFilter:"SmID>0"}); + * //初始化服务类 + * var datasetGeoRelationService = new GeoRelationAnalystService( + * "http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst/"), + * //构建参数类 + * datasetGeoRelationParameters = new GeoRelationAnalystParameters({ + * dataset: "Park@Changchun", + * startRecord: 0, + * expectCount: 20, + * sourceFilter: sourceFilter, + * referenceFilter: referenceFilter, + * spatialRelationType: SpatialRelationType.INTERSECT, + * isBorderInside: true, + * returnFeature: true, + * returnGeoRelatedOnly: true + * }); + * datasetGeoRelationService.events.on({ + * "processCompleted": datasetGeoRelationAnalystCompleted, + * "processFailed": datasetGeoRelationAnalystFailed}); + * //执行 + * datasetGeoRelationService.processAsync(datasetGeoRelationParameters); + * } + * function Completed(datasetGeoRelationAnalystCompleted){//todo}; + * function Error(datasetGeoRelationAnalystFailed){//todo}; + * (end) + * @usage + */ + +var GeoRelationAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + GeoRelationAnalystService_inherits(GeoRelationAnalystService, _SpatialAnalystBase); + + var _super = GeoRelationAnalystService_createSuper(GeoRelationAnalystService); + + function GeoRelationAnalystService(url, options) { + var _this; + + GeoRelationAnalystService_classCallCheck(this, GeoRelationAnalystService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GeoRelationAnalystService"; + return _this; + } + /** + * @function GeoRelationAnalystService.prototype.destroy + * @override + */ + + + GeoRelationAnalystService_createClass(GeoRelationAnalystService, [{ + key: "destroy", + value: function destroy() { + GeoRelationAnalystService_get(GeoRelationAnalystService_getPrototypeOf(GeoRelationAnalystService.prototype), "destroy", this).call(this); + } + /** + * @function GeoRelationAnalystService.prototype.processAsync + * @description 负责将客户端的空间关系分析参数传递到服务端 + * @param {GeoRelationAnalystParameters} parameter - 空间关系分析所需的参数信息。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + if (!(parameter instanceof GeoRelationAnalystParameters)) { + return; + } + + var me = this; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/georelation'); + var jsonParameters = Util.toJSON(parameter); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return GeoRelationAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/DatasetService.js +function DatasetService_typeof(obj) { "@babel/helpers - typeof"; return DatasetService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DatasetService_typeof(obj); } + +function DatasetService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DatasetService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DatasetService_createClass(Constructor, protoProps, staticProps) { if (protoProps) DatasetService_defineProperties(Constructor.prototype, protoProps); if (staticProps) DatasetService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DatasetService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { DatasetService_get = Reflect.get; } else { DatasetService_get = function _get(target, property, receiver) { var base = DatasetService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return DatasetService_get.apply(this, arguments); } + +function DatasetService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DatasetService_getPrototypeOf(object); if (object === null) break; } return object; } + +function DatasetService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DatasetService_setPrototypeOf(subClass, superClass); } + +function DatasetService_setPrototypeOf(o, p) { DatasetService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DatasetService_setPrototypeOf(o, p); } + +function DatasetService_createSuper(Derived) { var hasNativeReflectConstruct = DatasetService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DatasetService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DatasetService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DatasetService_possibleConstructorReturn(this, result); }; } + +function DatasetService_possibleConstructorReturn(self, call) { if (call && (DatasetService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DatasetService_assertThisInitialized(self); } + +function DatasetService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DatasetService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DatasetService_getPrototypeOf(o) { DatasetService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DatasetService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class DatasetService + * @deprecatedclass SuperMap.DatasetService + * @category iServer Data Dataset + * @classdesc 数据集查询服务。 + * @param {string} url - 服务的访问地址。如访问World Data服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string}options.datasource - 数据源名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var DatasetService = /*#__PURE__*/function (_CommonServiceBase) { + DatasetService_inherits(DatasetService, _CommonServiceBase); + + var _super = DatasetService_createSuper(DatasetService); + + function DatasetService(url, options) { + var _this; + + DatasetService_classCallCheck(this, DatasetService); + + _this = _super.call(this, url, options); + + if (!options) { + return DatasetService_possibleConstructorReturn(_this); + } + /** + * @member {string} DatasetService.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + + + _this.datasource = null; + /** + * @member {string} DatasetService.prototype.dataset + * @description 要查询的数据集名称。 + */ + + _this.dataset = null; + + if (options) { + Util.extend(DatasetService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.DatasetService"; + return _this; + } + /** + * @function DatasetService.prototype.destroy + * @override + */ + + + DatasetService_createClass(DatasetService, [{ + key: "destroy", + value: function destroy() { + DatasetService_get(DatasetService_getPrototypeOf(DatasetService.prototype), "destroy", this).call(this); + + var me = this; + me.datasource = null; + me.dataset = null; + } + /** + * @function DatasetService.prototype.getDatasetsService + * @description 执行服务,查询数据集服务。 + */ + + }, { + key: "getDatasetsService", + value: function getDatasetsService(params) { + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources/name/".concat(params, "/datasets")); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasetService.prototype.getDatasetService + * @description 执行服务,查询数据集信息服务。 + */ + + }, { + key: "getDatasetService", + value: function getDatasetService(datasourceName, datasetName) { + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources/name/".concat(datasourceName, "/datasets/name/").concat(datasetName)); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasetService.prototype.setDatasetService + * @description 执行服务,更改数据集信息服务。 + */ + + }, { + key: "setDatasetService", + value: function setDatasetService(params) { + if (!params) { + return; + } + + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function DatasetService.prototype.deleteDatasetService + * @description 执行服务,删除数据集信息服务。 + */ + + }, { + key: "deleteDatasetService", + value: function deleteDatasetService() { + var me = this; + me.request({ + method: "DELETE", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return DatasetService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesParametersBase.js +function GetFeaturesParametersBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesParametersBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesParametersBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesParametersBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesParametersBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GetFeaturesParametersBase + * @deprecatedclass SuperMap.GetFeaturesParametersBase + * @category iServer Data FeatureResults + * @classdesc 要素查询参数基类。 + * @param {Object} options - 参数。 + * @param {Array.} options.datasetNames - 数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @usage + */ + +var GetFeaturesParametersBase = /*#__PURE__*/function () { + function GetFeaturesParametersBase(options) { + GetFeaturesParametersBase_classCallCheck(this, GetFeaturesParametersBase); + + /** + * @member {Array.} GetFeaturesParametersBase.prototype.datasetName + * @description 数据集集合中的数据集名称列表。 + */ + this.datasetNames = null; + /** + * @member {string} GetFeaturesParametersBase.prototype.targetEpsgCode + * @description 动态投影的目标坐标系对应的 EPSG Code,使用时需设置 returnContent 参数为 true。 + */ + + this.targetEpsgCode = null; + /** + * @member {Object} GetFeaturesParametersBase.prototype.targetPrj + * @description 动态投影的目标坐标系。使用时需设置 returnContent 参数为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + */ + + this.targetPrj = null; + /** + * @member {boolean} [GetFeaturesParametersBase.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 如果为 false,则返回的是查询结果资源的 URI。 + */ + + this.returnContent = true; + /** + * @member {number} [GetFeaturesParametersBase.prototype.fromIndex=0] + * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 + */ + + this.fromIndex = 0; + /** + * @member {number} [GetFeaturesParametersBase.prototype.toIndex=19] + * @description 查询结果的最大索引号。如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 + */ + + this.toIndex = 19; + /** + * @member {boolean} [GetFeaturesParametersBase.prototype.returnCountOnly=false] + * @description 只返回查询结果的总数。 + */ + + this.returnCountOnly = false; + /** + * @member {number} [GetFeaturesParametersBase.prototype.maxFeatures=1000] + * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 + */ + + this.maxFeatures = null; + /** + * @member {number} [GetFeaturesParametersBase.prototype.hasGeometry=true] + * @description 返回结果是否包含Geometry + */ + + this.hasGeometry = true; + /** + * @member {MetricsAggParameter|GeoHashGridAggParameter} GetFeaturesParametersBase.prototype.aggregations + * @description 聚合查询参数,该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + */ + + this.aggregations = null; + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.GetFeaturesParametersBase'; + } + /** + * + * @function GetFeaturesParametersBase.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GetFeaturesParametersBase_createClass(GetFeaturesParametersBase, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasetNames = null; + me.returnContent = null; + me.fromIndex = null; + me.toIndex = null; + me.hasGeometry = null; + me.maxFeatures = null; + me.targetEpsgCode = null; + me.targetPrj = null; + + if (me.aggregation) { + me.aggregation = null; + } + } + }]); + + return GetFeaturesParametersBase; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBoundsParameters.js +function GetFeaturesByBoundsParameters_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByBoundsParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByBoundsParameters_typeof(obj); } + +function GetFeaturesByBoundsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByBoundsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByBoundsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByBoundsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByBoundsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByBoundsParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByBoundsParameters_get = Reflect.get; } else { GetFeaturesByBoundsParameters_get = function _get(target, property, receiver) { var base = GetFeaturesByBoundsParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByBoundsParameters_get.apply(this, arguments); } + +function GetFeaturesByBoundsParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByBoundsParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByBoundsParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByBoundsParameters_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByBoundsParameters_setPrototypeOf(o, p) { GetFeaturesByBoundsParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByBoundsParameters_setPrototypeOf(o, p); } + +function GetFeaturesByBoundsParameters_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByBoundsParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByBoundsParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByBoundsParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByBoundsParameters_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByBoundsParameters_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByBoundsParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByBoundsParameters_assertThisInitialized(self); } + +function GetFeaturesByBoundsParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByBoundsParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByBoundsParameters_getPrototypeOf(o) { GetFeaturesByBoundsParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByBoundsParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GetFeaturesByBoundsParameters + * @deprecatedclass SuperMap.GetFeaturesByBoundsParameters + * @category iServer Data FeatureResults + * @classdesc 数据集范围查询参数类,该类用于设置数据集范围查询的相关参数。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 查询的范围对象。 + * @param {Array.} options.datasetNames - 数据集名称列表。 + * @param {string} [options.attributeFilter] - 范围查询属性过滤条件。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {SpatialQueryMode} [options.spatialQueryMode=SpatialQueryMode.CONTAIN] - 空间查询模式常量。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var GetFeaturesByBoundsParameters = /*#__PURE__*/function (_GetFeaturesParameter) { + GetFeaturesByBoundsParameters_inherits(GetFeaturesByBoundsParameters, _GetFeaturesParameter); + + var _super = GetFeaturesByBoundsParameters_createSuper(GetFeaturesByBoundsParameters); + + function GetFeaturesByBoundsParameters(options) { + var _this; + + GetFeaturesByBoundsParameters_classCallCheck(this, GetFeaturesByBoundsParameters); + + _this = _super.call(this, options); + /** + * @member {string} GetFeaturesByBoundsParameters.prototype.getFeatureMode + * @description 数据集查询模式。范围查询有 "BOUNDS","BOUNDS_ATTRIBUTEFILTER" 两种,当用户设置 attributeFilter 时会自动切换到 BOUNDS_ATTRIBUTEFILTER 访问服务。 + */ + + _this.getFeatureMode = GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} GetFeaturesByBoundsParameters.prototype.bounds + * @description 用于查询的范围对象。 + * + */ + + _this.bounds = null; + /** + * @member {Array.} GetFeaturesByBoundsParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + + _this.fields = null; + /** + * @member {string} GetFeaturesByBoundsParameters.prototype.attributeFilter + * @description 范围查询属性过滤条件。 + */ + + _this.attributeFilter = null; + /** + * @member {SpatialQueryMode} [GetFeaturesByBoundsParameters.prototype.spatialQueryMode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式常量。 + */ + + _this.spatialQueryMode = SpatialQueryMode.CONTAIN; + Util.extend(GetFeaturesByBoundsParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.GetFeaturesByBoundsParameters'; + return _this; + } + /** + * @function GetFeaturesByBoundsParameters.prototype.destroy + * @override + */ + + + GetFeaturesByBoundsParameters_createClass(GetFeaturesByBoundsParameters, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByBoundsParameters_get(GetFeaturesByBoundsParameters_getPrototypeOf(GetFeaturesByBoundsParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.bounds) { + me.bounds.destroy(); + me.bounds = null; + } + + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + + me.fields = null; + } + + me.attributeFilter = null; + me.spatialQueryMode = null; + me.getFeatureMode = null; + } + /** + * @function GetFeaturesByBoundsParameters.toJsonParameters + * @description 将 {@link GetFeaturesByBoundsParameters} 对象参数转换为 JSON 字符串。 + * @param {GetFeaturesByBoundsParameters} params - 范围查询参数。 + * @returns {string} 转化后的 JSON 字符串。 + * + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var filterParameter, bounds, parasByBounds; + bounds = { + leftBottom: { + x: params.bounds.left, + y: params.bounds.bottom + }, + rightTop: { + x: params.bounds.right, + y: params.bounds.top + } + }; + parasByBounds = { + datasetNames: params.datasetNames, + getFeatureMode: GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS, + bounds: bounds, + spatialQueryMode: params.spatialQueryMode + }; + + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByBounds.queryParameter = filterParameter; + } + + if (params.attributeFilter) { + parasByBounds.attributeFilter = params.attributeFilter; + parasByBounds.getFeatureMode = GetFeaturesByBoundsParameters.getFeatureMode.BOUNDS_ATTRIBUTEFILTER; + } + + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + parasByBounds.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByBounds.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + parasByBounds.targetEpsgCode = params.targetEpsgCode; + } + + if (!params.targetEpsgCode && params.targetPrj) { + parasByBounds.targetPrj = params.targetPrj; + } + + if (params.aggregations) { + parasByBounds.aggregations = params.aggregations; + } + + return Util.toJSON(parasByBounds); + } + }]); + + return GetFeaturesByBoundsParameters; +}(GetFeaturesParametersBase); +GetFeaturesByBoundsParameters.getFeatureMode = { + BOUNDS: 'BOUNDS', + BOUNDS_ATTRIBUTEFILTER: 'BOUNDS_ATTRIBUTEFILTER' +}; +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesServiceBase.js +function GetFeaturesServiceBase_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesServiceBase_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesServiceBase_typeof(obj); } + +function GetFeaturesServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesServiceBase_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesServiceBase_get = Reflect.get; } else { GetFeaturesServiceBase_get = function _get(target, property, receiver) { var base = GetFeaturesServiceBase_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesServiceBase_get.apply(this, arguments); } + +function GetFeaturesServiceBase_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesServiceBase_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesServiceBase_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesServiceBase_setPrototypeOf(subClass, superClass); } + +function GetFeaturesServiceBase_setPrototypeOf(o, p) { GetFeaturesServiceBase_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesServiceBase_setPrototypeOf(o, p); } + +function GetFeaturesServiceBase_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesServiceBase_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesServiceBase_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesServiceBase_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesServiceBase_possibleConstructorReturn(this, result); }; } + +function GetFeaturesServiceBase_possibleConstructorReturn(self, call) { if (call && (GetFeaturesServiceBase_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesServiceBase_assertThisInitialized(self); } + +function GetFeaturesServiceBase_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesServiceBase_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesServiceBase_getPrototypeOf(o) { GetFeaturesServiceBase_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesServiceBase_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GetFeaturesServiceBase + * @deprecatedclass SuperMap.GetFeaturesServiceBase + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集查询服务基类。获取结果数据类型为 Object。包含 result 属性,result 的数据格式根据 format 参数决定为 GeoJSON 或者 iServerJSON。 + * @extends CommonServiceBase + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/ + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new GetFeaturesServiceBase(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * @usage + */ + +var GetFeaturesServiceBase = /*#__PURE__*/function (_CommonServiceBase) { + GetFeaturesServiceBase_inherits(GetFeaturesServiceBase, _CommonServiceBase); + + var _super = GetFeaturesServiceBase_createSuper(GetFeaturesServiceBase); + + function GetFeaturesServiceBase(url, options) { + var _this; + + GetFeaturesServiceBase_classCallCheck(this, GetFeaturesServiceBase); + + _this = _super.call(this, url, options); + options = options || {}; + /** + * @member {boolean} [GetFeaturesServiceBase.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 如果为 false,则返回的是查询结果资源的 URI。 + */ + + _this.returnContent = true; + /** + * @member {number} [GetFeaturesServiceBase.prototype.fromIndex=0] + * @description 查询结果的最小索引号。如果该值大于查询结果的最大索引号,则查询结果为空。 + */ + + _this.fromIndex = 0; + /** + * @member {number} [GetFeaturesServiceBase.prototype.toIndex=19] + * @description 查询结果的最大索引号。 + * 如果该值大于查询结果的最大索引号,则以查询结果的最大索引号为终止索引号。 + */ + + _this.toIndex = 19; + /** + * @member {number} [GetFeaturesServiceBase.prototype.hasGeometry=true] + * @description 返回结果是否包含Geometry + */ + + _this.hasGeometry = true; + /** + * @member {number} [GetFeaturesServiceBase.prototype.maxFeatures=1000] + * @description 进行 SQL 查询时,用于设置服务端返回查询结果条目数量。 + */ + + _this.maxFeatures = null; + /** + * @member {string} [GetFeaturesServiceBase.prototype.format=DataFormat.GEOJSON] + * @description 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。 + * 参数格式为 "ISERVER","GEOJSON"。 + */ + + _this.format = DataFormat.GEOJSON; + Util.extend(GetFeaturesServiceBase_assertThisInitialized(_this), options); + _this.url = Util.urlPathAppend(_this.url, 'featureResults'); + _this.CLASS_NAME = "SuperMap.GetFeaturesServiceBase"; + return _this; + } + /** + * @function GetFeaturesServiceBase.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GetFeaturesServiceBase_createClass(GetFeaturesServiceBase, [{ + key: "destroy", + value: function destroy() { + GetFeaturesServiceBase_get(GetFeaturesServiceBase_getPrototypeOf(GetFeaturesServiceBase.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + me.fromIndex = null; + me.toIndex = null; + me.maxFeatures = null; + me.format = null; + me.hasGeometry = null; + } + /** + * @function GetFeaturesServiceBase.prototype.processAsync + * @description 将客户端的查询参数传递到服务端。 + * @param {Object} params - 查询参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!params) { + return; + } + + var me = this, + jsonParameters = null, + firstPara = true; + me.returnContent = params.returnContent; + me.fromIndex = params.fromIndex; + me.toIndex = params.toIndex; + me.maxFeatures = params.maxFeatures; + me.hasGeometry = params.hasGeometry; + + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=' + me.returnContent); + firstPara = false; + } + + var isValidNumber = me.fromIndex != null && me.toIndex != null && !isNaN(me.fromIndex) && !isNaN(me.toIndex); + + if (isValidNumber && me.fromIndex >= 0 && me.toIndex >= 0 && !firstPara) { + me.url = Util.urlAppend(me.url, "fromIndex=".concat(me.fromIndex, "&toIndex=").concat(me.toIndex)); + } + + if (params.returnCountOnly) { + me.url = Util.urlAppend(me.url, "&returnCountOnly=" + params.returnContent); + } + + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function GetFeaturesServiceBase.prototype.getFeatureComplete + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + + if (me.format === DataFormat.GEOJSON && result.features) { + var geoJSONFormat = new GeoJSON(); + result.features = geoJSONFormat.toGeoJSON(result.features); + } + + me.events.triggerEvent("processCompleted", { + result: result + }); + } + }]); + + return GetFeaturesServiceBase; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBoundsService.js +function GetFeaturesByBoundsService_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByBoundsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByBoundsService_typeof(obj); } + +function GetFeaturesByBoundsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByBoundsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByBoundsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByBoundsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByBoundsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByBoundsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByBoundsService_get = Reflect.get; } else { GetFeaturesByBoundsService_get = function _get(target, property, receiver) { var base = GetFeaturesByBoundsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByBoundsService_get.apply(this, arguments); } + +function GetFeaturesByBoundsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByBoundsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByBoundsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByBoundsService_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByBoundsService_setPrototypeOf(o, p) { GetFeaturesByBoundsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByBoundsService_setPrototypeOf(o, p); } + +function GetFeaturesByBoundsService_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByBoundsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByBoundsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByBoundsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByBoundsService_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByBoundsService_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByBoundsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByBoundsService_assertThisInitialized(self); } + +function GetFeaturesByBoundsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByBoundsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByBoundsService_getPrototypeOf(o) { GetFeaturesByBoundsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByBoundsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesByBoundsService + * @deprecatedclass SuperMap.GetFeaturesByBoundsService + * @category iServer Data FeatureResults + * @classdesc 数据集范围查询服务类,查询与指定范围对象符合一定空间关系的矢量要素。 + * @description 数据集范围查询服务类构造函数。 + * @extends {GetFeaturesServiceBase} + * @param {string} url - 服务地址。请求数据服务中数据集查询服务,URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myGetFeaturesByBoundsService = new SuperMa.GetFeaturesByBoundsService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ + +var GetFeaturesByBoundsService = /*#__PURE__*/function (_GetFeaturesServiceBa) { + GetFeaturesByBoundsService_inherits(GetFeaturesByBoundsService, _GetFeaturesServiceBa); + + var _super = GetFeaturesByBoundsService_createSuper(GetFeaturesByBoundsService); + + function GetFeaturesByBoundsService(url, options) { + var _this; + + GetFeaturesByBoundsService_classCallCheck(this, GetFeaturesByBoundsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GetFeaturesByBoundsService"; + return _this; + } + /** + * @function GetFeaturesByBoundsService.prototype.destroy + * @override + */ + + + GetFeaturesByBoundsService_createClass(GetFeaturesByBoundsService, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByBoundsService_get(GetFeaturesByBoundsService_getPrototypeOf(GetFeaturesByBoundsService.prototype), "destroy", this).call(this); + } + /** + * @function GetFeaturesByBoundsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry,Bounds等)。 + * @param params {GetFeaturesByBoundsParameters} + * @returns {string} 转化后的 JSON 字符串。 + * + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + return GetFeaturesByBoundsParameters.toJsonParameters(params); + } + }]); + + return GetFeaturesByBoundsService; +}(GetFeaturesServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBufferParameters.js +function GetFeaturesByBufferParameters_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByBufferParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByBufferParameters_typeof(obj); } + +function GetFeaturesByBufferParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByBufferParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByBufferParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByBufferParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByBufferParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByBufferParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByBufferParameters_get = Reflect.get; } else { GetFeaturesByBufferParameters_get = function _get(target, property, receiver) { var base = GetFeaturesByBufferParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByBufferParameters_get.apply(this, arguments); } + +function GetFeaturesByBufferParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByBufferParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByBufferParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByBufferParameters_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByBufferParameters_setPrototypeOf(o, p) { GetFeaturesByBufferParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByBufferParameters_setPrototypeOf(o, p); } + +function GetFeaturesByBufferParameters_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByBufferParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByBufferParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByBufferParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByBufferParameters_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByBufferParameters_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByBufferParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByBufferParameters_assertThisInitialized(self); } + +function GetFeaturesByBufferParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByBufferParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByBufferParameters_getPrototypeOf(o) { GetFeaturesByBufferParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByBufferParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GetFeaturesByBufferParameters + * @deprecatedclass SuperMap.GetFeaturesByBufferParameters + * @category iServer Data FeatureResults + * @classdesc 数据集缓冲区查询参数类。 + * @param {Object} options - 参数。 + * @param {number} options.bufferDistance - buffer 距离,单位与所查询图层对应的数据集单位相同。 + * @param {GeoJSONObject} options.geometry - 空间查询条件。 + * @param {Array.} options.dataSetNames - 数据集集合中的数据集名称列表。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {string} [options.attributeFilter] - 属性查询条件。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var GetFeaturesByBufferParameters = /*#__PURE__*/function (_GetFeaturesParameter) { + GetFeaturesByBufferParameters_inherits(GetFeaturesByBufferParameters, _GetFeaturesParameter); + + var _super = GetFeaturesByBufferParameters_createSuper(GetFeaturesByBufferParameters); + + function GetFeaturesByBufferParameters(options) { + var _this; + + GetFeaturesByBufferParameters_classCallCheck(this, GetFeaturesByBufferParameters); + + _this = _super.call(this, options); + /** + * @member {number} GetFeaturesByBufferParameters.prototype.bufferDistance + * @description buffer 距离,单位与所查询图层对应的数据集单位相同。 + */ + + _this.bufferDistance = null; + /** + * @member {string} GetFeaturesByBufferParameters.prototype.attributeFilter + * @description 属性查询条件。 + */ + + _this.attributeFilter = null; + /** + * @member {GeoJSONObject} GetFeaturesByBufferParameters.prototype.geometry + * @description 空间查询条件。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + + _this.geometry = null; + /** + * @member {Array.} GetFeaturesByBufferParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + + _this.fields = null; + Util.extend(GetFeaturesByBufferParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.GetFeaturesByBufferParameters'; + return _this; + } + /** + * @function GetFeaturesByBufferParameters.prototype.destroy + * @override + */ + + + GetFeaturesByBufferParameters_createClass(GetFeaturesByBufferParameters, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByBufferParameters_get(GetFeaturesByBufferParameters_getPrototypeOf(GetFeaturesByBufferParameters.prototype), "destroy", this).call(this); + + var me = this; + me.bufferDistance = null; + me.attributeFilter = null; + + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + + me.fields = null; + } + + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + /** + * @function GetFeaturesByBufferParameters.toJsonParameters + * @description 将 GetFeaturesByBufferParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var filterParameter, paramsByBuffer, geometry; + geometry = ServerGeometry.fromGeometry(params.geometry); + paramsByBuffer = { + datasetNames: params.datasetNames, + getFeatureMode: 'BUFFER', + bufferDistance: params.bufferDistance, + geometry: geometry + }; + + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + paramsByBuffer.queryParameter = filterParameter; + } + + if (params.attributeFilter) { + paramsByBuffer.attributeFilter = params.attributeFilter; + paramsByBuffer.getFeatureMode = 'BUFFER_ATTRIBUTEFILTER'; + } + + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + paramsByBuffer.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + paramsByBuffer.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + paramsByBuffer.targetEpsgCode = params.targetEpsgCode; + } + + if (!params.targetEpsgCode && params.targetPrj) { + paramsByBuffer.targetPrj = params.targetPrj; + } + + return Util.toJSON(paramsByBuffer); + } + }]); + + return GetFeaturesByBufferParameters; +}(GetFeaturesParametersBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByBufferService.js +function GetFeaturesByBufferService_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByBufferService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByBufferService_typeof(obj); } + +function GetFeaturesByBufferService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByBufferService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByBufferService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByBufferService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByBufferService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByBufferService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByBufferService_get = Reflect.get; } else { GetFeaturesByBufferService_get = function _get(target, property, receiver) { var base = GetFeaturesByBufferService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByBufferService_get.apply(this, arguments); } + +function GetFeaturesByBufferService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByBufferService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByBufferService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByBufferService_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByBufferService_setPrototypeOf(o, p) { GetFeaturesByBufferService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByBufferService_setPrototypeOf(o, p); } + +function GetFeaturesByBufferService_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByBufferService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByBufferService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByBufferService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByBufferService_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByBufferService_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByBufferService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByBufferService_assertThisInitialized(self); } + +function GetFeaturesByBufferService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByBufferService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByBufferService_getPrototypeOf(o) { GetFeaturesByBufferService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByBufferService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesByBufferService + * @deprecatedclass SuperMap.GetFeaturesByBufferService + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集缓冲区查询服务类。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesByBufferService = new GetFeaturesByBufferService(url, { + * eventListeners: { + * "processCompleted": GetFeaturesCompleted, + * "processFailed": GetFeaturesError + * } + * }); + * function GetFeaturesCompleted(object){//todo}; + * function GetFeaturesError(object){//todo}; + * @usage + */ + +var GetFeaturesByBufferService = /*#__PURE__*/function (_GetFeaturesServiceBa) { + GetFeaturesByBufferService_inherits(GetFeaturesByBufferService, _GetFeaturesServiceBa); + + var _super = GetFeaturesByBufferService_createSuper(GetFeaturesByBufferService); + + function GetFeaturesByBufferService(url, options) { + var _this; + + GetFeaturesByBufferService_classCallCheck(this, GetFeaturesByBufferService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GetFeaturesByBufferService"; + return _this; + } + /** + * @function GetFeaturesByBufferService.prototype.destroy + * @override + */ + + + GetFeaturesByBufferService_createClass(GetFeaturesByBufferService, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByBufferService_get(GetFeaturesByBufferService_getPrototypeOf(GetFeaturesByBufferService.prototype), "destroy", this).call(this); + } + /** + * @function GetFeaturesByBufferService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。在本类中重写此方法,可以实现不同种类的查询(IDs, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + if (!(params instanceof GetFeaturesByBufferParameters)) { + return; + } + + return GetFeaturesByBufferParameters.toJsonParameters(params); + } + }]); + + return GetFeaturesByBufferService; +}(GetFeaturesServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByGeometryParameters.js +function GetFeaturesByGeometryParameters_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByGeometryParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByGeometryParameters_typeof(obj); } + +function GetFeaturesByGeometryParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByGeometryParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByGeometryParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByGeometryParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByGeometryParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByGeometryParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByGeometryParameters_get = Reflect.get; } else { GetFeaturesByGeometryParameters_get = function _get(target, property, receiver) { var base = GetFeaturesByGeometryParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByGeometryParameters_get.apply(this, arguments); } + +function GetFeaturesByGeometryParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByGeometryParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByGeometryParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByGeometryParameters_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByGeometryParameters_setPrototypeOf(o, p) { GetFeaturesByGeometryParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByGeometryParameters_setPrototypeOf(o, p); } + +function GetFeaturesByGeometryParameters_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByGeometryParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByGeometryParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByGeometryParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByGeometryParameters_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByGeometryParameters_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByGeometryParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByGeometryParameters_assertThisInitialized(self); } + +function GetFeaturesByGeometryParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByGeometryParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByGeometryParameters_getPrototypeOf(o) { GetFeaturesByGeometryParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByGeometryParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class GetFeaturesByGeometryParameters + * @deprecatedclass SuperMap.GetFeaturesByGeometryParameters + * @category iServer Data FeatureResults + * @classdesc 数据集几何查询参数类。该类用于设置数据集几何查询的相关参数。 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.geometry - 查询的几何对象。 + * @param {Array.} options.datasetNames - 数据集集合中的数据集名称列表。 + * @param {string} [options.attributeFilter] - 几何查询属性过滤条件。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {SpatialQueryMode} [options.spatialQueryMode=SpatialQueryMode.CONTAIN] - 空间查询模式常量。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var GetFeaturesByGeometryParameters = /*#__PURE__*/function (_GetFeaturesParameter) { + GetFeaturesByGeometryParameters_inherits(GetFeaturesByGeometryParameters, _GetFeaturesParameter); + + var _super = GetFeaturesByGeometryParameters_createSuper(GetFeaturesByGeometryParameters); + + function GetFeaturesByGeometryParameters(options) { + var _this; + + GetFeaturesByGeometryParameters_classCallCheck(this, GetFeaturesByGeometryParameters); + + _this = _super.call(this, options); + /** + * @member {string} GetFeaturesByGeometryParameters.prototype.getFeatureMode + * @description 数据集查询模式。几何查询有 "SPATIAL","SPATIAL_ATTRIBUTEFILTER" 两种,当用户设置 attributeFilter 时会自动切换到 SPATIAL_ATTRIBUTEFILTER 访问服务。 + */ + + _this.getFeatureMode = 'SPATIAL'; + /** + * @member {GeoJSONObject} GetFeaturesByGeometryParameters.prototype.geometry + * @description 用于查询的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + + _this.geometry = null; + /** + * @member {Array.} GetFeaturesByGeometryParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + + _this.fields = null; + /** + * @member {string} GetFeaturesByGeometryParameters.prototype.attributeFilter + * @description 几何查询属性过滤条件。 + */ + + _this.attributeFilter = null; + /** + * @member {SpatialQueryMode} [GetFeaturesByGeometryParameters.prototype.spatialQueryMode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式常量。 + */ + + _this.spatialQueryMode = SpatialQueryMode.CONTAIN; + Util.extend(GetFeaturesByGeometryParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.GetFeaturesByGeometryParameters'; + return _this; + } + /** + * @function GetFeaturesByGeometryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + GetFeaturesByGeometryParameters_createClass(GetFeaturesByGeometryParameters, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByGeometryParameters_get(GetFeaturesByGeometryParameters_getPrototypeOf(GetFeaturesByGeometryParameters.prototype), "destroy", this).call(this); + + var me = this; + + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + + me.fields = null; + } + + me.attributeFilter = null; + me.spatialQueryMode = null; + me.getFeatureMode = null; + } + /** + * @function GetFeaturesByGeometryParameters.toJsonParameters + * @description 将 GetFeaturesByGeometryParameters 对象参数转换为 JSON 字符串。 + * @param {GetFeaturesByGeometryParameters} params - 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var filterParameter, geometry, parasByGeometry; + geometry = ServerGeometry.fromGeometry(params.geometry); + parasByGeometry = { + datasetNames: params.datasetNames, + getFeatureMode: 'SPATIAL', + geometry: geometry, + spatialQueryMode: params.spatialQueryMode + }; + + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByGeometry.queryParameter = filterParameter; + } + + if (params.attributeFilter) { + parasByGeometry.attributeFilter = params.attributeFilter; + parasByGeometry.getFeatureMode = 'SPATIAL_ATTRIBUTEFILTER'; + } + + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + parasByGeometry.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByGeometry.hasGeometry = params.hasGeometry; + } + + if (params.targetEpsgCode) { + parasByGeometry.targetEpsgCode = params.targetEpsgCode; + } + + if (!params.targetEpsgCode && params.targetPrj) { + parasByGeometry.targetPrj = params.targetPrj; + } + + if (params.aggregations) { + parasByGeometry.aggregations = params.aggregations; + } + + return Util.toJSON(parasByGeometry); + } + }]); + + return GetFeaturesByGeometryParameters; +}(GetFeaturesParametersBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByGeometryService.js +function GetFeaturesByGeometryService_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByGeometryService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByGeometryService_typeof(obj); } + +function GetFeaturesByGeometryService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByGeometryService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByGeometryService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByGeometryService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByGeometryService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByGeometryService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByGeometryService_get = Reflect.get; } else { GetFeaturesByGeometryService_get = function _get(target, property, receiver) { var base = GetFeaturesByGeometryService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByGeometryService_get.apply(this, arguments); } + +function GetFeaturesByGeometryService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByGeometryService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByGeometryService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByGeometryService_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByGeometryService_setPrototypeOf(o, p) { GetFeaturesByGeometryService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByGeometryService_setPrototypeOf(o, p); } + +function GetFeaturesByGeometryService_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByGeometryService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByGeometryService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByGeometryService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByGeometryService_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByGeometryService_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByGeometryService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByGeometryService_assertThisInitialized(self); } + +function GetFeaturesByGeometryService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByGeometryService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByGeometryService_getPrototypeOf(o) { GetFeaturesByGeometryService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByGeometryService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesByGeometryService + * @deprecatedclass SuperMap.GetFeaturesByGeometryService + * @category iServer Data FeatureResults + * @classdesc 数据集几何查询服务类,查询与指定几何对象符合一定空间关系的矢量要素。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务。 + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data; + * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myService = new GetFeaturesByGeometryService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ + +var GetFeaturesByGeometryService = /*#__PURE__*/function (_GetFeaturesServiceBa) { + GetFeaturesByGeometryService_inherits(GetFeaturesByGeometryService, _GetFeaturesServiceBa); + + var _super = GetFeaturesByGeometryService_createSuper(GetFeaturesByGeometryService); + + function GetFeaturesByGeometryService(url, options) { + var _this; + + GetFeaturesByGeometryService_classCallCheck(this, GetFeaturesByGeometryService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GetFeaturesByGeometryService"; + return _this; + } + /** + * @function GetFeaturesByGeometryService.prototype.destroy + * @override + */ + + + GetFeaturesByGeometryService_createClass(GetFeaturesByGeometryService, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByGeometryService_get(GetFeaturesByGeometryService_getPrototypeOf(GetFeaturesByGeometryService.prototype), "destroy", this).call(this); + } + /** + * @function GetFeaturesByGeometryService.prototype.getJsonParameters + * @param {GetFeaturesByGeometryParameters} params - 数据集几何查询参数类。 + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + return GetFeaturesByGeometryParameters.toJsonParameters(params); + } + }]); + + return GetFeaturesByGeometryService; +}(GetFeaturesServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByIDsParameters.js +function GetFeaturesByIDsParameters_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByIDsParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByIDsParameters_typeof(obj); } + +function GetFeaturesByIDsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByIDsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByIDsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByIDsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByIDsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByIDsParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByIDsParameters_get = Reflect.get; } else { GetFeaturesByIDsParameters_get = function _get(target, property, receiver) { var base = GetFeaturesByIDsParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByIDsParameters_get.apply(this, arguments); } + +function GetFeaturesByIDsParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByIDsParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByIDsParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByIDsParameters_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByIDsParameters_setPrototypeOf(o, p) { GetFeaturesByIDsParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByIDsParameters_setPrototypeOf(o, p); } + +function GetFeaturesByIDsParameters_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByIDsParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByIDsParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByIDsParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByIDsParameters_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByIDsParameters_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByIDsParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByIDsParameters_assertThisInitialized(self); } + +function GetFeaturesByIDsParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByIDsParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByIDsParameters_getPrototypeOf(o) { GetFeaturesByIDsParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByIDsParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetFeaturesByIDsParameters + * @deprecatedclass SuperMap.GetFeaturesByIDsParameters + * @category iServer Data FeatureResults + * @classdesc ID 查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.IDs - 指定查询的元素 ID 信息。 + * @param {Array.} [options.fields] - 设置查询结果返回字段。默认返回所有字段。 + * @param {Array.} options.dataSetNames - 数据集集合中的数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var GetFeaturesByIDsParameters = /*#__PURE__*/function (_GetFeaturesParameter) { + GetFeaturesByIDsParameters_inherits(GetFeaturesByIDsParameters, _GetFeaturesParameter); + + var _super = GetFeaturesByIDsParameters_createSuper(GetFeaturesByIDsParameters); + + function GetFeaturesByIDsParameters(options) { + var _this; + + GetFeaturesByIDsParameters_classCallCheck(this, GetFeaturesByIDsParameters); + + _this = _super.call(this, options); + /** + * @member {string} GetFeaturesByIDsParameters.prototype.getFeatureMode + * @description 数据集查询模式。 + */ + + _this.getFeatureMode = 'ID'; + /** + * @member {Array.} GetFeaturesByIDsParameters.prototype.IDs + * @description 所要查询指定的元素 ID 信息。 + */ + + _this.IDs = null; + /** + * @member {Array.} GetFeaturesByIDsParameters.prototype.fields + * @description 设置查询结果返回字段。当指定了返回结果字段后,则 GetFeaturesResult 中的 features 的属性字段只包含所指定的字段。不设置即返回全部字段。 + */ + + _this.fields = null; + Util.extend(GetFeaturesByIDsParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.GetFeaturesByIDsParameters'; + return _this; + } + /** + * @function GetFeaturesByIDsParameters.prototype.destroy + * @override + */ + + + GetFeaturesByIDsParameters_createClass(GetFeaturesByIDsParameters, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByIDsParameters_get(GetFeaturesByIDsParameters_getPrototypeOf(GetFeaturesByIDsParameters.prototype), "destroy", this).call(this); + + var me = this; + me.IDs = null; + me.getFeatureMode = null; + + if (me.fields) { + while (me.fields.length > 0) { + me.fields.pop(); + } + + me.fields = null; + } + } + /** + * @function GetFeaturesByIDsParameters.toJsonParameters + * @description 将 GetFeaturesByIDsParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesByIDsParameters} params - ID 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var parasByIDs, filterParameter; + parasByIDs = { + datasetNames: params.datasetNames, + getFeatureMode: 'ID', + ids: params.IDs + }; + + if (params.fields) { + filterParameter = new FilterParameter(); + filterParameter.name = params.datasetNames; + filterParameter.fields = params.fields; + parasByIDs.queryParameter = filterParameter; + } + + if (params.targetEpsgCode) { + parasByIDs.targetEpsgCode = params.targetEpsgCode; + } + + if (typeof params.hasGeometry === 'boolean') { + parasByIDs.hasGeometry = params.hasGeometry; + } + + if (!params.targetEpsgCode && params.targetPrj) { + parasByIDs.targetPrj = params.targetPrj; + } + + if (params.aggregations) { + parasByIDs.aggregations = params.aggregations; + } + + return Util.toJSON(parasByIDs); + } + }]); + + return GetFeaturesByIDsParameters; +}(GetFeaturesParametersBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesByIDsService.js +function GetFeaturesByIDsService_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesByIDsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesByIDsService_typeof(obj); } + +function GetFeaturesByIDsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesByIDsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesByIDsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesByIDsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesByIDsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesByIDsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesByIDsService_get = Reflect.get; } else { GetFeaturesByIDsService_get = function _get(target, property, receiver) { var base = GetFeaturesByIDsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesByIDsService_get.apply(this, arguments); } + +function GetFeaturesByIDsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesByIDsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesByIDsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesByIDsService_setPrototypeOf(subClass, superClass); } + +function GetFeaturesByIDsService_setPrototypeOf(o, p) { GetFeaturesByIDsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesByIDsService_setPrototypeOf(o, p); } + +function GetFeaturesByIDsService_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesByIDsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesByIDsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesByIDsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesByIDsService_possibleConstructorReturn(this, result); }; } + +function GetFeaturesByIDsService_possibleConstructorReturn(self, call) { if (call && (GetFeaturesByIDsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesByIDsService_assertThisInitialized(self); } + +function GetFeaturesByIDsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesByIDsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesByIDsService_getPrototypeOf(o) { GetFeaturesByIDsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesByIDsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesByIDsService + * @deprecatedclass SuperMap.GetFeaturesByIDsService + * @category iServer Data FeatureResults + * @classdesc 数据集ID查询服务类。在数据集集合中查找指定 ID 号对应的空间地物要素。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务。 + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/;
+ * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesByIDsService = new GetFeaturesByIDsService(url, { + * eventListeners: { + * "processCompleted": getFeatureCompleted, + * "processFailed": getFeatureError + * } + * }); + * function getFeatureCompleted(object){//todo}; + * function getFeatureError(object){//todo} + * @usage + */ + +var GetFeaturesByIDsService = /*#__PURE__*/function (_GetFeaturesServiceBa) { + GetFeaturesByIDsService_inherits(GetFeaturesByIDsService, _GetFeaturesServiceBa); + + var _super = GetFeaturesByIDsService_createSuper(GetFeaturesByIDsService); + + function GetFeaturesByIDsService(url, options) { + var _this; + + GetFeaturesByIDsService_classCallCheck(this, GetFeaturesByIDsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GetFeaturesByIDsService"; + return _this; + } + /** + * @function GetFeaturesByIDsService.prototype.destroy + * @override + */ + + + GetFeaturesByIDsService_createClass(GetFeaturesByIDsService, [{ + key: "destroy", + value: function destroy() { + GetFeaturesByIDsService_get(GetFeaturesByIDsService_getPrototypeOf(GetFeaturesByIDsService.prototype), "destroy", this).call(this); + } + /** + * @function GetFeaturesByIDsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesByIDsParameters} params - ID查询参数类。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + return GetFeaturesByIDsParameters.toJsonParameters(params); + } + }]); + + return GetFeaturesByIDsService; +}(GetFeaturesServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesBySQLParameters.js +function GetFeaturesBySQLParameters_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesBySQLParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesBySQLParameters_typeof(obj); } + +function GetFeaturesBySQLParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesBySQLParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesBySQLParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesBySQLParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesBySQLParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesBySQLParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesBySQLParameters_get = Reflect.get; } else { GetFeaturesBySQLParameters_get = function _get(target, property, receiver) { var base = GetFeaturesBySQLParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesBySQLParameters_get.apply(this, arguments); } + +function GetFeaturesBySQLParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesBySQLParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesBySQLParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesBySQLParameters_setPrototypeOf(subClass, superClass); } + +function GetFeaturesBySQLParameters_setPrototypeOf(o, p) { GetFeaturesBySQLParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesBySQLParameters_setPrototypeOf(o, p); } + +function GetFeaturesBySQLParameters_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesBySQLParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesBySQLParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesBySQLParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesBySQLParameters_possibleConstructorReturn(this, result); }; } + +function GetFeaturesBySQLParameters_possibleConstructorReturn(self, call) { if (call && (GetFeaturesBySQLParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesBySQLParameters_assertThisInitialized(self); } + +function GetFeaturesBySQLParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesBySQLParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesBySQLParameters_getPrototypeOf(o) { GetFeaturesBySQLParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesBySQLParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesBySQLParameters + * @deprecatedclass SuperMap.GetFeaturesBySQLParameters + * @category iServer Data FeatureResults + * @classdesc 数据集 SQL 查询参数类。 + * @param {Object} options - 参数。 + * @param {FilterParameter} options.queryParameter - 查询过滤条件参数。 + * @param {Array.} options.datasetNames - 数据集集合中的数据集名称列表。 + * @param {boolean} [options.returnContent=true] - 是否直接返回查询结果。 + * @param {number} [options.fromIndex=0] - 查询结果的最小索引号。 + * @param {number} [options.toIndex=19] - 查询结果的最大索引号。 + * @param {string|number} [options.targetEpsgCode] - 动态投影的目标坐标系对应的 EPSG Code,使用此参数时,returnContent 参数需为 true。 + * @param {Object} [options.targetPrj] - 动态投影的目标坐标系。使用此参数时,returnContent 参数需为 true。 如:prjCoordSys={"epsgCode":3857}。当同时设置 targetEpsgCode 参数时,此参数不生效。 + * @param {MetricsAggParameter|GeoHashGridAggParameter} [options.aggregations] - 聚合查询参数。该参数仅支持数据来源 Elasticsearch 服务的Supermap iServer的rest数据服务。 + * @extends {GetFeaturesParametersBase} + * @usage + */ + +var GetFeaturesBySQLParameters = /*#__PURE__*/function (_GetFeaturesParameter) { + GetFeaturesBySQLParameters_inherits(GetFeaturesBySQLParameters, _GetFeaturesParameter); + + var _super = GetFeaturesBySQLParameters_createSuper(GetFeaturesBySQLParameters); + + function GetFeaturesBySQLParameters(options) { + var _this; + + GetFeaturesBySQLParameters_classCallCheck(this, GetFeaturesBySQLParameters); + + _this = _super.call(this, options); + /** + * @member {string} GetFeaturesBySQLParameters.prototype.getFeatureMode + * @description 数据集查询模式。 + */ + + _this.getFeatureMode = 'SQL'; + /** + * @member {FilterParameter} GetFeaturesBySQLParameters.prototype.queryParameter + * @description 查询过滤条件参数类。 + */ + + _this.queryParameter = null; + Util.extend(GetFeaturesBySQLParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.GetFeaturesBySQLParameters'; + return _this; + } + /** + * @function GetFeaturesBySQLParameters.prototype.destroy + * @override + */ + + + GetFeaturesBySQLParameters_createClass(GetFeaturesBySQLParameters, [{ + key: "destroy", + value: function destroy() { + GetFeaturesBySQLParameters_get(GetFeaturesBySQLParameters_getPrototypeOf(GetFeaturesBySQLParameters.prototype), "destroy", this).call(this); + + var me = this; + me.getFeatureMode = null; + + if (me.queryParameter) { + me.queryParameter.destroy(); + me.queryParameter = null; + } + } + /** + * @function GetFeaturesBySQLParameters.prototype.toJsonParameters + * @description 将 GetFeaturesBySQLParameters 对象转换为 JSON 字符串。 + * @param {GetFeaturesBySQLParameters} params - 数据集 SQL 查询参数对象。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJsonParameters", + value: function toJsonParameters(params) { + var paramsBySql = { + datasetNames: params.datasetNames, + getFeatureMode: 'SQL', + queryParameter: params.queryParameter + }; + + if (params.maxFeatures && !isNaN(params.maxFeatures)) { + paramsBySql.maxFeatures = params.maxFeatures; + } + + if (typeof params.hasGeometry === 'boolean') { + paramsBySql.hasGeometry = params.hasGeometry; + } + + if (params.aggregations) { + paramsBySql.aggregations = params.aggregations; + } + + if (params.targetEpsgCode) { + paramsBySql.targetEpsgCode = params.targetEpsgCode; + } + + if (!params.targetEpsgCode && params.targetPrj) { + paramsBySql.targetPrj = params.targetPrj; + } + + if (params.aggregations) { + paramsBySql.aggregations = params.aggregations; + } + + return Util.toJSON(paramsBySql); + } + }]); + + return GetFeaturesBySQLParameters; +}(GetFeaturesParametersBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFeaturesBySQLService.js +function GetFeaturesBySQLService_typeof(obj) { "@babel/helpers - typeof"; return GetFeaturesBySQLService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFeaturesBySQLService_typeof(obj); } + +function GetFeaturesBySQLService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFeaturesBySQLService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFeaturesBySQLService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFeaturesBySQLService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFeaturesBySQLService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFeaturesBySQLService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFeaturesBySQLService_get = Reflect.get; } else { GetFeaturesBySQLService_get = function _get(target, property, receiver) { var base = GetFeaturesBySQLService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFeaturesBySQLService_get.apply(this, arguments); } + +function GetFeaturesBySQLService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFeaturesBySQLService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFeaturesBySQLService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFeaturesBySQLService_setPrototypeOf(subClass, superClass); } + +function GetFeaturesBySQLService_setPrototypeOf(o, p) { GetFeaturesBySQLService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFeaturesBySQLService_setPrototypeOf(o, p); } + +function GetFeaturesBySQLService_createSuper(Derived) { var hasNativeReflectConstruct = GetFeaturesBySQLService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFeaturesBySQLService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFeaturesBySQLService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFeaturesBySQLService_possibleConstructorReturn(this, result); }; } + +function GetFeaturesBySQLService_possibleConstructorReturn(self, call) { if (call && (GetFeaturesBySQLService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFeaturesBySQLService_assertThisInitialized(self); } + +function GetFeaturesBySQLService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFeaturesBySQLService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFeaturesBySQLService_getPrototypeOf(o) { GetFeaturesBySQLService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFeaturesBySQLService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFeaturesBySQLService + * @deprecatedclass SuperMap.GetFeaturesBySQLService + * @constructs GetFeaturesBySQLService + * @category iServer Data FeatureResults + * @classdesc 数据服务中数据集 SQL 查询服务类。在一个或多个指定的图层上查询符合 SQL 条件的空间地物信息。 + * @param {string} url - 服务地址。请求数据服务中数据集查询服务, + * URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{数据服务名}/rest/data/;
+ * 例如:"http://localhost:8090/iserver/services/data-jingjin/rest/data/" + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {GetFeaturesServiceBase} + * @example + * var myGetFeaturesBySQLService = new GetFeaturesBySQLService(url, { + * eventListeners: { + * "processCompleted": GetFeaturesCompleted, + * "processFailed": GetFeaturesError + * } + * }); + * function getFeaturesCompleted(object){//todo}; + * function getFeaturesError(object){//todo}; + * @usage + */ + +var GetFeaturesBySQLService = /*#__PURE__*/function (_GetFeaturesServiceBa) { + GetFeaturesBySQLService_inherits(GetFeaturesBySQLService, _GetFeaturesServiceBa); + + var _super = GetFeaturesBySQLService_createSuper(GetFeaturesBySQLService); + + function GetFeaturesBySQLService(url, options) { + var _this; + + GetFeaturesBySQLService_classCallCheck(this, GetFeaturesBySQLService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.GetFeaturesBySQLService"; + return _this; + } + /** + * @function GetFeaturesBySQLService.prototype.destroy + * @override + */ + + + GetFeaturesBySQLService_createClass(GetFeaturesBySQLService, [{ + key: "destroy", + value: function destroy() { + GetFeaturesBySQLService_get(GetFeaturesBySQLService_getPrototypeOf(GetFeaturesBySQLService.prototype), "destroy", this).call(this); + } + /* + * @function GetFeaturesBySQLService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(ID, SQL, Buffer, Geometry等)。 + * @param {GetFeaturesBySQLParameters} params - 数据集SQL查询参数类。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + return GetFeaturesBySQLParameters.toJsonParameters(params); + } + }]); + + return GetFeaturesBySQLService; +}(GetFeaturesServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetFieldsService.js +function GetFieldsService_typeof(obj) { "@babel/helpers - typeof"; return GetFieldsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetFieldsService_typeof(obj); } + +function GetFieldsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetFieldsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetFieldsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetFieldsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetFieldsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetFieldsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetFieldsService_get = Reflect.get; } else { GetFieldsService_get = function _get(target, property, receiver) { var base = GetFieldsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetFieldsService_get.apply(this, arguments); } + +function GetFieldsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetFieldsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetFieldsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetFieldsService_setPrototypeOf(subClass, superClass); } + +function GetFieldsService_setPrototypeOf(o, p) { GetFieldsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetFieldsService_setPrototypeOf(o, p); } + +function GetFieldsService_createSuper(Derived) { var hasNativeReflectConstruct = GetFieldsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetFieldsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetFieldsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetFieldsService_possibleConstructorReturn(this, result); }; } + +function GetFieldsService_possibleConstructorReturn(self, call) { if (call && (GetFieldsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetFieldsService_assertThisInitialized(self); } + +function GetFieldsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetFieldsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetFieldsService_getPrototypeOf(o) { GetFieldsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetFieldsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GetFieldsService + * @deprecatedclass SuperMap.GetFieldsService + * @category iServer Data Field + * @classdesc 字段查询服务,支持查询指定数据集的中所有属性字段(field)的集合。 + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为:http://localhost:8090/iserver/services/data-world/rest/data 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {string}options.datasource - 数据源名称。 + * @param {string}options.dataset - 数据集名称。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example + * var myService = new GetFieldsService(url, {eventListeners: { + * "processCompleted": getFieldsCompleted, + * "processFailed": getFieldsError + * }, + * datasource: "World", + * dataset: "Countries" + * }; + * @usage + */ + +var GetFieldsService = /*#__PURE__*/function (_CommonServiceBase) { + GetFieldsService_inherits(GetFieldsService, _CommonServiceBase); + + var _super = GetFieldsService_createSuper(GetFieldsService); + + function GetFieldsService(url, options) { + var _this; + + GetFieldsService_classCallCheck(this, GetFieldsService); + + _this = _super.call(this, url, options); + /** + * @member {string} GetFieldsService.prototype.datasource + * @description 要查询的数据集所在的数据源名称。 + */ + + _this.datasource = null; + /** + * @member {string} GetFieldsService.prototype.dataset + * @description 要查询的数据集名称。 + */ + + _this.dataset = null; + + if (options) { + Util.extend(GetFieldsService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GetFieldsService"; + return _this; + } + /** + * @function GetFieldsService.prototype.destroy + * @override + */ + + + GetFieldsService_createClass(GetFieldsService, [{ + key: "destroy", + value: function destroy() { + GetFieldsService_get(GetFieldsService_getPrototypeOf(GetFieldsService.prototype), "destroy", this).call(this); + + var me = this; + me.datasource = null; + me.dataset = null; + } + /** + * @function GetFieldsService.prototype.processAsync + * @description 执行服务,查询指定数据集的字段信息。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources/".concat(me.datasource, "/datasets/").concat(me.dataset, "/fields")); + me.request({ + method: "GET", + data: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return GetFieldsService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/GetGridCellInfosParameters.js +function GetGridCellInfosParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetGridCellInfosParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetGridCellInfosParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetGridCellInfosParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetGridCellInfosParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GetGridCellInfosParameters + * @deprecatedclass SuperMap.GetGridCellInfosParameters + * @category iServer Data Grid + * @classdesc 数据服务栅格查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名称。 + * @param {string} options.dataSourceName - 数据源名称。 + * @param {number} options.X - 地理位置 X 轴。 + * @param {number} options.Y - 地理位置 Y 轴。 + * @usage + */ + +var GetGridCellInfosParameters = /*#__PURE__*/function () { + function GetGridCellInfosParameters(options) { + GetGridCellInfosParameters_classCallCheck(this, GetGridCellInfosParameters); + + /** + * @member {string} GetGridCellInfosParameters.prototype.datasetName + * @description 数据集名称。 + */ + this.datasetName = null; + /** + * @member {string} GetGridCellInfosParameters.prototype.dataSourceName + * @description 数据源名称。 + */ + + this.dataSourceName = null; + /** + * @member {number} GetGridCellInfosParameters.prototype.X + * @description 要查询的地理位置 X 轴。 + */ + + this.X = null; + /** + * @member {number} GetGridCellInfosParameters.prototype.Y + * @description 要查询的地理位置 Y 轴。 + */ + + this.Y = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.GetGridCellInfosParameters"; + } + /** + * @function GetGridCellInfosParameters.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + + + GetGridCellInfosParameters_createClass(GetGridCellInfosParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasetName = null; + me.dataSourceName = null; + me.X = null; + me.Y = null; + } + }]); + + return GetGridCellInfosParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/GetGridCellInfosService.js +function GetGridCellInfosService_typeof(obj) { "@babel/helpers - typeof"; return GetGridCellInfosService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetGridCellInfosService_typeof(obj); } + +function GetGridCellInfosService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetGridCellInfosService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetGridCellInfosService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetGridCellInfosService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetGridCellInfosService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetGridCellInfosService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetGridCellInfosService_get = Reflect.get; } else { GetGridCellInfosService_get = function _get(target, property, receiver) { var base = GetGridCellInfosService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetGridCellInfosService_get.apply(this, arguments); } + +function GetGridCellInfosService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetGridCellInfosService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetGridCellInfosService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetGridCellInfosService_setPrototypeOf(subClass, superClass); } + +function GetGridCellInfosService_setPrototypeOf(o, p) { GetGridCellInfosService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetGridCellInfosService_setPrototypeOf(o, p); } + +function GetGridCellInfosService_createSuper(Derived) { var hasNativeReflectConstruct = GetGridCellInfosService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetGridCellInfosService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetGridCellInfosService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetGridCellInfosService_possibleConstructorReturn(this, result); }; } + +function GetGridCellInfosService_possibleConstructorReturn(self, call) { if (call && (GetGridCellInfosService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetGridCellInfosService_assertThisInitialized(self); } + +function GetGridCellInfosService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetGridCellInfosService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetGridCellInfosService_getPrototypeOf(o) { GetGridCellInfosService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetGridCellInfosService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class GetGridCellInfosService + * @deprecatedclass SuperMap.GetGridCellInfosService + * @category iServer Data Grid + * @classdesc 数据栅格查询服务,支持查询指定地理位置的栅格信息。 + * @param {string} url - 服务地址。例如: http://localhost:8090/iserver/services/data-jingjin/rest/data + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。
+ * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example + * var myService = new GetGridCellInfosService(url, {eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * @usage + */ + +var GetGridCellInfosService = /*#__PURE__*/function (_CommonServiceBase) { + GetGridCellInfosService_inherits(GetGridCellInfosService, _CommonServiceBase); + + var _super = GetGridCellInfosService_createSuper(GetGridCellInfosService); + + function GetGridCellInfosService(url, options) { + var _this; + + GetGridCellInfosService_classCallCheck(this, GetGridCellInfosService); + + _this = _super.call(this, url, options); + /** + * @member {string} GetGridCellInfosService.prototype.datasetName + * @description 数据集名称。 + */ + + _this.datasetName = null; + /** + * @member {string} GetGridCellInfosService.prototype.dataSourceName + * @description 数据源名称。 + */ + + _this.dataSourceName = null; + /** + * @member {string} GetGridCellInfosService.prototype.datasetType + * @description 数据集类型。 + */ + + _this.datasetType = null; + /** + * @member {number} GetGridCellInfosService.prototype.X + * @description 要查询的地理位置X轴 + */ + + _this.X = null; + /** + * @member {number} GetGridCellInfosService.prototype.Y + * @description 要查询的地理位置Y轴 + */ + + _this.Y = null; + + if (options) { + Util.extend(GetGridCellInfosService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GetGridCellInfosService"; + return _this; + } + /** + * @function GetGridCellInfosService.prototype.destroy + * @override + */ + + + GetGridCellInfosService_createClass(GetGridCellInfosService, [{ + key: "destroy", + value: function destroy() { + GetGridCellInfosService_get(GetGridCellInfosService_getPrototypeOf(GetGridCellInfosService.prototype), "destroy", this).call(this); + + var me = this; + me.X = null; + me.Y = null; + me.datasetName = null; + me.dataSourceName = null; + me.datasetType = null; + } + /** + * @function GetGridCellInfosService.prototype.processAsync + * @description 执行服务,查询数据集信息。 + * @param {GetGridCellInfosParameters} params - 查询参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof GetGridCellInfosParameters)) { + return; + } + + Util.extend(this, params); + var me = this; + me.url = Util.urlPathAppend(me.url, "datasources/".concat(me.dataSourceName, "/datasets/").concat(me.datasetName)); + me.queryRequest(me.getDatasetInfoCompleted, me.getDatasetInfoFailed); + } + /** + * @function GetGridCellInfosService.prototype.queryRequest + * @description 执行服务,查询。 + * @callback {function} successFun - 成功后执行的函数。 + * @callback {function} failedFunc - 失败后执行的函数。 + */ + + }, { + key: "queryRequest", + value: function queryRequest(successFun, failedFunc) { + var me = this; + me.request({ + method: "GET", + data: null, + scope: me, + success: successFun, + failure: failedFunc + }); + } + /** + * @function GetGridCellInfosService.prototype.getDatasetInfoCompleted + * @description 数据集查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "getDatasetInfoCompleted", + value: function getDatasetInfoCompleted(result) { + var me = this; + result = Util.transformResult(result); + me.datasetType = result.datasetInfo.type; + me.queryGridInfos(); + } + /** + * @function GetGridCellInfosService.prototype.queryGridInfos + * @description 执行服务,查询数据集栅格信息信息。 + */ + + }, { + key: "queryGridInfos", + value: function queryGridInfos() { + var me = this; + me.url = Util.urlPathAppend(me.url, me.datasetType == 'GRID' ? 'gridValue' : 'imageValue'); + + if (me.X != null && me.Y != null) { + me.url = Util.urlAppend(me.url, "x=".concat(me.X, "&y=").concat(me.Y)); + } + + me.queryRequest(me.serviceProcessCompleted, me.serviceProcessFailed); + } + /** + * @function GetGridCellInfosService.prototype.getDatasetInfoFailed + * @description 数据集查询失败,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "getDatasetInfoFailed", + value: function getDatasetInfoFailed(result) { + var me = this; + me.serviceProcessFailed(result); + } + }]); + + return GetGridCellInfosService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/Theme.js +function Theme_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Theme_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Theme_createClass(Constructor, protoProps, staticProps) { if (protoProps) Theme_defineProperties(Constructor.prototype, protoProps); if (staticProps) Theme_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class CommonTheme + * @aliasclass Theme + * @deprecatedclass SuperMap.Theme + * @category iServer Map Theme + * @classdesc 专题图基类。 + * @param {string} type - 专题图类型。 + * @param {Object} options - 可选参数。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var Theme = /*#__PURE__*/function () { + function Theme(type, options) { + Theme_classCallCheck(this, Theme); + + if (!type) { + return this; + } + /** + * @member {ThemeMemoryData} CommonTheme.prototype.memoryData + * @description 专题图内存数据。
+ * 用内存数据制作专题图的方式与表达式制作专题图的方式互斥,前者优先级较高。 + * 第一个参数代表专题值,即数据集中用来做专题图的字段或表达式的值;第二个参数代表外部值。在制作专题图时,会用外部值代替专题值来制作相应的专题图。 + */ + + + this.memoryData = null; + /** + * @member {string} CommonTheme.prototype.type + * @description 专题图类型。 + */ + + this.type = type; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.Theme"; + } + /** + * @function CommonTheme.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + Theme_createClass(Theme, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.memoryData) { + me.memoryData.destroy(); + me.memoryData = null; + } + + me.type = null; + } + /** + * @function CommonTheme.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + //return 子类实现 + return; + } + }]); + + return Theme; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ServerTextStyle.js +function ServerTextStyle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerTextStyle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerTextStyle_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerTextStyle_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerTextStyle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ServerTextStyle + * @deprecatedclass SuperMap.ServerTextStyle + * @category iServer Map Theme + * @classdesc 服务端文本风格类。该类用于定义文本风格的相关属性。 + * @param {Object} options - 可选参数。 + * @param {TextAlignment} [options.align=TextAlignment.BASELINECENTER] - 文本的对齐方式。 + * @param {ServerColor} [options.backColor] - 文本的背景色。默认 backColor = new ServerColor(255, 255, 255)。 + * @param {ServerColor} [options.foreColor] - 文本的前景色。默认 foreColor = new ServerColor(0, 0, 0)。 + * @param {boolean} [options.backOpaque=false] - 文本背景是否不透明。 + * @param {boolean} [options.sizeFixed=true] - 文本大小是否固定。 + * @param {number} [options.fontHeight=6] - 文本字体的高度。 + * @param {number} [options.fontWidth=0] - 文本字体的宽度。 + * @param {number} [options.fontWeight=400] - 文本字体的磅数。 + * @param {string} [options.fontName='Times New Roman'] - 文本字体的名称。 + * @param {boolean} [options.bold=false] - 文本是否为粗体字。 + * @param {boolean} [options.italic=false] - 文本是否采用斜体。 + * @param {number} [options.italicAngle=0] - 字体倾斜角度。 + * @param {boolean} [options.shadow=false] - 文本是否有阴影。 + * @param {boolean} [options.strikeout=false] - 文本字体是否加删除线。 + * @param {boolean} [options.outline=false] - 是否以轮廓的方式来显示文本的背景。 + * @param {number} [options.opaqueRate=0] - 注记文字的不透明度。 + * @param {boolean} [options.underline=false] - 文本字体是否加下划线。 + * @param {number} [options.rotation=0.0] - 文本旋转的角度。 + * @usage + */ + +var ServerTextStyle = /*#__PURE__*/function () { + function ServerTextStyle(options) { + ServerTextStyle_classCallCheck(this, ServerTextStyle); + + /** + * @member {TextAlignment} [ServerTextStyle.prototype.align= TextAlignment.BASELINECENTER] + * @description 文本的对齐方式。 + */ + this.align = TextAlignment.BASELINECENTER; + /** + * @member {ServerColor} [ServerTextStyle.prototype.backColor=(255, 255, 255)] + * @description 文本的背景色。 + */ + + this.backColor = new ServerColor(255, 255, 255); + /** + * @member {ServerColor} [ServerTextStyle.prototype.foreColor=(0, 0, 0)] + * @description 文本的前景色。 + */ + + this.foreColor = new ServerColor(0, 0, 0); + /** + * @member {boolean} [ServerTextStyle.prototype.backOpaque=false] + * @description 文本背景是否不透明。true 表示文本背景不透明。 + */ + + this.backOpaque = false; + /** + * @member {boolean} [ServerTextStyle.prototype.sizeFixed=true] + * @description 文本大小是否固定。设置为 true,表示图片为固定像素大小,具体大小请参考 fontHeight。当设为 false 时,图片会随着地图缩放而缩放。 + */ + + this.sizeFixed = true; + /** + * @member {number} [ServerTextStyle.prototype.fontHeight=6] + * @description 文本字体的高度,单位与 sizeFixed 有关,当 sizeFixed 为 False 时,即非固定文本大小时使用地图坐标单位, + * 如地理坐标系下的地图中单位为度;当 sizeFixed 为 True 时,单位为毫米(mm)。 + */ + + this.fontHeight = 6; + /** + * @member {number} [ServerTextStyle.prototype.fontWidth=0] + * @description 文本字体的宽度。字体的宽度以英文字符为标准,由于一个中文字符相当于两个英文字符。 + */ + + this.fontWidth = 0; + /** + * @member {number} [ServerTextStyle.prototype.fontWeight=400] + * @description 文本字体的磅数。表示粗体的具体数值。取值范围为从0-900之间的整百数。 + */ + + this.fontWeight = 400; + /** + * @member {string} [ServerTextStyle.prototype.fontName="Times New Roman"] + * @description 文本字体的名称。 + */ + + this.fontName = "Times New Roman"; + /** + * @member {boolean} [ServerTextStyle.prototype.bold=false] + * @description 文本是否为粗体字。true 表示为粗体。false 表示文本不是粗体字。 + */ + + this.bold = false; + /** + * @member {boolean} [ServerTextStyle.prototype.italic=false] + * @description 文本是否采用斜体。true 表示采用斜体。 + */ + + this.italic = false; + /** + * @member {number} [ServerTextStyle.prototype.italicAngle=0] + * @description 字体倾斜角度。正负度之间,以度为单位,精确到0.1度。当倾斜角度为0度,为系统默认的字体倾斜样式。 + * 正负度是指以纵轴为起始零度线,其纵轴左侧为正,右侧为负。允许的最大角度为60,最小-60。大于60按照60处理,小于-60按照-60处理。目前只对标签专题图有效。 + */ + + this.italicAngle = 0; + /** + * @member {boolean} [ServerTextStyle.prototype.shadow=false] + * @description 文本是否有阴影。true 表示给文本增加阴影。false 表示文本没有阴影。 + */ + + this.shadow = false; + /** + * @member {boolean} [ServerTextStyle.prototype.strikeout=false] + * @description 文本字体是否加删除线。true 表示加删除线。false 表示文本字体不加删除线。 + */ + + this.strikeout = false; + /** + * @member {boolean} [ServerTextStyle.prototype.outline=false] + * @description 是否以轮廓的方式来显示文本的背景。true 表示以轮廓的方式来显示文本的背景。false 表示不以轮廓的方式来显示文本的背景。 + */ + + this.outline = false; + /** + * @member {number} [ServerTextStyle.prototype.opaqueRate=0] + * @description 注记文字的不透明度。不透明度的范围为0-100。0表示透明。 + */ + + this.opaqueRate = 0; + /** + * @member {boolean} [ServerTextStyle.prototype.underline=false] + * @description 文本字体是否加下划线。true 表示加下划线。 + */ + + this.underline = false; + /** + * @member {number} [ServerTextStyle.prototype.rotation=0.0] + * @description 文本旋转的角度。逆时针方向为正方向,单位为度,精确到0.1度。 + */ + + this.rotation = 0.0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerTextStyle"; + } + /** + * @function ServerTextStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ServerTextStyle_createClass(ServerTextStyle, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.align = null; + + if (me.backColor) { + me.backColor.destroy(); + me.backColor = null; + } + + if (me.foreColor) { + me.foreColor.destroy(); + me.foreColor = null; + } + + me.backOpaque = null; + me.sizeFixed = null; + me.fontHeight = null; + me.fontWidth = null; + me.fontWeight = null; + me.fontName = null; + me.bold = null; + me.italic = null; + me.italicAngle = null; + me.shadow = null; + me.strikeout = null; + me.outline = null; + me.opaqueRate = null; + me.underline = null; + me.rotation = null; + } + /** + * @function ServerTextStyle.fromObj + * @description 从传入对象获服务端文本风格类。 + * @param {Object} obj - 传入对象 + * @returns {ServerTextStyle} 返回服务端文本风格对象 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ServerTextStyle(obj); + Util.copy(res, obj); + res.backColor = ServerColor.fromJson(obj.backColor); + res.foreColor = ServerColor.fromJson(obj.foreColor); + return res; + } + }]); + + return ServerTextStyle; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelItem.js +function ThemeLabelItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabelItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabelItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabelItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabelItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeLabelItem + * @deprecatedclass SuperMap.ThemeLabelItem + * @category iServer Map Theme + * @classdesc 分段标签专题图的子项。标签专题图用专题值对点、线、面等对象做标注。 + * 值得注意的是,分段标签专题图允许用户通过 rangeExpression 字段指定用于分段的数值型字段, + * 同一范围段内的标签具有相同的显示风格,其中每一个范围段就是一个专题图子项, + * 每一个子项都具有其名称、风格、起始值和终止值。注意:每个分段所表示的范围为 [Start, End)。例如:标签专题图的分段点有两个子项, + * 他们所代表的分段区间分别为[0,5),[5,10)。那么需要分别设置 ThemeLabelItem[0].start=0, + * ThemeLabelItem[0].end=5,SuperMap.ThemeLabelItem[1].start=5,SuperMap.ThemeLabelItem[1].end=10。 + * @param {Object} options - 可选参数。 + * @param {string} [options.caption] - 子项的名称。 + * @param {number} [options.end=0] - 子项的终止值。 + * @param {number} [options.start=0] - 子项的分段起始值。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @param {ServerTextStyle} [options.style] - 子项文本的显示风格。 + * @usage + */ + +var ThemeLabelItem = /*#__PURE__*/function () { + function ThemeLabelItem(options) { + ThemeLabelItem_classCallCheck(this, ThemeLabelItem); + + /** + * @member {string} [ThemeLabelItem.prototype.caption] + * @description 标签专题子项的标题。 + */ + this.caption = null; + /** + * @member {number} [ThemeLabelItem.prototype.end=0] + * @description 标签专题图子项的终止值。如果该子项是分段中最后一个子项,那么该终止值就是分段的最大值; + * 如果不是最后一项,该终止值必须与其下一子项的起始值相同,否则系统抛出异常。 + */ + + this.end = 0; + /** + * @member {number} [ThemeLabelItem.prototype.start=0] + * @description 标签专题图子项的分段起始值。如果该子项是分段中第一项,那么该起始值就是分段的最小值; + * 如果该子项的序号大于等于 1 的时候,该起始值必须与前一子项的终止值相同,否则系统会抛出异常。 + */ + + this.start = 0; + /** + * @member {boolean} [ThemeLabelItem.prototype.visible=true] + * @description 标签专题图子项是否可见。如果标签专题图子项可见,则为 true,否则为 false。 + */ + + this.visible = true; + /** + * @member {ServerTextStyle} ThemeLabelItem.prototype.style + * @description 标签专题图子项文本的显示风格。各种风格的优先级从高到低为:
+ * uniformMixedStyle(标签文本的复合风格),ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + + this.style = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelItem"; + } + /** + * @function ThemeLabelItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeLabelItem_createClass(ThemeLabelItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + + me.visible = null; + } + /** + * @function ThemeLabelItem.fromObj + * @description 从传入对象获取分段标签专题图的子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelItem} ThemeLabelItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var t = new ThemeLabelItem(); + Util.copy(t, obj); + return t; + } + }]); + + return ThemeLabelItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeUniqueItem.js +function ThemeUniqueItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeUniqueItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeUniqueItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeUniqueItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeUniqueItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeUniqueItem + * @deprecatedclass SuperMap.ThemeUniqueItem + * @category iServer Map Theme + * @classdesc 单值专题图子项类。单值专题图是将专题值相同的要素归为一类,为每一类设定一种渲染风格,其中每一类就是一个专题图子项。比如,利用单值专题图制作行政区划图,Name 字段代表 + * 省/直辖市名,该字段用来做专题变量,如果该字段的字段值总共有 5 种不同值,则该行政区划图有 5 个专题图子项。 + * @param {Object} options - 参数。 + * @param {string} options.unique - 子项的单值字段。 + * @param {string} [options.caption] - 子项的标题。 + * @param {ServerStyle} [options.style] - 子项的风格。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ + +var ThemeUniqueItem = /*#__PURE__*/function () { + function ThemeUniqueItem(options) { + ThemeUniqueItem_classCallCheck(this, ThemeUniqueItem); + + /** + * @member {string} [ThemeUniqueItem.prototype.caption] + * @description 单值专题图子项的标题。 + */ + this.caption = null; + /** + * @member {ServerStyle} [ThemeUniqueItem.prototype.style] + * @description 单值专题图子项的显示风格。 + */ + + this.style = new ServerStyle(); + /** + * @member {string} ThemeUniqueItem.prototype.unique + * @description 单值专题图子项的值,可以为数字、字符串等。 + */ + + this.unique = null; + /** + * @member {boolean} [ThemeUniqueItem.prototype.visible=true] + * @description 单值专题图子项的可见性。 + */ + + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeUniqueItem"; + } + /** + * @function ThemeUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeUniqueItem_createClass(ThemeUniqueItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.unique = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + + me.visible = null; + } + /** + * @function ThemeUniqueItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + + return obj; + } + /** + * @function ThemeUniqueItem.fromObj + * @description 从传入对象获取单值专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeUniqueItem} ThemeUniqueItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeUniqueItem(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + } + }]); + + return ThemeUniqueItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeOffset.js +function ThemeOffset_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeOffset_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeOffset_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeOffset_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeOffset_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeOffset + * @deprecatedclass SuperMap.ThemeOffset + * @category iServer Map Theme + * @classdesc 专题图中文本或符号相对于要素内点的偏移量设置类。 + * 通过该类可以设置专题图中标记文本或符号的偏移量以及偏移量是否随地图缩放而改变。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.offsetFixed=false] - 当前专题图是否固定标记文本或符号的偏移量。 + * @param {string} [options.offsetX='0.0'] - 专题图中文本或符号相对于要素内点的水平偏移量。 + * @param {string} [options.offsetY='0.0'] - 专题图中文本或符号相对于要素内点的垂直偏移量。 + * @usage + */ + +var ThemeOffset = /*#__PURE__*/function () { + function ThemeOffset(options) { + ThemeOffset_classCallCheck(this, ThemeOffset); + + /** + * @member {boolean} [ThemeOffset.prototype.offsetFixed=false] + * @description 当前专题图是否固定标记文本或符号的偏移量。所谓固定偏移量,则文本或符号的偏移量不随地图的缩放而变化。 + */ + this.offsetFixed = false; + /** + * @member {string} [ThemeOffset.prototype.offsetX=0.0] + * @description 专题图中文本或符号相对于要素内点的水平偏移量。偏移量的单位为地图单位。 + * 该偏移量的值为一个常量值或者字段表达式所表示的值,即如果字段表达式为 SmID,其中 SmID = 2,那么水平偏移量为2。 + */ + + this.offsetX = "0.0"; + /** + * @member {string} [ThemeOffset.prototype.offsetY=0.0] + * @description 专题图中文本或符号相对于要素内点的垂直偏移量。偏移量的单位为地图单位。 + * 该偏移量的值为一个常量值或者字段表达式所表示的值,即如果字段表达式为 SmID,其中 SmID = 2,那么垂直偏移量为2。 + */ + + this.offsetY = "0.0"; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeOffset"; + } + /** + * @function ThemeOffset.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeOffset_createClass(ThemeOffset, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.offsetFixed = null; + me.offsetX = null; + me.offsetY = null; + } + /** + * @function ThemeOffset.fromObj + * @description 从传入对象获取专题图中文本或符号相对于要素内点的偏移量设置类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeOffset} ThemeOffset 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeOffset(); + Util.copy(res, obj); + return res; + } + }]); + + return ThemeOffset; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/LabelMixedTextStyle.js +function LabelMixedTextStyle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LabelMixedTextStyle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LabelMixedTextStyle_createClass(Constructor, protoProps, staticProps) { if (protoProps) LabelMixedTextStyle_defineProperties(Constructor.prototype, protoProps); if (staticProps) LabelMixedTextStyle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LabelMixedTextStyle + * @deprecatedclass SuperMap.LabelMixedTextStyle + * @category iServer Map Theme + * @classdesc 标签文本复合风格类。 + * 该类主要用于对标签专题图中标签的文本内容进行风格设置。通过该类用户可以使标签的文字显示不同的风格,比如文本 “喜马拉雅山”,通过本类可以将前三个字用红色显示,后两个字用蓝色显示。对同一文本设置不同的风格实质上是对文本的字符进行分段,同一分段内的字符具有相同的显示风格。对字符分段有两种方式,一种是利用分隔符对文本进行分段;另一种是根据分段索引值进行分段:
+ * 1.利用分隔符对文本进行分段: 比如文本 “5&109” 被分隔符 “&” 分为 “5” 和 “109” 两部分, + * 在显示时,“5” 和分隔符 “&” 使用同一个风格,字符串 “109” 使用相同的风格。
+ * 2.利用分段索引值进行分段: 文本中字符的索引值是以0开始的整数,比如文本 “珠穆朗玛峰”, + * 第一个字符(“珠”)的索引值为 0,第二个字符(“穆”)的索引值为 1,以此类推;当设置分段索引值为 1,3,4,9 时, + * 字符分段范围相应的就是 (-∞,1),[1,3),[3,4),[4,9),[9,+∞),可以看出索引号为 0 的字符(即“珠” )在第一个分段内, + * 索引号为 1,2 的字符(即“穆”、“朗”)位于第二个分段内,索引号为 3 的字符(“玛”)在第三个分段内,索引号为 4 的字符(“峰”)在第四个分段内,其余分段中没有字符。 + * @param {Object} options - 可选参数。 + * @param {ServerTextStyle} [options.defaultStyle] - 默认的文本复合风格。 + * @param {string} [options.separator] - 文本的分隔符。 + * @param {boolean} [options.separatorEnabled=false] - 文本的分隔符是否有效。 + * @param {Array.} [options.splitIndexes] - 分段索引值,分段索引值用来对文本中的字符进行分段。 + * @param {Array.} [options.styles] - 文本样式集合。 + * @usage + */ + +var LabelMixedTextStyle = /*#__PURE__*/function () { + function LabelMixedTextStyle(options) { + LabelMixedTextStyle_classCallCheck(this, LabelMixedTextStyle); + + /** + * @member {ServerTextStyle} LabelMixedTextStyle.prototype.defaultStyle + * @description 默认的文本复合风格,即 ServerTextStyle 各字段的默认值。 + */ + this.defaultStyle = null; + /** + * @member {string} LabelMixedTextStyle.prototype.separator + * @description 文本的分隔符,分隔符的风格与前一个字符的风格一样。文本的分隔符是一个将文本分割开的符号, + * 比如文本 “5_109” 被 “ _ ” 分隔为 “5” 和 “109” 两部分,假设有风格数组:style1、style2。 + * 在显示时,“5” 和分隔符 “ _ ” 使用 Style1 风格渲染,字符串 “109” 使用 Style2 的风格。 + */ + + this.separator = null; + /** + * @member {boolean} [LabelMixedTextStyle.prototype.separatorEnabled=false] + * @description 文本的分隔符是否有效。分隔符有效时利用分隔符对文本进行分段;无效时根据文本中字符的位置进行分段。 + * 分段后,同一分段内的字符具有相同的显示风格。 + */ + + this.separatorEnabled = false; + /** + * @member {Array.} LabelMixedTextStyle.prototype.splitIndexes + * @description 分段索引值,分段索引值用来对文本中的字符进行分段。 + * 文本中字符的索引值是以 0 开始的整数,比如文本“珠穆朗玛峰”,第一个字符(“珠”)的索引值为0,第二个字符(“穆”)的索引值为 1, + * 以此类推;当设置分段索引值数组为 [1,3,4,9] 时,字符分段范围相应的就是 (-∞,1),[1,3),[3,4),[4,9),[9,+∞), + * 可以看出索引号为 0 的字符(即 “珠”)在第一个分段内,索引号为 1,2 的字符(即 “穆”、“朗”)位于第二个分段内, + * 索引号为 3 的字符(“玛”)在第三个分段内,索引号为 4 的字符(“峰”)在第四个分段内,其余分段中没有字符。 + */ + + this.splitIndexes = null; + /** + * @member {Array.} LabelMixedTextStyle.prototype.styles + * @description 文本样式集合。文本样式集合中的样式根据索引与不同分段一一对应, + * 如果有分段没有风格对应则使用 defaultStyle。 + */ + + this.styles = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LabelMixedTextStyle"; + } + /** + * @function LabelMixedTextStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LabelMixedTextStyle_createClass(LabelMixedTextStyle, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.defaultStyle) { + me.defaultStyle.destroy(); + me.defaultStyle = null; + } + + me.separator = null; + me.separatorEnabled = null; + + if (me.splitIndexes) { + me.splitIndexes = null; + } + + if (me.styles) { + for (var i = 0, styles = me.styles, len = styles.length; i < len; i++) { + styles[i].destroy(); + } + + me.styles = null; + } + } + /** + * @function LabelMixedTextStyle.fromObj + * @description 从传入对象获取标签文本复合风格类。 + * @param {Object} obj - 传入对象。 + * @returns {LabelMixedTextStyle} 返回新的 LabelMixedTextStyle 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new LabelMixedTextStyle(); + var stys = obj.styles; + Util.copy(res, obj); + res.defaultStyle = new ServerTextStyle(obj.defaultStyle); + + if (stys) { + res.styles = []; + + for (var i = 0, len = stys.length; i < len; i++) { + res.styles.push(new ServerTextStyle(stys[i])); + } + } + + return res; + } + }]); + + return LabelMixedTextStyle; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelText.js +function ThemeLabelText_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabelText_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabelText_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabelText_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabelText_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeLabelText + * @deprecatedclass SuperMap.ThemeLabelText + * @category iServer Map Theme + * @classdesc 标签中文本风格类。 + * 通过该类可以设置标签中的文本字体大小和显示风格。 + * @param {Object} options - 参数。 + * @param {number} [options.maxTextHeight=0] - 标签中文本的最大高度。 + * @param {number} [options.maxTextWidth=0] - 标签中文本的最大宽度。 + * @param {number} [options.minTextHeight=0] - 标签中文本的最小高度。 + * @param {number} [options.minTextWidth=0] - 标签中文本的最小宽度。 + * @param {ServerTextStyle} [options.uniformStyle] - 统一文本风格。 + * @param {LabelMixedTextStyle} [options.uniformMixedStyle] - 标签专题图统一的文本复合风格。 + * @usage + */ + +var ThemeLabelText = /*#__PURE__*/function () { + function ThemeLabelText(options) { + ThemeLabelText_classCallCheck(this, ThemeLabelText); + + /** + * @member {number} [ThemeLabelText.prototype.maxTextHeight=0] + * @description 标签中文本的最大高度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当放大后的文本高度超过最大高度之后就不再放大。高度单位为毫米。 + */ + this.maxTextHeight = 0; + /** + * @member {number} [ThemeLabelText.prototype.maxTextWidth=0] + * @description 标签中文本的最大宽度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当放大后的文本宽度超过最大高度之后就不再放大。宽度单位为毫米。 + */ + + this.maxTextWidth = 0; + /** + * @member {number} [ThemeLabelText.prototype.minTextHeight=0] + * @description 标签中文本的最小高度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当缩小后的文本高度小于最小高度之后就不再缩小。高度单位为毫米。 + */ + + this.minTextHeight = 0; + /** + * @member {number} [ThemeLabelText.prototype.minTextWidth=0] + * @description 标签中文本的最小宽度。当标签文本不固定大小时,即 ServerTextStyle.sizeFixed = false 有效, + * 当缩小后的文本宽度小于最小宽度之后就不再缩小。宽度单位为毫米。 + */ + + this.minTextWidth = 0; + /** + * @member {ServerTextStyle} [ThemeLabelText.prototype.uniformStyle] + * @description 统一文本风格。当标签专题图子项的个数大于等于1时, + * uniformStyle 不起作用,各标签的风格使用子项中设置的风格。各种风格的优先级从高到低为:uniformMixedStyle(标签文本的复合风格), + * ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + + this.uniformStyle = new ServerTextStyle(); + /** + *@member {LabelMixedTextStyle} [ThemeLabelText.prototype.uniformMixedStyle] + *@description 标签专题图统一的文本复合风格。通过该类可以使同一个标 + * 签中的文字使用多种风格显示。各种风格的优先级从高到低为:uniformMixedStyle(标签文本的复合风格), + * ThemeLabelItem.style(分段子项的文本风格),uniformStyle(统一文本风格)。 + */ + + this.uniformMixedStyle = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelText"; + } + /** + * @function ThemeLabelText.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeLabelText_createClass(ThemeLabelText, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.maxTextHeight = null; + me.maxTextWidth = null; + me.minTextHeight = null; + me.minTextWidth = null; + + if (me.uniformStyle) { + me.uniformStyle.destroy(); + me.uniformStyle = null; + } + + if (me.uniformMixedStyle) { + me.uniformMixedStyle.destroy(); + me.uniformMixedStyle = null; + } + } + /** + * @function ThemeLabelText.fromObj + * @description 从传入对象获取标签中文本风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelText} ThemeLabelText 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeLabelText(); + Util.copy(res, obj); + res.uniformStyle = ServerTextStyle.fromObj(obj.uniformStyle); + res.uniformMixedStyle = LabelMixedTextStyle.fromObj(obj.uniformMixedStyle); + return res; + } + }]); + + return ThemeLabelText; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelAlongLine.js +function ThemeLabelAlongLine_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabelAlongLine_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabelAlongLine_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabelAlongLine_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabelAlongLine_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeLabelAlongLine + * @deprecatedclass SuperMap.ThemeLabelAlongLine + * @category iServer Map Theme + * @classdesc 标签沿线标注样式类。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.isAlongLine=true] - 是否沿线显示文本。 + * @param {AlongLineDirection} [options.alongLineDirection=AlongLineDirection.LB_TO_RT] - 标签沿线标注方向。 + * @param {boolean} [options.angleFixed=false] - 当沿线显示文本时,是否将文本角度固定。 + * @param {boolean} [options.repeatedLabelAvoided=false] - 沿线循环标注时是否避免标签重复标注。 + * @param {boolean} [options.repeatIntervalFixed=false] - 循环标注间隔是否固定。 + * @param {number} [options.labelRepeatInterval=0] - 沿线且循环标注时循环标注的间隔。 + * @usage + */ + +var ThemeLabelAlongLine = /*#__PURE__*/function () { + function ThemeLabelAlongLine(options) { + ThemeLabelAlongLine_classCallCheck(this, ThemeLabelAlongLine); + + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.isAlongLine=true] + * @description 是否沿线显示文本。true 表示沿线显示文本,false 表示正常显示文本。 + */ + this.isAlongLine = true; + /** + * @member {AlongLineDirection} [ThemeLabelAlongLine.prototype.alongLineDirection=AlongLineDirection.LB_TO_RT] + * @description 标签沿线标注方向。 + */ + + this.alongLineDirection = AlongLineDirection.LB_TO_RT; + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.angleFixed=false] + * @description 当沿线显示文本时,是否将文本角度固定。true 表示按固定文本角度显示文本,false 表示按照沿线角度显示文本。 + * 如果固定角度,则所有标签均按所设置的文本风格中字体的旋转角度来显示,不考虑沿线标注的方向; + * 如果不固定角度,在显示标签时会同时考虑字体的旋转角度和沿线标注的方向。 + */ + + this.angleFixed = false; + /** + * @member {boolean} ThemeLabelAlongLine.prototype.repeatedLabelAvoided + * @description 沿线循环标注时是否避免标签重复标注。 + */ + + this.repeatedLabelAvoided = false; + /** + * @member {boolean} [ThemeLabelAlongLine.prototype.repeatIntervalFixed=false] + * @description 循环标注间隔是否固定。true 表示使用固定循环标注间隔,即使用逻辑坐标来显示循环标注间隔; + * false 表示循环标注间隔随地图的缩放而变化,即使用地理坐标来显示循环标注间隔。 + */ + + this.repeatIntervalFixed = false; + /** + * @member {number} [ThemeLabelAlongLine.prototype.labelRepeatInterval=0] + * @description 沿线且循环标注时循环标注的间隔。长度的单位与地图的地理单位一致。只有设定 RepeatedLabelAvoided 为 true + * 的时候,labelRepeatInterval 属性才有效。 + */ + + this.labelRepeatInterval = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelAlongLine"; + } + /** + * @function ThemeLabelAlongLine.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeLabelAlongLine_createClass(ThemeLabelAlongLine, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isAlongLine = null; + me.alongLineDirection = null; + me.angleFixed = null; + me.repeatedLabelAvoided = null; + me.repeatIntervalFixed = null; + me.labelRepeatInterval = null; + } + /** + * @function ThemeLabelAlongLine.fromObj + * @description 从传入对象获取标签沿线标注样式类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelAlongLine} ThemeLabelAlongLine 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var t = new ThemeLabelAlongLine(); + Util.copy(t, obj); + return t; + } + }]); + + return ThemeLabelAlongLine; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelBackground.js +function ThemeLabelBackground_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabelBackground_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabelBackground_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabelBackground_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabelBackground_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeLabelBackground + * @deprecatedclass SuperMap.ThemeLabelBackground + * @category iServer Map Theme + * @classdesc 标签背景风格类。通过该类可以设置标签的背景形状和风格。 + * @param {Object} options - 可选参数。 + * @param {LabelBackShape} [options.labelBackShape=LabelBackShape.NONE] - 标签专题图中标签背景的形状枚举类。 + * @param {ServerStyle} [options.backStyle] - 标签专题图中标签背景风格。 + * @usage + */ + +var ThemeLabelBackground = /*#__PURE__*/function () { + function ThemeLabelBackground(options) { + ThemeLabelBackground_classCallCheck(this, ThemeLabelBackground); + + /** + * @member {LabelBackShape} [ThemeLabelBackground.prototype.labelBackShape=LabelBackShape.NONE] + * @description 标签专题图中标签背景风格。当背景形状 + * labelBackShape 属性设为 NONE(即无背景形状) 时,backStyle 属性无效。 + */ + this.labelBackShape = LabelBackShape.NONE; + /** + * @member {ServerStyle} [ThemeLabelBackground.prototype.backStyle] + * @description 标签专题图中标签背景的形状枚举类。背景类型可 + * 以是矩形、圆角矩形、菱形、椭圆形、三角形和符号等,即不使用任何的形状作为标签的背景。 + */ + + this.backStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelBackground"; + } + /** + * @function ThemeLabelBackground.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeLabelBackground_createClass(ThemeLabelBackground, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.labelBackShape = null; + + if (me.backStyle) { + me.backStyle.destroy(); + me.backStyle = null; + } + } + /** + * @function ThemeLabelBackground.fromObj + * @description 从传入对象获取标签背景风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelBackground} ThemeLabelBackground 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var t = new ThemeLabelBackground(); + t.labelBackShape = obj.labelBackShape; + t.backStyle = ServerStyle.fromJson(obj.backStyle); + return t; + } + }]); + + return ThemeLabelBackground; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabel.js +function ThemeLabel_typeof(obj) { "@babel/helpers - typeof"; return ThemeLabel_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeLabel_typeof(obj); } + +function ThemeLabel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabel_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabel_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeLabel_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeLabel_get = Reflect.get; } else { ThemeLabel_get = function _get(target, property, receiver) { var base = ThemeLabel_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeLabel_get.apply(this, arguments); } + +function ThemeLabel_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeLabel_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeLabel_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeLabel_setPrototypeOf(subClass, superClass); } + +function ThemeLabel_setPrototypeOf(o, p) { ThemeLabel_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeLabel_setPrototypeOf(o, p); } + +function ThemeLabel_createSuper(Derived) { var hasNativeReflectConstruct = ThemeLabel_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeLabel_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeLabel_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeLabel_possibleConstructorReturn(this, result); }; } + +function ThemeLabel_possibleConstructorReturn(self, call) { if (call && (ThemeLabel_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeLabel_assertThisInitialized(self); } + +function ThemeLabel_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeLabel_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeLabel_getPrototypeOf(o) { ThemeLabel_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeLabel_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +/** + * @class ThemeLabel + * @deprecatedclass SuperMap.ThemeLabel + * @category iServer Map Theme + * @classdesc 标签专题图类。 + * @extends CommonTheme + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项数组。 + * @param {string} options.labelExpression - 标注字段表达式。 + * @param {Array.} options.matrixCells - 矩阵标签元素数组。 + * @param {ThemeLabelAlongLine} [options.alongLine] - 标签沿线标注方向样式类。 + * @param {ThemeLabelBackground} [options.background] - 标签的背景风格类。 + * @param {LabelOverLengthMode} [options.labelOverLengthMode=LabelOverLengthMode.NONE] - 超长标签的处理模式枚举类。 + * @param {number} [options.maxLabelLength=256] - 标签在每一行显示的最大长度。 + * @param {number} [options.numericPrecision=0] - 通过该字段设置其显示的精度。 + * @param {ThemeOffset} [options.offset] - 指定标签专题图中标记文本相对于要素内点的偏移量对象。 + * @param {boolean} [options.overlapAvoided=true] - 是否允许以文本避让方式显示文本。 + * @param {string} [options.rangeExpression] - 制作分段标签专题的分段字段或字段表达式。 + * @param {boolean} [options.smallGeometryLabeled=false] - 是否显示长度大于被标注对象本身长度的标签。 + * @param {ThemeLabelText} options.text - 标签中文本风格。 + * @param {number} [options.textSpace=0] - 沿线标注,相邻两个文字之间的间距,单位当前设置的字高。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var ThemeLabel = /*#__PURE__*/function (_Theme) { + ThemeLabel_inherits(ThemeLabel, _Theme); + + var _super = ThemeLabel_createSuper(ThemeLabel); + + function ThemeLabel(options) { + var _this; + + ThemeLabel_classCallCheck(this, ThemeLabel); + + _this = _super.call(this, "LABEL", options); + /** + * @member {ThemeLabelAlongLine} [ThemeLabel.prototype.alongLine] + * @description 标签沿线标注方向样式类。 + * 在该类中可以设置标签是否沿线标注以及沿线标注的多种方式。沿线标注属性只适用于线数据集专题图。 + */ + + _this.alongLine = new ThemeLabelAlongLine(); + /** + * @member {ThemeLabelBackground} [ThemeLabel.prototype.background] + * @description 标签专题图中标签的背景风格类。通过该字段可以设置标签的背景形状和风格。 + */ + + _this.background = new ThemeLabelBackground(); + /** + * @member {Array.} [ThemeLabel.prototype.items] + * @description 分段标签专题图的子项数组。分段标签专题图使用 rangeExpression + * 指定数字型的字段作为分段数据,items 中的每个子对象的 [start,end) 分段值必须来源于属性 rangeExpression 的字段值。每个子项拥有自己的风格。 + */ + + _this.items = null; + /** + * @member {Array.} ThemeLabel.prototype.uniqueItems + * @description 单值标签专题图子项数组。单值标签专题图使用 uniqueExpression单值标签专题图子项集合。 + */ + + _this.uniqueItems = null; + /** + * @member {string} ThemeLabel.prototype.labelExpression + * @description 标注字段表达式。系统将 labelExpression 对应的字段或字段表达式的值以标签的形式显示在图层中。 + */ + + _this.labelExpression = null; + /** + * @member {LabelOverLengthMode} [ThemeLabel.prototype.labelOverLengthMode=LabelOverLengthMode.NONE] - 标签专题图中超长标签的处理模式枚举类。 + * @description 对于标签的长度超过设置的标签最大长度 maxLabelLength 时称为超长标签。 + */ + + _this.labelOverLengthMode = LabelOverLengthMode.NONE; + /** + * @member {Array.} ThemeLabel.prototype.matrixCells + * @description 矩阵标签元素数组,用于制作矩阵标签专题图。 + * 数组中可以放置符号类型的矩阵标签元素和图片类型的矩阵标签元素。 + */ + + _this.matrixCells = null; + /** + * @member {number} [ThemeLabel.prototype.maxLabelLength=256] + * @description 标签在每一行显示的最大长度,一个中文为两个字符。 + * 如果超过最大长度,可以采用两种方式来处理,一种是换行的模式进行显示,另一种是以省略号方式显示。单位为字符。 + */ + + _this.maxLabelLength = 256; + /** + * @member {number} [ThemeLabel.prototype.numericPrecision=0] + * @description 如果显示的标签内容为数字,通过该字段设置其显示的精度。例如标签对应的数字是8071.64529347, + * 如果该属性为0时,显示8071;为1时,显示8071.6;为3时,则是8071.645。 + */ + + _this.numericPrecision = 0; + /** + * @member {ThemeOffset} [ThemeLabel.prototype.offset] + * @description 用于设置标签专题图中标记文本相对于要素内点的偏移量对象。 + */ + + _this.offset = new ThemeOffset(); + /** + * @member {boolean} [ThemeLabel.prototype.overlapAvoided=true] + * @description 是否允许以文本避让方式显示文本。true 表示自动避免文本叠盖。只针对该标签专题图层中的文本数据。 + * 在标签重叠度很大的情况下,即使使用自动避让功能,可能也无法完全避免标签重叠现象。 + */ + + _this.overlapAvoided = true; + /** + * @member {string} ThemeLabel.prototype.rangeExpression + * @description 制作分段标签专题的分段字段或字段表达式。该表达式对应的字段(或者字段表达式)的值应该为数值型。 + * 该字段与 items 分段子项联合使用,每个子项的起始值 [start,end)来源于 rangeExpression 字段值。 + * 最后 labelExpression 指定的标签字段(标签专题图要显示的具体内容)会根据分段子项的风格进行分段显示。 + */ + + _this.rangeExpression = null; + /** + * @member {string} ThemeLabel.prototype.uniqueExpression + * @description 用于制作单值专题图的字段或字段表达式。 + * 该字段值的数据类型可以为数值型或字符型。如果设置字段表达式,只能是相同数据类型字段间的运算。必须与labelExpression一起使用。 + */ + + _this.uniqueExpression = null; + /** + * @member {boolean} [ThemeLabel.prototype.smallGeometryLabeled=false] + * @description 是否显示长度大于被标注对象本身长度的标签。在标签的长度大于线或者面对象本身的长度时, + * 如果该值为 true,则标签文字会叠加在一起显示,为了清楚完整的显示该标签, + * 可以采用换行模式来显示标签,但必须保证每行的长度小于对象本身的长度。 + */ + + _this.smallGeometryLabeled = false; + /** + * @member {ThemeLabelText} ThemeLabel.prototype.text + * @description 标签中文本风格。 + */ + + _this.text = new ThemeLabelText(); + /** + * @member {number} [ThemeLabel.prototype.textSpace=0] + * @description 沿线标注,相邻两个文字之间的间距,单位当前设置的字高。 + */ + + _this.textSpace = 0; + + if (options) { + Util.extend(ThemeLabel_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeLabel"; + return _this; + } + /** + * @function ThemeLabel.prototype.destroy + * @override + */ + + + ThemeLabel_createClass(ThemeLabel, [{ + key: "destroy", + value: function destroy() { + ThemeLabel_get(ThemeLabel_getPrototypeOf(ThemeLabel.prototype), "destroy", this).call(this); + + var me = this; + me.alongLine = null; + + if (me.background) { + me.background.destroy(); + me.background = null; + } + + if (me.items) { + for (var i = 0, items = me.items, len = items.length; i < len; i++) { + items[i].destroy(); + } + + me.items = null; + } + + if (me.uniqueItems) { + for (var j = 0, uniqueItems = me.uniqueItems, uniqueLen = uniqueItems.length; j < uniqueLen; j++) { + uniqueItems[j].destory(); + } + + me.uniqueItems = null; + } + + me.labelExpression = null; + me.labelOverLengthMode = null; + me.matrixCells = null; + me.maxLabelLength = null; + me.numericPrecision = null; + me.overlapAvoided = null; + me.rangeExpression = null; + me.uniqueExpression = null; + + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + + me.overlapAvoided = null; + me.smallGeometryLabeled = null; + + if (me.text) { + me.text.destroy(); + me.text = null; + } + + me.textSpace = null; + } + /** + * @function ThemeLabel.prototype.toJSON + * @description 将themeLabel对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + /** + * @function ThemeLabel.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj.type = this.type; + obj.memoryData = this.memoryData; + + if (this.alongLine) { + obj.alongLine = this.alongLine.isAlongLine; + obj.alongLineDirection = this.alongLine.alongLineDirection; + obj.angleFixed = this.alongLine.angleFixed; + obj.isLabelRepeated = this.alongLine.isLabelRepeated; + obj.labelRepeatInterval = this.alongLine.labelRepeatInterval; + obj.repeatedLabelAvoided = this.alongLine.repeatedLabelAvoided; + obj.repeatIntervalFixed = this.alongLine.repeatIntervalFixed; + } + + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + + if (this.text) { + obj.maxTextHeight = this.text.maxTextHeight; + obj.maxTextWidth = this.text.maxTextWidth; + obj.minTextHeight = this.text.minTextHeight; + obj.minTextWidth = this.text.minTextWidth; + obj.uniformStyle = this.text.uniformStyle; + obj.uniformMixedStyle = this.text.uniformMixedStyle; + } + + if (this.background) { + obj.labelBackShape = this.background.labelBackShape; + obj.backStyle = this.background.backStyle; + } + + obj.labelOverLengthMode = this.labelOverLengthMode; + obj.maxLabelLength = this.maxLabelLength; + obj.smallGeometryLabeled = this.smallGeometryLabeled; + obj.rangeExpression = this.rangeExpression; + obj.uniqueExpression = this.uniqueExpression; + obj.numericPrecision = this.numericPrecision; + obj.items = this.items; + obj.uniqueItems = this.uniqueItems; + obj.labelExpression = this.labelExpression; + obj.overlapAvoided = this.overlapAvoided; + obj.matrixCells = this.matrixCells; + obj.textSpace = this.textSpace; + return obj; + } + /** + * @function ThemeLabel.fromObj + * @description 从传入对象获取标签专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabel} ThemeLabel 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var lab = new ThemeLabel(); + var itemsL = obj.items, + itemsU = obj.uniqueItems, + cells = obj.matrixCells; + obj.matrixCells = null; + Util.copy(lab, obj); + lab.alongLine = ThemeLabelAlongLine.fromObj(obj); + lab.background = ThemeLabelBackground.fromObj(obj); + + if (itemsL) { + lab.items = []; + + for (var i = 0, len = itemsL.length; i < len; i++) { + lab.items.push(ThemeLabelItem.fromObj(itemsL[i])); + } + } + + if (itemsU) { + lab.uniqueItems = []; + + for (var j = 0, uniqueLen = itemsU.length; j < uniqueLen; j++) { + lab.uniqueItems.push(ThemeUniqueItem.fromObj(itemsU[j])); + } + } + + if (cells) { + lab.matrixCells = []; + + for (var _i = 0, _len = cells.length; _i < _len; _i++) {//TODO + //lab.matrixCells.push(LabelMatrixCell.fromObj(cells[i])); + } + } + + lab.offset = ThemeOffset.fromObj(obj); + lab.text = ThemeLabelText.fromObj(obj); + return lab; + } + }]); + + return ThemeLabel; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeUnique.js +function ThemeUnique_typeof(obj) { "@babel/helpers - typeof"; return ThemeUnique_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeUnique_typeof(obj); } + +function ThemeUnique_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeUnique_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeUnique_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeUnique_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeUnique_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeUnique_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeUnique_get = Reflect.get; } else { ThemeUnique_get = function _get(target, property, receiver) { var base = ThemeUnique_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeUnique_get.apply(this, arguments); } + +function ThemeUnique_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeUnique_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeUnique_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeUnique_setPrototypeOf(subClass, superClass); } + +function ThemeUnique_setPrototypeOf(o, p) { ThemeUnique_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeUnique_setPrototypeOf(o, p); } + +function ThemeUnique_createSuper(Derived) { var hasNativeReflectConstruct = ThemeUnique_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeUnique_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeUnique_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeUnique_possibleConstructorReturn(this, result); }; } + +function ThemeUnique_possibleConstructorReturn(self, call) { if (call && (ThemeUnique_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeUnique_assertThisInitialized(self); } + +function ThemeUnique_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeUnique_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeUnique_getPrototypeOf(o) { ThemeUnique_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeUnique_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThemeUnique + * @deprecatedclass SuperMap.ThemeUnique + * @category iServer Map Theme + * @classdesc 单值专题图。单值专题图是利用不同的颜色或符号(线型、填充)表示图层中某一属性信息的不同属性值,属性值相同的要素具有相同的渲染风格。单值专题图多用于具有分类属性的地图上, + * 比如土壤类型分布图、土地利用图、行政区划图等。单值专题图着重表示现象质的差别,一般不表示数量的特征。尤其是有交叉或重叠现象时,此类不推荐使用,例如:民族分布区等。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项类数组。 + * @param {string} options.uniqueExpression - 指定单值专题图的字段或字段表达式。 + * @param {ServerStyle} [options.defaultStyle] - 未参与单值专题图制作的对象的显示风格。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var ThemeUnique = /*#__PURE__*/function (_Theme) { + ThemeUnique_inherits(ThemeUnique, _Theme); + + var _super = ThemeUnique_createSuper(ThemeUnique); + + function ThemeUnique(options) { + var _this; + + ThemeUnique_classCallCheck(this, ThemeUnique); + + _this = _super.call(this, "UNIQUE", options); + /** + * @member {ServerStyle} ThemeUnique.prototype.defaultStyle + * @description 未参与单值专题图制作的对象的显示风格。 + * 通过单值专题图子项数组 (items)可以指定某些要素参与单值专题图制作,对于那些没有被包含的要素,即不参加单值专题表达的要素,使用该风格显示。 + */ + + _this.defaultStyle = new ServerStyle(); + /** + * @member {Array.} ThemeUnique.prototype.items + * @description 单值专题图子项类数组。 + * 单值专题图是将专题值相同的要素归为一类,为每一类设定一种渲染风格,其中每一类就是一个专题图子项。比如,利用单值专题图制作行政区划图, + * Name 字段代表省/直辖市名,该字段用来做专题变量,如果该字段的字段值总共有5种不同值,则该行政区划图有 5 个专题图子项。 + */ + + _this.items = null; + /** + * @member {string} ThemeUnique.prototype.uniqueExpression + * @description 用于制作单值专题图的字段或字段表达式。 + * 该字段值的数据类型可以为数值型或字符型。如果设置字段表达式,只能是相同数据类型字段间的运算。 + */ + + _this.uniqueExpression = null; + /** + * @member {ColorGradientType} [ThemeUnique.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。 + * 渐变色是由起始色根据一定算法逐渐过渡到终止色的一种混合型颜色。 + * 该类作为单值专题图参数类、分段专题图参数类的属性,负责设置单值专题图、分段专题图的配色方案,在默认情况下专题图所有子项会根据这个配色方案完成填充。 + * 但如果为某几个子项的风格进行单独设置后(设置了 ThemeUniqueItem 或 ThemeRangeItem 类中Style属性), + * 该配色方案对于这几个子项将不起作用。 + */ + + _this.colorGradientType = ColorGradientType.YELLOW_RED; + + if (options) { + Util.extend(ThemeUnique_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeUnique"; + return _this; + } + /** + * @function ThemeUnique.prototype.destroy + * @override + */ + + + ThemeUnique_createClass(ThemeUnique, [{ + key: "destroy", + value: function destroy() { + ThemeUnique_get(ThemeUnique_getPrototypeOf(ThemeUnique.prototype), "destroy", this).call(this); + + var me = this; + me.uniqueExpression = null; + me.colorGradientType = null; + + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + + me.items = null; + } + + if (me.defaultStyle) { + me.defaultStyle.destroy(); + me.defaultStyle = null; + } + } + /** + * @function ThemeUnique.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.defaultStyle) { + if (obj.defaultStyle.toServerJSONObject) { + obj.defaultStyle = obj.defaultStyle.toServerJSONObject(); + } + } + + if (obj.items) { + var items = [], + len = obj.items.length; + + for (var i = 0; i < len; i++) { + items.push(obj.items[i].toServerJSONObject()); + } + + obj.items = items; + } + + return obj; + } + /** + * @function ThemeUnique.fromObj + * @description 从传入对象获取单值专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeUnique} ThemeUnique 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeUnique(); + var uItems = obj.items; + var len = uItems ? uItems.length : 0; + Util.extend(res, obj); + res.items = []; + res.defaultStyle = ServerStyle.fromJson(obj.defaultStyle); + + for (var i = 0; i < len; i++) { + res.items.push(ThemeUniqueItem.fromObj(uItems[i])); + } + + return res; + } + }]); + + return ThemeUnique; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphAxes.js +function ThemeGraphAxes_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraphAxes_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraphAxes_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraphAxes_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraphAxes_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGraphAxes + * @deprecatedclass SuperMap.ThemeGraphAxes + * @category iServer Map Theme + * @classdesc 统计专题图坐标轴样式类。 + * @param {Object} options - 参数。 + * @param {ServerColor} [options.axesColor=(0, 0, 0)] - 坐标轴颜色。 + * @param {boolean} [options.axesDisplayed=false] - 是否显示坐标轴。 + * @param {boolean} [options.axesGridDisplayed=false] - 是否在统计图坐标轴上显示网格。 + * @param {boolean} [options.axesTextDisplayed=false] - 是否显示坐标轴的文本标注。 + * @param {ServerTextStyle} [options.axesTextStyle] - 统计符号的最大最小尺寸。 + * @usage + */ + +var ThemeGraphAxes = /*#__PURE__*/function () { + function ThemeGraphAxes(options) { + ThemeGraphAxes_classCallCheck(this, ThemeGraphAxes); + + /** + * @member {ServerColor} [ThemeGraphAxes.prototype.axesColor=(0, 0, 0)] + * @description 坐标轴颜色。当 axesDisplayed = true 时有效。 + */ + this.axesColor = new ServerColor(0, 0, 0); + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesDisplayed=false] + * @description 是否显示坐标轴。
+ * 由于饼状图和环状图无坐标轴,故该属性以及所有与坐标轴设置相关的属性都不适用于它们。并且只有当该值为 true 时,其它设置坐标轴的属性才起作用。 + */ + + this.axesDisplayed = false; + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesGridDisplayed=false] + * @description 是否在统计图坐标轴上显示网格。 + */ + + this.axesGridDisplayed = false; + /** + * @member {boolean} [ThemeGraphAxes.prototype.axesTextDisplayed=false] + * @description 是否显示坐标轴的文本标注。 + */ + + this.axesTextDisplayed = false; + /** + * @member {ServerTextStyle} ThemeGraphAxes.prototype.axesTextStyle + * @description 坐标轴文本风格。当 axesTextDisplayed = true 时有效。 + */ + + this.axesTextStyle = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphAxes"; + } + /** + * @function ThemeGraphAxes.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraphAxes_createClass(ThemeGraphAxes, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.axesColor) { + me.axesColor.destroy(); + me.axesColor = null; + } + + me.axesDisplayed = null; + me.axesGridDisplayed = null; + me.axesTextDisplayed = null; + + if (me.axesTextStyle) { + me.axesTextStyle.destroy(); + me.axesTextStyle = null; + } + } + /** + * @function ThemeGraphAxes.fromObj + * @description 从传入对象获取统计专题图坐标轴样式类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphAxes} ThemeGraphAxes 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGraphAxes(); + Util.copy(res, obj); + res.axesColor = ServerColor.fromJson(obj.axesColor); + res.axesTextStyle = ServerTextStyle.fromObj(obj.axesTextStyle); + return res; + } + }]); + + return ThemeGraphAxes; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphSize.js +function ThemeGraphSize_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraphSize_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraphSize_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraphSize_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraphSize_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeGraphSize + * @deprecatedclass SuperMap.ThemeGraphSize + * @category iServer Map Theme + * @classdesc 统计专题图符号尺寸类。 + * @param {Object} options - 参数。 + * @param {number} [options.maxGraphSize=0] - 统计图中显示的最大图表尺寸基准值。 + * @param {number} [options.minGraphSize=0] - 统计图中显示的最小图表尺寸基准值。 + * @usage + */ + +var ThemeGraphSize = /*#__PURE__*/function () { + function ThemeGraphSize(options) { + ThemeGraphSize_classCallCheck(this, ThemeGraphSize); + + /** + * @member {number} [ThemeGraphSize.prototype.maxGraphSize=0] + * @description 获取或设置统计图中显示的最大图表尺寸基准值,单位为像素。 + */ + this.maxGraphSize = 0; + /** + * @member {number} [ThemeGraphSize.prototype.minGraphSize=0] + * @description 获取或设置统计图中显示的最小图表尺寸基准值,单位为像素。 + */ + + this.minGraphSize = 0; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphSize"; + } + /** + * @function ThemeGraphSize.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraphSize_createClass(ThemeGraphSize, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.maxGraphSize = null; + me.minGraphSize = null; + } + /** + * @function ThemeGraphSize.fromObj + * @description 从传入对象获统计专题图符号尺寸类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphSize} ThemeGraphSize 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeGraphSize(); + Util.copy(res, obj); + return res; + } + }]); + + return ThemeGraphSize; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphText.js +function ThemeGraphText_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraphText_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraphText_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraphText_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraphText_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeGraphText + * @deprecatedclass SuperMap.ThemeGraphText + * @category iServer Map Theme + * @classdesc 统计图文字标注风格类。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.graphTextDisplayed=false] - 是否显示统计图上的文字标注。 + * @param {ThemeGraphTextFormat} [options.graphTextFormat=ThemeGraphTextFormat.CAPTION] - 统计专题图文本显示格式。 + * @param {ServerTextStyle} [options.graphTextStyle] - 统计图上的文字标注风格。 + * @usage + */ + +var ThemeGraphText = /*#__PURE__*/function () { + function ThemeGraphText(options) { + ThemeGraphText_classCallCheck(this, ThemeGraphText); + + /** + * @member {boolean} [ThemeGraphText.prototype.graphTextDisplayed=false] + * @description 是否显示统计图上的文字标注。 + */ + this.graphTextDisplayed = false; + /** + * @member {ThemeGraphTextFormat} [ThemeGraphText.prototype.graphTextFormat=ThemeGraphTextFormat.CAPTION] + * @description 统计专题图文本显示格式。 + * 文本显示格式包括百分数、真实数值、标题、标题+百分数、标题+真实数值。 + */ + + this.graphTextFormat = ThemeGraphTextFormat.CAPTION; + /** + * @member {ServerTextStyle} ThemeGraphText.prototype.graphTextStyle + * @description 统计图上的文字标注风格。 + */ + + this.graphTextStyle = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphText"; + } + /** + * @function ThemeGraphText.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraphText_createClass(ThemeGraphText, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.graphTextDisplayed = null; + me.graphTextFormat = null; + + if (me.graphTextStyle) { + me.graphTextStyle.destroy(); + me.graphTextStyle = null; + } + } + /** + * @function ThemeGraphText.fromObj + * @description 从传入对象获取统计图文字标注风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphText} ThemeGraphText 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeGraphText(); + Util.copy(res, obj); + res.graphTextStyle = ServerTextStyle.fromObj(obj.graphTextStyle); + return res; + } + }]); + + return ThemeGraphText; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraphItem.js +function ThemeGraphItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraphItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraphItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraphItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraphItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeGraphItem + * @deprecatedclass SuperMap.ThemeGraphItem + * @category iServer Map Theme + * @classdesc 统计专题图子项类。 + * @param {Object} options - 参数。 + * @param {string} [options.caption] - 专题图子项的名称。 + * @param {string} options.graphExpression - 统计专题图的专题变量。 + * @param {Array.} [options.memoryDoubleValues] - 内存数组方式制作专题图时的值数组。 + * @param {ServerStyle} [options.uniformStyle] - 统计专题图子项的显示风格 + * @usage + */ + +var ThemeGraphItem = /*#__PURE__*/function () { + function ThemeGraphItem(options) { + ThemeGraphItem_classCallCheck(this, ThemeGraphItem); + + /** + * @member {string} [ThemeGraphItem.prototype.caption] + * @description 专题图子项的名称。 + */ + this.caption = null; + /** + * @member {string} ThemeGraphItem.prototype.graphExpression + * @description 统计专题图的专题变量。专题变量可以是一个字段或字段表达式。字段必须为数值型;表达式只能为数值型的字段间的运算。 + */ + + this.graphExpression = null; + /** + * @member {Array.} [ThemeGraphItem.prototype.memoryDoubleValues] + * @description 内存数组方式制作专题图时的值数组。
+ * 内存数组方式制作专题图时,只对 SmID 值在键数组({@link ThemeGraph#memoryKeys})中的记录制作专题图。 + * 值数组的数值个数必须与键数组中数值的个数一致。 值数组中的值将代替原来的专题值来制作统计专题图。 + * 比如:利用面积字段和周长字段(即有两个统计专题图子项 )作为专题变量制作统计专题图。 + */ + + this.memoryDoubleValues = null; + /** + * @member {ServerStyle} [ThemeGraphItem.prototype.uniformStyle] + * @description 统计专题图子项的显示风格。 + * 每一个统计专题图子项都对应一种显示风格。 + */ + + this.uniformStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraphItem"; + } + /** + * @function ThemeGraphItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraphItem_createClass(ThemeGraphItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.graphExpression = null; + me.memoryDoubleValues = null; + me.uniformStyle = null; + } + /** + * @function ThemeGraphItem.fromObj + * @description 从传入对象获取统计专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraphItem} ThemeGraphItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGraphItem(); + Util.copy(res, obj); + res.uniformStyle = ServerStyle.fromJson(obj.uniformStyle); + return res; + } + }]); + + return ThemeGraphItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraph.js +function ThemeGraph_typeof(obj) { "@babel/helpers - typeof"; return ThemeGraph_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeGraph_typeof(obj); } + +function ThemeGraph_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraph_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraph_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraph_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraph_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeGraph_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeGraph_get = Reflect.get; } else { ThemeGraph_get = function _get(target, property, receiver) { var base = ThemeGraph_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeGraph_get.apply(this, arguments); } + +function ThemeGraph_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeGraph_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeGraph_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeGraph_setPrototypeOf(subClass, superClass); } + +function ThemeGraph_setPrototypeOf(o, p) { ThemeGraph_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeGraph_setPrototypeOf(o, p); } + +function ThemeGraph_createSuper(Derived) { var hasNativeReflectConstruct = ThemeGraph_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeGraph_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeGraph_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeGraph_possibleConstructorReturn(this, result); }; } + +function ThemeGraph_possibleConstructorReturn(self, call) { if (call && (ThemeGraph_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeGraph_assertThisInitialized(self); } + +function ThemeGraph_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeGraph_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeGraph_getPrototypeOf(o) { ThemeGraph_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeGraph_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ThemeGraph + * @deprecatedclass SuperMap.ThemeGraph + * @category iServer Map Theme + * @classdesc 统计专题图类。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 统计专题图子项集合。 + * @param {number} [options.barWidth=0] - 柱状专题图中每一个柱的宽度。 + * @param {GraduatedMode} [options.graduatedMode=GraduatedMode.CONSTANT] - 统计图中地理要素的值与图表尺寸间的映射关系。 + * @param {ThemeGraphAxes} [options.graphAxes] - 统计图中坐标轴样式相关信息。 + * @param {ThemeGraphSize} [options.graphSize=0] - 统计符号的最大最小尺寸。 + * @param {boolean} [options.graphSizeFixed=false] - 缩放地图时统计图符号是否固定大小。 + * @param {ThemeGraphText} [options.graphText] - 统计图上的文字是否可以见以及文字标注风格。 + * @param {GraphAxesTextDisplayMode} [options.graphAxesTextDisplayMode=GraphAxesTextDisplayMode.NONE] - 统计专题图坐标轴文本显示模式。 + * @param {ThemeGraphType} [options.graphType=ThemeGraphType.AREA] - 统计专题图类型。 + * @param {Array.} [options.memoryKeys] - 以内存数组方式制作专题图时的键数组。 + * @param {boolean} [options.negativeDisplayed=false] - 专题图中是否显示属性为负值的数据。 + * @param {ThemeOffset} [options.offset] - 统计图相对于要素内点的偏移量。 + * @param {boolean} [options.overlapAvoided=true] - 统计图是否采用避让方式显示。 + * @param {number} [options.roseAngle=0] - 统计图中玫瑰图或三维玫瑰图用于等分的角度。 + * @param {number} [options.startAngle=0] - 饼状统计图扇形的起始角度。 + * @usage + */ + +var ThemeGraph = /*#__PURE__*/function (_Theme) { + ThemeGraph_inherits(ThemeGraph, _Theme); + + var _super = ThemeGraph_createSuper(ThemeGraph); + + function ThemeGraph(options) { + var _this; + + ThemeGraph_classCallCheck(this, ThemeGraph); + + _this = _super.call(this, "GRAPH", options); + /** + * @member {number} [ThemeGraph.prototype.barWidth=0] + * @description 柱状专题图中每一个柱的宽度。使用地图坐标单位。 + * 只有选择的统计图类型为柱状图(柱状图、三维柱状图、堆叠柱状图、三维堆叠柱状图)时,此项才可设置。 + */ + + _this.barWidth = 0; + /** + * @member {GraduatedMode} [ThemeGraph.prototype.graduatedMode=GraduatedMode.CONSTANT] + * @description 统计图中地理要素的值与图表尺寸间的映射关系(常数、对数、平方根),即分级方式。 + * 分级主要是为了减少制作统计专题图中数据大小之间的差异,使得统计图的视觉效果比较好,同时不同类别之间的比较也还是有意义的。 + * 提供三种分级模式:常数、对数和平方根,对于有值为负数的字段,不可以采用对数和平方根的分级方式。不同的等级方式用于确定符号大小的数值是不相同的。 + */ + + _this.graduatedMode = GraduatedMode.CONSTANT; + /** + * @member {ThemeGraphAxes} ThemeGraph.prototype.graphAxes + * @description 用于设置统计图中坐标轴样式相关信息,如坐标轴颜色、是否显示、坐标文本样式等。 + */ + + _this.graphAxes = new ThemeGraphAxes(); + /** + * @member {ThemeGraphSize} [ThemeGraph.prototype.graphSize=0] + * @description 用于设置统计符号的最大最小尺寸。 + */ + + _this.graphSize = new ThemeGraphSize(); + /** + * @member {boolean} [ThemeGraph.prototype.graphSizeFixed=false] + * @description 缩放地图时统计图符号是否固定大小。即统计图符号将随地图缩放。 + */ + + _this.graphSizeFixed = false; + /** + * @member {ThemeGraphText} ThemeGraph.prototype.graphText + * @description 统计图上的文字是否可以见以及文字标注风格。 + */ + + _this.graphText = new ThemeGraphText(); + /** + * @member {ThemeGraphType} [ThemeGraph.prototype.graphType=ThemeGraphType.AREA] + * @description 统计专题图类型。SuperMap 提供了多种类型的统计图, + * 分别为面积图、阶梯图、折线图、点状图、柱状图、三维柱状图、饼图、三维饼图、玫瑰图、三维玫瑰图、堆叠柱状图、三维堆叠柱状图、环状图。默认为面积图。 + */ + + _this.graphType = ThemeGraphType.AREA; + /** + * @member {GraphAxesTextDisplayMode} [ThemeGraph.prototype.graphAxesTextDisplayMode=GraphAxesTextDisplayMode.NONE] + * @description 统计专题图坐标轴文本显示模式。 + */ + + _this.graphAxesTextDisplayMode = GraphAxesTextDisplayMode.NONE; + /** + * @member {Array.} ThemeGraph.prototype.items + * @description 统计专题图子项集合。 + * 统计专题图可以基于多个变量,反映多种属性,即可以将多个专题变量的值绘制在一个统计图上。每一个专题变量对应的统计图即为一个专题图子项。 + * 对于每个专题图子项可以为其设置标题、风格,甚至可以将该子项再制作成范围分段专题图。 + */ + + _this.items = null; + /** + * @member {Array.} ThemeGraph.prototype.memoryKeys + * @description 以内存数组方式制作专题图时的键数组。 + * 键数组内的数值代表 SmID 值,它与 {@link ThemeGraphItem} 类中的值数组({@link ThemeGraphItem#memoryDoubleValues})要关联起来应用。 + * 键数组中数值的个数必须要与值数组的数值个数一致。值数组中的值将代替原来的专题值来制作统计专题图。 + * 目前所有的专题图都支持以内存数组的方式制作专题图,但统计专题图与其他专题图指定内存数组的方式不同, + * 统计专题图使用 memoryKeys 指定内存数组,而其他专题图则使用 memoryData 来指定内存数组。 + * @example + * memoryKeys 的使用方法如下: + * function addThemeGraph() { + * removeTheme(); + * //创建统计专题图对象,ThemeGraph 必设 items。 + * //专题图参数 ThemeParameters 必设 theme(即以设置好的分段专题图对象)、dataSourceName 和 datasetName + * var style1 = new ServerStyle({ + * fillForeColor: new ServerColor(92,73,234), + * lineWidth: 0.1 + * }), + * style2 = new ServerStyle({ + * fillForeColor: new ServerColor(211,111,240), + * lineWidth: 0.1 + * }), + * item1 = new ThemeGraphItem({ + * memoryDoubleValues:[1.18,0.95,0.37,1.31,0.8,1.5], + * caption: "1992-1995人口增长率", + * graphExpression: "Pop_Rate95", + * uniformStyle: style1 + * }), + * item2 = new ThemeGraphItem({ + * //以内存数组方式制作专题图时的值数组 + * memoryDoubleValues:[2.71,0,0.74,3.1,2.2,3.5], + * caption: "1995-1999人口增长率", //专题图子项的名称 + * graphExpression: "Pop_Rate99", //统计专题图的专题变量 + * uniformStyle: style2 //统计专题图子项的显示风格 + * }), + * themeGraph = new ThemeGraph({ + * //以内存数组方式制作专题图时的键数组,键数组内的数值代表 SmID 值 + * memoryKeys:[1,2,4,8,10,12], + * items: new Array(item1,item2), + * barWidth: 0.03, + * //统计图中地理要素的值与图表尺寸间的映射关系为平方根 + * graduatedMode: GraduatedMode.SQUAREROOT, + * //graphAxes用于设置统计图中坐标轴样式相关信息 + * graphAxes: new ThemeGraphAxes({ + * axesDisplayed: true + * }), + * graphSize: new ThemeGraphSize({ + * maxGraphSize: 1, + * minGraphSize: 0.35 + * }), + * //统计图上的文字是否可以见以及文字标注风格 + * graphText: new ThemeGraphText({ + * graphTextDisplayed: true, + * graphTextFormat: ThemeGraphTextFormat.VALUE, + * graphTextStyle: new ServerTextStyle({ + * sizeFixed: true, + * fontHeight: 9, + * fontWidth: 5 + * }) + * }), + * //统计专题图类型为三维柱状图 + * graphType: ThemeGraphType.BAR3D + * }), + * //专题图参数对象 + * themeParameters = new ThemeParameters({ + * themes: [themeGraph], + * dataSourceNames: ["Jingjin"], + * datasetNames: ["BaseMap_R"] + * }), + * //与服务端交互 + * themeService=new ThemeService(url, { + * eventListeners: { + * "processCompleted": ThemeCompleted, + * "processFailed": themeFailed + * } + * }); + * themeService.processAsync(themeParameters); + * } + */ + + _this.memoryKeys = null; + /** + * @member {boolean} [ThemeGraph.prototype.negativeDisplayed=false] + * @description 专题图中是否显示属性为负值的数据。true 表示显示;falese 不显示。 + */ + + _this.negativeDisplayed = false; + /** + * @member {ThemeOffset} ThemeGraph.prototype.offset + * @description 用于设置统计图相对于要素内点的偏移量。 + */ + + _this.offset = new ThemeOffset(); + /** + * @member {boolean} ThemeGraph.prototype.overlapAvoided + * @description 统计图是否采用避让方式显示。
+ * 1.对数据集制作统计专题图:当统计图采用避让方式显示时,如果 overlapAvoided 为 true,则在统计图重叠度很大的情况下, + * 会出现无法完全避免统计图重叠的现象;如果 overlapAvoided 为 false,会过滤掉一些统计图,从而保证所有的统计图均不重叠。
+ * 2.对数据集同时制作统计专题图和标签专题图:当统计图不显示子项文本时,标签专题图的标签即使和统计图重叠,两者也都可正常显示; + * 当统计图显示子项文本时,如果统计图中的子项文本和标签专题图中的标签不重叠,则两者均正常显示;如果重叠,则会过滤掉统计图的子项文本,只显示标签。 + */ + + _this.overlapAvoided = true; + /** + * @member {number} [ThemeGraph.prototype.roseAngle=0] + * @description 统计图中玫瑰图或三维玫瑰图用于等分的角度,默认为 0 度,精确到 0.1 度。在角度为0或者大于 360 度的情况下均使用 360 度来等分制作统计图的字段数。 + */ + + _this.roseAngle = 0; + /** + * @member {number} [ThemeGraph.prototype.startAngle=0] + * @description 饼状统计图扇形的起始角度。精确到 0.1 度,以水平方向为正向。只有选择的统计图类型为饼状图(饼图、三维饼图、玫瑰图、三维玫瑰图)时,此项才可设置。 + */ + + _this.startAngle = 0; + + if (options) { + Util.extend(ThemeGraph_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeGraph"; + return _this; + } + /** + * @function ThemeGraph.prototype.destroy + * @override + */ + + + ThemeGraph_createClass(ThemeGraph, [{ + key: "destroy", + value: function destroy() { + ThemeGraph_get(ThemeGraph_getPrototypeOf(ThemeGraph.prototype), "destroy", this).call(this); + + var me = this; + me.barWidth = null; + me.graduatedMode = null; + + if (me.graphAxes) { + me.graphAxes.destroy(); + me.graphAxes = null; + } + + if (me.graphSize) { + me.graphSize.destroy(); + me.graphSize = null; + } + + me.graphSizeFixed = null; + + if (me.graphText) { + me.graphText.destroy(); + me.graphText = null; + } + + me.graphType = null; + + if (me.items) { + for (var i = 0, items = me.items, len = items.length; i < len; i++) { + items[i].destroy(); + } + + me.items = null; + } + + me.memoryKeys = null; + me.negativeDisplayed = null; + + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + + me.overlapAvoided = null; + me.roseAngle = null; + me.startAngle = null; + me.graphAxesTextDisplayMode = null; + } + /** + * @function ThemeGraph.prototype.toJSON + * @description 将 ThemeGraph 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + /** + * @function ThemeGraph.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj.type = this.type; + + if (this.graphText) { + obj.graphTextDisplayed = this.graphText.graphTextDisplayed; + obj.graphTextFormat = this.graphText.graphTextFormat; + obj.graphTextStyle = this.graphText.graphTextStyle; + } + + if (this.graphAxes) { + obj.axesColor = this.graphAxes.axesColor; + obj.axesDisplayed = this.graphAxes.axesDisplayed; + obj.axesGridDisplayed = this.graphAxes.axesGridDisplayed; + obj.axesTextDisplayed = this.graphAxes.axesTextDisplayed; + obj.axesTextStyle = this.graphAxes.axesTextStyle; + } + + if (this.graphSize) { + obj.maxGraphSize = this.graphSize.maxGraphSize; + obj.minGraphSize = this.graphSize.minGraphSize; + } + + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + + obj.barWidth = this.barWidth; + obj.graduatedMode = this.graduatedMode; + obj.graphSizeFixed = this.graphSizeFixed; + obj.graphType = this.graphType; + obj.graphAxesTextDisplayMode = this.graphAxesTextDisplayMode; + obj.items = this.items; + obj.memoryKeys = this.memoryKeys; + obj.negativeDisplayed = this.negativeDisplayed; + obj.overlapAvoided = this.overlapAvoided; + obj.roseAngle = this.roseAngle; + obj.startAngle = this.startAngle; + return obj; + } + /** + * @function ThemeGraph.fromObj + * @description 从传入对象获取统计专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraph} ThemeGraph 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeGraph(); + var itemsG = obj.items; + var len = itemsG ? itemsG.length : 0; + Util.copy(res, obj); + res.items = []; + res.graphAxes = ThemeGraphAxes.fromObj(obj); + res.graphSize = ThemeGraphSize.fromObj(obj); + res.graphText = ThemeGraphText.fromObj(obj); + res.offset = ThemeOffset.fromObj(obj); + + for (var i = 0; i < len; i++) { + res.items.push(ThemeGraphItem.fromObj(itemsG[i])); + } + + return res; + } + }]); + + return ThemeGraph; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeDotDensity.js +function ThemeDotDensity_typeof(obj) { "@babel/helpers - typeof"; return ThemeDotDensity_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeDotDensity_typeof(obj); } + +function ThemeDotDensity_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeDotDensity_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeDotDensity_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeDotDensity_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeDotDensity_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeDotDensity_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeDotDensity_setPrototypeOf(subClass, superClass); } + +function ThemeDotDensity_setPrototypeOf(o, p) { ThemeDotDensity_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeDotDensity_setPrototypeOf(o, p); } + +function ThemeDotDensity_createSuper(Derived) { var hasNativeReflectConstruct = ThemeDotDensity_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeDotDensity_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeDotDensity_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeDotDensity_possibleConstructorReturn(this, result); }; } + +function ThemeDotDensity_possibleConstructorReturn(self, call) { if (call && (ThemeDotDensity_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeDotDensity_assertThisInitialized(self); } + +function ThemeDotDensity_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeDotDensity_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeDotDensity_getPrototypeOf(o) { ThemeDotDensity_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeDotDensity_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeDotDensity + * @deprecatedclass SuperMap.ThemeDotDensity + * @category iServer Map Theme + * @classdesc 点密度专题图。点密度专题图用一定大小、形状相同的点表示现象分布范围、数量特征和分布密度。点的多少和所代表的意义由地图的内容确定。 + * 点密度专题图利用图层的某一数值属性信息(专题值)映射为不同等级,每一级别使用不同数量或表现为密度的点符号来表示。 + * 该专题值在各个分区内的分布情况,体现不同区域的相对数量差异。多用于具有数量特征的地图上, + * 比如表示不同地区的粮食产量、GDP、人口等的分级,主要针对区域或面状的要素,因而,点密度专题图适用于面数据集。 + * 注意:点密度专题图中点的分布是随机的,并不代表实际的分布位置。即使在相关设置完全相同的情况下, + * 每次制作出的专题图,点的数量相同,但点的位置都有差异。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {string} options.dotExpression - 创建点密度专题图的字段或字段表达式。 + * @param {ServerStyle} [options.style] - 点密度专题图中点的风格。 + * @param {number} [options.value] - 专题图中每一个点所代表的数值。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var ThemeDotDensity = /*#__PURE__*/function (_Theme) { + ThemeDotDensity_inherits(ThemeDotDensity, _Theme); + + var _super = ThemeDotDensity_createSuper(ThemeDotDensity); + + function ThemeDotDensity(options) { + var _this; + + ThemeDotDensity_classCallCheck(this, ThemeDotDensity); + + _this = _super.call(this, "DOTDENSITY", options); + /** + * @member {string} ThemeDotDensity.prototype.dotExpression + * @description 创建点密度专题图的字段或字段表达式。点的数目或密集程度的来源。 + */ + + _this.dotExpression = null; + /** + * @member {ServerStyle} ThemeDotDensity.prototype.style + * @description 点密度专题图中点的风格。 + */ + + _this.style = new ServerStyle(); + /** + * @member {number} ThemeDotDensity.prototype.value + * @description 专题图中每一个点所代表的数值。
+ * 点值的确定与地图比例尺以及点的大小有关。地图比例尺越大,相应的图面范围也越大, + * 点相应就可以越多,此时点值就可以设置相对小一些。点形状越大, + * 点值相应就应该设置的小一些。点值过大或过小都是不合适的。 + */ + + _this.value = null; + + if (options) { + Util.extend(ThemeDotDensity_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeDotDensity"; + return _this; + } + /** + * @function ThemeDotDensity.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeDotDensity_createClass(ThemeDotDensity, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dotExpression = null; + me.value = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + } + /** + * @function ThemeDotDensity.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + + return obj; + } + /** + * @function ThemeDotDensity.fromObj + * @description 从传入对象获取点密度专题图中点的风格。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeDotDensity} ThemeDotDensity 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeDotDensity(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + } + }]); + + return ThemeDotDensity; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraduatedSymbolStyle.js +function ThemeGraduatedSymbolStyle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraduatedSymbolStyle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraduatedSymbolStyle_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraduatedSymbolStyle_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraduatedSymbolStyle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeGraduatedSymbolStyle + * @deprecatedclass SuperMap.ThemeGraduatedSymbolStyle + * @category iServer Map Theme + * @classdesc 等级符号专题图正负零值显示风格类。 + * @param {Object} options - 参数。 + * @param {boolean} [options.negativeDisplayed=false] - 是否显示负值。 + * @param {ServerStyle} [options.negativeStyle] - 负值的等级符号风格。 + * @param {ServerStyle} [options.positiveStyle] - 正值的等级符号风格。 + * @param {boolean} [options.zeroDisplayed=false] - 是否显示 0 值。 + * @param {ServerStyle} [options.zeroStyle] - 0 值的等级符号风格。 + * @usage + */ + +var ThemeGraduatedSymbolStyle = /*#__PURE__*/function () { + function ThemeGraduatedSymbolStyle(options) { + ThemeGraduatedSymbolStyle_classCallCheck(this, ThemeGraduatedSymbolStyle); + + /** + * @member {boolean} [ThemeGraduatedSymbolStyle.prototype.negativeDisplayed=false] + * @description 是否显示负值。 + */ + this.negativeDisplayed = false; + /** + * @member {ServerStyle} [ThemeGraduatedSymbolStyle.prototype.negativeStyle] + * @description 负值的等级符号风格。 + */ + + this.negativeStyle = new ServerStyle(); + /** + * @member {ServerStyle} [ThemeGraduatedSymbolStyle.prototype.positiveStyle] + * @description 正值的等级符号风格。 + */ + + this.positiveStyle = new ServerStyle(); + /** + * @member {boolean} [ThemeGraduatedSymbolStyle.prototype.zeroDisplayed=false] + * @description 是否显示 0 值。 + */ + + this.zeroDisplayed = false; + /** + * @member {ServerStyle} ThemeGraduatedSymbolStyle.prototype.zeroStyle + * @description 0 值的等级符号风格。 + */ + + this.zeroStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGraduatedSymbolStyle"; + } + /** + * @function ThemeGraduatedSymbolStyle.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraduatedSymbolStyle_createClass(ThemeGraduatedSymbolStyle, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.negativeDisplayed = null; + me.negativeStyle = null; + me.positiveStyle = null; + me.zeroDisplayed = null; + me.zeroStyle = null; + } + /** + * @function ThemeGraduatedSymbolStyle.fromObj + * @description 从传入对象获取等级符号专题图正负零值显示风格类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraduatedSymbolStyle} ThemeGraduatedSymbolStyle 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGraduatedSymbolStyle(); + Util.copy(res, obj); + res.negativeStyle = ServerStyle.fromJson(obj.negativeStyle); + res.positiveStyle = ServerStyle.fromJson(obj.positiveStyle); + res.zeroStyle = ServerStyle.fromJson(obj.zeroStyle); + return res; + } + }]); + + return ThemeGraduatedSymbolStyle; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGraduatedSymbol.js +function ThemeGraduatedSymbol_typeof(obj) { "@babel/helpers - typeof"; return ThemeGraduatedSymbol_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeGraduatedSymbol_typeof(obj); } + +function ThemeGraduatedSymbol_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGraduatedSymbol_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGraduatedSymbol_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGraduatedSymbol_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGraduatedSymbol_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeGraduatedSymbol_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeGraduatedSymbol_get = Reflect.get; } else { ThemeGraduatedSymbol_get = function _get(target, property, receiver) { var base = ThemeGraduatedSymbol_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeGraduatedSymbol_get.apply(this, arguments); } + +function ThemeGraduatedSymbol_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeGraduatedSymbol_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeGraduatedSymbol_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeGraduatedSymbol_setPrototypeOf(subClass, superClass); } + +function ThemeGraduatedSymbol_setPrototypeOf(o, p) { ThemeGraduatedSymbol_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeGraduatedSymbol_setPrototypeOf(o, p); } + +function ThemeGraduatedSymbol_createSuper(Derived) { var hasNativeReflectConstruct = ThemeGraduatedSymbol_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeGraduatedSymbol_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeGraduatedSymbol_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeGraduatedSymbol_possibleConstructorReturn(this, result); }; } + +function ThemeGraduatedSymbol_possibleConstructorReturn(self, call) { if (call && (ThemeGraduatedSymbol_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeGraduatedSymbol_assertThisInitialized(self); } + +function ThemeGraduatedSymbol_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeGraduatedSymbol_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeGraduatedSymbol_getPrototypeOf(o) { ThemeGraduatedSymbol_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeGraduatedSymbol_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ThemeGraduatedSymbol + * @deprecatedclass SuperMap.ThemeGraduatedSymbol + * @category iServer Map Theme + * @classdesc 等级符号专题图。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {ThemeGraduatedSymbolStyle} options.style - 等级符号专题图正负零值显示风格类。 + * @param {string} options.expression - 等级符号专题图的字段或字段表达式。 + * @param {number} [options.baseValue=0] - 等级符号专题图的基准值,单位同专题变量的单位。 + * @param {GraduatedMode} [options.graduatedMode=GraduatedMode.CONSTANT] - 等级符号专题图分级模式。 + * @param {ThemeOffset} [options.offset] - 指定标签专题图中标记文本相对于要素内点的偏移量对象。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var ThemeGraduatedSymbol = /*#__PURE__*/function (_Theme) { + ThemeGraduatedSymbol_inherits(ThemeGraduatedSymbol, _Theme); + + var _super = ThemeGraduatedSymbol_createSuper(ThemeGraduatedSymbol); + + function ThemeGraduatedSymbol(options) { + var _this; + + ThemeGraduatedSymbol_classCallCheck(this, ThemeGraduatedSymbol); + + _this = _super.call(this, "GRADUATEDSYMBOL", options); + /** + * @member {number} [ThemeGraduatedSymbol.prototype.baseValue=0] + * @description 等级符号专题图的基准值,单位同专题变量的单位。
+ * 依据此值系统会自动根据分级方式计算其余值对应的符号大小,每个符号的显示大小等于 + * ThemeValueSection.positiveStyle(或 zeroStyle,negativeStyle).markerSize * value / basevalue, + * 其中 value 是 expression 所指定字段对应的值经过分级计算之后的值。默认值为0,建议通过多次尝试设置该值才能达到较好的显示效果。 + */ + + _this.baseValue = 0; + /** + * @member {string} ThemeGraduatedSymbol.prototype.expression + * @description 用于创建等级符号专题图的字段或字段表达式,字段或字段表达式应为数值型。 + */ + + _this.expression = null; + /** + * @member {GraduatedMode} [ThemeGraduatedSymbol.prototype.graduatedMode=GraduatedMode.CONSTANT] + * @description 等级符号专题图分级模式。
+ * 分级主要是为了减少制作等级符号专题图中数据大小之间的差异。如果数据之间差距较大,则可以采用对数或者平方根的分级方式来进行, + * 这样就减少了数据之间的绝对大小的差异,使得等级符号图的视觉效果比较好,同时不同类别之间的比较也是有意义的。 + * 有三种分级模式:常数、对数和平方根,对于有值为负数的字段,在用对数或平方根方式分级时,默认对负数取正。 + * 不同的分级模式用于确定符号大小的数值是不相同的:常数按照字段的原始数据进行;对数则是对每条记录对应的专题变量取自然对数; + * 平方根则是对其取平方根,然后用最终得到的结果来确定其等级符号的大小。 + */ + + _this.graduatedMode = GraduatedMode.CONSTAN; + /** + * @member {ThemeOffset} [ThemeGraduatedSymbol.prototype.offset] + * @description 用于设置等级符号图相对于要素内点的偏移量。 + */ + + _this.offset = new ThemeOffset(); + /** + * @member {ThemeGraduatedSymbolStyle} ThemeGraduatedSymbol.prototype.style + * @description 用于设置等级符号图正负和零值显示风格。 + */ + + _this.style = new ThemeGraduatedSymbolStyle(); + + if (options) { + Util.extend(ThemeGraduatedSymbol_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeGraduatedSymbol"; + return _this; + } + /** + * @function ThemeGraduatedSymbol.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGraduatedSymbol_createClass(ThemeGraduatedSymbol, [{ + key: "destroy", + value: function destroy() { + ThemeGraduatedSymbol_get(ThemeGraduatedSymbol_getPrototypeOf(ThemeGraduatedSymbol.prototype), "destroy", this).call(this); + + var me = this; + me.expression = null; + me.graduatedMode = GraduatedMode.CONSTANT; + + if (me.offset) { + me.offset.destroy(); + me.offset = null; + } + + if (me.style) { + me.style.destroy(); + me.style = null; + } + } + /** + * @function ThemeGraduatedSymbol.prototype.toJSON + * @description 将 themeLabel 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return Util.toJSON(this.toServerJSONObject()); + } + /** + * @function ThemeGraduatedSymbol.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj.type = this.type; + obj.memoryData = this.memoryData; + obj.baseValue = this.baseValue; + obj.expression = this.expression; + obj.graduatedMode = this.graduatedMode; + + if (this.offset) { + obj.offsetFixed = this.offset.offsetFixed; + obj.offsetX = this.offset.offsetX; + obj.offsetY = this.offset.offsetY; + } + + if (this.style) { + obj.negativeStyle = this.style.negativeStyle; + obj.negativeDisplayed = this.style.negativeDisplayed; + obj.positiveStyle = this.style.positiveStyle; + obj.zeroDisplayed = this.style.zeroDisplayed; + obj.zeroStyle = this.style.zeroStyle; + } + + return obj; + } + /** + * @function ThemeGraduatedSymbol.fromObj + * @description 从传入对象获取等级符号专题图。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGraduatedSymbol} 等级符号专题图对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGraduatedSymbol(); + Util.copy(res, obj); + res.offset = ThemeOffset.fromObj(obj); + res.style = ThemeGraduatedSymbolStyle.fromObj(obj); + return res; + } + }]); + + return ThemeGraduatedSymbol; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeRangeItem.js +function ThemeRangeItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeRangeItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeRangeItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeRangeItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeRangeItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeRangeItem + * @deprecatedclass SuperMap.ThemeRangeItem + * @category iServer Map Theme + * @classdesc 范围分段专题图子项类。在分段专题图中,字段值按照某种分段模式被分成多个范围段, + * 每个范围段即为一个子项,同一范围段的要素属于同一个分段专题图子项。 + * 每个子项都有其分段起始值、终止值、名称和风格等。每个分段所表示的范围为[start, end)。 + * @param {Object} options - 参数。 + * @param {string} [options.caption] - 子项的标题。 + * @param {number} [options.end=0] - 子项的终止值。 + * @param {number} [options.start=0] - 子项的起始值。 + * @param {ServerStyle} options.style - 子项的风格。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ + +var ThemeRangeItem = /*#__PURE__*/function () { + function ThemeRangeItem(options) { + ThemeRangeItem_classCallCheck(this, ThemeRangeItem); + + /** + * @member {string} [ThemeRangeItem.prototype.caption] + * @description 分段专题图子项的标题。 + */ + this.caption = null; + /** + * @member {number} [ThemeRangeItem.prototype.end=0] + * @description 分段专题图子项的终止值,即该段专题值范围的最大值。
+ * 如果该子项是分段中最后一个子项,则该终止值应大于分段字段(ThemeRange 类的 rangeExpression 属性)的最大值,若该终止值小于分段字段最大值, + * 则剩余部分由内部随机定义其颜色;如果不是最后一项,该终止值必须与其下一子项的起始值相同,否则系统抛出异常; + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按您设置的值对分段结果进行调整。 + */ + + this.end = 0; + /** + * @member {number} [ThemeRangeItem.prototype.start=0] + * @description 分段专题图子项的起始值,即该段专题值范围的最小值。
+ * 如果该子项是分段中第一个子项,那么该起始值就是分段的最小值;如果子项的序号大于等于 1 的时候,该起始值必须与前一子项的终止值相同,否则系统会抛出异常。 + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按您设置的值对分段结果进行调整。 + */ + + this.start = 0; + /** + * @member {ServerStyle} ThemeRangeItem.prototype.style + * @description 分段专题图子项的风格。 + * 每一个分段专题图子项都对应一种显示风格。 + */ + + this.style = new ServerStyle(); + /** + * @member {boolean} [ThemeRangeItem.prototype.visible=true] + * @description 分段专题图子项是否可见。 + */ + + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeRangeItem"; + } + /** + * @function ThemeRangeItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeRangeItem_createClass(ThemeRangeItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + + me.visible = null; + } + /** + * @function ThemeRangeItem.prototypetoServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.style) { + if (obj.style.toServerJSONObject) { + obj.style = obj.style.toServerJSONObject(); + } + } + + return obj; + } + /** + * @function ThemeRangeItem.fromObj + * @description 从传入对象获取范围分段专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeRangeItem} ThemeRangeItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeRangeItem(); + Util.copy(res, obj); + res.style = ServerStyle.fromJson(obj.style); + return res; + } + }]); + + return ThemeRangeItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeRange.js +function ThemeRange_typeof(obj) { "@babel/helpers - typeof"; return ThemeRange_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeRange_typeof(obj); } + +function ThemeRange_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeRange_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeRange_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeRange_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeRange_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeRange_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeRange_get = Reflect.get; } else { ThemeRange_get = function _get(target, property, receiver) { var base = ThemeRange_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeRange_get.apply(this, arguments); } + +function ThemeRange_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeRange_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeRange_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeRange_setPrototypeOf(subClass, superClass); } + +function ThemeRange_setPrototypeOf(o, p) { ThemeRange_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeRange_setPrototypeOf(o, p); } + +function ThemeRange_createSuper(Derived) { var hasNativeReflectConstruct = ThemeRange_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeRange_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeRange_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeRange_possibleConstructorReturn(this, result); }; } + +function ThemeRange_possibleConstructorReturn(self, call) { if (call && (ThemeRange_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeRange_assertThisInitialized(self); } + +function ThemeRange_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeRange_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeRange_getPrototypeOf(o) { ThemeRange_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeRange_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeRange + * @deprecatedclass SuperMap.ThemeRange + * @category iServer Map Theme + * @classdesc 范围分段专题图。 + * 范围分段专题图是按照指定的分段方法(如:等距离分段法)对字段的属性值进行分段,使用不同的颜色或符号(线型、填充)表示不同范围段落的属性值在整体上的分布情况,体现区域的差异。 + * 在分段专题图中,专题值按照某种分段方式被分成多个范围段,要素根据各自的专题值被分配到其中一个范围段中,在同一个范围段中的要素使用相同的颜色,填充,符号等风格进行显示。 + * 分段专题图所基于的专题变量必须为数值型,分段专题图一般用来反映连续分布现象的数量或程度特征,如降水量的分布,土壤侵蚀强度的分布等。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 子项数组。 + * @param {string} options.rangeExpression - 分段字段表达式。 + * @param {number} options.rangeParameter - 分段参数。 + * @param {number} options.rangeParameter - 分段参数。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 分段模式。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @param {ThemeMemoryData} [options.memoryData] - 专题图内存数据。 + * @usage + */ + +var ThemeRange = /*#__PURE__*/function (_Theme) { + ThemeRange_inherits(ThemeRange, _Theme); + + var _super = ThemeRange_createSuper(ThemeRange); + + function ThemeRange(options) { + var _this; + + ThemeRange_classCallCheck(this, ThemeRange); + + _this = _super.call(this, "RANGE", options); + /** + * @member {string} ThemeRange.prototype.precision + * @description 精准度 + */ + + _this.precision = '1.0E-12'; + /** + * @member {Array.} ThemeRange.prototype.items + * @description 分段专题图子项数组。
+ * 在分段专题图中,字段值按照某种分段模式被分成多个范围段,每个范围段即为一个子项,同一范围段的要素属于同一个分段专题图子项。 + * 每个子项都有其分段起始值、终止值、名称和风格等。每个分段所表示的范围为 [start, end)。 + * 如果设置了范围分段模式和分段数,则会自动计算每段的范围 [start, end),故无需设置 [start, end);当然可以设置,那么结果就会按照您设置的值对分段结果进行调整。 + */ + + _this.items = null; + /** + * @member {string} ThemeRange.prototype.rangeExpression + * @description 分段字段表达式。
+ * 由于范围分段专题图基于各种分段方法根据一定的距离进行分段,因而范围分段专题图所基于的字段值的数据类型必须为数值型。对于字段表达式,只能为数值型的字段间的运算。 + */ + + _this.rangeExpression = null; + /** + * @member {RangeMode} [ThemeRange.prototype.rangeMode=RangeMode.EQUALINTERVAL] + * @description 分段专题图的分段模式。
+ * 在分段专题图中,作为专题变量的字段或表达式的值按照某种分段方式被分成多个范围段。 + * 目前 SuperMap 提供的分段方式包括:等距离分段法、平方根分段法、标准差分段法、对数分段法、等计数分段法和自定义距离法, + * 显然这些分段方法根据一定的距离进行分段,因而范围分段专题图所基于的专题变量必须为数值型。 + */ + + _this.rangeMode = RangeMode.EQUALINTERVAL; + /** + * @member {number} ThemeRange.prototype.rangeParameter + * @description 分段参数。 + * 当分段模式为等距离分段法,平方根分段,对数分段法,计数分段法其中一种模式时,该参数用于设置分段个数;当分段模式为标准差分段法时, + * 该参数不起作用;当分段模式为自定义距离时,该参数用于设置自定义距离。 + */ + + _this.rangeParameter = 0; + /** + * @member {ColorGradientType} [ThemeRange.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。
+ * 渐变色是由起始色根据一定算法逐渐过渡到终止色的一种混合型颜色。 + * 该类作为单值专题图参数类、分段专题图参数类的属性,负责设置单值专题图、分段专题图的配色方案,在默认情况下专题图所有子项会根据这个配色 + * 方案完成填*充。但如果为某几个子项的风格进行单独设置后(设置了 {@link ThemeUniqueItem} 或 {@link ThemeRangeItem} 类中Style属性), + * 该配色方案对于这几个子项将不起作用。 + */ + + _this.colorGradientType = ColorGradientType.YELLOW_RED; + + if (options) { + Util.extend(ThemeRange_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeRange"; + return _this; + } + /** + * @function ThemeRange.prototype.destroy + * @override + */ + + + ThemeRange_createClass(ThemeRange, [{ + key: "destroy", + value: function destroy() { + ThemeRange_get(ThemeRange_getPrototypeOf(ThemeRange.prototype), "destroy", this).call(this); + + var me = this; + + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + + me.items = null; + } + + me.rangeExpression = null; + me.rangeMode = null; + me.rangeParameter = null; + me.colorGradientType = null; + } + /** + * @function ThemeRange.fromObj + * @description 从传入对象获取范围分段专题图类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeRange} ThemeRange 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeRange(); + Util.copy(res, obj); + var itemsR = obj.items; + var len = itemsR ? itemsR.length : 0; + res.items = []; + + for (var i = 0; i < len; i++) { + res.items.push(ThemeRangeItem.fromObj(itemsR[i])); + } + + return res; + } + }]); + + return ThemeRange; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/UGCLayer.js +function UGCLayer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UGCLayer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UGCLayer_createClass(Constructor, protoProps, staticProps) { if (protoProps) UGCLayer_defineProperties(Constructor.prototype, protoProps); if (staticProps) UGCLayer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UGCLayer + * @deprecatedclass SuperMap.UGCLayer + * @category iServer Map Layer + * @classdesc SuperMap 图层类。 + * @param {Object} options - 参数。 + * @param {Bounds} options.bounds - 图层范围。 + * @param {string} options.name - 图层的名称。 + * @param {UGCLayerType} options.type - 图层类型 + * @param {string} [options.caption] - 图层的标题。 + * @param {string} [options.description] - 图层的描述信息。 + * @param {boolean} [options.queryable] - 图层中的对象是否可以查询。 + * @param {boolean} [options.subUGCLayers] - 是否允许图层的符号大小随图缩放。 + * @param {boolean} [options.visible=false] - 地图对象在同一范围内时,是否重叠显示。 + * @usage + */ + +var UGCLayer = /*#__PURE__*/function () { + function UGCLayer(options) { + UGCLayer_classCallCheck(this, UGCLayer); + + options = options || {}; + /** + * @member {Bounds} UGCLayer.prototype.bounds + * @description 图层范围。 + */ + + this.bounds = null; + /** + * @member {string} [UGCLayer.prototype.caption] + * @description 图层的标题。默认情况下图层的标题与图层的名称一致。在图例、图层控制列表中显示的图层名称就是该图层的标题值。 + */ + + this.caption = null; + /** + * @member {string} UGCLayer.prototype.description + * @description 图层的描述信息。 + */ + + this.description = null; + /** + * @member {string} UGCLayer.prototype.name + * @description 图层的名称。图层的名称在图层所在的地图中唯一标识此图层。该属性区分大小写。 + */ + + this.name = null; + /** + * @member {boolean} UGCLayer.prototype.queryable + * @description 图层中的对象是否可以查询。 + */ + + this.queryable = null; + /** + * @member {Array} UGCLayer.prototype.subLayers + * @description 子图层集。 + */ + + this.subLayers = null; + /** + * @member {UGCLayerType} UGCLayer.prototype.type + * @description 图层类型。 + */ + + this.type = null; + /** + * @member {boolean} UGCLayer.prototype.visible + * @description 地图对象在同一范围内时,是否重叠显示。 + */ + + this.visible = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.UGCLayer"; + } + /** + * @function UGCLayer.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + UGCLayer_createClass(UGCLayer, [{ + key: "destroy", + value: function destroy() { + var me = this; + Util.reset(me); + } + /** + * @function UGCLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + jsonObject = jsonObject ? jsonObject : {}; + Util.extend(this, jsonObject); + var b = this.bounds; + + if (b) { + this.bounds = new Bounds(b.leftBottom.x, b.leftBottom.y, b.rightTop.x, b.rightTop.y); + } + } + /** + * @function UGCLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = {}; + jsonObject = Util.copyAttributes(jsonObject, this); + + if (jsonObject.bounds) { + if (jsonObject.bounds.toServerJSONObject) { + jsonObject.bounds = jsonObject.bounds.toServerJSONObject(); + } + } + + return jsonObject; + } + }]); + + return UGCLayer; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/UGCMapLayer.js +function UGCMapLayer_typeof(obj) { "@babel/helpers - typeof"; return UGCMapLayer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, UGCMapLayer_typeof(obj); } + +function UGCMapLayer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UGCMapLayer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UGCMapLayer_createClass(Constructor, protoProps, staticProps) { if (protoProps) UGCMapLayer_defineProperties(Constructor.prototype, protoProps); if (staticProps) UGCMapLayer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function UGCMapLayer_get() { if (typeof Reflect !== "undefined" && Reflect.get) { UGCMapLayer_get = Reflect.get; } else { UGCMapLayer_get = function _get(target, property, receiver) { var base = UGCMapLayer_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return UGCMapLayer_get.apply(this, arguments); } + +function UGCMapLayer_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = UGCMapLayer_getPrototypeOf(object); if (object === null) break; } return object; } + +function UGCMapLayer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) UGCMapLayer_setPrototypeOf(subClass, superClass); } + +function UGCMapLayer_setPrototypeOf(o, p) { UGCMapLayer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return UGCMapLayer_setPrototypeOf(o, p); } + +function UGCMapLayer_createSuper(Derived) { var hasNativeReflectConstruct = UGCMapLayer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = UGCMapLayer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = UGCMapLayer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return UGCMapLayer_possibleConstructorReturn(this, result); }; } + +function UGCMapLayer_possibleConstructorReturn(self, call) { if (call && (UGCMapLayer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return UGCMapLayer_assertThisInitialized(self); } + +function UGCMapLayer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function UGCMapLayer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function UGCMapLayer_getPrototypeOf(o) { UGCMapLayer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return UGCMapLayer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UGCMapLayer + * @deprecatedclass SuperMap.UGCMapLayer + * @category iServer Map Layer + * @classdesc SuperMap 地图图层类。 + * @extends {UGCLayer} + * @param {Object} options - 可选参数。 + * @param {boolean} [options.completeLineSymbolDisplayed] - 是否显示完整线型。 + * @param {number} [options.maxScale] - 地图最大比例尺。 + * @param {number} [options.minScale] - 地图最小比例尺。 + * @param {number} [options.minVisibleGeometrySize] - 几何对象的最小可见大小,以像素为单位。 + * @param {number} [options.opaqueRate] - 图层的不透明度。 + * @param {boolean} [options.symbolScalable] - 是否允许图层的符号大小随图缩放。 + * @param {number} [options.symbolScale] - 图层的符号缩放基准比例尺。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内时,是否重叠显示。 + * @param {OverlapDisplayedOptions} [options.overlapDisplayedOptions] - 地图的压盖过滤显示选项,当overlapDisplayed 为 false 时有效。 + * @usage + */ + +var UGCMapLayer = /*#__PURE__*/function (_UGCLayer) { + UGCMapLayer_inherits(UGCMapLayer, _UGCLayer); + + var _super = UGCMapLayer_createSuper(UGCMapLayer); + + function UGCMapLayer(options) { + var _this; + + UGCMapLayer_classCallCheck(this, UGCMapLayer); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {boolean} UGCMapLayer.prototype.completeLineSymbolDisplayed + * @description 是否显示完整线型。 + */ + + _this.completeLineSymbolDisplayed = null; + /** + * @member {number} UGCMapLayer.prototype.maxScale + * @description 地图最大比例尺。 + */ + + _this.maxScale = null; + /** + * @member {number} UGCMapLayer.prototype.minScale + * @description 地图最小比例尺。 + */ + + _this.minScale = null; + /** + * @member {number} UGCMapLayer.prototype.minVisibleGeometrySize + * @description 几何对象的最小可见大小,以像素为单位。 + */ + + _this.minVisibleGeometrySize = null; + /** + * @member {number} UGCMapLayer.prototype.opaqueRate + * @description 图层的不透明度。 + */ + + _this.opaqueRate = null; + /** + * @member {boolean} UGCMapLayer.prototype.symbolScalable + * @description 是否允许图层的符号大小随图缩放。 + */ + + _this.symbolScalable = null; + /** + * @member {number} UGCMapLayer.prototype.symbolScale + * @description 图层的符号缩放基准比例尺。 + */ + + _this.symbolScale = null; + /** + * @member {boolean} [UGCMapLayer.prototype.overlapDisplayed=false] + * @description 地图对象在同一范围内时,是否重叠显示。 + */ + + _this.overlapDisplayed = null; + /** + * @member {OverlapDisplayedOptions} UGCMapLayer.prototype.overlapDisplayedOptions + * @description 地图的压盖过滤显示选项,当 overlapDisplayed 为 false 时有效。 + */ + + _this.overlapDisplayedOptions = null; + _this.CLASS_NAME = "SuperMap.UGCMapLayer"; + return _this; + } + /** + * @function UGCMapLayer.prototype.destroy + * @override + */ + + + UGCMapLayer_createClass(UGCMapLayer, [{ + key: "destroy", + value: function destroy() { + UGCMapLayer_get(UGCMapLayer_getPrototypeOf(UGCMapLayer.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function UGCMapLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + UGCMapLayer_get(UGCMapLayer_getPrototypeOf(UGCMapLayer.prototype), "fromJson", this).call(this, jsonObject); + } + /** + * @function UGCMapLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + return UGCMapLayer_get(UGCMapLayer_getPrototypeOf(UGCMapLayer.prototype), "toServerJSONObject", this).call(this); + } + }]); + + return UGCMapLayer; +}(UGCLayer); +;// CONCATENATED MODULE: ./src/common/iServer/JoinItem.js +function JoinItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function JoinItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function JoinItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) JoinItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) JoinItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class JoinItem + * @deprecatedclass SuperMap.JoinItem + * @category iServer Data FeatureResults + * @classdesc 连接信息类。 + * 该类用于矢量数据集与外部表的连接。外部表可以为另一个矢量数据集(其中纯属性数据集中没有空间几何信息)所对应的 DBMS 表,也可以是用户自建的业务表。 + * 需要注意的是,矢量数据集与外部表必须属于同一数据源。表之间的联系的建立有两种方式,一种是连接(join),一种是关联(link)。 + * 连接,实际上是依据相同的字段将一个外部表追加到指定的表;而关联是基于一个相同的字段定义了两个表格之间的联系,但不是实际的追加。 + * 用于连接两个表的字段的名称不一定相同,但类型必须一致。当两个表格之间建立了连接,通过对主表进行操作,可以对外部表进行查询,制作专题图以及分析等。 + * 当两个表格之间是一对一或多对一的关系时,可以使用 join 连接。当为多对一的关系时,允许指定多个字段之间的关联。 + *(注意:JoinItem 目前支持左连接和内连接,不支持全连接和右连接,UDB 引擎不支持内连接。并且用于建立连接的两个表必须在同一个数据源下。) + * @param {Object} options - 参数。 + * @param {string} options.foreignTableName - 外部表的名称。 + * @param {string} options.joinFilter - 矢量数据集与外部表之间的连接表达式,即设定两个表之间关联的字段。 + * @param {JoinType} options.joinType - 两个表之间连接类型。 + * @example 下面以 SQL 查询说明 joinItem 的使用方法: + *(start code) + * function queryBySQL() { + * // 设置与外部表的连接信息 + * var joinItem = new JoinItem({ + * foreignTableName: "foreignTable", + * joinFilter: "foreignTable.CONTINENT = Countries.CONTINENT", + * joinType: "LEFTJOIN" + * }) + * var queryParam, queryBySQLParams, queryBySQLService; + * // 设置查询参数,在查询参数中添加joinItem关联条件信息 + * queryParam = new FilterParameter({ + * name: "Countries@World", + * joinItems: [joinItem] + * }), + * queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }), + * queryBySQLService = new QueryBySQLService(url, { + * eventListeners: { "processCompleted": processCompleted, "processFailed": processFailed} + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * } + * function processCompleted(queryEventArgs) {//todo} + * function processFailed(e) {//todo} + * (end) + * @usage + */ + +var JoinItem = /*#__PURE__*/function () { + function JoinItem(options) { + JoinItem_classCallCheck(this, JoinItem); + + /** + * @member {string} JoinItem.prototype.foreignTableName + * @description 外部表的名称。 + * 如果外部表的名称是以 “表名@数据源名” 命名方式,则该属性只需赋值表名。 + * 例如:外部表 Name@changchun,Name 为表名,changchun 为数据源名称,则该属性的赋值应为:Name。 + */ + this.foreignTableName = null; + /** + * @member {string} JoinItem.prototype.joinFilter + * @description 矢量数据集与外部表之间的连接表达式,即设定两个表之间关联的字段。 + * 例如,将房屋面数据集(Building)的 district 字段与房屋拥有者的纯属性数据集(Owner)的 region 字段相连接, + * 两个数据集对应的表名称分别为 Table_Building 和 Table_Owner, + * 则连接表达式为 Table_Building.district = Table_Owner.region。 + * 当有多个字段相连接时,用 AND 将多个表达式相连。 + */ + + this.joinFilter = null; + /** + * @member {JoinType} JoinItem.prototype.joinType + * @description 两个表之间连接类型。 + * 连接类型决定了对两个表进行连接查询后返回的记录的情况。 + */ + + this.joinType = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.JoinItem"; + } + /** + * @function JoinItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + JoinItem_createClass(JoinItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.foreignTableName = null; + me.joinFilter = null; + me.joinType = null; + } + /** + * @function JoinItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var dataObj = {}; + dataObj = Util.copyAttributes(dataObj, this); //joinFilter基本是个纯属性对象,这里不再做转换 + + return dataObj; + } + }]); + + return JoinItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/UGCSubLayer.js +function UGCSubLayer_typeof(obj) { "@babel/helpers - typeof"; return UGCSubLayer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, UGCSubLayer_typeof(obj); } + +function UGCSubLayer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UGCSubLayer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UGCSubLayer_createClass(Constructor, protoProps, staticProps) { if (protoProps) UGCSubLayer_defineProperties(Constructor.prototype, protoProps); if (staticProps) UGCSubLayer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function UGCSubLayer_get() { if (typeof Reflect !== "undefined" && Reflect.get) { UGCSubLayer_get = Reflect.get; } else { UGCSubLayer_get = function _get(target, property, receiver) { var base = UGCSubLayer_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return UGCSubLayer_get.apply(this, arguments); } + +function UGCSubLayer_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = UGCSubLayer_getPrototypeOf(object); if (object === null) break; } return object; } + +function UGCSubLayer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) UGCSubLayer_setPrototypeOf(subClass, superClass); } + +function UGCSubLayer_setPrototypeOf(o, p) { UGCSubLayer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return UGCSubLayer_setPrototypeOf(o, p); } + +function UGCSubLayer_createSuper(Derived) { var hasNativeReflectConstruct = UGCSubLayer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = UGCSubLayer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = UGCSubLayer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return UGCSubLayer_possibleConstructorReturn(this, result); }; } + +function UGCSubLayer_possibleConstructorReturn(self, call) { if (call && (UGCSubLayer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return UGCSubLayer_assertThisInitialized(self); } + +function UGCSubLayer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function UGCSubLayer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function UGCSubLayer_getPrototypeOf(o) { UGCSubLayer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return UGCSubLayer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class UGCSubLayer + * @deprecatedclass SuperMap.UGCSubLayer + * @category iServer Map Layer + * @classdesc 地图服务图层属性信息类。影像图层(Image)、专题图层(ServerTheme)、栅格图层(Grid)、矢量图层(Vector)等图层均继承该类。 + * @extends {UGCMapLayer} + * @param {Object} options - 参数。 + * @param {DatasetInfo} options.datasetInfo - 数据集信息。 + * @param {string} [options.displayFilter] - 图层显示过滤条件。 + * @param {JoinItem} [options.joinItems] - 连接信息类。 + * @param {string} [options.representationField] - 存储制图表达信息的字段。 + * @param {LayerType} [options.ugcLayerType] - 图层类型。 + * @usage + */ + +var UGCSubLayer = /*#__PURE__*/function (_UGCMapLayer) { + UGCSubLayer_inherits(UGCSubLayer, _UGCMapLayer); + + var _super = UGCSubLayer_createSuper(UGCSubLayer); + + function UGCSubLayer(options) { + var _this; + + UGCSubLayer_classCallCheck(this, UGCSubLayer); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {DatasetInfo} UGCSubLayer.prototype.datasetInfo + * @description 数据集信息。 + */ + + _this.datasetInfo = null; + /** + * @member {string} UGCSubLayer.prototype.displayFilter + * @description 图层显示过滤条件。 + */ + + _this.displayFilter = null; + /** + * @member {JoinItem} UGCSubLayer.prototype.joinItems + * @description 连接信息类。 + */ + + _this.joinItems = null; + /** + * @member {string} UGCSubLayer.prototype.representationField + * @description 存储制图表达信息的字段。 + */ + + _this.representationField = null; + /** + * @member {LayerType} UGCSubLayer.prototype.ugcLayerType + * @description 图层类型。 + */ + + _this.ugcLayerType = null; + _this.CLASS_NAME = "SuperMap.UGCSubLayer"; + return _this; + } + /** + * @function UGCSubLayer.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + + UGCSubLayer_createClass(UGCSubLayer, [{ + key: "fromJson", + value: function fromJson(jsonObject) { + UGCSubLayer_get(UGCSubLayer_getPrototypeOf(UGCSubLayer.prototype), "fromJson", this).call(this, jsonObject); + + if (this.datasetInfo) { + this.datasetInfo = new DatasetInfo(this.datasetInfo); + } + + if (this.joinItems && this.joinItems.length) { + var newJoinItems = []; + + for (var i = 0; i < this.joinItems.length; i++) { + newJoinItems[i] = new JoinItem(this.joinItems[i]); + } + + this.joinItems = newJoinItems; + } + } + /** + * @function UGCSubLayer.prototype.destroy + * @override + */ + + }, { + key: "destroy", + value: function destroy() { + UGCSubLayer_get(UGCSubLayer_getPrototypeOf(UGCSubLayer.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function UGCSubLayer.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = UGCSubLayer_get(UGCSubLayer_getPrototypeOf(UGCSubLayer.prototype), "toServerJSONObject", this).call(this); + + if (jsonObject.joinItems) { + var joinItems = []; + + for (var i = 0; i < jsonObject.joinItems.length; i++) { + if (jsonObject.joinItems[i].toServerJSONObject) { + joinItems[i] = jsonObject.joinItems[i].toServerJSONObject(); + } + } + + jsonObject.joinItems = joinItems; + } + + if (jsonObject.datasetInfo) { + if (jsonObject.datasetInfo.toServerJSONObject) { + jsonObject.datasetInfo = jsonObject.datasetInfo.toServerJSONObject(); + } + } + + return jsonObject; + } + }]); + + return UGCSubLayer; +}(UGCMapLayer); +;// CONCATENATED MODULE: ./src/common/iServer/ServerTheme.js +function ServerTheme_typeof(obj) { "@babel/helpers - typeof"; return ServerTheme_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ServerTheme_typeof(obj); } + +function ServerTheme_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerTheme_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerTheme_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerTheme_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerTheme_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ServerTheme_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ServerTheme_get = Reflect.get; } else { ServerTheme_get = function _get(target, property, receiver) { var base = ServerTheme_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ServerTheme_get.apply(this, arguments); } + +function ServerTheme_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ServerTheme_getPrototypeOf(object); if (object === null) break; } return object; } + +function ServerTheme_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ServerTheme_setPrototypeOf(subClass, superClass); } + +function ServerTheme_setPrototypeOf(o, p) { ServerTheme_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ServerTheme_setPrototypeOf(o, p); } + +function ServerTheme_createSuper(Derived) { var hasNativeReflectConstruct = ServerTheme_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ServerTheme_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ServerTheme_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ServerTheme_possibleConstructorReturn(this, result); }; } + +function ServerTheme_possibleConstructorReturn(self, call) { if (call && (ServerTheme_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ServerTheme_assertThisInitialized(self); } + +function ServerTheme_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ServerTheme_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ServerTheme_getPrototypeOf(o) { ServerTheme_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ServerTheme_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +/** + * @class ServerTheme + * @deprecatedclass SuperMap.ServerTheme + * @category iServer Map Theme + * @classdesc SuperMap 专题图图层类。 + * @extends {UGCSubLayer} + * @param {CommonTheme} theme - 专题图对象。 + * @param {LonLat} themeElementPosition - 专题图元素位置。 + * @usage + */ + +var ServerTheme = /*#__PURE__*/function (_UGCSubLayer) { + ServerTheme_inherits(ServerTheme, _UGCSubLayer); + + var _super = ServerTheme_createSuper(ServerTheme); + + function ServerTheme(options) { + var _this; + + ServerTheme_classCallCheck(this, ServerTheme); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {CommonTheme} ServerTheme.prototype.theme + * @description 专题图对象。 + */ + + _this.theme = null; + /** + * @member {LonLat} ServerTheme.prototype.themeElementPosition + * @description 专题图元素位置。 + */ + + _this.themeElementPosition = null; + _this.CLASS_NAME = "SuperMap.ServerTheme"; + return _this; + } + /** + * @function ServerTheme.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + * @override + */ + + + ServerTheme_createClass(ServerTheme, [{ + key: "destroy", + value: function destroy() { + ServerTheme_get(ServerTheme_getPrototypeOf(ServerTheme.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function ServerTheme.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + ServerTheme_get(ServerTheme_getPrototypeOf(ServerTheme.prototype), "fromJson", this).call(this, jsonObject); + + var themeObj = this.theme; + var themeT = themeObj && themeObj.type; + + switch (themeT) { + case 'LABEL': + this.theme = ThemeLabel.fromObj(themeObj); + break; + + case 'UNIQUE': + this.theme = ThemeUnique.fromObj(themeObj); + break; + + case 'GRAPH': + this.theme = ThemeGraph.fromObj(themeObj); + break; + + case 'DOTDENSITY': + this.theme = ThemeDotDensity.fromObj(themeObj); + break; + + case 'GRADUATEDSYMBOL': + this.theme = ThemeGraduatedSymbol.fromObj(themeObj); + break; + + case 'RANGE': + this.theme = ThemeRange.fromObj(themeObj); + break; + + default: + break; + } + + if (this.themeElementPosition) { + //待测试 + this.themeElementPosition = new LonLat(this.themeElementPosition.x, this.themeElementPosition.y); + } + } + /** + * @function ServerTheme.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + //普通属性直接赋值 + var jsonObject = ServerTheme_get(ServerTheme_getPrototypeOf(ServerTheme.prototype), "toServerJSONObject", this).call(this); + + if (jsonObject.themeElementPosition) { + if (jsonObject.themeElementPosition.toServerJSONObject) { + jsonObject.themeElementPosition = jsonObject.themeElementPosition.toServerJSONObject(); + } + } + + if (jsonObject.theme) { + if (jsonObject.theme.toServerJSONObject) { + jsonObject.theme = jsonObject.theme.toServerJSONObject(); + } + } + + return jsonObject; + } + }]); + + return ServerTheme; +}(UGCSubLayer); +;// CONCATENATED MODULE: ./src/common/iServer/Grid.js +function Grid_typeof(obj) { "@babel/helpers - typeof"; return Grid_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Grid_typeof(obj); } + +function Grid_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Grid_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Grid_createClass(Constructor, protoProps, staticProps) { if (protoProps) Grid_defineProperties(Constructor.prototype, protoProps); if (staticProps) Grid_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Grid_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Grid_get = Reflect.get; } else { Grid_get = function _get(target, property, receiver) { var base = Grid_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Grid_get.apply(this, arguments); } + +function Grid_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Grid_getPrototypeOf(object); if (object === null) break; } return object; } + +function Grid_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Grid_setPrototypeOf(subClass, superClass); } + +function Grid_setPrototypeOf(o, p) { Grid_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Grid_setPrototypeOf(o, p); } + +function Grid_createSuper(Derived) { var hasNativeReflectConstruct = Grid_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Grid_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Grid_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Grid_possibleConstructorReturn(this, result); }; } + +function Grid_possibleConstructorReturn(self, call) { if (call && (Grid_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Grid_assertThisInitialized(self); } + +function Grid_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Grid_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Grid_getPrototypeOf(o) { Grid_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Grid_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class Grid + * @deprecatedclass SuperMap.Grid + * @category iServer Map Layer + * @classdesc SuperMap 栅格图层类。 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {Array.} [options.colorDictionary] - 颜色对照表对象。 + * @param {number} [options.brightness] - Grid 图层的亮度。 + * @param {ColorGradientType} [options.colorGradientType] - 颜色渐变枚举。 + * @param {ServerColor} [options.colors] - 颜色表对象。 + * @param {number} [options.contrast] - Grid 图层的对比度。 + * @param {GridType} [options.gridType] - 格网类型。 + * @param {number} [options.horizontalSpacing] - 格网水平间隔大小。 + * @param {boolean} [options.sizeFixed] - 格网是否固定大小,如果不固定大小,则格网随着地图缩放。 + * @param {ServerStyle} [options.solidStyle] - 格网实线的样式。 + * @param {ServerColor} [options.specialColor] - 栅格数据集无值数据的颜色。 + * @param {number} [options.specialValue] - 图层的特殊值。 + * @param {boolean} [options.specialValueTransparent] - 图层的特殊值(specialValue)所处区域是否透明。 + * @param {number} [options.verticalSpacing] - 格网垂直间隔大小。 + * @usage + */ + +var Grid = /*#__PURE__*/function (_UGCSubLayer) { + Grid_inherits(Grid, _UGCSubLayer); + + var _super = Grid_createSuper(Grid); + + function Grid(options) { + var _this; + + Grid_classCallCheck(this, Grid); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {Array.} Grid.prototype.colorDictionarys + * @description 颜色对照表对象。 + */ + + _this.colorDictionarys = null; + /** + * @member {number} Grid.prototype.brightness + * @description Grid 图层的亮度。 + */ + + _this.brightness = null; + /** + * @member {ColorGradientType} Grid.prototype.colorGradientType + * @description 渐变颜色枚举值。 + */ + + _this.colorGradientType = null; + /** + * @member {ServerColor} Grid.prototype.colors + * @description 颜色表对象。 + */ + + _this.colors = null; + /** + * @member {number} Grid.prototype.contrast + * @description Grid 图层的对比度。 + */ + + _this.contrast = null; + /** + * @member {ServerStyle} Grid.prototype.dashStyle + * @description 栅格数据集特殊值数据的颜色。 + */ + + _this.dashStyle = null; + /** + * @member {GridType} Grid.prototype.gridType + * @description 格网类型。 + */ + + _this.gridType = null; + /** + * @member {number} Grid.prototype.horizontalSpacing + * @description 格网水平间隔大小。 + */ + + _this.horizontalSpacing = null; + /** + * @member {boolean} Grid.prototype.sizeFixed + * @description 格网是否固定大小,如果不固定大小,则格网随着地图缩放。 + */ + + _this.sizeFixed = null; + /** + * @member {ServerStyle} Grid.prototype.solidStyle + * @description 格网实线的样式。 + */ + + _this.solidStyle = null; + /** + * @member {ServerColor} Grid.prototype.specialColor + * @description 栅格数据集无值数据的颜色。 + */ + + _this.specialColor = null; + /** + * @member {number} Grid.prototype.specialValue + * @description 图层的特殊值。 + */ + + _this.specialValue = null; + /** + * @member {boolean} Grid.prototype.specialValueTransparent + * @description 图层的特殊值(specialValue)所处区域是否透明。 + */ + + _this.specialValueTransparent = null; + /** + * @member {number} Grid.prototype.verticalSpacing + * @description 格网垂直间隔大小。 + */ + + _this.verticalSpacing = null; + _this.CLASS_NAME = "SuperMap.Grid"; + return _this; + } + /** + * @function Grid.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + Grid_createClass(Grid, [{ + key: "destroy", + value: function destroy() { + Grid_get(Grid_getPrototypeOf(Grid.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function Grid.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + Grid_get(Grid_getPrototypeOf(Grid.prototype), "fromJson", this).call(this, jsonObject); + + if (this.specialColor) { + this.specialColor = new ServerColor(this.specialColor.red, this.specialColor.green, this.specialColor.blue); + } + + if (this.colors) { + var colors = [], + color; + + for (var i in this.colors) { + color = this.colors[i]; + colors.push(new ServerColor(color.red, color.green, color.blue)); + } + + this.colors = colors; + } + + if (this.dashStyle) { + this.dashStyle = new ServerStyle(this.dashStyle); + } + + if (this.solidStyle) { + this.solidStyle = new ServerStyle(this.solidStyle); + } + + if (this.colorDictionary) { + var colorDics = [], + colorDic; + + for (var key in this.colorDictionary) { + colorDic = this.colorDictionary[key]; + colorDics.push(new ColorDictionary({ + elevation: key, + color: colorDic + })); + } + + this.colorDictionarys = colorDics; + } + + delete this.colorDictionary; + } + /** + * @function Grid.prototype.toServerJSONObject + * @description 转换成对应的 JSON 对象。 + * @returns JSON 对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = Grid_get(Grid_getPrototypeOf(Grid.prototype), "toServerJSONObject", this).call(this); + + if (jsonObject.dashStyle) { + if (jsonObject.dashStyle.toServerJSONObject) { + jsonObject.dashStyle = jsonObject.dashStyle.toServerJSONObject(); + } + } + + if (jsonObject.solidStyle) { + if (jsonObject.solidStyle.toServerJSONObject) { + jsonObject.solidStyle = jsonObject.solidStyle.toServerJSONObject(); + } + } + + return jsonObject; + } + }]); + + return Grid; +}(UGCSubLayer); +;// CONCATENATED MODULE: ./src/common/iServer/Image.js +function Image_typeof(obj) { "@babel/helpers - typeof"; return Image_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Image_typeof(obj); } + +function Image_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Image_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Image_createClass(Constructor, protoProps, staticProps) { if (protoProps) Image_defineProperties(Constructor.prototype, protoProps); if (staticProps) Image_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Image_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Image_get = Reflect.get; } else { Image_get = function _get(target, property, receiver) { var base = Image_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Image_get.apply(this, arguments); } + +function Image_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Image_getPrototypeOf(object); if (object === null) break; } return object; } + +function Image_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Image_setPrototypeOf(subClass, superClass); } + +function Image_setPrototypeOf(o, p) { Image_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Image_setPrototypeOf(o, p); } + +function Image_createSuper(Derived) { var hasNativeReflectConstruct = Image_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Image_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Image_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Image_possibleConstructorReturn(this, result); }; } + +function Image_possibleConstructorReturn(self, call) { if (call && (Image_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Image_assertThisInitialized(self); } + +function Image_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Image_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Image_getPrototypeOf(o) { Image_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Image_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UGCImage + * @deprecatedclass SuperMap.Image + * @category iServer Map Layer + * @classdesc SuperMap 影像图层类 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {ColorSpaceType} [options.colorSpaceType] - 返回影像图层的色彩显示模式。 + * @param {number} [options.brightness] - 影像图层的亮度。 + * @param {Array.} [options.displayBandIndexes] - 返回当前影像图层显示的波段索引。 + * @param {number} [options.contrast] - 影像图层的对比度。 + * @param {boolean} [options.transparent] - 是否背景透明。 + * @param {ServerColor} [options.transparentColor] - 返回背景透明色。 + * @param {number} [options.transparentColorTolerance] - 背景透明色容限。 + * @usage + * @private + */ + +var UGCImage = /*#__PURE__*/function (_UGCSubLayer) { + Image_inherits(UGCImage, _UGCSubLayer); + + var _super = Image_createSuper(UGCImage); + + function UGCImage(options) { + var _this; + + Image_classCallCheck(this, UGCImage); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {number} UGCImage.prototype.brightness + * @description 影像图层的亮度。 + */ + + _this.brightness = null; + /** + * @member {ColorSpaceType} UGCImage.prototype.colorSpaceType + * @description 返回影像图层的色彩显示模式。 + */ + + _this.colorSpaceType = null; + /** + * @member {number} UGCImage.prototype.contrast + * @description 影像图层的对比度。 + */ + + _this.contrast = null; + /** + * @member {Array.} UGCImage.prototype.displayBandIndexes + * @description 返回当前影像图层显示的波段索引。 + */ + + _this.displayBandIndexes = null; + /** + * @member {boolean} UGCImage.prototype.transparent + * @description 是否背景透明。 + */ + + _this.transparent = null; + /** + * @member {ServerColor} UGCImage.prototype.transparentColor + * @description 返回背景透明色。 + */ + + _this.transparentColor = null; + /** + * @member {number} UGCImage.prototype.transparentColorTolerance + * @description 背景透明色容限。 + */ + + _this.transparentColorTolerance = null; + _this.CLASS_NAME = "SuperMap.Image"; + return _this; + } + /** + * @function UGCImage.prototype.destroy + * @override + */ + + + Image_createClass(UGCImage, [{ + key: "destroy", + value: function destroy() { + Image_get(Image_getPrototypeOf(UGCImage.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function UGCImage.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + Image_get(Image_getPrototypeOf(UGCImage.prototype), "fromJson", this).call(this, jsonObject); + + if (this.transparentColor) { + this.transparentColor = new ServerColor(this.transparentColor.red, this.transparentColor.green, this.transparentColor.blue); + } + } + /** + * @function UGCImage.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + return Image_get(Image_getPrototypeOf(UGCImage.prototype), "toServerJSONObject", this).call(this); + } + }]); + + return UGCImage; +}(UGCSubLayer); +;// CONCATENATED MODULE: ./src/common/iServer/Vector.js +function iServer_Vector_typeof(obj) { "@babel/helpers - typeof"; return iServer_Vector_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, iServer_Vector_typeof(obj); } + +function iServer_Vector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function iServer_Vector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function iServer_Vector_createClass(Constructor, protoProps, staticProps) { if (protoProps) iServer_Vector_defineProperties(Constructor.prototype, protoProps); if (staticProps) iServer_Vector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function iServer_Vector_get() { if (typeof Reflect !== "undefined" && Reflect.get) { iServer_Vector_get = Reflect.get; } else { iServer_Vector_get = function _get(target, property, receiver) { var base = iServer_Vector_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return iServer_Vector_get.apply(this, arguments); } + +function iServer_Vector_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = iServer_Vector_getPrototypeOf(object); if (object === null) break; } return object; } + +function iServer_Vector_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) iServer_Vector_setPrototypeOf(subClass, superClass); } + +function iServer_Vector_setPrototypeOf(o, p) { iServer_Vector_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return iServer_Vector_setPrototypeOf(o, p); } + +function iServer_Vector_createSuper(Derived) { var hasNativeReflectConstruct = iServer_Vector_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = iServer_Vector_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = iServer_Vector_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return iServer_Vector_possibleConstructorReturn(this, result); }; } + +function iServer_Vector_possibleConstructorReturn(self, call) { if (call && (iServer_Vector_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return iServer_Vector_assertThisInitialized(self); } + +function iServer_Vector_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function iServer_Vector_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function iServer_Vector_getPrototypeOf(o) { iServer_Vector_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return iServer_Vector_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class Vector + * @deprecatedclass SuperMap.Vector + * @category iServer Map Layer + * @classdesc SuperMap 矢量图层类。 + * @extends {UGCSubLayer} + * @param {Object} options - 可选参数。 + * @param {ServerStyle} [options.style] - 矢量图层的风格。 + * @usage + */ + +var Vector_Vector = /*#__PURE__*/function (_UGCSubLayer) { + iServer_Vector_inherits(Vector, _UGCSubLayer); + + var _super = iServer_Vector_createSuper(Vector); + + function Vector(options) { + var _this; + + iServer_Vector_classCallCheck(this, Vector); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {ServerStyle} Vector.prototype.style + * @description 矢量图层的风格。 + */ + + _this.style = null; + _this.CLASS_NAME = "SuperMap.Vector"; + return _this; + } + /** + * @function Vector.prototype.destroy + * @description 销毁对象,将其属性置空。 + * @override + */ + + + iServer_Vector_createClass(Vector, [{ + key: "destroy", + value: function destroy() { + iServer_Vector_get(iServer_Vector_getPrototypeOf(Vector.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function Vector.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + iServer_Vector_get(iServer_Vector_getPrototypeOf(Vector.prototype), "fromJson", this).call(this, jsonObject); + + var sty = this.style; + + if (sty) { + this.style = new ServerStyle(sty); + } + } + /** + * @function Vector.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = iServer_Vector_get(iServer_Vector_getPrototypeOf(Vector.prototype), "toServerJSONObject", this).call(this); + + if (jsonObject.style) { + if (jsonObject.style.toServerJSONObject) { + jsonObject.style = jsonObject.style.toServerJSONObject(); + } + } + + return jsonObject; + } + }]); + + return Vector; +}(UGCSubLayer); +;// CONCATENATED MODULE: ./src/common/iServer/GetLayersInfoService.js +function GetLayersInfoService_typeof(obj) { "@babel/helpers - typeof"; return GetLayersInfoService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GetLayersInfoService_typeof(obj); } + +function GetLayersInfoService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GetLayersInfoService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GetLayersInfoService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GetLayersInfoService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GetLayersInfoService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GetLayersInfoService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GetLayersInfoService_get = Reflect.get; } else { GetLayersInfoService_get = function _get(target, property, receiver) { var base = GetLayersInfoService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GetLayersInfoService_get.apply(this, arguments); } + +function GetLayersInfoService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GetLayersInfoService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GetLayersInfoService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GetLayersInfoService_setPrototypeOf(subClass, superClass); } + +function GetLayersInfoService_setPrototypeOf(o, p) { GetLayersInfoService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GetLayersInfoService_setPrototypeOf(o, p); } + +function GetLayersInfoService_createSuper(Derived) { var hasNativeReflectConstruct = GetLayersInfoService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GetLayersInfoService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GetLayersInfoService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GetLayersInfoService_possibleConstructorReturn(this, result); }; } + +function GetLayersInfoService_possibleConstructorReturn(self, call) { if (call && (GetLayersInfoService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GetLayersInfoService_assertThisInitialized(self); } + +function GetLayersInfoService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GetLayersInfoService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GetLayersInfoService_getPrototypeOf(o) { GetLayersInfoService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GetLayersInfoService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class GetLayersInfoService + * @deprecatedclass SuperMap.GetLayersInfoService + * @category iServer Map Layer + * @classdesc 获取图层信息服务类构造函数。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * 如 http://localhost:8090/iserver/services/map-world/rest/maps/World 。 + * 如果查询临时图层的信息,请指定完成的url,包含临时图层ID信息,如: + * http://localhost:8090/iserver/services/map-world/rest/maps/World/tempLayersSet/resourceID + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @param {boolean} options.isTempLayers - 当前url对应的图层是否是临时图层。 + * @usage + */ + +var GetLayersInfoService = /*#__PURE__*/function (_CommonServiceBase) { + GetLayersInfoService_inherits(GetLayersInfoService, _CommonServiceBase); + + var _super = GetLayersInfoService_createSuper(GetLayersInfoService); + + function GetLayersInfoService(url, options) { + var _this; + + GetLayersInfoService_classCallCheck(this, GetLayersInfoService); + + _this = _super.call(this, url, options); + /** + * @member {boolean} GetLayersInfoService.prototype.isTempLayers + * @description 当前url对应的图层是否是临时图层。 + */ + + _this.isTempLayers = false; + + if (options) { + Util.extend(GetLayersInfoService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GetLayersInfoService"; + return _this; + } + /** + * @function GetLayersInfoService.prototype.destroy + * @override + */ + + + GetLayersInfoService_createClass(GetLayersInfoService, [{ + key: "destroy", + value: function destroy() { + GetLayersInfoService_get(GetLayersInfoService_getPrototypeOf(GetLayersInfoService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function GetLayersInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + var me = this, + method = "GET"; + + if (!me.isTempLayers) { + me.url = Util.urlPathAppend(me.url, 'layers'); + } + + me.request({ + method: method, + params: null, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function GetLayersInfoService.prototype.serviceProcessCompleted + * @description 编辑完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this, + existRes, + layers, + len; + result = Util.transformResult(result); + existRes = !!result && result.length > 0; + layers = existRes ? result[0].subLayers.layers : null; + len = layers ? layers.length : 0; + me.handleLayers(len, layers); + me.events.triggerEvent("processCompleted", { + result: result[0] + }); + } + /** + * TODO 专题图时候可能会用到 + * @function GetLayersInfoService.prototype.handleLayers + * @description 处理 iServer 新增图层组数据 (subLayers.layers 中可能还会含有 subLayers.layers) + * @param {number} len - subLayers.layers的长度 + * @param {Array.} layers - subLayers.layers的长度数组 + */ + + }, { + key: "handleLayers", + value: function handleLayers(len, layers) { + var me = this, + tempLayer; + + if (len) { + for (var i = 0; i < len; i++) { + if (layers[i].subLayers && layers[i].subLayers.layers && layers[i].subLayers.layers.length > 0) { + me.handleLayers(layers[i].subLayers.layers.length, layers[i].subLayers.layers); + } else { + var type = layers[i].ugcLayerType; + + switch (type) { + case 'THEME': + tempLayer = new ServerTheme(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + + case 'GRID': + tempLayer = new Grid(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + + case 'IMAGE': + tempLayer = new UGCImage(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + + case 'VECTOR': + tempLayer = new Vector_Vector(); + tempLayer.fromJson(layers[i]); + layers[i] = tempLayer; + break; + + default: + break; + } + } + } + } + } + }]); + + return GetLayersInfoService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationAnalystParameters.js +function InterpolationAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class InterpolationAnalystParameters + * @deprecatedclass SuperMap.InterpolationAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 插值分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。 + * @param {string} [options.dataset] - 待分析的数据集名称。当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystType)为 geometry 时,此参数为必设参数。 + * @param {number} [options.searchRadius=0] - 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {number} [options.zValueScale=1] - 进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {PixelFormat} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.InterpolationAnalystType="dataset"] - 插值分析类型("dataset" 或 "geometry")。 + * @usage + */ + +var InterpolationAnalystParameters = /*#__PURE__*/function () { + function InterpolationAnalystParameters(options) { + InterpolationAnalystParameters_classCallCheck(this, InterpolationAnalystParameters); + + if (!options) { + return; + } + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} InterpolationAnalystParameters.prototype.bounds + * @description 插值分析的范围,用于确定结果栅格数据集的范围。 + * 如果缺省,则默认为原数据集的范围。鉴于此插值方法为内插方法,原数据集的范围内的插值结果才相对有参考价值, + * 因此建议此参数不大于原数据集范围。 + */ + + + this.bounds = null; + /** + * @member {number} [InterpolationAnalystParameters.prototype.searchRadius=0] + * @description 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * 计算某个位置的Z 值时,会以该位置为圆心,以查找范围的值为半径,落在这个范围内的采样点都将参与运算。 + * 该值需要根据待插值点数据的分布状况和点数据集范围进行设置。 + */ + + this.searchRadius = 0; + /** + * @member {string} InterpolationAnalystParameters.prototype.zValueFieldName + * @description 数据集插值分析中,用于指定进行插值分析的目标字段名,插值分析不支持文本类型的字段。 + * 含义为每个插值点在插值过程中的权重,可以将所有点此字段值设置为 1,即所有点在整体插值中权重相同。 + * 当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + */ + + this.zValueFieldName = null; + /** + * @member {number} [InterpolationAnalystParameters.prototype.zValueScale=1] + * @description 用于进行插值分析值的缩放比率。 + * 参加插值分析的值将乘以该参数值后再进行插值,也就是对进行插值分析的值进行统一的扩大或缩小。 + */ + + this.zValueScale = 1; + /** + * @member {number} InterpolationAnalystParameters.prototype.resolution + * @description 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * 该值不能超过待分析数据集的范围边长。 + * 且该值设置时,应该考虑点数据集范围大小来取值,一般为结果栅格行列值(即结果栅格数据集范围除以分辨率),在 500 以内可以较好地体现密度走势。 + */ + + this.resolution = null; + /** + * @member {FilterParameter} [InterpolationAnalystParameters.prototype.filterQueryParameter] + * @description 过滤条件,对分析数据集中的点进行过滤,设置为 null 表示对数据集中的所有点进行分析。 + */ + + this.filterQueryParameter = null; + /** + * @member {string} InterpolationAnalystParameters.prototype.outputDatasetName + * @description 插值分析结果数据集的名称。 + */ + + this.outputDatasetName = null; + /** + * @member {string} InterpolationAnalystParameters.prototype.outputDatasourceName + * @description 插值分析结果数据源的名称。 + */ + + this.outputDatasourceName = null; + /** + * @member {PixelFormat} [InterpolationAnalystParameters.prototype.pixelFormat] + * @description 指定结果栅格数据集存储的像素格式。支持存储的像素格式有 BIT16、BIT32、DOUBLE、SINGLE、UBIT1、UBIT4、UBIT8、UBIT24、UBIT32。 + */ + + this.pixelFormat = null; + /** + * @member {string} [InterpolationAnalystParameters.prototype.dataset] + * @description 用来做插值分析的数据源中数据集的名称,该名称用形如 "数据集名称@数据源别名" 形式来表示。 + * 当插值分析类型(InterpolationAnalystType)为 dataset 时,此为必选参数。 + */ + + this.dataset = null; + /** + * @member {Array.>} [InterpolationAnalystParameters.prototype.inputPoints] + * @description 用于做插值分析的离散点(离散点包括Z值)集合。 + * 当插值分析类型(InterpolationAnalystType)为 geometry 时,此参数为必设参数。 + * 通过离散点直接进行插值分析不需要指定输入数据集inputDatasourceName,inputDatasetName以及zValueFieldName。 + */ + + this.inputPoints = null; + /** + * @member {string} [InterpolationAnalystParameters.prototype.InterpolationAnalystType="dataset"] + * @description 插值分析类型。差值分析包括数据集插值分析和几何插值分析两类, + * "dataset" 表示对数据集进行插值分析,"geometry" 表示对离散点数组进行插值分析。 + */ + + this.InterpolationAnalystType = "dataset"; + /** + * @member {ClipParameter} InterpolationAnalystParameters.prototype.clipParam + * @description 对插值分析结果进行裁剪的参数。 + */ + + this.clipParam = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.InterpolationAnalystParameters"; + } + /** + * @function InterpolationAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationAnalystParameters_createClass(InterpolationAnalystParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.bounds = null; + me.searchRadius = null; + me.zValueFieldName = null; + me.zValueScale = null; + me.resolution = null; + me.filterQueryParameter = null; + me.outputDatasetName = null; + me.pixelFormat = null; + } + /** + * @function InterpolationAnalystParameters.toObject + * @param {InterpolationAnalystParameters} interpolationAnalystParameters - 插值分析参数类。 + * @param {InterpolationAnalystParameters} tempObj - 插值分析参数对象。 + * @description 将插值分析参数对象转换成 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(interpolationAnalystParameters, tempObj) { + for (var name in interpolationAnalystParameters) { + if (name === "inputPoints" && interpolationAnalystParameters.InterpolationAnalystType === "geometry") { + var objs = []; + + for (var i = 0; i < interpolationAnalystParameters.inputPoints.length; i++) { + var item = interpolationAnalystParameters.inputPoints[i]; + var obj = { + x: item.x, + y: item.y, + z: item.tag + }; + objs.push(obj); + } + + tempObj[name] = objs; + } else { + tempObj[name] = interpolationAnalystParameters[name]; + } + } + } + }]); + + return InterpolationAnalystParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationRBFAnalystParameters.js +function InterpolationRBFAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return InterpolationRBFAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, InterpolationRBFAnalystParameters_typeof(obj); } + +function InterpolationRBFAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationRBFAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationRBFAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationRBFAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationRBFAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function InterpolationRBFAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { InterpolationRBFAnalystParameters_get = Reflect.get; } else { InterpolationRBFAnalystParameters_get = function _get(target, property, receiver) { var base = InterpolationRBFAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return InterpolationRBFAnalystParameters_get.apply(this, arguments); } + +function InterpolationRBFAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = InterpolationRBFAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function InterpolationRBFAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) InterpolationRBFAnalystParameters_setPrototypeOf(subClass, superClass); } + +function InterpolationRBFAnalystParameters_setPrototypeOf(o, p) { InterpolationRBFAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return InterpolationRBFAnalystParameters_setPrototypeOf(o, p); } + +function InterpolationRBFAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = InterpolationRBFAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = InterpolationRBFAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = InterpolationRBFAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return InterpolationRBFAnalystParameters_possibleConstructorReturn(this, result); }; } + +function InterpolationRBFAnalystParameters_possibleConstructorReturn(self, call) { if (call && (InterpolationRBFAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return InterpolationRBFAnalystParameters_assertThisInitialized(self); } + +function InterpolationRBFAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function InterpolationRBFAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function InterpolationRBFAnalystParameters_getPrototypeOf(o) { InterpolationRBFAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return InterpolationRBFAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class InterpolationRBFAnalystParameters + * @deprecatedclass SuperMap.InterpolationRBFAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 样条插值(径向基函数插值法)分析参数类。 + * @extends {InterpolationAnalystParameters} + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 存储用于进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.smooth=0.1] - 光滑系数,该值表示插值函数曲线与点的逼近程度,值域为0到1。 + * @param {number} [options.tension=40] - 张力系数,用于调整结果栅格数据表面的特性。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置参与差值运算的点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置参与运算点的查找范围。 + * @param {number} [options.maxPointCountForInterpolation=200] - 【块查找】方式下,设置最多参与插值的点数。 + * @param {number} [options.maxPointCountInNode=50] - 【块查找】方式下,设置单个块内最多参与运算点数。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如”数据集名称@数据源别名”形式来表示。当插值分析类型(InterpolationAnalystType)为 dataset 时。此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystType)为 geometry 时。此为必选参数。 + * @example + * var myInterpolationRBFAnalystParameters = new InterpolationRBFAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * smooth: 0.1, + * tension: 40, + * searchMode: "QUADTREE", + * maxPointCountForInterpolation: 20, + * maxPointCountInNode: 5, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myRBF" + * }); + * @usage + */ + +var InterpolationRBFAnalystParameters = /*#__PURE__*/function (_InterpolationAnalyst) { + InterpolationRBFAnalystParameters_inherits(InterpolationRBFAnalystParameters, _InterpolationAnalyst); + + var _super = InterpolationRBFAnalystParameters_createSuper(InterpolationRBFAnalystParameters); + + function InterpolationRBFAnalystParameters(options) { + var _this; + + InterpolationRBFAnalystParameters_classCallCheck(this, InterpolationRBFAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.smooth=0.1] + * @description 光滑系数,值域为 0 到 1,常用取值如 0、0.001、0.01、0.1、和 0.5。 + * 该值表示插值函数曲线与点的逼近程度,此数值越大,函数曲线与点的偏差越大,反之越小。 + */ + + _this.smooth = 0.1; + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.tension=40] + * @description 张力系数,常用取值如 0、1、5 和 10。 + * 用于调整结果栅格数据表面的特性,张力越大,插值时每个点对计算结果影响越小,反之越大。 + */ + + _this.tension = 40; + /** + * @member {SearchMode} InterpolationRBFAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。必设参数。 + * 具体如下: + * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。 + * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。 + * {QUADTREE} 使用 QUADTREE 方式查找参与内插分析的点(块查找)。 + */ + + _this.searchMode = null; + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + */ + + _this.expectedCount = 12; + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.maxPointCountForInterpolation=200] + * @description 【块查找】方式下,最多参与插值的点数。 + */ + + _this.maxPointCountForInterpolation = 200; + /** + * @member {number} [InterpolationRBFAnalystParameters.prototype.maxPointCountInNode=50] + * @description 【块查找】方式下,单个块内最多参与运算点数。 + */ + + _this.maxPointCountInNode = 50; + + if (options) { + Util.extend(InterpolationRBFAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.InterpolationRBFAnalystParameters"; + return _this; + } + /** + * @function InterpolationRBFAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationRBFAnalystParameters_createClass(InterpolationRBFAnalystParameters, [{ + key: "destroy", + value: function destroy() { + InterpolationRBFAnalystParameters_get(InterpolationRBFAnalystParameters_getPrototypeOf(InterpolationRBFAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.smooth = null; + me.tension = null; + me.searchMode = null; + me.expectedCount = null; + me.maxPointCountForInterpolation = null; + me.maxPointCountInNode = null; + } + /** + * @function InterpolationRBFAnalystParameters.toObject + * @param {InterpolationRBFAnalystParameters} datasetInterpolationRBFAnalystParameters - 样条插值(径向基函数插值法)分析参数类 + * @param {InterpolationRBFAnalystParameters} tempObj - 样条插值(径向基函数插值法)分析参数对象 + * @description 将样条插值(径向基函数插值法)分析参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(datasetInterpolationRBFAnalystParameters, tempObj) { + for (var name in datasetInterpolationRBFAnalystParameters) { + tempObj[name] = datasetInterpolationRBFAnalystParameters[name]; + } + } + }]); + + return InterpolationRBFAnalystParameters; +}(InterpolationAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationDensityAnalystParameters.js +function InterpolationDensityAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return InterpolationDensityAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, InterpolationDensityAnalystParameters_typeof(obj); } + +function InterpolationDensityAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationDensityAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationDensityAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationDensityAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationDensityAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function InterpolationDensityAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { InterpolationDensityAnalystParameters_get = Reflect.get; } else { InterpolationDensityAnalystParameters_get = function _get(target, property, receiver) { var base = InterpolationDensityAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return InterpolationDensityAnalystParameters_get.apply(this, arguments); } + +function InterpolationDensityAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = InterpolationDensityAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function InterpolationDensityAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) InterpolationDensityAnalystParameters_setPrototypeOf(subClass, superClass); } + +function InterpolationDensityAnalystParameters_setPrototypeOf(o, p) { InterpolationDensityAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return InterpolationDensityAnalystParameters_setPrototypeOf(o, p); } + +function InterpolationDensityAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = InterpolationDensityAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = InterpolationDensityAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = InterpolationDensityAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return InterpolationDensityAnalystParameters_possibleConstructorReturn(this, result); }; } + +function InterpolationDensityAnalystParameters_possibleConstructorReturn(self, call) { if (call && (InterpolationDensityAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return InterpolationDensityAnalystParameters_assertThisInitialized(self); } + +function InterpolationDensityAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function InterpolationDensityAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function InterpolationDensityAnalystParameters_getPrototypeOf(o) { InterpolationDensityAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return InterpolationDensityAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class InterpolationDensityAnalystParameters + * @deprecatedclass SuperMap.InterpolationDensityAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 点密度差值分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {number} [options.searchRadius=0] - 查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时。此为必选参数。 + * @param {number} [options.zValueScale=1] - 进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 用来做插值分析的数据源中数据集的名称,该名称用形如 "数据集名称@数据源别名" 形式来表示。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 geometry 时,此为必选参数。 + * @extends {InterpolationAnalystParameters} + * @example + * var myInterpolationDensityAnalystParameters = new InterpolationDensityAnalystParameters({ + * dataset: "SamplesP@Interpolation", + * searchRadius: "100000", + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myDensity" + * }); + * @usage + */ + +var InterpolationDensityAnalystParameters = /*#__PURE__*/function (_InterpolationAnalyst) { + InterpolationDensityAnalystParameters_inherits(InterpolationDensityAnalystParameters, _InterpolationAnalyst); + + var _super = InterpolationDensityAnalystParameters_createSuper(InterpolationDensityAnalystParameters); + + function InterpolationDensityAnalystParameters(options) { + var _this; + + InterpolationDensityAnalystParameters_classCallCheck(this, InterpolationDensityAnalystParameters); + + _this = _super.call(this, options); + + if (options) { + Util.extend(InterpolationDensityAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.InterpolationDensityAnalystParameters"; + return _this; + } + /** + * @function InterpolationDensityAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationDensityAnalystParameters_createClass(InterpolationDensityAnalystParameters, [{ + key: "destroy", + value: function destroy() { + InterpolationDensityAnalystParameters_get(InterpolationDensityAnalystParameters_getPrototypeOf(InterpolationDensityAnalystParameters.prototype), "destroy", this).call(this); + } + }]); + + return InterpolationDensityAnalystParameters; +}(InterpolationAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationIDWAnalystParameters.js +function InterpolationIDWAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return InterpolationIDWAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, InterpolationIDWAnalystParameters_typeof(obj); } + +function InterpolationIDWAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationIDWAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationIDWAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationIDWAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationIDWAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function InterpolationIDWAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { InterpolationIDWAnalystParameters_get = Reflect.get; } else { InterpolationIDWAnalystParameters_get = function _get(target, property, receiver) { var base = InterpolationIDWAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return InterpolationIDWAnalystParameters_get.apply(this, arguments); } + +function InterpolationIDWAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = InterpolationIDWAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function InterpolationIDWAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) InterpolationIDWAnalystParameters_setPrototypeOf(subClass, superClass); } + +function InterpolationIDWAnalystParameters_setPrototypeOf(o, p) { InterpolationIDWAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return InterpolationIDWAnalystParameters_setPrototypeOf(o, p); } + +function InterpolationIDWAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = InterpolationIDWAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = InterpolationIDWAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = InterpolationIDWAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return InterpolationIDWAnalystParameters_possibleConstructorReturn(this, result); }; } + +function InterpolationIDWAnalystParameters_possibleConstructorReturn(self, call) { if (call && (InterpolationIDWAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return InterpolationIDWAnalystParameters_assertThisInitialized(self); } + +function InterpolationIDWAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function InterpolationIDWAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function InterpolationIDWAnalystParameters_getPrototypeOf(o) { InterpolationIDWAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return InterpolationIDWAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class InterpolationIDWAnalystParameters + * @deprecatedclass SuperMap.InterpolationIDWAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 反距离加权插值(IDW)分析参数类。 + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,支持固定点数查找、定长查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置查找半径,即参与运算点的查找范围,与点数据集单位相同。 + * @param {number} [options.power=2] - 距离权重计算的幂次。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如”数据集名称@数据源别名”形式来表示。当插值分析类型(SuperMap.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(SuperMap.InterpolationAnalystType)为 geometry 时,此为必选参数。 + * @extends {InterpolationAnalystParameters} + * @example 例如: + * var myInterpolationIDWAnalystParameters = new InterpolationIDWAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * power: 2, + * searchMode: "KDTREE_FIXED_COUNT", + * expectedCount: 12, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 3000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myIDW" + * }); + * @usage + */ + +var InterpolationIDWAnalystParameters = /*#__PURE__*/function (_InterpolationAnalyst) { + InterpolationIDWAnalystParameters_inherits(InterpolationIDWAnalystParameters, _InterpolationAnalyst); + + var _super = InterpolationIDWAnalystParameters_createSuper(InterpolationIDWAnalystParameters); + + function InterpolationIDWAnalystParameters(options) { + var _this; + + InterpolationIDWAnalystParameters_classCallCheck(this, InterpolationIDWAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {number} [InterpolationIDWAnalystParameters.prototype.power=2] + * @description 距离权重计算的幂次。 + * 该值决定了权值下降的速度,幂次越大,随距离的增大权值下降越快,距离预测点越远的点的权值也越小。 + * 理论上,参数值必须大于0,但是0.5到3之间时运算结果更合理,因此推荐值为0.5~3。 + */ + + _this.power = 2; + /** + * @member {SearchMode} InterpolationIDWAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,支持固定点数查找、定长查找。 + * 具体如下: + * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。 + * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。 + */ + + _this.searchMode = null; + /** + * @member {number} [InterpolationIDWAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数。 + */ + + _this.expectedCount = 12; + + if (options) { + Util.extend(InterpolationIDWAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.InterpolationIDWAnalystParameters"; + return _this; + } + /** + * @function InterpolationIDWAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationIDWAnalystParameters_createClass(InterpolationIDWAnalystParameters, [{ + key: "destroy", + value: function destroy() { + InterpolationIDWAnalystParameters_get(InterpolationIDWAnalystParameters_getPrototypeOf(InterpolationIDWAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.power = null; + me.searchMode = null; + me.expectedCount = null; + } + }]); + + return InterpolationIDWAnalystParameters; +}(InterpolationAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationKrigingAnalystParameters.js +function InterpolationKrigingAnalystParameters_typeof(obj) { "@babel/helpers - typeof"; return InterpolationKrigingAnalystParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, InterpolationKrigingAnalystParameters_typeof(obj); } + +function InterpolationKrigingAnalystParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationKrigingAnalystParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationKrigingAnalystParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationKrigingAnalystParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationKrigingAnalystParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function InterpolationKrigingAnalystParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { InterpolationKrigingAnalystParameters_get = Reflect.get; } else { InterpolationKrigingAnalystParameters_get = function _get(target, property, receiver) { var base = InterpolationKrigingAnalystParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return InterpolationKrigingAnalystParameters_get.apply(this, arguments); } + +function InterpolationKrigingAnalystParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = InterpolationKrigingAnalystParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function InterpolationKrigingAnalystParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) InterpolationKrigingAnalystParameters_setPrototypeOf(subClass, superClass); } + +function InterpolationKrigingAnalystParameters_setPrototypeOf(o, p) { InterpolationKrigingAnalystParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return InterpolationKrigingAnalystParameters_setPrototypeOf(o, p); } + +function InterpolationKrigingAnalystParameters_createSuper(Derived) { var hasNativeReflectConstruct = InterpolationKrigingAnalystParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = InterpolationKrigingAnalystParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = InterpolationKrigingAnalystParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return InterpolationKrigingAnalystParameters_possibleConstructorReturn(this, result); }; } + +function InterpolationKrigingAnalystParameters_possibleConstructorReturn(self, call) { if (call && (InterpolationKrigingAnalystParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return InterpolationKrigingAnalystParameters_assertThisInitialized(self); } + +function InterpolationKrigingAnalystParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function InterpolationKrigingAnalystParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function InterpolationKrigingAnalystParameters_getPrototypeOf(o) { InterpolationKrigingAnalystParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return InterpolationKrigingAnalystParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class InterpolationKrigingAnalystParameters + * @deprecatedclass SuperMap.InterpolationKrigingAnalystParameters + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 克吕金插值分析参数类。通过该类可以设置克吕金插值分析所需的参数。 + * 克吕金(Kriging)法为地统计学上一种空间数据内插处理方法,主要的目的是利用各数据点间变异数(variance)的大小来推求某一未知点与各已知点的权重关系, + * 再由各数据点的值和其与未知点的权重关系推求未知点的值。Kriging 法最大的特色不仅是提供一个最小估计误差的预测值,并且可明确的指出误差值的大小。 + * 一般而言,许多地质参数,如地形面,本身即具有连续性,故在一段距离内的任两点必有空间上的关系。反之,在一不规则面上的两点若相距甚远, + * 则在统计意义上可视为互为独立 (stastically indepedent)。这种随距离而改变的空间上连续性,可用半变异图 (semivariogram) 来表现。 + * 因此,若想由已知的散乱点来推求某一未知点的值,则可利用半变异图推求各已知点与未知点的空间关系,即以下四个参数:
+ * 1.块金值(nugget):当采样点间距为0时,理论上半变异函数值为0,但时间上两采样点非常接近时半变异函数值并不为0,即产生了上图所示的块金效应, + * 对应的半变异函数值为块金值。块金值可能由于测量误差或者空间变异产生。
+ * 2.基台值(sill):随着采样点间距的不断增大,半变异函数的值趋向一个稳定的常数,该常数成为基台值。到达基台值后,半变异函数的值不再随采样点间距而改变, + * 即大于此间距的采样点不再具有空间相关性。
+ * 3.偏基台值:基台值与块金值的差值。
+ * 4.自相关阈值(range):也称变程,是半变异函数值达到基台值时,采样点的间距。超过自相关阈值的采样点不再具有空间相关性,将不对预测结果产生影响。
+ * 然后,由此空间参数推求半变异数,由各数据点间的半变异数可推求未知点与已知点间的权重关系,进而推求出未知点的值。 + * 克吕金法的优点是以空间统计学作为其坚实的理论基础,物理含义明确;不但能估计测定参数的空间变异分布,而且还可以估算参数的方差分布。克吕金法的缺点是计算步骤较烦琐, + * 计算量大,且变异函数有时需要根据经验人为选定。 + * + * 由上述可知,半变异函数是克吕金插值的关键,因此选择合适的半变异函数模型非常重要,SuperMap 提供了以下三种半变异函数模型:
+ * 1.指数型(EXPONENTIAL):适用于空间相关关系随样本间距的增加成指数递减的情况,其空间自相关关系在样本间距的无穷远处完全消失。
+ * 2.球型(SPHERICAL):适用于空间自相关关系随样本间距的增加而逐渐减少,直到超出一定的距离时空间自相关关系消失的情况。
+ * 3.高斯型(GAUSSIAN):适用于半变异函数值渐进地逼近基台值的情况。
+ * + * 半变异函数中,有一个关键参数即插值的字段值的期望(平均值),由于对于此参数的不同处理方法而衍生出了不同的 Kriging 方法。SuperMap的差值功能基于以下三种常用 Kriging 算法:
+ * 1.简单克吕金(Simple Kriging):该方法假定用于插值的字段值的期望(平均值)已知的某一常数。
+ * 2.普通克吕金(Kriging):该方法假定用于插值的字段值的期望(平均值)未知且恒定。它利用一定的数学函数,通过对给定的空间点进行拟合来估算单元格的值, + * 生成格网数据集。它不仅可以生成一个表面,还可以给出预测结果的精度或者确定性的度量。因此,此方法计算精度较高,常用于地学领域。 + * 3.泛克吕金(Universal Kriging):该方法假定用于插值的字段值的期望(平均值)是未知的变量。在样点数据中存在某种主导趋势且该趋势可以通过某一个确定 + * 的函数或者多项式进行拟合的情况下,适用泛克吕金插值法。
+ * @param {Object} options - 参数。 + * @param {string} options.type - 克吕金插值的类型。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 插值分析的范围,用于确定结果栅格数据集的范围。 + * @param {string} options.searchMode - 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。 + * @param {string} options.outputDatasetName - 插值分析结果数据集的名称。 + * @param {string} options.outputDatasourceName - 插值分析结果数据源的名称。 + * @param {string} [options.zValueFieldName] - 存储用于进行插值分析的字段名称,插值分析不支持文本类型的字段。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时,此为必选参数。 + * @param {number} [options.mean] - 【简单克吕金】类型下,插值字段的平均值。 + * @param {number} [options.angle=0] - 克吕金算法中旋转角度值。 + * @param {number} [options.nugget=0] - 克吕金算法中块金效应值。 + * @param {number} [options.range=0] - 克吕金算法中自相关阈值,单位与原数据集单位相同。 + * @param {number} [options.sill=0] - 克吕金算法中基台值。 + * @param {string} [options.variogramMode="SPHERICAL"] - 克吕金插值时的半变函数类型。 + * @param {string} [options.exponent='exp1'] - 【泛克吕金】类型下,用于插值的样点数据中趋势面方程的阶数,可选值为 exp1、exp2。 + * @param {number} [options.expectedCount=12] - 【固定点数查找】方式下,设置待查找的点数;【定长查找】方式下,设置查找的最小点数。 + * @param {number} [options.searchRadius=0] - 【定长查找】方式下,设置参与运算点的查找范围。 + * @param {number} [options.maxPointCountForInterpolation=200] - 【块查找】方式下,设置最多参与插值的点数。 + * @param {number} [options.maxPointCountInNode=50] - 【块查找】方式下,设置单个块内最多参与运算点数。 + * @param {number} [options.zValueScale=1] - 用于进行插值分析值的缩放比率。 + * @param {number} [options.resolution] - 插值结果栅格数据集的分辨率,即一个像元所代表的实地距离,与点数据集单位相同。 + * @param {FilterParameter} [options.filterQueryParameter] - 属性过滤条件。 + * @param {string} [options.pixelFormat] - 指定结果栅格数据集存储的像素格式。 + * @param {string} [options.dataset] - 要用来做插值分析的数据源中数据集的名称。该名称用形如 ”数据集名称@数据源别名” 形式来表示。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 dataset 时。 + * @param {Array.>} [options.inputPoints] - 用于做插值分析的离散点集合。当插值分析类型(InterpolationAnalystParameters.prototype.InterpolationAnalystType)为 geometry 时。 + * @extends {InterpolationAnalystParameters} + * @example 例如: + * var myInterpolationKrigingAnalystParameters = new InterpolationKrigingAnalystParameters({ + * dataset:"SamplesP@Interpolation", + * type: "KRIGING", + * angle: 0, + * mean: 5, + * nugget: 30, + * range: 50, + * sill: 300, + * variogramMode: "EXPONENTIAL", + * searchMode: "QUADTREE", + * maxPointCountForInterpolation: 20, + * maxPointCountInNode: 5, + * pixelFormat: "BIT16", + * zValueFieldName: "AVG_TMP", + * resolution: 30000, + * filterQueryParameter: { + * attributeFilter: "" + * }, + * outputDatasetName: "myKriging" + * }); + * @usage + */ + +var InterpolationKrigingAnalystParameters = /*#__PURE__*/function (_InterpolationAnalyst) { + InterpolationKrigingAnalystParameters_inherits(InterpolationKrigingAnalystParameters, _InterpolationAnalyst); + + var _super = InterpolationKrigingAnalystParameters_createSuper(InterpolationKrigingAnalystParameters); + + function InterpolationKrigingAnalystParameters(options) { + var _this; + + InterpolationKrigingAnalystParameters_classCallCheck(this, InterpolationKrigingAnalystParameters); + + _this = _super.call(this, options); + /** + * @member {InterpolationAlgorithmType} InterpolationKrigingAnalystParameters.prototype.type + * @description 克吕金插值的类型。 + * 具体如下:
+ * {KRIGING} 普通克吕金插值法。 + * {SimpleKriging} 简单克吕金插值法。 + * {UniversalKriging} 泛克吕金插值法。 + */ + + _this.type = null; + /** + * @member {number} InterpolationKrigingAnalystParameters.prototype.mean + * @description 【简单克吕金】方式下,插值字段的平均值。 + * 即采样点插值字段值总和除以采样点数目。 + */ + + _this.mean = null; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.angle=0] + * @description 克吕金算法中旋转角度值。 + * 此角度值指示了每个查找邻域相对于水平方向逆时针旋转的角度。 + */ + + _this.angle = 0; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.nugget=0] + * @description 克吕金算法中块金效应值。 + */ + + _this.nugget = 0; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.range=0] + * @description 克吕金算法中自相关阈值,单位与原数据集单位相同。 + */ + + _this.range = 0; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.sill=0] + * @description 克吕金算法中基台值。 + */ + + _this.sill = 0; + /** + * @member {VariogramMode} [InterpolationKrigingAnalystParameters.prototype.variogramMode=VariogramMode.SPHERICAL] + * @description 克吕金插值时的半变函数类型。 + * 用户所选择的半变函数类型会影响未知点的预测,特别是曲线在原点处的不同形状有重要意义。 + * 曲线在原点处越陡,则较近领域对该预测值的影响就越大,因此输出表面就会越不光滑。 + */ + + _this.variogramMode = VariogramMode.SPHERICAL; + /** + * @member {Exponent} [InterpolationKrigingAnalystParameters.prototype.exponent=Exponent.EXP1] + * @description 【泛克吕金】类型下,用于插值的样点数据中趋势面方程的阶数。 + */ + + _this.exponent = Exponent.EXP1; + /** + * @member {SearchMode} InterpolationKrigingAnalystParameters.prototype.searchMode + * @description 插值运算时,查找参与运算点的方式,有固定点数查找、定长查找、块查找。此为必选参数。 + * 简单克吕金和泛克吕金不支持块查找。 + * 具体如下:
+ * {KDTREE_FIXED_COUNT} 使用 KDTREE 的固定点数方式查找参与内插分析的点。
+ * {KDTREE_FIXED_RADIUS} 使用 KDTREE 的定长方式查找参与内插分析的点。
+ * {QUADTREE} 使用 QUADTREE 方式查找参与内插分析的点(块查找)。 + */ + + _this.searchMode = null; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.expectedCount=12] + * @description 【固定点数查找】方式下,设置待查找的点数,即参与差值运算的点数,默认值为12。 + * 【定长查找】方式下,设置查找的最小点数,默认值为12。 + */ + + _this.expectedCount = 12; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.maxPointCountForInterpolation=200] + * @description 【块查找】方式下,最多参与插值的点数。 + * 仅用于普通克吕金插值,简单克吕金和泛克吕金不支持块查找。 + */ + + _this.maxPointCountForInterpolation = 200; + /** + * @member {number} [InterpolationKrigingAnalystParameters.prototype.maxPointCountInNode=50] + * @description 【块查找】方式下,设置单个块内最多参与运算点数。 + * 仅用于普通克吕金插值,简单克吕金和泛克吕金不支持块查找。 + */ + + _this.maxPointCountInNode = 50; + + if (options) { + Util.extend(InterpolationKrigingAnalystParameters_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.InterpolationKrigingAnalystParameters"; + return _this; + } + /** + * @function InterpolationKrigingAnalystParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationKrigingAnalystParameters_createClass(InterpolationKrigingAnalystParameters, [{ + key: "destroy", + value: function destroy() { + InterpolationKrigingAnalystParameters_get(InterpolationKrigingAnalystParameters_getPrototypeOf(InterpolationKrigingAnalystParameters.prototype), "destroy", this).call(this); + + var me = this; + me.type = null; + me.mean = null; + me.angle = null; + me.nugget = null; + me.range = null; + me.sill = null; + me.variogramMode = null; + me.exponent = null; + me.searchMode = null; + me.expectedCount = null; + me.maxPointCountForInterpolation = null; + me.maxPointCountInNode = null; + } + }]); + + return InterpolationKrigingAnalystParameters; +}(InterpolationAnalystParameters); +;// CONCATENATED MODULE: ./src/common/iServer/InterpolationAnalystService.js +function InterpolationAnalystService_typeof(obj) { "@babel/helpers - typeof"; return InterpolationAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, InterpolationAnalystService_typeof(obj); } + +function InterpolationAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function InterpolationAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function InterpolationAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) InterpolationAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) InterpolationAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function InterpolationAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { InterpolationAnalystService_get = Reflect.get; } else { InterpolationAnalystService_get = function _get(target, property, receiver) { var base = InterpolationAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return InterpolationAnalystService_get.apply(this, arguments); } + +function InterpolationAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = InterpolationAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function InterpolationAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) InterpolationAnalystService_setPrototypeOf(subClass, superClass); } + +function InterpolationAnalystService_setPrototypeOf(o, p) { InterpolationAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return InterpolationAnalystService_setPrototypeOf(o, p); } + +function InterpolationAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = InterpolationAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = InterpolationAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = InterpolationAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return InterpolationAnalystService_possibleConstructorReturn(this, result); }; } + +function InterpolationAnalystService_possibleConstructorReturn(self, call) { if (call && (InterpolationAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return InterpolationAnalystService_assertThisInitialized(self); } + +function InterpolationAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function InterpolationAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function InterpolationAnalystService_getPrototypeOf(o) { InterpolationAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return InterpolationAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class InterpolationAnalystService + * @deprecatedclass SuperMap.InterpolationAnalystService + * @category iServer SpatialAnalyst InterpolationAnalyst + * @classdesc 插值分析服务类。 + * 插值分析可以将有限的采样点数据,通过插值算法对采样点周围的数值情况进行预测,可以掌握研究区域内数据的总体分布状况,从而使采样的离散点不仅仅反映其所在位置的数值情况, + * 还可以反映区域的数值分布。目前SuperMap iServer的插值功能提供从点数据集插值得到栅格数据集的功能,支持以下常用的内插方法, + * 包括:反距离加权插值、克吕金(Kriging)插值法、样条(径向基函数,Radial Basis Function)插值、点密度插值。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myTInterpolationAnalystService = new InterpolationAnalystService(url); + * myTInterpolationAnalystService.events.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ + +var InterpolationAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + InterpolationAnalystService_inherits(InterpolationAnalystService, _SpatialAnalystBase); + + var _super = InterpolationAnalystService_createSuper(InterpolationAnalystService); + + function InterpolationAnalystService(url, options) { + var _this; + + InterpolationAnalystService_classCallCheck(this, InterpolationAnalystService); + + _this = _super.call(this, url, options); + /** + * @member {string} InterpolationAnalystService.prototype.mode + * @description 插值分析类型。 + */ + + _this.mode = null; + + if (options) { + Util.extend(InterpolationAnalystService_assertThisInitialized(_this), options); + } + + return _this; + } + /** + * @function InterpolationAnalystService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + InterpolationAnalystService_createClass(InterpolationAnalystService, [{ + key: "destroy", + value: function destroy() { + InterpolationAnalystService_get(InterpolationAnalystService_getPrototypeOf(InterpolationAnalystService.prototype), "destroy", this).call(this); + + this.mode = null; + this.CLASS_NAME = "SuperMap.InterpolationAnalystService"; + } + /** + * @function InterpolationAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {InterpolationDensityAnalystParameters|InterpolationIDWAnalystParameters|InterpolationRBFAnalystParameters|InterpolationKrigingAnalystParameters} parameter - 插值分析参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof InterpolationDensityAnalystParameters) { + me.mode = 'Density'; + + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/density'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/density'); + } + } else if (parameter instanceof InterpolationIDWAnalystParameters) { + me.mode = 'IDW'; + + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/idw'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/idw'); + } + } else if (parameter instanceof InterpolationRBFAnalystParameters) { + me.mode = 'RBF'; + + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/rbf'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/rbf'); + } + } else if (parameter instanceof InterpolationKrigingAnalystParameters) { + me.mode = 'Kriging'; + + if (parameter.InterpolationAnalystType === 'geometry') { + me.url = Util.urlPathAppend(me.url, 'geometry/interpolation/kriging'); + } else { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/interpolation/kriging'); + } + } + + InterpolationAnalystParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return InterpolationAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/KernelDensityJobParameter.js +function KernelDensityJobParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function KernelDensityJobParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function KernelDensityJobParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) KernelDensityJobParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) KernelDensityJobParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class KernelDensityJobParameter + * @deprecatedclass SuperMap.KernelDensityJobParameter + * @category iServer ProcessingService DensityAnalyst + * @classdesc 核密度分析服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.fields - 权重索引。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {number} [options.resolution=80] - 分辨率。 + * @param {number} [options.method=0] - 分析方法。 + * @param {number} [options.meshType=0] - 分析类型。 + * @param {number} [options.radius=300] - 分析的影响半径。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var KernelDensityJobParameter = /*#__PURE__*/function () { + function KernelDensityJobParameter(options) { + KernelDensityJobParameter_classCallCheck(this, KernelDensityJobParameter); + + if (!options) { + return; + } + /** + * @member {string} KernelDensityJobParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject} [KernelDensityJobParameter.prototype.query] + * @description 分析范围。 + */ + + this.query = ""; + /** + * @member {number} [KernelDensityJobParameter.prototype.resolution=80] + * @description 网格大小。 + */ + + this.resolution = 80; + /** + * @member {number} [KernelDensityJobParameter.prototype.method=0] + * @description 分析方法。 + */ + + this.method = 0; + /** + * @member {number} [KernelDensityJobParameter.prototype.meshType=0] + * @description 分析类型。 + */ + + this.meshType = 0; + /** + * @member {string} KernelDensityJobParameter.prototype.fields + * @description 权重索引。 + */ + + this.fields = ""; + /** + * @member {number} [KernelDensityJobParameter.prototype.radius=300] + * @description 分析的影响半径。 + */ + + this.radius = 300; + /** + * @member {AnalystSizeUnit} [KernelDensityJobParameter.prototype.meshSizeUnit=AnalystSizeUnit.METER] + * @description 网格大小单位。 + */ + + this.meshSizeUnit = AnalystSizeUnit.METER; + /** + * @member {AnalystSizeUnit} [KernelDensityJobParameter.prototype.radiusUnit=AnalystSizeUnit.METER] + * @description 搜索半径单位。 + */ + + this.radiusUnit = AnalystSizeUnit.METER; + /** + * @member {AnalystAreaUnit} [KernelDensityJobParameter.prototype.areaUnit=AnalystAreaUnit.SQUAREMILE] + * @description 面积单位。 + */ + + this.areaUnit = AnalystAreaUnit.SQUAREMILE; + /** + * @member {OutputSetting} KernelDensityJobParameter.prototype.output + * @description 输出参数设置类 + */ + + this.output = null; + /** + * @member {MappingParameters} [KernelDensityJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.KernelDensityJobParameter"; + } + /** + * @function KernelDensityJobParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + KernelDensityJobParameter_createClass(KernelDensityJobParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.query = null; + this.resolution = null; + this.method = null; + this.radius = null; + this.meshType = null; + this.fields = null; + this.meshSizeUnit = null; + this.radiusUnit = null; + this.areaUnit = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function KernelDensityJobParameter.toObject + * @param {KernelDensityJobParameter} kernelDensityJobParameter - 核密度分析服务参数类。 + * @param {KernelDensityJobParameter} tempObj - 核密度分析服务参数对象。 + * @description 将核密度分析服务参数对象转换为 JSON 对象。 + * @returns JSON 对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(kernelDensityJobParameter, tempObj) { + for (var name in kernelDensityJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = kernelDensityJobParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = kernelDensityJobParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + + if (name === 'query' && kernelDensityJobParameter[name]) { + tempObj['analyst'][name] = kernelDensityJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = kernelDensityJobParameter[name]; + } + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = kernelDensityJobParameter[name]; + } + } + } + }]); + + return KernelDensityJobParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/KernelDensityJobsService.js +function KernelDensityJobsService_typeof(obj) { "@babel/helpers - typeof"; return KernelDensityJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, KernelDensityJobsService_typeof(obj); } + +function KernelDensityJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function KernelDensityJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function KernelDensityJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) KernelDensityJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) KernelDensityJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function KernelDensityJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { KernelDensityJobsService_get = Reflect.get; } else { KernelDensityJobsService_get = function _get(target, property, receiver) { var base = KernelDensityJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return KernelDensityJobsService_get.apply(this, arguments); } + +function KernelDensityJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = KernelDensityJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function KernelDensityJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) KernelDensityJobsService_setPrototypeOf(subClass, superClass); } + +function KernelDensityJobsService_setPrototypeOf(o, p) { KernelDensityJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return KernelDensityJobsService_setPrototypeOf(o, p); } + +function KernelDensityJobsService_createSuper(Derived) { var hasNativeReflectConstruct = KernelDensityJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = KernelDensityJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = KernelDensityJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return KernelDensityJobsService_possibleConstructorReturn(this, result); }; } + +function KernelDensityJobsService_possibleConstructorReturn(self, call) { if (call && (KernelDensityJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return KernelDensityJobsService_assertThisInitialized(self); } + +function KernelDensityJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function KernelDensityJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function KernelDensityJobsService_getPrototypeOf(o) { KernelDensityJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return KernelDensityJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class KernelDensityJobsService + * @deprecatedclass SuperMap.KernelDensityJobsService + * @category iServer ProcessingService DensityAnalyst + * @classdesc 核密度分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var KernelDensityJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + KernelDensityJobsService_inherits(KernelDensityJobsService, _ProcessingServiceBas); + + var _super = KernelDensityJobsService_createSuper(KernelDensityJobsService); + + function KernelDensityJobsService(url, options) { + var _this; + + KernelDensityJobsService_classCallCheck(this, KernelDensityJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/density'); + _this.CLASS_NAME = "SuperMap.KernelDensityJobsService"; + return _this; + } + /** + * @function KernelDensityJobsService.prototype.destroy + * @override + */ + + + KernelDensityJobsService_createClass(KernelDensityJobsService, [{ + key: "destroy", + value: function destroy() { + KernelDensityJobsService_get(KernelDensityJobsService_getPrototypeOf(KernelDensityJobsService.prototype), "destroy", this).call(this); + } + /** + * @function KernelDensityJobsService.prototype.getKernelDensityJobs + * @description 获取核密度分析任务 + */ + + }, { + key: "getKernelDensityJobs", + value: function getKernelDensityJobs() { + KernelDensityJobsService_get(KernelDensityJobsService_getPrototypeOf(KernelDensityJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function KernelDensityJobsService.prototype.getKernelDensityJobs + * @description 获取指定id的核密度分析服务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getKernelDensityJob", + value: function getKernelDensityJob(id) { + KernelDensityJobsService_get(KernelDensityJobsService_getPrototypeOf(KernelDensityJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function KernelDensityJobsService.prototype.addKernelDensityJob + * @description 新建核密度分析服务 + * @param {KernelDensityJobParameter} params - 核密度分析服务参数类。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addKernelDensityJob", + value: function addKernelDensityJob(params, seconds) { + KernelDensityJobsService_get(KernelDensityJobsService_getPrototypeOf(KernelDensityJobsService.prototype), "addJob", this).call(this, this.url, params, KernelDensityJobParameter, seconds); + } + }]); + + return KernelDensityJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/LabelMatrixCell.js +function LabelMatrixCell_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LabelMatrixCell_createClass(Constructor, protoProps, staticProps) { if (protoProps) LabelMatrixCell_defineProperties(Constructor.prototype, protoProps); if (staticProps) LabelMatrixCell_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LabelMatrixCell_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LabelMatrixCell + * @deprecatedclass SuperMap.LabelMatrixCell + * @category iServer Map Theme + * @classdesc 矩阵标签元素抽象类。该类可以包含 n*n 个矩阵标签元素,矩阵标签元素的类型可以是图片,符号,标签专题图等。 + * 符号类型的矩阵标签元素类、图片类型的矩阵标签元素类和专题图类型的矩阵标签元素类均继承自该类。 + * @usage + */ +var LabelMatrixCell = /*#__PURE__*/LabelMatrixCell_createClass(function LabelMatrixCell() { + LabelMatrixCell_classCallCheck(this, LabelMatrixCell); + + this.CLASS_NAME = "LabelMatrixCell"; +}); +;// CONCATENATED MODULE: ./src/common/iServer/LabelImageCell.js +function LabelImageCell_typeof(obj) { "@babel/helpers - typeof"; return LabelImageCell_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, LabelImageCell_typeof(obj); } + +function LabelImageCell_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LabelImageCell_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LabelImageCell_createClass(Constructor, protoProps, staticProps) { if (protoProps) LabelImageCell_defineProperties(Constructor.prototype, protoProps); if (staticProps) LabelImageCell_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LabelImageCell_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) LabelImageCell_setPrototypeOf(subClass, superClass); } + +function LabelImageCell_setPrototypeOf(o, p) { LabelImageCell_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return LabelImageCell_setPrototypeOf(o, p); } + +function LabelImageCell_createSuper(Derived) { var hasNativeReflectConstruct = LabelImageCell_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = LabelImageCell_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = LabelImageCell_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return LabelImageCell_possibleConstructorReturn(this, result); }; } + +function LabelImageCell_possibleConstructorReturn(self, call) { if (call && (LabelImageCell_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return LabelImageCell_assertThisInitialized(self); } + +function LabelImageCell_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function LabelImageCell_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function LabelImageCell_getPrototypeOf(o) { LabelImageCell_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return LabelImageCell_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LabelImageCell + * @deprecatedclass SuperMap.LabelImageCell + * @category iServer Map Theme + * @classdesc 图片类型的矩阵标签元素类。该类继承自 {@link LabelMatrixCell}类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图(ThemeLabel)的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options - 可选参数。 + * @param {number} [options.height=0] - 设置图片的高度,单位为毫米。 + * @param {string} [options.pathField] - 设置矩阵标签元素所使用图片的路径。 + * @param {number} [options.rotation=0.0] - 图片的旋转角度。逆时针方向为正方向,单位为度,精确到0.1度。 + * @param {number} [options.width=0] - 设置图片的宽度,单位为毫米。 + * @param {boolean} [options.sizeFixed=false] - 是否固定图片的大小。 + * @usage + */ + +var LabelImageCell = /*#__PURE__*/function (_LabelMatrixCell) { + LabelImageCell_inherits(LabelImageCell, _LabelMatrixCell); + + var _super = LabelImageCell_createSuper(LabelImageCell); + + function LabelImageCell(options) { + var _this; + + LabelImageCell_classCallCheck(this, LabelImageCell); + + _this = _super.call(this, options); + /** + * @member {number} LabelImageCell.prototype.height + * @description 设置图片的高度,单位为毫米。 + */ + + _this.height = 0; + /** + * @member {string} LabelImageCell.prototype.pathField + * @description 设置矩阵标签元素所使用的图片路径对应的字段名。 + */ + + _this.pathField = null; + /** + * @member {number} [LabelImageCell.prototype.rotation=0.0] + * @description 图片的旋转角度。逆时针方向为正方向,单位为度,精确到0.1度。 + */ + + _this.rotation = 0.0; + /** + * @member {number} LabelImageCell.prototype.width + * @description 设置图片的宽度,单位为毫米。 + */ + + _this.width = 0; + /** + * @member {boolean} [LabelImageCell.prototype.sizeFixed=false] + * @description 是否固定图片的大小。 + */ + + _this.sizeFixed = false; + /** + * @member {string} LabelImageCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + + _this.type = "IMAGE"; + + if (options) { + Util.extend(LabelImageCell_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.LabelImageCell"; + return _this; + } + /** + * @function LabelImageCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LabelImageCell_createClass(LabelImageCell, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.height = null; + me.pathField = null; + me.rotation = null; + me.width = null; + me.sizeFixed = null; + } + }]); + + return LabelImageCell; +}(LabelMatrixCell); +;// CONCATENATED MODULE: ./src/common/iServer/LabelSymbolCell.js +function LabelSymbolCell_typeof(obj) { "@babel/helpers - typeof"; return LabelSymbolCell_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, LabelSymbolCell_typeof(obj); } + +function LabelSymbolCell_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LabelSymbolCell_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LabelSymbolCell_createClass(Constructor, protoProps, staticProps) { if (protoProps) LabelSymbolCell_defineProperties(Constructor.prototype, protoProps); if (staticProps) LabelSymbolCell_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LabelSymbolCell_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) LabelSymbolCell_setPrototypeOf(subClass, superClass); } + +function LabelSymbolCell_setPrototypeOf(o, p) { LabelSymbolCell_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return LabelSymbolCell_setPrototypeOf(o, p); } + +function LabelSymbolCell_createSuper(Derived) { var hasNativeReflectConstruct = LabelSymbolCell_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = LabelSymbolCell_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = LabelSymbolCell_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return LabelSymbolCell_possibleConstructorReturn(this, result); }; } + +function LabelSymbolCell_possibleConstructorReturn(self, call) { if (call && (LabelSymbolCell_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return LabelSymbolCell_assertThisInitialized(self); } + +function LabelSymbolCell_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function LabelSymbolCell_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function LabelSymbolCell_getPrototypeOf(o) { LabelSymbolCell_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return LabelSymbolCell_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LabelSymbolCell + * @deprecatedclass SuperMap.LabelSymbolCell + * @category iServer Map Theme + * @classdesc 符号类型的矩阵标签元素类。 + * 该类继承自 {@link LabelMatrixCell}类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图({@link ThemeLabel})的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 属是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options - 参数。 + * @param {ServerStyle} options.style - 获取或设置符号样式。 + * @param {string} options.symbolIDField - 符号 ID 或符号 ID 所对应的字段名称。 + * @usage + */ + +var LabelSymbolCell = /*#__PURE__*/function (_LabelMatrixCell) { + LabelSymbolCell_inherits(LabelSymbolCell, _LabelMatrixCell); + + var _super = LabelSymbolCell_createSuper(LabelSymbolCell); + + function LabelSymbolCell(options) { + var _this; + + LabelSymbolCell_classCallCheck(this, LabelSymbolCell); + + _this = _super.call(this, options); + /** + * @member {ServerStyle} LabelSymbolCell.prototype.style + * @description 获取或设置符号样式—— {@link ServerStyle} 对象,包括符号大小({@link ServerStyle#markerSize}) + * 和符号旋转({@link ServerStyle#markerAngle})角度,其中用于设置符号 ID 的属性({@link ServerStyle#markerSymbolID})在此处不起作用。 + */ + + _this.style = new ServerStyle(); + /** + * @member {string} LabelSymbolCell.prototype.symbolIDField + * @description 获取或设置符号 ID 或符号 ID 所对应的字段名称。 + */ + + _this.symbolIDField = null; + /** + * @member {string} LabelSymbolCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + + _this.type = "SYMBOL"; + + if (options) { + Util.extend(LabelSymbolCell_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.LabelSymbolCell"; + return _this; + } + /** + * @function LabelSymbolCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LabelSymbolCell_createClass(LabelSymbolCell, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + + me.symbolIDField = null; + } + }]); + + return LabelSymbolCell; +}(LabelMatrixCell); +;// CONCATENATED MODULE: ./src/common/iServer/LabelThemeCell.js +function LabelThemeCell_typeof(obj) { "@babel/helpers - typeof"; return LabelThemeCell_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, LabelThemeCell_typeof(obj); } + +function LabelThemeCell_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LabelThemeCell_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LabelThemeCell_createClass(Constructor, protoProps, staticProps) { if (protoProps) LabelThemeCell_defineProperties(Constructor.prototype, protoProps); if (staticProps) LabelThemeCell_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function LabelThemeCell_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) LabelThemeCell_setPrototypeOf(subClass, superClass); } + +function LabelThemeCell_setPrototypeOf(o, p) { LabelThemeCell_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return LabelThemeCell_setPrototypeOf(o, p); } + +function LabelThemeCell_createSuper(Derived) { var hasNativeReflectConstruct = LabelThemeCell_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = LabelThemeCell_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = LabelThemeCell_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return LabelThemeCell_possibleConstructorReturn(this, result); }; } + +function LabelThemeCell_possibleConstructorReturn(self, call) { if (call && (LabelThemeCell_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return LabelThemeCell_assertThisInitialized(self); } + +function LabelThemeCell_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function LabelThemeCell_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function LabelThemeCell_getPrototypeOf(o) { LabelThemeCell_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return LabelThemeCell_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LabelThemeCell + * @deprecatedclass SuperMap.LabelThemeCell + * @category iServer Map Theme + * @classdesc 专题图类型的矩阵标签元素类。 + * 该类继承自 {@link LabelMatrixCell} 类,主要对矩阵标签中的专题图类型的矩阵标签元素进行设置。 + * 矩阵标签专题图是标签专题图({@link ThemeLabel})的一种,其中矩阵标签中的填充元素又可分为图片类型({@link LabelImageCell})、 + * 符号类型({@link LabelSymbolCell})、专题图类型({@link LabelThemeCell})三种,该类是这三种类型的矩阵标签元素其中的一种, + * 用于定义符号类型的矩阵标签,如符号 ID 字段名称(符号 ID 与 SuperMap 桌面产品中点、线、面符号的 ID 对应) 、大小等。 + * 用户在实现矩阵标签专题图时只需将定义好的矩阵标签元素赋值予 {@link ThemeLabel#matrixCells} 属性即可。matrixCells 属是一个二维数组, + * 每一维可以是任意类型的矩阵标签元素组成的数组(也可是单个标签元素组成的数组,即数组中只有一个元素)。 + * @extends {LabelMatrixCell} + * @param {Object} options -参数。 + * @param {ThemeLabel} options.themeLabel - 作为矩阵标签元素的标签专题图类。 + * @usage + */ + +var LabelThemeCell = /*#__PURE__*/function (_LabelMatrixCell) { + LabelThemeCell_inherits(LabelThemeCell, _LabelMatrixCell); + + var _super = LabelThemeCell_createSuper(LabelThemeCell); + + function LabelThemeCell(options) { + var _this; + + LabelThemeCell_classCallCheck(this, LabelThemeCell); + + _this = _super.call(this, options); + /** + * @member {ThemeLabel} LabelThemeCell.prototype.themeLabel + * @description 使用专题图对象作为矩阵标签的一个元素。 + */ + + _this.themeLabel = new ThemeLabel(); + /** + * @member {string} LabelThemeCell.prototype.type + * @description 制作矩阵专题图时是必须的。 + */ + + _this.type = "THEME"; + + if (options) { + Util.extend(LabelThemeCell_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = " SuperMap.LabelThemeCell"; + return _this; + } + /** + * @function LabelThemeCell.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LabelThemeCell_createClass(LabelThemeCell, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.themeLabel) { + me.themeLabel.destroy(); + me.themeLabel = null; + } + } + }]); + + return LabelThemeCell; +}(LabelMatrixCell); +;// CONCATENATED MODULE: ./src/common/iServer/LayerStatus.js +function LayerStatus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LayerStatus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LayerStatus_createClass(Constructor, protoProps, staticProps) { if (protoProps) LayerStatus_defineProperties(Constructor.prototype, protoProps); if (staticProps) LayerStatus_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LayerStatus + * @deprecatedclass SuperMap.LayerStatus + * @category iServer Map TempLayersSet + * @classdesc 子图层显示参数类。该类存储了各个子图层的名字和是否可见的状态。 + * @param {Object} options - 参数。 + * @param {string} options.layerName - 图层名称。 + * @param {boolean} [options.isVisible=true] - 图层是否可见,true 表示可见。 + * @param {string} [options.displayFilter] - 图层显示 SQL 过滤条件。 + * @usage + */ + +var LayerStatus = /*#__PURE__*/function () { + function LayerStatus(options) { + LayerStatus_classCallCheck(this, LayerStatus); + + /** + * @member {string} LayerStatus.prototype.layerName + * @description 获取或设置图层名称。 + */ + this.layerName = null; + /** + * @member {boolean} LayerStatus.prototype.isVisible + * @description 获取或设置图层是否可见,true 表示可见。 + */ + + this.isVisible = null; + /** + * @member {string} [LayerStatus.prototype.displayFilter] + * @description 图层显示 SQL 过滤条件,如 layerStatus.displayFilter = "smid < 10",表示仅显示 smid 值小于 10 的对象。 + */ + + this.displayFilter = null; + /** + * @member {Object} [LayerStatus.prototype.fieldValuesDisplayFilter] + * @property {Array.} values - 要过滤的值。 + * @property {string} fieldName - 要过滤的字段名称只支持数字类型的字段。 + * @property {string} fieldValuesDisplayMode - 目前有两个 DISPLAY/DISABLE。当为 DISPLAY 时,表示只显示以上设置的相应属性值的要素,否则表示不显示以上设置的相应属性值的要素。 + */ + + this.fieldValuesDisplayFilter = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LayerStatus"; + } + /** + * @function LayerStatus.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LayerStatus_createClass(LayerStatus, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.layerName = null; + me.isVisible = null; + me.displayFilter = null; + } + /** + * @function LayerStatus.prototype.toJSON + * @description 生成对应的 JSON。 + * @returns {Object} 对应的 JSON。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var json = '{'; + json += '"type":"UGC",'; + var v = []; + + if (this.layerName) { + v.push('"name":"' + this.layerName + '"'); + v.push('"visible":' + this.isVisible); + } + + if (this.displayFilter) { + v.push('"displayFilter":"' + this.displayFilter + '"'); + } + + if (this.minScale || this.minScale == 0) { + v.push('"minScale":' + this.minScale); + } + + if (this.maxScale || this.maxScale == 0) { + v.push('"maxScale":' + this.maxScale); + } + + if (this.fieldValuesDisplayFilter) { + v.push('"fieldValuesDisplayFilter":' + Util.toJSON(this.fieldValuesDisplayFilter)); + } + + json += v; + json += '}'; + return json; + } + }]); + + return LayerStatus; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/LinkItem.js +function LinkItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LinkItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LinkItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LinkItem + * @deprecatedclass SuperMap.LinkItem + * @constructs LinkItem + * @category iServer Data FeatureResults + * @classdesc 关联信息类。该类用于矢量数据集与外部表的关联。 外部表是另一个数据集(其中纯属性数据集中没有空间几何信息)中的 DBMS 表, + * 矢量数据集与外部表可以属于不同的数据源,但数据源类型目前只支持 SQL Server 和 Oracle 类型。使用 LinkItem 时, + * 空间数据和属性数据必须满足关联条件,即主空间数据集与外部属性表之间存在关联字段。{@link LinkItem} + * 只支持左连接,UDB、PostgreSQL 和 DB2 数据源不支持 {@link LinkItem};另外,用于建立关联关系的两个表可以不在同一个数据源下。注意:
+ * 1.使用 {@link LinkItem} 的约束条件为:空间数据和属性数据必须有关联条件,即主空间数据集与外部属性表之间存在关联字段;
+ * 2.使用外关联表制作专题图时,所关联的字段必须设置表名,例如,如果所关联的字段为 BaseMap_R 数据集的 SmID,就要写成 BaseMap_R.SMID。 + * @param {Object} options - 参数。 + * @param {DatasourceConnectionInfo} options.datasourceConnectionInfo - 关联的外部数据源信息。 + * @param {Array.} options.foreignKeys - 主空间数据集的外键。 + * @param {string} options.foreignTable - 关联的外部属性表的名称。 + * @param {Array.} options.linkFields - 欲保留的外部属性表的字段。 + * @param {string} options.linkFilter - 与外部属性表的连接条件。 + * @param {string} options.name - 此关联信息对象的名称。 + * @param {Array.} options.primaryKeys - 关联的外部属性表的主键。 + * @example 下面以 SQL 查询说明 linkitem 的使用方法: + * function queryBySQL() { + * // 设置关联的外部数据库信息,alias表示数据库别名 + * var dc = new DatasourceConnectionInfo({ + * dataBase: "RelQuery", + * server: "{ip}:{port}", + * user: "sa", + * password: "map", + * driver: "SQL Server", + * connect: true, + * OpenLinkTable: false, + * alias: "RelQuery", + * engineType: EngineType.SQLPLUS, + * readOnly: false, + * exclusive: false + * }); + * // 设置关联信息 + * var linkItem = new LinkItem({ + * datasourceConnectionInfo: dc, + * foreignKeys: ["name"], + * foreignTable: "Pop_2011", + * linkFields: ["SmID as Pid","pop"], + * name: "link", + * primatryKeys: ["name"], + * }); + * // 设置查询参数,在查询参数中添加linkItem关联条件信息 + * var queryParam, queryBySQLParams, queryBySQLService; + * queryParam = new FilterParameter({ + * name: "Province@RelQuery", + * fields: ["SmID","name"], + * attributeFilter: "SmID<7", + * linkItems: [linkItem] + * }), + * queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }), + * queryBySQLService = new QueryBySQLService(url, { + * eventListeners: { + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * } + * function processCompleted(queryEventArgs) {//todo} + * function processFailed(e) {//todo} + * @usage + */ + +var LinkItem = /*#__PURE__*/function () { + function LinkItem(options) { + LinkItem_classCallCheck(this, LinkItem); + + /** + * @member {DatasourceConnectionInfo} LinkItem.prototype.datasourceConnectionInfo + * @description 关联的外部数据源信息。 + */ + this.datasourceConnectionInfo = null; + /** + * @member {Array.} LinkItem.prototype.foreignKeys + * @description 主空间数据集的外键。 + */ + + this.foreignKeys = null; + /** + * @member {string} LinkItem.prototype.foreignTable + * @description 关联的外部属性表的名称,目前仅支持 Supermap 管理的表,即另一个矢量数据集所对应的 DBMS 表。 + */ + + this.foreignTable = null; + /** + * @member {Array.} LinkItem.prototype.linkFields + * @description 欲保留的外部属性表的字段。如果不设置字段或者设置的字段在外部属性表中不存在的话则不返 + * 回任何外部属性表的属性信息。如果欲保留的外部表字段与主表字段存在同名,则还需要指定一个不存在字段名作为外部表的字段别名。 + */ + + this.linkFields = null; + /** + * @member {string} LinkItem.prototype.linkFilter + * @description 与外部属性表的连接条件。 + */ + + this.linkFilter = null; + /** + * @member {string} LinkItem.prototype.name + * @description 此关联信息对象的名称。 + */ + + this.name = null; + /** + * @member {Array.} LinkItem.prototype.primaryKeys + * @description 需要关联的外部属性表的主键。 + */ + + this.primaryKeys = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.LinkItem"; + } + /** + * @function LinkItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + LinkItem_createClass(LinkItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + + if (me.datasourceConnectionInfo instanceof DatasourceConnectionInfo) { + me.datasourceConnectionInfo.destroy(); + me.datasourceConnectionInfo = null; + } + + me.foreignKeys = null; + me.foreignTable = null; + me.linkFields = null; + me.linkFilter = null; + me.name = null; + me.primaryKeys = null; + } + }]); + + return LinkItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/MapService.js +function MapService_typeof(obj) { "@babel/helpers - typeof"; return MapService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MapService_typeof(obj); } + +function MapService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MapService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MapService_createClass(Constructor, protoProps, staticProps) { if (protoProps) MapService_defineProperties(Constructor.prototype, protoProps); if (staticProps) MapService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MapService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { MapService_get = Reflect.get; } else { MapService_get = function _get(target, property, receiver) { var base = MapService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return MapService_get.apply(this, arguments); } + +function MapService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = MapService_getPrototypeOf(object); if (object === null) break; } return object; } + +function MapService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MapService_setPrototypeOf(subClass, superClass); } + +function MapService_setPrototypeOf(o, p) { MapService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MapService_setPrototypeOf(o, p); } + +function MapService_createSuper(Derived) { var hasNativeReflectConstruct = MapService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MapService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MapService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MapService_possibleConstructorReturn(this, result); }; } + +function MapService_possibleConstructorReturn(self, call) { if (call && (MapService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MapService_assertThisInitialized(self); } + +function MapService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MapService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MapService_getPrototypeOf(o) { MapService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MapService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class MapService + * @deprecatedclass SuperMap.MapService + * @category iServer Map + * @classdesc 地图信息服务类。 + * @extends {CommonServiceBase} + * @example + * var myMapService = new MapService(url, { + * eventListeners:{ + * "processCompleted": MapServiceCompleted, + * "processFailed": MapServiceFailed + * } + * }); + * + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var MapService = /*#__PURE__*/function (_CommonServiceBase) { + MapService_inherits(MapService, _CommonServiceBase); + + var _super = MapService_createSuper(MapService); + + function MapService(url, options) { + var _this; + + MapService_classCallCheck(this, MapService); + + _this = _super.call(this, url, options); + /** + * @member {string} MapService.prototype.projection + * @description 根据投影参数获取地图状态信息。如"EPSG:4326" + */ + + _this.projection = null; + _this.CLASS_NAME = "SuperMap.MapService"; + + if (options) { + Util.extend(MapService_assertThisInitialized(_this), options); + } + + var me = MapService_assertThisInitialized(_this); + + if (me.projection) { + var arr = me.projection.split(":"); + + if (arr instanceof Array) { + if (arr.length === 2) { + me.url = Util.urlAppend(me.url, "prjCoordSys=".concat(encodeURIComponent("{\"epsgCode\":\"".concat(arr[1], "\"}")))); + } + + if (arr.length === 1) { + me.url = Util.urlAppend(me.url, "prjCoordSys=".concat(encodeURIComponent("{\"epsgCode\":\"".concat(arr[0], "\"}")))); + } + } + } + + return _this; + } + /** + * @function destroy + * @description 释放资源,将引用的资源属性置空。 + */ + + + MapService_createClass(MapService, [{ + key: "destroy", + value: function destroy() { + MapService_get(MapService_getPrototypeOf(MapService.prototype), "destroy", this).call(this); + + var me = this; + + if (me.events) { + me.events.un(me.eventListeners); + me.events.listeners = null; + me.events.destroy(); + me.events = null; + me.eventListeners = null; + } + } + /** + * @function MapService.prototype.processAsync + * @description 负责将客户端的设置的参数传递到服务端,与服务端完成异步通讯。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + var me = this; + me.request({ + method: "GET", + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /* + * Method: getMapStatusCompleted + * 获取地图状态完成,执行此方法。 + * + * Parameters: + * {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + var codeStatus = result.code >= 200 && result.code < 300 || result.code == 0 || result.code === 304; + var isCodeValid = result.code && codeStatus; + + if (!result.code || isCodeValid) { + me.events && me.events.triggerEvent("processCompleted", { + result: result + }); + } else { + ////在没有token是返回的是200,但是其实是没有权限,所以这里也应该是触发失败事件 + me.events.triggerEvent("processFailed", { + error: result + }); + } + } + }]); + + return MapService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/MathExpressionAnalysisParameters.js +function MathExpressionAnalysisParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MathExpressionAnalysisParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MathExpressionAnalysisParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) MathExpressionAnalysisParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) MathExpressionAnalysisParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class MathExpressionAnalysisParameters + * @deprecatedclass SuperMap.MathExpressionAnalysisParameters + * @category iServer SpatialAnalyst GridMathAnalyst + * @classdesc 栅格代数运算参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 指定栅格代数运算数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示,例如:BaseMap_P@Jingjin。 + * @param {string} options.resultGridName - 指定结果数据集名称。 + * @param {string} options.expression - 指定的栅格运算表达式。如:[DatasourceAlias1.Raster1]*2-10。 + * @param {string} options.targetDatasource - 指定存储结果数据集的数据源。 + * @param {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [options.extractRegion] - 栅格代数运算的范围,指定数据集中参与栅格代数运算的区域。 + * 如果缺省,则计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域 。 + * @param {boolean} [options.isZip=false] - 是否对结果数据集进行压缩处理。 + * @param {boolean} [options.ignoreNoValue=false] - 是否忽略无值栅格数据。true 表示忽略无值数据,即无值栅格不参与运算。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ + +var MathExpressionAnalysisParameters = /*#__PURE__*/function () { + function MathExpressionAnalysisParameters(options) { + MathExpressionAnalysisParameters_classCallCheck(this, MathExpressionAnalysisParameters); + + if (!options) { + return; + } + /** + * @member {string} MathExpressionAnalysisParameters.prototype.dataset + * @description 要用来做栅格代数运算数据源中数据集的名称。 + * 该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * + */ + + + this.dataset = null; + /** + * @member {GeometryPolygon|L.Polygon|ol.geom.Polygon|GeoJSONObject} [MathExpressionAnalysisParameters.prototype.extractRegion] + * @description 栅格代数运算的范围,指定数据集中参与栅格代数运算的区域。 + * 如果缺省,则计算全部区域,如果参与运算的数据集范围不一致,将使用所有数据集的范围的交集作为计算区域 。 + */ + + this.extractRegion = null; + /** + * @member {string} MathExpressionAnalysisParameters.prototype.expression + * @description 指定的栅格运算表达式。如:"[DatasourceAlias1.Raster1]*2-10"。 + */ + + this.expression = null; + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.isZip=false] + * @description 是否对结果数据集进行压缩处理。 + */ + + this.isZip = false; + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.ignoreNoValue=false] + * @description 是否忽略无值栅格数据。 + */ + + this.ignoreNoValue = false; + /** + * @member {string} MathExpressionAnalysisParameters.prototype.targetDatasource + * @description 指定存储结果数据集的数据源。 + */ + + this.targetDatasource = null; + /** + * @member {string} MathExpressionAnalysisParameters.prototype.resultGridName + * @description 指定结果数据集名称。 + */ + + this.resultGridName = null; + /** + * @member {boolean} [MathExpressionAnalysisParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + + this.deleteExistResultDataset = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.MathExpressionAnalysisParameters"; + } + /** + * @function MathExpressionAnalysisParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + MathExpressionAnalysisParameters_createClass(MathExpressionAnalysisParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dataset = null; + me.bounds = null; + me.expression = null; + me.isZip = true; + me.ignoreNoValue = true; + me.targetDatasource = null; + me.resultGridName = null; + me.deleteExistResultDataset = null; + } + /** + * @function MathExpressionAnalysisParameters.toObject + * @param {Object} mathExpressionAnalysisParameters - 栅格代数运算参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成栅格代数运算对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(mathExpressionAnalysisParameters, tempObj) { + for (var name in mathExpressionAnalysisParameters) { + if (name !== "dataset") { + tempObj[name] = mathExpressionAnalysisParameters[name]; + } + + if (name === "extractRegion") { + if (mathExpressionAnalysisParameters[name]) { + var bs = mathExpressionAnalysisParameters[name].components[0].components; + var region = {}, + points = [], + type = "REGION"; + var len = bs.length; + + for (var i = 0; i < len - 1; i++) { + var poi = {}; + poi["x"] = bs[i].x; + poi["y"] = bs[i].y; + points.push(poi); + } + + region["points"] = points; + region["type"] = type; + tempObj[name] = region; + } + } + } + } + }]); + + return MathExpressionAnalysisParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/MathExpressionAnalysisService.js +function MathExpressionAnalysisService_typeof(obj) { "@babel/helpers - typeof"; return MathExpressionAnalysisService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MathExpressionAnalysisService_typeof(obj); } + +function MathExpressionAnalysisService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MathExpressionAnalysisService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MathExpressionAnalysisService_createClass(Constructor, protoProps, staticProps) { if (protoProps) MathExpressionAnalysisService_defineProperties(Constructor.prototype, protoProps); if (staticProps) MathExpressionAnalysisService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MathExpressionAnalysisService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { MathExpressionAnalysisService_get = Reflect.get; } else { MathExpressionAnalysisService_get = function _get(target, property, receiver) { var base = MathExpressionAnalysisService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return MathExpressionAnalysisService_get.apply(this, arguments); } + +function MathExpressionAnalysisService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = MathExpressionAnalysisService_getPrototypeOf(object); if (object === null) break; } return object; } + +function MathExpressionAnalysisService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MathExpressionAnalysisService_setPrototypeOf(subClass, superClass); } + +function MathExpressionAnalysisService_setPrototypeOf(o, p) { MathExpressionAnalysisService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MathExpressionAnalysisService_setPrototypeOf(o, p); } + +function MathExpressionAnalysisService_createSuper(Derived) { var hasNativeReflectConstruct = MathExpressionAnalysisService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MathExpressionAnalysisService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MathExpressionAnalysisService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MathExpressionAnalysisService_possibleConstructorReturn(this, result); }; } + +function MathExpressionAnalysisService_possibleConstructorReturn(self, call) { if (call && (MathExpressionAnalysisService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MathExpressionAnalysisService_assertThisInitialized(self); } + +function MathExpressionAnalysisService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MathExpressionAnalysisService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MathExpressionAnalysisService_getPrototypeOf(o) { MathExpressionAnalysisService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MathExpressionAnalysisService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class MathExpressionAnalysisService + * @deprecatedclass SuperMap.MathExpressionAnalysisService + * @category iServer SpatialAnalyst GridMathAnalyst + * @classdesc 栅格代数运算服务类。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myMathExpressionAnalysisService = new MathExpressionAnalysisService(url); + * myMathExpressionAnalysisService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ + +var MathExpressionAnalysisService = /*#__PURE__*/function (_SpatialAnalystBase) { + MathExpressionAnalysisService_inherits(MathExpressionAnalysisService, _SpatialAnalystBase); + + var _super = MathExpressionAnalysisService_createSuper(MathExpressionAnalysisService); + + function MathExpressionAnalysisService(url, options) { + var _this; + + MathExpressionAnalysisService_classCallCheck(this, MathExpressionAnalysisService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.MathExpressionAnalysisService"; + return _this; + } + /** + * @override + */ + + + MathExpressionAnalysisService_createClass(MathExpressionAnalysisService, [{ + key: "destroy", + value: function destroy() { + MathExpressionAnalysisService_get(MathExpressionAnalysisService_getPrototypeOf(MathExpressionAnalysisService.prototype), "destroy", this).call(this); + } + /** + * @function MathExpressionAnalysisService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {MathExpressionAnalysisParameters} parameter - 栅格代数运算参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var me = this; + var parameterObject = {}; + + if (parameter instanceof MathExpressionAnalysisParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/mathanalyst'); + } + + MathExpressionAnalysisParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return MathExpressionAnalysisService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/MeasureParameters.js +function MeasureParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MeasureParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MeasureParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) MeasureParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) MeasureParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class MeasureParameters + * @deprecatedclass SuperMap.MeasureParameters + * @category iServer Map Measure + * @classdesc 量算参数类。 + * @param {GeoJSONObject} geometry - 要量算的几何对象。 + * @param {Object} options - 可选参数。 + * @param {Unit} [options.unit=Unit.METER] - 量算单位。 + * @param {string} [options.prjCoordSys] - 用来指定该量算操作所使用的投影。 + * @param {string} [options.distanceMode="Geodesic"] - 用来指定量算的方式为按球面长度 'Geodesic' 或者平面长度 'Planar' 来计算。 + * @usage + */ + +var MeasureParameters = /*#__PURE__*/function () { + function MeasureParameters(geometry, options) { + MeasureParameters_classCallCheck(this, MeasureParameters); + + if (!geometry) { + return; + } + /** + * @member {GeoJSONObject} MeasureParameters.prototype.geometry + * @description 要量算的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。 + */ + + + this.geometry = geometry; + /** + * @member {Unit} [MeasureParameters.prototype.unit=Unit.METER] + * @description 量算单位。即量算结果以米为单位。 + */ + + this.unit = Unit.METER; + /** + * @member {string} [MeasureParameters.prototype.prjCoordSys] + * @description 用来指定该量算操作所使用的投影。 + */ + + this.prjCoordSys = null; + /** + * @member {string} [MeasureParameters.prototype.distanceMode="Geodesic"] + * @description 用来指定量算的方式为按球面长度 'Geodesic' 或者平面长度 'Planar' 来计算。 + * @example + * var param = new MeasureParameters(getmetry,{distanceMode:'Planar'}); + */ + + this.distanceMode = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.MeasureParameters"; + } + /** + * @function MeasureParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + MeasureParameters_createClass(MeasureParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.geometry = null; + me.unit = null; + me.prjCoordSys = null; + } + }]); + + return MeasureParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/MeasureService.js +function MeasureService_typeof(obj) { "@babel/helpers - typeof"; return MeasureService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MeasureService_typeof(obj); } + +function MeasureService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MeasureService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MeasureService_createClass(Constructor, protoProps, staticProps) { if (protoProps) MeasureService_defineProperties(Constructor.prototype, protoProps); if (staticProps) MeasureService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MeasureService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { MeasureService_get = Reflect.get; } else { MeasureService_get = function _get(target, property, receiver) { var base = MeasureService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return MeasureService_get.apply(this, arguments); } + +function MeasureService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = MeasureService_getPrototypeOf(object); if (object === null) break; } return object; } + +function MeasureService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MeasureService_setPrototypeOf(subClass, superClass); } + +function MeasureService_setPrototypeOf(o, p) { MeasureService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MeasureService_setPrototypeOf(o, p); } + +function MeasureService_createSuper(Derived) { var hasNativeReflectConstruct = MeasureService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MeasureService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MeasureService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MeasureService_possibleConstructorReturn(this, result); }; } + +function MeasureService_possibleConstructorReturn(self, call) { if (call && (MeasureService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MeasureService_assertThisInitialized(self); } + +function MeasureService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MeasureService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MeasureService_getPrototypeOf(o) { MeasureService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MeasureService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class MeasureService + * @deprecatedclass SuperMap.MeasureService + * @category iServer Map Measure + * @classdesc 量算服务类。 + * 该类负责将量算参数传递到服务端,并获取服务端返回的量算结果。 + * @extends {CommonServiceBase} + * @example + * var myMeasuerService = new MeasureService(url, { + * measureMode: MeasureMode.DISTANCE, + * eventListeners:{ + * "processCompleted": measureCompleted + * } + * }); + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @param {MeasureMode} options.measureMode - 量算模式,包括距离量算模式和面积量算模式。 + * @usage + */ + +var MeasureService = /*#__PURE__*/function (_CommonServiceBase) { + MeasureService_inherits(MeasureService, _CommonServiceBase); + + var _super = MeasureService_createSuper(MeasureService); + + function MeasureService(url, options) { + var _this; + + MeasureService_classCallCheck(this, MeasureService); + + _this = _super.call(this, url, options); + /** + * @member {MeasureMode} [MeasureService.prototype.measureMode=MeasureMode.DISTANCE] + * @description 量算模式,包括距离量算模式和面积量算模式。 + */ + + _this.measureMode = MeasureMode.DISTANCE; + + if (options) { + Util.extend(MeasureService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.MeasureService"; + return _this; + } + /** + * @override + */ + + + MeasureService_createClass(MeasureService, [{ + key: "destroy", + value: function destroy() { + MeasureService_get(MeasureService_getPrototypeOf(MeasureService.prototype), "destroy", this).call(this); + + var me = this; + me.measureMode = null; + } + /** + * @function MeasureService.prototype.processAsync + * @description 负责将客户端的量算参数传递到服务端。 + * @param {MeasureParameters} params - 量算参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof MeasureParameters)) { + return; + } + + var me = this, + geometry = params.geometry, + pointsCount = 0, + point2ds = null; + + if (!geometry) { + return; + } + + me.url = Util.urlPathAppend(me.url, me.measureMode === MeasureMode.AREA ? 'area' : 'distance'); + var serverGeometry = ServerGeometry.fromGeometry(geometry); + + if (!serverGeometry) { + return; + } + + pointsCount = serverGeometry.parts[0]; + point2ds = serverGeometry.points.splice(0, pointsCount); + var prjCoordSysTemp, prjCodeTemp, paramsTemp; + + if (params.prjCoordSys) { + if (MeasureService_typeof(params.prjCoordSys) === "object") { + prjCodeTemp = params.prjCoordSys.projCode; + prjCoordSysTemp = '{"epsgCode"' + prjCodeTemp.substring(prjCodeTemp.indexOf(":"), prjCodeTemp.length) + "}"; + } else if (typeof params.prjCoordSys === "string") { + prjCoordSysTemp = '{"epsgCode"' + params.prjCoordSys.substring(params.prjCoordSys.indexOf(":"), params.prjCoordSys.length) + "}"; + } + + paramsTemp = { + "point2Ds": Util.toJSON(point2ds), + "unit": params.unit, + "prjCoordSys": prjCoordSysTemp, + "distanceMode": params.distanceMode || 'Geodesic' + }; + } else { + paramsTemp = { + "point2Ds": Util.toJSON(point2ds), + "unit": params.unit, + "distanceMode": params.distanceMode || 'Geodesic' + }; + } + + me.request({ + method: "GET", + params: paramsTemp, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return MeasureService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/OverlapDisplayedOptions.js +function OverlapDisplayedOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OverlapDisplayedOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OverlapDisplayedOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) OverlapDisplayedOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) OverlapDisplayedOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class OverlapDisplayedOptions + * @deprecatedclass SuperMap.OverlapDisplayedOptions + * @category iServer Map Layer + * @classdesc 地图压盖过滤显示选项。在文本或专题图元素显示较密集的区域,文本之间或专题元素之间会发生相互压盖的现象, + * 该类可以分别控制各种类型的对象的压盖显示情况,进而很好地处理地图中各种类型对象的压盖显示问题。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.allowPointOverlap=true] - 点和点压盖时是否显示压盖的点对象。 + * @param {boolean} [options.allowPointWithTextDisplay=true] - 标签和相应普通图层上的点是否一起过滤显示,如果过滤显示, + * 只以图层集合中对应数据集的索引最小的图层的点风格来绘制点。 + * @param {boolean} [options.allowTextOverlap=false] - 文本压盖时是否显示压盖的文本对象。 + * @param {boolean} [options.allowTextAndPointOverlap=true] - 文本和点压盖时是否显示压盖的文本或点对象(此属性不处理文本之间的压盖和点之间的压盖)。 + * @param {boolean} [options.allowThemeGraduatedSymbolOverlap=false] - 等级符号元素压盖时是否显示压盖的等级符号元素。 + * @param {boolean} [options.allowThemeGraphOverlap=false] - 统计专题图元素压盖时是否显示压盖的统计专题图元素。 + * @param {number} [options.horizontalOverlappedSpaceSize=0] - 两个对象之间的横向压盖间距,单位为 0.1 毫米,跟 verticalOverlappedSpaceSize 结合使用, + * 当两个对象的横向间距小于该值,且纵向间距小于 verticalOverlappedSpaceSize 时认为压盖。 + * @param {number} [options.verticalOverlappedSpaceSize=0] - 两个对象之间的纵向压盖间距,单位为 0.1 毫米,跟 horizontalOverlappedSpaceSize 结合使用, + * 当两个对象的纵向间距小于该值,且横向间距小于 horizontalOverlappedSpaceSize 时认为压盖。 + * @usage + */ + +var OverlapDisplayedOptions = /*#__PURE__*/function () { + function OverlapDisplayedOptions(options) { + OverlapDisplayedOptions_classCallCheck(this, OverlapDisplayedOptions); + + options = options || {}; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowPointOverlap=true] + * @description 点和点压盖时是否显示压盖的点对象。 + */ + + this.allowPointOverlap = true; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowPointWithTextDisplay=true] + * @description 标签和相应普通图层上的点是否一起过滤显示,如果过滤显示, + * 只以图层集合中对应数据集的索引最小的图层的点风格来绘制点。 + */ + + this.allowPointWithTextDisplay = true; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowTextOverlap=false] + * @description 文本压盖时是否显示压盖的文本对象。 + */ + + this.allowTextOverlap = false; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowTextAndPointOverlap=true] + * @description 文本和点压盖时是否显示压盖的文本或点对象(此属性不处理文本之间的压盖和点之间的压盖)。 + */ + + this.allowTextAndPointOverlap = true; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowThemeGraduatedSymbolOverlap=false] + * @description 等级符号元素压盖时是否显示压盖的等级符号元素。 + */ + + this.allowThemeGraduatedSymbolOverlap = false; + /** + * @member {boolean} [OverlapDisplayedOptions.prototype.allowThemeGraphOverlap=false] + * @description 统计专题图元素压盖时是否显示压盖的统计专题图元素。 + */ + + this.allowThemeGraphOverlap = false; + /** + * @member {number} [OverlapDisplayedOptions.prototype.horizontalOverlappedSpaceSize=0] + * @description 两个对象之间的横向压盖间距,单位为0.1毫米,跟 verticalOverlappedSpaceSize 结合使用, + * 当两个对象的横向间距小于该值,且纵向间距小于 verticalOverlappedSpaceSize 时认为压盖。 + */ + + this.horizontalOverlappedSpaceSize = 0; + /** + * @member {number} [OverlapDisplayedOptions.prototype.verticalOverlappedSpaceSize=0] + * @description 两个对象之间的纵向压盖间距,单位为0.1毫米,跟 horizontalOverlappedSpaceSize 结合使用, + * 当两个对象的纵向间距小于该值,且横向间距小于 horizontalOverlappedSpaceSize 时认为压盖。 + */ + + this.verticalOverlappedSpaceSize = 0; + Util.extend(this, options); + this.ugcLayer = new UGCLayer(options); + this.CLASS_NAME = "SuperMap.OverlapDisplayedOptions"; + } + /** + * @function OverlapDisplayedOptions.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + OverlapDisplayedOptions_createClass(OverlapDisplayedOptions, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function OverlapDisplayedOptions.prototype.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + */ + + }, { + key: "fromJson", + value: function fromJson(jsonObject) { + this.ugcLayer.fromJson.apply(this, [jsonObject]); + } + /** + * @function OverlapDisplayedOptions.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var jsonObject = this.ugcLayer.toServerJSONObject.apply(this, arguments); + return jsonObject; + } + /** + * @function OverlapDisplayedOptions.prototype.toString + * @description 转换成对应的 tileLayer 请求瓦片时 overlapDisplayedOptions 参数。 + * @returns {string} 对应的 tileLayer 请求瓦片时 overlapDisplayedOptions 参数。 + */ + + }, { + key: "toString", + value: function toString() { + var jsonObject = this.ugcLayer.toServerJSONObject.apply(this, arguments); + var str = "{"; + + for (var attr in jsonObject) { + if (jsonObject.hasOwnProperty(attr)) { + str += "'" + attr + "':" + jsonObject[attr] + ","; + } + } + + str = str.substr(0, str.length - 1); + str += "}"; + return str; + } + }]); + + return OverlapDisplayedOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/OverlayAnalystService.js +function OverlayAnalystService_typeof(obj) { "@babel/helpers - typeof"; return OverlayAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, OverlayAnalystService_typeof(obj); } + +function OverlayAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OverlayAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OverlayAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) OverlayAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) OverlayAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function OverlayAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { OverlayAnalystService_get = Reflect.get; } else { OverlayAnalystService_get = function _get(target, property, receiver) { var base = OverlayAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return OverlayAnalystService_get.apply(this, arguments); } + +function OverlayAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = OverlayAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function OverlayAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) OverlayAnalystService_setPrototypeOf(subClass, superClass); } + +function OverlayAnalystService_setPrototypeOf(o, p) { OverlayAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return OverlayAnalystService_setPrototypeOf(o, p); } + +function OverlayAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = OverlayAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = OverlayAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = OverlayAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return OverlayAnalystService_possibleConstructorReturn(this, result); }; } + +function OverlayAnalystService_possibleConstructorReturn(self, call) { if (call && (OverlayAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return OverlayAnalystService_assertThisInitialized(self); } + +function OverlayAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function OverlayAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function OverlayAnalystService_getPrototypeOf(o) { OverlayAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return OverlayAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class OverlayAnalystService + * @deprecatedclass SuperMap.OverlayAnalystService + * @category iServer SpatialAnalyst OverlayAnalyst + * @classdesc 叠加分析服务类。 + * 该类负责将客户设置的叠加分析参数传递给服务端,并接收服务端返回的叠加分析结果数据。 + * 叠加分析结果通过该类支持的事件的监听函数参数获取 + * @param {string} url - 服务地址。如http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example 例如: + * (start code) + * var myOverlayAnalystService = new OverlayAnalystService(url, { + * eventListeners: { + * "processCompleted": OverlayCompleted, + * "processFailed": OverlayFailed + * } + * }); + * (end) + * @usage + */ + +var OverlayAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + OverlayAnalystService_inherits(OverlayAnalystService, _SpatialAnalystBase); + + var _super = OverlayAnalystService_createSuper(OverlayAnalystService); + + function OverlayAnalystService(url, options) { + var _this; + + OverlayAnalystService_classCallCheck(this, OverlayAnalystService); + + _this = _super.call(this, url, options); + /** + * @member {string} OverlayAnalystService.prototype.mode + * @description 叠加分析类型 + */ + + _this.mode = null; + + if (options) { + Util.extend(OverlayAnalystService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.OverlayAnalystService"; + return _this; + } + /** + * @override + */ + + + OverlayAnalystService_createClass(OverlayAnalystService, [{ + key: "destroy", + value: function destroy() { + OverlayAnalystService_get(OverlayAnalystService_getPrototypeOf(OverlayAnalystService.prototype), "destroy", this).call(this); + + this.mode = null; + } + /** + * @function OverlayAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {OverlayAnalystParameters} parameter - 叠加分析参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof DatasetOverlayAnalystParameters) { + me.mode = "datasets"; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.sourceDataset + '/overlay'); + DatasetOverlayAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryOverlayAnalystParameters) { + me.mode = "geometry"; //支持传入多个几何要素进行叠加分析 + + if (parameter.operateGeometries && parameter.sourceGeometries) { + me.url = Util.urlPathAppend(me.url, 'geometry/overlay/batch'); + me.url = Util.urlAppend(me.url, 'ignoreAnalystParam=true'); + } else { + me.url = Util.urlPathAppend(me.url, 'geometry/overlay'); + } + + GeometryOverlayAnalystParameters.toObject(parameter, parameterObject); + } + + me.url = Util.urlAppend(me.url, 'returnContent=true'); + var jsonParameters = Util.toJSON(parameterObject); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return OverlayAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/OverlayGeoJobParameter.js +function OverlayGeoJobParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OverlayGeoJobParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OverlayGeoJobParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) OverlayGeoJobParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) OverlayGeoJobParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OverlayGeoJobParameter + * @deprecatedclass SuperMap.OverlayGeoJobParameter + * @category iServer ProcessingService OverlayAnalyst + * @classdesc 叠加分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetOverlay - 叠加对象所在的数据集名称。 + * @param {string} options.srcFields - 输入数据需要保留的字段。 + * @param {string} [options.overlayFields] - 叠加数据需要保留的字段。对分析模式为 clip、update、erase 时,此参数无效。 + * @param {string} [options.mode] - 叠加分析模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var OverlayGeoJobParameter = /*#__PURE__*/function () { + function OverlayGeoJobParameter(options) { + OverlayGeoJobParameter_classCallCheck(this, OverlayGeoJobParameter); + + if (!options) { + return; + } + /** + * @member {string} OverlayGeoJobParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {string} OverlayGeoJobParameter.prototype.datasetOverlay + * @description 叠加对象所在的数据集名称。 + */ + + this.datasetOverlay = ""; + /** + * @member {string} [OverlayGeoJobParameter.prototype.mode] + * @description 叠加分析模式。 + */ + + this.mode = ""; + /** + * @member {string} OverlayGeoJobParameter.prototype.srcFields + * @description 输入数据需要保留的字段。 + */ + + this.srcFields = ""; + /** + * @member {string} OverlayGeoJobParameter.prototype.overlayFields + * @description 叠加数据需要保留的字段,对分析模式为 clip、update、erase 时,此参数无效。 + */ + + this.overlayFields = ""; + /** + * @member {OutputSetting} [OverlayGeoJobParameter.prototype.output] + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [OverlayGeoJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OverlayGeoJobParameter"; + } + /** + * @function OverlayGeoJobParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + OverlayGeoJobParameter_createClass(OverlayGeoJobParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.datasetOverlay = null; + this.mode = null; + this.srcFields = null; + this.overlayFields = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function OverlayGeoJobParameter.toObject + * @param {Object} OverlayGeoJobParameter - 点聚合分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成点聚合分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(_OverlayGeoJobParameter, tempObj) { + for (var name in _OverlayGeoJobParameter) { + if (name == "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = _OverlayGeoJobParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = _OverlayGeoJobParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = _OverlayGeoJobParameter[name]; + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = _OverlayGeoJobParameter[name]; + } + } + } + }]); + + return OverlayGeoJobParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/OverlayGeoJobsService.js +function OverlayGeoJobsService_typeof(obj) { "@babel/helpers - typeof"; return OverlayGeoJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, OverlayGeoJobsService_typeof(obj); } + +function OverlayGeoJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OverlayGeoJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OverlayGeoJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) OverlayGeoJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) OverlayGeoJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function OverlayGeoJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { OverlayGeoJobsService_get = Reflect.get; } else { OverlayGeoJobsService_get = function _get(target, property, receiver) { var base = OverlayGeoJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return OverlayGeoJobsService_get.apply(this, arguments); } + +function OverlayGeoJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = OverlayGeoJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function OverlayGeoJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) OverlayGeoJobsService_setPrototypeOf(subClass, superClass); } + +function OverlayGeoJobsService_setPrototypeOf(o, p) { OverlayGeoJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return OverlayGeoJobsService_setPrototypeOf(o, p); } + +function OverlayGeoJobsService_createSuper(Derived) { var hasNativeReflectConstruct = OverlayGeoJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = OverlayGeoJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = OverlayGeoJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return OverlayGeoJobsService_possibleConstructorReturn(this, result); }; } + +function OverlayGeoJobsService_possibleConstructorReturn(self, call) { if (call && (OverlayGeoJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return OverlayGeoJobsService_assertThisInitialized(self); } + +function OverlayGeoJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function OverlayGeoJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function OverlayGeoJobsService_getPrototypeOf(o) { OverlayGeoJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return OverlayGeoJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OverlayGeoJobsService + * @deprecatedclass SuperMap.OverlayGeoJobsService + * @category iServer ProcessingService OverlayAnalyst + * @classdesc 叠加分析任务类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {number} options.index - 服务访问地址在数组中的位置。 + * @param {number} options.length - 服务访问地址数组长度。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var OverlayGeoJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + OverlayGeoJobsService_inherits(OverlayGeoJobsService, _ProcessingServiceBas); + + var _super = OverlayGeoJobsService_createSuper(OverlayGeoJobsService); + + function OverlayGeoJobsService(url, options) { + var _this; + + OverlayGeoJobsService_classCallCheck(this, OverlayGeoJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/overlay'); + _this.CLASS_NAME = 'SuperMap.OverlayGeoJobsService'; + return _this; + } + /** + * @override + */ + + + OverlayGeoJobsService_createClass(OverlayGeoJobsService, [{ + key: "destroy", + value: function destroy() { + OverlayGeoJobsService_get(OverlayGeoJobsService_getPrototypeOf(OverlayGeoJobsService.prototype), "destroy", this).call(this); + } + /** + * @function OverlayGeoJobsService.prototype.getOverlayGeoJobs + * @description 获取叠加分析任务 + */ + + }, { + key: "getOverlayGeoJobs", + value: function getOverlayGeoJobs() { + OverlayGeoJobsService_get(OverlayGeoJobsService_getPrototypeOf(OverlayGeoJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function OverlayGeoJobsService.prototype.getOverlayGeoJob + * @description 获取指定id的叠加分析任务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getOverlayGeoJob", + value: function getOverlayGeoJob(id) { + OverlayGeoJobsService_get(OverlayGeoJobsService_getPrototypeOf(OverlayGeoJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function OverlayGeoJobsService.prototype.addOverlayGeoJob + * @description 新建点叠加析服务 + * @param {OverlayGeoJobParameter} params - 创建一个叠加分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addOverlayGeoJob", + value: function addOverlayGeoJob(params, seconds) { + OverlayGeoJobsService_get(OverlayGeoJobsService_getPrototypeOf(OverlayGeoJobsService.prototype), "addJob", this).call(this, this.url, params, OverlayGeoJobParameter, seconds); + } + }]); + + return OverlayGeoJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByBoundsParameters.js +function QueryByBoundsParameters_typeof(obj) { "@babel/helpers - typeof"; return QueryByBoundsParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByBoundsParameters_typeof(obj); } + +function QueryByBoundsParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByBoundsParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByBoundsParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByBoundsParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByBoundsParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByBoundsParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByBoundsParameters_get = Reflect.get; } else { QueryByBoundsParameters_get = function _get(target, property, receiver) { var base = QueryByBoundsParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByBoundsParameters_get.apply(this, arguments); } + +function QueryByBoundsParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByBoundsParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByBoundsParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByBoundsParameters_setPrototypeOf(subClass, superClass); } + +function QueryByBoundsParameters_setPrototypeOf(o, p) { QueryByBoundsParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByBoundsParameters_setPrototypeOf(o, p); } + +function QueryByBoundsParameters_createSuper(Derived) { var hasNativeReflectConstruct = QueryByBoundsParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByBoundsParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByBoundsParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByBoundsParameters_possibleConstructorReturn(this, result); }; } + +function QueryByBoundsParameters_possibleConstructorReturn(self, call) { if (call && (QueryByBoundsParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByBoundsParameters_assertThisInitialized(self); } + +function QueryByBoundsParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByBoundsParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByBoundsParameters_getPrototypeOf(o) { QueryByBoundsParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByBoundsParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class QueryByBoundsParameters + * @deprecatedclass SuperMap.QueryByBoundsParameters + * @category iServer Map QueryResults + * @classdesc Bounds 查询参数类。该类用于设置 Bounds 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} options.bounds - 指定的查询范围。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] -自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ + +var QueryByBoundsParameters = /*#__PURE__*/function (_QueryParameters) { + QueryByBoundsParameters_inherits(QueryByBoundsParameters, _QueryParameters); + + var _super = QueryByBoundsParameters_createSuper(QueryByBoundsParameters); + + function QueryByBoundsParameters(options) { + var _this; + + QueryByBoundsParameters_classCallCheck(this, QueryByBoundsParameters); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {boolean} [QueryByBoundsParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + + _this.returnContent = true; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} QueryByBoundsParameters.prototype.bounds + * @description 指定的查询范围。 + */ + + _this.bounds = null; + Util.extend(QueryByBoundsParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.QueryByBoundsParameters"; + return _this; + } + /** + * @function QueryByBoundsParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryByBoundsParameters_createClass(QueryByBoundsParameters, [{ + key: "destroy", + value: function destroy() { + QueryByBoundsParameters_get(QueryByBoundsParameters_getPrototypeOf(QueryByBoundsParameters.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + + if (me.bounds) { + me.bounds = null; + } + } + }]); + + return QueryByBoundsParameters; +}(QueryParameters); +;// CONCATENATED MODULE: ./src/common/iServer/QueryService.js +function QueryService_typeof(obj) { "@babel/helpers - typeof"; return QueryService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryService_typeof(obj); } + +function QueryService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryService_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryService_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryService_get = Reflect.get; } else { QueryService_get = function _get(target, property, receiver) { var base = QueryService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryService_get.apply(this, arguments); } + +function QueryService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryService_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryService_setPrototypeOf(subClass, superClass); } + +function QueryService_setPrototypeOf(o, p) { QueryService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryService_setPrototypeOf(o, p); } + +function QueryService_createSuper(Derived) { var hasNativeReflectConstruct = QueryService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryService_possibleConstructorReturn(this, result); }; } + +function QueryService_possibleConstructorReturn(self, call) { if (call && (QueryService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryService_assertThisInitialized(self); } + +function QueryService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryService_getPrototypeOf(o) { QueryService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class QueryService + * @deprecatedclass SuperMap.QueryService + * @category iServer Map QueryResults + * @classdesc 查询服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图查询服务的 URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myService = new QueryService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }; + * @usage + */ + +var QueryService = /*#__PURE__*/function (_CommonServiceBase) { + QueryService_inherits(QueryService, _CommonServiceBase); + + var _super = QueryService_createSuper(QueryService); + + function QueryService(url, options) { + var _this; + + QueryService_classCallCheck(this, QueryService); + + _this = _super.call(this, url, options); + /** + * @member {boolean} QueryService.prototype.returnContent + * @description 是否立即返回新创建资源的表述还是返回新资源的URI。 + */ + + _this.returnContent = false; + /** + * @member {string} QueryService.prototype.format + * @description 查询结果返回格式,目前支持iServerJSON 和GeoJSON两种格式。参数格式为"ISERVER","GEOJSON"。 + */ + + _this.format = DataFormat.GEOJSON; + _this.returnFeatureWithFieldCaption = false; + + if (options) { + Util.extend(QueryService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.QueryService"; + + if (!_this.url) { + return QueryService_possibleConstructorReturn(_this); + } + + if (options && options.format) { + _this.format = options.format.toUpperCase(); + } + + _this.url = Util.urlPathAppend(_this.url, 'queryResults'); + return _this; + } + /** + * @function QueryService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryService_createClass(QueryService, [{ + key: "destroy", + value: function destroy() { + QueryService_get(QueryService_getPrototypeOf(QueryService.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + me.format = null; + } + /** + * @function QueryService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {QueryParameters} params - 查询参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof QueryParameters)) { + return; + } + + var me = this, + returnCustomResult = null, + jsonParameters = null; + me.returnContent = params.returnContent; + jsonParameters = me.getJsonParameters(params); + + if (me.returnContent) { + me.url = Util.urlAppend(me.url, 'returnContent=' + me.returnContent); + } else { + //仅供三维使用 获取高亮图片的bounds + returnCustomResult = params.returnCustomResult; + + if (returnCustomResult) { + me.url = Util.urlAppend(me.url, 'returnCustomResult=' + returnCustomResult); + } + } + + me.returnFeatureWithFieldCaption = params.returnFeatureWithFieldCaption; + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function QueryService.prototype.serviceProcessCompleted + * @description 查询完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + var geoJSONFormat = new GeoJSON(); + + if (result && result.recordsets) { + for (var i = 0, recordsets = result.recordsets, len = recordsets.length; i < len; i++) { + if (recordsets[i].features) { + if (me.returnFeatureWithFieldCaption === true) { + recordsets[i].features.map(function (feature) { + feature.fieldNames = recordsets[i].fieldCaptions; + return feature; + }); + } + + if (me.format === DataFormat.GEOJSON) { + recordsets[i].features = geoJSONFormat.toGeoJSON(recordsets[i].features); + } + } + } + } + + me.events.triggerEvent("processCompleted", { + result: result + }); + } + /** + * @function QueryService.prototype.getQueryParameters + * @description 将 JSON 对象表示的查询参数转化为 QueryParameters 对象。 + * @param {Object} params - JSON 字符串表示的查询参数。 + * @returns {QueryParameters} 返回转化后的 QueryParameters 对象。 + */ + + }, { + key: "getQueryParameters", + value: function getQueryParameters(params) { + return new QueryParameters({ + customParams: params.customParams, + expectCount: params.expectCount, + networkType: params.networkType, + queryOption: params.queryOption, + queryParams: params.queryParams, + startRecord: params.startRecord, + prjCoordSys: params.prjCoordSys, + holdTime: params.holdTime + }); + } + }]); + + return QueryService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByBoundsService.js +function QueryByBoundsService_typeof(obj) { "@babel/helpers - typeof"; return QueryByBoundsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByBoundsService_typeof(obj); } + +function QueryByBoundsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByBoundsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByBoundsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByBoundsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByBoundsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByBoundsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByBoundsService_get = Reflect.get; } else { QueryByBoundsService_get = function _get(target, property, receiver) { var base = QueryByBoundsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByBoundsService_get.apply(this, arguments); } + +function QueryByBoundsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByBoundsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByBoundsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByBoundsService_setPrototypeOf(subClass, superClass); } + +function QueryByBoundsService_setPrototypeOf(o, p) { QueryByBoundsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByBoundsService_setPrototypeOf(o, p); } + +function QueryByBoundsService_createSuper(Derived) { var hasNativeReflectConstruct = QueryByBoundsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByBoundsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByBoundsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByBoundsService_possibleConstructorReturn(this, result); }; } + +function QueryByBoundsService_possibleConstructorReturn(self, call) { if (call && (QueryByBoundsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByBoundsService_assertThisInitialized(self); } + +function QueryByBoundsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByBoundsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByBoundsService_getPrototypeOf(o) { QueryByBoundsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByBoundsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryByBoundsService + * @deprecatedclass SuperMap.QueryByBoundsService + * @category iServer Map QueryResults + * @classdesc Bounds 查询服务类。 + * @augments {QueryService} + * @example + * (start end) + * var myQueryByBoundsService = new QueryByBoundsService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * (end) + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。
+ * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var QueryByBoundsService = /*#__PURE__*/function (_QueryService) { + QueryByBoundsService_inherits(QueryByBoundsService, _QueryService); + + var _super = QueryByBoundsService_createSuper(QueryByBoundsService); + + function QueryByBoundsService(url, options) { + var _this; + + QueryByBoundsService_classCallCheck(this, QueryByBoundsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.QueryByBoundsService"; + return _this; + } + /** + * @override + */ + + + QueryByBoundsService_createClass(QueryByBoundsService, [{ + key: "destroy", + value: function destroy() { + QueryByBoundsService_get(QueryByBoundsService_getPrototypeOf(QueryByBoundsService.prototype), "destroy", this).call(this); + } + /** + * @function QueryByBoundsService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds 等)。 + * @param {QueryByBoundsParameters} params - Bounds 查询参数。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + if (!(params instanceof QueryByBoundsParameters)) { + return null; + } + + var me = this, + jsonParameters = "", + qp = null, + bounds = params.bounds; + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'BoundsQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters += ",'bounds': {'rightTop':{'y':" + bounds.top + ",'x':" + bounds.right + "},'leftBottom':{'y':" + bounds.bottom + ",'x':" + bounds.left + "}}"; + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + }]); + + return QueryByBoundsService; +}(QueryService); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByDistanceParameters.js +function QueryByDistanceParameters_typeof(obj) { "@babel/helpers - typeof"; return QueryByDistanceParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByDistanceParameters_typeof(obj); } + +function QueryByDistanceParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByDistanceParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByDistanceParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByDistanceParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByDistanceParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByDistanceParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByDistanceParameters_get = Reflect.get; } else { QueryByDistanceParameters_get = function _get(target, property, receiver) { var base = QueryByDistanceParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByDistanceParameters_get.apply(this, arguments); } + +function QueryByDistanceParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByDistanceParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByDistanceParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByDistanceParameters_setPrototypeOf(subClass, superClass); } + +function QueryByDistanceParameters_setPrototypeOf(o, p) { QueryByDistanceParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByDistanceParameters_setPrototypeOf(o, p); } + +function QueryByDistanceParameters_createSuper(Derived) { var hasNativeReflectConstruct = QueryByDistanceParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByDistanceParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByDistanceParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByDistanceParameters_possibleConstructorReturn(this, result); }; } + +function QueryByDistanceParameters_possibleConstructorReturn(self, call) { if (call && (QueryByDistanceParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByDistanceParameters_assertThisInitialized(self); } + +function QueryByDistanceParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByDistanceParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByDistanceParameters_getPrototypeOf(o) { QueryByDistanceParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByDistanceParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class QueryByDistanceParameters + * @deprecatedclass SuperMap.QueryByDistanceParameters + * @category iServer Map QueryResults + * @classdesc Distance 查询参数类。 + * 该类用于设置 Distance 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {GeoJSONObject} options.geometry - 用于查询的几何对象。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {number} options.distance - 查询距离,单位与所查询图层对应的数据集单位相同。距离查询时,表示距离地物的距离。最近地物查询时,表示搜索的范围。此为必选参数。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] -自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] -仅供三维使用。 + * @param {boolean} [options.isNearest=false] - 是否为最近距离查询。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ + +var QueryByDistanceParameters = /*#__PURE__*/function (_QueryParameters) { + QueryByDistanceParameters_inherits(QueryByDistanceParameters, _QueryParameters); + + var _super = QueryByDistanceParameters_createSuper(QueryByDistanceParameters); + + function QueryByDistanceParameters(options) { + var _this; + + QueryByDistanceParameters_classCallCheck(this, QueryByDistanceParameters); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {number} [QueryByDistanceParameters.prototype.distance=0] + * @description 查询距离,单位与所查询图层对应的数据集单位相同。 + * 距离查询时,表示距离地物的距离。最近地物查询时,表示搜索的范围。 + */ + + /** + * @member {GeoJSONObject} QueryByDistanceParameters.prototype.geometry + * @description 用于查询的地理对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + + _this.geometry = null; + /** + * @member {boolean} [QueryByDistanceParameters.prototype.isNearest=false] + * @description 是否为最近距离查询。
+ * 建议该属性与 expectCount(继承自 {@link QueryParameters})属性联合使用。 + * 当该属性为 true 时,即表示查找最近地物,如果查询结果数大于期望返回的结果记录数(expectCount), + * 则查找结果为查询总记录中距离中心最近的 expectCount 个地物。 + * 当该属性为不为 true 时,如果查询结果数大于期望返回的结果记录数(expectCount), + * 则查找结果为从查询总记录中随机抽取的 expectCount 个地物。 + * 目前查询结果不支持按远近距离排序。 + */ + + _this.isNearest = null; + /** + * @member {boolean} [QueryByDistanceParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + + _this.returnContent = true; + Util.extend(QueryByDistanceParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.QueryByDistanceParameters"; + return _this; + } + /** + * @function QueryByDistanceParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryByDistanceParameters_createClass(QueryByDistanceParameters, [{ + key: "destroy", + value: function destroy() { + QueryByDistanceParameters_get(QueryByDistanceParameters_getPrototypeOf(QueryByDistanceParameters.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + me.distance = null; + me.isNearest = null; + + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + }]); + + return QueryByDistanceParameters; +}(QueryParameters); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByDistanceService.js +function QueryByDistanceService_typeof(obj) { "@babel/helpers - typeof"; return QueryByDistanceService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByDistanceService_typeof(obj); } + +function QueryByDistanceService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByDistanceService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByDistanceService_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByDistanceService_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByDistanceService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByDistanceService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByDistanceService_get = Reflect.get; } else { QueryByDistanceService_get = function _get(target, property, receiver) { var base = QueryByDistanceService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByDistanceService_get.apply(this, arguments); } + +function QueryByDistanceService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByDistanceService_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByDistanceService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByDistanceService_setPrototypeOf(subClass, superClass); } + +function QueryByDistanceService_setPrototypeOf(o, p) { QueryByDistanceService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByDistanceService_setPrototypeOf(o, p); } + +function QueryByDistanceService_createSuper(Derived) { var hasNativeReflectConstruct = QueryByDistanceService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByDistanceService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByDistanceService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByDistanceService_possibleConstructorReturn(this, result); }; } + +function QueryByDistanceService_possibleConstructorReturn(self, call) { if (call && (QueryByDistanceService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByDistanceService_assertThisInitialized(self); } + +function QueryByDistanceService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByDistanceService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByDistanceService_getPrototypeOf(o) { QueryByDistanceService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByDistanceService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class QueryByDistanceService + * @deprecatedclass SuperMap.QueryByDistanceService + * @category iServer Map QueryResults + * @classdesc Distance查询服务类。 + * @extends {QueryService} + * @example + * var myQueryByDistService = new QueryByDistanceService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var QueryByDistanceService = /*#__PURE__*/function (_QueryService) { + QueryByDistanceService_inherits(QueryByDistanceService, _QueryService); + + var _super = QueryByDistanceService_createSuper(QueryByDistanceService); + + function QueryByDistanceService(url, options) { + var _this; + + QueryByDistanceService_classCallCheck(this, QueryByDistanceService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.QueryByDistanceService"; + return _this; + } + /** + * @override + */ + + + QueryByDistanceService_createClass(QueryByDistanceService, [{ + key: "destroy", + value: function destroy() { + QueryByDistanceService_get(QueryByDistanceService_getPrototypeOf(QueryByDistanceService.prototype), "destroy", this).call(this); + } + /** + * @function QueryByDistanceService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryByDistanceParameters} params - Distance 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + if (!(params instanceof QueryByDistanceParameters)) { + return; + } + + var me = this, + jsonParameters = "", + qp = me.getQueryParameters(params); + var sg = ServerGeometry.fromGeometry(params.geometry); + jsonParameters += params.isNearest ? "'queryMode':'FindNearest','queryParameters':" : "'queryMode':'DistanceQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters += ",'geometry':" + Util.toJSON(sg) + ",'distance':" + params.distance; + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + }]); + + return QueryByDistanceService; +}(QueryService); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByGeometryParameters.js +function QueryByGeometryParameters_typeof(obj) { "@babel/helpers - typeof"; return QueryByGeometryParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByGeometryParameters_typeof(obj); } + +function QueryByGeometryParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByGeometryParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByGeometryParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByGeometryParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByGeometryParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByGeometryParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByGeometryParameters_get = Reflect.get; } else { QueryByGeometryParameters_get = function _get(target, property, receiver) { var base = QueryByGeometryParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByGeometryParameters_get.apply(this, arguments); } + +function QueryByGeometryParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByGeometryParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByGeometryParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByGeometryParameters_setPrototypeOf(subClass, superClass); } + +function QueryByGeometryParameters_setPrototypeOf(o, p) { QueryByGeometryParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByGeometryParameters_setPrototypeOf(o, p); } + +function QueryByGeometryParameters_createSuper(Derived) { var hasNativeReflectConstruct = QueryByGeometryParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByGeometryParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByGeometryParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByGeometryParameters_possibleConstructorReturn(this, result); }; } + +function QueryByGeometryParameters_possibleConstructorReturn(self, call) { if (call && (QueryByGeometryParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByGeometryParameters_assertThisInitialized(self); } + +function QueryByGeometryParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByGeometryParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByGeometryParameters_getPrototypeOf(o) { QueryByGeometryParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByGeometryParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryByGeometryParameters + * @deprecatedclass SuperMap.QueryByGeometryParameters + * @category iServer Map QueryResults + * @classdesc Geometry 查询参数类。 + * 该类用于设置 Geometry查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {GeoJSONObject} options.geometry - 查询的几何对象。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {Object} [options.prjCoordSys] -自定义参数,供SuperMap Online提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {boolean} [options.returnCustomResult=false] -仅供三维使用。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @param {SpatialQueryMode} [spatialQueryMode=SpatialQueryMode.INTERSECT] - 空间查询模式。 + * @usage + */ + +var QueryByGeometryParameters = /*#__PURE__*/function (_QueryParameters) { + QueryByGeometryParameters_inherits(QueryByGeometryParameters, _QueryParameters); + + var _super = QueryByGeometryParameters_createSuper(QueryByGeometryParameters); + + function QueryByGeometryParameters(options) { + var _this; + + QueryByGeometryParameters_classCallCheck(this, QueryByGeometryParameters); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {boolean} [QueryByGeometryParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。
+ * 如果为 true,则直接返回新创建资源,即查询结果的表述。
+ * 为 false,则返回的是查询结果资源的 URI。 + */ + + _this.returnContent = true; + /** + * @member {GeoJSONObject} QueryByGeometryParameters.prototype.geometry + * @description 用于查询的几何对象。
+ * 点类型可以是:{@link GeometryPoint}|{@link L.Marker}|{@link L.CircleMarker}|{@link L.Circle}|{@link L.GeoJSON}|{@link ol.geom.Point}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLat}|{@link mapboxgl.Point}|{@link GeoJSONObject}。
+ * 线类型可以是:{@link GeometryLineString}|{@link GeometryLinearRing}|{@link L.Polyline}|{@link L.GeoJSON}|{@link ol.geom.LineString}|{@link ol.format.GeoJSON}|{@link GeoJSONObject}。
+ * 面类型可以是:{@link GeometryPolygon}|{@link L.Polygon}|{@link L.GeoJSON}|{@link ol.geom.Polygon}|{@link ol.format.GeoJSON}|{@link mapboxgl.LngLatBounds}|{@link GeoJSONObject}。 + */ + + _this.geometry = null; + /** + * @member {SpatialQueryMode} [QueryByGeometryParameters.prototype.spatialQueryMode=SpatialQueryMode.INTERSECT] + * @description 空间查询模式。 + */ + + _this.spatialQueryMode = SpatialQueryMode.INTERSECT; + Util.extend(QueryByGeometryParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.QueryByGeometryParameters"; + return _this; + } + /** + * @function QueryByGeometryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryByGeometryParameters_createClass(QueryByGeometryParameters, [{ + key: "destroy", + value: function destroy() { + QueryByGeometryParameters_get(QueryByGeometryParameters_getPrototypeOf(QueryByGeometryParameters.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + me.geometry = null; + me.spatialQueryMode = null; + } + }]); + + return QueryByGeometryParameters; +}(QueryParameters); +;// CONCATENATED MODULE: ./src/common/iServer/QueryByGeometryService.js +function QueryByGeometryService_typeof(obj) { "@babel/helpers - typeof"; return QueryByGeometryService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryByGeometryService_typeof(obj); } + +function QueryByGeometryService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryByGeometryService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryByGeometryService_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryByGeometryService_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryByGeometryService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryByGeometryService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryByGeometryService_get = Reflect.get; } else { QueryByGeometryService_get = function _get(target, property, receiver) { var base = QueryByGeometryService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryByGeometryService_get.apply(this, arguments); } + +function QueryByGeometryService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryByGeometryService_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryByGeometryService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryByGeometryService_setPrototypeOf(subClass, superClass); } + +function QueryByGeometryService_setPrototypeOf(o, p) { QueryByGeometryService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryByGeometryService_setPrototypeOf(o, p); } + +function QueryByGeometryService_createSuper(Derived) { var hasNativeReflectConstruct = QueryByGeometryService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryByGeometryService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryByGeometryService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryByGeometryService_possibleConstructorReturn(this, result); }; } + +function QueryByGeometryService_possibleConstructorReturn(self, call) { if (call && (QueryByGeometryService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryByGeometryService_assertThisInitialized(self); } + +function QueryByGeometryService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryByGeometryService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryByGeometryService_getPrototypeOf(o) { QueryByGeometryService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryByGeometryService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class QueryByGeometryService + * @deprecatedclass SuperMap.QueryByGeometryService + * @category iServer Map QueryResults + * @classdesc Geometry查询服务类。 + * @extends {QueryService} + * @example + * var myQueryByGeometryService = new QueryByGeometryService(url, { + * eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var QueryByGeometryService = /*#__PURE__*/function (_QueryService) { + QueryByGeometryService_inherits(QueryByGeometryService, _QueryService); + + var _super = QueryByGeometryService_createSuper(QueryByGeometryService); + + function QueryByGeometryService(url, options) { + var _this; + + QueryByGeometryService_classCallCheck(this, QueryByGeometryService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.QueryByGeometryService"; + return _this; + } + /** + * @override + */ + + + QueryByGeometryService_createClass(QueryByGeometryService, [{ + key: "destroy", + value: function destroy() { + QueryByGeometryService_get(QueryByGeometryService_getPrototypeOf(QueryByGeometryService.prototype), "destroy", this).call(this); + } + /** + * @function QueryByGeometryService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryByGeometryParameters} params - Geometry 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + if (!(params instanceof QueryByGeometryParameters)) { + return; + } + + var me = this, + jsonParameters = "", + qp = null, + geometry = params.geometry, + sg = ServerGeometry.fromGeometry(geometry); + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'SpatialQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp) + ",'geometry':" + Util.toJSON(sg) + ",'spatialQueryMode':" + Util.toJSON(params.spatialQueryMode); + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + }]); + + return QueryByGeometryService; +}(QueryService); +;// CONCATENATED MODULE: ./src/common/iServer/QueryBySQLParameters.js +function QueryBySQLParameters_typeof(obj) { "@babel/helpers - typeof"; return QueryBySQLParameters_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryBySQLParameters_typeof(obj); } + +function QueryBySQLParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryBySQLParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryBySQLParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryBySQLParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryBySQLParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryBySQLParameters_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryBySQLParameters_get = Reflect.get; } else { QueryBySQLParameters_get = function _get(target, property, receiver) { var base = QueryBySQLParameters_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryBySQLParameters_get.apply(this, arguments); } + +function QueryBySQLParameters_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryBySQLParameters_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryBySQLParameters_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryBySQLParameters_setPrototypeOf(subClass, superClass); } + +function QueryBySQLParameters_setPrototypeOf(o, p) { QueryBySQLParameters_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryBySQLParameters_setPrototypeOf(o, p); } + +function QueryBySQLParameters_createSuper(Derived) { var hasNativeReflectConstruct = QueryBySQLParameters_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryBySQLParameters_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryBySQLParameters_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryBySQLParameters_possibleConstructorReturn(this, result); }; } + +function QueryBySQLParameters_possibleConstructorReturn(self, call) { if (call && (QueryBySQLParameters_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryBySQLParameters_assertThisInitialized(self); } + +function QueryBySQLParameters_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryBySQLParameters_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryBySQLParameters_getPrototypeOf(o) { QueryBySQLParameters_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryBySQLParameters_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class QueryBySQLParameters + * @deprecatedclass SuperMap.QueryBySQLParameters + * @category iServer Map QueryResults + * @classdesc SQL 查询参数类。 + * 该类用于设置 SQL 查询的相关参数。 + * @extends {QueryParameters} + * @param {Object} options - 参数。 + * @param {Array.} options.queryParams - 查询过滤条件参数数组。 + * @param {string} [options.customParams] - 自定义参数,供扩展使用。 + * @param {Object} [options.prjCoordSys] - 自定义参数,供 SuperMap Online 提供的动态投影查询扩展使用。如 {"epsgCode":3857}。 + * @param {number} [options.expectCount=100000] - 期望返回结果记录个数。 + * @param {GeometryType} [options.networkType=GeometryType.LINE] - 网络数据集对应的查询类型。 + * @param {QueryOption} [options.queryOption=QueryOption.ATTRIBUTEANDGEOMETRY] - 查询结果类型枚举类。 + * @param {number} [options.startRecord=0] - 查询起始记录号。 + * @param {number} [options.holdTime=10] - 资源在服务端保存的时间,单位为分钟。 + * @param {boolean} [options.returnCustomResult=false] - 仅供三维使用。 + * @param {boolean} [options.returnContent=true] - 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * @param {boolean} [options.returnFeatureWithFieldCaption = false] - 返回的查询结果要素字段标识是否为字段别名。为 false 时,返回的是字段名;为 true 时,返回的是字段别名。 + * @usage + */ + +var QueryBySQLParameters = /*#__PURE__*/function (_QueryParameters) { + QueryBySQLParameters_inherits(QueryBySQLParameters, _QueryParameters); + + var _super = QueryBySQLParameters_createSuper(QueryBySQLParameters); + + function QueryBySQLParameters(options) { + var _this; + + QueryBySQLParameters_classCallCheck(this, QueryBySQLParameters); + + options = options || {}; + _this = _super.call(this, options); + /** + * @member {boolean} [QueryBySQLParameters.prototype.returnContent=true] + * @description 是否立即返回新创建资源的表述还是返回新资源的 URI。 + * 如果为 true,则直接返回新创建资源,即查询结果的表述。 + * 为 false,则返回的是查询结果资源的 URI。 + */ + + _this.returnContent = true; + Util.extend(QueryBySQLParameters_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.QueryBySQLParameters"; + return _this; + } + /** + * @function QueryBySQLParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + QueryBySQLParameters_createClass(QueryBySQLParameters, [{ + key: "destroy", + value: function destroy() { + QueryBySQLParameters_get(QueryBySQLParameters_getPrototypeOf(QueryBySQLParameters.prototype), "destroy", this).call(this); + + var me = this; + me.returnContent = null; + } + }]); + + return QueryBySQLParameters; +}(QueryParameters); +;// CONCATENATED MODULE: ./src/common/iServer/QueryBySQLService.js +function QueryBySQLService_typeof(obj) { "@babel/helpers - typeof"; return QueryBySQLService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, QueryBySQLService_typeof(obj); } + +function QueryBySQLService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function QueryBySQLService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function QueryBySQLService_createClass(Constructor, protoProps, staticProps) { if (protoProps) QueryBySQLService_defineProperties(Constructor.prototype, protoProps); if (staticProps) QueryBySQLService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function QueryBySQLService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { QueryBySQLService_get = Reflect.get; } else { QueryBySQLService_get = function _get(target, property, receiver) { var base = QueryBySQLService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return QueryBySQLService_get.apply(this, arguments); } + +function QueryBySQLService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = QueryBySQLService_getPrototypeOf(object); if (object === null) break; } return object; } + +function QueryBySQLService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) QueryBySQLService_setPrototypeOf(subClass, superClass); } + +function QueryBySQLService_setPrototypeOf(o, p) { QueryBySQLService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return QueryBySQLService_setPrototypeOf(o, p); } + +function QueryBySQLService_createSuper(Derived) { var hasNativeReflectConstruct = QueryBySQLService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = QueryBySQLService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = QueryBySQLService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return QueryBySQLService_possibleConstructorReturn(this, result); }; } + +function QueryBySQLService_possibleConstructorReturn(self, call) { if (call && (QueryBySQLService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return QueryBySQLService_assertThisInitialized(self); } + +function QueryBySQLService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function QueryBySQLService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function QueryBySQLService_getPrototypeOf(o) { QueryBySQLService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return QueryBySQLService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class QueryBySQLService + * @deprecatedclass SuperMap.QueryBySQLService + * @category iServer Map QueryResults + * @classdesc SQL 查询服务类。在一个或多个指定的图层上查询符合 SQL 条件的空间地物信息。 + * @extends {QueryService} + * @example + * var queryParam = new FilterParameter({ + * name: "Countries@World.1", + * attributeFilter: "Pop_1994>1000000000 and SmArea>900" + * }); + * var queryBySQLParams = new QueryBySQLParameters({ + * queryParams: [queryParam] + * }); + * var myQueryBySQLService = new QueryBySQLService(url, {eventListeners: { + * "processCompleted": queryCompleted, + * "processFailed": queryError + * } + * }); + * queryBySQLService.processAsync(queryBySQLParams); + * function queryCompleted(object){//todo}; + * function queryError(object){//todo}; + * @param {string} url - 服务地址。如访问World Map服务,只需将url设为: http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 即可。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var QueryBySQLService = /*#__PURE__*/function (_QueryService) { + QueryBySQLService_inherits(QueryBySQLService, _QueryService); + + var _super = QueryBySQLService_createSuper(QueryBySQLService); + + function QueryBySQLService(url, options) { + var _this; + + QueryBySQLService_classCallCheck(this, QueryBySQLService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.QueryBySQLService"; + return _this; + } + /** + * @override + */ + + + QueryBySQLService_createClass(QueryBySQLService, [{ + key: "destroy", + value: function destroy() { + QueryBySQLService_get(QueryBySQLService_getPrototypeOf(QueryBySQLService.prototype), "destroy", this).call(this); + } + /** + * @function QueryBySQLService.prototype.getJsonParameters + * @description 将查询参数转化为 JSON 字符串。 + * 在本类中重写此方法,可以实现不同种类的查询(sql, geometry, distance, bounds等)。 + * @param {QueryBySQLParameters} params - SQL 查询参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + if (!(params instanceof QueryBySQLParameters)) { + return; + } + + var me = this, + jsonParameters = "", + qp = null; + qp = me.getQueryParameters(params); + jsonParameters += "'queryMode':'SqlQuery','queryParameters':"; + jsonParameters += Util.toJSON(qp); + jsonParameters = "{" + jsonParameters + "}"; + return jsonParameters; + } + }]); + + return QueryBySQLService; +}(QueryService); +;// CONCATENATED MODULE: ./src/common/iServer/RouteCalculateMeasureParameters.js +function RouteCalculateMeasureParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RouteCalculateMeasureParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RouteCalculateMeasureParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) RouteCalculateMeasureParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) RouteCalculateMeasureParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class RouteCalculateMeasureParameters + * @deprecatedclass SuperMap.RouteCalculateMeasureParameters + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 基于路由对象计算指定点 M 值操作的参数类。通过该类提供参数信息。 + * @param {Object} options - 参数。 + * @param {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} options.sourceRoute - 路由对象。该对象可以是用户自己生成或在数据源中查询得到的符合标准的路由对象。 + * @param {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|Array.} options.point - 二维地理坐标点对象,包含 x,y 坐标值属性的对象。 + * @param {number} [options.tolerance] - 容限值。 + * @param {boolean} [options.isIgnoreGap=false] - 是否忽略子对象之间的距离。 + * @usage + */ + +var RouteCalculateMeasureParameters = /*#__PURE__*/function () { + function RouteCalculateMeasureParameters(options) { + RouteCalculateMeasureParameters_classCallCheck(this, RouteCalculateMeasureParameters); + + if (!options) { + return this; + } + /** + * @member {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} RouteCalculateMeasureParameters.prototype.sourceRoute + * @description 路由对象。该对象可以是用户自己生成或在数据源中查询得到的符合标准的路由对象。 + */ + + + this.sourceRoute = null; + /** + * @member {GeometryPoint|L.LatLng|L.Point|ol.geom.Point|mapboxgl.LngLat|Array.} RouteCalculateMeasureParameters.prototype.point + * @description 二维地理坐标点对象,包含 x,y 坐标值属性的对象。 + */ + + this.point = null; + /** + * @member {number} [RouteCalculateMeasureParameters.prototype.tolerance] + * @description 容限值。 + */ + + this.tolerance = null; + /** + * @member {boolean} [RouteCalculateMeasureParameters.prototype.isIgnoreGap=false] + * @description 是否忽略子对象之间的距离。 + */ + + this.isIgnoreGap = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.RouteCalculateMeasureParameters"; + } + /** + * @function RouteCalculateMeasureParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + RouteCalculateMeasureParameters_createClass(RouteCalculateMeasureParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.sourceRoute = null; + me.point = null; + + if (me.tolerance) { + me.tolerance = null; + } + + if (me.isIgnoreGap) { + me.isIgnoreGap = false; + } + } + }]); + + return RouteCalculateMeasureParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/RouteCalculateMeasureService.js +function RouteCalculateMeasureService_typeof(obj) { "@babel/helpers - typeof"; return RouteCalculateMeasureService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, RouteCalculateMeasureService_typeof(obj); } + +function RouteCalculateMeasureService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RouteCalculateMeasureService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RouteCalculateMeasureService_createClass(Constructor, protoProps, staticProps) { if (protoProps) RouteCalculateMeasureService_defineProperties(Constructor.prototype, protoProps); if (staticProps) RouteCalculateMeasureService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function RouteCalculateMeasureService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { RouteCalculateMeasureService_get = Reflect.get; } else { RouteCalculateMeasureService_get = function _get(target, property, receiver) { var base = RouteCalculateMeasureService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return RouteCalculateMeasureService_get.apply(this, arguments); } + +function RouteCalculateMeasureService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = RouteCalculateMeasureService_getPrototypeOf(object); if (object === null) break; } return object; } + +function RouteCalculateMeasureService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) RouteCalculateMeasureService_setPrototypeOf(subClass, superClass); } + +function RouteCalculateMeasureService_setPrototypeOf(o, p) { RouteCalculateMeasureService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return RouteCalculateMeasureService_setPrototypeOf(o, p); } + +function RouteCalculateMeasureService_createSuper(Derived) { var hasNativeReflectConstruct = RouteCalculateMeasureService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = RouteCalculateMeasureService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = RouteCalculateMeasureService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return RouteCalculateMeasureService_possibleConstructorReturn(this, result); }; } + +function RouteCalculateMeasureService_possibleConstructorReturn(self, call) { if (call && (RouteCalculateMeasureService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return RouteCalculateMeasureService_assertThisInitialized(self); } + +function RouteCalculateMeasureService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function RouteCalculateMeasureService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function RouteCalculateMeasureService_getPrototypeOf(o) { RouteCalculateMeasureService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return RouteCalculateMeasureService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RouteCalculateMeasureService + * @deprecatedclass SuperMap.RouteCalculateMeasureService + * @category iServer SpatialAnalyst RouteCalculateMeasure + * @classdesc 基于路由对象计算指定点 M 值操作的服务类。 + * 该类负责将客户设置的计算指定点的 M 值参数传递给服务端,并接收服务端返回的 + * 指定点的 M 值。通过该类支持的事件的监听函数参数获取。 + * @extends {SpatialAnalystBase} + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 实例化该类如下例所示: + * (start code) + * var parameters = new RouteCalculateMeasureParameters({ + * "sourceRoute":{ + * "type":"LINEM", + * "parts":[4], + * "points":[ + * { + * "measure":0, + * "y":-6674.466867067764, + * "x":3817.3527876130133 + * }, + * { + * "measure":199.57954019411724, + * "y":-6670.830929417594, + * "x":3617.806369901496 + * }, + * { + * "measure":609.3656478634477, + * "y":-6877.837541432356, + * "x":3264.1498746678444 + * }, + * { + * "measure":936.0174126282958, + * "y":-7038.687780615184, + * "x":2979.846206068903 + * } + * ] + * }, + * "tolerance":1, + * "point":{ + * "x":3330.7754269417, + * "y":-6838.8394457216 + * }, + * "isIgnoreGap":false + * }); + * + * var routeCalculateMeasureService = new RouteCalculateMeasureService(spatialAnalystURL, { + * eventListeners:{ + * processCompleted:calculateCompleted, + * processFailed:calculateFailded + * } + * ); + * routeCalculateMeasureService.processAsync(parameters); + * + * //执行 + * function calculateCompleted(){todo} + * function calculateFailded(){todo} + * (end) + * @usage + */ + +var RouteCalculateMeasureService = /*#__PURE__*/function (_SpatialAnalystBase) { + RouteCalculateMeasureService_inherits(RouteCalculateMeasureService, _SpatialAnalystBase); + + var _super = RouteCalculateMeasureService_createSuper(RouteCalculateMeasureService); + + function RouteCalculateMeasureService(url, options) { + var _this; + + RouteCalculateMeasureService_classCallCheck(this, RouteCalculateMeasureService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.RouteCalculateMeasureService"; + return _this; + } + /** + * @override + */ + + + RouteCalculateMeasureService_createClass(RouteCalculateMeasureService, [{ + key: "destroy", + value: function destroy() { + RouteCalculateMeasureService_get(RouteCalculateMeasureService_getPrototypeOf(RouteCalculateMeasureService.prototype), "destroy", this).call(this); + } + /** + * @function RouteCalculateMeasureService.prototype.processAsync + * @description 负责将客户端的基于路由对象计算指定点 M 值操作的参数传递到服务端。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof RouteCalculateMeasureParameters)) { + return; + } + + var me = this, + jsonParameters; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function RouteCalculateMeasureService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + * @returns {Object} 转化后的 JSON 字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + var jsonParameters, + jsonStr = "geometry/calculatemeasure", + me = this; + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + }]); + + return RouteCalculateMeasureService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/RouteLocatorParameters.js +function RouteLocatorParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RouteLocatorParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RouteLocatorParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) RouteLocatorParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) RouteLocatorParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class RouteLocatorParameters + * @deprecatedclass SuperMap.RouteLocatorParameters + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由对象定位空间对象的参数类。 + * 参数有两种方式,分别为 Geometry 和 Dataset 两种,前者需要指定 sourceRoute 对象作为参数,后者需要 dataset,routeIDField,routeID 三个参数 + * 如果用户两种参数均设置,优先选择 Dataset 方式。 + * @param {Object} options - 参数。 + * @param {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} options.sourceRoute - 路由对象。 + * @param {number} options.measure - 定位点的 M 值。只当路由对象定位点时有意义。 + * @param {string} [options.type] - 类型:点 or 线。 + * @param {number} [options.offset=0] - 定位点偏移量。只当路由对象定位点时有意义。 + * @param {boolean} [options.isIgnoreGap=false] - 是否忽略子对象之间的距离。即不忽略子对象之间的距离。 + * @param {number} [options.startMeasure] - 定位线的起始 M 值。只当路由对象定位线时有意义。 + * @param {number} [options.endMeasure] - 定位线的终止 M 值。只当路由对象定位线时有意义。 + * @usage + */ + +var RouteLocatorParameters = /*#__PURE__*/function () { + function RouteLocatorParameters(options) { + RouteLocatorParameters_classCallCheck(this, RouteLocatorParameters); + + if (!options) { + return this; + } + /** + * @member {(Route|L.Polyline|ol.geom.LineString|GeoJSONObject)} RouteLocatorParameters.prototype.sourceRoute + * @description 路由对象。 + */ + + + this.sourceRoute = null; + /** + * @member {string} RouteLocatorParameters.prototype.dataset + * @description 要用来做缓冲区分析的数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示。 + */ + + this.dataset = null; + /** + * @member {string} RouteLocatorParameters.prototype.routeIDField + * @description 路由对象所在的字段名称。 + * + */ + + this.routeIDField = null; + /** + * @member {number} RouteLocatorParameters.prototype.routeID + * @description 路由对象标识。 + * + */ + + this.routeID = null; + /** + * @member {string} [RouteLocatorParameters.prototype.type] + * @description 类型:点 or 线。 + * 可选值为: + * LINE :根据起始 M 值及终止 M 值定位线对象。 + * POINT : 根据 M 值定位点对象。 + */ + + this.type = null; + /** + * @member {number} RouteLocatorParameters.prototype.measure + * @description 定位点的 M 值。只当路由对象定位点时有意义。 + */ + + this.measure = null; + /** + * @member {number} [RouteLocatorParameters.prototype.offset=0] + * @description 定位点偏移量。只当路由对象定位点时有意义。 + */ + + this.offset = 0; + /** + * @member {boolean} [RouteLocatorParameters.prototype.isIgnoreGap=false] + * @description 是否忽略子对象之间的距离。 + */ + + this.isIgnoreGap = false; + /** + * @member {number} [RouteLocatorParameters.prototype.startMeasure] + * @description 定位线的起始 M 值。只当路由对象定位线时有意义。 + */ + + this.startMeasure = null; + /** + * @member {number} [RouteLocatorParameters.prototype.endMeasure] + * @description 定位线的终止 M 值。只当路由对象定位线时有意义。 + */ + + this.endMeasure = null; + var routeFromClient = options.sourceRoute; + var routeHandle = {}; + + if (routeFromClient && routeFromClient instanceof Geometry && routeFromClient.components) { + routeHandle.type = routeFromClient.type; + routeHandle.parts = routeFromClient.parts; + var parts = []; + + for (var i = 0, len = routeFromClient.components.length; i < len; i++) { + parts = parts.concat(routeFromClient.components[i].components); + } + + routeHandle.points = parts; + options.sourceRoute = routeHandle; + } + + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.RouteLocatorParameters"; + } + /** + * @function RouteLocatorParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + RouteLocatorParameters_createClass(RouteLocatorParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.sourceRoute = null; + me.type = null; + me.measure = null; + me.offset = 0; + me.isIgnoreGap = false; + me.startMeasure = null; + me.endMeasure = null; + me.dataset = null; + me.routeID = null; + me.routeIDField = null; + } + }]); + + return RouteLocatorParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/RouteLocatorService.js +function RouteLocatorService_typeof(obj) { "@babel/helpers - typeof"; return RouteLocatorService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, RouteLocatorService_typeof(obj); } + +function RouteLocatorService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RouteLocatorService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RouteLocatorService_createClass(Constructor, protoProps, staticProps) { if (protoProps) RouteLocatorService_defineProperties(Constructor.prototype, protoProps); if (staticProps) RouteLocatorService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function RouteLocatorService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { RouteLocatorService_get = Reflect.get; } else { RouteLocatorService_get = function _get(target, property, receiver) { var base = RouteLocatorService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return RouteLocatorService_get.apply(this, arguments); } + +function RouteLocatorService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = RouteLocatorService_getPrototypeOf(object); if (object === null) break; } return object; } + +function RouteLocatorService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) RouteLocatorService_setPrototypeOf(subClass, superClass); } + +function RouteLocatorService_setPrototypeOf(o, p) { RouteLocatorService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return RouteLocatorService_setPrototypeOf(o, p); } + +function RouteLocatorService_createSuper(Derived) { var hasNativeReflectConstruct = RouteLocatorService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = RouteLocatorService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = RouteLocatorService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return RouteLocatorService_possibleConstructorReturn(this, result); }; } + +function RouteLocatorService_possibleConstructorReturn(self, call) { if (call && (RouteLocatorService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return RouteLocatorService_assertThisInitialized(self); } + +function RouteLocatorService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function RouteLocatorService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function RouteLocatorService_getPrototypeOf(o) { RouteLocatorService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return RouteLocatorService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RouteLocatorService + * @deprecatedclass SuperMap.RouteLocatorService + * @category iServer SpatialAnalyst RouteLocator + * @classdesc 路由对象定位空间对象的服务类。 + * @extends {SpatialAnalystBase} + * @param {string} url -服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 实例化该类如下例所示: + * (start code) + * var routeLocatorParameters_point = new RouteLocatorParameters({ + * "sourceRoute":{ + * "type":"LINEM", + * "parts":[4], + * "points":[ + * { + * "measure":0, + * "y":-6674.466867067764, + * "x":3817.3527876130133 + * }, + * { + * "measure":199.57954019411724, + * "y":-6670.830929417594, + * "x":3617.806369901496 + * }, + * { + * "measure":609.3656478634477, + * "y":-6877.837541432356, + * "x":3264.1498746678444 + * }, + * { + * "measure":936.0174126282958, + * "y":-7038.687780615184, + * "x":2979.846206068903 + * } + * ] + * }, + * "type":"POINT", + * "measure":10, + * "offset":3, + * "isIgnoreGap":true + * }); + * var routeLocatorService = new RouteLocatorService(spatialAnalystURL, { + * eventListeners:{ + * processCompleted:routeLocatorCompleted, + * processFailed:routeLocatorFailded + * } + * ); + * routeLocatorService.processAsync(routeLocatorParameters_point); + * + * //执行 + * function routeLocatorCompleted(){todo} + * function routeLocatorFailded(){todo} + * (end) + * @usage + */ + +var RouteLocatorService = /*#__PURE__*/function (_SpatialAnalystBase) { + RouteLocatorService_inherits(RouteLocatorService, _SpatialAnalystBase); + + var _super = RouteLocatorService_createSuper(RouteLocatorService); + + function RouteLocatorService(url, options) { + var _this; + + RouteLocatorService_classCallCheck(this, RouteLocatorService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.RouteLocatorService"; + return _this; + } + /** + * @override + */ + + + RouteLocatorService_createClass(RouteLocatorService, [{ + key: "destroy", + value: function destroy() { + RouteLocatorService_get(RouteLocatorService_getPrototypeOf(RouteLocatorService.prototype), "destroy", this).call(this); + } + /** + * @function RouteLocatorService.prototype.processAsync + * @description 负责将客户端的基于路由对象计算指定点 M 值操作的参数传递到服务端。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof RouteLocatorParameters)) { + return; + } + + var me = this, + jsonParameters; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function RouteLocatorService.prototype.processAsync + * @description 将参数转化为 JSON 字符串。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + var jsonParameters, + jsonStr = "geometry/routelocator", + me = this; + + if (params.dataset) { + jsonStr = "datasets/" + params.dataset + "/linearreferencing/routelocator"; + params.sourceRoute = null; + } + + me.url = Util.urlPathAppend(me.url, jsonStr); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + jsonParameters = Util.toJSON(params); + return jsonParameters; + } + }]); + + return RouteLocatorService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/ServerFeature.js +function ServerFeature_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ServerFeature_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerFeature_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerFeature_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerFeature_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ServerFeature + * @deprecatedclass SuperMap.ServerFeature + * @category iServer Data Feature + * @classdesc 服务端矢量要素类。该类描述了服务端返回的矢量要素的相关信息,包括字段和几何信息。 + * @param {ServerGeometry} geometry - 矢量要素的几何信息。 + * @param {Object} options - 参数。 + * @param {Array.} [options.fieldNames] - 矢量要素的属性字段名集合。 + * @param {Array.} [options.fieldValues] - 矢量要素的属性字段值集合。 + * @usage + */ + +var ServerFeature = /*#__PURE__*/function () { + function ServerFeature(options) { + ServerFeature_classCallCheck(this, ServerFeature); + + /** + * @member {Array.} [ServerFeature.prototype.fieldNames] + * @description 矢量要素的属性字段名集合。 + */ + this.fieldNames = null; + /** + * @member {Array.} [ServerFeature.prototype.fieldValues] + * @description 矢量要素的属性字段值集合。 + */ + + this.fieldValues = null; + /** + * @member {ServerGeometry} ServerFeature.prototype.geometry + * @description 矢量要素的几何信息。 + */ + + this.geometry = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ServerFeature"; + } + /** + * @function ServerFeature.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ServerFeature_createClass(ServerFeature, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.fieldNames = null; + me.fieldValues = null; + + if (me.geometry) { + me.geometry.destroy(); + me.geometry = null; + } + } + /** + * @function ServerFeature.prototype.toFeature + * @description 将服务端矢量要素 ServerFeature 转换为客户端矢量要素 Feature。 + * @returns {Vector} 转换后的客户端矢量要素。 + */ + + }, { + key: "toFeature", + value: function toFeature() { + var names, + values, + geo, + attr = {}, + me = this, + feature; + names = me.fieldNames; + values = me.fieldValues; + + for (var i in names) { + attr[names[i]] = values[i]; + } + + if (me.geometry) { + geo = me.geometry.toGeometry(); + } + + feature = new Vector(geo, attr); + + if (me.geometry && me.geometry.id) { + feature.fid = me.geometry.id; + } + + return feature; + } + /** + * @function ServerFeature.prototype.fromJson + * @description 将 JSON 对象表示服务端矢量要素转换为 ServerFeature。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {ServerFeature} 转化后的 ServerFeature 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + var geo = null; + + if (!jsonObject) { + return; + } + + geo = jsonObject.geometry; + + if (geo) { + geo = ServerGeometry.fromJson(geo); + } + + return new ServerFeature({ + fieldNames: jsonObject.fieldNames, + fieldValues: jsonObject.fieldValues, + geometry: geo + }); + } + }]); + + return ServerFeature; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SetDatasourceParameters.js +function SetDatasourceParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetDatasourceParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetDatasourceParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetDatasourceParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetDatasourceParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SetDatasourceParameters + * @deprecatedclass SuperMap.SetDatasourceParameters + * @category iServer Data Datasource + * @classdesc 设置数据源信息参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称。 + * @param {string} options.description - 数据源描述信息。 + * @param {string} options.coordUnit - 坐标单位。 + * @param {string} options.distanceUnit - 距离单位。 + * @usage + */ + +var SetDatasourceParameters = /*#__PURE__*/function () { + function SetDatasourceParameters(options) { + SetDatasourceParameters_classCallCheck(this, SetDatasourceParameters); + + if (!options) { + return; + } + /** + * @member {string} SetDatasourceParameters.prototype.datasourceName + * @description 数据源名称。 + */ + + + this.datasourceName = null; + /** + * @member {string} SetDatasourceParameters.prototype.description + * @description 数据源描述信息。 + */ + + this.description = null; + /** + * @member {string} SetDatasourceParameters.prototype.coordUnit + * @description 坐标单位。 + */ + + this.coordUnit = null; + /** + * @member {string} SetDatasourceParameters.prototype.distanceUnit + * @description 距离单位。 + */ + + this.distanceUnit = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SetDatasourceParameters"; + } + /** + * @function SetDatasourceParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SetDatasourceParameters_createClass(SetDatasourceParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasourceName = null; + me.description = null; + me.coordUnit = null; + me.distanceUnit = null; + } + }]); + + return SetDatasourceParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerInfoParameters.js +function SetLayerInfoParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayerInfoParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayerInfoParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayerInfoParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayerInfoParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SetLayerInfoParameters + * @deprecatedclass SuperMap.SetLayerInfoParameters + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息参数类。 + * @param {Object} options - 参数。 + * @param {string} options.resourceID - 临时图层的资源 ID。 + * @param {string} options.tempLayerName - 临时图层下的子图层名。 + * @param {string} options.layerInfo - 要更新的图层信息。 + * @usage + */ + +var SetLayerInfoParameters = /*#__PURE__*/function () { + function SetLayerInfoParameters(options) { + SetLayerInfoParameters_classCallCheck(this, SetLayerInfoParameters); + + options = options || {}; + /** + * @member {string} SetLayerInfoParameters.prototype.resourceID + * @description 临时图层的资源 ID。 + */ + + this.resourceID = null; + /** + * @member {string} SetLayerInfoParameters.prototype.tempLayerName + * @description 临时图层下子图层(或者其子图层)名,如:Countries@World.3@@World。 + */ + + this.tempLayerName = null; + /** + * @member {Object} SetLayerInfoParameters.prototype.layerInfo + * @description 要更新的图层信息(包含修改和未修改的所有字段)。该参数可以通过图层信息服务获取,然后对返回值中 subLayers.layers[i] 图层信息属性进行修改。 + */ + + this.layerInfo = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SetLayerInfoParameters"; + } + /** + * @function SetLayerInfoParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SetLayerInfoParameters_createClass(SetLayerInfoParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.resourceID = null; + me.tempLayerName = null; + me.layerInfo = null; + } + }]); + + return SetLayerInfoParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerInfoService.js +function SetLayerInfoService_typeof(obj) { "@babel/helpers - typeof"; return SetLayerInfoService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SetLayerInfoService_typeof(obj); } + +function SetLayerInfoService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayerInfoService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayerInfoService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayerInfoService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayerInfoService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SetLayerInfoService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SetLayerInfoService_get = Reflect.get; } else { SetLayerInfoService_get = function _get(target, property, receiver) { var base = SetLayerInfoService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SetLayerInfoService_get.apply(this, arguments); } + +function SetLayerInfoService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SetLayerInfoService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SetLayerInfoService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SetLayerInfoService_setPrototypeOf(subClass, superClass); } + +function SetLayerInfoService_setPrototypeOf(o, p) { SetLayerInfoService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SetLayerInfoService_setPrototypeOf(o, p); } + +function SetLayerInfoService_createSuper(Derived) { var hasNativeReflectConstruct = SetLayerInfoService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SetLayerInfoService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SetLayerInfoService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SetLayerInfoService_possibleConstructorReturn(this, result); }; } + +function SetLayerInfoService_possibleConstructorReturn(self, call) { if (call && (SetLayerInfoService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SetLayerInfoService_assertThisInitialized(self); } + +function SetLayerInfoService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SetLayerInfoService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SetLayerInfoService_getPrototypeOf(o) { SetLayerInfoService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SetLayerInfoService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetLayerInfoService + * @deprecatedclass SuperMap.SetLayerInfoService + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息服务类。可以实现临时图层中子图层的修改 + * 该类负责将图层设置参数传递到服务端,并获取服务端返回的结果信息。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}/tempLayersSet/{tempLayerID}/Rivers@World@@World"; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SetLayerInfoService = /*#__PURE__*/function (_CommonServiceBase) { + SetLayerInfoService_inherits(SetLayerInfoService, _CommonServiceBase); + + var _super = SetLayerInfoService_createSuper(SetLayerInfoService); + + function SetLayerInfoService(url, options) { + var _this; + + SetLayerInfoService_classCallCheck(this, SetLayerInfoService); + + _this = _super.call(this, url, options); + + if (options) { + Util.extend(SetLayerInfoService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.SetLayerInfoService"; + return _this; + } + /** + * @override + */ + + + SetLayerInfoService_createClass(SetLayerInfoService, [{ + key: "destroy", + value: function destroy() { + SetLayerInfoService_get(SetLayerInfoService_getPrototypeOf(SetLayerInfoService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function SetLayerInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。 + * 该参数可以使用获取图层信息服务<{@link GetLayersInfoService}>返回图层信息,解析结果result.subLayers.layers[i],然后对其属性进行修改来获取。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!params) { + return; + } + + var me = this; + var jsonParamsStr = Util.toJSON(params); + me.request({ + method: "PUT", + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return SetLayerInfoService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayersInfoParameters.js +function SetLayersInfoParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayersInfoParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayersInfoParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayersInfoParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayersInfoParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SetLayersInfoParameters + * @deprecatedclass SuperMap.SetLayersInfoParameters + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息参数类。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isTempLayers=false] - 是否是临时图层。 + * @param {string} options.resourceID - 临时图层资源 ID。 + * @param {Object} options.layersInfo - 要更新的图层信息。 + * @usage + */ + +var SetLayersInfoParameters = /*#__PURE__*/function () { + function SetLayersInfoParameters(options) { + SetLayersInfoParameters_classCallCheck(this, SetLayersInfoParameters); + + options = options || {}; + /** + * @member {boolean} [SetLayersInfoParameters.prototype.isTempLayers=false] + * @description 是否是临时图层。 + */ + + this.isTempLayers = null; + /** + * @member {string} SetLayersInfoParameters.prototype.resourceID + * @description 临时图层资源 ID, + */ + + this.resourceID = null; + /** + * @member {Object} SetLayersInfoParameters.prototype.layersInfo + * @description 要更新的图层信息(包含修改和未修改的所有字段)。该参数可以通过图层信息服务获取,然后对返回值中 subLayers.layers[i] 图层信息属性进行修改。 + */ + + this.layersInfo = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SetLayersInfoParameters"; + } + /** + * @function SetLayersInfoParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SetLayersInfoParameters_createClass(SetLayersInfoParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.isTempLayers = null; + me.resourceID = null; + me.layersInfo = null; + } + }]); + + return SetLayersInfoParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayersInfoService.js +function SetLayersInfoService_typeof(obj) { "@babel/helpers - typeof"; return SetLayersInfoService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SetLayersInfoService_typeof(obj); } + +function SetLayersInfoService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayersInfoService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayersInfoService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayersInfoService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayersInfoService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SetLayersInfoService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SetLayersInfoService_get = Reflect.get; } else { SetLayersInfoService_get = function _get(target, property, receiver) { var base = SetLayersInfoService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SetLayersInfoService_get.apply(this, arguments); } + +function SetLayersInfoService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SetLayersInfoService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SetLayersInfoService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SetLayersInfoService_setPrototypeOf(subClass, superClass); } + +function SetLayersInfoService_setPrototypeOf(o, p) { SetLayersInfoService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SetLayersInfoService_setPrototypeOf(o, p); } + +function SetLayersInfoService_createSuper(Derived) { var hasNativeReflectConstruct = SetLayersInfoService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SetLayersInfoService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SetLayersInfoService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SetLayersInfoService_possibleConstructorReturn(this, result); }; } + +function SetLayersInfoService_possibleConstructorReturn(self, call) { if (call && (SetLayersInfoService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SetLayersInfoService_assertThisInitialized(self); } + +function SetLayersInfoService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SetLayersInfoService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SetLayersInfoService_getPrototypeOf(o) { SetLayersInfoService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SetLayersInfoService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class SetLayersInfoService + * @deprecatedclass SuperMap.SetLayersInfoService + * @category iServer Map TempLayersSet + * @classdesc 设置图层信息服务类。可以实现创建新的临时图层和对现有临时图层的修改, + * 当 isTempLayers 为 false的时候执行创建临时图层。当 isTempLayers 为 ture 并且临时图层资源 resourceID 被设置有效时执行对临时图层的编辑。 + * 该类负责将图层设置参数传递到服务端,并获取服务端返回的结果信息。 + * @extends {CommonServiceBase} + * @param url - {string} 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {string} options.resourceID - 图层资源ID,临时图层的资源ID标记。 + * @param {boolean} options.isTempLayers - 当前url对应的图层是否是临时图层。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SetLayersInfoService = /*#__PURE__*/function (_CommonServiceBase) { + SetLayersInfoService_inherits(SetLayersInfoService, _CommonServiceBase); + + var _super = SetLayersInfoService_createSuper(SetLayersInfoService); + + function SetLayersInfoService(url, options) { + var _this; + + SetLayersInfoService_classCallCheck(this, SetLayersInfoService); + + _this = _super.call(this, url, options); + /** + * @member {string} SetLayersInfoService.prototype.resourceID + * @description 图层资源ID,临时图层的资源ID标记。 + */ + + _this.resourceID = null; + /** + * @function {boolean} SetLayersInfoService.prototype.isTempLayers + * @description 当前url对应的图层是否是临时图层。 + */ + + _this.isTempLayers = false; + + if (options) { + Util.extend(SetLayersInfoService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.SetLayersInfoService"; + return _this; + } + /** + * @override + */ + + + SetLayersInfoService_createClass(SetLayersInfoService, [{ + key: "destroy", + value: function destroy() { + SetLayersInfoService_get(SetLayersInfoService_getPrototypeOf(SetLayersInfoService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function SetLayersInfoService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。该参数可以使用获取图层信息服务 <{@link GetLayersInfoService}>返回图层信息,然后对其属性进行修改来获取。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!params) { + return; + } + + var jsonParams, + subLayers = [], + me = this, + method = ""; //创建临时图层和设置修改临时图层信息对应不同的资源URL + + if (me.isTempLayers) { + me.url = Util.urlPathAppend(me.url, "tempLayersSet/" + me.resourceID); + method = "PUT"; + } else { + me.url = Util.urlPathAppend(me.url, "tempLayersSet"); + method = "POST"; + } + + if (!params.subLayers) { + params.subLayers = { + layers: [] + }; + } + + if (!params.subLayers.layers) { + params.subLayers.layers = []; + } + + var layers = params.subLayers.layers, + len = layers.length; + + for (var i in layers) { + if (layers[i].ugcLayerType === "GRID") { + var colorDictionary = {}; + var colorDics = layers[i].colorDictionarys; + + for (var j in colorDics) { + var key = colorDics[j].elevation; + colorDictionary[key] = colorDics[j].color; + } + } + + layers[i].colorDictionary = colorDictionary; + delete layers[i].colorDictionarys; + } + + for (var _i = 0; _i < len; _i++) { + if (layers[_i].toJsonObject) { + //将图层信息转换成服务端能识别的简单json对象 + subLayers.push(layers[_i].toJsonObject()); + } else { + subLayers.push(layers[_i]); + } + } + + jsonParams = Util.extend(jsonParams, params); + jsonParams.subLayers = { + "layers": subLayers + }; + jsonParams.object = null; + var jsonParamsStr = Util.toJSON([jsonParams]); + me.request({ + method: method, + data: jsonParamsStr, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return SetLayersInfoService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerStatusParameters.js +function SetLayerStatusParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayerStatusParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayerStatusParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayerStatusParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayerStatusParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SetLayerStatusParameters + * @deprecatedclass SuperMap.SetLayerStatusParameters + * @category iServer Map TempLayersSet + * @classdesc 子图层显示控制参数类,该类存储了各子图层是否可见的状态。 + * 注意在 SuperMap iClient 系列产品中所说的图层与 SuperMap Deskpro 的地图对应,子图层与 SuperMap Deskpro 的图层对应。 + * @param {Object} options - 参数。 + * @param {Array.} options.layerStatusList - 获取或设置图层可见状态({@link LayerStatus})集合, + * 集合中的每个 {@link LayerStatus} 对象代表一个子图层的可视状态。 + * @param {number} [options.holdTime=15] - 获取或设置资源在服务端保存的时间。 + * @param {string} [options.resourceID] - 获取或设置资源服务 ID。 + * @usage + */ + +var SetLayerStatusParameters = /*#__PURE__*/function () { + function SetLayerStatusParameters(options) { + SetLayerStatusParameters_classCallCheck(this, SetLayerStatusParameters); + + /** + * @member {Array.} SetLayerStatusParameters.prototype.layerStatusList + * @description 获取或设置图层可见状态({@link LayerStatus})集合,集合中的每个 {@link LayerStatus} 对象代表一个子图层的可视状态。 + */ + this.layerStatusList = []; + /** + * @member {number} [SetLayerStatusParameters.prototype.holdTime=15] + * @description 获取或设置资源在服务端保存的时间。单位为分钟。 + */ + + this.holdTime = 15; + /** + * @member {string} SetLayerStatusParameters.prototype.resourceID + * @description 获取或设置资源服务ID。如果设置该参数则会在指定的 TempLayer 进行图层的显示控制; + * 如果不设置该参数,则会首先创建一个 TempLayer ,然后在新创建的 TempLayer 进行图层的显示控制。 + */ + + this.resourceID = null; + + if (options) { + Util.extend(this, options); + } + } + /** + * @function SetLayerStatusParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SetLayerStatusParameters_createClass(SetLayerStatusParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.layerStatusList = null; + me.holdTime = null; + me.resourceID = null; + } + /** + * @function SetLayerStatusParameters.prototype.toJSON + * @description 生成 JSON。 + * @returns {Object} 对应的 JSON 对象。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var json = '{'; + json += '"layers":['; + var v = []; + + for (var i = 0, len = this.layerStatusList.length; i < len; i++) { + v.push(this.layerStatusList[i].toJSON()); + } + + json += v; + json += ']'; + json += '}'; + return json; + } + }]); + + return SetLayerStatusParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SetLayerStatusService.js +function SetLayerStatusService_typeof(obj) { "@babel/helpers - typeof"; return SetLayerStatusService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SetLayerStatusService_typeof(obj); } + +function SetLayerStatusService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SetLayerStatusService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SetLayerStatusService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SetLayerStatusService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SetLayerStatusService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SetLayerStatusService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SetLayerStatusService_get = Reflect.get; } else { SetLayerStatusService_get = function _get(target, property, receiver) { var base = SetLayerStatusService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SetLayerStatusService_get.apply(this, arguments); } + +function SetLayerStatusService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SetLayerStatusService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SetLayerStatusService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SetLayerStatusService_setPrototypeOf(subClass, superClass); } + +function SetLayerStatusService_setPrototypeOf(o, p) { SetLayerStatusService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SetLayerStatusService_setPrototypeOf(o, p); } + +function SetLayerStatusService_createSuper(Derived) { var hasNativeReflectConstruct = SetLayerStatusService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SetLayerStatusService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SetLayerStatusService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SetLayerStatusService_possibleConstructorReturn(this, result); }; } + +function SetLayerStatusService_possibleConstructorReturn(self, call) { if (call && (SetLayerStatusService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SetLayerStatusService_assertThisInitialized(self); } + +function SetLayerStatusService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SetLayerStatusService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SetLayerStatusService_getPrototypeOf(o) { SetLayerStatusService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SetLayerStatusService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SetLayerStatusService + * @deprecatedclass SuperMap.SetLayerStatusService + * @category iServer Map TempLayersSet + * @classdesc 子图层显示控制服务类。该类负责将子图层显示控制参数传递到服务端,并获取服务端返回的图层显示状态。 + * 用户获取服务端返回的各子图层显示状态有两种方式: + * 一种是通过监听 SetLayerEvent.PROCESS_COMPLETE 事件; + * 一种是使用 AsyncResponder 类实现异步处理。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求地图服务,URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{地图服务名}/rest/maps/{地图名}; + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SetLayerStatusService = /*#__PURE__*/function (_CommonServiceBase) { + SetLayerStatusService_inherits(SetLayerStatusService, _CommonServiceBase); + + var _super = SetLayerStatusService_createSuper(SetLayerStatusService); + + function SetLayerStatusService(url, options) { + var _this; + + SetLayerStatusService_classCallCheck(this, SetLayerStatusService); + + _this = _super.call(this, url, options); + _this.lastparams = null; + _this.mapUrl = url; + + if (options) { + Util.extend(SetLayerStatusService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.SetLayerStatusService"; + return _this; + } + /** + * @override + */ + + + SetLayerStatusService_createClass(SetLayerStatusService, [{ + key: "destroy", + value: function destroy() { + SetLayerStatusService_get(SetLayerStatusService_getPrototypeOf(SetLayerStatusService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function SetLayerStatusService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {Object} params - 修改后的图层资源信息。该参数可以使用获取图层信息服务{@link SetLayerStatusParameters} + * 返回图层信息,然后对其属性进行修改来获取。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof SetLayerStatusParameters)) { + return; + } + + var me = this, + method = "POST"; + me.url = me.mapUrl; + + if (params.resourceID == null) { + me.url = Util.urlPathAppend(me.url, 'tempLayersSet'); + me.lastparams = params; + me.request({ + method: method, + scope: me, + success: me.createTempLayerComplete, + failure: me.serviceProcessFailed + }); + } else { + me.url = Util.urlPathAppend(me.url, "tempLayersSet/" + params.resourceID); + me.url = Util.urlAppend(me.url, "elementRemain=true&reference=" + params.resourceID + "&holdTime=" + params.holdTime.toString()); + var jsonParameters = '[{'; + jsonParameters += '"type":"UGC",'; + + if (params.layerStatusList != null && params.layerStatusList.length > 0) { + jsonParameters += '"subLayers":' + params.toJSON(); + } + + jsonParameters += ',"visible":' + true + ','; + jsonParameters += '"name":"' + this.getMapName(this.mapUrl) + '"'; + jsonParameters += '}]'; + me.request({ + method: "PUT", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + } + /** + * @function SetLayerStatusService.prototype.createTempLayerComplete + * @description 设置完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象,记录设置操作是否成功。 + */ + + }, { + key: "createTempLayerComplete", + value: function createTempLayerComplete(result) { + var me = this; + result = Util.transformResult(result); + + if (result.succeed) { + me.lastparams.resourceID = result.newResourceID; + } + + me.processAsync(me.lastparams); + } + /** + * @function SetLayerStatusService.prototype.getMapName + * @description 获取地图名称。 + * @param {Object} url - 服务地址。 + */ + + }, { + key: "getMapName", + value: function getMapName(url) { + var mapUrl = url; + + if (mapUrl.charAt(mapUrl.length - 1) === "/") { + mapUrl = mapUrl.substr(0, mapUrl.length - 1); + } + + var index = mapUrl.lastIndexOf("/"); + var mapName = mapUrl.substring(index + 1, mapUrl.length); + return mapName; + } + /** + * @function SetLayerStatusService.prototype.setLayerCompleted + * @description 设置完成,执行此方法。 + * @param {Object} result - 服务器返回的结果对象,记录设置操作是否成功。 + */ + + }, { + key: "serviceProcessCompleted", + value: function serviceProcessCompleted(result) { + var me = this; + result = Util.transformResult(result); + + if (result != null && me.lastparams != null) { + result.newResourceID = me.lastparams.resourceID; + } + + me.events.triggerEvent("processCompleted", { + result: result + }); + } + }]); + + return SetLayerStatusService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SingleObjectQueryJobsParameter.js +function SingleObjectQueryJobsParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SingleObjectQueryJobsParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SingleObjectQueryJobsParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) SingleObjectQueryJobsParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) SingleObjectQueryJobsParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SingleObjectQueryJobsParameter + * @deprecatedclass SuperMap.SingleObjectQueryJobsParameter + * @category iServer ProcessingService Query + * @classdesc 单对象空间查询分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetQuery - 查询对象所在的数据集名称。 + * @param {SpatialQueryMode} [options.mode=SpatialQueryMode.CONTAIN] - 空间查询模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var SingleObjectQueryJobsParameter = /*#__PURE__*/function () { + function SingleObjectQueryJobsParameter(options) { + SingleObjectQueryJobsParameter_classCallCheck(this, SingleObjectQueryJobsParameter); + + if (!options) { + return; + } + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.datasetQuery + * @description 查询对象所在的数据集名称。 + */ + + this.datasetQuery = ""; + /** + * @member {string} SingleObjectQueryJobsParameter.prototype.geometryQuery + * @description 查询对象所在的几何对象。 + */ + + this.geometryQuery = ""; + /** + * @member {SpatialQueryMode} [SingleObjectQueryJobsParameter.prototype.mode=SpatialQueryMode.CONTAIN] + * @description 空间查询模式 。 + */ + + this.mode = SpatialQueryMode.CONTAIN; + /** + * @member {OutputSetting} [SingleObjectQueryJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [SingleObjectQueryJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SingleObjectQueryJobsParameter"; + } + /** + * @function SingleObjectQueryJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SingleObjectQueryJobsParameter_createClass(SingleObjectQueryJobsParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.datasetQuery = null; + this.geometryQuery = null; + this.mode = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function SingleObjectQueryJobsParameter.toObject + * @param {Object} singleObjectQueryJobsParameter - 单对象空间查询分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成单对象空间查询分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(singleObjectQueryJobsParameter, tempObj) { + for (var name in singleObjectQueryJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = singleObjectQueryJobsParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = singleObjectQueryJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = singleObjectQueryJobsParameter[name]; + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = singleObjectQueryJobsParameter[name]; + } + } + } + }]); + + return SingleObjectQueryJobsParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SingleObjectQueryJobsService.js +function SingleObjectQueryJobsService_typeof(obj) { "@babel/helpers - typeof"; return SingleObjectQueryJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SingleObjectQueryJobsService_typeof(obj); } + +function SingleObjectQueryJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SingleObjectQueryJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SingleObjectQueryJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SingleObjectQueryJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SingleObjectQueryJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SingleObjectQueryJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SingleObjectQueryJobsService_get = Reflect.get; } else { SingleObjectQueryJobsService_get = function _get(target, property, receiver) { var base = SingleObjectQueryJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SingleObjectQueryJobsService_get.apply(this, arguments); } + +function SingleObjectQueryJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SingleObjectQueryJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SingleObjectQueryJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SingleObjectQueryJobsService_setPrototypeOf(subClass, superClass); } + +function SingleObjectQueryJobsService_setPrototypeOf(o, p) { SingleObjectQueryJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SingleObjectQueryJobsService_setPrototypeOf(o, p); } + +function SingleObjectQueryJobsService_createSuper(Derived) { var hasNativeReflectConstruct = SingleObjectQueryJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SingleObjectQueryJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SingleObjectQueryJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SingleObjectQueryJobsService_possibleConstructorReturn(this, result); }; } + +function SingleObjectQueryJobsService_possibleConstructorReturn(self, call) { if (call && (SingleObjectQueryJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SingleObjectQueryJobsService_assertThisInitialized(self); } + +function SingleObjectQueryJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SingleObjectQueryJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SingleObjectQueryJobsService_getPrototypeOf(o) { SingleObjectQueryJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SingleObjectQueryJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SingleObjectQueryJobsService + * @deprecatedclass SuperMap.SingleObjectQueryJobsService + * @category iServer ProcessingService Query + * @classdesc 单对象查询分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SingleObjectQueryJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + SingleObjectQueryJobsService_inherits(SingleObjectQueryJobsService, _ProcessingServiceBas); + + var _super = SingleObjectQueryJobsService_createSuper(SingleObjectQueryJobsService); + + function SingleObjectQueryJobsService(url, options) { + var _this; + + SingleObjectQueryJobsService_classCallCheck(this, SingleObjectQueryJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/query'); + _this.CLASS_NAME = 'SuperMap.SingleObjectQueryJobsService'; + return _this; + } + /** + *@override + */ + + + SingleObjectQueryJobsService_createClass(SingleObjectQueryJobsService, [{ + key: "destroy", + value: function destroy() { + SingleObjectQueryJobsService_get(SingleObjectQueryJobsService_getPrototypeOf(SingleObjectQueryJobsService.prototype), "destroy", this).call(this); + } + /** + * @function SingleObjectQueryJobsService.protitype.getQueryJobs + * @description 获取单对象空间查询分析所有任务 + */ + + }, { + key: "getQueryJobs", + value: function getQueryJobs() { + SingleObjectQueryJobsService_get(SingleObjectQueryJobsService_getPrototypeOf(SingleObjectQueryJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function KernelDensityJobsService.protitype.getQueryJob + * @description 获取指定id的单对象空间查询分析服务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getQueryJob", + value: function getQueryJob(id) { + SingleObjectQueryJobsService_get(SingleObjectQueryJobsService_getPrototypeOf(SingleObjectQueryJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function SingleObjectQueryJobsService.protitype.addQueryJob + * @description 新建单对象空间查询分析服务 + * @param {SingleObjectQueryJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addQueryJob", + value: function addQueryJob(params, seconds) { + SingleObjectQueryJobsService_get(SingleObjectQueryJobsService_getPrototypeOf(SingleObjectQueryJobsService.prototype), "addJob", this).call(this, this.url, params, SingleObjectQueryJobsParameter, seconds); + } + }]); + + return SingleObjectQueryJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/StopQueryParameters.js +function StopQueryParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function StopQueryParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function StopQueryParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) StopQueryParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) StopQueryParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class StopQueryParameters + * @deprecatedclass SuperMap.StopQueryParameters + * @category iServer TrafficTransferAnalyst TransferStops + * @classdesc 站点查询参数类。 + * @param {Object} options - 参数。 + * @param {string} options.keyWord - 站点名称关键字。 + * @param {boolean} [options.returnPosition=false] - 是否返回站点坐标信息。 + * @usage + */ + +var StopQueryParameters = /*#__PURE__*/function () { + function StopQueryParameters(options) { + StopQueryParameters_classCallCheck(this, StopQueryParameters); + + options = options || {}; + /** + * @member {string} StopQueryParameters.prototype.keyWord + * @description 站点名称关键字。 + */ + + this.keyWord = null; + /** + * @member {boolean} [StopQueryParameters.prototype.returnPosition=false] + * @description 是否返回站点坐标信息。 + */ + + this.returnPosition = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.StopQueryParameters"; + } + /** + * @function StopQueryParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + StopQueryParameters_createClass(StopQueryParameters, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + }]); + + return StopQueryParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/StopQueryService.js +function StopQueryService_typeof(obj) { "@babel/helpers - typeof"; return StopQueryService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, StopQueryService_typeof(obj); } + +function StopQueryService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function StopQueryService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function StopQueryService_createClass(Constructor, protoProps, staticProps) { if (protoProps) StopQueryService_defineProperties(Constructor.prototype, protoProps); if (staticProps) StopQueryService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function StopQueryService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { StopQueryService_get = Reflect.get; } else { StopQueryService_get = function _get(target, property, receiver) { var base = StopQueryService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return StopQueryService_get.apply(this, arguments); } + +function StopQueryService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = StopQueryService_getPrototypeOf(object); if (object === null) break; } return object; } + +function StopQueryService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) StopQueryService_setPrototypeOf(subClass, superClass); } + +function StopQueryService_setPrototypeOf(o, p) { StopQueryService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return StopQueryService_setPrototypeOf(o, p); } + +function StopQueryService_createSuper(Derived) { var hasNativeReflectConstruct = StopQueryService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = StopQueryService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = StopQueryService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return StopQueryService_possibleConstructorReturn(this, result); }; } + +function StopQueryService_possibleConstructorReturn(self, call) { if (call && (StopQueryService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return StopQueryService_assertThisInitialized(self); } + +function StopQueryService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function StopQueryService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function StopQueryService_getPrototypeOf(o) { StopQueryService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return StopQueryService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class StopQueryService + * @deprecatedclass SuperMap.StopQueryService + * @category iServer TrafficTransferAnalyst TransferStops + * @classdesc 站点查询服务类。 + * 返回结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 例如: + * (start code) + * var myService = new StopQueryService(url, {eventListeners: { + * "processCompleted": StopQueryCompleted, + * "processFailed": StopQueryError + * } + * }; + * (end) + * @usage + * + */ + +var StopQueryService = /*#__PURE__*/function (_CommonServiceBase) { + StopQueryService_inherits(StopQueryService, _CommonServiceBase); + + var _super = StopQueryService_createSuper(StopQueryService); + + function StopQueryService(url, options) { + var _this; + + StopQueryService_classCallCheck(this, StopQueryService); + + _this = _super.call(this, url, options); + options = options || {}; + Util.extend(StopQueryService_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.StopQueryService"; + return _this; + } + /** + *@override + */ + + + StopQueryService_createClass(StopQueryService, [{ + key: "destroy", + value: function destroy() { + StopQueryService_get(StopQueryService_getPrototypeOf(StopQueryService.prototype), "destroy", this).call(this); + + Util.reset(this); + } + /** + * @function StopQueryService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {StopQueryParameters} params - 交通换乘参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof StopQueryParameters)) { + return; + } + + var me = this; + me.url = Util.urlPathAppend(me.url, 'stops/keyword/' + params.keyWord); + me.request({ + method: "GET", + params: { + returnPosition: params.returnPosition + }, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return StopQueryService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryAttributesJobsParameter.js +function SummaryAttributesJobsParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryAttributesJobsParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryAttributesJobsParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryAttributesJobsParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryAttributesJobsParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SummaryAttributesJobsParameter + * @deprecatedclass SuperMap.SummaryAttributesJobsParameter + * @category iServer ProcessingService SummaryAttributes + * @classdesc 属性汇总分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.groupField - 分组字段。 + * @param {string} options.attributeField - 属性字段。 + * @param {string} options.statisticModes - 统计模式。 + * @param {OutputSetting} [options.output] -输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var SummaryAttributesJobsParameter = /*#__PURE__*/function () { + function SummaryAttributesJobsParameter(options) { + SummaryAttributesJobsParameter_classCallCheck(this, SummaryAttributesJobsParameter); + + if (!options) { + return; + } + /** + * @member {string} SummaryAttributesJobsParameter.prototype.datasetName + * @description 汇总数据集名称。 + */ + + + this.datasetName = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.groupField + * @description 分组字段。 + */ + + this.groupField = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.attributeField + * @description 属性字段。 + */ + + this.attributeField = ""; + /** + * @member {string} SummaryAttributesJobsParameter.prototype.statisticModes + * @description 属性汇总统计模式。 + */ + + this.statisticModes = ""; + /** + * @member {OutputSetting} SummaryAttributesJobsParameter.prototype.output + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [SummaryAttributesJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SummaryAttributesJobsParameter"; + } + /** + * @function SummaryAttributesJobsParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + SummaryAttributesJobsParameter_createClass(SummaryAttributesJobsParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.groupField = null; + this.attributeField = null; + this.statisticModes = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function SummaryAttributesJobsParameter.toObject + * @param {Object} SummaryAttributesJobsParameter - 属性汇总任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成属性汇总分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(_SummaryAttributesJobsParameter, tempObj) { + for (var name in _SummaryAttributesJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = _SummaryAttributesJobsParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = _SummaryAttributesJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = _SummaryAttributesJobsParameter[name]; + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = _SummaryAttributesJobsParameter[name]; + } + } + } + }]); + + return SummaryAttributesJobsParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryAttributesJobsService.js +function SummaryAttributesJobsService_typeof(obj) { "@babel/helpers - typeof"; return SummaryAttributesJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SummaryAttributesJobsService_typeof(obj); } + +function SummaryAttributesJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryAttributesJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryAttributesJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryAttributesJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryAttributesJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SummaryAttributesJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SummaryAttributesJobsService_get = Reflect.get; } else { SummaryAttributesJobsService_get = function _get(target, property, receiver) { var base = SummaryAttributesJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SummaryAttributesJobsService_get.apply(this, arguments); } + +function SummaryAttributesJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SummaryAttributesJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SummaryAttributesJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SummaryAttributesJobsService_setPrototypeOf(subClass, superClass); } + +function SummaryAttributesJobsService_setPrototypeOf(o, p) { SummaryAttributesJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SummaryAttributesJobsService_setPrototypeOf(o, p); } + +function SummaryAttributesJobsService_createSuper(Derived) { var hasNativeReflectConstruct = SummaryAttributesJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SummaryAttributesJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SummaryAttributesJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SummaryAttributesJobsService_possibleConstructorReturn(this, result); }; } + +function SummaryAttributesJobsService_possibleConstructorReturn(self, call) { if (call && (SummaryAttributesJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SummaryAttributesJobsService_assertThisInitialized(self); } + +function SummaryAttributesJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SummaryAttributesJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SummaryAttributesJobsService_getPrototypeOf(o) { SummaryAttributesJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SummaryAttributesJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SummaryAttributesJobsService + * @deprecatedclass SuperMap.SummaryAttributesJobsService + * @category iServer ProcessingService SummaryAttributes + * @classdesc 属性汇总分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SummaryAttributesJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + SummaryAttributesJobsService_inherits(SummaryAttributesJobsService, _ProcessingServiceBas); + + var _super = SummaryAttributesJobsService_createSuper(SummaryAttributesJobsService); + + function SummaryAttributesJobsService(url, options) { + var _this; + + SummaryAttributesJobsService_classCallCheck(this, SummaryAttributesJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/summaryattributes'); + _this.CLASS_NAME = "SuperMap.SummaryAttributesJobsService"; + return _this; + } + /** + *@override + */ + + + SummaryAttributesJobsService_createClass(SummaryAttributesJobsService, [{ + key: "destroy", + value: function destroy() { + SummaryAttributesJobsService_get(SummaryAttributesJobsService_getPrototypeOf(SummaryAttributesJobsService.prototype), "destroy", this).call(this); + } + /** + * @function SummaryAttributesJobsService.protitype.getSummaryAttributesJobs + * @description 获取属性汇总分析所有任务 + */ + + }, { + key: "getSummaryAttributesJobs", + value: function getSummaryAttributesJobs() { + SummaryAttributesJobsService_get(SummaryAttributesJobsService_getPrototypeOf(SummaryAttributesJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function SummaryAttributesJobsService.protitype.getSummaryAttributesJob + * @description 获取指定id的属性汇总分析服务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getSummaryAttributesJob", + value: function getSummaryAttributesJob(id) { + SummaryAttributesJobsService_get(SummaryAttributesJobsService_getPrototypeOf(SummaryAttributesJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function SummaryAttributesJobsService.protitype.addSummaryAttributesJob + * @description 新建属性汇总分析服务 + * @param {SummaryAttributesJobsParameter} params - 属性汇总分析任务参数类。 + * @param {number} seconds - 创建成功结果的时间间隔。 + */ + + }, { + key: "addSummaryAttributesJob", + value: function addSummaryAttributesJob(params, seconds) { + SummaryAttributesJobsService_get(SummaryAttributesJobsService_getPrototypeOf(SummaryAttributesJobsService.prototype), "addJob", this).call(this, this.url, params, SummaryAttributesJobsParameter, seconds); + } + }]); + + return SummaryAttributesJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryMeshJobParameter.js +function SummaryMeshJobParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryMeshJobParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryMeshJobParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryMeshJobParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryMeshJobParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryMeshJobParameter + * @deprecatedclass SuperMap.SummaryMeshJobParameter + * @category iServer ProcessingService AggregatePoints + * @classdesc 点聚合分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {number} options.fields - 权重索引。 + * @param {number} [options.resolution=100] - 分辨率。 + * @param {StatisticAnalystMode} [options.statisticModes=StatisticAnalystMode.AVERAGE] - 分析模式。 + * @param {number} [options.meshType=0] - 分析类型。 + * @param {SummaryType} [options.type=SummaryType.SUMMARYMESH] - 聚合类型。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var SummaryMeshJobParameter = /*#__PURE__*/function () { + function SummaryMeshJobParameter(options) { + SummaryMeshJobParameter_classCallCheck(this, SummaryMeshJobParameter); + + if (!options) { + return; + } + /** + * @member {string} SummaryMeshJobParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {string} SummaryMeshJobParameter.prototype.regionDataset + * @description 聚合面数据集(聚合类型为多边形聚合时使用的参数)。 + */ + + this.regionDataset = ""; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} SummaryMeshJobParameter.prototype.query + * @description 分析范围(聚合类型为网格面聚合时使用的参数)。 + */ + + this.query = ""; + /** + * @member {number} [SummaryMeshJobParameter.prototype.resolution=100] + * @description 分辨率(聚合类型为网格面聚合时使用的参数)。 + */ + + this.resolution = 100; + /** + * @member {number} [SummaryMeshJobParameter.prototype.meshType=0] + * @description 网格面类型(聚合类型为网格面聚合时使用的参数),取值:0 或 1。 + */ + + this.meshType = 0; + /** + * @member {StatisticAnalystMode} [SummaryMeshJobParameter.prototype.statisticModes=StatisticAnalystMode.AVERAGE] + * @description 统计模式。 + */ + + this.statisticModes = StatisticAnalystMode.AVERAGE; + /** + * @member {number} SummaryMeshJobParameter.prototype.fields + * @description 权重字段。 + */ + + this.fields = ""; + /** + * @member {SummaryType} [SummaryMeshJobParameter.prototype.type=SummaryType.SUMMARYMESH] + * @description 聚合类型。 + */ + + this.type = SummaryType.SUMMARYMESH; + /** + * @member {OutputSetting} [SummaryMeshJobParameter.prototype.output] + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [SummaryMeshJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SummaryMeshJobParameter"; + } + /** + * @function SummaryMeshJobParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + SummaryMeshJobParameter_createClass(SummaryMeshJobParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.query = null; + this.resolution = null; + this.statisticModes = null; + this.meshType = null; + this.fields = null; + this.regionDataset = null; + this.type = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function SummaryMeshJobParameter.toObject + * @param {Object} summaryMeshJobParameter - 点聚合分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成点聚合分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(summaryMeshJobParameter, tempObj) { + for (var name in summaryMeshJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = summaryMeshJobParameter[name]; + continue; + } + + if (name === "type") { + tempObj['type'] = summaryMeshJobParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = summaryMeshJobParameter[name]; + continue; + } + + if (summaryMeshJobParameter.type === 'SUMMARYMESH' && name !== 'regionDataset' || summaryMeshJobParameter.type === 'SUMMARYREGION' && !contains(['meshType', 'resolution', 'query'], name)) { + tempObj['analyst'] = tempObj['analyst'] || {}; + + if (name === 'query' && summaryMeshJobParameter[name]) { + tempObj['analyst'][name] = summaryMeshJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = summaryMeshJobParameter[name]; + } + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = summaryMeshJobParameter[name]; + } + } + } + + function contains(arr, obj) { + var i = arr.length; + + while (i--) { + if (arr[i] === obj) { + return true; + } + } + + return false; + } + } + }]); + + return SummaryMeshJobParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryMeshJobsService.js +function SummaryMeshJobsService_typeof(obj) { "@babel/helpers - typeof"; return SummaryMeshJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SummaryMeshJobsService_typeof(obj); } + +function SummaryMeshJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryMeshJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryMeshJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryMeshJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryMeshJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SummaryMeshJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SummaryMeshJobsService_get = Reflect.get; } else { SummaryMeshJobsService_get = function _get(target, property, receiver) { var base = SummaryMeshJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SummaryMeshJobsService_get.apply(this, arguments); } + +function SummaryMeshJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SummaryMeshJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SummaryMeshJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SummaryMeshJobsService_setPrototypeOf(subClass, superClass); } + +function SummaryMeshJobsService_setPrototypeOf(o, p) { SummaryMeshJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SummaryMeshJobsService_setPrototypeOf(o, p); } + +function SummaryMeshJobsService_createSuper(Derived) { var hasNativeReflectConstruct = SummaryMeshJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SummaryMeshJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SummaryMeshJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SummaryMeshJobsService_possibleConstructorReturn(this, result); }; } + +function SummaryMeshJobsService_possibleConstructorReturn(self, call) { if (call && (SummaryMeshJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SummaryMeshJobsService_assertThisInitialized(self); } + +function SummaryMeshJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SummaryMeshJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SummaryMeshJobsService_getPrototypeOf(o) { SummaryMeshJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SummaryMeshJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SummaryMeshJobsService + * @deprecatedclass SuperMap.SummaryMeshJobsService + * @category iServer ProcessingService AggregatePoints + * @classdesc 点聚合分析任务类。 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Events} options.events - 处理所有事件的对象。 + * @param {Object} [options.eventListeners] - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {number} options.index - 服务地址在数组中的位置。 + * @param {number} options.length - 服务地址数组长度。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SummaryMeshJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + SummaryMeshJobsService_inherits(SummaryMeshJobsService, _ProcessingServiceBas); + + var _super = SummaryMeshJobsService_createSuper(SummaryMeshJobsService); + + function SummaryMeshJobsService(url, options) { + var _this; + + SummaryMeshJobsService_classCallCheck(this, SummaryMeshJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/aggregatepoints'); + _this.CLASS_NAME = 'SuperMap.SummaryMeshJobsService'; + return _this; + } + /** + * @override + */ + + + SummaryMeshJobsService_createClass(SummaryMeshJobsService, [{ + key: "destroy", + value: function destroy() { + SummaryMeshJobsService_get(SummaryMeshJobsService_getPrototypeOf(SummaryMeshJobsService.prototype), "destroy", this).call(this); + } + /** + * @function SummaryMeshJobsService.prototype.getSummaryMeshJobs + * @description 获取点聚合分析任务 + */ + + }, { + key: "getSummaryMeshJobs", + value: function getSummaryMeshJobs() { + SummaryMeshJobsService_get(SummaryMeshJobsService_getPrototypeOf(SummaryMeshJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function SummaryMeshJobsService.prototype.getSummaryMeshJob + * @description 获取指定ip的点聚合分析任务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getSummaryMeshJob", + value: function getSummaryMeshJob(id) { + SummaryMeshJobsService_get(SummaryMeshJobsService_getPrototypeOf(SummaryMeshJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function SummaryMeshJobsService.prototype.addSummaryMeshJob + * @description 新建点聚合分析服务 + * @param {SummaryMeshJobParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addSummaryMeshJob", + value: function addSummaryMeshJob(params, seconds) { + SummaryMeshJobsService_get(SummaryMeshJobsService_getPrototypeOf(SummaryMeshJobsService.prototype), "addJob", this).call(this, this.url, params, SummaryMeshJobParameter, seconds); + } + }]); + + return SummaryMeshJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryRegionJobParameter.js +function SummaryRegionJobParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryRegionJobParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryRegionJobParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryRegionJobParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryRegionJobParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SummaryRegionJobParameter + * @deprecatedclass SuperMap.SummaryRegionJobParameter + * @category iServer ProcessingService SummaryRegion + * @classdesc 区域汇总分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} [options.query] - 分析范围(默认为全图范围)。 + * @param {string} [options.standardFields] - 标准属性字段名称。 + * @param {string} [options.weightedFields] - 权重字段名称。 + * @param {StatisticAnalystMode} [options.standardStatisticModes] - 标准属性字段的统计模式。standardSummaryFields 为 true 时必填。 + * @param {StatisticAnalystMode} [options.weightedStatisticModes] - 权重字段的统计模式。weightedSummaryFields 为 true 时必填。 + * @param {boolean} [options.sumShape=true] - 是否统计长度或面积。 + * @param {boolean} [options.standardSummaryFields=false] - 是否以标准属字段统计。 + * @param {boolean} [options.weightedSummaryFields=false] - 是否以权重字段统计。 + * @param {number} [options.resolution=100] - 网格大小。 + * @param {number} [options.meshType=0] - 网格面汇总类型。 + * @param {AnalystSizeUnit} [options.meshSizeUnit=AnalystSizeUnit.METER] - 网格大小单位。 + * @param {SummaryType} [options.type=SummaryType.SUMMARYMESH] - 汇总类型。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var SummaryRegionJobParameter = /*#__PURE__*/function () { + function SummaryRegionJobParameter(options) { + SummaryRegionJobParameter_classCallCheck(this, SummaryRegionJobParameter); + + if (!options) { + return; + } + /** + * @member {string} SummaryRegionJobParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {string} SummaryRegionJobParameter.prototype.regionDataset + * @description 汇总数据源(多边形汇总时用到的参数)。 + */ + + this.regionDataset = ""; + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.sumShape=true] + * @description 是否统计长度或面积。 + */ + + this.sumShape = true; + /** + * @member {(SuperMap.Bounds|L.Bounds|L.LatLngBounds|ol.extent|mapboxgl.LngLatBounds|GeoJSONObject)} SummaryRegionJobParameter.prototype.query + * @description 分析范围。 + */ + + this.query = ""; + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.standardSummaryFields=false] + * @description 是否以标准属字段统计。 + */ + + this.standardSummaryFields = false; + /** + * @member {string} SummaryRegionJobParameter.prototype.standardFields + * @description 标准属性字段名称。仅支持系统字段以外的整形、长整形、浮点型的字段的名称。standardSummaryFields 为 true 时必填。 + */ + + this.standardFields = ""; + /** + * @member {StatisticAnalystMode} SummaryRegionJobParameter.prototype.standardStatisticModes + * @description 标准属性字段的统计模式。standardSummaryFields 为 true 时必填。 + */ + + this.standardStatisticModes = ""; + /** + * @member {boolean} [SummaryRegionJobParameter.prototype.weightedSummaryFields=false] + * @description 是否以权重字段统计。 + */ + + this.weightedSummaryFields = false; + /** + * @member {string} SummaryRegionJobParameter.prototype.weightedFields + * @description 权重字段名称。仅支持系统字段以外的整形、长整形、浮点型的字段的名称。weightedSummaryFields 为 true 时必填。 + */ + + this.weightedFields = ""; + /** + * @member {StatisticAnalystMode} SummaryRegionJobParameter.prototype.weightedStatisticModes + * @description 以权重字段统计的统计模式。权重字段的统计模式。weightedSummaryFields 为 true 时必填。 + */ + + this.weightedStatisticModes = ""; + /** + * @member {number} [SummaryRegionJobParameter.prototype.meshType=0] + * @description 网格面汇总类型。 + */ + + this.meshType = 0; + /** + * @member {number} [SummaryRegionJobParameter.prototype.resolution=100] + * @description 网格大小。 + */ + + this.resolution = 100; + /** + * @member {AnalystSizeUnit} [SummaryRegionJobParameter.prototype.meshSizeUnit=AnalystSizeUnit.METER] + * @description 网格大小单位。 + */ + + this.meshSizeUnit = AnalystSizeUnit.METER; + /** + * @member {SummaryType} [SummaryRegionJobParameter.prototype.type=SummaryType.SUMMARYMESH] + * @description 汇总类型。 + */ + + this.type = SummaryType.SUMMARYMESH; + /** + * @member {OutputSetting} SummaryRegionJobParameter.prototype.output + * @description 输出参数设置类 + */ + + this.output = null; + /** + * @member {MappingParameters} [SummaryRegionJobParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.SummaryRegionJobParameter"; + } + /** + * @function SummaryRegionJobParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SummaryRegionJobParameter_createClass(SummaryRegionJobParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.sumShape = null; + this.regionDataset = null; + this.query = null; + this.standardSummaryFields = null; + this.standardFields = null; + this.standardStatisticModes = null; + this.weightedSummaryFields = null; + this.weightedFields = null; + this.weightedStatisticModes = null; + this.meshType = null; + this.resolution = null; + this.meshSizeUnit = null; + this.type = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function SummaryRegionJobParameter.toObject + * @param {Object} summaryRegionJobParameter - 矢量裁剪分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成区域汇总分析服务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(summaryRegionJobParameter, tempObj) { + for (var name in summaryRegionJobParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = summaryRegionJobParameter[name]; + continue; + } + + if (name === "type") { + tempObj['type'] = summaryRegionJobParameter[name]; + continue; + } + + if (name === "type") { + tempObj['type'] = summaryRegionJobParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = summaryRegionJobParameter[name]; + continue; + } + + if (summaryRegionJobParameter.type === "SUMMARYREGION" || summaryRegionJobParameter.type === "SUMMARYMESH" && name !== "regionDataset") { + tempObj['analyst'] = tempObj['analyst'] || {}; + + if (name === 'query' && summaryRegionJobParameter[name]) { + tempObj['analyst'][name] = summaryRegionJobParameter[name].toBBOX(); + } else { + tempObj['analyst'][name] = summaryRegionJobParameter[name]; + } + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = summaryRegionJobParameter[name]; + } + } + } + } + }]); + + return SummaryRegionJobParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SummaryRegionJobsService.js +function SummaryRegionJobsService_typeof(obj) { "@babel/helpers - typeof"; return SummaryRegionJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SummaryRegionJobsService_typeof(obj); } + +function SummaryRegionJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SummaryRegionJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SummaryRegionJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SummaryRegionJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SummaryRegionJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SummaryRegionJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SummaryRegionJobsService_get = Reflect.get; } else { SummaryRegionJobsService_get = function _get(target, property, receiver) { var base = SummaryRegionJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SummaryRegionJobsService_get.apply(this, arguments); } + +function SummaryRegionJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SummaryRegionJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SummaryRegionJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SummaryRegionJobsService_setPrototypeOf(subClass, superClass); } + +function SummaryRegionJobsService_setPrototypeOf(o, p) { SummaryRegionJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SummaryRegionJobsService_setPrototypeOf(o, p); } + +function SummaryRegionJobsService_createSuper(Derived) { var hasNativeReflectConstruct = SummaryRegionJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SummaryRegionJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SummaryRegionJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SummaryRegionJobsService_possibleConstructorReturn(this, result); }; } + +function SummaryRegionJobsService_possibleConstructorReturn(self, call) { if (call && (SummaryRegionJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SummaryRegionJobsService_assertThisInitialized(self); } + +function SummaryRegionJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SummaryRegionJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SummaryRegionJobsService_getPrototypeOf(o) { SummaryRegionJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SummaryRegionJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class SummaryRegionJobsService + * @deprecatedclass SuperMap.SummaryRegionJobsService + * @category iServer ProcessingService SummaryRegion + * @classdesc 区域汇总分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var SummaryRegionJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + SummaryRegionJobsService_inherits(SummaryRegionJobsService, _ProcessingServiceBas); + + var _super = SummaryRegionJobsService_createSuper(SummaryRegionJobsService); + + function SummaryRegionJobsService(url, options) { + var _this; + + SummaryRegionJobsService_classCallCheck(this, SummaryRegionJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/summaryregion'); + _this.CLASS_NAME = 'SuperMap.SummaryRegionJobsService'; + return _this; + } + /** + *@override + */ + + + SummaryRegionJobsService_createClass(SummaryRegionJobsService, [{ + key: "destroy", + value: function destroy() { + SummaryRegionJobsService_get(SummaryRegionJobsService_getPrototypeOf(SummaryRegionJobsService.prototype), "destroy", this).call(this); + } + /** + * @function SummaryRegionJobsService.prototype.getSummaryRegionJobs + * @description 获取区域汇总分析任务集合。 + */ + + }, { + key: "getSummaryRegionJobs", + value: function getSummaryRegionJobs() { + SummaryRegionJobsService_get(SummaryRegionJobsService_getPrototypeOf(SummaryRegionJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function SummaryRegionJobsService.prototype.getSummaryRegionJob + * @description 获取指定id的区域汇总分析任务。 + * @param {string} id -要获取区域汇总分析任务的id + */ + + }, { + key: "getSummaryRegionJob", + value: function getSummaryRegionJob(id) { + SummaryRegionJobsService_get(SummaryRegionJobsService_getPrototypeOf(SummaryRegionJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function SummaryRegionJobsService.prototype.addSummaryRegionJob + * @description 新建区域汇总任务。 + * @param {SummaryRegionJobParameter} params - 区域汇总分析任务参数类。 + * @param {number} seconds - 创建成功结果的时间间隔。 + */ + + }, { + key: "addSummaryRegionJob", + value: function addSummaryRegionJob(params, seconds) { + SummaryRegionJobsService_get(SummaryRegionJobsService_getPrototypeOf(SummaryRegionJobsService.prototype), "addJob", this).call(this, this.url, params, SummaryRegionJobParameter, seconds); + } + }]); + + return SummaryRegionJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/SupplyCenter.js +function SupplyCenter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SupplyCenter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SupplyCenter_createClass(Constructor, protoProps, staticProps) { if (protoProps) SupplyCenter_defineProperties(Constructor.prototype, protoProps); if (staticProps) SupplyCenter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SupplyCenter + * @deprecatedclass SuperMap.SupplyCenter + * @category iServer NetworkAnalyst Location + * @classdesc 资源供给中心类。在资源分配和选址分区分析两个功能中使用。 + * @param {Object} options - 参数。 + * @param {number} options.maxWeight - 最大耗费值。 + * @param {number} options.nodeID - 结点 ID 号。资源供给中心必须是结点。 + * @param {number} options.resourceValue - 能提供的最大服务量或商品数量。 + * @param {SupplyCenterType} [options.type] - 资源供给中心点的类型常量。 + * @usage + */ + +var SupplyCenter = /*#__PURE__*/function () { + function SupplyCenter(options) { + SupplyCenter_classCallCheck(this, SupplyCenter); + + /** + * @member {number} SupplyCenter.prototype.maxWeight + * @description 资源供给中心的最大耗费值。中心点最大阻值设置越小,表示中心点所提供的资源可影响范围越大。 + * 最大阻力值是用来限制需求点到中心点的花费。 + * 如果需求点(弧段或结点)到此中心的花费大于最大阻力值,则该需求点不属于该资源供给中心提供资源的范围。 + */ + this.maxWeight = null; + /** + * @member {number} SupplyCenter.prototype.nodeID + * @description 资源供给中心点的结点 ID 号,资源供给中心必须是结点。 + */ + + this.nodeID = null; + /** + * @member {number} SupplyCenter.prototype.resourceValue + * @description 资源供给中心能提供的最大服务量或商品数量。例如资源中心为学校,资源中心资源量表示该学校能够接纳多少学生。 + */ + + this.resourceValue = null; + /** + * @member {SupplyCenterType} [SupplyCenter.prototype.type] + * @description 资源供给中心点的类型常量。资源供给中心点的类型包括非中心,固定中心和可选中心。 + * 固定中心用于资源分配分析;固定中心和可选中心用于选址分析;非中心在两种网络分析时都不予考虑。 + */ + + this.type = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.SupplyCenter"; + } + /** + * @function SupplyCenter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + SupplyCenter_createClass(SupplyCenter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.maxWeight = null; + me.nodeID = null; + me.resourceValue = null; + me.type = null; + } + /** + * @function SupplyCenter.fromJson + * @description 将服务端 JSON 对象转换成当前客户端对象。 + * @param {Object} jsonObject - 要转换的 JSON 对象。 + * @returns {SupplyCenter} SupplyCenter 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + return new SupplyCenter({ + maxWeight: jsonObject.maxWeight, + nodeID: jsonObject.nodeID, + resourceValue: jsonObject.resourceValue, + type: jsonObject.type + }); + } + }]); + + return SupplyCenter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/SurfaceAnalystService.js +function SurfaceAnalystService_typeof(obj) { "@babel/helpers - typeof"; return SurfaceAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SurfaceAnalystService_typeof(obj); } + +function SurfaceAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SurfaceAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SurfaceAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) SurfaceAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) SurfaceAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SurfaceAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SurfaceAnalystService_get = Reflect.get; } else { SurfaceAnalystService_get = function _get(target, property, receiver) { var base = SurfaceAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SurfaceAnalystService_get.apply(this, arguments); } + +function SurfaceAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SurfaceAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function SurfaceAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SurfaceAnalystService_setPrototypeOf(subClass, superClass); } + +function SurfaceAnalystService_setPrototypeOf(o, p) { SurfaceAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SurfaceAnalystService_setPrototypeOf(o, p); } + +function SurfaceAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = SurfaceAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SurfaceAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SurfaceAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SurfaceAnalystService_possibleConstructorReturn(this, result); }; } + +function SurfaceAnalystService_possibleConstructorReturn(self, call) { if (call && (SurfaceAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SurfaceAnalystService_assertThisInitialized(self); } + +function SurfaceAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SurfaceAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SurfaceAnalystService_getPrototypeOf(o) { SurfaceAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SurfaceAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class SurfaceAnalystService + * @deprecatedclass SuperMap.SurfaceAnalystService + * @category iServer SpatialAnalyst SurfaceAnalyst + * @classdesc 表面分析服务类。 + * 该类负责将客户设置的表面分析服务参数传递给服务端,并接收服务端返回的表面分析服务分析结果数据。 + * 表面分析结果通过该类支持的事件的监听函数参数获取 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var mySurfaceAnalystService = new SurfaceAnalystService(url, { + * eventListeners: { + * "processCompleted": surfaceAnalysCompleted, + * "processFailed": surfaceAnalysFailed + * } + * }); + * (end) + * @usage + */ + +var SurfaceAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + SurfaceAnalystService_inherits(SurfaceAnalystService, _SpatialAnalystBase); + + var _super = SurfaceAnalystService_createSuper(SurfaceAnalystService); + + function SurfaceAnalystService(url, options) { + var _this; + + SurfaceAnalystService_classCallCheck(this, SurfaceAnalystService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.SurfaceAnalystService"; + return _this; + } + /** + * @function SurfaceAnalystService.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + + + SurfaceAnalystService_createClass(SurfaceAnalystService, [{ + key: "destroy", + value: function destroy() { + SurfaceAnalystService_get(SurfaceAnalystService_getPrototypeOf(SurfaceAnalystService.prototype), "destroy", this).call(this); + } + /** + * @function SurfaceAnalystService.prototype.processAsync + * @description 负责将客户端的表面分析服务参数传递到服务端。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof SurfaceAnalystParameters)) { + return; + } + + var me = this, + jsonParameters; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function SurfaceAnalystService.prototype.getJsonParameters + * @description 将参数转化为 JSON 字符串。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(params) { + var jsonParameters = ''; + var parameterObject = {}; + var me = this; + + if (params instanceof DatasetSurfaceAnalystParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + params.dataset + '/' + params.surfaceAnalystMethod.toLowerCase()); + DatasetSurfaceAnalystParameters.toObject(params, parameterObject); + jsonParameters = Util.toJSON(parameterObject); + } else if (params instanceof GeometrySurfaceAnalystParameters) { + me.url = Util.urlPathAppend(me.url, 'geometry/' + params.surfaceAnalystMethod.toLowerCase()); + jsonParameters = Util.toJSON(params); + } else { + return; + } + + me.url = Util.urlAppend(me.url, 'returnContent=true'); + return jsonParameters; + } + }]); + + return SurfaceAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/TerrainCurvatureCalculationParameters.js +function TerrainCurvatureCalculationParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TerrainCurvatureCalculationParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TerrainCurvatureCalculationParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) TerrainCurvatureCalculationParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) TerrainCurvatureCalculationParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TerrainCurvatureCalculationParameters + * @deprecatedclass SuperMap.TerrainCurvatureCalculationParameters + * @category iServer SpatialAnalyst TerrainCalculation + * @classdesc 地形曲率计算参数类。 + * @param {Object} options - 参数。 + * @param {string} options.dataset - 地形曲率计算数据源中数据集的名称。该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * @param {string} options.averageCurvatureName - 结果数据集:平均曲率数据集的名称。 + * @param {string} options.profileCurvatureName - 结果数据集:剖面曲率数据集的名称。 + * @param {string} options.planCurvatureName - 结果数据集:平面曲率数据集的名称。 + * @param {number} [options.zFactor=1.0] - 指定的高程缩放系数。1.0 表示不缩放。 + * @param {boolean} [options.deleteExistResultDataset=false] - 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + * @usage + */ + +var TerrainCurvatureCalculationParameters = /*#__PURE__*/function () { + function TerrainCurvatureCalculationParameters(options) { + TerrainCurvatureCalculationParameters_classCallCheck(this, TerrainCurvatureCalculationParameters); + + if (!options) { + return; + } + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.dataset + * @description 要用来做地形曲率计算数据源中数据集的名称。 + * 该名称用形如"数据集名称@数据源别名"形式来表示,例如:JingjinTerrain@Jingjin。 + * 注:地形曲率计算必须为栅格数据集。 + */ + + + this.dataset = null; + /** + * @member {number} [TerrainCurvatureCalculationParameters.prototype.zFactor=1.0] + * @description 指定的高程缩放系数。1.0 表示不缩放。 + * 该值是指在 DEM 栅格数据中,栅格值( Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。 + * 通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。 + * 例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。 + */ + + this.zFactor = 1.0; + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.averageCurvatureName + * @description 结果数据集:平均曲率数据集的名称。 + */ + + this.averageCurvatureName = null; + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.profileCurvatureName + * @description 结果数据集:剖面曲率数据集的名称。 + */ + + this.profileCurvatureName = ""; + /** + * @member {string} TerrainCurvatureCalculationParameters.prototype.planCurvatureName + * @description 结果数据集:平面曲率数据集的名称。 + */ + + this.planCurvatureName = ""; + /** + * @member {boolean} [TerrainCurvatureCalculationParameters.prototype.deleteExistResultDataset=false] + * @description 如果用户命名的结果数据集名称与已有的数据集重名,是否删除已有的数据集。 + */ + + this.deleteExistResultDataset = false; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TerrainCurvatureCalculationParameters"; + } + /** + * @function TerrainCurvatureCalculationParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TerrainCurvatureCalculationParameters_createClass(TerrainCurvatureCalculationParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.dataset = null; + me.zFactor = 1.0; + me.averageCurvatureName = null; + me.profileCurvatureName = null; + me.planCurvatureName = null; + me.deleteExistResultDataset = true; + } + /** + * @function TerrainCurvatureCalculationParameters.toObject + * @param {Object} derrainCurvatureCalculationParameters - 地形曲率计算参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成地形曲率计算对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(derrainCurvatureCalculationParameters, tempObj) { + for (var name in derrainCurvatureCalculationParameters) { + if (name !== "dataset") { + tempObj[name] = derrainCurvatureCalculationParameters[name]; + } + } + } + }]); + + return TerrainCurvatureCalculationParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TerrainCurvatureCalculationService.js +function TerrainCurvatureCalculationService_typeof(obj) { "@babel/helpers - typeof"; return TerrainCurvatureCalculationService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TerrainCurvatureCalculationService_typeof(obj); } + +function TerrainCurvatureCalculationService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TerrainCurvatureCalculationService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TerrainCurvatureCalculationService_createClass(Constructor, protoProps, staticProps) { if (protoProps) TerrainCurvatureCalculationService_defineProperties(Constructor.prototype, protoProps); if (staticProps) TerrainCurvatureCalculationService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TerrainCurvatureCalculationService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TerrainCurvatureCalculationService_get = Reflect.get; } else { TerrainCurvatureCalculationService_get = function _get(target, property, receiver) { var base = TerrainCurvatureCalculationService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TerrainCurvatureCalculationService_get.apply(this, arguments); } + +function TerrainCurvatureCalculationService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TerrainCurvatureCalculationService_getPrototypeOf(object); if (object === null) break; } return object; } + +function TerrainCurvatureCalculationService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TerrainCurvatureCalculationService_setPrototypeOf(subClass, superClass); } + +function TerrainCurvatureCalculationService_setPrototypeOf(o, p) { TerrainCurvatureCalculationService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TerrainCurvatureCalculationService_setPrototypeOf(o, p); } + +function TerrainCurvatureCalculationService_createSuper(Derived) { var hasNativeReflectConstruct = TerrainCurvatureCalculationService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TerrainCurvatureCalculationService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TerrainCurvatureCalculationService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TerrainCurvatureCalculationService_possibleConstructorReturn(this, result); }; } + +function TerrainCurvatureCalculationService_possibleConstructorReturn(self, call) { if (call && (TerrainCurvatureCalculationService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TerrainCurvatureCalculationService_assertThisInitialized(self); } + +function TerrainCurvatureCalculationService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TerrainCurvatureCalculationService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TerrainCurvatureCalculationService_getPrototypeOf(o) { TerrainCurvatureCalculationService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TerrainCurvatureCalculationService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TerrainCurvatureCalculationService + * @deprecatedclass SuperMap.TerrainCurvatureCalculationService + * @category iServer SpatialAnalyst TerrainCalculation + * @classdesc 地形曲率计算服务类。 + * @extends {SpatialAnalystBase} + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {string} options.url - 服务的访问地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst 。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example 例如: + * (start code) + * var myTerrainCurvatureCalculationService = new TerrainCurvatureCalculationService(url); + * myTerrainCurvatureCalculationService.on({ + * "processCompleted": processCompleted, + * "processFailed": processFailed + * } + * ); + * (end) + * @usage + */ + +var TerrainCurvatureCalculationService = /*#__PURE__*/function (_SpatialAnalystBase) { + TerrainCurvatureCalculationService_inherits(TerrainCurvatureCalculationService, _SpatialAnalystBase); + + var _super = TerrainCurvatureCalculationService_createSuper(TerrainCurvatureCalculationService); + + function TerrainCurvatureCalculationService(url, options) { + var _this; + + TerrainCurvatureCalculationService_classCallCheck(this, TerrainCurvatureCalculationService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.TerrainCurvatureCalculationService"; + return _this; + } + /** + *@override + */ + + + TerrainCurvatureCalculationService_createClass(TerrainCurvatureCalculationService, [{ + key: "destroy", + value: function destroy() { + TerrainCurvatureCalculationService_get(TerrainCurvatureCalculationService_getPrototypeOf(TerrainCurvatureCalculationService.prototype), "destroy", this).call(this); + } + /** + * @function TerrainCurvatureCalculationService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {TerrainCurvatureCalculationParameters} parameter - 地形曲率计算参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var me = this; + var parameterObject = {}; + + if (parameter instanceof TerrainCurvatureCalculationParameters) { + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/terraincalculation/curvature'); + } + + TerrainCurvatureCalculationParameters.toObject(parameter, parameterObject); + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return TerrainCurvatureCalculationService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeFlow.js +function ThemeFlow_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeFlow_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeFlow_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeFlow_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeFlow_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeFlow + * @deprecatedclass SuperMap.ThemeFlow + * @private + * @category iServer Map Theme + * @classdesc 标签或符号流动显示和牵引线风格设置类。 + * 通过该类可以设置专题图中符号是否流动显示、是否使用牵引线以及牵引线风格。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.flowEnabled=false] - 是否流动显示标签或符号。 + * @param {boolean} [options.leaderLineDisplayed=false] - 是否显示标签或符号和它标注的对象之间的牵引线。 + * @param {ServerStyle} [options.leaderLineStyle] - 标签或符号与其标注对象之间牵引线的风格。 + * @usage + */ + +var ThemeFlow = /*#__PURE__*/function () { + function ThemeFlow(options) { + ThemeFlow_classCallCheck(this, ThemeFlow); + + /** + * @member {boolean} [ThemeFlow.prototype.flowEnabled=false] + * @description 是否流动显示标签或符号。
+ * 对于标签专题图而言,对于跨越比较大的区域和线条状的几何对象,在一个地图窗口中不能完全显示的情况下,如果其标签位置比较固定, + * 在当前地图窗口中该对象的标签不可见,则需要通过平移地图来查看对象的标签信息。如果采用了流动显示的效果,在当前地图窗口中,对象即使是部分显示, + * 其标签也会显示在当前地图窗口中。当平移地图时,对象的标签会随之移动,以保证在当前地图窗口中部分或全部显示的对象其标签都可见,从而可以方便地查看各要素的标签信息。 + */ + this.flowEnabled = false; + /** + * @member {boolean} [ThemeFlow.prototype.leaderLineDisplayed=false] + * @description 是否显示标签或符号和它标注的对象之间的牵引线。false表示不显示标签或符号和它标注的对象之间的牵引线。
+ * 只有当 flowEnabled 为 true 时,牵引线才起作用。在当标签流动显示时,其位置不固定,由于牵引线始终指向要素的内点, + * 因而通过牵引线显示功能可以找到流动的标签或符号实际对应的要素。或者渲染符号偏移它所指向的对象时,图与对象之间可以采用牵引线进行连接。 + */ + + this.leaderLineDisplayed = false; + /** + * @member {ServerStyle} ThemeFlow.prototype.leaderLineStyle + * @description 标签或符号与其标注对象之间牵引线的风格。 + */ + + this.leaderLineStyle = new ServerStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeFlow"; + } + /** + * @function ThemeFlow.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeFlow_createClass(ThemeFlow, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.flowEnabled = null; + me.leaderLineDisplayed = null; + + if (me.leaderLineStyle) { + me.leaderLineStyle.destroy(); + me.leaderLineStyle = null; + } + } + /** + * @function ThemeFlow.fromObj + * @description 从传入对象获取标签或符号流动显示和牵引线风格设置类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeFlow} ThemeFlow 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeFlow(); + Util.copy(res, obj); + res.leaderLineStyle = ServerStyle.fromJson(obj.leaderLineStyle); + return res; + } + }]); + + return ThemeFlow; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridRangeItem.js +function ThemeGridRangeItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGridRangeItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGridRangeItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGridRangeItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGridRangeItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeGridRangeItem + * @deprecatedclass SuperMap.ThemeGridRangeItem + * @category iServer Map Theme + * @classdesc 栅格分段专题图子项类。在栅格分段专题图中,将栅格值按照某种分段模式被分成多个范围段。 + * 本类用来设置每个范围段的分段起始值、终止值、名称和颜色等。每个分段所表示的范围为 [Start,End)。 + * @param {Object} options - 参数。 + * @param {ServerColor} options.color - 栅格分段专题图中每一个分段专题图子项的对应的颜色。 + * @param {string} [options.caption] - 栅格分段专题图子项的标题。 + * @param {number} [options.end=0] - 栅格分段专题图子项的终止值。 + * @param {number} [options.start=0] - 栅格分段专题图子项的起始值。 + * @param {boolean} [options.visible=true] - 栅格分段专题图子项是否可见。 + * @usage + */ + +var ThemeGridRangeItem = /*#__PURE__*/function () { + function ThemeGridRangeItem(options) { + ThemeGridRangeItem_classCallCheck(this, ThemeGridRangeItem); + + /** + * @member {string} [ThemeGridRangeItem.prototype.caption] + * @description 栅格分段专题图子项的标题。 + */ + this.caption = null; + /** + * @member {ServerColor} ThemeGridRangeItem.prototype.color + * @description 栅格分段专题图中每一个分段专题图子项的对应的颜色。 + */ + + this.color = new ServerColor(); + /** + * @member {number} [ThemeGridRangeItem.prototype.end=0] + * @description 栅格分段专题图子项的终止值,即该段专题值范围的最大值。 + */ + + this.end = 0; + /** + * @member {number} [ThemeGridRangeItem.prototype.start=0] + * @description 栅格分段专题图子项的起始值,即该段专题值范围的最小值。 + */ + + this.start = 0; + /** + * @member {boolean} [ThemeGridRangeItem.prototype.visible=true] + * @description 栅格分段专题图子项是否可见。 + */ + + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGridRangeItem"; + } + /** + * @function ThemeGridRangeItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGridRangeItem_createClass(ThemeGridRangeItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.end = null; + me.start = null; //需要验证是够存在destroy方法 + + if (me.color) { + me.color.destroy(); + me.color = null; + } + + me.visible = null; + } + /** + * @function ThemeGridRangeItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.color) { + if (obj.color.toServerJSONObject) { + obj.color = obj.color.toServerJSONObject(); + } + } + + return obj; + } + /** + * @function ThemeGridRangeItem.fromObj + * @description 从传入对象获取栅格分段专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridRangeItem} ThemeGridRangeItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGridRangeItem(); + Util.copy(res, obj); + res.color = ServerColor.fromJson(obj.color); + return res; + } + }]); + + return ThemeGridRangeItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridRange.js +function ThemeGridRange_typeof(obj) { "@babel/helpers - typeof"; return ThemeGridRange_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeGridRange_typeof(obj); } + +function ThemeGridRange_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGridRange_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGridRange_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGridRange_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGridRange_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeGridRange_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeGridRange_get = Reflect.get; } else { ThemeGridRange_get = function _get(target, property, receiver) { var base = ThemeGridRange_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeGridRange_get.apply(this, arguments); } + +function ThemeGridRange_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeGridRange_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeGridRange_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeGridRange_setPrototypeOf(subClass, superClass); } + +function ThemeGridRange_setPrototypeOf(o, p) { ThemeGridRange_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeGridRange_setPrototypeOf(o, p); } + +function ThemeGridRange_createSuper(Derived) { var hasNativeReflectConstruct = ThemeGridRange_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeGridRange_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeGridRange_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeGridRange_possibleConstructorReturn(this, result); }; } + +function ThemeGridRange_possibleConstructorReturn(self, call) { if (call && (ThemeGridRange_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeGridRange_assertThisInitialized(self); } + +function ThemeGridRange_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeGridRange_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeGridRange_getPrototypeOf(o) { ThemeGridRange_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeGridRange_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeGridRange + * @deprecatedclass SuperMap.ThemeGridRange + * @category iServer Map Theme + * @classdesc 栅格分段专题图。栅格分段专题图,是将所有单元格的值按照某种分段方式分成多个范围段,值在同一个范围段中的单元格使用相同的颜色进行显示。一般用来反映连续分布现象的数量或程度特征。 + * 比如某年的全国降水量分布图,将各气象站点的观测值经过内插之后生成的栅格数据进行分段显示。 + * 该类类似于分段专题图类,不同点在于分段专题图的操作对象是矢量数据,而栅格分段专题图的操作对象是栅格数据。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 栅格分段专题图子项数组。 + * @param {boolean} [options.reverseColor=false] - 是否对栅格分段专题图中分段的颜色风格进行反序显示。 + * @param {RangeMode} [options.rangeMode=RangeMode.EQUALINTERVAL] - 分段专题图的分段模式。 + * @param {number} [options.rangeParameter=0] - 分段参数。 + * @param {ColorGradientType} [options.colorGradientType=ColorGradientType.YELLOW_RED] - 渐变颜色枚举类。 + * @usage + */ + +var ThemeGridRange = /*#__PURE__*/function (_Theme) { + ThemeGridRange_inherits(ThemeGridRange, _Theme); + + var _super = ThemeGridRange_createSuper(ThemeGridRange); + + function ThemeGridRange(options) { + var _this; + + ThemeGridRange_classCallCheck(this, ThemeGridRange); + + _this = _super.call(this, "GRIDRANGE", options); + /** + * @member {Array.} ThemeGridRange.prototype.items + * @description 栅格分段专题图子项数组。
+ * 在栅格分段专题图中,将栅格值按照某种分段模式被分成多个范围段。 + * 本类用来设置每个栅格范围段的分段起始值、终止值、名称和颜色等。每个分段所表示的范围为 [Start,End)。 + */ + + _this.items = null; + /** + * @member {RangeMode} [ThemeGridRange.prototype.rangeMode=RangeMode.EQUALINTERVAL] + * @description 分段专题图的分段模式。
+ * 在栅格分段专题图中,作为专题变量的字段或表达式的值按照某种分段方式被分成多个范围段。 + * 目前 SuperMap 提供的分段方式包括:等距离分段法、平方根分段法、标准差分段法、对数分段法、等计数分段法和自定义距离法, + * 显然这些分段方法根据一定的距离进行分段,因而范围分段专题图所基于的专题变量必须为数值型。 + */ + + _this.rangeMode = RangeMode.EQUALINTERVAL; + /** + * @member {number} [ThemeGridRange.prototype.rangeParameter=0] + * @description 分段参数。
+ * 当分段模式为等距离分段法,平方根分段,对数分段法,计数分段法其中一种模式时,该参数用于设置分段个数,必设;当分段模式为标准差分段法时, + * 该参数不起作用;当分段模式为自定义距离时,该参数用于设置自定义距离。 + */ + + _this.rangeParameter = 0; + /** + * @member {ColorGradientType} [ThemeGridRange.prototype.colorGradientType=ColorGradientType.YELLOW_RED] + * @description 渐变颜色枚举类。 + * + */ + + _this.colorGradientType = ColorGradientType.YELLOW_RED; + /** + * @member {boolean} ThemeGridRange.prototype.reverseColor + * @description 是否对栅格分段专题图中分段的颜色风格进行反序显示。 + */ + + _this.reverseColor = false; + + if (options) { + Util.extend(ThemeGridRange_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeGridRange"; + return _this; + } + /** + * @function ThemeGridRange.prototype.destroy + * @override + */ + + + ThemeGridRange_createClass(ThemeGridRange, [{ + key: "destroy", + value: function destroy() { + ThemeGridRange_get(ThemeGridRange_getPrototypeOf(ThemeGridRange.prototype), "destroy", this).call(this); + + var me = this; + + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + + me.items = null; + } + + me.reverseColor = null; + me.rangeMode = null; + me.rangeParameter = null; + me.colorGradientType = null; + } + /** + * @function ThemeGridRange.fromObj + * @description 从传入对象获取栅格分段专题图。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridRange} ThemeGridRange 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var res = new ThemeGridRange(); + Util.copy(res, obj); + var itemsR = obj.items; + var len = itemsR ? itemsR.length : 0; + res.items = []; + + for (var i = 0; i < len; i++) { + res.items.push(ThemeGridRangeItem.fromObj(itemsR[i])); + } + + return res; + } + }]); + + return ThemeGridRange; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridUniqueItem.js +function ThemeGridUniqueItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGridUniqueItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGridUniqueItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGridUniqueItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGridUniqueItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeGridUniqueItem + * @deprecatedclass SuperMap.ThemeGridUniqueItem + * @category iServer Map Theme + * @classdesc 栅格单值专题图子项类。 + * 栅格单值专题图是将值相同的单元格归为一类,每一类是一个专题图子项。 + * @param {Object} options - 可选参数。 + * @param {string} [options.caption] - 子项的名称。 + * @param {ServerColor} [options.color] - 子项的显示颜色。 + * @param {number} options.unique - 子项的专题值,即单元格的值,值相同的单元格位于一个子项内。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @usage + */ + +var ThemeGridUniqueItem = /*#__PURE__*/function () { + function ThemeGridUniqueItem(options) { + ThemeGridUniqueItem_classCallCheck(this, ThemeGridUniqueItem); + + /** + * @member {string} [ThemeGridUniqueItem.prototype.caption] + * @description 栅格单值专题图子项的名称。 + */ + this.caption = null; + /** + * @member {ServerColor} [ThemeGridUniqueItem.prototype.color] + * @description 栅格单值专题图子项的显示颜色。 + */ + + this.color = new ServerColor(); + /** + * @member {number} ThemeGridUniqueItem.prototype.unique + * @description 栅格单值专题图子项的专题值,即单元格的值,值相同的单元格位于一个子项内。 + */ + + this.unique = null; + /** + * @member {boolean} [ThemeGridUniqueItem.prototype.visible=true] + * @description 栅格单值专题图子项是否可见。 + */ + + this.visible = true; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeGridUniqueItem"; + } + /** + * @function ThemeGridUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeGridUniqueItem_createClass(ThemeGridUniqueItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.caption = null; + me.unique = null; + + if (me.color) { + me.color.destroy(); + me.color = null; + } + + me.visible = null; + } + /** + * @function ThemeGridUniqueItem.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象。 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.color) { + if (obj.color.toServerJSONObject) { + obj.color = obj.color.toServerJSONObject(); + } + } + + return obj; + } + /** + * @function ThemeGridUniqueItem.fromObj + * @description 从传入对象获取栅格单值专题图子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeGridUniqueItem} ThemeGridUniqueItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeGridUniqueItem(); + Util.copy(res, obj); + res.color = ServerColor.fromJson(obj.color); + return res; + } + }]); + + return ThemeGridUniqueItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeGridUnique.js +function ThemeGridUnique_typeof(obj) { "@babel/helpers - typeof"; return ThemeGridUnique_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeGridUnique_typeof(obj); } + +function ThemeGridUnique_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeGridUnique_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeGridUnique_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeGridUnique_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeGridUnique_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeGridUnique_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeGridUnique_get = Reflect.get; } else { ThemeGridUnique_get = function _get(target, property, receiver) { var base = ThemeGridUnique_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeGridUnique_get.apply(this, arguments); } + +function ThemeGridUnique_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeGridUnique_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeGridUnique_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeGridUnique_setPrototypeOf(subClass, superClass); } + +function ThemeGridUnique_setPrototypeOf(o, p) { ThemeGridUnique_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeGridUnique_setPrototypeOf(o, p); } + +function ThemeGridUnique_createSuper(Derived) { var hasNativeReflectConstruct = ThemeGridUnique_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeGridUnique_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeGridUnique_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeGridUnique_possibleConstructorReturn(this, result); }; } + +function ThemeGridUnique_possibleConstructorReturn(self, call) { if (call && (ThemeGridUnique_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeGridUnique_assertThisInitialized(self); } + +function ThemeGridUnique_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeGridUnique_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeGridUnique_getPrototypeOf(o) { ThemeGridUnique_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeGridUnique_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThemeGridUnique + * @deprecatedclass SuperMap.ThemeGridUnique + * @category iServer Map Theme + * @classdesc 栅格单值专题图类。栅格单值专题图是将单元格值相同的归为一类,为每一类设定一种颜色,从而用来区分不同的类别。 + * 适用于离散栅格数据和部分连续栅格数据,对于单元格值各不相同的那些连续栅格数据,使用栅格单值专题图不具有任何意义。 + * @extends {CommonTheme} + * @param {Object} options - 参数。 + * @param {Array.} options.items - 栅格单值专题图子项数组。 + * @param {ServerColor} [options.defaultcolor] - 栅格单值专题图的默认颜色。 + * @usage + */ + +var ThemeGridUnique = /*#__PURE__*/function (_Theme) { + ThemeGridUnique_inherits(ThemeGridUnique, _Theme); + + var _super = ThemeGridUnique_createSuper(ThemeGridUnique); + + function ThemeGridUnique(options) { + var _this; + + ThemeGridUnique_classCallCheck(this, ThemeGridUnique); + + _this = _super.call(this, "GRIDUNIQUE", options); + /** + * @member {ServerColor} ThemeGridUnique.prototype.defaultcolor + * @description 栅格单值专题图的默认颜色。 + * 对于那些未在格网单值专题图子项之列的要素使用该颜色显示。 + */ + + _this.defaultcolor = new ServerColor(); + /** + * @member {Array.} ThemeGridUnique.prototype.items + * @description 栅格单值专题图子项数组。 + * 栅格单值专题图将值相同的单元格归为一类,每一类是一个专题图子项。 + */ + + _this.items = null; + + if (options) { + Util.extend(ThemeGridUnique_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThemeGridUnique"; + return _this; + } + /** + * @function ThemeGridUnique.prototype.destroy + * @override + */ + + + ThemeGridUnique_createClass(ThemeGridUnique, [{ + key: "destroy", + value: function destroy() { + ThemeGridUnique_get(ThemeGridUnique_getPrototypeOf(ThemeGridUnique.prototype), "destroy", this).call(this); + + var me = this; + + if (me.items) { + if (me.items.length > 0) { + for (var item in me.items) { + me.items[item].destroy(); + me.items[item] = null; + } + } + + me.items = null; + } + + if (me.defaultcolor) { + me.defaultcolor.destroy(); + me.defaultcolor = null; + } + } + /** + * @function ThemeGridUnique.prototype.toServerJSONObject + * @description 转换成对应的 JSON 格式对象。 + * @returns {Object} 对应的 JSON 格式对象 + */ + + }, { + key: "toServerJSONObject", + value: function toServerJSONObject() { + var obj = {}; + obj = Util.copyAttributes(obj, this); + + if (obj.defaultcolor) { + if (obj.defaultcolor.toServerJSONObject) { + obj.defaultcolor = obj.defaultcolor.toServerJSONObject(); + } + } + + if (obj.items) { + var items = [], + len = obj.items.length; + + for (var i = 0; i < len; i++) { + items.push(obj.items[i].toServerJSONObject()); + } + + obj.items = items; + } + + return obj; + } + /** + * @function ThemeGridUnique.fromObj + * @description 从传入对象获取栅格单值专题图类。 + * @param {Object} obj - 传入对象 + * @returns {ThemeGridUnique} ThemeGridUnique 对象 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + var res = new ThemeGridUnique(); + var uItems = obj.items; + var len = uItems ? uItems.length : 0; + Util.extend(res, obj); + res.items = []; + res.defaultcolor = ServerColor.fromJson(obj.defaultcolor); + + for (var i = 0; i < len; i++) { + res.items.push(ThemeGridUniqueItem.fromObj(uItems[i])); + } + + return res; + } + }]); + + return ThemeGridUnique; +}(Theme); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeLabelUniqueItem.js +function ThemeLabelUniqueItem_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeLabelUniqueItem_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeLabelUniqueItem_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeLabelUniqueItem_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeLabelUniqueItem_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ThemeLabelUniqueItem + * @deprecatedclass SuperMap.ThemeLabelUniqueItem + * @category iServer Map Theme + * @classdesc 单值标签专题图的子项。标签专题图用专题值对点、线、面等对象做标注,值得注意的是,单值标签专题图允许用户通过 uniqueExpression + * 字段指定用于单值的字段,同一值的标签具有相同的显示风格,其中每一个值就是一个专题图子项, + * 每一个子项都具有其名称、风格、指定的单值、X 方向偏移量和 Y 方向偏移量。 + * @param {Object} options - 参数。 + * @param {string} options.unique - 子项的值,可以为数字、字符串等。 + * @param {string} [options.caption] - 子项的名称。 + * @param {number} [options.offsetX=0] - 标签在 X 方向偏移量。 + * @param {number} [options.offsetY=0] - 标签在 Y 方向偏移量。 + * @param {boolean} [options.visible=true] - 子项是否可见。 + * @param {ServerTextStyle} [options.style] - 子项文本的显示风格。 + * @usage + */ + +var ThemeLabelUniqueItem = /*#__PURE__*/function () { + function ThemeLabelUniqueItem(options) { + ThemeLabelUniqueItem_classCallCheck(this, ThemeLabelUniqueItem); + + /** + * @member {string} [ThemeLabelUniqueItem.prototype.caption] + * @description 标签专题子项的标题。 + */ + this.caption = null; + /** + * @member {string} ThemeLabelUniqueItem.prototype.unique + * @description 单值专题图子项的值,可以为数字、字符串等。 + */ + + this.unique = null; + /** + * @member {number} [ThemeLabelUniqueItem.prototype.offsetX=0] + * @description 标签在 X 方向偏移量。 + */ + + this.offsetX = 0; + /** + * @member {number} [ThemeLabelUniqueItem.prototype.offsetY=0] + * @description 标签在 Y 方向偏移量。 + */ + + this.offsetY = 0; + /** + * @member {boolean} [ThemeLabelUniqueItem.prototype.visible=true] + * @description 标签专题图子项是否可见。如果标签专题图子项可见,则为 true,否则为 false。 + */ + + this.visible = true; + /** + * @member {ServerTextStyle} ThemeLabelUniqueItem.prototype.style + * @description 标签专题图子项文本的显示风格。各种风格的优先级从高到低为:
+ * uniformMixedStyle(标签文本的复合风格),ThemeLabelUniqueItem.style(单值子项的文本风格),uniformStyle(统一文本风格)。 + */ + + this.style = new ServerTextStyle(); + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeLabelUniqueItem"; + } + /** + * @function ThemeLabelUniqueItem.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeLabelUniqueItem_createClass(ThemeLabelUniqueItem, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.unique = null; + me.caption = null; + me.offsetX = null; + me.offsetY = null; + + if (me.style) { + me.style.destroy(); + me.style = null; + } + + me.visible = null; + } + /** + * @function ThemeLabelUniqueItem.fromObj + * @description 从传入对象获取单值标签专题图的子项类。 + * @param {Object} obj - 传入对象。 + * @returns {ThemeLabelUniqueItem} ThemeLabelUniqueItem 对象。 + */ + + }], [{ + key: "fromObj", + value: function fromObj(obj) { + if (!obj) { + return; + } + + var t = new ThemeLabelUniqueItem(); + Util.copy(t, obj); + return t; + } + }]); + + return ThemeLabelUniqueItem; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeMemoryData.js +function ThemeMemoryData_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeMemoryData_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeMemoryData_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeMemoryData_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeMemoryData_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeMemoryData + * @deprecatedclass SuperMap.ThemeMemoryData + * @category iServer Map Theme + * @classdesc 专题图内存数据类。 + * @param {Array} srcData - 原始值数组。 + * @param {Array} targetData - 外部值数组。 + * @usage + */ +var ThemeMemoryData = /*#__PURE__*/function () { + function ThemeMemoryData(srcData, targetData) { + ThemeMemoryData_classCallCheck(this, ThemeMemoryData); + + /** + * @member {Array} ThemeMemoryData.prototype.srcData + * @description 原始值数组,该属性值将被 targetData 属性所指定的值替换掉,然后制作专题图,但数据库中的值并不会改变。 + */ + this.srcData = srcData; + /** + * @member {Array} ThemeMemoryData.prototype.targetData + * @description 外部值数组,即用于制作专题图的内存数据,设定该属性值后,会将 srcData 属性所指定的原始值替换掉制作专题图,但数据库中的值并不会改变。 + */ + + this.targetData = targetData; + this.CLASS_NAME = "SuperMap.ThemeMemoryData"; + } + /** + * @function ThemeMemoryData.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeMemoryData_createClass(ThemeMemoryData, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.srcData = null; + me.targetData = null; + } + /** + * @function ThemeMemoryData.prototype.toJSON + * @description 将 ThemeMemoryData 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + if (this.srcData && this.targetData) { + var memoryDataStr = ""; + var count = Math.min(this.srcData.length, this.targetData.length); + + for (var i = 0; i < count; i++) { + memoryDataStr += "\'" + this.srcData[i] + "\':\'" + this.targetData[i] + "\',"; + } //去除多余的逗号 + + + if (i > 0) { + memoryDataStr = memoryDataStr.substring(0, memoryDataStr.length - 1); + } + + return "{" + memoryDataStr + "}"; + } else { + return null; + } + } + }]); + + return ThemeMemoryData; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeParameters.js +function ThemeParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeParameters + * @deprecatedclass SuperMap.ThemeParameters + * @category iServer Map Theme + * @classdesc 专题图参数类。 + * 该类存储了制作专题所需的参数,包括数据源、数据集名称和专题图对象。 + * @param {Object} options - 参数。 + * @param {Array.} options.datasetNames - 数据集数组。 + * @param {Array.} options.dataSourceNames - 数据源数组。 + * @param {Array.} [options.joinItems] - 专题图外部表的连接信息 JoinItem 数组。 + * @param {Array.} options.themes - 专题图对象列表。 + * @param {Array.} [options.displayFilters] - 专题图属性过滤条件。 + * @param {Array.} [options.displayOrderBys] - 专题图对象生成符号叠加次序排序字段。 + * @param {Object} [options.fieldValuesDisplayFilter] - 图层要素的显示和隐藏的过滤属性,其带有三个属性,分别是:values、fieldName、fieldValuesDisplayMode。 + * @usage + */ + +var ThemeParameters = /*#__PURE__*/function () { + function ThemeParameters(options) { + ThemeParameters_classCallCheck(this, ThemeParameters); + + /** + * @member {Array.} ThemeParameters.prototype.datasetNames + * @description 要制作专题图的数据集数组。 + */ + this.datasetNames = null; + /** + * @member {Array.} ThemeParameters.prototype.dataSourceNames + * @description 要制作专题图的数据集所在的数据源数组。 + */ + + this.dataSourceNames = null; + /** + * @member {Array.} [ThemeParameters.prototype.joinItems] + * @description 设置与外部表的连接信息 JoinItem 数组。 + * 使用此属性可以制作与外部表连接的专题图。 + */ + + this.joinItems = null; + /** + * @member {Array.} ThemeParameters.prototype.themes + * @description 专题图对象列表。 + * 该参数为实例化的各类专题图对象的集合。 + */ + + this.themes = null; + /** + * @member {Array.} [ThemeParameters.prototype.displayFilters] + * @description 专题图属性过滤条件。 + */ + + this.displayFilters = null; + /** + * @member {Array.} [ThemeParameters.prototype.displayOrderBys] + * @description 专题图对象生成符号叠加次序排序字段。 + */ + + this.displayOrderBys = null; + /** + * @member {Object} [ThemeParameters.prototype.fieldValuesDisplayFilter] + * @property {Array.} values - 待过滤的值。 + * @property {string} fieldName - 待过滤的字段名称只支持数字类型的字段。 + * @property {string} fieldValuesDisplayMode - 目前为 DISPLAY/DISABLE。当为 DISPLAY 时,表示只显示以上设置的相应属性值的要素,否则表示不显示以上设置的相应属性值的要素。 + */ + + this.fieldValuesDisplayFilter = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.ThemeParameters"; + } + /** + * @function ThemeParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ThemeParameters_createClass(ThemeParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasetNames = null; + me.dataSourceNames = null; + + if (me.joinItems) { + for (var i = 0, joinItems = me.joinItems, len = joinItems.length; i < len; i++) { + joinItems[i].destroy(); + } + + me.joinItems = null; + } + + if (me.themes) { + for (var _i = 0, themes = me.themes, _len = themes.length; _i < _len; _i++) { + themes[_i].destroy(); + } + + me.themes = null; + } + } + }]); + + return ThemeParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/ThemeService.js +function ThemeService_typeof(obj) { "@babel/helpers - typeof"; return ThemeService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeService_typeof(obj); } + +function ThemeService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeService_get = Reflect.get; } else { ThemeService_get = function _get(target, property, receiver) { var base = ThemeService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeService_get.apply(this, arguments); } + +function ThemeService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeService_setPrototypeOf(subClass, superClass); } + +function ThemeService_setPrototypeOf(o, p) { ThemeService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeService_setPrototypeOf(o, p); } + +function ThemeService_createSuper(Derived) { var hasNativeReflectConstruct = ThemeService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeService_possibleConstructorReturn(this, result); }; } + +function ThemeService_possibleConstructorReturn(self, call) { if (call && (ThemeService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeService_assertThisInitialized(self); } + +function ThemeService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeService_getPrototypeOf(o) { ThemeService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeService + * @deprecatedclass SuperMap.ThemeService + * @category iServer Map Theme + * @classdesc 专题图服务类。 + * @extends {CommonServiceBase} + * @example + * var myThemeService = new ThemeService(url, { + * eventListeners: { + * "processCompleted": themeCompleted, + * "processFailed": themeFailed + * } + * }); + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/map-world/rest/maps/World+Map 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ThemeService = /*#__PURE__*/function (_CommonServiceBase) { + ThemeService_inherits(ThemeService, _CommonServiceBase); + + var _super = ThemeService_createSuper(ThemeService); + + function ThemeService(url, options) { + var _this; + + ThemeService_classCallCheck(this, ThemeService); + + _this = _super.call(this, url, options); + + if (options) { + Util.extend(ThemeService_assertThisInitialized(_this), options); + } + + _this.url = Util.urlPathAppend(_this.url, 'tempLayersSet'); + _this.CLASS_NAME = 'SuperMap.ThemeService'; + return _this; + } + /** + * @override + */ + + + ThemeService_createClass(ThemeService, [{ + key: "destroy", + value: function destroy() { + ThemeService_get(ThemeService_getPrototypeOf(ThemeService.prototype), "destroy", this).call(this); + } + /** + * @function ThemeService.prototype.processAsync + * @description 负责将客户端的专题图参数传递到服务端。 + * @param {ThemeParameters} params - 专题图参数类。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof ThemeParameters)) { + return; + } + + var me = this, + jsonParameters = null; + jsonParameters = me.getJsonParameters(params); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ThemeService.prototype.getJsonParameters + * @description 将专题图参数参数转化为 JSON 字符串。 + * @param {ThemeParameters} parameter - 专题图参数类。 + * @returns {Object} 转化后的JSON字符串。 + */ + + }, { + key: "getJsonParameters", + value: function getJsonParameters(parameter) { + var jsonParameters = "", + themeObj = null, + filters = null, + orderBys = null, + fieldValuesDisplayFilter; + jsonParameters += "[{'type': 'UGC','subLayers': {'layers': ["; + + for (var i = 0; i < parameter.themes.length; i++) { + themeObj = parameter.themes[i]; + var jsonTheme = Util.toJSON(themeObj); + jsonTheme = jsonTheme.slice(0, -1); + jsonParameters += "{'theme': " + jsonTheme + "},'type': 'UGC','ugcLayerType': 'THEME',"; + filters = parameter.displayFilters; + + if (filters && filters.length > 0) { + if (filters.length === 1) { + jsonParameters += "'displayFilter':\"" + filters[0] + "\","; + } else { + jsonParameters += "'displayFilter':\"" + filters[i] + "\","; + } + } + + orderBys = parameter.displayOrderBy; + + if (orderBys && orderBys.length > 0) { + if (orderBys.length === 1) { + jsonParameters += "'displayOrderBy':'" + orderBys[0] + "',"; + } else { + jsonParameters += "'displayOrderBy':'" + orderBys[i] + "',"; + } + } + + fieldValuesDisplayFilter = parameter.fieldValuesDisplayFilter; + + if (fieldValuesDisplayFilter) { + jsonParameters += "'fieldValuesDisplayFilter':" + Util.toJSON(fieldValuesDisplayFilter) + ","; + } + + if (parameter.joinItems && parameter.joinItems.length > 0 && parameter.joinItems[i]) { + jsonParameters += "'joinItems':[" + Util.toJSON(parameter.joinItems[i]) + "],"; + } + + if (parameter.datasetNames && parameter.dataSourceNames) { + var datasetID = parameter.datasetNames[i] ? i : parameter.datasetNames.length - 1; + var dataSourceID = parameter.dataSourceNames[i] ? i : parameter.dataSourceNames.length - 1; + jsonParameters += "'datasetInfo': {'name': '" + parameter.datasetNames[datasetID] + "','dataSourceName': '" + parameter.dataSourceNames[dataSourceID] + "'}},"; + } else { + jsonParameters += "},"; + } + } //去除多余的逗号 + + + if (parameter.themes && parameter.themes.length > 0) { + jsonParameters = jsonParameters.substring(0, jsonParameters.length - 1); + } + + jsonParameters += "]},"; + var urlArray = this.url.split("/"); + var jsonMapName = urlArray[urlArray.length - 2]; + jsonParameters += "'name': '" + jsonMapName + "'}]"; + return jsonParameters; + } + }]); + + return ThemeService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/ThiessenAnalystService.js +function ThiessenAnalystService_typeof(obj) { "@babel/helpers - typeof"; return ThiessenAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThiessenAnalystService_typeof(obj); } + +function ThiessenAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThiessenAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThiessenAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThiessenAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThiessenAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThiessenAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThiessenAnalystService_get = Reflect.get; } else { ThiessenAnalystService_get = function _get(target, property, receiver) { var base = ThiessenAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThiessenAnalystService_get.apply(this, arguments); } + +function ThiessenAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThiessenAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThiessenAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThiessenAnalystService_setPrototypeOf(subClass, superClass); } + +function ThiessenAnalystService_setPrototypeOf(o, p) { ThiessenAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThiessenAnalystService_setPrototypeOf(o, p); } + +function ThiessenAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = ThiessenAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThiessenAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThiessenAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThiessenAnalystService_possibleConstructorReturn(this, result); }; } + +function ThiessenAnalystService_possibleConstructorReturn(self, call) { if (call && (ThiessenAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThiessenAnalystService_assertThisInitialized(self); } + +function ThiessenAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThiessenAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThiessenAnalystService_getPrototypeOf(o) { ThiessenAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThiessenAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class ThiessenAnalystService + * @deprecatedclass SuperMap.ThiessenAnalystService + * @category iServer SpatialAnalyst ThiessenPolygonAnalyst + * @classdesc + * 泰森多边形分析服务类 + * 该类负责将客户设置的泰森多边形分析参数传递给服务端,并接收服务端返回的分析结果数据。 + * 泰森多边形分析结果通过该类支持的事件的监听函数参数获取 + * 泰森多边形分析的参数支持两种,当参数为 {@link DatasetThiessenAnalystParameters} 类型 + * 时,执行数据集泰森多边形分析,当参数为 {@link GeometryThiessenAnalystParameters} 类型时, + * 执行几何对象泰森多边形分析。 + * @param {string} url - 服务地址。如 http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {SpatialAnalystBase} + * @example 例如: + * (start code) + * var myThiessenAnalystService = new ThiessenAnalystService(url, { + * eventListeners: { + * "processCompleted": bufferCompleted, + * "processFailed": bufferFailed + * } + * }); + * (end) + * @usage + */ + +var ThiessenAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + ThiessenAnalystService_inherits(ThiessenAnalystService, _SpatialAnalystBase); + + var _super = ThiessenAnalystService_createSuper(ThiessenAnalystService); + + function ThiessenAnalystService(url, options) { + var _this; + + ThiessenAnalystService_classCallCheck(this, ThiessenAnalystService); + + _this = _super.call(this, url, options); + /** + * @member {string} ThiessenAnalystService.prototype.mode + * @description 缓冲区分析类型 + */ + + _this.mode = null; + + if (options) { + Util.extend(ThiessenAnalystService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.ThiessenAnalystService"; + return _this; + } + /** + * @override + */ + + + ThiessenAnalystService_createClass(ThiessenAnalystService, [{ + key: "destroy", + value: function destroy() { + ThiessenAnalystService_get(ThiessenAnalystService_getPrototypeOf(ThiessenAnalystService.prototype), "destroy", this).call(this); + + this.mode = null; + } + /** + * @function ThiessenAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {DatasetThiessenAnalystParameters|GeometryThiessenAnalystParameters} parameter - 泰森多边形分析参数基类。 + */ + + }, { + key: "processAsync", + value: function processAsync(parameter) { + var parameterObject = {}; + var me = this; + + if (parameter instanceof DatasetThiessenAnalystParameters) { + me.mode = "datasets"; + me.url = Util.urlPathAppend(me.url, 'datasets/' + parameter.dataset + '/thiessenpolygon'); + DatasetThiessenAnalystParameters.toObject(parameter, parameterObject); + } else if (parameter instanceof GeometryThiessenAnalystParameters) { + me.mode = "geometry"; + me.url = Util.urlPathAppend(me.url, 'geometry/thiessenpolygon'); + GeometryThiessenAnalystParameters.toObject(parameter, parameterObject); + } + + var jsonParameters = Util.toJSON(parameterObject); + me.url = Util.urlAppend(me.url, 'returnContent=true'); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return ThiessenAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/GeometryBatchAnalystService.js +function GeometryBatchAnalystService_typeof(obj) { "@babel/helpers - typeof"; return GeometryBatchAnalystService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, GeometryBatchAnalystService_typeof(obj); } + +function GeometryBatchAnalystService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeometryBatchAnalystService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeometryBatchAnalystService_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeometryBatchAnalystService_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeometryBatchAnalystService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeometryBatchAnalystService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { GeometryBatchAnalystService_get = Reflect.get; } else { GeometryBatchAnalystService_get = function _get(target, property, receiver) { var base = GeometryBatchAnalystService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return GeometryBatchAnalystService_get.apply(this, arguments); } + +function GeometryBatchAnalystService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = GeometryBatchAnalystService_getPrototypeOf(object); if (object === null) break; } return object; } + +function GeometryBatchAnalystService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) GeometryBatchAnalystService_setPrototypeOf(subClass, superClass); } + +function GeometryBatchAnalystService_setPrototypeOf(o, p) { GeometryBatchAnalystService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return GeometryBatchAnalystService_setPrototypeOf(o, p); } + +function GeometryBatchAnalystService_createSuper(Derived) { var hasNativeReflectConstruct = GeometryBatchAnalystService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = GeometryBatchAnalystService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = GeometryBatchAnalystService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return GeometryBatchAnalystService_possibleConstructorReturn(this, result); }; } + +function GeometryBatchAnalystService_possibleConstructorReturn(self, call) { if (call && (GeometryBatchAnalystService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return GeometryBatchAnalystService_assertThisInitialized(self); } + +function GeometryBatchAnalystService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function GeometryBatchAnalystService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function GeometryBatchAnalystService_getPrototypeOf(o) { GeometryBatchAnalystService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return GeometryBatchAnalystService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class GeometryBatchAnalystService + * @deprecatedclass SuperMap.GeometryBatchAnalystService + * @category iServer SpatialAnalyst BatchAnalyst + * @classdesc 批量空间分析服务类 + * @description 该类负责将客户设置的叠加分析参数传递给服务端,并接收服务端返回的叠加分析结果数据。 + * 获取的结果数据包括 originResult 、result 两种, + * 其中,originResult 为服务端返回的用 JSON 对象表示的量算结果数据,result 为服务端返回的量算结果数据。 + * @extends {SpatialAnalystBase} + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/spatialanalyst-changchun/restjsr/spatialanalyst。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * var myOverlayAnalystService = new GeometryBatchAnalystService(url, { + * eventListeners: { + * "processCompleted": OverlayCompleted, + * "processFailed": OverlayFailed + * } + * }); + * @usage + */ + +var GeometryBatchAnalystService = /*#__PURE__*/function (_SpatialAnalystBase) { + GeometryBatchAnalystService_inherits(GeometryBatchAnalystService, _SpatialAnalystBase); + + var _super = GeometryBatchAnalystService_createSuper(GeometryBatchAnalystService); + + function GeometryBatchAnalystService(url, options) { + var _this; + + GeometryBatchAnalystService_classCallCheck(this, GeometryBatchAnalystService); + + _this = _super.call(this, url, options); + + if (options) { + Util.extend(GeometryBatchAnalystService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = "SuperMap.GeometryBatchAnalystService"; + return _this; + } + /** + * @function GeometryBatchAnalystService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + * @param {GeometryOverlayAnalystParameter} parameter - 批量几何对象叠加分析参数类 + * + */ + + + GeometryBatchAnalystService_createClass(GeometryBatchAnalystService, [{ + key: "processAsync", + value: function processAsync(parameters) { + var me = this; + me.url = Util.urlPathAppend(me.url, 'geometry/batchanalyst'); + me.url = Util.urlAppend(me.url, 'returnContent=true&ignoreAnalystParam=true'); + + var parameterObjects = me._processParams(parameters); + + var jsonParameters = Util.toJSON(parameterObjects); + me.request({ + method: "POST", + data: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }, { + key: "_processParams", + value: function _processParams(parameters) { + var me = this; + + if (!Util.isArray(parameters)) { + return; + } + + var processParams = []; + parameters.map(function (item) { + processParams.push(me._toJSON(item)); + return item; + }); + return processParams; + } + }, { + key: "_toJSON", + value: function _toJSON(parameter) { + var tempObj = {}; + + if (parameter.analystName === "buffer") { + tempObj.analystName = "buffer"; + tempObj.param = {}; //几何对象的批量空间分析, + + GeometryBufferAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "overlay") { + tempObj.analystName = "overlay"; + tempObj.param = {}; + GeometryOverlayAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "interpolationDensity") { + tempObj.analystName = "interpolationDensity"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "interpolationidw") { + tempObj.analystName = "interpolationidw"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "interpolationRBF") { + tempObj.analystName = "interpolationRBF"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "interpolationKriging") { + tempObj.analystName = "interpolationKriging"; + tempObj.param = {}; + InterpolationAnalystParameters.toObject(parameter.param, tempObj.param); + } else if (parameter.analystName === "thiessenpolygon") { + tempObj.analystName = "thiessenpolygon"; + tempObj.param = {}; + GeometryThiessenAnalystParameters.toObject(parameter.param, tempObj.param); + } else { + //isoline; isoregion; calculatemeasure; routelocator 四种分析不需要再处理参数 + return parameter; + } + + return tempObj; + } + /** + * @override + */ + + }, { + key: "destroy", + value: function destroy() { + GeometryBatchAnalystService_get(GeometryBatchAnalystService_getPrototypeOf(GeometryBatchAnalystService.prototype), "destroy", this).call(this); + } + }]); + + return GeometryBatchAnalystService; +}(SpatialAnalystBase); +;// CONCATENATED MODULE: ./src/common/iServer/TilesetsService.js +function TilesetsService_typeof(obj) { "@babel/helpers - typeof"; return TilesetsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TilesetsService_typeof(obj); } + +function TilesetsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TilesetsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TilesetsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) TilesetsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) TilesetsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TilesetsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TilesetsService_get = Reflect.get; } else { TilesetsService_get = function _get(target, property, receiver) { var base = TilesetsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TilesetsService_get.apply(this, arguments); } + +function TilesetsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TilesetsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function TilesetsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TilesetsService_setPrototypeOf(subClass, superClass); } + +function TilesetsService_setPrototypeOf(o, p) { TilesetsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TilesetsService_setPrototypeOf(o, p); } + +function TilesetsService_createSuper(Derived) { var hasNativeReflectConstruct = TilesetsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TilesetsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TilesetsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TilesetsService_possibleConstructorReturn(this, result); }; } + +function TilesetsService_possibleConstructorReturn(self, call) { if (call && (TilesetsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TilesetsService_assertThisInitialized(self); } + +function TilesetsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TilesetsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TilesetsService_getPrototypeOf(o) { TilesetsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TilesetsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TilesetsService + * @deprecatedclass SuperMap.TilesetsService + * @category iServer Map Tilesets + * @classdesc 切片列表信息查询服务类;即查询切片地图服务的切片列表,返回切片集名称、地图切片元数据信息、切片版本集信息。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。URL 应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{服务名}/rest/maps/map; + * 例如: "http://localhost:8090/iserver/services/test/rest/maps/tianlocal"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有 processCompleted 属性可传入处理完成后的回调函数。processFailed 属性传入处理失败后的回调函数。 + * @param {DataFormat} [options.format=DataFormat.GEOJSON] - 查询结果返回格式,目前支持 iServerJSON 和 GeoJSON 两种格式。参数格式为 "ISERVER","GEOJSON"。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var TilesetsService = /*#__PURE__*/function (_CommonServiceBase) { + TilesetsService_inherits(TilesetsService, _CommonServiceBase); + + var _super = TilesetsService_createSuper(TilesetsService); + + function TilesetsService(url, options) { + var _this; + + TilesetsService_classCallCheck(this, TilesetsService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.TilesetsService"; + return _this; + } + /** + * @override + */ + + + TilesetsService_createClass(TilesetsService, [{ + key: "destroy", + value: function destroy() { + TilesetsService_get(TilesetsService_getPrototypeOf(TilesetsService.prototype), "destroy", this).call(this); + } + /** + * @function TilesetsService.prototype.processAsync + * @description 负责将客户端的查询参数传递到服务端。 + */ + + }, { + key: "processAsync", + value: function processAsync() { + if (!this.url) { + return; + } + + var me = this; + me.url = Util.urlPathAppend(me.url, 'tilesets'); + me.request({ + method: "GET", + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return TilesetsService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/TopologyValidatorJobsParameter.js +function TopologyValidatorJobsParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TopologyValidatorJobsParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TopologyValidatorJobsParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) TopologyValidatorJobsParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) TopologyValidatorJobsParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TopologyValidatorJobsParameter + * @deprecatedclass SuperMap.TopologyValidatorJobsParameter + * @category iServer ProcessingService TopologyValidator + * @classdesc 拓扑检查分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetTopology -检查对象所在的数据集名称。 + * @param {TopologyValidatorRule} [options.rule=TopologyValidatorRule.REGIONNOOVERLAP] - 拓扑检查规则。 + * @param {string} [options.tolerance] - 容限。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var TopologyValidatorJobsParameter = /*#__PURE__*/function () { + function TopologyValidatorJobsParameter(options) { + TopologyValidatorJobsParameter_classCallCheck(this, TopologyValidatorJobsParameter); + + if (!options) { + return; + } + /** + * @member {string} TopologyValidatorJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + + + this.datasetName = ""; + /** + * @member {string} TopologyValidatorJobsParameter.prototype.datasetTopology + * @description 拓扑检查对象所在的数据集名称。 + */ + + this.datasetTopology = ""; + /** + * @member {string} [TopologyValidatorJobsParameter.prototype.tolerance] + * @description 容限,指定的拓扑错误检查时使用的容限。 + */ + + this.tolerance = ""; + /** + * @member {TopologyValidatorRule} [TopologyValidatorJobsParameter.prototype.rule=TopologyValidatorRule.REGIONNOOVERLAP] + * @description 拓扑检查模式。 + */ + + this.rule = TopologyValidatorRule.REGIONNOOVERLAP; + /** + * @member {OutputSetting} [TopologyValidatorJobsParameter.prototype.output] + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [TopologyValidatorJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TopologyValidatorJobsParameter"; + } + /** + * @function TopologyValidatorJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TopologyValidatorJobsParameter_createClass(TopologyValidatorJobsParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.datasetTopology = null; + this.tolerance = null; + this.rule = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function TopologyValidatorJobsParameter.toObject + * @param {Object} TopologyValidatorJobsParameter -拓扑检查分析任务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 生成拓扑检查分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(_TopologyValidatorJobsParameter, tempObj) { + for (var name in _TopologyValidatorJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = _TopologyValidatorJobsParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = _TopologyValidatorJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = _TopologyValidatorJobsParameter[name]; + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = _TopologyValidatorJobsParameter[name]; + } + } + } + }]); + + return TopologyValidatorJobsParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TopologyValidatorJobsService.js +function TopologyValidatorJobsService_typeof(obj) { "@babel/helpers - typeof"; return TopologyValidatorJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TopologyValidatorJobsService_typeof(obj); } + +function TopologyValidatorJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TopologyValidatorJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TopologyValidatorJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) TopologyValidatorJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) TopologyValidatorJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TopologyValidatorJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TopologyValidatorJobsService_get = Reflect.get; } else { TopologyValidatorJobsService_get = function _get(target, property, receiver) { var base = TopologyValidatorJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TopologyValidatorJobsService_get.apply(this, arguments); } + +function TopologyValidatorJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TopologyValidatorJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function TopologyValidatorJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TopologyValidatorJobsService_setPrototypeOf(subClass, superClass); } + +function TopologyValidatorJobsService_setPrototypeOf(o, p) { TopologyValidatorJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TopologyValidatorJobsService_setPrototypeOf(o, p); } + +function TopologyValidatorJobsService_createSuper(Derived) { var hasNativeReflectConstruct = TopologyValidatorJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TopologyValidatorJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TopologyValidatorJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TopologyValidatorJobsService_possibleConstructorReturn(this, result); }; } + +function TopologyValidatorJobsService_possibleConstructorReturn(self, call) { if (call && (TopologyValidatorJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TopologyValidatorJobsService_assertThisInitialized(self); } + +function TopologyValidatorJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TopologyValidatorJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TopologyValidatorJobsService_getPrototypeOf(o) { TopologyValidatorJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TopologyValidatorJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TopologyValidatorJobsService + * @deprecatedclass SuperMap.TopologyValidatorJobsService + * @category iServer ProcessingService TopologyValidator + * @classdesc 拓扑检查分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var TopologyValidatorJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + TopologyValidatorJobsService_inherits(TopologyValidatorJobsService, _ProcessingServiceBas); + + var _super = TopologyValidatorJobsService_createSuper(TopologyValidatorJobsService); + + function TopologyValidatorJobsService(url, options) { + var _this; + + TopologyValidatorJobsService_classCallCheck(this, TopologyValidatorJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/topologyvalidator'); + _this.CLASS_NAME = "SuperMap.TopologyValidatorJobsService"; + return _this; + } + /** + *@override + */ + + + TopologyValidatorJobsService_createClass(TopologyValidatorJobsService, [{ + key: "destroy", + value: function destroy() { + TopologyValidatorJobsService_get(TopologyValidatorJobsService_getPrototypeOf(TopologyValidatorJobsService.prototype), "destroy", this).call(this); + } + /** + * @function TopologyValidatorJobsService.protitype.getTopologyValidatorJobs + * @description 获取拓扑检查分析所有任务 + */ + + }, { + key: "getTopologyValidatorJobs", + value: function getTopologyValidatorJobs() { + TopologyValidatorJobsService_get(TopologyValidatorJobsService_getPrototypeOf(TopologyValidatorJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function TopologyValidatorJobsService.protitype.getTopologyValidatorJob + * @description 获取指定id的拓扑检查分析服务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getTopologyValidatorJob", + value: function getTopologyValidatorJob(id) { + TopologyValidatorJobsService_get(TopologyValidatorJobsService_getPrototypeOf(TopologyValidatorJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function TopologyValidatorJobsService.protitype.addTopologyValidatorJob + * @description 新建拓扑检查分析服务 + * @param {TopologyValidatorJobsParameter} params - 拓扑检查分析任务参数类。 + * @param {number} seconds -创建成功结果的时间间隔。 + */ + + }, { + key: "addTopologyValidatorJob", + value: function addTopologyValidatorJob(params, seconds) { + TopologyValidatorJobsService_get(TopologyValidatorJobsService_getPrototypeOf(TopologyValidatorJobsService.prototype), "addJob", this).call(this, this.url, params, TopologyValidatorJobsParameter, seconds); + } + }]); + + return TopologyValidatorJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/TransferLine.js +function TransferLine_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransferLine_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransferLine_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransferLine_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransferLine_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TransferLine + * @deprecatedclass SuperMap.TransferLine + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 换乘路线信息类。 + * @param {Object} options - 参数。 + * @param {number} options.lineID - 乘车路线 ID。 + * @param {string} options.lineName - 乘车路线名称。 + * @param {string} options.lineAliasName - 乘车路线别名。 + * @param {number} options.startStopIndex - 上车站点在本公交路线中的索引。 + * @param {string} options.startStopName - 上车站点名称。 + * @param {string} options.startStopAliasName - 上车站点别名。 + * @param {number} options.endStopIndex - 下车站点在本公交路线中的索引。 + * @param {string} options.endStopName - 下车站点名称。 + * @param {string} options.endStopAliasName - 下车站点别名。 + * @usage + */ + +var TransferLine = /*#__PURE__*/function () { + function TransferLine(options) { + TransferLine_classCallCheck(this, TransferLine); + + options = options || {}; + /** + * @member {number} TransferLine.prototype.lineID + * @description 乘车路线 ID。 + */ + + this.lineID = null; + /** + * @member {string} TransferLine.prototype.lineName + * @description 乘车路线名称。 + */ + + this.lineName = null; + /** + * @member {string} TransferLine.prototype.lineAliasName + * @description 乘车路线别名。 + */ + + this.lineAliasName = null; + /** + * @member {number} TransferLine.prototype.startStopIndex + * @description 上车站点在本公交路线中的索引。 + */ + + this.startStopIndex = null; + /** + * @member {string} TransferLine.prototype.startStopName + * @description 上车站点名称。 + */ + + this.startStopName = null; + /** + * @member {string} TransferLine.prototype.startStopAliasName + * @description 上车站点别名。 + */ + + this.startStopAliasName = null; + /** + * @member {number} TransferLine.prototype.endStopIndex + * @description 下车站点在本公交路线中的索引。 + */ + + this.endStopIndex = null; + /** + * @member {string} TransferLine.prototype.endStopName + * @description 下车站点名称。 + */ + + this.endStopName = null; + /** + * @member {string} TransferLine.prototype.endStopAliasName + * @description 下车站点别名。 + */ + + this.endStopAliasName = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TransferLine"; + } + /** + * @function TransferLine.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TransferLine_createClass(TransferLine, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function TransferLine.fromJson + * @description 将返回结果转化为 {@link TransferLine} 对象。 + * @param {Object} jsonObject - 新的返回结果。 + * @returns {TransferLine} 转化后的 {@link TransferLine} 对象。 + */ + + }], [{ + key: "fromJson", + value: function fromJson(jsonObject) { + if (!jsonObject) { + return; + } + + return new TransferLine({ + lineID: jsonObject['lineID'], + lineName: jsonObject['lineName'], + lineAliasName: jsonObject['lineAliasName'], + startStopIndex: jsonObject['startStopIndex'], + startStopName: jsonObject['startStopName'], + startStopAliasName: jsonObject['startStopAliasName'], + endStopIndex: jsonObject['endStopIndex'], + endStopName: jsonObject['endStopName'], + endStopAliasName: jsonObject['endStopAliasName'] + }); + } + }]); + + return TransferLine; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TransferPathParameters.js +function TransferPathParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransferPathParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransferPathParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransferPathParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransferPathParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TransferPathParameters + * @deprecatedclass SuperMap.TransferPathParameters + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 交通换乘线路查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.} options.transferLines - 本换乘分段内可乘车的路线集合。 + * @param {Array.|number>} options.points - 两种查询方式:按照公交站点的起止 ID 进行查询和按照起止点的坐标进行查询。 + * @usage + */ + +var TransferPathParameters = /*#__PURE__*/function () { + function TransferPathParameters(options) { + TransferPathParameters_classCallCheck(this, TransferPathParameters); + + options = options || {}; + /** + * @member {Array.} TransferPathParameters.prototype.transferLines + * @description 本换乘分段内可乘车的路线集合,通过交通换乘方案查询得到。 + */ + + this.transferLines = null; + /** + * @member {Array.|number>} TransferPathParameters.prototype.points + * @description 两种查询方式:
+ * 1. 按照公交站点的起止ID进行查询,则 points 参数的类型为 int[],形如:[起点ID、终点ID],公交站点的 ID 对应服务提供者配置中的站点 ID 字段; + * 2. 按照起止点的坐标进行查询,则 points 参数的类型为 Point2D[],形如:[{"x":44,"y":39},{"x":45,"y":40}]。 + */ + + this.points = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TransferPathParameters"; + } + /** + * @function TransferPathParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TransferPathParameters_createClass(TransferPathParameters, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function TransferPathParameters.toJson + * @description 将 {@link TransferPathParameters} 对象参数转换为 JSON 字符串。 + * @param {TransferPathParameters} params - 交通换乘参数。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJson", + value: function toJson(params) { + if (params) { + return Util.toJSON(params); + } + } + }]); + + return TransferPathParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TransferPathService.js +function TransferPathService_typeof(obj) { "@babel/helpers - typeof"; return TransferPathService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TransferPathService_typeof(obj); } + +function TransferPathService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransferPathService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransferPathService_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransferPathService_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransferPathService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TransferPathService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TransferPathService_get = Reflect.get; } else { TransferPathService_get = function _get(target, property, receiver) { var base = TransferPathService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TransferPathService_get.apply(this, arguments); } + +function TransferPathService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TransferPathService_getPrototypeOf(object); if (object === null) break; } return object; } + +function TransferPathService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TransferPathService_setPrototypeOf(subClass, superClass); } + +function TransferPathService_setPrototypeOf(o, p) { TransferPathService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TransferPathService_setPrototypeOf(o, p); } + +function TransferPathService_createSuper(Derived) { var hasNativeReflectConstruct = TransferPathService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TransferPathService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TransferPathService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TransferPathService_possibleConstructorReturn(this, result); }; } + +function TransferPathService_possibleConstructorReturn(self, call) { if (call && (TransferPathService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TransferPathService_assertThisInitialized(self); } + +function TransferPathService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TransferPathService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TransferPathService_getPrototypeOf(o) { TransferPathService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TransferPathService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TransferPathService + * @deprecatedclass SuperMap.TransferPathService + * @category iServer TrafficTransferAnalyst TransferPath + * @classdesc 交通换乘线路查询服务类,根据交通换乘分析结果(TransferSolutionResult),获取某一条乘车路线的详细信息。 + * 返回结果通过该类支持的事件的监听函数参数获取 + * @extends {CommonServiceBase} + * @example 例如: + * var myService = new TransferPathService(url, {eventListeners: { + * "processCompleted": TrafficTransferCompleted, + * "processFailed": TrafficTransferError + * } + * }; + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var TransferPathService = /*#__PURE__*/function (_CommonServiceBase) { + TransferPathService_inherits(TransferPathService, _CommonServiceBase); + + var _super = TransferPathService_createSuper(TransferPathService); + + function TransferPathService(url, options) { + var _this; + + TransferPathService_classCallCheck(this, TransferPathService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.TransferPathService"; + return _this; + } + /** + * @override + */ + + + TransferPathService_createClass(TransferPathService, [{ + key: "destroy", + value: function destroy() { + TransferPathService_get(TransferPathService_getPrototypeOf(TransferPathService.prototype), "destroy", this).call(this); + } + /** + * @function TransferPathService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {TransferPathParameters} params - 交通换乘参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof TransferPathParameters)) { + return; + } + + var me = this, + method = "GET", + jsonParameters; + me.url = Util.urlPathAppend(me.url, 'path'); + jsonParameters = { + points: Util.toJSON(params.points), + transferLines: Util.toJSON(params['transferLines']) + }; + me.request({ + method: method, + params: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return TransferPathService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/TransferSolutionParameters.js +function TransferSolutionParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransferSolutionParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransferSolutionParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransferSolutionParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransferSolutionParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TransferSolutionParameters + * @deprecatedclass SuperMap.TransferSolutionParameters + * @category iServer TrafficTransferAnalyst TransferSolutions + * @classdesc 交通换乘方案查询参数类。 + * @param {Object} options - 参数。 + * @param {Array.|number>} options.points - 两种查询方式:按照公交站点的起止ID进行查询和按照起止点的坐标进行查询。 + * @param {number} [options.solutionCount=6] - 乘车方案的数量。 + * @param {TransferTactic} [options.transferTactic=TransferTactic.LESS_TIME] - 交通换乘策略类型,包括时间最短、距离最短、最少换乘、最少步行四种选择。 + * @param {TransferPreference} [options.transferPreference=TransferPreference.NONE] - 乘车偏好枚举。 + * @param {number} [options.walkingRatio=10] - 步行与公交的消耗权重比。 + * @param {Array.} [options.evadeLines] - 避让路线的 ID。 + * @param {Array.} [options.evadeStops] - 避让站点的 ID。 + * @param {Array.} [options.priorLines] - 优先路线的 ID。 + * @param {Array.} [options.priorStops] - 优先站点的 ID。 + * @param {string} [options.travelTime] - 出行的时间。 + * @usage + */ + +var TransferSolutionParameters = /*#__PURE__*/function () { + function TransferSolutionParameters(options) { + TransferSolutionParameters_classCallCheck(this, TransferSolutionParameters); + + options = options || {}; + /** + * @member {number} [TransferSolutionParameters.prototype.solutionCount=6] + * @description 乘车方案的数量。 + */ + + this.solutionCount = 6; + /** + * @member {TransferPreference} [TransferSolutionParameters.prototype.transferPreference=TransferPreference.NONE] + * @description 乘车偏好枚举。 + */ + + this.transferPreference = TransferPreference.NONE; + /** + * @member {TransferTactic} [TransferSolutionParameters.prototype.transferTactic=TransferTactic|TransferTactic.LESS_TIME] + * @description 交通换乘策略类型,包括时间最短、距离最短、最少换乘、最少步行四种选择。 + */ + + this.transferTactic = TransferTactic.LESS_TIME; + /** + * @member {number} [TransferSolutionParameters.prototype.walkingRatio=10] + * @description 步行与公交的消耗权重比。此值越大,则步行因素对于方案选择的影响越大。例如:
+ * 例如现在有两种换乘方案(在仅考虑消耗因素的情况下):
+ * 方案1:坐车 10 公里,走路 1 公里;
+ * 方案2:坐车 15 公里,走路 0.5 公里;
+ * 1. 假设权重比为 15:
+ * •方案 1 的总消耗为:10 + 1*15 = 25
+ * •方案 2 的总消耗为:15 + 0.5*15 = 22.5
+ * 此时方案 2 消耗更低。
+ * 2. 假设权重比为2:
+ * •方案 1 的总消耗为:10+1*2 = 12
+ * •方案 2 的总消耗为:15+0.5*2 = 17
+ * 此时方案 1 消耗更低。
+ */ + + this.walkingRatio = null; + /** + * @member {Array.|number>} TransferSolutionParameters.prototype.points + * @description 两种查询方式:
+ * 1. 按照公交站点的起止 ID 进行查询,则 points 参数的类型为 int[],形如:[起点 ID、终点 ID],公交站点的 ID 对应服务提供者配置中的站点 ID 字段; + * 2. 按照起止点的坐标进行查询,则 points 参数的类型为 Point2D[],形如:[{"x":44,"y":39},{"x":45,"y":40}]。 + */ + + this.points = false; + /** + * @member {Array.} [TransferSolutionParameters.prototype.evadeLinesnull] + * @description 避让路线 ID。 + * */ + + this.evadeLines = null; + /** + * @member {Array.} [TransferSolutionParameters.prototype.evadeStops=TransferLine] + * @description 避让站点 ID。 + * */ + + this.evadeStops = null; + /** + * @member {Array.} [TransferSolutionParameters.prototype.priorLines] + * @description 优先路线 ID。 + * */ + + this.priorLines = null; + /** + * @member {Array.} [TransferSolutionParameters.prototype.priorStops] + * @description 优先站点 ID。 + * */ + + this.priorStops = null; + /** + * @member {string} TransferSolutionParameters.prototype.travelTime + * @description 出行的时间; 格式是:"小时:分钟",如:"08:30"。如果设置了该参数,在分析时,则会考虑线路的首末班车时间的限制,即在返回的结果中会提示公交的首末班发车时间。 + */ + + this.travelTime = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TransferSolutionParameters"; + } + /** + * @function TransferSolutionParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + TransferSolutionParameters_createClass(TransferSolutionParameters, [{ + key: "destroy", + value: function destroy() { + Util.reset(this); + } + /** + * @function TransferSolutionParameters.toJsonParameters + * @description 将 {@link TransferSolutionParameters} 对象参数转换为 JSON 字符串。 + * @param {TransferSolutionParameters} params - 交通换乘参数。 + * @returns {string} 转化后的 JSON 字符串。 + */ + + }], [{ + key: "toJson", + value: function toJson(params) { + if (params) { + return Util.toJSON(params); + } + } + }]); + + return TransferSolutionParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/TransferSolutionService.js +function TransferSolutionService_typeof(obj) { "@babel/helpers - typeof"; return TransferSolutionService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TransferSolutionService_typeof(obj); } + +function TransferSolutionService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TransferSolutionService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TransferSolutionService_createClass(Constructor, protoProps, staticProps) { if (protoProps) TransferSolutionService_defineProperties(Constructor.prototype, protoProps); if (staticProps) TransferSolutionService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function TransferSolutionService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { TransferSolutionService_get = Reflect.get; } else { TransferSolutionService_get = function _get(target, property, receiver) { var base = TransferSolutionService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return TransferSolutionService_get.apply(this, arguments); } + +function TransferSolutionService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = TransferSolutionService_getPrototypeOf(object); if (object === null) break; } return object; } + +function TransferSolutionService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) TransferSolutionService_setPrototypeOf(subClass, superClass); } + +function TransferSolutionService_setPrototypeOf(o, p) { TransferSolutionService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return TransferSolutionService_setPrototypeOf(o, p); } + +function TransferSolutionService_createSuper(Derived) { var hasNativeReflectConstruct = TransferSolutionService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = TransferSolutionService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = TransferSolutionService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return TransferSolutionService_possibleConstructorReturn(this, result); }; } + +function TransferSolutionService_possibleConstructorReturn(self, call) { if (call && (TransferSolutionService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return TransferSolutionService_assertThisInitialized(self); } + +function TransferSolutionService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function TransferSolutionService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function TransferSolutionService_getPrototypeOf(o) { TransferSolutionService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return TransferSolutionService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class TransferSolutionService + * @deprecatedclass SuperMap.TransferSolutionService + * @category iServer TrafficTransferAnalyst TransferSolutions + * @classdesc 交通换乘方案查询服务类。 + * 返回结果通过该类支持的事件的监听函数参数获取。 + * @param {string} url - 服务地址。 + * 例如:
"http://localhost:8090/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun"。 + * @param {Object} options - 参数。
+ * @param {Object} options.eventListeners - 需要被注册的监听器对象。
+ * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @example 例如: + * (start code) + * var myService = new TransferSolutionService(url, {eventListeners: { + * "processCompleted": trafficTransferCompleted, + * "processFailed": trafficTransferError + * } + * }; + * (end) + * @usage + */ + +var TransferSolutionService = /*#__PURE__*/function (_CommonServiceBase) { + TransferSolutionService_inherits(TransferSolutionService, _CommonServiceBase); + + var _super = TransferSolutionService_createSuper(TransferSolutionService); + + function TransferSolutionService(url, options) { + var _this; + + TransferSolutionService_classCallCheck(this, TransferSolutionService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.TransferSolutionService"; + return _this; + } + /** + * @override + */ + + + TransferSolutionService_createClass(TransferSolutionService, [{ + key: "destroy", + value: function destroy() { + TransferSolutionService_get(TransferSolutionService_getPrototypeOf(TransferSolutionService.prototype), "destroy", this).call(this); + } + /** + * @function TransferSolutionService.prototype.processAsync + * @description 负责将客户端的更新参数传递到服务端。 + * @param {TransferSolutionParameters} params - 交通换乘参数。 + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof TransferSolutionParameters)) { + return; + } + + var me = this, + method = "GET", + jsonParameters; + me.url = Util.urlPathAppend(me.url, 'solutions'); + jsonParameters = { + points: Util.toJSON(params.points), + walkingRatio: params['walkingRatio'], + transferTactic: params['transferTactic'], + solutionCount: params['solutionCount'], + transferPreference: params["transferPreference"] + }; + + if (params.evadeLines) { + jsonParameters["evadeLines"] = Util.toJSON(params.evadeLines); + } + + if (params.evadeStops) { + jsonParameters["evadeStops"] = Util.toJSON(params.evadeStops); + } + + if (params.priorLines) { + jsonParameters["priorLines"] = Util.toJSON(params.priorLines); + } + + if (params.priorStops) { + jsonParameters["priorStops"] = Util.toJSON(params.priorStops); + } + + if (params.travelTime) { + jsonParameters["travelTime"] = params.travelTime; + } + + me.request({ + method: method, + params: jsonParameters, + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return TransferSolutionService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/UpdateEdgeWeightParameters.js +function UpdateEdgeWeightParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UpdateEdgeWeightParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UpdateEdgeWeightParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) UpdateEdgeWeightParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) UpdateEdgeWeightParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class UpdateEdgeWeightParameters + * @deprecatedclass SuperMap.UpdateEdgeWeightParameters + * @category iServer NetworkAnalyst EdgeWeight + * @classdesc 边的耗费权重更新服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.edgeId - 所在边的 ID。 + * @param {string} options.fromNodeId - 起始转向点的 ID。 + * @param {string} options.toNodeId - 终止转向点的 ID。 + * @param {string} options.weightField - 边的耗费字段。 + * @param {string} options.edgeWeight - 耗费权重。 + * @usage + */ + +var UpdateEdgeWeightParameters = /*#__PURE__*/function () { + function UpdateEdgeWeightParameters(options) { + UpdateEdgeWeightParameters_classCallCheck(this, UpdateEdgeWeightParameters); + + if (!options) { + return; + } + /** + * @member {string} UpdateEdgeWeightParameters.prototype.edgeId + * @description 所在边的 ID。 + */ + + + this.edgeId = ""; + /** + * @member {string} UpdateEdgeWeightParameters.prototype.fromNodeId + * @description 起始转向点的 ID。 + */ + + this.fromNodeId = ""; + /** + * @member {string} UpdateEdgeWeightParameters.prototype.toNodeId + * @description 终止转向点的 ID。 + */ + + this.toNodeId = ""; + /** + * @member {string} UpdateEdgeWeightParameters.prototype.weightField + * @description 边的耗费字段。 + */ + + this.weightField = ""; + /** + * @member {string} UpdateEdgeWeightParameters.prototype.edgeWeight + * @description 耗费权重。 + */ + + this.edgeWeight = ""; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.UpdateEdgeWeightParameters"; + } + /** + * @function UpdateEdgeWeightParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + UpdateEdgeWeightParameters_createClass(UpdateEdgeWeightParameters, [{ + key: "destroy", + value: function destroy() { + this.edgeId = null; + this.fromNodeId = null; + this.toNodeId = null; + this.weightField = null; + this.edgeWeight = null; + } + }]); + + return UpdateEdgeWeightParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/CreateDatasetParameters.js +function CreateDatasetParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CreateDatasetParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CreateDatasetParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) CreateDatasetParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) CreateDatasetParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class CreateDatasetParameters + * @deprecatedclass SuperMap.CreateDatasetParameters + * @category iServer Data Dataset + * @classdesc 数据集创建参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称,此为必选参数。 + * @param {string} options.datasetName - 数据集名称,此为必选参数。 + * @param {string} options.datasetType - 数据集类型。目前支持创建的出聚集类型有:点、线、面、文本、复合(CAD)和属性数据集。 + * @usage + */ + +var CreateDatasetParameters = /*#__PURE__*/function () { + function CreateDatasetParameters(options) { + CreateDatasetParameters_classCallCheck(this, CreateDatasetParameters); + + if (!options) { + return; + } + /** + * @member {string} CreateDatasetParameters.prototype.datasourceName + * @description 数据源名称,此为必选参数。 + */ + + + this.datasourceName = null; + /** + * @member {string} CreateDatasetParameters.prototype.datasetName + * @description 数据集名称,此为必选参数。 + */ + + this.datasetName = null; + /** + * @member {string} CreateDatasetParameters.prototype.datasetType + * @description 数据集类型。目前支持创建的出聚集类型有:点、线、面、文本、复合(CAD)和属性数据集。 + */ + + this.datasetType = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.CreateDatasetParameters"; + } + /** + * @function CreateDatasetParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + CreateDatasetParameters_createClass(CreateDatasetParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasourceName = null; + me.datasetName = null; + me.datasetType = null; + } + }]); + + return CreateDatasetParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/UpdateEdgeWeightService.js +function UpdateEdgeWeightService_typeof(obj) { "@babel/helpers - typeof"; return UpdateEdgeWeightService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, UpdateEdgeWeightService_typeof(obj); } + +function UpdateEdgeWeightService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UpdateEdgeWeightService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UpdateEdgeWeightService_createClass(Constructor, protoProps, staticProps) { if (protoProps) UpdateEdgeWeightService_defineProperties(Constructor.prototype, protoProps); if (staticProps) UpdateEdgeWeightService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function UpdateEdgeWeightService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { UpdateEdgeWeightService_get = Reflect.get; } else { UpdateEdgeWeightService_get = function _get(target, property, receiver) { var base = UpdateEdgeWeightService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return UpdateEdgeWeightService_get.apply(this, arguments); } + +function UpdateEdgeWeightService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = UpdateEdgeWeightService_getPrototypeOf(object); if (object === null) break; } return object; } + +function UpdateEdgeWeightService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) UpdateEdgeWeightService_setPrototypeOf(subClass, superClass); } + +function UpdateEdgeWeightService_setPrototypeOf(o, p) { UpdateEdgeWeightService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return UpdateEdgeWeightService_setPrototypeOf(o, p); } + +function UpdateEdgeWeightService_createSuper(Derived) { var hasNativeReflectConstruct = UpdateEdgeWeightService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = UpdateEdgeWeightService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = UpdateEdgeWeightService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return UpdateEdgeWeightService_possibleConstructorReturn(this, result); }; } + +function UpdateEdgeWeightService_possibleConstructorReturn(self, call) { if (call && (UpdateEdgeWeightService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return UpdateEdgeWeightService_assertThisInitialized(self); } + +function UpdateEdgeWeightService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function UpdateEdgeWeightService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function UpdateEdgeWeightService_getPrototypeOf(o) { UpdateEdgeWeightService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return UpdateEdgeWeightService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UpdateEdgeWeightService + * @deprecatedclass SuperMap.UpdateEdgeWeightService + * @category iServer NetworkAnalyst EdgeWeight + * @classdesc 更新边的边的耗费权重服务 + * @extends {NetworkAnalystServiceBase} + * @example + *(start code) + * var updateEdgeWeightService = new UpdateEdgeWeightService(url, { + * eventListeners: { + * "processCompleted": UpdateEdgeWeightCompleted, + * "processFailed": UpdateEdgeWeightError + * } + * }); + * (end) + * @param {string} url - 服务地址。如:http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var UpdateEdgeWeightService = /*#__PURE__*/function (_NetworkAnalystServic) { + UpdateEdgeWeightService_inherits(UpdateEdgeWeightService, _NetworkAnalystServic); + + var _super = UpdateEdgeWeightService_createSuper(UpdateEdgeWeightService); + + function UpdateEdgeWeightService(url, options) { + var _this; + + UpdateEdgeWeightService_classCallCheck(this, UpdateEdgeWeightService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.UpdateEdgeWeightService"; + return _this; + } + /** + * @override + */ + + + UpdateEdgeWeightService_createClass(UpdateEdgeWeightService, [{ + key: "destroy", + value: function destroy() { + UpdateEdgeWeightService_get(UpdateEdgeWeightService_getPrototypeOf(UpdateEdgeWeightService.prototype), "destroy", this).call(this); + } + /** + * @function UpdateEdgeWeightService.prototype.processAsync + * @description 开始异步执行边的边的耗费权重的更新 + * @param {UpdateEdgeWeightParameters} params - 边的耗费权重更新服务参数类 + * @example + * (code) + * var updateEdgeWeightParam=new SuperMapUpdateEdgeWeightParameters({ + * edgeId:"20", + * fromNodeId:"26", + * toNodeId:"109", + * weightField:"time", + * edgeWeight:"25" + * }); + * updateEdgeWeightService.processAsync(updateEdgeWeightParam); + * (end) + */ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof UpdateEdgeWeightParameters)) { + return; + } + + var me = this; + var paramStr = me.parse(params); + me.url = Util.urlPathAppend(me.url, paramStr); + var data = params.edgeWeight ? params.edgeWeight : null; + me.request({ + method: "PUT", + scope: me, + data: data, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function UpdateEdgeWeightService.prototype.parse + * @description 将更新服务参数解析为用‘/’做分隔的字符串 + */ + + }, { + key: "parse", + value: function parse(params) { + if (!params) { + return; + } + + var paramStr = ""; + + for (var attr in params) { + if (params[attr] === "" || params[attr] === "edgeWeight") { + continue; + } + + switch (attr) { + case "edgeId": + paramStr += "/edgeweight/" + params[attr]; + break; + + case "fromNodeId": + paramStr += "/fromnode/" + params[attr]; + break; + + case "toNodeId": + paramStr += "/tonode/" + params[attr]; + break; + + case "weightField": + paramStr += "/weightfield/" + params[attr]; + break; + + default: + break; + } + } + + return paramStr; + } + }]); + + return UpdateEdgeWeightService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/UpdateTurnNodeWeightParameters.js +function UpdateTurnNodeWeightParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UpdateTurnNodeWeightParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UpdateTurnNodeWeightParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) UpdateTurnNodeWeightParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) UpdateTurnNodeWeightParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class UpdateTurnNodeWeightParameters + * @deprecatedclass SuperMap.UpdateTurnNodeWeightParameters + * @category iServer NetworkAnalyst TurnNodeWeight + * @classdesc 转向耗费权重更新服务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.nodeId - 转向结点的 ID。 + * @param {string} options.fromEdgeId - 起始边的 ID。 + * @param {string} options.toEdgeId - 终止边的 ID。 + * @param {string} options.weightField - 转向结点的耗费字段。 + * @param {string} options.turnNodeWeight - 耗费权重。 + * @usage + */ + +var UpdateTurnNodeWeightParameters = /*#__PURE__*/function () { + function UpdateTurnNodeWeightParameters(options) { + UpdateTurnNodeWeightParameters_classCallCheck(this, UpdateTurnNodeWeightParameters); + + if (!options) { + return; + } + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.nodeId + * @description 转向结点的 ID。 + */ + + + this.nodeId = ""; + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.fromEdgeId + * @description 起始边的 ID。 + */ + + this.fromEdgeId = ""; + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.toEdgeId + * @description 终止边的 ID。 + */ + + this.toEdgeId = ""; + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.weightField + * @description 转向结点的耗费字段。 + */ + + this.weightField = ""; + /** + * @member {string} UpdateTurnNodeWeightParameters.prototype.turnNodeWeight + * @description 耗费权重。 + */ + + this.turnNodeWeight = ""; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.UpdateTurnNodeWeightParameters"; + } + /** + * @function UpdateTurnNodeWeightParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + UpdateTurnNodeWeightParameters_createClass(UpdateTurnNodeWeightParameters, [{ + key: "destroy", + value: function destroy() { + this.nodeId = null; + this.fromEdgeId = null; + this.toEdgeId = null; + this.weightField = null; + this.turnNodeWeight = null; + } + }]); + + return UpdateTurnNodeWeightParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/UpdateTurnNodeWeightService.js +function UpdateTurnNodeWeightService_typeof(obj) { "@babel/helpers - typeof"; return UpdateTurnNodeWeightService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, UpdateTurnNodeWeightService_typeof(obj); } + +function UpdateTurnNodeWeightService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UpdateTurnNodeWeightService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UpdateTurnNodeWeightService_createClass(Constructor, protoProps, staticProps) { if (protoProps) UpdateTurnNodeWeightService_defineProperties(Constructor.prototype, protoProps); if (staticProps) UpdateTurnNodeWeightService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function UpdateTurnNodeWeightService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { UpdateTurnNodeWeightService_get = Reflect.get; } else { UpdateTurnNodeWeightService_get = function _get(target, property, receiver) { var base = UpdateTurnNodeWeightService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return UpdateTurnNodeWeightService_get.apply(this, arguments); } + +function UpdateTurnNodeWeightService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = UpdateTurnNodeWeightService_getPrototypeOf(object); if (object === null) break; } return object; } + +function UpdateTurnNodeWeightService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) UpdateTurnNodeWeightService_setPrototypeOf(subClass, superClass); } + +function UpdateTurnNodeWeightService_setPrototypeOf(o, p) { UpdateTurnNodeWeightService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return UpdateTurnNodeWeightService_setPrototypeOf(o, p); } + +function UpdateTurnNodeWeightService_createSuper(Derived) { var hasNativeReflectConstruct = UpdateTurnNodeWeightService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = UpdateTurnNodeWeightService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = UpdateTurnNodeWeightService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return UpdateTurnNodeWeightService_possibleConstructorReturn(this, result); }; } + +function UpdateTurnNodeWeightService_possibleConstructorReturn(self, call) { if (call && (UpdateTurnNodeWeightService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return UpdateTurnNodeWeightService_assertThisInitialized(self); } + +function UpdateTurnNodeWeightService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function UpdateTurnNodeWeightService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function UpdateTurnNodeWeightService_getPrototypeOf(o) { UpdateTurnNodeWeightService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return UpdateTurnNodeWeightService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UpdateTurnNodeWeightService + * @deprecatedclass SuperMap.UpdateTurnNodeWeightService + * @category iServer NetworkAnalyst TurnNodeWeight + * @classdesc 转向耗费权重更新服务类 + * @extends {NetworkAnalystServiceBase} + * @example + * var UpdateTurnNodeWeightService = new UpdateTurnNodeWeightService(url, { + * eventListeners: { + * "processCompleted": UpdateTurnNodeWeightCompleted, + * "processFailed": UpdateTurnNodeWeightError + * } + * }); + * @param {string} url - 服务地址。如: + * http://localhost:8090/iserver/services/transportationanalyst-sample/rest/networkanalyst/RoadNet@Changchun 。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 需要被注册的监听器对象。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var UpdateTurnNodeWeightService = /*#__PURE__*/function (_NetworkAnalystServic) { + UpdateTurnNodeWeightService_inherits(UpdateTurnNodeWeightService, _NetworkAnalystServic); + + var _super = UpdateTurnNodeWeightService_createSuper(UpdateTurnNodeWeightService); + + function UpdateTurnNodeWeightService(url, options) { + var _this; + + UpdateTurnNodeWeightService_classCallCheck(this, UpdateTurnNodeWeightService); + + _this = _super.call(this, url, options); + _this.CLASS_NAME = "SuperMap.UpdateTurnNodeWeightService"; + return _this; + } + /** + * @override + */ + + + UpdateTurnNodeWeightService_createClass(UpdateTurnNodeWeightService, [{ + key: "destroy", + value: function destroy() { + UpdateTurnNodeWeightService_get(UpdateTurnNodeWeightService_getPrototypeOf(UpdateTurnNodeWeightService.prototype), "destroy", this).call(this); + } + /** + * @function UpdateTurnNodeWeightService.prototype.processAsync + * @description 开始异步执行转向耗费权重的更新 + * @param {UpdateTurnNodeWeightParameters} params - 转向耗费权重更新服务参数类 + * @example + * (code) + * var updateTurnNodeWeightParam=new UpdateTurnNodeWeightParameters({ + * nodeId:"106", + * fromEdgeId:"6508", + * toEdgeId:"6504", + * weightField:"TurnCost", + * turnNodeWeight:"50" + * }); + * updateTurnNodeWeightService.processAsync(updateTurnNodeWeightParam); + * (end) + **/ + + }, { + key: "processAsync", + value: function processAsync(params) { + if (!(params instanceof UpdateTurnNodeWeightParameters)) { + return; + } + + var me = this; + var paramStr = me.parse(params); + me.url = Util.urlPathAppend(me.url, paramStr); + var data = params.turnNodeWeight ? params.turnNodeWeight : null; + me.request({ + method: "PUT", + scope: me, + data: data, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function UpdateTurnNodeWeightService.prototype.parse + * @description 将更新服务参数解析为用‘/’做分隔的字符串 + */ + + }, { + key: "parse", + value: function parse(params) { + if (!params) { + return; + } + + var paramStr = ""; + + for (var attr in params) { + if (params[attr] === "" || params[attr] === "turnNodeWeight") { + continue; + } + + switch (attr) { + case "nodeId": + paramStr += "/turnnodeweight/" + params[attr]; + break; + + case "fromEdgeId": + paramStr += "/fromedge/" + params[attr]; + break; + + case "toEdgeId": + paramStr += "/toedge/" + params[attr]; + break; + + case "weightField": + paramStr += "/weightfield/" + params[attr]; + break; + + default: + break; + } + } + + return paramStr; + } + }]); + + return UpdateTurnNodeWeightService; +}(NetworkAnalystServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/UpdateDatasetParameters.js +function UpdateDatasetParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function UpdateDatasetParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function UpdateDatasetParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) UpdateDatasetParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) UpdateDatasetParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class UpdateDatasetParameters + * @deprecatedclass SuperMap.UpdateDatasetParameters + * @category iServer Data Dataset + * @classdesc 数据集信息更改参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasourceName - 数据源名称。 + * @param {string} options.datasetName - 数据集名称。 + * @param {boolean} options.isFileCache - 是否使用文件形式的缓存。仅对数据库型数据源中的矢量数据集有效。 + * @param {string} options.description - 数据集描述信息。 + * @param {string} options.prjCoordSys - 投影坐标系。 + * @param {Object} options.charset - 矢量数据集的字符集。当数据集类型为矢量数据集时,可以传递此参数。如果用户传递空值,则编码方式保持不变。 + * @param {Array.} options.palette - 影像数据的颜色调色板。当数据集类型为影像数据集时,可以传递此参数。 + * @param {number} options.noValue - 栅格数据集中没有数据的像元的栅格值。当数据集类型为栅格数据集时,可以传递此参数。 + * @usage + */ + +var UpdateDatasetParameters = /*#__PURE__*/function () { + function UpdateDatasetParameters(options) { + UpdateDatasetParameters_classCallCheck(this, UpdateDatasetParameters); + + if (!options) { + return; + } + /** + * @member {string} UpdateDatasetParameters.prototype.datasourceName + * @description 数据源名称。 + */ + + + this.datasourceName = null; + /** + * @member {string} UpdateDatasetParameters.prototype.datasetName + * @description 数据集名称。 + */ + + this.datasetName = null; + /** + * @member {boolean} UpdateDatasetParameters.prototype.isFileCache + * @description 是否使用文件形式的缓存。仅对数据库型数据源中的矢量数据集有效。 + */ + + this.isFileCache = null; + /** + * @member {string} UpdateDatasetParameters.prototype.description + * @description 数据集描述信息。 + */ + + this.description = null; + /** + * @member {string} UpdateDatasetParameters.prototype.prjCoordSys + * @description 投影坐标系。 + */ + + this.prjCoordSys = null; + /** + * @member {Object} UpdateDatasetParameters.prototype.charset + * @description 矢量数据集的字符集。 + */ + + this.charset = null; + /** + * @member {Array.} UpdateDatasetParameters.prototype.palette + * @description 影像数据的颜色调色板。 + */ + + this.palette = null; + /** + * @member {number} UpdateDatasetParameters.prototype.noValue + * @description 栅格数据集中没有数据的像元的栅格值。 + */ + + this.noValue = null; + + if (options) { + Util.extend(this, options); + } + + this.CLASS_NAME = "SuperMap.UpdateDatasetParameters"; + } + /** + * @function UpdateDatasetParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + UpdateDatasetParameters_createClass(UpdateDatasetParameters, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.datasourceName = null; + me.datasetName = null; + me.isFileCache = null; + me.prjCoordSys = null; + me.charset = null; + me.palette = null; + me.noValue = null; + } + }]); + + return UpdateDatasetParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/VectorClipJobsParameter.js +function VectorClipJobsParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function VectorClipJobsParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function VectorClipJobsParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) VectorClipJobsParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) VectorClipJobsParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class VectorClipJobsParameter + * @deprecatedclass SuperMap.VectorClipJobsParameter + * @category iServer ProcessingService VectorClip + * @classdesc 矢量裁剪分析任务参数类。 + * @param {Object} options - 参数。 + * @param {string} options.datasetName - 数据集名。 + * @param {string} options.datasetOverlay - 裁剪对象数据集。 + * @param {ClipAnalystMode} [options.mode=ClipAnalystMode.CLIP] - 裁剪分析模式。 + * @param {OutputSetting} [options.output] - 输出参数设置。 + * @param {MappingParameters} [options.mappingParameters] - 分析后结果可视化的参数类。 + * @usage + */ + +var VectorClipJobsParameter = /*#__PURE__*/function () { + function VectorClipJobsParameter(options) { + VectorClipJobsParameter_classCallCheck(this, VectorClipJobsParameter); + + options = options || {}; + /** + * @member {string} VectorClipJobsParameter.prototype.datasetName + * @description 数据集名。 + */ + + this.datasetName = ""; + /** + * @member {string} VectorClipJobsParameter.prototype.datasetOverlay + * @description 裁剪对象数据集。 + */ + + this.datasetVectorClip = ""; + /** + * @member {string} VectorClipJobsParameter.prototype.geometryClip + * @description 裁剪几何对象。 + */ + + this.geometryClip = ""; + /** + * @member {ClipAnalystMode} [VectorClipJobsParameter.prototype.mode=ClipAnalystMode.CLIP] + * @description 裁剪分析模式 。 + */ + + this.mode = ClipAnalystMode.CLIP; + /** + * @member {OutputSetting} VectorClipJobsParameter.prototype.output + * @description 输出参数设置类。 + */ + + this.output = null; + /** + * @member {MappingParameters} [VectorClipJobsParameter.prototype.mappingParameters] + * @description 分析后结果可视化的参数类。 + */ + + this.mappingParameters = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.VectorClipJobsParameter"; + } + /** + * @function VectorClipJobsParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + VectorClipJobsParameter_createClass(VectorClipJobsParameter, [{ + key: "destroy", + value: function destroy() { + this.datasetName = null; + this.datasetVectorClip = null; + this.geometryClip = null; + this.mode = null; + + if (this.output instanceof OutputSetting) { + this.output.destroy(); + this.output = null; + } + + if (this.mappingParameters instanceof MappingParameters) { + this.mappingParameters.destroy(); + this.mappingParameters = null; + } + } + /** + * @function VectorClipJobsParameter.toObject + * @param {Object} vectorClipJobsParameter - 区域汇总分析服务参数。 + * @param {Object} tempObj - 目标对象。 + * @description 矢量裁剪分析任务对象。 + */ + + }], [{ + key: "toObject", + value: function toObject(vectorClipJobsParameter, tempObj) { + for (var name in vectorClipJobsParameter) { + if (name === "datasetName") { + tempObj['input'] = tempObj['input'] || {}; + tempObj['input'][name] = vectorClipJobsParameter[name]; + continue; + } + + if (name === "output") { + tempObj['output'] = tempObj['output'] || {}; + tempObj['output'] = vectorClipJobsParameter[name]; + continue; + } + + tempObj['analyst'] = tempObj['analyst'] || {}; + tempObj['analyst'][name] = vectorClipJobsParameter[name]; + + if (name === 'mappingParameters') { + tempObj['analyst'][name] = tempObj['analyst'][name] || {}; + tempObj['analyst']['mappingParameters'] = vectorClipJobsParameter[name]; + } + } + } + }]); + + return VectorClipJobsParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/VectorClipJobsService.js +function VectorClipJobsService_typeof(obj) { "@babel/helpers - typeof"; return VectorClipJobsService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, VectorClipJobsService_typeof(obj); } + +function VectorClipJobsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function VectorClipJobsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function VectorClipJobsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) VectorClipJobsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) VectorClipJobsService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function VectorClipJobsService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { VectorClipJobsService_get = Reflect.get; } else { VectorClipJobsService_get = function _get(target, property, receiver) { var base = VectorClipJobsService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return VectorClipJobsService_get.apply(this, arguments); } + +function VectorClipJobsService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = VectorClipJobsService_getPrototypeOf(object); if (object === null) break; } return object; } + +function VectorClipJobsService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) VectorClipJobsService_setPrototypeOf(subClass, superClass); } + +function VectorClipJobsService_setPrototypeOf(o, p) { VectorClipJobsService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return VectorClipJobsService_setPrototypeOf(o, p); } + +function VectorClipJobsService_createSuper(Derived) { var hasNativeReflectConstruct = VectorClipJobsService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = VectorClipJobsService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = VectorClipJobsService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return VectorClipJobsService_possibleConstructorReturn(this, result); }; } + +function VectorClipJobsService_possibleConstructorReturn(self, call) { if (call && (VectorClipJobsService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return VectorClipJobsService_assertThisInitialized(self); } + +function VectorClipJobsService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function VectorClipJobsService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function VectorClipJobsService_getPrototypeOf(o) { VectorClipJobsService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return VectorClipJobsService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class VectorClipJobsService + * @deprecatedclass SuperMap.VectorClipJobsService + * @category iServer ProcessingService VectorClip + * @classdesc 矢量裁剪分析服务类 + * @extends {ProcessingServiceBase} + * @param {string} url -服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var VectorClipJobsService = /*#__PURE__*/function (_ProcessingServiceBas) { + VectorClipJobsService_inherits(VectorClipJobsService, _ProcessingServiceBas); + + var _super = VectorClipJobsService_createSuper(VectorClipJobsService); + + function VectorClipJobsService(url, options) { + var _this; + + VectorClipJobsService_classCallCheck(this, VectorClipJobsService); + + _this = _super.call(this, url, options); + _this.url = Util.urlPathAppend(_this.url, 'spatialanalyst/vectorclip'); + _this.CLASS_NAME = 'SuperMap.VectorClipJobsService'; + return _this; + } + /** + *@override + */ + + + VectorClipJobsService_createClass(VectorClipJobsService, [{ + key: "destroy", + value: function destroy() { + VectorClipJobsService_get(VectorClipJobsService_getPrototypeOf(VectorClipJobsService.prototype), "destroy", this).call(this); + } + /** + * @function VectorClipJobsService.protitype.getVectorClipJobs + * @description 获取矢量裁剪分析所有任务 + */ + + }, { + key: "getVectorClipJobs", + value: function getVectorClipJobs() { + VectorClipJobsService_get(VectorClipJobsService_getPrototypeOf(VectorClipJobsService.prototype), "getJobs", this).call(this, this.url); + } + /** + * @function KernelDensityJobsService.protitype.getVectorClipJob + * @description 获取指定id的矢量裁剪分析服务 + * @param {string} id - 指定要获取数据的id + */ + + }, { + key: "getVectorClipJob", + value: function getVectorClipJob(id) { + VectorClipJobsService_get(VectorClipJobsService_getPrototypeOf(VectorClipJobsService.prototype), "getJobs", this).call(this, Util.urlPathAppend(this.url, id)); + } + /** + * @function VectorClipJobsService.protitype.addVectorClipJob + * @description 新建矢量裁剪分析服务 + * @param {VectorClipJobsParameter} params - 创建一个空间分析的请求参数。 + * @param {number} seconds - 开始创建后,获取创建成功结果的时间间隔。 + */ + + }, { + key: "addVectorClipJob", + value: function addVectorClipJob(params, seconds) { + VectorClipJobsService_get(VectorClipJobsService_getPrototypeOf(VectorClipJobsService.prototype), "addJob", this).call(this, this.url, params, VectorClipJobsParameter, seconds); + } + }]); + + return VectorClipJobsService; +}(ProcessingServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/RasterFunctionParameter.js +function RasterFunctionParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RasterFunctionParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RasterFunctionParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) RasterFunctionParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) RasterFunctionParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class RasterFunctionParameter + * @deprecatedclass SuperMap.RasterFunctionParameter + * @category iServer Map Tile + * @classdesc iServer 地图服务栅格分析参数基类 + * @param {Object} options - 参数。 + * @param {RasterFunctionType} options.type - 栅格分析方法。 + * @usage + */ + +var RasterFunctionParameter = /*#__PURE__*/function () { + function RasterFunctionParameter(options) { + RasterFunctionParameter_classCallCheck(this, RasterFunctionParameter); + + options = options || {}; + /** + * @member {RasterFunctionType} [RasterFunctionParameter.prototype.type] + * @description 栅格分析方法。 + */ + + this.type = null; + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.RasterFunctionParameter'; + } + /** + * @function RasterFunctionParameter.prototype.destroy + * @description 释放资源,将资源的属性置空。 + */ + + + RasterFunctionParameter_createClass(RasterFunctionParameter, [{ + key: "destroy", + value: function destroy() { + this.type = null; + } + }]); + + return RasterFunctionParameter; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/NDVIParameter.js +function NDVIParameter_typeof(obj) { "@babel/helpers - typeof"; return NDVIParameter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, NDVIParameter_typeof(obj); } + +function NDVIParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function NDVIParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function NDVIParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) NDVIParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) NDVIParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function NDVIParameter_get() { if (typeof Reflect !== "undefined" && Reflect.get) { NDVIParameter_get = Reflect.get; } else { NDVIParameter_get = function _get(target, property, receiver) { var base = NDVIParameter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return NDVIParameter_get.apply(this, arguments); } + +function NDVIParameter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = NDVIParameter_getPrototypeOf(object); if (object === null) break; } return object; } + +function NDVIParameter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) NDVIParameter_setPrototypeOf(subClass, superClass); } + +function NDVIParameter_setPrototypeOf(o, p) { NDVIParameter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return NDVIParameter_setPrototypeOf(o, p); } + +function NDVIParameter_createSuper(Derived) { var hasNativeReflectConstruct = NDVIParameter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = NDVIParameter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = NDVIParameter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return NDVIParameter_possibleConstructorReturn(this, result); }; } + +function NDVIParameter_possibleConstructorReturn(self, call) { if (call && (NDVIParameter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return NDVIParameter_assertThisInitialized(self); } + +function NDVIParameter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function NDVIParameter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function NDVIParameter_getPrototypeOf(o) { NDVIParameter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return NDVIParameter_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class NDVIParameter + * @deprecatedclass SuperMap.NDVIParameter + * @category iServer Map Tile + * @classdesc 归一化植被指数参数类 + * @param {Object} options - 参数。 + * @param {number} [options.redIndex=0] - 红光谱波段索引。 + * @param {number} [options.nirIndex=1] - 近红外光谱波段索引。 + * @param {string} [options.colorMap="0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff"] - 颜色表。由栅格的中断值和颜色停止之间的映射组成的,如0.3->d9f0a3ff 指的是[0,0.3)显示d9f0a3ff。仅单波段数据时设定。 + * @extends {RasterFunctionParameter} + * @usage + */ + +var NDVIParameter = /*#__PURE__*/function (_RasterFunctionParame) { + NDVIParameter_inherits(NDVIParameter, _RasterFunctionParame); + + var _super = NDVIParameter_createSuper(NDVIParameter); + + function NDVIParameter(options) { + var _this; + + NDVIParameter_classCallCheck(this, NDVIParameter); + + _this = _super.call(this, options); + /** + * @member {number} [NDVIParameter.prototype.redIndex=0] + * @description 红光谱波段索引。 + */ + + _this.redIndex = 0; + /** + * @member {number} [NDVIParameter.prototype.nirIndex=1] + * @description 近红外光谱波段索引。 + */ + + _this.nirIndex = 1; + /** + * @member {string} [NDVIParameter.prototype.colorMap="0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff"] + * @description 颜色表。由栅格的中断值和颜色停止之间的映射组成的,如0.3->d9f0a3ff 指的是[0,0.3)显示d9f0a3ff。仅单波段数据时设定。 + */ + + _this.colorMap = '0:ffffe5ff;0.1:f7fcb9ff;0.2:d9f0a3ff;0.3:addd8eff;0.4:78c679ff;0.5:41ab5dff;0.6:238443ff;0.7:006837ff;1:004529ff'; + /** + * @member {RasterFunctionType} [NDVIParameter.prototype.type] + * @description 栅格分析方法。 + */ + + _this.type = RasterFunctionType.NDVI; + Util.extend(NDVIParameter_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.NDVIParameter'; + return _this; + } + /** + * @function NDVIParameter.prototype.destroy + * @override + */ + + + NDVIParameter_createClass(NDVIParameter, [{ + key: "destroy", + value: function destroy() { + NDVIParameter_get(NDVIParameter_getPrototypeOf(NDVIParameter.prototype), "destroy", this).call(this); + + this.redIndex = null; + this.nirIndex = null; + this.colorMap = null; + } + /** + * @function NDVIParameter.prototype.toJSON + * @description 将 NDVIParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return { + redIndex: this.redIndex, + nirIndex: this.nirIndex, + colorMap: this.colorMap, + type: this.type + }; + } + }]); + + return NDVIParameter; +}(RasterFunctionParameter); +;// CONCATENATED MODULE: ./src/common/iServer/HillshadeParameter.js +function HillshadeParameter_typeof(obj) { "@babel/helpers - typeof"; return HillshadeParameter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, HillshadeParameter_typeof(obj); } + +function HillshadeParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function HillshadeParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function HillshadeParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) HillshadeParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) HillshadeParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function HillshadeParameter_get() { if (typeof Reflect !== "undefined" && Reflect.get) { HillshadeParameter_get = Reflect.get; } else { HillshadeParameter_get = function _get(target, property, receiver) { var base = HillshadeParameter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return HillshadeParameter_get.apply(this, arguments); } + +function HillshadeParameter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = HillshadeParameter_getPrototypeOf(object); if (object === null) break; } return object; } + +function HillshadeParameter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) HillshadeParameter_setPrototypeOf(subClass, superClass); } + +function HillshadeParameter_setPrototypeOf(o, p) { HillshadeParameter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HillshadeParameter_setPrototypeOf(o, p); } + +function HillshadeParameter_createSuper(Derived) { var hasNativeReflectConstruct = HillshadeParameter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = HillshadeParameter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = HillshadeParameter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return HillshadeParameter_possibleConstructorReturn(this, result); }; } + +function HillshadeParameter_possibleConstructorReturn(self, call) { if (call && (HillshadeParameter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return HillshadeParameter_assertThisInitialized(self); } + +function HillshadeParameter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function HillshadeParameter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function HillshadeParameter_getPrototypeOf(o) { HillshadeParameter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HillshadeParameter_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class HillshadeParameter + * @deprecatedclass SuperMap.HillshadeParameter + * @category iServer Map Tile + * @classdesc 阴影面分析参数类 + * @param {Object} options - 可选参数。 + * @param {number} [options.altitude=45] - 高于地平线的光源高度角。高度角由正度数表示,0 度代表地平线,而 90 度代表头顶正上方。 + * @param {number} [options.azimuth=315] - 光源的方位角。方位角由0到360度之间的正度数表示,以北为基准方向按顺时针进行测量。 + * @param {number} [options.zFactor=1] - 一个表面 z 单位中地面 x,y 单位的数量。z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + * z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + * 如果 x,y 单位和 z 单位采用相同的测量单位,则 z 因子为 1。这是默认设置。 + * 如果 x,y 单位和 z 单位采用不同的测量单位,则必须将 z 因子设置为适当的因子,否则会得到错误的结果。例如,如果 z 单位是英尺而 x,y 单位是米,则应使用 z 因子 0.3048 将 z 单位从英尺转换为米(1 英尺 = 0.3048 米)。 + * 如果输入栅格位于球面坐标系中(如十进制度球面坐标系),则生成的山体阴影可能看起来很独特。这是因为水平地面单位与高程 z 单位之间的测量值存在差异。由于经度的长度随着纬度而变化,因此需要为该纬度指定一个适当的 z 因子。如果 x,y 单位是十进制度而 Z 单位是米,特定纬度的一些合适的 Z 因子为: + * Latitude Z-factor + * 0 0.00000898 + * 10 0.00000912 + * 20 0.00000956 + * 30 0.00001036 + * 40 0.00001171 + * 50 0.00001395 + * 60 0.00001792 + * 70 0.00002619 + * 80 0.00005156 + * @extends {RasterFunctionParameter} + * @usage + */ + +var HillshadeParameter = /*#__PURE__*/function (_RasterFunctionParame) { + HillshadeParameter_inherits(HillshadeParameter, _RasterFunctionParame); + + var _super = HillshadeParameter_createSuper(HillshadeParameter); + + function HillshadeParameter(options) { + var _this; + + HillshadeParameter_classCallCheck(this, HillshadeParameter); + + _this = _super.call(this, options); + /** + * @member {number} [HillshadeParameter.prototype.altitude = 45] + * @description 高于地平线的光源高度角。高度角由正度数表示,0 度代表地平线,而 90 度代表头顶正上方。 + */ + + _this.altitude = 45; + /** + * @member {number} [HillshadeParameter.prototype.azimuth = 315] + * @description 光源的方位角。方位角由0到360度之间的正度数表示,以北为基准方向按顺时针进行测量。 + */ + + _this.azimuth = 315; + /** + * @member {number} [HillshadeParameter.prototype.zFactor = 1] + * @description 一个表面 z 单位中地面 x,y 单位的数量。z 单位与输入表面的 x,y 单位不同时,可使用 z 因子调整 z 单位的测量单位。计算最终输出表面时,将用 z 因子乘以输入表面的 z 值。 + */ + + _this.zFactor = 1; + /** + * @member {RasterFunctionType} HillshadeParameter.prototype.type + * @description 栅格分析方法。 + */ + + _this.type = RasterFunctionType.HILLSHADE; + Util.extend(HillshadeParameter_assertThisInitialized(_this), options); + _this.CLASS_NAME = 'SuperMap.HillshadeParameter'; + return _this; + } + /** + * @function HillshadeParameter.prototype.destroy + * @override + */ + + + HillshadeParameter_createClass(HillshadeParameter, [{ + key: "destroy", + value: function destroy() { + HillshadeParameter_get(HillshadeParameter_getPrototypeOf(HillshadeParameter.prototype), "destroy", this).call(this); + + this.altitude = null; + this.azimuth = null; + this.zFactor = null; + } + /** + * @function HillshadeParameter.prototype.toJSON + * @description 将 HillshadeParameter 对象转化为 JSON 字符串。 + * @returns {string} 返回转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + return { + altitude: this.altitude, + azimuth: this.azimuth, + zFactor: this.zFactor, + type: this.type + }; + } + }]); + + return HillshadeParameter; +}(RasterFunctionParameter); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobCustomItems.js +function WebPrintingJobCustomItems_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobCustomItems_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobCustomItems_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobCustomItems_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobCustomItems_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobCustomItems + * @deprecatedclass SuperMap.WebPrintingJobCustomItems + * @classdesc Web 打印图例元素参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.name - 图例元素的名称。 + * @param {string} option.picAsUrl - 图例元素 Base64 格式图片。 + * @param {string} [option.picAsBase64] - 图例元素图片的获取地址。如果已填了 url 参数,此参数可不传 + * @usage + */ + +var WebPrintingJobCustomItems = /*#__PURE__*/function () { + function WebPrintingJobCustomItems(option) { + WebPrintingJobCustomItems_classCallCheck(this, WebPrintingJobCustomItems); + + /** + * @member {string} WebPrintingJobCustomItems.prototype.name + * @description 图例元素的名称。 + */ + this.name = null; + /** + * @member {string} [WebPrintingJobCustomItems.prototype.picAsUrl] + * @description 图例元素 Base64 格式图片。 + */ + + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobCustomItems.prototype.picAsBase64] + * @description 图例元素图片的获取地址。 + */ + + this.picAsBase64 = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobCustomItems'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobCustomItems.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobCustomItems_createClass(WebPrintingJobCustomItems, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.name = null; + me.picAsUrl = null; + me.picAsBase64 = null; + } + /** + * @function WebPrintingJobCustomItems.prototype.toJSON + * @description 将 WebPrintingJobCustomItems 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + name: this.name + }; + + if (this.title) { + params.title = this.title; + } + + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobCustomItems; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobImage.js +function WebPrintingJobImage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobImage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobImage_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobImage_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobImage_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobImage + * @deprecatedclass SuperMap.WebPrintingJobImage + * @classdesc 表达小地图的静态图片参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.picAsUrl - 小地图的图片 url 地址。 + * @param {string} [option.picAsBase64] - 小地图的base64位图片信息。如果已填了 url 参数,此参数可不传 + * @usage + */ + +var WebPrintingJobImage = /*#__PURE__*/function () { + function WebPrintingJobImage(option) { + WebPrintingJobImage_classCallCheck(this, WebPrintingJobImage); + + /** + * @member {string} [WebPrintingJobImage.prototype.picAsUrl] + * @description 小地图的图片 url 地址。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobImage.prototype.picAsBase64] + * @description 小地图的base64位图片信息。 + */ + + this.picAsBase64 = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobImage'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobImage.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobImage_createClass(WebPrintingJobImage, [{ + key: "destroy", + value: function destroy() { + this.picAsUrl = null; + this.picAsBase64 = null; + } + /** + * @function WebPrintingJobImage.prototype.toJSON + * @description 将 WebPrintingJobImage 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = {}; + + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } + + if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobImage; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLayers.js +function WebPrintingJobLayers_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobLayers_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobLayers_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobLayers_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobLayers_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobLayers + * @deprecatedclass SuperMap.WebPrintingJobLayers + * @classdesc 将图例添加到布局的业务图层参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.name - 图层 name 的字符串。此 name 必须唯一,并且必须与定义业务图层的 LegendOptions_layers 元素中的图层 name 匹配。 + * @usage + */ + +var WebPrintingJobLayers = /*#__PURE__*/function () { + function WebPrintingJobLayers(option) { + WebPrintingJobLayers_classCallCheck(this, WebPrintingJobLayers); + + /** + * @member {string} WebPrintingJobLayers.prototype.name + * @description 图层 name。 + */ + this.name = null; + /** + * @member {string} WebPrintingJobLayers.prototype.layerType + * @description 图层 type。 + */ + + this.layerType = null; + /** + * @member {string} WebPrintingJobLayers.prototype.url + * @description 图层 url。 + */ + + this.url = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobLayers'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobLayers.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobLayers_createClass(WebPrintingJobLayers, [{ + key: "destroy", + value: function destroy() { + this.name = null; + this.layerType = null; + this.url = null; + } + }]); + + return WebPrintingJobLayers; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLegendOptions.js +function WebPrintingJobLegendOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobLegendOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobLegendOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobLegendOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobLegendOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class WebPrintingJobLegendOptions + * @deprecatedclass SuperMap.WebPrintingJobLegendOptions + * @classdesc Web 打印图例参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} [option.title] - 图例名称。 + * @param {string} [option.picAsUrl] - 图例的图片 url 地址。 + * @param {string} [option.picAsBase64] - 图例的 base64 位图片信息。 + * @param {WebPrintingJobLayers} [option.layers] - 图例的布局业务图层参数类。 + * @param {WebPrintingJobCustomItems} [option.customItems] - 自定义图例元素参数类。 + * @usage + */ + +var WebPrintingJobLegendOptions = /*#__PURE__*/function () { + function WebPrintingJobLegendOptions(option) { + WebPrintingJobLegendOptions_classCallCheck(this, WebPrintingJobLegendOptions); + + /** + * @member {string} WebPrintingJobLegendOptions.prototype.title + * @description 图例名称。 + */ + this.title = null; + /** + * @member {string} [WebPrintingJobLegendOptions.prototype.picAsUrl] + * @description 图例的图片 url 地址。 + */ + + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobLegendOptions.prototype.picAsBase64] + * @description 图例的 base64 位图片信息。 + */ + + this.picAsBase64 = null; + /** + * @member {WebPrintingJobLayers} [WebPrintingJobLegendOptions.prototype.layers] + * @description 图例的布局业务图层参数类。 + */ + + this.layers = null; + /** + * @member {WebPrintingJobCustomItems} [WebPrintingJobLegendOptions.prototype.customItems] + * @description 自定义图例元素参数类。 + */ + + this.customItems = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobLegendOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobLegendOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobLegendOptions_createClass(WebPrintingJobLegendOptions, [{ + key: "destroy", + value: function destroy() { + this.title = null; + this.picAsUrl = null; + this.picAsBase64 = null; + + if (this.layers instanceof WebPrintingJobLayers) { + this.layers.destroy(); + this.layers = null; + } + + if (this.customItems instanceof WebPrintingJobCustomItems) { + this.customItems.destroy(); + this.customItems = null; + } + } + /** + * @function WebPrintingJobLegendOptions.prototype.toJSON + * @description 将 WebPrintingJobLegendOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + title: this.title || "" + }; + + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } else if (this.customItems) { + params.customItems = this.customItems; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobLegendOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLittleMapOptions.js +function WebPrintingJobLittleMapOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobLittleMapOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobLittleMapOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobLittleMapOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobLittleMapOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class WebPrintingJobLittleMapOptions + * @deprecatedclass SuperMap.WebPrintingJobLittleMapOptions + * @classdesc Web 打印小地图参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} option.center - 小地图的中心点。 + * @param {number} [option.scale] - 小地图的比例尺。 + * @param {Array.} [option.layerNames] - 指定 WebMap中图层名称的列表,用于渲染小地图。 + * @param {WebPrintingJobImage} [option.image] - 表达小地图的静态图类。 + * @param {WebPrintingJobLayers} [option.layers] - 指定 WebMap 中的 layers 图层类。 + * @usage + */ + +var WebPrintingJobLittleMapOptions = /*#__PURE__*/function () { + function WebPrintingJobLittleMapOptions(option) { + WebPrintingJobLittleMapOptions_classCallCheck(this, WebPrintingJobLittleMapOptions); + + /** + * @member {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} WebPrintingJobLittleMapOptions.prototype.center + * @description 小地图的中心点。 + */ + this.center = null; + /** + * @member {number} [WebPrintingJobLittleMapOptions.prototype.scale] + * @description 小地图的比例尺。 + */ + + this.scale = null; + /** + * @member {Array.} WebPrintingJobLittleMapOptions.prototype.layerNames + * @description 指定 WebMap中图层名称的列表,用于渲染小地图。 + */ + + this.layerNames = null; + /** + * @member {WebPrintingJobImage} [WebPrintingJobLittleMapOptions.prototype.image] + * @description 表达小地图的静态图类。暂不支持 + */ + + this.image = null; + /** + * @member {WebPrintingJobLayers} [WebPrintingJobLittleMapOptions.prototype.layers] + * @description 指定 WebMap 中的 layers 图层类。 + */ + + this.layers = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobLittleMapOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobLittleMapOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobLittleMapOptions_createClass(WebPrintingJobLittleMapOptions, [{ + key: "destroy", + value: function destroy() { + this.center = null; + this.scale = null; + this.layerNames = null; + + if (this.image instanceof WebPrintingJobImage) { + this.image.destroy(); + this.image = null; + } + + if (this.layers instanceof WebPrintingJobLayers) { + this.layers.destroy(); + this.layers = null; + } + } + /** + * @function WebPrintingJobLittleMapOptions.prototype.toJSON + * @description 将 WebPrintingJobLittleMapOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + scale: this.scale, + center: this.center + }; + + if (this.layerNames) { + params.layerNames = this.layerNames; + } else if (this.layers) { + params.layers = this.layers; + } + + if (this.image) { + params.image = this.image; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobLittleMapOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobNorthArrowOptions.js +function WebPrintingJobNorthArrowOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobNorthArrowOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobNorthArrowOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobNorthArrowOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobNorthArrowOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobNorthArrowOptions + * @deprecatedclass SuperMap.WebPrintingJobNorthArrowOptions + * @classdesc Web 打印地图指北针参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.picAsUrl - 指北针的图片 url 地址。 + * @param {string} [option.picAsBase64] - 指北针的base64位图片信息。 + * @usage + */ + +var WebPrintingJobNorthArrowOptions = /*#__PURE__*/function () { + function WebPrintingJobNorthArrowOptions(option) { + WebPrintingJobNorthArrowOptions_classCallCheck(this, WebPrintingJobNorthArrowOptions); + + /** + * @member {string} WebPrintingJobNorthArrowOptions.prototype.picAsUrl + * @description 指北针的图片 url 地址。 + */ + this.picAsUrl = null; + /** + * @member {string} [WebPrintingJobNorthArrowOptions.prototype.picAsBase64] + * @description 指北针的base64位图片信息。 + */ + + this.picAsBase64 = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobNorthArrowOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobNorthArrowOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobNorthArrowOptions_createClass(WebPrintingJobNorthArrowOptions, [{ + key: "destroy", + value: function destroy() { + this.picAsUrl = null; + this.picAsBase64 = null; + } + /** + * @function WebPrintingJobNorthArrowOptions.prototype.toJSON + * @description 将 WebPrintingJobNorthArrowOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = {}; + + if (this.picAsUrl) { + params.picAsUrl = this.picAsUrl; + } else if (this.picAsBase64) { + params.picAsBase64 = this.picAsBase64.replace(/^data:.+;base64,/, ''); + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobNorthArrowOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobScaleBarOptions.js +function WebPrintingJobScaleBarOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobScaleBarOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobScaleBarOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobScaleBarOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobScaleBarOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobScaleBarOptions + * @deprecatedclass SuperMap.WebPrintingJobScaleBarOptions + * @classdesc Web 打印比例尺参数类。 + * @category iServer WebPrintingJob + * @version 10.1.0 + * @param {Object} option - 参数。 + * @param {string} [option.scaleText] - 比例尺文本信息。例如:1:1000000 + * @param {WebScaleOrientationType} [option.orientation] - 比例尺的方位样式。 + * @param {WebScaleType} [option.type] - 比例尺的样式。 + * @param {number} [option.intervals] - 比例尺条的段数。 + * @param {WebScaleUnit} [option.unit] - 比例尺的单位制。 + * @usage + */ + +var WebPrintingJobScaleBarOptions = /*#__PURE__*/function () { + function WebPrintingJobScaleBarOptions(option) { + WebPrintingJobScaleBarOptions_classCallCheck(this, WebPrintingJobScaleBarOptions); + + /** + * @member {string} WebPrintingJobScaleBarOptions.prototype.scaleText + * @description 比例尺文本信息。 + */ + this.scaleText = null; + /** + * @member {WebScaleOrientationType} [WebPrintingJobScaleBarOptions.prototype.orientation] + * @description 比例尺的方位样式。 + */ + + this.orientation = null; + /** + * @member {WebScaleType} [WebPrintingJobScaleBarOptions.prototype.type] + * @description 比例尺的样式。 + */ + + this.type = null; + /** + * @member {Object} [WebPrintingJobScaleBarOptions.prototype.intervals] + * @description 比例尺条的段数。 + */ + + this.intervals = null; + /** + * @member {WebScaleUnit} [WebPrintingJobScaleBarOptions.prototype.unit] + * @description 比例尺的单位制。 + */ + + this.unit = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobScaleBarOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobScaleBarOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobScaleBarOptions_createClass(WebPrintingJobScaleBarOptions, [{ + key: "destroy", + value: function destroy() { + this.scaleText = null; + this.orientation = null; + this.type = null; + this.intervals = null; + this.unit = null; + } + /** + * @function WebPrintingJobScaleBarOptions.prototype.toJSON + * @description 将 WebPrintingJobScaleBarOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + scaleText: this.scaleText || "", + type: this.type || "BAR", + intervals: this.intervals || "", + unit: this.unit || "METER" + }; + + if (this.orientation) { + params.orientation = this.orientation; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobScaleBarOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobContent.js +function WebPrintingJobContent_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobContent_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobContent_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobContent_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobContent_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobContent + * @deprecatedclass SuperMap.WebPrintingJobContent + * @classdesc Web 打印内容参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.type - Web 打印内容支持的类型。目前支持的类型:WEBMAP + * @param {string} [option.url] - 待打印的 SuperMap iPortal WebMap 的 url 地址。例如:http://supermapiportal:8190/iportal/web/maps/{mapid}/map.rjson + * @param {string} [option.token] - 如果待打印的是 SuperMap iPortal 用户私有的 WebMap,需要提供 SuperMap iPortal 用户的 token。 + * @param {WebMapSummaryObject} [option.value] - 传递的是一个符合 SuperMap WebMap 规范的 WebMap 的 JSON 表达,也可以是一个完整的 SuperMap iPortal 数据上图制作的 WebMap 的 json 表达。如果已填了 url 参数,此参数可不传 + * @usage + */ + +var WebPrintingJobContent = /*#__PURE__*/function () { + function WebPrintingJobContent(option) { + WebPrintingJobContent_classCallCheck(this, WebPrintingJobContent); + + /** + * @member {string} WebPrintingJobContent.prototype.type + * @description Web 打印内容支持的类型。 + */ + this.type = null; + /** + * @member {string} [WebPrintingJobContent.prototype.url] + * @description 待打印的 SuperMap iPortal WebMap 的 url 地址。 + */ + + this.url = null; + /** + * @member {string} [WebPrintingJobContent.prototype.token] + * @description 如果待打印的是 SuperMap iPortal 用户私有的 WebMap,需要提供 SuperMap iPortal 用户的 token。 + */ + + this.token = null; + /** + * @member {WebMapSummaryObject} [WebPrintingJobContent.prototype.value] + * @description 传递的是一个符合 SuperMap WebMap 规范的 WebMap 的 JSON 表达,也可以是一个完整的 SuperMap iPortal 数据上图制作的 WebMap 的 json 表达。 + */ + + this.value = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobContent'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobContent.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobContent_createClass(WebPrintingJobContent, [{ + key: "destroy", + value: function destroy() { + this.type = false || "WEBMAP"; + this.url = null; + this.token = null; + this.value = null; + } + /** + * @function WebPrintingJobContent.prototype.toJSON + * @description 将 WebPrintingJobContent 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + type: this.type + }; + + if (this.token) { + params.token = this.token; + } + + if (this.url) { + params.url = this.url; + } else if (this.value) { + params.value = this.value; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobContent; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobLayoutOptions.js +function WebPrintingJobLayoutOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobLayoutOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobLayoutOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobLayoutOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobLayoutOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class WebPrintingJobLayoutOptions + * @deprecatedclass SuperMap.WebPrintingJobLayoutOptions + * @classdesc Web 打印的布局参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {string} option.templateName - 布局模板的名称。 + * @param {string} option.title - 地图主标题名称。 + * @param {string} option.subTitle - 地图副标题名称。 + * @param {string} option.author - 作者名称。 + * @param {string} option.copyright - 版权信息。 + * @param {WebPrintingJobLittleMapOptions} option.littleMapOptions - 小地图参数类。 + * @param {WebPrintingJobLegendOptions} option.legendOptions - 图例参数类。 + * @param {WebPrintingJobScaleBarOptions} [option.scaleBarOptions] - 地图比例尺参数类。 + * @param {WebPrintingJobNorthArrowOptions} [option.northArrowOptions] - 地图指北针参数类。 + * @usage + */ + +var WebPrintingJobLayoutOptions = /*#__PURE__*/function () { + function WebPrintingJobLayoutOptions(option) { + WebPrintingJobLayoutOptions_classCallCheck(this, WebPrintingJobLayoutOptions); + + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.templateName + * @description 布局模板的名称。 + */ + this.templateName = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.title + * @description 地图主标题名称。 + */ + + this.title = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.subTitle + * @description 地图副标题名称。 + */ + + this.subTitle = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.author + * @description 地图作者名称。 + */ + + this.author = null; + /** + * @member {string} WebPrintingJobLayoutOptions.prototype.copyright + * @description 地图版权信息。 + */ + + this.copyright = null; + /** + * @member {WebPrintingJobScaleBarOptions} [WebPrintingJobLayoutOptions.prototype.scaleBarOptions] + * @description 地图比例尺参数类。 + */ + + this.scaleBarOptions = null; + /** + * @member {WebPrintingJobNorthArrowOptions} [WebPrintingJobLayoutOptions.prototype.northArrowOptions] + * @description 地图指北针参数类。 + */ + + this.northArrowOptions = null; + /** + * @member {WebPrintingJobLittleMapOptions} WebPrintingJobLayoutOptions.prototype.littleMapOptions + * @description 小地图参数类。 + */ + + this.littleMapOptions = null; + /** + * @member {WebPrintingJobLegendOptions} WebPrintingJobLayoutOptions.prototype.legendOptions + * @description 图例参数类。 + */ + + this.legendOptions = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobLayoutOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobLayoutOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobLayoutOptions_createClass(WebPrintingJobLayoutOptions, [{ + key: "destroy", + value: function destroy() { + this.templateName = null; + this.title = null; + this.subTitle = null; + this.author = null; + this.copyright = null; + + if (this.scaleBarOptions instanceof WebPrintingJobScaleBarOptions) { + this.scaleBarOptions.destroy(); + this.scaleBarOptions = null; + } + + if (this.northArrowOptions instanceof WebPrintingJobNorthArrowOptions) { + this.northArrowOptions.destroy(); + this.northArrowOptions = null; + } + + if (this.littleMapOptions instanceof WebPrintingJobLittleMapOptions) { + this.littleMapOptions.destroy(); + this.littleMapOptions = null; + } + + if (this.legendOptions instanceof WebPrintingJobLegendOptions) { + this.legendOptions.destroy(); + this.legendOptions = null; + } + } + /** + * @function WebPrintingJobLayoutOptions.prototype.toJSON + * @description 将 WebPrintingJobLayoutOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + templateName: this.templateName, + title: this.title, + subTitle: this.subTitle, + author: this.author, + copyright: this.copyright + }; + + if (this.scaleBarOptions) { + params.scaleBarOptions = this.scaleBarOptions; + } + + if (this.northArrowOptions) { + params.northArrowOptions = this.northArrowOptions; + } + + if (this.littleMapOptions) { + params.littleMapOptions = this.littleMapOptions; + } + + if (this.legendOptions) { + params.legendOptions = this.legendOptions; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobLayoutOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobExportOptions.js +function WebPrintingJobExportOptions_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobExportOptions_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobExportOptions_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobExportOptions_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobExportOptions_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class WebPrintingJobExportOptions + * @deprecatedclass SuperMap.WebPrintingJobExportOptions + * @classdesc Web 打印的输出参数类。 + * @version 10.1.0 + * @category iServer WebPrintingJob + * @param {Object} option - 参数。 + * @param {WebExportFormatType} option.format - Web 打印输出的格式,目前支持:PNG、PDF。 + * @param {number} [option.dpi=96] - Web 打印输出的分辨率,单位为每英寸点数。默认值为 96 dpi。 + * @param {number} [option.scale] - Web 打印输出的地图比例尺。 + * @param {number} [option.rotation] - Web 打印输出的地图角度。 + * @param {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} [option.center] - Web 打印输出的地图中心点。 + * @usage + */ + +var WebPrintingJobExportOptions = /*#__PURE__*/function () { + function WebPrintingJobExportOptions(option) { + WebPrintingJobExportOptions_classCallCheck(this, WebPrintingJobExportOptions); + + /** + * @member {WebExportFormatType} WebPrintingJobExportOptions.prototype.format + * @description Web 打印输出的格式。 + */ + this.format = null; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.dpi=96] + * @description Web 打印输出的分辨率,单位为每英寸点数。 + */ + + this.dpi = 96; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.scale] + * @description Web 打印输出的地图比例尺。 + */ + + this.scale = null; + /** + * @member {number} [WebPrintingJobExportOptions.prototype.rotation] + * @description Web 打印输出的地图角度。 + */ + + this.rotation = null; + /** + * @member {GeometryPoint|L.Point|L.LatLng|ol.geom.Point|mapboxgl.LngLat|mapboxgl.Point|Array.} [WebPrintingJobExportOptions.prototype.center] + * @description Web 打印输出的地图中心点。 + */ + + this.center = null; + this.CLASS_NAME = 'SuperMap.WebPrintingJobExportOptions'; + Util.extend(this, option); + } + /** + * @function WebPrintingJobExportOptions.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobExportOptions_createClass(WebPrintingJobExportOptions, [{ + key: "destroy", + value: function destroy() { + this.format = null; + this.dpi = null; + this.scale = null; + this.rotation = null; + this.center = null; + this.outputSize = null; + } + /** + * @function WebPrintingJobExportOptions.prototype.toJSON + * @description 将 WebPrintingJobExportOptions 对象转化为 JSON 字符串。 + * @returns {string} 转换后的 JSON 字符串。 + */ + + }, { + key: "toJSON", + value: function toJSON() { + var params = { + format: this.format || "PDF", + dpi: this.dpi, + scale: this.scale, + center: this.center + }; + + if (this.rotation) { + params.rotation = this.rotation; + } + + if (this.outputSize) { + params.outputSize = this.outputSize; + } + + return Util.toJSON(params); + } + }]); + + return WebPrintingJobExportOptions; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingJobParameters.js +function WebPrintingJobParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingJobParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingJobParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingJobParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingJobParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class WebPrintingJobParameters + * @deprecatedclass SuperMap.WebPrintingJobParameters + * @category iServer WebPrintingJob + * @version 10.1.0 + * @classdesc Web 打印参数类。 + * @param {Object} options - 参数。 + * @param {WebPrintingJobContent} options.content - Web 打印的内容类。 + * @param {WebPrintingJobLayoutOptions} options.layoutOptions - Web 打印的布局类,包含各种布局元素的设置。 + * @param {WebPrintingJobExportOptions} options.exportOptions - Web 打印的输出类,包含 DPI、页面大小等。 + * @usage + */ + +var WebPrintingJobParameters = /*#__PURE__*/function () { + function WebPrintingJobParameters(options) { + WebPrintingJobParameters_classCallCheck(this, WebPrintingJobParameters); + + if (!options) { + return; + } + /** + * @member {WebPrintingJobContent} WebPrintingJobParameters.prototype.content + * @description Web 打印的内容类。 + */ + + + this.content = null; + /** + * @member {WebPrintingJobLayoutOptions} WebPrintingJobParameters.prototype.layoutOptions + * @description Web 打印的布局类,包含各种布局元素的设置。 + */ + + this.layoutOptions = null; + /** + * @member {WebPrintingJobExportOptions} WebPrintingJobParameters.prototype.exportOptions + * @description Web 打印的输出类,包含 DPI、页面大小等。 + */ + + this.exportOptions = null; + Util.extend(this, options); + this.CLASS_NAME = 'SuperMap.WebPrintingJobParameters'; + } + /** + * @function WebPrintingJobParameters.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingJobParameters_createClass(WebPrintingJobParameters, [{ + key: "destroy", + value: function destroy() { + if (this.content instanceof WebPrintingJobContent) { + this.content.destroy(); + this.content = null; + } + + if (this.layoutOptions instanceof WebPrintingJobLayoutOptions) { + this.layoutOptions.destroy(); + this.layoutOptions = null; + } + + if (this.exportOptions instanceof WebPrintingJobExportOptions) { + this.exportOptions.destroy(); + this.exportOptions = null; + } + } + }]); + + return WebPrintingJobParameters; +}(); +;// CONCATENATED MODULE: ./src/common/iServer/WebPrintingService.js +function WebPrintingService_typeof(obj) { "@babel/helpers - typeof"; return WebPrintingService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, WebPrintingService_typeof(obj); } + +function WebPrintingService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function WebPrintingService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function WebPrintingService_createClass(Constructor, protoProps, staticProps) { if (protoProps) WebPrintingService_defineProperties(Constructor.prototype, protoProps); if (staticProps) WebPrintingService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function WebPrintingService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { WebPrintingService_get = Reflect.get; } else { WebPrintingService_get = function _get(target, property, receiver) { var base = WebPrintingService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return WebPrintingService_get.apply(this, arguments); } + +function WebPrintingService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = WebPrintingService_getPrototypeOf(object); if (object === null) break; } return object; } + +function WebPrintingService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) WebPrintingService_setPrototypeOf(subClass, superClass); } + +function WebPrintingService_setPrototypeOf(o, p) { WebPrintingService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return WebPrintingService_setPrototypeOf(o, p); } + +function WebPrintingService_createSuper(Derived) { var hasNativeReflectConstruct = WebPrintingService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = WebPrintingService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = WebPrintingService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return WebPrintingService_possibleConstructorReturn(this, result); }; } + +function WebPrintingService_possibleConstructorReturn(self, call) { if (call && (WebPrintingService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return WebPrintingService_assertThisInitialized(self); } + +function WebPrintingService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function WebPrintingService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function WebPrintingService_getPrototypeOf(o) { WebPrintingService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return WebPrintingService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WebPrintingService + * @deprecatedclass SuperMap.WebPrintingService + * @category iServer WebPrintingJob + * @version 10.1.0 + * @classdesc 打印地图服务基类。 + * @extends {CommonServiceBase} + * @param {string} url - 服务地址。请求打印地图服务的 URL 应为:http://{服务器地址}:{服务端口号}/iserver/services/webprinting/rest/webprinting/v1。 + * @param {Object} options - 参数。 + * @param {Object} options.eventListeners - 事件监听器对象。有processCompleted属性可传入处理完成后的回调函数。processFailed属性传入处理失败后的回调函数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var WebPrintingService = /*#__PURE__*/function (_CommonServiceBase) { + WebPrintingService_inherits(WebPrintingService, _CommonServiceBase); + + var _super = WebPrintingService_createSuper(WebPrintingService); + + function WebPrintingService(url, options) { + var _this; + + WebPrintingService_classCallCheck(this, WebPrintingService); + + _this = _super.call(this, url, options); + + if (options) { + Util.extend(WebPrintingService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = 'SuperMap.WebPrintingService'; + + if (!_this.url) { + return WebPrintingService_possibleConstructorReturn(_this); + } + + return _this; + } + /** + * @function WebPrintingService.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + WebPrintingService_createClass(WebPrintingService, [{ + key: "destroy", + value: function destroy() { + WebPrintingService_get(WebPrintingService_getPrototypeOf(WebPrintingService.prototype), "destroy", this).call(this); + } + /** + * @function WebPrintingService.prototype.createWebPrintingJob + * @description 创建 Web 打印任务。 + * @param {WebPrintingJobParameters} params - Web 打印的请求参数。 + */ + + }, { + key: "createWebPrintingJob", + value: function createWebPrintingJob(params) { + if (!params) { + return; + } + + if (params.layoutOptions) { + if (params.layoutOptions.legendOptions) { + !params.layoutOptions.legendOptions.title && (params.layoutOptions.legendOptions.title = ''); + params.layoutOptions.legendOptions.picAsBase64 = params.layoutOptions.legendOptions.picAsBase64 && params.layoutOptions.legendOptions.picAsBase64.replace(/^data:.+;base64,/, ''); + + if (params.layoutOptions.legendOptions.customItems && params.layoutOptions.legendOptions.customItems.hasOwnProperty('picAsBase64')) { + params.layoutOptions.legendOptions.customItems.picAsBase64 = params.layoutOptions.legendOptions.customItems.picAsBase64.replace(/^data:.+;base64,/, ''); + } + } + } + + var me = this; + me.request({ + url: me._processUrl('jobs'), + method: 'POST', + data: Util.toJSON(params), + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function WebPrintingService.prototype.getPrintingJob + * @description 获取 Web 打印输出文档任务。 + * @param {string} jobId - Web 打印任务 ID + */ + + }, { + key: "getPrintingJob", + value: function getPrintingJob(jobId) { + var me = this; + + var url = me._processUrl("jobs/".concat(jobId)); + + me.request({ + url: url, + method: 'GET', + scope: me, + success: function success(result) { + me.rollingProcess(result, url); + }, + failure: me.serviceProcessFailed + }); + } + /** + * @function WebPrintingService.prototype.getPrintingJobResult + * @description 获取 Web 打印任务的输出文档。 + * @param {string} jobId - Web 打印输入文档任务 ID。 + */ + + }, { + key: "getPrintingJobResult", + value: function getPrintingJobResult(jobId) { + var me = this; + me.request({ + url: me._processUrl("jobs/".concat(jobId, "/result")), + method: 'GET', + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function WebPrintingService.prototype.getLayoutTemplates + * @description 查询 Web 打印服务所有可用的模板信息。 + */ + + }, { + key: "getLayoutTemplates", + value: function getLayoutTemplates() { + var me = this; + me.request({ + url: me._processUrl('layouts'), + method: 'GET', + scope: me, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function WebPrintingService.prototype.rollingProcess + * @description 轮询查询 Web 打印任务。 + * @param {Object} result - 服务器返回的结果对象。 + */ + + }, { + key: "rollingProcess", + value: function rollingProcess(result, url) { + var me = this; + + if (!result) { + return; + } + + var id = setInterval(function () { + me.request({ + url: url, + method: 'GET', + scope: me, + success: function success(result) { + switch (result.status) { + case 'FINISHED': + clearInterval(id); + me.serviceProcessCompleted(result); + break; + + case 'ERROR': + clearInterval(id); + me.serviceProcessFailed(result); + break; + + case 'RUNNING': + me.events.triggerEvent('processRunning', result); + break; + } + }, + failure: me.serviceProcessFailed + }); + }, 1000); + } + }, { + key: "_processUrl", + value: function _processUrl(appendContent) { + if (appendContent) { + return Util.urlPathAppend(this.url, appendContent); + } + + return this.url; + } + }]); + + return WebPrintingService; +}(CommonServiceBase); +;// CONCATENATED MODULE: ./src/common/iServer/ImageCollectionService.js +function ImageCollectionService_typeof(obj) { "@babel/helpers - typeof"; return ImageCollectionService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ImageCollectionService_typeof(obj); } + +function ImageCollectionService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageCollectionService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageCollectionService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageCollectionService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageCollectionService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ImageCollectionService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ImageCollectionService_get = Reflect.get; } else { ImageCollectionService_get = function _get(target, property, receiver) { var base = ImageCollectionService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ImageCollectionService_get.apply(this, arguments); } + +function ImageCollectionService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ImageCollectionService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ImageCollectionService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ImageCollectionService_setPrototypeOf(subClass, superClass); } + +function ImageCollectionService_setPrototypeOf(o, p) { ImageCollectionService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ImageCollectionService_setPrototypeOf(o, p); } + +function ImageCollectionService_createSuper(Derived) { var hasNativeReflectConstruct = ImageCollectionService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ImageCollectionService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ImageCollectionService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ImageCollectionService_possibleConstructorReturn(this, result); }; } + +function ImageCollectionService_possibleConstructorReturn(self, call) { if (call && (ImageCollectionService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ImageCollectionService_assertThisInitialized(self); } + +function ImageCollectionService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ImageCollectionService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ImageCollectionService_getPrototypeOf(o) { ImageCollectionService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ImageCollectionService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageCollectionService + * @deprecatedclass SuperMap.ImageCollectionService + * @classdesc 影像集合服务类 + * @version 10.2.0 + * @category iServer Image + * @param {string} url - 服务地址。例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 参数。 + * @param {string} options.collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ + +var ImageCollectionService_ImageCollectionService = /*#__PURE__*/function (_CommonServiceBase) { + ImageCollectionService_inherits(ImageCollectionService, _CommonServiceBase); + + var _super = ImageCollectionService_createSuper(ImageCollectionService); + + function ImageCollectionService(url, options) { + var _this; + + ImageCollectionService_classCallCheck(this, ImageCollectionService); + + _this = _super.call(this, url, options); + _this.options = options || {}; + + if (options) { + Util.extend(ImageCollectionService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = 'SuperMap.ImageCollectionService'; + return _this; + } + /** + * @function ImageCollectionService.prototype.destroy + * @override + */ + + + ImageCollectionService_createClass(ImageCollectionService, [{ + key: "destroy", + value: function destroy() { + ImageCollectionService_get(ImageCollectionService_getPrototypeOf(ImageCollectionService.prototype), "destroy", this).call(this); + } + /** + * @function ImageCollectionService.prototype.getLegend + * @description 返回当前影像集合的图例信息。默认为服务发布所配置的风格,支持根据风格参数生成新的图例。 + * @param {Object} queryParams query参数 + * @param {ImageRenderingRule} [queryParams.renderingRule] renderingRule 对象,用来指定影像的渲染风格,从而确定图例内容。影像的渲染风格包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。该参数未设置时,将使用发布服务时所配置的风格。 + */ + + }, { + key: "getLegend", + value: function getLegend(queryParams) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/legend', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + params: queryParams, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageCollectionService.prototype.getStatistics + * @description 返回当前影像集合的统计信息。包括文件数量,文件大小等信息。 + */ + + }, { + key: "getStatistics", + value: function getStatistics() { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/statistics', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageCollectionService.prototype.getTileInfo + * @description 返回影像集合所提供的服务瓦片的信息,包括:每层瓦片的分辨率,比例尺等信息,方便前端进行图层叠加。 + */ + + }, { + key: "getTileInfo", + value: function getTileInfo() { + var me = this; + var pathParams = { + collectionId: me.options.collectionId + }; + var path = Util.convertPath('/collections/{collectionId}/tileInfo', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageCollectionService.prototype.deleteItemByID + * @description 删除影像集合中指定 ID 的 Item,即从影像集合中删除指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + */ + + }, { + key: "deleteItemByID", + value: function deleteItemByID(featureId) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId, + featureId: featureId + }; + var path = Util.convertPath('/collections/{collectionId}/items/{featureId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'DELETE', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageCollectionService.prototype.getItemByID + * @description 返回指定ID(`collectionId`)的影像集合中的指定ID(`featureId`)的Item对象,即返回影像集合中指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + */ + + }, { + key: "getItemByID", + value: function getItemByID(featureId) { + var me = this; + var pathParams = { + collectionId: me.options.collectionId, + featureId: featureId + }; + var path = Util.convertPath('/collections/{collectionId}/items/{featureId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return ImageCollectionService; +}(CommonServiceBase); + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageService.js +function ImageService_typeof(obj) { "@babel/helpers - typeof"; return ImageService_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ImageService_typeof(obj); } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function ImageService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageService_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ImageService_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ImageService_get = Reflect.get; } else { ImageService_get = function _get(target, property, receiver) { var base = ImageService_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ImageService_get.apply(this, arguments); } + +function ImageService_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ImageService_getPrototypeOf(object); if (object === null) break; } return object; } + +function ImageService_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ImageService_setPrototypeOf(subClass, superClass); } + +function ImageService_setPrototypeOf(o, p) { ImageService_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ImageService_setPrototypeOf(o, p); } + +function ImageService_createSuper(Derived) { var hasNativeReflectConstruct = ImageService_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ImageService_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ImageService_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ImageService_possibleConstructorReturn(this, result); }; } + +function ImageService_possibleConstructorReturn(self, call) { if (call && (ImageService_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ImageService_assertThisInitialized(self); } + +function ImageService_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ImageService_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ImageService_getPrototypeOf(o) { ImageService_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ImageService_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageService + * @deprecatedclass SuperMap.ImageService + * @classdesc 影像服务类 + * @version 10.2.0 + * @category iServer Image + * @param {string} url - 服务地址。例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {CommonServiceBase} + * @usage + */ + +var ImageService_ImageService = /*#__PURE__*/function (_CommonServiceBase) { + ImageService_inherits(ImageService, _CommonServiceBase); + + var _super = ImageService_createSuper(ImageService); + + function ImageService(url, options) { + var _this; + + ImageService_classCallCheck(this, ImageService); + + _this = _super.call(this, url, options); + _this.options = options || {}; + + if (options) { + Util.extend(ImageService_assertThisInitialized(_this), options); + } + + _this.CLASS_NAME = 'SuperMap.ImageService'; + return _this; + } + /** + * @function ImageService.prototype.destroy + * @override + */ + + + ImageService_createClass(ImageService, [{ + key: "destroy", + value: function destroy() { + ImageService_get(ImageService_getPrototypeOf(ImageService.prototype), "destroy", this).call(this); + } + /** + * @function ImageService.prototype.getCollections + * @description 返回当前影像服务中的影像集合列表(Collections)。 + */ + + }, { + key: "getCollections", + value: function getCollections() { + var me = this; + var path = Util.convertPath('/collections'); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageService.prototype.getCollectionByID + * @description ID值等于`collectionId`参数值的影像集合(Collection)。 ID值用于在服务中唯一标识该影像集合。 + * @param {string} collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + */ + + }, { + key: "getCollectionByID", + value: function getCollectionByID(collectionId) { + var pathParams = { + collectionId: collectionId + }; + var me = this; + var path = Util.convertPath('/collections/{collectionId}', pathParams); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'GET', + url: url, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + /** + * @function ImageSearchService.prototype.search + * @description 查询与过滤条件匹配的影像数据。 + * @param {ImageSearchParameter} [imageSearchParameter] 查询参数 + */ + + }, { + key: "search", + value: function search(imageSearchParameter) { + var postBody = _objectSpread({}, imageSearchParameter || {}); + + var me = this; + var path = Util.convertPath('/search'); + var url = Util.urlPathAppend(me.url, path); + this.request({ + method: 'POST', + url: url, + data: postBody, + scope: this, + success: me.serviceProcessCompleted, + failure: me.serviceProcessFailed + }); + } + }]); + + return ImageService; +}(CommonServiceBase); + + +;// CONCATENATED MODULE: ./src/common/iServer/FieldsFilter.js +function FieldsFilter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FieldsFilter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FieldsFilter_createClass(Constructor, protoProps, staticProps) { if (protoProps) FieldsFilter_defineProperties(Constructor.prototype, protoProps); if (staticProps) FieldsFilter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FieldsFilter + * @deprecatedclass SuperMap.FieldsFilter + * @category iServer Data Field + * @classdesc 指定返回的用于描述 Feature 的字段。 + * @param {Object} options - 可选参数。 + * @param {Array.} [options.include] 对返回的字段内容进行过滤,需保留的字段列表 + * @param {Array.} [options.exclude] 对返回的字段内容进行过滤,需排除的字段列表 + * @usage + */ + +var FieldsFilter = /*#__PURE__*/function () { + function FieldsFilter(options) { + FieldsFilter_classCallCheck(this, FieldsFilter); + + /** + * @description 对返回的字段内容进行过滤,需保留的字段列表 + * @member {Array.} FieldsFilter.prototype.include + */ + this.include = undefined; + /** + * @description 对返回的字段内容进行过滤,需排除的字段列表 + * @member {Array.} FieldsFilter.prototype.exclude + */ + + this.exclude = undefined; + this.CLASS_NAME = 'SuperMap.FieldsFilter'; + Util.extend(this, options); + } + /** + * @function FieldsFilter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + FieldsFilter_createClass(FieldsFilter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.include = undefined; + me.exclude = undefined; + } + /** + * @function FieldsFilter.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {FieldsFilter} obj 返回的模型. + * @return {FieldsFilter} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new FieldsFilter(); + + if (data.hasOwnProperty('include')) { + obj.include = data.include; + } + + if (data.hasOwnProperty('exclude')) { + obj.exclude = data.exclude; + } + } + + return obj; + } + }]); + + return FieldsFilter; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/Sortby.js +function Sortby_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Sortby_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Sortby_createClass(Constructor, protoProps, staticProps) { if (protoProps) Sortby_defineProperties(Constructor.prototype, protoProps); if (staticProps) Sortby_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Sortby + * @deprecatedclass SuperMap.Sortby + * @classdesc 通过指定字段进行排序的方法类。 + * @category BaseTypes Util + * @param {Object} options - 参数。 + * @param {string} options.field 属性名称。 + * @param {Sortby.Direction} options.direction 排序规则, 默认升序。 + * @usage + */ + +var Sortby = /*#__PURE__*/function () { + function Sortby(options) { + Sortby_classCallCheck(this, Sortby); + + /** + * @description 属性名称 + * @member {string} Sortby.prototype.field + */ + this.field = undefined; + /** + * @description 排序规则 + * @member {Sortby.Direction} Sortby.prototype.direction + * @default Sortby.Direction.ASC + */ + + this.direction = Sortby.Direction.ASC; + this.CLASS_NAME = 'SuperMap.Sortby'; + Util.extend(this, options); + } + /** + * @function Sortby.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + Sortby_createClass(Sortby, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.field = undefined; + me.direction = 'ASC'; + } + /** + * @function Sortby.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据。 + * @param {Sortby} obj 返回的模型。 + * @return {Sortby} 返回结果。 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new Sortby(); + + if (data.hasOwnProperty('field')) { + obj.field = data.field; + } + + if (data.hasOwnProperty('direction')) { + obj.direction = data.direction; + } + } + + return obj; + } + }]); + + return Sortby; +}(); +/** + * @enum Direction + * @description 排序的类型枚举。 + * @memberOf Sortby + * @readonly + * @type {string} + */ + + + +Sortby.Direction = { + ASC: 'ASC', + DESC: 'DESC' +}; +;// CONCATENATED MODULE: ./src/common/iServer/ImageSearchParameter.js +function ImageSearchParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageSearchParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageSearchParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageSearchParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageSearchParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ImageSearchParameter + * @deprecatedclass SuperMap.ImageSearchParameter + * @classdesc 影像服务查询参数类 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {Array.} [options.bbox] 指定查询范围。只有具有几何对象(geometry)属性的Features,并且该几何对象与该参数指定的范围相交的 Features 才会被选择出来。 该参数可以包含4个数值或者6个数值,这取决于使用的坐标参考系统是否包含高程值: * 左下角坐标轴 1 的值 * 左下角坐标轴 2 的值 * 坐标轴 3 的最小值(可选) * 右上角坐标轴 1 的值 * 右上角坐标轴 2 的值 * 坐标轴 3 的最大值(可选) 坐标参考系统为 WGS 84 经度/纬度 (http://www.opengis.net/def/crs/OGC/1.3/CRS84). 对于 “WGS 84 经度/纬度” 坐标参考系统, 该参数值的格式通常为:最小经度,最小纬度,最大经度,最大纬度。 如果包含了高程值,该参数的格式为:最小经度,最小纬度,最小高程值,最大经度,最大纬度,最大高程值。 如果一个 Feature 具有多个空间几何对象(geometry)属性, 由服务器决定是否使用单一的空间几何对象属性,还是使用所有相关的几何对象作为最终的查询空间范围。 + * @param {Array.} [options.collections] 影像集合的ID数组,将在该指定的Collection中搜索Items。 + * @param {Array.} [options.ids] 只返回指定 Item 的 ID 数组中的Item。返回的 Item 的 ID 值数组。 设置了该参数,所有其他过滤器参数(除了next和limit)将被忽略。 + * @param {number} [options.limit] 返回的最大结果数,即响应文档包含的 Item 的数目。 + * @param {FieldsFilter} [options.fields] 通过‘include’和‘exclude’属性分别指定哪些字段包含在查询结果的 Feature 描述中,哪些需要排除。返回结果中的stac_version,id,bbox,assets,links,geometry,type,properties这些字段为必须字段,若要返回结果中不含这种字段信息,需要显示地进行排除设置,如:排除geometry和bbox字段;在POST请求中,则需要将这些字段添加到“exclude”字段中,例如: "fields": { "exclude": ["geometry","bbox"] } } 。而对于返回的“properties”对象中的扩展字段内容,可以将字段前添加到‘include’字段中,如: "fields": { "include": ["properties.SmFileName","properties.SmHighPS"] } } ,表示properties.SmFileName和properties.SmHighPS 属性都包含在查询结果中。 + * @param {Object} [options.query] 定义查询哪些属性,查询运算符将应用于这些属性。运算符包括:eq、neq、gt、lt、gte、lte、startsWith、endsWith、 contains、in。 其中in是Array.类型 例如:{ "SmFileName": { "eq":"B49C001002.tif" }} + * @param {Array.} [options.sortby] 由包含属性名称和排序规则的对象构成的数组。 + * @usage + */ + +var ImageSearchParameter = /*#__PURE__*/function () { + function ImageSearchParameter(options) { + ImageSearchParameter_classCallCheck(this, ImageSearchParameter); + + /** + * @description 指定查询范围。只有具有几何对象(geometry)属性的Features,并且该几何对象与该参数指定的范围相交的 Features 才会被选择出来。 该参数可以包含4个数值或者6个数值,这取决于使用的坐标参考系统是否包含高程值: * 左下角坐标轴 1 的值 * 左下角坐标轴 2 的值 * 坐标轴 3 的最小值(可选) * 右上角坐标轴 1 的值 * 右上角坐标轴 2 的值 * 坐标轴 3 的最大值(可选) 坐标参考系统为 WGS 84 经度/纬度 (http://www.opengis.net/def/crs/OGC/1.3/CRS84). 对于 “WGS 84 经度/纬度” 坐标参考系统, 该参数值的格式通常为:最小经度,最小纬度,最大经度,最大纬度。 如果包含了高程值,该参数的格式为:最小经度,最小纬度,最小高程值,最大经度,最大纬度,最大高程值。 如果一个 Feature 具有多个空间几何对象(geometry)属性, 由服务器决定是否使用单一的空间几何对象属性,还是使用所有相关的几何对象作为最终的查询空间范围。 + * @member {Array.} ImageSearchParameter.prototype.bbox + */ + this.bbox = undefined; + /** + * @description 影像集合的ID数组,将在该指定的Collection中搜索Items。 + * @member {Array.} ImageSearchParameter.prototype.collections + */ + + this.collections = undefined; + /** + * @description 返回的 Item 的 ID 值数组。 设置了该参数,所有其他过滤器参数(除了next和limit)将被忽略。 + * @member {Array.} ImageSearchParameter.prototype.ids + */ + + this.ids = undefined; + /** + * @description 单页返回的最大结果数。 最小值为1最大值为10000 + * @member {number} ImageSearchParameter.prototype.limit + */ + + this.limit = undefined; + /** + * @description 通过‘include’和‘exclude’属性分别指定哪些字段包含在查询结果的 Feature 描述中,哪些需要排除。返回结果中的stac_version,id,bbox,assets,links,geometry,type,properties这些字段为必须字段,若要返回结果中不含这种字段信息,需要显示地进行排除设置,如:排除geometry和bbox字段;在POST请求中,则需要将这些字段添加到“exclude”字段中,例如: "fields": { "exclude": ["geometry","bbox"] } } 。而对于返回的“properties”对象中的扩展字段内容,可以将字段前添加到‘include’字段中,如: "fields": { "include": ["properties.SmFileName","properties.SmHighPS"] } } ,表示properties.SmFileName和properties.SmHighPS 属性都包含在查询结果中。 + * @member {FieldsFilter} ImageSearchParameter.prototype.fields + */ + + this.fields = undefined; + /** + * @description 定义查询哪些属性,查询运算符将应用于这些属性。 + * @member {Object} ImageSearchParameter.prototype.query + */ + + this.query = undefined; + /** + * @description 由包含属性名称和排序规则的对象构成的数组。 + * @member {Array.} ImageSearchParameter.prototype.sortby + */ + + this.sortby = undefined; + this.CLASS_NAME = 'SuperMap.ImageSearchParameter'; + Util.extend(this, options); + } + /** + * @function ImageSearchParameter.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageSearchParameter_createClass(ImageSearchParameter, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.bbox = undefined; + me.collections = undefined; + me.ids = undefined; + me.limit = undefined; + me.fields = undefined; + me.query = undefined; + me.sortby = undefined; + } + /** + * @function ImageSearchParameter.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageSearchParameter} obj 返回的模型. + * @return {ImageSearchParameter} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageSearchParameter(); + + if (data.hasOwnProperty('bbox')) { + obj.bbox = data.bbox; + } + + if (data.hasOwnProperty('collections')) { + obj.collections = data.collections; + } + + if (data.hasOwnProperty('ids')) { + obj.ids = data.ids; + } + + if (data.hasOwnProperty('limit')) { + obj.limit = data.limit; + } + + if (data.hasOwnProperty('fields')) { + obj.fields = FieldsFilter.constructFromObject && FieldsFilter.constructFromObject(data.fields, {}) || data.fields; + } + + if (data.hasOwnProperty('query')) { + obj.query = data.query; + } + + if (data.hasOwnProperty('sortby')) { + obj.sortby = data.sortby; + + if (data.sortby) { + obj.sortby = data.sortby.map(function (item) { + return Sortby.constructFromObject && Sortby.constructFromObject(item, {}) || item; + }); + } + } + } + + return obj; + } + }]); + + return ImageSearchParameter; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageStretchOption.js +function ImageStretchOption_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageStretchOption_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageStretchOption_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageStretchOption_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageStretchOption_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ImageStretchOption + * @deprecatedclass SuperMap.ImageStretchOption + * @classdesc 影像拉伸类。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {ImageStretchOption.StretchType} [options.stretchType] 影像拉伸类型。该属性的值有以下几种情况:NONE,无拉伸;GAUSSIAN,高斯拉伸;PERCENTCLIP,百分比截断拉伸;MINIMUMMAXIMUM,最值拉伸;STANDARDDEVIATION,标准差拉伸。 + * @param {number} [options.stdevCoefficient] 标准差系数。 + * @param {number} [options.gaussianCoefficient] 高斯系数。 + * @param {boolean} [options.useMedianValue] 高斯拉伸时,是否使用中间值,若该属性值为true,表示使用中间值;false,表示使用平均值。 + * @param {number} [options.minPercent] 使用百分比截断拉伸时,排除影像直方图最低值区域的像元,该参数值为这部分像元占总像元百分比。 + * @param {number} [options.maxPercent] 使用百分比截断拉伸时,排除影像直方图最高值区域的像元,该参数值为这部分像元占总像元百分比。 + * @usage + */ + +var ImageStretchOption = /*#__PURE__*/function () { + function ImageStretchOption(options) { + ImageStretchOption_classCallCheck(this, ImageStretchOption); + + /** + * @description 影像拉伸类型。该属性的值有以下几种情况:NONE,无拉伸;GAUSSIAN,高斯拉伸;PERCENTCLIP,百分比截断拉伸;MINIMUMMAXIMUM,最值拉伸;STANDARDDEVIATION,标准差拉伸。 + * @member {ImageStretchOption.StretchType} ImageStretchOption.prototype.stretchType + */ + this.stretchType = undefined; + /** + * @description 标准差系数。 + * @member {number} ImageStretchOption.prototype.stdevCoefficient + */ + + this.stdevCoefficient = undefined; + /** + * @description 高斯系数。 + * @member {number} ImageStretchOption.prototype.gaussianCoefficient + */ + + this.gaussianCoefficient = undefined; + /** + * @description 高斯拉伸时,是否使用中间值,若该属性值为true,表示使用中间值;false,表示使用平均值。 + * @member {boolean} ImageStretchOption.prototype.useMedianValue + */ + + this.useMedianValue = undefined; + /** + * @description 使用百分比截断拉伸时,排除影像直方图最低值区域的像元,该参数值为这部分像元占总像元百分比。 + * @member {number} ImageStretchOption.prototype.minPercent + */ + + this.minPercent = undefined; + /** + * @description 使用百分比截断拉伸时,排除影像直方图最高值区域的像元,该参数值为这部分像元占总像元百分比。 + * @member {number} ImageStretchOption.prototype.maxPercent + */ + + this.maxPercent = undefined; + this.CLASS_NAME = 'SuperMap.ImageStretchOption'; + Util.extend(this, options); + } + /** + * @function ImageStretchOption.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageStretchOption_createClass(ImageStretchOption, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.stretchType = undefined; + me.stdevCoefficient = undefined; + me.gaussianCoefficient = undefined; + me.useMedianValue = undefined; + me.minPercent = undefined; + me.maxPercent = undefined; + } + /** + * @function ImageStretchOption.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageStretchOption} obj 返回的模型. + * @return {ImageStretchOption} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageStretchOption(); + + if (data.hasOwnProperty('stretchType')) { + obj.stretchType = data.stretchType; + } + + if (data.hasOwnProperty('stdevCoefficient')) { + obj.stdevCoefficient = data.stdevCoefficient; + } + + if (data.hasOwnProperty('gaussianCoefficient')) { + obj.gaussianCoefficient = data.gaussianCoefficient; + } + + if (data.hasOwnProperty('useMedianValue')) { + obj.useMedianValue = data.useMedianValue; + } + + if (data.hasOwnProperty('minPercent')) { + obj.minPercent = data.minPercent; + } + + if (data.hasOwnProperty('maxPercent')) { + obj.maxPercent = data.maxPercent; + } + } + + return obj; + } + }]); + + return ImageStretchOption; +}(); +/** + * @enum StretchType + * @description 影像拉伸类型枚举。 + * @memberOf ImageStretchOption + * @readonly + * @type {string} + */ + + + +ImageStretchOption.StretchType = { + NONE: 'NONE', + GAUSSIAN: 'GAUSSIAN', + PERCENTCLIP: 'PERCENTCLIP', + MINIMUMMAXIMUM: 'MINIMUMMAXIMUM', + STANDARDDEVIATION: 'STANDARDDEVIATION' +}; +;// CONCATENATED MODULE: ./src/common/iServer/ImageRenderingRule.js +function ImageRenderingRule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageRenderingRule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageRenderingRule_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageRenderingRule_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageRenderingRule_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageRenderingRule + * @deprecatedclass SuperMap.ImageRenderingRule + * @classdesc 定义请求的影像如何进行渲染或者处理,如:影像的拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {ImageRenderingRule.DisplayMode} [options.displayMode] 影像显示模式,其中:Composite表示多波段组合显示;Stretched表示单波段拉伸显示。 + * @param {string} [options.displayBands] 影像显示的波段或者波段组合。若影像的显示模式为STRETCHED,该属性指定一个波段的索引号(波段索引号从0开始计数);若影像的显示模式为COMPOSITE,该属性为组合的波段索引号,例如:属性值3,2,1表示采用4波段、3波段、2波段分别对应 R、G、B颜色通道进行组合显示。 + * @param {ImageStretchOption} [options.stretchOption] 影像的拉伸参数。 + * @param {ImageRenderingRule.InterpolationMode} [options.interpolationMode] 影像显示时使用的插值算法。 + * @param {Array.} [options.colorScheme] 影像拉伸显示的颜色方案。颜色方案为RGBA颜色数组。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 例如:"255,0,0","0,255,0","0,0,255" 表示由红色、绿色、蓝色三种颜色构成的色带。 + * @param {Array.} [options.colorTable] 影像的颜色表。颜色表为栅格值与RGBA颜色值的对照表。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 以下示例表示该颜色对照表由三组构成,第一组高程值为500,对应的颜色为红色;第二组高程值为700,对应的颜色为绿色;第三组高程值为700,对应的颜色为蓝色。 示例:"500: 255,0,0", "700: 0,255,0" , "900: 0,0,255" + * @param {number} [options.brightness] 影像显示的亮度。数值范围为-100到100,增加亮度为正,降低亮度为负。 + * @param {number} [options.contrast] 影像显示的对比度。数值范围为-100到100,增加对比度为正,降低对比度为负。 + * @param {string} [options.noData] 影像的无值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的无值。 + * @param {string} [options.noDataColor] 影像的无值的显示颜色,支持RGB颜色,例如:255,0,0(红色),那么无值将以指定的红色显示。 + * @param {boolean} [options.noDataTransparent] 无值是否透明显示,true表示透明显示无值;否则为false。 + * @param {string} [options.backgroundValue] 影像的背景值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的背景值。 + * @param {string} [options.backgroundColor] 指定背景值的颜色。支持指定RGB颜色,例如:255,0,0(红色),那么背景值将以指定的红色显示。 + * @param {boolean} [options.backgroundTransparent] 背景值是否透明显示,true表示透明显示背景值;否则为false。 + * @param {Array.} [options.gridFunctions] 栅格函数链。 + * @usage + */ + +var ImageRenderingRule = /*#__PURE__*/function () { + function ImageRenderingRule(options) { + ImageRenderingRule_classCallCheck(this, ImageRenderingRule); + + /** + * @description 影像显示模式,其中:Composite表示多波段组合显示;Stretched表示单波段拉伸显示。 + * @member {ImageRenderingRule.DisplayMode} ImageRenderingRule.prototype.displayMode + */ + this.displayMode = undefined; + /** + * @description 影像显示的波段或者波段组合。该参数为一个数组,数组元素为波段索引号。若影像的显示模式为Stretched,该属性指定一个显示的波段;若影像的显示模式为Composite,该属性为组合的波段索引号,例如:属性值4,3,2表示采用4波段、3波段、2波段分别对应 R、G、B颜色通道进行组合显示。 + * @member {string} ImageRenderingRule.prototype.displayBands + */ + + this.displayBands = undefined; + /** + * @description 影像的拉伸参数。 + * @member {ImageStretchOption} ImageRenderingRule.prototype.stretchOption + */ + + this.stretchOption = undefined; + /** + * @description 影像显示时使用的插值算法。 + * @member {ImageRenderingRule.InterpolationMode} ImageRenderingRule.prototype.interpolationMode + */ + + this.interpolationMode = undefined; + /** + * @description 影像拉伸显示的颜色方案。颜色方案为RGBA颜色数组。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 例如:"255,0,0","0,255,0","0,0,255" 表示由红色、绿色、蓝色三种颜色构成的色带。 + * @member {Array.} ImageRenderingRule.prototype.colorScheme + */ + + this.colorScheme = undefined; + /** + * @description 影像的颜色表。颜色表为栅格值与RGBA颜色值的对照表。 RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。Alpha值可以省略不写,表示完全不透明。Alpha通道表示不透明度参数,若该值为0表示完全透明。 以下示例表示该颜色对照表由三组构成,第一组高程值为500,对应的颜色为红色;第二组高程值为700,对应的颜色为绿色;第三组高程值为700,对应的颜色为蓝色。 示例:"500: 255,0,0", "700: 0,255,0" , "900: 0,0,255" + * @member {Array.} ImageRenderingRule.prototype.colorTable + */ + + this.colorTable = undefined; + /** + * @description 影像显示的亮度。数值范围为-100到100,增加亮度为正,降低亮度为负。 + * @member {number} ImageRenderingRule.prototype.brightness + */ + + this.brightness = undefined; + /** + * @description 影像显示的对比度。数值范围为-100到100,增加对比度为正,降低对比度为负。 + * @member {number} ImageRenderingRule.prototype.contrast + */ + + this.contrast = undefined; + /** + * @description 影像的无值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的无值。 + * @member {string} ImageRenderingRule.prototype.noData + */ + + this.noData = undefined; + /** + * @description 影像的无值的显示颜色,支持RGB颜色,例如:255,0,0(红色),那么无值将以指定的红色显示。 + * @member {string} ImageRenderingRule.prototype.noDataColor + */ + + this.noDataColor = undefined; + /** + * @description 无值是否透明显示,true表示透明显示无值;否则为false。 + * @member {boolean} ImageRenderingRule.prototype.noDataTransparent + */ + + this.noDataTransparent = undefined; + /** + * @description 影像的背景值。影像为多波段时,通过逗号分隔 R,G,B 颜色通道对应波段的背景值。 + * @member {string} ImageRenderingRule.prototype.backgroundValue + */ + + this.backgroundValue = undefined; + /** + * @description 指定背景值的颜色。支持指定RGB颜色,例如:255,0,0(红色),那么背景值将以指定的红色显示。 + * @member {string} ImageRenderingRule.prototype.backgroundColor + */ + + this.backgroundColor = undefined; + /** + * @description 背景值是否透明显示,true表示透明显示背景值;否则为false。 + * @member {boolean} ImageRenderingRule.prototype.backgroundTransparent + */ + + this.backgroundTransparent = undefined; + /** + * @description 栅格函数选项,通过应用栅格函数,可以对影像进行快速显示处理。 + * @member {Array.} ImageRenderingRule.prototype.gridFunctions + */ + + this.gridFunctions = undefined; + this.CLASS_NAME = 'SuperMap.ImageRenderingRule'; + Util.extend(this, options); + } + /** + * @function ImageRenderingRule.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageRenderingRule_createClass(ImageRenderingRule, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.displayMode = undefined; + me.displayBands = undefined; + me.stretchOption = undefined; + me.interpolationMode = undefined; + me.colorScheme = undefined; + me.colorTable = undefined; + me.brightness = undefined; + me.contrast = undefined; + me.noData = undefined; + me.noDataColor = undefined; + me.noDataTransparent = undefined; + me.backgroundValue = undefined; + me.backgroundColor = undefined; + me.backgroundTransparent = undefined; + me.gridFuncOptions = undefined; + } + /** + * @function ImageRenderingRule.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageRenderingRule} obj 返回的模型. + * @return {ImageRenderingRule} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageRenderingRule(); + + if (data.hasOwnProperty('displayMode')) { + obj.displayMode = data.displayMode; + } + + if (data.hasOwnProperty('displayBands')) { + obj.displayBands = data.displayBands; + } + + if (data.hasOwnProperty('stretchOption')) { + obj.stretchOption = ImageStretchOption.constructFromObject && ImageStretchOption.constructFromObject(data.stretchOption, {}) || data.stretchOption; + } + + if (data.hasOwnProperty('interpolationMode')) { + obj.interpolationMode = data.interpolationMode; + } + + if (data.hasOwnProperty('colorScheme')) { + obj.colorScheme = data.colorScheme; + } + + if (data.hasOwnProperty('colorTable')) { + obj.colorTable = data.colorTable; + } + + if (data.hasOwnProperty('brightness')) { + obj.brightness = data.brightness; + } + + if (data.hasOwnProperty('contrast')) { + obj.contrast = data.contrast; + } + + if (data.hasOwnProperty('noData')) { + obj.noData = data.noData; + } + + if (data.hasOwnProperty('noDataColor')) { + obj.noDataColor = data.noDataColor; + } + + if (data.hasOwnProperty('backgroundValue')) { + obj.backgroundValue = data.backgroundValue; + } + + if (data.hasOwnProperty('noDataTransparent')) { + obj.noDataTransparent = data.noDataTransparent; + } + + if (data.hasOwnProperty('backgroundColor')) { + obj.backgroundColor = data.backgroundColor; + } + + if (data.hasOwnProperty('backgroundTransparent')) { + obj.backgroundTransparent = data.backgroundTransparent; + } + + if (data.hasOwnProperty('gridFunctions')) { + obj.gridFunctions = data.gridFunctions; + } + } + + return obj; + } + }]); + + return ImageRenderingRule; +}(); +/** + * @enum DisplayMode + * @description 影像显示模式。 + * @memberOf ImageRenderingRule + * @readonly + * @type {string} + */ + + + +ImageRenderingRule.DisplayMode = { + COMPOSITE: 'COMPOSITE', + STRETCHED: 'Stretched' +}; +/** + * @enum InterpolationMode + * @description 影像显示时使用的插值算法枚举。 + * @memberOf ImageRenderingRule + * @readonly + * @type {string} + */ + +ImageRenderingRule.InterpolationMode = { + NEARESTNEIGHBOR: 'NEARESTNEIGHBOR', + HIGHQUALITYBILINEAR: 'HIGHQUALITYBILINEAR', + DEFAULT: 'DEFAULT' +}; +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFHillShade.js +function ImageGFHillShade_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageGFHillShade_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageGFHillShade_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageGFHillShade_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageGFHillShade_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ImageGFHillShade + * @deprecatedclass SuperMap.ImageGFHillShade + * @classdesc 栅格函数对象:对DEM数据生成三维晕渲图。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFHillShade'] 栅格函数名称,参数值为:GFHillShade。 + * @param {number} [options.Azimuth = 315] 光源方位角。用于确定光源的方向,是从光源所在位置的正北方向线起,依顺时针方向到光源与目标方向线的夹角,范围为 0-360 度,以正北方向为 0 度,依顺时针方向递增。默认值为:315。 + * @param {number} [options.Altitude = 45] 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @param {number} [options.ZFactor = 1] 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @usage +*/ + +var ImageGFHillShade = /*#__PURE__*/function () { + function ImageGFHillShade(options) { + ImageGFHillShade_classCallCheck(this, ImageGFHillShade); + + /** + * @description 栅格函数名称,参数值为:GFHillShade。 + * @member {string} ImageGFHillShade.prototype.girdFuncName + * @default 'GFHillShade' + */ + this.girdFuncName = 'GFHillShade'; + /** + * @description 光源方位角。用于确定光源的方向,是从光源所在位置的正北方向线起,依顺时针方向到光源与目标方向线的夹角,范围为 0-360 度,以正北方向为 0 度,依顺时针方向递增。默认值为:315。 + * @member {number} ImageGFHillShade.prototype.Azimuth + */ + + this.Azimuth = 315; + /** + * @description 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @member {number} ImageGFHillShade.prototype.Altitude + */ + + this.Altitude = 45; + /** + * @description 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @member {number} ImageGFHillShade.prototype.ZFactor + */ + + this.ZFactor = 1; + this.CLASS_NAME = 'SuperMap.ImageGFHillShade'; + Util.extend(this, options); + } + /** + * @function ImageGFHillShade.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageGFHillShade_createClass(ImageGFHillShade, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.girdFuncName = 'GFHillShade'; + me.Azimuth = 315; + me.Altitude = 45; + me.ZFactor = 1; + } + /** + * @function ImageGFHillShade.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFHillShade} obj 返回的模型. + * @return {ImageGFHillShade} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFHillShade(); + + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName; + } + + if (data.hasOwnProperty('Azimuth')) { + obj.Azimuth = data.Azimuth; + } + + if (data.hasOwnProperty('Altitude')) { + obj.Altitude = data.Altitude; + } + + if (data.hasOwnProperty('ZFactor')) { + obj.ZFactor = data.ZFactor; + } + } + + return obj; + } + }]); + + return ImageGFHillShade; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFAspect.js +function ImageGFAspect_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageGFAspect_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageGFAspect_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageGFAspect_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageGFAspect_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ImageGFAspect + * @deprecatedclass SuperMap.ImageGFAspect + * @classdesc 栅格函数对象:对DEM数据生成坡向渲图。 + * @category iServer Image + * @param {Object} options -可选参数。 + * @param {string} [options.girdFuncName='GFAspect'] 栅格函数名称,参数值为:GFAspect。 + * @param {number} [options.Azimuth] 光源方位角,固定为360度。 + * @usage +*/ + +var ImageGFAspect = /*#__PURE__*/function () { + function ImageGFAspect(options) { + ImageGFAspect_classCallCheck(this, ImageGFAspect); + + /** + * @description 栅格函数名称,参数值为:GFAspect。 + * @member {string} ImageGFAspect.prototype.girdFuncName + * @default 'GFAspect' + */ + this.girdFuncName = 'GFAspect'; + /** + * @description 光源方位角,固定为360度。 + * @member {number} ImageGFAspect.prototype.Azimuth + */ + + this.Azimuth = undefined; + this.CLASS_NAME = 'SuperMap.ImageGFAspect'; + Util.extend(this, options); + } + /** + * @function ImageGFAspect.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageGFAspect_createClass(ImageGFAspect, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.girdFuncName = 'GFAspect'; + me.Azimuth = undefined; + } + /** + * @function ImageGFAspect.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFAspect} obj 返回的模型. + * @return {ImageGFAspect} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFAspect(); + + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName; + } + + if (data.hasOwnProperty('Azimuth')) { + obj.Azimuth = data.Azimuth; + } + } + + return obj; + } + }]); + + return ImageGFAspect; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFOrtho.js +function ImageGFOrtho_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageGFOrtho_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageGFOrtho_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageGFOrtho_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageGFOrtho_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ImageGFOrtho + * @deprecatedclass SuperMap.ImageGFOrtho + * @classdesc 栅格函数对象:对DEM数据生成三维晕渲图。该栅格函数不需要输入参数,采用系统默认设置。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFOrtho'] 栅格函数名称,参数值为:GFOrtho。 + * @usage +*/ + +var ImageGFOrtho = /*#__PURE__*/function () { + function ImageGFOrtho(options) { + ImageGFOrtho_classCallCheck(this, ImageGFOrtho); + + /** + * @description 栅格函数名称,参数值为:GFOrtho。 + * @member {string} ImageGFOrtho.prototype.girdFuncName + * @default 'GFOrtho' + */ + this.girdFuncName = 'GFOrtho'; + this.CLASS_NAME = 'SuperMap.ImageGFOrtho'; + Util.extend(this, options); + } + /** + * @function ImageGFOrtho.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageGFOrtho_createClass(ImageGFOrtho, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.girdFuncName = 'GFOrtho'; + } + /** + * @function ImageGFOrtho.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFOrtho} obj 返回的模型. + * @return {ImageGFOrtho} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFOrtho(); + + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName; + } + } + + return obj; + } + }]); + + return ImageGFOrtho; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/ImageGFSlope.js +function ImageGFSlope_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ImageGFSlope_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ImageGFSlope_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageGFSlope_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageGFSlope_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ImageGFSlope + * @deprecatedclass SuperMap.ImageGFSlope + * @classdesc 栅格函数对象:对DEM数据生成坡度图。 + * @category iServer Image + * @param {Object} options - 可选参数。 + * @param {string} [options.girdFuncName='GFSlope'] 栅格函数名称,参数值为:GFSlope。 + * @param {number} [options.Altitude = 45] 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @param {number} [options.ZFactor = 1] 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @usage +*/ + +var ImageGFSlope = /*#__PURE__*/function () { + function ImageGFSlope(options) { + ImageGFSlope_classCallCheck(this, ImageGFSlope); + + /** + * @description 栅格函数名称,参数值为:GFSlope。 + * @member {string} ImageGFSlope.prototype.girdFuncName + * @default 'GFSlope' + */ + this.girdFuncName = 'GFSlope'; + /** + * @description 光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。默认值为:45。 + * @member {number} ImageGFSlope.prototype.Altitude + */ + + this.Altitude = 45; + /** + * @description 高程缩放系数。如果设置为 1.0,表示不缩放。默认值为:1。 + * @member {number} ImageGFSlope.prototype.ZFactor + */ + + this.ZFactor = 1; + this.CLASS_NAME = 'SuperMap.ImageGFSlope'; + Util.extend(this, options); + } + /** + * @function ImageGFSlope.prototype.destroy + * @description 释放资源,将引用资源的属性置空。 + */ + + + ImageGFSlope_createClass(ImageGFSlope, [{ + key: "destroy", + value: function destroy() { + var me = this; + me.girdFuncName = 'GFSlope'; + me.Altitude = 45; + me.ZFactor = 1; + } + /** + * @function ImageGFSlope.prototype.constructFromObject + * @description 目标对象新增该类的可选参数。 + * @param {Object} data 要转换的数据. + * @param {ImageGFSlope} obj 返回的模型. + * @return {ImageGFSlope} 返回结果 + */ + + }], [{ + key: "constructFromObject", + value: function constructFromObject(data, obj) { + if (data) { + obj = obj || new ImageGFSlope(); + + if (data.hasOwnProperty('girdFuncName')) { + obj.girdFuncName = data.girdFuncName; + } + + if (data.hasOwnProperty('Altitude')) { + obj.Altitude = data.Altitude; + } + + if (data.hasOwnProperty('ZFactor')) { + obj.ZFactor = data.ZFactor; + } + } + + return obj; + } + }]); + + return ImageGFSlope; +}(); + + +;// CONCATENATED MODULE: ./src/common/iServer/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/online/OnlineResources.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @enum ServiceStatus + * @category BaseTypes Constant + * @description 服务发布状态。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ServiceStatus } from '{npm}'; + * + * const result = ServiceStatus.DOES_NOT_INVOLVE; + * ``` + */ +var ServiceStatus = { + /** 不涉及,不可发布。 */ + DOES_NOT_INVOLVE: "DOES_NOT_INVOLVE", + + /** 发布失败。 */ + PUBLISH_FAILED: "PUBLISH_FAILED", + + /** 已发布。 */ + PUBLISHED: "PUBLISHED", + + /** 正在发布。 */ + PUBLISHING: "PUBLISHING", + + /** 未发布。 */ + UNPUBLISHED: "UNPUBLISHED", + + /** 取消服务失败。 */ + UNPUBLISHED_FAILED: "UNPUBLISHED_FAILED" +}; +/** + * @enum DataItemOrderBy + * @category BaseTypes Constant + * @description 数据排序字段。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { DataItemOrderBy } from '{npm}'; + * + * const result = DataItemOrderBy.FILENAME; + * ``` + */ + +var DataItemOrderBy = { + /** FILENAME */ + FILENAME: "FILENAME", + + /** ID */ + ID: "ID", + + /** LASTMODIFIEDTIME */ + LASTMODIFIEDTIME: "LASTMODIFIEDTIME", + + /** NICKNAME */ + NICKNAME: "NICKNAME", + + /** SERVICESTATUS */ + SERVICESTATUS: "SERVICESTATUS", + + /** SIZE */ + SIZE: "SIZE", + + /** STATUS */ + STATUS: "STATUS", + + /** TYPE */ + TYPE: "TYPE", + + /** UPDATETIME */ + UPDATETIME: "UPDATETIME", + + /** USERNAME */ + USERNAME: "USERNAME" +}; +/** + * @enum FilterField {number} + * @category BaseTypes Constant + * @description 关键字查询时的过滤字段。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { FilterField } from '{npm}'; + * + * const result = FilterField.LINKPAGE; + * ``` + */ + +var FilterField = { + /** LINKPAGE */ + LINKPAGE: "LINKPAGE", + + /** MAPTITLE */ + MAPTITLE: "MAPTITLE", + + /** NICKNAME */ + NICKNAME: "NICKNAME", + + /** RESTITLE */ + RESTITLE: "RESTITLE", + + /** USERNAME */ + USERNAME: "USERNAME" +}; + +;// CONCATENATED MODULE: ./src/common/online/OnlineServiceBase.js +function OnlineServiceBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OnlineServiceBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OnlineServiceBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) OnlineServiceBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) OnlineServiceBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class OnlineServiceBase + * @deprecatedclass SuperMap.OnlineServiceBase + * @classdesc Online 服务基类(使用 key 作为权限限制的类需要实现此类)。 + * @category iPortal/Online Core + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var OnlineServiceBase = /*#__PURE__*/function () { + function OnlineServiceBase(options) { + OnlineServiceBase_classCallCheck(this, OnlineServiceBase); + + options = options || {}; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OnlineServiceBase"; + } + /** + * @function OnlineServiceBase.prototype.request + * @description 请求 online 服务 + * @param {string} [method='GET'] - 请求方式, 'GET', 'PUT', 'POST', 'DELETE'。 + * @param {string} url - 服务地址。 + * @param {Object} param - URL 查询参数。 + * @param {Object} [requestOptions] - http 请求参数, 比如请求头,超时时间等。 + * @returns {Promise} 包含请求结果的 Promise 对象。 + */ + + + OnlineServiceBase_createClass(OnlineServiceBase, [{ + key: "request", + value: function request(method, url, param) { + var requestOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + url = SecurityManager.appendCredential(url); + requestOptions['crossOrigin'] = this.options.crossOrigin; + requestOptions['headers'] = this.options.headers; + return FetchRequest.commit(method, url, param, requestOptions).then(function (response) { + return response.json(); + }); + } + }]); + + return OnlineServiceBase; +}(); +;// CONCATENATED MODULE: ./src/common/online/OnlineData.js +function OnlineData_typeof(obj) { "@babel/helpers - typeof"; return OnlineData_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, OnlineData_typeof(obj); } + +function OnlineData_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OnlineData_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OnlineData_createClass(Constructor, protoProps, staticProps) { if (protoProps) OnlineData_defineProperties(Constructor.prototype, protoProps); if (staticProps) OnlineData_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function OnlineData_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) OnlineData_setPrototypeOf(subClass, superClass); } + +function OnlineData_setPrototypeOf(o, p) { OnlineData_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return OnlineData_setPrototypeOf(o, p); } + +function OnlineData_createSuper(Derived) { var hasNativeReflectConstruct = OnlineData_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = OnlineData_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = OnlineData_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return OnlineData_possibleConstructorReturn(this, result); }; } + +function OnlineData_possibleConstructorReturn(self, call) { if (call && (OnlineData_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return OnlineData_assertThisInitialized(self); } + +function OnlineData_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function OnlineData_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function OnlineData_getPrototypeOf(o) { OnlineData_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return OnlineData_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class OnlineData + * @deprecatedclass SuperMap.OnlineData + * @classdesc Online myData 服务。 + * @category iPortal/Online Resources Data + * @param {string} serviceRootUrl - 服务地址。 + * @param {Object} options - 可选参数。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + * @extends OnlineServiceBase + */ + +var OnlineData = /*#__PURE__*/function (_OnlineServiceBase) { + OnlineData_inherits(OnlineData, _OnlineServiceBase); + + var _super = OnlineData_createSuper(OnlineData); + + //TODO 目前并没有对接服务支持的所有操作,日后需要补充完整 + function OnlineData(serviceRootUrl, options) { + var _this; + + OnlineData_classCallCheck(this, OnlineData); + + _this = _super.call(this, serviceRootUrl); + options = options || {}; //MD5 + + _this.MD5 = null; //文件类型。 + + _this.type = null; //数据上传者名称。 + + _this.userName = null; //文件名称。 + + _this.fileName = null; //文件大小,单位为 B 。 + + _this.size = null; //服务发布状态。 + + _this.serviceStatus = null; //服务 id 。 + + _this.serviceId = null; //数据项 id 。 + + _this.id = null; //最后修改时间。 + + _this.lastModfiedTime = null; //文件状态。 + + _this.status = null; //数据文件存储 id 。 + + _this.storageId = null; //数据的发布信息。 + + _this.publishInfo = null; //数据的权限信息。 + + _this.authorizeSetting = null; //用户的昵称。 + + _this.nickname = null; //数据的标签。 + + _this.tags = []; //数据的描述信息。 + + _this.description = null; //数据发布的服务信息集合。 + + _this.dataItemServices = null; //数据坐标类型。 + + _this.coordType = null; //数据审核信息 + + _this.dataCheckResult = null; //数据元数据信息 + + _this.dataMetaInfo = null; //数据的缩略图路径。 + + _this.thumbnail = null; + Util.extend(OnlineData_assertThisInitialized(_this), options); + + if (_this.id) { + _this.serviceUrl = serviceRootUrl + "/" + _this.id; + } + + _this.CLASS_NAME = "SuperMap.OnlineData"; + return _this; + } + /** + * @function OnlineData.prototype.load + * @description 通过 URL 请求获取该服务完整信息。 + * @returns {Promise} 不包含请求结果的 Promise 对象,请求返回结果自动填充到该类属性中。 + */ + + + OnlineData_createClass(OnlineData, [{ + key: "load", + value: function load() { + if (!this.serviceUrl) { + return; + } + + var me = this; + return me.request("GET", this.serviceUrl).then(function (result) { + Util.extend(me, result); + }); + } + /** + * @function OnlineData.prototype.getPublishedServices + * @description 获取数据发布的所有服务。 + * @returns {Object} 数据发布的所有服务。 + */ + + }, { + key: "getPublishedServices", + value: function getPublishedServices() { + return this.dataItemServices; + } + /** + * @function OnlineData.prototype.getAuthorizeSetting + * @description 获取数据的权限信息。 + * @returns {Object} 权限信息。 + */ + + }, { + key: "getAuthorizeSetting", + value: function getAuthorizeSetting() { + return this.authorizeSetting; + } + }]); + + return OnlineData; +}(OnlineServiceBase); +;// CONCATENATED MODULE: ./src/common/online/Online.js +function Online_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Online_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Online_createClass(Constructor, protoProps, staticProps) { if (protoProps) Online_defineProperties(Constructor.prototype, protoProps); if (staticProps) Online_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class Online + * @deprecatedclass SuperMap.Online + * @classdesc 对接 SuperMap Online 所有基础服务。 + * @category iPortal/Online Resources + * @example + * var online=new Online(); + * var services = online.queryDatas(param); + * service.then(function(services){ + * var service= services[0]; + * service.updateDataInfo(); + * }) + * @usage + */ + +var Online = /*#__PURE__*/function () { + //TODO 目前并没有对接Online的所有操作,需要补充完整 + //所有查询返回的是一个Promise,在外部使用的时候通过Promise的then方法获取异步结果 + function Online() { + Online_classCallCheck(this, Online); + + this.rootUrl = "https://www.supermapol.com"; + this.webUrl = this.rootUrl + "/web"; + var mContentUrl = this.webUrl + "/mycontent"; + this.mDatasUrl = mContentUrl + "/datas"; + this.CLASS_NAME = "SuperMap.Online"; + } + /** + * @function Online.prototype.load + * @description 加载 online,验证 online 是否可用。 + * @returns {Promise} 包含网络请求结果的 Promise 对象。 + */ + + + Online_createClass(Online, [{ + key: "load", + value: function load() { + return FetchRequest.get(this.rootUrl).then(function (response) { + return response; + }); + } + /** + * @function Online.prototype.login + * @description 登录Online + */ + + }, { + key: "login", + value: function login() { + SecurityManager.loginOnline(this.rootUrl, true); + } + /** + * @function Online.prototype.queryDatas + * @description 查询 Online “我的内容” 下 “我的数据” 服务(需要登录状态获取),并返回可操作的服务对象。 + * @param {OnlineQueryDatasParameter} parameter - myDatas 服务资源查询参数。 + * @returns {Promise} 包含所有数据服务信息的 Promise 对象。 + */ + + }, { + key: "queryDatas", + value: function queryDatas(parameter) { + var me = this, + url = me.mDatasUrl; + + if (parameter) { + parameter = parameter.toJSON(); + } + + return FetchRequest.get(url, parameter).then(function (json) { + if (!json || !json.content || json.content.length < 1) { + return; + } + + var services = [], + contents = json.content, + len = contents.length; + + for (var i = 0; i < len; i++) { + var content = contents[i]; + var service = new OnlineData(me.mDatasUrl, content); + services.push(service); + } + + return services; + }); + } + }]); + + return Online; +}(); +;// CONCATENATED MODULE: ./src/common/online/OnlineQueryDatasParameter.js +function OnlineQueryDatasParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function OnlineQueryDatasParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function OnlineQueryDatasParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) OnlineQueryDatasParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) OnlineQueryDatasParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class OnlineQueryDatasParameter + * @deprecatedclass SuperMap.OnlineQueryDatasParameter + * @classdesc myDatas 服务资源查询参数。 + * @category iPortal/Online Resources Data + * @param {Object} options - 参数。 + * @usage + */ + +var OnlineQueryDatasParameter = /*#__PURE__*/function () { + function OnlineQueryDatasParameter(options) { + OnlineQueryDatasParameter_classCallCheck(this, OnlineQueryDatasParameter); + + options = options || {}; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.userNames + * @description 数据作者名。可以根据数据作者名查询,默认查询全部。 + */ + + this.userNames = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.types + * @description 数据类型。 + */ + + this.types = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.fileName + * @description 文件名称。 + */ + + this.fileName = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.serviceStatuses + * @description 服务发布状态。 + */ + + this.serviceStatuses = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.serviceId + * @description 服务 ID。 + */ + + this.serviceId = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.ids + * @description 由数据项 ID 组成的整型数组。 + */ + + this.ids = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.keywords + * @description 关键字。 + */ + + this.keywords = null; + /** + * @member {string} OnlineQueryDatasParameter.prototype.orderBy + * @description 排序字段。 + */ + + this.orderBy = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.tags + * @description 数据的标签。 + */ + + this.tags = null; + /** + * @member {Array.} OnlineQueryDatasParameter.prototype.filterFields + * @description 用于关键字查询时的过滤字段。 + */ + + this.filterFields = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.OnlineQueryDatasParameter"; + } + /** + * @function OnlineQueryDatasParameter.prototype.toJSON + * @description 返回对应的 JSON 对象。 + * @returns {Object} 对应的 JSON 对象。 + */ + + + OnlineQueryDatasParameter_createClass(OnlineQueryDatasParameter, [{ + key: "toJSON", + value: function toJSON() { + var me = this; + var jsonObj = { + "types": me.types, + "fileName": me.fileName, + "serviceStatuses": me.serviceStatuses, + "serviceId": me.serviceId, + "ids": me.ids, + "keywords": me.keywords, + "orderBy": me.orderBy, + "tags": me.tags, + "filterFields": me.filterFields + }; + + for (var key in jsonObj) { + if (jsonObj[key] == null) { + delete jsonObj[key]; + } + } + + return jsonObj; + } + }]); + + return OnlineQueryDatasParameter; +}(); +;// CONCATENATED MODULE: ./src/common/online/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/security/KeyServiceParameter.js +function KeyServiceParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function KeyServiceParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function KeyServiceParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) KeyServiceParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) KeyServiceParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class KeyServiceParameter + * @deprecatedclass SuperMap.KeyServiceParameter + * @classdesc key申请参数 + * @category Security + * @param {Object} options - 参数。 + * @param {string} options.name - 申请服务名称。 + * @param {number} options.serviceIds - 服务 ID。 + * @param {ClientType} [options.clientType=ClientType.SERVER] - 服务端类型。 + * @param {number} options.limitation - 有效期 + * @usage + */ + +var KeyServiceParameter = /*#__PURE__*/function () { + function KeyServiceParameter(options) { + KeyServiceParameter_classCallCheck(this, KeyServiceParameter); + + this.name = null; + this.serviceIds = null; + this.clientType = ClientType.SERVER; + this.limitation = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.KeyServiceParameter"; + } + /** + * @function KeyServiceParameter.prototype.toJSON + * @description 转换成 JSON 对象 + * @returns {Object} 参数的 JSON 对象 + */ + + + KeyServiceParameter_createClass(KeyServiceParameter, [{ + key: "toJSON", + value: function toJSON() { + return { + name: this.name, + serviceIds: this.serviceIds, + clientType: this.clientType, + limitation: this.limitation + }; + } + }]); + + return KeyServiceParameter; +}(); +;// CONCATENATED MODULE: ./src/common/security/ServerInfo.js +function ServerInfo_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ServerInfo_createClass(Constructor, protoProps, staticProps) { if (protoProps) ServerInfo_defineProperties(Constructor.prototype, protoProps); if (staticProps) ServerInfo_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ServerInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ServerInfo + * @deprecatedclass SuperMap.ServerInfo + * @classdesc 服务器信息(安全相关),包含服务器类型,服务地址,token服务地址等 + * @category Security + * @param {string} type - 服务器类型 + * @param {Object} options - 参数。 + * @param {string} options.server - 服务器地址,如:http://supermapiserver:8090/iserver + * @param {string} [options.tokenServiceUrl] - 如:http://supermapiserver:8090/iserver/services/security/tokens.json + * @param {string} [options.keyServiceUrl] - 如:http://supermapiserver:8092/web/mycontent/keys/register.json + * @usage + */ + +var ServerInfo = /*#__PURE__*/ServerInfo_createClass(function ServerInfo(type, options) { + ServerInfo_classCallCheck(this, ServerInfo); + + /** + * @member {ServerType} ServerInfo.prototype.type + * @description 服务器类型 + */ + this.type = type; + /** + * @member {string} ServerInfo.prototype.server + * @description 服务器地址 + */ + + this.server = null; + /** + * @member {string} [ServerInfo.prototype.tokenServiceUrl] + * @description 如:http://supermapiserver:8090/iserver/services/security/tokens.json + */ + + this.tokenServiceUrl = null; + /** + * @member {string} [ServerInfo.prototype.keyServiceUrl] + * @description 如:http://supermapiserver:8092/web/mycontent/keys/register.json + */ + + this.keyServiceUrl = null; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.ServerInfo"; + this.type = this.type || ServerType.ISERVER; + + if (!this.server) { + console.error('server url require is not undefined'); + } // var patten = /http:\/\/([^\/]+)/i; + //this.server = this.server.match(patten)[0]; + + + var tokenServiceSuffix = "/services/security/tokens"; + + if (this.type === ServerType.ISERVER && this.server.indexOf("iserver") < 0) { + tokenServiceSuffix = "/iserver" + tokenServiceSuffix; + } + + if (!this.tokenServiceUrl) { + this.tokenServiceUrl = Util.urlPathAppend(this.server, tokenServiceSuffix); + } + + if (!this.keyServiceUrl) { + if (this.type === ServerType.IPORTAL) { + this.keyServiceUrl = Util.urlPathAppend(this.server, "/web/mycontent/keys/register"); + } else if (this.type === ServerType.ONLINE) { + this.keyServiceUrl = Util.urlPathAppend(this.server, "/web/mycontent/keys"); + } + } +}); +;// CONCATENATED MODULE: ./src/common/security/TokenServiceParameter.js +function TokenServiceParameter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TokenServiceParameter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TokenServiceParameter_createClass(Constructor, protoProps, staticProps) { if (protoProps) TokenServiceParameter_defineProperties(Constructor.prototype, protoProps); if (staticProps) TokenServiceParameter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class TokenServiceParameter + * @deprecatedclass SuperMap.TokenServiceParameter + * @classdesc token 申请参数。 + * @category Security + * @param {Object} options - 参数。 + * @param {string} options.username - 用户名。 + * @param {string} options.password - 密码。 + * @param {ClientType} [options.clientType='ClientType.NONE'] - token 申请的客户端标识类型。 + * @param {string} [options.ip] - clientType=IP 时,此为必选参数。 + * @param {string} [options.referer] -clientType=Referer 时,此为必选参数。如果按照指定 URL 的方式申请令牌,则设置相应的 URL。 + * @param {number} [options.expiration=60] - 申请令牌的有效期,从发布令牌的时间开始计算,单位为分钟。 + * @usage + * + */ + +var TokenServiceParameter = /*#__PURE__*/function () { + function TokenServiceParameter(options) { + TokenServiceParameter_classCallCheck(this, TokenServiceParameter); + + /** + * @member {string} TokenServiceParameter.prototype.userName + * @description 用户名。 + */ + this.userName = null; + /** + * @member {string} TokenServiceParameter.prototype.password + * @description 密码。 + */ + + this.password = null; + /** + * @member {ClientType} TokenServiceParameter.prototype.clientType + * @description token 申请的客户端标识类型。 + */ + + this.clientType = ClientType.NONE; + /** + * @member {string} [TokenServiceParameter.prototype.ip] + * @description clientType=IP 时,此为必选参数。 + */ + + this.ip = null; + /** + * @member {string} [TokenServiceParameter.prototype.referer] + * @description clientType=Referer 时,此为必选参数。如果按照指定 URL 的方式申请令牌,则设置相应的 URL。 + */ + + this.referer = null; + /** + * @member {number} TokenServiceParameter.prototype.expiration + * @description 申请令牌的有效期,从发布令牌的时间开始计算,单位为分钟。 + */ + + this.expiration = 60; + Util.extend(this, options); + this.CLASS_NAME = "SuperMap.TokenServiceParameter"; + } + /** + * @function TokenServiceParameter.prototype.toJSON + * @description 将所有信息转成 JSON 字符串 + * @returns {string} 参数的 JSON 字符串 + */ + + + TokenServiceParameter_createClass(TokenServiceParameter, [{ + key: "toJSON", + value: function toJSON() { + return { + userName: this.userName, + password: this.password, + clientType: this.clientType, + ip: this.ip, + referer: this.referer, + expiration: this.expiration + }; + } + }]); + + return TokenServiceParameter; +}(); +;// CONCATENATED MODULE: ./src/common/security/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +;// CONCATENATED MODULE: external "function(){try{return elasticsearch}catch(e){return {}}}()" +var external_function_try_return_elasticsearch_catch_e_return_namespaceObject = function(){try{return elasticsearch}catch(e){return {}}}(); +var external_function_try_return_elasticsearch_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_elasticsearch_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/thirdparty/elasticsearch/ElasticSearch.js +function ElasticSearch_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ElasticSearch_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ElasticSearch_createClass(Constructor, protoProps, staticProps) { if (protoProps) ElasticSearch_defineProperties(Constructor.prototype, protoProps); if (staticProps) ElasticSearch_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ElasticSearch + * @deprecatedclass SuperMap.ElasticSearch + * @classdesc ElasticSearch服务类。 + * @category ElasticSearch + * @param {string} url - ElasticSearch服务地址。 + * @param {Object} options - 参数。 + * @param {function} [options.change] - 服务器返回数据后执行的函数。废弃,不建议使用。使用search或msearch方法。 + * @param {boolean} [options.openGeoFence=false] - 是否开启地理围栏验证,默认为不开启。 + * @param {function} [options.outOfGeoFence] - 数据超出地理围栏后执行的函数。 + * @param {Object} [options.geoFence] - 地理围栏。 + * @usage + */ + +var ElasticSearch = /*#__PURE__*/function () { + function ElasticSearch(url, options) { + ElasticSearch_classCallCheck(this, ElasticSearch); + + options = options || {}; + /** + * @member {string} ElasticSearch.prototype.url + * @description ElasticSearch服务地址 + */ + + this.url = url; + /** + * @member {Object} ElasticSearch.prototype.client + * @description client ES客户端 + */ + + this.client = new (external_function_try_return_elasticsearch_catch_e_return_default()).Client({ + host: this.url + }); + /** + * @deprecated + * @member {function} [ElasticSearch.prototype.change] + * @description 服务器返回数据后执行的函数。废弃,不建议使用。使用search或msearch方法。 + */ + + this.change = null; + /** + * @member {boolean} [ElasticSearch.prototype.openGeoFence=false] + * @description 是否开启地理围栏验证,默认为不开启。 + */ + + this.openGeoFence = false; + /** + * @member {function} [ElasticSearch.prototype.outOfGeoFence] + * @description 数据超出地理围栏后执行的函数 + */ + + this.outOfGeoFence = null; + /** + * @member {Object} [ElasticSearch.prototype.geoFence] + * @description 地理围栏 + * @example { + * radius: 1000,//单位是m + * center: [104.40, 30.43], + * unit: 'meter|degree' + * } + */ + + this.geoFence = null; + /* + * Constant: EVENT_TYPES + * {Array.} + * 此类支持的事件类型。 + * + */ + + this.EVENT_TYPES = ['change', 'error', 'outOfGeoFence']; + /** + * @member {Events} ElasticSearch.prototype.events + * @description 事件 + */ + + this.events = new Events(this, null, this.EVENT_TYPES); + /** + * @member {Object} ElasticSearch.prototype.eventListeners + * @description 听器对象,在构造函数中设置此参数(可选),对 MapService 支持的两个事件 processCompleted 、processFailed 进行监听, + * 相当于调用 Events.on(eventListeners)。 + */ + + this.eventListeners = null; + Util.extend(this, options); + + if (this.eventListeners instanceof Object) { + this.events.on(this.eventListeners); + } + } + /** + * @function ElasticSearch.prototype.setGeoFence + * @description 设置地理围栏,openGeoFence参数为true的时候,设置的地理围栏才生效。 + * @param {Geometry} geoFence - 地理围栏。 + */ + + + ElasticSearch_createClass(ElasticSearch, [{ + key: "setGeoFence", + value: function setGeoFence(geoFence) { + this.geoFence = geoFence; + } + /** + * @function ElasticSearch.prototype.bulk + * @description 批量操作API,允许执行多个索引/删除操作。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-bulk}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "bulk", + value: function bulk(params, callback) { + return this.client.bulk(params, callback); + } + /** + * @function ElasticSearch.prototype.clearScroll + * @description 通过指定scroll参数进行查询来清除已经创建的scroll请求。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-clearscroll}
+ *更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "clearScroll", + value: function clearScroll(params, callback) { + return this.client.clearScroll(params, callback); + } + /** + * @function ElasticSearch.prototype.count + * @description 获取集群、索引、类型或查询的文档个数。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-count}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "count", + value: function count(params, callback) { + return this.client.count(params, callback); + } + /** + * @function ElasticSearch.prototype.create + * @description 在特定索引中添加一个类型化的JSON文档,使其可搜索。如果具有相同index,type且id已经存在的文档将发生错误。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-create} + * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html} + * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "create", + value: function create(params, callback) { + return this.client.create(params, callback); + } + /** + * @function ElasticSearch.prototype.delete + * @description 根据其ID从特定索引中删除键入的JSON文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-delete}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "delete", + value: function _delete(params, callback) { + return this.client["delete"](params, callback); + } + /** + * @function ElasticSearch.prototype.deleteByQuery + * @description 根据其ID从特定索引中删除键入的JSON文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletebyquery}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "deleteByQuery", + value: function deleteByQuery(params, callback) { + return this.client.deleteByQuery(params, callback); + } + /** + * @function ElasticSearch.prototype.deleteScript + * @description 根据其ID删除脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletescript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "deleteScript", + value: function deleteScript(params, callback) { + return this.client.deleteScript(params, callback); + } + /** + * @function ElasticSearch.prototype.deleteTemplate + * @description 根据其ID删除模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-deletetemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "deleteTemplate", + value: function deleteTemplate(params, callback) { + return this.client.deleteTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.exists + * @description 检查给定文档是否存在。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-exists}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "exists", + value: function exists(params, callback) { + return this.client.exists(params, callback); + } + /** + * @function ElasticSearch.prototype.existsSource + * @description 检查资源是否存在。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-existssource}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "existsSource", + value: function existsSource(params, callback) { + return this.client.existsSource(params, callback); + } + /** + * @function ElasticSearch.prototype.explain + * @description 提供与特定查询相关的特定文档分数的详细信息。它还会告诉您文档是否与指定的查询匹配。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-explain}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "explain", + value: function explain(params, callback) { + return this.client.explain(params, callback); + } + /** + * @function ElasticSearch.prototype.fieldCaps + * @description 允许检索多个索引之间的字段的功能。(实验性API,可能会在未来版本中删除)
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-fieldcaps}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-field-caps.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "fieldCaps", + value: function fieldCaps(params, callback) { + return this.client.fieldCaps(params, callback); + } + /** + * @function ElasticSearch.prototype.get + * @description 从索引获取一个基于其id的类型的JSON文档。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-get}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "get", + value: function get(params, callback) { + return this.client.get(params, callback); + } + /** + * @function ElasticSearch.prototype.getScript + * @description 获取脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-getscript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "getScript", + value: function getScript(params, callback) { + return this.client.getScript(params, callback); + } + /** + * @function ElasticSearch.prototype.getSource + * @description 通过索引,类型和ID获取文档的源。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-getsource}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "getSource", + value: function getSource(params, callback) { + return this.client.getSource(params, callback); + } + /** + * @function ElasticSearch.prototype.getTemplate + * @description 获取模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-gettemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "getTemplate", + value: function getTemplate(params, callback) { + return this.client.getTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.index + * @description 在索引中存储一个键入的JSON文档,使其可搜索。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-index}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "index", + value: function index(params, callback) { + return this.client.index(params, callback); + } + /** + * @function ElasticSearch.prototype.info + * @description 从当前集群获取基本信息。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-info}
+ * 更多信息参考 {@link https://www.elastic.co/guide/index.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "info", + value: function info(params, callback) { + return this.client.info(params, callback); + } + /** + * @function ElasticSearch.prototype.mget + * @description 根据索引,类型(可选)和ids来获取多个文档。mget所需的主体可以采用两种形式:文档位置数组或文档ID数组。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-mget}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "mget", + value: function mget(params, callback) { + return this.client.mget(params, callback); + } + /** + * @function ElasticSearch.prototype.msearch + * @description 在同一请求中执行多个搜索请求。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-msearch}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 请求返回的回调函数。也可以使用then表达式获取返回结果。 + * 回调参数:error,response。结果存储在response.responses中 + */ + + }, { + key: "msearch", + value: function msearch(params, callback) { + var me = this; + return me.client.msearch(params).then(function (resp) { + me._update(resp.responses, callback); + + return resp; + }, function (err) { + callback(err); + me.events.triggerEvent('error', { + error: err + }); + return err; + }); + } + /** + * @function ElasticSearch.prototype.msearchTemplate + * @description 在同一请求中执行多个搜索模板请求。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-msearchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "msearchTemplate", + value: function msearchTemplate(params, callback) { + return this.client.msearchTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.mtermvectors + * @description 多termvectors API允许一次获得多个termvectors。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-mtermvectors}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-termvectors.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "mtermvectors", + value: function mtermvectors(params, callback) { + return this.client.mtermvectors(params, callback); + } + /** + * @function ElasticSearch.prototype.ping + * @description 测试连接。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-ping}
+ * 更多信息参考 {@link https://www.elastic.co/guide/index.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "ping", + value: function ping(params, callback) { + return this.client.ping(params, callback); + } + /** + * @function ElasticSearch.prototype.putScript + * @description 添加脚本。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-putscript}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "putScript", + value: function putScript(params, callback) { + return this.client.putScript(params, callback); + } + /** + * @function ElasticSearch.prototype.putTemplate + * @description 添加模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-puttemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "putTemplate", + value: function putTemplate(params, callback) { + return this.client.putTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.reindex + * @description 重新索引。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-reindex}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "reindex", + value: function reindex(params, callback) { + return this.client.reindex(params, callback); + } + /** + * @function ElasticSearch.prototype.reindexRessrottle + * @description 重新索引。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-reindexrethrottle}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "reindexRessrottle", + value: function reindexRessrottle(params, callback) { + return this.client.reindexRessrottle(params, callback); + } + /** + * @function ElasticSearch.prototype.renderSearchTemplate + * @description 搜索模板。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-rendersearchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "renderSearchTemplate", + value: function renderSearchTemplate(params, callback) { + return this.client.renderSearchTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.scroll + * @description 在search()调用中指定滚动参数之后,滚动搜索请求(检索下一组结果)。
+ * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-scroll}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "scroll", + value: function scroll(params, callback) { + return this.client.scroll(params, callback); + } + /** + * @function ElasticSearch.prototype.search + * @description 在search()调用中指定滚动参数之后,滚动搜索请求(检索下一组结果)。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-search}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 请求返回的回调函数。也可以使用then表达式获取返回结果。 + * 回调参数:error,response,结果存储在response.responses中 + */ + + }, { + key: "search", + value: function search(params, callback) { + var me = this; + return me.client.search(params).then(function (resp) { + me._update(resp.responses, callback); + + return resp; + }, function (err) { + callback(err); + me.events.triggerEvent('error', { + error: err + }); + return err; + }); + } + /** + * @function ElasticSearch.prototype.searchShards + * @description 返回要执行搜索请求的索引和分片。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-searchshards}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "searchShards", + value: function searchShards(params, callback) { + return this.client.searchShards(params, callback); + } + /** + * @function ElasticSearch.prototype.searchTemplate + * @description 搜索模板。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-searchtemplate}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "searchTemplate", + value: function searchTemplate(params, callback) { + return this.client.searchTemplate(params, callback); + } + /** + * @function ElasticSearch.prototype.suggest + * @description 该建议功能通过使用特定的建议者,基于所提供的文本来建议类似的术语。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-suggest}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "suggest", + value: function suggest(params, callback) { + return this.client.suggest(params, callback); + } + /** + * @function ElasticSearch.prototype.termvectors + * @description 返回有关特定文档字段中的术语的信息和统计信息。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-termvectors}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "termvectors", + value: function termvectors(params, callback) { + return this.client.termvectors(params, callback); + } + /** + * @function ElasticSearch.prototype.update + * @description 更新文档的部分。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-update}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "update", + value: function update(params, callback) { + return this.client.update(params, callback); + } + /** + * @function ElasticSearch.prototype.updateByQuery + * @description 通过查询API来更新文档。 + * 参数设置参考 {@link https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-updatebyquery}
+ * 更多信息参考 {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html}
+ * @param {Object} params - 参数。 + * @param {function} callback - 回调函数。 + */ + + }, { + key: "updateByQuery", + value: function updateByQuery(params, callback) { + return this.client.updateByQuery(params, callback); + } + }, { + key: "_update", + value: function _update(data, callback) { + var me = this; + + if (!data) { + return; + } + + me.data = data; + + if (me.openGeoFence && me.geoFence) { + me._validateDatas(data); + } + + me.events.triggerEvent('change', { + data: me.data + }); //change方法已废弃,不建议使用。建议使用search方法的第二个参数传入请求成功的回调 + + if (me.change) { + me.change && me.change(data); + } else { + //加responses是为了保持跟原来es自身的数据结构一致 + callback && callback(undefined, { + responses: data + }); + } + } + }, { + key: "_validateDatas", + value: function _validateDatas(datas) { + if (!datas) { + return; + } + + if (!(datas instanceof Array)) { + datas = [datas]; + } + + var i, + len = datas.length; + + for (i = 0; i < len; i++) { + this._validateData(datas[i]); + } + } + }, { + key: "_validateData", + value: function _validateData(data) { + var me = this; + data.hits.hits.map(function (source) { + var content = source._source; + + var meterUnit = me._getMeterPerMapUnit(me.geoFence.unit); + + var geoFenceCX = me.geoFence.center[0] * meterUnit; + var geoFenceCY = me.geoFence.center[1] * meterUnit; + var contentX = content.x * meterUnit; + var contentY = content.y * meterUnit; + + var distance = me._distance(contentX, contentY, geoFenceCX, geoFenceCY); + + var radius = me.geoFence.radius; + + if (distance > radius) { + me.outOfGeoFence && me.outOfGeoFence(data); + me.events.triggerEvent('outOfGeoFence', { + data: data + }); + } + + return source; + }); + } + }, { + key: "_distance", + value: function _distance(x1, y1, x2, y2) { + return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + } + }, { + key: "_getMeterPerMapUnit", + value: function _getMeterPerMapUnit(mapUnit) { + var earchRadiusInMeters = 6378137; + var meterPerMapUnit; + + if (mapUnit === 'meter') { + meterPerMapUnit = 1; + } else if (mapUnit === 'degree') { + // 每度表示多少米。 + meterPerMapUnit = Math.PI * 2 * earchRadiusInMeters / 360; + } + + return meterPerMapUnit; + } + }]); + + return ElasticSearch; +}(); +;// CONCATENATED MODULE: ./src/common/thirdparty/elasticsearch/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +;// CONCATENATED MODULE: ./src/common/thirdparty/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Util.js +function Util_typeof(obj) { "@babel/helpers - typeof"; return Util_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Util_typeof(obj); } + +function Util_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Util_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Util_createClass(Constructor, protoProps, staticProps) { if (protoProps) Util_defineProperties(Constructor.prototype, protoProps); if (staticProps) Util_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Util + * @category Visualization Theme + * LevelRenderer 基础工具类 + * + */ +var Util_Util = /*#__PURE__*/function () { + function Util() { + Util_classCallCheck(this, Util); + + /** + * @member {Object} LevelRenderer.Tool.Util.prototype.BUILTIN_OBJECT + * @description 用于处理merge时无法遍历Date等对象的问题 + */ + this.BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1 + }; + /** + * @member {Object} LevelRenderer.Tool.Util.prototype._ctx + */ + + this._ctx = null; + /** + * Property: _canvas + * {Object} + */ + + this._canvas = null; + /** + * Property: _pixelCtx + * {Object} + */ + + this._pixelCtx = null; + /** + * Property: _width + * {Object} + */ + + this._width = null; + /** + * Property: _height + * {Object} + */ + + this._height = null; + /** + * Property: _offsetX + * {Object} + */ + + this._offsetX = 0; + /** + * Property: _offsetY + * {Object} + */ + + this._offsetY = 0; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Util"; + } + /** + * @function LevelRenderer.Tool.Util.prototype.clone + * @description 对一个object进行深度拷贝。 + * + * @param {Object} source - 需要进行拷贝的对象。 + * @return {Object} 拷贝后的新对象。 + */ + + + Util_createClass(Util, [{ + key: "clone", + value: function clone(source) { + var BUILTIN_OBJECT = this.BUILTIN_OBJECT; + + if (Util_typeof(source) == 'object' && source !== null) { + var result = source; + + if (source instanceof Array) { + result = []; + + for (var i = 0, len = source.length; i < len; i++) { + result[i] = this.clone(source[i]); + } + } else if (!BUILTIN_OBJECT[Object.prototype.toString.call(source)]) { + result = {}; + + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = this.clone(source[key]); + } + } + } + + return result; + } + + return source; + } + /** + * @function LevelRenderer.Tool.Util.prototype.mergeItem + * @description 合并源对象的单个属性到目标对象。 + * + * @param {Object} target - 目标对象。 + * @param {Object} source - 源对象。 + * @param {string} key - 键。 + * @param {boolean} overwrite - 是否覆盖。 + * @return {Object} 目标对象 + */ + + }, { + key: "mergeItem", + value: function mergeItem(target, source, key, overwrite) { + var BUILTIN_OBJECT = this.BUILTIN_OBJECT; + + if (source.hasOwnProperty(key)) { + if (Util_typeof(target[key]) == 'object' && !BUILTIN_OBJECT[Object.prototype.toString.call(target[key])]) { + // 如果需要递归覆盖,就递归调用merge + this.merge(target[key], source[key], overwrite); + } else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + target[key] = source[key]; + } + } + } + /** + * @function LevelRenderer.Tool.Util.prototype.merge + * @description 合并源对象的属性到目标对象。 + * + * @param {Object} target - 目标对象。 + * @param {Object} source - 源对象。 + * @param {boolean} overwrite - 是否覆盖。 + * @return {Object} 目标对象。 + */ + + }, { + key: "merge", + value: function merge(target, source, overwrite) { + for (var i in source) { + this.mergeItem(target, source, i, overwrite); + } + + return target; + } + /** + * @function LevelRenderer.Tool.Util.prototype.getContext + * @description 获取 Canvas 上下文。 + * @return {Object} 上下文。 + */ + + }, { + key: "getContext", + value: function getContext() { + if (!this._ctx) { + this._ctx = document.createElement('canvas').getContext('2d'); + } + + return this._ctx; + } + /** + * @function LevelRenderer.Tool.Util.prototype.getPixelContext + * @description 获取像素拾取专用的上下文。 + * @return {Object} 像素拾取专用的上下文。 + */ + + }, { + key: "getPixelContext", + value: function getPixelContext() { + if (!this._pixelCtx) { + this._canvas = document.createElement('canvas'); + this._width = this._canvas.width; + this._height = this._canvas.height; + this._pixelCtx = this._canvas.getContext('2d'); + } + + return this._pixelCtx; + } + /** + * @function LevelRenderer.Tool.Util.prototype.adjustCanvasSize + * @description 如果坐标处在_canvas外部,改变_canvas的大小,修改canvas的大小 需要重新设置translate + * + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * + */ + + }, { + key: "adjustCanvasSize", + value: function adjustCanvasSize(x, y) { + var _canvas = this._canvas; + var _pixelCtx = this._pixelCtx; + var _width = this._width; + var _height = this._height; + var _offsetX = this._offsetX; + var _offsetY = this._offsetY; // 每次加的长度 + + var _v = 100; + + var _flag; + + if (x + _offsetX > _width) { + _width = x + _offsetX + _v; + _canvas.width = _width; + _flag = true; + } + + if (y + _offsetY > _height) { + _height = y + _offsetY + _v; + _canvas.height = _height; + _flag = true; + } + + if (x < -_offsetX) { + _offsetX = Math.ceil(-x / _v) * _v; + _width += _offsetX; + _canvas.width = _width; + _flag = true; + } + + if (y < -_offsetY) { + _offsetY = Math.ceil(-y / _v) * _v; + _height += _offsetY; + _canvas.height = _height; + _flag = true; + } + + if (_flag) { + _pixelCtx.translate(_offsetX, _offsetY); + } + } + /** + * @function LevelRenderer.Tool.Util.prototype.getPixelOffset + * @description 获取像素canvas的偏移量。 + * @return {Object} 偏移量。 + */ + + }, { + key: "getPixelOffset", + value: function getPixelOffset() { + return { + x: this._offsetX, + y: this._offsetY + }; + } + /** + * @function LevelRenderer.Tool.Util.prototype.indexOf + * @description 查询数组中元素的index + * @return {Object} 偏移量。 + */ + + }, { + key: "indexOf", + value: function indexOf(array, value) { + if (array.indexOf) { + return array.indexOf(value); + } + + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + + return -1; + } + /** + * @function LevelRenderer.Tool.Util.prototype.inherits + * @description 构造类继承关系 + * + * @param {function} clazz - 源类。 + * @param {function} baseClazz - 基类。 + * @return {Object} 偏移量。 + */ + + }, { + key: "inherits", + value: function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + + function F() {} + + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + + clazz.constructor = clazz; + } + }]); + + return Util; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Color.js +function Color_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Color_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Color_createClass(Constructor, protoProps, staticProps) { if (protoProps) Color_defineProperties(Constructor.prototype, protoProps); if (staticProps) Color_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Tool.Color + * @category Visualization Theme + * @classdesc LevelRenderer 工具-颜色辅助类 + * @private + */ + +var Color = /*#__PURE__*/function () { + function Color() { + Color_classCallCheck(this, Color); + + /** + * @member {LevelRenderer.Tool.Util} LevelRenderer.Tool.Color.prototype.util + * @description LevelRenderer 基础工具对象。 + */ + this.util = new Util_Util(); + /** + * @member {Object} LevelRenderer.Tool.Color.prototype._ctx + * @description _ctx。 + */ + + this._ctx = null; + /** + * @member {Array.} LevelRenderer.Tool.Color.prototype.palette + * @description 默认色板。色板是一个包含图表默认颜色系列的数组,当色板中所有颜色被使用过后,又将从新回到色板中的第一个颜色。 + */ + + this.palette = ['#ff9277', ' #dddd00', ' #ffc877', ' #bbe3ff', ' #d5ffbb', '#bbbbff', ' #ddb000', ' #b0dd00', ' #e2bbff', ' #ffbbe3', '#ff7777', ' #ff9900', ' #83dd00', ' #77e3ff', ' #778fff', '#c877ff', ' #ff77ab', ' #ff6600', ' #aa8800', ' #77c7ff', '#ad77ff', ' #ff77ff', ' #dd0083', ' #777700', ' #00aa00', '#0088aa', ' #8400dd', ' #aa0088', ' #dd0000', ' #772e00']; + /** + * @member {Array.} LevelRenderer.Tool.Color.prototype._palette + * @description 复位色板,用于复位 palette + */ + + this._palette = this.palette; + /** + * @member {string} LevelRenderer.Tool.Color.prototype.highlightColor + * @description 高亮色 + */ + + this.highlightColor = 'rgba(0,0,255,1)'; + /** + * @member {string} LevelRenderer.Tool.Color.prototype._highlightColor + * @description 复位高亮色 + */ + + this._highlightColor = this.highlightColor; + /** + * @member {string} LevelRenderer.Tool.Color.prototype.colorRegExp + * @description 颜色格式,正则表达式。 + */ + + this.colorRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i; + /** + * @member {string} LevelRenderer.Tool.Color.prototype._nameColors + * @description 颜色名。 + */ + + this._nameColors = { + aliceblue: '#f0f8ff', + antiquewhite: '#faebd7', + aqua: '#0ff', + aquamarine: '#7fffd4', + azure: '#f0ffff', + beige: '#f5f5dc', + bisque: '#ffe4c4', + black: '#000', + blanchedalmond: '#ffebcd', + blue: '#00f', + blueviolet: '#8a2be2', + brown: '#a52a2a', + burlywood: '#deb887', + cadetblue: '#5f9ea0', + chartreuse: '#7fff00', + chocolate: '#d2691e', + coral: '#ff7f50', + cornflowerblue: '#6495ed', + cornsilk: '#fff8dc', + crimson: '#dc143c', + cyan: '#0ff', + darkblue: '#00008b', + darkcyan: '#008b8b', + darkgoldenrod: '#b8860b', + darkgray: '#a9a9a9', + darkgrey: '#a9a9a9', + darkgreen: '#006400', + darkkhaki: '#bdb76b', + darkmagenta: '#8b008b', + darkolivegreen: '#556b2f', + darkorange: '#ff8c00', + darkorchid: '#9932cc', + darkred: '#8b0000', + darksalmon: '#e9967a', + darkseagreen: '#8fbc8f', + darkslateblue: '#483d8b', + darkslategray: '#2f4f4f', + darkslategrey: '#2f4f4f', + darkturquoise: '#00ced1', + darkviolet: '#9400d3', + deeppink: '#ff1493', + deepskyblue: '#00bfff', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1e90ff', + firebrick: '#b22222', + floralwhite: '#fffaf0', + forestgreen: '#228b22', + fuchsia: '#f0f', + gainsboro: '#dcdcdc', + ghostwhite: '#f8f8ff', + gold: '#ffd700', + goldenrod: '#daa520', + gray: '#808080', + grey: '#808080', + green: '#008000', + greenyellow: '#adff2f', + honeydew: '#f0fff0', + hotpink: '#ff69b4', + indianred: '#cd5c5c', + indigo: '#4b0082', + ivory: '#fffff0', + khaki: '#f0e68c', + lavender: '#e6e6fa', + lavenderblush: '#fff0f5', + lawngreen: '#7cfc00', + lemonchiffon: '#fffacd', + lightblue: '#add8e6', + lightcoral: '#f08080', + lightcyan: '#e0ffff', + lightgoldenrodyellow: '#fafad2', + lightgray: '#d3d3d3', + lightgrey: '#d3d3d3', + lightgreen: '#90ee90', + lightpink: '#ffb6c1', + lightsalmon: '#ffa07a', + lightseagreen: '#20b2aa', + lightskyblue: '#87cefa', + lightslategray: '#789', + lightslategrey: '#789', + lightsteelblue: '#b0c4de', + lightyellow: '#ffffe0', + lime: '#0f0', + limegreen: '#32cd32', + linen: '#faf0e6', + magenta: '#f0f', + maroon: '#800000', + mediumaquamarine: '#66cdaa', + mediumblue: '#0000cd', + mediumorchid: '#ba55d3', + mediumpurple: '#9370d8', + mediumseagreen: '#3cb371', + mediumslateblue: '#7b68ee', + mediumspringgreen: '#00fa9a', + mediumturquoise: '#48d1cc', + mediumvioletred: '#c71585', + midnightblue: '#191970', + mintcream: '#f5fffa', + mistyrose: '#ffe4e1', + moccasin: '#ffe4b5', + navajowhite: '#ffdead', + navy: '#000080', + oldlace: '#fdf5e6', + olive: '#808000', + olivedrab: '#6b8e23', + orange: '#ffa500', + orangered: '#ff4500', + orchid: '#da70d6', + palegoldenrod: '#eee8aa', + palegreen: '#98fb98', + paleturquoise: '#afeeee', + palevioletred: '#d87093', + papayawhip: '#ffefd5', + peachpuff: '#ffdab9', + peru: '#cd853f', + pink: '#ffc0cb', + plum: '#dda0dd', + powderblue: '#b0e0e6', + purple: '#800080', + red: '#f00', + rosybrown: '#bc8f8f', + royalblue: '#4169e1', + saddlebrown: '#8b4513', + salmon: '#fa8072', + sandybrown: '#f4a460', + seagreen: '#2e8b57', + seashell: '#fff5ee', + sienna: '#a0522d', + silver: '#c0c0c0', + skyblue: '#87ceeb', + slateblue: '#6a5acd', + slategray: '#708090', + slategrey: '#708090', + snow: '#fffafa', + springgreen: '#00ff7f', + steelblue: '#4682b4', + tan: '#d2b48c', + teal: '#008080', + thistle: '#d8bfd8', + tomato: '#ff6347', + turquoise: '#40e0d0', + violet: '#ee82ee', + wheat: '#f5deb3', + white: '#fff', + whitesmoke: '#f5f5f5', + yellow: '#ff0', + yellowgreen: '#9acd32' + }; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Color"; + } + /** + * @function LevelRenderer.Tool.Color.prototype.customPalette + * @description 自定义调色板。 + * @param {Array.} userPalete - 颜色板。 + */ + + + Color_createClass(Color, [{ + key: "customPalette", + value: function customPalette(userPalete) { + this.palette = userPalete; + } + /** + * @function LevelRenderer.Tool.Color.prototype.resetPalette + * @description 复位默认色板。 + */ + + }, { + key: "resetPalette", + value: function resetPalette() { + this.palette = this._palette; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getColor + * @description 获取色板颜色。 + * @param {number} idx - 色板位置。 + * @param {Array.} userPalete - 色板。 + * @returns {string} 颜色值。 + */ + + }, { + key: "getColor", + value: function getColor(idx, userPalete) { + idx = idx | 0; + userPalete = userPalete || this.palette; + return userPalete[idx % userPalete.length]; + } + /** + * @function LevelRenderer.Tool.Color.prototype.customHighlight + * @description 自定义默认高亮颜色。 + * @param {string} userHighlightColor - 自定义高亮色。 + */ + + }, { + key: "customHighlight", + value: function customHighlight(userHighlightColor) { + this.highlightColor = userHighlightColor; + } + /** + * @function LevelRenderer.Tool.Color.prototype.resetHighlight + * @description 重置默认高亮颜色。将当前的高亮色作为默认高亮颜色 + */ + + }, { + key: "resetHighlight", + value: function resetHighlight() { + this.highlightColor = this._highlightColor; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getHighlightColor + * @description 获取默认高亮颜色 + * @returns {string} 颜色值。 + */ + + }, { + key: "getHighlightColor", + value: function getHighlightColor() { + return this.highlightColor; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getRadialGradient + * @description 径向渐变。 + * @param {number} x0 - 渐变起点横坐标。 + * @param {number} y0 - 渐变起点纵坐标。 + * @param {number} r0 - 半径 + * @param {number} x1 - 渐变终点横坐标。 + * @param {number} y1 - 渐变终点纵坐标。 + * @param {number} r1 - 半径 + * @param {Array} colorList - 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + + }, { + key: "getRadialGradient", + value: function getRadialGradient(x0, y0, r0, x1, y1, r1, colorList) { + var util = this.util; + + if (!this._ctx) { + this._ctx = util.getContext(); + } + + var gradient = this._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1); + + for (var i = 0, l = colorList.length; i < l; i++) { + gradient.addColorStop(colorList[i][0], colorList[i][1]); + } + + gradient.__nonRecursion = true; + return gradient; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getLinearGradient + * @description 线性渐变。 + * @param {number} x0 - 渐变起点横坐标。 + * @param {number} y0 - 渐变起点纵坐标。 + * @param {number} x1 - 渐变终点横坐标。 + * @param {number} y1 - 渐变终点纵坐标。 + * @param {Array} colorList - 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + + }, { + key: "getLinearGradient", + value: function getLinearGradient(x0, y0, x1, y1, colorList) { + var util = this.util; + + if (!this._ctx) { + this._ctx = util.getContext(); + } + + var gradient = this._ctx.createLinearGradient(x0, y0, x1, y1); + + for (var i = 0, l = colorList.length; i < l; i++) { + gradient.addColorStop(colorList[i][0], colorList[i][1]); + } + + gradient.__nonRecursion = true; + return gradient; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getStepColors + * @description 获取两种颜色之间渐变颜色数组。 + * @param {Object} start - 起始颜色对象。 + * @param {Object} end - 结束颜色对象。 + * @param {number} step - 渐变级数。 + * @returns {Array} 颜色数组。 + */ + + }, { + key: "getStepColors", + value: function getStepColors(start, end, step) { + start = this.toRGBA(start); + end = this.toRGBA(end); + start = this.getData(start); + end = this.getData(end); + var colors = []; + var stepR = (end[0] - start[0]) / step; + var stepG = (end[1] - start[1]) / step; + var stepB = (end[2] - start[2]) / step; + var stepA = (end[3] - start[3]) / step; // 生成颜色集合 + // fix by linfeng 颜色堆积 + + for (var i = 0, r = start[0], g = start[1], b = start[2], a = start[3]; i < step; i++) { + colors[i] = this.toColor([this.adjust(Math.floor(r), [0, 255]), this.adjust(Math.floor(g), [0, 255]), this.adjust(Math.floor(b), [0, 255]), a.toFixed(4) - 0], 'rgba'); + r += stepR; + g += stepG; + b += stepB; + a += stepA; + } + + r = end[0]; + g = end[1]; + b = end[2]; + a = end[3]; + colors[i] = this.toColor([r, g, b, a], 'rgba'); + return colors; + } + /** + * @function LevelRenderer.Tool.Color.prototype.getGradientColors + * @description 获取指定级数的渐变颜色数组。 + * @param {Array.} colors - 颜色数组。 + * @param {number} [step=20] - 渐变级数。 + * @returns {Array.} 颜色数组。 + */ + + }, { + key: "getGradientColors", + value: function getGradientColors(colors, step) { + var ret = []; + var len = colors.length; + + if (step === undefined) { + step = 20; + } + + if (len === 1) { + ret = this.getStepColors(colors[0], colors[0], step); + } else if (len > 1) { + for (var i = 0, n = len - 1; i < n; i++) { + var steps = this.getStepColors(colors[i], colors[i + 1], step); + + if (i < n - 1) { + steps.pop(); + } + + ret = ret.concat(steps); + } + } + + return ret; + } + /** + * @function LevelRenderer.Tool.Color.prototype.toColor + * @description 颜色值数组转为指定格式颜色。 + * @param {Array} data - 颜色值数组。 + * @param {string} format - 格式,默认'rgb' + * @returns {string} 颜色。 + */ + + }, { + key: "toColor", + value: function toColor(data, format) { + format = format || 'rgb'; + + if (data && (data.length === 3 || data.length === 4)) { + data = this.map(data, function (c) { + return c > 1 ? Math.ceil(c) : c; + }); + + if (format.indexOf('hex') > -1) { + return '#' + ((1 << 24) + (data[0] << 16) + (data[1] << 8) + +data[2]).toString(16).slice(1); + } else if (format.indexOf('hs') > -1) { + var sx = this.map(data.slice(1, 3), function (c) { + return c + '%'; + }); + data[1] = sx[0]; + data[2] = sx[1]; + } + + if (format.indexOf('a') > -1) { + if (data.length === 3) { + data.push(1); + } + + data[3] = this.adjust(data[3], [0, 1]); + return format + '(' + data.slice(0, 4).join(',') + ')'; + } + + return format + '(' + data.slice(0, 3).join(',') + ')'; + } + } + /** + * @function LevelRenderer.Tool.Color.prototype.toArray + * @description 颜色字符串转换为rgba数组。 + * @param {string} color - 颜色。 + * @returns {Array.} 颜色值数组。 + */ + + }, { + key: "toArray", + value: function toArray(color) { + color = this.trim(color); + + if (color.indexOf('rgba') < 0) { + color = this.toRGBA(color); + } + + var data = []; + var i = 0; + color.replace(/[\d.]+/g, function (n) { + if (i < 3) { + n = n | 0; + } else { + // Alpha + n = +n; + } + + data[i++] = n; + }); + return data; + } + /** + * @function LevelRenderer.Tool.Color.prototype.convert + * @description 颜色格式转化。 + * @param {Array} data - 颜色值数组。 + * @param {string} format - 格式,默认'rgb' + * @returns {string} 颜色。 + */ + + }, { + key: "convert", + value: function convert(color, format) { + if (!this.isCalculableColor(color)) { + return color; + } + + var data = this.getData(color); + var alpha = data[3]; + + if (typeof alpha === 'undefined') { + alpha = 1; + } + + if (color.indexOf('hsb') > -1) { + data = this._HSV_2_RGB(data); + } else if (color.indexOf('hsl') > -1) { + data = this._HSL_2_RGB(data); + } + + if (format.indexOf('hsb') > -1 || format.indexOf('hsv') > -1) { + data = this._RGB_2_HSB(data); + } else if (format.indexOf('hsl') > -1) { + data = this._RGB_2_HSL(data); + } + + data[3] = alpha; + return this.toColor(data, format); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toRGBA + * @description 转换为rgba格式的颜色。 + * @param {string} color - 颜色。 + * @returns {string} 颜色。 + */ + + }, { + key: "toRGBA", + value: function toRGBA(color) { + return this.convert(color, 'rgba'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toRGB + * @description 转换为rgb数字格式的颜色。 + * @param {string} color - 颜色。 + * @returns {string} 颜色。 + */ + + }, { + key: "toRGB", + value: function toRGB(color) { + return this.convert(color, 'rgb'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHex + * @description 转换为16进制颜色。 + * @param {string} color - 颜色。 + * @returns {string} 16进制颜色,#rrggbb格式 + */ + + }, { + key: "toHex", + value: function toHex(color) { + return this.convert(color, 'hex'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSVA + * @description 转换为HSV颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSVA颜色,hsva(h,s,v,a) + */ + + }, { + key: "toHSVA", + value: function toHSVA(color) { + return this.convert(color, 'hsva'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSV + * @description 转换为HSV颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSV颜色,hsv(h,s,v) + */ + + }, { + key: "toHSV", + value: function toHSV(color) { + return this.convert(color, 'hsv'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSBA + * @description 转换为HSBA颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSBA颜色,hsba(h,s,b,a) + */ + + }, { + key: "toHSBA", + value: function toHSBA(color) { + return this.convert(color, 'hsba'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSB + * @description 转换为HSB颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSB颜色,hsb(h,s,b) + */ + + }, { + key: "toHSB", + value: function toHSB(color) { + return this.convert(color, 'hsb'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSLA + * @description 转换为HSLA颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSLA颜色,hsla(h,s,l,a) + */ + + }, { + key: "toHSLA", + value: function toHSLA(color) { + return this.convert(color, 'hsla'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toHSL + * @description 转换为HSL颜色。 + * @param {string} color - 颜色。 + * @returns {string} HSL颜色,hsl(h,s,l) + */ + + }, { + key: "toHSL", + value: function toHSL(color) { + return this.convert(color, 'hsl'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.toName + * @description 转换颜色名。 + * @param {string} color - 颜色。 + * @returns {string} 颜色名 + */ + + }, { + key: "toName", + value: function toName(color) { + for (var key in this._nameColors) { + if (this.toHex(this._nameColors[key]) === this.toHex(color)) { + return key; + } + } + + return null; + } + /** + * @function LevelRenderer.Tool.Color.prototype.trim + * @description 移除颜色中多余空格。 + * @param {string} color - 颜色。 + * @returns {string} 无空格颜色 + */ + + }, { + key: "trim", + value: function trim(color) { + return String(color).replace(/\s+/g, ''); + } + /** + * @function LevelRenderer.Tool.Color.prototype.normalize + * @description 颜色规范化。 + * @param {string} color - 颜色。 + * @returns {string} 规范化后的颜色 + */ + + }, { + key: "normalize", + value: function normalize(color) { + // 颜色名 + if (this._nameColors[color]) { + color = this._nameColors[color]; + } // 去掉空格 + + + color = this.trim(color); // hsv与hsb等价 + + color = color.replace(/hsv/i, 'hsb'); // rgb转为rrggbb + + if (/^#[\da-f]{3}$/i.test(color)) { + color = parseInt(color.slice(1), 16); + var r = (color & 0xf00) << 8; + var g = (color & 0xf0) << 4; + var b = color & 0xf; + color = '#' + ((1 << 24) + (r << 4) + r + (g << 4) + g + (b << 4) + b).toString(16).slice(1); + } // 或者使用以下正则替换,不过 chrome 下性能相对差点 + // color = color.replace(/^#([\da-f])([\da-f])([\da-f])$/i, '#$1$1$2$2$3$3'); + + + return color; + } + /** + * @function LevelRenderer.Tool.Color.prototype.lift + * @description 颜色加深或减淡,当level>0加深,当level<0减淡。 + * @param {string} color - 颜色。 + * @param {number} level - 升降程度,取值区间[-1,1]。 + * @returns {string} 加深或减淡后颜色值 + */ + + }, { + key: "lift", + value: function lift(color, level) { + if (!this.isCalculableColor(color)) { + return color; + } + + var direct = level > 0 ? 1 : -1; + + if (typeof level === 'undefined') { + level = 0; + } + + level = Math.abs(level) > 1 ? 1 : Math.abs(level); + color = this.toRGB(color); + var data = this.getData(color); + + for (var i = 0; i < 3; i++) { + if (direct === 1) { + data[i] = data[i] * (1 - level) | 0; + } else { + data[i] = (255 - data[i]) * level + data[i] | 0; + } + } + + return 'rgb(' + data.join(',') + ')'; + } + /** + * @function LevelRenderer.Tool.Color.prototype.reverse + * @description 颜色翻转。[255-r,255-g,255-b,1-a] + * @param {string} color - 颜色。 + * @returns {string} 翻转颜色 + */ + + }, { + key: "reverse", + value: function reverse(color) { + if (!this.isCalculableColor(color)) { + return color; + } + + var data = this.getData(this.toRGBA(color)); + data = this.map(data, function (c) { + return 255 - c; + }); + return this.toColor(data, 'rgb'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.mix + * @description 简单两种颜色混合 + * @param {string} color1 - 第一种颜色。 + * @param {string} color2 - 第二种颜色。 + * @param {number} weight - 混合权重[0-1]。 + * @returns {string} 结果色。rgb(r,g,b)或rgba(r,g,b,a) + */ + + }, { + key: "mix", + value: function mix(color1, color2, weight) { + if (!this.isCalculableColor(color1) || !this.isCalculableColor(color2)) { + return color1; + } + + if (typeof weight === 'undefined') { + weight = 0.5; + } + + weight = 1 - this.adjust(weight, [0, 1]); + var w = weight * 2 - 1; + var data1 = this.getData(this.toRGBA(color1)); + var data2 = this.getData(this.toRGBA(color2)); + var d = data1[3] - data2[3]; + var weight1 = ((w * d === -1 ? w : (w + d) / (1 + w * d)) + 1) / 2; + var weight2 = 1 - weight1; + var data = []; + + for (var i = 0; i < 3; i++) { + data[i] = data1[i] * weight1 + data2[i] * weight2; + } + + var alpha = data1[3] * weight + data2[3] * (1 - weight); + alpha = Math.max(0, Math.min(1, alpha)); + + if (data1[3] === 1 && data2[3] === 1) { + // 不考虑透明度 + return this.toColor(data, 'rgb'); + } + + data[3] = alpha; + return this.toColor(data, 'rgba'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.random + * @description 随机颜色 + * @returns {string} 颜色值,#rrggbb格式 + */ + + }, { + key: "random", + value: function random() { + return '#' + Math.random().toString(16).slice(2, 8); + } + /** + * @function LevelRenderer.Tool.Color.prototype.getData + * @description 获取颜色值数组,返回值范围。 + * RGB 范围[0-255] + * HSL/HSV/HSB 范围[0-1] + * A透明度范围[0-1] + * 支持格式: + * #rgb + * #rrggbb + * rgb(r,g,b) + * rgb(r%,g%,b%) + * rgba(r,g,b,a) + * hsb(h,s,b) // hsv与hsb等价 + * hsb(h%,s%,b%) + * hsba(h,s,b,a) + * hsl(h,s,l) + * hsl(h%,s%,l%) + * hsla(h,s,l,a) + * @param {string} color - 颜色。 + * @returns {Array.} 颜色值数组或null + */ + + }, { + key: "getData", + value: function getData(color) { + color = this.normalize(color); + var r = color.match(this.colorRegExp); + + if (r === null) { + throw new Error('The color format error'); // 颜色格式错误 + } + + var d; + var a; + var data = []; + var rgb; + + if (r[2]) { + // #rrggbb + d = r[2].replace('#', '').split(''); + rgb = [d[0] + d[1], d[2] + d[3], d[4] + d[5]]; + data = this.map(rgb, function (c) { + return Color.prototype.adjust.call(this, parseInt(c, 16), [0, 255]); + }); + } else if (r[4]) { + // rgb rgba + var rgba = r[4].split(','); + a = rgba[3]; + rgb = rgba.slice(0, 3); + data = this.map(rgb, function (c) { + c = Math.floor(c.indexOf('%') > 0 ? parseInt(c, 0) * 2.55 : c); + return Color.prototype.adjust.call(this, c, [0, 255]); + }); + + if (typeof a !== 'undefined') { + data.push(this.adjust(parseFloat(a), [0, 1])); + } + } else if (r[5] || r[6]) { + // hsb hsba hsl hsla + var hsxa = (r[5] || r[6]).split(','); + var h = parseInt(hsxa[0], 0) / 360; + var s = hsxa[1]; + var x = hsxa[2]; + a = hsxa[3]; + data = this.map([s, x], function (c) { + return Color.prototype.adjust.call(this, parseFloat(c) / 100, [0, 1]); + }); + data.unshift(h); + + if (typeof a !== 'undefined') { + data.push(this.adjust(parseFloat(a), [0, 1])); + } + } + + return data; + } + /** + * @function LevelRenderer.Tool.Color.prototype.alpha + * @description 设置颜色透明度 + * @param {string} color - 颜色。 + * @param {number} a - 透明度,区间[0,1]。 + * @returns {string} rgba颜色值 + */ + + }, { + key: "alpha", + value: function alpha(color, a) { + if (!this.isCalculableColor(color)) { + return color; + } + + if (a === null) { + a = 1; + } + + var data = this.getData(this.toRGBA(color)); + data[3] = this.adjust(Number(a).toFixed(4), [0, 1]); + return this.toColor(data, 'rgba'); + } + /** + * @function LevelRenderer.Tool.Color.prototype.map + * @description 数组映射 + * @param {Array} array - 数组。 + * @param {function} fun - 函数。 + * @returns {string} 数组映射结果 + */ + + }, { + key: "map", + value: function map(array, fun) { + if (typeof fun !== 'function') { + throw new TypeError(); + } + + var len = array ? array.length : 0; + + for (var i = 0; i < len; i++) { + array[i] = fun(array[i]); + } + + return array; + } + /** + * @function LevelRenderer.Tool.Color.prototype.adjust + * @description 调整值区间 + * @param {Array.} value - 数组。 + * @param {Array.} region - 区间。 + * @returns {number} 调整后的值 + */ + + }, { + key: "adjust", + value: function adjust(value, region) { + // < to <= & > to >= + // modify by linzhifeng 2014-05-25 because -0 == 0 + if (value <= region[0]) { + value = region[0]; + } else if (value >= region[1]) { + value = region[1]; + } + + return value; + } + /** + * @function LevelRenderer.Tool.Color.prototype.isCalculableColor + * @description 判断是否是可计算的颜色 + * @param {string} color - 颜色。 + * @returns {boolean} 是否是可计算的颜色 + */ + + }, { + key: "isCalculableColor", + value: function isCalculableColor(color) { + return color instanceof Array || typeof color === 'string'; + } + /** + * @function LevelRenderer.Tool.Color.prototype._HSV_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + + }, { + key: "_HSV_2_RGB", + value: function _HSV_2_RGB(data) { + var H = data[0]; + var S = data[1]; + var V = data[2]; // HSV from 0 to 1 + + var R; + var G; + var B; + + if (S === 0) { + R = V * 255; + G = V * 255; + B = V * 255; + } else { + var h = H * 6; + + if (h === 6) { + h = 0; + } + + var i = h | 0; + var v1 = V * (1 - S); + var v2 = V * (1 - S * (h - i)); + var v3 = V * (1 - S * (1 - (h - i))); + var r = 0; + var g = 0; + var b = 0; + + if (i === 0) { + r = V; + g = v3; + b = v1; + } else if (i === 1) { + r = v2; + g = V; + b = v1; + } else if (i === 2) { + r = v1; + g = V; + b = v3; + } else if (i === 3) { + r = v1; + g = v2; + b = V; + } else if (i === 4) { + r = v3; + g = v1; + b = V; + } else { + r = V; + g = v1; + b = v2; + } // RGB results from 0 to 255 + + + R = r * 255; + G = g * 255; + B = b * 255; + } + + return [R, G, B]; + } + /** + * @function LevelRenderer.Tool.Color.prototype._HSL_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + + }, { + key: "_HSL_2_RGB", + value: function _HSL_2_RGB(data) { + var H = data[0]; + var S = data[1]; + var L = data[2]; // HSL from 0 to 1 + + var R; + var G; + var B; + + if (S === 0) { + R = L * 255; + G = L * 255; + B = L * 255; + } else { + var v2; + + if (L < 0.5) { + v2 = L * (1 + S); + } else { + v2 = L + S - S * L; + } + + var v1 = 2 * L - v2; + R = 255 * this._HUE_2_RGB(v1, v2, H + 1 / 3); + G = 255 * this._HUE_2_RGB(v1, v2, H); + B = 255 * this._HUE_2_RGB(v1, v2, H - 1 / 3); + } + + return [R, G, B]; + } + /** + * @function LevelRenderer.Tool.Color.prototype._HUE_2_RGB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + + }, { + key: "_HUE_2_RGB", + value: function _HUE_2_RGB(v1, v2, vH) { + if (vH < 0) { + vH += 1; + } + + if (vH > 1) { + vH -= 1; + } + + if (6 * vH < 1) { + return v1 + (v2 - v1) * 6 * vH; + } + + if (2 * vH < 1) { + return v2; + } + + if (3 * vH < 2) { + return v1 + (v2 - v1) * (2 / 3 - vH) * 6; + } + + return v1; + } + /** + * @function LevelRenderer.Tool.Color.prototype._RGB_2_HSB。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + + }, { + key: "_RGB_2_HSB", + value: function _RGB_2_HSB(data) { + // RGB from 0 to 255 + var R = data[0] / 255; + var G = data[1] / 255; + var B = data[2] / 255; + var vMin = Math.min(R, G, B); // Min. value of RGB + + var vMax = Math.max(R, G, B); // Max. value of RGB + + var delta = vMax - vMin; // Delta RGB value + + var V = vMax; + var H; + var S; // HSV results from 0 to 1 + + if (delta === 0) { + H = 0; + S = 0; + } else { + S = delta / vMax; + var deltaR = ((vMax - R) / 6 + delta / 2) / delta; + var deltaG = ((vMax - G) / 6 + delta / 2) / delta; + var deltaB = ((vMax - B) / 6 + delta / 2) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } else if (G === vMax) { + H = 1 / 3 + deltaR - deltaB; + } else if (B === vMax) { + H = 2 / 3 + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + H = H * 360; + S = S * 100; + V = V * 100; + return [H, S, V]; + } + /** + * @function LevelRenderer.Tool.Color.prototype._RGB_2_HSL。参见{@link http://www.easyrgb.com/index.php?X=MATH} + */ + + }, { + key: "_RGB_2_HSL", + value: function _RGB_2_HSL(data) { + // RGB from 0 to 255 + var R = data[0] / 255; + var G = data[1] / 255; + var B = data[2] / 255; + var vMin = Math.min(R, G, B); // Min. value of RGB + + var vMax = Math.max(R, G, B); // Max. value of RGB + + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; // HSL results from 0 to 1 + + if (delta === 0) { + H = 0; + S = 0; + } else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = ((vMax - R) / 6 + delta / 2) / delta; + var deltaG = ((vMax - G) / 6 + delta / 2) / delta; + var deltaB = ((vMax - B) / 6 + delta / 2) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } else if (G === vMax) { + H = 1 / 3 + deltaR - deltaB; + } else if (B === vMax) { + H = 2 / 3 + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + H = H * 360; + S = S * 100; + L = L * 100; + return [H, S, L]; + } + }]); + + return Color; +}(); +;// CONCATENATED MODULE: ./src/common/util/ColorsPickerUtil.js +function ColorsPickerUtil_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ColorsPickerUtil_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ColorsPickerUtil_createClass(Constructor, protoProps, staticProps) { if (protoProps) ColorsPickerUtil_defineProperties(Constructor.prototype, protoProps); if (staticProps) ColorsPickerUtil_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + + +var ColorRender = new Color(); // let "http://www.qzu.zj.cn": "#bd10e0" +// "www.qzct.net": "#7ed321" = new LevelRenderer.Tool.Color(); + +/** + * @class ColorsPickerUtil + * @category BaseTypes Util + * @classdesc 色带选择器工具类 用于1、创建canvas对象,2、从几种颜色中获取一定数量的渐变色 + * @usage + */ + +var ColorsPickerUtil = /*#__PURE__*/function () { + function ColorsPickerUtil() { + ColorsPickerUtil_classCallCheck(this, ColorsPickerUtil); + } + + ColorsPickerUtil_createClass(ColorsPickerUtil, null, [{ + key: "createCanvas", + value: + /** + * @function ColorsPickerUtil.createCanvas + * @description 创建DOM canvas + * @param {number} height - canvas 高度。 + * @param {number} width - canvas 宽度。 + */ + function createCanvas(height, width) { + var canvas = document.createElement("canvas"); + canvas.height = height; + canvas.width = width; + return canvas.getContext("2d"); + } + /** + * @function ColorsPickerUtil.getLinearGradient + * @description 线性渐变。 + * @param {number} x0 - 渐变起点 x 坐标。 + * @param {number} y0 - 渐变起点 y 坐标。 + * @param {number} x1 - 渐变终点 x 坐标。 + * @param {number} y1 - 渐变终点 y 坐标。 + * @param {Array} colorList 颜色列表。 + * @returns {CanvasGradient} Cavans 渐变颜色。 + */ + + }, { + key: "getLinearGradient", + value: function getLinearGradient(x0, y0, x1, y1, colorList) { + if (!this._ctx) { + this._ctx = this.getContext(); + } + + var gradient = this._ctx.createLinearGradient(x0, y0, x1, y1); + + var leng = colorList.length; + var add = 1 / (leng - 1); + var offset = 0; + + for (var i = 0; i < leng; i++) { + gradient.addColorStop(offset, colorList[i]); + offset += add; + } + + gradient.__nonRecursion = true; + return gradient; + } + /** + * @function ColorsPickerUtil.getContext + * @description 获取 Cavans 上下文。 + * @returns {Object} Cavans 上下文。 + */ + + }, { + key: "getContext", + value: function getContext() { + if (!this._ctx) { + this._ctx = document.createElement('canvas').getContext('2d'); + } + + return this._ctx; + } + /** + * @function ColorsPickerUtil.getStepColors + * @description 获取两种颜色之间渐变颜色数组。 + * @param {string} start - 起始颜色。 + * @param {string} end - 结束颜色。 + * @param {number} step - 渐变级数。 + * @returns {Array} 颜色数组。 + */ + + }, { + key: "getStepColors", + value: function getStepColors(start, end, step) { + start = ColorRender.toRGBA(start); + end = ColorRender.toRGBA(end); + start = ColorRender.getData(start); + end = ColorRender.getData(end); + var colors = []; + var stepR = (end[0] - start[0]) / step; + var stepG = (end[1] - start[1]) / step; + var stepB = (end[2] - start[2]) / step; + var stepA = (end[3] - start[3]) / step; // 生成颜色集合 + // fix by linfeng 颜色堆积 + + for (var i = 0, r = start[0], g = start[1], b = start[2], a = start[3]; i < step; i++) { + colors[i] = ColorRender.toColor([ColorRender.adjust(Math.floor(r), [0, 255]), ColorRender.adjust(Math.floor(g), [0, 255]), ColorRender.adjust(Math.floor(b), [0, 255]), a.toFixed(4) - 0], 'hex'); + r += stepR; + g += stepG; + b += stepB; + a += stepA; + } + + r = end[0]; + g = end[1]; + b = end[2]; + a = end[3]; + colors[i] = ColorRender.toColor([r, g, b, a], 'hex'); + return colors; + } + /** + * @function ColorsPickerUtil.getGradientColors + * @description 获取指定级数的渐变颜色数组。 + * @param {Array.} colors - 颜色组。 + * @param {number} total - 颜色总数。 + * @param {string} themeType - 专题类型。 + * @returns {Array.} 颜色数组。 + */ + + }, { + key: "getGradientColors", + value: function getGradientColors(colors, total, themeType) { + var ret = [], + step; + var i, + n, + len = colors.length; + + if (total === undefined) { + return; + } + + if (len >= total) { + if (themeType === 'RANGE') { + for (i = 0; i < total; i++) { + ret.push(colors[i]); + } + } else { + //1/2前后取色 + for (i = 0; i < total; i++) { + var ii = Math.floor(i / 2); + + if (i % 2 === 0) { + ret.push(colors[ii]); + } else { + var _index = colors.length - 1 - ii; + + ret.push(colors[_index]); + } + } + } + } else { + step = Math.ceil(total / (len - 1)); + + for (i = 0, n = len - 1; i < n; i++) { + var steps = this.getStepColors(colors[i], colors[i + 1], step); + + if (i < n - 1) { + steps.pop(); + } + + ret = ret.concat(steps); + } //删除多余元素 + + + var nouse = ret.length - total; + + for (var j = 0, index = 0; j < nouse; j++) { + ret.splice(index + 2, 1); + } + } + + return ret; + } + }]); + + return ColorsPickerUtil; +}(); +;// CONCATENATED MODULE: ./src/common/util/ArrayStatistic.js +function ArrayStatistic_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ArrayStatistic_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ArrayStatistic_createClass(Constructor, protoProps, staticProps) { if (protoProps) ArrayStatistic_defineProperties(Constructor.prototype, protoProps); if (staticProps) ArrayStatistic_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/** + * @class ArrayStatistic + * @category BaseTypes Util + * @classdesc 处理数组。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ArrayStatistic } from '{npm}'; + * + * new ArrayStatistic(); + * ``` + */ +var ArrayStatistic = /*#__PURE__*/function () { + function ArrayStatistic() { + ArrayStatistic_classCallCheck(this, ArrayStatistic); + } + + ArrayStatistic_createClass(ArrayStatistic, null, [{ + key: "newInstance", + value: // geostatsInstance: null, + + /** + * @function ArrayStatistic.newInstance + * @description 初始化插件实例。 + */ + function newInstance() { + // if(!this.geostatsInstance) { + // // this.geostatsInstance = new geostats(); + // // } + // window.dataList = []; + if (!this.geostatsInstance) { + this.geostatsInstance = new window.geostats(); + } + + return this.geostatsInstance; + } + /** + * @function ArrayStatistic.getInstance + * @description 设置需要被处理的数组。 + * @param {Array} array - 数组。 + */ + + }, { + key: "getInstance", + value: function getInstance(array) { + var instance = this.newInstance(); + instance.setSerie(array); + return instance; + } + /** + * @function ArrayStatistic.getArrayStatistic + * @description 获取数组统计的值。 + * @param {Array.} array - 需要统计的数组。 + * @param {string} type - 统计方法。 + */ + + }, { + key: "getArrayStatistic", + value: function getArrayStatistic(array, type) { + if (!array.length) { + return 0; + } + + if (type === "Sum" || type === "求和") { + return this.getSum(array); + } else if (type === "Maximum" || type === "最大值") { + return this.getMax(array); + } else if (type === "Minimum" || type === "最小值") { + return this.getMin(array); + } else if (type === "Average" || type === "平均值") { + return this.getMean(array); + } else if (type === "Median" || type === "中位数") { + return this.getMedian(array); + } else if (type === "times" || type === "计数") { + return this.getTimes(array); + } + } + /** + * @function ArrayStatistic.getArraySegments + * @description 获取数组分段后的数值。 + * @param {Array.} array - 需要分段的数组。 + * @param {string} type - 分段方法。 + * @param {number} segNum - 分段个数。 + */ + + }, { + key: "getArraySegments", + value: function getArraySegments(array, type, segNum) { + if (type === "offset") { + return this.getEqInterval(array, segNum); + } else if (type === "jenks") { + return this.getJenks(array, segNum); + } else if (type === "square") { + // 数据都必须 >= 0 + var minValue = this.getMin(array); + + if (minValue >= 0) { + return this.getSqrtInterval(array, segNum); + } else { + //console.log('数据都必须 >= 0'); + // Util.showMessage(Language.hasNegValue + Language.noSupportRange, 'ERROR'); + return false; + } + } else if (type === "logarithm") { + // 数据都必须 > 0 + var _minValue = this.getMin(array); + + if (_minValue > 0) { + return this.getGeometricProgression(array, segNum); + } else { + //console.log('数据都必须 > 0'); + // Util.showMessage(Language.hasZeroNegValue + Language.noSupportRange, 'ERROR'); + return false; + } + } + } + /** + * @function ArrayStatistic.getSum + * @description 求和。 + * @param {Array.} array 需要求和的参数。 + * @returns {number} 返回求和结果。 + */ + + }, { + key: "getSum", + value: function getSum(array) { + return this.getInstance(array).sum(); + } + /** + * @function ArrayStatistic.getMax + * @description 最大值。 + * @param {Array.} array 需要求最大值的参数。 + * @returns {number} 返回最大值。 + */ + + }, { + key: "getMax", + value: function getMax(array) { + return this.getInstance(array).max(); + } + /** + * @function ArrayStatistic.getMin + * @description 最小值。 + * @param {Array.} array 需要求最小值的参数。 + * @returns {number} 返回最小值。 + */ + + }, { + key: "getMin", + value: function getMin(array) { + return this.getInstance(array).min(); + } + /** + * @function ArrayStatistic.getMean + * @description 求平均数。 + * @param {Array.} array 需要求平均数的参数。 + * @returns {number} 返回平均数。 + */ + + }, { + key: "getMean", + value: function getMean(array) { + return this.getInstance(array).mean(); + } + /** + * @function ArrayStatistic.getMedian + * @description 求中位数。 + * @param {Array.} array 需要求中位数的参数。 + * @returns {number} 返回中位数。 + */ + + }, { + key: "getMedian", + value: function getMedian(array) { + return this.getInstance(array).median(); + } + /** + * @function ArrayStatistic.getTimes + * @description 计数。 + * @param {Array.} array 需要计数的参数。 + * @returns {number} 返回计数结果。 + */ + + }, { + key: "getTimes", + value: function getTimes(array) { + return array.length; + } + /** + * @function ArrayStatistic.getEqInterval + * @description 等距分段法。 + * @param {Array} array 需要进行等距分段的数组。 + * @param {number} segNum 分段个数。 + */ + + }, { + key: "getEqInterval", + value: function getEqInterval(array, segNum) { + return this.getInstance(array).getClassEqInterval(segNum); + } + /** + * @function ArrayStatistic.getJenks + * @description 自然断裂法。 + * @param {Array} array 需要进行自然断裂的参数。 + * @param {number} segNum 分段个数。 + */ + + }, { + key: "getJenks", + value: function getJenks(array, segNum) { + return this.getInstance(array).getClassJenks(segNum); + } + /** + * @function ArrayStatistic.getSqrtInterval + * @description 平方根分段法。 + * @param {Array} array 需要进行平方根分段的参数。 + * @param {number} segNum 分段个数。 + */ + + }, { + key: "getSqrtInterval", + value: function getSqrtInterval(array, segNum) { + array = array.map(function (value) { + return Math.sqrt(value); + }); + var breaks = this.getInstance(array).getClassEqInterval(segNum); + return breaks.map(function (value) { + return value * value; + }); + } + /** + * @function ArrayStatistic.getGeometricProgression + * @description 对数分段法。 + * @param {Array} array 需要进行对数分段的参数。 + * @param {number} segNum 分段个数。 + */ + + }, { + key: "getGeometricProgression", + value: function getGeometricProgression(array, segNum) { + return this.getInstance(array).getClassGeometricProgression(segNum); + } + }]); + + return ArrayStatistic; +}(); +;// CONCATENATED MODULE: ./src/common/util/MapCalculateUtil.js + +/** + * @function getMeterPerMapUnit + * @description 单位换算,把米|度|千米|英寸|英尺换成米。 + * @category BaseTypes Util + * @param {string} mapUnit 地图单位。 + * @returns {number} 返回地图的距离单位。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { getMeterPerMapUnit } from '{npm}'; + * + * const result = getMeterPerMapUnit(mapUnit); + * ``` + */ + +var getMeterPerMapUnit = function getMeterPerMapUnit(mapUnit) { + var earchRadiusInMeters = 6378137; + var meterPerMapUnit; + + if (mapUnit === Unit.METER) { + meterPerMapUnit = 1; + } else if (mapUnit === Unit.DEGREE) { + // 每度表示多少米。 + meterPerMapUnit = Math.PI * 2 * earchRadiusInMeters / 360; + } else if (mapUnit === Unit.KILOMETER) { + meterPerMapUnit = 1.0e-3; + } else if (mapUnit === Unit.INCH) { + meterPerMapUnit = 1 / 2.5399999918e-2; + } else if (mapUnit === Unit.FOOT) { + meterPerMapUnit = 0.3048; + } else { + return meterPerMapUnit; + } + + return meterPerMapUnit; +}; +/** + * @function getWrapNum + * @description 获取该坐标系的经纬度范围的经度或纬度。 + * @category BaseTypes Util + * @param {number} x 经度或纬度。 + * @param {boolean} includeMax 是否获取经度或纬度的最大值。 + * @param {boolean} includeMin 是否获取经度或纬度的最小值。 + * @param {number} range 坐标系的经纬度范围。 + * @returns {number} 返回经度或纬度的值。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { getWrapNum } from '{npm}'; + * + * const result = getWrapNum(x, includeMax, includeMin, range); + * ``` + */ + +function getWrapNum(x) { + var includeMax = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var includeMin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + var range = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [-180, 180]; + var max = range[1], + min = range[0], + d = max - min; + + if (x === max && includeMax) { + return x; + } + + if (x === min && includeMin) { + return x; + } + + var tmp = ((x - min) % d + d) % d; + + if (tmp === 0 && includeMax) { + return max; + } + + return ((x - min) % d + d) % d + min; +} +/** + * @function conversionDegree + * @description 转换经纬度。 + * @category BaseTypes Util + * @param {number} degrees 经度或纬度。 + * @returns {string} 返回度分秒。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { conversionDegree } from '{npm}'; + * + * const result = conversionDegree(degrees); + * ``` + */ + +function conversionDegree(degrees) { + var degree = parseInt(degrees); + var fraction = parseInt((degrees - degree) * 60); + var second = parseInt(((degrees - degree) * 60 - fraction) * 60); + fraction = parseInt(fraction / 10) === 0 ? "0".concat(fraction) : fraction; + second = parseInt(second / 10) === 0 ? "0".concat(second) : second; + return "".concat(degree, "\xB0").concat(fraction, "'").concat(second); +} +;// CONCATENATED MODULE: ./src/common/util/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +// EXTERNAL MODULE: ./node_modules/lodash.topairs/index.js +var lodash_topairs = __webpack_require__(820); +var lodash_topairs_default = /*#__PURE__*/__webpack_require__.n(lodash_topairs); +;// CONCATENATED MODULE: ./src/common/style/CartoCSS.js +function CartoCSS_typeof(obj) { "@babel/helpers - typeof"; return CartoCSS_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, CartoCSS_typeof(obj); } + +function CartoCSS_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CartoCSS_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CartoCSS_createClass(Constructor, protoProps, staticProps) { if (protoProps) CartoCSS_defineProperties(Constructor.prototype, protoProps); if (staticProps) CartoCSS_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CartoCSS + * @deprecatedclass SuperMap.CartoCSS + * @classdesc CartoCSS 解析类,其主要功能为将 CartoCSS 字符串解析为 CartoCSS 的 shader 属性风格对象。 + * @category BaseTypes Style + * @param {string} cartoStr - 样式表字符串 + * @example + * var cartocss = "@provinceLineColor:#ddd; + * #China_Provinces_L___China400{ + * line-dasharray:10,10; + * line-color:@provinceLineColor; + * line-width:1; + * }"; + * new CartoCSS(cartocss); + * @usage + */ + +/*eslint no-useless-escape: "off"*/ + +var CartoCSS = /*#__PURE__*/function () { + function CartoCSS(cartoStr) { + CartoCSS_classCallCheck(this, CartoCSS); + + this.env = null; + /** + * @member CartoCSS.prototype.parser + * @description 解析器 + */ + + this.parser = null; + /** + * @member CartoCSS.prototype.ruleSet + * @description CartoCSS 规则对象 + */ + + this.ruleSet = null; + /** + * @member CartoCSS.prototype.cartoStr + * @description CartoCSS 样式表字符串 + */ + + this.cartoStr = ""; + /** + * @member CartoCSS.prototype.shaders + * @description Carto 着色器集 + */ + + this.shaders = null; + + if (typeof cartoStr === "string") { + this.cartoStr = cartoStr; + this.env = { + frames: [], + errors: [], + error: function error(obj) { + this.errors.push(obj); + } + }; + this.parser = this.getParser(this.env); + this.parse(cartoStr); + this.shaders = this.toShaders(); + } + } + /** + * @function CartoCSS.prototype.getParser + * @description 获取 CartoCSS 解析器 + */ + + + CartoCSS_createClass(CartoCSS, [{ + key: "getParser", + value: function getParser(env) { + var input, // LeSS input string + i, // current index in `input` + j, // current chunk + temp, // temporarily holds a chunk's state, for backtracking + memo, // temporarily holds `i`, when backtracking + furthest, // furthest index the parser has gone to + chunks, // chunkified input + current, // index of current chunk, in `input` + parser; + var that = this; // This function is called after all files + // have been imported through `@import`. + + var finish = function finish() {//NOSONAR + //所有文件导入完成之后调用 + }; + + function save() { + temp = chunks[j]; + memo = i; + current = i; + } + + function restore() { + chunks[j] = temp; + i = memo; + current = i; + } + + function sync() { + if (i > current) { + chunks[j] = chunks[j].slice(i - current); + current = i; + } + } // + // Parse from a token, regexp or string, and move forward if match + // + + + function _match(tok) { + var match, length, c, endIndex; // Non-terminal + + if (tok instanceof Function) { + return tok.call(parser.parsers); // Terminal + // Either match a single character in the input, + // or match a regexp in the current chunk (chunk[j]). + } else if (typeof tok === 'string') { + match = input.charAt(i) === tok ? tok : null; + length = 1; + sync(); + } else { + sync(); + match = tok.exec(chunks[j]); + + if (match) { + length = match[0].length; + } else { + return null; + } + } // The match is confirmed, add the match length to `i`, + // and consume any extra white-space characters (' ' || '\n') + // which come after that. The reason for this is that LeSS's + // grammar is mostly white-space insensitive. + + + if (match) { + var mem = i += length; + endIndex = i + chunks[j].length - length; + + while (i < endIndex) { + c = input.charCodeAt(i); + + if (!(c === 32 || c === 10 || c === 9)) { + break; + } + + i++; + } + + chunks[j] = chunks[j].slice(length + (i - mem)); + current = i; + + if (chunks[j].length === 0 && j < chunks.length - 1) { + j++; + } + + if (typeof match === 'string') { + return match; + } else { + return match.length === 1 ? match[0] : match; + } + } + } // Same as _match(), but don't change the state of the parser, + // just return the match. + + + function peek(tok) { + if (typeof tok === 'string') { + return input.charAt(i) === tok; + } else { + return !!tok.test(chunks[j]); + } + } // Make an error object from a passed set of properties. + // Accepted properties: + // - `message`: Text of the error message. + // - `filename`: Filename where the error occurred. + // - `index`: Char. index where the error occurred. + + + function makeError(err) { + var einput; + var defautls = { + index: furthest, + filename: env.filename, + message: 'Parse error.', + line: 0, + column: -1 + }; + + for (var prop in defautls) { + if (err[prop] === 0) { + err[prop] = defautls[prop]; + } + } + + if (err.filename && that.env.inputs && that.env.inputs[err.filename]) { + einput = that.env.inputs[err.filename]; + } else { + einput = input; + } + + err.line = (einput.slice(0, err.index).match(/\n/g) || '').length + 1; + + for (var n = err.index; n >= 0 && einput.charAt(n) !== '\n'; n--) { + err.column++; + } + + return new Error([err.filename, err.line, err.column, err.message].join(";")); + } + + this.env = env = env || {}; + this.env.filename = this.env.filename || null; + this.env.inputs = this.env.inputs || {}; // The Parser + + parser = { + // Parse an input string into an abstract syntax tree. + // Throws an error on parse errors. + parse: function parse(str) { + var root, + error = null; + i = j = current = furthest = 0; + chunks = []; + input = str.replace(/\r\n/g, '\n'); + + if (env.filename) { + that.env.inputs[env.filename] = input; + } // Split the input into chunks. + + + chunks = function (chunks) { + var j = 0, + skip = /(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g, + comment = /\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g, + string = /"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g, + level = 0, + match, + chunk = chunks[0], + inParam; + + for (var i = 0, c, cc; i < input.length;) { + skip.lastIndex = i; + + if (match = skip.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + } + } + + c = input.charAt(i); + comment.lastIndex = string.lastIndex = i; + + if (match = string.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + continue; + } + } + + if (!inParam && c === '/') { + cc = input.charAt(i + 1); + + if (cc === '/' || cc === '*') { + if (match = comment.exec(input)) { + if (match.index === i) { + i += match[0].length; + chunk.push(match[0]); + continue; + } + } + } + } + + switch (c) { + case '{': + //NOSONAR + if (!inParam) { + level++; + chunk.push(c); + break; + } + + case '}': + //NOSONAR + if (!inParam) { + level--; + chunk.push(c); + chunks[++j] = chunk = []; + break; + } + + case '(': + //NOSONAR + if (!inParam) { + inParam = true; + chunk.push(c); + break; + } + + case ')': + //NOSONAR + if (inParam) { + inParam = false; + chunk.push(c); + break; + } + + default: + chunk.push(c); + break; + } + + i++; + } + + if (level !== 0) { + error = { + index: i - 1, + type: 'Parse', + message: level > 0 ? "missing closing `}`" : "missing opening `{`" + }; + } + + return chunks.map(function (c) { + return c.join(''); + }); + }([[]]); + + if (error) { + throw makeError(error); + } // Sort rules by specificity: this function expects selectors to be + // split already. + // + // Written to be used as a .sort(Function); + // argument. + // + // [1, 0, 0, 467] > [0, 0, 1, 520] + + + var specificitySort = function specificitySort(a, b) { + var as = a.specificity; + var bs = b.specificity; + + if (as[0] != bs[0]) { + return bs[0] - as[0]; + } + + if (as[1] != bs[1]) { + return bs[1] - as[1]; + } + + if (as[2] != bs[2]) { + return bs[2] - as[2]; + } + + return bs[3] - as[3]; + }; // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. + + + root = new CartoCSS.Tree.Ruleset([], _match(this.parsers.primary)); + root.root = true; // Get an array of Ruleset objects, flattened + // and sorted according to specificitySort + + root.toList = function () { + return function (env) { + env.error = function (e) { + if (!env.errors) { + env.errors = new Error(''); + } + + if (env.errors.message) { + env.errors.message += '\n' + makeError(e).message; + } else { + env.errors.message = makeError(e).message; + } + }; + + env.frames = env.frames || []; // call populates Invalid-caused errors + + var definitions = this.flatten([], [], env); + definitions.sort(specificitySort); + return definitions; + }; + }(); + + return root; + }, + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Rule -> Value -> Expression -> Entity + // + // In general, most rules will try to parse a token with the `_match()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + parsers: { + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | rule)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + primary: function primary() { + var node, + root = []; + + while ((node = _match(this.rule) || _match(this.ruleset) || _match(this.comment)) || _match(/^[\s\n]+/) || (node = _match(this.invalid))) { + if (node) { + root.push(node); + } + } + + return root; + }, + invalid: function invalid() { + var chunk = _match(/^[^;\n]*[;\n]/); // To fail gracefully, match everything until a semicolon or linebreak. + + + if (chunk) { + return new CartoCSS.Tree.Invalid(chunk, memo); + } + }, + // We create a Comment node for CSS comments `/* */`, + // but keep the LeSS comments `//` silent, by just skipping + // over them. + comment: function comment() { + var comment; + + if (input.charAt(i) !== '/') { + return; + } + + if (input.charAt(i + 1) === '/') { + return new CartoCSS.Tree.Comment(_match(/^\/\/.*/), true); + } else if (comment = _match(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/)) { + return new CartoCSS.Tree.Comment(comment); + } + }, + // Entities are tokens which can be found inside an Expression + entities: { + // A string, which supports escaping " and ' "milky way" 'he\'s the one!' + quoted: function quoted() { + if (input.charAt(i) !== '"' && input.charAt(i) !== "'") { + return; + } + + var str = _match(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/); + + if (str) { + return new CartoCSS.Tree.Quoted(str[1] || str[2]); + } + }, + // A reference to a Mapnik field, like [NAME] + // Behind the scenes, this has the same representation, but Carto + // needs to be careful to warn when unsupported operations are used. + field: function field() { + var l = '[', + r = ']'; + + if (!_match(l)) { + return; + } + + var field_name = _match(/(^[^\]]+)/); + + if (!_match(r)) { + return; + } + + if (field_name) { + return new CartoCSS.Tree.Field(field_name[1]); + } + }, + // This is a comparison operator + comparison: function comparison() { + var str = _match(/^=~|=|!=|<=|>=|<|>/); + + if (str) { + return str; + } + }, + // A catch-all word, such as: hard-light + // These can start with either a letter or a dash (-), + // and then contain numbers, underscores, and letters. + keyword: function keyword() { + var k = _match(/^[A-Za-z\u4e00-\u9fa5-]+[A-Za-z-0-9\u4e00-\u9fa5_]*/); + + if (k) { + return new CartoCSS.Tree.Keyword(k); + } + }, + // A function call like rgb(255, 0, 255) + // The arguments are parsed with the `entities.arguments` parser. + call: function call() { + var name, args; + + if (!(name = /^([\w\-]+|%)\(/.exec(chunks[j]))) { + return; + } + + name = name[1]; + + if (name === 'url') { + // url() is handled by the url parser instead + return null; + } else { + i += name.length; + } + + var l = '(', + r = ')'; + + _match(l); // Parse the '(' and consume whitespace. + + + args = _match(this.entities['arguments']); + + if (!_match(r)) { + return; + } + + if (name) { + return new CartoCSS.Tree.Call(name, args, i); + } + }, + // Arguments are comma-separated expressions + 'arguments': function _arguments() { + var args = [], + arg; + + while (arg = _match(this.expression)) { + args.push(arg); + var q = ','; + + if (!_match(q)) { + break; + } + } + + return args; + }, + literal: function literal() { + return _match(this.entities.dimension) || _match(this.entities.keywordcolor) || _match(this.entities.hexcolor) || _match(this.entities.quoted); + }, + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + url: function url() { + var value; + + if (input.charAt(i) !== 'u' || !_match(/^url\(/)) { + return; + } + + value = _match(this.entities.quoted) || _match(this.entities.variable) || _match(/^[\-\w%@_match\/.&=:;#+?~]+/) || ''; + var r = ')'; + + if (!_match(r)) { + return new CartoCSS.Tree.Invalid(value, memo, 'Missing closing ) in URL.'); + } else { + return new CartoCSS.Tree.URL(typeof value.value !== 'undefined' || value instanceof CartoCSS.Tree.Variable ? value : new CartoCSS.Tree.Quoted(value)); + } + }, + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + variable: function variable() { + var name, + index = i; + + if (input.charAt(i) === '@' && (name = _match(/^@[\w-]+/))) { + return new CartoCSS.Tree.Variable(name, index, env.filename); + } + }, + hexcolor: function hexcolor() { + var rgb; + + if (input.charAt(i) === '#' && (rgb = _match(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/))) { + return new CartoCSS.Tree.Color(rgb[1]); + } + }, + keywordcolor: function keywordcolor() { + var rgb = chunks[j].match(/^[a-z]+/); + + if (rgb && rgb[0] in CartoCSS.Tree.Reference.data.colors) { + return new CartoCSS.Tree.Color(CartoCSS.Tree.Reference.data.colors[_match(/^[a-z]+/)]); + } + }, + // A Dimension, that is, a number and a unit. The only + // unit that has an effect is % + dimension: function dimension() { + var c = input.charCodeAt(i); + + if (c > 57 || c < 45 || c === 47) { + return; + } + + var value = _match(/^(-?\d*\.?\d+(?:[eE][-+]?\d+)?)(\%|\w+)?/); + + if (value) { + return new CartoCSS.Tree.Dimension(value[1], value[2], memo); + } + } + }, + // The variable part of a variable definition. + // Used in the `rule` parser. Like @fink: + variable: function variable() { + var name; + + if (input.charAt(i) === '@' && (name = _match(/^(@[\w-]+)\s*:/))) { + return name[1]; + } + }, + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + entity: function entity() { + var property1 = _match(this.entities.call) || _match(this.entities.literal); + + var property2 = _match(this.entities.field) || _match(this.entities.variable); + + var property3 = _match(this.entities.url) || _match(this.entities.keyword); + + return property1 || property2 || property3; + }, + // A Rule terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was ommitted. + end: function end() { + var q = ';'; + return _match(q) || peek('}'); + }, + // Elements are the building blocks for Selectors. They consist of + // an element name, such as a tag a class, or `*`. + //增加对中文的支持,[\u4e00-\u9fa5] + element: function element() { + var e = _match(/^(?:[.#][\w\u4e00-\u9fa5\-]+|\*|Map)/); + + if (e) { + return new CartoCSS.Tree.Element(e); + } + }, + // Attachments allow adding multiple lines, polygons etc. to an + // object. There can only be one attachment per selector. + attachment: function attachment() { + var s = _match(/^::([\w\-]+(?:\/[\w\-]+)*)/); + + if (s) { + return s[1]; + } + }, + // Selectors are made out of one or more Elements, see above. + selector: function selector() { + var a, + attachment, + e, + elements = [], + f, + filters = new CartoCSS.Tree.Filterset(), + z, + zooms = [], + segments = 0, + conditions = 0; + + while ((e = _match(this.element)) || (z = _match(this.zoom)) || (f = _match(this.filter)) || (a = _match(this.attachment))) { + segments++; + + if (e) { + elements.push(e); + } else if (z) { + zooms.push(z); + conditions++; + } else if (f) { + var err = filters.add(f); + + if (err) { + throw makeError({ + message: err, + index: i - 1 + }); + } + + conditions++; + } else if (attachment) { + throw makeError({ + message: 'Encountered second attachment name.', + index: i - 1 + }); + } else { + attachment = a; + } + + var c = input.charAt(i); + + if (c === '{' || c === '}' || c === ';' || c === ',') { + break; + } + } + + if (segments) { + return new CartoCSS.Tree.Selector(filters, zooms, elements, attachment, conditions, memo); + } + }, + filter: function filter() { + save(); + var key, + op, + val, + l = '[', + r = ']'; + + if (!_match(l)) { + return; + } + + if (key = _match(/^[a-zA-Z0-9\-_]+/) || _match(this.entities.quoted) || _match(this.entities.variable) || _match(this.entities.keyword) || _match(this.entities.field)) { + if (key instanceof CartoCSS.Tree.Quoted) { + key = new CartoCSS.Tree.Field(key.toString()); + } + + if ((op = _match(this.entities.comparison)) && (val = _match(this.entities.quoted) || _match(this.entities.variable) || _match(this.entities.dimension) || _match(this.entities.keyword) || _match(this.entities.field))) { + if (!_match(r)) { + throw makeError({ + message: 'Missing closing ] of filter.', + index: memo - 1 + }); + } + + if (!key.is) { + key = new CartoCSS.Tree.Field(key); + } + + return new CartoCSS.Tree.Filter(key, op, val, memo, env.filename); + } + } + }, + zoom: function zoom() { + save(); + var op, + val, + r = ']'; + + if (_match(/^\[\s*zoom/g) && (op = _match(this.entities.comparison)) && (val = _match(this.entities.variable) || _match(this.entities.dimension)) && _match(r)) { + return new CartoCSS.Tree.Zoom(op, val, memo); + } else { + // backtrack + restore(); + } + }, + // The `block` rule is used by `ruleset` + // It's a wrapper around the `primary` rule, with added `{}`. + block: function block() { + var content, + l = '{', + r = '}'; + + if (_match(l) && (content = _match(this.primary)) && _match(r)) { + return content; + } + }, + // div, .class, body > p {...} + ruleset: function ruleset() { + var selectors = [], + s, + rules, + q = ','; + save(); + + while (s = _match(this.selector)) { + selectors.push(s); + + while (_match(this.comment)) {//NOSONAR + } + + if (!_match(q)) { + break; + } + + while (_match(this.comment)) {//NOSONAR + } + } + + if (s) { + while (_match(this.comment)) {//NOSONAR + } + } + + if (selectors.length > 0 && (rules = _match(this.block))) { + if (selectors.length === 1 && selectors[0].elements.length && selectors[0].elements[0].value === 'Map') { + var rs = new CartoCSS.Tree.Ruleset(selectors, rules); + rs.isMap = true; + return rs; + } + + return new CartoCSS.Tree.Ruleset(selectors, rules); + } else { + // Backtrack + restore(); + } + }, + rule: function rule() { + var name, + value, + c = input.charAt(i); + save(); + + if (c === '.' || c === '#') { + return; + } + + if (name = _match(this.variable) || _match(this.property)) { + value = _match(this.value); + + if (value && _match(this.end)) { + return new CartoCSS.Tree.Rule(name, value, memo, env.filename); + } else { + furthest = i; + restore(); + } + } + }, + font: function font() { + var value = [], + expression = [], + e, + q = ','; + + while (e = _match(this.entity)) { + expression.push(e); + } + + value.push(new CartoCSS.Tree.Expression(expression)); + + if (_match(q)) { + while (e = _match(this.expression)) { + value.push(e); + + if (!_match(q)) { + break; + } + } + } + + return new CartoCSS.Tree.Value(value); + }, + // A Value is a comma-delimited list of Expressions + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + value: function value() { + var e, + expressions = [], + q = ','; + + while (e = _match(this.expression)) { + expressions.push(e); + + if (!_match(q)) { + break; + } + } + + if (expressions.length > 1) { + return new CartoCSS.Tree.Value(expressions.map(function (e) { + return e.value[0]; + })); + } else if (expressions.length === 1) { + return new CartoCSS.Tree.Value(expressions); + } + }, + // A sub-expression, contained by parenthensis + sub: function sub() { + var e, + l = '(', + r = ")"; + + if (_match(l) && (e = _match(this.expression)) && _match(r)) { + return e; + } + }, + // This is a misnomer because it actually handles multiplication + // and division. + multiplication: function multiplication() { + var m, + a, + op, + operation, + q = '/'; + + if (m = _match(this.operand)) { + while ((op = _match(q) || _match('*') || _match('%')) && (a = _match(this.operand))) { + operation = new CartoCSS.Tree.Operation(op, [operation || m, a], memo); + } + + return operation || m; + } + }, + addition: function addition() { + var m, + a, + op, + operation, + plus = '+'; + + if (m = _match(this.multiplication)) { + while ((op = _match(/^[-+]\s+/) || input.charAt(i - 1) != ' ' && (_match(plus) || _match('-'))) && (a = _match(this.multiplication))) { + operation = new CartoCSS.Tree.Operation(op, [operation || m, a], memo); + } + + return operation || m; + } + }, + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + operand: function operand() { + return _match(this.sub) || _match(this.entity); + }, + // Expressions either represent mathematical operations, + // or white-space delimited Entities. @var * 2 + expression: function expression() { + var e, + entities = []; + + while (e = _match(this.addition) || _match(this.entity)) { + entities.push(e); + } + + if (entities.length > 0) { + return new CartoCSS.Tree.Expression(entities); + } + }, + property: function property() { + var name = _match(/^(([a-z][-a-z_0-9]*\/)?\*?-?[-a-z_0-9]+)\s*:/); + + if (name) { + return name[1]; + } + } + } + }; + return parser; + } + /** + * @function CartoCSS.prototype.parse + * @description 利用CartoCSS解析器里面的parse方法,将CartoCSS样式表字符串转化为CartoCSS规则集 + * @returns {Object} CartoCSS规则集 + */ + + }, { + key: "parse", + value: function parse(str) { + var parser = this.parser; + var ruleSet = this.ruleSet = parser.parse(str); + return ruleSet; + } + /** + * @function CartoCSS.prototype.toShaders + * @description 将CartoCSS规则集转化为着色器 + * @returns {Array} CartoCSS着色器集 + */ + + }, { + key: "toShaders", + value: function toShaders() { + if (this.ruleSet) { + var ruleset = this.ruleSet; + + if (ruleset) { + var defs = ruleset.toList(this.env); + defs.reverse(); + var shaders = {}; + var keys = []; + + this._toShaders(shaders, keys, defs); + + var ordered_shaders = []; + var done = {}; + + for (var i = 0, len0 = defs.length; i < len0; ++i) { + var def = defs[i]; + var k = def.attachment; + var shader = shaders[keys[i]]; + var shaderArray = []; + + if (!done[k]) { + var j = 0; + + for (var prop in shader) { + if (prop !== 'zoom' && prop !== 'frames' && prop !== "attachment" && prop != "elements") { + //对layer-index作特殊处理以实现图层的控制 + if (prop === "layer-index") { + /*var getLayerIndex = Function("attributes", "zoom", "var _value = null;" + shader[prop].join('\n') + "; return _value; ");*/ + var getLayerIndex = function getLayerIndex(attributes, zoom) { + //NOSONAR + var _value = null; + shader[prop].join('\n'); + return _value; + }; + + var layerIndex = getLayerIndex(); + Object.defineProperty(shaderArray, "layerIndex", { + configurable: true, + enumerable: false, + value: layerIndex + }); + } else { + shaderArray[j++] = function (ops, shaderArray) { + //NOSONAR + if (!Array.isArray(ops)) { + return ops; + } + + var body = ops.join('\n'); + var myKeyword = 'attributes["FEATUREID"]&&attributes["FEATUREID"]'; + var index = body.indexOf(myKeyword); + + if (index >= 0) { + //对featureID作一些特殊处理,以将featureID提取出来 + if (!shaderArray.featureFilter) { + var featureFilterStart = index + myKeyword.length; + var featureFilterEnd = body.indexOf(")", featureFilterStart + 1); + var featureFilterStr = "featureId&&(featureId" + body.substring(featureFilterStart, featureFilterEnd) + ")"; + /*var featureFilter = Function("featureId", "if(" + featureFilterStr + "){return true;}return false;");*/ + + var featureFilter = function featureFilter(featureId) { + if (featureFilterStr) { + return true; + } + + return false; + }; + + Object.defineProperty(shaderArray, "featureFilter", { + configurable: true, + enumerable: false, + value: featureFilter + }); + } + + return { + "property": prop, + "getValue": Function("attributes", "zoom", "seftFilter", "var _value = null; var isExcute=typeof seftFilter=='function'?sefgFilter():seftFilter;if(isExcute){" + body + ";} return _value; ") //NOSONAR + + }; + } else { + return { + "property": prop, + "getValue": Function("attributes", "zoom", "var _value = null;" + body + "; return _value; ") //NOSONAR + + }; + } + }(shader[prop], shaderArray); + } + } + } + + Object.defineProperty(shaderArray, "attachment", { + configurable: true, + enumerable: false, + value: k + }); + Object.defineProperty(shaderArray, "elements", { + configurable: true, + enumerable: false, + value: def.elements + }); + ordered_shaders.push(shaderArray); + done[keys[i]] = true; + } + + Object.defineProperty(shaderArray, "zoom", { + configurable: true, + enumerable: false, + value: def.zoom + }); //shader.frames.push(def.frame_offset); + } + + return ordered_shaders; + } + } + + return null; + } + }, { + key: "_toShaders", + value: function _toShaders(shaders, keys, defs) { + for (var i = 0, len0 = defs.length; i < len0; ++i) { + var def = defs[i]; + var element_str = []; + + for (var j = 0, len1 = def.elements.length; j < len1; j++) { + element_str.push(def.elements[j]); + } + + var filters = def.filters.filters; + var filterStr = []; + + for (var attr in filters) { + filterStr.push(filters[attr].id); + } + + var key = element_str.join("/") + "::" + def.attachment + "_" + filterStr.join("_"); + keys.push(key); + var shader = shaders[key] = shaders[key] || {}; //shader.frames = []; + + shader.zoom = CartoCSS.Tree.Zoom.all; + var props = def.toJS(this.env); + + for (var v in props) { + (shader[v] = shader[v] || []).push(props[v].join('\n')); + } + } + } + /** + * @function CartoCSS.prototype.getShaders + * @description 获取CartoCSS着色器 + * @returns {Array} 着色器集 + * @example + * //shaders的结构大概如下: + * var shaders=[ + * { + * attachment:"one", + * elements:[], + * zoom:23, + * length:2, + * 0:{property:"line-color",value:function(attribute,zoom){var _value=null;if(zoom){_value="#123456"}return _vlaue;}}, + * 1:{preoperty:"line-width",value:function(attribute,zoom){var _value=null;if(zoom){_value=3}return _vlaue;}} + * }, + * { + * attachment:"two", + * elements:[], + * zoom:23, + * length:2, + * 0:{property:"polygon-color",value:function(attribute,zoom){var _value=null;if(zoom){_value="#123456"}return _vlaue;}}, + * 1:{property:"line-width",value:function(attribute,zoom){var _value=null;if(zoom){_value=3}return _vlaue;}} + * } + * ]; + */ + + }, { + key: "getShaders", + value: function getShaders() { + return this.shaders; + } + /** + * @function CartoCSS.prototype.destroy + * @description CartoCSS解析对象的析构函数,用于销毁CartoCSS解析对象 + */ + + }, { + key: "destroy", + value: function destroy() { + this.cartoStr = null; + this.env = null; + this.ruleSet = null; + this.parser = null; + this.shaders = null; + } + }]); + + return CartoCSS; +}(); +var _mapnik_reference_latest = { + "version": "2.1.1", + "style": { + "filter-mode": { + "type": ["all", "first"], + "doc": "Control the processing behavior of Rule filters within a Style. If 'all' is used then all Rules are processed sequentially independent of whether any previous filters matched. If 'first' is used then it means processing ends after the first match (a positive filter evaluation) and no further Rules in the Style are processed ('first' is usually the default for CSS implementations on top of Mapnik to simplify translation from CSS to Mapnik XML)", + "default-value": "all", + "default-meaning": "All Rules in a Style are processed whether they have filters or not and whether or not the filter conditions evaluate to true." + }, + "image-filters": { + "css": "image-filters", + "default-value": "none", + "default-meaning": "no filters", + "type": "functions", + "functions": [["agg-stack-blur", 2], ["emboss", 0], ["blur", 0], ["gray", 0], ["sobel", 0], ["edge-detect", 0], ["x-gradient", 0], ["y-gradient", 0], ["invert", 0], ["sharpen", 0]], + "doc": "A list of image filters." + }, + "comp-op": { + "css": "comp-op", + "default-value": "src-over", + "default-meaning": "add the current layer on top of other layers", + "doc": "Composite operation. This defines how this layer should behave relative to layers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + }, + "opacity": { + "css": "opacity", + "type": "float", + "doc": "An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)", + "default-value": 1, + "default-meaning": "no separate buffer will be used and no alpha will be applied to the style after rendering" + } + }, + "layer": { + "name": { + "default-value": "", + "type": "string", + "required": true, + "default-meaning": "No layer name has been provided", + "doc": "The name of a layer. Can be anything you wish and is not strictly validated, but ideally unique in the map" + }, + "srs": { + "default-value": "", + "type": "string", + "default-meaning": "No srs value is provided and the value will be inherited from the Map's srs", + "doc": "The spatial reference system definition for the layer, aka the projection. Can either be a proj4 literal string like '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' or, if the proper proj4 epsg/nad/etc identifier files are installed, a string that uses an id like: '+init=epsg:4326'" + }, + "status": { + "default-value": true, + "type": "boolean", + "default-meaning": "This layer will be marked as active and available for processing", + "doc": "A property that can be set to false to disable this layer from being processed" + }, + "minzoom": { + "default-value": "0", + "type": "float", + "default-meaning": "The layer will be visible at the minimum possible scale", + "doc": "The minimum scale denominator that this layer will be visible at. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6" + }, + "maxzoom": { + "default-value": "1.79769e+308", + "type": "float", + "default-meaning": "The layer will be visible at the maximum possible scale", + "doc": "The maximum scale denominator that this layer will be visible at. The default is the numeric limit of the C++ double type, which may vary slightly by system, but is likely a massive number like 1.79769e+308 and ensures that this layer will always be visible unless the value is reduced. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6" + }, + "queryable": { + "default-value": false, + "type": "boolean", + "default-meaning": "The layer will not be available for the direct querying of data values", + "doc": "This property was added for GetFeatureInfo/WMS compatibility and is rarely used. It is off by default meaning that in a WMS context the layer will not be able to be queried unless the property is explicitly set to true" + }, + "clear-label-cache": { + "default-value": false, + "type": "boolean", + "default-meaning": "The renderer's collision detector cache (used for avoiding duplicate labels and overlapping markers) will not be cleared immediately before processing this layer", + "doc": "This property, by default off, can be enabled to allow a user to clear the collision detector cache before a given layer is processed. This may be desirable to ensure that a given layers data shows up on the map even if it normally would not because of collisions with previously rendered labels or markers" + }, + "group-by": { + "default-value": "", + "type": "string", + "default-meaning": "No special layer grouping will be used during rendering", + "doc": "https://github.com/mapnik/mapnik/wiki/Grouped-rendering" + }, + "buffer-size": { + "default-value": "0", + "type": "float", + "default-meaning": "No buffer will be used", + "doc": "Extra tolerance around the Layer extent (in pixels) used to when querying and (potentially) clipping the layer data during rendering" + }, + "maximum-extent": { + "default-value": "none", + "type": "bbox", + "default-meaning": "No clipping extent will be used", + "doc": "An extent to be used to limit the bounds used to query this specific layer data during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Layer." + } + }, + "symbolizers": { + "*": { + "image-filters": { + "css": "image-filters", + "default-value": "none", + "default-meaning": "no filters", + "type": "functions", + "functions": [["agg-stack-blur", 2], ["emboss", 0], ["blur", 0], ["gray", 0], ["sobel", 0], ["edge-detect", 0], ["x-gradient", 0], ["y-gradient", 0], ["invert", 0], ["sharpen", 0]], + "doc": "A list of image filters." + }, + "comp-op": { + "css": "comp-op", + "default-value": "src-over", + "default-meaning": "add the current layer on top of other layers", + "doc": "Composite operation. This defines how this layer should behave relative to layers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + }, + "opacity": { + "css": "opacity", + "type": "float", + "doc": "An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)", + "default-value": 1, + "default-meaning": "no separate buffer will be used and no alpha will be applied to the style after rendering" + } + }, + "map": { + "background-color": { + "css": "background-color", + "default-value": "none", + "default-meaning": "transparent", + "type": "color", + "doc": "Map Background color" + }, + "background-image": { + "css": "background-image", + "type": "uri", + "default-value": "", + "default-meaning": "transparent", + "doc": "An image that is repeated below all features on a map as a background.", + "description": "Map Background image" + }, + "srs": { + "css": "srs", + "type": "string", + "default-value": "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs", + "default-meaning": "The proj4 literal of EPSG:4326 is assumed to be the Map's spatial reference and all data from layers within this map will be plotted using this coordinate system. If any layers do not declare an srs value then they will be assumed to be in the same srs as the Map and not transformations will be needed to plot them in the Map's coordinate space", + "doc": "Map spatial reference (proj4 string)" + }, + "buffer-size": { + "css": "buffer-size", + "default-value": "0", + "type": "float", + "default-meaning": "No buffer will be used", + "doc": "Extra tolerance around the map (in pixels) used to ensure labels crossing tile boundaries are equally rendered in each tile (e.g. cut in each tile). Not intended to be used in combination with \"avoid-edges\"." + }, + "maximum-extent": { + "css": "", + "default-value": "none", + "type": "bbox", + "default-meaning": "No clipping extent will be used", + "doc": "An extent to be used to limit the bounds used to query all layers during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Map." + }, + "base": { + "css": "base", + "default-value": "", + "default-meaning": "This base path defaults to an empty string meaning that any relative paths to files referenced in styles or layers will be interpreted relative to the application process.", + "type": "string", + "doc": "Any relative paths used to reference files will be understood as relative to this directory path if the map is loaded from an in memory object rather than from the filesystem. If the map is loaded from the filesystem and this option is not provided it will be set to the directory of the stylesheet." + }, + "paths-from-xml": { + "css": "", + "default-value": true, + "default-meaning": "Paths read from XML will be interpreted from the location of the XML", + "type": "boolean", + "doc": "value to control whether paths in the XML will be interpreted from the location of the XML or from the working directory of the program that calls load_map()" + }, + "minimum-version": { + "css": "", + "default-value": "none", + "default-meaning": "Mapnik version will not be detected and no error will be thrown about compatibility", + "type": "string", + "doc": "The minumum Mapnik version (e.g. 0.7.2) needed to use certain functionality in the stylesheet" + }, + "font-directory": { + "css": "font-directory", + "type": "uri", + "default-value": "none", + "default-meaning": "No map-specific fonts will be registered", + "doc": "Path to a directory which holds fonts which should be registered when the Map is loaded (in addition to any fonts that may be automatically registered)." + } + }, + "polygon": { + "fill": { + "css": "polygon-fill", + "type": "color", + "default-value": "rgba(128,128,128,1)", + "default-meaning": "gray and fully opaque (alpha = 1), same as rgb(128,128,128)", + "doc": "Fill color to assign to a polygon" + }, + "fill-opacity": { + "css": "polygon-opacity", + "type": "float", + "doc": "The opacity of the polygon", + "default-value": 1, + "default-meaning": "opaque" + }, + "gamma": { + "css": "polygon-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of polygon edges" + }, + "gamma-method": { + "css": "polygon-gamma-method", + "type": ["power", "linear", "none", "threshold", "multiply"], + "default-value": "power", + "default-meaning": "pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA", + "doc": "An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h" + }, + "clip": { + "css": "polygon-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "polygon-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "polygon-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]] + }, + "comp-op": { + "css": "polygon-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "line": { + "stroke": { + "css": "line-color", + "default-value": "rgba(0,0,0,1)", + "type": "color", + "default-meaning": "black and fully opaque (alpha = 1), same as rgb(0,0,0)", + "doc": "The color of a drawn line" + }, + "stroke-width": { + "css": "line-width", + "default-value": 1, + "type": "float", + "doc": "The width of a line in pixels" + }, + "stroke-opacity": { + "css": "line-opacity", + "default-value": 1, + "type": "float", + "default-meaning": "opaque", + "doc": "The opacity of a line" + }, + "stroke-linejoin": { + "css": "line-join", + "default-value": "miter", + "type": ["miter", "round", "bevel"], + "doc": "The behavior of lines when joining" + }, + "stroke-linecap": { + "css": "line-cap", + "default-value": "butt", + "type": ["butt", "round", "square"], + "doc": "The display of line endings" + }, + "stroke-gamma": { + "css": "line-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of stroke line" + }, + "stroke-gamma-method": { + "css": "line-gamma-method", + "type": ["power", "linear", "none", "threshold", "multiply"], + "default-value": "power", + "default-meaning": "pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA", + "doc": "An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h" + }, + "stroke-dasharray": { + "css": "line-dasharray", + "type": "numbers", + "doc": "A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.", + "default-value": "none", + "default-meaning": "solid line" + }, + "stroke-dashoffset": { + "css": "line-dash-offset", + "type": "numbers", + "doc": "valid parameter but not currently used in renderers (only exists for experimental svg support in Mapnik which is not yet enabled)", + "default-value": "none", + "default-meaning": "solid line" + }, + "stroke-miterlimit": { + "css": "line-miterlimit", + "type": "float", + "doc": "The limit on the ratio of the miter length to the stroke-width. Used to automatically convert miter joins to bevel joins for sharp angles to avoid the miter extending beyond the thickness of the stroking path. Normally will not need to be set, but a larger value can sometimes help avoid jaggy artifacts.", + "default-value": 4.0, + "default-meaning": "Will auto-convert miters to bevel line joins when theta is less than 29 degrees as per the SVG spec: 'miterLength / stroke-width = 1 / sin ( theta / 2 )'" + }, + "clip": { + "css": "line-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "line-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "offset": { + "css": "line-offset", + "type": "float", + "default-value": 0, + "default-meaning": "no offset", + "doc": "Offsets a line a number of pixels parallel to its actual path. Postive values move the line left, negative values move it right (relative to the directionality of the line)." + }, + "rasterizer": { + "css": "line-rasterizer", + "type": ["full", "fast"], + "default-value": "full", + "doc": "Exposes an alternate AGG rendering method that sacrifices some accuracy for speed." + }, + "geometry-transform": { + "css": "line-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]] + }, + "comp-op": { + "css": "line-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "markers": { + "file": { + "css": "marker-file", + "doc": "An SVG file that this marker shows at each placement. If no file is given, the marker will show an ellipse.", + "default-value": "", + "default-meaning": "An ellipse or circle, if width equals height", + "type": "uri" + }, + "opacity": { + "css": "marker-opacity", + "doc": "The overall opacity of the marker, if set, overrides both the opacity of both the fill and stroke", + "default-value": 1, + "default-meaning": "The stroke-opacity and fill-opacity will be used", + "type": "float" + }, + "fill-opacity": { + "css": "marker-fill-opacity", + "doc": "The fill opacity of the marker", + "default-value": 1, + "default-meaning": "opaque", + "type": "float" + }, + "stroke": { + "css": "marker-line-color", + "doc": "The color of the stroke around a marker shape.", + "default-value": "black", + "type": "color" + }, + "stroke-width": { + "css": "marker-line-width", + "doc": "The width of the stroke around a marker shape, in pixels. This is positioned on the boundary, so high values can cover the area itself.", + "type": "float" + }, + "stroke-opacity": { + "css": "marker-line-opacity", + "default-value": 1, + "default-meaning": "opaque", + "doc": "The opacity of a line", + "type": "float" + }, + "placement": { + "css": "marker-placement", + "type": ["point", "line", "interior"], + "default-value": "point", + "default-meaning": "Place markers at the center point (centroid) of the geometry", + "doc": "Attempt to place markers on a point, in the center of a polygon, or if markers-placement:line, then multiple times along a line. 'interior' placement can be used to ensure that points placed on polygons are forced to be inside the polygon interior" + }, + "multi-policy": { + "css": "marker-multi-policy", + "type": ["each", "whole", "largest"], + "default-value": "each", + "default-meaning": "If a feature contains multiple geometries and the placement type is either point or interior then a marker will be rendered for each", + "doc": "A special setting to allow the user to control rendering behavior for 'multi-geometries' (when a feature contains multiple geometries). This setting does not apply to markers placed along lines. The 'each' policy is default and means all geometries will get a marker. The 'whole' policy means that the aggregate centroid between all geometries will be used. The 'largest' policy means that only the largest (by bounding box areas) feature will get a rendered marker (this is how text labeling behaves by default)." + }, + "marker-type": { + "css": "marker-type", + "type": ["arrow", "ellipse"], + "default-value": "ellipse", + "doc": "The default marker-type. If a SVG file is not given as the marker-file parameter, the renderer provides either an arrow or an ellipse (a circle if height is equal to width)" + }, + "width": { + "css": "marker-width", + "default-value": 10, + "doc": "The width of the marker, if using one of the default types.", + "type": "expression" + }, + "height": { + "css": "marker-height", + "default-value": 10, + "doc": "The height of the marker, if using one of the default types.", + "type": "expression" + }, + "fill": { + "css": "marker-fill", + "default-value": "blue", + "doc": "The color of the area of the marker.", + "type": "color" + }, + "allow-overlap": { + "css": "marker-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping markers are shown or hidden.", + "default-meaning": "Do not allow makers to overlap with each other - overlapping markers will not be shown." + }, + "ignore-placement": { + "css": "marker-ignore-placement", + "type": "boolean", + "default-value": false, + "default-meaning": "do not store the bbox of this geometry in the collision detector cache", + "doc": "value to control whether the placement of the feature will prevent the placement of other features" + }, + "spacing": { + "css": "marker-spacing", + "doc": "Space between repeated labels", + "default-value": 100, + "type": "float" + }, + "max-error": { + "css": "marker-max-error", + "type": "float", + "default-value": 0.2, + "doc": "The maximum difference between actual marker placement and the marker-spacing parameter. Setting a high value can allow the renderer to try to resolve placement conflicts with other symbolizers." + }, + "transform": { + "css": "marker-transform", + "type": "functions", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]], + "default-value": "", + "default-meaning": "No transformation", + "doc": "SVG transformation definition" + }, + "clip": { + "css": "marker-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "marker-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "marker-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]] + }, + "comp-op": { + "css": "marker-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "shield": { + "name": { + "css": "shield-name", + "type": "expression", + "serialization": "content", + "doc": "Value to use for a shield\"s text label. Data columns are specified using brackets like [column_name]" + }, + "file": { + "css": "shield-file", + "required": true, + "type": "uri", + "default-value": "none", + "doc": "Image file to render behind the shield text" + }, + "face-name": { + "css": "shield-face-name", + "type": "string", + "validate": "font", + "doc": "Font name and style to use for the shield text", + "default-value": "", + "required": true + }, + "unlock-image": { + "css": "shield-unlock-image", + "type": "boolean", + "doc": "This parameter should be set to true if you are trying to position text beside rather than on top of the shield image", + "default-value": false, + "default-meaning": "text alignment relative to the shield image uses the center of the image as the anchor for text positioning." + }, + "size": { + "css": "shield-size", + "type": "float", + "doc": "The size of the shield text in pixels" + }, + "fill": { + "css": "shield-fill", + "type": "color", + "doc": "The color of the shield text" + }, + "placement": { + "css": "shield-placement", + "type": ["point", "line", "vertex", "interior"], + "default-value": "point", + "doc": "How this shield should be placed. Point placement attempts to place it on top of points, line places along lines multiple times per feature, vertex places on the vertexes of polygons, and interior attempts to place inside of polygons." + }, + "avoid-edges": { + "css": "shield-avoid-edges", + "doc": "Tell positioning algorithm to avoid labeling near intersection edges.", + "type": "boolean", + "default-value": false + }, + "allow-overlap": { + "css": "shield-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping shields are shown or hidden.", + "default-meaning": "Do not allow shields to overlap with other map elements already placed." + }, + "minimum-distance": { + "css": "shield-min-distance", + "type": "float", + "default-value": 0, + "doc": "Minimum distance to the next shield symbol, not necessarily the same shield." + }, + "spacing": { + "css": "shield-spacing", + "type": "float", + "default-value": 0, + "doc": "The spacing between repeated occurrences of the same shield on a line" + }, + "minimum-padding": { + "css": "shield-min-padding", + "default-value": 0, + "doc": "Determines the minimum amount of padding that a shield gets relative to other shields", + "type": "float" + }, + "wrap-width": { + "css": "shield-wrap-width", + "type": "unsigned", + "default-value": 0, + "doc": "Length of a chunk of text in characters before wrapping text" + }, + "wrap-before": { + "css": "shield-wrap-before", + "type": "boolean", + "default-value": false, + "doc": "Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width." + }, + "wrap-character": { + "css": "shield-wrap-character", + "type": "string", + "default-value": " ", + "doc": "Use this character instead of a space to wrap long names." + }, + "halo-fill": { + "css": "shield-halo-fill", + "type": "color", + "default-value": "#FFFFFF", + "default-meaning": "white", + "doc": "Specifies the color of the halo around the text." + }, + "halo-radius": { + "css": "shield-halo-radius", + "doc": "Specify the radius of the halo in pixels", + "default-value": 0, + "default-meaning": "no halo", + "type": "float" + }, + "character-spacing": { + "css": "shield-character-spacing", + "type": "unsigned", + "default-value": 0, + "doc": "Horizontal spacing between characters (in pixels). Currently works for point placement only, not line placement." + }, + "line-spacing": { + "css": "shield-line-spacing", + "doc": "Vertical spacing between lines of multiline labels (in pixels)", + "type": "unsigned" + }, + "dx": { + "css": "shield-text-dx", + "type": "float", + "doc": "Displace text within shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "dy": { + "css": "shield-text-dy", + "type": "float", + "doc": "Displace text within shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "shield-dx": { + "css": "shield-dx", + "type": "float", + "doc": "Displace shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "shield-dy": { + "css": "shield-dy", + "type": "float", + "doc": "Displace shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "opacity": { + "css": "shield-opacity", + "type": "float", + "doc": "(Default 1.0) - opacity of the image used for the shield", + "default-value": 1 + }, + "text-opacity": { + "css": "shield-text-opacity", + "type": "float", + "doc": "(Default 1.0) - opacity of the text placed on top of the shield", + "default-value": 1 + }, + "horizontal-alignment": { + "css": "shield-horizontal-alignment", + "type": ["left", "middle", "right", "auto"], + "doc": "The shield's horizontal alignment from its centerpoint", + "default-value": "auto" + }, + "vertical-alignment": { + "css": "shield-vertical-alignment", + "type": ["top", "middle", "bottom", "auto"], + "doc": "The shield's vertical alignment from its centerpoint", + "default-value": "middle" + }, + "text-transform": { + "css": "shield-text-transform", + "type": ["none", "uppercase", "lowercase", "capitalize"], + "doc": "Transform the case of the characters", + "default-value": "none" + }, + "justify-alignment": { + "css": "shield-justify-alignment", + "type": ["left", "center", "right", "auto"], + "doc": "Define how text in a shield's label is justified", + "default-value": "auto" + }, + "clip": { + "css": "shield-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "comp-op": { + "css": "shield-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "line-pattern": { + "file": { + "css": "line-pattern-file", + "type": "uri", + "default-value": "none", + "required": true, + "doc": "An image file to be repeated and warped along a line" + }, + "clip": { + "css": "line-pattern-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "line-pattern-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "line-pattern-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]] + }, + "comp-op": { + "css": "line-pattern-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "polygon-pattern": { + "file": { + "css": "polygon-pattern-file", + "type": "uri", + "default-value": "none", + "required": true, + "doc": "Image to use as a repeated pattern fill within a polygon" + }, + "alignment": { + "css": "polygon-pattern-alignment", + "type": ["local", "global"], + "default-value": "local", + "doc": "Specify whether to align pattern fills to the layer or to the map." + }, + "gamma": { + "css": "polygon-pattern-gamma", + "type": "float", + "default-value": 1, + "default-meaning": "fully antialiased", + "range": "0-1", + "doc": "Level of antialiasing of polygon pattern edges" + }, + "opacity": { + "css": "polygon-pattern-opacity", + "type": "float", + "doc": "(Default 1.0) - Apply an opacity level to the image used for the pattern", + "default-value": 1, + "default-meaning": "The image is rendered without modifications" + }, + "clip": { + "css": "polygon-pattern-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "smooth": { + "css": "polygon-pattern-smooth", + "type": "float", + "default-value": 0, + "default-meaning": "no smoothing", + "range": "0-1", + "doc": "Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries." + }, + "geometry-transform": { + "css": "polygon-pattern-geometry-transform", + "type": "functions", + "default-value": "none", + "default-meaning": "geometry will not be transformed", + "doc": "Allows transformation functions to be applied to the geometry.", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]] + }, + "comp-op": { + "css": "polygon-pattern-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "raster": { + "opacity": { + "css": "raster-opacity", + "default-value": 1, + "default-meaning": "opaque", + "type": "float", + "doc": "The opacity of the raster symbolizer on top of other symbolizers." + }, + "filter-factor": { + "css": "raster-filter-factor", + "default-value": -1, + "default-meaning": "Allow the datasource to choose appropriate downscaling.", + "type": "float", + "doc": "This is used by the Raster or Gdal datasources to pre-downscale images using overviews. Higher numbers can sometimes cause much better scaled image output, at the cost of speed." + }, + "scaling": { + "css": "raster-scaling", + "type": ["near", "fast", "bilinear", "bilinear8", "bicubic", "spline16", "spline36", "hanning", "hamming", "hermite", "kaiser", "quadric", "catrom", "gaussian", "bessel", "mitchell", "sinc", "lanczos", "blackman"], + "default-value": "near", + "doc": "The scaling algorithm used to making different resolution versions of this raster layer. Bilinear is a good compromise between speed and accuracy, while lanczos gives the highest quality." + }, + "mesh-size": { + "css": "raster-mesh-size", + "default-value": 16, + "default-meaning": "Reprojection mesh will be 1/16 of the resolution of the source image", + "type": "unsigned", + "doc": "A reduced resolution mesh is used for raster reprojection, and the total image size is divided by the mesh-size to determine the quality of that mesh. Values for mesh-size larger than the default will result in faster reprojection but might lead to distortion." + }, + "comp-op": { + "css": "raster-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "point": { + "file": { + "css": "point-file", + "type": "uri", + "required": false, + "default-value": "none", + "doc": "Image file to represent a point" + }, + "allow-overlap": { + "css": "point-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping points are shown or hidden.", + "default-meaning": "Do not allow points to overlap with each other - overlapping markers will not be shown." + }, + "ignore-placement": { + "css": "point-ignore-placement", + "type": "boolean", + "default-value": false, + "default-meaning": "do not store the bbox of this geometry in the collision detector cache", + "doc": "value to control whether the placement of the feature will prevent the placement of other features" + }, + "opacity": { + "css": "point-opacity", + "type": "float", + "default-value": 1.0, + "default-meaning": "Fully opaque", + "doc": "A value from 0 to 1 to control the opacity of the point" + }, + "placement": { + "css": "point-placement", + "type": ["centroid", "interior"], + "doc": "How this point should be placed. Centroid calculates the geometric center of a polygon, which can be outside of it, while interior always places inside of a polygon.", + "default-value": "centroid" + }, + "transform": { + "css": "point-transform", + "type": "functions", + "functions": [["matrix", 6], ["translate", 2], ["scale", 2], ["rotate", 3], ["skewX", 1], ["skewY", 1]], + "default-value": "", + "default-meaning": "No transformation", + "doc": "SVG transformation definition" + }, + "comp-op": { + "css": "point-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "text": { + "name": { + "css": "text-name", + "type": "expression", + "required": true, + "default-value": "", + "serialization": "content", + "doc": "Value to use for a text label. Data columns are specified using brackets like [column_name]" + }, + "face-name": { + "css": "text-face-name", + "type": "string", + "validate": "font", + "doc": "Font name and style to render a label in", + "required": true + }, + "size": { + "css": "text-size", + "type": "float", + "default-value": 10, + "doc": "Text size in pixels" + }, + "text-ratio": { + "css": "text-ratio", + "doc": "Define the amount of text (of the total) present on successive lines when wrapping occurs", + "default-value": 0, + "type": "unsigned" + }, + "wrap-width": { + "css": "text-wrap-width", + "doc": "Length of a chunk of text in characters before wrapping text", + "default-value": 0, + "type": "unsigned" + }, + "wrap-before": { + "css": "text-wrap-before", + "type": "boolean", + "default-value": false, + "doc": "Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width." + }, + "wrap-character": { + "css": "text-wrap-character", + "type": "string", + "default-value": " ", + "doc": "Use this character instead of a space to wrap long text." + }, + "spacing": { + "css": "text-spacing", + "type": "unsigned", + "doc": "Distance between repeated text labels on a line (aka. label-spacing)" + }, + "character-spacing": { + "css": "text-character-spacing", + "type": "float", + "default-value": 0, + "doc": "Horizontal spacing adjustment between characters in pixels" + }, + "line-spacing": { + "css": "text-line-spacing", + "default-value": 0, + "type": "unsigned", + "doc": "Vertical spacing adjustment between lines in pixels" + }, + "label-position-tolerance": { + "css": "text-label-position-tolerance", + "default-value": 0, + "type": "unsigned", + "doc": "Allows the label to be displaced from its ideal position by a number of pixels (only works with placement:line)" + }, + "max-char-angle-delta": { + "css": "text-max-char-angle-delta", + "type": "float", + "default-value": "22.5", + "doc": "The maximum angle change, in degrees, allowed between adjacent characters in a label. This value internally is converted to radians to the default is 22.5*math.pi/180.0. The higher the value the fewer labels will be placed around around sharp corners." + }, + "fill": { + "css": "text-fill", + "doc": "Specifies the color for the text", + "default-value": "#000000", + "type": "color" + }, + "opacity": { + "css": "text-opacity", + "doc": "A number from 0 to 1 specifying the opacity for the text", + "default-value": 1.0, + "default-meaning": "Fully opaque", + "type": "float" + }, + "halo-fill": { + "css": "text-halo-fill", + "type": "color", + "default-value": "#FFFFFF", + "default-meaning": "white", + "doc": "Specifies the color of the halo around the text." + }, + "halo-radius": { + "css": "text-halo-radius", + "doc": "Specify the radius of the halo in pixels", + "default-value": 0, + "default-meaning": "no halo", + "type": "float" + }, + "dx": { + "css": "text-dx", + "type": "float", + "doc": "Displace text by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right", + "default-value": 0 + }, + "dy": { + "css": "text-dy", + "type": "float", + "doc": "Displace text by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down", + "default-value": 0 + }, + "vertical-alignment": { + "css": "text-vertical-alignment", + "type": ["top", "middle", "bottom", "auto"], + "doc": "Position of label relative to point position.", + "default-value": "auto", + "default-meaning": "Default affected by value of dy; \"bottom\" for dy>0, \"top\" for dy<0." + }, + "avoid-edges": { + "css": "text-avoid-edges", + "doc": "Tell positioning algorithm to avoid labeling near intersection edges.", + "default-value": false, + "type": "boolean" + }, + "minimum-distance": { + "css": "text-min-distance", + "doc": "Minimum permitted distance to the next text symbolizer.", + "type": "float" + }, + "minimum-padding": { + "css": "text-min-padding", + "doc": "Determines the minimum amount of padding that a text symbolizer gets relative to other text", + "type": "float" + }, + "minimum-path-length": { + "css": "text-min-path-length", + "type": "float", + "default-value": 0, + "default-meaning": "place labels on all paths", + "doc": "Place labels only on paths longer than this value." + }, + "allow-overlap": { + "css": "text-allow-overlap", + "type": "boolean", + "default-value": false, + "doc": "Control whether overlapping text is shown or hidden.", + "default-meaning": "Do not allow text to overlap with other text - overlapping markers will not be shown." + }, + "orientation": { + "css": "text-orientation", + "type": "expression", + "doc": "Rotate the text." + }, + "placement": { + "css": "text-placement", + "type": ["point", "line", "vertex", "interior"], + "default-value": "point", + "doc": "Control the style of placement of a point versus the geometry it is attached to." + }, + "placement-type": { + "css": "text-placement-type", + "doc": "Re-position and/or re-size text to avoid overlaps. \"simple\" for basic algorithm (using text-placements string,) \"dummy\" to turn this feature off.", + "type": ["dummy", "simple"], + "default-value": "dummy" + }, + "placements": { + "css": "text-placements", + "type": "string", + "default-value": "", + "doc": "If \"placement-type\" is set to \"simple\", use this \"POSITIONS,[SIZES]\" string. An example is `text-placements: \"E,NE,SE,W,NW,SW\";` " + }, + "text-transform": { + "css": "text-transform", + "type": ["none", "uppercase", "lowercase", "capitalize"], + "doc": "Transform the case of the characters", + "default-value": "none" + }, + "horizontal-alignment": { + "css": "text-horizontal-alignment", + "type": ["left", "middle", "right", "auto"], + "doc": "The text's horizontal alignment from its centerpoint", + "default-value": "auto" + }, + "justify-alignment": { + "css": "text-align", + "type": ["left", "right", "center", "auto"], + "doc": "Define how text is justified", + "default-value": "auto", + "default-meaning": "Auto alignment means that text will be centered by default except when using the `placement-type` parameter - in that case either right or left justification will be used automatically depending on where the text could be fit given the `text-placements` directives" + }, + "clip": { + "css": "text-clip", + "type": "boolean", + "default-value": true, + "default-meaning": "geometry will be clipped to map bounds before rendering", + "doc": "geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts." + }, + "comp-op": { + "css": "text-comp-op", + "default-value": "src-over", + "default-meaning": "add the current symbolizer on top of other symbolizer", + "doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.", + "type": ["clear", "src", "dst", "src-over", "dst-over", "src-in", "dst-in", "src-out", "dst-out", "src-atop", "dst-atop", "xor", "plus", "minus", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "contrast", "invert", "invert-rgb", "grain-merge", "grain-extract", "hue", "saturation", "color", "value"] + } + }, + "building": { + "fill": { + "css": "building-fill", + "default-value": "#FFFFFF", + "doc": "The color of the buildings walls.", + "type": "color" + }, + "fill-opacity": { + "css": "building-fill-opacity", + "type": "float", + "doc": "The opacity of the building as a whole, including all walls.", + "default-value": 1 + }, + "height": { + "css": "building-height", + "doc": "The height of the building in pixels.", + "type": "expression", + "default-value": "0" + } + } + }, + "colors": { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "grey": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50], + "transparent": [0, 0, 0, 0] + }, + "filter": { + "value": ["true", "false", "null", "point", "linestring", "polygon", "collection"] + } +}; +CartoCSS['mapnik_reference'] = { + version: { + latest: _mapnik_reference_latest, + '2.1.1': _mapnik_reference_latest + } +}; +CartoCSS.Tree = {}; + +CartoCSS.Tree.operate = function (op, a, b) { + switch (op) { + case '+': + return a + b; + + case '-': + return a - b; + + case '*': + return a * b; + + case '%': + return a % b; + + case '/': + return a / b; + } +}; + +CartoCSS.Tree.functions = { + rgb: function rgb(r, g, b) { + return this.rgba(r, g, b, 1.0); + }, + rgba: function rgba(r, g, b, a) { + var me = this; + var rgb = [r, g, b].map(function (c) { + return me.number(c); + }); + a = me.number(a); + + if (rgb.some(isNaN) || isNaN(a)) { + return null; + } + + return new CartoCSS.Tree.Color(rgb, a); + }, + // Only require val + stop: function stop(val) { + var color, mode; + + if (arguments.length > 1) { + color = arguments[1]; + } + + if (arguments.length > 2) { + mode = arguments[2]; + } + + return { + is: 'tag', + val: val, + color: color, + mode: mode, + toString: function toString(env) { + return '\n\t'; + } + }; + }, + hsl: function hsl(h, s, l) { + return this.hsla(h, s, l, 1.0); + }, + hsla: function hsla(h, s, l, a) { + h = this.number(h) % 360 / 360; + s = this.number(s); + l = this.number(l); + a = this.number(a); + + if ([h, s, l, a].some(isNaN)) { + return null; + } + + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s, + m1 = l * 2 - m2; + return this.rgba(hue(h + 1 / 3) * 255, hue(h) * 255, hue(h - 1 / 3) * 255, a); + + function hue(h) { + h = h < 0 ? h + 1 : h > 1 ? h - 1 : h; + + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } else if (h * 2 < 1) { + return m2; + } else if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } else { + return m1; + } + } + }, + hue: function hue(color) { + if (!('toHSL' in color)) { + return null; + } + + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().h)); + }, + saturation: function saturation(color) { + if (!('toHSL' in color)) { + return null; + } + + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().s * 100), '%'); + }, + lightness: function lightness(color) { + if (!('toHSL' in color)) { + return null; + } + + return new CartoCSS.Tree.Dimension(Math.round(color.toHSL().l * 100), '%'); + }, + alpha: function alpha(color) { + if (!('toHSL' in color)) { + return null; + } + + return new CartoCSS.Tree.Dimension(color.toHSL().a); + }, + saturate: function saturate(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.s += amount.value / 100; + hsl.s = this.clamp(hsl.s); + return this.hsla_simple(hsl); + }, + desaturate: function desaturate(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.s -= amount.value / 100; + hsl.s = this.clamp(hsl.s); + return this.hsla_simple(hsl); + }, + lighten: function lighten(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.l += amount.value / 100; + hsl.l = this.clamp(hsl.l); + return this.hsla_simple(hsl); + }, + darken: function darken(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.l -= amount.value / 100; + hsl.l = this.clamp(hsl.l); + return this.hsla_simple(hsl); + }, + fadein: function fadein(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.a += amount.value / 100; + hsl.a = this.clamp(hsl.a); + return this.hsla_simple(hsl); + }, + fadeout: function fadeout(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + hsl.a -= amount.value / 100; + hsl.a = this.clamp(hsl.a); + return this.hsla_simple(hsl); + }, + spin: function spin(color, amount) { + if (!('toHSL' in color)) { + return null; + } + + var hsl = color.toHSL(); + var hue = (hsl.h + amount.value) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return this.hsla_simple(hsl); + }, + replace: function replace(entity, a, b) { + if (entity.is === 'field') { + return entity.toString + '.replace(' + a.toString() + ', ' + b.toString() + ')'; + } else { + return entity.replace(a, b); + } + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function mix(color1, color2, weight) { + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = color1.toHSL().a - color2.toHSL().a; + var w1 = ((w * a == -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, color1.rgb[1] * w1 + color2.rgb[1] * w2, color1.rgb[2] * w1 + color2.rgb[2] * w2]; + var alpha = color1.alpha * p + color2.alpha * (1 - p); + return new CartoCSS.Tree.Color(rgb, alpha); + }, + greyscale: function greyscale(color) { + return this.desaturate(color, new CartoCSS.Tree.Dimension(100)); + }, + '%': function _(quoted + /* arg, arg, ...*/ + ) { + var args = Array.prototype.slice.call(arguments, 1), + str = quoted.value; + + for (var i = 0; i < args.length; i++) { + str = str.replace(/%s/, args[i].value).replace(/%[da]/, args[i].toString()); + } + + str = str.replace(/%%/g, '%'); + return new CartoCSS.Tree.Quoted(str); + }, + hsla_simple: function hsla_simple(h) { + return this.hsla(h.h, h.s, h.l, h.a); + }, + number: function number(n) { + if (n instanceof CartoCSS.Tree.Dimension) { + return parseFloat(n.unit === '%' ? n.value / 100 : n.value); + } else if (typeof n === 'number') { + return n; + } else { + return NaN; + } + }, + clamp: function clamp(val) { + return Math.min(1, Math.max(0, val)); + } +}; + +CartoCSS.Tree.Call = /*#__PURE__*/function () { + function Call(name, args, index) { + CartoCSS_classCallCheck(this, Call); + + this.is = 'call'; + this.name = name; + this.args = args; + this.index = index; + } // When evuating a function call, + // we either find the function in `tree.functions` [1], + // in which case we call it, passing the evaluated arguments, + // or we simply print it out as it appeared originally [2]. + // The *functions.js* file contains the built-in functions. + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + + + CartoCSS_createClass(Call, [{ + key: 'ev', + value: function ev(env) { + var args = this.args.map(function (a) { + return a.ev(env); + }); + + for (var i = 0; i < args.length; i++) { + if (args[i].is === 'undefined') { + return { + is: 'undefined', + value: 'undefined' + }; + } + } + + if (this.name in CartoCSS.Tree.functions) { + if (CartoCSS.Tree.functions[this.name].length <= args.length) { + var val = CartoCSS.Tree.functions[this.name].apply(CartoCSS.Tree.functions, args); + + if (val === null) { + env.error({ + message: 'incorrect arguments given to ' + this.name + '()', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + return val; + } else { + env.error({ + message: 'incorrect number of arguments for ' + this.name + '(). ' + CartoCSS.Tree.functions[this.name].length + ' expected.', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + } else { + var fn = CartoCSS.Tree.Reference.mapnikFunctions[this.name]; + + if (fn === undefined) { + var functions = lodash_topairs_default()(CartoCSS.Tree.Reference.mapnikFunctions); // cheap closest, needs improvement. + + var name = this.name; + var mean = functions.map(function (f) { + return [f[0], CartoCSS.Tree.Reference.editDistance(name, f[0]), f[1]]; + }).sort(function (a, b) { + return a[1] - b[1]; + }); + env.error({ + message: 'unknown function ' + this.name + '(), did you mean ' + mean[0][0] + '(' + mean[0][2] + ')', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + if (fn !== args.length && // support variable-arg functions like `colorize-alpha` + fn !== -1) { + env.error({ + message: 'function ' + this.name + '() takes ' + fn + ' arguments and was given ' + args.length, + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } else { + // Save the evaluated versions of arguments + this.args = args; + return this; + } + } + } + }, { + key: "toString", + value: function toString(env, format) { + if (this.args.length) { + return this.name + '(' + this.args.join(',') + ')'; + } else { + return this.name; + } + } + }]); + + return Call; +}(); + +CartoCSS.Tree.Color = /*#__PURE__*/function () { + function Color(rgb, a) { + CartoCSS_classCallCheck(this, Color); + + this.is = 'color'; // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + + if (Array.isArray(rgb)) { + this.rgb = rgb.slice(0, 3); + } else if (rgb.length == 6) { + this.rgb = rgb.match(/.{2}/g).map(function (c) { + return parseInt(c, 16); + }); + } else { + this.rgb = rgb.split('').map(function (c) { + return parseInt(c + c, 16); + }); + } + + if (typeof a === 'number') { + this.alpha = a; + } else if (rgb.length === 4) { + this.alpha = rgb[3]; + } else { + this.alpha = 1; + } + } + + CartoCSS_createClass(Color, [{ + key: 'ev', + value: function ev() { + return this; + } // If we have some transparency, the only way to represent it + // is via `rgba`. Otherwise, we use the hex representation, + // which has better compatibility with older browsers. + // Values are capped between `0` and `255`, rounded and zero-padded. + + }, { + key: "toString", + value: function toString() { + /* if (this.alpha < 1.0) {*/ + return 'rgba(' + this.rgb.map(function (c) { + return Math.round(c); + }).concat(this.alpha).join(', ') + ')'; + /*} else { + return '#' + this.rgb.map(function(i) { + i = Math.round(i); + i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16); + return i.length === 1 ? '0' + i : i; + }).join(''); + }*/ + } // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + + }, { + key: "operate", + value: function operate(env, op, other) { + var result = []; + + if (!(other instanceof CartoCSS.Tree.Color)) { + other = other.toColor(); + } + + for (var c = 0; c < 3; c++) { + result[c] = CartoCSS.Tree.operate(op, this.rgb[c], other.rgb[c]); + } + + return new CartoCSS.Tree.Color(result); + } + }, { + key: "toHSL", + value: function toHSL() { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, + s, + l = (max + min) / 2, + d = max - min; + + if (max === min) { + h = s = 0; + } else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + + case g: + h = (b - r) / d + 2; + break; + + case b: + h = (r - g) / d + 4; + break; + + default: + break; + } + + h /= 6; + } + + return { + h: h * 360, + s: s, + l: l, + a: a + }; + } + }]); + + return Color; +}(); + +CartoCSS.Tree.Comment = /*#__PURE__*/function () { + function Comment(value, silent) { + CartoCSS_classCallCheck(this, Comment); + + this.value = value; + this.silent = !!silent; + } + + CartoCSS_createClass(Comment, [{ + key: "toString", + value: function toString(env) { + return ''; + } + }, { + key: 'ev', + value: function ev() { + return this; + } + }]); + + return Comment; +}(); + +CartoCSS.Tree.Definition = /*#__PURE__*/function () { + function Definition(selector, rules) { + CartoCSS_classCallCheck(this, Definition); + + this.elements = selector.elements; //assert.ok(selector.filters instanceof CartoCSS.Tree.Filterset); + + this.rules = rules; + this.ruleIndex = {}; + + for (var i = 0; i < this.rules.length; i++) { + if ('zoom' in this.rules[i]) { + this.rules[i] = this.rules[i].clone(); + } + + this.rules[i].zoom = selector.zoom; + this.ruleIndex[this.rules[i].updateID()] = true; + } + + this.filters = selector.filters; + this.zoom = selector.zoom; + this.attachment = selector.attachment || '__default__'; + this.specificity = selector.specificity(); + } + + CartoCSS_createClass(Definition, [{ + key: "toString", + value: function toString() { + var str = this.filters.toString(); + + for (var i = 0; i < this.rules.length; i++) { + str += '\n ' + this.rules[i]; + } + + return str; + } + }, { + key: "toJS", + value: function toJS(env) { + var shaderAttrs = {}; // merge conditions from filters with zoom condition of the + // definition + + var zoom = this.zoom; //var frame_offset = this.frame_offset; + + var _if = this.filters.toJS(env); + + var filters = [zoom]; + + if (_if) { + filters.push(_if); + } //if(frame_offset) filters.push('ctx["frame-offset"] === ' + frame_offset); + + + _if = filters.join(" && "); + + function eachRule(rule) { + if (rule instanceof CartoCSS.Tree.Rule) { + shaderAttrs[rule.name] = shaderAttrs[rule.name] || []; + + if (_if) { + shaderAttrs[rule.name].push("if(" + _if + "){" + rule.value.toJS(env) + "}"); + } else { + shaderAttrs[rule.name].push(rule.value.toJS(env)); + } + } else { + if (rule instanceof CartoCSS.Tree.Ruleset) { + var sh = rule.toJS(env); + + for (var v in sh) { + shaderAttrs[v] = shaderAttrs[v] || []; + + for (var attr in sh[v]) { + shaderAttrs[v].push(sh[v][attr]); + } + } + } + } + } + + for (var id in this.rules) { + eachRule(this.rules[id]); + } + + return shaderAttrs; + } + }]); + + return Definition; +}(); + +CartoCSS.Tree.Dimension = /*#__PURE__*/function () { + function Dimension(value, unit, index) { + CartoCSS_classCallCheck(this, Dimension); + + this.is = 'float'; + this.physical_units = ['m', 'cm', 'in', 'mm', 'pt', 'pc']; + this.screen_units = ['px', '%']; + this.all_units = ['m', 'cm', 'in', 'mm', 'pt', 'pc', 'px', '%']; + this.densities = { + m: 0.0254, + mm: 25.4, + cm: 2.54, + pt: 72, + pc: 6 + }; + this.value = parseFloat(value); + this.unit = unit || null; + this.index = index; + } + + CartoCSS_createClass(Dimension, [{ + key: "ev", + value: function ev(env) { + if (this.unit && this.all_units.indexOf(this.unit) < 0) { + env.error({ + message: "Invalid unit: '" + this.unit + "'", + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } // normalize units which are not px or % + + + if (this.unit && this.physical_units.indexOf(this.unit) >= 0) { + if (!env.ppi) { + env.error({ + message: "ppi is not set, so metric units can't be used", + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } // convert all units to inch + // convert inch to px using ppi + + + this.value = this.value / this.densities[this.unit] * env.ppi; + this.unit = 'px'; + } + + return this; + } + }, { + key: "toColor", + value: function toColor() { + return new CartoCSS.Tree.Color([this.value, this.value, this.value]); + } + }, { + key: "round", + value: function round() { + this.value = Math.round(this.value); + return this; + } + }, { + key: "toString", + value: function toString() { + return this.value.toString(); + } + }, { + key: "operate", + value: function operate(env, op, other) { + if (this.unit === '%' && other.unit !== '%') { + env.error({ + message: 'If two operands differ, the first must not be %', + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + if (this.unit !== '%' && other.unit === '%') { + if (op === '*' || op === '/' || op === '%') { + env.error({ + message: 'Percent values can only be added or subtracted from other values', + index: this.index + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + return new CartoCSS.Tree.Dimension(CartoCSS.Tree.operate(op, this.value, this.value * other.value * 0.01), this.unit); + } //here the operands are either the same (% or undefined or px), or one is undefined and the other is px + + + return new CartoCSS.Tree.Dimension(CartoCSS.Tree.operate(op, this.value, other.value), this.unit || other.unit); + } + }]); + + return Dimension; +}(); + +CartoCSS.Tree.Element = /*#__PURE__*/function () { + function Element(value) { + CartoCSS_classCallCheck(this, Element); + + this.value = value.trim(); + + if (this.value[0] === '#') { + this.type = 'id'; + this.clean = this.value.replace(/^#/, ''); + } + + if (this.value[0] === '.') { + this.type = 'class'; + this.clean = this.value.replace(/^\./, ''); + } + + if (this.value.indexOf('*') !== -1) { + this.type = 'wildcard'; + } + } + + CartoCSS_createClass(Element, [{ + key: "specificity", + value: function specificity() { + return [this.type === 'id' ? 1 : 0, // a + this.type === 'class' ? 1 : 0 // b + ]; + } + }, { + key: "toString", + value: function toString() { + return this.value; + } + }]); + + return Element; +}(); + +CartoCSS.Tree.Expression = /*#__PURE__*/function () { + function Expression(value) { + CartoCSS_classCallCheck(this, Expression); + + this.is = 'expression'; + this.value = value; + } + + CartoCSS_createClass(Expression, [{ + key: "ev", + value: function ev(env) { + if (this.value.length > 1) { + return new CartoCSS.Tree.Expression(this.value.map(function (e) { + return e.ev(env); + })); + } else { + return this.value[0].ev(env); + } + } + }, { + key: "toString", + value: function toString(env) { + return this.value.map(function (e) { + return e.toString(env); + }).join(' '); + } + }]); + + return Expression; +}(); + +CartoCSS.Tree.Field = /*#__PURE__*/function () { + function Field(content) { + CartoCSS_classCallCheck(this, Field); + + this.is = 'field'; + this.value = content || ''; + } + + CartoCSS_createClass(Field, [{ + key: "toString", + value: function toString() { + return '["' + this.value.toUpperCase() + '"]'; + } + }, { + key: 'ev', + value: function ev() { + return this; + } + }]); + + return Field; +}(); + +CartoCSS.Tree.Filter = /*#__PURE__*/function () { + function Filter(key, op, val, index, filename) { + CartoCSS_classCallCheck(this, Filter); + + this.ops = { + '<': [' < ', 'numeric'], + '>': [' > ', 'numeric'], + '=': [' = ', 'both'], + '!=': [' != ', 'both'], + '<=': [' <= ', 'numeric'], + '>=': [' >= ', 'numeric'], + '=~': ['.match(', 'string', ')'] + }; + this.key = key; + this.op = op; + this.val = val; + this.index = index; + this.filename = filename; + this.id = this.key + this.op + this.val; + } + + CartoCSS_createClass(Filter, [{ + key: "ev", + value: function ev(env) { + this.key = this.key.ev(env); + this.val = this.val.ev(env); + return this; + } + }, { + key: "toString", + value: function toString() { + return '[' + this.id + ']'; + } + }]); + + return Filter; +}(); + +CartoCSS.Tree.Filterset = /*#__PURE__*/function () { + function Filterset() { + CartoCSS_classCallCheck(this, Filterset); + + this.filters = {}; + } + + CartoCSS_createClass(Filterset, [{ + key: "toJS", + value: function toJS(env) { + function eachFilter(filter) { + var op = filter.op; + + if (op === "=") { + op = "=="; + } + + var val = filter.val; + + if (filter._val !== undefined) { + val = filter._val.toString(true); + } //对scale进行特殊处理,将值转换成数值 + + + if (filter.key && filter.key.value === 'scale') { + val = +val; + } else if (typeof val === 'string' || CartoCSS_typeof(val) === 'object') { + val = "'" + val + "'"; + } + + var attrs = "attributes"; + return attrs + "&&" + attrs + filter.key + "&&" + attrs + filter.key + " " + op + val; + } + + var results = []; + + for (var id in this.filters) { + results.push(eachFilter(this.filters[id])); + } + + return results.join(' && '); + } + }, { + key: "toString", + value: function toString() { + var arr = []; + + for (var id in this.filters) { + arr.push(this.filters[id].id); + } + + return arr.sort().join('\t'); + } + }, { + key: "ev", + value: function ev(env) { + for (var i in this.filters) { + this.filters[i].ev(env); + } + + return this; + } + }, { + key: "clone", + value: function clone() { + var clone = new CartoCSS.Tree.Filterset(); + + for (var id in this.filters) { + clone.filters[id] = this.filters[id]; + } + + return clone; + } + }, { + key: "cloneWith", + value: function cloneWith(other) { + var additions = []; + + for (var id in other.filters) { + var status = this.addable(other.filters[id]); // status is true, false or null. if it's null we don't fail this + // clone nor do we add the filter. + + if (status === false) { + return false; + } + + if (status === true) { + // Adding the filter will override another value. + additions.push(other.filters[id]); + } + } // Adding the other filters doesn't make this filterset invalid, but it + // doesn't add anything to it either. + + + if (!additions.length) { + return null; + } // We can successfully add all filters. Now clone the filterset and add the + // new rules. + + + var clone = new CartoCSS.Tree.Filterset(); // We can add the rules that are already present without going through the + // add function as a Filterset is always in it's simplest canonical form. + + for (id in this.filters) { + clone.filters[id] = this.filters[id]; + } // Only add new filters that actually change the filter. + + + while (id = additions.shift()) { + clone.add(id); + } + + return clone; + } + }, { + key: "addable", + value: function addable(filter) { + var key = filter.key.toString(), + value = filter.val.toString(); + + if (value.match(/^[0-9]+(\.[0-9]*)?_match/)) { + value = parseFloat(value); + } + + switch (filter.op) { + case '=': + // if there is already foo= and we're adding foo= + if (this.filters[key + '='] !== undefined) { + if (this.filters[key + '='].val.toString() != value) { + return false; + } else { + return null; + } + } + + if (this.filters[key + '!=' + value] !== undefined) { + return false; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return false; + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return false; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) { + return false; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) { + return false; + } + + return true; + + case '=~': + return true; + + case '!=': + if (this.filters[key + '='] !== undefined) { + return this.filters[key + '='].val === value ? false : null; + } + + if (this.filters[key + '!=' + value] !== undefined) { + return null; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return null; + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return null; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) { + return null; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) { + return null; + } + + return true; + + case '>': + if (key + '=' in this.filters) { + if (this.filters[key + '='].val <= value) { + return false; + } else { + return null; + } + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return false; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val <= value) { + return false; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return null; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) { + return null; + } + + return true; + + case '>=': + if (this.filters[key + '='] !== undefined) { + return this.filters[key + '='].val < value ? false : null; + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return false; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) { + return false; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return null; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val >= value) { + return null; + } + + return true; + + case '<': + if (this.filters[key + '='] !== undefined) { + return this.filters[key + '='].val >= value ? false : null; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return false; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val >= value) { + return false; + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return null; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val < value) { + return null; + } + + return true; + + case '<=': + if (this.filters[key + '='] !== undefined) { + return this.filters[key + '='].val > value ? false : null; + } + + if (this.filters[key + '>'] !== undefined && this.filters[key + '>'].val >= value) { + return false; + } + + if (this.filters[key + '>='] !== undefined && this.filters[key + '>='].val > value) { + return false; + } + + if (this.filters[key + '<'] !== undefined && this.filters[key + '<'].val <= value) { + return null; + } + + if (this.filters[key + '<='] !== undefined && this.filters[key + '<='].val <= value) { + return null; + } + + return true; + + default: + break; + } + } + }, { + key: "conflict", + value: function conflict(filter) { + var key = filter.key.toString(), + value = filter.val.toString(); + + if (!isNaN(parseFloat(value))) { + value = parseFloat(value); + } // if (a=b) && (a=c) + // if (a=b) && (a!=b) + // or (a!=b) && (a=b) + + + if (filter.op === '=' && this.filters[key + '='] !== undefined && value != this.filters[key + '='].val.toString() || filter.op === '!=' && this.filters[key + '='] !== undefined && value == this.filters[key + '='].val.toString() || filter.op === '=' && this.filters[key + '!='] !== undefined && value === this.filters[key + '!='].val.toString()) { + return filter.toString() + ' added to ' + this.toString() + ' produces an invalid filter'; + } + + return false; + } + }, { + key: "add", + value: function add(filter, env) { + var key = filter.key.toString(), + op = filter.op, + conflict = this.conflict(filter), + numval; + + if (conflict) { + return conflict; + } + + if (op === '=') { + for (var i in this.filters) { + if (this.filters[i].key === key) { + delete this.filters[i]; + } + } + + this.filters[key + '='] = filter; + } else if (op === '!=') { + this.filters[key + '!=' + filter.val] = filter; + } else if (op === '=~') { + this.filters[key + '=~' + filter.val] = filter; + } else if (op === '>') { + // If there are other filters that are also > + // but are less than this one, they don't matter, so + // remove them. + for (var j in this.filters) { + if (this.filters[j].key === key && this.filters[j].val <= filter.val) { + delete this.filters[j]; + } + } + + this.filters[key + '>'] = filter; + } else if (op === '>=') { + for (var k in this.filters) { + numval = +this.filters[k].val.toString(); + + if (this.filters[k].key === key && numval < filter.val) { + delete this.filters[k]; + } + } + + if (this.filters[key + '!=' + filter.val] !== undefined) { + delete this.filters[key + '!=' + filter.val]; + filter.op = '>'; + this.filters[key + '>'] = filter; + } else { + this.filters[key + '>='] = filter; + } + } else if (op === '<') { + for (var l in this.filters) { + numval = +this.filters[l].val.toString(); + + if (this.filters[l].key === key && numval >= filter.val) { + delete this.filters[l]; + } + } + + this.filters[key + '<'] = filter; + } else if (op === '<=') { + for (var m in this.filters) { + numval = +this.filters[m].val.toString(); + + if (this.filters[m].key === key && numval > filter.val) { + delete this.filters[m]; + } + } + + if (this.filters[key + '!=' + filter.val] !== undefined) { + delete this.filters[key + '!=' + filter.val]; + filter.op = '<'; + this.filters[key + '<'] = filter; + } else { + this.filters[key + '<='] = filter; + } + } + } + }]); + + return Filterset; +}(); + +CartoCSS.Tree.Fontset = /*#__PURE__*/CartoCSS_createClass(function Fontset(env, fonts) { + CartoCSS_classCallCheck(this, Fontset); + + this.fonts = fonts; + this.name = 'fontset-' + env.effects.length; +}); + +CartoCSS.Tree.Invalid = /*#__PURE__*/function () { + function Invalid(chunk, index, message) { + CartoCSS_classCallCheck(this, Invalid); + + this.is = 'invalid'; + this.chunk = chunk; + this.index = index; + this.type = 'syntax'; + this.message = message || "Invalid code: " + this.chunk; + } + + CartoCSS_createClass(Invalid, [{ + key: "ev", + value: function ev(env) { + env.error({ + chunk: this.chunk, + index: this.index, + type: 'syntax', + message: this.message || "Invalid code: " + this.chunk + }); + return { + is: 'undefined' + }; + } + }]); + + return Invalid; +}(); + +CartoCSS.Tree.Keyword = /*#__PURE__*/function () { + function Keyword(value) { + CartoCSS_classCallCheck(this, Keyword); + + this.value = value; + var special = { + 'transparent': 'color', + 'true': 'boolean', + 'false': 'boolean' + }; + this.is = special[value] ? special[value] : 'keyword'; + } + + CartoCSS_createClass(Keyword, [{ + key: "ev", + value: function ev() { + return this; + } + }, { + key: "toString", + value: function toString() { + return this.value; + } + }]); + + return Keyword; +}(); +/*Layer:class Invalid ),*/ + + +CartoCSS.Tree.Literal = /*#__PURE__*/function () { + function Literal(content) { + CartoCSS_classCallCheck(this, Literal); + + this.value = content || ''; + this.is = 'field'; + } + + CartoCSS_createClass(Literal, [{ + key: "toString", + value: function toString() { + return this.value; + } + }, { + key: 'ev', + value: function ev() { + return this; + } + }]); + + return Literal; +}(); + +CartoCSS.Tree.Operation = /*#__PURE__*/function () { + function Operation(op, operands, index) { + CartoCSS_classCallCheck(this, Operation); + + this.is = 'operation'; + this.op = op.trim(); + this.operands = operands; + this.index = index; + } + + CartoCSS_createClass(Operation, [{ + key: "ev", + value: function ev(env) { + var a = this.operands[0].ev(env), + b = this.operands[1].ev(env), + temp; + + if (a.is === 'undefined' || b.is === 'undefined') { + return { + is: 'undefined', + value: 'undefined' + }; + } + + if (a instanceof CartoCSS.Tree.Dimension && b instanceof CartoCSS.Tree.Color) { + if (this.op === '*' || this.op === '+') { + temp = b; + b = a; + a = temp; + } else { + env.error({ + name: "OperationError", + message: "Can't substract or divide a color from a number", + index: this.index + }); + } + } // Only concatenate plain strings, because this is easily + // pre-processed + + + if (a instanceof CartoCSS.Tree.Quoted && b instanceof CartoCSS.Tree.Quoted && this.op !== '+') { + env.error({ + message: "Can't subtract, divide, or multiply strings.", + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } // Fields, literals, dimensions, and quoted strings can be combined. + + + if (a instanceof CartoCSS.Tree.Field || b instanceof CartoCSS.Tree.Field || a instanceof CartoCSS.Tree.Literal || b instanceof CartoCSS.Tree.Literal) { + if (a.is === 'color' || b.is === 'color') { + env.error({ + message: "Can't subtract, divide, or multiply colors in expressions.", + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } else { + return new CartoCSS.Tree.Literal(a.ev(env).toString(true) + this.op + b.ev(env).toString(true)); + } + } + + if (a.operate === undefined) { + env.error({ + message: 'Cannot do math with type ' + a.is + '.', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + + return a.operate(env, this.op, b); + } + }]); + + return Operation; +}(); + +CartoCSS.Tree.Quoted = /*#__PURE__*/function () { + function Quoted(content) { + CartoCSS_classCallCheck(this, Quoted); + + this.is = 'string'; + this.value = content || ''; + } + + CartoCSS_createClass(Quoted, [{ + key: "toString", + value: function toString(quotes) { + var escapedValue = this.value.replace(/&/g, '&'); + var xmlvalue = escapedValue.replace(/\'/g, '\\\'').replace(/\"/g, '"').replace(//g, '>'); + return quotes === true ? "'" + xmlvalue + "'" : escapedValue; + } + }, { + key: "ev", + value: function ev() { + return this; + } + }, { + key: "operate", + value: function operate(env, op, other) { + return new CartoCSS.Tree.Quoted(CartoCSS.Tree.operate(op, this.toString(), other.toString(this.contains_field))); + } + }]); + + return Quoted; +}(); + +CartoCSS.Tree.Reference = { + _validateValue: { + 'font': function font(env, value) { + if (env.validation_data && env.validation_data.fonts) { + return env.validation_data.fonts.indexOf(value) != -1; + } else { + return true; + } + } + }, + setData: function setData(data) { + this.data = data; + this.selector_cache = generateSelectorCache(data); + this.mapnikFunctions = generateMapnikFunctions(data); + this.required_cache = generateRequiredProperties(data); + + function generateSelectorCache(data) { + var index = {}; + + for (var i in data.symbolizers) { + for (var j in data.symbolizers[i]) { + if (data.symbolizers[i][j].hasOwnProperty('css')) { + index[data.symbolizers[i][j].css] = [data.symbolizers[i][j], i, j]; + } + } + } + + return index; + } + + function generateMapnikFunctions(data) { + var functions = {}; + + for (var i in data.symbolizers) { + for (var j in data.symbolizers[i]) { + if (data.symbolizers[i][j].type === 'functions') { + for (var k = 0; k < data.symbolizers[i][j].functions.length; k++) { + var fn = data.symbolizers[i][j].functions[k]; + functions[fn[0]] = fn[1]; + } + } + } + } + + return functions; + } + + function generateRequiredProperties(data) { + var cache = {}; + + for (var symbolizer_name in data.symbolizers) { + cache[symbolizer_name] = []; + + for (var j in data.symbolizers[symbolizer_name]) { + if (data.symbolizers[symbolizer_name][j].required) { + cache[symbolizer_name].push(data.symbolizers[symbolizer_name][j].css); + } + } + } + + return cache; + } + }, + setVersion: function setVersion(version) { + if (CartoCSS.mapnik_reference.version.hasOwnProperty(version)) { + this.setData(CartoCSS.mapnik_reference.version[version]); + return true; + } + + return false; + }, + selectorData: function selectorData(selector, i) { + if (this.selector_cache && this.selector_cache[selector]) { + return this.selector_cache[selector][i]; + } + }, + validSelector: function validSelector(selector) { + return !!this.selector_cache[selector]; + }, + selectorName: function selectorName(selector) { + return this.selectorData(selector, 2); + }, + selector: function selector(_selector) { + return this.selectorData(_selector, 0); + }, + symbolizer: function symbolizer(selector) { + return this.selectorData(selector, 1); + }, + requiredProperties: function requiredProperties(symbolizer_name, rules) { + var req = this.required_cache[symbolizer_name]; + + for (var i in req) { + if (!(req[i] in rules)) { + return 'Property ' + req[i] + ' required for defining ' + symbolizer_name + ' styles.'; + } + } + }, + isFont: function isFont(selector) { + return this.selector(selector).validate === 'font'; + }, + editDistance: function editDistance(a, b) { + if (a.length === 0) { + return b.length; + } + + if (b.length === 0) { + return a.length; + } + + var matrix = []; + + for (var i = 0; i <= b.length; i++) { + matrix[i] = [i]; + } + + for (var j = 0; j <= a.length; j++) { + matrix[0][j] = j; + } + + for (i = 1; i <= b.length; i++) { + for (j = 1; j <= a.length; j++) { + if (b.charAt(i - 1) === a.charAt(j - 1)) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution + Math.min(matrix[i][j - 1] + 1, // insertion + matrix[i - 1][j] + 1)); // deletion + } + } + } + + return matrix[b.length][a.length]; + }, + validValue: function validValue(env, selector, value) { + function validateFunctions(value, selector) { + if (value.value[0].is === 'string') { + return true; + } + + for (var i in value.value) { + for (var j in value.value[i].value) { + if (value.value[i].value[j].is !== 'call') { + return false; + } + + var f = find(this.selector(selector).functions, function (x) { + //NOSONAR + return x[0] === value.value[i].value[j].name; + }); + + if (!(f && f[1] === -1)) { + // This filter is unknown or given an incorrect number of arguments + if (!f || f[1] !== value.value[i].value[j].args.length) { + return false; + } + } + } + } + + return true; + } + + function validateKeyword(value, selector) { + if (CartoCSS_typeof(this.selector(selector).type) === 'object') { + return this.selector(selector).type.indexOf(value.value[0].value) !== -1; + } else { + // allow unquoted keywords as strings + return this.selector(selector).type === 'string'; + } + } + + var i; + + if (!this.selector(selector)) { + return false; + } else if (value.value[0].is === 'keyword') { + return validateKeyword(value, selector); + } else if (value.value[0].is === 'undefined') { + // caught earlier in the chain - ignore here so that + // error is not overridden + return true; + } else if (this.selector(selector).type === 'numbers') { + for (i in value.value) { + if (value.value[i].is !== 'float') { + return false; + } + } + + return true; + } else if (this.selector(selector).type === 'tags') { + if (!value.value) { + return false; + } + + if (!value.value[0].value) { + return value.value[0].is === 'tag'; + } + + for (i = 0; i < value.value[0].value.length; i++) { + if (value.value[0].value[i].is !== 'tag') { + return false; + } + } + + return true; + } else if (this.selector(selector).type == 'functions') { + // For backwards compatibility, you can specify a string for `functions`-compatible + // values, though they will not be validated. + return validateFunctions(value, selector); + } else if (this.selector(selector).type === 'expression') { + return true; + } else if (this.selector(selector).type === 'unsigned') { + if (value.value[0].is === 'float') { + value.value[0].round(); + return true; + } else { + return false; + } + } else { + if (this.selector(selector).validate) { + var valid = false; + + for (i = 0; i < value.value.length; i++) { + if (this.selector(selector).type === value.value[i].is && this._validateValue[this.selector(selector).validate](env, value.value[i].value)) { + return true; + } + } + + return valid; + } else { + return this.selector(selector).type === value.value[0].is; + } + } + } +}; +CartoCSS.Tree.Reference.setVersion("latest"); + +CartoCSS.Tree.Rule = /*#__PURE__*/function () { + function Rule(name, value, index, filename) { + CartoCSS_classCallCheck(this, Rule); + + this.is = 'rule'; + var parts = name.split('/'); + this.name = parts.pop(); + this.instance = parts.length ? parts[0] : '__default__'; + this.value = value instanceof CartoCSS.Tree.Value ? value : new CartoCSS.Tree.Value([value]); + this.index = index; + this.symbolizer = CartoCSS.Tree.Reference.symbolizer(this.name); + this.filename = filename; + this.variable = name.charAt(0) === '@'; + } + + CartoCSS_createClass(Rule, [{ + key: "clone", + value: function clone() { + var clone = Object.create(CartoCSS.Tree.Rule.prototype); + clone.name = this.name; + clone.value = this.value; + clone.index = this.index; + clone.instance = this.instance; + clone.symbolizer = this.symbolizer; + clone.filename = this.filename; + clone.variable = this.variable; + return clone; + } + }, { + key: "updateID", + value: function updateID() { + return this.id = this.zoom + '#' + this.instance + '#' + this.name; + } + }, { + key: "toString", + value: function toString() { + return '[' + CartoCSS.Tree.Zoom.toString(this.zoom) + '] ' + this.name + ': ' + this.value; + } + }, { + key: "ev", + value: function ev(context) { + return new CartoCSS.Tree.Rule(this.name, this.value.ev(context), this.index, this.filename); + } + }]); + + return Rule; +}(); + +CartoCSS.Tree.Ruleset = /*#__PURE__*/function () { + function Ruleset(selectors, rules) { + CartoCSS_classCallCheck(this, Ruleset); + + this.is = 'ruleset'; + this.selectors = selectors; + this.rules = rules; // static cache of find() function + + this._lookups = {}; + } + + CartoCSS_createClass(Ruleset, [{ + key: "ev", + value: function ev(env) { + var i, + rule, + ruleset = new CartoCSS.Tree.Ruleset(this.selectors, this.rules.slice(0)); + ruleset.root = this.root; // push the current ruleset to the frames stack + + env.frames.unshift(ruleset); // Evaluate everything else + + for (i = 0, rule; i < ruleset.rules.length; i++) { + rule = ruleset.rules[i]; + ruleset.rules[i] = rule.ev ? rule.ev(env) : rule; + } // Pop the stack + + + env.frames.shift(); + return ruleset; + } + }, { + key: "match", + value: function match(args) { + return !args || args.length === 0; + } + }, { + key: "variables", + value: function variables() { + if (this._variables) { + return this._variables; + } else { + return this._variables = this.rules.reduce(function (hash, r) { + if (r instanceof CartoCSS.Tree.Rule && r.variable === true) { + hash[r.name] = r; + } + + return hash; + }, {}); + } + } + }, { + key: "variable", + value: function variable(name) { + return this.variables()[name]; + } + }, { + key: "rulesets", + value: function rulesets() { + if (this._rulesets) { + return this._rulesets; + } else { + return this._rulesets = this.rules.filter(function (r) { + return r instanceof CartoCSS.Tree.Ruleset; + }); + } + } + }, { + key: "find", + value: function find(selector, self) { + self = self || this; + var rules = [], + match, + key = selector.toString(); + + if (key in this._lookups) { + return this._lookups[key]; + } + + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + + if (match) { + if (selector.elements.length > 1) { + Array.prototype.push.apply(rules, rule.find(new CartoCSS.Tree.Selector(null, null, selector.elements.slice(1)), self)); + } else { + rules.push(rule); + } + + break; + } + } + } + }); + return this._lookups[key] = rules; + } // Zooms can use variables. This replaces CartoCSS.Tree.Zoom objects on selectors + // with simple bit-arrays that we can compare easily. + + }, { + key: "evZooms", + value: function evZooms(env) { + for (var i = 0; i < this.selectors.length; i++) { + var zval = CartoCSS.Tree.Zoom.all; + + for (var z = 0; z < this.selectors[i].zoom.length; z++) { + zval = this.selectors[i].zoom[z].ev(env).zoom; + } + + this.selectors[i].zoom = zval; + } + } + }, { + key: "flatten", + value: function flatten(result, parents, env) { + var selectors = [], + i, + j; + + if (this.selectors.length === 0) { + env.frames = env.frames.concat(this.rules); + } // evaluate zoom variables on this object. + + + this.evZooms(env); + + for (i = 0; i < this.selectors.length; i++) { + var child = this.selectors[i]; + + if (!child.filters) { + // This is an invalid filterset. + continue; + } + + if (parents.length) { + for (j = 0; j < parents.length; j++) { + var parent = parents[j]; + var mergedFilters = parent.filters.cloneWith(child.filters); + + if (mergedFilters === null) { + // Filters could be added, but they didn't change the + // filters. This means that we only have to clone when + // the zoom levels or the attachment is different too. + if (parent.zoom === child.zoom && parent.attachment === child.attachment && parent.elements.join() === child.elements.join()) { + selectors.push(parent); + continue; + } else { + mergedFilters = parent.filters; + } + } else if (!mergedFilters) { + // The merged filters are invalid, that means we don't + // have to clone. + continue; + } + + var clone = Object.create(CartoCSS.Tree.Selector.prototype); + clone.filters = mergedFilters; + clone.zoom = child.zoom; + clone.elements = parent.elements.concat(child.elements); + + if (parent.attachment && child.attachment) { + clone.attachment = parent.attachment + '/' + child.attachment; + } else { + clone.attachment = child.attachment || parent.attachment; + } + + clone.conditions = parent.conditions + child.conditions; + clone.index = child.index; + selectors.push(clone); + } + } else { + selectors.push(child); + } + } + + var rules = []; + + for (i = 0; i < this.rules.length; i++) { + var rule = this.rules[i]; // Recursively flatten any nested rulesets + + if (rule instanceof CartoCSS.Tree.Ruleset) { + rule.flatten(result, selectors, env); + } else if (rule instanceof CartoCSS.Tree.Rule) { + rules.push(rule); + } else if (rule instanceof CartoCSS.Tree.Invalid) { + env.error(rule); + } + } + + var index = rules.length ? rules[0].index : false; + + for (i = 0; i < selectors.length; i++) { + // For specificity sort, use the position of the first rule to allow + // defining attachments that are under current element as a descendant + // selector. + if (index !== false) { + selectors[i].index = index; + } + + result.push(new CartoCSS.Tree.Definition(selectors[i], rules.slice())); + } + + return result; + } + }]); + + return Ruleset; +}(); + +CartoCSS.Tree.Selector = /*#__PURE__*/function () { + function Selector(filters, zoom, elements, attachment, conditions, index) { + CartoCSS_classCallCheck(this, Selector); + + this.elements = elements || []; + this.attachment = attachment; + this.filters = filters || {}; + this.zoom = typeof zoom !== 'undefined' ? zoom : CartoCSS.Tree.Zoom.all; + this.conditions = conditions; + this.index = index; + } + + CartoCSS_createClass(Selector, [{ + key: "specificity", + value: function specificity() { + return this.elements.reduce(function (memo, e) { + var spec = e.specificity(); + memo[0] += spec[0]; + memo[1] += spec[1]; + return memo; + }, [0, 0, this.conditions, this.index]); + } + }]); + + return Selector; +}(); +/*style:class Invalid ),*/ + + +CartoCSS.Tree.URL = /*#__PURE__*/function () { + function URL(val, paths) { + CartoCSS_classCallCheck(this, URL); + + this.is = 'uri'; + this.value = val; + this.paths = paths; + } + + CartoCSS_createClass(URL, [{ + key: "toString", + value: function toString() { + return this.value.toString(); + } + }, { + key: "ev", + value: function ev(ctx) { + return new CartoCSS.Tree.URL(this.value.ev(ctx), this.paths); + } + }]); + + return URL; +}(); + +CartoCSS.Tree.Value = /*#__PURE__*/function () { + function Value(value) { + CartoCSS_classCallCheck(this, Value); + + this.is = 'value'; + this.value = value; + } + + CartoCSS_createClass(Value, [{ + key: "ev", + value: function ev(env) { + if (this.value.length === 1) { + return this.value[0].ev(env); + } else { + return new CartoCSS.Tree.Value(this.value.map(function (v) { + return v.ev(env); + })); + } + } + }, { + key: "toJS", + value: function toJS(env) { + //var v = this.value[0].value[0]; + var val = this.ev(env); + var v = val.toString(); + + if (val.is === "color" || val.is === 'uri' || val.is === 'string' || val.is === 'keyword') { + v = "'" + v + "'"; + } else if (val.is === 'field') { + // replace [varuable] by ctx['variable'] + v = v.replace(/\[(.*)\]/g, "attributes['\_match1']"); + } else if (val.value && CartoCSS_typeof(val.value) === "object") { + v = "[" + v + "]"; + } + + return "_value = " + v + ";"; + } + }, { + key: "toString", + value: function toString(env, selector, sep, format) { + return this.value.map(function (e) { + return e.toString(env, format); + }).join(sep || ', '); + } + }, { + key: "clone", + value: function clone() { + var obj = Object.create(CartoCSS.Tree.Value.prototype); + + if (Array.isArray(obj)) { + obj.value = this.value.slice(); + } else { + obj.value = this.value; + } + + obj.is = this.is; + return obj; + } + }]); + + return Value; +}(); + +CartoCSS.Tree.Variable = /*#__PURE__*/function () { + function Variable(name, index, filename) { + CartoCSS_classCallCheck(this, Variable); + + this.is = 'variable'; + this.name = name; + this.index = index; + this.filename = filename; + } + + CartoCSS_createClass(Variable, [{ + key: "toString", + value: function toString() { + return this.name; + } + }, { + key: "ev", + value: function ev(env) { + if (this._css) { + return this._css; + } + + var thisframe = env.frames.filter(function (f) { + return f.name === this.name; + }.bind(this)); + + if (thisframe.length) { + return thisframe[0].value.ev(env); + } else { + env.error({ + message: 'variable ' + this.name + ' is undefined', + index: this.index, + type: 'runtime', + filename: this.filename + }); + return { + is: 'undefined', + value: 'undefined' + }; + } + } + }]); + + return Variable; +}(); + +CartoCSS.Tree.Zoom = /*#__PURE__*/function () { + function Zoom(op, value, index) { + CartoCSS_classCallCheck(this, Zoom); + + this.op = op; + this.value = value; + this.index = index; + } + + CartoCSS_createClass(Zoom, [{ + key: "setZoom", + value: function setZoom(zoom) { + this.zoom = zoom; + return this; + } + }, { + key: "ev", + value: function ev(env) { + var value = parseInt(this.value.ev(env).toString(), 10); + + if (value > CartoCSS.Tree.Zoom.maxZoom || value < 0) { + env.error({ + message: 'Only zoom levels between 0 and ' + CartoCSS.Tree.Zoom.maxZoom + ' supported.', + index: this.index + }); + } + + switch (this.op) { + case '=': + this.zoom = "zoom && zoom === " + value; + return this; + + case '>': + this.zoom = "zoom && zoom > " + value; + break; + + case '>=': + this.zoom = "zoom && zoom >= " + value; + break; + + case '<': + this.zoom = "zoom && zoom < " + value; + break; + + case '<=': + this.zoom = "zoom && zoom <= " + value; + break; + + default: + break; + } + /* + for (var i = 0; i <= CartoCSS.Tree.Zoom.maxZoom; i++) { + if (i >= start && i <= end) { + zoom |= (1 << i); + } + } + this.zoom = zoom; + this.zoom=value+this.op+"zoom";*/ + + + return this; + } + }, { + key: "toString", + value: function toString() { + var str = ''; + + for (var i = 0; i <= CartoCSS.Tree.Zoom.maxZoom; i++) { + str += this.zoom & 1 << i ? 'X' : '.'; + } + + return str; + } + }]); + + return Zoom; +}(); // Covers all zoomlevels from 0 to 22 + + +CartoCSS.Tree.Zoom.all = 23; +CartoCSS.Tree.Zoom.maxZoom = 22; +CartoCSS.Tree.Zoom.ranges = { + 0: 1000000000, + 1: 500000000, + 2: 200000000, + 3: 100000000, + 4: 50000000, + 5: 25000000, + 6: 12500000, + 7: 6500000, + 8: 3000000, + 9: 1500000, + 10: 750000, + 11: 400000, + 12: 200000, + 13: 100000, + 14: 50000, + 15: 25000, + 16: 12500, + 17: 5000, + 18: 2500, + 19: 1500, + 20: 750, + 21: 500, + 22: 250, + 23: 100 +}; +;// CONCATENATED MODULE: ./src/common/style/ThemeStyle.js +function ThemeStyle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeStyle_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeStyle_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeStyle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeStyle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ThemeStyle + * @deprecatedclass SuperMap.ThemeStyle + * @classdesc 客户端专题图风格类。 + * @category Visualization Theme + * @param {Object} options - 可选参数。 + * @param {boolean} [options.fill=true] - 是否填充,不需要填充则设置为 false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + * @param {string} [options.fillColor='#000000'] - 十六进制填充颜色。 + * @param {number} [options.fillOpacity=1] - 填充不透明度。取值范围[0, 1]。 + * @param {boolean} [options.stroke=false] - 是否描边,不需要描边则设置为false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + * @param {string} [options.strokeColor='#000000'] - 十六进制描边颜色。 + * @param {number} [options.strokeOpacity=1] - 描边的不透明度。取值范围[0, 1]。 + * @param {number} [options.strokeWidth=1] - 线宽度/描边宽度。 + * @param {string} [options.strokeLinecap='butt'] - 线帽样式。strokeLinecap 有三种类型 “butt", "round", "square"。 + * @param {string} [options.strokeLineJoin='iter'] - 线段连接样式。strokeLineJoin 有三种类型 “miter", "round", "bevel"。 + * @param {string} [options.strokeDashstyle='solid'] - 虚线类型。strokeDashstyle 有八种类型 “dot",“dash",“dashdot",“longdash",“longdashdot",“solid", "dashed", "dotted"。solid 表示实线。 + * @param {number} [options.pointRadius=6] - 点半径,单位为像素。 + * @param {number} [options.shadowBlur=0] - 阴影模糊度,(大于 0 有效;)。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + * @param {string} [options.shadowColor='#000000'] - 阴影颜色。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + * @param {number} [options.shadowOffsetX=0] - 阴影 X 方向偏移值。 + * @param {number} [options.shadowOffsetY=0] - 阴影 Y 方向偏移值。 + * @param {string} options.label - 专题要素附加文本标签内容。 + * @param {string} [options.fontColor] - 附加文本字体颜色。 + * @param {number} [options.fontSize=12] - 附加文本字体大小,单位是像素。 + * @param {string} [options.fontStyle='normal'] - 附加文本字体样式。可设值:"normal", "italic", "oblique"。 + * @param {string} [options.fontVariant='normal'] - 附加文本字体变体。可设值:"normal", "small-caps"。 + * @param {string} [options.fontWeight='normal'] - 附加文本字体粗细。可设值:"normal", "bold", "bolder", "lighter"。 + * @param {string} [options.fontFamily='arial,sans-serif'] - 附加文本字体系列。fontFamily 值是字体族名称或/及类族名称的一个优先表,每个值逗号分割, + * 浏览器会使用它可识别的第一个可以使用具体的字体名称("times"、"courier"、"arial")或字体系列名称 + * ("serif"、"sans-serif"、"cursive"、"fantasy"、"monospace")。 + * @param {string} [options.labelPosition='top'] - 附加文本位置, 可以是 'inside', 'left', 'right', 'top', 'bottom'。 + * @param {string} [options.labelAlign='center'] - 附加文本水平对齐。可以是 'left', 'right', 'center'。 + * @param {string} [options.labelBaseline='middle'] - 附加文本垂直对齐。 可以是 'top', 'bottom', 'middle' 。 + * @param {number} [options.labelXOffset=0] - 附加文本在x轴方向的偏移量。 + * @param {number} [options.labelYOffset=0] - 附加文本在y轴方向的偏移量。 + * @usage + */ + +var ThemeStyle = /*#__PURE__*/ThemeStyle_createClass(function ThemeStyle(options) { + ThemeStyle_classCallCheck(this, ThemeStyle); + + options = options || {}; + /** + * @member {boolean} [ThemeStyle.prototype.fill=true] + * @description 是否填充,不需要填充则设置为 false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + */ + + this.fill = true; + /** + * @member {string} [ThemeStyle.prototype.fillColor="#000000"] + * @description 十六进制填充颜色。 + */ + + this.fillColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.fillOpacity=1] + * @description 填充不透明度。取值范围[0, 1]。 + */ + + this.fillOpacity = 1; + /** + * @member {boolean} [ThemeStyle.prototype.stroke=false] + * @description 是否描边,不需要描边则设置为false。如果 fill 与 stroke 同时为 false,将按 fill 与 stroke 的默认值渲染图层。 + */ + + this.stroke = false; + /** + * @member {string} [ThemeStyle.prototype.strokeColor="#000000"] + * @description 十六进制描边颜色。 + */ + + this.strokeColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.strokeOpacity=1] + * @description 描边的不透明度。取值范围[0, 1]。 + */ + + this.strokeOpacity = 1; + /** + * @member {number} [ThemeStyle.prototype.strokeWidth=1] + * @description 线宽度/描边宽度。 + */ + + this.strokeWidth = 1; + /** + * @member {string} [ThemeStyle.prototype.strokeLinecap="butt"] + * @description 线帽样式;strokeLinecap 有三种类型 “butt", "round", "square" 。 + */ + + this.strokeLinecap = "butt"; + /** + * @member {string} [ThemeStyle.prototype.strokeLineJoin="miter"] + * @description 线段连接样式;strokeLineJoin 有三种类型 “miter", "round", "bevel"。 + */ + + this.strokeLineJoin = "miter"; + /** + * @member {string} [ThemeStyle.prototype.strokeDashstyle="solid"] + * @description 虚线类型; strokeDashstyle 有八种类型 “dot",“dash",“dashdot",“longdash",“longdashdot",“solid", "dashed", "dotted"; + * solid 表示实线。 + */ + + this.strokeDashstyle = "solid"; + /** + * @member {number} [ThemeStyle.prototype.pointRadius=6] + * @description 点半径。单位为像素。 + */ + + this.pointRadius = 6; + /** + * @member {number} [ThemeStyle.prototype.shadowBlur=0] + * @description 阴影模糊度,(大于 0 有效)。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + */ + + this.shadowBlur = 0; + /** + * @member {string} [ThemeStyle.prototype.shadowColor='#000000'] + * @description 阴影颜色。注:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。 + */ + + this.shadowColor = "#000000"; + /** + * @member {number} [ThemeStyle.prototype.shadowOffsetX=0] + * @description 阴影 X 方向偏移值。 + */ + + this.shadowOffsetX = 0; + /** + * @member {number} ThemeStyle.prototype.shadowOffsetY + * @description Y 方向偏移值。 + */ + + this.shadowOffsetY = 0; + /** + * @member {string} [ThemeStyle.prototype.label] + * @description 专题要素附加文本标签内容。 + */ + + this.label = ""; + /** + * @member {boolean} [ThemeStyle.prototype.labelRect=false] + * @description 是否显示文本标签矩形背景。 + */ + + this.labelRect = false; + /** + * @member {string} [ThemeStyle.prototype.fontColor] + * @description 附加文本字体颜色。 + */ + + this.fontColor = ""; + /** + * @member {number} [ThemeStyle.prototype.fontSize=12] + * @description 附加文本字体大小,单位是像素。 + */ + + this.fontSize = 12; + /** + * @member {string} [ThemeStyle.prototype.fontStyle="normal"] + * @description 附加文本字体样式。可设值:"normal", "italic", "oblique"。 + */ + + this.fontStyle = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontVariant="normal"] + * @description 附加文本字体变体。可设值:"normal", "small-caps"。 + */ + + this.fontVariant = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontWeight="normal"] + * @description 附加文本字体粗细。可设值:"normal", "bold", "bolder", "lighter"。 + */ + + this.fontWeight = "normal"; + /** + * @member {string} [ThemeStyle.prototype.fontFamily="arial,sans-serif"] + * @description 附加文本字体系列。fontFamily 值是字体族名称或/及类族名称的一个优先表,每个值逗号分割,浏览器会使用它可识别的第一个 + * 可以使用具体的字体名称("times"、"courier"、"arial")或字体系列名称("serif"、"sans-serif"、"cursive"、"fantasy"、"monospace")。 + */ + + this.fontFamily = "arial,sans-serif"; + /** + * @member {string} [ThemeStyle.prototype.labelPosition='top'] + * @description 附加文本位置, 可以是 'inside', 'left', 'right', 'top', 'bottom'。 + */ + + this.labelPosition = "top"; + /** + * @member {string} [ThemeStyle.prototype.labelAlign='center'] + * @description 附加文本水平对齐。可以是 'left', 'right', 'center'。 + */ + + this.labelAlign = "center"; + /** + * @member {string} [ThemeStyle.prototype.labelBaseline='middle'] + * @description 附加文本垂直对齐。 可以是 'top', 'bottom', 'middle'。 + */ + + this.labelBaseline = "middle"; + /** + * @member {number} [ThemeStyle.prototype.labelXOffset=0] + * @description 附加文本在 X 轴方向的偏移量。 + */ + + this.labelXOffset = 0; + /** + * @member {number} [ThemeStyle.prototype.labelYOffset=0] + * @description 附加文本在 Y 轴方向的偏移量。 + */ + + this.labelYOffset = 0; + Util.extend(this, options); +}); +;// CONCATENATED MODULE: ./src/common/style/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +;// CONCATENATED MODULE: ./src/common/overlay/feature/ShapeParameters.js +function ShapeParameters_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ShapeParameters_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ShapeParameters_createClass(Constructor, protoProps, staticProps) { if (protoProps) ShapeParameters_defineProperties(Constructor.prototype, protoProps); if (staticProps) ShapeParameters_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParameters + * @aliasclass Feature.ShapeParameters + * @deprecatedclass SuperMap.Feature.ShapeParameters + * @category Visualization Theme + * @classdesc 图形参数基类 + * @usage + */ +var ShapeParameters = /*#__PURE__*/function () { + function ShapeParameters() { + ShapeParameters_classCallCheck(this, ShapeParameters); + + /** + * @member {Array.} [ShapeParameters.prototype.refOriginalPosition=[0,0]] + * @description 图形参考原点位置,图形的参考中心位置。 + * refOriginalPosition 是长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + * refOriginalPosition 表示图形的参考中心,通常情况下,图形是使用 canvas 的原点位置作为位置参考, + * 但 refOriginalPosition 可以改变图形的参考位置,例如: refOriginalPosition = [80, 80], + * 图形圆的 style.x = 20, style.y = 20,那么圆在 canvas 中的实际位置是 [100, 100]。 + * 图形(Shape) 的所有位置相关属性都是以 refOriginalPosition 为参考中心, + * 也就是说图形的所有位置信息在 canvas 中都是以 refOriginalPosition 为参考的相对位置,只有 + * refOriginalPosition 的值为 [0, 0] 时,图形的位置信息才是 canvas 绝对位置。 + * 图形的位置信息通常有:style.pointList,style.x,style.y。 + */ + this.refOriginalPosition = [0, 0]; + /** + * @member {string} ShapeParameters.prototype.refDataID + * @description 图形所关联数据的 ID(<{@link FeatureVector}> 的 id)。 + */ + + this.refDataID = null; + /** + * @member {boolean} ShapeParameters.prototype.isHoverByRefDataID + * @description 是否根据 refDataID 进行高亮。用于同时高亮所有 refDataID 相同的图形。 + */ + + this.isHoverByRefDataID = false; + /** + * @member {string} ShapeParameters.prototype.refDataHoverGroup + * @description 高亮图形组的组名。此属性在 refDataID 有效且 isHoverByRefDataID 为 true 时生效。 + * 一旦设置此属性,且属性值有效,只有关联同一个数据的图形且此属性相同的图形才会高亮。 + */ + + this.refDataHoverGroup = null; + /** + * @member {Object} ShapeParameters.prototype.dataInfo + * @description 图形携带的附加数据。 + */ + + this.dataInfo = null; + /** + * @member {boolean} ShapeParameters.prototype.clickable + * @description 是否可点击。 + */ + + this.clickable = true; + /** + * @member {boolean} ShapeParameters.prototype.hoverable + * @description 是否可点击。 + */ + + this.hoverable = true; + /** + * @member {Object} ShapeParameters.prototype.style + * @description 图形样式对象,可设样式属性在子类中确定。 + */ + + this.style = null; + /** + * @member {Object} ShapeParameters.prototype.highlightStyle + * @description 高亮样式对象,可设样式属性与 style 的可设样式属性相同。 + */ + + this.highlightStyle = {}; + this.CLASS_NAME = "SuperMap.Feature.ShapeParameters"; + } + /** + * @function ShapeParameters.prototype.destroy + * @description 销毁对象。 + */ + + + ShapeParameters_createClass(ShapeParameters, [{ + key: "destroy", + value: function destroy() { + this.refOriginalPosition = null; + this.refDataID = null; + this.isHoverByRefDataID = null; + this.refDataHoverGroup = null; + this.dataInfo = null; + this.clickable = null; + this.hoverable = null; + this.style = null; + this.highlightStyle = null; + } + }]); + + return ShapeParameters; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Point.js +function feature_Point_typeof(obj) { "@babel/helpers - typeof"; return feature_Point_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, feature_Point_typeof(obj); } + +function feature_Point_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function feature_Point_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function feature_Point_createClass(Constructor, protoProps, staticProps) { if (protoProps) feature_Point_defineProperties(Constructor.prototype, protoProps); if (staticProps) feature_Point_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function feature_Point_get() { if (typeof Reflect !== "undefined" && Reflect.get) { feature_Point_get = Reflect.get; } else { feature_Point_get = function _get(target, property, receiver) { var base = feature_Point_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return feature_Point_get.apply(this, arguments); } + +function feature_Point_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = feature_Point_getPrototypeOf(object); if (object === null) break; } return object; } + +function feature_Point_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) feature_Point_setPrototypeOf(subClass, superClass); } + +function feature_Point_setPrototypeOf(o, p) { feature_Point_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return feature_Point_setPrototypeOf(o, p); } + +function feature_Point_createSuper(Derived) { var hasNativeReflectConstruct = feature_Point_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = feature_Point_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = feature_Point_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return feature_Point_possibleConstructorReturn(this, result); }; } + +function feature_Point_possibleConstructorReturn(self, call) { if (call && (feature_Point_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return feature_Point_assertThisInitialized(self); } + +function feature_Point_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function feature_Point_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function feature_Point_getPrototypeOf(o) { feature_Point_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return feature_Point_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersPoint + * @aliasclass Feature.ShapeParameters.Point + * @deprecatedclass SuperMap.Feature.ShapeParameters.Point + * @category Visualization Theme + * @classdesc 点参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 点 x 坐标。 + * @param {number} y - 点 y 坐标。 + * @usage + */ + +var Point_Point = /*#__PURE__*/function (_ShapeParameters) { + feature_Point_inherits(Point, _ShapeParameters); + + var _super = feature_Point_createSuper(Point); + + function Point(x, y) { + var _this; + + feature_Point_classCallCheck(this, Point); + + _this = _super.call(this, x, y); + /** + * @member {number} ShapeParametersPoint.prototype.x + * @description 点 x 坐标。 + */ + + _this.x = !isNaN(x) ? x : 0; + /** + * @member {number} ShapeParametersPoint.prototype.y + * @description 点 y 坐标。 + */ + + _this.y = !isNaN(y) ? y : 0; + /** + * @member {number} ShapeParametersPoint.prototype.r + * @description 点的半径。 + */ + + _this.r = 6; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Point"; + return _this; + } + /** + * @function ShapeParametersPoint.prototype.destroy + * @description 销毁对象。 + */ + + + feature_Point_createClass(Point, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.r = null; + + feature_Point_get(feature_Point_getPrototypeOf(Point.prototype), "destroy", this).call(this); + } + }]); + + return Point; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Line.js +function Line_typeof(obj) { "@babel/helpers - typeof"; return Line_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Line_typeof(obj); } + +function Line_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Line_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Line_createClass(Constructor, protoProps, staticProps) { if (protoProps) Line_defineProperties(Constructor.prototype, protoProps); if (staticProps) Line_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Line_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Line_get = Reflect.get; } else { Line_get = function _get(target, property, receiver) { var base = Line_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Line_get.apply(this, arguments); } + +function Line_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Line_getPrototypeOf(object); if (object === null) break; } return object; } + +function Line_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Line_setPrototypeOf(subClass, superClass); } + +function Line_setPrototypeOf(o, p) { Line_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Line_setPrototypeOf(o, p); } + +function Line_createSuper(Derived) { var hasNativeReflectConstruct = Line_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Line_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Line_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Line_possibleConstructorReturn(this, result); }; } + +function Line_possibleConstructorReturn(self, call) { if (call && (Line_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Line_assertThisInitialized(self); } + +function Line_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Line_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Line_getPrototypeOf(o) { Line_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Line_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersLine + * @aliasclass Feature.ShapeParameters.Line + * @deprecatedclass SuperMap.Feature.ShapeParameters.Line + * @category Visualization Theme + * @classdesc 线参数对象。 + * @extends {ShapeParameters} + * @param {Array} pointList - 线要素节点数组,二维数组。 + * @usage + */ + +var Line_Line = /*#__PURE__*/function (_ShapeParameters) { + Line_inherits(Line, _ShapeParameters); + + var _super = Line_createSuper(Line); + + function Line(pointList) { + var _this; + + Line_classCallCheck(this, Line); + + _this = _super.call(this, pointList); + /** + * @member {Array} ShapeParametersLine.prototype.pointList + * @description 线要素节点数组,二维数组。 + * 数组形如: + * (start code) + * [ + * [10, 20], //节点 + * [30, 40], + * [25, 30] //最后一个节点和第一个节点不必相同,绘制时自动封闭 + * ] + * (end) + */ + + _this.pointList = pointList; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Line"; + return _this; + } + /** + * @function ShapeParametersLine.prototype.destroy + * @description 销毁对象。 + */ + + + Line_createClass(Line, [{ + key: "destroy", + value: function destroy() { + this.pointList = null; + + Line_get(Line_getPrototypeOf(Line.prototype), "destroy", this).call(this); + } + }]); + + return Line; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Polygon.js +function feature_Polygon_typeof(obj) { "@babel/helpers - typeof"; return feature_Polygon_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, feature_Polygon_typeof(obj); } + +function feature_Polygon_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function feature_Polygon_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function feature_Polygon_createClass(Constructor, protoProps, staticProps) { if (protoProps) feature_Polygon_defineProperties(Constructor.prototype, protoProps); if (staticProps) feature_Polygon_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Polygon_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Polygon_get = Reflect.get; } else { Polygon_get = function _get(target, property, receiver) { var base = Polygon_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Polygon_get.apply(this, arguments); } + +function Polygon_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = feature_Polygon_getPrototypeOf(object); if (object === null) break; } return object; } + +function feature_Polygon_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) feature_Polygon_setPrototypeOf(subClass, superClass); } + +function feature_Polygon_setPrototypeOf(o, p) { feature_Polygon_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return feature_Polygon_setPrototypeOf(o, p); } + +function feature_Polygon_createSuper(Derived) { var hasNativeReflectConstruct = feature_Polygon_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = feature_Polygon_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = feature_Polygon_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return feature_Polygon_possibleConstructorReturn(this, result); }; } + +function feature_Polygon_possibleConstructorReturn(self, call) { if (call && (feature_Polygon_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return feature_Polygon_assertThisInitialized(self); } + +function feature_Polygon_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function feature_Polygon_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function feature_Polygon_getPrototypeOf(o) { feature_Polygon_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return feature_Polygon_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersPolygon + * @aliasclass Feature.ShapeParameters.Polygon + * @deprecatedclass SuperMap.Feature.ShapeParameters.Polygon + * @category Visualization Theme + * @classdesc 面参数对象。 + * @extends {ShapeParameters} + * @param {Array} pointList - 横坐标。 + * @usage + */ + +var Polygon_Polygon = /*#__PURE__*/function (_ShapeParameters) { + feature_Polygon_inherits(Polygon, _ShapeParameters); + + var _super = feature_Polygon_createSuper(Polygon); + + function Polygon(pointList) { + var _this; + + feature_Polygon_classCallCheck(this, Polygon); + + _this = _super.call(this, pointList); + /** + * @member {Array} ShapeParametersPolygon.prototype.pointList + * @description 面要素节点数组,二维数组。 + * 数组形如: + * (start code) + * [ + * [10, 20], //节点 + * [30, 40], + * [25, 30] //最后一个节点和第一个节点不必相同,绘制时自动封闭 + * ] + * (end) + */ + + _this.pointList = pointList; + /** + * @member {Array} ShapeParametersPolygon.prototype.holePolygonPointLists + * @description 岛洞面多边形顶点数组(三维数组) + */ + + _this.holePolygonPointLists = null; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Polygon"; + return _this; + } + /** + * @function ShapeParametersPolygon.prototype.destroy + * @description 销毁对象。 + */ + + + feature_Polygon_createClass(Polygon, [{ + key: "destroy", + value: function destroy() { + this.pointList = null; + this.holePolygonPointLists = null; + + Polygon_get(feature_Polygon_getPrototypeOf(Polygon.prototype), "destroy", this).call(this); + } + }]); + + return Polygon; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Rectangle.js +function feature_Rectangle_typeof(obj) { "@babel/helpers - typeof"; return feature_Rectangle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, feature_Rectangle_typeof(obj); } + +function feature_Rectangle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function feature_Rectangle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function feature_Rectangle_createClass(Constructor, protoProps, staticProps) { if (protoProps) feature_Rectangle_defineProperties(Constructor.prototype, protoProps); if (staticProps) feature_Rectangle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Rectangle_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Rectangle_get = Reflect.get; } else { Rectangle_get = function _get(target, property, receiver) { var base = Rectangle_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Rectangle_get.apply(this, arguments); } + +function Rectangle_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = feature_Rectangle_getPrototypeOf(object); if (object === null) break; } return object; } + +function feature_Rectangle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) feature_Rectangle_setPrototypeOf(subClass, superClass); } + +function feature_Rectangle_setPrototypeOf(o, p) { feature_Rectangle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return feature_Rectangle_setPrototypeOf(o, p); } + +function feature_Rectangle_createSuper(Derived) { var hasNativeReflectConstruct = feature_Rectangle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = feature_Rectangle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = feature_Rectangle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return feature_Rectangle_possibleConstructorReturn(this, result); }; } + +function feature_Rectangle_possibleConstructorReturn(self, call) { if (call && (feature_Rectangle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return feature_Rectangle_assertThisInitialized(self); } + +function feature_Rectangle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function feature_Rectangle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function feature_Rectangle_getPrototypeOf(o) { feature_Rectangle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return feature_Rectangle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersRectangle + * @aliasclass Feature.ShapeParameters.Rectangle + * @deprecatedclass SuperMap.Feature.ShapeParameters.Rectangle + * @category Visualization Theme + * @classdesc 矩形参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 矩形 x 坐标。 + * @param {number} y - 矩形 y 坐标。 + * @param {number} width - 矩形 width 宽度。 + * @param {number} height - 矩形 height 高度。 + * @usage + */ + +var Rectangle_Rectangle = /*#__PURE__*/function (_ShapeParameters) { + feature_Rectangle_inherits(Rectangle, _ShapeParameters); + + var _super = feature_Rectangle_createSuper(Rectangle); + + function Rectangle(x, y, width, height) { + var _this; + + feature_Rectangle_classCallCheck(this, Rectangle); + + _this = _super.call(this, x, y, width, height); + /** + * @member {number} ShapeParametersRectangle.prototype.x + * @description 左上角 x 坐标。 + */ + + _this.x = !isNaN(x) ? x : 0; + /** + * @member {number} ShapeParametersRectangle.prototype.y + * @description 左上角 y 坐标。 + */ + + _this.y = !isNaN(x) ? y : 0; + /** + * @member {number} ShapeParametersRectangle.prototype.width + * @description 宽度。 + */ + + _this.width = !isNaN(width) ? width : 0; + /** + * @member {number} ShapeParametersRectangle.prototype.height + * @description 高度。 + */ + + _this.height = !isNaN(height) ? height : 0; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Rectangle"; + return _this; + } + /** + * @function ShapeParametersRectangle.prototype.destroy + * @description 销毁对象。 + */ + + + feature_Rectangle_createClass(Rectangle, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.width = null; + this.height = null; + + Rectangle_get(feature_Rectangle_getPrototypeOf(Rectangle.prototype), "destroy", this).call(this); + } + }]); + + return Rectangle; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Sector.js +function Sector_typeof(obj) { "@babel/helpers - typeof"; return Sector_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Sector_typeof(obj); } + +function Sector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Sector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Sector_createClass(Constructor, protoProps, staticProps) { if (protoProps) Sector_defineProperties(Constructor.prototype, protoProps); if (staticProps) Sector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Sector_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Sector_get = Reflect.get; } else { Sector_get = function _get(target, property, receiver) { var base = Sector_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Sector_get.apply(this, arguments); } + +function Sector_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Sector_getPrototypeOf(object); if (object === null) break; } return object; } + +function Sector_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Sector_setPrototypeOf(subClass, superClass); } + +function Sector_setPrototypeOf(o, p) { Sector_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Sector_setPrototypeOf(o, p); } + +function Sector_createSuper(Derived) { var hasNativeReflectConstruct = Sector_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Sector_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Sector_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Sector_possibleConstructorReturn(this, result); }; } + +function Sector_possibleConstructorReturn(self, call) { if (call && (Sector_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Sector_assertThisInitialized(self); } + +function Sector_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Sector_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Sector_getPrototypeOf(o) { Sector_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Sector_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersSector + * @aliasclass Feature.ShapeParameters.Sector + * @deprecatedclass SuperMap.Feature.ShapeParameters.Sector + * @category Visualization Theme + * @classdesc 扇形参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 圆心 x 坐标。 + * @param {number} y - 圆心 y 坐标。 + * @param {number} r - 外圆半径。 + * @param {number} startAngle - 起始角度。取值范围[0, 360)。 + * @param {number} endAngle - 结束角度。取值范围(0, 360]。 + * @param {number} [r0=0] - 内圆半径,指定后将出现内弧,同时扇边长度为'r - r0'。取值范围[0, r)。 + * @usage + */ + +var Sector = /*#__PURE__*/function (_ShapeParameters) { + Sector_inherits(Sector, _ShapeParameters); + + var _super = Sector_createSuper(Sector); + + function Sector(x, y, r, startAngle, endAngle, r0, clockWise) { + var _this; + + Sector_classCallCheck(this, Sector); + + _this = _super.call(this, x, y, r, startAngle, endAngle, r0, clockWise); + /** + * @member {number} ShapeParametersSector.prototype.x + * @description 圆心 x 坐标。 + */ + + _this.x = !isNaN(x) ? x : 0; + /** + * @member {number} ShapeParametersSector.prototype.Y + * @description 圆心 Y 坐标。 + */ + + _this.y = !isNaN(y) ? y : 0; + /** + * @member {number} ShapeParametersSector.prototype.r + * @description 外圆半径。 + */ + + _this.r = !isNaN(r) ? r : 0; + /** + * @member {number} ShapeParametersSector.prototype.startAngle + * @description 起始角度。取值范围[0, 360),默认值:null。 + */ + + _this.startAngle = !isNaN(startAngle) ? startAngle : 0; + /** + * @member {number} ShapeParametersSector.prototype.endAngle + * @description 结束角度。取值范围(0, 360],默认值:null。 + */ + + _this.endAngle = !isNaN(endAngle) ? endAngle : 0; + /** + * @member {number} [ShapeParametersSector.prototype.r0=0] + * @description 内圆半径,指定后将出现内弧,同时扇边长度为 r 减 r0。取值范围[0, r)。 + */ + + _this.r0 = !isNaN(r0) ? r0 : 0; + /** + * @member {number} [ShapeParametersSector.prototype.clockWise=false] + * @description 是否是顺时针。默认值:false。 + */ + + _this.clockWise = clockWise; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Sector"; + return _this; + } + /** + * @function ShapeParametersSector.prototype.destroy + * @description 销毁对象。 + */ + + + Sector_createClass(Sector, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.r = null; + this.startAngle = null; + this.endAngle = null; + this.r0 = null; + this.clockWise = null; + + Sector_get(Sector_getPrototypeOf(Sector.prototype), "destroy", this).call(this); + } + }]); + + return Sector; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Label.js +function Label_typeof(obj) { "@babel/helpers - typeof"; return Label_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Label_typeof(obj); } + +function Label_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Label_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Label_createClass(Constructor, protoProps, staticProps) { if (protoProps) Label_defineProperties(Constructor.prototype, protoProps); if (staticProps) Label_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Label_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Label_get = Reflect.get; } else { Label_get = function _get(target, property, receiver) { var base = Label_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Label_get.apply(this, arguments); } + +function Label_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Label_getPrototypeOf(object); if (object === null) break; } return object; } + +function Label_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Label_setPrototypeOf(subClass, superClass); } + +function Label_setPrototypeOf(o, p) { Label_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Label_setPrototypeOf(o, p); } + +function Label_createSuper(Derived) { var hasNativeReflectConstruct = Label_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Label_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Label_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Label_possibleConstructorReturn(this, result); }; } + +function Label_possibleConstructorReturn(self, call) { if (call && (Label_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Label_assertThisInitialized(self); } + +function Label_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Label_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Label_getPrototypeOf(o) { Label_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Label_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersLabel + * @aliasclass Feature.ShapeParameters.Label + * @deprecatedclass SuperMap.Feature.ShapeParameters.Label + * @category Visualization Theme + * @classdesc 标签参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @param {string} text - 图形中的附加文本。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ShapeParametersLabel } from '{npm}'; + * new ShapeParametersLabel(x, y, text); + * + * // 弃用的写法 + * import { Label } from '{npm}'; + * new Label(x, y, text); + * + * ``` + */ + +var Label = /*#__PURE__*/function (_ShapeParameters) { + Label_inherits(Label, _ShapeParameters); + + var _super = Label_createSuper(Label); + + function Label(x, y, text) { + var _this; + + Label_classCallCheck(this, Label); + + _this = _super.call(this, x, y, text); + /** + * @member {number} ShapeParametersLabel.prototype.x + * @description 标签 x 坐标。 + */ + + _this.x = x; + /** + * @member {number} ShapeParametersLabel.prototype.y + * @description 标签 y 坐标。 + */ + + _this.y = y; + /** + * @member {number} ShapeParametersLabel.prototype.text + * @description 标签的文本内容。 + */ + + _this.text = text; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Label"; + return _this; + } + /** + * @function ShapeParametersLabel.prototype.destroy + * @description 销毁对象。 + */ + + + Label_createClass(Label, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.text = null; + + Label_get(Label_getPrototypeOf(Label.prototype), "destroy", this).call(this); + } + }]); + + return Label; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Image.js +function feature_Image_typeof(obj) { "@babel/helpers - typeof"; return feature_Image_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, feature_Image_typeof(obj); } + +function feature_Image_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function feature_Image_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function feature_Image_createClass(Constructor, protoProps, staticProps) { if (protoProps) feature_Image_defineProperties(Constructor.prototype, protoProps); if (staticProps) feature_Image_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function feature_Image_get() { if (typeof Reflect !== "undefined" && Reflect.get) { feature_Image_get = Reflect.get; } else { feature_Image_get = function _get(target, property, receiver) { var base = feature_Image_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return feature_Image_get.apply(this, arguments); } + +function feature_Image_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = feature_Image_getPrototypeOf(object); if (object === null) break; } return object; } + +function feature_Image_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) feature_Image_setPrototypeOf(subClass, superClass); } + +function feature_Image_setPrototypeOf(o, p) { feature_Image_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return feature_Image_setPrototypeOf(o, p); } + +function feature_Image_createSuper(Derived) { var hasNativeReflectConstruct = feature_Image_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = feature_Image_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = feature_Image_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return feature_Image_possibleConstructorReturn(this, result); }; } + +function feature_Image_possibleConstructorReturn(self, call) { if (call && (feature_Image_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return feature_Image_assertThisInitialized(self); } + +function feature_Image_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function feature_Image_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function feature_Image_getPrototypeOf(o) { feature_Image_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return feature_Image_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersImage + * @aliasclass Feature.ShapeParameters.Image + * @deprecatedclass SuperMap.Feature.ShapeParameters.Image + * @category Visualization Theme + * @classdesc 图片参数对象。 + * @extends {ShapeParameters} + * @param {number} x - 左上角横坐标。 + * @param {number} y - 左上角纵坐标。 + * @param {(string|Object)} image - 图片地址或Cavans对象。 + * @param {number} width - 绘制到画布上的宽度,默认为图片高度。 + * @param {number} height - 绘制到画布上的高度,默认为图片高度。 + * @param {number} sx - 从图片中裁剪的左上角横坐标。 + * @param {number} sy - 从图片中裁剪的左上角纵坐标。 + * @param {number} sWidth - 从图片中裁剪的宽度,默认为图片高度。 + * @param {number} sHeight - 绘制到画布上的高度,默认为图片高度。 + * @usage + */ + +var Image_Image = /*#__PURE__*/function (_ShapeParameters) { + feature_Image_inherits(Image, _ShapeParameters); + + var _super = feature_Image_createSuper(Image); + + function Image(x, y, image, width, height, sx, sy, sWidth, sHeight) { + var _this; + + feature_Image_classCallCheck(this, Image); + + _this = _super.call(this, x, y, image, width, height, sx, sy, sWidth, sHeight); + /** + * @member {number} ShapeParametersImage.prototype.x + * @description 左上角横坐标,必设参数。 + */ + + _this.x = x; + /** + * @member {number} ShapeParametersImage.prototype.y + * @description 左上角纵坐标,必设参数。 + */ + + _this.y = y; + /** + * @member {(string|Object)} ShapeParametersImage.prototype.image + * @description 图片地址。 + */ + + _this.image = image; + /** + * @member {number} ShapeParametersImage.prototype.width + * @description 绘制到画布上的宽度,默认为图片高度。 + */ + + _this.width = width; + /** + * @member {number} ShapeParametersImage.prototype.height + * @description 绘制到画布上的高度,默认为图片高度。 + */ + + _this.height = height; + /** + * @member {number} ShapeParametersImage.prototype.sx + * @description 从图片中裁剪的左上角横坐标。 + */ + + _this.sx = sx; + /** + * @member {number} ShapeParametersImage.prototype.sy + * @description 从图片中裁剪的左上角纵坐标。 + */ + + _this.sy = sy; + /** + * @member {number} ShapeParametersImage.prototype.sWidth + * @description 从图片中裁剪的宽度,默认为图片高度。 + */ + + _this.sWidth = sWidth; + /** + * @member {number} ShapeParametersImage.prototype.sHeight + * @description 绘制到画布上的高度,默认为图片高度。 + */ + + _this.sHeight = sHeight; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Image"; + return _this; + } + /** + * @function ShapeParametersImage.prototype.destroy + * @description 销毁对象。 + */ + + + feature_Image_createClass(Image, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.image = null; + this.width = null; + this.height = null; + this.sx = null; + this.sy = null; + this.sWidth = null; + this.sHeight = null; + + feature_Image_get(feature_Image_getPrototypeOf(Image.prototype), "destroy", this).call(this); + } + }]); + + return Image; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Circle.js +function Circle_typeof(obj) { "@babel/helpers - typeof"; return Circle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Circle_typeof(obj); } + +function Circle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Circle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Circle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Circle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Circle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Circle_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Circle_get = Reflect.get; } else { Circle_get = function _get(target, property, receiver) { var base = Circle_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Circle_get.apply(this, arguments); } + +function Circle_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Circle_getPrototypeOf(object); if (object === null) break; } return object; } + +function Circle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Circle_setPrototypeOf(subClass, superClass); } + +function Circle_setPrototypeOf(o, p) { Circle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Circle_setPrototypeOf(o, p); } + +function Circle_createSuper(Derived) { var hasNativeReflectConstruct = Circle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Circle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Circle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Circle_possibleConstructorReturn(this, result); }; } + +function Circle_possibleConstructorReturn(self, call) { if (call && (Circle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Circle_assertThisInitialized(self); } + +function Circle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Circle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Circle_getPrototypeOf(o) { Circle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Circle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ShapeParametersCircle + * @aliasclass Feature.ShapeParameters.Circle + * @deprecatedclass SuperMap.Feature.ShapeParameters.Circle + * @classdesc 圆形参数对象。 + * @category Visualization Theme + * @extends {ShapeParameters} + * @param {number} x - 圆心 x 坐标。 + * @param {number} y - 圆心 y 坐标。 + * @param {number} r - 圆半径。 + * @usage + */ + +var Circle_Circle = /*#__PURE__*/function (_ShapeParameters) { + Circle_inherits(Circle, _ShapeParameters); + + var _super = Circle_createSuper(Circle); + + function Circle(x, y, r) { + var _this; + + Circle_classCallCheck(this, Circle); + + _this = _super.call(this, x, y, r); + /** + * @member {number} ShapeParametersCircle.prototype.x + * @description 圆心 x 坐标。 + */ + + _this.x = !isNaN(x) ? x : 0; + /** + * @member {number} ShapeParametersCircle.prototype.y + * @description 圆心 y 坐标。 + */ + + _this.y = !isNaN(y) ? y : 0; + /** + * @member {number} ShapeParametersCircle.prototype.r + * @description 圆半径。 + */ + + _this.r = !isNaN(r) ? r : 0; + _this.CLASS_NAME = "SuperMap.Feature.ShapeParameters.Circle"; + return _this; + } + /** + * @function ShapeParametersCircle.prototype.destroy + * @description 销毁对象。 + */ + + + Circle_createClass(Circle, [{ + key: "destroy", + value: function destroy() { + this.x = null; + this.y = null; + this.r = null; + + Circle_get(Circle_getPrototypeOf(Circle.prototype), "destroy", this).call(this); + } + }]); + + return Circle; +}(ShapeParameters); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Eventful.js +function Eventful_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Eventful_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Eventful_createClass(Constructor, protoProps, staticProps) { if (protoProps) Eventful_defineProperties(Constructor.prototype, protoProps); if (staticProps) Eventful_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Eventful + * @category Visualization Theme + * @classdesc 事件分发器超类,所有支持事件处理的类均是此类的子类。 + * 此类不可实例化。 + * 支持的事件: + * Symbolizer properties: + * onclick - {function} 默认值:null。 + * onmouseover - {function} 默认值:null。 + * onmouseout - {function} 默认值:null。 + * onmousemove - {function} 默认值:null。 + * onmousewheel - {function} 默认值:null。 + * onmousedown - {function} 默认值:null。 + * onmouseup - {function} 默认值:null。 + * ondragstart - {function} 默认值:null。 + * ondragend - {function} 默认值:null。 + * ondragenter - {function} 默认值:null。 + * ondragleave - {function} 默认值:null。 + * ondragover - {function} 默认值:null。 + * ondrop - {function} 默认值:null。 + * @private + */ +var Eventful = /*#__PURE__*/function () { + function Eventful() { + Eventful_classCallCheck(this, Eventful); + + /** + * @member {Object} LevelRenderer.Eventful.prototype._handlers + * @description 事件处理对象(事件分发器)。 + */ + this._handlers = {}; + this.CLASS_NAME = "SuperMap.LevelRenderer.Eventful"; + } + /** + * @function {Object} LevelRenderer.Eventful.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Eventful_createClass(Eventful, [{ + key: "destroy", + value: function destroy() { + this._handlers = null; + } + /** + * @function LevelRenderer.Eventful.prototype.one + * @description 单次触发绑定,dispatch后销毁。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @param {Object} context - context。 + * @returns {LevelRenderer.Eventful} this + */ + + }, { + key: "one", + value: function one(event, handler, context) { + var _h = this._handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + } + /** + * @function LevelRenderer.Eventful.prototype.bind + * @description 绑定事件。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @param {Object} context - context。 + * @returns {LevelRenderer.Eventful} this + */ + + }, { + key: "bind", + value: function bind(event, handler, context) { + var _h = this._handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + } + /** + * @function LevelRenderer.Eventful.prototype.unbind + * @description 解绑事件。 + * @param {string} event - 事件名。 + * @param {boolean} handler - 响应函数。 + * @returns {LevelRenderer.Eventful} this + */ + + }, { + key: "unbind", + value: function unbind(event, handler) { + var _h = this._handlers; + + if (!event) { + this._handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } else { + delete _h[event]; + } + + return this; + } + /** + * @function LevelRenderer.Eventful.prototype.dispatch + * @description 事件分发。 + * @param {string} type - 事件类型。 + * @returns {LevelRenderer.Eventful} this + */ + + }, { + key: "dispatch", + value: function dispatch(type) { + if (this._handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = Array.prototype.slice.call(args, 1); + } + + var _h = this._handlers[type]; + var len = _h.length; + + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + + break; + + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + + break; + + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + + break; + + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + + len--; + } else { + i++; + } + } + } + + return this; + } + /** + * @function LevelRenderer.Eventful.prototype.dispatchWithContext + * @description 带有context的事件分发,最后一个参数是事件回调的 context。 + * @param {string} type - 事件类型。 + * @returns {LevelRenderer.Eventful} this + */ + + }, { + key: "dispatchWithContext", + value: function dispatchWithContext(type) { + if (this._handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = Array.prototype.slice.call(args, 1, args.length - 1); + } + + var ctx = args[args.length - 1]; + var _h = this._handlers[type]; + var len = _h.length; + + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + + break; + + case 2: + _h[i]['h'].call(ctx, args[1]); + + break; + + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + + break; + + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + + len--; + } else { + i++; + } + } + } + + return this; + } + }]); + + return Eventful; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Vector.js +function levelRenderer_Vector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function levelRenderer_Vector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function levelRenderer_Vector_createClass(Constructor, protoProps, staticProps) { if (protoProps) levelRenderer_Vector_defineProperties(Constructor.prototype, protoProps); if (staticProps) levelRenderer_Vector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Vector + * @category Visualization Theme + * @classdesc LevelRenderer 二维向量类 + * + */ +var levelRenderer_Vector_Vector = /*#__PURE__*/function () { + function Vector() { + levelRenderer_Vector_classCallCheck(this, Vector); + + this.ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Vector"; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.create + * @description 创建一个向量。 + * + * @param {number} x - x坐标 + * @param {number} y - Y坐标 + * @return {Vector2} 向量。 + */ + + + levelRenderer_Vector_createClass(Vector, [{ + key: "create", + value: function create(x, y) { + var ArrayCtor = this.ArrayCtor; + var out = new ArrayCtor(2); + out[0] = x || 0; + out[1] = y || 0; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.copy + * @description 复制一个向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量。 + * @return {Vector2} 克隆向量。 + */ + + }, { + key: "copy", + value: function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.set + * @description 设置向量的两个项。 + * + * @param {Vector2} out - 基础向量。 + * @param {number} a - 项 a。 + * @param {number} b - 项 b。 + * @return {Vector2} 结果。 + */ + + }, { + key: "set", + value: function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.add + * @description 向量相加。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "add", + value: function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.scaleAndAdd + * @description 向量缩放后相加。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2(缩放向量)。 + * @param {number} a - 缩放参数。 + * @return {Vector2} 结果。 + */ + + }, { + key: "scaleAndAdd", + value: function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.sub + * @description 向量相减。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "sub", + value: function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.len + * @description 向量长度。 + * @param {Vector2} v - 向量。 + * @return {number} 向量长度。 + */ + + }, { + key: "len", + value: function len(v) { + return Math.sqrt(this.lenSquare(v)); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.lenSquare + * @description 向量长度平方。 + * @param {Vector2} v - 向量。 + * @return {number} 向量长度平方。 + */ + + }, { + key: "lenSquare", + value: function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.mul + * @description 向量乘法。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "mul", + value: function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.div + * @description 向量除法。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "div", + value: function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.dot + * @description 向量点乘。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量点乘。 + */ + + }, { + key: "dot", + value: function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.scale + * @description 向量缩放。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量v。 + * @param {number} s -缩放参数。 + * @return {Vector2} 结果。 + */ + + }, { + key: "scale", + value: function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.normalize + * @description 向量归一化。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量 v。 + * @return {Vector2} 结果。 + */ + + }, { + key: "normalize", + value: function normalize(out, v) { + var d = this.len(v); + + if (d === 0) { + out[0] = 0; + out[1] = 0; + } else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.distance + * @description 计算向量间距离。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量间距离。 + */ + + }, { + key: "distance", + value: function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1])); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.distanceSquare + * @description 向量距离平方。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量距离平方。 + */ + + }, { + key: "distanceSquare", + value: function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.negate + * @description 求负向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v - 向量 v。 + * @return {Vector2} 负向量。 + */ + + }, { + key: "negate", + value: function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.lerp + * @description 两点之间线性插值。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @param {number} t + * @return {Vector2} 结果。 + */ + + }, { + key: "lerp", + value: function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.applyTransform + * @description 矩阵左乘向量。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "applyTransform", + value: function applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.min + * @description 求两个向量最小值。 + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "min", + value: function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.max + * @description 求两个向量最大值。 + * + * @param {Vector2} out - 基础向量。 + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {Vector2} 结果。 + */ + + }, { + key: "max", + value: function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + /** + * @function LevelRenderer.Tool.Vector.prototype.length + * @description 向量长度。 + * + * @param {Vector2} v - 向量。 + * @return {number} 向量长度。 + */ + + }, { + key: "length", + value: function length(v) { + return this.len(v); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.lengthSquare + * @description 向量长度平方。 + * + * @param {Vector2} v - 向量。 + * @return {number} 向量长度平方。 + */ + + }, { + key: "lengthSquare", + value: function lengthSquare(v) { + return this.lenSquare(v); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.dist + * @description 计算向量间距离。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量间距离。 + */ + + }, { + key: "dist", + value: function dist(v1, v2) { + return this.distance(v1, v2); + } + /** + * @function LevelRenderer.Tool.Vector.prototype.distSquare + * @description 向量距离平方。 + * + * @param {Vector2} v1 - 向量 v1。 + * @param {Vector2} v2 - 向量 v2。 + * @return {number} 向量距离平方 + */ + + }, { + key: "distSquare", + value: function distSquare(v1, v2) { + return this.distanceSquare(v1, v2); + } + }]); + + return Vector; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Curve.js +function levelRenderer_Curve_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function levelRenderer_Curve_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function levelRenderer_Curve_createClass(Constructor, protoProps, staticProps) { if (protoProps) levelRenderer_Curve_defineProperties(Constructor.prototype, protoProps); if (staticProps) levelRenderer_Curve_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Tool.Curve + * @category Visualization Theme + * @classdesc LevelRenderer 工具-曲线 + * @private + */ + +var Curve_Curve = /*#__PURE__*/function () { + function Curve() { + levelRenderer_Curve_classCallCheck(this, Curve); + + /** + * @member {LevelRenderer.Tool.Vector} LevelRenderer.Tool.Curve.prototype.vector + * @description 矢量工具。 + */ + this.vector = new levelRenderer_Vector_Vector(); + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.EPSILON + * @description e。 + */ + + this.EPSILON = 1e-4; + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.THREE_SQRT + * @description 3 的平方根。 + */ + + this.THREE_SQRT = Math.sqrt(3); + /** + * @member {number} LevelRenderer.Tool.Curve.prototype.ONE_THIRD + * @description 1/3。 + */ + + this.ONE_THIRD = 1 / 3; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Curve"; + } + /* + * Method: evalCubicCoeff + * + * Parameters: + * a - {number} 值。 + * b - {number} 值。 + * c - {number} 值。 + * d - {number} 值。 + * t - {number} 值。 + * + * Returns: + * {number} + */ + + /* + evalCubicCoeff: function(a, b, c, d, t){ + return ((a * t + b) * t + c) * t + d; + }, + */ + + /** + * @function LevelRenderer.Tool.Curve.prototype.isAroundZero + * @description 判断一个值是否趋于0,判断参考值:1e-4。 + * @param {number} val - 值。 + * @returns {boolean} 值是否趋于0。 + */ + + + levelRenderer_Curve_createClass(Curve, [{ + key: "isAroundZero", + value: function isAroundZero(val) { + return val > -this.EPSILON && val < this.EPSILON; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.isNotAroundZero + * @description 判断一个值是否不趋于0,判断参考值:1e-4。 + * @param {number} val - 值。 + * @returns {boolean} 值是否不趋于0。 + */ + + }, { + key: "isNotAroundZero", + value: function isNotAroundZero(val) { + return val > this.EPSILON || val < -this.EPSILON; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicAt + * @description 计算三次贝塞尔值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @returns {number} 三次贝塞尔值。 + */ + + }, { + key: "cubicAt", + value: function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + t * t * (t * p3 + 3 * onet * p2); + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicDerivativeAt + * @description 计算三次贝塞尔导数值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @returns {number} 三次贝塞尔导数值。 + */ + + }, { + key: "cubicDerivativeAt", + value: function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + (p3 - p2) * t * t); + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicRootAt + * @description 计算三次贝塞尔方程根,使用盛金公式 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} val - 值。 + * @param {Array.} roots - 有效根数目。 + * @returns {number} 有效根。 + */ + + }, { + key: "cubicRootAt", + value: function cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + var n = 0; + + if (this.isAroundZero(A) && this.isAroundZero(B)) { + if (this.isAroundZero(b)) { + roots[0] = 0; + } else { + var t1 = -c / b; //t1, t2, t3, b is not zero + + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = B * B - 4 * A * C; + + if (this.isAroundZero(disc)) { + var K = B / A; + + var _t2 = -b / a + K; // t1, a is not zero + + + var t2 = -K / 2; // t2, t3 + + if (_t2 >= 0 && _t2 <= 1) { + roots[n++] = _t2; + } + + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } else if (disc > 0) { + var discSqrt = Math.sqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + + if (Y1 < 0) { + Y1 = -Math.pow(-Y1, this.ONE_THIRD); + } else { + Y1 = Math.pow(Y1, this.ONE_THIRD); + } + + if (Y2 < 0) { + Y2 = -Math.pow(-Y2, this.ONE_THIRD); + } else { + Y2 = Math.pow(Y2, this.ONE_THIRD); + } + + var _t3 = (-b - (Y1 + Y2)) / (3 * a); + + if (_t3 >= 0 && _t3 <= 1) { + roots[n++] = _t3; + } + } else { + var T = (2 * A * b - 3 * a * B) / (2 * Math.sqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = Math.sqrt(A); + var tmp = Math.cos(theta); + + var _t4 = (-b - 2 * ASqrt * tmp) / (3 * a); + + var _t5 = (-b + ASqrt * (tmp + this.THREE_SQRT * Math.sin(theta))) / (3 * a); + + var t3 = (-b + ASqrt * (tmp - this.THREE_SQRT * Math.sin(theta))) / (3 * a); + + if (_t4 >= 0 && _t4 <= 1) { + roots[n++] = _t4; + } + + if (_t5 >= 0 && _t5 <= 1) { + roots[n++] = _t5; + } + + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + + return n; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicRootAt + * @description 计算三次贝塞尔方程极限值的位置 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {Array.} extrema - 值。 + * @returns {number} 有效数目。 + */ + + }, { + key: "cubicExtrema", + value: function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + var n = 0; + + if (this.isAroundZero(a)) { + if (this.isNotAroundZero(b)) { + var t1 = -c / b; + + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + + if (this.isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } else if (disc > 0) { + var discSqrt = Math.sqrt(disc); + + var _t6 = (-b + discSqrt) / (2 * a); + + var t2 = (-b - discSqrt) / (2 * a); + + if (_t6 >= 0 && _t6 <= 1) { + extrema[n++] = _t6; + } + + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + + return n; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicSubdivide + * @description 细分三次贝塞尔曲线 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} p3 - 点p3。 + * @param {number} t - t值。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射点。 + */ + + }, { + key: "cubicSubdivide", + value: function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + var p0123 = (p123 - p012) * t + p012; // Seg0 + + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; // Seg1 + + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.cubicProjectPoint + * @description 投射点到三次贝塞尔曲线上,返回投射距离。投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 - 点p0横坐标。 + * @param {number} y0 - 点p0纵坐标。 + * @param {number} x1 - 点p1横坐标。 + * @param {number} y1 - 点p1纵坐标。 + * @param {number} x2 - 点p2横坐标。 + * @param {number} y2 - 点p2纵坐标。 + * @param {number} x3 - 点p3横坐标。 + * @param {number} y3 - 点p3纵坐标。 + * @param {number} x - 点p横坐标。 + * @param {number} y - 点p纵坐标。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射点。 + */ + + }, { + key: "cubicProjectPoint", + value: function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + // 临时变量 + var _v0 = this.vector.create(); + + var _v1 = this.vector.create(); + + var _v2 = this.vector.create(); // var _v3 = vector.create(); + // http://pomax.github.io/bezierinfo/#projections + + + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = this.cubicAt(x0, x1, x2, x3, _t); + _v1[1] = this.cubicAt(y0, y1, y2, y3, _t); + var d1 = this.vector.distSquare(_v0, _v1); + + if (d1 < d) { + t = _t; + d = d1; + } + } + + d = Infinity; // At most 32 iteration + + for (var i = 0; i < 32; i++) { + if (interval < this.EPSILON) { + break; + } + + var prev = t - interval; + var next = t + interval; // t - interval + + _v1[0] = this.cubicAt(x0, x1, x2, x3, prev); + _v1[1] = this.cubicAt(y0, y1, y2, y3, prev); + + var _d = this.vector.distSquare(_v1, _v0); + + if (prev >= 0 && _d < d) { + t = prev; + d = _d; + } else { + // t + interval + _v2[0] = this.cubicAt(x0, x1, x2, x3, next); + _v2[1] = this.cubicAt(y0, y1, y2, y3, next); + var d2 = this.vector.distSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } // t + + + if (out) { + out[0] = this.cubicAt(x0, x1, x2, x3, t); + out[1] = this.cubicAt(y0, y1, y2, y3, t); + } // console.log(interval, i); + + + return Math.sqrt(d); + } + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticAt + * @description 计算二次方贝塞尔值。 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} t - t值。 + * @returns {number} 二次方贝塞尔值。 + */ + + }, { + key: "quadraticAt", + value: function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticAt + * @description 计算二次方贝塞尔导数值。 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} t - t值。 + * @returns {number} 二次方贝塞尔导数值。 + */ + + }, { + key: "quadraticDerivativeAt", + value: function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticRootAt + * @description 计算二次方贝塞尔方程根 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @param {number} val - 值。 + * @param {Array.} roots - 有效根数目。 + * @returns {number} 有效根数目。 + */ + + }, { + key: "quadraticRootAt", + value: function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + var n = 0; + + if (this.isAroundZero(a)) { + if (this.isNotAroundZero(b)) { + var t1 = -c / b; + + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + + if (this.isAroundZero(disc)) { + var _t7 = -b / (2 * a); + + if (_t7 >= 0 && _t7 <= 1) { + roots[n++] = _t7; + } + } else if (disc > 0) { + var discSqrt = Math.sqrt(disc); + + var _t8 = (-b + discSqrt) / (2 * a); + + var t2 = (-b - discSqrt) / (2 * a); + + if (_t8 >= 0 && _t8 <= 1) { + roots[n++] = _t8; + } + + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + + return n; + } + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticExtremum + * @description 计算二次贝塞尔方程极限值 + * @param {number} p0 - 点p0。 + * @param {number} p1 - 点p1。 + * @param {number} p2 - 点p2。 + * @returns {number} 二次贝塞尔方程极限值。 + */ + + }, { + key: "quadraticExtremum", + value: function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } else { + return (p0 - p1) / divider; + } + } + /** + * @function LevelRenderer.Tool.Curve.prototype.quadraticProjectPoint + * @description 投射点到二次贝塞尔曲线上,返回投射距离。投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 - 点p0横坐标。 + * @param {number} y0 - 点p0纵坐标。 + * @param {number} x1 - 点p1横坐标。 + * @param {number} y1 - 点p1纵坐标。 + * @param {number} x2 - 点p2横坐标。 + * @param {number} y2 - 点p2纵坐标。 + * @param {number} x - 点p横坐标。 + * @param {number} y - 点p纵坐标。 + * @param {Array.} out - 投射点。 + * @returns {number} 投射距离。 + */ + + }, { + key: "quadraticProjectPoint", + value: function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + // 临时变量 + var _v0 = this.vector.create(); + + var _v1 = this.vector.create(); + + var _v2 = this.vector.create(); // http://pomax.github.io/bezierinfo/#projections + + + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = this.quadraticAt(x0, x1, x2, _t); + _v1[1] = this.quadraticAt(y0, y1, y2, _t); + var d1 = this.vector.distSquare(_v0, _v1); + + if (d1 < d) { + t = _t; + d = d1; + } + } + + d = Infinity; // At most 32 iteration + + for (var i = 0; i < 32; i++) { + if (interval < this.EPSILON) { + break; + } + + var prev = t - interval; + var next = t + interval; // t - interval + + _v1[0] = this.quadraticAt(x0, x1, x2, prev); + _v1[1] = this.quadraticAt(y0, y1, y2, prev); + + var _d2 = this.vector.distSquare(_v1, _v0); + + if (prev >= 0 && _d2 < d) { + t = prev; + d = _d2; + } else { + // t + interval + _v2[0] = this.quadraticAt(x0, x1, x2, next); + _v2[1] = this.quadraticAt(y0, y1, y2, next); + var d2 = this.vector.distSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } // t + + + if (out) { + out[0] = this.quadraticAt(x0, x1, x2, t); + out[1] = this.quadraticAt(y0, y1, y2, t); + } // console.log(interval, i); + + + return Math.sqrt(d); + } + }]); + + return Curve; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Area.js +function Area_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Area_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Area_createClass(Constructor, protoProps, staticProps) { if (protoProps) Area_defineProperties(Constructor.prototype, protoProps); if (staticProps) Area_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer.Tool.Area + * @category Visualization Theme + * @classdesc LevelRenderer 工具-图形范围判断 + * @private + */ + +var Area = /*#__PURE__*/function () { + function Area() { + Area_classCallCheck(this, Area); + + /** + * @member {LevelRenderer.Tool.Util} LevelRenderer.Tool.Areal.prototype.util + * @description 基础工具对象。 + */ + this.util = new Util_Util(); + /** + * @member {LevelRenderer.Tool.Curve} LevelRenderer.Tool.Areal.prototype.curve + * @description 曲线工具对象 + */ + + this.curve = new Curve_Curve(); + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._ctx + * @description Cavans2D 渲染上下文 + */ + + this._ctx = null; + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._textWidthCache + * @description 文本宽度缓存 + */ + + this._textWidthCache = {}; + /** + * @member {Object} LevelRenderer.Tool.Areal.prototype._textHeightCache + * @description 文本高度缓存 + */ + + this._textHeightCache = {}; + /** + * @member {number} LevelRenderer.Tool.Areal.prototype._textWidthCacheCounter + * @description 文本宽度缓存数量 + */ + + this._textWidthCacheCounter = 0; + /** + * @member {number} LevelRenderer.Tool.Areal.prototype._textHeightCacheCounter + * @description 文本高度缓存数量 + */ + + this._textHeightCacheCounter = 0; + /** + * @member {number} LevelRenderer.Tool.Areal.prototype.TEXT_CACHE_MAX + * @description 文本最大缓存数量 + */ + + this.TEXT_CACHE_MAX = 5000; + /** + * @member {number} LevelRenderer.Tool.Areal.prototype.PI2 + * @description 2*PI 的值 + */ + + this.PI2 = Math.PI * 2; + /** + * @member {Array.} LevelRenderer.Tool.Areal.prototype.roots + * @description 临时数组 + */ + + this.roots = [-1, -1, -1]; + /** + * @member {Array.} LevelRenderer.Tool.Areal.prototype.extrema + * @description 临时数组 + */ + + this.extrema = [-1, -1]; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Area"; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.normalizeRadian + * @description 弧度标准化函数。 + * @param {number} angle - 弧度值。 + * @returns {number} 标准化后的弧度值。 + */ + + + Area_createClass(Area, [{ + key: "normalizeRadian", + value: function normalizeRadian(angle) { + angle %= this.PI2; + + if (angle < 0) { + angle += this.PI2; + } + + return angle; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInside + * @description 包含判断。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置。 + */ + + }, { + key: "isInside", + value: function isInside(shape, area, x, y) { + if (!area || !shape) { + // 无参数或不支持类型 + return false; + } + + var zoneType = shape.type; + this._ctx = this._ctx || this.util.getContext(); // 未实现或不可用时则数学运算,主要是line,brokenLine,ring + + var _mathReturn = this._mathMethod(shape, area, x, y); + + if (typeof _mathReturn != 'undefined') { + return _mathReturn; + } + + if (shape.buildPath && this._ctx.isPointInPath) { + return this._buildPathMethod(shape, this._ctx, area, x, y); + } // 上面的方法都行不通时 + + + switch (zoneType) { + case 'ellipse': // Todo,不精确 + + case 'smicellipse': + // Todo,不精确 + return true; + // 旋轮曲线 不准确 + + case 'trochoid': + var _r = area.location == 'out' ? area.r1 + area.r2 + area.d : area.r1 - area.r2 + area.d; + + return this.isInsideCircle(area, x, y, _r); + // 玫瑰线 不准确 + + case 'rose': + return this.isInsideCircle(area, x, y, area.maxr); + // 路径,椭圆,曲线等-----------------13 + + default: + return false; + // Todo,暂不支持 + } + } + /** + * @function LevelRenderer.Tool.Areal.prototype._mathMethod + * @description 包含判断。用数学方法判断,三个方法中最快,但是支持的shape少。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形中。 + */ + + }, { + key: "_mathMethod", + value: function _mathMethod(shape, area, x, y) { + var zoneType = shape.type; // 在矩形内则部分图形需要进一步判断 + + switch (zoneType) { + // 贝塞尔曲线 + case 'bezier-curve': + if (typeof area.cpX2 === 'undefined') { + return this.isInsideQuadraticStroke(area.xStart, area.yStart, area.cpX1, area.cpY1, area.xEnd, area.yEnd, area.lineWidth, x, y); + } + + return this.isInsideCubicStroke(area.xStart, area.yStart, area.cpX1, area.cpY1, area.cpX2, area.cpY2, area.xEnd, area.yEnd, area.lineWidth, x, y); + // 线 + + case 'line': + return this.isInsideLine(area.xStart, area.yStart, area.xEnd, area.yEnd, area.lineWidth, x, y); + // 折线 + + case 'broken-line': + return this.isInsideBrokenLine(area.pointList, area.lineWidth, x, y); + // 扩展折线 + + case 'smicbroken-line': + { + // SMIC-修改 - start + var icX = x; + var icY = y; + + if (shape.refOriginalPosition) { + icX = x - shape.refOriginalPosition[0]; + icY = y - shape.refOriginalPosition[1]; + } + + return this.isInsideBrokenLine(area.pointList, area.lineWidth, icX, icY); + } + //初始代码: + // return isInsideBrokenLine( + // area.pointList, area.lineWidth, x, y + // ); + // SMIC-修改 - end + // 圆环 + + case 'ring': + return this.isInsideRing(area.x, area.y, area.r0, area.r, x, y); + + case 'smicring': + { + var areaX = area.x; + var areaY = area.y; + + if (shape.refOriginalPosition) { + areaX = area.x + shape.refOriginalPosition[0]; + areaY = area.y + shape.refOriginalPosition[1]; + } + + return this.isInsideRing(areaX, areaY, area.r0, area.r, x, y); + } + // 圆形 + + case 'circle': + return this.isInsideCircle(area.x, area.y, area.r, x, y); + // 扩展-点 + + case 'smicpoint': + { + // SMIC-修改 - start + var _icX = x; + var _icY = y; + + if (shape.refOriginalPosition) { + _icX = x - shape.refOriginalPosition[0]; + _icY = y - shape.refOriginalPosition[1]; + } + + return this.isInsideCircle(area.x, area.y, area.r, _icX, _icY); + } + //初始代码: + // 无 + // SMIC-修改 - end + // 扇形 + + case 'sector': + { + var startAngle = area.startAngle * Math.PI / 180; + var endAngle = area.endAngle * Math.PI / 180; + + if (!area.clockWise) { + startAngle = -startAngle; + endAngle = -endAngle; + } + + return this.isInsideSector(area.x, area.y, area.r0, area.r, startAngle, endAngle, !area.clockWise, x, y); + } + //初始代码: + // 无 + // SMIC-增加 - end + // 扇形 + + case 'smicsector': + { + var _startAngle = area.startAngle * Math.PI / 180; + + var _endAngle = area.endAngle * Math.PI / 180; + + if (!area.clockWise) { + _startAngle = -_startAngle; + _endAngle = -_endAngle; + } + + var _areaX = area.x; + var _areaY = area.y; + + if (shape.refOriginalPosition) { + _areaX = area.x + shape.refOriginalPosition[0]; + _areaY = area.y + shape.refOriginalPosition[1]; + } + + return this.isInsideSector(_areaX, _areaY, area.r0, area.r, _startAngle, _endAngle, !area.clockWise, x, y); + } + // 多边形 + + case 'path': + return this.isInsidePath(area.pathArray, Math.max(area.lineWidth, 5), area.brushType, x, y); + + case 'polygon': + case 'star': + case 'smicstar': + case 'isogon': + case 'smicisogon': + return this.isInsidePolygon(area.pointList, x, y); + // 扩展多边形 + + case 'smicpolygon': + { + // SMIC-修改 - start + var _icX2 = x; + var _icY2 = y; + + if (shape.refOriginalPosition) { + _icX2 = x - shape.refOriginalPosition[0]; + _icY2 = y - shape.refOriginalPosition[1]; + } //岛洞面 + + + if (shape.holePolygonPointLists && shape.holePolygonPointLists.length > 0) { + var isOnBase = this.isInsidePolygon(area.pointList, _icX2, _icY2); // 遍历岛洞子面 + + var holePLS = shape.holePolygonPointLists; + var isOnHole = false; + + for (var i = 0, holePLSen = holePLS.length; i < holePLSen; i++) { + var holePL = holePLS[i]; + var isOnSubHole = this.isInsidePolygon(holePL, _icX2, _icY2); + + if (isOnSubHole === true) { + isOnHole = true; + } + } // 捕获判断 + + + return isOnBase === true && isOnHole === false; + } else { + return this.isInsidePolygon(area.pointList, _icX2, _icY2); + } + } + // 初始代码: + // 无 + // SMIC-修改 - end + // 文本 + + case 'text': + var rect = area.__rect || shape.getRect(area); + return this.isInsideRect(rect.x, rect.y, rect.width, rect.height, x, y); + // 扩展文本 + + case 'smictext': + //用文本背景矩形判断 + var textBg = shape.getTextBackground(area); + return this.isInsidePolygon(textBg, x, y); + //初始代码: + // 无 + // SMIC-修改 - end + // 矩形 + + case 'rectangle': + case 'image': + // 图片 + return this.isInsideRect(area.x, area.y, area.width, area.height, x, y); + + case 'smicimage': + { + var _areaX2 = area.x; + var _areaY2 = area.y; + + if (shape.refOriginalPosition) { + _areaX2 = area.x + shape.refOriginalPosition[0]; + _areaY2 = area.y + shape.refOriginalPosition[1]; + } + + return this.isInsideRect(_areaX2, _areaY2, area.width, area.height, x, y); + } + //// 扩展矩形 + //case 'smicpolygon': + // // SMIC-修改 - start + // var icX = x; + // var icY = y; + // if(shape.refOriginalPosition) { + // icX = x - shape.refOriginalPosition[0]; + // icY = y - shape.refOriginalPosition[1]; + // } + // return this.isInsideRect( + // area.x, area.y, area.width, area.height, icX, icY + // ); + //初始代码: + // 无 + // SMIC-修改 - end + } + } + /** + * @function LevelRenderer.Tool.Areal.prototype._buildPathMethod + * @description 包含判断。通过buildPath方法来判断,三个方法中较快,但是不支持线条类型的 shape。 + * @param {Object} shape - 图形。 + * @param {Object} context - 上下文。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形中。 + */ + + }, { + key: "_buildPathMethod", + value: function _buildPathMethod(shape, context, area, x, y) { + // 图形类实现路径创建了则用类的path + context.beginPath(); + shape.buildPath(context, area); + context.closePath(); + return context.isPointInPath(x, y); + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isOutside + * @description 图形是否不包含鼠标位置。 + * @param {Object} shape - 图形。 + * @param {number} area - 目标区域。 + * @param {number} x - 横坐标。 + * @param {number} y - 纵坐标。 + * @returns {boolean} 图形是否不包含鼠标位置, true表示坐标处在图形外。 + */ + + }, { + key: "isOutside", + value: function isOutside(shape, area, x, y) { + return !this.isInside(shape, area, x, y); + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideLine + * @description 线段包含判断。 + * @param {number} x0 - 线起始点横坐标。 + * @param {number} y0 - 线起始点纵坐标。 + * @param {number} x1 - 线终点横坐标。 + * @param {number} y1 - 线终点纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置,true表示坐标处在图形内。 + */ + + }, { + key: "isInsideLine", + value: function isInsideLine(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + + var _l = Math.max(lineWidth, 5); + + var _a = 0; + var _b = 0; // Quick reject + + if (y > y0 + _l && y > y1 + _l || y < y0 - _l && y < y1 - _l || x > x0 + _l && x > x1 + _l || x < x0 - _l && x < x1 - _l) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } else { + return Math.abs(x - x0) <= _l / 2; + } + + var tmp = _a * x - y + _b; + + var _s = tmp * tmp / (_a * _a + 1); + + return _s <= _l / 2 * _l / 2; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideCubicStroke + * @description 三次贝塞尔曲线描边包含判断。 + * @param {number} x0 - 点1横坐标。 + * @param {number} y0 - 点1纵坐标。 + * @param {number} x1 - 点2横坐标。 + * @param {number} y1 - 点2纵坐标。 + * @param {number} x2 - 点3纵坐标。 + * @param {number} y2 - 点3纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideCubicStroke", + value: function isInsideCubicStroke(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + + var _l = Math.max(lineWidth, 5); // Quick reject + + + if (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) { + return false; + } + + var d = this.curve.cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null); + return d <= _l / 2; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideQuadraticStroke + * @description 二次贝塞尔曲线描边包含判断。 + * @param {number} x0 - 点1横坐标。 + * @param {number} y0 - 点1纵坐标。 + * @param {number} x1 - 点2横坐标。 + * @param {number} y1 - 点2纵坐标。 + * @param {number} x2 - 点3纵坐标。 + * @param {number} y2 - 点3纵坐标。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideQuadraticStroke", + value: function isInsideQuadraticStroke(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + + var _l = Math.max(lineWidth, 5); // Quick reject + + + if (y > y0 + _l && y > y1 + _l && y > y2 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l) { + return false; + } + + var d = this.curve.quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null); + return d <= _l / 2; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideArcStroke + * @description 圆弧描边包含判断。 + * @param {number} cx - 圆心横坐标。 + * @param {number} cy - 圆心纵坐标。 + * @param {number} r - 圆半径。 + * @param {number} startAngle - 起始角度。 + * @param {number} endAngle - 终止角度。 + * @param {number} anticlockwise - 顺时针还是逆时针。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideArcStroke", + value: function isInsideArcStroke(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + var PI2 = this.PI2; + + if (lineWidth === 0) { + return false; + } + + var _l = Math.max(lineWidth, 5); + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + + if (d - _l > r || d + _l < r) { + return false; + } + + if (Math.abs(startAngle - endAngle) >= PI2) { + // Is a circle + return true; + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = this.normalizeRadian(endAngle); + endAngle = this.normalizeRadian(tmp); + } else { + startAngle = this.normalizeRadian(startAngle); + endAngle = this.normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2; + } + + var angle = Math.atan2(y, x); + + if (angle < 0) { + angle += PI2; + } + + return angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideBrokenLine + * @description 图形 BrokenLine 是否包含鼠标位置, true表示坐标处在图形内。 + * @param {Array} points - 曲线点对象。 + * @param {number} lineWidth - 线宽。 + * @param {number} x - 鼠标位置横坐标。 + * @param {number} y - 鼠标位置纵坐标。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideBrokenLine", + value: function isInsideBrokenLine(points, lineWidth, x, y) { + var _lineWidth = Math.max(lineWidth, 10); + + for (var i = 0, l = points.length - 1; i < l; i++) { + var x0 = points[i][0]; + var y0 = points[i][1]; + var x1 = points[i + 1][0]; + var y1 = points[i + 1][1]; + + if (this.isInsideLine(x0, y0, x1, y1, _lineWidth, x, y)) { + return true; + } + } + + return false; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideRing + * @description 图形 Ring 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideRing", + value: function isInsideRing(cx, cy, r0, r, x, y) { + var d = (x - cx) * (x - cx) + (y - cy) * (y - cy); + return d < r * r && d > r0 * r0; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideRect + * @description 图形 Rect 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideRect", + value: function isInsideRect(x0, y0, width, height, x, y) { + return x >= x0 && x <= x0 + width && y >= y0 && y <= y0 + height; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideCircle + * @description 图形 Circle 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideCircle", + value: function isInsideCircle(x0, y0, r, x, y) { + return (x - x0) * (x - x0) + (y - y0) * (y - y0) < r * r; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsideSector + * @description 图形 Sector 是否包含鼠标位置, true表示坐标处在图形内。 + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsideSector", + value: function isInsideSector(cx, cy, r0, r, startAngle, endAngle, anticlockwise, x, y) { + return this.isInsideArcStroke(cx, cy, (r0 + r) / 2, startAngle, endAngle, anticlockwise, r - r0, x, y); + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsidePolygon + * @description 图形 Polygon 是否包含鼠标位置, true表示坐标处在图形内。与 canvas 一样采用 non-zero winding rule + * @returns {boolean} 图形是否包含鼠标位置, true表示坐标处在图形内。 + */ + + }, { + key: "isInsidePolygon", + value: function isInsidePolygon(points, x, y) { + var N = points.length; + var w = 0; + + for (var i = 0, j = N - 1; i < N; i++) { + var x0 = points[j][0]; + var y0 = points[j][1]; + var x1 = points[i][0]; + var y1 = points[i][1]; + w += this.windingLine(x0, y0, x1, y1, x, y); + j = i; + } + + return w !== 0; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.windingLine + */ + + }, { + key: "windingLine", + value: function windingLine(x0, y0, x1, y1, x, y) { + if (y > y0 && y > y1 || y < y0 && y < y1) { + return 0; + } + + if (y1 == y0) { + return 0; + } + + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + var x_ = t * (x1 - x0) + x0; + return x_ > x ? dir : 0; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.swapExtrema + */ + + }, { + key: "swapExtrema", + value: function swapExtrema() { + var tmp = this.extrema[0]; + this.extrema[0] = this.extrema[1]; + this.extrema[1] = tmp; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.windingCubic + */ + + }, { + key: "windingCubic", + value: function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + var curve = this.curve; + var roots = this.roots; + var extrema = this.extrema; // Quick reject + + if (y > y0 && y > y1 && y > y2 && y > y3 || y < y0 && y < y1 && y < y2 && y < y3) { + return 0; + } + + var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots); + + if (nRoots === 0) { + return 0; + } else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var x_ = curve.cubicAt(x0, x1, x2, x3, t); + + if (x_ < x) { + // Quick reject + continue; + } + + if (nExtrema < 0) { + nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema); + + if (extrema[1] < extrema[0] && nExtrema > 1) { + this.swapExtrema(); + } + + y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]); + + if (nExtrema > 1) { + y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } else if (t < extrema[1]) { + w += y1_ < y0_ ? 1 : -1; + } else { + w += y3 < y1_ ? 1 : -1; + } + } else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } else { + w += y3 < y0_ ? 1 : -1; + } + } + } + + return w; + } + } + /** + * @function LevelRenderer.Tool.Areal.prototype.windingQuadratic + */ + + }, { + key: "windingQuadratic", + value: function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + var curve = this.curve; + var roots = this.roots; // Quick reject + + if (y > y0 && y > y1 && y > y2 || y < y0 && y < y1 && y < y2) { + return 0; + } + + var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots); + + if (nRoots === 0) { + return 0; + } else { + var t = curve.quadraticExtremum(y0, y1, y2); + + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = curve.quadraticAt(y0, y1, y2, t); + + for (var i = 0; i < nRoots; i++) { + var x_ = curve.quadraticAt(x0, x1, x2, roots[i]); + + if (x_ > x) { + continue; + } + + if (roots[i] < t) { + w += y_ < y0 ? 1 : -1; + } else { + w += y2 < y_ ? 1 : -1; + } + } + + return w; + } else { + var _x_ = curve.quadraticAt(x0, x1, x2, roots[0]); + + if (_x_ > x) { + return 0; + } + + return y2 < y0 ? 1 : -1; + } + } + } + /** + * @function LevelRenderer.Tool.Areal.prototype.windingArc + * // TODO Arc 旋转 + */ + + }, { + key: "windingArc", + value: function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + var roots = this.roots; + var PI2 = this.PI2; + y -= cy; + + if (y > r || y < -r) { + return 0; + } + + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + if (Math.abs(startAngle - endAngle) >= PI2) { + // Is a circle + startAngle = 0; + endAngle = PI2; + var dir = anticlockwise ? 1 : -1; + + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + var _tmp = startAngle; + startAngle = this.normalizeRadian(endAngle); + endAngle = this.normalizeRadian(_tmp); + } else { + startAngle = this.normalizeRadian(startAngle); + endAngle = this.normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2; + } + + var w = 0; + + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + + var _dir = anticlockwise ? 1 : -1; + + if (angle < 0) { + angle = PI2 + angle; + } + + if (angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + _dir = -_dir; + } + + w += _dir; + } + } + } + + return w; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.isInsidePath + * @description 与 canvas 一样采用 non-zero winding rule + */ + + }, { + key: "isInsidePath", + value: function isInsidePath(pathArray, lineWidth, brushType, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var beginSubpath = true; + var firstCmd = true; + brushType = brushType || 'fill'; + var hasStroke = brushType === 'stroke' || brushType === 'both'; + var hasFill = brushType === 'fill' || brushType === 'both'; // var roots = [-1, -1, -1]; + + for (var i = 0; i < pathArray.length; i++) { + var seg = pathArray[i]; + var p = seg.points; // Begin a new subpath + + if (beginSubpath || seg.command === 'M') { + if (i > 0) { + // Close previous subpath + if (hasFill) { + w += this.windingLine(xi, yi, x0, y0, x, y); + } + + if (w !== 0) { + return true; + } + } + + x0 = p[p.length - 2]; + y0 = p[p.length - 1]; + beginSubpath = false; + + if (firstCmd && seg.command !== 'A') { + // 如果第一个命令不是M, 是lineTo, bezierCurveTo + // 等绘制命令的话,是会从该绘制的起点开始算的 + // Arc 会在之后做单独处理所以这里忽略 + firstCmd = false; + xi = x0; + yi = y0; + } + } + + switch (seg.command) { + case 'M': + xi = p[0]; + yi = p[1]; + break; + + case 'L': + if (hasStroke) { + if (this.isInsideLine(xi, yi, p[0], p[1], lineWidth, x, y)) { + return true; + } + } + + if (hasFill) { + w += this.windingLine(xi, yi, p[0], p[1], x, y); + } + + xi = p[0]; + yi = p[1]; + break; + + case 'C': + if (hasStroke) { + if (this.isInsideCubicStroke(xi, yi, p[0], p[1], p[2], p[3], p[4], p[5], lineWidth, x, y)) { + return true; + } + } + + if (hasFill) { + w += this.windingCubic(xi, yi, p[0], p[1], p[2], p[3], p[4], p[5], x, y); + } + + xi = p[4]; + yi = p[5]; + break; + + case 'Q': + if (hasStroke) { + if (this.isInsideQuadraticStroke(xi, yi, p[0], p[1], p[2], p[3], lineWidth, x, y)) { + return true; + } + } + + if (hasFill) { + w += this.windingQuadratic(xi, yi, p[0], p[1], p[2], p[3], x, y); + } + + xi = p[2]; + yi = p[3]; + break; + + case 'A': + // TODO Arc 旋转 + // TODO Arc 判断的开销比较大 + var cx = p[0]; + var cy = p[1]; + var rx = p[2]; + var ry = p[3]; + var theta = p[4]; + var dTheta = p[5]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令 + + if (!firstCmd) { + w += this.windingLine(xi, yi, x1, y1); + } else { + firstCmd = false; // 第一个命令起点还未定义 + + x0 = x1; + y0 = y1; + } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + + + var _x = (x - cx) * ry / rx + cx; + + if (hasStroke) { + if (this.isInsideArcStroke(cx, cy, ry, theta, theta + dTheta, 1 - p[7], lineWidth, _x, y)) { + return true; + } + } + + if (hasFill) { + w += this.windingArc(cx, cy, ry, theta, theta + dTheta, 1 - p[7], _x, y); + } + + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + + case 'z': + if (hasStroke) { + if (this.isInsideLine(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } + + beginSubpath = true; + break; + } + } + + if (hasFill) { + w += this.windingLine(xi, yi, x0, y0, x, y); + } + + return w !== 0; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.getTextWidth + * @description 测算多行文本宽度 + */ + + }, { + key: "getTextWidth", + value: function getTextWidth(text, textFont) { + var key = text + ':' + textFont; + + if (this._textWidthCache[key]) { + return this._textWidthCache[key]; + } + + this._ctx = this._ctx || this.util.getContext(); + + this._ctx.save(); + + if (textFont) { + this._ctx.font = textFont; + } + + text = (text + '').split('\n'); + var width = 0; + + for (var i = 0, l = text.length; i < l; i++) { + width = Math.max(this._ctx.measureText(text[i]).width, width); + } + + this._ctx.restore(); + + this._textWidthCache[key] = width; + + if (++this._textWidthCacheCounter > this.TEXT_CACHE_MAX) { + // 内存释放 + this._textWidthCacheCounter = 0; + this._textWidthCache = {}; + } + + return width; + } + /** + * @function LevelRenderer.Tool.Areal.prototype.getTextHeight + * @description 测算多行文本高度 + */ + + }, { + key: "getTextHeight", + value: function getTextHeight(text, textFont) { + var key = text + ':' + textFont; + + if (this._textHeightCache[key]) { + return this._textHeightCache[key]; + } + + this._ctx = this._ctx || this.util.getContext(); + + this._ctx.save(); + + if (textFont) { + this._ctx.font = textFont; + } + + text = (text + '').split('\n'); // 比较粗暴 + //var height = (this._ctx.measureText('国').width + 2) * text.length; //打包不支持中文,替换掉 + + var height = (this._ctx.measureText('ZH').width + 2) * text.length; + + this._ctx.restore(); + + this._textHeightCache[key] = height; + + if (++this._textHeightCacheCounter > this.TEXT_CACHE_MAX) { + // 内存释放 + this._textHeightCacheCounter = 0; + this._textHeightCache = {}; + } + + return height; + } + }]); + + return Area; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/ComputeBoundingBox.js +function ComputeBoundingBox_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ComputeBoundingBox_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ComputeBoundingBox_createClass(Constructor, protoProps, staticProps) { if (protoProps) ComputeBoundingBox_defineProperties(Constructor.prototype, protoProps); if (staticProps) ComputeBoundingBox_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer.Tool.ComputeBoundingBox + * @category Visualization Theme + * @classdesc LevelRenderer 工具-图形 Bounds 计算 + * @private + */ + +var ComputeBoundingBox = /*#__PURE__*/function () { + function ComputeBoundingBox() { + ComputeBoundingBox_classCallCheck(this, ComputeBoundingBox); + + if (arguments.length === 3) { + this.computeBoundingBox(arguments); + } + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.ComputeBoundingBox"; + } + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.computeBoundingBox + * @description 从顶点数组中计算出最小包围盒,写入'min'和'max'中。 + * @param {Array.} points - 顶点数组。 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + + + ComputeBoundingBox_createClass(ComputeBoundingBox, [{ + key: "computeBoundingBox", + value: function computeBoundingBox(points, min, max) { + if (points.length === 0) { + return; + } + + var left = points[0][0]; + var right = points[0][0]; + var top = points[0][1]; + var bottom = points[0][1]; + + for (var i = 1; i < points.length; i++) { + var p = points[i]; + + if (p[0] < left) { + left = p[0]; + } + + if (p[0] > right) { + right = p[0]; + } + + if (p[1] < top) { + top = p[1]; + } + + if (p[1] > bottom) { + bottom = p[1]; + } + } + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.cubeBezier + * @description 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入'min'和'max'中。原:computeCubeBezierBoundingBox。 + * @param {Array.} p0 - 三阶贝塞尔曲线p0点 + * @param {Array.} p1 - 三阶贝塞尔曲线p1点 + * @param {Array.} p2 - 三阶贝塞尔曲线p2点 + * @param {Array.} p3 - 三阶贝塞尔曲线p3点 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + + }, { + key: "cubeBezier", + value: function cubeBezier(p0, p1, p2, p3, min, max) { + var curve = new Curve_Curve(); + var xDim = []; + curve.cubicExtrema(p0[0], p1[0], p2[0], p3[0], xDim); + + for (var i = 0; i < xDim.length; i++) { + xDim[i] = curve.cubicAt(p0[0], p1[0], p2[0], p3[0], xDim[i]); + } + + var yDim = []; + curve.cubicExtrema(p0[1], p1[1], p2[1], p3[1], yDim); + + for (var _i = 0; _i < yDim.length; _i++) { + yDim[_i] = curve.cubicAt(p0[1], p1[1], p2[1], p3[1], yDim[_i]); + } + + xDim.push(p0[0], p3[0]); + yDim.push(p0[1], p3[1]); + var left = Math.min.apply(null, xDim); + var right = Math.max.apply(null, xDim); + var top = Math.min.apply(null, yDim); + var bottom = Math.max.apply(null, yDim); + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.quadraticBezier + * @description 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入'min'和'max'中。原:computeQuadraticBezierBoundingBox。 + * @param {Array.} p0 - 二阶贝塞尔曲线p0点 + * @param {Array.} p1 - 二阶贝塞尔曲线p1点 + * @param {Array.} p2 - 二阶贝塞尔曲线p2点 + * @param {Array.} min - 最小 + * @param {Array.} max - 最大 + */ + + }, { + key: "quadraticBezier", + value: function quadraticBezier(p0, p1, p2, min, max) { + var curve = new Curve_Curve(); // Find extremities, where derivative in x dim or y dim is zero + + var t1 = curve.quadraticExtremum(p0[0], p1[0], p2[0]); + var t2 = curve.quadraticExtremum(p0[1], p1[1], p2[1]); + t1 = Math.max(Math.min(t1, 1), 0); + t2 = Math.max(Math.min(t2, 1), 0); + var ct1 = 1 - t1; + var ct2 = 1 - t2; + var x1 = ct1 * ct1 * p0[0] + 2 * ct1 * t1 * p1[0] + t1 * t1 * p2[0]; + var y1 = ct1 * ct1 * p0[1] + 2 * ct1 * t1 * p1[1] + t1 * t1 * p2[1]; + var x2 = ct2 * ct2 * p0[0] + 2 * ct2 * t2 * p1[0] + t2 * t2 * p2[0]; + var y2 = ct2 * ct2 * p0[1] + 2 * ct2 * t2 * p1[1] + t2 * t2 * p2[1]; + min[0] = Math.min(p0[0], p2[0], x1, x2); + min[1] = Math.min(p0[1], p2[1], y1, y2); + max[0] = Math.max(p0[0], p2[0], x1, x2); + max[1] = Math.max(p0[1], p2[1], y1, y2); + } + /** + * @function LevelRenderer.Tool.ComputeBoundingBox.prototype.arc + * @description 从圆弧中计算出最小包围盒,写入'min'和'max'中。原:computeArcBoundingBox。 + * @param {number} x - 圆弧中心点 x + * @param {number} y - 圆弧中心点 y + * @param {number} r - 圆弧半径 + * @param {number} startAngle - 圆弧开始角度 + * @param {number} endAngle - 圆弧结束角度 + * @param {number} anticlockwise - 是否是顺时针 + * @param {number} min - 最小 + * @param {number} max - 最大 + */ + + }, { + key: "arc", + value: function arc(x, y, r, startAngle, endAngle, anticlockwise, min, max) { + var vec2 = new levelRenderer_Vector_Vector(); + var start = vec2.create(); + var end = vec2.create(); + var extremity = vec2.create(); + start[0] = Math.cos(startAngle) * r + x; + start[1] = Math.sin(startAngle) * r + y; + end[0] = Math.cos(endAngle) * r + x; + end[1] = Math.sin(endAngle) * r + y; + vec2.min(min, start, end); + vec2.max(max, start, end); // Thresh to [0, Math.PI * 2] + + startAngle = startAngle % (Math.PI * 2); + + if (startAngle < 0) { + startAngle = startAngle + Math.PI * 2; + } + + endAngle = endAngle % (Math.PI * 2); + + if (endAngle < 0) { + endAngle = endAngle + Math.PI * 2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += Math.PI * 2; + } else if (startAngle < endAngle && anticlockwise) { + startAngle += Math.PI * 2; + } + + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + + + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = Math.cos(angle) * r + x; + extremity[1] = Math.sin(angle) * r + y; + vec2.min(min, extremity, min); + vec2.max(max, extremity, max); + } + } + } + }]); + + return ComputeBoundingBox; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Env.js +function Env_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Env_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Env_createClass(Constructor, protoProps, staticProps) { if (protoProps) Env_defineProperties(Constructor.prototype, protoProps); if (staticProps) Env_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Tool.Env + * @category Visualization Theme + * @classdesc 环境识别 + * @private + */ +var Env = /*#__PURE__*/function () { + function Env() { + Env_classCallCheck(this, Env); + + // Zepto.js + // (c) 2010-2013 Thomas Fuchs + // Zepto.js may be freely distributed under the MIT license. + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Env"; + var me = this; + + function detect(ua) { + var os = me.os = {}; + var browser = me.browser = {}; + var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + var touchpad = webos && ua.match(/TouchPad/); + var kindle = ua.match(/Kindle\/([\d.]+)/); + var silk = ua.match(/Silk\/([\d._]+)/); + var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + var playbook = ua.match(/PlayBook/); + var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE ([\d.]+)/); + var safari = webkit && ua.match(/Mobile\//) && !chrome; + var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + /*eslint-disable*/ + + if (browser.webkit = !!webkit) { + browser.version = webkit[1]; + } + + if (android) { + os.android = true; + os.version = android[2]; + } + + if (iphone && !ipod) { + os.ios = os.iphone = true; + os.version = iphone[2].replace(/_/g, '.'); + } + + if (ipad) { + os.ios = os.ipad = true; + os.version = ipad[2].replace(/_/g, '.'); + } + + if (ipod) { + os.ios = os.ipod = true; + os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + } + + if (webos) { + os.webos = true; + os.version = webos[2]; + } + + if (touchpad) { + os.touchpad = true; + } + + if (blackberry) { + os.blackberry = true; + os.version = blackberry[2]; + } + + if (bb10) { + os.bb10 = true; + os.version = bb10[2]; + } + + if (rimtabletos) { + os.rimtabletos = true; + os.version = rimtabletos[2]; + } + + if (playbook) { + browser.playbook = true; + } + + if (kindle) { + os.kindle = true; + os.version = kindle[1]; + } + + if (silk) { + browser.silk = true; + browser.version = silk[1]; + } + + if (!silk && os.android && ua.match(/Kindle Fire/)) { + browser.silk = true; + } + + if (chrome) { + browser.chrome = true; + browser.version = chrome[1]; + } + + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + + if (safari && (ua.match(/Safari/) || !!os.ios)) { + browser.safari = true; + } + + if (webview) { + browser.webview = true; + } + + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + + os.tablet = !!(ipad || playbook || android && !ua.match(/Mobile/) || firefox && ua.match(/Tablet/) || ie && !ua.match(/Phone/) && ua.match(/Touch/)); + os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || chrome && ua.match(/Android/) || chrome && ua.match(/CriOS\/([\d.]+)/) || firefox && ua.match(/Mobile/) || ie && ua.match(/Touch/))); + return { + browser: browser, + os: os, + // 原生canvas支持 + canvasSupported: document.createElement('canvas').getContext ? true : false + }; + } + + return detect(navigator.userAgent); + } + + Env_createClass(Env, [{ + key: "destory", + value: function destory() { + return true; + } + }]); + + return Env; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Event.js +function Event_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Event_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Event_createClass(Constructor, protoProps, staticProps) { if (protoProps) Event_defineProperties(Constructor.prototype, protoProps); if (staticProps) Event_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Tool.Event + * @category Visualization Theme + * @classdesc LevelRenderer 工具-事件辅助类 + * @private + */ +var Event_Event = /*#__PURE__*/function () { + function Event() { + Event_classCallCheck(this, Event); + + /** + * @member {function} LevelRenderer.Tool.Event.prototype.stop + * @description 停止冒泡和阻止默认行为 + */ + this.stop = typeof window.addEventListener === 'function' ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Event"; + } + /** + * @function LevelRenderer.Tool.Event.prototype.getX + * @description 提取鼠标(手指)x坐标。 + * @param {Event} e - 事件。 + * @returns {number} 鼠标(手指)x坐标。 + */ + + + Event_createClass(Event, [{ + key: "getX", + value: function getX(e) { + return typeof e.zrenderX != 'undefined' && e.zrenderX || typeof e.offsetX != 'undefined' && e.offsetX || typeof e.layerX != 'undefined' && e.layerX || typeof e.clientX != 'undefined' && e.clientX; + } + /** + * @function LevelRenderer.Tool.Event.prototype.getY + * @description 提取鼠标(手指)y坐标。 + * @param {Event} e - 事件。 + * @returns {number} 鼠标(手指)y坐标。 + */ + + }, { + key: "getY", + value: function getY(e) { + return typeof e.zrenderY != 'undefined' && e.zrenderY || typeof e.offsetY != 'undefined' && e.offsetY || typeof e.layerY != 'undefined' && e.layerY || typeof e.clientY != 'undefined' && e.clientY; + } + /** + * @function LevelRenderer.Tool.Event.prototype.getDelta + * @description 提取鼠标滚轮变化。 + * @param {Event} e - 事件。 + * @returns {number} 滚轮变化,正值说明滚轮是向上滚动,如果是负值说明滚轮是向下滚动。 + */ + + }, { + key: "getDelta", + value: function getDelta(e) { + return typeof e.zrenderDelta != 'undefined' && e.zrenderDelta || typeof e.wheelDelta != 'undefined' && e.wheelDelta || typeof e.detail != 'undefined' && -e.detail; + } + }]); + + return Event; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Http.js +function Http_typeof(obj) { "@babel/helpers - typeof"; return Http_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Http_typeof(obj); } + +function Http_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Http_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Http_createClass(Constructor, protoProps, staticProps) { if (protoProps) Http_defineProperties(Constructor.prototype, protoProps); if (staticProps) Http_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Http + * @category Visualization Theme + * @classdesc LevelRenderer 工具-Http + */ +var Http = /*#__PURE__*/function () { + function Http() { + Http_classCallCheck(this, Http); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Http"; + } + /** + * @function LevelRenderer.Tool.Http.prototype.get + * @description get请求。 + * @param {(string|IHTTPGetOption)} url - 请求url + * @param {function} onsuccess - 请求成功函数 + * @param {function} onerror - 请求失败函数 + * @param {Object} opts - 额外参数 + * @returns {number} cos值 + */ + + + Http_createClass(Http, [{ + key: "get", + value: function get(url, onsuccess, onerror) { + if (Http_typeof(url) === 'object') { + var obj = url; + url = obj.url; + onsuccess = obj.onsuccess; + onerror = obj.onerror; + } + + var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP'); + xhr.open('GET', url, true); + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { + onsuccess && onsuccess(xhr.responseText); + } else { + onerror && onerror(); + } + + xhr.onreadystatechange = new Function(); + xhr = null; + } + }; + + xhr.send(null); + } + }]); + + return Http; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Config.js +function Config_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Config_createClass(Constructor, protoProps, staticProps) { if (protoProps) Config_defineProperties(Constructor.prototype, protoProps); if (staticProps) Config_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Config_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Config = /*#__PURE__*/Config_createClass(function Config() { + Config_classCallCheck(this, Config); +}); +/** + * @enum EVENT + * @description 事件 + * @type {Object} + * @private + */ + +Config.EVENT = { + //窗口大小变化 + RESIZE: 'resize', + //鼠标按钮被(手指)按下,事件对象是:目标图形元素或空 + CLICK: 'click', + //双击事件 + DBLCLICK: 'dblclick', + //鼠标滚轮变化,事件对象是:目标图形元素或空 + MOUSEWHEEL: 'mousewheel', + //鼠标(手指)被移动,事件对象是:目标图形元素或空 + MOUSEMOVE: 'mousemove', + //鼠标移到某图形元素之上,事件对象是:目标图形元素 + MOUSEOVER: 'mouseover', + //鼠标从某图形元素移开,事件对象是:目标图形元素 + MOUSEOUT: 'mouseout', + //鼠标按钮(手指)被按下,事件对象是:目标图形元素或空 + MOUSEDOWN: 'mousedown', + //鼠标按键(手指)被松开,事件对象是:目标图形元素或空 + MOUSEUP: 'mouseup', + //全局离开,MOUSEOUT触发比较频繁,一次离开优化绑定 + GLOBALOUT: 'globalout', + // 一次成功元素拖拽的行为事件过程是: + // dragstart > dragenter > dragover [> dragleave] > drop > dragend + //开始拖拽时触发,事件对象是:被拖拽图形元素 + DRAGSTART: 'dragstart', + //拖拽完毕时触发(在drop之后触发),事件对象是:被拖拽图形元素 + DRAGEND: 'dragend', + //拖拽图形元素进入目标图形元素时触发,事件对象是:目标图形元素 + DRAGENTER: 'dragenter', + //拖拽图形元素在目标图形元素上移动时触发,事件对象是:目标图形元素 + DRAGOVER: 'dragover', + //拖拽图形元素离开目标图形元素时触发,事件对象是:目标图形元素 + DRAGLEAVE: 'dragleave', + //拖拽图形元素放在目标图形元素内时触发,事件对象是:目标图形元素 + DROP: 'drop', + //touch end - start < delay is click + touchClickDelay: 300 +}; +/** + * @enum catchBrushException + * @description 是否异常捕获 + * @type {boolean} + * @private + */ + +Config.catchBrushException = false; +/** + * @enum debugMode + * @description debug 日志选项:catchBrushException 为 true 下有效。 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + * @type {boolean} + * @private + */ + +Config.debugMode = 0; +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Log.js +function Log_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Log_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Log_createClass(Constructor, protoProps, staticProps) { if (protoProps) Log_defineProperties(Constructor.prototype, protoProps); if (staticProps) Log_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Log + * @category Visualization Theme + * @classdesc LevelRenderer 工具-日志 + */ + +var Log = /*#__PURE__*/function () { + function Log() { + Log_classCallCheck(this, Log); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Log"; + return function () { + if (+Config.debugMode === 0) { + return; + } else if (+Config.debugMode === 1) { + for (var k in arguments) { + throw new Error(arguments[k]); + } + } else if (+Config.debugMode > 1) { + for (var _k in arguments) { + console.log(arguments[_k]); + } + } + }; + /* for debug + return function(mes) { + document.getElementById('wrong-message').innerHTML = + mes + ' ' + (new Date() - 0) + + '
' + + document.getElementById('wrong-message').innerHTML; + }; + */ + } + + Log_createClass(Log, [{ + key: "destory", + value: function destory() { + return true; + } + }]); + + return Log; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Math.js +function Math_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Math_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Math_createClass(Constructor, protoProps, staticProps) { if (protoProps) Math_defineProperties(Constructor.prototype, protoProps); if (staticProps) Math_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Math + * @category Visualization Theme + * @classdesc LevelRenderer 工具-数学辅助类 + */ +var MathTool = /*#__PURE__*/function () { + function MathTool() { + Math_classCallCheck(this, MathTool); + + /** + * @member {number} LevelRenderer.Tool.Math._radians + * @description 角度与弧度转化参数 + */ + this._radians = window.Math.PI / 180; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Math"; + } + /** + * @function LevelRenderer.Tool.Math.prototype.sin + * @description 正弦函数。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} sin 值。 + */ + + + Math_createClass(MathTool, [{ + key: "sin", + value: function sin(angle, isDegrees) { + return window.Math.sin(isDegrees ? angle * this._radians : angle); + } + /** + * @function LevelRenderer.Tool.Math.prototype.cos + * @description 余弦函数。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} cos 值。 + */ + + }, { + key: "cos", + value: function cos(angle, isDegrees) { + return window.Math.cos(isDegrees ? angle * this._radians : angle); + } + /** + * @function LevelRenderer.Tool.Math.prototype.degreeToRadian + * @description 角度转弧度。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} 弧度值。 + */ + + }, { + key: "degreeToRadian", + value: function degreeToRadian(angle) { + return angle * this._radians; + } + /** + * @function LevelRenderer.Tool.Math.prototype.radianToDegree + * @description 弧度转角度。 + * @param {number} angle - 弧度(角度)参数。 + * @param {boolean} [isDegrees=false] - angle参数是否为角度计算,angle为以弧度计量的角度。 + * @returns {number} 角度。 + */ + + }, { + key: "radianToDegree", + value: function radianToDegree(angle) { + return angle / this._radians; + } + }]); + + return MathTool; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Matrix.js +function Matrix_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Matrix_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Matrix_createClass(Constructor, protoProps, staticProps) { if (protoProps) Matrix_defineProperties(Constructor.prototype, protoProps); if (staticProps) Matrix_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Tool.Matrix + * @category Visualization Theme + * @classdesc LevelRenderer 工具-3x2矩阵操作类 + */ +var Matrix = /*#__PURE__*/function () { + function Matrix() { + Matrix_classCallCheck(this, Matrix); + + /** + * @member {Object} LevelRenderer.Tool.Matrix.prototype.ArrayCtor + * @description 数组类型控制 + */ + this.ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; + this.CLASS_NAME = "SuperMap.LevelRenderer.Tool.Matrix"; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.create + * @description 创建一个单位矩阵。 + * @returns {(Float32Array|Array.)} 单位矩阵。 + */ + + + Matrix_createClass(Matrix, [{ + key: "create", + value: function create() { + var ArrayCtor = this.ArrayCtor; + var out = new ArrayCtor(6); + this.identity(out); + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.identity + * @description 设置矩阵为单位矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @returns {(Float32Array|Array.)} 单位矩阵。 + */ + + }, { + key: "identity", + value: function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.copy + * @description 复制矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @returns {(Float32Array|Array.)} 克隆矩阵。 + */ + + }, { + key: "copy", + value: function copy(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.mul + * @description 矩阵相乘。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} m1 - 矩阵m1。 + * @param {(Float32Array|Array.)} m2- 矩阵m2。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "mul", + value: function mul(out, m1, m2) { + out[0] = m1[0] * m2[0] + m1[2] * m2[1]; + out[1] = m1[1] * m2[0] + m1[3] * m2[1]; + out[2] = m1[0] * m2[2] + m1[2] * m2[3]; + out[3] = m1[1] * m2[2] + m1[3] * m2[3]; + out[4] = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + out[5] = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.mul + * @description 平移变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v- 平移参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "translate", + value: function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.rotate + * @description 平移变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} rad - 旋转参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "rotate", + value: function rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.scale + * @description 缩放变换。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v - 缩放参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "scale", + value: function scale(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.invert + * @description 求逆矩阵。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "invert", + value: function invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var det = aa * ad - ab * ac; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + /** + * @function LevelRenderer.Tool.Matrix.prototype.mulVector + * @description 矩阵左乘向量。 + * @param {(Float32Array|Array.)} out - 单位矩阵。 + * @param {(Float32Array|Array.)} a - 矩阵。 + * @param {(Float32Array|Array.)} v - 缩放参数。 + * @returns {(Float32Array|Array.)} 结果矩阵。 + */ + + }, { + key: "mulVector", + value: function mulVector(out, a, v) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + out[0] = v[0] * aa + v[1] * ac + atx; + out[1] = v[0] * ab + v[1] * ad + aty; + return out; + } + }]); + + return Matrix; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SUtil.js +function SUtil_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SUtil_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SUtil_createClass(Constructor, protoProps, staticProps) { if (protoProps) SUtil_defineProperties(Constructor.prototype, protoProps); if (staticProps) SUtil_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +var SUtil_SUtil = /*#__PURE__*/function () { + function SUtil() { + SUtil_classCallCheck(this, SUtil); + } + + SUtil_createClass(SUtil, null, [{ + key: "SUtil_smoothBezier", + value: + /** + * @function LevelRenderer.SUtil.SUtil_smoothBezier + * @description 贝塞尔平滑曲线。 + * @private + * @param {Array} points - 线段顶点数组。 + * @param {number} smooth - 平滑等级, 0-1。 + * @param {boolean} isLoop - isLoop。 + * @param {Array} constraint - 将计算出来的控制点约束在一个包围盒内,比如 [[0, 0], [100, 100]], 这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array.} [originalPosition=[0, 0]] - 参考原点。 + * @return {Array} 生成的平滑节点数组。 + */ + function SUtil_smoothBezier(points, smooth, isLoop, constraint, originalPosition) { + if (!originalPosition || originalPosition.length !== 2) { + originalPosition = [0, 0]; + } + + var __OP = originalPosition; + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var hasConstraint = !!constraint; + var min, max; + + if (hasConstraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + var _len = points.length; + + for (var i = 0; i < _len; i++) { + SUtil.Util_vector.min(min, min, [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + SUtil.Util_vector.max(max, max, [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + } // 与指定的包围盒做并集 + + + SUtil.Util_vector.min(min, min, constraint[0]); + SUtil.Util_vector.max(max, max, constraint[1]); + } + + var len = points.length; + + for (var _i = 0; _i < len; _i++) { + var point = [points[_i][0] + __OP[0], points[_i][1] + __OP[1]]; + var prevPoint = void 0; + var nextPoint = void 0; + + if (isLoop) { + prevPoint = [points[_i ? _i - 1 : len - 1][0] + __OP[0], points[_i ? _i - 1 : len - 1][1] + __OP[1]]; + nextPoint = [points[(_i + 1) % len][0] + __OP[0], points[(_i + 1) % len][1] + __OP[1]]; + } else { + if (_i === 0 || _i === len - 1) { + cps.push([points[_i][0] + __OP[0], points[_i][1] + __OP[1]]); + continue; + } else { + prevPoint = [points[_i - 1][0] + __OP[0], points[_i - 1][1] + __OP[1]]; + nextPoint = [points[_i + 1][0] + __OP[0], points[_i + 1][1] + __OP[1]]; + } + } + + SUtil.Util_vector.sub(v, nextPoint, prevPoint); // use degree to scale the handle length + + SUtil.Util_vector.scale(v, v, smooth); + var d0 = SUtil.Util_vector.distance(point, prevPoint); + var d1 = SUtil.Util_vector.distance(point, nextPoint); + var sum = d0 + d1; + + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + SUtil.Util_vector.scale(v1, v, -d0); + SUtil.Util_vector.scale(v2, v, d1); + var cp0 = SUtil.Util_vector.add([], point, v1); + var cp1 = SUtil.Util_vector.add([], point, v2); + + if (hasConstraint) { + SUtil.Util_vector.max(cp0, cp0, min); + SUtil.Util_vector.min(cp0, cp0, max); + SUtil.Util_vector.max(cp1, cp1, min); + SUtil.Util_vector.min(cp1, cp1, max); + } + + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; + } + /** + * @function LevelRenderer.SUtil.SUtil_smoothSpline + * @description 插值折线。 + * @private + * @param {Array} points - 线段顶点数组。 + * @param {boolean} isLoop - isLoop。 + * @param {Array} constraint - 将计算出来的控制点约束在一个包围盒内,比如 [[0, 0], [100, 100]], 这个包围盒会与整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array.} originalPosition - 参考原点。默认值:[0, 0]。 + * @return {Array} 生成的平滑节点数组。 + */ + + }, { + key: "SUtil_smoothSpline", + value: function SUtil_smoothSpline(points, isLoop, constraint, originalPosition) { + if (!originalPosition || originalPosition.length !== 2) { + originalPosition = [0, 0]; + } + + var __OP = originalPosition; + var len = points.length; + var ret = []; + var distance = 0; + + for (var i = 1; i < len; i++) { + distance += SUtil.Util_vector.distance([points[i - 1][0] + __OP[0], points[i - 1][1] + __OP[1]], [points[i][0] + __OP[0], points[i][1] + __OP[1]]); + } + + var segs = distance / 5; + segs = segs < len ? len : segs; + + for (var _i2 = 0; _i2 < segs; _i2++) { + var pos = _i2 / (segs - 1) * (isLoop ? len : len - 1); + var idx = Math.floor(pos); + var w = pos - idx; + var p0 = void 0; + var p1 = [points[idx % len][0] + __OP[0], points[idx % len][1] + __OP[1]]; + var p2 = void 0; + var p3 = void 0; + + if (!isLoop) { + p0 = [points[idx === 0 ? idx : idx - 1][0] + __OP[0], points[idx === 0 ? idx : idx - 1][1] + __OP[1]]; + p2 = [points[idx > len - 2 ? len - 1 : idx + 1][0] + __OP[0], points[idx > len - 2 ? len - 1 : idx + 1][1] + __OP[1]]; + p3 = [points[idx > len - 3 ? len - 1 : idx + 2][0] + __OP[0], points[idx > len - 3 ? len - 1 : idx + 2][1] + __OP[1]]; + } else { + p0 = [points[(idx - 1 + len) % len][0] + __OP[0], points[(idx - 1 + len) % len][1] + __OP[1]]; + p2 = [points[(idx + 1) % len][0] + __OP[0], points[(idx + 1) % len][1] + __OP[1]]; + p3 = [points[(idx + 2) % len][0] + __OP[0], points[(idx + 2) % len][1] + __OP[1]]; + } + + var w2 = w * w; + var w3 = w * w2; + ret.push([interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3)]); + } + + return ret; // inner Function + + function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1; + } + } + /** + * @function LevelRenderer.SUtil.SUtil_dashedLineTo + * @description 虚线 lineTo。 + */ + + }, { + key: "SUtil_dashedLineTo", + value: function SUtil_dashedLineTo(ctx, x1, y1, x2, y2, dashLength, customDashPattern) { + // http://msdn.microsoft.com/en-us/library/ie/dn265063(v=vs.85).aspx + var dashPattern = [5, 5]; + dashLength = typeof dashLength != 'number' ? 5 : dashLength; + + if (ctx.setLineDash) { + dashPattern[0] = dashLength; + dashPattern[1] = dashLength; + + if (customDashPattern && customDashPattern instanceof Array) { + ctx.setLineDash(customDashPattern); + } else { + ctx.setLineDash(dashPattern); + } // ctx.setLineDash(dashPattern); + + + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + return; + } + + var dx = x2 - x1; + var dy = y2 - y1; + var numDashes = Math.floor(Math.sqrt(dx * dx + dy * dy) / dashLength); + dx = dx / numDashes; + dy = dy / numDashes; + var flag = true; + + for (var i = 0; i < numDashes; ++i) { + if (flag) { + ctx.moveTo(x1, y1); + } else { + ctx.lineTo(x1, y1); + } + + flag = !flag; + x1 += dx; + y1 += dy; + } + + ctx.lineTo(x2, y2); + } + }]); + + return SUtil; +}(); // 把所有工具对象放到全局静态变量上,以便直接调用工具方法, +// 避免使用工具时频繁的创建工具对象带来的性能消耗。 + +SUtil_SUtil.Util_area = new Area(); +SUtil_SUtil.Util_color = new Color(); +SUtil_SUtil.Util_computeBoundingBox = new ComputeBoundingBox(); +SUtil_SUtil.Util_curve = new Curve_Curve(); +SUtil_SUtil.Util_env = new Env(); +SUtil_SUtil.Util_event = new Event_Event(); +SUtil_SUtil.Util_http = new Http(); +SUtil_SUtil.Util_log = new Log(); +SUtil_SUtil.Util_math = new MathTool(); +SUtil_SUtil.Util_matrix = new Matrix(); +SUtil_SUtil.Util = new Util_Util(); +SUtil_SUtil.Util_vector = new levelRenderer_Vector_Vector(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Transformable.js +function Transformable_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Transformable_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Transformable_createClass(Constructor, protoProps, staticProps) { if (protoProps) Transformable_defineProperties(Constructor.prototype, protoProps); if (staticProps) Transformable_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Transformable + * @category Visualization Theme + * @classdesc 可变换超类,所有支持 Canvas Transform 变换操作的类均是此类的子类。此类不可实例化。 + */ + +var Transformable = /*#__PURE__*/function () { + function Transformable() { + Transformable_classCallCheck(this, Transformable); + + /** + * @member {Array.} LevelRenderer.Transformable.prototype.position + * @description 平移, 默认值:[0, 0]。 + */ + this.position = [0, 0]; + /** + * @member {Array.} LevelRenderer.Transformable.prototype.rotation + * @description 旋转,可以通过数组二三项指定旋转的原点, 默认值:[0, 0, 0]。 + */ + + this.rotation = [0, 0, 0]; + /** + * @member {Array.} LevelRenderer.Transformable.prototype.scale + * @description 缩放,可以通过数组三四项指定缩放的原点, 默认值:[1, 1, 0, 0]。 + */ + + this.scale = [1, 1, 0, 0]; + /** + * @member {boolean} LevelRenderer.Transformable.prototype.needLocalTransform + * @description 是否变换。默认值:false。 + */ + + this.needLocalTransform = false; + /** + * @member {boolean} LevelRenderer.Transformable.prototype.needTransform + * @description 是否有坐标变换。默认值:false。 + */ + + this.needTransform = false; + this.CLASS_NAME = "SuperMap.LevelRenderer.Transformable"; + /** + * @function LevelRenderer.Transformable.prototype.lookAt + * @description 设置图形的朝向。 + */ + + this.lookAt = function () { + var v = SUtil_SUtil.Util_vector.create(); // {Array.|Float32Array} target + + return function (target) { + if (!this.transform) { + this.transform = SUtil_SUtil.Util_matrix.create(); + } + + var m = this.transform; + SUtil_SUtil.Util_vector.sub(v, target, this.position); + + if (isAroundZero(v[0]) && isAroundZero(v[1])) { + return; + } + + SUtil_SUtil.Util_vector.normalize(v, v); // Y Axis + // TODO Scale origin ? + + m[2] = v[0] * this.scale[1]; + m[3] = v[1] * this.scale[1]; // X Axis + + m[0] = v[1] * this.scale[0]; + m[1] = -v[0] * this.scale[0]; // Position + + m[4] = this.position[0]; + m[5] = this.position[1]; + this.decomposeTransform(); + + function isAroundZero(val) { + var EPSILON = 5e-5; + return val > -EPSILON && val < EPSILON; + } + }; + }(); + } + /** + * @function LevelRenderer.Transformable.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Transformable_createClass(Transformable, [{ + key: "destroy", + value: function destroy() { + this.position = null; + this.rotation = null; + this.scale = null; + this.needLocalTransform = null; + this.needTransform = null; + } + /** + * @function LevelRenderer.Transformable.prototype.updateNeedTransform + * @description 更新 needLocalTransform + */ + + }, { + key: "updateNeedTransform", + value: function updateNeedTransform() { + this.needLocalTransform = isNotAroundZero(this.rotation[0]) || isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1]) || isNotAroundZero(this.scale[0] - 1) || isNotAroundZero(this.scale[1] - 1); + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + /** + * @function LevelRenderer.Transformable.prototype.updateTransform + * @description 判断是否需要有坐标变换,更新 needTransform 属性。如果有坐标变换, 则从 position, rotation, scale 以及父节点的 transform 计算出自身的 transform 矩阵 + */ + + }, { + key: "updateTransform", + value: function updateTransform() { + this.updateNeedTransform(); + + if (this.parent) { + this.needTransform = this.needLocalTransform || this.parent.needTransform; + } else { + this.needTransform = this.needLocalTransform; + } + + if (!this.needTransform) { + return; + } + + var origin = [0, 0]; + var m = this.transform || SUtil_SUtil.Util_matrix.create(); + SUtil_SUtil.Util_matrix.identity(m); + + if (this.needLocalTransform) { + if (isNotAroundZero(this.scale[0]) || isNotAroundZero(this.scale[1])) { + origin[0] = -this.scale[2] || 0; + origin[1] = -this.scale[3] || 0; + var haveOrigin = isNotAroundZero(origin[0]) || isNotAroundZero(origin[1]); + + if (haveOrigin) { + SUtil_SUtil.Util_matrix.translate(m, m, origin); + } + + SUtil_SUtil.Util_matrix.scale(m, m, this.scale); + + if (haveOrigin) { + origin[0] = -origin[0]; + origin[1] = -origin[1]; + SUtil_SUtil.Util_matrix.translate(m, m, origin); + } + } + + if (this.rotation instanceof Array) { + if (this.rotation[0] !== 0) { + origin[0] = -this.rotation[1] || 0; + origin[1] = -this.rotation[2] || 0; + + var _haveOrigin = isNotAroundZero(origin[0]) || isNotAroundZero(origin[1]); + + if (_haveOrigin) { + SUtil_SUtil.Util_matrix.translate(m, m, origin); + } + + SUtil_SUtil.Util_matrix.rotate(m, m, this.rotation[0]); + + if (_haveOrigin) { + origin[0] = -origin[0]; + origin[1] = -origin[1]; + SUtil_SUtil.Util_matrix.translate(m, m, origin); + } + } + } else { + if (+this.rotation !== 0) { + SUtil_SUtil.Util_matrix.rotate(m, m, this.rotation); + } + } + + if (isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1])) { + SUtil_SUtil.Util_matrix.translate(m, m, this.position); + } + } // 保存这个变换矩阵 + + + this.transform = m; // 应用父节点变换 + + if (this.parent && this.parent.needTransform) { + if (this.needLocalTransform) { + SUtil_SUtil.Util_matrix.mul(this.transform, this.parent.transform, this.transform); + } else { + SUtil_SUtil.Util_matrix.copy(this.transform, this.parent.transform); + } + } + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + /** + * @function LevelRenderer.Transformable.prototype.setTransform + * @description 将自己的 transform 应用到 context 上。 + * + * @param {Context2D} ctx - Context2D 上下文。 + */ + + }, { + key: "setTransform", + value: function setTransform(ctx) { + if (this.needTransform) { + var m = this.transform; + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + } + /** + * @function LevelRenderer.Transformable.prototype.decomposeTransform + * @description 分解`transform`矩阵到`position`, `rotation`, `scale` 。 + */ + + }, { + key: "decomposeTransform", + value: function decomposeTransform() { + if (!this.transform) { + return; + } + + var m = this.transform; + var sx = m[0] * m[0] + m[1] * m[1]; + var position = this.position; + var scale = this.scale; + var rotation = this.rotation; + + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + + var sy = m[2] * m[2] + m[3] * m[3]; + + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + + position[0] = m[4]; + position[1] = m[5]; + scale[0] = sx; + scale[1] = sy; + scale[2] = scale[3] = 0; + rotation[0] = Math.atan2(-m[1] / sy, m[0] / sx); + rotation[1] = rotation[2] = 0; + + function isNotAroundZero(val) { + var EPSILON = 5e-5; + return val > EPSILON || val < -EPSILON; + } + } + }]); + + return Transformable; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Shape.js +function Shape_typeof(obj) { "@babel/helpers - typeof"; return Shape_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Shape_typeof(obj); } + +function Shape_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Shape_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Shape_createClass(Constructor, protoProps, staticProps) { if (protoProps) Shape_defineProperties(Constructor.prototype, protoProps); if (staticProps) Shape_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Shape_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Shape_get = Reflect.get; } else { Shape_get = function _get(target, property, receiver) { var base = Shape_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Shape_get.apply(this, arguments); } + +function Shape_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Shape_getPrototypeOf(object); if (object === null) break; } return object; } + +function Shape_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Shape_setPrototypeOf(subClass, superClass); } + +function Shape_setPrototypeOf(o, p) { Shape_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Shape_setPrototypeOf(o, p); } + +function Shape_createSuper(Derived) { var hasNativeReflectConstruct = Shape_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Shape_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Shape_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Shape_possibleConstructorReturn(this, result); }; } + +function Shape_possibleConstructorReturn(self, call) { if (call && (Shape_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Shape_assertThisInitialized(self); } + +function Shape_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Shape_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Shape_getPrototypeOf(o) { Shape_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Shape_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @private + * @class LevelRenderer.Shape + * @category Visualization Theme + * @classdesc 图形(shape)基类。 + * @extends LevelRenderer.Eventful + * @extends LevelRenderer.Transformable + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var Shape_Shape = /*#__PURE__*/function (_mixin) { + Shape_inherits(Shape, _mixin); + + var _super = Shape_createSuper(Shape); + + function Shape(options) { + var _this; + + Shape_classCallCheck(this, Shape); + + _this = _super.call(this, options); + options = options || {}; + /** + * @member {string} LevelRenderer.Shape.prototype.id + * @description 唯一标识。 + */ + + _this.id = null; + /** + * @member {Object} LevelRenderer.Shape.prototype.style + * @description 基础绘制样式。 + * @param {string} style.brushType - 画笔类型。可设值:"fill", "stroke", "both"。默认值:"fill"。 + * @param {string} style.color - 填充颜色。默认值:"#000000'"。 + * @param {string} style.strokeColor - 描边颜色。默认值:"#000000'"。 + * @param {string} style.lineCape - 线帽样式。可设值:"butt", "round", "square"。默认值:"butt"。 + * @param {number} style.lineWidth - 描边宽度。默认值:1。 + * @param {number} style.opacity - 绘制透明度。默认值:1。 + * @param {number} style.shadowBlur - 阴影模糊度,大于0有效。默认值:0。 + * @param {number} style.shadowColor - 阴影颜色。默认值:"#000000'"。 + * @param {number} style.shadowOffsetX - 阴影横向偏移。默认值:0。 + * @param {number} style.shadowOffsetY - 阴影纵向偏移。默认值:0。 + * @param {string} style.text - 图形中的附加文本。默认值:""。 + * @param {string} style.textColor - 文本颜色。默认值:"#000000'"。 + * @param {string} style.textFont - 附加文本样式。示例:'bold 18px verdana'。 + * @param {string} style.textPosition - 附加文本位置。可设值:"inside", "left", "right", top", "bottom", "end"。默认值:"end"。 + * @param {string} style.textAlign - 附加文本水平对齐。可设值:"start", "end", "left", "right", "center"。默认根据 textPosition 自动设置。 + * @param {string} style.textBaseline - 附加文本垂直对齐。可设值:"top", "bottom", "middle", "alphabetic", "hanging", "ideographic"。默认根据 textPosition 自动设置。 + * + */ + + _this.style = {}; + /** + * @member {Object} LevelRenderer.Shape.prototype.style.__rect + * @description 包围图形的最小矩形盒子。 + * + * @param {number} x - 左上角顶点x轴坐标。 + * @param {number} y - 左上角顶点y轴坐标。 + * @param {number} width - 包围盒矩形宽度。 + * @param {number} height - 包围盒矩形高度。 + */ + + /** + * @member {Object} LevelRenderer.Shape.prototype.highlightStyle + * @description 高亮样式。 + * + * @param {string} highlightStyle.brushType - 画笔类型。可设值:"fill", "stroke", "both"。默认值:"fill"。 + * @param {string} highlightStyle.color - 填充颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.strokeColor - 描边颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.lineCape - 线帽样式。可设值:"butt", "round", "square"。默认值:"butt"。 + * @param {number} highlightStyle.lineWidth - 描边宽度。默认值:1。 + * @param {number} highlightStyle.opacity - 绘制透明度。默认值:1。 + * @param {number} highlightStyle.shadowBlur - 阴影模糊度,大于0有效。默认值:0。 + * @param {number} highlightStyle.shadowColor - 阴影颜色。默认值:"#000000'"。 + * @param {number} highlightStyle.shadowOffsetX - 阴影横向偏移。默认值:0。 + * @param {number} highlightStyle.shadowOffsetY - 阴影纵向偏移。默认值:0。 + * @param {string} highlightStyle.text - 图形中的附加文本。默认值:""。 + * @param {string} highlightStyle.textColor - 文本颜色。默认值:"#000000'"。 + * @param {string} highlightStyle.textFont - 附加文本样式。示例:'bold 18px verdana'。 + * @param {string} highlightStyle.textPosition - 附加文本位置。可设值:"inside", "left", "right", top", "bottom", "end"。默认值:"end"。 + * @param {string} highlightStyle.textAlign - 附加文本水平对齐。可设值:"start", "end", "left", "right", "center"。默认根据 textPosition 自动设置。 + * @param {string} highlightStyle.textBaseline - 附加文本垂直对齐。可设值:"top", "bottom", "middle", "alphabetic", "hanging", "ideographic"。默认根据 textPosition 自动设置。 + */ + + _this.highlightStyle = null; + /** + * @member {Object} LevelRenderer.Shape.prototype.parent + * @description 父节点,只读属性。 + */ + + _this.parent = null; + /** + * @member {boolean} LevelRenderer.Shape.prototype.__dirty + * @description {boolean} + */ + + _this.__dirty = true; + /** + * @member {Array} LevelRenderer.Shape.prototype.__clipShapes + * @description {Array} + * + */ + + _this.__clipShapes = []; + /** + * @member {boolean} LevelRenderer.Shape.prototype.invisible + * @description 图形是否可见,为 true 时不绘制图形,但是仍能触发鼠标事件。默认值:false。 + */ + + _this.invisible = false; + /** + * @member {boolean} LevelRenderer.Shape.prototype.ignore + * @description 图形是否忽略,为 true 时忽略图形的绘制以及事件触发。默认值:false。 + */ + + _this.ignore = false; + /** + * @member {boolean} LevelRenderer.Shape.prototype.zlevel + * @description z 层 level,决定绘画在哪层 canvas 中。默认值:0。 + */ + + _this.zlevel = 0; + /** + * @member {boolean} LevelRenderer.Shape.prototype.draggable + * @description 是否可拖拽。默认值:false。 + */ + + _this.draggable = false; + /** + * @member {boolean} LevelRenderer.Shape.prototype.clickable + * @description 是否可点击。默认值:false。 + */ + + _this.clickable = false; + /** + * @member {boolean} LevelRenderer.Shape.prototype.hoverable + * @description 是否可以 hover。默认值:true。 + */ + + _this.hoverable = true; + /** + * @member {number} LevelRenderer.Shape.prototype.z + * @description z值,跟zlevel一样影响shape绘制的前后顺序,z值大的shape会覆盖在z值小的上面,但是并不会创建新的canvas,所以优先级低于zlevel,而且频繁改动的开销比zlevel小很多。默认值:0。 + */ + + _this.z = 0; //地理扩展 + + /** + * @member {Array.} LevelRenderer.Shape.prototype.refOriginalPosition + * @description 图形参考原点位置,图形的参考中心位置。 + * refOriginalPosition 是长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + * + * refOriginalPosition 表示图形的参考中心,通常情况下,图形是使用 canvas 的原点位置作为位置参考, + * 但 refOriginalPosition 可以改变图形的参考位置,例如: refOriginalPosition = [80, 80], + * 图形圆的 style.x = 20, style.y = 20,那么圆在 canvas 中的实际位置是 [100, 100]。 + * + * 图形(Shape) 的所有位置相关属性都是以 refOriginalPosition 为参考中心, + * 也就是说图形的所有位置信息在 canvas 中都是以 refOriginalPosition 为参考的相对位置,只有 + * refOriginalPosition 的值为 [0, 0] 时,形的位置信息才是 canvas 绝对位置。 + * + * 图形的位置信息通常有:style.pointList,style.x,style.y。 + * + * refOriginalPosition。默认值是: [0, 0]。 + */ + + _this.refOriginalPosition = [0, 0]; + /** + * @member {string} LevelRenderer.Shape.prototype.refDataID + * @description 图形所关联数据的 ID。 + * + */ + + _this.refDataID = null; + /** + * @member {boolean} LevelRenderer.Shape.prototype.isHoverByRefDataID + * @description 是否根据 refDataID 进行高亮。用于同时高亮所有 refDataID 相同的图形。 + * + */ + + _this.isHoverByRefDataID = false; + /** + * @member {string} LevelRenderer.Shape.prototype.refDataHoverGroup + * @description 高亮图形组的组名。此属性在 refDataID 有效且 isHoverByRefDataID 为 true 时生效。 + * 一旦设置此属性,且属性值有效,只有关联同一个数据的图形且此属性相同的图形才会高亮。 + * + */ + + _this.refDataHoverGroup = null; + /** + * @member {Object} LevelRenderer.Shape.prototype.dataInfo + * @description 图形的数据信息。 + * + */ + + _this.dataInfo = null; + Util.extend(Shape_assertThisInitialized(_this), options); + _this.id = _this.id || Util.createUniqueID("smShape_"); + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape"; + /** + * @function LevelRenderer.Shape.prototype.getTansform + * @description 变换鼠标位置到 shape 的局部坐标空间 + * + */ + + _this.getTansform = function () { + var invTransform = []; + return function (x, y) { + var originPos = [x, y]; // 对鼠标的坐标也做相同的变换 + + if (this.needTransform && this.transform) { + SUtil_SUtil.Util_matrix.invert(invTransform, this.transform); + SUtil_SUtil.Util_matrix.mulVector(originPos, invTransform, [x, y, 1]); + + if (x == originPos[0] && y == originPos[1]) { + // 避免外部修改导致的 needTransform 不准确 + this.updateNeedTransform(); + } + } + + return originPos; + }; + }(); + + return _this; + } + /** + * @function LevelRenderer.Shape.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Shape_createClass(Shape, [{ + key: "destroy", + value: function destroy() { + this.id = null; + this.style = null; + this.highlightStyle = null; + this.parent = null; + this.__dirty = null; + this.__clipShapes = null; + this.invisible = null; + this.ignore = null; + this.zlevel = null; + this.draggable = null; + this.clickable = null; + this.hoverable = null; + this.z = null; + this.refOriginalPosition = null; + this.refDataID = null; + this.refDataHoverGroup = null; + this.isHoverByRefDataID = null; + this.dataInfo = null; + + Shape_get(Shape_getPrototypeOf(Shape.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.prototype.brush + * @description 绘制图形。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * @param {function} updateCallback - 需要异步加载资源的 shape 可以通过这个 callback(e),让painter更新视图,base.brush 没用,需要的话重载 brush。 + */ + + }, { + key: "brush", + value: function brush(ctx, isHighlight) { + var style = this.beforeBrush(ctx, isHighlight); + ctx.beginPath(); + this.buildPath(ctx, style); + + switch (style.brushType) { + /* jshint ignore:start */ + case 'both': + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + + if (style.lineWidth > 0) { + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.stroke(); + } + + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + + case 'stroke': + this.setCtxGlobalAlpha(ctx, "stroke", style); + style.lineWidth > 0 && ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + + /* jshint ignore:end */ + + default: + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + } + + this.drawText(ctx, style, this.style); + this.afterBrush(ctx); + } + /** + * @function LevelRenderer.Shape.prototype.beforeBrush + * @description 具体绘制操作前的一些公共操作。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * @return {Object} 处理后的样式。 + */ + + }, { + key: "beforeBrush", + value: function beforeBrush(ctx, isHighlight) { + var style = this.style; + + if (this.brushTypeOnly) { + style.brushType = this.brushTypeOnly; + } + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle(style, this.highlightStyle || {}, this.brushTypeOnly); + } + + if (this.brushTypeOnly == 'stroke') { + style.strokeColor = style.strokeColor || style.color; + } + + ctx.save(); + this.doClip(ctx); + this.setContext(ctx, style); // 设置transform + + this.setTransform(ctx); + return style; + } + /** + * @function LevelRenderer.Shape.prototype.afterBrush + * @description 绘制后的处理。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * + */ + + }, { + key: "afterBrush", + value: function afterBrush(ctx) { + ctx.restore(); + } + /** + * @function LevelRenderer.Shape.prototype.setContext + * @description 设置 fillStyle, strokeStyle, shadow 等通用绘制样式。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - 样式。 + * + */ + + }, { + key: "setContext", + value: function setContext(ctx, style) { + var STYLE_CTX_MAP = [['color', 'fillStyle'], ['strokeColor', 'strokeStyle'], ['opacity', 'globalAlpha'], ['lineCap', 'lineCap'], ['lineJoin', 'lineJoin'], ['miterLimit', 'miterLimit'], ['lineWidth', 'lineWidth'], ['shadowBlur', 'shadowBlur'], ['shadowColor', 'shadowColor'], ['shadowOffsetX', 'shadowOffsetX'], ['shadowOffsetY', 'shadowOffsetY']]; + + for (var i = 0, len = STYLE_CTX_MAP.length; i < len; i++) { + var styleProp = STYLE_CTX_MAP[i][0]; + var styleValue = style[styleProp]; + var ctxProp = STYLE_CTX_MAP[i][1]; + + if (typeof styleValue != 'undefined') { + ctx[ctxProp] = styleValue; + } + } + } + /** + * @function LevelRenderer.Shape.prototype.doClip + * + */ + + }, { + key: "doClip", + value: function doClip(ctx) { + var clipShapeInvTransform = SUtil_SUtil.Util_matrix.create(); + + if (this.__clipShapes) { + for (var i = 0; i < this.__clipShapes.length; i++) { + var clipShape = this.__clipShapes[i]; + + if (clipShape.needTransform) { + var m = clipShape.transform; + SUtil_SUtil.Util_matrix.invert(clipShapeInvTransform, m); + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + + ctx.beginPath(); + clipShape.buildPath(ctx, clipShape.style); + ctx.clip(); // Transform back + + if (clipShape.needTransform) { + var _m = clipShapeInvTransform; + ctx.transform(_m[0], _m[1], _m[2], _m[3], _m[4], _m[5]); + } + } + } + } + /** + * @function LevelRenderer.Shape.prototype.getHighlightStyle + * @description 根据默认样式扩展高亮样式 + * + * @param {Object} style - 样式。 + * @param {Object} highlightStyle - 高亮样式。 + * @param {string} brushTypeOnly - brushTypeOnly。 + * + */ + + }, { + key: "getHighlightStyle", + value: function getHighlightStyle(style, highlightStyle, brushTypeOnly) { + var newStyle = {}; + + for (var k in style) { + newStyle[k] = style[k]; + } + + var highlightColor = SUtil_SUtil.Util_color.getHighlightColor(); // 根据highlightStyle扩展 + + if (style.brushType != 'stroke') { + // 带填充则用高亮色加粗边线 + newStyle.strokeColor = highlightColor; // SMIC-方法修改 - start + + newStyle.lineWidth = style.lineWidth || 1; // 原始代码 + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // 修改代码1 + // if(!style.lineType || style.lineType === "solid"){ + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // } + // else{ + // newStyle.lineWidth = (style.lineWidth || 1); + // } + // SMIC-方法修改 - end + + newStyle.brushType = 'both'; + } else { + if (brushTypeOnly != 'stroke') { + // 描边型的则用原色加工高亮 + newStyle.strokeColor = highlightColor; // SMIC-方法修改 - start + + newStyle.lineWidth = style.lineWidth || 1; // 原始代码 + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // 修改代码1 + // if(!style.lineType || style.lineType === "solid"){ + // newStyle.lineWidth = (style.lineWidth || 1) + // + this.getHighlightZoom(); + // } + // else{ + // newStyle.lineWidth = (style.lineWidth || 1); + // } + // SMIC-方法修改 - end + } else { + // 线型的则用原色加工高亮 + newStyle.strokeColor = highlightStyle.strokeColor || SUtil_SUtil.Util_color.mix(style.strokeColor, SUtil_SUtil.Util_color.toRGB(highlightColor)); + } + } // 可自定义覆盖默认值 + + + for (var _k in highlightStyle) { + if (typeof highlightStyle[_k] != 'undefined') { + newStyle[_k] = highlightStyle[_k]; + } + } + + return newStyle; + } + /** + * @function LevelRenderer.Shape.prototype.getHighlightZoom + * @description 高亮放大效果参数,当前统一设置为6,如有需要差异设置,通过 this.type 判断实例类型 + * + */ + + }, { + key: "getHighlightZoom", + value: function getHighlightZoom() { + return this.type != 'text' ? 6 : 2; + } + /** + * @function LevelRenderer.Shape.prototype.drift + * @description 移动位置 + * + * @param {Object} dx - 横坐标变化。 + * @param {Object} dy - 纵坐标变化。 + * + */ + + }, { + key: "drift", + value: function drift(dx, dy) { + this.position[0] += dx; + this.position[1] += dy; + } + /** + * @function LevelRenderer.Shape.prototype.buildPath + * @description 构建绘制的Path。子类必须重新实现此方法。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - 样式。 + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + // eslint-disable-line no-unused-vars + SUtil_SUtil.Util_log('buildPath not implemented in ' + this.type); + } + /** + * @function LevelRenderer.Shape.prototype.getRect + * @description 计算返回包围盒矩形。子类必须重新实现此方法。 + * + * @param {Object} style - 样式。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + // eslint-disable-line no-unused-vars + SUtil_SUtil.Util_log('getRect not implemented in ' + this.type); + } + /** + * @function LevelRenderer.Shape.prototype.isCover + * @description 判断鼠标位置是否在图形内。 + * + * @param {number} x - x。 + * @param {number} y - y。 + */ + + }, { + key: "isCover", + value: function isCover(x, y) { + var originPos = this.getTansform(x, y); + x = originPos[0]; + y = originPos[1]; // 快速预判并保留判断矩形 + + var rect = this.style.__rect; + + if (!rect) { + rect = this.style.__rect = this.getRect(this.style); + } + + if (x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height) { + // 矩形内 + return SUtil_SUtil.Util_area.isInside(this, this.style, x, y); + } + + return false; + } + /** + * @function LevelRenderer.Shape.prototype.drawText + * @description 绘制附加文本。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {string} style - 样式。 + * @param {string} normalStyle - normalStyle 默认样式,用于定位文字显示。 + */ + + }, { + key: "drawText", + value: function drawText(ctx, style, normalStyle) { + if (typeof style.text == 'undefined' || style.text === false) { + return; + } // 字体颜色策略 + + + var textColor = style.textColor || style.color || style.strokeColor; + ctx.fillStyle = textColor; // 文本与图形间空白间隙 + + var dd = 10; + var al; // 文本水平对齐 + + var bl; // 文本垂直对齐 + + var tx; // 文本横坐标 + + var ty; // 文本纵坐标 + + var textPosition = style.textPosition // 用户定义 + || this.textPosition // shape默认 + || 'top'; // 全局默认 + // Smic 方法修改 -start + + var __OP = []; + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + __OP = [0, 0]; + } else { + __OP = this.refOriginalPosition; + } //原代码: + // Smic 方法修改 -end + + + switch (textPosition) { + case 'inside': + case 'top': + case 'bottom': + case 'left': + case 'right': + if (this.getRect) { + var rect = (normalStyle || style).__rect || this.getRect(normalStyle || style); + + switch (textPosition) { + case 'inside': + tx = rect.x + rect.width / 2; + ty = rect.y + rect.height / 2; + al = 'center'; + bl = 'middle'; + + if (style.brushType != 'stroke' && textColor == style.color) { + ctx.fillStyle = '#fff'; + } + + break; + + case 'left': + tx = rect.x - dd; + ty = rect.y + rect.height / 2; + al = 'end'; + bl = 'middle'; + break; + + case 'right': + tx = rect.x + rect.width + dd; + ty = rect.y + rect.height / 2; + al = 'start'; + bl = 'middle'; + break; + + case 'top': + tx = rect.x + rect.width / 2; + ty = rect.y - dd; + al = 'center'; + bl = 'bottom'; + break; + + case 'bottom': + tx = rect.x + rect.width / 2; + ty = rect.y + rect.height + dd; + al = 'center'; + bl = 'top'; + break; + } + } + + break; + + case 'start': + case 'end': + var xStart = 0; + var xEnd = 0; + var yStart = 0; + var yEnd = 0; + + if (typeof style.pointList != 'undefined') { + var pointList = style.pointList; + + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + + var length = pointList.length; + + switch (textPosition) { + // Smic 方法修改 -start + case 'start': + xStart = pointList[0][0] + __OP[0]; + xEnd = pointList[1][0] + __OP[0]; + yStart = pointList[0][1] + __OP[1]; + yEnd = pointList[1][1] + __OP[1]; + break; + + case 'end': + xStart = pointList[length - 2][0] + __OP[0]; + xEnd = pointList[length - 1][0] + __OP[0]; + yStart = pointList[length - 2][1] + __OP[1]; + yEnd = pointList[length - 1][1] + __OP[1]; + break; + //原代码: + + /* + case 'start': + xStart = pointList[0][0]; + xEnd = pointList[1][0]; + yStart = pointList[0][1]; + yEnd = pointList[1][1]; + break; + case 'end': + xStart = pointList[length - 2][0]; + xEnd = pointList[length - 1][0]; + yStart = pointList[length - 2][1]; + yEnd = pointList[length - 1][1]; + break; + */ + // Smic 方法修改 -end + } + } else { + // Smic 方法修改 -start + xStart = style.xStart + __OP[0] || 0; + xEnd = style.xEnd + __OP[0] || 0; + yStart = style.yStart + __OP[1] || 0; + yEnd = style.yEnd + __OP[1] || 0; //原代码: + + /* + xStart = style.xStart || 0; + xEnd = style.xEnd || 0; + yStart = style.yStart || 0; + yEnd = style.yEnd || 0; + */ + // Smic 方法修改 -end + } + + switch (textPosition) { + case 'start': + al = xStart < xEnd ? 'end' : 'start'; + bl = yStart < yEnd ? 'bottom' : 'top'; + tx = xStart; + ty = yStart; + break; + + case 'end': + al = xStart < xEnd ? 'start' : 'end'; + bl = yStart < yEnd ? 'top' : 'bottom'; + tx = xEnd; + ty = yEnd; + break; + } + + dd -= 4; + + if (xStart && xEnd && xStart != xEnd) { + tx -= al == 'end' ? dd : -dd; + } else { + al = 'center'; + } + + if (yStart != yEnd) { + ty -= bl == 'bottom' ? dd : -dd; + } else { + bl = 'middle'; + } + + break; + + case 'specific': + tx = style.textX || 0; + ty = style.textY || 0; + al = 'start'; + bl = 'middle'; + break; + } // Smic 方法修改 -start + + + if (style.labelXOffset && !isNaN(style.labelXOffset)) { + tx += style.labelXOffset; + } + + if (style.labelYOffset && !isNaN(style.labelYOffset)) { + ty += style.labelYOffset; + } //原代码: + // Smic 方法修改 -end + + + if (tx != null && ty != null) { + Shape._fillText(ctx, style.text, tx, ty, style.textFont, style.textAlign || al, style.textBaseline || bl); + } + } + /** + * @function LevelRenderer.Shape.prototype.modSelf + * @description 图形发生改变 + */ + + }, { + key: "modSelf", + value: function modSelf() { + this.__dirty = true; + + if (this.style) { + this.style.__rect = null; + } + + if (this.highlightStyle) { + this.highlightStyle.__rect = null; + } + } + /** + * @function LevelRenderer.Shape.prototype.isSilent + * @description 图形是否会触发事件,通过 bind 绑定的事件 + */ + + }, { + key: "isSilent", + value: function isSilent() { + return !(this.hoverable || this.draggable || this.clickable || this.onmousemove || this.onmouseover || this.onmouseout || this.onmousedown || this.onmouseup || this.onclick || this.ondragenter || this.ondragover || this.ondragleave || this.ondrop); + } + /** + * @function LevelRenderer.Shape.prototype.setCtxGlobalAlpha + * @description 设置 Cavans 上下文全局透明度 + * + * @param {Object} _ctx - Cavans 上下文 + * @param {string} type - one of 'stroke', 'fill', or 'reset' + * @param {Object} style - Symbolizer hash + */ + + }, { + key: "setCtxGlobalAlpha", + value: function setCtxGlobalAlpha(_ctx, type, style) { + if (type === "fill") { + _ctx.globalAlpha = typeof style["fillOpacity"] === "undefined" ? typeof style["opacity"] === "undefined" ? 1 : style['opacity'] : style['fillOpacity']; + } else if (type === "stroke") { + _ctx.globalAlpha = typeof style["strokeOpacity"] === "undefined" ? typeof style["opacity"] === "undefined" ? 1 : style['opacity'] : style['strokeOpacity']; + } else { + _ctx.globalAlpha = typeof style["opacity"] === "undefined" ? 1 : style['opacity']; + } + } + /** + * @function LevelRenderer.Shape.prototype._fillText + * @description 填充文本 + */ + + }], [{ + key: "_fillText", + value: function _fillText(ctx, text, x, y, textFont, textAlign, textBaseline) { + if (textFont) { + ctx.font = textFont; + } + + ctx.textAlign = textAlign; + ctx.textBaseline = textBaseline; + + var rect = Shape._getTextRect(text, x, y, textFont, textAlign, textBaseline); + + text = (text + '').split('\n'); + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', textFont); + + switch (textBaseline) { + case 'top': + y = rect.y; + break; + + case 'bottom': + y = rect.y + lineHeight; + break; + + default: + y = rect.y + lineHeight / 2; + } + + for (var i = 0, l = text.length; i < l; i++) { + ctx.fillText(text[i], x, y); + y += lineHeight; + } + } + /** + * @function LevelRenderer.Shape._getTextRect + * @description 返回矩形区域,用于局部刷新和文字定位 + * + * @param {string} text - text。 + * @param {number} x - x。 + * @param {number} y - y。 + * @param {string} textFont - textFont。 + * @param {string} textAlign - textAlign。 + * @param {string} textBaseline - textBaseline。 + * @return {Object} 矩形区域。 + */ + + }, { + key: "_getTextRect", + value: function _getTextRect(text, x, y, textFont, textAlign, textBaseline) { + var width = SUtil_SUtil.Util_area.getTextWidth(text, textFont); + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', textFont); + text = (text + '').split('\n'); + + switch (textAlign) { + case 'end': + case 'right': + x -= width; + break; + + case 'center': + x -= width / 2; + break; + } + + switch (textBaseline) { + case 'top': + break; + + case 'bottom': + y -= lineHeight * text.length; + break; + + default: + y -= lineHeight * text.length / 2; + } + + return { + x: x, + y: y, + width: width, + height: lineHeight * text.length + }; + } + }]); + + return Shape; +}(mixinExt(Eventful, Transformable)); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicPoint.js +function SmicPoint_typeof(obj) { "@babel/helpers - typeof"; return SmicPoint_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicPoint_typeof(obj); } + +function SmicPoint_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicPoint_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicPoint_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicPoint_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicPoint_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicPoint_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicPoint_get = Reflect.get; } else { SmicPoint_get = function _get(target, property, receiver) { var base = SmicPoint_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicPoint_get.apply(this, arguments); } + +function SmicPoint_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicPoint_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicPoint_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicPoint_setPrototypeOf(subClass, superClass); } + +function SmicPoint_setPrototypeOf(o, p) { SmicPoint_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicPoint_setPrototypeOf(o, p); } + +function SmicPoint_createSuper(Derived) { var hasNativeReflectConstruct = SmicPoint_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicPoint_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicPoint_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicPoint_possibleConstructorReturn(this, result); }; } + +function SmicPoint_possibleConstructorReturn(self, call) { if (call && (SmicPoint_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicPoint_assertThisInitialized(self); } + +function SmicPoint_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicPoint_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicPoint_getPrototypeOf(o) { SmicPoint_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicPoint_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicPoint + * @category Visualization Theme + * @classdesc 点。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicPoint({ + * style: { + * x: 100, + * y: 100, + * r: 40, + * brushType: 'both', + * color: 'blue', + * strokeColor: 'red', + * lineWidth: 3, + * text: 'point' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicPoint = /*#__PURE__*/function (_Shape) { + SmicPoint_inherits(SmicPoint, _Shape); + + var _super = SmicPoint_createSuper(SmicPoint); + + function SmicPoint(options) { + var _this; + + SmicPoint_classCallCheck(this, SmicPoint); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicPoint.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicpoint'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicPoint"; + return _this; + } + /** + * @function cdestroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicPoint_createClass(SmicPoint, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicPoint_get(SmicPoint_getPrototypeOf(SmicPoint.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicPoint.prototype.buildPath + * @description 创建点触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r, 0, Math.PI * 2, true); + return; + } + /** + * @function LevelRenderer.Shape.SmicPoint.prototype.getRect + * @description 计算返回点的包围盒矩形。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + + if (style.__rect) { + return style.__rect; + } + + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - style.r - lineWidth / 2), + y: Math.round(style.y + __OP[1] - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicPoint; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicText.js +function SmicText_typeof(obj) { "@babel/helpers - typeof"; return SmicText_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicText_typeof(obj); } + +function SmicText_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicText_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicText_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicText_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicText_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicText_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicText_get = Reflect.get; } else { SmicText_get = function _get(target, property, receiver) { var base = SmicText_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicText_get.apply(this, arguments); } + +function SmicText_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicText_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicText_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicText_setPrototypeOf(subClass, superClass); } + +function SmicText_setPrototypeOf(o, p) { SmicText_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicText_setPrototypeOf(o, p); } + +function SmicText_createSuper(Derived) { var hasNativeReflectConstruct = SmicText_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicText_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicText_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicText_possibleConstructorReturn(this, result); }; } + +function SmicText_possibleConstructorReturn(self, call) { if (call && (SmicText_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicText_assertThisInitialized(self); } + +function SmicText_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicText_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicText_getPrototypeOf(o) { SmicText_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicText_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicText + * @category Visualization Theme + * @extends {LevelRenderer.Shape} + * @example + * var shape = new LevelRenderer.Shape.SmicText({ + * style: { + * text: 'Label', + * x: 100, + * y: 100, + * textFont: '14px Arial' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var SmicText = /*#__PURE__*/function (_Shape) { + SmicText_inherits(SmicText, _Shape); + + var _super = SmicText_createSuper(SmicText); + + function SmicText(options) { + var _this; + + SmicText_classCallCheck(this, SmicText); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicText.prototype.type + * @description 图形类型. + */ + + _this.type = 'smictext'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicText"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicText_createClass(SmicText, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicText_get(SmicText_getPrototypeOf(SmicText.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.brush + * @description 笔触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * + */ + + }, { + key: "brush", + value: function brush(ctx, isHighlight) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var style = this.style; + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle(style, this.highlightStyle || {}); + } + + if (typeof style.text == 'undefined' || style.text === false) { + return; + } + + ctx.save(); + this.doClip(ctx); + this.setContext(ctx, style); // 设置transform + + this.setTransform(ctx); + + if (style.textFont) { + ctx.font = style.textFont; + } + + ctx.textAlign = style.textAlign || 'start'; + ctx.textBaseline = style.textBaseline || 'middle'; + var text = (style.text + '').split('\n'); + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', style.textFont); + var rect = this.getRectNoRotation(style); // var x = style.x; + + var x = style.x + __OP[0]; + var y; + + if (style.textBaseline == 'top') { + y = rect.y; + } else if (style.textBaseline == 'bottom') { + y = rect.y + lineHeight; + } else { + y = rect.y + lineHeight / 2; + } + + var ox = style.x + __OP[0]; + var oy = style.y + __OP[1]; //文本绘制 + + for (var i = 0, l = text.length; i < l; i++) { + //是否渲染矩形背景及颜色 + if (style.labelRect) { + //+4,-2是为了让文字距边框左右边缘有点间隔 + ctx.fillRect(rect.x - 2, rect.y, rect.width + 4, rect.height); + ctx.fillStyle = style.strokeColor; + ctx.strokeRect(rect.x - 2, rect.y, rect.width + 4, rect.height); + ctx.fillStyle = style.textColor; + } + + switch (style.brushType) { + case 'stroke': + this.setCtxGlobalAlpha(ctx, "stroke", style); + + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + + if (style.textBaseline == 'top') { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * i, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * i); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height); + } + } else { + if (style.maxWidth) { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + } else { + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + } + } + + ctx.restore(); + } else { + if (style.maxWidth) { + ctx.strokeText(text[i], x, y, style.maxWidth); + } else { + ctx.strokeText(text[i], x, y); + } + } + + this.setCtxGlobalAlpha(ctx, "reset", style); + break; + + case 'both': + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + + if (style.textBaseline == 'top') { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * i, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * i, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * i); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * i); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } else { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } + + ctx.restore(); + } else { + if (style.maxWidth) { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], x, y, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], x, y, style.maxWidth); + this.setCtxGlobalAlpha(ctx, "reset", style); + } else { + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fillText(text[i], x, y); + this.setCtxGlobalAlpha(ctx, "reset", style); + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.strokeText(text[i], x, y); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + } + + break; + + default: + //fill or others + this.setCtxGlobalAlpha(ctx, "fill", style); + + if (style.textRotation && style.textRotation !== 0) { + ctx.save(); + ctx.translate(ox, oy); + ctx.rotate(style.textRotation * Math.PI / 180); + + if (style.textBaseline == 'top') { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * i, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * i); + } + } else if (style.textBaseline == 'bottom') { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height); + } + } else { + if (style.maxWidth) { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2, style.maxWidth); + } else { + ctx.fillText(text[i], 0, lineHeight * (i + 1) - rect.height / 2 - lineHeight / 2); + } + } + + ctx.restore(); + } else { + if (style.maxWidth) { + ctx.fillText(text[i], x, y, style.maxWidth); + } else { + ctx.fillText(text[i], x, y); + } + } + + this.setCtxGlobalAlpha(ctx, "reset", style); + } + + y += lineHeight; + } + + ctx.restore(); + return; + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRect + * @description 返回文字包围盒矩形 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + var left, top, right, bottom; + var tbg = this.getTextBackground(style, true); + + for (var i = 0, len = tbg.length; i < len; i++) { + var poi = tbg[i]; //用第一个点初始化 + + if (i == 0) { + left = poi[0]; + right = poi[0]; + top = poi[1]; + bottom = poi[1]; + } else { + if (poi[0] < left) { + left = poi[0]; + } + + if (poi[0] > right) { + right = poi[0]; + } + + if (poi[1] < top) { + top = poi[1]; + } + + if (poi[1] > bottom) { + bottom = poi[1]; + } + } + } + + style.__rect = { + x: left, + y: top, + width: right - left, + height: bottom - top + }; + return style.__rect; + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRectNoRotation + * @description 返回忽略旋转和maxWidth时文字包围盒矩形 + */ + + }, { + key: "getRectNoRotation", + value: function getRectNoRotation(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var lineHeight = SUtil_SUtil.Util_area.getTextHeight('ZH', style.textFont); + var width = SUtil_SUtil.Util_area.getTextWidth(style.text, style.textFont); + var height = SUtil_SUtil.Util_area.getTextHeight(style.text, style.textFont); //处理文字位置,注:文本的绘制是由此 rect 决定 + + var textX = style.x + __OP[0]; // 默认start == left + + if (style.textAlign == 'end' || style.textAlign == 'right') { + textX -= width; + } else if (style.textAlign == 'center') { + textX -= width / 2; + } + + var textY; + + if (style.textBaseline == 'top') { + // textY = style.y; + textY = style.y + __OP[1]; + } else if (style.textBaseline == 'bottom') { + textY = style.y + __OP[1] - height; + } else { + // middle + textY = style.y + __OP[1] - height / 2; + } + + var isWidthChangeByMaxWidth = false; + var widthBeforeChangeByMaxWidth; //处理 maxWidth + + if (style.maxWidth) { + var maxWidth = parseInt(style.maxWidth); + + if (maxWidth < width) { + widthBeforeChangeByMaxWidth = width; + isWidthChangeByMaxWidth = true; + width = maxWidth; + } + + textX = style.x + __OP[0]; + + if (style.textAlign == 'end' || style.textAlign == 'right') { + textX -= width; + } else if (style.textAlign == 'center') { + textX -= width / 2; + } + } //处理斜体字 + + + if (style.textFont) { + var textFont = style.textFont; + var textFontStr = textFont.toLowerCase(); + + if (textFontStr.indexOf("italic") > -1) { + if (isWidthChangeByMaxWidth === true) { + width += lineHeight / 3 * (width / widthBeforeChangeByMaxWidth); + } else { + width += lineHeight / 3; + } + } + } + + var rect = { + x: textX, + y: textY, + width: width, + height: height + }; + return rect; + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.getTextBackground + * @description 获取文本背景框范围 + * + * @param {Object} style - 样式。 + * @param {boolean} redo - 是否强制重新计算 textBackground。 + */ + + }, { + key: "getTextBackground", + value: function getTextBackground(style, redo) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + + if (!redo && style.__textBackground) { + return style.__textBackground; + } //不旋转时矩形框 + + + var rect = this.getRectNoRotation(style); //旋转中心点 + + var ox = style.x + __OP[0]; + var oy = style.y + __OP[1]; //背景框 + + var background = []; + + if (style.textRotation && style.textRotation !== 0) { + var textRotation = style.textRotation; + var ltPoi = this.getRotatedLocation(rect.x, rect.y, ox, oy, textRotation); + var rtPoi = this.getRotatedLocation(rect.x + rect.width, rect.y, ox, oy, textRotation); + var rbPoi = this.getRotatedLocation(rect.x + rect.width, rect.y + rect.height, ox, oy, textRotation); + var lbPoi = this.getRotatedLocation(rect.x, rect.y + rect.height, ox, oy, textRotation); + background.push(ltPoi); + background.push(rtPoi); + background.push(rbPoi); + background.push(lbPoi); + } else { + var _ltPoi = [rect.x, rect.y]; + var _rtPoi = [rect.x + rect.width, rect.y]; + var _rbPoi = [rect.x + rect.width, rect.y + rect.height]; + var _lbPoi = [rect.x, rect.y + rect.height]; + background.push(_ltPoi); + background.push(_rtPoi); + background.push(_rbPoi); + background.push(_lbPoi); + } + + style.__textBackground = background; + return style.__textBackground; + } + /** + * @function LevelRenderer.Shape.SmicText.prototype.getRotatedLocation + * @description 获取一个点绕旋转中心顺时针旋转后的位置。(此方法用于屏幕坐标) + * + * @param {number} x - 旋转点横坐标。 + * @param {number} y - 旋转点纵坐标。 + * @param {number} rx - 旋转中心点横坐标。 + * @param {number} ry - 旋转中心点纵坐标。 + * @param {number} angle - 旋转角度(度)。 + * @return {Array.} 旋转后的坐标位置,长度为 2 的一维数组,数组第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + }, { + key: "getRotatedLocation", + value: function getRotatedLocation(x, y, rx, ry, angle) { + var loc = new Array(), + x0, + y0; + y = -y; + ry = -ry; + angle = -angle; //顺时针旋转 + + x0 = (x - rx) * Math.cos(angle / 180 * Math.PI) - (y - ry) * Math.sin(angle / 180 * Math.PI) + rx; + y0 = (x - rx) * Math.sin(angle / 180 * Math.PI) + (y - ry) * Math.cos(angle / 180 * Math.PI) + ry; + loc[0] = x0; + loc[1] = -y0; + return loc; + } + }]); + + return SmicText; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicCircle.js +function SmicCircle_typeof(obj) { "@babel/helpers - typeof"; return SmicCircle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicCircle_typeof(obj); } + +function SmicCircle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicCircle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicCircle_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicCircle_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicCircle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicCircle_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicCircle_get = Reflect.get; } else { SmicCircle_get = function _get(target, property, receiver) { var base = SmicCircle_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicCircle_get.apply(this, arguments); } + +function SmicCircle_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicCircle_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicCircle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicCircle_setPrototypeOf(subClass, superClass); } + +function SmicCircle_setPrototypeOf(o, p) { SmicCircle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicCircle_setPrototypeOf(o, p); } + +function SmicCircle_createSuper(Derived) { var hasNativeReflectConstruct = SmicCircle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicCircle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicCircle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicCircle_possibleConstructorReturn(this, result); }; } + +function SmicCircle_possibleConstructorReturn(self, call) { if (call && (SmicCircle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicCircle_assertThisInitialized(self); } + +function SmicCircle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicCircle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicCircle_getPrototypeOf(o) { SmicCircle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicCircle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicCircle + * @category Visualization Theme + * @classdesc 圆形 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicCircle({ + * style: { + * x: 100, + * y: 100, + * r: 60, + * brushType: "both", + * color: "blue", + * strokeColor: "red", + * lineWidth: 3, + * text: "Circle" + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicCircle = /*#__PURE__*/function (_Shape) { + SmicCircle_inherits(SmicCircle, _Shape); + + var _super = SmicCircle_createSuper(SmicCircle); + + function SmicCircle(options) { + var _this; + + SmicCircle_classCallCheck(this, SmicCircle); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicCircle.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smiccircle'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicCircle"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicCircle_createClass(SmicCircle, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicCircle_get(SmicCircle_getPrototypeOf(SmicCircle.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.buildPath + * @description 创建图形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var x = style.x + __OP[0]; // 圆心x + + var y = style.y + __OP[1]; // 圆心y + + ctx.moveTo(x + style.r, y); + ctx.arc(x, y, style.r, 0, Math.PI * 2, true); + return true; + } + /** + * @function LevelRenderer.Shape.SmicCircle.prototype.getRect + * @description 返回圆形包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var x = style.x + __OP[0]; // 圆心x + + var y = style.y + __OP[1]; // 圆心y + + var r = style.r; // 圆r + + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(x - r - lineWidth / 2), + y: Math.round(y - r - lineWidth / 2), + width: r * 2 + lineWidth, + height: r * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicCircle; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicPolygon.js +function SmicPolygon_typeof(obj) { "@babel/helpers - typeof"; return SmicPolygon_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicPolygon_typeof(obj); } + +function SmicPolygon_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicPolygon_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicPolygon_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicPolygon_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicPolygon_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicPolygon_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicPolygon_get = Reflect.get; } else { SmicPolygon_get = function _get(target, property, receiver) { var base = SmicPolygon_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicPolygon_get.apply(this, arguments); } + +function SmicPolygon_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicPolygon_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicPolygon_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicPolygon_setPrototypeOf(subClass, superClass); } + +function SmicPolygon_setPrototypeOf(o, p) { SmicPolygon_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicPolygon_setPrototypeOf(o, p); } + +function SmicPolygon_createSuper(Derived) { var hasNativeReflectConstruct = SmicPolygon_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicPolygon_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicPolygon_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicPolygon_possibleConstructorReturn(this, result); }; } + +function SmicPolygon_possibleConstructorReturn(self, call) { if (call && (SmicPolygon_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicPolygon_assertThisInitialized(self); } + +function SmicPolygon_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicPolygon_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicPolygon_getPrototypeOf(o) { SmicPolygon_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicPolygon_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicPolygon + * @category Visualization Theme + * @classdesc 多边形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicPolygon({ + * style: { + * // 100x100 的正方形 + * pointList: [[0, 0], [100, 0], [100, 100], [0, 100]], + * color: 'blue' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var SmicPolygon = /*#__PURE__*/function (_Shape) { + SmicPolygon_inherits(SmicPolygon, _Shape); + + var _super = SmicPolygon_createSuper(SmicPolygon); + + function SmicPolygon(options) { + var _this; + + SmicPolygon_classCallCheck(this, SmicPolygon); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicPolygon.prototype.type + * @description 图形类型. + */ + + _this.type = 'smicpolygon'; + /** + * @member {Array} LevelRenderer.Shape.SmicPolygon.prototype._holePolygonPointList + * @description 岛洞面多边形顶点数组(三维数组) + * + */ + + _this.holePolygonPointLists = null; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicPolygon"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicPolygon_createClass(SmicPolygon, [{ + key: "destroy", + value: function destroy() { + this.type = null; + this.holePolygonPointLists = null; + + SmicPolygon_get(SmicPolygon_getPrototypeOf(SmicPolygon.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.brush + * @description 笔触。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {boolean} isHighlight - 是否使用高亮属性。 + * + */ + + }, { + key: "brush", + value: function brush(ctx, isHighlight) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var style = this.style; + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle(style, this.highlightStyle || {}); + } + + ctx.save(); + this.setContext(ctx, style); // 设置 transform + + this.setTransform(ctx); // 先 fill 再stroke + + var hasPath = false; + + if (style.brushType == 'fill' || style.brushType == 'both' || typeof style.brushType == 'undefined') { + // 默认为fill + ctx.beginPath(); + + if (style.lineType == 'dashed' || style.lineType == 'dotted' || style.lineType == 'dot' || style.lineType == 'dash' || style.lineType == 'dashdot' || style.lineType == 'longdash' || style.lineType == 'longdashdot') { + // 特殊处理,虚线围不成path,实线再build一次 + this.buildPath(ctx, { + lineType: 'solid', + lineWidth: style.lineWidth, + pointList: style.pointList + }); + } else { + this.buildPath(ctx, style); + hasPath = true; // 这个path能用 + } + + ctx.closePath(); + this.setCtxGlobalAlpha(ctx, "fill", style); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + + if (style.lineWidth > 0 && (style.brushType == 'stroke' || style.brushType == 'both')) { + if (!hasPath) { + ctx.beginPath(); + this.buildPath(ctx, style); + } + + this.setCtxGlobalAlpha(ctx, "stroke", style); + ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", style); + } + + this.drawText(ctx, style, this.style); //岛洞 + + var hpStyle = Util.cloneObject(style); + + if (hpStyle.pointList) { + if (this.holePolygonPointLists && this.holePolygonPointLists.length > 0) { + var holePLS = this.holePolygonPointLists; + var holePLSen = holePLS.length; + + for (var i = 0; i < holePLSen; i++) { + var holePL = holePLS[i]; //岛洞面 + + hpStyle.pointList = holePL; + ctx.globalCompositeOperation = "destination-out"; // 先 fill 再stroke + + hasPath = false; + + if (hpStyle.brushType == 'fill' || hpStyle.brushType == 'both' || typeof hpStyle.brushType == 'undefined') { + // 默认为fill + ctx.beginPath(); + + if (hpStyle.lineType == 'dashed' || hpStyle.lineType == 'dotted' || hpStyle.lineType == 'dot' || hpStyle.lineType == 'dash' || hpStyle.lineType == 'dashdot' || hpStyle.lineType == 'longdash' || hpStyle.lineType == 'longdashdot') { + // 特殊处理,虚线围不成path,实线再build一次 + this.buildPath(ctx, { + lineType: 'solid', + lineWidth: hpStyle.lineWidth, + pointList: hpStyle.pointList + }); + } else { + this.buildPath(ctx, hpStyle); + hasPath = true; // 这个path能用 + } + + ctx.closePath(); + this.setCtxGlobalAlpha(ctx, "fill", hpStyle); + ctx.fill(); + this.setCtxGlobalAlpha(ctx, "reset", hpStyle); + } + + if (hpStyle.lineWidth > 0 && (hpStyle.brushType == 'stroke' || hpStyle.brushType == 'both')) { + if (!hasPath) { + ctx.beginPath(); + this.buildPath(ctx, hpStyle); + } //如果描边,先回复 globalCompositeOperation 默认值再描边。 + + + ctx.globalCompositeOperation = "source-over"; + this.setCtxGlobalAlpha(ctx, "stroke", hpStyle); + ctx.stroke(); + this.setCtxGlobalAlpha(ctx, "reset", hpStyle); + } else { + ctx.globalCompositeOperation = "source-over"; + } + } + } + } + + ctx.restore(); + return; + } + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.buildPath + * @description 创建多边形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (style.showShadow) { + ctx.shadowBlur = style.shadowBlur; + ctx.shadowColor = style.shadowColor; + ctx.shadowOffsetX = style.shadowOffsetX; + ctx.shadowOffsetY = style.shadowOffsetY; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; // 虽然能重用 brokenLine,但底层图形基于性能考虑,重复代码减少调用吧 + + var pointList = style.pointList; + + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + + if (style.smooth && style.smooth !== 'spline') { + var controlPoints = SUtil_SUtil.SUtil_smoothBezier(pointList, style.smooth, true, style.smoothConstraint, __OP); + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + var cp1; + var cp2; + var p; + var len = pointList.length; + + for (var i = 0; i < len; i++) { + cp1 = controlPoints[i * 2]; + cp2 = controlPoints[i * 2 + 1]; + p = [pointList[(i + 1) % len][0] + __OP[0], pointList[(i + 1) % len][1] + __OP[1]]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } else { + if (style.smooth === 'spline') { + pointList = SUtil_SUtil.SUtil_smoothSpline(pointList, true, null, __OP); + } + + if (!style.lineType || style.lineType == 'solid') { + // 默认为实线 + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var _i = 1; _i < pointList.length; _i++) { + ctx.lineTo(pointList[_i][0] + __OP[0], pointList[_i][1] + __OP[1]); + } + + ctx.lineTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + } else if (style.lineType === 'dashed' || style.lineType === 'dotted' || style.lineType === 'dot' || style.lineType === 'dash' || style.lineType === 'longdash') { + // SMIC-方法修改 - start + var dashLengthForStyle = style._dashLength || (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1); + style._dashLength = dashLengthForStyle; + var dashLength = style.lineWidth || 1; + var pattern1 = dashLength; + var pattern2 = dashLength; //dashed + + if (style.lineType === 'dashed') { + pattern1 *= 5; + pattern2 *= 5; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } //dotted + + + if (style.lineType === 'dotted') { + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } //dot + + + if (style.lineType === 'dot') { + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } //dash + + + if (style.lineType === 'dash') { + pattern1 *= 4; + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } //longdash + + + if (style.lineType === 'longdash') { + pattern1 *= 8; + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var _i2 = 1; _i2 < pointList.length; _i2++) { + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[_i2 - 1][0] + __OP[0], pointList[_i2 - 1][1] + __OP[1], pointList[_i2][0] + __OP[0], pointList[_i2][1] + __OP[1], dashLength, [pattern1, pattern2]); + } + + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[pointList.length - 1][0] + __OP[0], pointList[pointList.length - 1][1] + __OP[1], pointList[0][0] + __OP[0], pointList[0][1] + __OP[1], dashLength, [pattern1, pattern2]); + } else if (style.lineType === 'dashdot' || style.lineType === 'longdashdot') { + var _dashLengthForStyle = style._dashLength || (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1); + + style._dashLength = _dashLengthForStyle; + + var _dashLength = style.lineWidth || 1; + + var _pattern = _dashLength; + var _pattern2 = _dashLength; + var pattern3 = _dashLength; + var pattern4 = _dashLength; //dashdot + + if (style.lineType === 'dashdot') { + _pattern *= 4; + _pattern2 *= 4; + pattern4 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + _pattern -= _dashLength; + _pattern2 += _dashLength; + pattern3 = 1; + pattern4 += _dashLength; + } + } //longdashdot + + + if (style.lineType === 'longdashdot') { + _pattern *= 8; + _pattern2 *= 4; + pattern4 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + _pattern -= _dashLength; + _pattern2 += _dashLength; + pattern3 = 1; + pattern4 += _dashLength; + } + } + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var _i3 = 1; _i3 < pointList.length; _i3++) { + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[_i3 - 1][0] + __OP[0], pointList[_i3 - 1][1] + __OP[1], pointList[_i3][0] + __OP[0], pointList[_i3][1] + __OP[1], _dashLength, [_pattern, _pattern2, pattern3, pattern4]); + } + + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[pointList.length - 1][0] + __OP[0], pointList[pointList.length - 1][1] + __OP[1], pointList[0][0] + __OP[0], pointList[0][1] + __OP[1], _dashLength, [_pattern, _pattern2, pattern3, pattern4]); + } + } + + return; + } + /** + * @function LevelRenderer.Shape.SmicPolygon.prototype.getRect + * @description 计算返回多边形包围盒矩阵。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + + }, { + key: "getRect", + value: function getRect(style, refOriginalPosition) { + var __OP; + + if (!refOriginalPosition) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + __OP = this.refOriginalPosition; + } else { + __OP = refOriginalPosition; + } + + if (style.__rect) { + return style.__rect; + } + + var minX = Number.MAX_VALUE; + var maxX = Number.MIN_VALUE; + var minY = Number.MAX_VALUE; + var maxY = Number.MIN_VALUE; + var pointList = style.pointList; + + for (var i = 0, l = pointList.length; i < l; i++) { + if (pointList[i][0] + __OP[0] < minX) { + minX = pointList[i][0] + __OP[0]; + } + + if (pointList[i][0] + __OP[0] > maxX) { + maxX = pointList[i][0] + __OP[0]; + } + + if (pointList[i][1] + __OP[1] < minY) { + minY = pointList[i][1] + __OP[1]; + } + + if (pointList[i][1] + __OP[1] > maxY) { + maxY = pointList[i][1] + __OP[1]; + } + } + + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(minX - lineWidth / 2), + y: Math.round(minY - lineWidth / 2), + width: maxX - minX + lineWidth, + height: maxY - minY + lineWidth + }; + return style.__rect; + } + }]); + + return SmicPolygon; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicBrokenLine.js +function SmicBrokenLine_typeof(obj) { "@babel/helpers - typeof"; return SmicBrokenLine_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicBrokenLine_typeof(obj); } + +function SmicBrokenLine_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicBrokenLine_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicBrokenLine_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicBrokenLine_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicBrokenLine_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicBrokenLine_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicBrokenLine_get = Reflect.get; } else { SmicBrokenLine_get = function _get(target, property, receiver) { var base = SmicBrokenLine_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicBrokenLine_get.apply(this, arguments); } + +function SmicBrokenLine_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicBrokenLine_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicBrokenLine_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicBrokenLine_setPrototypeOf(subClass, superClass); } + +function SmicBrokenLine_setPrototypeOf(o, p) { SmicBrokenLine_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicBrokenLine_setPrototypeOf(o, p); } + +function SmicBrokenLine_createSuper(Derived) { var hasNativeReflectConstruct = SmicBrokenLine_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicBrokenLine_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicBrokenLine_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicBrokenLine_possibleConstructorReturn(this, result); }; } + +function SmicBrokenLine_possibleConstructorReturn(self, call) { if (call && (SmicBrokenLine_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicBrokenLine_assertThisInitialized(self); } + +function SmicBrokenLine_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicBrokenLine_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicBrokenLine_getPrototypeOf(o) { SmicBrokenLine_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicBrokenLine_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Shape.SmicBrokenLine + * @category Visualization Theme + * @classdesc 折线(ic)。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicBrokenLine({ + * style: { + * pointList: [[0, 0], [100, 100], [100, 0]], + * smooth: 'bezier', + * strokeColor: 'purple' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicBrokenLine = /*#__PURE__*/function (_Shape) { + SmicBrokenLine_inherits(SmicBrokenLine, _Shape); + + var _super = SmicBrokenLine_createSuper(SmicBrokenLine); + + function SmicBrokenLine(options) { + var _this; + + SmicBrokenLine_classCallCheck(this, SmicBrokenLine); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.brushTypeOnly + * @description 线条只能描边。 + */ + + _this.brushTypeOnly = 'stroke'; + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.textPosition + * @description 文本位置。 + */ + + _this.textPosition = 'end'; + /** + * @member {string} LevelRenderer.Shape.SmicBrokenLine.prototype.type + * @description 图形类型. + */ + + _this.type = 'smicbroken-line'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicBrokenLine"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicBrokenLine_createClass(SmicBrokenLine, [{ + key: "destroy", + value: function destroy() { + this.brushTypeOnly = null; + this.textPosition = null; + this.type = null; + + SmicBrokenLine_get(SmicBrokenLine_getPrototypeOf(SmicBrokenLine.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.buildPath + * @description 创建折线路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var pointList = style.pointList; + + if (pointList.length < 2) { + // 少于2个点就不画了~ + return; + } + + var len = Math.min(style.pointList.length, Math.round(style.pointListLength || style.pointList.length)); + + if (style.smooth && style.smooth !== 'spline') { + var controlPoints = SUtil_SUtil.SUtil_smoothBezier(pointList, style.smooth, false, style.smoothConstraint, __OP); + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + var cp1; + var cp2; + var p; + + for (var _i = 0; _i < len - 1; _i++) { + cp1 = controlPoints[_i * 2]; + cp2 = controlPoints[_i * 2 + 1]; + p = [pointList[_i + 1][0] + __OP[0], pointList[_i + 1][1] + __OP[1]]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } else { + if (style.smooth === 'spline') { + pointList = SUtil_SUtil.SUtil_smoothSpline(pointList, null, null, __OP); + len = pointList.length; + } + + if (!style.lineType || style.lineType === 'solid') { + // 默认为实线 + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var _i2 = 1; _i2 < len; _i2++) { + ctx.lineTo(pointList[_i2][0] + __OP[0], pointList[_i2][1] + __OP[1]); + } + } else if (style.lineType === 'dashed' || style.lineType === 'dotted' || style.lineType === 'dot' || style.lineType === 'dash' || style.lineType === 'longdash') { + var dashLength = style.lineWidth || 1; + var pattern1 = dashLength; + var pattern2 = dashLength; //dashed + + if (style.lineType === 'dashed') { + pattern1 *= 5; + pattern2 *= 5; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } //dotted + + + if (style.lineType === 'dotted') { + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } //dot + + + if (style.lineType === 'dot') { + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 = 1; + pattern2 += dashLength; + } + } //dash + + + if (style.lineType === 'dash') { + pattern1 *= 4; + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } //longdash + + + if (style.lineType === 'longdash') { + pattern1 *= 8; + pattern2 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + pattern1 -= dashLength; + pattern2 += dashLength; + } + } + + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var i = 1; i < len; i++) { + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[i - 1][0] + __OP[0], pointList[i - 1][1] + __OP[1], pointList[i][0] + __OP[0], pointList[i][1] + __OP[1], dashLength, [pattern1, pattern2]); + } + } else if (style.lineType === 'dashdot' || style.lineType === 'longdashdot') { + var _dashLength = style.lineWidth || 1; + + var _pattern = _dashLength; + var _pattern2 = _dashLength; + var pattern3 = _dashLength; + var pattern4 = _dashLength; //dashdot + + if (style.lineType === 'dashdot') { + _pattern *= 4; + _pattern2 *= 4; + pattern4 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + _pattern -= _dashLength; + _pattern2 += _dashLength; + pattern3 = 1; + pattern4 += _dashLength; + } + } //longdashdot + + + if (style.lineType === 'longdashdot') { + _pattern *= 8; + _pattern2 *= 4; + pattern4 *= 4; + + if (style.lineCap && style.lineCap !== "butt") { + _pattern -= _dashLength; + _pattern2 += _dashLength; + pattern3 = 1; + pattern4 += _dashLength; + } + } + + _dashLength = (style.lineWidth || 1) * (style.lineType === 'dashed' ? 5 : 1); + ctx.moveTo(pointList[0][0] + __OP[0], pointList[0][1] + __OP[1]); + + for (var _i3 = 1; _i3 < len; _i3++) { + SUtil_SUtil.SUtil_dashedLineTo(ctx, pointList[_i3 - 1][0] + __OP[0], pointList[_i3 - 1][1] + __OP[1], pointList[_i3][0] + __OP[0], pointList[_i3][1] + __OP[1], _dashLength, [_pattern, _pattern2, pattern3, pattern4]); + } + } + } + + return; + } + /** + * @function LevelRenderer.Shape.SmicBrokenLine.prototype.getRect + * @description 计算返回折线包围盒矩形。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + return SmicPolygon.prototype.getRect.apply(this, [style, __OP]); + } + }]); + + return SmicBrokenLine; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicImage.js +function SmicImage_typeof(obj) { "@babel/helpers - typeof"; return SmicImage_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicImage_typeof(obj); } + +function SmicImage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicImage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicImage_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicImage_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicImage_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicImage_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicImage_get = Reflect.get; } else { SmicImage_get = function _get(target, property, receiver) { var base = SmicImage_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicImage_get.apply(this, arguments); } + +function SmicImage_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicImage_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicImage_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicImage_setPrototypeOf(subClass, superClass); } + +function SmicImage_setPrototypeOf(o, p) { SmicImage_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicImage_setPrototypeOf(o, p); } + +function SmicImage_createSuper(Derived) { var hasNativeReflectConstruct = SmicImage_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicImage_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicImage_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicImage_possibleConstructorReturn(this, result); }; } + +function SmicImage_possibleConstructorReturn(self, call) { if (call && (SmicImage_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicImage_assertThisInitialized(self); } + +function SmicImage_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicImage_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicImage_getPrototypeOf(o) { SmicImage_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicImage_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicImage + * @category Visualization Theme + * @classdesc 图片绘制。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicImage({ + * style: { + * image: 'test.jpg', + * x: 100, + * y: 100 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicImage = /*#__PURE__*/function (_Shape) { + SmicImage_inherits(SmicImage, _Shape); + + var _super = SmicImage_createSuper(SmicImage); + + function SmicImage(options) { + var _this; + + SmicImage_classCallCheck(this, SmicImage); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicImage.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicimage'; + /** + * @member {string} LevelRenderer.Shape.SmicImage.prototype._imageCache + * @description 图片缓存。 + */ + + _this._imageCache = {}; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicImage"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicImage.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicImage_createClass(SmicImage, [{ + key: "destroy", + value: function destroy() { + this.type = null; + this._imageCache = null; + + SmicImage_get(SmicImage_getPrototypeOf(SmicImage.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicImage.prototype.buildPath + * @description 创建图片。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "brush", + value: function brush(ctx, isHighlight, refresh) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var style = this.style || {}; + + if (isHighlight) { + // 根据style扩展默认高亮样式 + style = this.getHighlightStyle(style, this.highlightStyle || {}); + } + + var image = style.image; + var me = this; + + if (typeof image === 'string') { + var src = image; + + if (this._imageCache[src]) { + image = this._imageCache[src]; + } else { + image = new Image(); + + image.onload = function () { + image.onload = null; + clearTimeout(SmicImage._refreshTimeout); + + SmicImage._needsRefresh.push(me); // 防止因为缓存短时间内触发多次onload事件 + + + SmicImage._refreshTimeout = setTimeout(function () { + refresh && refresh(SmicImage._needsRefresh); // 清空 needsRefresh + + SmicImage._needsRefresh = []; + }, 10); + }; + + image.src = src; + this._imageCache[src] = image; + } + } + + if (image) { + // 图片已经加载完成 + if (image.nodeName.toUpperCase() == 'IMG') { + if (window.ActiveXObject) { + if (image.readyState != 'complete') { + return; + } + } else { + if (!image.complete) { + return; + } + } + } // Else is canvas + + + var width = style.width || image.width; + var height = style.height || image.height; + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; // 图片加载失败 + + if (!image.width || !image.height) { + return; + } + + ctx.save(); + this.doClip(ctx); + this.setContext(ctx, style); // 设置transform + + this.setTransform(ctx); + + if (style.sWidth && style.sHeight) { + var sx = style.sx + __OP[0] || 0; + var sy = style.sy + __OP[1] || 0; + ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height); + } else if (style.sx && style.sy) { + var _sx = style.sx + __OP[0]; + + var _sy = style.sy + __OP[1]; + + var sWidth = width - _sx; + var sHeight = height - _sy; + ctx.drawImage(image, _sx, _sy, sWidth, sHeight, x, y, width, height); + } else { + ctx.drawImage(image, x, y, width, height); + } // 如果没设置宽和高的话自动根据图片宽高设置 + + + if (!style.width) { + style.width = width; + } + + if (!style.height) { + style.height = height; + } + + if (!this.style.width) { + this.style.width = width; + } + + if (!this.style.height) { + this.style.height = height; + } + + this.drawText(ctx, style, this.style); + ctx.restore(); + } + } + /** + * @function LevelRenderer.Shape.SmicImage.prototype.getRect + * @description 计算返回图片的包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + return { + x: style.x + __OP[0], + y: style.y + __OP[1], + width: style.width, + height: style.height + }; + } + /** + * @function LevelRenderer.Shape.SmicImage.prototype.clearCache + * @description 清除图片缓存。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + + }, { + key: "clearCache", + value: function clearCache() { + this._imageCache = {}; + } + }]); + + return SmicImage; +}(Shape_Shape); +SmicImage._needsRefresh = []; +SmicImage._refreshTimeout = null; +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicRectangle.js +function SmicRectangle_typeof(obj) { "@babel/helpers - typeof"; return SmicRectangle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicRectangle_typeof(obj); } + +function SmicRectangle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicRectangle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicRectangle_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicRectangle_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicRectangle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicRectangle_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicRectangle_get = Reflect.get; } else { SmicRectangle_get = function _get(target, property, receiver) { var base = SmicRectangle_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicRectangle_get.apply(this, arguments); } + +function SmicRectangle_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicRectangle_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicRectangle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicRectangle_setPrototypeOf(subClass, superClass); } + +function SmicRectangle_setPrototypeOf(o, p) { SmicRectangle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicRectangle_setPrototypeOf(o, p); } + +function SmicRectangle_createSuper(Derived) { var hasNativeReflectConstruct = SmicRectangle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicRectangle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicRectangle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicRectangle_possibleConstructorReturn(this, result); }; } + +function SmicRectangle_possibleConstructorReturn(self, call) { if (call && (SmicRectangle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicRectangle_assertThisInitialized(self); } + +function SmicRectangle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicRectangle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicRectangle_getPrototypeOf(o) { SmicRectangle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicRectangle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicRectangle + * @category Visualization Theme + * @classdesc 矩形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicRectangle({ + * style: { + * x: 0, + * y: 0, + * width: 100, + * height: 100, + * radius: 20 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var SmicRectangle = /*#__PURE__*/function (_Shape) { + SmicRectangle_inherits(SmicRectangle, _Shape); + + var _super = SmicRectangle_createSuper(SmicRectangle); + + function SmicRectangle(options) { + var _this; + + SmicRectangle_classCallCheck(this, SmicRectangle); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicRectangle.prototype.type + * @description 图形类型. + */ + + _this.type = 'smicrectangle'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicRectangle"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicRectangle_createClass(SmicRectangle, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicRectangle_get(SmicRectangle_getPrototypeOf(SmicRectangle.prototype), "destroy", this).call(this); + } + /** + * APIMethod: _buildRadiusPath + * 创建矩形的圆角路径。 + * + * Parameters: + * ctx - {CanvasRenderingContext2D} Context2D 上下文。 + * style - {Object} style。 + * + */ + + }, { + key: "_buildRadiusPath", + value: function _buildRadiusPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var width = style.width; + var height = style.height; + var r = style.radius; + var r1; + var r2; + var r3; + var r4; + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.quadraticCurveTo(x + width, y, x + width, y + r2); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.quadraticCurveTo(x + width, y + height, x + width - r3, y + height); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.quadraticCurveTo(x, y + height, x, y + height - r4); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y); + } + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.buildPath + * @description 创建矩形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + + if (!style.radius) { + ctx.moveTo(style.x + __OP[0], style.y + __OP[1]); + ctx.lineTo(style.x + __OP[0] + style.width, style.y + __OP[1]); + ctx.lineTo(style.x + __OP[0] + style.width, style.y + __OP[1] + style.height); + ctx.lineTo(style.x + __OP[0], style.y + __OP[1] + style.height); + ctx.lineTo(style.x + __OP[0], style.y + __OP[1]); // ctx.rect(style.x, style.y, style.width, style.height); + } else { + this._buildRadiusPath(ctx, style); + } + + ctx.closePath(); + return; + } + /** + * @function LevelRenderer.Shape.SmicRectangle.prototype.getRect + * @description 计算返回矩形包围盒矩阵。该包围盒是直接从四个控制点计算,并非最小包围盒。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + + if (style.__rect) { + return style.__rect; + } + + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - lineWidth / 2), + y: Math.round(style.y + __OP[1] - lineWidth / 2), + width: style.width + lineWidth, + height: style.height + lineWidth + }; + return style.__rect; + } + }]); + + return SmicRectangle; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicSector.js +function SmicSector_typeof(obj) { "@babel/helpers - typeof"; return SmicSector_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicSector_typeof(obj); } + +function SmicSector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicSector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicSector_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicSector_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicSector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicSector_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicSector_get = Reflect.get; } else { SmicSector_get = function _get(target, property, receiver) { var base = SmicSector_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicSector_get.apply(this, arguments); } + +function SmicSector_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicSector_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicSector_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicSector_setPrototypeOf(subClass, superClass); } + +function SmicSector_setPrototypeOf(o, p) { SmicSector_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicSector_setPrototypeOf(o, p); } + +function SmicSector_createSuper(Derived) { var hasNativeReflectConstruct = SmicSector_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicSector_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicSector_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicSector_possibleConstructorReturn(this, result); }; } + +function SmicSector_possibleConstructorReturn(self, call) { if (call && (SmicSector_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicSector_assertThisInitialized(self); } + +function SmicSector_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicSector_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicSector_getPrototypeOf(o) { SmicSector_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicSector_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicSector + * @category Visualization Theme + * @classdesc 扇形。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicSector({ + * style: { + * x: 100, + * y: 100, + * r: 60, + * r0: 30, + * startAngle: 0, + * endEngle: 180 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicSector = /*#__PURE__*/function (_Shape) { + SmicSector_inherits(SmicSector, _Shape); + + var _super = SmicSector_createSuper(SmicSector); + + function SmicSector(options) { + var _this; + + SmicSector_classCallCheck(this, SmicSector); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicSector.protptype.type + * @description 图形类型。 + */ + + _this.type = 'smicsector'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicSector"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicSector.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicSector_createClass(SmicSector, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicSector_get(SmicSector_getPrototypeOf(SmicSector.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicSector.prototype.buildPath + * @description 创建扇形路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var x = style.x + __OP[0]; // 圆心x + + var y = style.y + __OP[1]; // 圆心y + + var r0 = style.r0 || 0; // 形内半径[0,r) + + var r = style.r; // 扇形外半径(0,r] + + var startAngle = style.startAngle; // 起始角度[0,360) + + var endAngle = style.endAngle; // 结束角度(0,360] + + var clockWise = style.clockWise || false; + startAngle = SUtil_SUtil.Util_math.degreeToRadian(startAngle); + endAngle = SUtil_SUtil.Util_math.degreeToRadian(endAngle); + + if (!clockWise) { + // 扇形默认是逆时针方向,Y轴向上 + // 这个跟arc的标准不一样,为了兼容echarts + startAngle = -startAngle; + endAngle = -endAngle; + } + + var unitX = SUtil_SUtil.Util_math.cos(startAngle); + var unitY = SUtil_SUtil.Util_math.sin(startAngle); + ctx.moveTo(unitX * r0 + x, unitY * r0 + y); + ctx.lineTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockWise); + ctx.lineTo(SUtil_SUtil.Util_math.cos(endAngle) * r0 + x, SUtil_SUtil.Util_math.sin(endAngle) * r0 + y); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockWise); + } + + ctx.closePath(); + return; + } + /** + * @function LevelRenderer.Shape.SmicSector.prototype.getRect + * @description 返回扇形包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var min0 = SUtil_SUtil.Util_vector.create(); + var min1 = SUtil_SUtil.Util_vector.create(); + var max0 = SUtil_SUtil.Util_vector.create(); + var max1 = SUtil_SUtil.Util_vector.create(); + var x = style.x + __OP[0]; // 圆心x + + var y = style.y + __OP[1]; // 圆心y + + var r0 = style.r0 || 0; // 形内半径[0,r) + + var r = style.r; // 扇形外半径(0,r] + + var startAngle = SUtil_SUtil.Util_math.degreeToRadian(style.startAngle); + var endAngle = SUtil_SUtil.Util_math.degreeToRadian(style.endAngle); + var clockWise = style.clockWise; + + if (!clockWise) { + startAngle = -startAngle; + endAngle = -endAngle; + } + + if (r0 > 1) { + SUtil_SUtil.Util_computeBoundingBox.arc(x, y, r0, startAngle, endAngle, !clockWise, min0, max0); + } else { + min0[0] = max0[0] = x; + min0[1] = max0[1] = y; + } + + SUtil_SUtil.Util_computeBoundingBox.arc(x, y, r, startAngle, endAngle, !clockWise, min1, max1); + SUtil_SUtil.Util_vector.min(min0, min0, min1); + SUtil_SUtil.Util_vector.max(max0, max0, max1); + style.__rect = { + x: min0[0], + y: min0[1], + width: max0[0] - min0[0], + height: max0[1] - min0[1] + }; + return style.__rect; + } + }]); + + return SmicSector; +}(Shape_Shape); +;// CONCATENATED MODULE: ./src/common/overlay/feature/ShapeFactory.js +function ShapeFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ShapeFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ShapeFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) ShapeFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) ShapeFactory_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + +/** + * @class FeatureShapeFactory + * @aliasclass Feature.ShapeFactory + * @deprecatedclass SuperMap.Feature.ShapeFactory + * @category Visualization Theme + * @classdesc 图形工厂类。 + * 目前支持创建的图形有:
+ * 用于统计专题图:
+ * 点 - 参数对象 <{@link ShapeParametersPoint}>
+ * 线 - 参数对象 <{@link ShapeParametersLine}>
+ * 面 - 参数对象 <{@link ShapeParametersPolygon}>
+ * 矩形 - 参数对象 <{@link ShapeParametersPolygon}>
+ * 扇形 - 参数对象 <{@link ShapeParametersSector}>
+ * 标签 - 参数对象 <{@link ShapeParametersLabel}>
+ * 图片 - 参数对象 <{@link ShapeParametersImage}>
+ * 用于符号专题图:
+ * 圆形 - 参数对象:<{@link ShapeParametersCircle}> + * @param {Object} [shapeParameters] - 图形参数对象,<{@link ShapeParameters}> 子类对象。 + * @usage + */ + +var ShapeFactory = /*#__PURE__*/function () { + function ShapeFactory(shapeParameters) { + ShapeFactory_classCallCheck(this, ShapeFactory); + + /** + * @member {Object} FeatureShapeFactory.prototype.shapeParameters + * @description 图形参数对象,<{@link ShapeParameters}> 子类对象。必设参数,默认值 null。 + */ + this.shapeParameters = shapeParameters; + this.CLASS_NAME = "SuperMap.Feature.ShapeFactory"; + } + /** + * @function FeatureShapeFactory.prototype.destroy + * @description 销毁图形工厂类对象。 + */ + + + ShapeFactory_createClass(ShapeFactory, [{ + key: "destroy", + value: function destroy() { + this.shapeParameters = null; + } + /** + * @function FeatureShapeFactory.prototype.createShape + * @description 创建一个图形。具体图形由 shapeParameters 决定。 + * @param {Object} shapeParameters - 图形参数对象,<{@link ShapeParameters}> 子类对象。 + * 此参数可选,如果使用此参数(不为 null),shapeParameters 属性值将被修改为参数的值,然后再使用 shapeParameters 属性值创建图形; + * 如果不使用此参数,createShape 方法将直接使用 shapeParameters 属性创建图形。 + * @returns {Object} 图形对象(或 null - 图形创建失败)。 + */ + + }, { + key: "createShape", + value: function createShape(shapeParameters) { + if (shapeParameters) { + this.shapeParameters = shapeParameters; + } + + if (!this.shapeParameters) { + return null; + } + + var sps = this.shapeParameters; + + if (sps instanceof Point_Point) { + // 点 + //设置style + var style = new Object(); + style["x"] = sps.x; + style["y"] = sps.y; + style["r"] = sps.r; + style = Util.copyAttributesWithClip(style, sps.style, ['x', 'y']); //创建图形 + + var shape = new SmicPoint(); + shape.style = ShapeFactory.transformStyle(style); + shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(shape, sps, ['x', 'y', 'style', 'highlightStyle']); + return shape; + } else if (sps instanceof Line_Line) { + // 线 + //检查参数 pointList 是否存在 + if (!sps.pointList) { + return null; + } // 设置style + + + var _style = new Object(); + + _style["pointList"] = sps.pointList; + _style = Util.copyAttributesWithClip(_style, sps.style, ['pointList']); // 创建图形 + + var _shape = new SmicBrokenLine(); + + _shape.style = ShapeFactory.transformStyle(_style); + _shape.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape, sps, ['pointList', 'style', 'highlightStyle']); + return _shape; + } else if (sps instanceof Polygon_Polygon) { + // 面 + //检查参数 pointList 是否存在 + if (!sps.pointList) { + return null; + } //设置style + + + var _style2 = new Object(); + + _style2["pointList"] = sps.pointList; + _style2 = Util.copyAttributesWithClip(_style2, sps.style, ['pointList']); //创建图形 + + var _shape2 = new SmicPolygon(); + + _shape2.style = ShapeFactory.transformStyle(_style2); + _shape2.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape2, sps, ['pointList', 'style', "highlightStyle"]); + return _shape2; + } else if (sps instanceof Rectangle_Rectangle) { + // 矩形 + //检查参数 pointList 是否存在 + if (!sps.x && !sps.y & !sps.width & !sps.height) { + return null; + } //设置style + + + var _style3 = new Object(); + + _style3["x"] = sps.x; + _style3["y"] = sps.y; + _style3["width"] = sps.width; + _style3["height"] = sps.height; + _style3 = Util.copyAttributesWithClip(_style3, sps.style, ['x', 'y', 'width', 'height']); //创建图形 + + var _shape3 = new SmicRectangle(); + + _shape3.style = ShapeFactory.transformStyle(_style3); + _shape3.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape3, sps, ['x', 'y', 'width', 'height', 'style', 'highlightStyle']); + return _shape3; + } else if (sps instanceof Sector) { + // 扇形 + //设置style + var _style4 = new Object(); + + _style4["x"] = sps.x; + _style4["y"] = sps.y; + _style4["r"] = sps.r; + _style4["startAngle"] = sps.startAngle; + _style4["endAngle"] = sps.endAngle; + + if (sps["r0"]) { + _style4["r0"] = sps.r0; + } + + if (sps["clockWise"]) { + _style4["clockWise"] = sps.clockWise; + } + + _style4 = Util.copyAttributesWithClip(_style4, sps.style, ['x', 'y', 'r', 'startAngle', 'endAngle', 'r0', 'endAngle']); //创建图形 + + var _shape4 = new SmicSector(); + + _shape4.style = ShapeFactory.transformStyle(_style4); + _shape4.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape4, sps, ['x', 'y', 'r', 'startAngle', 'endAngle', 'r0', 'endAngle', 'style', 'highlightStyle']); + return _shape4; + } else if (sps instanceof Label) { + // 标签 + //设置style + var _style5 = new Object(); + + _style5["x"] = sps.x; + _style5["y"] = sps.y; + _style5["text"] = sps.text; + _style5 = Util.copyAttributesWithClip(_style5, sps.style, ['x', 'y', 'text']); //创建图形 + + var _shape5 = new SmicText(); + + _shape5.style = ShapeFactory.transformStyle(_style5); + _shape5.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape5, sps, ['x', 'y', 'text', 'style', 'highlightStyle']); + return _shape5; + } else if (sps instanceof Image_Image) { + // 图片 + //设置style + var _style6 = new Object(); + + _style6["x"] = sps.x; + _style6["y"] = sps.y; + + if (sps["image"]) { + _style6["image"] = sps.image; + } + + if (sps["width"]) { + _style6["width"] = sps.width; + } + + if (sps["height"]) { + _style6["height"] = sps.height; + } + + if (sps["sx"]) { + _style6["sx"] = sps.sx; + } + + if (sps["sy"]) { + _style6["sy"] = sps.sy; + } + + if (sps["sWidth"]) { + _style6["sWidth"] = sps.sWidth; + } + + if (sps["sHeight"]) { + _style6["sHeight"] = sps.sHeight; + } + + _style6 = Util.copyAttributesWithClip(_style6, sps.style, ['x', 'y', 'image', 'width', 'height', 'sx', 'sy', 'sWidth', 'sHeight']); //创建图形 + + var _shape6 = new SmicImage(); + + _shape6.style = ShapeFactory.transformStyle(_style6); + _shape6.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape6, sps, ['x', 'y', 'image', 'width', 'height', 'style', 'highlightStyle']); + return _shape6; + } else if (sps instanceof Circle_Circle) { + //圆形 用于符号专题图 + //设置stytle + var _style7 = new Object(); + + _style7["x"] = sps.x; + _style7["r"] = sps.r; + _style7["y"] = sps.y; + _style7 = Util.copyAttributesWithClip(_style7, sps.style, ['x', 'y', 'r']); //创建图形 + + var _shape7 = new SmicCircle(); + + _shape7.style = ShapeFactory.transformStyle(_style7); + _shape7.highlightStyle = ShapeFactory.transformStyle(sps.highlightStyle); + Util.copyAttributesWithClip(_shape7, sps, ['x', 'y', 'r', 'style', 'highlightStyle', 'lineWidth', 'text', 'textPosition']); + return _shape7; + } + + return null; + } + /** + * @function FeatureShapeFactory.prototype.transformStyle + * @description 将用户 feature.style (类 Svg style 标准) 的样式,转换为 levelRenderer 的样式标准(类 CSS-Canvas 样式) + * @param {Object} style - 用户 style。 + * @returns {Object} 符合 levelRenderer 的 style。 + */ + + }], [{ + key: "transformStyle", + value: function transformStyle(style) { + var newStyle = {}; //字体 ["font-style", "font-variant", "font-weight", "font-size / line-height", "font-family"]; + + var fontStr = ["normal", "normal", "normal", "12", "arial,sans-serif"]; //画笔类型 ["fill", "stroke"]; + + var brushType = [true, false]; + + for (var ss in style) { + switch (ss) { + case "fill": + brushType[0] = style[ss]; + break; + + case "fillColor": + newStyle["color"] = style[ss]; + break; + + case "stroke": + brushType[1] = style[ss]; + break; + + case "strokeWidth": + newStyle["lineWidth"] = style[ss]; + break; + + case "strokeLinecap": + newStyle["lineCap"] = style[ss]; + break; + + case "strokeLineJoin": + newStyle["lineJoin"] = style[ss]; + break; + + case "strokeDashstyle": + newStyle["lineType"] = style[ss]; + break; + + case "pointRadius": + newStyle["r"] = style[ss]; + break; + + case "label": + newStyle["text"] = style[ss]; + break; + + case "labelRect": + newStyle["labelRect"] = style[ss]; + break; + + case "fontColor": + newStyle["textColor"] = style[ss]; + break; + + case "fontStyle": + fontStr[0] = style[ss]; + break; + + case "fontVariant": + fontStr[1] = style[ss]; + break; + + case "fontWeight": + fontStr[2] = style[ss]; + break; + + case "fontSize": + var unit = ""; + + if (style[ss] && style[ss].toString().indexOf("px") < 0) { + unit = "px"; + } + + fontStr[3] = style[ss] + unit; + break; + + case "fontFamily": + fontStr[4] = style[ss]; + break; + + case "fontOpacity": + newStyle["opacity"] = style[ss]; + break; + + case "labelPosition": + newStyle["textPosition"] = style[ss]; + break; + + case "labelAlign": + newStyle["textAlign"] = style[ss]; + break; + + case "labelBaseline": + newStyle["textBaseline"] = style[ss]; + break; + + case "labelRotation": + newStyle["textRotation"] = style[ss]; + break; + + default: + newStyle[ss] = style[ss]; + break; + } + } //拼接字体字符串 + + + newStyle["textFont"] = fontStr.join(" "); //画笔类型 + + if (brushType[0] === true && brushType[1] === false) { + newStyle["brushType"] = "fill"; + } else if (brushType[0] === false && brushType[1] === true) { + newStyle["brushType"] = "stroke"; + } else if (brushType[0] === true && brushType[1] === true) { + newStyle["brushType"] = "both"; + } else { + newStyle["brushType"] = "fill"; + } //默认线宽 1 + + + if (newStyle["lineWidth"] == null) { + newStyle["lineWidth"] = 1; + } + + return newStyle; + } + /** + * @function FeatureShapeFactory.prototype.Background + * @description 创建一个矩形背景框图形对象。 + * @param {FeatureShapeFactory} shapeFactory - 图形工厂对象。 + * @param {Array.} box - 框区域,长度为 4 的一维数组,像素坐标,[left, bottom, right, top]。 + * @param {Object} setting - 图表配置参数。本函数中图形配置对象 setting 可设属性: + * @param {Object} setting.backgroundStyle - 背景样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.backgroundRadius=[0,0,0,0]] - 背景框矩形圆角半径,可以用数组分别指定四个角的圆角半径,设:左上、右上、右下、左下角的半径依次为 r1、r2、r3、r4,则 backgroundRadius 为 [r1、r2、r3、r4 ]。 + * @returns {Object} 背景框图形,一个可视化图形(矩形)对象。 + */ + + }, { + key: "Background", + value: function Background(shapeFactory, box, setting) { + var sets = setting ? setting : {}; // 背景框图形参数对象 + + var bgSP = new Rectangle_Rectangle(box[0], box[3], Math.abs(box[2] - box[0]), Math.abs(box[3] - box[1])); // 默认样式 + + bgSP.style = { + fillColor: "#f3f3f3" + }; // 设置用户 style + + if (sets.backgroundStyle) { + Util.copyAttributesWithClip(bgSP.style, sets.backgroundStyle); + } // 设置背景框圆角参数 + + + if (sets.backgroundRadius) { + bgSP.style["radius"] = sets.backgroundRadius; + } // 禁止背景框响应事件 + + + bgSP.clickable = false; + bgSP.hoverable = false; + return shapeFactory.createShape(bgSP); + } + /** + * @function FeatureShapeFactory.prototype.GraphAxis + * @description 创建一个统计图表坐标轴图形对象组。 + * @param {FeatureShapeFactory} shapeFactory - 图形工厂对象。 + * @param {Array.} dataViewBox - 统计图表模型的数据视图框,长度为 4 的一维数组,像素坐标,[left, bottom, right, top]。 + * @param {Object} setting - 图表配置参数。 + * @param {Object} setting.axisStyle - 坐标轴样式,此样式对象对象可设属性:。 + * @param {boolean} [setting.axisUseArrow=false] - 坐标轴是否使用箭头。 + * @param {number} [setting.axisYTick=0] - y 轴刻度数量,0表示不使用箭头。 + * @param {Array.} setting.axisYLabels - y 轴上的标签组内容,标签顺序沿着数据视图框左面条边自上而下,等距排布。例如:["1000", "750", "500", "250", "0"]。 + * @param {Object} setting.axisYLabelsStyle - y 轴上的标签组样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.axisYLabelsOffset=[0,0]] - y 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 y 轴标签组横向上的偏移量,向左为正,默认值:0;数组第二项表示 y 轴标签组纵向上的偏移量,向下为正,默认值:0。 + * @param {Array.} setting.axisXLabels - x 轴上的标签组内容,标签顺序沿着数据视图框下面条边自左向右排布,例如:["92年", "95年", "99年"]。 + * 标签排布规则:当标签数量与 xShapeInfo 中的属性 xPositions 数量相同(即标签个数与数据个数相等时), 按照 xPositions 提供的位置在水平方向上排布标签,否则沿数据视图框下面条边等距排布标签。 + * @param {Object} setting.axisXLabelsStyle - x 轴上的标签组样式,此样式对象对象可设属性:。 + * @param {Array.} [setting.axisXLabelsOffset=[0,0]] - x 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 x 轴标签组横向上的偏移量,向左为正,默认值:0;数组第二项表示 x 轴标签组纵向上的偏移量,向下为正,默认值:0。 + * @param {boolean} setting.useXReferenceLine - 是否使用水平参考线,如果为 true,在 axisYTick 大于 0 时有效,水平参考线是 y 轴刻度在数据视图框里的延伸。 + * @param {Object} setting.xReferenceLineStyle - 水平参考线样式,此样式对象对象可设属性:。 + * @param {number} [setting.axis3DParameter=0] - 3D 坐标轴参数,此属性值在大于等于 15 时有效。 + * @param {Object} xShapeInfo - X 方向上的图形信息对象,包含两个属性。 + * @param {Array.} xShapeInfo.xPositions - 图形在 x 轴方向上的像素坐标值,是一个一维数组,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * @param {number} xShapeInfo.width - 图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * @returns {Array.} 统计图表坐标轴图形对象数组。 + */ + + }, { + key: "GraphAxis", + value: function GraphAxis(shapeFactory, dataViewBox, setting, xShapeInfo) { + var dvb = dataViewBox; + var sets = setting ? setting : {}; // 参考线图形对象组 + + var refLines = []; //坐标轴箭头对象组 + + var arrows = []; // 是否使用参水平考线,默认不使用 + + var isAddRefLine = sets.useXReferenceLine ? sets.useXReferenceLine : false; // y 轴上的刻度 + + var axisytick = sets.axisYTick && !isNaN(sets.axisYTick) ? sets.axisYTick : 0; // 坐标轴节点数组 + + var pois = []; //z 轴箭头数组 + + var zArrowPois = []; // x,y 轴主干节点数组 + + var xMainPois = []; + + if (axisytick == 0) { + xMainPois.push([dvb[0], dvb[3] - 5]); + xMainPois.push([dvb[0], dvb[1]]); // 3D 坐标轴 第三象限平分线 + + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + var axis3DParameter = parseInt(sets.axis3DParameter); + var axis3DPoi = [dvb[0] - axis3DParameter, dvb[1] + axis3DParameter]; // 添加 3D 轴节点 + + if (sets.axisUseArrow) { + // 添加 3D 轴箭头节点坐标 + //箭头坐标 + zArrowPois.push([axis3DPoi[0] + 1.5, axis3DPoi[1] - 7.5]); + zArrowPois.push([axis3DPoi[0] - 1, axis3DPoi[1] + 1]); + zArrowPois.push([axis3DPoi[0] + 7.5, axis3DPoi[1] - 1.5]); //3D轴 + + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } else { + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + + xMainPois.push([dvb[0], dvb[1]]); + } + + xMainPois.push([dvb[2] + 5, dvb[1]]); + } else { + // 单位刻度长度 + var unitTick = Math.abs(dvb[1] - dvb[3]) / axisytick; // 刻度 y 坐标 + + var thckY = dvb[3]; + xMainPois.push([dvb[0], thckY - 5]); + + for (var i = 0; i < axisytick; i++) { + xMainPois.push([dvb[0], thckY]); + xMainPois.push([dvb[0] - 5, thckY]); + xMainPois.push([dvb[0], thckY]); // 参考线 + + if (isAddRefLine) { + // 参考线参数对象 + var refLineSP = new Line_Line([[dvb[0], thckY], [dvb[2], thckY]]); // 参考线默认样式对象 + + refLineSP.style = { + strokeColor: "#cfcfcf", + strokeLinecap: "butt", + strokeLineJoin: "round", + strokeWidth: 1 + }; // 禁止事件 + + refLineSP.clickable = false; + refLineSP.hoverable = false; // 用户style + + if (sets.xReferenceLineStyle) { + Util.copyAttributesWithClip(refLineSP.style, sets.xReferenceLineStyle); + } // 生成参考线图形对象 + + + refLines.push(shapeFactory.createShape(refLineSP)); + } // y 刻度增量 + + + thckY += unitTick; + } + + xMainPois.push([dvb[0], dvb[1]]); // 3D 坐标轴 第三象限平分线 + + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + var _axis3DParameter = parseInt(sets.axis3DParameter); + + var _axis3DPoi = [dvb[0] - _axis3DParameter, dvb[1] + _axis3DParameter]; + /* + // 箭头计算过程 + var axis3DPoiRef = [axis3DPoi[0] + 7, axis3DPoi[1] - 7]; // 7 是 10 为斜边 cos(45度)时邻边的值 + var axis3DPoiLT = [axis3DPoiRef[0] - 4, axis3DPoiRef[1] - 4]; + var axis3DPoiRB = [axis3DPoiRef[0] + 4, axis3DPoiRef[1] + 4]; + if(sets.axisUseArrow){ + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + xMainPois.push([axis3DPoiLT[0], axis3DPoiLT[1]]); + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + xMainPois.push([axis3DPoiRB[0], axis3DPoiRB[1]]); + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + else{ + xMainPois.push([axis3DPoi[0], axis3DPoi[1]]); + } + */ + // 添加 3D 轴节点 + + if (sets.axisUseArrow) { + // 添加 3D 轴和箭头坐标 + //箭头坐标 + zArrowPois.push([_axis3DPoi[0] + 1.5, _axis3DPoi[1] - 7.5]); + zArrowPois.push([_axis3DPoi[0] - 1, _axis3DPoi[1] + 1]); + zArrowPois.push([_axis3DPoi[0] + 7.5, _axis3DPoi[1] - 1.5]); //3D轴 + + xMainPois.push([_axis3DPoi[0], _axis3DPoi[1]]); + } else { + xMainPois.push([_axis3DPoi[0], _axis3DPoi[1]]); + } + + xMainPois.push([dvb[0], dvb[1]]); + } + + xMainPois.push([dvb[2] + 5, dvb[1]]); + } // 坐标轴箭头 + + + if (sets.axisUseArrow) { + // x 轴箭头节点数组 + var xArrowPois = [[dvb[2] + 5, dvb[1] + 4], [dvb[2] + 13, dvb[1]], [dvb[2] + 5, dvb[1] - 4]]; // y 轴箭头节点数组 + + var yArrowPois = [[dvb[0] - 4, dvb[3] - 5], [dvb[0], dvb[3] - 13], [dvb[0] + 4, dvb[3] - 5]]; //x轴箭头 + + var xSP = new Polygon_Polygon(xArrowPois); + xSP.style = { + fillColor: "#008acd" + }; + Util.copyAttributesWithClip(xSP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(xSP)); //y轴箭头 + + var ySP = new Polygon_Polygon(yArrowPois); + ySP.style = { + fillColor: "#008acd" + }; + Util.copyAttributesWithClip(ySP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(ySP)); // z轴箭头 坐标轴箭头是否要使用 + + if (sets.axis3DParameter && !isNaN(sets.axis3DParameter) && sets.axis3DParameter >= 15) { + var zSP = new Polygon_Polygon(zArrowPois); + zSP.style = { + fillColor: "#008acd" + }; + Util.copyAttributesWithClip(zSP.style, sets.axisStyle); + arrows.push(shapeFactory.createShape(zSP)); + } + } //不带箭头的坐标轴 + + + pois = xMainPois; // 坐标轴参数对象 + + var axisSP = new Line_Line(pois); // 坐标轴默认style + + axisSP.style = { + strokeLinecap: "butt", + strokeLineJoin: "round", + strokeColor: "#008acd", + strokeWidth: 1 + }; // 用户 style + + if (sets.axisStyle) { + Util.copyAttributesWithClip(axisSP.style, sets.axisStyle); + } // 禁止事件 + + + axisSP.clickable = false; + axisSP.hoverable = false; // 创建坐标轴图形对象 + + var axisMain = [shapeFactory.createShape(axisSP)]; // Y 轴标签 + + var yLabels = []; + + if (sets.axisYLabels && sets.axisYLabels.length && sets.axisYLabels.length > 0) { + var axisYLabels = sets.axisYLabels; + var len = axisYLabels.length; // 标签偏移量 + + var ylOffset = [0, 0]; + + if (sets.axisYLabelsOffset && sets.axisYLabelsOffset.length) { + ylOffset = sets.axisYLabelsOffset; + } + + if (len == 1) { + // 标签参数对象 + var labelYSP = new Label(dvb[0] - 5 + ylOffset[0], dvb[3] + ylOffset[1], axisYLabels[0]); + labelYSP.style = { + labelAlign: "right" + }; // 用户 style + + if (sets.axisYLabelsStyle) { + Util.copyAttributesWithClip(labelYSP.style, sets.axisYLabelsStyle); + } // 禁止事件 + + + labelYSP.clickable = false; + labelYSP.hoverable = false; // 制作标签 + + yLabels.push(shapeFactory.createShape(labelYSP)); + } else { + var labelY = dvb[3]; // y 轴标签单位距离 + + var yUnit = Math.abs(dvb[1] - dvb[3]) / (len - 1); + + for (var j = 0; j < len; j++) { + // 标签参数对象 + var _labelYSP = new Label(dvb[0] - 5 + ylOffset[0], labelY + ylOffset[1], axisYLabels[j]); + + _labelYSP.style = { + labelAlign: "right" + }; // 用户 style + + if (sets.axisYLabelsStyle) { + Util.copyAttributesWithClip(_labelYSP.style, sets.axisYLabelsStyle); + } // 禁止事件 + + + _labelYSP.clickable = false; + _labelYSP.hoverable = false; // 制作标签 + + yLabels.push(shapeFactory.createShape(_labelYSP)); // y 轴标签 y 方向增量 + + labelY += yUnit; + } + } + } // X 轴标签 + + + var xLabels = []; + + if (sets.axisXLabels && sets.axisXLabels.length && sets.axisXLabels.length > 0) { + var axisXLabels = sets.axisXLabels; + var _len = axisXLabels.length; // 标签偏移量 + + var xlOffset = [0, 0]; + + if (sets.axisXLabelsOffset && sets.axisXLabelsOffset.length) { + xlOffset = sets.axisXLabelsOffset; + } // 标签个数与数据字段个数相等等时,标签在 x 轴均匀排列 + + + if (xShapeInfo && xShapeInfo.xPositions && xShapeInfo.xPositions.length && xShapeInfo.xPositions.length == _len) { + var xsCenter = xShapeInfo.xPositions; + + for (var K = 0; K < _len; K++) { + // 标签参数对象 + var labelXSP = new Label(xsCenter[K] + xlOffset[0], dvb[1] + xlOffset[1], axisXLabels[K]); // 默认 style + + labelXSP.style = { + labelAlign: "center", + labelBaseline: "top" + }; // 用户 style + + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(labelXSP.style, sets.axisXLabelsStyle); + } // 禁止事件 + + + labelXSP.clickable = false; + labelXSP.hoverable = false; // 创建标签对象 + + xLabels.push(shapeFactory.createShape(labelXSP)); + } + } else { + if (_len == 1) { + // 标签参数对象 + var _labelXSP = new Label(dvb[0] - 5 + xlOffset[0], dvb[1] + xlOffset[0], axisXLabels[0]); // 默认 style + + + _labelXSP.style = { + labelAlign: "center", + labelBaseline: "top" + }; // 用户 style + + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(_labelXSP.style, sets.axisXLabelsStyle); + } // 禁止事件 + + + _labelXSP.clickable = false; + _labelXSP.hoverable = false; // 创建标签对象 + + xLabels.push(shapeFactory.createShape(_labelXSP)); + } else { + var labelX = dvb[0]; // x 轴标签单位距离 + + var xUnit = Math.abs(dvb[2] - dvb[0]) / (_len - 1); + + for (var m = 0; m < _len; m++) { + // 标签参数对象 + var _labelXSP2 = new Label(labelX + xlOffset[0], dvb[1] + xlOffset[1], axisXLabels[m]); // 默认 style + + + _labelXSP2.style = { + labelAlign: "center", + labelBaseline: "top" + }; // 用户 style + + if (sets.axisXLabelsStyle) { + Util.copyAttributesWithClip(_labelXSP2.style, sets.axisXLabelsStyle); + } // 禁止事件 + + + _labelXSP2.clickable = false; + _labelXSP2.hoverable = false; // 创建标签对象 + + xLabels.push(shapeFactory.createShape(_labelXSP2)); // x 轴标签 x 方向增量 + + labelX += xUnit; + } + } + } + } // 组装并返回构成坐标轴的图形 + + + return refLines.concat(axisMain).concat(yLabels).concat(xLabels).concat(arrows); + } + /** + * @function FeatureShapeFactory.prototype.ShapeStyleTool + * @description 一个图形 style 处理工具。此工具将指定的默认 style,通用 style,按 styleGroup 取得的 style 和按数据值 value 范围取得的 style 进行合并,得到图形最终的 style。 + * @param {Object} defaultStyle - 默认style,此样式对象可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。 + * @param {Object} style - 图形对象基础 style,此参数控制图形的基础样式,可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。优先级低于 styleGroup,styleByCodomain。 + * @param {Array.} styleGroup - 一个 style 数组,优先级低于 styleByCodomain,高于 style。此数组每个元素是样式对象, + * 其可设属性根据图形类型参考 <{@link ShapeParameters}> 子类对象的 style 属性。通过 index 参数从 styleGroup 中取 style。 + * @param {Array.} styleByCodomain - 按数据(参数 value)所在值域范围控制数据的可视化对象样式。 + * (start code) + * // styleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,其可设属性根据图形类型参考 子类对象的 style 属性。。 + * // dataStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * (end) + * @param {number} index - styleGroup 的索引值,用于取出 styleGroup 指定的 style。 + * @param {number} value - 数据值,用于取出 styleByCodomain 指定的 style。 + * @returns {Object} 合并后的样式 (style) 对象。 + */ + + }, { + key: "ShapeStyleTool", + value: function ShapeStyleTool(defaultStyle, style, styleGroup, styleByCodomain, index, value) { + // 用 defaultStyle 初始化 style 对象 + var finalStyle = defaultStyle ? defaultStyle : {}; // 基础 style + + if (style) { + Util.copyAttributesWithClip(finalStyle, style); + } // 按索引赋 style + + + if (styleGroup && styleGroup.length && typeof index !== "undefined" && !isNaN(index) && index >= 0) { + if (styleGroup[index]) { + Util.copyAttributesWithClip(finalStyle, styleGroup[index]); + } + } // 按值域赋 style + + + if (styleByCodomain && styleByCodomain.length && typeof value !== "undefined") { + var dsc = styleByCodomain; + var dscLen = dsc.length; + var v = parseFloat(value); + + for (var i = 0; i < dscLen; i++) { + if (dsc[i].start <= v && v < dsc[i].end) { + Util.copyAttributesWithClip(finalStyle, dsc[i].style); + break; + } + } + } + + return finalStyle; + } + }]); + + return ShapeFactory; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/feature/Theme.js +function feature_Theme_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function feature_Theme_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function feature_Theme_createClass(Constructor, protoProps, staticProps) { if (protoProps) feature_Theme_defineProperties(Constructor.prototype, protoProps); if (staticProps) feature_Theme_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureTheme + * @aliasclass Feature.Theme + * @deprecatedclass SuperMap.Feature.Theme + * @category Visualization Theme + * @classdesc 专题要素基类。 + * @param {Object} data - 用户数据,用于生成可视化 shape。 + * @param {SuperMap.Layer.Theme} layer - 此专题要素所在图层。 + * @usage + */ + +var Theme_Theme = /*#__PURE__*/function () { + function Theme(data, layer) { + feature_Theme_classCallCheck(this, Theme); + + if (!data) { + return; + } // layer 必须已经添加到地图, 且已初始化渲染器 + + + if (!layer || !layer.map || !layer.renderer) { + return; + } + /** + * @member {string} FeatureTheme.prototype.id + * @description 专题要素唯一标识。 + */ + + + this.id = Util.createUniqueID(this.CLASS_NAME + "_"); + /** + * @member {LonLat} FeatureTheme.prototype.lonlat + * @description 专题要素地理参考位置。子类中必须根据用户数据(或地理位置参数)对其赋值。 + */ + + this.lonlat = null; + /** + * @member {Array.} FeatureTheme.prototype.location + * @description 专题要素像素参考位置。通常由地理参考位置决定。长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + this.location = []; + /** + * @readonly + * @member {Object} FeatureTheme.prototype.data + * @description 用户数据,用于生成可视化 shape,可在子类中规定数据格式或类型,如:<{@link FeatureVector}>。 + */ + + this.data = data; + /** + * @readonly + * @member {Array.} FeatureTheme.prototype.shapes + * @description 构成此专题要素的可视化图形对象数组,数组顺序控制渲染。 + */ + + this.shapes = []; + /** + * @readonly + * @member {SuperMap.Layer.Theme} FeatureTheme.prototype.layer + * @description 此专题要素所在专题图层。 + */ + + this.layer = layer; + this.CLASS_NAME = "SuperMap.Feature.Theme"; + } + /** + * @function FeatureTheme.prototype.destroy + * @description 销毁专题要素。 + */ + + + feature_Theme_createClass(Theme, [{ + key: "destroy", + value: function destroy() { + this.data = null; + this.id = null; + this.lonlat = null; + this.location = null; + this.shapes = null; + this.layer = null; + } + /** + * @function FeatureTheme.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {GeometryPoint|GeometryGeoText|LonLat} coordinate - 地理坐标点。 + * @returns {Array.} 长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + }, { + key: "getLocalXY", + value: function getLocalXY(coordinate) { + var resolution = this.layer.map.getResolution(); + var extent = this.layer.map.getExtent(); + + if (coordinate instanceof Point || coordinate instanceof GeoText) { + var x = coordinate.x / resolution + -extent.left / resolution; + var y = extent.top / resolution - coordinate.y / resolution; + return [x, y]; + } else if (coordinate instanceof LonLat) { + var _x = coordinate.lon / resolution + -extent.left / resolution; + + var _y = extent.top / resolution - coordinate.lat / resolution; + + return [_x, _y]; + } else { + return null; + } + } + }]); + + return Theme; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/Graph.js +function Graph_typeof(obj) { "@babel/helpers - typeof"; return Graph_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Graph_typeof(obj); } + +function Graph_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Graph_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Graph_createClass(Constructor, protoProps, staticProps) { if (protoProps) Graph_defineProperties(Constructor.prototype, protoProps); if (staticProps) Graph_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Graph_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Graph_get = Reflect.get; } else { Graph_get = function _get(target, property, receiver) { var base = Graph_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Graph_get.apply(this, arguments); } + +function Graph_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Graph_getPrototypeOf(object); if (object === null) break; } return object; } + +function Graph_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Graph_setPrototypeOf(subClass, superClass); } + +function Graph_setPrototypeOf(o, p) { Graph_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Graph_setPrototypeOf(o, p); } + +function Graph_createSuper(Derived) { var hasNativeReflectConstruct = Graph_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Graph_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Graph_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Graph_possibleConstructorReturn(this, result); }; } + +function Graph_possibleConstructorReturn(self, call) { if (call && (Graph_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Graph_assertThisInitialized(self); } + +function Graph_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Graph_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Graph_getPrototypeOf(o) { Graph_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Graph_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FeatureThemeGraph + * @aliasclass Feature.Theme.Graph + * @deprecatedclass SuperMap.Feature.Theme.Graph + * @category Visualization Theme + * @classdesc 统计专题要素基类。 + * 此类定义了统计专题要素基础模型,具体的图表模型通过继承此类,在子类中实现 assembleShapes 方法。 + * 统计专题要素模型采用了可视化图形大小自适应策略,用较少的参数控制着图表诸多图形,图表配置对象 的基础属性只有 7 个, + * 它们控制着图表结构、值域范围、数据小数位等基础图表形态。构成图表的图形必须在图表结构里自适应大小。 + * 此类不可实例化,此类的可实例化子类必须实现 assembleShapes() 方法。 + * @extends FeatureTheme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Theme} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {Object} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + */ + +var Graph = /*#__PURE__*/function (_Theme) { + Graph_inherits(Graph, _Theme); + + var _super = Graph_createSuper(Graph); + + function Graph(data, layer, fields, setting, lonlat, options) { + var _this; + + Graph_classCallCheck(this, Graph); + + _this = _super.call(this, data, layer, fields, setting, lonlat, options); + /** + * @member {FeatureShapeFactory} FeatureThemeGraph.prototype.shapeFactory + * @description 内置的图形工厂对象,调用其 createShape 方法创建图形。 + */ + + _this.shapeFactory = new ShapeFactory(); + /** + * @member {Object} FeatureThemeGraph.prototype.shapeParameters + * @description 当前图形参数对象,<{@link ShapeParameters}> 的子类对象。 + */ + + _this.shapeParameters = null; + /** + * @member {boolean} [FeatureThemeGraph.prototype.RelativeCoordinate] + * @description 图形是否已经计算了相对坐标。 + */ + + _this.RelativeCoordinate = false; + /** + * @member {Object} FeatureThemeGraph.prototype.setting + * @description 图表配置对象,该对象控制着图表的可视化显示。 + * @param {number} width - 专题要素(图表)宽度。 + * @param {number} height - 专题要素(图表)高度。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox + * (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。 + * 如果不设置此参数,在取数据值时不对数据做小数位处理。 + * + */ + + _this.setting = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.origonPoint + * @description 专题要素(图表)原点,图表左上角点像素坐标,是长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + _this.origonPoint = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.chartBox + * @description 专题要素(图表)区域,即图表框,长度为 4 的一维数组,数组的 4 个元素依次表示图表框左端 x 坐标值、 + * 下端 y坐标值、 右端 x坐标值、 上端 y 坐标值;[left, bottom, right, top]。 + */ + + _this.chartBox = null; + /** + * @readonly + * @member {Bounds} FeatureThemeGraph.prototype.chartBounds + * @description 图表 Bounds 随着 lonlat、XOffset、YOffset 更新,注意 chartBounds 是图表像素范围,不是地理范围。 + */ + + _this.chartBounds = null; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.width + * @description 专题要素(图表)宽度 。 + */ + + _this.width = null; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.height + * @description 专题要素(图表)高度 。 + */ + + _this.height = null; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.XOffset + * @description 专题要素(图表)在 X 方向上的偏移值,单位像素。 + */ + + _this.XOffset = 0; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.YOffset + * @description 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + */ + + _this.YOffset = 0; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBParameter + * @description 数据视图框参数,长度为 4 的一维数组(数组元素值 >= 0),[leftOffset, bottomOffset, rightOffset, topOffset],chartBox 内偏距值。 + * 此属性用于指定数据视图框 dataViewBox 的范围。 + */ + + _this.DVBParameter = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.dataViewBox + * @description 数据视图框,长度为 4 的一维数组,[left, bottom, right, top]。 + * dataViewBox 是统计专题要素最核心的内容,它负责解释数据在一个像素区域里的数据可视化含义, + * 这种含义用可视化图形表达出来,这些表示数据的图形和一些辅助图形组合在一起构成统计专题图表。 + */ + + _this.dataViewBox = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBCodomain + * @description 数据视图框的内允许展示的数据值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * dataViewBox 中允许的数据范围,对数据溢出值域范围情况的处理需要在 assembleShapes 中进行。 + */ + + _this.DVBCodomain = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBCenterPoint + * @description 数据视图框中心点,长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + _this.DVBCenterPoint = null; + /** + * @readonly + * @member {string} FeatureThemeGraph.prototype.DVBUnitValue + * @description 单位值。在 assembleShapes() 中初始化其具体意义,例如:饼图的 DVBUnitValue 可以定义为"360/数据总和", + * 折线图的 DVBUnitValue 可以定义为 "DVBCodomain/DVBHeight"。 + */ + + _this.DVBUnitValue = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.DVBOrigonPoint + * @description 数据视图框原点,数据视图框左上角点,长度为 2 的一维数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + _this.DVBOrigonPoint = null; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.DVBWidth + * @description 数据视图框宽度。 + */ + + _this.DVBWidth = null; + /** + * @readonly + * @member {number} FeatureThemeGraph.prototype.DVBHeight + * @description 数据视图框高度。 + */ + + _this.DVBHeight = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.origonPointOffset + * @description 数据视图框原点相对于图表框的原点偏移量,长度为 2 的一维数组,第一个元素表示 x 偏移量,第二个元素表示 y 偏移量。 + */ + + _this.origonPointOffset = null; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.fields + * @description 数据{FeatureVector}属性字段。 + */ + + _this.fields = fields || []; + /** + * @readonly + * @member {Array.} FeatureThemeGraph.prototype.dataValues + * @description 图表展示的数据值,通过 fields 从数据 feature 属性中获得。 + */ + + _this.dataValues = null; // 图表位置 + + if (lonlat) { + _this.lonlat = lonlat; + } else { + // 默认使用 bounds 中心 + _this.lonlat = _this.data.geometry.getBounds().getCenterLonLat(); + } // 配置项检测与赋值 + + + if (setting && setting.width && setting.height && setting.codomain) { + _this.setting = setting; + } + + _this.CLASS_NAME = "SuperMap.Feature.Theme.Graph"; + return _this; + } + /** + * @function FeatureThemeGraph.prototype.destroy + * @description 销毁专题要素。 + */ + + + Graph_createClass(Graph, [{ + key: "destroy", + value: function destroy() { + this.shapeFactory = null; + this.shapeParameters = null; + this.width = null; + this.height = null; + this.origonPoint = null; + this.chartBox = null; + this.dataViewBox = null; + this.chartBounds = null; + this.DVBParameter = null; + this.DVBOrigonPoint = null; + this.DVBCenterPoint = null; + this.DVBWidth = null; + this.DVBHeight = null; + this.DVBCodomain = null; + this.DVBUnitValue = null; + this.origonPointOffset = null; + this.XOffset = null; + this.YOffset = null; + this.fields = null; + this.dataValues = null; + this.setting = null; + + Graph_get(Graph_getPrototypeOf(Graph.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeGraph.prototype.initBaseParameter + * @description 初始化专题要素(图表)基础参数。在调用此方法前,此类的图表模型相关属性都是不可用的 ,此方法在 assembleShapes 函数中调用。 + * 调用此函数关系到 setting 对象的以下属性。 + * @param {number} width - 专题要素(图表)宽度。 + * @param {number} height - 专题要素(图表)高度。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox。 + * (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @returns {boolean} 初始化参数是否成功。 + */ + + }, { + key: "initBaseParameter", + value: function initBaseParameter() { + // 参数初始化是否成功 + var isSuccess = true; // setting 属性是否已成功赋值 + + if (!this.setting) { + return false; + } + + var sets = this.setting; // 检测 setting 的必设参数 + + if (!(sets.width && sets.height && sets.codomain)) { + return false; + } // 数据 + + + var decimalNumber = typeof sets.decimalNumber !== "undefined" && !isNaN(sets.decimalNumber) ? sets.decimalNumber : -1; + var dataEffective = Theme_Theme.getDataValues(this.data, this.fields, decimalNumber); + this.dataValues = dataEffective ? dataEffective : []; // 基础参数 width, height, codomain + + this.width = parseFloat(sets.width); + this.height = parseFloat(sets.height); + this.DVBCodomain = sets.codomain; // 图表偏移 + // if(sets.XOffset) {this.XOffset = sets.XOffset}; + // if(sets.YOffset) {this.YOffset = sets.YOffset}; + + this.XOffset = sets.XOffset ? sets.XOffset : 0; + this.YOffset = sets.YOffset ? sets.YOffset : 0; // 其他默认值 + + this.origonPoint = []; + this.chartBox = []; + this.dataViewBox = []; + this.DVBParameter = sets.dataViewBoxParameter ? sets.dataViewBoxParameter : [0, 0, 0, 0]; + this.DVBOrigonPoint = []; + this.DVBCenterPoint = []; + this.origonPointOffset = []; // 图表位置 + + this.resetLocation(); // 专题要素宽度 w + + var w = this.width; // 专题要素高度 h + + var h = this.height; // 专题要素像素位置 loc + + var loc = this.location; // 专题要素像素位置 loc + + this.origonPoint = [loc[0] - w / 2, loc[1] - h / 2]; // 专题要素原点(左上角) + + var op = this.origonPoint; // 图表框([left, bottom, right, top]) + + this.chartBox = [op[0], op[1] + h, op[0] + w, op[1]]; // 图表框 + + var cb = this.chartBox; // 数据视图框参数,它是图表框各方向对应的内偏距 + + var dbbP = this.DVBParameter; // 数据视图框 ([left, bottom, right, top]) + + this.dataViewBox = [cb[0] + dbbP[0], cb[1] - dbbP[1], cb[2] - dbbP[2], cb[3] + dbbP[3]]; // 数据视图框 + + var dvb = this.dataViewBox; //检查数据视图框是否合法 + + if (dvb[0] >= dvb[2] || dvb[1] <= dvb[3]) { + return false; + } // 数据视图框原点 + + + this.DVBOrigonPoint = [dvb[0], dvb[3]]; // 数据视图框宽度 + + this.DVBWidth = Math.abs(dvb[2] - dvb[0]); // 数据视图框高度 + + this.DVBHeight = Math.abs(dvb[1] - dvb[3]); // 数据视图框中心点 + + this.DVBCenterPoint = [this.DVBOrigonPoint[0] + this.DVBWidth / 2, this.DVBOrigonPoint[1] + this.DVBHeight / 2]; // 数据视图框原点与图表框的原点偏移量 + + this.origonPointOffset = [this.DVBOrigonPoint[0] - op[0], this.DVBOrigonPoint[1] - op[1]]; + return isSuccess; + } + /** + * @function FeatureThemeGraph.prototype.resetLocation + * @description 根据地理位置 lonlat 重置专题要素(图表)位置。 + * @param {LonLat} lonlat - 专题要素新的像素中心位置。 + * @returns {Array.} 新专题要素像素参考位置。长度为 2 的数组,第一个元素表示 x 坐标,第二个元素表示 y 坐标。 + */ + + }, { + key: "resetLocation", + value: function resetLocation(lonlat) { + if (lonlat) { + this.lonlat = lonlat; + } // 获取地理位置对应的像素坐标 newLocalLX + + + var newLocalLX = this.getLocalXY(this.lonlat); // 处理偏移量 XOffset, YOffset + + newLocalLX[0] += this.XOffset; + newLocalLX[1] += this.YOffset; // 将图形位置赋予 location 属性(注意 location 属性表示的是专题要素中心位置) + + this.location = newLocalLX; // 更新图表像素 Bounds + + var w = this.width; + var h = this.height; + var loc = this.location; + this.chartBounds = new Bounds(loc[0] - w / 2, loc[1] + h / 2, loc[0] + w / 2, loc[1] - h / 2); //重新计算当前渐变色 + + this.resetLinearGradient(); + return loc; + } + /** + * @function FeatureThemeGraph.prototype.resetLinearGradient + * @description resetLocation 中调用 图表的相对坐标存在的时候,重新计算渐变的颜色(目前用于二维柱状图渐变色 所以子类实现此方法)。 + */ + + }, { + key: "resetLinearGradient", + value: function resetLinearGradient() {//子类实现此方法 + } + /** + * @function FeatureThemeGraph.prototype.shapesConvertToRelativeCoordinate + * @description 将(构成图表)图形的节点转为相对坐标表示,此函数必须且只能在 assembleShapes() 结束时调用。 + */ + + }, { + key: "shapesConvertToRelativeCoordinate", + value: function shapesConvertToRelativeCoordinate() { + var shapes = this.shapes; + var shapeROP = this.location; + + for (var i = 0, len = shapes.length; i < len; i++) { + shapes[i].refOriginalPosition = shapeROP; + var style = shapes[i].style; + + for (var sty in style) { + switch (sty) { + case "pointList": + var pl = style[sty]; + + for (var j = 0, len2 = pl.length; j < len2; j++) { + pl[j][0] -= shapeROP[0]; + pl[j][1] -= shapeROP[1]; + } + + break; + + case "x": + style[sty] -= shapeROP[0]; + break; + + case "y": + style[sty] -= shapeROP[1]; + break; + + default: + break; + } + } + } + + this.RelativeCoordinate = true; + } + /** + * @function FeatureThemeGraph.prototype.assembleShapes + * @description 图形装配函数。抽象方法,可视化子类必须实现此方法。
+ * 重写此方法的步骤:
+ * 1. 图表的某些特殊配置项(setting)处理,例如多数图表模型需要重新指定 dataViewBoxParameter 的默认值。
+ * 2. 调用 initBaseParameter() 方法初始化模型属性值,此步骤必须执行,只有当 initBaseParameter 返回 true 时才可以允许进行后续步骤。
+ * 3. 计算图形参数,制作图形,图形组合。在组装图表过程中,应该特别注意数据视图框单位值的定义、数据值溢出值域范围的处理和图形大小自适应。
+ * 4. 调用 shapesConvertToRelativeCoordinate() 方法,将图形的坐标值转为相对坐标,此步骤必须执行。 + * @example + * //子类实现 assembleShapes() 接口的步骤示例: + * assembleShapes: function(){ + * // 第一步:图表的某些特殊配置项(setting)处理,例如多数图表模型需要重新指定 dataViewBoxParameter 的默认值。此步骤是非必须过程。 + * + * // 图表配置对象 + * var sets = this.setting; + * // 默认数据视图框,这里展示在使用坐标轴和不使用坐标轴情况下对数据视图框参数赋予不同的默认值 + * if(!sets.dataViewBoxParameter){ + * if(typeof(sets.useAxis) === "undefined" || sets.useAxis){ + * sets.dataViewBoxParameter = [45, 15, 15, 15]; + * } + * else{ + * sets.dataViewBoxParameter = [5, 5, 5, 5]; + * } + * } + * + * // 第二步:初始化图表模型基本参数,只有在图表模型基本参数初始化成功时才可模型相关属性,如 this.dataViewBox、 this.DVBCodomain等。此步骤是必须过程。 + * if(!this.initBaseParameter()) return; + * + * // 第三步:用图形组装图表,在组装图表过程中,应该特别注意数据视图框单位值的定义、数据值溢出值域范围的处理和图形大小自适应。 + * // 定义图表数据视图框中单位值的含义,下面行代码表示将数据视图框单位值定义为数据视图框高度上每像素代表的数据值 + * this.DVBUnitValue = (this.codomain[1] - this.codomain[0])/this.DVBHeight; + * var uv = this.DVBUnitValue; + * + * // 图形参数计算代码...... + * + * // 关于图形装配,实际上就是利用图形工程对象 this.shapeFactory 的 createShape() 方法通过图形参数对象创建可视化的图形对象,并把这些图形对象按序添加到模型的图形库(his.shapes)中。下面的代码演示创建一个面图形参数对象,并允许通过图形配置对象设置图形的 style 和 highlightStyle, + * var barParams = new ShapeParametersPolygon(poiLists); + * barParams.style = sets.barStyle? sets.barStyle:{fillColor: "lightblue"}; + * barParams.highlightStyle = sets.barHoverStyle? sets.barHoverStyle:{fillColor: "blue"}; + * // 图形携带数据ID信息 + * barParams.refDataID = this.data.id; + * // 创建图形并添加到图表图形数组中 + * this.shapes.push(this.shapeFactory.createShape(barParams)); + * + * // 第四步:调用 shapesConvertToRelativeCoordinate() 方法,将图形库(his.shapes)中的图形转为由相对坐标表示的图形,客户端统计专题图模块从结构上要求可视化图形使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数。此步骤是必须过程。 + * this.shapesConvertToRelativeCoordinate(); + * }, + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() {//子类必须实现此方法 + } + /** + * @function FeatureThemeGraph.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {LonLat} lonlat - 带转换的地理坐标。 + * @returns 屏幕像素坐标。 + */ + + }, { + key: "getLocalXY", + value: function getLocalXY(lonlat) { + return this.layer.getLocalXY(lonlat); + } + }]); + + return Graph; +}(Theme_Theme); +/** + * @function FeatureTheme.getDataValues + * @description 根据字段名数组获取指定数据(feature)的属性值数组。属性值类型必须为 Number。 + * @param {FeatureVector} data - 数据。 + * @param {Array.} [fields] - 字段名数组。 + * @param {number} [decimalNumber] - 小数位处理参数,对获取到的属性数据值进行小数位处理。 + * @returns {Array.} 字段名数组对应的属性数据值数组。 + */ + +Theme_Theme.getDataValues = function (data, fields, decimalNumber) { + if (!data.attributes) { + return false; + } + + var fieldsValue = []; + var attrs = data.attributes; + + for (var i = 0; i < fields.length; i++) { + for (var field in attrs) { + if (field !== fields[i]) { + continue; + } // 数字转换判断 + + + try { + if (!isNaN(decimalNumber) && decimalNumber >= 0) { + fieldsValue.push(parseFloat(attrs[field].toString()).toFixed(decimalNumber)); + } else { + fieldsValue.push(parseFloat(attrs[field].toString())); + } + } catch (e) { + throw new Error("not a number"); + } + } + } + + if (fieldsValue.length === fields.length) { + return fieldsValue; + } else { + return false; + } +}; +;// CONCATENATED MODULE: ./src/common/overlay/Bar.js +function Bar_typeof(obj) { "@babel/helpers - typeof"; return Bar_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Bar_typeof(obj); } + +function Bar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Bar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Bar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bar_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Bar_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Bar_get = Reflect.get; } else { Bar_get = function _get(target, property, receiver) { var base = Bar_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Bar_get.apply(this, arguments); } + +function Bar_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Bar_getPrototypeOf(object); if (object === null) break; } return object; } + +function Bar_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Bar_setPrototypeOf(subClass, superClass); } + +function Bar_setPrototypeOf(o, p) { Bar_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Bar_setPrototypeOf(o, p); } + +function Bar_createSuper(Derived) { var hasNativeReflectConstruct = Bar_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Bar_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Bar_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Bar_possibleConstructorReturn(this, result); }; } + +function Bar_possibleConstructorReturn(self, call) { if (call && (Bar_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Bar_assertThisInitialized(self); } + +function Bar_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Bar_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Bar_getPrototypeOf(o) { Bar_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Bar_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class FeatureThemeBar + * @aliasclass Feature.Theme.Bar + * @deprecatedclass SuperMap.Feature.Theme.Bar + * @classdesc 柱状图 。 + * @category Visualization Theme + * @example + * // barStyleByCodomain参数用法如下: + * // barStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 属性中的参与此图表生成的属性字段名称。 + * @param {FeatureThemeBar.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ + +var Bar = /*#__PURE__*/function (_Graph) { + Bar_inherits(Bar, _Graph); + + var _super = Bar_createSuper(Bar); + + function Bar(data, layer, fields, setting, lonlat) { + var _this; + + Bar_classCallCheck(this, Bar); + + _this = _super.call(this, data, layer, fields, setting, lonlat); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Bar"; + return _this; + } + /** + * @function FeatureThemeBar.prototype.destroy + * @override + */ + + + Bar_createClass(Bar, [{ + key: "destroy", + value: function destroy() { + Bar_get(Bar_getPrototypeOf(Bar.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeBar.prototype.assembleShapes + * @description 图表图形装配函数。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + //默认渐变颜色数组 + var deafaultColors = [["#00FF00", "#00CD00"], ["#00CCFF", "#5E87A2"], ["#00FF66", "#669985"], ["#CCFF00", "#94A25E"], ["#FF9900", "#A2945E"]]; //默认阴影 + + var deafaultShawdow = { + showShadow: true, + shadowBlur: 8, + shadowColor: "rgba(100,100,100,0.8)", + shadowOffsetX: 2, + shadowOffsetY: 2 + }; // 图表配置对象 + + var sets = this.setting; + + if (!sets.barLinearGradient) { + sets.barLinearGradient = deafaultColors; + } // 默认数据视图框 + + + if (!sets.dataViewBoxParameter) { + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } // 重要步骤:初始化参数 + + + if (!this.initBaseParameter()) { + return; + } // 值域 + + + var codomain = this.DVBCodomain; // 重要步骤:定义图表 BaFeatureThemeBarr 数据视图框中单位值的含义 + + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; // 数据视图域 + + var dvb = this.dataViewBox; // 用户数据值 + + var fv = this.dataValues; + + if (fv.length < 1) { + return; + } // 没有数据 + // 数据溢出值域范围处理 + + + for (var _i = 0, fvLen = fv.length; _i < fvLen; _i++) { + if (fv[_i] < codomain[0] || fv[_i] > codomain[1]) { + return; + } + } // 获取 x 轴上的图形信息 + + + var xShapeInfo = this.calculateXShapeInfo(); + + if (!xShapeInfo) { + return; + } // 每个柱条 x 位置 + + + var xsLoc = xShapeInfo.xPositions; // 柱条宽度 + + var xsWdith = xShapeInfo.width; // 背景框,默认启用 + + if (typeof sets.useBackground === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 坐标轴, 默认启用 + + + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + // 添加坐标轴图形数组 + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + } + + for (var i = 0; i < fv.length; i++) { + // 计算柱条 top 边的 y 轴坐标值 + var yPx = dvb[1] - (fv[i] - codomain[0]) / this.DVBUnitValue; // 柱条节点数组 + + var poiLists = [[xsLoc[i] - xsWdith / 2, dvb[1] - 1], [xsLoc[i] + xsWdith / 2, dvb[1] - 1], [xsLoc[i] + xsWdith / 2, yPx], [xsLoc[i] - xsWdith / 2, yPx]]; // 柱条参数对象(一个面参数对象) + + var barParams = new Polygon_Polygon(poiLists); // 柱条 阴影 style + + if (typeof sets.showShadow === "undefined" || sets.showShadow) { + if (sets.barShadowStyle) { + var sss = sets.barShadowStyle; + + if (sss.shadowBlur) { + deafaultShawdow.shadowBlur = sss.shadowBlur; + } + + if (sss.shadowColor) { + deafaultShawdow.shadowColor = sss.shadowColor; + } + + if (sss.shadowOffsetX) { + deafaultShawdow.shadowOffsetX = sss.shadowOffsetX; + } + + if (sss.shadowOffsetY) { + deafaultShawdow.shadowOffsetY = sss.shadowOffsetY; + } + } + + barParams.style = {}; + Util.copyAttributesWithClip(barParams.style, deafaultShawdow); + } // 图形携带的数据信息 + + + barParams.refDataID = this.data.id; + barParams.dataInfo = { + field: this.fields[i], + value: fv[i] + }; // 柱条 hover click + + if (typeof sets.barHoverAble !== "undefined") { + barParams.hoverable = sets.barHoverAble; + } + + if (typeof sets.barClickAble !== "undefined") { + barParams.clickable = sets.barClickAble; + } // 创建柱条并添加到图表图形数组中 + + + this.shapes.push(this.shapeFactory.createShape(barParams)); + } // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + + this.shapesConvertToRelativeCoordinate(); + } + /** + * @function FeatureThemeBar.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性: + * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距, + * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性: + * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * + */ + + }, { + key: "calculateXShapeInfo", + value: function calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + + var sets = this.setting; // 图表配置对象 + + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + + var xShapePositions = []; // x 轴上图形的位置 + + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + // x 轴空白间隔参数处理 + + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 3) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[2] + (fvc - 1) * xBlank[1]); + + if (xsLen <= fvc) { + return null; + } + + xShapeWidth = xsLen / fvc; + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + xShapeWidth = dvbWidth / (2 * fvc + 1); + xBlank = [xShapeWidth, xShapeWidth, xShapeWidth]; + } // 图形 x 轴上的位置计算 + + + var xOffset = 0; + + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0] + xShapeWidth / 2; + } else { + xOffset += xShapeWidth + xBlank[1]; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + /** + * @function FeatureThemeBar.prototype.resetLinearGradient + * @description 图表的相对坐标存在的时候,重新计算渐变的颜色(目前用于二维柱状图 所以子类实现此方法)。 + */ + + }, { + key: "resetLinearGradient", + value: function resetLinearGradient() { + if (this.RelativeCoordinate) { + var shpelength = this.shapes.length; + var barLinearGradient = this.setting.barLinearGradient; + var index = -1; + + for (var i = 0; i < shpelength; i++) { + var shape = this.shapes[i]; + + if (shape.CLASS_NAME === "SuperMap.LevelRenderer.Shape.SmicPolygon") { + var style = shape.style; //计算出当前的绝对 x y + + var x1 = this.location[0] + style.pointList[0][0]; + var x2 = this.location[0] + style.pointList[1][0]; //渐变颜色 + + index++; //以防定义的颜色数组不够用 + + if (index >= barLinearGradient.length) { + index = index % barLinearGradient.length; + } + + var color1 = barLinearGradient[index][0]; + var color2 = barLinearGradient[index][1]; //颜色 + + var zcolor = new Color(); + var linearGradient = zcolor.getLinearGradient(x1, 0, x2, 0, [[0, color1], [1, color2]]); //赋值 + + shape.style.color = linearGradient; + } + } + } + } + }]); + + return Bar; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/Bar3D.js +function Bar3D_typeof(obj) { "@babel/helpers - typeof"; return Bar3D_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Bar3D_typeof(obj); } + +function Bar3D_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Bar3D_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Bar3D_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bar3D_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bar3D_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Bar3D_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Bar3D_get = Reflect.get; } else { Bar3D_get = function _get(target, property, receiver) { var base = Bar3D_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Bar3D_get.apply(this, arguments); } + +function Bar3D_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Bar3D_getPrototypeOf(object); if (object === null) break; } return object; } + +function Bar3D_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Bar3D_setPrototypeOf(subClass, superClass); } + +function Bar3D_setPrototypeOf(o, p) { Bar3D_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Bar3D_setPrototypeOf(o, p); } + +function Bar3D_createSuper(Derived) { var hasNativeReflectConstruct = Bar3D_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Bar3D_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Bar3D_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Bar3D_possibleConstructorReturn(this, result); }; } + +function Bar3D_possibleConstructorReturn(self, call) { if (call && (Bar3D_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Bar3D_assertThisInitialized(self); } + +function Bar3D_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Bar3D_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Bar3D_getPrototypeOf(o) { Bar3D_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Bar3D_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemeBar3D + * @aliasclass Feature.Theme.Bar3D + * @deprecatedclass SuperMap.Feature.Theme.Bar3D + * @classdesc 三维柱状图 。 + * @category Visualization Theme + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeBar3D.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置,默认为 data 指代的地理要素 Bounds 中心。 + * + + * + * @example + * // barFaceStyleByCodomain 用法示例如下: + * // barFaceStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barFaceStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @example + * // barSideStyleByCodomain 用法示例如下: + * // barSideStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barSideStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @example + * // barTopStyleByCodomain 用法示例如下: + * // barTopStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // barTopStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @usage + * @private + */ + +var Bar3D = /*#__PURE__*/function (_Graph) { + Bar3D_inherits(Bar3D, _Graph); + + var _super = Bar3D_createSuper(Bar3D); + + function Bar3D(data, layer, fields, setting, lonlat) { + var _this; + + Bar3D_classCallCheck(this, Bar3D); + + _this = _super.call(this, data, layer, fields, setting, lonlat); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Bar3D"; + return _this; + } + /** + * @function FeatureThemeBar3D.prototype.destroy + * @override + */ + + + Bar3D_createClass(Bar3D, [{ + key: "destroy", + value: function destroy() { + Bar3D_get(Bar3D_getPrototypeOf(Bar3D.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeBar3D.prototype.assembleShapes + * @description 图形装配实现(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + // 图表配置对象 + var sets = this.setting; // 默认数据视图框 + + if (!sets.dataViewBoxParameter) { + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 25, 20, 20]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } // 3d 柱图的坐标轴默认使用坐标轴箭头 + + + sets.axisUseArrow = typeof sets.axisUseArrow !== "undefined" ? sets.axisUseArrow : true; + sets.axisXLabelsOffset = typeof sets.axisXLabelsOffset !== "undefined" ? sets.axisXLabelsOffset : [-10, 10]; // 重要步骤:初始化参数 + + if (!this.initBaseParameter()) { + return; + } // 值域 + + + var codomain = this.DVBCodomain; // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; // 数据视图域 + + var dvb = this.dataViewBox; // 用户数据值 + + var fv = this.dataValues; + + if (fv.length < 1) { + return; + } // 没有数据 + // 数据溢出值域范围处理 + + + for (var i = 0, fvLen = fv.length; i < fvLen; i++) { + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + return; + } + } // 获取 x 轴上的图形信息 + + + var xShapeInfo = this.calculateXShapeInfo(); + + if (!xShapeInfo) { + return; + } // 每个柱条 x 位置 + + + var xsLoc = xShapeInfo.xPositions; // 柱条宽度 + + var xsWdith = xShapeInfo.width; // 坐标轴, 默认启用 + + if (typeof sets.useBackground === "undefined" || sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 坐标轴 + + + if (!sets.axis3DParameter || isNaN(sets.axis3DParameter) || sets.axis3DParameter < 15) { + sets.axis3DParameter = 20; + } + + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + } // 3d 偏移量, 默认值 10; + + + var offset3d = sets.bar3DParameter && !isNaN(sets.bar3DParameter) ? sets.bar3DParameter : 10; + + for (var _i = 0; _i < fv.length; _i++) { + // 无 3d 偏移量时的柱面顶部 y 坐标 + var yPx = dvb[1] - (fv[_i] - codomain[0]) / this.DVBUnitValue; // 无 3d 偏移量时的柱面的左、右端 x 坐标 + + var iPoiL = xsLoc[_i] - xsWdith / 2; + var iPoiR = xsLoc[_i] + xsWdith / 2; // 3d 柱顶面节点 + + var bar3DTopPois = [[iPoiL, yPx], [iPoiR, yPx], [iPoiR - offset3d, yPx + offset3d], [iPoiL - offset3d, yPx + offset3d]]; // 3d 柱侧面节点 + + var bar3DSidePois = [[iPoiR, yPx], [iPoiR - offset3d, yPx + offset3d], [iPoiR - offset3d, dvb[1] + offset3d], [iPoiR, dvb[1]]]; // 3d 柱正面节点 + + var bar3DFacePois = [[iPoiL - offset3d, dvb[1] + offset3d], [iPoiR - offset3d, dvb[1] + offset3d], [iPoiR - offset3d, yPx + offset3d], [iPoiL - offset3d, yPx + offset3d]]; + + if (offset3d <= 0) { + // offset3d <= 0 时正面不偏移 + bar3DFacePois = [[iPoiL, dvb[1]], [iPoiR, dvb[1]], [iPoiR, yPx], [iPoiL, yPx]]; + } // 新建 3d 柱面顶面、侧面、正面图形参数对象 + + + var polyTopSP = new Polygon_Polygon(bar3DTopPois); + var polySideSP = new Polygon_Polygon(bar3DSidePois); + var polyFaceSP = new Polygon_Polygon(bar3DFacePois); // 侧面、正面图形 style 默认值 + + sets.barSideStyle = sets.barSideStyle ? sets.barSideStyle : sets.barFaceStyle; + sets.barSideStyleByFields = sets.barSideStyleByFields ? sets.barSideStyleByFields : sets.barFaceStyleByFields; + sets.barSideStyleByCodomain = sets.barSideStyleByCodomain ? sets.barSideStyleByCodomain : sets.barFaceStyleByCodomain; + sets.barTopStyle = sets.barTopStyle ? sets.barTopStyle : sets.barFaceStyle; + sets.barTopStyleByFields = sets.barTopStyleByFields ? sets.barTopStyleByFields : sets.barFaceStyleByFields; + sets.barTopStyleByCodomain = sets.barTopStyleByCodomain ? sets.barTopStyleByCodomain : sets.barFaceStyleByCodomain; // 顶面、侧面、正面图形 style + + polyFaceSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, sets.barFaceStyle, sets.barFaceStyleByFields, sets.barFaceStyleByCodomain, _i, fv[_i]); + polySideSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, sets.barSideStyle, sets.barSideStyleByFields, sets.barSideStyleByCodomain, _i, fv[_i]); + polyTopSP.style = ShapeFactory.ShapeStyleTool({ + stroke: true, + strokeColor: "#ffffff", + fillColor: "#ee9900" + }, sets.barTopStyle, sets.barTopStyleByFields, sets.barTopStyleByCodomain, _i, fv[_i]); // 3d 柱条高亮样式 + + sets.barSideHoverStyle = sets.barSideHoverStyle ? sets.barSideHoverStyle : sets.barFaceHoverStyle; + sets.barTopHoverStyle = sets.barTopHoverStyle ? sets.barTopHoverStyle : sets.barFaceHoverStyle; + polyFaceSP.highlightStyle = ShapeFactory.ShapeStyleTool({ + stroke: true + }, sets.barFaceHoverStyle); + polySideSP.highlightStyle = ShapeFactory.ShapeStyleTool({ + stroke: true + }, sets.barSideHoverStyle); + polyTopSP.highlightStyle = ShapeFactory.ShapeStyleTool({ + stroke: true + }, sets.barTopHoverStyle); // 图形携带的数据 id 信息 & 高亮模式 + + polyTopSP.refDataID = polySideSP.refDataID = polyFaceSP.refDataID = this.data.id; // hover 模式(组合) + + polyTopSP.isHoverByRefDataID = polySideSP.isHoverByRefDataID = polyFaceSP.isHoverByRefDataID = true; // 高亮组(当鼠标 hover 到组内任何一个图形,整个组的图形都会高亮。refDataHoverGroup 在 isHoverByRefDataID 为 true 时有效) + + polyTopSP.refDataHoverGroup = polySideSP.refDataHoverGroup = polyFaceSP.refDataHoverGroup = Util.createUniqueID("lr_shg"); // 图形携带的数据信息 + + polyTopSP.dataInfo = polySideSP.dataInfo = polyFaceSP.dataInfo = { + field: this.fields[_i], + value: fv[_i] + }; // 3d 柱条顶面、侧面、正面图形 hover click 设置 + + if (typeof sets.barHoverAble !== "undefined") { + polyTopSP.hoverable = polySideSP.hoverable = polyFaceSP.hoverable = sets.barHoverAble; + } + + if (typeof sets.barClickAble !== "undefined") { + polyTopSP.clickable = polySideSP.clickable = polyFaceSP.clickable = sets.barClickAble; + } // 创建3d 柱条的顶面、侧面、正面图形并添加到图表的图形列表数组 + + + this.shapes.push(this.shapeFactory.createShape(polySideSP)); + this.shapes.push(this.shapeFactory.createShape(polyTopSP)); + this.shapes.push(this.shapeFactory.createShape(polyFaceSP)); + } // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + + this.shapesConvertToRelativeCoordinate(); + } + /** + * @function FeatureThemeBar3D.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性: + * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距, + * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性: + * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + + }, { + key: "calculateXShapeInfo", + value: function calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + + var sets = this.setting; // 图表配置对象 + + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + + var xShapePositions = []; // x 轴上图形的位置 + + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + // x 轴空白间隔参数处理 + + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 3) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[2] + (fvc - 1) * xBlank[1]); + + if (xsLen <= fvc) { + return null; + } + + xShapeWidth = xsLen / fvc; + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + xShapeWidth = dvbWidth / (2 * fvc + 1); + xBlank = [xShapeWidth, xShapeWidth, xShapeWidth]; + } // 图形 x 轴上的位置计算 + + + var xOffset = 0; + + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0] + xShapeWidth / 2; + } else { + xOffset += xShapeWidth + xBlank[1]; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + }]); + + return Bar3D; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/RankSymbol.js +function RankSymbol_typeof(obj) { "@babel/helpers - typeof"; return RankSymbol_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, RankSymbol_typeof(obj); } + +function RankSymbol_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function RankSymbol_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function RankSymbol_createClass(Constructor, protoProps, staticProps) { if (protoProps) RankSymbol_defineProperties(Constructor.prototype, protoProps); if (staticProps) RankSymbol_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function RankSymbol_get() { if (typeof Reflect !== "undefined" && Reflect.get) { RankSymbol_get = Reflect.get; } else { RankSymbol_get = function _get(target, property, receiver) { var base = RankSymbol_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return RankSymbol_get.apply(this, arguments); } + +function RankSymbol_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = RankSymbol_getPrototypeOf(object); if (object === null) break; } return object; } + +function RankSymbol_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) RankSymbol_setPrototypeOf(subClass, superClass); } + +function RankSymbol_setPrototypeOf(o, p) { RankSymbol_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return RankSymbol_setPrototypeOf(o, p); } + +function RankSymbol_createSuper(Derived) { var hasNativeReflectConstruct = RankSymbol_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = RankSymbol_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = RankSymbol_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return RankSymbol_possibleConstructorReturn(this, result); }; } + +function RankSymbol_possibleConstructorReturn(self, call) { if (call && (RankSymbol_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return RankSymbol_assertThisInitialized(self); } + +function RankSymbol_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function RankSymbol_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function RankSymbol_getPrototypeOf(o) { RankSymbol_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return RankSymbol_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FeatureThemeRankSymbol + * @aliasclass Feature.Theme.RankSymbol + * @deprecatedclass SuperMap.Feature.Theme.RankSymbol + * @category Visualization Theme + * @classdesc 符号专题要素基类。此类定义了符号专题要素基础模型,具体的图表模型通过继承此类,在子类中实现 assembleShapes 方法。 + * 符号专题要素模型采用了可视化图形大小自适应策略,用较少的参数控制着图表诸多图形,图表配置对象 的基础属性只有 5 个, + * 它们控制着图表结构、值域范围、数据小数位等基础图表形态。构成图表的图形必须在图表结构里自适应大小。 + * 此类不可实例化,此类的可实例化子类必须实现 assembleShapes() 方法。 + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.RankSymbol} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @param {Object} setting - 图表配置对象。除了以下 5 个基础属性,此对象的可设属性在不同子类中有较大差异,不同子类中对同一属性的解释也可能不同,请在此类的子类中查看 setting 对象的可设属性和属性含义。 + * @param {Array.} setting.codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [setting.XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位像素。 + * @param {number} [setting.YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [setting.dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [setting.decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @extends FeatureThemeGraph + * @usage + */ + +var RankSymbol = /*#__PURE__*/function (_Graph) { + RankSymbol_inherits(RankSymbol, _Graph); + + var _super = RankSymbol_createSuper(RankSymbol); + + function RankSymbol(data, layer, fields, setting, lonlat, options) { + var _this; + + RankSymbol_classCallCheck(this, RankSymbol); + + _this = _super.call(this, data, layer, fields, setting, lonlat, options); + /** + * @member {Object} FeatureThemeRankSymbol.prototype.setting + * @description 符号配置对象,该对象控制着图表的可视化显示。 + */ + + _this.setting = null; // 配置项检测与赋值 + + if (setting && setting.codomain) { + _this.setting = setting; + _this.DVBCodomain = _this.setting.codomain; + } + + _this.CLASS_NAME = "SuperMap.Feature.Theme.RankSymbol"; + return _this; + } + /** + * @function FeatureThemeRankSymbol.prototype.destroy + * @description 销毁专题要素。 + */ + + + RankSymbol_createClass(RankSymbol, [{ + key: "destroy", + value: function destroy() { + this.setting = null; + + RankSymbol_get(RankSymbol_getPrototypeOf(RankSymbol.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeRankSymbol.prototype.initBaseParameter + * @description 初始化专题要素(图形)基础参数。 + * 在调用此方法前,此类的图表模型相关属性都是不可用的 ,此方法在 assembleShapes 函数中调用。 + * 调用此函数关系到 setting 对象的以下属性。 + * @param {Array.} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [XOffset] - 专题要素(图形)在 X 方向上的偏移值,单位像素。 + * @param {number} [YOffset] - 专题要素(图形)在 Y 方向上的偏移值,单位像素。 + * @param {Array.} [dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图形框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。 + * @param {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @returns {boolean} 初始化参数是否成功。 + */ + + }, { + key: "initBaseParameter", + value: function initBaseParameter() { + // 参数初始化是否成功 + var isSuccess = true; // setting 属性是否已成功赋值 + + if (!this.setting) { + return false; + } + + var sets = this.setting; // 图表偏移 + + if (sets.XOffset) { + this.XOffset = sets.XOffset; + } + + if (sets.YOffset) { + this.YOffset = sets.YOffset; + } + + this.XOffset = sets.XOffset ? sets.XOffset : 0; + this.YOffset = sets.YOffset ? sets.YOffset : 0; // 其他默认值 + + this.origonPoint = []; + this.chartBox = []; + this.dataViewBox = []; + this.DVBParameter = sets.dataViewBoxParameter ? sets.dataViewBoxParameter : [0, 0, 0, 0]; + this.DVBOrigonPoint = []; + this.DVBCenterPoint = []; + this.origonPointOffset = []; // 图表位置 + + this.resetLocation(); // 专题要素宽度 w + + var w = this.width; // 专题要素高度 h + + var h = this.height; // 专题要素像素位置 loc + + var loc = this.location; // 专题要素像素位置 loc + + this.origonPoint = [loc[0] - w / 2, loc[1] - h / 2]; // 专题要素原点(左上角) + + var op = this.origonPoint; // 图表框([left, bottom, right, top]) + + this.chartBox = [op[0], op[1] + h, op[0] + w, op[1]]; // 图表框 + + var cb = this.chartBox; // 数据视图框参数,它是图表框各方向对应的内偏距 + + var dbbP = this.DVBParameter; // 数据视图框 ([left, bottom, right, top]) + + this.dataViewBox = [cb[0] + dbbP[0], cb[1] - dbbP[1], cb[2] - dbbP[2], cb[3] + dbbP[3]]; // 数据视图框 + + var dvb = this.dataViewBox; //检查数据视图框是否合法 + + if (dvb[0] >= dvb[2] || dvb[1] <= dvb[3]) { + return false; + } // 数据视图框原点 + + + this.DVBOrigonPoint = [dvb[0], dvb[3]]; // 数据视图框宽度 + + this.DVBWidth = Math.abs(dvb[2] - dvb[0]); // 数据视图框高度 + + this.DVBHeight = Math.abs(dvb[1] - dvb[3]); // 数据视图框中心点 + + this.DVBCenterPoint = [this.DVBOrigonPoint[0] + this.DVBWidth / 2, this.DVBOrigonPoint[1] + this.DVBHeight / 2]; // 数据视图框原点与图表框的原点偏移量 + + this.origonPointOffset = [this.DVBOrigonPoint[0] - op[0], this.DVBOrigonPoint[1] - op[1]]; + return isSuccess; + } + }]); + + return RankSymbol; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/Circle.js +function overlay_Circle_typeof(obj) { "@babel/helpers - typeof"; return overlay_Circle_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, overlay_Circle_typeof(obj); } + +function overlay_Circle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function overlay_Circle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function overlay_Circle_createClass(Constructor, protoProps, staticProps) { if (protoProps) overlay_Circle_defineProperties(Constructor.prototype, protoProps); if (staticProps) overlay_Circle_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function overlay_Circle_get() { if (typeof Reflect !== "undefined" && Reflect.get) { overlay_Circle_get = Reflect.get; } else { overlay_Circle_get = function _get(target, property, receiver) { var base = overlay_Circle_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return overlay_Circle_get.apply(this, arguments); } + +function overlay_Circle_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = overlay_Circle_getPrototypeOf(object); if (object === null) break; } return object; } + +function overlay_Circle_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) overlay_Circle_setPrototypeOf(subClass, superClass); } + +function overlay_Circle_setPrototypeOf(o, p) { overlay_Circle_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return overlay_Circle_setPrototypeOf(o, p); } + +function overlay_Circle_createSuper(Derived) { var hasNativeReflectConstruct = overlay_Circle_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = overlay_Circle_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = overlay_Circle_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return overlay_Circle_possibleConstructorReturn(this, result); }; } + +function overlay_Circle_possibleConstructorReturn(self, call) { if (call && (overlay_Circle_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return overlay_Circle_assertThisInitialized(self); } + +function overlay_Circle_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function overlay_Circle_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function overlay_Circle_getPrototypeOf(o) { overlay_Circle_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return overlay_Circle_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemeCircle + * @aliasclass Feature.Theme.Circle + * @deprecatedclass SuperMap.Feature.Theme.Circle + * @classdesc 圆类。 + * @category Visualization Theme + * @extends FeatureThemeRankSymbol + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.RankSymbol} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeCircle.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置,默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ + +var Circle = /*#__PURE__*/function (_RankSymbol) { + overlay_Circle_inherits(Circle, _RankSymbol); + + var _super = overlay_Circle_createSuper(Circle); + + function Circle(data, layer, fields, setting, lonlat) { + var _this; + + overlay_Circle_classCallCheck(this, Circle); + + _this = _super.call(this, data, layer, fields, setting, lonlat); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Circle"; + return _this; + } + /** + * @function FeatureThemeCircle.prototype.destroy + * @override + */ + + + overlay_Circle_createClass(Circle, [{ + key: "destroy", + value: function destroy() { + overlay_Circle_get(overlay_Circle_getPrototypeOf(Circle.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeCircle.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + //默认填充颜色 + var defaultFillColor = "#ff9277"; // setting 属性是否已成功赋值 + + if (!this.setting) { + return false; + } + + var sets = this.setting; // 检测 setting 的必设参数 + + if (!sets.codomain) { + return false; + } // 数据 + + + var decimalNumber = typeof sets.decimalNumber !== "undefined" && !isNaN(sets.decimalNumber) ? sets.decimalNumber : -1; + var dataEffective = Theme_Theme.getDataValues(this.data, this.fields, decimalNumber); + this.dataValues = dataEffective ? dataEffective : []; // 数据值数组 + + var fv = this.dataValues; //if(fv.length != 1) return; // 没有数据 或者数据不唯一 + //if(fv[0] < 0) return; //数据为负值 + //用户应该定义最大 最小半径 默认最大半径MaxR:100 最小半径MinR:0; + + if (!sets.maxR) { + sets.maxR = 100; + } + + if (!sets.minR) { + sets.minR = 0; + } // 值域范围 + + + var codomain = this.DVBCodomain; // 重要步骤:定义Circle数据视图框中单位值的含义,单位值:1所代表的长度 + // 用户定义了值域范围 + + if (codomain && codomain[1] - codomain[0] > 0) { + this.DVBUnitValue = sets.maxR / (codomain[1] - codomain[0]); + } else { + //this.DVBUnitValue = sets.maxR / maxValue; + this.DVBUnitValue = sets.maxR; + } + + var uv = this.DVBUnitValue; //圆半径 + + var r = fv[0] * uv + sets.minR; + this.width = 2 * r; + this.height = 2 * r; // 重要步骤:初始化参数 + + if (!this.initBaseParameter()) { + return; + } //假如用户设置了值域范围 没有在值域范围直接返回 + + + if (codomain) { + if (fv[0] < codomain[0] || fv[0] > codomain[1]) { + return; + } + } + + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为圆心 + //圆形对象参数 + + var circleSP = new Circle_Circle(dvbCenter[0], dvbCenter[1], r); //circleSP.sytle 初始化 + + circleSP.style = ShapeFactory.ShapeStyleTool(null, sets.circleStyle, null, null, 0); //图形的填充颜色 + + if (typeof sets.fillColor !== "undefined") { + //用户自定义 + circleSP.style.fillColor = sets.fillColor; + } else { + //当前默认 + circleSP.style.fillColor = defaultFillColor; + } //圆形 Hover样式 + + + circleSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.circleHoverStyle); //圆形 Hover 与 click 设置 + + if (typeof sets.circleHoverAble !== "undefined") { + circleSP.hoverable = sets.circleHoverAble; + } + + if (typeof sets.circleClickAble !== "undefined") { + circleSP.clickable = sets.circleClickAble; + } //图形携带的数据信息 + + + circleSP.refDataID = this.data.id; + circleSP.dataInfo = { + field: this.fields[0], + r: r, + value: fv[0] + }; // 创建扇形并把此扇形添加到图表图形数组 + + this.shapes.push(this.shapeFactory.createShape(circleSP)); // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + this.shapesConvertToRelativeCoordinate(); + } + }]); + + return Circle; +}(RankSymbol); +;// CONCATENATED MODULE: ./src/common/overlay/Line.js +function overlay_Line_typeof(obj) { "@babel/helpers - typeof"; return overlay_Line_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, overlay_Line_typeof(obj); } + +function overlay_Line_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function overlay_Line_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function overlay_Line_createClass(Constructor, protoProps, staticProps) { if (protoProps) overlay_Line_defineProperties(Constructor.prototype, protoProps); if (staticProps) overlay_Line_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function overlay_Line_get() { if (typeof Reflect !== "undefined" && Reflect.get) { overlay_Line_get = Reflect.get; } else { overlay_Line_get = function _get(target, property, receiver) { var base = overlay_Line_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return overlay_Line_get.apply(this, arguments); } + +function overlay_Line_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = overlay_Line_getPrototypeOf(object); if (object === null) break; } return object; } + +function overlay_Line_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) overlay_Line_setPrototypeOf(subClass, superClass); } + +function overlay_Line_setPrototypeOf(o, p) { overlay_Line_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return overlay_Line_setPrototypeOf(o, p); } + +function overlay_Line_createSuper(Derived) { var hasNativeReflectConstruct = overlay_Line_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = overlay_Line_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = overlay_Line_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return overlay_Line_possibleConstructorReturn(this, result); }; } + +function overlay_Line_possibleConstructorReturn(self, call) { if (call && (overlay_Line_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return overlay_Line_assertThisInitialized(self); } + +function overlay_Line_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function overlay_Line_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function overlay_Line_getPrototypeOf(o) { overlay_Line_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return overlay_Line_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class FeatureThemeLine + * @aliasclass Feature.Theme.Line + * @deprecatedclass SuperMap.Feature.Theme.Line + * @classdesc 折线图。 + * @category Visualization Theme + * @example + * // pointStyleByCodomain 参数用法示例 + * // pointStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // pointStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * + * @extends FeatureThemeGraph + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeLine.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @usage + * @private + */ + +var Line = /*#__PURE__*/function (_Graph) { + overlay_Line_inherits(Line, _Graph); + + var _super = overlay_Line_createSuper(Line); + + function Line(data, layer, fields, setting, lonlat, options) { + var _this; + + overlay_Line_classCallCheck(this, Line); + + _this = _super.call(this, data, layer, fields, setting, lonlat, options); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Line"; + return _this; + } + /** + * @function FeatureThemeLine.prototype.destroy + * @override + */ + + + overlay_Line_createClass(Line, [{ + key: "destroy", + value: function destroy() { + overlay_Line_get(overlay_Line_getPrototypeOf(Line.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeLine.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + // 图表配置对象 + var sets = this.setting; // 默认数据视图框 + + if (!sets.dataViewBoxParameter) { + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } // 重要步骤:初始化参数 + + + if (!this.initBaseParameter()) { + return; + } + + var dvb = this.dataViewBox; // 值域 + + var codomain = this.DVBCodomain; // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + var uv = this.DVBUnitValue; // 数据值数组 + + var fv = this.dataValues; + + if (fv.length < 1) { + return; + } // 没有数据 + // 获取 x 轴上的图形信息 + + + var xShapeInfo = this.calculateXShapeInfo(); + + if (!xShapeInfo) { + return; + } // 折线每个节点的 x 位置 + + + var xsLoc = xShapeInfo.xPositions; // 背景框,默认启用 + + if (typeof sets.useBackground === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 折线图必须使用坐标轴 + + + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); // var isDataEffective = true; + + var xPx; // 折线节点 x 坐标 + + var yPx; // 折线节点 y 坐标 + + var poiLists = []; // 折线节点数组 + + var shapePois = []; // 折线节点图形数组 + + for (var i = 0, len = fv.length; i < len; i++) { + // 数据溢出值域检查 + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + // isDataEffective = false; + return null; + } + + xPx = xsLoc[i]; + yPx = dvb[1] - (fv[i] - codomain[0]) / uv; // 折线节点参数对象 + + var poiSP = new Point_Point(xPx, yPx); // 折线节点 style + + poiSP.style = ShapeFactory.ShapeStyleTool({ + fillColor: "#ee9900" + }, sets.pointStyle, sets.pointStyleByFields, sets.pointStyleByCodomain, i, fv[i]); // 折线节点 hover 样式 + + poiSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.pointHoverStyle); // 折线节点 hover click + + if (typeof sets.pointHoverAble !== "undefined") { + poiSP.hoverable = sets.pointHoverAble; + } + + if (typeof sets.pointClickAble !== "undefined") { + poiSP.clickable = sets.pointClickAble; + } // 图形携带的数据信息 + + + poiSP.refDataID = this.data.id; + poiSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; // 创建图形并把此图形添加到折线节点图形数组 + + shapePois.push(this.shapeFactory.createShape(poiSP)); // 添加折线节点到折线节点数组 + + var poi = [xPx, yPx]; + poiLists.push(poi); + } // 折线参数对象 + + + var lineSP = new Line_Line(poiLists); + lineSP.style = ShapeFactory.ShapeStyleTool({ + strokeColor: "#ee9900" + }, sets.lineStyle); // 禁止事件响应 + + lineSP.clickable = false; + lineSP.hoverable = false; + var shapeLine = this.shapeFactory.createShape(lineSP); + this.shapes.push(shapeLine); // 添加节点到图表图形数组 + + this.shapes = this.shapes.concat(shapePois); // // 数据范围检测未通过,清空图形 + // if (isDataEffective === false) { + // this.shapes = []; + // } + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + this.shapesConvertToRelativeCoordinate(); + } + /** + * @function FeatureThemeLine.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性:
+ * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 2 的数组,第一元素表示第折线左端点与数据视图框左端的空白间距,第二个元素表示折线右端点右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性:
+ * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。
+ * width - {number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + + }, { + key: "calculateXShapeInfo", + value: function calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + + var sets = this.setting; // 图表配置对象 + + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + + var xShapePositions = []; // x 轴上图形的位置 + + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + + var unitOffset = 0; // 单位偏移量 + // x 轴空白间隔参数处理 + + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 2) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[1]); + + if (xsLen <= fvc) { + return null; + } + + unitOffset = xsLen / (fvc - 1); + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + unitOffset = dvbWidth / (fvc + 1); + xBlank = [unitOffset, unitOffset, unitOffset]; + } // 图形 x 轴上的位置计算 + + + var xOffset = 0; + + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0]; + } else { + xOffset += unitOffset; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + }]); + + return Line; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/Pie.js +function Pie_typeof(obj) { "@babel/helpers - typeof"; return Pie_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Pie_typeof(obj); } + +function Pie_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Pie_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Pie_createClass(Constructor, protoProps, staticProps) { if (protoProps) Pie_defineProperties(Constructor.prototype, protoProps); if (staticProps) Pie_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Pie_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Pie_get = Reflect.get; } else { Pie_get = function _get(target, property, receiver) { var base = Pie_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Pie_get.apply(this, arguments); } + +function Pie_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Pie_getPrototypeOf(object); if (object === null) break; } return object; } + +function Pie_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Pie_setPrototypeOf(subClass, superClass); } + +function Pie_setPrototypeOf(o, p) { Pie_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Pie_setPrototypeOf(o, p); } + +function Pie_createSuper(Derived) { var hasNativeReflectConstruct = Pie_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Pie_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Pie_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Pie_possibleConstructorReturn(this, result); }; } + +function Pie_possibleConstructorReturn(self, call) { if (call && (Pie_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Pie_assertThisInitialized(self); } + +function Pie_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Pie_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Pie_getPrototypeOf(o) { Pie_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Pie_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FeatureThemePie + * @aliasclass Feature.Theme.Pie + * @deprecatedclass SuperMap.Feature.Theme.Pie + * @classdesc 饼图。 + * @category Visualization Theme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemePoint.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @extends FeatureThemeGraph + * @example + * // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // sectorStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @usage + * @private + */ + +var Pie = /*#__PURE__*/function (_Graph) { + Pie_inherits(Pie, _Graph); + + var _super = Pie_createSuper(Pie); + + function Pie(data, layer, fields, setting, lonlat) { + var _this; + + Pie_classCallCheck(this, Pie); + + _this = _super.call(this, data, layer, fields, setting, lonlat); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Pie"; + return _this; + } + /** + * @function FeatureThemePie.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + + + Pie_createClass(Pie, [{ + key: "destroy", + value: function destroy() { + Pie_get(Pie_getPrototypeOf(Pie.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemePie.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + // 图表配置对象 + var sets = this.setting; // 一个默认 style 组 + + var defaultStyleGroup = [{ + fillColor: "#ff9277" + }, { + fillColor: "#dddd00" + }, { + fillColor: "#ffc877" + }, { + fillColor: "#bbe3ff" + }, { + fillColor: "#d5ffbb" + }, { + fillColor: "#bbbbff" + }, { + fillColor: "#ddb000" + }, { + fillColor: "#b0dd00" + }, { + fillColor: "#e2bbff" + }, { + fillColor: "#ffbbe3" + }, { + fillColor: "#ff7777" + }, { + fillColor: "#ff9900" + }, { + fillColor: "#83dd00" + }, { + fillColor: "#77e3ff" + }, { + fillColor: "#778fff" + }, { + fillColor: "#c877ff" + }, { + fillColor: "#ff77ab" + }, { + fillColor: "#ff6600" + }, { + fillColor: "#aa8800" + }, { + fillColor: "#77c7ff" + }, { + fillColor: "#ad77ff" + }, { + fillColor: "#ff77ff" + }, { + fillColor: "#dd0083" + }, { + fillColor: "#777700" + }, { + fillColor: "#00aa00" + }, { + fillColor: "#0088aa" + }, { + fillColor: "#8400dd" + }, { + fillColor: "#aa0088" + }, { + fillColor: "#dd0000" + }, { + fillColor: "#772e00" + }]; // 重要步骤:初始化参数 + + if (!this.initBaseParameter()) { + return; + } // 背景框,默认不启用 + + + if (sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 数据值数组 + + + var fv = this.dataValues; + + if (fv.length < 1) { + return; + } // 没有数据 + // 值域范围 + + + var codomain = this.DVBCodomain; // 值域范围检测 + + for (var _i = 0; _i < fv.length; _i++) { + if (fv[_i] < codomain[0] || fv[_i] > codomain[1]) { + return; + } + } // 值的绝对值总和 + + + var valueSum = 0; + + for (var _i2 = 0; _i2 < fv.length; _i2++) { + valueSum += Math.abs(fv[_i2]); + } // 重要步骤:定义图表 FeatureThemePie 数据视图框中单位值的含义,单位值:每度代表的数值 + + + this.DVBUnitValue = 360 / valueSum; + var uv = this.DVBUnitValue; + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心 + + var startAngle = 0; // 扇形起始边角度 + + var endAngle = 0; // 扇形终止边角度 + + var startAngleTmp = startAngle; // 扇形临时起始边角度 + // 扇形(自适应)半径 + + var r = this.DVBHeight < this.DVBWidth ? this.DVBHeight / 2 : this.DVBWidth / 2; + + for (var i = 0; i < fv.length; i++) { + var fvi = Math.abs(fv[i]); //计算终止角 + + if (i === 0) { + endAngle = startAngle + fvi * uv; + } else if (i === fvi.length - 1) { + endAngle = startAngleTmp; + } else { + endAngle = startAngle + fvi * uv; + } //矫正误差计算 + + + if (endAngle - startAngle >= 360) { + endAngle = 359.9999999; + } // 扇形参数对象 + + + var sectorSP = new Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle); // 扇形样式 + + if (typeof sets.sectorStyleByFields === "undefined") { + // 使用默认 style 组 + var colorIndex = i % defaultStyleGroup.length; + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex); + } else { + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]); + } // 扇形 hover 样式 + + + sectorSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle); // 扇形 hover 与 click 设置 + + if (typeof sets.sectorHoverAble !== "undefined") { + sectorSP.hoverable = sets.sectorHoverAble; + } + + if (typeof sets.sectorClickAble !== "undefined") { + sectorSP.clickable = sets.sectorClickAble; + } // 图形携带的数据信息 + + + sectorSP.refDataID = this.data.id; + sectorSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; // 创建扇形并把此扇形添加到图表图形数组 + + this.shapes.push(this.shapeFactory.createShape(sectorSP)); // 把上一次的结束角度作为下一次的起始角度 + + startAngle = endAngle; + } // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + + this.shapesConvertToRelativeCoordinate(); + } + }]); + + return Pie; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/Point.js +function overlay_Point_typeof(obj) { "@babel/helpers - typeof"; return overlay_Point_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, overlay_Point_typeof(obj); } + +function overlay_Point_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function overlay_Point_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function overlay_Point_createClass(Constructor, protoProps, staticProps) { if (protoProps) overlay_Point_defineProperties(Constructor.prototype, protoProps); if (staticProps) overlay_Point_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function overlay_Point_get() { if (typeof Reflect !== "undefined" && Reflect.get) { overlay_Point_get = Reflect.get; } else { overlay_Point_get = function _get(target, property, receiver) { var base = overlay_Point_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return overlay_Point_get.apply(this, arguments); } + +function overlay_Point_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = overlay_Point_getPrototypeOf(object); if (object === null) break; } return object; } + +function overlay_Point_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) overlay_Point_setPrototypeOf(subClass, superClass); } + +function overlay_Point_setPrototypeOf(o, p) { overlay_Point_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return overlay_Point_setPrototypeOf(o, p); } + +function overlay_Point_createSuper(Derived) { var hasNativeReflectConstruct = overlay_Point_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = overlay_Point_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = overlay_Point_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return overlay_Point_possibleConstructorReturn(this, result); }; } + +function overlay_Point_possibleConstructorReturn(self, call) { if (call && (overlay_Point_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return overlay_Point_assertThisInitialized(self); } + +function overlay_Point_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function overlay_Point_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function overlay_Point_getPrototypeOf(o) { overlay_Point_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return overlay_Point_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FeatureThemePoint + * @aliasclass Feature.Theme.Point + * @deprecatedclass SuperMap.Feature.Theme.Point + * @classdesc 点状图。 + * @category Visualization Theme + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemePoint.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @example + * // pointStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // pointStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @extends FeatureThemeGraph + * @usage + * @private + */ + +var overlay_Point_Point = /*#__PURE__*/function (_Graph) { + overlay_Point_inherits(Point, _Graph); + + var _super = overlay_Point_createSuper(Point); + + function Point(data, layer, fields, setting, lonlat, options) { + var _this; + + overlay_Point_classCallCheck(this, Point); + + _this = _super.call(this, data, layer, fields, setting, lonlat, options); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Point"; + return _this; + } + /** + * @function FeatureThemePoint.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + + + overlay_Point_createClass(Point, [{ + key: "destroy", + value: function destroy() { + overlay_Point_get(overlay_Point_getPrototypeOf(Point.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemePoint.prototype.Point.assembleShapes + * @description 装配图形(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + // 图表配置对象 + var sets = this.setting; // 默认数据视图框 + + if (!sets.dataViewBoxParameter) { + if (typeof sets.useAxis === "undefined" || sets.useAxis) { + sets.dataViewBoxParameter = [45, 15, 15, 15]; + } else { + sets.dataViewBoxParameter = [5, 5, 5, 5]; + } + } // 重要步骤:初始化参数 + + + if (!this.initBaseParameter()) { + return; + } + + var dvb = this.dataViewBox; // 值域 + + var codomain = this.DVBCodomain; // 重要步骤:定义图表 FeatureThemeBar 数据视图框中单位值的含义 + + this.DVBUnitValue = (codomain[1] - codomain[0]) / this.DVBHeight; + var uv = this.DVBUnitValue; + var fv = this.dataValues; // 获取 x 轴上的图形信息 + + var xShapeInfo = this.calculateXShapeInfo(); + + if (!xShapeInfo) { + return; + } // 折线每个节点的 x 位置 + + + var xsLoc = xShapeInfo.xPositions; // 背景框,默认启用 + + if (typeof sets.useBackground === "undefined" || sets.useBackground) { + // 将背景框图形添加到模型的 shapes 数组,注意添加顺序,后添加的图形在先添加的图形之上。 + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 点状图必须使用坐标轴 + + + this.shapes = this.shapes.concat(ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo)); + var xPx; // 图形点 x 坐标 + + var yPx; // 图形点 y 坐标 + + for (var i = 0, len = fv.length; i < len; i++) { + // 数据溢出值域检查 + if (fv[i] < codomain[0] || fv[i] > codomain[1]) { + //isDataEffective = false; + return null; + } + + xPx = xsLoc[i]; + yPx = dvb[1] - (fv[i] - codomain[0]) / uv; // 图形点参数对象 + + var poiSP = new Point_Point(xPx, yPx); // 图形点 style + + poiSP.style = ShapeFactory.ShapeStyleTool({ + fillColor: "#ee9900" + }, sets.pointStyle, sets.pointStyleByFields, sets.pointStyleByCodomain, i, fv[i]); // 图形点 hover 样式 + + poiSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.pointHoverStyle); // 图形点 hover click + + if (typeof sets.pointHoverAble !== "undefined") { + poiSP.hoverable = sets.pointHoverAble; + } + + if (typeof sets.pointClickAble !== "undefined") { + poiSP.clickable = sets.pointClickAble; + } // 图形携带的数据信息 + + + poiSP.refDataID = this.data.id; + poiSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; // 创建图形点并把此图形添加到图表图形数组 + + this.shapes.push(this.shapeFactory.createShape(poiSP)); + } // 数据范围检测未通过,清空图形 + // if (isDataEffective === false) { + // this.shapes = []; + // } + // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + + this.shapesConvertToRelativeCoordinate(); + } + /** + * @function FeatureThemePoint.prototype.calculateXShapeInfo + * @description 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性, + * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值, + * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + * 本函数中图形配置对象 setting 可设属性:
+ * xShapeBlank - {Array.} 水平方向上的图形空白间隔参数。 + * 长度为 2 的数组,第一元素表示第折线左端点与数据视图框左端的空白间距,第二个元素表示折线右端点右端与数据视图框右端端的空白间距 。 + * @returns {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性:
+ * xPositions - {Array.} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。 + * width - {number}表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。 + */ + + }, { + key: "calculateXShapeInfo", + value: function calculateXShapeInfo() { + var dvb = this.dataViewBox; // 数据视图框 + + var sets = this.setting; // 图表配置对象 + + var fvc = this.dataValues.length; // 数组值个数 + + if (fvc < 1) { + return null; + } + + var xBlank; // x 轴空白间隔参数 + + var xShapePositions = []; // x 轴上图形的位置 + + var xShapeWidth = 0; // x 轴上图形宽度(自适应) + + var dvbWidth = this.DVBWidth; // 数据视图框宽度 + + var unitOffset = 0; // 单位偏移量 + // x 轴空白间隔参数处理 + + if (sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 2) { + xBlank = sets.xShapeBlank; + var xsLen = dvbWidth - (xBlank[0] + xBlank[1]); + + if (xsLen <= fvc) { + return null; + } + + unitOffset = xsLen / (fvc - 1); + } else { + // 默认使用等距离空白间隔,空白间隔为图形宽度 + unitOffset = dvbWidth / (fvc + 1); + xBlank = [unitOffset, unitOffset, unitOffset]; + } // 图形 x 轴上的位置计算 + + + var xOffset = 0; + + for (var i = 0; i < fvc; i++) { + if (i == 0) { + xOffset = xBlank[0]; + } else { + xOffset += unitOffset; + } + + xShapePositions.push(dvb[0] + xOffset); + } + + return { + "xPositions": xShapePositions, + "width": xShapeWidth + }; + } + }]); + + return Point; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/Ring.js +function Ring_typeof(obj) { "@babel/helpers - typeof"; return Ring_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Ring_typeof(obj); } + +function Ring_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Ring_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Ring_createClass(Constructor, protoProps, staticProps) { if (protoProps) Ring_defineProperties(Constructor.prototype, protoProps); if (staticProps) Ring_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Ring_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Ring_get = Reflect.get; } else { Ring_get = function _get(target, property, receiver) { var base = Ring_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Ring_get.apply(this, arguments); } + +function Ring_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Ring_getPrototypeOf(object); if (object === null) break; } return object; } + +function Ring_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Ring_setPrototypeOf(subClass, superClass); } + +function Ring_setPrototypeOf(o, p) { Ring_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Ring_setPrototypeOf(o, p); } + +function Ring_createSuper(Derived) { var hasNativeReflectConstruct = Ring_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Ring_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Ring_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Ring_possibleConstructorReturn(this, result); }; } + +function Ring_possibleConstructorReturn(self, call) { if (call && (Ring_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Ring_assertThisInitialized(self); } + +function Ring_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Ring_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Ring_getPrototypeOf(o) { Ring_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Ring_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class FeatureThemeRing + * @aliasclass Feature.Theme.Ring + * @deprecatedclass SuperMap.Feature.Theme.Ring + * @classdesc 环状图。 + * @category Visualization Theme + * @description 基于路由对象计算指定点 M 值操作的参数类。通过该类提供参数信息。 + + * @param {FeatureVector} data - 用户数据。 + * @param {SuperMap.Layer.Graph} layer - 此专题要素所在图层。 + * @param {Array.} fields - data 中的参与此图表生成的字段名称。 + * @param {FeatureThemeRing.setting} setting - 图表配置对象。 + * @param {LonLat} [lonlat] - 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。 + * @example + * // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性: + * // start: 值域值下限(包含); + * // end: 值域值上限(不包含); + * // style: 数据可视化图形的 style,这个样式对象的可设属性: 。 + * // sectorStyleByCodomain 数组形如: + * [ + * { + * start:0, + * end:250, + * style:{ + * fillColor:"#00CD00" + * } + * }, + * { + * start:250, + * end:500, + * style:{ + * fillColor:"#00EE00" + * } + * }, + * { + * start:500, + * end:750, + * style:{ + * fillColor:"#00FF7F" + * } + * }, + * { + * start:750, + * end:1500, + * style:{ + * fillColor:"#00FF00" + * } + * } + * ] + * @param {Object} [sectorHoverStyle=true] - 环状图扇形 hover 状态时的样式,sectorHoverAble 为 true 时有效。 + * @param {boolean} [sectorHoverAble=true] - 是否允许环状图扇形使用 hover 状态。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽环状图扇形对专题图层事件的响应。 + * @param {boolean} [sectorClickAble=true] - 是否允许环状图扇形被点击。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽环状图扇形对专题图层事件的响应。 + * + * @extends FeatureThemeGraph + * @usage + * @private + */ + +var Ring = /*#__PURE__*/function (_Graph) { + Ring_inherits(Ring, _Graph); + + var _super = Ring_createSuper(Ring); + + function Ring(data, layer, fields, setting, lonlat) { + var _this; + + Ring_classCallCheck(this, Ring); + + _this = _super.call(this, data, layer, fields, setting, lonlat); + _this.CLASS_NAME = "SuperMap.Feature.Theme.Ring"; + return _this; + } + /** + * @function FeatureThemeRing.prototype.destroy + * @description 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。 + */ + + + Ring_createClass(Ring, [{ + key: "destroy", + value: function destroy() { + Ring_get(Ring_getPrototypeOf(Ring.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeRing.prototype.assembleShapes + * @description 装配图形(扩展接口)。 + */ + + }, { + key: "assembleShapes", + value: function assembleShapes() { + // 重要步骤:初始化参数 + if (!this.initBaseParameter()) { + return; + } // 一个默认 style 组 + + + var defaultStyleGroup = [{ + fillColor: "#ff9277" + }, { + fillColor: "#dddd00" + }, { + fillColor: "#ffc877" + }, { + fillColor: "#bbe3ff" + }, { + fillColor: "#d5ffbb" + }, { + fillColor: "#bbbbff" + }, { + fillColor: "#ddb000" + }, { + fillColor: "#b0dd00" + }, { + fillColor: "#e2bbff" + }, { + fillColor: "#ffbbe3" + }, { + fillColor: "#ff7777" + }, { + fillColor: "#ff9900" + }, { + fillColor: "#83dd00" + }, { + fillColor: "#77e3ff" + }, { + fillColor: "#778fff" + }, { + fillColor: "#c877ff" + }, { + fillColor: "#ff77ab" + }, { + fillColor: "#ff6600" + }, { + fillColor: "#aa8800" + }, { + fillColor: "#77c7ff" + }, { + fillColor: "#ad77ff" + }, { + fillColor: "#ff77ff" + }, { + fillColor: "#dd0083" + }, { + fillColor: "#777700" + }, { + fillColor: "#00aa00" + }, { + fillColor: "#0088aa" + }, { + fillColor: "#8400dd" + }, { + fillColor: "#aa0088" + }, { + fillColor: "#dd0000" + }, { + fillColor: "#772e00" + }]; // 图表配置对象 + + var sets = this.setting; // 背景框,默认不启用 + + if (sets.useBackground) { + this.shapes.push(ShapeFactory.Background(this.shapeFactory, this.chartBox, sets)); + } // 数据值数组 + + + var fv = this.dataValues; + + if (fv.length < 1) { + return; + } // 没有数据 + // 值域范围 + + + var codomain = this.DVBCodomain; // 值域范围检测 + + for (var _i = 0; _i < fv.length; _i++) { + if (fv[_i] < codomain[0] || fv[_i] > codomain[1]) { + return; + } + } // 值的绝对值总和 + + + var valueSum = 0; + + for (var _i2 = 0; _i2 < fv.length; _i2++) { + valueSum += Math.abs(fv[_i2]); + } // 重要步骤:定义图表 FeatureThemeRing 数据视图框中单位值的含义,单位值:每度代表的数值 + + + this.DVBUnitValue = 360 / valueSum; + var uv = this.DVBUnitValue; + var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心 + + var startAngle = 0; // 扇形起始边角度 + + var endAngle = 0; // 扇形终止边角度 + + var startAngleTmp = startAngle; // 扇形临时起始边角度 + // 扇形外环(自适应)半径 + + var r = this.DVBHeight < this.DVBWidth ? this.DVBHeight / 2 : this.DVBWidth / 2; // 扇形内环(自适应)半径 + + var isInRange = sets.innerRingRadius >= 0 && sets.innerRingRadius < r; + var r0 = typeof sets.innerRingRadius !== "undefined" && !isNaN(sets.innerRingRadius) && isInRange ? sets.innerRingRadius : 0; + + for (var i = 0; i < fv.length; i++) { + var fvi = Math.abs(fv[i]); // 计算结束角度 + + if (i === 0) { + endAngle = startAngle + fvi * uv; + } else if (i === fvi.length - 1) { + endAngle = startAngleTmp; + } else { + endAngle = startAngle + fvi * uv; + } // 扇形参数对象 + + + var sectorSP = new Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle, r0); // 扇形样式 + + if (typeof sets.sectorStyleByFields === "undefined") { + // 使用默认 style 组 + var colorIndex = i % defaultStyleGroup.length; + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex); + } else { + sectorSP.style = ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]); + } // 扇形 hover 样式 + + + sectorSP.highlightStyle = ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle); // 扇形 hover 与 click 设置 + + if (typeof sets.sectorHoverAble !== "undefined") { + sectorSP.hoverable = sets.sectorHoverAble; + } + + if (typeof sets.sectorClickAble !== "undefined") { + sectorSP.clickable = sets.sectorClickAble; + } // 图形携带的数据信息 + + + sectorSP.refDataID = this.data.id; + sectorSP.dataInfo = { + field: this.fields[i], + value: fv[i] + }; // 创建扇形并把此扇形添加到图表图形数组 + + this.shapes.push(this.shapeFactory.createShape(sectorSP)); // 把上一次的结束角度作为下一次的起始角度 + + startAngle = endAngle; + } // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形 + // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数) + + + this.shapesConvertToRelativeCoordinate(); + } + }]); + + return Ring; +}(Graph); +;// CONCATENATED MODULE: ./src/common/overlay/ThemeVector.js +function ThemeVector_typeof(obj) { "@babel/helpers - typeof"; return ThemeVector_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ThemeVector_typeof(obj); } + +function ThemeVector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ThemeVector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ThemeVector_createClass(Constructor, protoProps, staticProps) { if (protoProps) ThemeVector_defineProperties(Constructor.prototype, protoProps); if (staticProps) ThemeVector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ThemeVector_get() { if (typeof Reflect !== "undefined" && Reflect.get) { ThemeVector_get = Reflect.get; } else { ThemeVector_get = function _get(target, property, receiver) { var base = ThemeVector_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return ThemeVector_get.apply(this, arguments); } + +function ThemeVector_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = ThemeVector_getPrototypeOf(object); if (object === null) break; } return object; } + +function ThemeVector_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ThemeVector_setPrototypeOf(subClass, superClass); } + +function ThemeVector_setPrototypeOf(o, p) { ThemeVector_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ThemeVector_setPrototypeOf(o, p); } + +function ThemeVector_createSuper(Derived) { var hasNativeReflectConstruct = ThemeVector_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ThemeVector_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ThemeVector_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ThemeVector_possibleConstructorReturn(this, result); }; } + +function ThemeVector_possibleConstructorReturn(self, call) { if (call && (ThemeVector_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ThemeVector_assertThisInitialized(self); } + +function ThemeVector_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ThemeVector_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ThemeVector_getPrototypeOf(o) { ThemeVector_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ThemeVector_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + +/** + * @class FeatureThemeVector + * @aliasclass Feature.Theme.ThemeVector + * @deprecatedclass SuperMap.Feature.Theme.ThemeVector + * @classdesc 矢量专题要素类。 + * @category Visualization Theme + * @extends FeatureTheme + * @param {FeatureVector} data - 用户数据,的类型为矢量数据 feature。 + * @param {SuperMap.Layer} layer - 此专题要素所在图层。 + * @param {Object} style - 样式。 + * @param {Object} options - 创建专题要素时的可选参数。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离, 单位:像素。 + * @param {boolean} [options.isHoverAble=true] - 图形是否可 hover。 + * @param {boolean} [options.isMultiHover=true] - 是否使用多图形高亮,isHoverAble 为 true 时生效。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {Object} [options.highlightStyle] - 高亮样式。 + * @usage + */ + +var ThemeVector = /*#__PURE__*/function (_Theme) { + ThemeVector_inherits(ThemeVector, _Theme); + + var _super = ThemeVector_createSuper(ThemeVector); + + function ThemeVector(data, layer, style, options, shapeOptions) { + var _this; + + ThemeVector_classCallCheck(this, ThemeVector); + + _this = _super.call(this, data, layer); //数据的 geometry 属性必须存在且类型是 Geometry 或其子类的类型 + + if (!data.geometry) { + return ThemeVector_possibleConstructorReturn(_this); + } + + if (!(data.geometry instanceof Geometry)) { + return ThemeVector_possibleConstructorReturn(_this); + } + /** + * @member {Bounds} [FeatureThemeVector.prototype.dataBounds] + * @description 用户数据的(feature.geometry)地理范围。 + */ + + + _this.dataBounds = data.geometry.getBounds(); + /** + * @member {number} [FeatureThemeVector.prototype.nodesClipPixel=2] + * @description 节点抽稀像素距离。 + */ + + _this.nodesClipPixel = 2; + /** + * @member {boolean} [FeatureThemeVector.prototype.isHoverAble=true] + * @description 图形是否可 hover。 + */ + + _this.isHoverAble = true; + /** + * @member {boolean} [FeatureThemeVector.prototype.isMultiHover=true] + * @description 是否使用多图形高亮,isHoverAble 为 true 时生效。 + */ + + _this.isMultiHover = true; + /** + * @member {boolean} [FeatureThemeVector.prototype.isClickAble=true] + * @description 图形是否可点击。 + */ + + _this.isClickAble = true; + /** + * @member {Object} [FeatureThemeVector.prototype.highlightStyle] + * @description 高亮样式。 + */ + + _this.highlightStyle = null; + /** + * @member {Object} [FeatureThemeVector.prototype.shapeOptions] + * @description 添加到渲染器前修改 shape 的一些属性,非特殊情况通常不允许这么做。 + */ + + _this.shapeOptions = {}; + /** + * @member {Object} [FeatureThemeVector.prototype.style] + * @description 可视化图形的 style。在子类中规定其对象结构和默认属性值。 + */ + + _this.style = style || {}; + _this.CLASS_NAME = "SuperMap.Feature.Theme.Vector"; + _this.style = style ? style : {}; + + if (options) { + Util.copyAttributesWithClip(ThemeVector_assertThisInitialized(_this), options, ["shapeOptions", "dataBounds"]); + } + + if (shapeOptions) { + Util.copyAttributesWithClip(_this.shapeOptions, shapeOptions); + } //设置基础参数 dataBounds、lonlat、location + + + var geometry = data.geometry; + _this.lonlat = _this.dataBounds.getCenterLonLat(); + _this.location = _this.getLocalXY(_this.lonlat); //将地理要素转为专题要素 + + if (geometry instanceof LinearRing) { + _this.lineToTF(geometry); + } else if (geometry instanceof LineString) { + _this.lineToTF(geometry); + } else if (geometry instanceof Curve) {//独立几何体 + } else if (geometry instanceof MultiPoint) { + _this.multiPointToTF(geometry); + } else if (geometry instanceof MultiLineString) { + _this.multiLineStringToTF(geometry); + } else if (geometry instanceof MultiPolygon) { + _this.multiPolygonToTF(geometry); + } else if (geometry instanceof Polygon) { + _this.polygonToTF(geometry); + } else if (geometry instanceof Collection) {//独立几何体 + } else if (geometry instanceof Point) { + _this.pointToTF(geometry); + } else if (geometry instanceof Rectangle) { + _this.rectangleToTF(geometry); + } else if (geometry instanceof GeoText) { + _this.geoTextToTF(geometry); + } + + return _this; + } + /** + * @function FeatureThemeVector.prototype.destroy + * @override + */ + + + ThemeVector_createClass(ThemeVector, [{ + key: "destroy", + value: function destroy() { + this.style = null; + this.dataBounds = null; + this.nodesClipPixel = null; + this.isHoverAble = null; + this.isMultiHover = null; + this.isClickAble = null; + this.highlightStyle = null; + this.shapeOptions = null; + + ThemeVector_get(ThemeVector_getPrototypeOf(ThemeVector.prototype), "destroy", this).call(this); + } + /** + * @function FeatureThemeVector.prototype.lineToTF + * @description 转换线和线环要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 GeometryLineString 或 GeometryLineRing。 + */ + + }, { + key: "lineToTF", + value: function lineToTF(geometry) { + var components = geometry.components; //节点像素坐标 + + var localLX = []; //参考位置,参考中心为 + + var refLocal = []; + var location = this.location; + var pointList = []; //节点抽稀距离 + + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + refLocal = []; + localLX = this.getLocalXY(components_i); + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; //抽稀 - 2 px + + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + + if (Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx && Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx) { + continue; + } + } //使用参考点 + + + pointList.push(refLocal); + } + + if (pointList.length < 2) { + return null; + } //赋 style + + + var style = new Object(); + style = Util.copyAttributesWithClip(style, this.style, ['pointList']); + style.pointList = pointList; //创建图形 + + var shape = new SmicBrokenLine({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = this.location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //添加到渲染器前修改 shape 的一些属性,非特殊情况通常不允许这么做 + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + /** + * @function FeatureThemeVector.prototype.multiPointToTF + * @description 转多点要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiPoint。 + */ + + }, { + key: "multiPointToTF", + value: function multiPointToTF(geometry) { + /* //-- 不抽稀 + var components = geometry.components; + for(var i = 0; i < components.length; i++){ + var components_i = components[i]; + this.pointToTF(components_i); + } + */ + var components = geometry.components; //节点像素坐标 + + var localLX = []; //参考位置,参考中心为 + + var refLocal = []; + var location = this.location; + var pointList = []; //节点抽稀距离 + + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + refLocal = []; + localLX = this.getLocalXY(components_i); + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; //抽稀 + + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + + if (Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx && Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx) { + continue; + } + } //使用参考点 + + + pointList.push(refLocal); //赋 style + + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + + style = Util.copyAttributesWithClip(style, this.style); + style.x = refLocal[0]; + style.y = refLocal[1]; //创建图形 + + var shape = new SmicPoint({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //修改一些 shape 可选属性,通常不需要这么做 + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + } + /** + * @function FeatureThemeVector.prototype.multiLineStringToTF + * @description 转换多线要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiLineString。 + */ + + }, { + key: "multiLineStringToTF", + value: function multiLineStringToTF(geometry) { + var components = geometry.components; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + this.lineToTF(components_i); + } + } + /** + * @function FeatureThemeVector.prototype.multiPolygonToTF + * @description 转换多面要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 MultiPolygon。 + */ + + }, { + key: "multiPolygonToTF", + value: function multiPolygonToTF(geometry) { + var components = geometry.components; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i]; + this.polygonToTF(components_i); + } + } + /** + * @function FeatureThemeVector.prototype.pointToTF + * @description 转换点要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Point。 + */ + + }, { + key: "pointToTF", + value: function pointToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; //geometry 像素坐标 + + var localLX = this.getLocalXY(geometry); //赋 style + + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + + style = Util.copyAttributesWithClip(style, this.style); + style.x = localLX[0] - location[0]; + style.y = localLX[1] - location[1]; //创建图形 + + var shape = new SmicPoint({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //修改一些 shape 可选属性,通常不需要这么做 + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + /** + * @function FeatureThemeVector.prototype.polygonToThemeFeature + * @description 转换面要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Polygon。 + */ + + }, { + key: "polygonToTF", + value: function polygonToTF(geometry) { + var components = geometry.components; //节点像素坐标 + + var localLX = []; //参考位置,参考中心为 + + var refLocal = []; + var location = this.location; + var pointList = []; //岛洞 + + var holePolygonPointList = []; + var holePolygonPointLists = []; //节点抽稀距离 + + var nCPx = this.nodesClipPixel; + + for (var i = 0; i < components.length; i++) { + var components_i = components[i].components; + + if (i === 0) { + // 第一个 component 正常绘制 + pointList = []; + + for (var j = 0; j < components_i.length; j++) { + refLocal = []; + localLX = this.getLocalXY(components_i[j]); + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; //抽稀 - 2 px + + if (pointList.length > 0) { + var lastLocalXY = pointList[pointList.length - 1]; + + if (Math.abs(lastLocalXY[0] - refLocal[0]) <= nCPx && Math.abs(lastLocalXY[1] - refLocal[1]) <= nCPx) { + continue; + } + } //使用参考点 + + + pointList.push(refLocal); + } + } else { + // 其它 component 作为岛洞 + holePolygonPointList = []; + + for (var k = 0; k < components_i.length; k++) { + refLocal = []; + localLX = this.getLocalXY(components_i[k]); + refLocal[0] = localLX[0] - location[0]; + refLocal[1] = localLX[1] - location[1]; //抽稀 - 2 px + + if (holePolygonPointList.length > 0) { + var lastXY = holePolygonPointList[holePolygonPointList.length - 1]; + + if (Math.abs(lastXY[0] - refLocal[0]) <= nCPx && Math.abs(lastXY[1] - refLocal[1]) <= nCPx) { + continue; + } + } //使用参考点 + + + holePolygonPointList.push(refLocal); + } + } + + if (holePolygonPointList.length < 2) { + continue; + } + + holePolygonPointLists.push(holePolygonPointList); + } + + if (pointList.length < 2) { + return; + } //赋 style + + + var style = {}; + style = Util.copyAttributesWithClip(style, this.style, ['pointList']); + style.pointList = pointList; //创建图形 + + var shape = new SmicPolygon({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = this.location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //岛洞面 + + if (holePolygonPointLists.length > 0) { + shape.holePolygonPointLists = holePolygonPointLists; + } //修改一些 shape 可选属性,通常不需要这么做 + + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + /** + * @function FeatureThemeVector.prototype.rectangleToTF + * @description 转换矩形要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 Rectangle。 + */ + + }, { + key: "rectangleToTF", + value: function rectangleToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; + var ll = new LonLat(geometry.x, geometry.y); //地图分辨率 + + var res = this.layer.map.getResolution(); //geometry 像素坐标 + + var localLX = this.getLocalXY(ll); //赋 style + + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + + style = Util.copyAttributesWithClip(style, this.style); + style.x = localLX[0] - location[0]; // Rectangle 使用左下角定位, SmicRectangle 使用左上角定位,需要转换 + + style.y = localLX[1] - location[1] - 2 * geometry.width / res; + style.width = geometry.width / res; + style.height = geometry.height / res; //创建图形 + + var shape = new SmicRectangle({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //修改一些 shape 可选属性,通常不需要这么做 + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + /** + * @function FeatureThemeVector.prototype.geoTextToTF + * @description 转换文本要素。 + * @param {Geometry} geometry - 用户数据几何地理信息,这里必须是 GeoText。 + */ + + }, { + key: "geoTextToTF", + value: function geoTextToTF(geometry) { + //参考位置,参考中心为 + var location = this.location; //geometry 像素坐标 + + var localLX = this.getLocalXY(geometry); //赋 style + + var style = new Object(); + style.r = 6; //防止漏设此参数,默认 6 像素 + + style = Util.copyAttributesWithClip(style, this.style, ["x", "y", "text"]); + style.x = localLX[0] - location[0]; + style.y = localLX[1] - location[1]; + style.text = geometry.text; //创建图形 + + var shape = new SmicText({ + style: style, + clickable: this.isClickAble, + hoverable: this.isHoverAble + }); //设置高亮样式 + + if (this.highlightStyle) { + shape.highlightStyle = this.highlightStyle; + } //设置参考中心,指定图形位置 + + + shape.refOriginalPosition = location; //储存数据 id 属性,用于事件 + + shape.refDataID = this.data.id; //储存数据 id 属性,用于事件-多图形同时高亮 + + shape.isHoverByRefDataID = this.isMultiHover; //修改一些 shape 可选属性,通常不需要这么做 + + if (this.shapeOptions) { + Util.copyAttributesWithClip(shape, this.shapeOptions); + } + + this.shapes.push(shape); + } + /** + * @function FeatureThemeVector.prototype.updateAndAddShapes + * @description 修改位置,针对地图平移操作,地图漫游操作后调用此函数。 + */ + + }, { + key: "updateAndAddShapes", + value: function updateAndAddShapes() { + var newLocalLX = this.getLocalXY(this.lonlat); + this.location = newLocalLX; + var render = this.layer.renderer; + + for (var i = 0, len = this.shapes.length; i < len; i++) { + var shape = this.shapes[i]; //设置参考中心,指定图形位置 + + shape.refOriginalPosition = newLocalLX; + render.addShape(shape); + } + } + /** + * @function FeatureThemeVector.prototype.getShapesCount + * @description 获得专题要素中可视化图形的数量。 + * @returns {number} 可视化图形的数量。 + */ + + }, { + key: "getShapesCount", + value: function getShapesCount() { + return this.shapes.length; + } + /** + * @function FeatureThemeVector.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {LonLat} lonlat - 专题要素地理位置。 + */ + + }, { + key: "getLocalXY", + value: function getLocalXY(lonlat) { + return this.layer.getLocalXY(lonlat); + } + }]); + + return ThemeVector; +}(Theme_Theme); +;// CONCATENATED MODULE: ./src/common/overlay/feature/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Group.js +function Group_typeof(obj) { "@babel/helpers - typeof"; return Group_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Group_typeof(obj); } + +function Group_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Group_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Group_createClass(Constructor, protoProps, staticProps) { if (protoProps) Group_defineProperties(Constructor.prototype, protoProps); if (staticProps) Group_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Group_get() { if (typeof Reflect !== "undefined" && Reflect.get) { Group_get = Reflect.get; } else { Group_get = function _get(target, property, receiver) { var base = Group_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return Group_get.apply(this, arguments); } + +function Group_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = Group_getPrototypeOf(object); if (object === null) break; } return object; } + +function Group_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Group_setPrototypeOf(subClass, superClass); } + +function Group_setPrototypeOf(o, p) { Group_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Group_setPrototypeOf(o, p); } + +function Group_createSuper(Derived) { var hasNativeReflectConstruct = Group_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Group_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Group_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Group_possibleConstructorReturn(this, result); }; } + +function Group_possibleConstructorReturn(self, call) { if (call && (Group_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Group_assertThisInitialized(self); } + +function Group_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Group_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Group_getPrototypeOf(o) { Group_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Group_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class LevelRenderer.Group + * @category Visualization Theme + * @private + * @classdesc Group 是一个容器,可以插入子节点,Group 的变换也会被应用到子节点上。 + * @extends {LevelRenderer.Transformable} + * (code) + * var g = new LevelRenderer.Group(); + * var Circle = new LevelRenderer.Shape.Circle(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.addChild(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * brushType: 'fill' + * } + * })); + * LR.addGroup(g); + * (end) + * @param {Array} options - Group 的配置(options)项,可以是 Group 的自有属性,也可以是自定义的属性。 + */ + +var Group = /*#__PURE__*/function (_mixin) { + Group_inherits(Group, _mixin); + + var _super = Group_createSuper(Group); + + function Group(options) { + var _this; + + Group_classCallCheck(this, Group); + + _this = _super.call(this, options); + options = options || {}; + /** + * @member {string} LevelRenderer.Group.prototype.id + * @description Group 的唯一标识。 + */ + + _this.id = null; + /** + * @readonly + * @member {string} [LevelRenderer.Group.prototype.type='group'] + * @description 类型。 + */ + + _this.type = 'group'; //http://www.w3.org/TR/2dcontext/#clipping-region + + /** + * @member {string} LevelRenderer.Group.prototype.clipShape + * @description 用于裁剪的图形(shape),所有 Group 内的图形在绘制时都会被这个图形裁剪,该图形会继承 Group 的变换。 + */ + + _this.clipShape = null; + /** + * @member {Array} LevelRenderer.Group.prototype._children + * @description _children。 + */ + + _this._children = []; + /** + * @member {Array} LevelRenderer.Group.prototype._storage + * @description _storage。 + */ + + _this._storage = null; + /** + * @member {boolean} [LevelRenderer.Group.prototype.__dirty=true] + * @description __dirty。 + */ + + _this.__dirty = true; + /** + * @member {boolean} [LevelRenderer.Group.prototype.ignore=false] + * @description 是否忽略该 Group 及其所有子节点。 + */ + + _this.ignore = false; + Util.extend(Group_assertThisInitialized(_this), options); + _this.id = _this.id || Util.createUniqueID("smShapeGroup_"); + _this.CLASS_NAME = "SuperMap.LevelRenderer.Group"; + return _this; + } + /** + * @function LevelRenderer.Group.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Group_createClass(Group, [{ + key: "destroy", + value: function destroy() { + this.id = null; + this.type = null; + this.clipShape = null; + this._children = null; + this._storage = null; + this.__dirty = null; + this.ignore = null; + + Group_get(Group_getPrototypeOf(Group.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Group.prototype.children + * @description 复制并返回一份新的包含所有儿子节点的数组。 + * @returns {Array.} 图形数组。 + */ + + }, { + key: "children", + value: function children() { + return this._children.slice(); + } + /** + * @function LevelRenderer.Group.prototype.childAt + * @description 获取指定 index 的儿子节点 + * @param {number} idx - 节点索引。 + * @returns {LevelRenderer.Shape} 图形。 + */ + + }, { + key: "childAt", + value: function childAt(idx) { + return this._children[idx]; + } + /** + * @function LevelRenderer.Group.prototype.addChild + * @description 添加子节点,可以是 Shape 或者 Group。 + * @param {(LevelRenderer.Shape|LevelRenderer.Group)} child - 节点图形。 + */ + // TODO Type Check + + }, { + key: "addChild", + value: function addChild(child) { + if (child == this) { + return; + } + + if (child.parent == this) { + return; + } + + if (child.parent) { + child.parent.removeChild(child); + } + + this._children.push(child); + + child.parent = this; + + if (this._storage && this._storage !== child._storage) { + this._storage.addToMap(child); + + if (child instanceof Group) { + child.addChildrenToStorage(this._storage); + } + } + } + /** + * @function LevelRenderer.Group.prototype.removeChild + * @description 移除子节点。 + * @param {LevelRenderer.Shape} child - 需要移除的子节点图形。 + */ + + }, { + key: "removeChild", + value: function removeChild(child) { + var idx = Util.indexOf(this._children, child); + + this._children.splice(idx, 1); + + child.parent = null; + + if (this._storage) { + this._storage.delFromMap(child.id); + + if (child instanceof Group) { + child.delChildrenFromStorage(this._storage); + } + } + } + /** + * @function LevelRenderer.Group.prototype.eachChild + * @description 遍历所有子节点。 + * @param {function} cb - 回调函数。 + * @param {Object} context - 上下文。 + */ + + }, { + key: "eachChild", + value: function eachChild(cb, context) { + var haveContext = !!context; + + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + + if (haveContext) { + cb.call(context, child); + } else { + cb(child); + } + } + } + /** + * @function LevelRenderer.Group.prototype.traverse + * @description 深度优先遍历所有子孙节点。 + * @param {function} cb - 回调函数。 + * @param {Object} context - 上下文。 + */ + + }, { + key: "traverse", + value: function traverse(cb, context) { + var haveContext = !!context; + + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + + if (haveContext) { + cb.call(context, child); + } else { + cb(child); + } + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + } + /** + * @function LevelRenderer.Group.prototype.addChildrenToStorage + * @description 把子图形添加到仓库。 + * @param {LevelRenderer.Storage} storage - 图形仓库。 + */ + + }, { + key: "addChildrenToStorage", + value: function addChildrenToStorage(storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToMap(child); + + if (child.type === 'group') { + child.addChildrenToStorage(storage); + } + } + } + /** + * @function LevelRenderer.Group.prototype.delChildrenFromStorage + * @description 从仓库把子图形删除。 + * @param {LevelRenderer.Storage} storage - 图形仓库。 + */ + + }, { + key: "delChildrenFromStorage", + value: function delChildrenFromStorage(storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromMap(child.id); + + if (child.type === 'group') { + child.delChildrenFromStorage(storage); + } + } + } + /** + * @function LevelRenderer.Group.prototype.modSelf + * @description 是否修改。 + */ + + }, { + key: "modSelf", + value: function modSelf() { + this.__dirty = true; + } + }]); + + return Group; +}(mixinExt(Eventful, Transformable)); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Storage.js +function Storage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Storage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Storage_createClass(Constructor, protoProps, staticProps) { if (protoProps) Storage_defineProperties(Constructor.prototype, protoProps); if (staticProps) Storage_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Storage + * @category Visualization Theme + * @classdesc 内容(图像)仓库 (M) 。 + */ + +var Storage = /*#__PURE__*/function () { + function Storage() { + Storage_classCallCheck(this, Storage); + + /** + * @member {Object} LevelRenderer.Storage.prototype._elements + * @description 所有常规形状,id 索引的 map。 + */ + this._elements = {}; + /** + * @member {Array} LevelRenderer.Storage.prototype._hoverElements + * @description 高亮层形状,不稳定,动态增删,数组位置也是 z 轴方向,靠前显示在下方。 + * + */ + + this._hoverElements = []; + /** + * @member {Array} LevelRenderer.Storage.prototype._roots + * @description _roots。 + * + */ + + this._roots = []; + /** + * @member {Array} LevelRenderer.Storage.prototype._shapeList + * @description _shapeList。 + * + */ + + this._shapeList = []; + /** + * @member {number} LevelRenderer.Storage.prototype._shapeListOffset + * @description _shapeListOffset。默认值:0。 + * + */ + + this._shapeListOffset = 0; + this.CLASS_NAME = "SuperMap.LevelRenderer.Storage"; + } + /** + * @function LevelRenderer.Storage.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Storage_createClass(Storage, [{ + key: "destroy", + value: function destroy() { + this.dispose(); + this._shapeList = null; + this._shapeListOffset = null; + } + /** + * @function LevelRenderer.Storage.prototype.iterShape + * @description 遍历迭代器。 + * + * @param {function} fun - 迭代回调函数,return true终止迭代。 + * @param {Object} option - 迭代参数,缺省为仅降序遍历普通层图形。 + * @param {boolean} [hover=true] - 是否是高亮层图形。 + * @param {string} [normal='down'] - 是否是普通层图形,迭代时是否指定及z轴顺序。可设值:'down' ,'up'。 + * @param {boolean} [update=false] - 是否在迭代前更新形状列表。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "iterShape", + value: function iterShape(fun, option) { + if (!option) { + var defaultIterateOption = { + hover: false, + normal: 'down', + update: false + }; + option = defaultIterateOption; + } + + if (option.hover) { + // 高亮层数据遍历 + for (var i = 0, l = this._hoverElements.length; i < l; i++) { + var el = this._hoverElements[i]; + el.updateTransform(); + + if (fun(el)) { + return this; + } + } + } + + if (option.update) { + this.updateShapeList(); + } // 遍历: 'down' | 'up' + + + switch (option.normal) { + case 'down': + { + // 降序遍历,高层优先 + var _l = this._shapeList.length; + + while (_l--) { + if (fun(this._shapeList[_l])) { + return this; + } + } + + break; + } + // case 'up': + + default: + { + // 升序遍历,底层优先 + for (var _i = 0, _l2 = this._shapeList.length; _i < _l2; _i++) { + if (fun(this._shapeList[_i])) { + return this; + } + } + + break; + } + } + + return this; + } + /** + * @function LevelRenderer.Storage.prototype.getHoverShapes + * @param {boolean} [update=false] - 是否在返回前更新图形的变换。 + * @return {Array.} 图形数组。 + */ + + }, { + key: "getHoverShapes", + value: function getHoverShapes(update) { + // hoverConnect + var hoverElements = [], + len = this._hoverElements.length; + + for (var i = 0; i < len; i++) { + hoverElements.push(this._hoverElements[i]); + var target = this._hoverElements[i].hoverConnect; + + if (target) { + var shape; + target = target instanceof Array ? target : [target]; + + for (var j = 0, k = target.length; j < k; j++) { + shape = target[j].id ? target[j] : this.get(target[j]); + + if (shape) { + hoverElements.push(shape); + } + } + } + } + + hoverElements.sort(Storage.shapeCompareFunc); + + if (update) { + for (var _i2 = 0, l = hoverElements.length; _i2 < l; _i2++) { + hoverElements[_i2].updateTransform(); + } + } + + return hoverElements; + } + /** + * @function LevelRenderer.Storage.prototype.getShapeList + * @description 返回所有图形的绘制队列。 + * + * @param {boolean} [update=false] - 是否在返回前更新该数组。 详见: updateShapeList。 + * @return {LevelRenderer.Shape} 图形。 + */ + + }, { + key: "getShapeList", + value: function getShapeList(update) { + if (update) { + this.updateShapeList(); + } + + return this._shapeList; + } + /** + * @function LevelRenderer.Storage.prototype.updateShapeList + * @description 更新图形的绘制队列。每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中,最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列。 + */ + + }, { + key: "updateShapeList", + value: function updateShapeList() { + this._shapeListOffset = 0; + var rootsLen = this._roots.length; + + for (var i = 0; i < rootsLen; i++) { + var root = this._roots[i]; + + this._updateAndAddShape(root); + } + + this._shapeList.length = this._shapeListOffset; + var shapeListLen = this._shapeList.length; + + for (var _i3 = 0; _i3 < shapeListLen; _i3++) { + this._shapeList[_i3].__renderidx = _i3; + } + + this._shapeList.sort(Storage.shapeCompareFunc); + } + /** + * @function LevelRenderer.Storage.prototype._updateAndAddShape + * @description 更新并添加图形。 + * + */ + + }, { + key: "_updateAndAddShape", + value: function _updateAndAddShape(el, clipShapes) { + if (el.ignore) { + return; + } + + el.updateTransform(); + + if (el.type == 'group') { + if (el.clipShape) { + // clipShape 的变换是基于 group 的变换 + el.clipShape.parent = el; + el.clipShape.updateTransform(); // PENDING 效率影响 + + if (clipShapes) { + clipShapes = clipShapes.slice(); + clipShapes.push(el.clipShape); + } else { + clipShapes = [el.clipShape]; + } + } + + for (var i = 0; i < el._children.length; i++) { + var child = el._children[i]; // Force to mark as dirty if group is dirty + + child.__dirty = el.__dirty || child.__dirty; + + this._updateAndAddShape(child, clipShapes); + } // Mark group clean here + + + el.__dirty = false; + } else { + el.__clipShapes = clipShapes; + this._shapeList[this._shapeListOffset++] = el; + } + } + /** + * @function LevelRenderer.Storage.prototype.mod + * @description 修改图形(Shape)或者组(Group)。 + * + * @param {string} elId - 唯一标识。 + * @param {Object} params - 参数。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "mod", + value: function mod(elId, params) { + var el = this._elements[elId]; + + if (el) { + el.modSelf(); + + if (params) { + // 如果第二个参数直接使用 shape + // parent, _storage, __startClip 三个属性会有循环引用 + // 主要为了向 1.x 版本兼容,2.x 版本不建议使用第二个参数 + if (params.parent || params._storage || params.__startClip) { + var target = {}; + + for (var name in params) { + if (name == 'parent' || name == '_storage' || name == '__startClip') { + continue; + } + + if (params.hasOwnProperty(name)) { + target[name] = params[name]; + } + } + + new Util_Util().merge(el, target, true); + } else { + new Util_Util().merge(el, params, true); + } + } + } + + return this; + } + /** + * @function LevelRenderer.Storage.prototype.drift + * @description 移动指定的图形(Shape)的位置。 + * @param {string} shapeId - 唯一标识。 + * @param {number} dx + * @param {number} dy + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "drift", + value: function drift(shapeId, dx, dy) { + var shape = this._elements[shapeId]; + + if (shape) { + shape.needTransform = true; + + if (shape.draggable === 'horizontal') { + dy = 0; + } else if (shape.draggable === 'vertical') { + dx = 0; + } + + if (!shape.ondrift // ondrift + // 有onbrush并且调用执行返回false或undefined则继续 + || shape.ondrift && !shape.ondrift(dx, dy)) { + shape.drift(dx, dy); + } + } + + return this; + } + /** + * @function LevelRenderer.Storage.prototype.addHover + * @description 添加高亮层数据。 + * @param {LevelRenderer.Shape} shape - 图形。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "addHover", + value: function addHover(shape) { + shape.updateNeedTransform(); + + this._hoverElements.push(shape); + + return this; + } + /** + * @function LevelRenderer.Storage.prototype.delHover + * @description 清空高亮层数据。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "delHover", + value: function delHover() { + this._hoverElements = []; + return this; + } + /** + * @function LevelRenderer.Storage.prototype.hasHoverShape + * @description 是否有图形在高亮层里。 + * @return {boolean} 是否有图形在高亮层里。 + */ + + }, { + key: "hasHoverShape", + value: function hasHoverShape() { + return this._hoverElements.length > 0; + } + /** + * @function LevelRenderer.Storage.prototype.addRoot + * @description 添加图形(Shape)或者组(Group)到根节点。 + * + * @param {(LevelRenderer.Shape/LevelRenderer.Group)} el - 图形。 + * + */ + + }, { + key: "addRoot", + value: function addRoot(el) { + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToMap(el); + + this._roots.push(el); + } + /** + * @function LevelRenderer.Storage.prototype.delRoot + * @description 删除指定的图形(Shape)或者组(Group)。 + * + * @param {Array.} elId - 删除图形(Shape)或者组(Group)的 id 数组。如果为空清空整个Storage。 + * + */ + + }, { + key: "delRoot", + value: function delRoot(elId) { + if (typeof elId == 'undefined') { + // 不指定elId清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._elements = {}; + this._hoverElements = []; + this._roots = []; + return; + } + + if (elId instanceof Array) { + var elIdLen = elId.length; + + for (var _i4 = 0; _i4 < elIdLen; _i4++) { + this.delRoot(elId[_i4]); + } + + return; + } + + var el; + + if (typeof elId == 'string') { + el = this._elements[elId]; + } else { + el = elId; + } + + var idx = new Util_Util().indexOf(this._roots, el); + + if (idx >= 0) { + this.delFromMap(el.id); + + this._roots.splice(idx, 1); + + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + } + /** + * @function LevelRenderer.Storage.prototype.addToMap + * @description 添加图形到 map。 + * + * @param {LevelRenderer.Shape} el - 图形。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "addToMap", + value: function addToMap(el) { + if (el instanceof Group) { + el._storage = this; + } + + el.modSelf(); + this._elements[el.id] = el; + return this; + } + /** + * @function LevelRenderer.Storage.prototype.get + * @description 获取指定图形。 + * + * @param {string} elId - 图形 id。 + * @return {LevelRenderer.Shape} 图形。 + */ + + }, { + key: "get", + value: function get(elId) { + return this._elements[elId]; + } + /** + * @function LevelRenderer.Storage.prototype.delFromMap + * @description 从 map 中删除指定图形。 + * + * @param {string} elId - 图形id。 + * @return {LevelRenderer.Storage} this。 + */ + + }, { + key: "delFromMap", + value: function delFromMap(elId) { + var el = this._elements[elId]; + + if (el) { + delete this._elements[elId]; + + if (el instanceof Group) { + el._storage = null; + } + } + + return this; + } + /** + * @function LevelRenderer.Storage.prototype.dispose + * @description 清空并且释放 Storage。 + */ + + }, { + key: "dispose", + value: function dispose() { + this._elements = null; // this._renderList = null; + + this._roots = null; + this._hoverElements = null; + } + }], [{ + key: "shapeCompareFunc", + value: function shapeCompareFunc(a, b) { + if (a.zlevel == b.zlevel) { + if (a.z == b.z) { + return a.__renderidx - b.__renderidx; + } + + return a.z - b.z; + } + + return a.zlevel - b.zlevel; + } + }]); + + return Storage; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Painter.js +function Painter_typeof(obj) { "@babel/helpers - typeof"; return Painter_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Painter_typeof(obj); } + +function Painter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Painter_setPrototypeOf(subClass, superClass); } + +function Painter_setPrototypeOf(o, p) { Painter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Painter_setPrototypeOf(o, p); } + +function Painter_createSuper(Derived) { var hasNativeReflectConstruct = Painter_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Painter_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Painter_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Painter_possibleConstructorReturn(this, result); }; } + +function Painter_possibleConstructorReturn(self, call) { if (call && (Painter_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Painter_assertThisInitialized(self); } + +function Painter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Painter_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Painter_getPrototypeOf(o) { Painter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Painter_getPrototypeOf(o); } + +function Painter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Painter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Painter_createClass(Constructor, protoProps, staticProps) { if (protoProps) Painter_defineProperties(Constructor.prototype, protoProps); if (staticProps) Painter_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @private + * @class LevelRenderer.Painter + * @category Visualization Theme + * @classdesc Painter 绘图模块。 + * @param {HTMLElement} root - 绘图区域(DIV)。 + * @param {LevelRenderer.Storage} storage - Storage 实例。 + */ + +var Painter = /*#__PURE__*/function () { + function Painter(root, storage) { + Painter_classCallCheck(this, Painter); + + /** + * @member {HTMLElement} LevelRenderer.Painter.prototype.root + * @description 绘图容器。 + * + */ + this.root = root; + /** + * @member {Array} LevelRenderer.Painter.prototype.storage + * @description 图形仓库。 + * + */ + + this.storage = storage; + /** + * @member {HTMLElement} LevelRenderer.Painter.prototype._domRoot + * @description 容器根 dom 对象。 + * + */ + + this._domRoot = null; + /** + * @member {Object} LevelRenderer.Painter.prototype._layers + * @description 绘制层对象。 + * + */ + + this._layers = {}; + /** + * @member {Array} LevelRenderer.Painter.prototype._zlevelList + * @description 层列表。 + * + */ + + this._zlevelList = []; + /** + * @member {Object} LevelRenderer.Painter.prototype._layerConfig + * @description 绘制层配置对象。 + * + */ + + this._layerConfig = {}; + /** + * @member {Object} LevelRenderer.Painter.prototype._bgDom + * @description 背景层 Canvas (Dom)。 + * + */ + + this._bgDom = null; + /** + * @member {function} LevelRenderer.Painter.prototype.shapeToImage + * @description 形状转图像函数。 + * + */ + + this.shapeToImage = null; // retina 屏幕优化 + + Painter.devicePixelRatio = Math.max(window.devicePixelRatio || 1, 1); + this.CLASS_NAME = "SuperMap.LevelRenderer.Painter"; + this.root.innerHTML = ''; + this._width = this._getWidth(); // 宽,缓存记录 + + this._height = this._getHeight(); // 高,缓存记录 + + var domRoot = document.createElement('div'); + this._domRoot = domRoot; // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + + domRoot.style.position = 'relative'; + domRoot.style.overflow = 'hidden'; + domRoot.style.width = this._width + 'px'; + domRoot.style.height = this._height + 'px'; + this.root.appendChild(domRoot); + this.shapeToImage = this._createShapeToImageProcessor(); // 创建各层canvas + // 背景 + //this._bgDom = Painter.createDom('bg', 'div', this); + + this._bgDom = Painter.createDom(Util.createUniqueID("SuperMap.Theme_background_"), 'div', this); + domRoot.appendChild(this._bgDom); + this._bgDom.onselectstart = returnFalse; + this._bgDom.style['-webkit-user-select'] = 'none'; + this._bgDom.style['user-select'] = 'none'; + this._bgDom.style['-webkit-touch-callout'] = 'none'; // 高亮 + //var hoverLayer = new PaintLayer('_hoverLayer_', this); + + var hoverLayer = new PaintLayer(Util.createUniqueID("_highLightLayer_"), this); + this._layers['hover'] = hoverLayer; + domRoot.appendChild(hoverLayer.dom); + hoverLayer.initContext(); + hoverLayer.dom.onselectstart = returnFalse; + hoverLayer.dom.style['-webkit-user-select'] = 'none'; + hoverLayer.dom.style['user-select'] = 'none'; + hoverLayer.dom.style['-webkit-touch-callout'] = 'none'; + var me = this; + + this.updatePainter = function (shapeList, callback) { + me.refreshShapes(shapeList, callback); + }; // 返回false的方法,用于避免页面被选中 + + + function returnFalse() { + return false; + } + /* eslint-disable */ + // 什么都不干的空方法 + + + function doNothing() {//NOSONAR + } + /* eslint-enable */ + + } + /** + * @function LevelRenderer.Painter.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Painter_createClass(Painter, [{ + key: "destroy", + value: function destroy() { + this.dispose(); + this._zlevelList = null; + this._layerConfig = null; + this._bgDom = null; + this.shapeToImage = null; + } + /** + * @function LevelRenderer.Painter.prototype.render + * @description 渲染。首次绘图,创建各种 dom 和 context。 + * + * @param {function} callback - 绘画结束后的回调函数。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "render", + value: function render(callback) { + // TODO + this.refresh(callback, true); + return this; + } + /** + * @function LevelRenderer.Painter.prototype.refresh + * @description 刷新。 + * + * @param {function} callback - 刷新结束后的回调函数。 + * @param {boolean} paintAll - 强制绘制所有 shape。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "refresh", + value: function refresh(callback, paintAll) { + var list = this.storage.getShapeList(true); + + this._paintList(list, paintAll); + + if (typeof callback == 'function') { + callback(); + } + + return this; + } + /** + * Method: _paintList + * 按列表绘制图形。 + */ + + }, { + key: "_paintList", + value: function _paintList(list, paintAll) { + if (typeof paintAll == 'undefined') { + paintAll = false; + } + + this._updateLayerStatus(list); + + var currentLayer; + var currentZLevel; + var ctx; + + for (var id in this._layers) { + if (id !== 'hover') { + this._layers[id].unusedCount++; + + this._layers[id].updateTransform(); + } + } + + var invTransform = []; + + for (var i = 0, l = list.length; i < l; i++) { + var shape = list[i]; + + if (currentZLevel !== shape.zlevel) { + if (currentLayer && currentLayer.needTransform) { + ctx.restore(); + } + + currentLayer = this.getLayer(shape.zlevel); + ctx = currentLayer.ctx; + currentZLevel = shape.zlevel; // Reset the count + + currentLayer.unusedCount = 0; + + if (currentLayer.dirty || paintAll) { + currentLayer.clear(); + } + + if (currentLayer.needTransform) { + ctx.save(); + currentLayer.setTransform(ctx); + } + } // Start group clipping + + + if (ctx && shape.__startClip) { + var clipShape = shape.__startClip; + ctx.save(); // Set transform + + if (clipShape.needTransform) { + var m = clipShape.transform; + SUtil_SUtil.Util_matrix.invert(invTransform, m); + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + + ctx.beginPath(); + clipShape.buildPath(ctx, clipShape.style); + ctx.clip(); // Transform back + + if (clipShape.needTransform) { + var _m = invTransform; + ctx.transform(_m[0], _m[1], _m[2], _m[3], _m[4], _m[5]); + } + } + + if ((currentLayer && currentLayer.dirty || paintAll) && !shape.invisible) { + if (!shape.onbrush || shape.onbrush && !shape.onbrush(ctx, false)) { + if (Config.catchBrushException) { + try { + shape.brush(ctx, false, this.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log(error, 'brush error of ' + shape.type, shape); + } + } else { + shape.brush(ctx, false, this.updatePainter); + } + } + } // Stop group clipping + + + if (ctx && shape.__stopClip) { + ctx.restore(); + } + + shape.__dirty = false; + } + + if (ctx && currentLayer && currentLayer.needTransform) { + ctx.restore(); + } + + for (var _id in this._layers) { + if (_id !== 'hover') { + var layer = this._layers[_id]; + layer.dirty = false; // 删除过期的层 + // PENDING + // if (layer.unusedCount >= 500) { + // this.delLayer(id); + // } + + if (layer.unusedCount == 1) { + layer.clear(); + } + } + } + } + /** + * @function LevelRenderer.Painter.prototype.getLayer + * @description 获取 zlevel 所在层,如果不存在则会创建一个新的层。 + * + * @param {number} zlevel - zlevel。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "getLayer", + value: function getLayer(zlevel) { + // Change draw layer + var currentLayer = this._layers[zlevel]; + + if (!currentLayer) { + var len = this._zlevelList.length; + var prevLayer = null; + var i = -1; + + if (len > 0 && zlevel > this._zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if (this._zlevelList[i] < zlevel && this._zlevelList[i + 1] > zlevel) { + break; + } + } + + prevLayer = this._layers[this._zlevelList[i]]; + } + + this._zlevelList.splice(i + 1, 0, zlevel); // Create a new layer + //currentLayer = new PaintLayer(zlevel, this); + + + currentLayer = new PaintLayer(Util.createUniqueID("_levelLayer_" + zlevel), this); + var prevDom = prevLayer ? prevLayer.dom : this._bgDom; + + if (prevDom.nextSibling) { + prevDom.parentNode.insertBefore(currentLayer.dom, prevDom.nextSibling); + } else { + prevDom.parentNode.appendChild(currentLayer.dom); + } + + currentLayer.initContext(); + this._layers[zlevel] = currentLayer; + + if (this._layerConfig[zlevel]) { + new Util_Util().merge(currentLayer, this._layerConfig[zlevel], true); + } + + currentLayer.updateTransform(); + } + + return currentLayer; + } + /** + * @function LevelRenderer.Painter.prototype.getLayers + * @description 获取所有已创建的层。 + * @return {Array.} 已创建的层 + */ + + }, { + key: "getLayers", + value: function getLayers() { + return this._layers; + } + /** + * Method: _updateLayerStatus + * 更新绘制层状态。 + */ + + }, { + key: "_updateLayerStatus", + value: function _updateLayerStatus(list) { + var layers = this._layers; + var elCounts = {}; + + for (var z in layers) { + if (z !== 'hover') { + elCounts[z] = layers[z].elCount; + layers[z].elCount = 0; + } + } + + for (var i = 0; i < list.length; i++) { + var shape = list[i]; + var zlevel = shape.zlevel; + var layer = layers[zlevel]; + + if (layer) { + layer.elCount++; // 已经被标记为需要刷新 + + if (layer.dirty) { + continue; + } + + layer.dirty = shape.__dirty; + } + } // 层中的元素数量有发生变化 + + + for (var _z in layers) { + if (_z !== 'hover') { + if (elCounts[_z] !== layers[_z].elCount) { + layers[_z].dirty = true; + } + } + } + } + /** + * @function LevelRenderer.Painter.prototype.refreshShapes + * @description 更新的图形元素列表。 + * + * @param {number} shapeList - 需要更新的图形元素列表。 + * @param {number} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "refreshShapes", + value: function refreshShapes(shapeList, callback) { + for (var i = 0, l = shapeList.length; i < l; i++) { + var shape = shapeList[i]; + this.storage.mod(shape.id); + } + + this.refresh(callback); + return this; + } + /** + * @function LevelRenderer.Painter.prototype.clear + * @description 清除 hover 层外所有内容。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "clear", + value: function clear() { + for (var k in this._layers) { + if (k == 'hover') { + continue; + } + + this._layers[k].clear(); + } + + return this; + } + /** + * @function LevelRenderer.Painter.prototype.modLayer + * @description 修改指定 zlevel 的绘制参数。 + * + * @param {string} zlevel - zlevel。 + * @param {Object} config - 配置对象。 + * @param {string} [config.clearColor=0] - 每次清空画布的颜色。 + * @param {boolean} [config.motionBlur=false] - 是否开启动态模糊。 + * @param {number} [config.lastFrameAlpha=0.7] - 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显。默认值:0.7。 + * @param {Array.} config.position - 层的平移。 + * @param {Array.} config.rotation - 层的旋转。 + * @param {Array.} config.scale - 层的缩放。 + * @param {boolean} config.zoomable - 层是否支持鼠标缩放操作。默认值:false。 + * @param {boolean} config.panable - 层是否支持鼠标平移操作。默认值:false。 + * + */ + + }, { + key: "modLayer", + value: function modLayer(zlevel, config) { + if (config) { + if (!this._layerConfig[zlevel]) { + this._layerConfig[zlevel] = config; + } else { + new Util_Util().merge(this._layerConfig[zlevel], config, true); + } + + var layer = this._layers[zlevel]; + + if (layer) { + new Util_Util().merge(layer, this._layerConfig[zlevel], true); + } + } + } + /** + * @function LevelRenderer.Painter.prototype.delLayer + * @description 删除指定层。 + * + * @param {string} zlevel - 层所在的 zlevel。 + */ + + }, { + key: "delLayer", + value: function delLayer(zlevel) { + var layer = this._layers[zlevel]; + + if (!layer) { + return; + } // Save config + + + this.modLayer(zlevel, { + position: layer.position, + rotation: layer.rotation, + scale: layer.scale + }); + layer.dom.parentNode.removeChild(layer.dom); + delete this._layers[zlevel]; + + this._zlevelList.splice(new Util_Util().indexOf(this._zlevelList, zlevel), 1); + } + /** + * @function LevelRenderer.Painter.prototype.refreshHover + * @description 刷新 hover 层。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "refreshHover", + value: function refreshHover() { + this.clearHover(); + var list = this.storage.getHoverShapes(true); + + for (var i = 0, l = list.length; i < l; i++) { + this._brushHover(list[i]); + } + + this.storage.delHover(); + return this; + } + /** + * @function LevelRenderer.Painter.prototype.clearHover + * @description 清除 hover 层所有内容。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "clearHover", + value: function clearHover() { + var hover = this._layers.hover; + hover && hover.clear(); + return this; + } + /** + * @function LevelRenderer.Painter.prototype.resize + * @description 区域大小变化后重绘。 + * @return {LevelRenderer.Painter} this。 + */ + + }, { + key: "resize", + value: function resize() { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + + var width = this._getWidth(); + + var height = this._getHeight(); + + domRoot.style.display = ''; // 优化没有实际改变的resize + + if (this._width != width || height != this._height) { + this._width = width; + this._height = height; + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + this._layers[id].resize(width, height); + } + + this.refresh(null, true); + } + + return this; + } + /** + * @function LevelRenderer.Painter.prototype.clearLayer + * @description 清除指定的一个层。 + * @param {number} zLevel - 层。 + */ + + }, { + key: "clearLayer", + value: function clearLayer(zLevel) { + var layer = this._layers[zLevel]; + + if (layer) { + layer.clear(); + } + } + /** + * @function LevelRenderer.Painter.prototype.dispose + * @description 释放。 + * + */ + + }, { + key: "dispose", + value: function dispose() { + this.root.innerHTML = ''; + this.root = null; + this.storage = null; + this._domRoot = null; + this._layers = null; + } + /** + * @function LevelRenderer.Painter.prototype.getDomHover + * @description 获取 Hover 层的 Dom。 + */ + + }, { + key: "getDomHover", + value: function getDomHover() { + return this._layers.hover.dom; + } + /** + * @function LevelRenderer.Painter.prototype.toDataURL + * @description 图像导出。 + * @param {string} type - 图片类型。 + * @param {string} backgroundColor - 背景色。默认值:'#fff'。 + * @param {Object} args + * @return {string} 图片的Base64 url。 + */ + + }, { + key: "toDataURL", + value: function toDataURL(type, backgroundColor, args) { + //var imageDom = Painter.createDom('image', 'canvas', this); + var imageDom = Painter.createDom(Util.createUniqueID("SuperMap.Theme.image_"), 'canvas', this); + + this._bgDom.appendChild(imageDom); + + var ctx = imageDom.getContext('2d'); + Painter.devicePixelRatio != 1 && ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + ctx.fillStyle = backgroundColor || '#fff'; + ctx.rect(0, 0, this._width * Painter.devicePixelRatio, this._height * Painter.devicePixelRatio); + ctx.fill(); + var self = this; // 升序遍历,shape上的zlevel指定绘画图层的z轴层叠 + + this.storage.iterShape(function (shape) { + if (!shape.invisible) { + if (!shape.onbrush // 没有onbrush + // 有onbrush并且调用执行返回false或undefined则继续粉刷 + || shape.onbrush && !shape.onbrush(ctx, false)) { + if (Config.catchBrushException) { + try { + shape.brush(ctx, false, self.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log(error, 'brush error of ' + shape.type, shape); + } + } else { + shape.brush(ctx, false, self.updatePainter); + } + } + } + }, { + normal: 'up', + update: true + }); + var image = imageDom.toDataURL(type, args); + ctx = null; + + this._bgDom.removeChild(imageDom); + + return image; + } + /** + * @function LevelRenderer.Painter.prototype.getWidth + * @description 获取绘图区域宽度。 + * @return {number} 绘图区域宽度。 + */ + + }, { + key: "getWidth", + value: function getWidth() { + return this._width; + } + /** + * @function LevelRenderer.Painter.prototype.getHeight + * @description 获取绘图区域高度。 + * @return {number} 绘图区域高度。 + */ + + }, { + key: "getHeight", + value: function getHeight() { + return this._height; + } + /** + * Method: _getWidth + * + */ + + }, { + key: "_getWidth", + value: function _getWidth() { + var root = this.root; + var stl = root.currentStyle || document.defaultView.getComputedStyle(root); + return ((root.clientWidth || parseInt(stl.width, 10)) - parseInt(stl.paddingLeft, 10) // 请原谅我这比较粗暴 + - parseInt(stl.paddingRight, 10)).toFixed(0) - 0; + } + /** + * Method: _getHeight + * + */ + + }, { + key: "_getHeight", + value: function _getHeight() { + var root = this.root; + var stl = root.currentStyle || document.defaultView.getComputedStyle(root); + return ((root.clientHeight || parseInt(stl.height, 10)) - parseInt(stl.paddingTop, 10) // 请原谅我这比较粗暴 + - parseInt(stl.paddingBottom, 10)).toFixed(0) - 0; + } + /** + * Method: _brushHover + * + */ + + }, { + key: "_brushHover", + value: function _brushHover(shape) { + var ctx = this._layers.hover.ctx; + + if (!shape.onbrush // 没有onbrush + // 有onbrush并且调用执行返回false或undefined则继续粉刷 + || shape.onbrush && !shape.onbrush(ctx, true)) { + var layer = this.getLayer(shape.zlevel); + + if (layer.needTransform) { + ctx.save(); + layer.setTransform(ctx); + } // Retina 优化 + + + if (Config.catchBrushException) { + try { + shape.brush(ctx, true, this.updatePainter); + } catch (error) { + SUtil_SUtil.Util_log(error, 'hoverBrush error of ' + shape.type, shape); + } + } else { + shape.brush(ctx, true, this.updatePainter); + } + + if (layer.needTransform) { + ctx.restore(); + } + } + } + /** + * Method: _shapeToImage + * + */ + + }, { + key: "_shapeToImage", + value: function _shapeToImage(id, shape, width, height, devicePixelRatio) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + var _devicePixelRatio = devicePixelRatio || window.devicePixelRatio || 1; + + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + canvas.setAttribute('width', width * _devicePixelRatio); + canvas.setAttribute('height', height * _devicePixelRatio); + ctx.clearRect(0, 0, width * _devicePixelRatio, height * _devicePixelRatio); + var shapeTransform = { + position: shape.position, + rotation: shape.rotation, + scale: shape.scale + }; + shape.position = [0, 0, 0]; + shape.rotation = 0; + shape.scale = [1, 1]; + + if (shape) { + shape.brush(ctx, false); + } + + var imgShape = new SmicImage({ + id: id, + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (shapeTransform.position != null) { + imgShape.position = shape.position = shapeTransform.position; + } + + if (shapeTransform.rotation != null) { + imgShape.rotation = shape.rotation = shapeTransform.rotation; + } + + if (shapeTransform.scale != null) { + imgShape.scale = shape.scale = shapeTransform.scale; + } + + return imgShape; + } + /** + * Method: _createShapeToImageProcessor + * + */ + + }, { + key: "_createShapeToImageProcessor", + value: function _createShapeToImageProcessor() { + var me = this; + return function (id, e, width, height) { + return me._shapeToImage(id, e, width, height, Painter.devicePixelRatio); + }; + } // SMIC-方法扩展 - start + + /** + * @function LevelRenderer.Painter.prototype.updateHoverLayer + * @description 更新设置显示高亮图层。 + * @param {Array} shapes - 图形数组。 + */ + + }, { + key: "updateHoverLayer", + value: function updateHoverLayer(shapes) { + if (!(shapes instanceof Array)) { + return this; + } //清除高亮 + + + this.clearHover(); + this.storage.delHover(); + + for (var i = 0; i < shapes.length; i++) { + this.storage.addHover(shapes[i]); + + this._brushHover(shapes[i]); + } + } + /** + * @function LevelRenderer.Painter.prototype.createDom + * @description 创建 Dom。 + * + * @param {string} id - Dom id + * @param {string} type - Dom type + * @param {LevelRenderer.Painter} painter - Painter 实例。 + * @return {Object} Dom + */ + + }], [{ + key: "createDom", + value: function createDom(id, type, painter) { + var newDom = document.createElement(type); + var width = painter._width; + var height = painter._height; // 没append呢,请原谅我这样写,清晰~ + + newDom.style.position = 'absolute'; + newDom.style.left = 0; + newDom.style.top = 0; + newDom.style.width = width + 'px'; + newDom.style.height = height + 'px'; + newDom.setAttribute('width', width * Painter.devicePixelRatio); + newDom.setAttribute('height', height * Painter.devicePixelRatio); // id不作为索引用,避免可能造成的重名,定义为私有属性 + //newDom.setAttribute('data-zr-dom-id', id); + + newDom.setAttribute('id', id); + return newDom; + } + }]); + + return Painter; +}(); +/** + * @private + * @class Painter.Layer + * @classdesc 绘制层类。 + * @extends LevelRenderer.Transformable + */ + +var PaintLayer = /*#__PURE__*/function (_Transformable) { + Painter_inherits(PaintLayer, _Transformable); + + var _super = Painter_createSuper(PaintLayer); + + /** + * @function Painter.Layer.constructor + * @description 构造函数。 + * + * @param {string} id - id。 + * @param {LevelRenderer.Painter} painter - Painter 实例。 + * + */ + function PaintLayer(id, painter) { + var _this; + + Painter_classCallCheck(this, PaintLayer); + + _this = _super.call(this, id, painter); + /** + * @member {Object} Painter.Layer.prototype.dom + * @description dom。 + */ + + _this.dom = null; + /** + * @member {Object} Painter.Layer.prototype.domBack + * @description domBack。 + */ + + _this.domBack = null; + /** + * @member {Object} Painter.Layer.prototype.ctxBack + * @description ctxBack。 + */ + + _this.ctxBack = null; + /** + * @member {LevelRenderer.Painter} Painter.Layer.prototype.painter + * @description painter。 + */ + + _this.painter = painter; + /** + * @member {number} Painter.Layer.prototype.unusedCount + * @description unusedCount。 + */ + + _this.unusedCount = 0; + /** + * @member {Object} Painter.Layer.prototype.config + * @description config。 + */ + + _this.config = null; + /** + * @member {boolean} Painter.Layer.prototype.dirty + * @description dirty。 + */ + + _this.dirty = true; + /** + * @member {number} Painter.Layer.prototype.elCount + * @description elCount。 + */ + + _this.elCount = 0; // Configs + + /** + * @member {string} Painter.Layer.prototype.clearColor + * @description 每次清空画布的颜色。默认值:0; + */ + + _this.clearColor = 0; + /** + * @member {boolean} Painter.Layer.prototype.motionBlur + * @description 是否开启动态模糊。默认值:false; + */ + + _this.motionBlur = false; + /** + * @member {number} Painter.Layer.prototype.lastFrameAlpha + * @description 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + + _this.lastFrameAlpha = 0.7; + /** + * @member {boolean} Painter.Layer.prototype.zoomable + * @description 层是否支持鼠标平移操作。默认值:false; + */ + + _this.zoomable = false; + /** + * @member {boolean} Painter.Layer.prototype.panable + * @description 层是否支持鼠标缩放操作。默认值:false; + */ + + _this.panable = false; + /** + * @member {number} Painter.Layer.prototype.maxZoom + * @description maxZoom。默认值:Infinity。 + */ + + _this.maxZoom = Infinity; + /** + * @member {number} Painter.Layer.prototype.minZoom + * @description minZoom。默认值:0。 + */ + + _this.minZoom = 0; + /** + * @member {number} Painter.Layer.prototype.ctx + * @description Canvas 上下文。 + */ + + _this.ctx = null; + _this.dom = Painter.createDom(Util.createUniqueID("SuperMap.Theme" + id), 'canvas', painter); + _this.dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + + _this.dom.style['-webkit-user-select'] = 'none'; + _this.dom.style['user-select'] = 'none'; + _this.dom.style['-webkit-touch-callout'] = 'none'; // Function + // 返回false的方法,用于避免页面被选中 + + function returnFalse() { + return false; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Painter.Layer"; + return _this; + } + /** + * @function Painter.Layer.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Painter_createClass(PaintLayer, [{ + key: "destroy", + value: function destroy() { + this.dom = null; + this.domBack = null; + this.ctxBack = null; + this.painter = null; + this.unusedCount = null; + this.config = null; + this.dirty = null; + this.elCount = null; + this.clearColor = null; + this.motionBlur = null; + this.lastFrameAlpha = null; + this.zoomable = null; + this.panable = null; + this.maxZoom = null; + this.minZoom = null; + this.ctx = null; + Transformable.destroy.apply(this, arguments); + } + /** + * @function Painter.Layer.prototype.initContext + * @description 初始化 Canvan 2D 上下文。 + */ + + }, { + key: "initContext", + value: function initContext() { + this.ctx = this.dom.getContext('2d'); + + if (Painter.devicePixelRatio != 1) { + this.ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + /** + * @function Painter.Layer.prototype.createBackBuffer + * @description 创建备份缓冲。 + */ + + }, { + key: "createBackBuffer", + value: function createBackBuffer() { + this.domBack = Painter.createDom(Util.createUniqueID("SuperMap.Theme.back-" + this.id), 'canvas', this.painter); + this.ctxBack = this.domBack.getContext('2d'); + + if (Painter.devicePixelRatio != 1) { + this.ctxBack.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + /** + * @function Painter.Layer.prototype.resize + * @description 改变大小。 + * + * @param {number} width - 宽。 + * @param {number} height - 高。 + */ + + }, { + key: "resize", + value: function resize(width, height) { + this.dom.style.width = width + 'px'; + this.dom.style.height = height + 'px'; + this.dom.setAttribute('width', width * Painter.devicePixelRatio); + this.dom.setAttribute('height', height * Painter.devicePixelRatio); + + if (Painter.devicePixelRatio != 1) { + this.ctx.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + + if (this.domBack) { + this.domBack.setAttribute('width', width * Painter.devicePixelRatio); + this.domBack.setAttribute('height', height * Painter.devicePixelRatio); + + if (Painter.devicePixelRatio != 1) { + this.ctxBack.scale(Painter.devicePixelRatio, Painter.devicePixelRatio); + } + } + } + /** + * @function Painter.Layer.prototype.clear + * @description 清空该层画布。 + */ + + }, { + key: "clear", + value: function clear() { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + var haveClearColor = this.clearColor; + var haveMotionBLur = this.motionBlur; + var lastFrameAlpha = this.lastFrameAlpha; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / Painter.devicePixelRatio, height / Painter.devicePixelRatio); + } + + if (haveClearColor) { + ctx.save(); + ctx.fillStyle = this.config.clearColor; + ctx.fillRect(0, 0, width / Painter.devicePixelRatio, height / Painter.devicePixelRatio); + ctx.restore(); + } else { + ctx.clearRect(0, 0, width / Painter.devicePixelRatio, height / Painter.devicePixelRatio); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, 0, 0, width / Painter.devicePixelRatio, height / Painter.devicePixelRatio); + ctx.restore(); + } + } + }]); + + return PaintLayer; +}(Transformable); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Handler.js +function Handler_typeof(obj) { "@babel/helpers - typeof"; return Handler_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Handler_typeof(obj); } + +function Handler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Handler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Handler_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handler_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handler_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Handler_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Handler_setPrototypeOf(subClass, superClass); } + +function Handler_setPrototypeOf(o, p) { Handler_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Handler_setPrototypeOf(o, p); } + +function Handler_createSuper(Derived) { var hasNativeReflectConstruct = Handler_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Handler_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Handler_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Handler_possibleConstructorReturn(this, result); }; } + +function Handler_possibleConstructorReturn(self, call) { if (call && (Handler_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Handler_assertThisInitialized(self); } + +function Handler_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Handler_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Handler_getPrototypeOf(o) { Handler_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Handler_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @private + * @class LevelRenderer.Handler + * @category Visualization Theme + * @classdesc Handler控制模块。 + * @extends {LevelRenderer.Eventful} + * @param {HTMLElement} root - 绘图区域。 + * @param {LevelRenderer.Storage} storage - Storage 实例。 + * @param {LevelRenderer.Painter} painter - Painter 实例。 + */ + +var Handler = /*#__PURE__*/function (_Eventful) { + Handler_inherits(Handler, _Eventful); + + var _super = Handler_createSuper(Handler); + + function Handler(root, storage, painter) { + var _this; + + Handler_classCallCheck(this, Handler); + + _this = _super.call(this, root, storage, painter); + /** + * @member {HTMLElement} LevelRenderer.Handler.prototype.root + * @description 绘图区域 + */ + + _this.root = root; + /** + * @member {LevelRenderer.Storage} LevelRenderer.Handler.prototype.storage + * @description Storage 实例 + */ + + _this.storage = storage; + /** + * @member {LevelRenderer.Painter} LevelRenderer.Handler.prototype.Painter + * @description Painter 实例 + */ + + _this.painter = painter; + /** + * @member {number} [LevelRenderer.Handler.prototype._lastX=0] + * @description 上一次鼠标位置x坐标值 + */ + + _this._lastX = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._lastY=0] + * @description 上一次鼠标位置y坐标值 + */ + + _this._lastY = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._mouseX=0] + * @description 当前鼠标位置x坐标值 + */ + + _this._mouseX = 0; + /** + * @member {number} [LevelRenderer.Handler.prototype._mouseY=0] + * @description 当前鼠标位置y坐标值 + */ + + _this._mouseY = 0; + /** + * @member {function} LevelRenderer.Handler.prototype._findHover + * @description 查找 Hover 图形 + */ + + _this._findHover = null; + /** + * @member {Object} LevelRenderer.Handler.prototype._domHover + * @description 高亮 DOM + */ + + _this._domHover = null; // 各种事件标识的私有变量 + // this._hasfound = false; // 是否找到 hover 图形元素 + // this._lastHover = null; // 最后一个 hover 图形元素 + // this._mouseDownTarget = null; + // this._draggingTarget = null; // 当前被拖拽的图形元素 + // this._isMouseDown = false; + // this._isDragging = false; + // this._lastMouseDownMoment; + // this._lastTouchMoment; + // this._lastDownButton; + + _this._findHover = bind3Arg(findHover, Handler_assertThisInitialized(_this)); + _this._domHover = painter.getDomHover(); + _this.CLASS_NAME = "SuperMap.LevelRenderer.Handler"; + var domHandlers = { + /** + * Method: resize + * 窗口大小改变响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + resize: function resize(event) { + event = event || window.event; + this._lastHover = null; + this._isMouseDown = 0; // 分发SuperMap.LevelRenderer.Config.EVENT.RESIZE事件,global + + this.dispatch(Config.EVENT.RESIZE, event); + }, + + /** + * Method: click + * 点击响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + click: function click(event) { + event = this._zrenderEventFixed(event); // 分发SuperMap.LevelRenderer.Config.EVENT.CLICK事件 + + var _lastHover = this._lastHover; + + if (_lastHover && _lastHover.clickable || !_lastHover) { + // 判断没有发生拖拽才触发click事件 + if (this._clickThreshold < 10) { + this._dispatchAgency(_lastHover, Config.EVENT.CLICK, event); + } + } + + this._mousemoveHandler(event); + }, + + /** + * Method: dblclick + * 双击响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + dblclick: function dblclick(event) { + event = event || window.event; + event = this._zrenderEventFixed(event); // 分发SuperMap.LevelRenderer.Config.EVENT.DBLCLICK事件 + + var _lastHover = this._lastHover; + + if (_lastHover && _lastHover.clickable || !_lastHover) { + // 判断没有发生拖拽才触发dblclick事件 + if (this._clickThreshold < 5) { + this._dispatchAgency(_lastHover, Config.EVENT.DBLCLICK, event); + } + } + + this._mousemoveHandler(event); + }, + + /** + * Method: mousewheel + * 鼠标滚轮响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousewheel: function mousewheel(event) { + event = this._zrenderEventFixed(event); // http://www.sitepoint.com/html5-javascript-mouse-wheel/ + // https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/mousewheel + + var delta = event.wheelDelta // Webkit + || -event.detail; // Firefox + + var scale = delta > 0 ? 1.1 : 1 / 1.1; + var layers = this.painter.getLayers(); + var needsRefresh = false; + + for (var z in layers) { + if (z !== 'hover') { + var layer = layers[z]; + var pos = layer.position; + + if (layer.zoomable) { + layer.__zoom = layer.__zoom || 1; + var newZoom = layer.__zoom; + newZoom *= scale; + newZoom = Math.max(Math.min(layer.maxZoom, newZoom), layer.minZoom); + scale = newZoom / layer.__zoom; + layer.__zoom = newZoom; // Keep the mouse center when scaling + + pos[0] -= (this._mouseX - pos[0]) * (scale - 1); + pos[1] -= (this._mouseY - pos[1]) * (scale - 1); + layer.scale[0] *= scale; + layer.scale[1] *= scale; + layer.dirty = true; + needsRefresh = true; + } + } + } + + if (needsRefresh) { + this.painter.refresh(); + } // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEWHEEL事件 + + + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEWHEEL, event); + + this._mousemoveHandler(event); + }, + + /** + * Method: mousemove + * 鼠标(手指)移动响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousemove: function mousemove(event) { + // 拖拽不触发click事件 + this._clickThreshold++; + event = this._zrenderEventFixed(event); + this._lastX = this._mouseX; + this._lastY = this._mouseY; + this._mouseX = SUtil_SUtil.Util_event.getX(event); + this._mouseY = SUtil_SUtil.Util_event.getY(event); + var dx = this._mouseX - this._lastX; + var dy = this._mouseY - this._lastY; // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGSTART事件 + // 避免手抖点击误认为拖拽 + // if (this._mouseX - this._lastX > 1 || this._mouseY - this._lastY > 1) { + + this._processDragStart(event); // } + + + this._hasfound = 0; + this._event = event; + + this._iterateAndFindHover(); // 找到的在迭代函数里做了处理,没找到得在迭代完后处理 + + + if (!this._hasfound) { + // 过滤首次拖拽产生的mouseout和dragLeave + if (!this._draggingTarget || this._lastHover && this._lastHover != this._draggingTarget) { + // 可能出现SuperMap.LevelRenderer.Config.EVENT.MOUSEOUT事件 + this._processOutShape(event); // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + + + this._processDragLeave(event); + } + + this._lastHover = null; + this.storage.delHover(); + this.painter.clearHover(); + } // set cursor for root element + + + var cursor = ''; // 如果存在拖拽中元素,被拖拽的图形元素最后addHover + + if (this._draggingTarget) { + this.storage.drift(this._draggingTarget.id, dx, dy); + + this._draggingTarget.modSelf(); + + this.storage.addHover(this._draggingTarget); + } else if (this._isMouseDown) { + // Layer dragging + var layers = this.painter.getLayers(); + var needsRefresh = false; + + for (var z in layers) { + if (z !== 'hover') { + var layer = layers[z]; + + if (layer.panable) { + // PENDING + cursor = 'move'; // Keep the mouse center when scaling + + layer.position[0] += dx; + layer.position[1] += dy; + needsRefresh = true; + layer.dirty = true; + } + } + } + + if (needsRefresh) { + this.painter.refresh(); + } + } + + if (this._draggingTarget || this._hasfound && this._lastHover.draggable) { + cursor = 'move'; + } else if (this._hasfound && this._lastHover.clickable) { + cursor = 'pointer'; + } + + this.root.style.cursor = cursor; // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEMOVE事件 + + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEMOVE, event); + + if (this._draggingTarget || this._hasfound || this.storage.hasHoverShape()) { + this.painter.refreshHover(); + } + }, + + /** + * Method: mouseout + * 鼠标(手指)离开响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mouseout: function mouseout(event) { + event = this._zrenderEventFixed(event); + var element = event.toElement || event.relatedTarget; + + if (element != this.root) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element == this.root) { + this._mousemoveHandler(event); + + return; + } + + element = element.parentNode; + } + } + + event.zrenderX = this._lastX; + event.zrenderY = this._lastY; + this.root.style.cursor = ''; + this._isMouseDown = 0; + + this._processOutShape(event); + + this._processDrop(event); + + this._processDragEnd(event); + + this.painter.refreshHover(); + this.dispatch(Config.EVENT.GLOBALOUT, event); + }, + + /** + * Method: mousedown + * 鼠标(手指)按下响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mousedown: function mousedown(event) { + // 重置 clickThreshold + this._clickThreshold = 0; + + if (this._lastDownButton == 2) { + this._lastDownButton = event.button; + this._mouseDownTarget = null; // 仅作为关闭右键菜单使用 + + return; + } + + this._lastMouseDownMoment = new Date(); + event = this._zrenderEventFixed(event); + this._isMouseDown = 1; // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEDOWN事件 + + this._mouseDownTarget = this._lastHover; + + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEDOWN, event); + + this._lastDownButton = event.button; + }, + + /** + * Method: mouseup + * 鼠标(手指)抬起响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + mouseup: function mouseup(event) { + event = this._zrenderEventFixed(event); + this.root.style.cursor = ''; + this._isMouseDown = 0; + this._mouseDownTarget = null; // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEUP事件 + + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEUP, event); + + this._processDrop(event); + + this._processDragEnd(event); + }, + + /** + * Method: touchstart + * Touch 开始响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchstart: function touchstart(event) { + // SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + event = this._zrenderEventFixed(event, true); + this._lastTouchMoment = new Date(); // 平板补充一次findHover + + this._mobildFindFixed(event); + + this._mousedownHandler(event); + }, + + /** + * Method: touchmove + * Touch 移动响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchmove: function touchmove(event) { + event = this._zrenderEventFixed(event, true); + + this._mousemoveHandler(event); + + if (this._isDragging) { + SUtil_SUtil.Util_event.stop(event); // 阻止浏览器默认事件,重要 + } + }, + + /** + * Method: touchend + * Touch 结束响应函数。 + * + * Parameters: + * event - {Event} event。 + * + */ + touchend: function touchend(event) { + // SUtil.Util_event.stop(event);// 阻止浏览器默认事件,重要 + event = this._zrenderEventFixed(event, true); + + this._mouseupHandler(event); + + var now = new Date(); + + if (now - this._lastTouchMoment < Config.EVENT.touchClickDelay) { + this._mobildFindFixed(event); + + this._clickHandler(event); + + if (now - this._lastClickMoment < Config.EVENT.touchClickDelay / 2) { + this._dblclickHandler(event); + + if (this._lastHover && this._lastHover.clickable) { + SUtil_SUtil.Util_event.stop(event); // 阻止浏览器默认事件,重要 + } + } + + this._lastClickMoment = now; + } + + this.painter.clearHover(); + } + }; + initDomHandler(Handler_assertThisInitialized(_this)); // 初始化,事件绑定,支持的所有事件都由如下原生事件计算得来 + + if (window.addEventListener) { + window.addEventListener('resize', _this._resizeHandler); + + if (SUtil_SUtil.Util_env.os.tablet || SUtil_SUtil.Util_env.os.phone) { + // mobile支持 + root.addEventListener('touchstart', _this._touchstartHandler); + root.addEventListener('touchmove', _this._touchmoveHandler); + root.addEventListener('touchend', _this._touchendHandler); + } else { + // mobile的click/move/up/down自己模拟 + root.addEventListener('click', _this._clickHandler); + root.addEventListener('dblclick', _this._dblclickHandler); + root.addEventListener('mousewheel', _this._mousewheelHandler); + root.addEventListener('mousemove', _this._mousemoveHandler); + root.addEventListener('mousedown', _this._mousedownHandler); + root.addEventListener('mouseup', _this._mouseupHandler); + } + + root.addEventListener('DOMMouseScroll', _this._mousewheelHandler); + root.addEventListener('mouseout', _this._mouseoutHandler); + } else { + window.attachEvent('onresize', _this._resizeHandler); + root.attachEvent('onclick', _this._clickHandler); //root.attachEvent('ondblclick ', this._dblclickHandler); + + root.ondblclick = _this._dblclickHandler; + root.attachEvent('onmousewheel', _this._mousewheelHandler); + root.attachEvent('onmousemove', _this._mousemoveHandler); + root.attachEvent('onmouseout', _this._mouseoutHandler); + root.attachEvent('onmousedown', _this._mousedownHandler); + root.attachEvent('onmouseup', _this._mouseupHandler); + } // 辅助函数 start + + /** + * Method: bind1Arg + * bind 一个参数的 function。 + * + * Parameters: + * handler - {function} 要 bind 的 function。 + * context - {Object} 运行时 this 环境。 + * + * Returns: + * {function} + */ + + + function bind1Arg(handler, context) { + return function (e) { + return handler.call(context, e); + }; + } + /* + // bind 两个参数的 function + function bind2Arg(handler, context) { + return function (arg1, arg2) { + return handler.call(context, arg1, arg2); + }; + } + */ + // bind 三个参数的 function + + + function bind3Arg(handler, context) { + return function (arg1, arg2, arg3) { + return handler.call(context, arg1, arg2, arg3); + }; + } + /** + * Method: initDomHandler + * 为控制类实例初始化 dom 事件处理函数。 + * + * Parameters: + * instance - {} 控制类实例 。 + * + * Returns: + * {function} + */ + + + function initDomHandler(instance) { + var domHandlerNames = ['resize', 'click', 'dblclick', 'mousewheel', 'mousemove', 'mouseout', 'mouseup', 'mousedown', 'touchstart', 'touchend', 'touchmove']; + var len = domHandlerNames.length; + + while (len--) { + var name = domHandlerNames[len]; + instance['_' + name + 'Handler'] = bind1Arg(domHandlers[name], instance); + } + } + /** + * Method: findHover + * 迭代函数,查找 hover 到的图形元素并即时做些事件分发。 + * + * Parameters: + * shape - {Object} 图形。 + * x - {number} 鼠标 x。 + * y - {number} 鼠标 y。 + * + * Returns: + * {boolean} 是否找到图形。 + * + */ + + + function findHover(shape, x, y) { + var me = this; + + if (me._draggingTarget && me._draggingTarget.id == shape.id // 迭代到当前拖拽的图形上 + || shape.isSilent() // 打酱油的路过,啥都不响应的shape~ + ) { + return false; + } + + var event = me._event; + + if (shape.isCover(x, y)) { + if (shape.hoverable) { + // SMIC-修改 - start + if (shape.isHoverByRefDataID && shape.isHoverByRefDataID === true) { + if (shape.refDataID) { + var fid = shape.refDataID; //me.painter.clearHover(); + //me.storage.delHover(); + + var hoverGroup = null; + + if (shape.refDataHoverGroup) { + hoverGroup = shape.refDataHoverGroup; + } //查找同一个用户数据 feature 的所有图形 + + + var shapeList = me.storage._shapeList; + + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + + if (si.refDataID && fid === si.refDataID) { + if (hoverGroup) { + if (si.refDataHoverGroup && hoverGroup === si.refDataHoverGroup) { + me.storage.addHover(si); + } + } else { + me.storage.addHover(si); + } + } + } + } + } else { + me.storage.addHover(shape); + } //初始代码: + // me.storage.addHover(shape); + // SMIC-修改 - end + + } // 查找是否在 clipShape 中 + + + var p = shape.parent; + + while (p) { + if (p.clipShape && !p.clipShape.isCover(me._mouseX, me._mouseY)) { + // 已经被祖先 clip 掉了 + return false; + } + + p = p.parent; + } + + if (me._lastHover != shape) { + me._processOutShape(event); // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + + + me._processDragLeave(event); + + me._lastHover = shape; // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGENTER事件 + + me._processDragEnter(event); + } + + me._processOverShape(event); // 可能出现SuperMap.LevelRenderer.Config.EVENT.DRAGOVER + + + me._processDragOver(event); + + me._hasfound = 1; + return true; // 找到则中断迭代查找 + } + + return false; + } // 辅助函数 end + + + return _this; + } + /** + * @function LevelRenderer.Handler.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为null。 + */ + + + Handler_createClass(Handler, [{ + key: "destroy", + value: function destroy() { + this.dispose(); + this._lastX = null; + this._lastY = null; + this._mouseX = null; + this._mouseY = null; + this._findHover = null; + Eventful.prototype.destroy.apply(this, arguments); + } + /** + * @function LevelRenderer.Handler.prototype.on + * @description 自定义事件绑定。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {function} handler - 响应函数。 + * @returns {LevelRenderer.Handler} this。 + */ + + }, { + key: "on", + value: function on(eventName, handler) { + this.bind(eventName, handler); + return this; + } + /** + * @function LevelRenderer.Handler.prototype.un + * @description 自定义事件解除绑定。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {function} handler - 响应函数。 + * @returns {LevelRenderer.Handler} this。 + */ + + }, { + key: "un", + value: function un(eventName, handler) { + this.unbind(eventName, handler); + return this; + } + /** + * @function LevelRenderer.Handler.prototype.trigger + * @description 事件触发。 + * @param {string} eventName - 事件名称,resize、hover、drag等。 + * @param {event} eventArgs - dom事件对象。 + */ + + }, { + key: "trigger", + value: function trigger(eventName, eventArgs) { + var EVENT = Config.EVENT; + + switch (eventName) { + case EVENT.RESIZE: + case EVENT.CLICK: + case EVENT.DBLCLICK: + case EVENT.MOUSEWHEEL: + case EVENT.MOUSEMOVE: + case EVENT.MOUSEDOWN: + case EVENT.MOUSEUP: + case EVENT.MOUSEOUT: + this['_' + eventName + 'Handler'](eventArgs); + break; + } + } + /** + * @function LevelRenderer.Handler.prototype.dispose + * @description 释放,解绑所有事件。 + */ + + }, { + key: "dispose", + value: function dispose() { + var root = this.root; + + if (window.removeEventListener) { + window.removeEventListener('resize', this._resizeHandler); + + if (SUtil_SUtil.Util_env.os.tablet || SUtil_SUtil.Util_env.os.phone) { + // mobile支持 + root.removeEventListener('touchstart', this._touchstartHandler); + root.removeEventListener('touchmove', this._touchmoveHandler); + root.removeEventListener('touchend', this._touchendHandler); + } else { + // mobile的click自己模拟 + root.removeEventListener('click', this._clickHandler); + root.removeEventListener('dblclick', this._dblclickHandler); + root.removeEventListener('mousewheel', this._mousewheelHandler); + root.removeEventListener('mousemove', this._mousemoveHandler); + root.removeEventListener('mousedown', this._mousedownHandler); + root.removeEventListener('mouseup', this._mouseupHandler); + } + + root.removeEventListener('DOMMouseScroll', this._mousewheelHandler); + root.removeEventListener('mouseout', this._mouseoutHandler); + } else { + window.detachEvent('onresize', this._resizeHandler); + root.detachEvent('onclick', this._clickHandler); + root.detachEvent('dblclick', this._dblclickHandler); + root.detachEvent('onmousewheel', this._mousewheelHandler); + root.detachEvent('onmousemove', this._mousemoveHandler); + root.detachEvent('onmouseout', this._mouseoutHandler); + root.detachEvent('onmousedown', this._mousedownHandler); + root.detachEvent('onmouseup', this._mouseupHandler); + } + + this.root = null; + this._domHover = null; + this.storage = null; + this.painter = null; + this.un(); + } + /** + * Method: _processDragStart + * 拖拽开始。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDragStart", + value: function _processDragStart(event) { + var _lastHover = this._lastHover; + + if (this._isMouseDown && _lastHover && _lastHover.draggable && !this._draggingTarget && this._mouseDownTarget == _lastHover) { + // 拖拽点击生效时长阀门,某些场景需要降低拖拽敏感度 + if (_lastHover.dragEnableTime && new Date() - this._lastMouseDownMoment < _lastHover.dragEnableTime) { + return; + } + + var _draggingTarget = _lastHover; + this._draggingTarget = _draggingTarget; + this._isDragging = 1; + _draggingTarget.invisible = true; + this.storage.mod(_draggingTarget.id); // 分发 Config.EVENT.DRAGSTART事件 + + this._dispatchAgency(_draggingTarget, Config.EVENT.DRAGSTART, event); + + this.painter.refresh(); + } + } + /** + * Method: _processDragEnter + * 拖拽进入目标元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDragEnter", + value: function _processDragEnter(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGENTER事件 + this._dispatchAgency(this._lastHover, Config.EVENT.DRAGENTER, event, this._draggingTarget); + } + } + /** + * Method: _processDragOver + * 拖拽在目标元素上移动。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDragOver", + value: function _processDragOver(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGOVER事件 + this._dispatchAgency(this._lastHover, Config.EVENT.DRAGOVER, event, this._draggingTarget); + } + } + /** + * Method: _processDragLeave + * 拖拽离开目标元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDragLeave", + value: function _processDragLeave(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGLEAVE事件 + this._dispatchAgency(this._lastHover, Config.EVENT.DRAGLEAVE, event, this._draggingTarget); + } + } + /** + * Method: _processDrop + * 拖拽在目标元素上完成。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDrop", + value: function _processDrop(event) { + if (this._draggingTarget) { + this._draggingTarget.invisible = false; + this.storage.mod(this._draggingTarget.id); + this.painter.refresh(); // 分发SuperMap.LevelRenderer.Config.EVENT.DROP事件 + + this._dispatchAgency(this._lastHover, Config.EVENT.DROP, event, this._draggingTarget); + } + } + /** + * Method: _processDragEnd + * 拖拽结束。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processDragEnd", + value: function _processDragEnd(event) { + if (this._draggingTarget) { + // 分发SuperMap.LevelRenderer.Config.EVENT.DRAGEND事件 + this._dispatchAgency(this._draggingTarget, Config.EVENT.DRAGEND, event); + + this._lastHover = null; + } + + this._isDragging = 0; + this._draggingTarget = null; + } + /** + * Method: _processOverShape + * 鼠标在某个图形元素上移动。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processOverShape", + value: function _processOverShape(event) { + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEOVER事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEOVER, event); + } + /** + * Method: _processOutShape + * 鼠标离开某个图形元素。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_processOutShape", + value: function _processOutShape(event) { + // 分发SuperMap.LevelRenderer.Config.EVENT.MOUSEOUT事件 + this._dispatchAgency(this._lastHover, Config.EVENT.MOUSEOUT, event); + } + /** + * Method: _dispatchAgency + * 鼠标离开某个图形元素。 + * + * Parameters: + * targetShape - {Object} 目标图形元素。 + * eventName - {Object} 事件名称。 + * event - {Object} 事件对象。 + * draggedShape - {Object} 拖拽事件特有,当前被拖拽图形元素。 + * + */ + + }, { + key: "_dispatchAgency", + value: function _dispatchAgency(targetShape, eventName, event, draggedShape) { + var eventHandler = 'on' + eventName; + var eventPacket = { + type: eventName, + event: event, + target: targetShape, + cancelBubble: false + }; + var el = targetShape; + + if (draggedShape) { + eventPacket.dragged = draggedShape; + } + + while (el) { + el[eventHandler] && (eventPacket.cancelBubble = el[eventHandler](eventPacket)); + el.dispatch(eventName, eventPacket); + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (targetShape) { + // 冒泡到顶级 zrender 对象 + if (!eventPacket.cancelBubble) { + this.dispatch(eventName, eventPacket); + } + } else if (!draggedShape) { + // 无hover目标,无拖拽对象,原生事件分发 + this.dispatch(eventName, { + type: eventName, + event: event + }); + } + } + /** + * Method: _iterateAndFindHover + * 迭代寻找 hover shape。 + * + */ + + }, { + key: "_iterateAndFindHover", + value: function _iterateAndFindHover() { + var invTransform = SUtil_SUtil.Util_matrix.create(); + var list = this.storage.getShapeList(); + var currentZLevel; + var currentLayer; + var tmp = [0, 0]; + + for (var i = list.length - 1; i >= 0; i--) { + var shape = list[i]; + + if (currentZLevel !== shape.zlevel) { + currentLayer = this.painter.getLayer(shape.zlevel, currentLayer); + tmp[0] = this._mouseX; + tmp[1] = this._mouseY; + + if (currentLayer.needTransform) { + SUtil_SUtil.Util_matrix.invert(invTransform, currentLayer.transform); + SUtil_SUtil.Util_vector.applyTransform(tmp, tmp, invTransform); + } + } + + if (this._findHover(shape, tmp[0], tmp[1])) { + break; + } + } + } + /** + * Method: _mobildFindFixed + * touch 有指尖错觉,四向尝试,让touch上的点击更好触发事件。 + * + * Parameters: + * event - {Object} 事件对象。 + * + */ + + }, { + key: "_mobildFindFixed", + value: function _mobildFindFixed(event) { + // touch指尖错觉的尝试偏移量配置 + var MOBILE_TOUCH_OFFSETS = [{ + x: 10 + }, { + x: -20 + }, { + x: 10, + y: 10 + }, { + y: -20 + }]; + this._lastHover = null; + this._mouseX = event.zrenderX; + this._mouseY = event.zrenderY; + this._event = event; + + this._iterateAndFindHover(); + + for (var i = 0; !this._lastHover && i < MOBILE_TOUCH_OFFSETS.length; i++) { + var offset = MOBILE_TOUCH_OFFSETS[i]; + offset.x && (this._mouseX += offset.x); + offset.y && (this._mouseX += offset.y); + + this._iterateAndFindHover(); + } + + if (this._lastHover) { + event.zrenderX = this._mouseX; + event.zrenderY = this._mouseY; + } + } + /** + * Method: _zrenderEventFixed + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标 。 + * + * Parameters: + * event - {Object} 事件。 + * isTouch - {boolean} 是否触摸。 + * + */ + + }, { + key: "_zrenderEventFixed", + value: function _zrenderEventFixed(event, isTouch) { + if (event.zrenderFixed) { + return event; + } + + if (!isTouch) { + event = event || window.event; // 进入对象优先~ + + var target = event.toElement || event.relatedTarget || event.srcElement || event.target; + + if (target && target != this._domHover) { + event.zrenderX = (typeof event.offsetX != 'undefined' ? event.offsetX : event.layerX) + target.offsetLeft; + event.zrenderY = (typeof event.offsetY != 'undefined' ? event.offsetY : event.layerY) + target.offsetTop; + } + } else { + var touch = event.type != 'touchend' ? event.targetTouches[0] : event.changedTouches[0]; + + if (touch) { + var rBounding = this.root.getBoundingClientRect(); // touch事件坐标是全屏的~ + + event.zrenderX = touch.clientX - rBounding.left; + event.zrenderY = touch.clientY - rBounding.top; + } + } + + event.zrenderFixed = 1; + return event; + } // SMIC-方法扩展 - start + + /** + * @function LevelRenderer.Handler.prototype.getLastHoverOne + * @description 获取单个高亮图形 + */ + + }, { + key: "getLastHoverOne", + value: function getLastHoverOne() { + if (this._lastHover) { + return this._lastHover; + } + + return null; + } // SMIC-方法扩展 - end + + }]); + + return Handler; +}(Eventful); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Easing.js +function Easing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Easing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Easing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Easing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Easing_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Animation.easing + * @category Visualization Theme + * @classdesc 缓动 + * @private + */ +// 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js +// http://sole.github.io/tween.js/examples/03_graphs.html +var Easing = /*#__PURE__*/function () { + function Easing() { + Easing_classCallCheck(this, Easing); + + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.easing"; + } + /** + * @function LevelRenderer.Animation.easing.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Easing_createClass(Easing, [{ + key: "destroy", + value: function destroy() {} + /** + * @function LevelRenderer.Animation.easing.Linear + * @description 线性缓动 + * @param {number} k - 参数 + * @return {number} 输入值 + */ + + }, { + key: "Linear", + value: function Linear(k) { + return k; + } + /** + * @function LevelRenderer.Animation.easing.QuadraticIn + * @description 二次方的缓动(t^2) + * @param {number} k - 参数 + * @return {number} 二次方的缓动的值 + */ + + }, { + key: "QuadraticIn", + value: function QuadraticIn(k) { + return k * k; + } + /** + * @function LevelRenderer.Animation.easing.QuadraticOut + * @description 返回按二次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按二次方缓动退出的值 + */ + + }, { + key: "QuadraticOut", + value: function QuadraticOut(k) { + return k * (2 - k); + } + /** + * @function LevelRenderer.Animation.easing.QuadraticInOut + * @description 返回按二次方缓动进入和退出的值 + * @param {number} k - 参数 + * @return {number} 按二次方缓动进入和退出的值 + */ + + }, { + key: "QuadraticInOut", + value: function QuadraticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + + return -0.5 * (--k * (k - 2) - 1); + } + /** + * @function LevelRenderer.Animation.easing.CubicIn + * @description 三次方的缓动(t^3) + * @param {number} k - 参数 + * @return {number} 按三次方缓动的值 + */ + + }, { + key: "CubicIn", + value: function CubicIn(k) { + return k * k * k; + } + /** + * @function LevelRenderer.Animation.easing.CubicOut + * @description 返回按三次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按三次方缓动退出的值 + */ + + }, { + key: "CubicOut", + value: function CubicOut(k) { + return --k * k * k + 1; + } + /** + * @function LevelRenderer.Animation.easing.CubicInOut + * @description 返回按三次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按三次方缓动进入退出的值 + */ + + }, { + key: "CubicInOut", + value: function CubicInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k + 2); + } + /** + * @function LevelRenderer.Animation.easing.QuarticIn + * @description 返回按四次方缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动进入的值 + */ + + }, { + key: "QuarticIn", + value: function QuarticIn(k) { + return k * k * k * k; + } + /** + * @function LevelRenderer.Animation.easing.QuarticOut + * @description 返回按四次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动退出的值 + */ + + }, { + key: "QuarticOut", + value: function QuarticOut(k) { + return 1 - --k * k * k * k; + } + /** + * @function LevelRenderer.Animation.easing.QuarticInOut + * @description 返回按四次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按四次方缓动进入退出的值 + */ + + }, { + key: "QuarticInOut", + value: function QuarticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + + return -0.5 * ((k -= 2) * k * k * k - 2); + } // 五次方的缓动(t^5) + + /** + * @function LevelRenderer.Animation.easing.QuinticIn + * @description 返回按五次方缓动的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动的值 + */ + + }, { + key: "QuinticIn", + value: function QuinticIn(k) { + return k * k * k * k * k; + } + /** + * @function LevelRenderer.Animation.easing.QuinticOut + * @description 返回按五次方缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动退出的值 + */ + + }, { + key: "QuinticOut", + value: function QuinticOut(k) { + return --k * k * k * k * k + 1; + } + /** + * @function LevelRenderer.Animation.easing.QuinticInOut + * @description 返回按五次方缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按五次方缓动进入退出的值 + */ + + }, { + key: "QuinticInOut", + value: function QuinticInOut(k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + + return 0.5 * ((k -= 2) * k * k * k * k + 2); + } // 正弦曲线的缓动(sin(t)) + + /** + * @function LevelRenderer.Animation.easing.SinusoidalIn + * @description 返回按正弦曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动进入的值 + */ + + }, { + key: "SinusoidalIn", + value: function SinusoidalIn(k) { + return 1 - Math.cos(k * Math.PI / 2); + } + /** + * @function LevelRenderer.Animation.easing.SinusoidalOut + * @description 返回按正弦曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动退出的值 + */ + + }, { + key: "SinusoidalOut", + value: function SinusoidalOut(k) { + return Math.sin(k * Math.PI / 2); + } + /** + * @function LevelRenderer.Animation.easing.SinusoidalInOut + * @description 返回按正弦曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按正弦曲线的缓动进入退出的值 + */ + + }, { + key: "SinusoidalInOut", + value: function SinusoidalInOut(k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + } // 指数曲线的缓动(2^t) + + /** + * @function LevelRenderer.Animation.easing.ExponentialIn + * @description 返回按指数曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动进入的值 + */ + + }, { + key: "ExponentialIn", + value: function ExponentialIn(k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + } + /** + * @function LevelRenderer.Animation.easing.ExponentialOut + * @description 返回按指数曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动退出的值 + */ + + }, { + key: "ExponentialOut", + value: function ExponentialOut(k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + } + /** + * @function LevelRenderer.Animation.easing.ExponentialInOut + * @description 返回按指数曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按指数曲线的缓动进入退出的值 + */ + + }, { + key: "ExponentialInOut", + value: function ExponentialInOut(k) { + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + } // 圆形曲线的缓动(sqrt(1-t^2)) + + /** + * @function LevelRenderer.Animation.easing.CircularIn + * @description 返回按圆形曲线的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动进入的值 + */ + + }, { + key: "CircularIn", + value: function CircularIn(k) { + return 1 - Math.sqrt(1 - k * k); + } + /** + * @function LevelRenderer.Animation.easing.CircularOut + * @description 返回按圆形曲线的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动退出的值 + */ + + }, { + key: "CircularOut", + value: function CircularOut(k) { + return Math.sqrt(1 - --k * k); + } + /** + * @function LevelRenderer.Animation.easing.CircularInOut + * @description 返回按圆形曲线的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按圆形曲线的缓动进入退出的值 + */ + + }, { + key: "CircularInOut", + value: function CircularInOut(k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + } // 创建类似于弹簧在停止前来回振荡的动画 + + /** + * @function LevelRenderer.Animation.easing.ElasticIn + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动进入的值 + */ + + }, { + key: "ElasticIn", + value: function ElasticIn(k) { + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + } + /** + * @function LevelRenderer.Animation.easing.ElasticOut + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动退出的值 + */ + + }, { + key: "ElasticOut", + value: function ElasticOut(k) { + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + return a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1; + } + /** + * @function LevelRenderer.Animation.easing.ElasticInOut + * @description 返回按类似于弹簧在停止前来回振荡的动画的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按类似于弹簧在停止前来回振荡的动画的缓动进入退出的值 + */ + + }, { + key: "ElasticInOut", + value: function ElasticInOut(k) { + var s; + var a = 0.1; + var p = 0.4; + + if (k === 0) { + return 0; + } + + if (k === 1) { + return 1; + } + + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + } + + return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + } // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + + /** + * @function LevelRenderer.Animation.easing.BackIn + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入的值 + */ + + }, { + key: "BackIn", + value: function BackIn(k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + } + /** + * @function LevelRenderer.Animation.easing.BackOut + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动退出的值 + */ + + }, { + key: "BackOut", + value: function BackOut(k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + } + /** + * @function LevelRenderer.Animation.easing.BackInOut + * @description 返回按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动的缓动进入退出的值 + */ + + }, { + key: "BackInOut", + value: function BackInOut(k) { + var s = 1.70158 * 1.525; + + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + } // 创建弹跳效果 + + /** + * @function LevelRenderer.Animation.easing.BounceIn + * @description 返回按弹跳效果的缓动进入的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动进入的值 + */ + + }, { + key: "BounceIn", + value: function BounceIn(k) { + return 1 - this.BounceOut(1 - k); + } + /** + * @function LevelRenderer.Animation.easing.BounceOut + * @description 返回按弹跳效果的缓动退出的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动退出的值 + */ + + }, { + key: "BounceOut", + value: function BounceOut(k) { + if (k < 1 / 2.75) { + return 7.5625 * k * k; + } else if (k < 2 / 2.75) { + return 7.5625 * (k -= 1.5 / 2.75) * k + 0.75; + } else if (k < 2.5 / 2.75) { + return 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375; + } else { + return 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375; + } + } + /** + * @function LevelRenderer.Animation.easing.BounceInOut + * @description 返回按弹跳效果的缓动进入退出的值 + * @param {number} k - 参数 + * @return {number} 按弹跳效果的缓动进入退出的值 + */ + + }, { + key: "BounceInOut", + value: function BounceInOut(k) { + if (k < 0.5) { + return this.BounceIn(k * 2) * 0.5; + } + + return this.BounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }]); + + return Easing; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Clip.js +function Clip_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Clip_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Clip_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clip_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clip_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class LevelRenderer.Animation.Clip + * @category Visualization Theme + * @classdesc 动画片段 + * @param {Object} options - 参数。 + * @param {Object} options.target - 动画对象,可以是数组,如果是数组的话会批量分发 onframe 等事件。 + * @param {number} [options.life=1000] - 动画时长。 + * @param {number} [options.delay=0] - 动画延迟时间。 + * @param {boolean} [options.loop=true] - 是否循环。 + * @param {number} [options.gap=0] - 循环的间隔时间。 + * @param {Object} options.onframe - 帧。 + * @param {boolean} options.easing - 是否消除。 + * @param {boolean} options.ondestroy - 是否销毁。 + * @param {boolean} options.onrestart - 是否重播。 + * @private + */ + +var Clip = /*#__PURE__*/function () { + function Clip(options) { + Clip_classCallCheck(this, Clip); + + this._targetPool = options.target || {}; + + if (!(this._targetPool instanceof Array)) { + this._targetPool = [this._targetPool]; + } // 生命周期 + + + this._life = options.life || 1000; // 延时 + + this._delay = options.delay || 0; // 开始时间 + + this._startTime = new Date().getTime() + this._delay; // 单位毫秒 + // 结束时间 + + this._endTime = this._startTime + this._life * 1000; // 是否循环 + + this.loop = typeof options.loop == 'undefined' ? false : options.loop; + this.gap = options.gap || 0; + this.easing = options.easing || 'Linear'; + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.Clip"; + } + /** + * @function LevelRenderer.Animation.Clip.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Clip_createClass(Clip, [{ + key: "destroy", + value: function destroy() {} + }, { + key: "step", + value: function step(time) { + var easing = new Easing(); + var percent = (time - this._startTime) / this._life; // 还没开始 + + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + var easingFunc = typeof this.easing == 'string' ? easing[this.easing] : this.easing; + var schedule = typeof easingFunc === 'function' ? easingFunc(percent) : percent; + this.fire('frame', schedule); // 结束 + + if (percent == 1) { + if (this.loop) { + this.restart(); // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + + return 'restart'; + } // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + + + this._needsRemove = true; + return 'destroy'; + } + + return null; + } + }, { + key: "restart", + value: function restart() { + var time = new Date().getTime(); + var remainder = (time - this._startTime) % this._life; + this._startTime = new Date().getTime() - remainder + this.gap; + } + }, { + key: "fire", + value: function fire(eventType, arg) { + for (var i = 0, len = this._targetPool.length; i < len; i++) { + if (this['on' + eventType]) { + this['on' + eventType](this._targetPool[i], arg); + } + } + } + }]); + + return Clip; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Animation.js +function Animation_typeof(obj) { "@babel/helpers - typeof"; return Animation_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Animation_typeof(obj); } + +function Animation_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Animation_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Animation_createClass(Constructor, protoProps, staticProps) { if (protoProps) Animation_defineProperties(Constructor.prototype, protoProps); if (staticProps) Animation_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Animation_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Animation_setPrototypeOf(subClass, superClass); } + +function Animation_setPrototypeOf(o, p) { Animation_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Animation_setPrototypeOf(o, p); } + +function Animation_createSuper(Derived) { var hasNativeReflectConstruct = Animation_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Animation_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Animation_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Animation_possibleConstructorReturn(this, result); }; } + +function Animation_possibleConstructorReturn(self, call) { if (call && (Animation_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Animation_assertThisInitialized(self); } + +function Animation_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Animation_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Animation_getPrototypeOf(o) { Animation_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Animation_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class LevelRenderer.Animation + * @classdesc 动画主类, 调度和管理所有动画控制器 + * @category Visualization Theme + * @extends {LevelRenderer.Eventful} + * @param {Object} options - 动画参数。 + * @param {Object} options.onframe - onframe。 + * @param {Object} options.stage - stage。 + * @example 例如: + * (start code) + * var animation = new LevelRenderer.Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + * (end) + * @private + */ + +var Animation = /*#__PURE__*/function (_Eventful) { + Animation_inherits(Animation, _Eventful); + + var _super = Animation_createSuper(Animation); + + function Animation(options) { + var _this; + + Animation_classCallCheck(this, Animation); + + _this = _super.call(this, options); + options = options || {}; + /** + * @member {Object} LevelRenderer.Animation.prototype.stage + * @description stage。 + */ + + _this.stage = {}; + /** + * @member {Object} LevelRenderer.Animation.prototype.onframe + * @description onframe。 + */ + + _this.onframe = function () {}; + /** + * @member {Array} LevelRenderer.Animation.prototype._clips + * @description _clips。 + */ + + + _this._clips = []; + /** + * @member {boolean} LevelRenderer.Animation.prototype._running + * @description _running。 + */ + + _this._running = false; + /** + * @member {number} LevelRenderer.Animation.prototype._time + * @description _time。 + */ + + _this._time = 0; + Util.extend(Animation_assertThisInitialized(_this), options); + _this.CLASS_NAME = "SuperMap.LevelRenderer.Animation"; + return _this; + } + /** + * @function LevelRenderer.Animation.prototype.add + * @description 添加动画片段。 + * @param {LevelRenderer.Animation.Clip} clip - 动画片段。 + */ + + + Animation_createClass(Animation, [{ + key: "add", + value: function add(clip) { + this._clips.push(clip); + } + /** + * @function LevelRenderer.Animation.prototype.remove + * @description 删除动画片段。 + * @param {LevelRenderer.Animation.Clip} clip - 动画片段。 + */ + + }, { + key: "remove", + value: function remove(clip) { + var idx = new Util_Util().indexOf(this._clips, clip); + + if (idx >= 0) { + this._clips.splice(idx, 1); + } + } + /** + * @function LevelRenderer.Animation.prototype.update + * @description 更新动画片段。 + */ + + }, { + key: "_update", + value: function _update() { + var time = new Date().getTime(); + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + var deferredEvents = []; + var deferredClips = []; + + for (var i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time); // Throw out the events need to be called after + // stage.update, like destroy + + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + + if (this.stage.update) { + this.stage.update(); + } // Remove the finished clip + + + for (var _i = 0; _i < len;) { + if (clips[_i]._needsRemove) { + clips[_i] = clips[len - 1]; + clips.pop(); + len--; + } else { + _i++; + } + } + + len = deferredEvents.length; + + for (var _i2 = 0; _i2 < len; _i2++) { + deferredClips[_i2].fire(deferredEvents[_i2]); + } + + this._time = time; + this.onframe(delta); + this.dispatch('frame', delta); + } + /** + * @function LevelRenderer.Animation.prototype.start + * @description 开始运行动画。 + */ + + }, { + key: "start", + value: function start() { + var requestAnimationFrame = window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (func) { + setTimeout(func, 16); + }; + + var self = this; + this._running = true; + + function step() { + if (self._running) { + self._update(); + + requestAnimationFrame(step); + } + } + + this._time = new Date().getTime(); + requestAnimationFrame(step); + } + /** + * @function LevelRenderer.Animation.prototype.stop + * @description 停止运行动画。 + */ + + }, { + key: "stop", + value: function stop() { + this._running = false; + } + /** + * @function LevelRenderer.Animation.prototype.clear + * @description 清除所有动画片段。 + */ + + }, { + key: "clear", + value: function clear() { + this._clips = []; + } + /** + * @function LevelRenderer.Animation.prototype.animate + * @description 对一个目标创建一个animator对象,可以指定目标中的属性使用动画。 + * @param {Object} target - 目标对象。 + * @param {Object} options - 动画参数选项。 + * @param {boolean} [options.loop=false] - 是否循环播放动画。 + * @param {function} [options.getter] - 如果指定getter函数,会通过getter函数取属性值。 + * @param {function} [options.setter] - 如果指定setter函数,会通过setter函数设置属性值。 + * @returns {LevelRenderer.Animation.Animator} Animator。 + */ + + }, { + key: "animate", + value: function animate(target, options) { + options = options || {}; + var deferred = new Animator(target, options.loop, options.getter, options.setter); + deferred.animation = this; + return deferred; + } + }], [{ + key: "_interpolateNumber", + value: function _interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + }, { + key: "_interpolateArray", + value: function _interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = Animation._interpolateNumber(p0[i], p1[i], percent); + } + } else { + var len2 = p0[0].length; + + for (var _i3 = 0; _i3 < len; _i3++) { + for (var j = 0; j < len2; j++) { + out[_i3][j] = Animation._interpolateNumber(p0[_i3][j], p1[_i3][j], percent); + } + } + } + } + }, { + key: "_isArrayLike", + value: function _isArrayLike(data) { + switch (Animation_typeof(data)) { + case 'undefined': + case 'string': + return false; + } + + return typeof data.length !== 'undefined'; + } + }, { + key: "_catmullRomInterpolateArray", + value: function _catmullRomInterpolateArray(p0, p1, p2, p3, t, t2, t3, out, arrDim) { + var len = p0.length; + + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = Animation._catmullRomInterpolate(p0[i], p1[i], p2[i], p3[i], t, t2, t3); + } + } else { + var len2 = p0[0].length; + + for (var _i4 = 0; _i4 < len; _i4++) { + for (var j = 0; j < len2; j++) { + out[_i4][j] = Animation._catmullRomInterpolate(p0[_i4][j], p1[_i4][j], p2[_i4][j], p3[_i4][j], t, t2, t3); + } + } + } + } + }, { + key: "_catmullRomInterpolate", + value: function _catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1; + } + }, { + key: "_cloneValue", + value: function _cloneValue(value) { + var arraySlice = Array.prototype.slice; + + if (Animation._isArrayLike(value)) { + var len = value.length; + + if (Animation._isArrayLike(value[0])) { + var ret = []; + + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + + return ret; + } else { + return arraySlice.call(value); + } + } else { + return value; + } + } + }, { + key: "rgba2String", + value: function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + return 'rgba(' + rgba.join(',') + ')'; + } + }]); + + return Animation; +}(Eventful); +/** + * @class LevelRenderer.Animation.Animator + */ + +var Animator = /*#__PURE__*/function () { + /** + * @function LevelRenderer.Animation.Animator.prototype.animate + * @description 构造函数 + * @param {Object} target - 目标对象。 + * @param {Object} options - 动画参数选项。 + * @param {boolean} [loop=false] - 是否循环播放动画。 + * @param {function} [getterl] - 如果指定getter函数,会通过getter函数取属性值。 + * @param {function} [setter] - 如果指定setter函数,会通过setter函数设置属性值。 + */ + function Animator(target, loop, getter, setter) { + Animation_classCallCheck(this, Animator); + + /** + * @member {Object} LevelRenderer.Animation.Animator.prototype._tracks + * @description _tracks。 + */ + this._tracks = {}; + /** + * @member {Object} LevelRenderer.Animation.Animator.prototype._target + * @description _target。 + */ + + this._target = target; + /** + * @member {boolean} LevelRenderer.Animation.Animator.prototype._loop + * @description _loop。 + */ + + this._loop = loop || false; + /** + * @member {function} LevelRenderer.Animation.Animator.prototype._getter + * @description _getter。 + */ + + this._getter = getter || _defaultGetter; + /** + * @member {function} LevelRenderer.Animation.Animator.prototype._setter + * @description _setter。 + */ + + this._setter = setter || _defaultSetter; + /** + * @member {number} LevelRenderer.Animation.Animator.prototype._clipCount + * @description _clipCount。 + */ + + this._clipCount = 0; + /** + * @member {number} LevelRenderer.Animation.Animator.prototype._delay + * @description _delay。 + */ + + this._delay = 0; + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._doneList + * @description _doneList。 + */ + + this._doneList = []; + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._onframeList + * @description _onframeList。 + */ + + this._onframeList = []; + /** + * @member {Array} LevelRenderer.Animation.Animator.prototype._clipList + * @description _clipList。 + */ + + this._clipList = []; + this.CLASS_NAME = "SuperMap.LevelRenderer.Animation.Animator"; //Function + + function _defaultGetter(target, key) { + return target[key]; + } + + function _defaultSetter(target, key, value) { + target[key] = value; + } + } + /** + * @function LevelRenderer.Animation.Animator.prototype.when + * @description 设置动画关键帧 + * @param {number} time - 关键帧时间,单位是ms + * @param {Object} props - 关键帧的属性值,key-value表示 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + + + Animation_createClass(Animator, [{ + key: "when", + value: function when(time + /* ms */ + , props) { + for (var propName in props) { + if (!this._tracks[propName]) { + this._tracks[propName] = []; // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + + if (time !== 0) { + this._tracks[propName].push({ + time: 0, + value: Animation._cloneValue(this._getter(this._target, propName)) + }); + } + } + + this._tracks[propName].push({ + time: parseInt(time, 10), + value: props[propName] + }); + } + + return this; + } + /** + * @function LevelRenderer.Animation.Animator.prototype.during + * @description 添加动画每一帧的回调函数 + * @param {RequestCallback} callback - 回调函数 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + + }, { + key: "during", + value: function during(callback) { + this._onframeList.push(callback); + + return this; + } + /** + * @function LevelRenderer.Animation.Animator.prototype.start + * @description 开始执行动画 + * @param {(string|function)} easing - 动画缓动函数。详见:<{@link LevelRenderer.Animation.easing}>。 + * @returns {LevelRenderer.Animation.Animator} Animator + */ + + }, { + key: "start", + value: function start(easing) { + var self = this; + var setter = this._setter; + var getter = this._getter; + var onFrameListLen = self._onframeList.length; + var useSpline = easing === 'spline'; + + var ondestroy = function ondestroy() { + self._clipCount--; + + if (self._clipCount === 0) { + // Clear all tracks + self._tracks = {}; + var len = self._doneList.length; + + for (var i = 0; i < len; i++) { + self._doneList[i].call(self); + } + } + }; + + var createTrackClip = function createTrackClip(keyframes, propName) { + var trackLen = keyframes.length; + + if (!trackLen) { + return; + } // Guess data type + + + var firstVal = keyframes[0].value; + + var isValueArray = Animation._isArrayLike(firstVal); + + var isValueColor = false; // For vertices morphing + + var arrDim = isValueArray && Animation._isArrayLike(firstVal[0]) ? 2 : 1; // Sort keyframe as ascending + + keyframes.sort(function (a, b) { + return a.time - b.time; + }); + var trackMaxTime = keyframes[trackLen - 1].time; // Percents of each keyframe + + var kfPercents = []; // Value of each keyframe + + var kfValues = []; + + for (var _i5 = 0; _i5 < trackLen; _i5++) { + kfPercents.push(keyframes[_i5].time / trackMaxTime); // Assume value is a color when it is a string + + var value = keyframes[_i5].value; + + if (typeof value == 'string') { + value = SUtil_SUtil.Util_color.toArray(value); + + if (value.length === 0) { + // Invalid color + value[0] = value[1] = value[2] = 0; + value[3] = 1; + } + + isValueColor = true; + } + + kfValues.push(value); + } // Cache the key of last frame to speed up when + // animation playback is sequency + + + var cacheKey = 0; + var cachePercent = 0; + var start; + var i; + var w; + var p0; + var p1; + var p2; + var p3; + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function onframe(target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + if (percent < cachePercent) { + // Start from next key + start = Math.min(cacheKey + 1, trackLen - 1); + + for (i = start; i >= 0; i--) { + if (kfPercents[i] <= percent) { + break; + } + } + + i = Math.min(i, trackLen - 2); + } else { + for (i = cacheKey; i < trackLen; i++) { + if (kfPercents[i] > percent) { + break; + } + } + + i = Math.min(i - 1, trackLen - 2); + } + + cacheKey = i; + cachePercent = percent; + var range = kfPercents[i + 1] - kfPercents[i]; + + if (range === 0) { + return; + } else { + w = (percent - kfPercents[i]) / range; + } + + if (useSpline) { + p1 = kfValues[i]; + p0 = kfValues[i === 0 ? i : i - 1]; + p2 = kfValues[i > trackLen - 2 ? trackLen - 1 : i + 1]; + p3 = kfValues[i > trackLen - 3 ? trackLen - 1 : i + 2]; + + if (isValueArray) { + Animation._catmullRomInterpolateArray(p0, p1, p2, p3, w, w * w, w * w * w, getter(target, propName), arrDim); + } else { + var _value; + + if (isValueColor) { + // value = LevelRenderer.Animation._catmullRomInterpolateArray( + // p0, p1, p2, p3, w, w * w, w * w * w, + // rgba, 1 + // ); + _value = Animation.rgba2String(rgba); + } else { + _value = Animation._catmullRomInterpolate(p0, p1, p2, p3, w, w * w, w * w * w); + } + + setter(target, propName, _value); + } + } else { + if (isValueArray) { + Animation._interpolateArray(kfValues[i], kfValues[i + 1], w, getter(target, propName), arrDim); + } else { + var _value2; + + if (isValueColor) { + Animation._interpolateArray(kfValues[i], kfValues[i + 1], w, rgba, 1); + + _value2 = Animation.rgba2String(rgba); + } else { + _value2 = Animation._interpolateNumber(kfValues[i], kfValues[i + 1], w); + } + + setter(target, propName, _value2); + } + } + + for (i = 0; i < onFrameListLen; i++) { + self._onframeList[i](target, percent); + } + }; + + var clip = new Clip({ + target: self._target, + life: trackMaxTime, + loop: self._loop, + delay: self._delay, + onframe: onframe, + ondestroy: ondestroy + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + + self._clipList.push(clip); + + self._clipCount++; + self.animation.add(clip); + }; + + for (var propName in this._tracks) { + createTrackClip(this._tracks[propName], propName); + } + + return this; + } + /** + * @function LevelRenderer.Animation.Animator.prototype.stop + * @description 停止动画 + */ + + }, { + key: "stop", + value: function stop() { + for (var i = 0; i < this._clipList.length; i++) { + var clip = this._clipList[i]; + this.animation.remove(clip); + } + + this._clipList = []; + } + /** + * @function LevelRenderer.Animation.Animator.prototype.delay + * @description 设置动画延迟开始的时间 + * @param {number} time - 时间,单位ms + * @returns {LevelRenderer.Animation.Animator} Animator + */ + + }, { + key: "delay", + value: function delay(time) { + this._delay = time; + return this; + } + /** + * @function LevelRenderer.Animation.Animator.prototype.done + * @description 添加动画结束的回调 + * @param {function} cb - Function + * @returns {LevelRenderer.Animation.Animator} Animator + */ + + }, { + key: "done", + value: function done(cb) { + if (cb) { + this._doneList.push(cb); + } + + return this; + } + }]); + + return Animator; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/Render.js +function Render_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Render_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Render_createClass(Constructor, protoProps, staticProps) { if (protoProps) Render_defineProperties(Constructor.prototype, protoProps); if (staticProps) Render_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** +* @private +* @class LevelRenderer.Render +* @category Visualization Theme +* @classdesc Render 接口类,对外可用的所有接口都在这里。内部使用非 get 接口统一返回 this 对象,支持链式调用。 +* @param {string} id - 唯一标识。 +* @param {HTMLElement} dom - Dom 对象。 +*/ + +var Render = /*#__PURE__*/function () { + function Render(id, dom) { + Render_classCallCheck(this, Render); + + /** + * @member {string} LevelRenderer.Render.prototype.id + * @description 唯一标识。 + */ + this.id = id; + /** + * @member {LevelRenderer.Storage} LevelRenderer.Render.prototype.storage + * @description 图形仓库对象。 + */ + + this.storage = new Storage(); + /** + * @member {LevelRenderer.Painter} LevelRenderer.Render.prototype.painter + * @description 绘制器对象。 + * + */ + + this.painter = new Painter(dom, this.storage); + /** + * @member {LevelRenderer.Handler} LevelRenderer.Render.prototype.handler + * @description 事件处理对象。 + * + */ + + this.handler = new Handler(dom, this.storage, this.painter); + /** + * @member {Array} LevelRenderer.Render.prototype.animatingElements + * @description 动画控制数组。 + * + */ + + this.animatingElements = []; + /** + * @member {LevelRenderer.animation.Animation} LevelRenderer.Render.prototype.animation + * @description 动画对象。 + * + */ + + this.animation = new Animation({ + stage: { + update: Render.getFrameCallback(this) + } + }); + /** + * @member {boolean} LevelRenderer.Render.prototype._needsRefreshNextFrame + * @description 是否需要刷新下一帧。 + * + */ + + this._needsRefreshNextFrame = false; + this.animation.start(); + this.CLASS_NAME = "SuperMap.LevelRenderer.Render"; + } + /** + * @function LevelRenderer.Render.prototype.destory + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + Render_createClass(Render, [{ + key: "destroy", + value: function destroy() { + this.id = null; + this.storage = null; + this.painter = null; + this.handler = null; + this.animatingElements = null; + this.animation = null; + this._needsRefreshNextFrame = null; + } + /** + * @function LevelRenderer.Render.prototype.getId + * @description 获取实例唯一标识。 + * @return {string} 实例唯一标识。 + */ + + }, { + key: "getId", + value: function getId() { + return this.id; + } + /** + * @function LevelRenderer.Render.prototype.addShape + * @description 添加图形形状到根节点。 + * + * @param {LevelRenderer.Shape} shape - 图形对象,可用属性全集,详见各 shape。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "addShape", + value: function addShape(shape) { + this.storage.addRoot(shape); + return this; + } + /** + * @function LevelRenderer.Render.prototype.addGroup + * @description 添加组到根节点。 + * + * (code) + * //添加组到根节点例子 + * var render = new LevelRenderer.Render("Render",document.getElementById('lRendertest')); + * render.clear(); + * var g = new LevelRenderer.Group(); + * g.addChild(new LevelRenderer.Shape.Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * brushType: 'fill' + * } + * })); + * render.addGroup(g); + * render.render(); + * (end) + * + * @param {LevelRenderer.Group} group - 组对象。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "addGroup", + value: function addGroup(group) { + this.storage.addRoot(group); + return this; + } + /** + * @function LevelRenderer.Render.prototype.delShape + * @description 从根节点删除图形形状。 + * + * @param {string} shapeId - 图形对象唯一标识。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "delShape", + value: function delShape(shapeId) { + this.storage.delRoot(shapeId); + return this; + } + /** + * @function LevelRenderer.Render.prototype.delGroup + * @description 从根节点删除组。 + * + * @param {string} groupId - 组对象唯一标识。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "delGroup", + value: function delGroup(groupId) { + this.storage.delRoot(groupId); + return this; + } + /** + * @function LevelRenderer.Render.prototype.modShape + * @description 修改图形形状。 + * + * @param {string} shapeId - 图形对象唯一标识。 + * @param {LevelRenderer.Shape} shape - 图形对象。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "modShape", + value: function modShape(shapeId, shape) { + this.storage.mod(shapeId, shape); + return this; + } + /** + * @function LevelRenderer.Render.prototype.modGroup + * @description 修改组。 + * + * @param {string} groupId - 组对象唯一标识。 + * @param {LevelRenderer.Group} group - 组对象。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "modGroup", + value: function modGroup(groupId, group) { + this.storage.mod(groupId, group); + return this; + } + /** + * @function LevelRenderer.Render.prototype.modLayer + * @description 修改指定 zlevel 的绘制配置项。 + * + * @param {string} zLevel - 组对象唯一标识。 + * @param {Object} config - 配置对象。 + * @param {string} clearColor - 每次清空画布的颜色。默认值:0。 + * @param {noolean} motionBlur - 是否开启动态模糊。默认值:false。 + * @param {number} lastFrameAlpha - 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显。默认值:0.7。 + * @param {Array.} position - 层的平移。 + * @param {Array.} rotation - 层的旋转。 + * @param {Array.} scale - 层的缩放。 + * @param {boolean} zoomable - 层是否支持鼠标缩放操作。默认值:false。 + * @param {boolean} panable - 层是否支持鼠标平移操作。默认值:false。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "modLayer", + value: function modLayer(zLevel, config) { + this.painter.modLayer(zLevel, config); + return this; + } + /** + * @function LevelRenderer.Render.prototype.addHoverShape + * @description 添加额外高亮层显示,仅提供添加方法,每次刷新后高亮层图形均被清空。 + * + * @param {LevelRenderer.Shape} shape - 图形对象。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "addHoverShape", + value: function addHoverShape(shape) { + this.storage.addHover(shape); + return this; + } + /** + * @function LevelRenderer.Render.prototype.render + * @description 渲染。 + * + * @callback {function} callback - 渲染结束后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "render", + value: function render(callback) { + this.painter.render(callback); + this._needsRefreshNextFrame = false; + return this; + } + /** + * @function LevelRenderer.Render.prototype.refresh + * @description 视图更新。 + * + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "refresh", + value: function refresh(callback) { + this.painter.refresh(callback); + this._needsRefreshNextFrame = false; + return this; + } + /** + * @function LevelRenderer.Render.prototype.refreshNextFrame + * @description 标记视图在浏览器下一帧需要绘制。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "refreshNextFrame", + value: function refreshNextFrame() { + this._needsRefreshNextFrame = true; + return this; + } + /** + * @function LevelRenderer.Render.prototype.refreshHover + * @description 绘制(视图更新)高亮层。 + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "refreshHover", + value: function refreshHover(callback) { + this.painter.refreshHover(callback); + return this; + } + /** + * @function LevelRenderer.Render.prototype.refreshShapes + * @description 视图更新。 + * + * @param {Array.} shapeList - 需要更新的图形列表。 + * @callback {function} callback - 视图更新后回调函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "refreshShapes", + value: function refreshShapes(shapeList, callback) { + this.painter.refreshShapes(shapeList, callback); + return this; + } + /** + * @function LevelRenderer.Render.prototype.resize + * @description 调整视图大小。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "resize", + value: function resize() { + this.painter.resize(); + return this; + } + /** + * @function LevelRenderer.Render.prototype.animate + * @description 动画。 + * + * @example + * zr.animate(circle.id, 'style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + * + * + * @param {Array.<(LevelRenderer.Shape/LevelRenderer.Group)>} el - 动画对象。 + * @param {string} path - 需要添加动画的属性获取路径,可以通过 a.b.c 来获取深层的属性。若传入对象为,path需为空字符串。 + * @param {function} loop - 动画是否循环。 + * @return {LevelRenderer.animation.Animator} Animator。 + */ + + }, { + key: "animate", + value: function animate(el, path, loop) { + if (typeof el === 'string') { + el = this.storage.get(el); + } + + if (el) { + var target; + + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + + prop = prop[pathSplitted[i]]; + } + + if (prop) { + target = prop; + } + } else { + target = el; + } + + if (!target) { + SUtil_SUtil.Util_log('Property "' + path + '" is not existed in element ' + el.id); + return; + } + + var animatingElements = this.animatingElements; + + if (typeof el.__aniCount === 'undefined') { + // 正在进行的动画记数 + el.__aniCount = 0; + } + + if (el.__aniCount === 0) { + animatingElements.push(el); + } + + el.__aniCount++; + return this.animation.animate(target, { + loop: loop + }).done(function () { + el.__aniCount--; + + if (el.__aniCount === 0) { + // 从animatingElements里移除 + var idx = new Util_Util().indexOf(animatingElements, el); + animatingElements.splice(idx, 1); + } + }); + } else { + SUtil_SUtil.Util_log('Element not existed'); + } + } + /** + * @function LevelRenderer.Render.prototype.clearAnimation + * @description 停止所有动画。 + * + */ + + }, { + key: "clearAnimation", + value: function clearAnimation() { + this.animation.clear(); + } + /** + * @function LevelRenderer.Render.prototype.getWidth + * @description 获取视图宽度。 + * @return {number} 视图宽度。 + */ + + }, { + key: "getWidth", + value: function getWidth() { + return this.painter.getWidth(); + } + /** + * @function LevelRenderer.Render.prototype.getHeight + * @description 获取视图高度。 + * @return {number} 视图高度。 + */ + + }, { + key: "getHeight", + value: function getHeight() { + return this.painter.getHeight(); + } + /** + * @function LevelRenderer.Render.prototype.toDataURL + * @description 图像导出。 + * + * @param {string} type - 类型。 + * @param {string} backgroundColor - 背景色,默认值:"#FFFFFF"。 + * @param {string} args - 参数。 + * @return {string} 图片的 Base64 url。 + */ + + }, { + key: "toDataURL", + value: function toDataURL(type, backgroundColor, args) { + return this.painter.toDataURL(type, backgroundColor, args); + } + /** + * @function LevelRenderer.Render.prototype.shapeToImage + * @description 将常规 shape 转成 image shape。 + * + * @param {LevelRenderer.Shape} e - 图形。 + * @param {number} width - 宽度。 + * @param {number} height - 高度。 + * @return {Object} image shape。 + */ + + }, { + key: "shapeToImage", + value: function shapeToImage(e, width, height) { + var id = Util.createUniqueID("SuperMap.LevelRenderer.ToImage_"); + return this.painter.shapeToImage(id, e, width, height); + } + /** + * @function LevelRenderer.Render.prototype.on + * @description 事件绑定。 + * + * @param {string} eventName - 事件名称。 + * @param {function} eventHandler - 响应函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "on", + value: function on(eventName, eventHandler) { + this.handler.on(eventName, eventHandler); + return this; + } + /** + * @function LevelRenderer.Render.prototype.un + * @description 事件解绑定,参数为空则解绑所有自定义事件。 + * + * @param {string} eventName - 事件名称。 + * @param {function} eventHandler - 响应函数。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "un", + value: function un(eventName, eventHandler) { + this.handler.un(eventName, eventHandler); + return this; + } + /** + * @function LevelRenderer.Render.prototype.trigger + * @description 事件触发。 + * + * @param {string} eventName - 事件名称,resize,hover,drag,etc。 + * @param {event} event - event dom事件对象。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "trigger", + value: function trigger(eventName, event) { + this.handler.trigger(eventName, event); + this.handler.dispatch(eventName, event); + return this; + } + /** + * @function LevelRenderer.Render.prototype.clear + * @description 清除当前 Render 下所有类图的数据和显示,clear 后 MVC 和已绑定事件均还存在在,Render 可用。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "clear", + value: function clear() { + this.storage.delRoot(); + this.painter.clear(); + return this; + } + /** + * @function LevelRenderer.Render.prototype.dispose + * @description 释放当前 Render 实例(删除包括 dom,数据、显示和事件绑定),dispose后 Render 不可用。 + */ + + }, { + key: "dispose", + value: function dispose() { + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = null; + this.animatingElements = null; + this.storage = null; + this.painter = null; + this.handler = null; // 释放后告诉全局删除对自己的索引,没想到啥好方法 + // zrender.delInstance(this.id); + } // SMIC-方法扩展 - start + + /** + * @function LevelRenderer.Render.prototype.updateHoverShapes + * @description 更新设置显示高亮图层。 + * + * @param {Array.} shapes - 图形数组。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "updateHoverShapes", + value: function updateHoverShapes(shapes) { + this.painter.updateHoverLayer(shapes); + return this; + } + /** + * @function LevelRenderer.Render.prototype.getAllShapes + * @description 获取所有图形。 + * @return {Array.} 图形数组。 + */ + + }, { + key: "getAllShapes", + value: function getAllShapes() { + return this.storage._shapeList; + } + /** + * @function LevelRenderer.Render.prototype.clearAll + * @description 清除高亮和图形图层。 + * @return {LevelRenderer.Render} this。 + */ + + }, { + key: "clearAll", + value: function clearAll() { + this.clear(); + this.painter.clearHover(); + return this; + } + /** + * @function LevelRenderer.Render.prototype.getHoverOne + * @description 获取单个高亮图形,当前鼠标对应。 + * @return {LevelRenderer.Shape} 高亮图形。 + */ + + }, { + key: "getHoverOne", + value: function getHoverOne() { + return this.handler.getLastHoverOne(); + } + }], [{ + key: "getFrameCallback", + value: function getFrameCallback(renderInstance) { + return function () { + var animatingElements = renderInstance.animatingElements; //animatingElements instanceof Array 临时解决 destory 报错 + + if (animatingElements instanceof Array) { + for (var i = 0, l = animatingElements.length; i < l; i++) { + renderInstance.storage.mod(animatingElements[i].id); + } + + if (animatingElements.length || renderInstance._needsRefreshNextFrame) { + renderInstance.refresh(); + } + } + }; + } // SMIC-方法扩展 - end + + }]); + + return Render; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/LevelRenderer.js +function LevelRenderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function LevelRenderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function LevelRenderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) LevelRenderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) LevelRenderer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class LevelRenderer + * @deprecatedclass SuperMap.LevelRenderer + * @category Visualization Theme + * @classdesc LevelRenderer 渲染器 + * @example + * //在渲染器上加上图形 + * var levelRenderer = new LevelRenderer(); + * var zr = levelRenderer.init(document.getElementById('lRendertest')); + * zr.clear(); + * zr.addShape(new LevelRenderer.Shape.Circle({ + * style:{ + * x : 100, + * y : 100, + * r : 50, + * brushType: 'fill' + * } + * })); + * zr.render(); + * @private + */ + +var LevelRenderer = /*#__PURE__*/function () { + function LevelRenderer() { + LevelRenderer_classCallCheck(this, LevelRenderer); + + /** + * @member {Object} LevelRenderer.prototype._instances + * @description LevelRenderer 实例 map 索引 + */ + LevelRenderer._instances = {}; // 工具 + + LevelRenderer.Tool = {}; + /** + * @member {string} LevelRenderer.prototype.version + * @description 版本。zRender(Baidu)的版本号 + * 记录当前 LevelRenderer 是在 zRender 的那个版本上构建而来。 + * 在每次完整评判和实施由 zRender(Baidu)升级带来的 LevelRenderer 升级后修改。 + */ + + this.version = '2.0.4'; + this.CLASS_NAME = "SuperMap.LevelRenderer"; + } + /** + * @function LevelRenderer.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为null。 + */ + + + LevelRenderer_createClass(LevelRenderer, [{ + key: "destroy", + value: function destroy() { + this.dispose(); + this.version = null; + } + /** + * @function LevelRenderer.prototype.init + * @description 创建 LevelRenderer 实例。 + * @param {HTMLElement} dom - 绘图容器。 + * @returns {LevelRenderer} LevelRenderer 实例。 + */ + + }, { + key: "init", + value: function init(dom) { + var zr = new Render(Util.createUniqueID("LRenderer_"), dom); + LevelRenderer._instances[zr.id] = zr; + return zr; + } + /** + * @function LevelRenderer.prototype.dispose + * @description LevelRenderer 实例销毁。 + * 可以通过 zrender.dispose(zr) 销毁指定 LevelRenderer.Render 实例。 + * 也可以通过 zr.dispose() 直接销毁 + * @param {LevelRenderer.Render} zr - ZRender对象,不传此参数则销毁全部。 + * @returns {LevelRenderer} this。 + */ + + }, { + key: "dispose", + value: function dispose(zr) { + if (zr) { + zr.dispose(); + this.delInstance(zr.id); + } else { + for (var key in LevelRenderer._instances) { + LevelRenderer._instances[key].dispose(); + } + + LevelRenderer._instances = {}; + } + + return this; + } + /** + * @function LevelRenderer.prototype.getInstance + * @description 获取 LevelRenderer.Render 实例。 + * @param {string} id - ZRender对象索引。 + * @returns {LevelRenderer.Render} LevelRenderer.Render 实例。 + */ + + }, { + key: "getInstance", + value: function getInstance(id) { + return LevelRenderer._instances[id]; + } + /** + * @function LevelRenderer.prototype.delInstance + * @description 删除 zrender 实例,LevelRenderer.Render 实例 dispose 时会调用,删除后 getInstance 则返回 undefined + * @param {string} id - ZRender对象索引。 + * @param {string} id - LevelRenderer.Render 对象索引。 + * @returns {LevelRenderer} this。 + */ + + }, { + key: "delInstance", + value: function delInstance(id) { + delete LevelRenderer._instances[id]; + return this; + } + }]); + + return LevelRenderer; +}(); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicEllipse.js +function SmicEllipse_typeof(obj) { "@babel/helpers - typeof"; return SmicEllipse_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicEllipse_typeof(obj); } + +function SmicEllipse_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicEllipse_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicEllipse_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicEllipse_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicEllipse_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicEllipse_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicEllipse_get = Reflect.get; } else { SmicEllipse_get = function _get(target, property, receiver) { var base = SmicEllipse_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicEllipse_get.apply(this, arguments); } + +function SmicEllipse_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicEllipse_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicEllipse_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicEllipse_setPrototypeOf(subClass, superClass); } + +function SmicEllipse_setPrototypeOf(o, p) { SmicEllipse_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicEllipse_setPrototypeOf(o, p); } + +function SmicEllipse_createSuper(Derived) { var hasNativeReflectConstruct = SmicEllipse_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicEllipse_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicEllipse_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicEllipse_possibleConstructorReturn(this, result); }; } + +function SmicEllipse_possibleConstructorReturn(self, call) { if (call && (SmicEllipse_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicEllipse_assertThisInitialized(self); } + +function SmicEllipse_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicEllipse_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicEllipse_getPrototypeOf(o) { SmicEllipse_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicEllipse_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicEllipse + * @category Visualization Theme + * @classdesc 椭圆。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicEllipse({ + * style: { + * x: 100, + * y: 100, + * a: 40, + * b: 20, + * brushType: 'both', + * color: 'blue', + * strokeColor: 'red', + * lineWidth: 3, + * text: 'SmicEllipse' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicEllipse = /*#__PURE__*/(/* unused pure expression or super */ null && (function (_Shape) { + SmicEllipse_inherits(SmicEllipse, _Shape); + + var _super = SmicEllipse_createSuper(SmicEllipse); + + function SmicEllipse(options) { + var _this; + + SmicEllipse_classCallCheck(this, SmicEllipse); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicEllipse.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicellipse'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicEllipse"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicEllipse_createClass(SmicEllipse, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicEllipse_get(SmicEllipse_getPrototypeOf(SmicEllipse.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.buildPath + * @description 构建椭圆的 Path。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var k = 0.5522848; + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var a = style.a; + var b = style.b; + var ox = a * k; // 水平控制点偏移量 + + var oy = b * k; // 垂直控制点偏移量 + // 从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线 + + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + } + /** + * @function LevelRenderer.Shape.SmicEllipse.prototype.getRect + * @description 计算返回椭圆包围盒矩形 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + * + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - style.a - lineWidth / 2), + y: Math.round(style.x + __OP[1] - style.b - lineWidth / 2), + width: style.a * 2 + lineWidth, + height: style.b * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicEllipse; +}(Shape))); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicIsogon.js +function SmicIsogon_typeof(obj) { "@babel/helpers - typeof"; return SmicIsogon_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicIsogon_typeof(obj); } + +function SmicIsogon_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicIsogon_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicIsogon_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicIsogon_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicIsogon_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicIsogon_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicIsogon_get = Reflect.get; } else { SmicIsogon_get = function _get(target, property, receiver) { var base = SmicIsogon_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicIsogon_get.apply(this, arguments); } + +function SmicIsogon_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicIsogon_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicIsogon_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicIsogon_setPrototypeOf(subClass, superClass); } + +function SmicIsogon_setPrototypeOf(o, p) { SmicIsogon_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicIsogon_setPrototypeOf(o, p); } + +function SmicIsogon_createSuper(Derived) { var hasNativeReflectConstruct = SmicIsogon_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicIsogon_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicIsogon_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicIsogon_possibleConstructorReturn(this, result); }; } + +function SmicIsogon_possibleConstructorReturn(self, call) { if (call && (SmicIsogon_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicIsogon_assertThisInitialized(self); } + +function SmicIsogon_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicIsogon_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicIsogon_getPrototypeOf(o) { SmicIsogon_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicIsogon_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicIsogon + * @category Visualization Theme + * @classdesc 正多边形。 + * @extends LevelRenderer.Shape + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var SmicIsogon = /*#__PURE__*/(/* unused pure expression or super */ null && (function (_Shape) { + SmicIsogon_inherits(SmicIsogon, _Shape); + + var _super = SmicIsogon_createSuper(SmicIsogon); + + function SmicIsogon(options) { + var _this; + + SmicIsogon_classCallCheck(this, SmicIsogon); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicIsogon.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicisogon'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicIsogon"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicIsogon_createClass(SmicIsogon, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicIsogon_get(SmicIsogon_getPrototypeOf(SmicIsogon.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.buildPath + * @description 创建n角星(n>=3)路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var sin = SUtil.Util_math.sin; + var cos = SUtil.Util_math.cos; + var PI = Math.PI; + var n = style.n; + + if (!n || n < 2) { + return; + } + + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var r = style.r; + var dStep = 2 * PI / n; + var deg = -PI / 2; + var xStart = x + r * cos(deg); + var yStart = y + r * sin(deg); + deg += dStep; // 记录边界点,用于判断insight + + var pointList = style.pointList = []; + pointList.push([xStart, yStart]); + + for (var i = 0, end = n - 1; i < end; i++) { + pointList.push([x + r * cos(deg), y + r * sin(deg)]); + deg += dStep; + } + + pointList.push([xStart, yStart]); // 绘制 + + ctx.moveTo(pointList[0][0], pointList[0][1]); + + for (var _i = 0; _i < pointList.length; _i++) { + ctx.lineTo(pointList[_i][0], pointList[_i][1]); + } + + ctx.closePath(); + return; + } + /** + * @function LevelRenderer.Shape.SmicIsogon.prototype.getRect + * @description 计算返回正多边形的包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - style.r - lineWidth / 2), + y: Math.round(style.y + __OP[1] - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicIsogon; +}(Shape))); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicRing.js +function SmicRing_typeof(obj) { "@babel/helpers - typeof"; return SmicRing_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicRing_typeof(obj); } + +function SmicRing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicRing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicRing_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicRing_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicRing_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicRing_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicRing_get = Reflect.get; } else { SmicRing_get = function _get(target, property, receiver) { var base = SmicRing_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicRing_get.apply(this, arguments); } + +function SmicRing_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicRing_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicRing_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicRing_setPrototypeOf(subClass, superClass); } + +function SmicRing_setPrototypeOf(o, p) { SmicRing_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicRing_setPrototypeOf(o, p); } + +function SmicRing_createSuper(Derived) { var hasNativeReflectConstruct = SmicRing_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicRing_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicRing_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicRing_possibleConstructorReturn(this, result); }; } + +function SmicRing_possibleConstructorReturn(self, call) { if (call && (SmicRing_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicRing_assertThisInitialized(self); } + +function SmicRing_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicRing_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicRing_getPrototypeOf(o) { SmicRing_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicRing_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class LevelRenderer.Shape.SmicRing + * @category Visualization Theme + * @classdesc 圆环。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicRing({ + * style: { + * x: 100, + * y: 100, + * r0: 30, + * r: 50 + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + */ + +var SmicRing = /*#__PURE__*/(/* unused pure expression or super */ null && (function (_Shape) { + SmicRing_inherits(SmicRing, _Shape); + + var _super = SmicRing_createSuper(SmicRing); + + function SmicRing(options) { + var _this; + + SmicRing_classCallCheck(this, SmicRing); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicRing.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicring'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicRing"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicRing.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicRing_createClass(SmicRing, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicRing_get(SmicRing_getPrototypeOf(SmicRing.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicRing.prototype.buildPath + * @description 创建圆环路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; // 非零环绕填充优化 + + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r, 0, Math.PI * 2, false); + ctx.moveTo(style.x + __OP[0] + style.r0, style.y + __OP[1]); + ctx.arc(style.x + __OP[0], style.y + __OP[1], style.r0, 0, Math.PI * 2, true); + return; + } + /** + * @function LevelRenderer.Shape.SmicRing.prototype.getRect + * @description 计算返回圆环包围盒矩阵 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - style.r - lineWidth / 2), + y: Math.round(style.y + __OP[1] - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicRing; +}(Shape))); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/SmicStar.js +function SmicStar_typeof(obj) { "@babel/helpers - typeof"; return SmicStar_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, SmicStar_typeof(obj); } + +function SmicStar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function SmicStar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function SmicStar_createClass(Constructor, protoProps, staticProps) { if (protoProps) SmicStar_defineProperties(Constructor.prototype, protoProps); if (staticProps) SmicStar_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function SmicStar_get() { if (typeof Reflect !== "undefined" && Reflect.get) { SmicStar_get = Reflect.get; } else { SmicStar_get = function _get(target, property, receiver) { var base = SmicStar_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return SmicStar_get.apply(this, arguments); } + +function SmicStar_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SmicStar_getPrototypeOf(object); if (object === null) break; } return object; } + +function SmicStar_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) SmicStar_setPrototypeOf(subClass, superClass); } + +function SmicStar_setPrototypeOf(o, p) { SmicStar_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SmicStar_setPrototypeOf(o, p); } + +function SmicStar_createSuper(Derived) { var hasNativeReflectConstruct = SmicStar_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = SmicStar_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = SmicStar_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return SmicStar_possibleConstructorReturn(this, result); }; } + +function SmicStar_possibleConstructorReturn(self, call) { if (call && (SmicStar_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return SmicStar_assertThisInitialized(self); } + +function SmicStar_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function SmicStar_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function SmicStar_getPrototypeOf(o) { SmicStar_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SmicStar_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @private + * @class LevelRenderer.Shape.SmicStar + * @category Visualization Theme + * @classdesc n 角星(n>3)。 + * @extends LevelRenderer.Shape + * @example + * var shape = new LevelRenderer.Shape.SmicStar({ + * style: { + * x: 200, + * y: 100, + * r: 150, + * n: 5, + * text: '五角星' + * } + * }); + * levelRenderer.addShape(shape); + * @param {Array} options - shape 的配置(options)项,可以是 shape 的自有属性,也可以是自定义的属性。 + * + */ + +var SmicStar = /*#__PURE__*/(/* unused pure expression or super */ null && (function (_Shape) { + SmicStar_inherits(SmicStar, _Shape); + + var _super = SmicStar_createSuper(SmicStar); + + function SmicStar(options) { + var _this; + + SmicStar_classCallCheck(this, SmicStar); + + _this = _super.call(this, options); + /** + * @member {string} LevelRenderer.Shape.SmicStar.prototype.type + * @description 图形类型。 + */ + + _this.type = 'smicstar'; + + if (!_this.refOriginalPosition || _this.refOriginalPosition.length !== 2) { + _this.refOriginalPosition = [0, 0]; + } + + _this.CLASS_NAME = "SuperMap.LevelRenderer.Shape.SmicStar"; + return _this; + } + /** + * @function LevelRenderer.Shape.SmicStar.prototype.destroy + * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 + */ + + + SmicStar_createClass(SmicStar, [{ + key: "destroy", + value: function destroy() { + this.type = null; + + SmicStar_get(SmicStar_getPrototypeOf(SmicStar.prototype), "destroy", this).call(this); + } + /** + * @function LevelRenderer.Shape.SmicStar.prototype.buildPath + * @description 创建n 角星(n>3)路径。 + * + * @param {CanvasRenderingContext2D} ctx - Context2D 上下文。 + * @param {Object} style - style。 + * + */ + + }, { + key: "buildPath", + value: function buildPath(ctx, style) { + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var n = style.n; + + if (!n || n < 2) { + return; + } + + var sin = SUtil.Util_math.sin; + var cos = SUtil.Util_math.cos; + var PI = Math.PI; + var x = style.x + __OP[0]; + var y = style.y + __OP[1]; + var r = style.r; + var r0 = style.r0; // 如果未指定内部顶点外接圆半径,则自动计算 + + if (r0 == null) { + r0 = n > 4 // 相隔的外部顶点的连线的交点, + // 被取为内部交点,以此计算r0 + ? r * cos(2 * PI / n) / cos(PI / n) // 二三四角星的特殊处理 + : r / 3; + } + + var dStep = PI / n; + var deg = -PI / 2; + var xStart = x + r * cos(deg); + var yStart = y + r * sin(deg); + deg += dStep; // 记录边界点,用于判断inside + + var pointList = style.pointList = []; + pointList.push([xStart, yStart]); + + for (var i = 0, end = n * 2 - 1, ri; i < end; i++) { + ri = i % 2 === 0 ? r0 : r; + pointList.push([x + ri * cos(deg), y + ri * sin(deg)]); + deg += dStep; + } + + pointList.push([xStart, yStart]); // 绘制 + + ctx.moveTo(pointList[0][0], pointList[0][1]); + + for (var _i = 0; _i < pointList.length; _i++) { + ctx.lineTo(pointList[_i][0], pointList[_i][1]); + } + + ctx.closePath(); + return; + } + /** + * @function LevelRenderer.Shape.SmicStar.prototype.getRect + * @description 返回 n 角星包围盒矩形。 + * + * @param {Object} style - style + * @return {Object} 边框对象。包含属性:x,y,width,height。 + */ + + }, { + key: "getRect", + value: function getRect(style) { + if (style.__rect) { + return style.__rect; + } + + if (!this.refOriginalPosition || this.refOriginalPosition.length !== 2) { + this.refOriginalPosition = [0, 0]; + } + + var __OP = this.refOriginalPosition; + var lineWidth; + + if (style.brushType == 'stroke' || style.brushType == 'fill') { + lineWidth = style.lineWidth || 1; + } else { + lineWidth = 0; + } + + style.__rect = { + x: Math.round(style.x + __OP[0] - style.r - lineWidth / 2), + y: Math.round(style.y + __OP[1] - style.r - lineWidth / 2), + width: style.r * 2 + lineWidth, + height: style.r * 2 + lineWidth + }; + return style.__rect; + } + }]); + + return SmicStar; +}(Shape))); +;// CONCATENATED MODULE: ./src/common/overlay/levelRenderer/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/overlay/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/components/CommonTypes.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @description 该文件用于存储一些公用常量 + * @private + */ +var FileTypes = { + EXCEL: "EXCEL", + CSV: "CSV", + ISERVER: "ISERVER", + GEOJSON: "GEOJSON", + JSON: 'JSON' +}; +var FileConfig = { + fileMaxSize: 10 * 1024 * 1024 +}; +;// CONCATENATED MODULE: ./src/common/components/openfile/FileModel.js +function FileModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function FileModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function FileModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) FileModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) FileModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class FileModel + * @deprecatedclass SuperMap.FileModel + * @description 文件数据组件数据模型,用于存储一些文件数据或状态,todo 结构待完善 + * @category Components OpenFile + * @private + */ + +var FileModel = /*#__PURE__*/function () { + function FileModel(options) { + FileModel_classCallCheck(this, FileModel); + + this.FileTypes = FileTypes; + this.FileConfig = FileConfig; + this.loadFileObject = options && options.loadFileObject ? options.loadFileObject : []; + } + /** + * @function FileModel.prototype.set + * @description 设置属性值 + * @param {string} key - 属性名称 + * @param {string|Object} value - 属性值 + */ + + + FileModel_createClass(FileModel, [{ + key: "set", + value: function set(key, value) { + this[key] = value; + } + /** + * @function FileModel.prototype.get + * @description 获取数据值 + * @param {string} key - 属性名称 + * @returns {string|Object} value - 返回属性值 + */ + + }, { + key: "get", + value: function get(key) { + return this[key]; + } + }]); + + return FileModel; +}(); +;// CONCATENATED MODULE: ./src/common/components/messagebox/MessageBox.js +function MessageBox_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MessageBox_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MessageBox_createClass(Constructor, protoProps, staticProps) { if (protoProps) MessageBox_defineProperties(Constructor.prototype, protoProps); if (staticProps) MessageBox_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class MessageBox + * @aliasclass Components.MessageBox + * @deprecatedclass SuperMap.Components.MessageBox + * @version 9.1.1 + * @classdesc 组件信息提示框。 + * @category Components Common + * @usage + */ +var MessageBox = /*#__PURE__*/function () { + function MessageBox() { + MessageBox_classCallCheck(this, MessageBox); + + this._initView(); + } + + MessageBox_createClass(MessageBox, [{ + key: "_initView", + value: function _initView() { + //原生js形式 + var messageBoxContainer = document.createElement("div"); + messageBoxContainer.hidden = true; + messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-orange"); //图标 + + var iconContainer = document.createElement("div"); + iconContainer.setAttribute("class", "icon"); + this.icon = document.createElement("span"); + this.icon.setAttribute("class", "supermapol-icons-message-warning"); + iconContainer.appendChild(this.icon); + messageBoxContainer.appendChild(iconContainer); //内容: + + var messageBox = document.createElement("div"); + messageBox.setAttribute("class", "component-messagebox"); + messageBox.innerHTML = ""; + messageBoxContainer.appendChild(messageBox); + this.messageBox = messageBox; //关闭按钮 + + var cancelContainer = document.createElement("div"); + cancelContainer.setAttribute("class", "component-messagebox__cancelbtncontainer"); + var cancelBtn = document.createElement("button"); + cancelBtn.setAttribute("class", "component-messagebox__cancelBtn"); + cancelBtn.innerHTML = "x"; + cancelBtn.onclick = this.closeView.bind(this); + cancelContainer.appendChild(cancelBtn); + messageBoxContainer.appendChild(cancelContainer); + this.messageBoxContainer = messageBoxContainer; + document.body.appendChild(this.messageBoxContainer); + } + /** + * @function MessageBox.prototype.closeView + * @description 关闭提示框。 + */ + + }, { + key: "closeView", + value: function closeView() { + this.messageBoxContainer.hidden = true; + } + /** + * @function MessageBox.prototype.showView + * @description 显示提示框。 + * @param {string} message - 提示框显示内容。 + * @param {string}[type="warring"] 提示框类型,如 "warring", "failure", "success"。 + */ + + }, { + key: "showView", + value: function showView(message) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'warring'; + + //设置提示框的样式: + if (type === "success") { + this.icon.setAttribute("class", "supermapol-icons-message-success"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-green"); + } else if (type === "failure") { + this.icon.setAttribute("class", "supermapol-icons-message-failure"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-red"); + } else if (type === "warring") { + this.icon.setAttribute("class", "supermapol-icons-message-warning"); + this.messageBoxContainer.setAttribute("class", "component-messageboxcontainer component-border-bottom-orange"); + } + + this.messageBox.innerHTML = message; + this.messageBoxContainer.hidden = false; + } + }]); + + return MessageBox; +}(); +;// CONCATENATED MODULE: external "function(){try{return echarts}catch(e){return {}}}()" +var external_function_try_return_echarts_catch_e_return_namespaceObject = function(){try{return echarts}catch(e){return {}}}(); +var external_function_try_return_echarts_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_echarts_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/lang/locales/en-US.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * Namespace: SuperMap.Lang["en"] + * Dictionary for English. Keys for entries are used in calls to + * . Entry bodies are normal strings or + * strings formatted for use with calls. + */ +var en = { + 'title_dataFlowService': 'Data Flow Service', + 'title_distributedAnalysis': 'Distributed Analysis', + 'title_clientComputing': 'Client Computing', + 'title_dataServiceQuery': 'Data Service Query', + 'title_searchCity': 'Search city', + 'title_searchLayer': ' Search layer', + 'text_input_value_inputDataFlowUrl': 'Please enter the data stream service address such as: ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe', + 'text_displayFeaturesInfo': 'Display feature information', + 'text_subscribe': 'subscribe', + 'text_cancelSubscribe': 'unsubscribe', + 'text_densityAnalysis': 'Density Analysis', + 'text_CalculateTheValuePerUnitArea': 'Calculate the value per unit area within the neighborhood shape', + 'text_option_selectDataset': 'Please select a dataset', + 'text_label_dataset': 'Dataset', + 'text_option_simplePointDensityAnalysis': 'Simple point density analysis', + 'text_option_nuclearDensityAnalysis': 'Nuclear density analysis', + 'text_label_analyticalMethod': 'Analytical method', + 'text_option_quadrilateral': 'Quadrilateral', + 'text_option_hexagon': 'hexagon', + 'text_label_meshType': 'Mesh type', + 'text_option_notSet': 'Not set', + 'text_label_weightField': 'Weight field', + 'text_label_gridSizeInMeters': 'Grid size', + 'text_label_searchRadius': 'Search radius', + 'text_label_queryRange': 'Scope of analysis', + 'text_label_areaUnit': 'Area unit', + 'text_option_equidistantSegmentation': 'Equidistant segmentation', + 'text_option_logarithm': 'Logarithm', + 'text_option_equalCountingSegment': 'Equal counting segment', + 'text_option_squareRootSegmentation': 'Square root segmentation', + 'text_label_thematicMapSegmentationMode': 'Thematic map segmentation mode', + 'text_label_thematicMapSegmentationParameters': 'Thematic map segmentation parameters', + 'text_option_greenOrangePurpleGradient': 'Green orange purple gradient', + 'text_option_greenOrangeRedGradient': 'Green orange red gradient', + 'text_option_rainbowGradient': 'Rainbow gradient', + 'text_option_spectralGradient': 'Spectral gradient', + 'text_option_terrainGradient': 'Terrain gradient', + 'text_label_thematicMapColorGradientMode': 'Thematic map color gradient mode', + 'text_label_resultLayerName': 'Result layer name', + 'text_chooseFile': 'Open File', + 'text_isoline': 'Isoline', + 'text_extractDiscreteValue': 'Extract discrete value generation curve', + 'text_buffer': 'Buffer', + 'text_specifyTheDistance': 'Specify the distance to create the surrounding area', + 'text_label_analysisLayer': 'Analysis layer', + 'text_label_extractField': 'Extract field', + 'text_label_extractedValue': 'Extracted value', + 'text_label_distanceAttenuation': 'Distance attenuation', + 'text_label_gridSize': 'gridSize', + 'text_label_bufferRadius': 'Buffer radius', + 'text_label_defaultkilometers': 'Default 10 kilometers', + 'text_label_kilometer': 'kilometer', + 'text_label_unit': 'unit', + 'text_retainOriginal': 'Retain original object field', + 'text_mergeBuffer': 'Merge buffer', + 'text_label_color': 'Color', + 'text_label_buffer': '[Buffer]', + 'text_label_isolines': '[Isolines]', + 'text_label_queryRangeTips': 'The default is the full range of input data. Example: -74.050, 40.650, -73.850, 40.850', + 'text_label_queryModel': 'Query mode', + 'text_label_IDArrayOfFeatures': 'ID array of features', + 'text_label_maxFeatures': 'The maximum number of features that can be returned', + 'text_label_bufferDistance': 'Buffer distance', + 'text_label_queryRange1': 'Query range', + 'text_label_spatialQueryMode': 'Spatial query mode', + 'text_label_featureFilter': 'Feature filter', + 'text_label_geometricObject': 'Geometric object', + 'text_label_queryMode': 'Query mode', + 'text_label_searchTips': 'Search for city locations or layer features', + 'text_label_chooseSearchLayers': 'Select a query layer', + 'text_loadSearchCriteria': 'Load search criteria', + 'text_saveSearchCriteria': 'Save search criteria', + "btn_analyze": "Analyze", + "btn_analyzing": "Analyzing", + "btn_emptyTheAnalysisLayer": "Empty the analysis layer", + "btn_cancelAnalysis": "Cancel", + "btn_query": "Query", + "btn_querying": "Querying", + "btn_emptyTheRresultLayer": "Clear all result layers", + 'msg_dataReturnedIsEmpty.': 'The request is successful and the data returned by the query is empty.', + 'msg_dataFlowServiceHasBeenSubscribed': 'The data stream service has been subscribed to.', + 'msg_inputDataFlowUrlFirst': 'Please enter the data stream service address first.', + 'msg_datasetOrMethodUnsupport': 'This dataset does not support this analysis type. Please reselect the dataset.', + 'msg_selectDataset': 'Please select a data set!', + 'msg_setTheWeightField': 'Please set the weight field!', + 'msg_theFieldNotSupportAnalysis': 'The field you currently select does not support analysis!', + 'msg_resultIsEmpty': 'The result of the analysis is empty!', + 'msg_openFileFail': 'Failed to open file!', + 'msg_fileTypeUnsupported': 'File format is not supported!', + 'msg_fileSizeExceeded': 'File size exceeded! The file size should not exceed 10M!', + 'msg_dataInWrongGeoJSONFormat': 'Wrong data format! Non standard GEOJSON format data!', + 'msg_dataInWrongFormat': 'Wrong data format! Non standard EXCEL, CSV or GEOJSON format data!', + 'msg_searchKeywords': "Search keywords cannot be empty. Please enter your search criteria.", + 'msg_searchGeocodeField': "Did not match the address matching service data!", + 'msg_cityGeocodeField': "The address matching service of the current city is not configured.", + 'msg_getFeatureField': "No related vector features found!", + 'msg_dataflowservicesubscribed': 'The data stream service has been subscribed to.', + 'msg_subscribesucceeded': 'The data stream service subscription was successful.', + 'msg_crsunsupport': 'Does not support the coordinate system of the current map', + 'msg_tilematrixsetunsupport': 'Incoming TileMatrixSet is not supported', + 'msg_jsonResolveFiled': 'JSON format parsing failure!', + 'msg_requestContentFiled': 'Failed to request data through iportal!', + 'msg_getdatafailed': 'Failed to get data!' +}; + +;// CONCATENATED MODULE: ./src/common/lang/locales/zh-CN.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * Namespace: SuperMap.Lang["zh-CN"] + * Dictionary for Simplified Chinese. Keys for entries are used in calls to + * . Entry bodies are normal strings or + * strings formatted for use with calls. + */ +var zh = { + 'title_dataFlowService': '数据流服务', + 'title_distributedAnalysis': '分布式分析', + 'title_clientComputing': '客户端计算', + 'title_dataServiceQuery': '数据服务查询', + 'title_searchCity': '搜索城市', + 'title_searchLayer': '搜索图层', + 'text_input_value_inputDataFlowUrl': '请输入数据流服务地址如:ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe', + 'text_displayFeaturesInfo': '显示要素信息', + 'text_subscribe': '订阅', + 'text_cancelSubscribe': '取消订阅', + 'text_densityAnalysis': '密度分析', + 'text_CalculateTheValuePerUnitArea': '计算点指定邻域形状内的每单位面积量值', + 'text_option_selectDataset': '请选择数据集', + 'text_label_dataset': '数据集', + 'text_option_simplePointDensityAnalysis': '简单点密度分析', + 'text_option_nuclearDensityAnalysis': '核密度分析', + 'text_label_analyticalMethod': '分析方法', + 'text_option_quadrilateral': '四边形', + 'text_option_hexagon': '六边形', + 'text_label_meshType': '网格面类型', + 'text_option_notSet': '未设置', + 'text_label_weightField': '权重字段', + 'text_label_gridSizeInMeters': '网格大小', + 'text_label_searchRadius': '搜索半径', + 'text_label_queryRange': '分析范围', + 'text_label_areaUnit': '面积单位', + 'text_option_equidistantSegmentation': '等距离分段', + 'text_option_logarithm': '对数', + 'text_option_equalCountingSegment': '等计数分段', + 'text_option_squareRootSegmentation': '平方根分段', + 'text_label_thematicMapSegmentationMode': '专题图分段模式', + 'text_label_thematicMapSegmentationParameters': '专题图分段参数', + 'text_option_greenOrangePurpleGradient': '绿橙紫渐变', + 'text_option_greenOrangeRedGradient': '绿橙红渐变', + 'text_option_rainbowGradient': '彩虹渐变', + 'text_option_spectralGradient': '光谱渐变', + 'text_option_terrainGradient': '地形渐变', + 'text_label_thematicMapColorGradientMode': '专题图颜色渐变模式', + 'text_label_resultLayerName': '结果图层名称', + 'text_chooseFile': '选择文件', + 'text_isoline': '等值线', + 'text_extractDiscreteValue': '提取离散值生成曲线', + 'text_buffer': '缓冲区', + 'text_specifyTheDistance': '指定距离创建周边区域', + 'text_label_analysisLayer': '分析图层', + 'text_label_extractField': '提取字段', + 'text_label_extractedValue': '提取值', + 'text_label_distanceAttenuation': '距离衰减', + 'text_label_gridSize': '栅格大小', + 'text_label_bufferRadius': '缓冲半径', + 'text_label_defaultkilometers': '默认10千米', + 'text_option_kilometer': '千米', + 'text_label_unit': '单位', + 'text_retainOriginal': '保留原对象字段属性', + 'text_mergeBuffer': '合并缓冲区', + 'text_label_color': '颜色', + 'text_label_buffer': '[缓冲区]', + 'text_label_isolines': '[等值线]', + 'text_label_queryRangeTips': '默认为输入数据的全幅范围。范例:-74.050,40.650,-73.850,40.850', + 'text_label_IDArrayOfFeatures': '要素 ID 数组', + 'text_label_maxFeatures': '最多可返回的要素数量', + 'text_label_bufferDistance': '缓冲区距离', + 'text_label_queryRange1': '查询范围', + 'text_label_spatialQueryMode': '空间查询模式', + 'text_label_featureFilter': '要素过滤器', + 'text_label_geometricObject': '几何对象', + 'text_label_queryMode': '查询模式', + 'text_label_searchTips': '搜索城市地点或图层要素', + 'text_label_chooseSearchLayers': '选择查询图层', + 'text_loadSearchCriteria': '加载搜索条件', + 'text_saveSearchCriteria': '保存搜索条件', + "btn_analyze": "分析", + "btn_analyzing": "分析中", + "btn_emptyTheAnalysisLayer": "清空分析图层", + "btn_cancelAnalysis": "取消", + "btn_query": "查询", + "btn_querying": "查询中", + "btn_emptyTheRresultLayer": "清除所有结果图层", + 'msg_dataFlowServiceHasBeenSubscribed': '已订阅该数据流服务。', + 'msg_inputDataFlowUrlFirst': '请先输入数据流服务地址。', + 'msg_datasetOrMethodUnsupport': '该数据集不支持本分析类型,请重新选择数据集', + 'msg_selectDataset': '请选择数据集!', + 'msg_setTheWeightField': '请设置权重字段!', + 'msg_theFieldNotSupportAnalysis': '您当前选择的字段不支持分析!', + 'msg_resultIsEmpty': '分析的结果为空!', + 'msg_dataReturnedIsEmpty': '请求成功,查询返回的数据为空。', + 'msg_openFileFail': '打开文件失败!', + 'msg_fileTypeUnsupported': '不支持该文件格式!', + 'msg_fileSizeExceeded': '文件大小超限!文件大小不得超过 10M!', + 'msg_dataInWrongGeoJSONFormat': '数据格式错误!非标准的 GEOJSON 格式数据!', + 'msg_dataInWrongFormat': '数据格式错误!非标准的 EXCEL, CSV 或 GEOJSON 格式数据!', + 'msg_searchKeywords': "搜索关键字不能为空,请输入搜索条件。", + 'msg_searchGeocodeField': "未匹配到地址匹配服务数据!", + 'msg_cityGeocodeField': "未配置当前城市的地址匹配服务。", + 'msg_getFeatureField': "未查找到相关矢量要素!", + 'msg_dataflowservicesubscribed': '已订阅该数据流服务。', + 'msg_subscribesucceeded': '数据流服务订阅成功。', + 'msg_crsunsupport': '不支持当前地图的坐标系', + 'msg_tilematrixsetunsupport': '不支持传入的TileMatrixSet', + 'msg_jsonResolveFiled': 'json格式解析失败!', + 'msg_requestContentFiled': '通过iportal请求数据失败!', + 'msg_getdatafailed': '获取数据失败!' +}; + +;// CONCATENATED MODULE: ./src/common/lang/Lang.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @name Lang + * @namespace + * @category BaseTypes Internationalization + * @description 国际化的命名空间,包含多种语言和方法库来设置和获取当前的语言。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { Lang } from '{npm}'; + * + * const result = Lang.getCode(); + * + * ``` + */ + +var Lang = { + 'en-US': en, + "zh-CN": zh, + + /** + * @member {string} Lang.code + * @description 当前所使用的语言类型。 + */ + code: null, + + /** + * @member {string} [Lang.defaultCode='en-US'] + * @description 默认使用的语言类型。 + */ + defaultCode: "en-US", + + /** + * @function Lang.getCode + * @description 获取当前的语言代码。 + * @returns {string} 当前的语言代码。 + */ + getCode: function getCode() { + if (!Lang.code) { + Lang.setCode(); + } + + return Lang.code; + }, + + /** + * @function Lang.setCode + * @description 设置语言代码。 + * @param {string} code - 此参数遵循IETF规范。 + */ + setCode: function setCode() { + var lang = this.getLanguageFromCookie(); + + if (lang) { + Lang.code = lang; + return; + } + + lang = Lang.defaultCode; + + if (navigator.appName === 'Netscape') { + lang = navigator.language; + } else { + lang = navigator.browserLanguage; + } + + if (lang.indexOf('zh') === 0) { + lang = 'zh-CN'; + } + + if (lang.indexOf('en') === 0) { + lang = 'en-US'; + } + + Lang.code = lang; + }, + + /** + * @function Lang.getLanguageFromCookie + * @description 从 cookie 中获取语言类型。 + */ + getLanguageFromCookie: function getLanguageFromCookie() { + var name = 'language='; + var ca = document.cookie.split(';'); + + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + + if (c.indexOf(name) !== -1) { + return c.substring(name.length, c.length); + } + } + + return ""; + }, + + /** + * @function Lang.i18n + * @description 从当前语言字符串的字典查找 key。 + * @param {string} key - 字典中 i18n 字符串值的关键字。 + * @returns {string} 国际化的字符串。 + */ + i18n: function i18n(key) { + var dictionary = Lang[Lang.getCode()]; + var message = dictionary && dictionary[key]; + + if (!message) { + // Message not found, fall back to message key + message = key; + } + + return message; + } +}; + +;// CONCATENATED MODULE: external "function(){try{return XLSX}catch(e){return {}}}()" +var external_function_try_return_XLSX_catch_e_return_namespaceObject = function(){try{return XLSX}catch(e){return {}}}(); +var external_function_try_return_XLSX_catch_e_return_default = /*#__PURE__*/__webpack_require__.n(external_function_try_return_XLSX_catch_e_return_namespaceObject); +;// CONCATENATED MODULE: ./src/common/components/util/FileReaderUtil.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @name FileReaderUtil + * @namespace + * @category Components OpenFile + * @description 组件读取文件工具类。 + * @version 9.1.1 + * @type {{rABS: (boolean|*), rABF: (boolean|*), rAT: (boolean|*), readFile: (function(*, *=, *=, *=, *=)), readTextFile: (function(*, *=, *=, *=)), readXLSXFile: (function(*, *=, *=, *=)), processDataToGeoJson: (function(string, Object): GeoJSONObject), processExcelDataToGeoJson: (function(Object): GeoJSONObject), isXField: (function(*)), isYField: (function(*)), string2Csv: (function(*, *=))}} + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { FileReaderUtil } from '{npm}'; + * + * const result = FileReaderUtil.isXField(data); + * ``` + */ + +var FileReaderUtil = { + rABS: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString, + rABF: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsArrayBuffer, + rAT: typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsText, + + /** + * @function FileReaderUtil.prototype.readFile + * @description 读取文件 + * @param {string} fileType - 当前读取的文件类型 + * + * @param {Object} file - 读取回来的文件内容对象 + * @param {function} success - 读取文件成功回调函数 + * @param {function} failed - 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readFile: function readFile(fileType, file, success, failed, context) { + if (FileTypes.JSON === fileType || FileTypes.GEOJSON === fileType) { + this.readTextFile(file, success, failed, context); + } else if (FileTypes.EXCEL === fileType || FileTypes.CSV === fileType) { + this.readXLSXFile(file, success, failed, context); + } + }, + + /** + * @description 读取文本文件 + * @param {Object} file 文件内容对象 + * @param {function} success 读取文件成功回调函数 + * @param {function} failed 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readTextFile: function readTextFile(file, success, failed, context) { + var reader = new FileReader(); + + reader.onloadend = function (evt) { + success && success.call(context, evt.target.result); + }; + + reader.onerror = function (error) { + failed && failed.call(context, error); + }; + + this.rAT ? reader.readAsText(file.file, 'utf-8') : reader.readAsBinaryString(file.file); + }, + + /** + * @description 读取excel或csv文件 + * @param {Object} file 文件内容对象 + * @param {function} success 读取文件成功回调函数 + * @param {function} failed 读取文件失败回调函数 + * @param {Object} context - 回调重定向对象 + */ + readXLSXFile: function readXLSXFile(file, success, failed, context) { + var reader = new FileReader(); + + reader.onloadend = function (evt) { + var xLSXData = new Uint8Array(evt.target.result); + var workbook = external_function_try_return_XLSX_catch_e_return_default().read(xLSXData, { + type: "array" + }); + + try { + if (workbook && workbook.SheetNames && workbook.SheetNames.length > 0) { + //暂时只读取第一个sheets的内容 + var sheetName = workbook.SheetNames[0]; + var xLSXCSVString = external_function_try_return_XLSX_catch_e_return_default().utils.sheet_to_csv(workbook.Sheets[sheetName]); + success && success.call(context, xLSXCSVString); + } + } catch (error) { + failed && failed.call(context, error); + } + }; + + reader.onerror = function (error) { + failed && failed.call(context, error); + }; + + this.rABF && reader.readAsArrayBuffer(file.file); + }, + + /** + * @function FileReaderUtil.prototype.processDataToGeoJson + * @description 将读取回来得数据统一处理为 GeoJSON 格式 + * @param {string} type - 文件类型 + * @param {Object} data - 读取返回的数据对象 + * @param {function} success - 数据处理成功的回调 + * @param {function} failed - 数据处理失败的回调 + * @param {Object} context - 回调重定向对象 + * @returns {GeoJSONObject} 返回标准 GeoJSON 规范格式数据 + * @private + */ + processDataToGeoJson: function processDataToGeoJson(type, data, success, failed, context) { + var geojson = null; + + if (type === "EXCEL" || type === "CSV") { + geojson = this.processExcelDataToGeoJson(data); + success && success.call(context, geojson); + } else if (type === 'JSON' || type === 'GEOJSON') { + var result = data; //geojson、json未知,通过类容来判断 + + if (typeof result === "string") { + result = JSON.parse(result); + } + + if (result.type === 'ISERVER') { + geojson = result.data.recordsets[0].features; + } else if (result.type === 'FeatureCollection') { + //geojson + geojson = result; + } else { + //不支持数据 + failed && failed.call(context, Lang.i18n('msg_dataInWrongGeoJSONFormat')); + } + + success && success.call(context, geojson); + } else { + failed && failed.call(context, Lang.i18n('msg_dataInWrongFormat')); + } + }, + + /** + * @function FileReaderUtil.prototype.processExcelDataToGeoJson + * @description 表格文件数据处理 + * @param {Object} data - 读取的表格文件数据 + * @returns {GeoJSONObject} 返回标准 GeoJSON 规范格式数据 + * @private + */ + processExcelDataToGeoJson: function processExcelDataToGeoJson(data) { + //处理为对象格式转化 + var dataContent = this.string2Csv(data); + var fieldCaptions = dataContent.colTitles; //位置属性处理 + + var xfieldIndex = -1, + yfieldIndex = -1; + + for (var i = 0, len = fieldCaptions.length; i < len; i++) { + if (this.isXField(fieldCaptions[i])) { + xfieldIndex = i; + } + + if (this.isYField(fieldCaptions[i])) { + yfieldIndex = i; + } + } // feature 构建后期支持坐标系 4326/3857 + + + var features = []; + + for (var _i = 0, _len = dataContent.rows.length; _i < _len; _i++) { + var row = dataContent.rows[_i]; //if (featureFrom === "LonLat") { + + var x = Number(row[xfieldIndex]), + y = Number(row[yfieldIndex]); //属性信息 + + var attributes = {}; + + for (var index in dataContent.colTitles) { + var key = dataContent.colTitles[index]; + attributes[key] = dataContent.rows[_i][index]; + } //目前csv 只支持处理点,所以先生成点类型的 geojson + + + var feature = { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [x, y] + }, + "properties": attributes + }; + features.push(feature); + } + + return features; + }, + + /** + * @description 判断是否地理X坐标 + * @param {string} data 字段名 + */ + isXField: function isXField(data) { + var lowerdata = data.toLowerCase(); + return lowerdata === "x" || lowerdata === "smx" || lowerdata === "jd" || lowerdata === "经度" || lowerdata === "东经" || lowerdata === "longitude" || lowerdata === "lot" || lowerdata === "lon" || lowerdata === "lng" || lowerdata === "x坐标"; + }, + + /** + * @description 判断是否地理Y坐标 + * @param {string} data 字段名 + */ + isYField: function isYField(data) { + var lowerdata = data.toLowerCase(); + return lowerdata === "y" || lowerdata === "smy" || lowerdata === "wd" || lowerdata === "纬度" || lowerdata === "北纬" || lowerdata === "latitude" || lowerdata === "lat" || lowerdata === "y坐标"; + }, + + /** + * @description 字符串转为dataEditor 支持的csv格式数据 + * @param {string} string 待转化的字符串 + * @param {boolean} withoutTitle 是否需要列标题 + */ + string2Csv: function string2Csv(string, withoutTitle) { + // let rows = string.split('\r\n'); + var rows = string.split('\n'); + var result = {}; + + if (!withoutTitle) { + result["colTitles"] = rows[0].split(','); + } else { + result["colTitles"] = []; + } + + result['rows'] = []; + + for (var i = withoutTitle ? 0 : 1; i < rows.length; i++) { + rows[i] && result['rows'].push(rows[i].split(',')); + } + + return result; + } +}; +;// CONCATENATED MODULE: ./src/common/components/chart/ChartModel.js +function ChartModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class ChartModel + * @classdesc 图表组件数据模型 + * @private + * @param {Object} datasets - 数据来源。 + * @category Components Chart + * @fires ChartModel#getdatafailed + */ + +var ChartModel = /*#__PURE__*/function () { + function ChartModel(datasets) { + ChartModel_classCallCheck(this, ChartModel); + + this.datasets = datasets; + this.EVENT_TYPES = ['getdatafailed']; + this.events = new Events(this, null, this.EVENT_TYPES); + } + /** + * @private + * @function ChartModel.prototype.getDatasetInfo + * @description 获得数据集数据。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + + + ChartModel_createClass(ChartModel, [{ + key: "getDatasetInfo", + value: function getDatasetInfo(success) { + var datasetUrl = this.datasets.url; + var me = this; + FetchRequest.get(datasetUrl).then(function (response) { + return response.json(); + }).then(function (results) { + if (results.datasetInfo) { + var datasetInfo = results.datasetInfo; + me.datasetsInfo = { + dataSourceName: datasetInfo.dataSourceName, + datasetName: datasetInfo.name, + mapName: results.name + }; + success({ + result: me.datasetsInfo + }); + } + })["catch"](function (error) { + console.log(error); + + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype.getDataFeatures + * @description 请求数据集的数据信息 + * @param {Object} results - 数据集信息。 + * @param {function} success - 成功回调函数。 + */ + + }, { + key: "getDataFeatures", + value: function getDataFeatures(results, success) { + var datasetsInfo = results.result; + var getFeatureParam, getFeatureBySQLParams, getFeatureBySQLService; + var params = { + name: datasetsInfo.datasetName + '@' + datasetsInfo.dataSourceName + }; + Object.assign(params, this.datasets.queryInfo); + getFeatureParam = new FilterParameter(params); + getFeatureBySQLParams = new GetFeaturesBySQLParameters({ + queryParameter: getFeatureParam, + datasetNames: [datasetsInfo.dataSourceName + ':' + datasetsInfo.datasetName], + fromIndex: 0, + toIndex: 100000 + }); + getFeatureBySQLService = new GetFeaturesBySQLService(datasetsInfo.dataUrl, { + eventListeners: { + processCompleted: success, + processFailed: function processFailed() {} + } + }); + getFeatureBySQLService.processAsync(getFeatureBySQLParams); + } + /** + * @private + * @function ChartModel.prototype.getLayerFeatures + * @description 请求图层要素的数据信息 + * @param {Object} results - 数据集信息。 + * @param {Callbacks} success - 成功回调函数。 + */ + + }, { + key: "getLayerFeatures", + value: function getLayerFeatures(results, success) { + var datasetsInfo = results.result; + var queryParam, queryBySQLParams, queryBySQLService; + var params = { + name: datasetsInfo.mapName + }; + Object.assign(params, this.datasets.queryInfo); + queryParam = new FilterParameter(params); + queryBySQLParams = new QueryBySQLParameters({ + queryParams: [queryParam], + expectCount: 100000 + }); + queryBySQLService = new QueryBySQLService(datasetsInfo.dataUrl, { + eventListeners: { + processCompleted: success, + processFailed: function processFailed() {} + } + }); + queryBySQLService.processAsync(queryBySQLParams); + } + /** + * @private + * @function ChartModel.prototype.getDataInfoByIptl + * @description 用dataId获取iportal的数据。 + * @param {Callbacks} success - 成功回调函数。 + * + */ + + }, { + key: "getDataInfoByIptl", + value: function getDataInfoByIptl(success) { + // success是chart的回调 + this.getServiceInfo(this.datasets.url, success); + } + /** + * @private + * @function ChartModel.prototype.getServiceInfo + * @description 用iportal获取dataItemServices。 + * @param {string} url + * @param {Callbacks} success - 成功回调函数。 + * */ + + }, { + key: "getServiceInfo", + value: function getServiceInfo(url, success) { + var me = this; + FetchRequest.get(url, null, { + withCredentials: this.datasets.withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + if (data.succeed === false) { + //请求失败 + me._fireFailedEvent(data); + + return; + } // 是否有rest服务 + + + if (data.dataItemServices && data.dataItemServices.length > 0) { + var dataItemServices = data.dataItemServices, + resultData; + dataItemServices.forEach(function (item) { + // 如果有restdata并且发布成功,就请求restdata服务 + // 如果有restmap并且发布成功,就请求restmap服务 + // 其他情况就请求iportal/content.json + if (item.serviceType === 'RESTDATA' && item.serviceStatus === 'PUBLISHED') { + resultData = item; + } else if (item.serviceType === 'RESTMAP' && item.serviceStatus === 'PUBLISHED') { + resultData = item; + } else { + me.getDatafromContent(url, success); + return; + } + }); // 如果有服务,获取数据源和数据集, 然后请求rest服务 + + resultData && me.getDatafromRest(resultData.serviceType, resultData.address, success); + } else { + me.getDatafromContent(url, success); + return; + } + })["catch"](function (error) { + console.log(error); + + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype.getDatafromURL + * @description 用iportal获取数据。(通过固定的url来请求,但是不能请求工作空间的数据) + * @param {string} url + * @param {Callbacks} success - 成功回调函数。 + */ + + }, { + key: "getDatafromContent", + value: function getDatafromContent(url, success) { + var _this = this; + + // 成功回调传入的results + var results = { + result: {} + }, + me = this; + url += '/content.json?pageSize=9999999¤tPage=1'; // 获取图层数据 + + FetchRequest.get(url, null, { + withCredentials: this.datasets.withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + if (data.succeed === false) { + //请求失败 + me._fireFailedEvent(data); + + return; + } + + if (data.type) { + if (data.type === 'JSON' || data.type === 'GEOJSON') { + // 将字符串转换成json + data.content = JSON.parse(data.content.trim()); // 如果是json文件 data.content = {type:'fco', features},格式不固定 + + if (!data.content.features) { + //json格式解析失败 + console.log(Lang.i18n('msg_jsonResolveFiled')); + return; + } + + var features = _this._formatGeoJSON(data.content); + + results.result.features = { + type: data.content.type, + features: features + }; + } else if (data.type === 'EXCEL' || data.type === 'CSV') { + var _features = _this._excelData2Feature(data.content); + + results.result.features = { + type: 'FeatureCollection', + features: _features + }; + } + + success(results, 'content'); + } + }, this)["catch"](function (error) { + console.log(error); + + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype._getDataSource + * @description 获取数据源名和数据集名。 + * @param {string} serviceType 服务类型 + * @param {string} address 地址 + * @param {Callbacks} success - 成功回调函数。 + * @return {Array.} ["数据源名:数据集名"] + * @return {string} 图层名 + */ + + }, { + key: "getDatafromRest", + value: function getDatafromRest(serviceType, address, success) { + var me = this, + withCredentials = this.datasets.withCredentials; + + if (serviceType === 'RESTDATA') { + var url = "".concat(address, "/data/datasources"), + sourceName, + datasetName; // 请求获取数据源名 + + FetchRequest.get(url, null, { + withCredentials: withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + sourceName = data.datasourceNames[0]; + url = "".concat(address, "/data/datasources/").concat(sourceName, "/datasets"); // 请求获取数据集名 + + FetchRequest.get(url, null, { + withCredentials: withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + datasetName = data.datasetNames[0]; // 请求restdata服务 + + me.getDatafromRestData("".concat(address, "/data"), [sourceName + ':' + datasetName], success); + return [sourceName + ':' + datasetName]; + })["catch"](function (error) { + me._fireFailedEvent(error); + }); + })["catch"](function (error) { + me._fireFailedEvent(error); + }); + } else { + // 如果是地图服务 + var _url = "".concat(address, "/maps"), + mapName, + layerName, + path; // 请求获取地图名 + + + FetchRequest.get(_url, null, { + withCredentials: withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + mapName = data[0].name; + path = data[0].path; + _url = _url = "".concat(address, "/maps/").concat(mapName, "/layers"); // 请求获取图层名 + + FetchRequest.get(_url, null, { + withCredentials: withCredentials + }).then(function (response) { + return response.json(); + }).then(function (data) { + layerName = data[0].subLayers.layers[0].caption; // 请求restmap服务 + + me.getDatafromRestMap(layerName, path, success); + return layerName; + })["catch"](function (error) { + me._fireFailedEvent(error); + }); + })["catch"](function (error) { + me._fireFailedEvent(error); + }); + } + } + /** + * @private + * @function ChartModel.prototype.getDatafromRestData + * @description 请求restdata服务 + * @param {string} url + * @param {Array} dataSource [数据源名:数据集名] + * @param {Callbacks} success - 成功回调函数。 + */ + + }, { + key: "getDatafromRestData", + value: function getDatafromRestData(url, dataSource, success) { + var me = this; + this.datasets.queryInfo.attributeFilter = this.datasets.queryInfo.attributeFilter || 'SmID>0'; + + this._getFeatureBySQL(url, dataSource, this.datasets.queryInfo, function (results) { + // 此时的features已经处理成geojson了 + success(results, 'RESTDATA'); + }, function (error) { + console.log(error); + + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype.getDatafromRestMap + * @description 请求restmap服务 + * @param {string} dataSource layerName + * @param {string} path - map服务地址。 + * @param {Callbacks} success - 成功回调函数。 + */ + + }, { + key: "getDatafromRestMap", + value: function getDatafromRestMap(dataSource, path, success) { + var me = this; + this.datasets.queryInfo.attributeFilter = this.datasets.queryInfo.attributeFilter || 'smid=1'; + + this._queryFeatureBySQL(path, dataSource, this.datasets.queryInfo, null, null, function (results) { + // let features = result.result.recordsets[0].features; + success(results, 'RESTMAP'); + }, function (error) { + console.log(error); + + me._fireFailedEvent(error); + }); + } + /** + * @private + * @function ChartModel.prototype._getFeatureBySQL + * @description 通过 sql 方式查询数据。 + */ + + }, { + key: "_getFeatureBySQL", + value: function _getFeatureBySQL(url, datasetNames, queryInfo, _processCompleted, processFaild) { + var getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams; + var params = { + name: datasetNames.join().replace(':', '@') + }; + Object.assign(params, queryInfo); + getFeatureParam = new FilterParameter(params); + getFeatureBySQLParams = new GetFeaturesBySQLParameters({ + queryParameter: getFeatureParam, + datasetNames: datasetNames, + fromIndex: 0, + toIndex: 100000, + returnContent: true + }); + var options = { + eventListeners: { + processCompleted: function processCompleted(getFeaturesEventArgs) { + _processCompleted && _processCompleted(getFeaturesEventArgs); + }, + processFailed: function processFailed(e) { + processFaild && processFaild(e); + } + } + }; + getFeatureBySQLService = new GetFeaturesBySQLService(url, options); + getFeatureBySQLService.processAsync(getFeatureBySQLParams); + } + /** + * @private + * @function ChartModel.prototype._queryFeatureBySQL + * @description 通过 sql 方式查询数据。 + */ + + }, { + key: "_queryFeatureBySQL", + value: function _queryFeatureBySQL(url, layerName, queryInfo, fields, epsgCode, processCompleted, processFaild, startRecord, recordLength, onlyAttribute) { + var queryParam, queryBySQLParams; + var filterParams = { + name: layerName + }; + Object.assign(filterParams, queryInfo); + queryParam = new FilterParameter(filterParams); + + if (fields) { + queryParam.fields = fields; + } + + var params = { + queryParams: [queryParam] + }; + + if (onlyAttribute) { + params.queryOption = QueryOption.ATTRIBUTE; + } + + startRecord && (params.startRecord = startRecord); + recordLength && (params.expectCount = recordLength); + + if (epsgCode) { + params.prjCoordSys = { + epsgCode: epsgCode + }; + } + + queryBySQLParams = new QueryBySQLParameters(params); + + this._queryBySQL(url, queryBySQLParams, function (data) { + data.type === 'processCompleted' ? processCompleted(data) : processFaild(data); + }); + } + /** + * @function ChartModel.prototype._queryBySQL + * @description SQL 查询服务。 + * @param {QueryBySQLParameters} params - SQL 查询相关参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 结果类型。 + */ + + }, { + key: "_queryBySQL", + value: function _queryBySQL(url, params, callback, resultFormat) { + var me = this; + var queryBySQLService = new QueryBySQLService(url, { + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + queryBySQLService.processAsync(params); + } + /** + * @function ChartModel.prototype._processFormat + * @description 将数据转换成geojson。 + * @param {Object} resultFormat - 返回结果集。 + * @return {Object} [resultFormat=DataFormat.GEOJSON] - 结果类型。 + */ + + }, { + key: "_processFormat", + value: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } + /** + * @private + * @function ChartModel.prototype._formatGeoJSON + * @description 格式 GeoJSON。 + * @param {GeoJSON} data - GeoJSON 数据。 + */ + + }, { + key: "_formatGeoJSON", + value: function _formatGeoJSON(data) { + var features = data.features; + features.forEach(function (row, index) { + row.properties['index'] = index; + }); + return features; + } + /** + * @private + * @description 将 csv 和 xls 文件内容转换成 geojson + * @function ChartModel.prototype._excelData2Feature + * @param content 文件内容 + * @param layerInfo 图层信息 + * @returns {Array} feature的数组集合 + */ + + }, { + key: "_excelData2Feature", + value: function _excelData2Feature(dataContent) { + var fieldCaptions = dataContent.colTitles; //位置属性处理 + + var xfieldIndex = -1, + yfieldIndex = -1; + + for (var i = 0, len = fieldCaptions.length; i < len; i++) { + if (FileReaderUtil.isXField(fieldCaptions[i])) { + xfieldIndex = i; + } + + if (FileReaderUtil.isYField(fieldCaptions[i])) { + yfieldIndex = i; + } + } // feature 构建后期支持坐标系 4326/3857 + + + var features = []; + + for (var _i = 0, _len = dataContent.rows.length; _i < _len; _i++) { + var row = dataContent.rows[_i]; + var x = Number(row[xfieldIndex]), + y = Number(row[yfieldIndex]); //属性信息 + + var attributes = {}; + + for (var index in dataContent.colTitles) { + var key = dataContent.colTitles[index]; + attributes[key] = dataContent.rows[_i][index]; + } + + attributes['index'] = _i + ''; //目前csv 只支持处理点,所以先生成点类型的 geojson + + var feature = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [x, y] + }, + properties: attributes + }; + features.push(feature); + } + + return features; + } + /** + * @private + * @description 请求数据失败的事件 + * @function ChartModel.prototype._fireFailedEvent + * @param {Object} error 错误信息 + */ + + }, { + key: "_fireFailedEvent", + value: function _fireFailedEvent(error) { + var errorData = error ? { + error: error, + message: Lang.i18n('msg_getdatafailed') + } : { + message: Lang.i18n('msg_getdatafailed') + }; + /** + * @event ChartModel#getdatafailed + * @description 监听到获取数据失败事件后触发 + * @property {Object} error - 事件对象。 + */ + + this.events.triggerEvent('getdatafailed', errorData); + } + }]); + + return ChartModel; +}(); +;// CONCATENATED MODULE: ./src/common/components/chart/ChartViewModel.js +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function ChartViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartViewModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ChartViewModel + * @aliasclass Components.ChartViewModel + * @deprecatedclass SuperMap.Components.ChartViewModel + * @classdesc 图表组件功能类 + * @category Components Chart + * @version 10.0.0 + * @param {Object} options - 可选参数。 + * @param {string} options.type - 图表类型。 + * @param {ChartView.Datasets} options.datasets - 数据来源。 + * @param {Array.} options.chartOptions - 图表可选配置。 + * @param {Array.} options.chartOptions.xAxis - X轴可选参数。 + * @param {string} options.chartOptions.xAxis.field - X轴字段名。 + * @param {string} options.chartOptions.xAxis.name - X轴名称。 + * @param {Array.} options.chartOptions.yAxis - Y轴可选参数。 + * @param {string} options.chartOptions.yAxis.field - Y轴字段名。 + * @param {string} options.chartOptions.yAxis.name - Y轴名称。 + * @fires ChartViewModel#getdatafailed + * @usage + */ + +var ChartViewModel = /*#__PURE__*/function () { + function ChartViewModel(options) { + ChartViewModel_classCallCheck(this, ChartViewModel); + + this.datasets = options.datasets; + this.xField = []; + this.yField = []; + this.grid = { + top: "50px", + bottom: "50px", + left: "50px", + right: "60px" + }; + this.chartType = options.type || "bar"; + + this._initXYField(options.chartOptions); + + this.EVENT_TYPES = ["getdatafailed"]; + this.events = new Events(this, null, this.EVENT_TYPES); + } + /** + * @function ChartViewModel.prototype._initXYField + * @description 初始化XY字段。 + * @private + * @param {Object} chartOptions - options里的图表参数。 + */ + + + ChartViewModel_createClass(ChartViewModel, [{ + key: "_initXYField", + value: function _initXYField(chartOptions) { + var me = this; + + if (chartOptions && chartOptions.length > 0) { + chartOptions.forEach(function (option) { + if (option.xAxis) { + me.xField.push({ + field: option.xAxis.field, + name: option.xAxis.name + }); + } + + if (option.yAxis) { + me.yField.push({ + field: option.yAxis.field, + name: option.yAxis.name + }); + } + }); + } + } + /** + * @function ChartViewModel.prototype.getDatasetInfo + * @description 获得数据集数据。 + * @param {function} success - 成功回调函数。 + */ + + }, { + key: "getDatasetInfo", + value: function getDatasetInfo(success) { + var _this = this; + + this.createChart = success; + + if (this.datasets && this._checkUrl(this.datasets.url)) { + this.chartModel = new ChartModel(this.datasets); + + if (this.datasets.type === 'iServer') { + this.chartModel.getDatasetInfo(this._getDatasetInfoSuccess.bind(this)); + } else if (this.datasets.type === 'iPortal') { + this.chartModel.getDataInfoByIptl(this._getDataInfoSuccess.bind(this)); + } + /** + * @event ChartViewModel#getdatafailed + * @description 监听到获取数据失败事件后触发。 + * @property {Object} error - 事件对象。 + */ + + + this.chartModel.events.on({ + "getdatafailed": function getdatafailed(error) { + _this.events.triggerEvent("getdatafailed", error); + } + }); + } + } + /** + * @function ChartViewModel.prototype._getDatasetInfoSuccess + * @description 成功回调函数。 + * @private + * @param {Object} results - 数据集信息。 + */ + + }, { + key: "_getDatasetInfoSuccess", + value: function _getDatasetInfoSuccess(results) { + var datasetUrl = this.datasets.url; //判断服务为地图服务 或者 数据服务 + + var restIndex = datasetUrl.indexOf("rest"); + + if (restIndex > 0) { + var index = datasetUrl.indexOf("/", restIndex + 5); + var type = datasetUrl.substring(restIndex + 5, index); + var dataUrl = datasetUrl.substring(0, restIndex + 4) + "/data"; + + if (type === "maps") { + var mapIndex = datasetUrl.indexOf("/", index + 1); + var mapName = datasetUrl.substring(index + 1, mapIndex); + dataUrl = datasetUrl.substring(0, restIndex + 4) + "/maps/" + mapName; + results.result.dataUrl = dataUrl; + + this._getLayerFeatures(results); + } else if (type === "data") { + results.result.dataUrl = dataUrl; + + this._getDataFeatures(results); + } + } + } + /** + * @function ChartViewModel.prototype._getDataInfoSuccess + * @description 请求iportal数据成功之后的回调。 + * @private + */ + + }, { + key: "_getDataInfoSuccess", + value: function _getDataInfoSuccess(results, type) { + var me = this; + + if (type === 'RESTMAP') { + me._getChartDatasFromLayer(results); + } else { + me._getChartDatas(results); + } + } + /** + * @function ChartViewModel.prototype._getDataFeatures + * @description 请求数据集的数据信息 + * @private + * @param {Object} results - 数据集信息 + */ + + }, { + key: "_getDataFeatures", + value: function _getDataFeatures(results) { + this.chartModel.getDataFeatures(results, this._getChartDatas.bind(this)); + } + /** + * @function ChartViewModel.prototype._getLayerFeatures + * @description 请求图层的数据信息。 + * @private + * @param {Object} results - 数据集信息。 + */ + + }, { + key: "_getLayerFeatures", + value: function _getLayerFeatures(results) { + this.chartModel.getLayerFeatures(results, this._getChartDatasFromLayer.bind(this)); + } + /** + * @function ChartViewModel.prototype._getChartDatas + * @description 将请求回来的数据转换为图表所需的数据格式。 + * @private + * @param {Object} results - 数据要素信息。 + */ + + }, { + key: "_getChartDatas", + value: function _getChartDatas(results) { + if (results) { + // 数据来自restdata---results.result.features + this.features = results.result.features; + var features = this.features.features; + var data = {}; + + if (features.length) { + var feature = features[0]; + var attrFields = [], + itemTypes = []; + + for (var attr in feature.properties) { + attrFields.push(attr); + itemTypes.push(this._getDataType(feature.properties[attr])); + } + + data = { + features: features, + fieldCaptions: attrFields, + fieldTypes: itemTypes, + fieldValues: [] + }; + + for (var m in itemTypes) { + var fieldValue = []; + + for (var j in features) { + var _feature = features[j]; + var caption = data.fieldCaptions[m]; + var value = _feature.properties[caption]; + fieldValue.push(value); + } + + data.fieldValues.push(fieldValue); + } + + this.createChart(data); + } + } + } + /** + * @function ChartViewModel.prototype._getChartDatasFromLayer + * @description 将请求回来的数据转换为图表所需的数据格式。 + * @private + * @param {Object} results - 图层数据要素信息。 + */ + + }, { + key: "_getChartDatasFromLayer", + value: function _getChartDatasFromLayer(results) { + if (results.result.recordsets) { + var recordsets = results.result.recordsets[0]; + var features = recordsets.features.features; + this.features = recordsets.features; + var data = {}; + + if (features.length) { + data = { + features: recordsets.features, + fieldCaptions: recordsets.fieldCaptions, + fieldTypes: recordsets.fieldTypes, + fieldValues: [] + }; + + for (var m in data.fieldCaptions) { + var fieldValue = []; + + for (var j in features) { + var feature = features[j]; + var caption = data.fieldCaptions[m]; + var value = feature.properties[caption]; + fieldValue.push(value); + } + + data.fieldValues.push(fieldValue); + } + + this.createChart(data); + } + } + } + /** + * @function ChartViewModel.prototype._createChartOptions + * @description 创建图表所需参数。 + * @private + * @param {Object} data - 图表数据。 + */ + + }, { + key: "_createChartOptions", + value: function _createChartOptions(data) { + this.calculatedData = this._createChartDatas(data); + return this.updateChartOptions(this.chartType); + } + /** + * @function ChartViewModel.prototype.changeType + * @description 改变图表类型。 + * @param {string} type - 图表类型。 + */ + + }, { + key: "changeType", + value: function changeType(type) { + if (type !== this.chartType) { + this.chartType = type; + return this.updateChartOptions(this.chartType); + } + } + /** + * @function ChartViewModel.prototype.updateData + * @description 改变图表类型。 + * @param {ChartView.Datasets} datasets - 数据来源。 + * @param {function} success 成功回调函数。 + */ + + }, { + key: "updateData", + value: function updateData(datasets, chartOption, success) { + this.updateChart = success; + this.xField = []; + this.yField = []; + + this._initXYField(chartOption); // type的设置默认值 + + + datasets.type = datasets.type || 'iServer'; // withCredentials的设置默认值 + + datasets.withCredentials = datasets.withCredentials || false; + this.datasets = datasets; + this.getDatasetInfo(this._updateDataSuccess.bind(this)); + } + /** + * @function ChartViewModel.prototype._updateDataSuccess + * @description 改变图表类型。 + * @private + * @param {Object} data - 图表数据。 + */ + + }, { + key: "_updateDataSuccess", + value: function _updateDataSuccess(data) { + var options = this._createChartOptions(data); + + this.updateChart(options); + } + /** + * @function ChartViewModel.prototype.updateChartOptions + * @description 更新图表所需参数。 + * @param {string} type - 图表类型。 + * @param {Object} style - 图表样式。 + */ + + }, { + key: "updateChartOptions", + value: function updateChartOptions(type, style) { + if (this.calculatedData) { + var grid = this.grid; + + var series = this._createChartSeries(this.calculatedData, type); + + var datas = []; + + for (var i in this.calculatedData.XData) { + datas.push({ + value: this.calculatedData.XData[i].fieldsData + }); + } + + var xAxis = { + type: "category", + name: this.xField[0].name || "X", + data: datas, + nameTextStyle: { + color: '#fff', + fontSize: 14 + }, + splitLine: { + show: false + }, + axisLine: { + lineStyle: { + color: '#eee' + } + } + }; + var yAxis = { + type: "value", + name: this.yFieldName || "Y", + data: {}, + nameTextStyle: { + color: '#fff', + fontSize: 14 + }, + splitLine: { + show: false + }, + axisLine: { + lineStyle: { + color: '#eee' + } + } + }; + var tooltip = { + formatter: '{b0}: {c0}' + }; + var backgroundColor = '#404a59'; + + if (style) { + if (style.grid) { + grid = style.grid; + } + + if (style.tooltip) { + tooltip = style.tooltip; + } + + if (style.backgroundColor) { + backgroundColor = style.backgroundColor; + } + } + + return { + backgroundColor: backgroundColor, + grid: grid, + series: series, + xAxis: xAxis, + yAxis: yAxis, + tooltip: tooltip + }; + } + } + /** + * @function ChartViewModel.prototype._createChartDatas + * @description 构建图表数据。 + * @private + * @param {Object} data - 源数据。 + */ + + }, { + key: "_createChartDatas", + value: function _createChartDatas(data) { + var fieldIndex = 0, + yfieldIndexs = []; + var fieldCaptions = data.fieldCaptions; + var me = this; //X + + fieldCaptions.forEach(function (field, index) { + if (me.xField[0] && field === me.xField[0].field) { + fieldIndex = index; + } + }); //Y + + this.yFieldName = ""; + this.yField.forEach(function (value, index) { + if (index !== 0) { + me.yFieldName = me.yFieldName + ","; + } + + me.yFieldName = me.yFieldName + value.name; + fieldCaptions.forEach(function (field, index) { + if (field === value.field) { + yfieldIndexs.push(index); + } + }); + }); + + var datas = this._getAttrData(data, fieldIndex); + + var yDatas = []; + + if (yfieldIndexs.length > 0) { + yfieldIndexs.forEach(function (yfieldIndex) { + var yData = []; + + for (var i in data.fieldValues[yfieldIndex]) { + yData.push({ + value: data.fieldValues[yfieldIndex][i] + }); + } + + yDatas.push(yData); + }); + } else { + //未指定Y字段时,y轴计数 + var YData = [], + XData = [], + len = datas.length; //计算X轴,Y轴数据,并去重 + + for (var i = 0; i < len; i++) { + var isSame = false; + + for (var j = 0, leng = XData.length; j < leng; j++) { + if (datas[i].fieldsData === XData[j].fieldsData) { + YData[j].value++; + XData[j].recordIndexs.push(i); + isSame = true; + break; + } + } + + if (!isSame) { + if (datas[i].fieldsData) { + XData.push({ + fieldsData: datas[i].fieldsData, + recordIndexs: [i] + }); + YData.push({ + value: 1 + }); + } + } + } + + datas = XData; + yDatas = [YData]; + } + + return { + XData: datas, + YData: yDatas + }; + } + /** + * @function ChartViewModel.prototype._getAttrData + * @description 选中字段数据。 + * @private + * @param {Object} datacontent - 图表数据。 + * @param {number} index - 字段索引。 + */ + + }, { + key: "_getAttrData", + value: function _getAttrData(datacontent, index) { + if (index === 0) { + this.xField = [{ + field: datacontent.fieldCaptions[index], + name: datacontent.fieldCaptions[index] + }]; + } + + var fieldsDatas = []; + + for (var i = 0, len = datacontent.fieldValues[index].length; i < len; i++) { + var value = datacontent.fieldValues[index][i]; + fieldsDatas.push({ + recordIndexs: i, + fieldsData: value + }); + } + + return fieldsDatas; + } + /** + * @function ChartViewModel.prototype._createChartSeries + * @description 图表数据。 + * @private + * @param {Object} calculatedData - 图表数据。 + * @param {string} chartType - 图表类型。 + */ + + }, { + key: "_createChartSeries", + value: function _createChartSeries(calculatedData, chartType) { + var series = []; + var yDatas = calculatedData.YData; + yDatas.forEach(function (yData) { + var value = 0; + var serieData = []; + + var _iterator = _createForOfIteratorHelper(yData), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var data = _step.value; + value = data.value; + serieData.push({ + value: value + }); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + var serie = { + type: chartType, + data: serieData, + name: "y" + }; + series.push(serie); + }); + return series; + } + /** + * @function ChartViewModel.prototype._isDate + * @description 判断是否为日期。 + * @private + * @param {string} data - 字符串。 + */ + + }, { + key: "_isDate", + value: function _isDate(data) { + var reg = /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/ig; + return reg.test(data); + } + /** + * @function ChartViewModel.prototype._isNumber + * @description 判断是否为数值。 + * @private + * @param {string} data - 字符串。 + */ + + }, { + key: "_isNumber", + value: function _isNumber(data) { + var mdata = Number(data); + + if (mdata === 0) { + return true; + } + + return !isNaN(mdata); + } + /** + * @function ChartViewModel.prototype._getDataType + * @description 判断数据的类型。 + * @private + * @param {string} data - 字符串。 + */ + + }, { + key: "_getDataType", + value: function _getDataType(data) { + if (data !== null && data !== undefined && data !== '') { + if (this._isDate(data)) { + return "DATE"; + } + + if (this._isNumber(data)) { + return "NUMBER"; + } + } + + return "STRING"; + } + /** + * @function ChartViewModel.prototype._checkUrl + * @description 检查url是否符合要求。 + * @private + * @param {string} url。 + */ + + }, { + key: "_checkUrl", + value: function _checkUrl(url) { + var match; + + if (url === '' || !this._isMatchUrl(url)) { + match = false; + } else if (/^http[s]?:\/\/localhost/.test(url) || /^http[s]?:\/\/127.0.0.1/.test(url)) { + //不是实际域名 + match = false; + } else { + match = true; + } + + return match; + } + /** + * @function ChartViewModel.prototype._isMatchUrl + * @description 判断输入的地址是否符合地址格式。 + * @private + * @param {string} str - url。 + */ + + }, { + key: "_isMatchUrl", + value: function _isMatchUrl(str) { + var reg = new RegExp('(https?|http|file|ftp)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'); + return reg.test(str); + } + /** + * @function ChartViewModel.prototype.getStyle + * @description 获取图表样式。 + */ + + }, { + key: "getStyle", + value: function getStyle() { + var style = { + grid: this.grid, + tooltip: this.tooltip, + backgroundColor: this.backgroundColor + }; + return style; + } + /** + * @function ChartViewModel.prototype.getFeatures + * @description 获取地图服务,数据服务请求返回的数据。 + */ + + }, { + key: "getFeatures", + value: function getFeatures() { + return this.features; + } + /** + * @function ChartViewModel.prototype.setStyle + * @description 设置图表样式。 + * @param {Object} style - 图表样式 + */ + + }, { + key: "setStyle", + value: function setStyle(style) { + return this.updateChartOptions(this.chartType, style); + } + }]); + + return ChartViewModel; +}(); +;// CONCATENATED MODULE: ./src/common/components/chart/ChartView.js +function ChartView_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ChartView_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ChartView_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChartView_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChartView_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ChartView + * @aliasclass Components.Chart + * @deprecatedclass SuperMap.Components.Chart + * @classdesc 图表组件 + * @version 9.1.2 + * @param {string} domID - 图表dom元素ID。 + * @param {Object} options - 可选参数。 + * @param {string} options.type - 图表类型。 + * @param {ChartView.Datasets} options.datasets - 数据来源 + * @param {Array.} options.chartOptions - 图表可选参数。 + * @param {Array.} options.chartOptions.xAxis - 图表X轴。 + * @param {string} options.chartOptions.xAxis.field - 图表X轴字段名。 + * @param {string} options.chartOptions.xAxis.name - 图表X轴名称。 + * @param {Array.} options.chartOptions.yAxis - 图表Y轴。 + * @param {string} options.chartOptions.yAxis.field - 图表Y轴字段名。 + * @param {string} options.chartOptions.yAxis.name - 图表Y轴名称。 + * @category Components Chart + * @usage + */ + +/** + * @typedef {Object} ChartView.Datasets - 数据来源 + * @property {string} [type = 'iServer'] - 服务类型 iServer, iPortal。 + * @property {string} url - 服务地址。 + * @property {boolean} [withCredentials = false] - 设置请求是否带cookie + * @property {FilterParameter} queryInfo - 查询条件 + */ + +var ChartView = /*#__PURE__*/function () { + function ChartView(domID, options) { + ChartView_classCallCheck(this, ChartView); + + this.domID = domID; + this.chartType = options.type || "bar"; // 设置options.datasets.type的默认值是iServer + + options.datasets.type = options.datasets.type || 'iServer'; // 设置withCredentials的默认值为false + + options.datasets.withCredentials = options.datasets.withCredentials || false; + this.viewModel = new ChartViewModel(options); //添加控件。 + + this._fillDataToView(); + } + /** + * @function ChartView.prototype.onAdd + * @description 创建图表之后成功回调 + * @param {function} addChart - 回调函数。 + */ + + + ChartView_createClass(ChartView, [{ + key: "onAdd", + value: function onAdd(addChart) { + this.addChart = addChart; + } + /** + * @function ChartView.prototype._fillDataToView + * @description 填充数据到 view。 + * @private + */ + + }, { + key: "_fillDataToView", + value: function _fillDataToView() { + var messageboxs = new MessageBox(); //iclient 绑定createChart事件成功回调 + + this.viewModel.getDatasetInfo(this._createChart.bind(this)); + this.viewModel.events.on({ + "getdatafailed": function getdatafailed(error) { + messageboxs.showView(error.message); + } + }); + } + /** + * @function ChartView.prototype.getStyle + * @description 获取图表样式。 + */ + + }, { + key: "getStyle", + value: function getStyle() { + return this.viewModel.getStyle(); + } + /** + * @function ChartView.prototype.getFeatures + * @description 获取地图服务,数据服务请求返回的数据。 + */ + + }, { + key: "getFeatures", + value: function getFeatures() { + return this.viewModel.getFeatures(); + } + /** + * @function ChartView.prototype.setStyle + * @description 设置图表样式。 + * @param {Object} style - 图表样式,参考Echarts-options样式设置。 + */ + + }, { + key: "setStyle", + value: function setStyle(style) { + var newOptions = this.viewModel.setStyle(style); + + this._updateChart(newOptions); + } + /** + * @function ChartView.prototype.changeType + * @description 改变图表类型。 + * @param {string} type - 图表类型。 + */ + + }, { + key: "changeType", + value: function changeType(type) { + if (this.chartType !== type) { + this.chartType = type; + var newOptions = this.viewModel.changeType(type); + + this._updateChart(newOptions); + } + } + /** + * @function ChartView.prototype.updateData + * @description 更新图表数据。 + * @param {ChartView.Datasets} datasets - 数据来源。 + * @param {Object} chartOption - X,Y轴信息。 + */ + + }, { + key: "updateData", + value: function updateData(datasets, chartOption) { + var me = this; + this.viewModel.updateData(datasets, chartOption, function (options) { + me._updateChart(options); + + if (me.addChart) { + me.addChart(); + } + }); + } + /** + * @function ChartView.prototype._createChart + * @description 创建图表。 + * @private + * @param {Object} data - 图表数据。 + */ + + }, { + key: "_createChart", + value: function _createChart(data) { + this.echart = external_function_try_return_echarts_catch_e_return_default().init(document.getElementById(this.domID), null, { + renderer: "canvas" + }); + + var options = this.viewModel._createChartOptions(data); + + this.echart.setOption(options); + + if (this.addChart) { + this.addChart(); + } + } + /** + * @function ChartView.prototype._updateChart + * @description 更新图表。 + * @private + * @param {Object} options - 图表参数。 + */ + + }, { + key: "_updateChart", + value: function _updateChart(options) { + if (this.echart) { + this.echart.clear(); + this.echart.setOption(options); + } + } + }]); + + return ChartView; +}(); +;// CONCATENATED MODULE: ./src/common/components/templates/TemplateBase.js +function TemplateBase_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function TemplateBase_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function TemplateBase_createClass(Constructor, protoProps, staticProps) { if (protoProps) TemplateBase_defineProperties(Constructor.prototype, protoProps); if (staticProps) TemplateBase_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class TemplateBase + * @aliasclass Components.TemplateBase + * @deprecatedclass SuperMap.Components.TemplateBase + * @classdesc 组件公用组件父类,用于约束统一封装的公用组件结构。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @category Components Common + * @usage + */ +var TemplateBase = /*#__PURE__*/function () { + function TemplateBase(options) { + TemplateBase_classCallCheck(this, TemplateBase); + + options = options ? options : {}; + /** + * @member {string} [TemplateBase.prototype.id=null] + * @description 组件 dom 元素 id。 + */ + + this.id = options.id ? options.id : null; + /** + * @member {HTMLElement} [TemplateBase.prototype.rootContainer=null] + * @description 组件 dom 元素对象。 + */ + + this.rootContainer = null; + } + /** + * @function TemplateBase.prototype.getElement + * @description 获取当前组件元素对象。 + * @return {HTMLElement} 组件 dom 元素对象 + */ + + + TemplateBase_createClass(TemplateBase, [{ + key: "getElement", + value: function getElement() { + //todo 其实感觉再这里给组件设置不太合理 + if (this.id) { + this.rootContainer.id = this.id; + } + + return this.rootContainer; + } + /** + * @function TemplateBase.prototype._initView + * @private + * @description 初始化模板。 + */ + + }, { + key: "_initView", + value: function _initView() {//子类实现此方法 + } + /** + * @function TemplateBase.prototype.showView + * @description 显示组件。 + */ + + }, { + key: "showView", + value: function showView() { + this.rootContainer.hidden = false; + } + /** + * @function TemplateBase.prototype.closeView + * @description 隐藏组件。 + */ + + }, { + key: "closeView", + value: function closeView() { + this.rootContainer.hidden = true; + } + }]); + + return TemplateBase; +}(); +;// CONCATENATED MODULE: ./src/common/components/templates/CommonContainer.js +function CommonContainer_typeof(obj) { "@babel/helpers - typeof"; return CommonContainer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, CommonContainer_typeof(obj); } + +function CommonContainer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CommonContainer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CommonContainer_createClass(Constructor, protoProps, staticProps) { if (protoProps) CommonContainer_defineProperties(Constructor.prototype, protoProps); if (staticProps) CommonContainer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function CommonContainer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) CommonContainer_setPrototypeOf(subClass, superClass); } + +function CommonContainer_setPrototypeOf(o, p) { CommonContainer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return CommonContainer_setPrototypeOf(o, p); } + +function CommonContainer_createSuper(Derived) { var hasNativeReflectConstruct = CommonContainer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = CommonContainer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = CommonContainer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return CommonContainer_possibleConstructorReturn(this, result); }; } + +function CommonContainer_possibleConstructorReturn(self, call) { if (call && (CommonContainer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return CommonContainer_assertThisInitialized(self); } + +function CommonContainer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function CommonContainer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function CommonContainer_getPrototypeOf(o) { CommonContainer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return CommonContainer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class CommonContainer + * @aliasclass Components.CommonContainer + * @deprecatedclass SuperMap.Components.CommonContainer + * @classdesc 组件统一外框。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 标题。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ + +var CommonContainer = /*#__PURE__*/function (_TemplateBase) { + CommonContainer_inherits(CommonContainer, _TemplateBase); + + var _super = CommonContainer_createSuper(CommonContainer); + + function CommonContainer(options) { + var _this; + + CommonContainer_classCallCheck(this, CommonContainer); + + _this = _super.call(this, options); + var title = options.title ? options.title : ""; + + _this._initView(title); + + return _this; + } + /** + * @private + * @override + */ + + + CommonContainer_createClass(CommonContainer, [{ + key: "_initView", + value: function _initView(title) { + var container = document.createElement("div"); + container.setAttribute("class", "component-container"); //title + + var titleContainer = document.createElement("div"); + titleContainer.setAttribute("class", "component-title"); + var titleContent = document.createElement("div"); + titleContent.innerHTML = title; + titleContainer.appendChild(titleContent); + container.appendChild(titleContainer); //container + + var componentContent = document.createElement("div"); + componentContent.setAttribute("class", "component-content"); + container.appendChild(componentContent); + this.content = componentContent; + this.rootContainer = container; + return container; + } + /** + * @function CommonContainer.prototype.getContentElement + * @description 获取内容元素容器。 + */ + + }, { + key: "getContentElement", + value: function getContentElement() { + return this.content; + } + /** + * @function CommonContainer.prototype.appendContent + * @description 填充内容元素。 + */ + + }, { + key: "appendContent", + value: function appendContent(element) { + this.content.appendChild(element); + } + }]); + + return CommonContainer; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/Select.js +function Select_typeof(obj) { "@babel/helpers - typeof"; return Select_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Select_typeof(obj); } + +function Select_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Select_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Select_createClass(Constructor, protoProps, staticProps) { if (protoProps) Select_defineProperties(Constructor.prototype, protoProps); if (staticProps) Select_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function Select_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) Select_setPrototypeOf(subClass, superClass); } + +function Select_setPrototypeOf(o, p) { Select_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Select_setPrototypeOf(o, p); } + +function Select_createSuper(Derived) { var hasNativeReflectConstruct = Select_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = Select_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = Select_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return Select_possibleConstructorReturn(this, result); }; } + +function Select_possibleConstructorReturn(self, call) { if (call && (Select_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return Select_assertThisInitialized(self); } + +function Select_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function Select_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function Select_getPrototypeOf(o) { Select_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Select_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Select + * @aliasclass Components.Select + * @deprecatedclass SuperMap.Components.Select + * @classdesc 组件统一的文字下拉框。 + * @version 9.1.1 + * @param {Array.} options - 组件配置参数数组。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} [options.labelName] - label 名称。 + * @param {Array.} options.optionsArr - 需要创建的 option 数据数组。 + * @param {function} [options.optionsClickCb] - option 点击事件回调函数。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ + +var Select = /*#__PURE__*/function (_TemplateBase) { + Select_inherits(Select, _TemplateBase); + + var _super = Select_createSuper(Select); + + function Select(options) { + var _this; + + Select_classCallCheck(this, Select); + + _this = _super.call(this, options); + + _this._initView(options); + + return _this; + } + + Select_createClass(Select, [{ + key: "_initView", + value: function _initView(options) { + var selectTool = this._createElement('div', "component-selecttool"); + + if (options.labelName) { + var label = this._createElement('label', 'component-selecttool__lable--describe', selectTool); + + label.innerHTML = options.labelName; + } + + var chartSelect = this._createElement('div', 'component-selecttool--chart', selectTool); + + chartSelect.setAttribute('tabindex', '1'); + + var selectName = this._createElement('div', "component-selecttool__name", chartSelect); + + selectName.title = options.optionsArr[0]; + selectName.innerHTML = options.optionsArr[0]; + + var chartTriangleBtn = this._createElement('div', 'component-selecttool__trianglebtn--chart', chartSelect); + + var triangleBtn = this._createElement('div', 'component-triangle-down-img', chartTriangleBtn); + + var selectContent = this._createElement('div', 'component-selecttool__content', chartSelect); + + var scrollarea = this._createElement('div', 'component-selecttool__content--chart', selectContent); + + var scrollareaContent = this._createElement('div', 'component-selecttool__scrollarea__content', scrollarea); + + scrollareaContent.setAttribute('tabindex', '1'); + this.createOptions(scrollareaContent, options.optionsArr); + this.optionClickEvent(scrollareaContent, selectName, options.optionsClickCb); // 下拉框显示 & 隐藏事件 + + this._selectClickEvent(chartSelect, selectContent, triangleBtn); + + this.rootContainer = selectTool; + } + /** + * @function Select.prototype.createOptions + * @description 创建所属下拉框选项。 + */ + + }, { + key: "createOptions", + value: function createOptions(container, optionsArr) { + for (var i in optionsArr) { + var option = this._createElement('div', 'component-selecttool__option', container); + + option.title = optionsArr[i]; + option.innerHTML = optionsArr[i]; + } + } + /** + * @function Select.prototype._selectClickEvent + * @description select 点击显示&隐藏事件。 + * @private + */ + + }, { + key: "_selectClickEvent", + value: function _selectClickEvent(eventElement, contentElement, triangleBtn) { + eventElement.onclick = function (e) { + if (contentElement.style.display === "block") { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } else { + contentElement.style.display = "block"; + triangleBtn.className = "triangle-up-img"; + } + + e.preventDefault(); + e.stopPropagation(); + }; + + eventElement.onmousedown = function (evt) { + //console.log('dropdownbox onmousedown '+evt.target.className); + if (evt.target !== this) { + this.focus(); + evt.preventDefault(); + evt.stopPropagation(); + } + }; + + eventElement.onblur = function () { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + }; + } + /** + * @function Select.prototype._createElement + * @description 通用创建元素。 + * @private + */ + + }, { + key: "_createElement", + value: function _createElement(tagName, className, parentEle) { + var ele = document.createElement(tagName || 'div'); + className && (ele.className = className); + parentEle && parentEle.appendChild(ele); + return ele; + } + /** + * @function Select.prototype.optionClickEvent + * @description 下拉框的 option 的点击事件。 + */ + + }, { + key: "optionClickEvent", + value: function optionClickEvent(optionEleArr, selectNameEle, optionsClickCb) { + var _loop = function _loop(i) { + var childEle = optionEleArr.children[i]; + + childEle.onclick = function () { + selectNameEle.innerHTML = childEle.innerHTML; + selectNameEle.title = childEle.title; + + if (childEle.getAttribute('data-value')) { + selectNameEle.setAttribute('data-value', childEle.getAttribute('data-value')); + } + + optionsClickCb && optionsClickCb(childEle); + }; + }; + + for (var i = 0; i < optionEleArr.children.length; i++) { + _loop(i); + } + } + }]); + + return Select; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/DropDownBox.js +function DropDownBox_typeof(obj) { "@babel/helpers - typeof"; return DropDownBox_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DropDownBox_typeof(obj); } + +function DropDownBox_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DropDownBox_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DropDownBox_createClass(Constructor, protoProps, staticProps) { if (protoProps) DropDownBox_defineProperties(Constructor.prototype, protoProps); if (staticProps) DropDownBox_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DropDownBox_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DropDownBox_setPrototypeOf(subClass, superClass); } + +function DropDownBox_setPrototypeOf(o, p) { DropDownBox_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DropDownBox_setPrototypeOf(o, p); } + +function DropDownBox_createSuper(Derived) { var hasNativeReflectConstruct = DropDownBox_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DropDownBox_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DropDownBox_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DropDownBox_possibleConstructorReturn(this, result); }; } + +function DropDownBox_possibleConstructorReturn(self, call) { if (call && (DropDownBox_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DropDownBox_assertThisInitialized(self); } + +function DropDownBox_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DropDownBox_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DropDownBox_getPrototypeOf(o) { DropDownBox_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DropDownBox_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class DropDownBox + * @aliasclass Components.DropDownBox + * @deprecatedclass SuperMap.Components.DropDownBox + * @classdesc 组件统一的图片下拉框。 + * @version 9.1.1 + * @param {Array.} options - 组件配置参数数组。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 下拉框 title。 + * @param {string} options.remark - 下拉框解释标记文本。 + * @param {string} [options.dataValue] - 下拉框 attribute 名为 data-value 的值 。 + * @param {string} [options.icon] - 下拉框图标。 + * @param {string} [options.icon.className] - 下拉框图标类名。 + * @param {string} [options.icon.background] - 下拉框图标背景 url。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ + +var DropDownBox = /*#__PURE__*/function (_TemplateBase) { + DropDownBox_inherits(DropDownBox, _TemplateBase); + + var _super = DropDownBox_createSuper(DropDownBox); + + function DropDownBox(optionsArr) { + var _this; + + DropDownBox_classCallCheck(this, DropDownBox); + + _this = _super.call(this, optionsArr); + + _this._initView(optionsArr); + + return _this; + } + /** + * @function DropDownBox.prototype._initView + * @description 初始化下拉框。 + * @private + * @override + */ + + + DropDownBox_createClass(DropDownBox, [{ + key: "_initView", + value: function _initView(optionsArr) { + var dropDownContainer = document.createElement('div'); + dropDownContainer.className = 'component-dropdownbox--container'; + var dropDownBox = document.createElement('div'); + dropDownBox.setAttribute('tabindex', '1'); + dropDownBox.className = "component-dropdownbox"; + dropDownContainer.appendChild(dropDownBox); + var dropDownTopContainer = document.createElement('div'); + dropDownBox.appendChild(dropDownTopContainer); + + this._createDropDownOption(optionsArr[0], dropDownTopContainer); + + var triangleBtnContainer = document.createElement('div'); + triangleBtnContainer.className = 'component-dropdownbox__triangle-btn'; + dropDownBox.appendChild(triangleBtnContainer); + var triangleBtn = document.createElement('div'); + triangleBtn.className = 'component-triangle-down-img'; + triangleBtnContainer.appendChild(triangleBtn); + var createDropDownBoxParam = { + "parentEle": dropDownBox, + "dropDownContent": ['component-dropdownbox__content component-dropdownbox__content--chart', 'dropDownContent'], + "scrollareaContent": 'component-selecttool__scrollarea__content', + "optionsArr": optionsArr, + "triangleBtn": triangleBtn, + "dropDownTopContainer": dropDownTopContainer + }; + + this._createDropDownBox(createDropDownBoxParam); + + this.rootContainer = dropDownContainer; + } + /** + * @function DropDownBox.prototype._createDropDownBox + * @description 创建下拉框。 + * @private + */ + + }, { + key: "_createDropDownBox", + value: function _createDropDownBox(createDropDownBoxParam) { + var dropDownBox = createDropDownBoxParam.parentEle; + var dropDownTopContainer = createDropDownBoxParam.dropDownTopContainer; + var dropDownContent = document.createElement('div'); + dropDownContent.className = createDropDownBoxParam.dropDownContent[0]; + dropDownBox.appendChild(dropDownContent); + var scrollareaContent = document.createElement('div'); + scrollareaContent.className = createDropDownBoxParam.scrollareaContent; + dropDownContent.appendChild(scrollareaContent); + var optionsArr = createDropDownBoxParam.optionsArr; + + for (var i = 0; i < optionsArr.length; i++) { + this._createDropDownOption(optionsArr[i], scrollareaContent); + } // 下拉框显示 & 隐藏事件 + + + var triangleBtn = createDropDownBoxParam.triangleBtn; + + this._dropDownClickEvent(dropDownBox, dropDownContent, triangleBtn); + + this._eleOnblur(dropDownBox, dropDownContent, triangleBtn); // 下拉框 options 点击事件 + + + var scrollareaOptions = scrollareaContent.children; + + var _loop = function _loop(_i) { + scrollareaOptions[_i].onclick = function () { + dropDownTopContainer.innerHTML = scrollareaOptions[_i].outerHTML; //evt.stopPropagation(); + }; + }; + + for (var _i = 0; _i < scrollareaOptions.length; _i++) { + _loop(_i); + } + } + /** + * @function DropDownBox.prototype._createDropDownOption + * @description 创建下拉框子元素。 + * @private + */ + + }, { + key: "_createDropDownOption", + value: function _createDropDownOption(data, parentElement) { + var ele = document.createElement('div'); + ele.className = 'component-dropdownbox__item'; + var dataItem = data; + + if (dataItem['dataValue']) { + ele.setAttribute('data-value', dataItem['dataValue']); + } + + parentElement.appendChild(ele); + var imgContainer = document.createElement('div'); + imgContainer.className = 'component-dropdownbox__item__img'; + ele.appendChild(imgContainer); + var img = document.createElement('div'); + + if (dataItem.icon.className) { + img.className = dataItem.icon.className; + } + + if (dataItem.icon.background) { + img.style.background = dataItem.icon.background; + } + + imgContainer.appendChild(img); + var title = document.createElement('div'); + title.className = 'component-dropdownbox__item__title'; + title.title = dataItem.title; + title.innerHTML = dataItem.title; + ele.appendChild(title); + var remark = document.createElement('div'); + remark.className = 'component-dropdownbox__item__remark'; + remark.title = dataItem.remark; + remark.innerHTML = dataItem.remark; + ele.appendChild(remark); + } + /** + * @function DropDownBox.prototype._dropDownClickEvent + * @description 下拉框点击事件。 + * @private + */ + + }, { + key: "_dropDownClickEvent", + value: function _dropDownClickEvent(eventElement, contentElement, triangleBtn) { + eventElement.onclick = function (e) { + if (contentElement.style.display === "block") { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + } else { + contentElement.style.display = "block"; + triangleBtn.className = "triangle-up-img"; + } + + e.preventDefault(); + e.stopPropagation(); + }; + + eventElement.onmousedown = function (evt) { + //console.log('dropdownbox onmousedown '+evt.target.className); + if (evt.target !== this) { + this.focus(); + evt.preventDefault(); + evt.stopPropagation(); + } + }; + } + /** + * @function DropDownBox.prototype._eleOnblur + * @description 下拉框失焦事件。 + * @private + */ + + }, { + key: "_eleOnblur", + value: function _eleOnblur(eventElement, contentElement, triangleBtn) { + eventElement.onblur = function () { + contentElement.style.display = "none"; + triangleBtn.className = "component-triangle-down-img"; + }; + } + /** + * @function DropDownBox.prototype._createElement + * @description 通用创建元素。 + * @private + */ + + }, { + key: "_createElement", + value: function _createElement(tagName, className, parentEle) { + var ele = document.createElement(tagName || 'div'); + className && (ele.className = className); + parentEle && parentEle.appendChild(ele); + return ele; + } + }]); + + return DropDownBox; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/PopContainer.js +function PopContainer_typeof(obj) { "@babel/helpers - typeof"; return PopContainer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, PopContainer_typeof(obj); } + +function PopContainer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function PopContainer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function PopContainer_createClass(Constructor, protoProps, staticProps) { if (protoProps) PopContainer_defineProperties(Constructor.prototype, protoProps); if (staticProps) PopContainer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function PopContainer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) PopContainer_setPrototypeOf(subClass, superClass); } + +function PopContainer_setPrototypeOf(o, p) { PopContainer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return PopContainer_setPrototypeOf(o, p); } + +function PopContainer_createSuper(Derived) { var hasNativeReflectConstruct = PopContainer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = PopContainer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = PopContainer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return PopContainer_possibleConstructorReturn(this, result); }; } + +function PopContainer_possibleConstructorReturn(self, call) { if (call && (PopContainer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return PopContainer_assertThisInitialized(self); } + +function PopContainer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function PopContainer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function PopContainer_getPrototypeOf(o) { PopContainer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return PopContainer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class PopContainer + * @aliasclass Components.PopContainer + * @deprecatedclass SuperMap.Components.PopContainer + * @classdesc 弹框组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {string} options.title - 弹框组件名称。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ + +var PopContainer = /*#__PURE__*/function (_TemplateBase) { + PopContainer_inherits(PopContainer, _TemplateBase); + + var _super = PopContainer_createSuper(PopContainer); + + function PopContainer(options) { + var _this; + + PopContainer_classCallCheck(this, PopContainer); + + options = options ? options : {}; + _this = _super.call(this, options); + options.title = options.title ? options.title : ""; + + _this._initView(options.title); + + return _this; + } + /** + * @private + * @override + */ + + + PopContainer_createClass(PopContainer, [{ + key: "_initView", + value: function _initView(titile) { + var container = document.createElement("div"); + container.setAttribute("class", "component-popcontainer"); //header + + var header = document.createElement("div"); + header.setAttribute("class", "component-popcontainer__header"); + var title = document.createElement("label"); + title.setAttribute("class", "component-popcontainer__header__title"); + title.innerHTML = titile; + header.appendChild(title); + var closeBtn = document.createElement("span"); + closeBtn.setAttribute("class", "supermapol-icons-clear component-popcontainer__header__close"); + closeBtn.onclick = this.closeView.bind(this); + container.appendChild(closeBtn); + container.appendChild(header); //content + + var content = document.createElement("div"); + content.setAttribute("class", "component-popcontainer__content"); + this.content = content; + container.appendChild(content); + this.rootContainer = container; + } + /** + * @function PopContainer.prototype.appendContent + * @description 追加内容。 + * @param {HTMLElement} dom - 内容元素。 + */ + + }, { + key: "appendContent", + value: function appendContent(dom) { + this.content.appendChild(dom); + } + }]); + + return PopContainer; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/AttributesPopContainer.js +function AttributesPopContainer_typeof(obj) { "@babel/helpers - typeof"; return AttributesPopContainer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, AttributesPopContainer_typeof(obj); } + +function AttributesPopContainer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AttributesPopContainer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AttributesPopContainer_createClass(Constructor, protoProps, staticProps) { if (protoProps) AttributesPopContainer_defineProperties(Constructor.prototype, protoProps); if (staticProps) AttributesPopContainer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function AttributesPopContainer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) AttributesPopContainer_setPrototypeOf(subClass, superClass); } + +function AttributesPopContainer_setPrototypeOf(o, p) { AttributesPopContainer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return AttributesPopContainer_setPrototypeOf(o, p); } + +function AttributesPopContainer_createSuper(Derived) { var hasNativeReflectConstruct = AttributesPopContainer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = AttributesPopContainer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = AttributesPopContainer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return AttributesPopContainer_possibleConstructorReturn(this, result); }; } + +function AttributesPopContainer_possibleConstructorReturn(self, call) { if (call && (AttributesPopContainer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return AttributesPopContainer_assertThisInitialized(self); } + +function AttributesPopContainer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function AttributesPopContainer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function AttributesPopContainer_getPrototypeOf(o) { AttributesPopContainer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return AttributesPopContainer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class AttributesPopContainer + * @aliasclass Components.AttributesPopContainer + * @deprecatedclass SuperMap.Components.AttributesPopContainer + * @classdesc 属性弹框组件 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Object} options.title - 属性弹框组件名称。 + * @param {Object} options.attributes - 组件需要显示的属性内容。 + * @extends {PopContainer} + * @category Components Common + * @usage + */ + +var AttributesPopContainer = /*#__PURE__*/function (_PopContainer) { + AttributesPopContainer_inherits(AttributesPopContainer, _PopContainer); + + var _super = AttributesPopContainer_createSuper(AttributesPopContainer); + + function AttributesPopContainer(options) { + var _this; + + AttributesPopContainer_classCallCheck(this, AttributesPopContainer); + + //默认为属性: + options.title = options.title ? options.title : "属性"; + _this = _super.call(this, options); + _this.rootContainer.firstChild.hidden = true; + options.attributes = options.attributes ? options.attributes : []; + + _this._createAttributesTable(options.attributes); + + return _this; + } + + AttributesPopContainer_createClass(AttributesPopContainer, [{ + key: "_createAttributesTable", + value: function _createAttributesTable(attributes) { + var table = document.createElement("table"); + table.setAttribute("class", "component-popcontainer__content__table"); + var tbody = document.createElement("tbody"); + var single = true; + + for (var name in attributes) { + var tr = document.createElement("tr"); + + if (single) { + tr.setAttribute("class", "component-popcontainer__content__td--color"); + } + + var title = document.createElement("td"); + var titleSpan = document.createElement("Span"); + titleSpan.innerHTML = name; + title.appendChild(titleSpan); + var value = document.createElement("td"); + value.innerHTML = attributes[name]; + tr.appendChild(title); + tr.appendChild(value); + tbody.appendChild(tr); + single = !single; + } + + table.appendChild(tbody); + this.appendContent(table); + } + }]); + + return AttributesPopContainer; +}(PopContainer); +;// CONCATENATED MODULE: ./src/common/components/templates/IndexTabsPageContainer.js +function IndexTabsPageContainer_typeof(obj) { "@babel/helpers - typeof"; return IndexTabsPageContainer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, IndexTabsPageContainer_typeof(obj); } + +function IndexTabsPageContainer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function IndexTabsPageContainer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function IndexTabsPageContainer_createClass(Constructor, protoProps, staticProps) { if (protoProps) IndexTabsPageContainer_defineProperties(Constructor.prototype, protoProps); if (staticProps) IndexTabsPageContainer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function IndexTabsPageContainer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) IndexTabsPageContainer_setPrototypeOf(subClass, superClass); } + +function IndexTabsPageContainer_setPrototypeOf(o, p) { IndexTabsPageContainer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return IndexTabsPageContainer_setPrototypeOf(o, p); } + +function IndexTabsPageContainer_createSuper(Derived) { var hasNativeReflectConstruct = IndexTabsPageContainer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = IndexTabsPageContainer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = IndexTabsPageContainer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return IndexTabsPageContainer_possibleConstructorReturn(this, result); }; } + +function IndexTabsPageContainer_possibleConstructorReturn(self, call) { if (call && (IndexTabsPageContainer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return IndexTabsPageContainer_assertThisInitialized(self); } + +function IndexTabsPageContainer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function IndexTabsPageContainer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function IndexTabsPageContainer_getPrototypeOf(o) { IndexTabsPageContainer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return IndexTabsPageContainer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class IndexTabsPageContainer + * @aliasclass Components.IndexTabsPageContainer + * @deprecatedclass SuperMap.Components.IndexTabsPageContainer + * @classdesc 标签索引组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @category Components Common + * @extends {TemplateBase} + * @usage + */ + +var IndexTabsPageContainer = /*#__PURE__*/function (_TemplateBase) { + IndexTabsPageContainer_inherits(IndexTabsPageContainer, _TemplateBase); + + var _super = IndexTabsPageContainer_createSuper(IndexTabsPageContainer); + + function IndexTabsPageContainer(options) { + var _this; + + IndexTabsPageContainer_classCallCheck(this, IndexTabsPageContainer); + + _this = _super.call(this, options); + + _this._initView(); + + return _this; + } + /** + * @private + * @override + */ + + + IndexTabsPageContainer_createClass(IndexTabsPageContainer, [{ + key: "_initView", + value: function _initView() { + var container = document.createElement("div"); + container.setAttribute("class", "component-tabpage"); + var header = document.createElement("ul"); + this.header = header; + var content = document.createElement("div"); + content.setAttribute("class", "component-tabpage__content"); + this.content = content; + container.appendChild(header); + container.appendChild(content); + this.rootContainer = container; + } + /** + * @function IndexTabsPageContainer.prototype.setTabs + * @description 设置标签元素。 + * @param {Array.} tabs + */ + + }, { + key: "setTabs", + value: function setTabs(tabs) { + this.removeAllTabs(); + this.appendTabs(tabs); + } + /** + * @function IndexTabsPageContainer.prototype.appendTabs + * @description 追加标签元素。 + * @param {Array.} tabs + */ + + }, { + key: "appendTabs", + value: function appendTabs(tabs) { + for (var i = 0; i < tabs.length; i++) { + var title = document.createElement("span"); + title.index = i; + title.appendChild(document.createTextNode(tabs[i].title)); //绑定标签切换对应页面: + + title.onclick = this._changeTabsPage.bind(this); + var content = tabs[i].content; + content.index = i; + content.hidden = true; + this.header.appendChild(title); + this.content.appendChild(content); + } //todo 确认是否两个子元素的 index 相互对应 + //默认显示第一个标签对象 + + + this.header.firstChild.setAttribute("class", "on"); + this.content.firstChild.hidden = false; + } + /** + * @function IndexTabsPageContainer.prototype.removeTab + * @description 删除某个标签页面。 + * @param {number} index - 标签索引号。 + */ + + }, { + key: "removeTab", + value: function removeTab(index) { + this.header.removeChild(this.header.children[index]); + this.content.removeChild(this.content.children[index]); + } + /** + * @function IndexTabsPageContainer.prototype.removeAllTabs + * @description 删除所有标签。 + */ + + }, { + key: "removeAllTabs", + value: function removeAllTabs() { + for (var i = this.header.children.length; i > 0; i--) { + this.header.removeChild(this.header.children[i]); + this.content.removeChild(this.content.children[i]); + } + } + }, { + key: "_changeTabsPage", + value: function _changeTabsPage(e) { + var index = e.target.index; + + for (var i = 0; i < this.header.children.length; i++) { + this.header.children[i].setAttribute("class", ""); + this.content.children[i].hidden = true; + + if (i === index) { + this.header.children[i].setAttribute("class", "on"); + this.content.children[i].hidden = false; + } + } + } + }]); + + return IndexTabsPageContainer; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/CityTabsPage.js +function CityTabsPage_typeof(obj) { "@babel/helpers - typeof"; return CityTabsPage_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, CityTabsPage_typeof(obj); } + +function CityTabsPage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CityTabsPage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CityTabsPage_createClass(Constructor, protoProps, staticProps) { if (protoProps) CityTabsPage_defineProperties(Constructor.prototype, protoProps); if (staticProps) CityTabsPage_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function CityTabsPage_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) CityTabsPage_setPrototypeOf(subClass, superClass); } + +function CityTabsPage_setPrototypeOf(o, p) { CityTabsPage_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return CityTabsPage_setPrototypeOf(o, p); } + +function CityTabsPage_createSuper(Derived) { var hasNativeReflectConstruct = CityTabsPage_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = CityTabsPage_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = CityTabsPage_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return CityTabsPage_possibleConstructorReturn(this, result); }; } + +function CityTabsPage_possibleConstructorReturn(self, call) { if (call && (CityTabsPage_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return CityTabsPage_assertThisInitialized(self); } + +function CityTabsPage_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function CityTabsPage_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function CityTabsPage_getPrototypeOf(o) { CityTabsPage_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return CityTabsPage_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CityTabsPage + * @aliasclass Components.CityTabsPage + * @deprecatedclass SuperMap.Components.CityTabsPage + * @classdesc 城市地址匹配组件模板 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Object|Array.} options.config - 城市名称配置列表,支持两种格式:{key1:{A:[],B:[]}, key2:{C:[],D:[]}} 或 + * ["成都市","北京市"],用户可根据自己的项目需求进行配置 + * @extends {IndexTabsPageContainer} + * @category Components Common + * @usage + */ + +var CityTabsPage = /*#__PURE__*/function (_IndexTabsPageContain) { + CityTabsPage_inherits(CityTabsPage, _IndexTabsPageContain); + + var _super = CityTabsPage_createSuper(CityTabsPage); + + function CityTabsPage(options) { + var _this; + + CityTabsPage_classCallCheck(this, CityTabsPage); + + _this = _super.call(this, options); //去掉默认的边框阴影样式: + + _this.rootContainer.classList.add("component-citytabpage--noneBoxShadow"); + + _this.config = options.config; //header,若 config为城市名称数组,则直接加载内容 + + if (Util.isArray(_this.config)) { + _this.header.hidden = true; + + _this._createCityItem("城市", _this.config); + + _this.content.style.border = "none"; + } else { + _this._createTabs(); + + _this.header.onclick = function (e) { + //关闭所有元素 是否有更简化的写法? + for (var i = 0; i < _this.header.children.length; i++) { + _this.header.children[i].setAttribute("class", ""); + } //打开点击内容元素 + + + e.target.setAttribute("class", "on"); + + _this._createCityContent(e.target.innerHTML); + }; + } + + return _this; + } + /** + * @function CityTabsPage.prototype._createTabs + * @description 创建 Tabs + * @private + */ + + + CityTabsPage_createClass(CityTabsPage, [{ + key: "_createTabs", + value: function _createTabs() { + //header + if (Util.isArray(this.config)) { + for (var i = 0; i < this.config.length; i++) { + var innerHTML = ""; + + for (var key in this.config[i]) { + innerHTML += key; + } + + var li = document.createElement("li"); + li.innerHTML = innerHTML; + this.header.appendChild(li); + } + } else { + for (var _key in this.config) { + var _li = document.createElement("li"); + + _li.innerHTML = _key; + this.header.appendChild(_li); + } + } + + this.header.firstChild.setAttribute("class", "on"); + + this._createCityContent(this.header.firstChild.innerHTML); + } + /** + * @function CityTabsPage.prototype._createCityContent + * @description 创建列表容器 + * @private + */ + + }, { + key: "_createCityContent", + value: function _createCityContent(keyName) { + //清除元素: + for (var i = this.content.children.length; i > 0; i--) { + this.content.removeChild(this.content.children[i - 1]); + } //创建对应元素 + + + var cities = this.config[keyName]; + + for (var key in cities) { + this._createCityItem(key, cities[key]); + } + } + /** + * @function CityTabsPage.prototype._createCityContent + * @description 创建列表容器 + * @private + */ + + }, { + key: "_createCityItem", + value: function _createCityItem(key, cities) { + var city = document.createElement("div"); + var cityClass = document.createElement("div"); + cityClass.setAttribute("class", "component-citytabpag__py-key"); + cityClass.innerHTML = key; + city.appendChild(cityClass); + var cityContent = document.createElement("div"); + cityContent.setAttribute("class", "component-citytabpag__content"); + + for (var i = 0; i < cities.length; i++) { + var span = document.createElement("span"); + span.innerHTML = cities[i]; + cityContent.appendChild(span); + } //HOT 元素长度单独微调: + + + if (key === "HOT") { + cityContent.style.width = "428px"; + } + + city.appendChild(cityContent); + this.content.appendChild(city); + } + }]); + + return CityTabsPage; +}(IndexTabsPageContainer); +;// CONCATENATED MODULE: ./src/common/components/templates/NavTabsPage.js +function NavTabsPage_typeof(obj) { "@babel/helpers - typeof"; return NavTabsPage_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, NavTabsPage_typeof(obj); } + +function NavTabsPage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function NavTabsPage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function NavTabsPage_createClass(Constructor, protoProps, staticProps) { if (protoProps) NavTabsPage_defineProperties(Constructor.prototype, protoProps); if (staticProps) NavTabsPage_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function NavTabsPage_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) NavTabsPage_setPrototypeOf(subClass, superClass); } + +function NavTabsPage_setPrototypeOf(o, p) { NavTabsPage_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return NavTabsPage_setPrototypeOf(o, p); } + +function NavTabsPage_createSuper(Derived) { var hasNativeReflectConstruct = NavTabsPage_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = NavTabsPage_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = NavTabsPage_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return NavTabsPage_possibleConstructorReturn(this, result); }; } + +function NavTabsPage_possibleConstructorReturn(self, call) { if (call && (NavTabsPage_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return NavTabsPage_assertThisInitialized(self); } + +function NavTabsPage_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function NavTabsPage_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function NavTabsPage_getPrototypeOf(o) { NavTabsPage_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return NavTabsPage_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class NavTabsPage + * @aliasclass Components.NavTabsPage + * @deprecatedclass SuperMap.Components.NavTabsPage + * @classdesc 标签页面组件。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {Array.} [options.tabs=[]] - 标签对象数组,形如:[{title: "",content: HTMLElement}],初始时,传入则创建页面。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ +// todo 思考拆分的控件应该以哪种方式使用 + +var NavTabsPage = /*#__PURE__*/function (_TemplateBase) { + NavTabsPage_inherits(NavTabsPage, _TemplateBase); + + var _super = NavTabsPage_createSuper(NavTabsPage); + + function NavTabsPage(options) { + var _this; + + NavTabsPage_classCallCheck(this, NavTabsPage); + + _this = _super.call(this, options); + _this.navTabsTitle = null; + _this.navTabsContent = null; + options.tabs = options.tabs ? options.tabs : []; + + _this._initView(options.tabs); + + return _this; + } + /** + * @override + * @private + */ + + + NavTabsPage_createClass(NavTabsPage, [{ + key: "_initView", + value: function _initView(tabs) { + var navTabsPage = document.createElement("div"); + navTabsPage.setAttribute("class", "component-navtabspage"); //关闭按钮 + + var closeBtn = document.createElement("span"); + closeBtn.setAttribute("class", "supermapol-icons-close"); + closeBtn.onclick = this.closeView.bind(this); + navTabsPage.appendChild(closeBtn); //标签 + + var navTabsTitle = document.createElement("div"); + this.navTabsTitle = navTabsTitle; + navTabsTitle.setAttribute("class", "component-navtabspage__title"); + navTabsPage.appendChild(navTabsTitle); //内容 + + var navTabsContent = document.createElement("div"); + this.navTabsContent = navTabsContent; + navTabsContent.setAttribute("class", "component-navtabspage__content"); + navTabsPage.appendChild(navTabsContent); //若 tabs 初始传入值,则 + + if (tabs.length > 0) { + this.appendTabs(tabs); + } + + this.rootContainer = navTabsPage; + } + /** + * @function NavTabsPage.prototype.setTabs + * @description 设置标签。 + * @param {Array.} tabs - 标签对象数组,形如:[{title: "",content: {}}]。 + */ + + }, { + key: "setTabs", + value: function setTabs(tabs) { + this.removeAllTabs(); + this.appendTabs(tabs); + } + /** + * @function NavTabsPage.prototype.appendTabs + * @description 添加标签页面。 + * @param {Array.} tabs - 标签对象数组,形如:[{title: "",content: {}}]。 + */ + + }, { + key: "appendTabs", + value: function appendTabs(tabs) { + for (var i = 0; i < tabs.length; i++) { + var title = document.createElement("span"); + title.index = i; + title.appendChild(document.createTextNode(tabs[i].title)); //绑定标签切换对应页面: + + title.onclick = this._changeTabsPage.bind(this); + var content = tabs[i].content; + content.index = i; + content.hidden = true; + this.navTabsTitle.appendChild(title); + this.navTabsContent.appendChild(content); + } //todo 确认是否两个子元素的 index 相互对应 + //默认显示第一个标签对象 + + + this.navTabsTitle.firstChild.setAttribute("class", "component-navtabspage__tabs--select"); + this.navTabsContent.firstChild.hidden = false; + } + /** + * @function NavTabsPage.prototype.removeTab + * @description 删除某个标签页面。 + * @param {number} index - 标签索引号。 + */ + + }, { + key: "removeTab", + value: function removeTab(index) { + this.navTabsTitle.removeChild(this.navTabsTitle.children[index]); + this.navTabsContent.removeChild(this.navTabsContent.children[index]); + } + /** + * @function NavTabsPage.prototype.removeAllTabs + * @description 删除所有标签。 + */ + + }, { + key: "removeAllTabs", + value: function removeAllTabs() { + for (var i = this.navTabsTitle.children.length; i > 0; i--) { + this.navTabsTitle.removeChild(this.navTabsTitle.children[i]); + this.navTabsContent.removeChild(this.navTabsContent.children[i]); + } + } + }, { + key: "_changeTabsPage", + value: function _changeTabsPage(e) { + var index = e.target.index; + + for (var i = 0; i < this.navTabsTitle.children.length; i++) { + this.navTabsTitle.children[i].setAttribute("class", ""); + this.navTabsContent.children[i].hidden = true; + + if (i === index) { + this.navTabsTitle.children[i].setAttribute("class", "component-navtabspage__tabs--select"); + this.navTabsContent.children[i].hidden = false; + } + } + } + }]); + + return NavTabsPage; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/templates/PaginationContainer.js +function PaginationContainer_typeof(obj) { "@babel/helpers - typeof"; return PaginationContainer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, PaginationContainer_typeof(obj); } + +function PaginationContainer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function PaginationContainer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function PaginationContainer_createClass(Constructor, protoProps, staticProps) { if (protoProps) PaginationContainer_defineProperties(Constructor.prototype, protoProps); if (staticProps) PaginationContainer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function PaginationContainer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) PaginationContainer_setPrototypeOf(subClass, superClass); } + +function PaginationContainer_setPrototypeOf(o, p) { PaginationContainer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return PaginationContainer_setPrototypeOf(o, p); } + +function PaginationContainer_createSuper(Derived) { var hasNativeReflectConstruct = PaginationContainer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = PaginationContainer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = PaginationContainer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return PaginationContainer_possibleConstructorReturn(this, result); }; } + +function PaginationContainer_possibleConstructorReturn(self, call) { if (call && (PaginationContainer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return PaginationContainer_assertThisInitialized(self); } + +function PaginationContainer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function PaginationContainer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function PaginationContainer_getPrototypeOf(o) { PaginationContainer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return PaginationContainer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class PaginationContainer + * @aliasclass Components.PaginationContainer + * @deprecatedclass SuperMap.Components.PaginationContainer + * @classdesc 分页组件模板。 + * @version 9.1.1 + * @param {Object} options - 组件配置参数。 + * @param {string} options.id - 组件 dom 元素 id。 + * @param {HTMLElement} options.contents - 页面填充的 DOM 元素对象。 + * @param {number} options.pageCounts - 页数。 + * @extends {TemplateBase} + * @category Components Common + * @usage + */ + +var PaginationContainer = /*#__PURE__*/function (_TemplateBase) { + PaginationContainer_inherits(PaginationContainer, _TemplateBase); + + var _super = PaginationContainer_createSuper(PaginationContainer); + + function PaginationContainer(options) { + var _this; + + PaginationContainer_classCallCheck(this, PaginationContainer); + + options = options ? options : {}; + _this = _super.call(this, options); + _this.currentPage = 0; + _this.pageNumberLis = []; + _this.currentPageNumberLis = []; + _this.linkageEvent = null; + options.contents = options.contents ? options.contents : null; + options.pageCounts = options.pageCounts ? options.pageCounts : 0; + + _this._initView(options.contents, options.pageCounts); + + return _this; + } + /** + * @function PaginationContainer.prototype.setLinkageEvent + * @description 设置页面联动方法。 + * @param {function} linkageEvent - 联动方法,实现指定功能。 + */ + + + PaginationContainer_createClass(PaginationContainer, [{ + key: "setLinkageEvent", + value: function setLinkageEvent(linkageEvent) { + this.linkageEvent = linkageEvent; + } + /** + * @private + * @override + */ + + }, { + key: "_initView", + value: function _initView(contents, pageCounts) { + var container = document.createElement("div"); + container.setAttribute("class", "component-pagination"); //content + + var content = document.createElement("div"); + content.setAttribute("class", "component-pagination__content"); + container.appendChild(content); + this.content = content; //link + + var link = document.createElement("ul"); + link.setAttribute("class", "component-pagination__link"); + link.onclick = this._changePageEvent.bind(this); + container.appendChild(link); + + this._createLink(link); + + this.link = link; //填充内容: + + if (contents) { + this.setContent(contents); + } + + if (pageCounts !== 0) { + this.setPageLink(pageCounts); + } + + this.rootContainer = container; + } + /**---------以下是页面相关操作 **/ + + /** + * @function PaginationContainer.prototype.setContent + * @description 设置页面内容。 + * @param {HTMLElement} element - 页面内容元素。 + */ + + }, { + key: "setContent", + value: function setContent(element) { + this.clearContent(); + this.appendContent(element); + } + /** + * @function PaginationContainer.prototype.appendContent + * @description 追加内容。 + * @param {HTMLElement} element - 页面内容元素。 + */ + + }, { + key: "appendContent", + value: function appendContent(element) { + this.content.appendChild(element); + } + /** + * @function PaginationContainer.prototype.clearContent + * @description 清空内容元素。 + */ + + }, { + key: "clearContent", + value: function clearContent() { + for (var i = this.content.children.length - 1; i >= 0; i--) { + this.content.removeChild(this.content.children[i]); + } + } + /** -----以下是页码相关的操作:**/ + + /** + * @function PaginationContainer.prototype.setPageLink + * @description 设置页码数。 + * @param {number} pageNumber - 页码数。 + */ + + }, { + key: "setPageLink", + value: function setPageLink(pageNumber) { + //清空当前页码 + this.pageNumberLis = []; + this.currentPageNumberLis = []; + this.clearPageLink(); //创建页码 + + this._createPageLi(pageNumber); //添加页码到页码列表 + + + this._appendPageLink(); + } + /** + * @description 创建页码。 + * @param pageNumber + * @private + */ + + }, { + key: "_createPageLi", + value: function _createPageLi(pageNumber) { + for (var i = 0; i < pageNumber; i++) { + var pageLi = document.createElement("li"); + pageLi.innerHTML = i + 1; + /*const liContent = document.createElement("span"); + liContent.innerHTML = i + 1;*/ + // pageLi.appendChild(liContent); + + this.pageNumberLis.push(pageLi); + } + + this.pageNumberLis[0].setAttribute("class", "active"); + this.currentPage = 1; + + if (pageNumber < 5) { + this.currentPageNumberLis = this.pageNumberLis; + } else { + for (var _i = 0; _i < 5; _i++) { + this.currentPageNumberLis.push(this.pageNumberLis[_i]); + } + } + } + /** + * @description 添加页码到页码列表。 + * @private + */ + + }, { + key: "_appendPageLink", + value: function _appendPageLink() { + //todo 如何插入中间 + for (var i = 0; i < this.currentPageNumberLis.length; i++) { + this.link.insertBefore(this.currentPageNumberLis[i], this.link.childNodes[this.link.children.length - 2]); + } + + for (var _i2 = 0; _i2 < this.currentPageNumberLis.length; _i2++) { + //清空 active 状态 + this.currentPageNumberLis[_i2].setAttribute("class", ""); //给当前选中的 li 赋值 active 状态 + + + if (Number(this.currentPageNumberLis[_i2].innerHTML) === this.currentPage) { + this.currentPageNumberLis[_i2].setAttribute("class", "active"); + } + } //根据 currentPage 改变按钮状态 + + + this._changeDisableState(); + + if (this.linkageEvent) { + this.linkageEvent(this.currentPage); + } + } + /** + * @function PaginationContainer.prototype.clearPageLink + * @description 清除页码列表。 + */ + + }, { + key: "clearPageLink", + value: function clearPageLink() { + for (var i = this.link.children.length - 3; i > 1; i--) { + this.link.removeChild(this.link.children[i]); + } + } + /** + * @description 创建页码按钮。 + * @param ul + * @private + */ + + }, { + key: "_createLink", + value: function _createLink(ul) { + for (var i = 0; i < 4; i++) { + var li = document.createElement("li"); + li.setAttribute("class", "disable"); + var liContent = document.createElement("span"); + li.appendChild(liContent); + + if (i === 0) { + liContent.id = "first"; + liContent.setAttribute("class", "supermapol-icons-first"); + } else if (i === 1) { + liContent.id = "prev"; + liContent.setAttribute("class", "supermapol-icons-prev"); + } else if (i === 2) { + liContent.id = "next"; + liContent.setAttribute("class", "supermapol-icons-next"); + } else if (i === 3) { + liContent.id = "last"; + liContent.setAttribute("class", "supermapol-icons-last"); + } + + ul.appendChild(li); + } + } + /** + * @description 点击页码事件。 + * @param e + * @private + */ + + }, { + key: "_changePageEvent", + value: function _changePageEvent(e) { + //todo + var trigger = e.target; //若列表禁用,点击无效 + + if (trigger.parentElement.classList[0] === "disable") { + return; + } + + var targetLi; + + if (trigger.id) { + targetLi = trigger.id; + } else if (Number(trigger.innerHTML)) { + targetLi = Number(trigger.innerHTML); + } else { + return; + } //页码预处理: + + + this._prePageNum(targetLi); //根据 currentPageNumberLis 创建页码列表 + + + this.clearPageLink(); + + this._appendPageLink(); + } + /** + * @description 根据 currentPage 改变按钮状态。 + * @private + */ + + }, { + key: "_changeDisableState", + value: function _changeDisableState() { + this.link.children[0].setAttribute("class", ""); + this.link.children[1].setAttribute("class", ""); + this.link.children[this.link.children.length - 1].setAttribute("class", ""); + this.link.children[this.link.children.length - 2].setAttribute("class", ""); + + if (this.currentPage === 1) { + this.link.children[0].setAttribute("class", "disable"); + this.link.children[1].setAttribute("class", "disable"); + } + + if (this.currentPage === this.pageNumberLis.length) { + this.link.children[this.link.children.length - 1].setAttribute("class", "disable"); + this.link.children[this.link.children.length - 2].setAttribute("class", "disable"); + } + } + /** + * @description 根据点击页码列表事件准备需展现的页码列表。 + * @param {string|number} targetLi - 被点击的列表对象 id 或 被点击的页码值。 + * @private + */ + + }, { + key: "_prePageNum", + value: function _prePageNum(targetLi) { + var currentPageNumberLis = []; + + if (targetLi === "first") { + this.currentPage = 1; + } else if (targetLi === "last") { + this.currentPage = this.pageNumberLis.length; + } else if (targetLi === "prev") { + this.currentPage = this.currentPage - 1; + } else if (targetLi === "next") { + this.currentPage = this.currentPage + 1; + } else { + this.currentPage = targetLi; + } + + if (this.pageNumberLis.length <= 5) { + for (var i = 0; i < this.pageNumberLis.length; i++) { + currentPageNumberLis.push(this.pageNumberLis[i]); + } + } else { + //当前点击前三,都取前五 + if (this.currentPage <= 3) { + for (var _i3 = 0; _i3 < 5; _i3++) { + currentPageNumberLis.push(this.pageNumberLis[_i3]); + } + } else if (this.currentPage >= this.pageNumberLis.length - 3) { + //点击后三,都取后5 + for (var _i4 = this.pageNumberLis.length - 5; _i4 < this.pageNumberLis.length; _i4++) { + currentPageNumberLis.push(this.pageNumberLis[_i4]); + } + } else { + //其他,取中间: + for (var _i5 = this.currentPage - 3; _i5 <= this.currentPage + 1; _i5++) { + currentPageNumberLis.push(this.pageNumberLis[_i5]); + } + } + } + + if (currentPageNumberLis.length > 0) { + this.currentPageNumberLis = currentPageNumberLis; + } + } + }]); + + return PaginationContainer; +}(TemplateBase); +;// CONCATENATED MODULE: ./src/common/components/util/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @name ComponentsUtil + * @namespace + * @category BaseTypes Util + * @description 获取文件类型工具类。 + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { ComponentsUtil } from '{npm}'; + * + * const result = ComponentsUtil.getFileType(fileName); + * ``` + */ + +var ComponentsUtil = { + /** + * @function ComponentsUtil.getFileType + * @description 获取上传文件类型。 + * @param {string} fileName - 文件名称。 + */ + getFileType: function getFileType(fileName) { + var regCSV = /^.*\.(?:csv)$/i; + var regExcel = /^.*\.(?:xls|xlsx)$/i; //文件名可以带空格 + + var regGeojson = /^.*\.(?:geojson|json)$/i; + + if (regExcel.test(fileName)) { + //校验不通过 + return FileTypes.EXCEL; + } else if (regCSV.test(fileName)) { + return FileTypes.CSV; + } else if (regGeojson.test(fileName)) { + return FileTypes.GEOJSON; + } + + return null; + } +}; +;// CONCATENATED MODULE: ./src/common/components/util/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +;// CONCATENATED MODULE: ./src/common/components/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +//数据 + //组件 + + //提示框组件 + + //图表组件 + + + //公用模板: + + + + + + + + + + + //工具类 + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/lang/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +;// CONCATENATED MODULE: ./src/common/index.common.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/common/index.all.js + + + + + + + +;// CONCATENATED MODULE: ./src/common/namespace.js +function namespace_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + +function namespace_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? namespace_ownKeys(Object(source), !0).forEach(function (key) { namespace_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : namespace_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + +function namespace_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + // Lang + +SuperMap.Lang = Lang; +SuperMap.i18n = SuperMap.Lang.i18n; // CommonUtil + +SuperMap.Util = namespace_objectSpread(namespace_objectSpread({}, SuperMap.Util), Util); +SuperMap.Browser = Browser; +SuperMap.INCHES_PER_UNIT = INCHES_PER_UNIT; +SuperMap.METERS_PER_INCH = METERS_PER_INCH; +SuperMap.DOTS_PER_INCH = DOTS_PER_INCH; +SuperMap.IS_GECKO = IS_GECKO; // FetchRequest + +SuperMap.setCORS = setCORS; +SuperMap.isCORS = isCORS; +SuperMap.setRequestTimeout = setRequestTimeout; +SuperMap.getRequestTimeout = getRequestTimeout; +SuperMap.FetchRequest = FetchRequest; // commontypes + +SuperMap.inherit = inheritExt; +SuperMap.mixin = mixinExt; +SuperMap.String = StringExt; +SuperMap.Number = NumberExt; +SuperMap.Function = FunctionExt; +SuperMap.Array = ArrayExt; +SuperMap.Date = DateExt; +SuperMap.Event = Event; +SuperMap.Bounds = Bounds; +SuperMap.Credential = Credential; +SuperMap.Events = Events; +SuperMap.Feature = Feature; +SuperMap.Geometry = Geometry; +SuperMap.Pixel = Pixel; +SuperMap.Size = Size; +SuperMap.Feature.Vector = Vector; +SuperMap.Geometry.Collection = Collection; +SuperMap.Geometry.Curve = Curve; +SuperMap.Geometry.GeoText = GeoText; +SuperMap.Geometry.LinearRing = LinearRing; +SuperMap.Geometry.LineString = LineString; +SuperMap.Geometry.MultiLineString = MultiLineString; +SuperMap.Geometry.MultiPoint = MultiPoint; +SuperMap.Geometry.MultiPolygon = MultiPolygon; +SuperMap.Geometry.Point = Point; +SuperMap.Geometry.Polygon = Polygon; +SuperMap.Geometry.Rectangle = Rectangle; // Components + +SuperMap.Components.Chart = ChartView; +SuperMap.Components.ChartViewModel = ChartViewModel; +SuperMap.Components.MessageBox = MessageBox; +SuperMap.Components.AttributesPopContainer = AttributesPopContainer; +SuperMap.Components.CityTabsPage = CityTabsPage; +SuperMap.Components.CommonContainer = CommonContainer; +SuperMap.Components.DropDownBox = DropDownBox; +SuperMap.Components.IndexTabsPageContainer = IndexTabsPageContainer; +SuperMap.Components.NavTabsPage = NavTabsPage; +SuperMap.Components.PaginationContainer = PaginationContainer; +SuperMap.Components.PopContainer = PopContainer; +SuperMap.Components.Select = Select; +SuperMap.Components.TemplateBase = TemplateBase; +SuperMap.Components.FileReaderUtil = FileReaderUtil; // control + +SuperMap.TimeControlBase = TimeControlBase; +SuperMap.TimeFlowControl = TimeFlowControl; // Format + +SuperMap.Format = SuperMap.Format || Format; +SuperMap.Format.GeoJSON = GeoJSON; +SuperMap.Format.JSON = JSONFormat; +SuperMap.Format.WKT = WKT; // iManager + +SuperMap.iManager = IManager; +SuperMap.iManagerCreateNodeParam = IManagerCreateNodeParam; +SuperMap.iManagerServiceBase = IManagerServiceBase; // iPortal + +SuperMap.iPortal = IPortal; +SuperMap.iPortalAddDataParam = IPortalAddDataParam; +SuperMap.iPortalAddResourceParam = IPortalAddResourceParam; +SuperMap.iPortalDataConnectionInfoParam = IPortalDataConnectionInfoParam; +SuperMap.iPortalDataMetaInfoParam = IPortalDataMetaInfoParam; +SuperMap.iPortalDataStoreInfoParam = IPortalDataStoreInfoParam; +SuperMap.iPortalQueryParam = IPortalQueryParam; +SuperMap.iPortalQueryResult = IPortalQueryResult; +SuperMap.iPortalRegisterServiceParam = IPortalRegisterServiceParam; +SuperMap.iPortalResource = IPortalResource; +SuperMap.iPortalServiceBase = IPortalServiceBase; +SuperMap.iPortalShareEntity = IPortalShareEntity; +SuperMap.iPortalShareParam = IPortalShareParam; +SuperMap.iPortalUser = IPortalUser; // iServer + +SuperMap.AddressMatchService = AddressMatchService; +SuperMap.AggregationParameter = AggregationParameter; +SuperMap.AreaSolarRadiationParameters = AreaSolarRadiationParameters; +SuperMap.AreaSolarRadiationService = AreaSolarRadiationService; +SuperMap.BucketAggParameter = BucketAggParameter; +SuperMap.BufferAnalystParameters = BufferAnalystParameters; +SuperMap.BufferAnalystService = BufferAnalystService; +SuperMap.BufferDistance = BufferDistance; +SuperMap.BuffersAnalystJobsParameter = BuffersAnalystJobsParameter; +SuperMap.BuffersAnalystJobsService = BuffersAnalystJobsService; +SuperMap.BufferSetting = BufferSetting; +SuperMap.BurstPipelineAnalystParameters = BurstPipelineAnalystParameters; +SuperMap.BurstPipelineAnalystService = BurstPipelineAnalystService; +SuperMap.ChartFeatureInfoSpecsService = ChartFeatureInfoSpecsService; +SuperMap.ChartQueryFilterParameter = ChartQueryFilterParameter; +SuperMap.ChartQueryParameters = ChartQueryParameters; +SuperMap.ChartQueryService = ChartQueryService; +SuperMap.ClipParameter = ClipParameter; +SuperMap.ColorDictionary = ColorDictionary; +SuperMap.CommonServiceBase = CommonServiceBase; +SuperMap.ComputeWeightMatrixParameters = ComputeWeightMatrixParameters; +SuperMap.ComputeWeightMatrixService = ComputeWeightMatrixService; +SuperMap.CreateDatasetParameters = CreateDatasetParameters; +SuperMap.DataFlowService = DataFlowService; +SuperMap.DataReturnOption = DataReturnOption; +SuperMap.DatasetBufferAnalystParameters = DatasetBufferAnalystParameters; +SuperMap.DatasetInfo = DatasetInfo; +SuperMap.DatasetOverlayAnalystParameters = DatasetOverlayAnalystParameters; +SuperMap.DatasetService = DatasetService; +SuperMap.DatasetSurfaceAnalystParameters = DatasetSurfaceAnalystParameters; +SuperMap.DatasetThiessenAnalystParameters = DatasetThiessenAnalystParameters; +SuperMap.DatasourceConnectionInfo = DatasourceConnectionInfo; +SuperMap.DatasourceService = DatasourceService; +SuperMap.DensityAnalystService = DensityAnalystService; +SuperMap.DensityKernelAnalystParameters = DensityKernelAnalystParameters; +SuperMap.EditFeaturesParameters = EditFeaturesParameters; +SuperMap.EditFeaturesService = EditFeaturesService; +SuperMap.FacilityAnalyst3DParameters = FacilityAnalyst3DParameters; +SuperMap.FacilityAnalystSinks3DParameters = FacilityAnalystSinks3DParameters; +SuperMap.FacilityAnalystSinks3DService = FacilityAnalystSinks3DService; +SuperMap.FacilityAnalystSources3DParameters = FacilityAnalystSources3DParameters; +SuperMap.FacilityAnalystSources3DService = FacilityAnalystSources3DService; +SuperMap.FacilityAnalystStreamParameters = FacilityAnalystStreamParameters; +SuperMap.FacilityAnalystStreamService = FacilityAnalystStreamService; +SuperMap.FacilityAnalystTracedown3DParameters = FacilityAnalystTracedown3DParameters; +SuperMap.FacilityAnalystTracedown3DService = FacilityAnalystTracedown3DService; +SuperMap.FacilityAnalystTraceup3DParameters = FacilityAnalystTraceup3DParameters; +SuperMap.FacilityAnalystTraceup3DService = FacilityAnalystTraceup3DService; +SuperMap.FacilityAnalystUpstream3DParameters = FacilityAnalystUpstream3DParameters; +SuperMap.FacilityAnalystUpstream3DService = FacilityAnalystUpstream3DService; +SuperMap.FieldParameters = FieldParameters; +SuperMap.FieldsFilter = FieldsFilter; +SuperMap.FieldStatisticService = FieldStatisticService; +SuperMap.FieldStatisticsParameters = FieldStatisticsParameters; +SuperMap.FilterParameter = FilterParameter; +SuperMap.FindClosestFacilitiesParameters = FindClosestFacilitiesParameters; +SuperMap.FindClosestFacilitiesService = FindClosestFacilitiesService; +SuperMap.FindLocationParameters = FindLocationParameters; +SuperMap.FindLocationService = FindLocationService; +SuperMap.FindMTSPPathsParameters = FindMTSPPathsParameters; +SuperMap.FindMTSPPathsService = FindMTSPPathsService; +SuperMap.FindPathParameters = FindPathParameters; +SuperMap.FindPathService = FindPathService; +SuperMap.FindServiceAreasParameters = FindServiceAreasParameters; +SuperMap.FindServiceAreasService = FindServiceAreasService; +SuperMap.FindTSPPathsParameters = FindTSPPathsParameters; +SuperMap.FindTSPPathsService = FindTSPPathsService; +SuperMap.GenerateSpatialDataParameters = GenerateSpatialDataParameters; +SuperMap.GenerateSpatialDataService = GenerateSpatialDataService; +SuperMap.GeoCodingParameter = GeoCodingParameter; +SuperMap.GeoDecodingParameter = GeoDecodingParameter; +SuperMap.GeoHashGridAggParameter = GeoHashGridAggParameter; +SuperMap.GeometryBatchAnalystService = GeometryBatchAnalystService; +SuperMap.GeometryBufferAnalystParameters = GeometryBufferAnalystParameters; +SuperMap.GeometryOverlayAnalystParameters = GeometryOverlayAnalystParameters; +SuperMap.GeometrySurfaceAnalystParameters = GeometrySurfaceAnalystParameters; +SuperMap.GeometryThiessenAnalystParameters = GeometryThiessenAnalystParameters; +SuperMap.GeoprocessingService = GeoprocessingService; +SuperMap.GeoRelationAnalystParameters = GeoRelationAnalystParameters; +SuperMap.GeoRelationAnalystService = GeoRelationAnalystService; +SuperMap.GetFeaturesByBoundsParameters = GetFeaturesByBoundsParameters; +SuperMap.GetFeaturesByBoundsService = GetFeaturesByBoundsService; +SuperMap.GetFeaturesByBufferParameters = GetFeaturesByBufferParameters; +SuperMap.GetFeaturesByBufferService = GetFeaturesByBufferService; +SuperMap.GetFeaturesByGeometryParameters = GetFeaturesByGeometryParameters; +SuperMap.GetFeaturesByGeometryService = GetFeaturesByGeometryService; +SuperMap.GetFeaturesByIDsParameters = GetFeaturesByIDsParameters; +SuperMap.GetFeaturesByIDsService = GetFeaturesByIDsService; +SuperMap.GetFeaturesBySQLParameters = GetFeaturesBySQLParameters; +SuperMap.GetFeaturesBySQLService = GetFeaturesBySQLService; +SuperMap.GetFeaturesParametersBase = GetFeaturesParametersBase; +SuperMap.GetFeaturesServiceBase = GetFeaturesServiceBase; +SuperMap.GetFieldsService = GetFieldsService; +SuperMap.GetGridCellInfosParameters = GetGridCellInfosParameters; +SuperMap.GetGridCellInfosService = GetGridCellInfosService; +SuperMap.GetLayersInfoService = GetLayersInfoService; +SuperMap.Grid = Grid; +SuperMap.HillshadeParameter = HillshadeParameter; +SuperMap.Image = UGCImage; +SuperMap.ImageCollectionService = ImageCollectionService_ImageCollectionService; +SuperMap.ImageGFAspect = ImageGFAspect; +SuperMap.ImageGFHillShade = ImageGFHillShade; +SuperMap.ImageGFOrtho = ImageGFOrtho; +SuperMap.ImageGFSlope = ImageGFSlope; +SuperMap.ImageRenderingRule = ImageRenderingRule; +SuperMap.ImageSearchParameter = ImageSearchParameter; +SuperMap.ImageService = ImageService_ImageService; +SuperMap.ImageStretchOption = ImageStretchOption; +SuperMap.InterpolationAnalystParameters = InterpolationAnalystParameters; +SuperMap.InterpolationAnalystService = InterpolationAnalystService; +SuperMap.InterpolationDensityAnalystParameters = InterpolationDensityAnalystParameters; +SuperMap.InterpolationIDWAnalystParameters = InterpolationIDWAnalystParameters; +SuperMap.InterpolationKrigingAnalystParameters = InterpolationKrigingAnalystParameters; +SuperMap.InterpolationRBFAnalystParameters = InterpolationRBFAnalystParameters; +SuperMap.JoinItem = JoinItem; +SuperMap.KernelDensityJobParameter = KernelDensityJobParameter; +SuperMap.KernelDensityJobsService = KernelDensityJobsService; +SuperMap.LabelImageCell = LabelImageCell; +SuperMap.LabelMatrixCell = LabelMatrixCell; +SuperMap.LabelMixedTextStyle = LabelMixedTextStyle; +SuperMap.LabelSymbolCell = LabelSymbolCell; +SuperMap.LabelThemeCell = LabelThemeCell; +SuperMap.LayerStatus = LayerStatus; +SuperMap.LinkItem = LinkItem; +SuperMap.MappingParameters = MappingParameters; +SuperMap.MapService = MapService; +SuperMap.MathExpressionAnalysisParameters = MathExpressionAnalysisParameters; +SuperMap.MathExpressionAnalysisService = MathExpressionAnalysisService; +SuperMap.MeasureParameters = MeasureParameters; +SuperMap.MeasureService = MeasureService; +SuperMap.MetricsAggParameter = MetricsAggParameter; +SuperMap.NDVIParameter = NDVIParameter; +SuperMap.NetworkAnalystServiceBase = NetworkAnalystServiceBase; +SuperMap.OutputSetting = OutputSetting; +SuperMap.OverlapDisplayedOptions = OverlapDisplayedOptions; +SuperMap.OverlayAnalystParameters = OverlayAnalystParameters; +SuperMap.OverlayAnalystService = OverlayAnalystService; +SuperMap.OverlayGeoJobParameter = OverlayGeoJobParameter; +SuperMap.OverlayGeoJobsService = OverlayGeoJobsService; +SuperMap.PointWithMeasure = PointWithMeasure; +SuperMap.ProcessingServiceBase = ProcessingServiceBase; +SuperMap.QueryByBoundsParameters = QueryByBoundsParameters; +SuperMap.QueryByBoundsService = QueryByBoundsService; +SuperMap.QueryByDistanceParameters = QueryByDistanceParameters; +SuperMap.QueryByDistanceService = QueryByDistanceService; +SuperMap.QueryByGeometryParameters = QueryByGeometryParameters; +SuperMap.QueryByGeometryService = QueryByGeometryService; +SuperMap.QueryBySQLParameters = QueryBySQLParameters; +SuperMap.QueryBySQLService = QueryBySQLService; +SuperMap.QueryParameters = QueryParameters; +SuperMap.QueryService = QueryService; +SuperMap.RasterFunctionParameter = RasterFunctionParameter; +SuperMap.Route = Route; +SuperMap.RouteCalculateMeasureParameters = RouteCalculateMeasureParameters; +SuperMap.RouteCalculateMeasureService = RouteCalculateMeasureService; +SuperMap.RouteLocatorParameters = RouteLocatorParameters; +SuperMap.RouteLocatorService = RouteLocatorService; +SuperMap.ServerColor = ServerColor; +SuperMap.ServerFeature = ServerFeature; +SuperMap.ServerGeometry = ServerGeometry; +SuperMap.ServerStyle = ServerStyle; +SuperMap.ServerTextStyle = ServerTextStyle; +SuperMap.ServerTheme = ServerTheme; +SuperMap.SetDatasourceParameters = SetDatasourceParameters; +SuperMap.SetLayerInfoParameters = SetLayerInfoParameters; +SuperMap.SetLayerInfoService = SetLayerInfoService; +SuperMap.SetLayersInfoParameters = SetLayersInfoParameters; +SuperMap.SetLayersInfoService = SetLayersInfoService; +SuperMap.SetLayerStatusParameters = SetLayerStatusParameters; +SuperMap.SetLayerStatusService = SetLayerStatusService; +SuperMap.SingleObjectQueryJobsParameter = SingleObjectQueryJobsParameter; +SuperMap.SingleObjectQueryJobsService = SingleObjectQueryJobsService; +SuperMap.Sortby = Sortby; +SuperMap.SpatialAnalystBase = SpatialAnalystBase; +SuperMap.StopQueryParameters = StopQueryParameters; +SuperMap.StopQueryService = StopQueryService; +SuperMap.SummaryAttributesJobsParameter = SummaryAttributesJobsParameter; +SuperMap.SummaryAttributesJobsService = SummaryAttributesJobsService; +SuperMap.SummaryMeshJobParameter = SummaryMeshJobParameter; +SuperMap.SummaryMeshJobsService = SummaryMeshJobsService; +SuperMap.SummaryRegionJobParameter = SummaryRegionJobParameter; +SuperMap.SummaryRegionJobsService = SummaryRegionJobsService; +SuperMap.SupplyCenter = SupplyCenter; +SuperMap.SurfaceAnalystParameters = SurfaceAnalystParameters; +SuperMap.SurfaceAnalystParametersSetting = SurfaceAnalystParametersSetting; +SuperMap.SurfaceAnalystService = SurfaceAnalystService; +SuperMap.TerrainCurvatureCalculationParameters = TerrainCurvatureCalculationParameters; +SuperMap.TerrainCurvatureCalculationService = TerrainCurvatureCalculationService; +SuperMap.Theme = Theme; +SuperMap.ThemeDotDensity = ThemeDotDensity; +SuperMap.ThemeFlow = ThemeFlow; +SuperMap.ThemeGraduatedSymbol = ThemeGraduatedSymbol; +SuperMap.ThemeGraduatedSymbolStyle = ThemeGraduatedSymbolStyle; +SuperMap.ThemeGraph = ThemeGraph; +SuperMap.ThemeGraphAxes = ThemeGraphAxes; +SuperMap.ThemeGraphItem = ThemeGraphItem; +SuperMap.ThemeGraphSize = ThemeGraphSize; +SuperMap.ThemeGraphText = ThemeGraphText; +SuperMap.ThemeGridRange = ThemeGridRange; +SuperMap.ThemeGridRangeItem = ThemeGridRangeItem; +SuperMap.ThemeGridUnique = ThemeGridUnique; +SuperMap.ThemeGridUniqueItem = ThemeGridUniqueItem; +SuperMap.ThemeLabel = ThemeLabel; +SuperMap.ThemeLabelAlongLine = ThemeLabelAlongLine; +SuperMap.ThemeLabelBackground = ThemeLabelBackground; +SuperMap.ThemeLabelItem = ThemeLabelItem; +SuperMap.ThemeLabelText = ThemeLabelText; +SuperMap.ThemeLabelUniqueItem = ThemeLabelUniqueItem; +SuperMap.ThemeMemoryData = ThemeMemoryData; +SuperMap.ThemeOffset = ThemeOffset; +SuperMap.ThemeParameters = ThemeParameters; +SuperMap.ThemeRange = ThemeRange; +SuperMap.ThemeRangeItem = ThemeRangeItem; +SuperMap.ThemeService = ThemeService; +SuperMap.ThemeUnique = ThemeUnique; +SuperMap.ThemeUniqueItem = ThemeUniqueItem; +SuperMap.ThiessenAnalystParameters = ThiessenAnalystParameters; +SuperMap.ThiessenAnalystService = ThiessenAnalystService; +SuperMap.TilesetsService = TilesetsService; +SuperMap.TopologyValidatorJobsParameter = TopologyValidatorJobsParameter; +SuperMap.TopologyValidatorJobsService = TopologyValidatorJobsService; +SuperMap.TransferLine = TransferLine; +SuperMap.TransferPathParameters = TransferPathParameters; +SuperMap.TransferPathService = TransferPathService; +SuperMap.TransferSolutionParameters = TransferSolutionParameters; +SuperMap.TransferSolutionService = TransferSolutionService; +SuperMap.TransportationAnalystParameter = TransportationAnalystParameter; +SuperMap.TransportationAnalystResultSetting = TransportationAnalystResultSetting; +SuperMap.UGCLayer = UGCLayer; +SuperMap.UGCMapLayer = UGCMapLayer; +SuperMap.UGCSubLayer = UGCSubLayer; +SuperMap.UpdateDatasetParameters = UpdateDatasetParameters; +SuperMap.UpdateEdgeWeightParameters = UpdateEdgeWeightParameters; +SuperMap.UpdateEdgeWeightService = UpdateEdgeWeightService; +SuperMap.UpdateTurnNodeWeightParameters = UpdateTurnNodeWeightParameters; +SuperMap.UpdateTurnNodeWeightService = UpdateTurnNodeWeightService; +SuperMap.Vector = Vector_Vector; +SuperMap.VectorClipJobsParameter = VectorClipJobsParameter; +SuperMap.VectorClipJobsService = VectorClipJobsService; +SuperMap.WebPrintingJobContent = WebPrintingJobContent; +SuperMap.WebPrintingJobCustomItems = WebPrintingJobCustomItems; +SuperMap.WebPrintingJobExportOptions = WebPrintingJobExportOptions; +SuperMap.WebPrintingJobImage = WebPrintingJobImage; +SuperMap.WebPrintingJobLayers = WebPrintingJobLayers; +SuperMap.WebPrintingJobLayoutOptions = WebPrintingJobLayoutOptions; +SuperMap.WebPrintingJobLegendOptions = WebPrintingJobLegendOptions; +SuperMap.WebPrintingJobLittleMapOptions = WebPrintingJobLittleMapOptions; +SuperMap.WebPrintingJobNorthArrowOptions = WebPrintingJobNorthArrowOptions; +SuperMap.WebPrintingJobParameters = WebPrintingJobParameters; +SuperMap.WebPrintingJobScaleBarOptions = WebPrintingJobScaleBarOptions; +SuperMap.WebPrintingService = WebPrintingService; //Online + +SuperMap.Online = Online; +SuperMap.OnlineData = OnlineData; +SuperMap.OnlineQueryDatasParameter = OnlineQueryDatasParameter; +SuperMap.ServiceStatus = ServiceStatus; // 包含online中的DataItemType数据类型 + +SuperMap.DataItemType = DataItemType; +SuperMap.DataItemOrderBy = DataItemOrderBy; +SuperMap.FilterField = FilterField; +SuperMap.OnlineServiceBase = OnlineServiceBase; // overlay + +SuperMap.Feature = SuperMap.Feature || {}; +SuperMap.Feature.Theme = Theme_Theme; +SuperMap.Feature.Theme.Bar = Bar; +SuperMap.Feature.Theme.Bar3D = Bar3D; +SuperMap.Feature.Theme.Circle = Circle; +SuperMap.Feature.Theme.Graph = Graph; +SuperMap.Feature.Theme.Line = Line; +SuperMap.Feature.Theme.Pie = Pie; +SuperMap.Feature.Theme.Point = overlay_Point_Point; +SuperMap.Feature.Theme.RankSymbol = RankSymbol; +SuperMap.Feature.Theme.Ring = Ring; +SuperMap.Feature.Theme.ThemeVector = ThemeVector; +SuperMap.Feature.ShapeParameters = ShapeParameters; +SuperMap.Feature.ShapeParameters.Circle = Circle_Circle; +SuperMap.Feature.ShapeParameters.Image = Image_Image; +SuperMap.Feature.ShapeParameters.Label = Label; +SuperMap.Feature.ShapeParameters.Line = Line_Line; +SuperMap.Feature.ShapeParameters.Point = Point_Point; +SuperMap.Feature.ShapeParameters.Polygon = Polygon_Polygon; +SuperMap.Feature.ShapeParameters.Rectangle = Rectangle_Rectangle; +SuperMap.Feature.ShapeParameters.Sector = Sector; +SuperMap.Feature.ShapeFactory = ShapeFactory; // LevelRenderer + +SuperMap.LevelRenderer = LevelRenderer; // security + +SuperMap.KeyServiceParameter = KeyServiceParameter; +SuperMap.SecurityManager = SecurityManager; +SuperMap.ServerInfo = ServerInfo; +SuperMap.TokenServiceParameter = TokenServiceParameter; // style + +SuperMap.ThemeStyle = ThemeStyle; +SuperMap.CartoCSS = CartoCSS; // thirdparty +// SuperMap.BinaryClassification = BinaryClassification; +// SuperMap.LandcoverClassification = LandcoverClassification; +// SuperMap.ObjectDetection = ObjectDetection; +// SuperMap.WebMachineLearning = WebMachineLearning; + +SuperMap.ElasticSearch = ElasticSearch; // util + +SuperMap.ArrayStatistic = ArrayStatistic; +SuperMap.ColorsPickerUtil = ColorsPickerUtil; // REST + +SuperMap.DataFormat = DataFormat; +SuperMap.ServerType = ServerType; +SuperMap.GeometryType = GeometryType; +SuperMap.QueryOption = QueryOption; +SuperMap.JoinType = JoinType; +SuperMap.SpatialQueryMode = SpatialQueryMode; +SuperMap.SpatialRelationType = SpatialRelationType; +SuperMap.MeasureMode = MeasureMode; +SuperMap.Unit = Unit; +SuperMap.BufferRadiusUnit = BufferRadiusUnit; +SuperMap.EngineType = EngineType; +SuperMap.ThemeGraphTextFormat = ThemeGraphTextFormat; +SuperMap.ThemeGraphType = ThemeGraphType; +SuperMap.GraphAxesTextDisplayMode = GraphAxesTextDisplayMode; +SuperMap.GraduatedMode = GraduatedMode; +SuperMap.RangeMode = RangeMode; +SuperMap.ThemeType = ThemeType; +SuperMap.ColorGradientType = ColorGradientType; +SuperMap.TextAlignment = TextAlignment; +SuperMap.FillGradientMode = FillGradientMode; +SuperMap.AlongLineDirection = AlongLineDirection; +SuperMap.LabelBackShape = LabelBackShape; +SuperMap.LabelOverLengthMode = LabelOverLengthMode; +SuperMap.DirectionType = DirectionType; +SuperMap.OverlayOperationType = OverlayOperationType; +SuperMap.OutputType = OutputType; +SuperMap.SideType = SideType; +SuperMap.SupplyCenterType = SupplyCenterType; +SuperMap.TurnType = TurnType; +SuperMap.BufferEndType = BufferEndType; +SuperMap.SmoothMethod = SmoothMethod; +SuperMap.SurfaceAnalystMethod = SurfaceAnalystMethod; +SuperMap.DataReturnMode = DataReturnMode; +SuperMap.EditType = EditType; +SuperMap.TransferTactic = TransferTactic; +SuperMap.TransferPreference = TransferPreference; +SuperMap.GridType = GridType; +SuperMap.ColorSpaceType = ColorSpaceType; +SuperMap.LayerType = LayerType; +SuperMap.UGCLayerType = UGCLayerType; +SuperMap.StatisticMode = StatisticMode; +SuperMap.PixelFormat = PixelFormat; +SuperMap.SearchMode = SearchMode; +SuperMap.InterpolationAlgorithmType = InterpolationAlgorithmType; +SuperMap.VariogramMode = VariogramMode; +SuperMap.Exponent = Exponent; +SuperMap.ClientType = ClientType; +SuperMap.ChartType = ChartType; +SuperMap.ClipAnalystMode = ClipAnalystMode; +SuperMap.AnalystAreaUnit = AnalystAreaUnit; +SuperMap.AnalystSizeUnit = AnalystSizeUnit; +SuperMap.StatisticAnalystMode = StatisticAnalystMode; +SuperMap.SummaryType = SummaryType; +SuperMap.TopologyValidatorRule = TopologyValidatorRule; +SuperMap.BucketAggType = BucketAggType; +SuperMap.MetricsAggType = MetricsAggType; +SuperMap.GetFeatureMode = GetFeatureMode; +SuperMap.RasterFunctionType = RasterFunctionType; +SuperMap.ResourceType = ResourceType; +SuperMap.OrderBy = OrderBy; +SuperMap.OrderType = OrderType; +SuperMap.SearchType = SearchType; +SuperMap.AggregationTypes = AggregationTypes; +SuperMap.PermissionType = PermissionType; +SuperMap.EntityType = EntityType; +SuperMap.WebExportFormatType = WebExportFormatType; +SuperMap.WebScaleOrientationType = WebScaleOrientationType; +SuperMap.WebScaleType = WebScaleType; +SuperMap.WebScaleUnit = WebScaleUnit; + +;// CONCATENATED MODULE: external "L" +var external_L_namespaceObject = L; +var external_L_default = /*#__PURE__*/__webpack_require__.n(external_L_namespaceObject); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/global.js +/* harmony default export */ function global(defs) { + defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); + defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); + defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"); + defs.WGS84 = defs['EPSG:4326']; + defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 + + defs.GOOGLE = defs['EPSG:3857']; + defs['EPSG:900913'] = defs['EPSG:3857']; + defs['EPSG:102113'] = defs['EPSG:3857']; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/values.js +var PJD_3PARAM = 1; +var PJD_7PARAM = 2; +var PJD_GRIDSHIFT = 3; +var PJD_WGS84 = 4; // WGS84 or equivalent + +var PJD_NODATUM = 5; // WGS84 or equivalent + +var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms + +var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms + +var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms + +var SEC_TO_RAD = 4.84813681109535993589914102357e-6; +var HALF_PI = Math.PI / 2; // ellipoid pj_set_ell.c + +var SIXTH = 0.1666666666666666667; +/* 1/6 */ + +var RA4 = 0.04722222222222222222; +/* 17/360 */ + +var RA6 = 0.02215608465608465608; +var EPSLN = 1.0e-10; // you'd think you could use Number.EPSILON above but that makes +// Mollweide get into an infinate loop. + +var D2R = 0.01745329251994329577; +var R2D = 57.29577951308232088; +var FORTPI = Math.PI / 4; +var TWO_PI = Math.PI * 2; // SPI is slightly greater than Math.PI, so values that exceed the -180..180 +// degree range by a tiny amount don't get wrapped. This prevents points that +// have drifted from their original location along the 180th meridian (due to +// floating point error) from changing their sign. + +var SPI = 3.14159265359; +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/PrimeMeridian.js +var PrimeMeridian_exports = {}; + +PrimeMeridian_exports.greenwich = 0.0; //"0dE", + +PrimeMeridian_exports.lisbon = -9.131906111111; //"9d07'54.862\"W", + +PrimeMeridian_exports.paris = 2.337229166667; //"2d20'14.025\"E", + +PrimeMeridian_exports.bogota = -74.080916666667; //"74d04'51.3\"W", + +PrimeMeridian_exports.madrid = -3.687938888889; //"3d41'16.58\"W", + +PrimeMeridian_exports.rome = 12.452333333333; //"12d27'8.4\"E", + +PrimeMeridian_exports.bern = 7.439583333333; //"7d26'22.5\"E", + +PrimeMeridian_exports.jakarta = 106.807719444444; //"106d48'27.79\"E", + +PrimeMeridian_exports.ferro = -17.666666666667; //"17d40'W", + +PrimeMeridian_exports.brussels = 4.367975; //"4d22'4.71\"E", + +PrimeMeridian_exports.stockholm = 18.058277777778; //"18d3'29.8\"E", + +PrimeMeridian_exports.athens = 23.7163375; //"23d42'58.815\"E", + +PrimeMeridian_exports.oslo = 10.722916666667; //"10d43'22.5\"E" +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/units.js +/* harmony default export */ var constants_units = ({ + ft: { + to_meter: 0.3048 + }, + 'us-ft': { + to_meter: 1200 / 3937 + } +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/match.js +var ignoredChar = /[\s_\-\/\(\)]/g; +function match(obj, key) { + if (obj[key]) { + return obj[key]; + } + + var keys = Object.keys(obj); + var lkey = key.toLowerCase().replace(ignoredChar, ''); + var i = -1; + var testkey, processedKey; + + while (++i < keys.length) { + testkey = keys[i]; + processedKey = testkey.toLowerCase().replace(ignoredChar, ''); + + if (processedKey === lkey) { + return obj[testkey]; + } + } +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projString.js + + + + +/* harmony default export */ function projString(defData) { + var self = {}; + var paramObj = defData.split('+').map(function (v) { + return v.trim(); + }).filter(function (a) { + return a; + }).reduce(function (p, a) { + var split = a.split('='); + split.push(true); + p[split[0].toLowerCase()] = split[1]; + return p; + }, {}); + var paramName, paramVal, paramOutname; + var params = { + proj: 'projName', + datum: 'datumCode', + rf: function rf(v) { + self.rf = parseFloat(v); + }, + lat_0: function lat_0(v) { + self.lat0 = v * D2R; + }, + lat_1: function lat_1(v) { + self.lat1 = v * D2R; + }, + lat_2: function lat_2(v) { + self.lat2 = v * D2R; + }, + lat_ts: function lat_ts(v) { + self.lat_ts = v * D2R; + }, + lon_0: function lon_0(v) { + self.long0 = v * D2R; + }, + lon_1: function lon_1(v) { + self.long1 = v * D2R; + }, + lon_2: function lon_2(v) { + self.long2 = v * D2R; + }, + alpha: function alpha(v) { + self.alpha = parseFloat(v) * D2R; + }, + gamma: function gamma(v) { + self.rectified_grid_angle = parseFloat(v); + }, + lonc: function lonc(v) { + self.longc = v * D2R; + }, + x_0: function x_0(v) { + self.x0 = parseFloat(v); + }, + y_0: function y_0(v) { + self.y0 = parseFloat(v); + }, + k_0: function k_0(v) { + self.k0 = parseFloat(v); + }, + k: function k(v) { + self.k0 = parseFloat(v); + }, + a: function a(v) { + self.a = parseFloat(v); + }, + b: function b(v) { + self.b = parseFloat(v); + }, + r_a: function r_a() { + self.R_A = true; + }, + zone: function zone(v) { + self.zone = parseInt(v, 10); + }, + south: function south() { + self.utmSouth = true; + }, + towgs84: function towgs84(v) { + self.datum_params = v.split(",").map(function (a) { + return parseFloat(a); + }); + }, + to_meter: function to_meter(v) { + self.to_meter = parseFloat(v); + }, + units: function units(v) { + self.units = v; + var unit = match(constants_units, v); + + if (unit) { + self.to_meter = unit.to_meter; + } + }, + from_greenwich: function from_greenwich(v) { + self.from_greenwich = v * D2R; + }, + pm: function pm(v) { + var pm = match(PrimeMeridian_exports, v); + self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R; + }, + nadgrids: function nadgrids(v) { + if (v === '@null') { + self.datumCode = 'none'; + } else { + self.nadgrids = v; + } + }, + axis: function axis(v) { + var legalAxis = "ewnsud"; + + if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { + self.axis = v; + } + }, + approx: function approx() { + self.approx = true; + } + }; + + for (paramName in paramObj) { + paramVal = paramObj[paramName]; + + if (paramName in params) { + paramOutname = params[paramName]; + + if (typeof paramOutname === 'function') { + paramOutname(paramVal); + } else { + self[paramOutname] = paramVal; + } + } else { + self[paramName] = paramVal; + } + } + + if (typeof self.datumCode === 'string' && self.datumCode !== "WGS84") { + self.datumCode = self.datumCode.toLowerCase(); + } + + return self; +} +;// CONCATENATED MODULE: ./node_modules/wkt-parser/parser.js +/* harmony default export */ var parser = (parseString); +var NEUTRAL = 1; +var KEYWORD = 2; +var NUMBER = 3; +var QUOTED = 4; +var AFTERQUOTE = 5; +var ENDED = -1; +var whitespace = /\s/; +var latin = /[A-Za-z]/; +var keyword = /[A-Za-z84_]/; +var endThings = /[,\]]/; +var digets = /[\d\.E\-\+]/; // const ignoredChar = /[\s_\-\/\(\)]/g; + +function Parser(text) { + if (typeof text !== 'string') { + throw new Error('not a string'); + } + + this.text = text.trim(); + this.level = 0; + this.place = 0; + this.root = null; + this.stack = []; + this.currentObject = null; + this.state = NEUTRAL; +} + +Parser.prototype.readCharicter = function () { + var _char = this.text[this.place++]; + + if (this.state !== QUOTED) { + while (whitespace.test(_char)) { + if (this.place >= this.text.length) { + return; + } + + _char = this.text[this.place++]; + } + } + + switch (this.state) { + case NEUTRAL: + return this.neutral(_char); + + case KEYWORD: + return this.keyword(_char); + + case QUOTED: + return this.quoted(_char); + + case AFTERQUOTE: + return this.afterquote(_char); + + case NUMBER: + return this.number(_char); + + case ENDED: + return; + } +}; + +Parser.prototype.afterquote = function (_char2) { + if (_char2 === '"') { + this.word += '"'; + this.state = QUOTED; + return; + } + + if (endThings.test(_char2)) { + this.word = this.word.trim(); + this.afterItem(_char2); + return; + } + + throw new Error('havn\'t handled "' + _char2 + '" in afterquote yet, index ' + this.place); +}; + +Parser.prototype.afterItem = function (_char3) { + if (_char3 === ',') { + if (this.word !== null) { + this.currentObject.push(this.word); + } + + this.word = null; + this.state = NEUTRAL; + return; + } + + if (_char3 === ']') { + this.level--; + + if (this.word !== null) { + this.currentObject.push(this.word); + this.word = null; + } + + this.state = NEUTRAL; + this.currentObject = this.stack.pop(); + + if (!this.currentObject) { + this.state = ENDED; + } + + return; + } +}; + +Parser.prototype.number = function (_char4) { + if (digets.test(_char4)) { + this.word += _char4; + return; + } + + if (endThings.test(_char4)) { + this.word = parseFloat(this.word); + this.afterItem(_char4); + return; + } + + throw new Error('havn\'t handled "' + _char4 + '" in number yet, index ' + this.place); +}; + +Parser.prototype.quoted = function (_char5) { + if (_char5 === '"') { + this.state = AFTERQUOTE; + return; + } + + this.word += _char5; + return; +}; + +Parser.prototype.keyword = function (_char6) { + if (keyword.test(_char6)) { + this.word += _char6; + return; + } + + if (_char6 === '[') { + var newObjects = []; + newObjects.push(this.word); + this.level++; + + if (this.root === null) { + this.root = newObjects; + } else { + this.currentObject.push(newObjects); + } + + this.stack.push(this.currentObject); + this.currentObject = newObjects; + this.state = NEUTRAL; + return; + } + + if (endThings.test(_char6)) { + this.afterItem(_char6); + return; + } + + throw new Error('havn\'t handled "' + _char6 + '" in keyword yet, index ' + this.place); +}; + +Parser.prototype.neutral = function (_char7) { + if (latin.test(_char7)) { + this.word = _char7; + this.state = KEYWORD; + return; + } + + if (_char7 === '"') { + this.word = ''; + this.state = QUOTED; + return; + } + + if (digets.test(_char7)) { + this.word = _char7; + this.state = NUMBER; + return; + } + + if (endThings.test(_char7)) { + this.afterItem(_char7); + return; + } + + throw new Error('havn\'t handled "' + _char7 + '" in neutral yet, index ' + this.place); +}; + +Parser.prototype.output = function () { + while (this.place < this.text.length) { + this.readCharicter(); + } + + if (this.state === ENDED) { + return this.root; + } + + throw new Error('unable to parse string "' + this.text + '". State is ' + this.state); +}; + +function parseString(txt) { + var parser = new Parser(txt); + return parser.output(); +} +;// CONCATENATED MODULE: ./node_modules/wkt-parser/process.js +function mapit(obj, key, value) { + if (Array.isArray(key)) { + value.unshift(key); + key = null; + } + + var thing = key ? {} : obj; + var out = value.reduce(function (newObj, item) { + sExpr(item, newObj); + return newObj; + }, thing); + + if (key) { + obj[key] = out; + } +} + +function sExpr(v, obj) { + if (!Array.isArray(v)) { + obj[v] = true; + return; + } + + var key = v.shift(); + + if (key === 'PARAMETER') { + key = v.shift(); + } + + if (v.length === 1) { + if (Array.isArray(v[0])) { + obj[key] = {}; + sExpr(v[0], obj[key]); + return; + } + + obj[key] = v[0]; + return; + } + + if (!v.length) { + obj[key] = true; + return; + } + + if (key === 'TOWGS84') { + obj[key] = v; + return; + } + + if (key === 'AXIS') { + if (!(key in obj)) { + obj[key] = []; + } + + obj[key].push(v); + return; + } + + if (!Array.isArray(key)) { + obj[key] = {}; + } + + var i; + + switch (key) { + case 'UNIT': + case 'PRIMEM': + case 'VERT_DATUM': + obj[key] = { + name: v[0].toLowerCase(), + convert: v[1] + }; + + if (v.length === 3) { + sExpr(v[2], obj[key]); + } + + return; + + case 'SPHEROID': + case 'ELLIPSOID': + obj[key] = { + name: v[0], + a: v[1], + rf: v[2] + }; + + if (v.length === 4) { + sExpr(v[3], obj[key]); + } + + return; + + case 'PROJECTEDCRS': + case 'PROJCRS': + case 'GEOGCS': + case 'GEOCCS': + case 'PROJCS': + case 'LOCAL_CS': + case 'GEODCRS': + case 'GEODETICCRS': + case 'GEODETICDATUM': + case 'EDATUM': + case 'ENGINEERINGDATUM': + case 'VERT_CS': + case 'VERTCRS': + case 'VERTICALCRS': + case 'COMPD_CS': + case 'COMPOUNDCRS': + case 'ENGINEERINGCRS': + case 'ENGCRS': + case 'FITTED_CS': + case 'LOCAL_DATUM': + case 'DATUM': + v[0] = ['name', v[0]]; + mapit(obj, key, v); + return; + + default: + i = -1; + + while (++i < v.length) { + if (!Array.isArray(v[i])) { + return sExpr(v, obj[key]); + } + } + + return mapit(obj, key, v); + } +} +;// CONCATENATED MODULE: ./node_modules/wkt-parser/index.js +function wkt_parser_typeof(obj) { "@babel/helpers - typeof"; return wkt_parser_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, wkt_parser_typeof(obj); } + +var wkt_parser_D2R = 0.01745329251994329577; + + + +function rename(obj, params) { + var outName = params[0]; + var inName = params[1]; + + if (!(outName in obj) && inName in obj) { + obj[outName] = obj[inName]; + + if (params.length === 3) { + obj[outName] = params[2](obj[outName]); + } + } +} + +function d2r(input) { + return input * wkt_parser_D2R; +} + +function cleanWKT(wkt) { + if (wkt.type === 'GEOGCS') { + wkt.projName = 'longlat'; + } else if (wkt.type === 'LOCAL_CS') { + wkt.projName = 'identity'; + wkt.local = true; + } else { + if (wkt_parser_typeof(wkt.PROJECTION) === 'object') { + wkt.projName = Object.keys(wkt.PROJECTION)[0]; + } else { + wkt.projName = wkt.PROJECTION; + } + } + + if (wkt.AXIS) { + var axisOrder = ''; + + for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) { + var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()]; + + if (axis[0].indexOf('north') !== -1 || (axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north') { + axisOrder += 'n'; + } else if (axis[0].indexOf('south') !== -1 || (axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south') { + axisOrder += 's'; + } else if (axis[0].indexOf('east') !== -1 || (axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east') { + axisOrder += 'e'; + } else if (axis[0].indexOf('west') !== -1 || (axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west') { + axisOrder += 'w'; + } + } + + if (axisOrder.length === 2) { + axisOrder += 'u'; + } + + if (axisOrder.length === 3) { + wkt.axis = axisOrder; + } + } + + if (wkt.UNIT) { + wkt.units = wkt.UNIT.name.toLowerCase(); + + if (wkt.units === 'metre') { + wkt.units = 'meter'; + } + + if (wkt.UNIT.convert) { + if (wkt.type === 'GEOGCS') { + if (wkt.DATUM && wkt.DATUM.SPHEROID) { + wkt.to_meter = wkt.UNIT.convert * wkt.DATUM.SPHEROID.a; + } + } else { + wkt.to_meter = wkt.UNIT.convert; + } + } + } + + var geogcs = wkt.GEOGCS; + + if (wkt.type === 'GEOGCS') { + geogcs = wkt; + } + + if (geogcs) { + //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ + // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; + //} + if (geogcs.DATUM) { + wkt.datumCode = geogcs.DATUM.name.toLowerCase(); + } else { + wkt.datumCode = geogcs.name.toLowerCase(); + } + + if (wkt.datumCode.slice(0, 2) === 'd_') { + wkt.datumCode = wkt.datumCode.slice(2); + } + + if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { + wkt.datumCode = 'nzgd49'; + } + + if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') { + if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { + wkt.sphere = true; + } + + wkt.datumCode = 'wgs84'; + } + + if (wkt.datumCode.slice(-6) === '_ferro') { + wkt.datumCode = wkt.datumCode.slice(0, -6); + } + + if (wkt.datumCode.slice(-8) === '_jakarta') { + wkt.datumCode = wkt.datumCode.slice(0, -8); + } + + if (~wkt.datumCode.indexOf('belge')) { + wkt.datumCode = 'rnb72'; + } + + if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { + wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); + + if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { + wkt.ellps = 'intl'; + } + + wkt.a = geogcs.DATUM.SPHEROID.a; + wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); + } + + if (geogcs.DATUM && geogcs.DATUM.TOWGS84) { + wkt.datum_params = geogcs.DATUM.TOWGS84; + } + + if (~wkt.datumCode.indexOf('osgb_1936')) { + wkt.datumCode = 'osgb36'; + } + + if (~wkt.datumCode.indexOf('osni_1952')) { + wkt.datumCode = 'osni52'; + } + + if (~wkt.datumCode.indexOf('tm65') || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) { + wkt.datumCode = 'ire65'; + } + + if (wkt.datumCode === 'ch1903+') { + wkt.datumCode = 'ch1903'; + } + + if (~wkt.datumCode.indexOf('israel')) { + wkt.datumCode = 'isr93'; + } + } + + if (wkt.b && !isFinite(wkt.b)) { + wkt.b = wkt.a; + } + + function toMeter(input) { + var ratio = wkt.to_meter || 1; + return input * ratio; + } + + var renamer = function renamer(a) { + return rename(wkt, a); + }; + + var list = [['standard_parallel_1', 'Standard_Parallel_1'], ['standard_parallel_1', 'Latitude of 1st standard parallel'], ['standard_parallel_2', 'Standard_Parallel_2'], ['standard_parallel_2', 'Latitude of 2nd standard parallel'], ['false_easting', 'False_Easting'], ['false_easting', 'False easting'], ['false-easting', 'Easting at false origin'], ['false_northing', 'False_Northing'], ['false_northing', 'False northing'], ['false_northing', 'Northing at false origin'], ['central_meridian', 'Central_Meridian'], ['central_meridian', 'Longitude of natural origin'], ['central_meridian', 'Longitude of false origin'], ['latitude_of_origin', 'Latitude_Of_Origin'], ['latitude_of_origin', 'Central_Parallel'], ['latitude_of_origin', 'Latitude of natural origin'], ['latitude_of_origin', 'Latitude of false origin'], ['scale_factor', 'Scale_Factor'], ['k0', 'scale_factor'], ['latitude_of_center', 'Latitude_Of_Center'], ['latitude_of_center', 'Latitude_of_center'], ['lat0', 'latitude_of_center', d2r], ['longitude_of_center', 'Longitude_Of_Center'], ['longitude_of_center', 'Longitude_of_center'], ['longc', 'longitude_of_center', d2r], ['x0', 'false_easting', toMeter], ['y0', 'false_northing', toMeter], ['long0', 'central_meridian', d2r], ['lat0', 'latitude_of_origin', d2r], ['lat0', 'standard_parallel_1', d2r], ['lat1', 'standard_parallel_1', d2r], ['lat2', 'standard_parallel_2', d2r], ['azimuth', 'Azimuth'], ['alpha', 'azimuth', d2r], ['srsCode', 'name']]; + list.forEach(renamer); + + if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) { + wkt.long0 = wkt.longc; + } + + if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) { + wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); + wkt.lat_ts = wkt.lat1; + } +} + +/* harmony default export */ function wkt_parser(wkt) { + var lisp = parser(wkt); + var type = lisp.shift(); + var name = lisp.shift(); + lisp.unshift(['name', name]); + lisp.unshift(['type', type]); + var obj = {}; + sExpr(lisp, obj); + cleanWKT(obj); + return obj; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/defs.js + + + + +function defs(name) { + /*global console*/ + var that = this; + + if (arguments.length === 2) { + var def = arguments[1]; + + if (typeof def === 'string') { + if (def.charAt(0) === '+') { + defs[name] = projString(arguments[1]); + } else { + defs[name] = wkt_parser(arguments[1]); + } + } else { + defs[name] = def; + } + } else if (arguments.length === 1) { + if (Array.isArray(name)) { + return name.map(function (v) { + if (Array.isArray(v)) { + defs.apply(that, v); + } else { + defs(v); + } + }); + } else if (typeof name === 'string') { + if (name in defs) { + return defs[name]; + } + } else if ('EPSG' in name) { + defs['EPSG:' + name.EPSG] = name; + } else if ('ESRI' in name) { + defs['ESRI:' + name.ESRI] = name; + } else if ('IAU2000' in name) { + defs['IAU2000:' + name.IAU2000] = name; + } else { + console.log(name); + } + + return; + } +} + +global(defs); +/* harmony default export */ var lib_defs = (defs); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/parseCode.js + + + + + +function testObj(code) { + return typeof code === 'string'; +} + +function testDef(code) { + return code in lib_defs; +} + +var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS', 'GEOCCS', 'PROJCS', 'LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; + +function testWKT(code) { + return codeWords.some(function (word) { + return code.indexOf(word) > -1; + }); +} + +var codes = ['3857', '900913', '3785', '102113']; + +function checkMercator(item) { + var auth = match(item, 'authority'); + + if (!auth) { + return; + } + + var code = match(auth, 'epsg'); + return code && codes.indexOf(code) > -1; +} + +function checkProjStr(item) { + var ext = match(item, 'extension'); + + if (!ext) { + return; + } + + return match(ext, 'proj4'); +} + +function testProj(code) { + return code[0] === '+'; +} + +function parse(code) { + if (testObj(code)) { + //check to see if this is a WKT string + if (testDef(code)) { + return lib_defs[code]; + } + + if (testWKT(code)) { + var out = wkt_parser(code); // test of spetial case, due to this being a very common and often malformed + + if (checkMercator(out)) { + return lib_defs["EPSG:3857"]; + } + + var maybeProjStr = checkProjStr(out); + + if (maybeProjStr) { + return projString(maybeProjStr); + } + + return out; + } + + if (testProj(code)) { + return projString(code); + } + } else { + return code; + } +} + +/* harmony default export */ var parseCode = (parse); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/extend.js +/* harmony default export */ function extend(destination, source) { + destination = destination || {}; + var value, property; + + if (!source) { + return destination; + } + + for (property in source) { + value = source[property]; + + if (value !== undefined) { + destination[property] = value; + } + } + + return destination; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/msfnz.js +/* harmony default export */ function msfnz(eccent, sinphi, cosphi) { + var con = eccent * sinphi; + return cosphi / Math.sqrt(1 - con * con); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/sign.js +/* harmony default export */ function sign(x) { + return x < 0 ? -1 : 1; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_lon.js + + +/* harmony default export */ function adjust_lon(x) { + return Math.abs(x) <= SPI ? x : x - sign(x) * TWO_PI; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/tsfnz.js + +/* harmony default export */ function tsfnz(eccent, phi, sinphi) { + var con = eccent * sinphi; + var com = 0.5 * eccent; + con = Math.pow((1 - con) / (1 + con), com); + return Math.tan(0.5 * (HALF_PI - phi)) / con; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/phi2z.js + +/* harmony default export */ function phi2z(eccent, ts) { + var eccnth = 0.5 * eccent; + var con, dphi; + var phi = HALF_PI - 2 * Math.atan(ts); + + for (var i = 0; i <= 15; i++) { + con = eccent * Math.sin(phi); + dphi = HALF_PI - 2 * Math.atan(ts * Math.pow((1 - con) / (1 + con), eccnth)) - phi; + phi += dphi; + + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } //console.log("phi2z has NoConvergence"); + + + return -9999; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/merc.js + + + + + +function init() { + var con = this.b / this.a; + this.es = 1 - con * con; + + if (!('x0' in this)) { + this.x0 = 0; + } + + if (!('y0' in this)) { + this.y0 = 0; + } + + this.e = Math.sqrt(this.es); + + if (this.lat_ts) { + if (this.sphere) { + this.k0 = Math.cos(this.lat_ts); + } else { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } + } else { + if (!this.k0) { + if (this.k) { + this.k0 = this.k; + } else { + this.k0 = 1; + } + } + } +} +/* Mercator forward equations--mapping lat,long to x,y + --------------------------------------------------*/ + +function forward(p) { + var lon = p.x; + var lat = p.y; // convert to radians + + if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { + return null; + } + + var x, y; + + if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + return null; + } else { + if (this.sphere) { + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); + } else { + var sinphi = Math.sin(lat); + var ts = tsfnz(this.e, lat, sinphi); + x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); + y = this.y0 - this.a * this.k0 * Math.log(ts); + } + + p.x = x; + p.y = y; + return p; + } +} +/* Mercator inverse equations--mapping x,y to lat/long + --------------------------------------------------*/ + +function inverse(p) { + var x = p.x - this.x0; + var y = p.y - this.y0; + var lon, lat; + + if (this.sphere) { + lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); + } else { + var ts = Math.exp(-y / (this.a * this.k0)); + lat = phi2z(this.e, ts); + + if (lat === -9999) { + return null; + } + } + + lon = adjust_lon(this.long0 + x / (this.a * this.k0)); + p.x = lon; + p.y = lat; + return p; +} +var names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; +/* harmony default export */ var merc = ({ + init: init, + forward: forward, + inverse: inverse, + names: names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/longlat.js +function longlat_init() {//no-op for longlat +} + +function identity(pt) { + return pt; +} + + + +var longlat_names = ["longlat", "identity"]; +/* harmony default export */ var longlat = ({ + init: longlat_init, + forward: identity, + inverse: identity, + names: longlat_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections.js + + +var projs = [merc, longlat]; +var projections_names = {}; +var projStore = []; + +function add(proj, i) { + var len = projStore.length; + + if (!proj.names) { + console.log(i); + return true; + } + + projStore[len] = proj; + proj.names.forEach(function (n) { + projections_names[n.toLowerCase()] = len; + }); + return this; +} + + +function get(name) { + if (!name) { + return false; + } + + var n = name.toLowerCase(); + + if (typeof projections_names[n] !== 'undefined' && projStore[projections_names[n]]) { + return projStore[projections_names[n]]; + } +} +function start() { + projs.forEach(add); +} +/* harmony default export */ var projections = ({ + start: start, + add: add, + get: get +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/Ellipsoid.js +var Ellipsoid_exports = {}; + +Ellipsoid_exports.MERIT = { + a: 6378137.0, + rf: 298.257, + ellipseName: "MERIT 1983" +}; +Ellipsoid_exports.SGS85 = { + a: 6378136.0, + rf: 298.257, + ellipseName: "Soviet Geodetic System 85" +}; +Ellipsoid_exports.GRS80 = { + a: 6378137.0, + rf: 298.257222101, + ellipseName: "GRS 1980(IUGG, 1980)" +}; +Ellipsoid_exports.IAU76 = { + a: 6378140.0, + rf: 298.257, + ellipseName: "IAU 1976" +}; +Ellipsoid_exports.airy = { + a: 6377563.396, + b: 6356256.910, + ellipseName: "Airy 1830" +}; +Ellipsoid_exports.APL4 = { + a: 6378137, + rf: 298.25, + ellipseName: "Appl. Physics. 1965" +}; +Ellipsoid_exports.NWL9D = { + a: 6378145.0, + rf: 298.25, + ellipseName: "Naval Weapons Lab., 1965" +}; +Ellipsoid_exports.mod_airy = { + a: 6377340.189, + b: 6356034.446, + ellipseName: "Modified Airy" +}; +Ellipsoid_exports.andrae = { + a: 6377104.43, + rf: 300.0, + ellipseName: "Andrae 1876 (Den., Iclnd.)" +}; +Ellipsoid_exports.aust_SA = { + a: 6378160.0, + rf: 298.25, + ellipseName: "Australian Natl & S. Amer. 1969" +}; +Ellipsoid_exports.GRS67 = { + a: 6378160.0, + rf: 298.2471674270, + ellipseName: "GRS 67(IUGG 1967)" +}; +Ellipsoid_exports.bessel = { + a: 6377397.155, + rf: 299.1528128, + ellipseName: "Bessel 1841" +}; +Ellipsoid_exports.bess_nam = { + a: 6377483.865, + rf: 299.1528128, + ellipseName: "Bessel 1841 (Namibia)" +}; +Ellipsoid_exports.clrk66 = { + a: 6378206.4, + b: 6356583.8, + ellipseName: "Clarke 1866" +}; +Ellipsoid_exports.clrk80 = { + a: 6378249.145, + rf: 293.4663, + ellipseName: "Clarke 1880 mod." +}; +Ellipsoid_exports.clrk58 = { + a: 6378293.645208759, + rf: 294.2606763692654, + ellipseName: "Clarke 1858" +}; +Ellipsoid_exports.CPM = { + a: 6375738.7, + rf: 334.29, + ellipseName: "Comm. des Poids et Mesures 1799" +}; +Ellipsoid_exports.delmbr = { + a: 6376428.0, + rf: 311.5, + ellipseName: "Delambre 1810 (Belgium)" +}; +Ellipsoid_exports.engelis = { + a: 6378136.05, + rf: 298.2566, + ellipseName: "Engelis 1985" +}; +Ellipsoid_exports.evrst30 = { + a: 6377276.345, + rf: 300.8017, + ellipseName: "Everest 1830" +}; +Ellipsoid_exports.evrst48 = { + a: 6377304.063, + rf: 300.8017, + ellipseName: "Everest 1948" +}; +Ellipsoid_exports.evrst56 = { + a: 6377301.243, + rf: 300.8017, + ellipseName: "Everest 1956" +}; +Ellipsoid_exports.evrst69 = { + a: 6377295.664, + rf: 300.8017, + ellipseName: "Everest 1969" +}; +Ellipsoid_exports.evrstSS = { + a: 6377298.556, + rf: 300.8017, + ellipseName: "Everest (Sabah & Sarawak)" +}; +Ellipsoid_exports.fschr60 = { + a: 6378166.0, + rf: 298.3, + ellipseName: "Fischer (Mercury Datum) 1960" +}; +Ellipsoid_exports.fschr60m = { + a: 6378155.0, + rf: 298.3, + ellipseName: "Fischer 1960" +}; +Ellipsoid_exports.fschr68 = { + a: 6378150.0, + rf: 298.3, + ellipseName: "Fischer 1968" +}; +Ellipsoid_exports.helmert = { + a: 6378200.0, + rf: 298.3, + ellipseName: "Helmert 1906" +}; +Ellipsoid_exports.hough = { + a: 6378270.0, + rf: 297.0, + ellipseName: "Hough" +}; +Ellipsoid_exports.intl = { + a: 6378388.0, + rf: 297.0, + ellipseName: "International 1909 (Hayford)" +}; +Ellipsoid_exports.kaula = { + a: 6378163.0, + rf: 298.24, + ellipseName: "Kaula 1961" +}; +Ellipsoid_exports.lerch = { + a: 6378139.0, + rf: 298.257, + ellipseName: "Lerch 1979" +}; +Ellipsoid_exports.mprts = { + a: 6397300.0, + rf: 191.0, + ellipseName: "Maupertius 1738" +}; +Ellipsoid_exports.new_intl = { + a: 6378157.5, + b: 6356772.2, + ellipseName: "New International 1967" +}; +Ellipsoid_exports.plessis = { + a: 6376523.0, + rf: 6355863.0, + ellipseName: "Plessis 1817 (France)" +}; +Ellipsoid_exports.krass = { + a: 6378245.0, + rf: 298.3, + ellipseName: "Krassovsky, 1942" +}; +Ellipsoid_exports.SEasia = { + a: 6378155.0, + b: 6356773.3205, + ellipseName: "Southeast Asia" +}; +Ellipsoid_exports.walbeck = { + a: 6376896.0, + b: 6355834.8467, + ellipseName: "Walbeck" +}; +Ellipsoid_exports.WGS60 = { + a: 6378165.0, + rf: 298.3, + ellipseName: "WGS 60" +}; +Ellipsoid_exports.WGS66 = { + a: 6378145.0, + rf: 298.25, + ellipseName: "WGS 66" +}; +Ellipsoid_exports.WGS7 = { + a: 6378135.0, + rf: 298.26, + ellipseName: "WGS 72" +}; +var WGS84 = Ellipsoid_exports.WGS84 = { + a: 6378137.0, + rf: 298.257223563, + ellipseName: "WGS 84" +}; +Ellipsoid_exports.sphere = { + a: 6370997.0, + b: 6370997.0, + ellipseName: "Normal Sphere (r=6370997)" +}; +;// CONCATENATED MODULE: ./node_modules/proj4/lib/deriveConstants.js + + + +function eccentricity(a, b, rf, R_A) { + var a2 = a * a; // used in geocentric + + var b2 = b * b; // used in geocentric + + var es = (a2 - b2) / a2; // e ^ 2 + + var e = 0; + + if (R_A) { + a *= 1 - es * (SIXTH + es * (RA4 + es * RA6)); + a2 = a * a; + es = 0; + } else { + e = Math.sqrt(es); // eccentricity + } + + var ep2 = (a2 - b2) / b2; // used in geocentric + + return { + es: es, + e: e, + ep2: ep2 + }; +} +function sphere(a, b, rf, ellps, sphere) { + if (!a) { + // do we have an ellipsoid? + var ellipse = match(Ellipsoid_exports, ellps); + + if (!ellipse) { + ellipse = WGS84; + } + + a = ellipse.a; + b = ellipse.b; + rf = ellipse.rf; + } + + if (rf && !b) { + b = (1.0 - 1.0 / rf) * a; + } + + if (rf === 0 || Math.abs(a - b) < EPSLN) { + sphere = true; + b = a; + } + + return { + a: a, + b: b, + rf: rf, + sphere: sphere + }; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/constants/Datum.js +var Datum_exports = {}; + +Datum_exports.wgs84 = { + towgs84: "0,0,0", + ellipse: "WGS84", + datumName: "WGS84" +}; +Datum_exports.ch1903 = { + towgs84: "674.374,15.056,405.346", + ellipse: "bessel", + datumName: "swiss" +}; +Datum_exports.ggrs87 = { + towgs84: "-199.87,74.79,246.62", + ellipse: "GRS80", + datumName: "Greek_Geodetic_Reference_System_1987" +}; +Datum_exports.nad83 = { + towgs84: "0,0,0", + ellipse: "GRS80", + datumName: "North_American_Datum_1983" +}; +Datum_exports.nad27 = { + nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", + ellipse: "clrk66", + datumName: "North_American_Datum_1927" +}; +Datum_exports.potsdam = { + towgs84: "598.1,73.7,418.2,0.202,0.045,-2.455,6.7", + ellipse: "bessel", + datumName: "Potsdam Rauenberg 1950 DHDN" +}; +Datum_exports.carthage = { + towgs84: "-263.0,6.0,431.0", + ellipse: "clark80", + datumName: "Carthage 1934 Tunisia" +}; +Datum_exports.hermannskogel = { + towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232", + ellipse: "bessel", + datumName: "Hermannskogel" +}; +Datum_exports.osni52 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "airy", + datumName: "Irish National" +}; +Datum_exports.ire65 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "mod_airy", + datumName: "Ireland 1965" +}; +Datum_exports.rassadiran = { + towgs84: "-133.63,-157.5,-158.62", + ellipse: "intl", + datumName: "Rassadiran" +}; +Datum_exports.nzgd49 = { + towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", + ellipse: "intl", + datumName: "New Zealand Geodetic Datum 1949" +}; +Datum_exports.osgb36 = { + towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + ellipse: "airy", + datumName: "Airy 1830" +}; +Datum_exports.s_jtsk = { + towgs84: "589,76,480", + ellipse: 'bessel', + datumName: 'S-JTSK (Ferro)' +}; +Datum_exports.beduaram = { + towgs84: '-106,-87,188', + ellipse: 'clrk80', + datumName: 'Beduaram' +}; +Datum_exports.gunung_segara = { + towgs84: '-403,684,41', + ellipse: 'bessel', + datumName: 'Gunung Segara Jakarta' +}; +Datum_exports.rnb72 = { + towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", + ellipse: "intl", + datumName: "Reseau National Belge 1972" +}; +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datum.js + + +function datum(datumCode, datum_params, a, b, es, ep2, nadgrids) { + var out = {}; + + if (datumCode === undefined || datumCode === 'none') { + out.datum_type = PJD_NODATUM; + } else { + out.datum_type = PJD_WGS84; + } + + if (datum_params) { + out.datum_params = datum_params.map(parseFloat); + + if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) { + out.datum_type = PJD_3PARAM; + } + + if (out.datum_params.length > 3) { + if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) { + out.datum_type = PJD_7PARAM; + out.datum_params[3] *= SEC_TO_RAD; + out.datum_params[4] *= SEC_TO_RAD; + out.datum_params[5] *= SEC_TO_RAD; + out.datum_params[6] = out.datum_params[6] / 1000000.0 + 1.0; + } + } + } + + if (nadgrids) { + out.datum_type = PJD_GRIDSHIFT; + out.grids = nadgrids; + } + + out.a = a; //datum object also uses these values + + out.b = b; + out.es = es; + out.ep2 = ep2; + return out; +} + +/* harmony default export */ var lib_datum = (datum); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/nadgrid.js +/** + * Resources for details of NTv2 file formats: + * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf + * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm + */ +var loadedNadgrids = {}; +/** + * Load a binary NTv2 file (.gsb) to a key that can be used in a proj string like +nadgrids=. Pass the NTv2 file + * as an ArrayBuffer. + */ + +function nadgrid(key, data) { + var view = new DataView(data); + var isLittleEndian = detectLittleEndian(view); + var header = readHeader(view, isLittleEndian); + + if (header.nSubgrids > 1) { + console.log('Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored'); + } + + var subgrids = readSubgrids(view, header, isLittleEndian); + var nadgrid = { + header: header, + subgrids: subgrids + }; + loadedNadgrids[key] = nadgrid; + return nadgrid; +} +/** + * Given a proj4 value for nadgrids, return an array of loaded grids + */ + +function getNadgrids(nadgrids) { + // Format details: http://proj.maptools.org/gen_parms.html + if (nadgrids === undefined) { + return null; + } + + var grids = nadgrids.split(','); + return grids.map(parseNadgridString); +} + +function parseNadgridString(value) { + if (value.length === 0) { + return null; + } + + var optional = value[0] === '@'; + + if (optional) { + value = value.slice(1); + } + + if (value === 'null') { + return { + name: 'null', + mandatory: !optional, + grid: null, + isNull: true + }; + } + + return { + name: value, + mandatory: !optional, + grid: loadedNadgrids[value] || null, + isNull: false + }; +} + +function secondsToRadians(seconds) { + return seconds / 3600 * Math.PI / 180; +} + +function detectLittleEndian(view) { + var nFields = view.getInt32(8, false); + + if (nFields === 11) { + return false; + } + + nFields = view.getInt32(8, true); + + if (nFields !== 11) { + console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian'); + } + + return true; +} + +function readHeader(view, isLittleEndian) { + return { + nFields: view.getInt32(8, isLittleEndian), + nSubgridFields: view.getInt32(24, isLittleEndian), + nSubgrids: view.getInt32(40, isLittleEndian), + shiftType: decodeString(view, 56, 56 + 8).trim(), + fromSemiMajorAxis: view.getFloat64(120, isLittleEndian), + fromSemiMinorAxis: view.getFloat64(136, isLittleEndian), + toSemiMajorAxis: view.getFloat64(152, isLittleEndian), + toSemiMinorAxis: view.getFloat64(168, isLittleEndian) + }; +} + +function decodeString(view, start, end) { + return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end))); +} + +function readSubgrids(view, header, isLittleEndian) { + var gridOffset = 176; + var grids = []; + + for (var i = 0; i < header.nSubgrids; i++) { + var subHeader = readGridHeader(view, gridOffset, isLittleEndian); + var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian); + var lngColumnCount = Math.round(1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval); + var latColumnCount = Math.round(1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval); // Proj4 operates on radians whereas the coordinates are in seconds in the grid + + grids.push({ + ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)], + del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)], + lim: [lngColumnCount, latColumnCount], + count: subHeader.gridNodeCount, + cvs: mapNodes(nodes) + }); + } + + return grids; +} + +function mapNodes(nodes) { + return nodes.map(function (r) { + return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)]; + }); +} + +function readGridHeader(view, offset, isLittleEndian) { + return { + name: decodeString(view, offset + 8, offset + 16).trim(), + parent: decodeString(view, offset + 24, offset + 24 + 8).trim(), + lowerLatitude: view.getFloat64(offset + 72, isLittleEndian), + upperLatitude: view.getFloat64(offset + 88, isLittleEndian), + lowerLongitude: view.getFloat64(offset + 104, isLittleEndian), + upperLongitude: view.getFloat64(offset + 120, isLittleEndian), + latitudeInterval: view.getFloat64(offset + 136, isLittleEndian), + longitudeInterval: view.getFloat64(offset + 152, isLittleEndian), + gridNodeCount: view.getInt32(offset + 168, isLittleEndian) + }; +} + +function readGridNodes(view, offset, gridHeader, isLittleEndian) { + var nodesOffset = offset + 176; + var gridRecordLength = 16; + var gridShiftRecords = []; + + for (var i = 0; i < gridHeader.gridNodeCount; i++) { + var record = { + latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian), + longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian), + latitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian), + longitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian) + }; + gridShiftRecords.push(record); + } + + return gridShiftRecords; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/Proj.js +function Proj_typeof(obj) { "@babel/helpers - typeof"; return Proj_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, Proj_typeof(obj); } + + + + + + + + + + +function Projection(srsCode, callback) { + if (!(this instanceof Projection)) { + return new Projection(srsCode); + } + + callback = callback || function (error) { + if (error) { + throw error; + } + }; + + var json = parseCode(srsCode); + + if (Proj_typeof(json) !== 'object') { + callback(srsCode); + return; + } + + var ourProj = Projection.projections.get(json.projName); + + if (!ourProj) { + callback(srsCode); + return; + } + + if (json.datumCode && json.datumCode !== 'none') { + var datumDef = match(Datum_exports, json.datumCode); + + if (datumDef) { + json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null); + json.ellps = datumDef.ellipse; + json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; + } + } + + json.k0 = json.k0 || 1.0; + json.axis = json.axis || 'enu'; + json.ellps = json.ellps || 'wgs84'; + json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this + + var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere); + var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A); + var nadgrids = getNadgrids(json.nadgrids); + var datumObj = json.datum || lib_datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2, nadgrids); + extend(this, json); // transfer everything over from the projection because we don't know what we'll need + + extend(this, ourProj); // transfer all the methods from the projection + // copy the 4 things over we calulated in deriveConstants.sphere + + this.a = sphere_.a; + this.b = sphere_.b; + this.rf = sphere_.rf; + this.sphere = sphere_.sphere; // copy the 3 things we calculated in deriveConstants.eccentricity + + this.es = ecc.es; + this.e = ecc.e; + this.ep2 = ecc.ep2; // add in the datum object + + this.datum = datumObj; // init the projection + + this.init(); // legecy callback from back in the day when it went to spatialreference.org + + callback(null, this); +} + +Projection.projections = projections; +Projection.projections.start(); +/* harmony default export */ var Proj = (Projection); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datumUtils.js + + + +function compareDatums(source, dest) { + if (source.datum_type !== dest.datum_type) { + return false; // false, datums are not equal + } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) { + // the tolerance for es is to ensure that GRS80 and WGS84 + // are considered identical + return false; + } else if (source.datum_type === PJD_3PARAM) { + return source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]; + } else if (source.datum_type === PJD_7PARAM) { + return source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]; + } else { + return true; // datums are equal + } +} // cs_compare_datums() + +/* + * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates + * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), + * according to the current ellipsoid parameters. + * + * Latitude : Geodetic latitude in radians (input) + * Longitude : Geodetic longitude in radians (input) + * Height : Geodetic height, in meters (input) + * X : Calculated Geocentric X coordinate, in meters (output) + * Y : Calculated Geocentric Y coordinate, in meters (output) + * Z : Calculated Geocentric Z coordinate, in meters (output) + * + */ + +function geodeticToGeocentric(p, es, a) { + var Longitude = p.x; + var Latitude = p.y; + var Height = p.z ? p.z : 0; //Z value not always supplied + + var Rn; + /* Earth radius at location */ + + var Sin_Lat; + /* Math.sin(Latitude) */ + + var Sin2_Lat; + /* Square of Math.sin(Latitude) */ + + var Cos_Lat; + /* Math.cos(Latitude) */ + + /* + ** Don't blow up if Latitude is just a little out of the value + ** range as it may just be a rounding issue. Also removed longitude + ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. + */ + + if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { + Latitude = -HALF_PI; + } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { + Latitude = HALF_PI; + } else if (Latitude < -HALF_PI) { + /* Latitude out of range */ + //..reportError('geocent:lat out of range:' + Latitude); + return { + x: -Infinity, + y: -Infinity, + z: p.z + }; + } else if (Latitude > HALF_PI) { + /* Latitude out of range */ + return { + x: Infinity, + y: Infinity, + z: p.z + }; + } + + if (Longitude > Math.PI) { + Longitude -= 2 * Math.PI; + } + + Sin_Lat = Math.sin(Latitude); + Cos_Lat = Math.cos(Latitude); + Sin2_Lat = Sin_Lat * Sin_Lat; + Rn = a / Math.sqrt(1.0e0 - es * Sin2_Lat); + return { + x: (Rn + Height) * Cos_Lat * Math.cos(Longitude), + y: (Rn + Height) * Cos_Lat * Math.sin(Longitude), + z: (Rn * (1 - es) + Height) * Sin_Lat + }; +} // cs_geodetic_to_geocentric() + +function geocentricToGeodetic(p, es, a, b) { + /* local defintions and variables */ + + /* end-criterium of loop, accuracy of sin(Latitude) */ + var genau = 1e-12; + var genau2 = genau * genau; + var maxiter = 30; + var P; + /* distance between semi-minor axis and location */ + + var RR; + /* distance between center and location */ + + var CT; + /* sin of geocentric latitude */ + + var ST; + /* cos of geocentric latitude */ + + var RX; + var RK; + var RN; + /* Earth radius at location */ + + var CPHI0; + /* cos of start or old geodetic latitude in iterations */ + + var SPHI0; + /* sin of start or old geodetic latitude in iterations */ + + var CPHI; + /* cos of searched geodetic latitude */ + + var SPHI; + /* sin of searched geodetic latitude */ + + var SDPHI; + /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ + + var iter; + /* # of continous iteration, max. 30 is always enough (s.a.) */ + + var X = p.x; + var Y = p.y; + var Z = p.z ? p.z : 0.0; //Z value not always supplied + + var Longitude; + var Latitude; + var Height; + P = Math.sqrt(X * X + Y * Y); + RR = Math.sqrt(X * X + Y * Y + Z * Z); + /* special cases for latitude and longitude */ + + if (P / a < genau) { + /* special case, if P=0. (X=0., Y=0.) */ + Longitude = 0.0; + /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis + * of ellipsoid (=center of mass), Latitude becomes PI/2 */ + + if (RR / a < genau) { + Latitude = HALF_PI; + Height = -b; + return { + x: p.x, + y: p.y, + z: p.z + }; + } + } else { + /* ellipsoidal (geodetic) longitude + * interval: -PI < Longitude <= +PI */ + Longitude = Math.atan2(Y, X); + } + /* -------------------------------------------------------------- + * Following iterative algorithm was developped by + * "Institut for Erdmessung", University of Hannover, July 1988. + * Internet: www.ife.uni-hannover.de + * Iterative computation of CPHI,SPHI and Height. + * Iteration of CPHI and SPHI to 10**-12 radian resp. + * 2*10**-7 arcsec. + * -------------------------------------------------------------- + */ + + + CT = Z / RR; + ST = P / RR; + RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST); + CPHI0 = ST * (1.0 - es) * RX; + SPHI0 = CT * RX; + iter = 0; + /* loop to find sin(Latitude) resp. Latitude + * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ + + do { + iter++; + RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0); + /* ellipsoidal (geodetic) height */ + + Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0); + RK = es * RN / (RN + Height); + RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST); + CPHI = ST * (1.0 - RK) * RX; + SPHI = CT * RX; + SDPHI = SPHI * CPHI0 - CPHI * SPHI0; + CPHI0 = CPHI; + SPHI0 = SPHI; + } while (SDPHI * SDPHI > genau2 && iter < maxiter); + /* ellipsoidal (geodetic) latitude */ + + + Latitude = Math.atan(SPHI / Math.abs(CPHI)); + return { + x: Longitude, + y: Latitude, + z: Height + }; +} // cs_geocentric_to_geodetic() + +/****************************************************************/ +// pj_geocentic_to_wgs84( p ) +// p = point to transform in geocentric coordinates (x,y,z) + +/** point object, nothing fancy, just allows values to be + passed back and forth by reference rather than by value. + Other point classes may be used as long as they have + x and y properties, which will get modified in the transform method. +*/ + +function geocentricToWgs84(p, datum_type, datum_params) { + if (datum_type === PJD_3PARAM) { + // if( x[io] === HUGE_VAL ) + // continue; + return { + x: p.x + datum_params[0], + y: p.y + datum_params[1], + z: p.z + datum_params[2] + }; + } else if (datum_type === PJD_7PARAM) { + var Dx_BF = datum_params[0]; + var Dy_BF = datum_params[1]; + var Dz_BF = datum_params[2]; + var Rx_BF = datum_params[3]; + var Ry_BF = datum_params[4]; + var Rz_BF = datum_params[5]; + var M_BF = datum_params[6]; // if( x[io] === HUGE_VAL ) + // continue; + + return { + x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF, + y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF, + z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF + }; + } +} // cs_geocentric_to_wgs84 + +/****************************************************************/ +// pj_geocentic_from_wgs84() +// coordinate system definition, +// point to transform in geocentric coordinates (x,y,z) + +function geocentricFromWgs84(p, datum_type, datum_params) { + if (datum_type === PJD_3PARAM) { + //if( x[io] === HUGE_VAL ) + // continue; + return { + x: p.x - datum_params[0], + y: p.y - datum_params[1], + z: p.z - datum_params[2] + }; + } else if (datum_type === PJD_7PARAM) { + var Dx_BF = datum_params[0]; + var Dy_BF = datum_params[1]; + var Dz_BF = datum_params[2]; + var Rx_BF = datum_params[3]; + var Ry_BF = datum_params[4]; + var Rz_BF = datum_params[5]; + var M_BF = datum_params[6]; + var x_tmp = (p.x - Dx_BF) / M_BF; + var y_tmp = (p.y - Dy_BF) / M_BF; + var z_tmp = (p.z - Dz_BF) / M_BF; //if( x[io] === HUGE_VAL ) + // continue; + + return { + x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp, + y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp, + z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp + }; + } //cs_geocentric_from_wgs84() + +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/datum_transform.js + + + + +function checkParams(type) { + return type === PJD_3PARAM || type === PJD_7PARAM; +} + +/* harmony default export */ function datum_transform(source, dest, point) { + // Short cut if the datums are identical. + if (compareDatums(source, dest)) { + return point; // in this case, zero is sucess, + // whereas cs_compare_datums returns 1 to indicate TRUE + // confusing, should fix this + } // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest + + + if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { + return point; + } // If this datum requires grid shifts, then apply it to geodetic coordinates. + + + var source_a = source.a; + var source_es = source.es; + + if (source.datum_type === PJD_GRIDSHIFT) { + var gridShiftCode = applyGridShift(source, false, point); + + if (gridShiftCode !== 0) { + return undefined; + } + + source_a = SRS_WGS84_SEMIMAJOR; + source_es = SRS_WGS84_ESQUARED; + } + + var dest_a = dest.a; + var dest_b = dest.b; + var dest_es = dest.es; + + if (dest.datum_type === PJD_GRIDSHIFT) { + dest_a = SRS_WGS84_SEMIMAJOR; + dest_b = SRS_WGS84_SEMIMINOR; + dest_es = SRS_WGS84_ESQUARED; + } // Do we need to go through geocentric coordinates? + + + if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) { + return point; + } // Convert to geocentric coordinates. + + + point = geodeticToGeocentric(point, source_es, source_a); // Convert between datums + + if (checkParams(source.datum_type)) { + point = geocentricToWgs84(point, source.datum_type, source.datum_params); + } + + if (checkParams(dest.datum_type)) { + point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params); + } + + point = geocentricToGeodetic(point, dest_es, dest_a, dest_b); + + if (dest.datum_type === PJD_GRIDSHIFT) { + var destGridShiftResult = applyGridShift(dest, true, point); + + if (destGridShiftResult !== 0) { + return undefined; + } + } + + return point; +} +function applyGridShift(source, inverse, point) { + if (source.grids === null || source.grids.length === 0) { + console.log('Grid shift grids not found'); + return -1; + } + + var input = { + x: -point.x, + y: point.y + }; + var output = { + x: Number.NaN, + y: Number.NaN + }; + var onlyMandatoryGrids = false; + var attemptedGrids = []; + + for (var i = 0; i < source.grids.length; i++) { + var grid = source.grids[i]; + attemptedGrids.push(grid.name); + + if (grid.isNull) { + output = input; + break; + } + + onlyMandatoryGrids = grid.mandatory; + + if (grid.grid === null) { + if (grid.mandatory) { + console.log("Unable to find mandatory grid '" + grid.name + "'"); + return -1; + } + + continue; + } + + var subgrid = grid.grid.subgrids[0]; // skip tables that don't match our point at all + + var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0; + var minX = subgrid.ll[0] - epsilon; + var minY = subgrid.ll[1] - epsilon; + var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon; + var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon; + + if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x) { + continue; + } + + output = applySubgridShift(input, inverse, subgrid); + + if (!isNaN(output.x)) { + break; + } + } + + if (isNaN(output.x)) { + console.log("Failed to find a grid shift table for location '" + -input.x * R2D + " " + input.y * R2D + " tried: '" + attemptedGrids + "'"); + return -1; + } + + point.x = -output.x; + point.y = output.y; + return 0; +} + +function applySubgridShift(pin, inverse, ct) { + var val = { + x: Number.NaN, + y: Number.NaN + }; + + if (isNaN(pin.x)) { + return val; + } + + var tb = { + x: pin.x, + y: pin.y + }; + tb.x -= ct.ll[0]; + tb.y -= ct.ll[1]; + tb.x = adjust_lon(tb.x - Math.PI) + Math.PI; + var t = nadInterpolate(tb, ct); + + if (inverse) { + if (isNaN(t.x)) { + return val; + } + + t.x = tb.x - t.x; + t.y = tb.y - t.y; + var i = 9, + tol = 1e-12; + var dif, del; + + do { + del = nadInterpolate(t, ct); + + if (isNaN(del.x)) { + console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation."); + break; + } + + dif = { + x: tb.x - (del.x + t.x), + y: tb.y - (del.y + t.y) + }; + t.x += dif.x; + t.y += dif.y; + } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol); + + if (i < 0) { + console.log("Inverse grid shift iterator failed to converge."); + return val; + } + + val.x = adjust_lon(t.x + ct.ll[0]); + val.y = t.y + ct.ll[1]; + } else { + if (!isNaN(t.x)) { + val.x = pin.x + t.x; + val.y = pin.y + t.y; + } + } + + return val; +} + +function nadInterpolate(pin, ct) { + var t = { + x: pin.x / ct.del[0], + y: pin.y / ct.del[1] + }; + var indx = { + x: Math.floor(t.x), + y: Math.floor(t.y) + }; + var frct = { + x: t.x - 1.0 * indx.x, + y: t.y - 1.0 * indx.y + }; + var val = { + x: Number.NaN, + y: Number.NaN + }; + var inx; + + if (indx.x < 0 || indx.x >= ct.lim[0]) { + return val; + } + + if (indx.y < 0 || indx.y >= ct.lim[1]) { + return val; + } + + inx = indx.y * ct.lim[0] + indx.x; + var f00 = { + x: ct.cvs[inx][0], + y: ct.cvs[inx][1] + }; + inx++; + var f10 = { + x: ct.cvs[inx][0], + y: ct.cvs[inx][1] + }; + inx += ct.lim[0]; + var f11 = { + x: ct.cvs[inx][0], + y: ct.cvs[inx][1] + }; + inx--; + var f01 = { + x: ct.cvs[inx][0], + y: ct.cvs[inx][1] + }; + var m11 = frct.x * frct.y, + m10 = frct.x * (1.0 - frct.y), + m00 = (1.0 - frct.x) * (1.0 - frct.y), + m01 = (1.0 - frct.x) * frct.y; + val.x = m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x; + val.y = m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y; + return val; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/adjust_axis.js +/* harmony default export */ function adjust_axis(crs, denorm, point) { + var xin = point.x, + yin = point.y, + zin = point.z || 0.0; + var v, t, i; + var out = {}; + + for (i = 0; i < 3; i++) { + if (denorm && i === 2 && point.z === undefined) { + continue; + } + + if (i === 0) { + v = xin; + + if ("ew".indexOf(crs.axis[i]) !== -1) { + t = 'x'; + } else { + t = 'y'; + } + } else if (i === 1) { + v = yin; + + if ("ns".indexOf(crs.axis[i]) !== -1) { + t = 'y'; + } else { + t = 'x'; + } + } else { + v = zin; + t = 'z'; + } + + switch (crs.axis[i]) { + case 'e': + out[t] = v; + break; + + case 'w': + out[t] = -v; + break; + + case 'n': + out[t] = v; + break; + + case 's': + out[t] = -v; + break; + + case 'u': + if (point[t] !== undefined) { + out.z = v; + } + + break; + + case 'd': + if (point[t] !== undefined) { + out.z = -v; + } + + break; + + default: + //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); + return null; + } + } + + return out; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/toPoint.js +/* harmony default export */ function toPoint(array) { + var out = { + x: array[0], + y: array[1] + }; + + if (array.length > 2) { + out.z = array[2]; + } + + if (array.length > 3) { + out.m = array[3]; + } + + return out; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/checkSanity.js +/* harmony default export */ function checkSanity(point) { + checkCoord(point.x); + checkCoord(point.y); +} + +function checkCoord(num) { + if (typeof Number.isFinite === 'function') { + if (Number.isFinite(num)) { + return; + } + + throw new TypeError('coordinates must be finite numbers'); + } + + if (typeof num !== 'number' || num !== num || !isFinite(num)) { + throw new TypeError('coordinates must be finite numbers'); + } +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/transform.js + + + + + + + +function checkNotWGS(source, dest) { + return (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84' || (dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84'; +} + +function transform(source, dest, point, enforceAxis) { + var wgs84; + + if (Array.isArray(point)) { + point = toPoint(point); + } + + checkSanity(point); // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 + + if (source.datum && dest.datum && checkNotWGS(source, dest)) { + wgs84 = new Proj('WGS84'); + point = transform(source, wgs84, point, enforceAxis); + source = wgs84; + } // DGR, 2010/11/12 + + + if (enforceAxis && source.axis !== 'enu') { + point = adjust_axis(source, false, point); + } // Transform source points to long/lat, if they aren't already. + + + if (source.projName === 'longlat') { + point = { + x: point.x * D2R, + y: point.y * D2R, + z: point.z || 0 + }; + } else { + if (source.to_meter) { + point = { + x: point.x * source.to_meter, + y: point.y * source.to_meter, + z: point.z || 0 + }; + } + + point = source.inverse(point); // Convert Cartesian to longlat + + if (!point) { + return; + } + } // Adjust for the prime meridian if necessary + + + if (source.from_greenwich) { + point.x += source.from_greenwich; + } // Convert datums if needed, and if possible. + + + point = datum_transform(source.datum, dest.datum, point); + + if (!point) { + return; + } // Adjust for the prime meridian if necessary + + + if (dest.from_greenwich) { + point = { + x: point.x - dest.from_greenwich, + y: point.y, + z: point.z || 0 + }; + } + + if (dest.projName === 'longlat') { + // convert radians to decimal degrees + point = { + x: point.x * R2D, + y: point.y * R2D, + z: point.z || 0 + }; + } else { + // else project + point = dest.forward(point); + + if (dest.to_meter) { + point = { + x: point.x / dest.to_meter, + y: point.y / dest.to_meter, + z: point.z || 0 + }; + } + } // DGR, 2010/11/12 + + + if (enforceAxis && dest.axis !== 'enu') { + return adjust_axis(dest, true, point); + } + + return point; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/core.js + + +var wgs84 = Proj('WGS84'); + +function transformer(from, to, coords, enforceAxis) { + var transformedArray, out, keys; + + if (Array.isArray(coords)) { + transformedArray = transform(from, to, coords, enforceAxis) || { + x: NaN, + y: NaN + }; + + if (coords.length > 2) { + if (typeof from.name !== 'undefined' && from.name === 'geocent' || typeof to.name !== 'undefined' && to.name === 'geocent') { + if (typeof transformedArray.z === 'number') { + return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3)); + } else { + return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3)); + } + } else { + return [transformedArray.x, transformedArray.y].concat(coords.splice(2)); + } + } else { + return [transformedArray.x, transformedArray.y]; + } + } else { + out = transform(from, to, coords, enforceAxis); + keys = Object.keys(coords); + + if (keys.length === 2) { + return out; + } + + keys.forEach(function (key) { + if (typeof from.name !== 'undefined' && from.name === 'geocent' || typeof to.name !== 'undefined' && to.name === 'geocent') { + if (key === 'x' || key === 'y' || key === 'z') { + return; + } + } else { + if (key === 'x' || key === 'y') { + return; + } + } + + out[key] = coords[key]; + }); + return out; + } +} + +function checkProj(item) { + if (item instanceof Proj) { + return item; + } + + if (item.oProj) { + return item.oProj; + } + + return Proj(item); +} + +function proj4(fromProj, toProj, coord) { + fromProj = checkProj(fromProj); + var single = false; + var obj; + + if (typeof toProj === 'undefined') { + toProj = fromProj; + fromProj = wgs84; + single = true; + } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { + coord = toProj; + toProj = fromProj; + fromProj = wgs84; + single = true; + } + + toProj = checkProj(toProj); + + if (coord) { + return transformer(fromProj, toProj, coord); + } else { + obj = { + forward: function forward(coords, enforceAxis) { + return transformer(fromProj, toProj, coords, enforceAxis); + }, + inverse: function inverse(coords, enforceAxis) { + return transformer(toProj, fromProj, coords, enforceAxis); + } + }; + + if (single) { + obj.oProj = toProj; + } + + return obj; + } +} + +/* harmony default export */ var core = (proj4); +;// CONCATENATED MODULE: ./node_modules/mgrs/mgrs.js +/** + * UTM zones are grouped, and assigned to one of a group of 6 + * sets. + * + * {int} @private + */ +var NUM_100K_SETS = 6; +/** + * The column letters (for easting) of the lower left value, per + * set. + * + * {string} @private + */ + +var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; +/** + * The row letters (for northing) of the lower left value, per + * set. + * + * {string} @private + */ + +var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; +var A = 65; // A + +var I = 73; // I + +var O = 79; // O + +var V = 86; // V + +var Z = 90; // Z + +/* harmony default export */ var mgrs = ({ + forward: mgrs_forward, + inverse: mgrs_inverse, + toPoint: mgrs_toPoint +}); +/** + * Conversion of lat/lon to MGRS. + * + * @param {object} ll Object literal with lat and lon properties on a + * WGS84 ellipsoid. + * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for + * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5. + * @return {string} the MGRS string for the given location and accuracy. + */ + +function mgrs_forward(ll, accuracy) { + accuracy = accuracy || 5; // default accuracy 1m + + return encode(LLtoUTM({ + lat: ll[1], + lon: ll[0] + }), accuracy); +} +; +/** + * Conversion of MGRS to lat/lon. + * + * @param {string} mgrs MGRS string. + * @return {array} An array with left (longitude), bottom (latitude), right + * (longitude) and top (latitude) values in WGS84, representing the + * bounding box for the provided MGRS reference. + */ + +function mgrs_inverse(mgrs) { + var bbox = UTMtoLL(decode(mgrs.toUpperCase())); + + if (bbox.lat && bbox.lon) { + return [bbox.lon, bbox.lat, bbox.lon, bbox.lat]; + } + + return [bbox.left, bbox.bottom, bbox.right, bbox.top]; +} +; +function mgrs_toPoint(mgrs) { + var bbox = UTMtoLL(decode(mgrs.toUpperCase())); + + if (bbox.lat && bbox.lon) { + return [bbox.lon, bbox.lat]; + } + + return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2]; +} +; +/** + * Conversion from degrees to radians. + * + * @private + * @param {number} deg the angle in degrees. + * @return {number} the angle in radians. + */ + +function degToRad(deg) { + return deg * (Math.PI / 180.0); +} +/** + * Conversion from radians to degrees. + * + * @private + * @param {number} rad the angle in radians. + * @return {number} the angle in degrees. + */ + + +function radToDeg(rad) { + return 180.0 * (rad / Math.PI); +} +/** + * Converts a set of Longitude and Latitude co-ordinates to UTM + * using the WGS84 ellipsoid. + * + * @private + * @param {object} ll Object literal with lat and lon properties + * representing the WGS84 coordinate to be converted. + * @return {object} Object literal containing the UTM value with easting, + * northing, zoneNumber and zoneLetter properties, and an optional + * accuracy property in digits. Returns null if the conversion failed. + */ + + +function LLtoUTM(ll) { + var Lat = ll.lat; + var Long = ll.lon; + var a = 6378137.0; //ellip.radius; + + var eccSquared = 0.00669438; //ellip.eccsq; + + var k0 = 0.9996; + var LongOrigin; + var eccPrimeSquared; + var N, T, C, A, M; + var LatRad = degToRad(Lat); + var LongRad = degToRad(Long); + var LongOriginRad; + var ZoneNumber; // (int) + + ZoneNumber = Math.floor((Long + 180) / 6) + 1; //Make sure the longitude 180.00 is in Zone 60 + + if (Long === 180) { + ZoneNumber = 60; + } // Special zone for Norway + + + if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { + ZoneNumber = 32; + } // Special zones for Svalbard + + + if (Lat >= 72.0 && Lat < 84.0) { + if (Long >= 0.0 && Long < 9.0) { + ZoneNumber = 31; + } else if (Long >= 9.0 && Long < 21.0) { + ZoneNumber = 33; + } else if (Long >= 21.0 && Long < 33.0) { + ZoneNumber = 35; + } else if (Long >= 33.0 && Long < 42.0) { + ZoneNumber = 37; + } + } + + LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin + // in middle of + // zone + + LongOriginRad = degToRad(LongOrigin); + eccPrimeSquared = eccSquared / (1 - eccSquared); + N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); + T = Math.tan(LatRad) * Math.tan(LatRad); + C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); + A = Math.cos(LatRad) * (LongRad - LongOriginRad); + M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - 35 * eccSquared * eccSquared * eccSquared / 3072 * Math.sin(6 * LatRad)); + var UTMEasting = k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0; + var UTMNorthing = k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)); + + if (Lat < 0.0) { + UTMNorthing += 10000000.0; //10000000 meter offset for + // southern hemisphere + } + + return { + northing: Math.round(UTMNorthing), + easting: Math.round(UTMEasting), + zoneNumber: ZoneNumber, + zoneLetter: getLetterDesignator(Lat) + }; +} +/** + * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience + * class where the Zone can be specified as a single string eg."60N" which + * is then broken down into the ZoneNumber and ZoneLetter. + * + * @private + * @param {object} utm An object literal with northing, easting, zoneNumber + * and zoneLetter properties. If an optional accuracy property is + * provided (in meters), a bounding box will be returned instead of + * latitude and longitude. + * @return {object} An object literal containing either lat and lon values + * (if no accuracy was provided), or top, right, bottom and left values + * for the bounding box calculated according to the provided accuracy. + * Returns null if the conversion failed. + */ + + +function UTMtoLL(utm) { + var UTMNorthing = utm.northing; + var UTMEasting = utm.easting; + var zoneLetter = utm.zoneLetter; + var zoneNumber = utm.zoneNumber; // check the ZoneNummber is valid + + if (zoneNumber < 0 || zoneNumber > 60) { + return null; + } + + var k0 = 0.9996; + var a = 6378137.0; //ellip.radius; + + var eccSquared = 0.00669438; //ellip.eccsq; + + var eccPrimeSquared; + var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); + var N1, T1, C1, R1, D, M; + var LongOrigin; + var mu, phi1Rad; // remove 500,000 meter offset for longitude + + var x = UTMEasting - 500000.0; + var y = UTMNorthing; // We must know somehow if we are in the Northern or Southern + // hemisphere, this is the only time we use the letter So even + // if the Zone letter isn't exactly correct it should indicate + // the hemisphere correctly + + if (zoneLetter < 'N') { + y -= 10000000.0; // remove 10,000,000 meter offset used + // for southern hemisphere + } // There are 60 zones with zone 1 being at West -180 to -174 + + + LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin + // in middle of + // zone + + eccPrimeSquared = eccSquared / (1 - eccSquared); + M = y / k0; + mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); + phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + 151 * e1 * e1 * e1 / 96 * Math.sin(6 * mu); // double phi1 = ProjMath.radToDeg(phi1Rad); + + N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); + T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); + C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); + R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); + D = x / (N1 * k0); + var lat = phi1Rad - N1 * Math.tan(phi1Rad) / R1 * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); + lat = radToDeg(lat); + var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); + lon = LongOrigin + radToDeg(lon); + var result; + + if (utm.accuracy) { + var topRight = UTMtoLL({ + northing: utm.northing + utm.accuracy, + easting: utm.easting + utm.accuracy, + zoneLetter: utm.zoneLetter, + zoneNumber: utm.zoneNumber + }); + result = { + top: topRight.lat, + right: topRight.lon, + bottom: lat, + left: lon + }; + } else { + result = { + lat: lat, + lon: lon + }; + } + + return result; +} +/** + * Calculates the MGRS letter designator for the given latitude. + * + * @private + * @param {number} lat The latitude in WGS84 to get the letter designator + * for. + * @return {char} The letter designator. + */ + + +function getLetterDesignator(lat) { + //This is here as an error flag to show that the Latitude is + //outside MGRS limits + var LetterDesignator = 'Z'; + + if (84 >= lat && lat >= 72) { + LetterDesignator = 'X'; + } else if (72 > lat && lat >= 64) { + LetterDesignator = 'W'; + } else if (64 > lat && lat >= 56) { + LetterDesignator = 'V'; + } else if (56 > lat && lat >= 48) { + LetterDesignator = 'U'; + } else if (48 > lat && lat >= 40) { + LetterDesignator = 'T'; + } else if (40 > lat && lat >= 32) { + LetterDesignator = 'S'; + } else if (32 > lat && lat >= 24) { + LetterDesignator = 'R'; + } else if (24 > lat && lat >= 16) { + LetterDesignator = 'Q'; + } else if (16 > lat && lat >= 8) { + LetterDesignator = 'P'; + } else if (8 > lat && lat >= 0) { + LetterDesignator = 'N'; + } else if (0 > lat && lat >= -8) { + LetterDesignator = 'M'; + } else if (-8 > lat && lat >= -16) { + LetterDesignator = 'L'; + } else if (-16 > lat && lat >= -24) { + LetterDesignator = 'K'; + } else if (-24 > lat && lat >= -32) { + LetterDesignator = 'J'; + } else if (-32 > lat && lat >= -40) { + LetterDesignator = 'H'; + } else if (-40 > lat && lat >= -48) { + LetterDesignator = 'G'; + } else if (-48 > lat && lat >= -56) { + LetterDesignator = 'F'; + } else if (-56 > lat && lat >= -64) { + LetterDesignator = 'E'; + } else if (-64 > lat && lat >= -72) { + LetterDesignator = 'D'; + } else if (-72 > lat && lat >= -80) { + LetterDesignator = 'C'; + } + + return LetterDesignator; +} +/** + * Encodes a UTM location as MGRS string. + * + * @private + * @param {object} utm An object literal with easting, northing, + * zoneLetter, zoneNumber + * @param {number} accuracy Accuracy in digits (1-5). + * @return {string} MGRS string for the given UTM location. + */ + + +function encode(utm, accuracy) { + // prepend with leading zeroes + var seasting = "00000" + utm.easting, + snorthing = "00000" + utm.northing; + return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); +} +/** + * Get the two letter 100k designator for a given UTM easting, + * northing and zone number value. + * + * @private + * @param {number} easting + * @param {number} northing + * @param {number} zoneNumber + * @return the two letter 100k designator for the given UTM location. + */ + + +function get100kID(easting, northing, zoneNumber) { + var setParm = get100kSetForZone(zoneNumber); + var setColumn = Math.floor(easting / 100000); + var setRow = Math.floor(northing / 100000) % 20; + return getLetter100kID(setColumn, setRow, setParm); +} +/** + * Given a UTM zone number, figure out the MGRS 100K set it is in. + * + * @private + * @param {number} i An UTM zone number. + * @return {number} the 100k set the UTM zone is in. + */ + + +function get100kSetForZone(i) { + var setParm = i % NUM_100K_SETS; + + if (setParm === 0) { + setParm = NUM_100K_SETS; + } + + return setParm; +} +/** + * Get the two-letter MGRS 100k designator given information + * translated from the UTM northing, easting and zone number. + * + * @private + * @param {number} column the column index as it relates to the MGRS + * 100k set spreadsheet, created from the UTM easting. + * Values are 1-8. + * @param {number} row the row index as it relates to the MGRS 100k set + * spreadsheet, created from the UTM northing value. Values + * are from 0-19. + * @param {number} parm the set block, as it relates to the MGRS 100k set + * spreadsheet, created from the UTM zone. Values are from + * 1-60. + * @return two letter MGRS 100k code. + */ + + +function getLetter100kID(column, row, parm) { + // colOrigin and rowOrigin are the letters at the origin of the set + var index = parm - 1; + var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); + var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); // colInt and rowInt are the letters to build to return + + var colInt = colOrigin + column - 1; + var rowInt = rowOrigin + row; + var rollover = false; + + if (colInt > Z) { + colInt = colInt - Z + A - 1; + rollover = true; + } + + if (colInt === I || colOrigin < I && colInt > I || (colInt > I || colOrigin < I) && rollover) { + colInt++; + } + + if (colInt === O || colOrigin < O && colInt > O || (colInt > O || colOrigin < O) && rollover) { + colInt++; + + if (colInt === I) { + colInt++; + } + } + + if (colInt > Z) { + colInt = colInt - Z + A - 1; + } + + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + rollover = true; + } else { + rollover = false; + } + + if (rowInt === I || rowOrigin < I && rowInt > I || (rowInt > I || rowOrigin < I) && rollover) { + rowInt++; + } + + if (rowInt === O || rowOrigin < O && rowInt > O || (rowInt > O || rowOrigin < O) && rollover) { + rowInt++; + + if (rowInt === I) { + rowInt++; + } + } + + if (rowInt > V) { + rowInt = rowInt - V + A - 1; + } + + var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); + return twoLetter; +} +/** + * Decode the UTM parameters from a MGRS string. + * + * @private + * @param {string} mgrsString an UPPERCASE coordinate string is expected. + * @return {object} An object literal with easting, northing, zoneLetter, + * zoneNumber and accuracy (in meters) properties. + */ + + +function decode(mgrsString) { + if (mgrsString && mgrsString.length === 0) { + throw "MGRSPoint coverting from nothing"; + } + + var length = mgrsString.length; + var hunK = null; + var sb = ""; + var testChar; + var i = 0; // get Zone number + + while (!/[A-Z]/.test(testChar = mgrsString.charAt(i))) { + if (i >= 2) { + throw "MGRSPoint bad conversion from: " + mgrsString; + } + + sb += testChar; + i++; + } + + var zoneNumber = parseInt(sb, 10); + + if (i === 0 || i + 3 > length) { + // A good MGRS string has to be 4-5 digits long, + // ##AAA/#AAA at least. + throw "MGRSPoint bad conversion from: " + mgrsString; + } + + var zoneLetter = mgrsString.charAt(i++); // Should we check the zone letter here? Why not. + + if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { + throw "MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString; + } + + hunK = mgrsString.substring(i, i += 2); + var set = get100kSetForZone(zoneNumber); + var east100k = getEastingFromChar(hunK.charAt(0), set); + var north100k = getNorthingFromChar(hunK.charAt(1), set); // We have a bug where the northing may be 2000000 too low. + // How + // do we know when to roll over? + + while (north100k < getMinNorthing(zoneLetter)) { + north100k += 2000000; + } // calculate the char index for easting/northing separator + + + var remainder = length - i; + + if (remainder % 2 !== 0) { + throw "MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString; + } + + var sep = remainder / 2; + var sepEasting = 0.0; + var sepNorthing = 0.0; + var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; + + if (sep > 0) { + accuracyBonus = 100000.0 / Math.pow(10, sep); + sepEastingString = mgrsString.substring(i, i + sep); + sepEasting = parseFloat(sepEastingString) * accuracyBonus; + sepNorthingString = mgrsString.substring(i + sep); + sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; + } + + easting = sepEasting + east100k; + northing = sepNorthing + north100k; + return { + easting: easting, + northing: northing, + zoneLetter: zoneLetter, + zoneNumber: zoneNumber, + accuracy: accuracyBonus + }; +} +/** + * Given the first letter from a two-letter MGRS 100k zone, and given the + * MGRS table set for the zone number, figure out the easting value that + * should be added to the other, secondary easting value. + * + * @private + * @param {char} e The first letter from a two-letter MGRS 100´k zone. + * @param {number} set The MGRS table set for the zone number. + * @return {number} The easting value for the given letter and set. + */ + + +function getEastingFromChar(e, set) { + // colOrigin is the letter at the origin of the set for the + // column + var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); + var eastingValue = 100000.0; + var rewindMarker = false; + + while (curCol !== e.charCodeAt(0)) { + curCol++; + + if (curCol === I) { + curCol++; + } + + if (curCol === O) { + curCol++; + } + + if (curCol > Z) { + if (rewindMarker) { + throw "Bad character: " + e; + } + + curCol = A; + rewindMarker = true; + } + + eastingValue += 100000.0; + } + + return eastingValue; +} +/** + * Given the second letter from a two-letter MGRS 100k zone, and given the + * MGRS table set for the zone number, figure out the northing value that + * should be added to the other, secondary northing value. You have to + * remember that Northings are determined from the equator, and the vertical + * cycle of letters mean a 2000000 additional northing meters. This happens + * approx. every 18 degrees of latitude. This method does *NOT* count any + * additional northings. You have to figure out how many 2000000 meters need + * to be added for the zone letter of the MGRS coordinate. + * + * @private + * @param {char} n Second letter of the MGRS 100k zone + * @param {number} set The MGRS table set number, which is dependent on the + * UTM zone number. + * @return {number} The northing value for the given letter and set. + */ + + +function getNorthingFromChar(n, set) { + if (n > 'V') { + throw "MGRSPoint given invalid Northing " + n; + } // rowOrigin is the letter at the origin of the set for the + // column + + + var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); + var northingValue = 0.0; + var rewindMarker = false; + + while (curRow !== n.charCodeAt(0)) { + curRow++; + + if (curRow === I) { + curRow++; + } + + if (curRow === O) { + curRow++; + } // fixing a bug making whole application hang in this loop + // when 'n' is a wrong character + + + if (curRow > V) { + if (rewindMarker) { + // making sure that this loop ends + throw "Bad character: " + n; + } + + curRow = A; + rewindMarker = true; + } + + northingValue += 100000.0; + } + + return northingValue; +} +/** + * The function getMinNorthing returns the minimum northing value of a MGRS + * zone. + * + * Ported from Geotrans' c Lattitude_Band_Value structure table. + * + * @private + * @param {char} zoneLetter The MGRS zone to get the min northing for. + * @return {number} + */ + + +function getMinNorthing(zoneLetter) { + var northing; + + switch (zoneLetter) { + case 'C': + northing = 1100000.0; + break; + + case 'D': + northing = 2000000.0; + break; + + case 'E': + northing = 2800000.0; + break; + + case 'F': + northing = 3700000.0; + break; + + case 'G': + northing = 4600000.0; + break; + + case 'H': + northing = 5500000.0; + break; + + case 'J': + northing = 6400000.0; + break; + + case 'K': + northing = 7300000.0; + break; + + case 'L': + northing = 8200000.0; + break; + + case 'M': + northing = 9100000.0; + break; + + case 'N': + northing = 0.0; + break; + + case 'P': + northing = 800000.0; + break; + + case 'Q': + northing = 1700000.0; + break; + + case 'R': + northing = 2600000.0; + break; + + case 'S': + northing = 3500000.0; + break; + + case 'T': + northing = 4400000.0; + break; + + case 'U': + northing = 5300000.0; + break; + + case 'V': + northing = 6200000.0; + break; + + case 'W': + northing = 7000000.0; + break; + + case 'X': + northing = 7900000.0; + break; + + default: + northing = -1.0; + } + + if (northing >= 0.0) { + return northing; + } else { + throw "Invalid zone letter: " + zoneLetter; + } +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/Point.js +function lib_Point_typeof(obj) { "@babel/helpers - typeof"; return lib_Point_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, lib_Point_typeof(obj); } + + + +function lib_Point_Point(x, y, z) { + if (!(this instanceof lib_Point_Point)) { + return new lib_Point_Point(x, y, z); + } + + if (Array.isArray(x)) { + this.x = x[0]; + this.y = x[1]; + this.z = x[2] || 0.0; + } else if (lib_Point_typeof(x) === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z || 0.0; + } else if (typeof x === 'string' && typeof y === 'undefined') { + var coords = x.split(','); + this.x = parseFloat(coords[0], 10); + this.y = parseFloat(coords[1], 10); + this.z = parseFloat(coords[2], 10) || 0.0; + } else { + this.x = x; + this.y = y; + this.z = z || 0.0; + } + + console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); +} + +lib_Point_Point.fromMGRS = function (mgrsStr) { + return new lib_Point_Point(mgrs_toPoint(mgrsStr)); +}; + +lib_Point_Point.prototype.toMGRS = function (accuracy) { + return mgrs_forward([this.x, this.y], accuracy); +}; + +/* harmony default export */ var lib_Point = (lib_Point_Point); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_enfn.js +var C00 = 1; +var C02 = 0.25; +var C04 = 0.046875; +var C06 = 0.01953125; +var C08 = 0.01068115234375; +var C22 = 0.75; +var C44 = 0.46875; +var C46 = 0.01302083333333333333; +var C48 = 0.00712076822916666666; +var C66 = 0.36458333333333333333; +var C68 = 0.00569661458333333333; +var C88 = 0.3076171875; +/* harmony default export */ function pj_enfn(es) { + var en = []; + en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); + en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); + var t = es * es; + en[2] = t * (C44 - es * (C46 + es * C48)); + t *= es; + en[3] = t * (C66 - es * C68); + en[4] = t * es * C88; + return en; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_mlfn.js +/* harmony default export */ function pj_mlfn(phi, sphi, cphi, en) { + cphi *= sphi; + sphi *= sphi; + return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/pj_inv_mlfn.js + + +var MAX_ITER = 20; +/* harmony default export */ function pj_inv_mlfn(arg, es, en) { + var k = 1 / (1 - es); + var phi = arg; + + for (var i = MAX_ITER; i; --i) { + /* rarely goes over 2 iterations */ + var s = Math.sin(phi); + var t = 1 - es * s * s; //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; + //phi -= t * (t * Math.sqrt(t)) * k; + + t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; + phi -= t; + + if (Math.abs(t) < EPSLN) { + return phi; + } + } //..reportError("cass:pj_inv_mlfn: Convergence error"); + + + return phi; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/tmerc.js +// Heavily based on this tmerc projection implementation +// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js + + + + + + +function tmerc_init() { + this.x0 = this.x0 !== undefined ? this.x0 : 0; + this.y0 = this.y0 !== undefined ? this.y0 : 0; + this.long0 = this.long0 !== undefined ? this.long0 : 0; + this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; + + if (this.es) { + this.en = pj_enfn(this.es); + this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); + } +} +/** + Transverse Mercator Forward - long/lat to x/y + long/lat in radians + */ + +function tmerc_forward(p) { + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + var con; + var x, y; + var sin_phi = Math.sin(lat); + var cos_phi = Math.cos(lat); + + if (!this.es) { + var b = cos_phi * Math.sin(delta_lon); + + if (Math.abs(Math.abs(b) - 1) < EPSLN) { + return 93; + } else { + x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0; + y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2)); + b = Math.abs(y); + + if (b >= 1) { + if (b - 1 > EPSLN) { + return 93; + } else { + y = 0; + } + } else { + y = Math.acos(y); + } + + if (lat < 0) { + y = -y; + } + + y = this.a * this.k0 * (y - this.lat0) + this.y0; + } + } else { + var al = cos_phi * delta_lon; + var als = Math.pow(al, 2); + var c = this.ep2 * Math.pow(cos_phi, 2); + var cs = Math.pow(c, 2); + var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0; + var t = Math.pow(tq, 2); + var ts = Math.pow(t, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + al = al / Math.sqrt(con); + var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en); + x = this.a * (this.k0 * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c + als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) + this.x0; + y = this.a * (this.k0 * (ml - this.ml0 + sin_phi * delta_lon * al / 2 * (1 + als / 12 * (5 - t + 9 * c + 4 * cs + als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c + als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) + this.y0; + } + + p.x = x; + p.y = y; + return p; +} +/** + Transverse Mercator Inverse - x/y to long/lat + */ + +function tmerc_inverse(p) { + var con, phi; + var lat, lon; + var x = (p.x - this.x0) * (1 / this.a); + var y = (p.y - this.y0) * (1 / this.a); + + if (!this.es) { + var f = Math.exp(x / this.k0); + var g = 0.5 * (f - 1 / f); + var temp = this.lat0 + y / this.k0; + var h = Math.cos(temp); + con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2))); + lat = Math.asin(con); + + if (y < 0) { + lat = -lat; + } + + if (g === 0 && h === 0) { + lon = 0; + } else { + lon = adjust_lon(Math.atan2(g, h) + this.long0); + } + } else { + // ellipsoidal form + con = this.ml0 + y / this.k0; + phi = pj_inv_mlfn(con, this.es, this.en); + + if (Math.abs(phi) < HALF_PI) { + var sin_phi = Math.sin(phi); + var cos_phi = Math.cos(phi); + var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0; + var c = this.ep2 * Math.pow(cos_phi, 2); + var cs = Math.pow(c, 2); + var t = Math.pow(tan_phi, 2); + var ts = Math.pow(t, 2); + con = 1 - this.es * Math.pow(sin_phi, 2); + var d = x * Math.sqrt(con) / this.k0; + var ds = Math.pow(d, 2); + con = con * tan_phi; + lat = phi - con * ds / (1 - this.es) * 0.5 * (1 - ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs - ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c - ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t)))); + lon = adjust_lon(this.long0 + d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c - ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi); + } else { + lat = HALF_PI * sign(y); + lon = 0; + } + } + + p.x = lon; + p.y = lat; + return p; +} +var tmerc_names = ["Fast_Transverse_Mercator", "Fast Transverse Mercator"]; +/* harmony default export */ var tmerc = ({ + init: tmerc_init, + forward: tmerc_forward, + inverse: tmerc_inverse, + names: tmerc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/sinh.js +/* harmony default export */ function sinh(x) { + var r = Math.exp(x); + r = (r - 1 / r) / 2; + return r; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/hypot.js +/* harmony default export */ function hypot(x, y) { + x = Math.abs(x); + y = Math.abs(y); + var a = Math.max(x, y); + var b = Math.min(x, y) / (a ? a : 1); + return a * Math.sqrt(1 + Math.pow(b, 2)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/log1py.js +/* harmony default export */ function log1py(x) { + var y = 1 + x; + var z = y - 1; + return z === 0 ? x : x * Math.log(y) / z; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/asinhy.js + + +/* harmony default export */ function asinhy(x) { + var y = Math.abs(x); + y = log1py(y * (1 + y / (hypot(1, y) + 1))); + return x < 0 ? -y : y; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/gatg.js +/* harmony default export */ function gatg(pp, B) { + var cos_2B = 2 * Math.cos(2 * B); + var i = pp.length - 1; + var h1 = pp[i]; + var h2 = 0; + var h; + + while (--i >= 0) { + h = -h2 + cos_2B * h1 + pp[i]; + h2 = h1; + h1 = h; + } + + return B + h * Math.sin(2 * B); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/clens.js +/* harmony default export */ function clens(pp, arg_r) { + var r = 2 * Math.cos(arg_r); + var i = pp.length - 1; + var hr1 = pp[i]; + var hr2 = 0; + var hr; + + while (--i >= 0) { + hr = -hr2 + r * hr1 + pp[i]; + hr2 = hr1; + hr1 = hr; + } + + return Math.sin(arg_r) * hr; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/cosh.js +/* harmony default export */ function cosh(x) { + var r = Math.exp(x); + r = (r + 1 / r) / 2; + return r; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/clens_cmplx.js + + +/* harmony default export */ function clens_cmplx(pp, arg_r, arg_i) { + var sin_arg_r = Math.sin(arg_r); + var cos_arg_r = Math.cos(arg_r); + var sinh_arg_i = sinh(arg_i); + var cosh_arg_i = cosh(arg_i); + var r = 2 * cos_arg_r * cosh_arg_i; + var i = -2 * sin_arg_r * sinh_arg_i; + var j = pp.length - 1; + var hr = pp[j]; + var hi1 = 0; + var hr1 = 0; + var hi = 0; + var hr2; + var hi2; + + while (--j >= 0) { + hr2 = hr1; + hi2 = hi1; + hr1 = hr; + hi1 = hi; + hr = -hr2 + r * hr1 - i * hi1 + pp[j]; + hi = -hi2 + i * hr1 + r * hi1; + } + + r = sin_arg_r * cosh_arg_i; + i = cos_arg_r * sinh_arg_i; + return [r * hr - i * hi, r * hi + i * hr]; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/etmerc.js +// Heavily based on this etmerc projection implementation +// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js + + + + + + + + +function etmerc_init() { + if (!this.approx && (isNaN(this.es) || this.es <= 0)) { + throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.'); + } + + if (this.approx) { + // When '+approx' is set, use tmerc instead + tmerc.init.apply(this); + this.forward = tmerc.forward; + this.inverse = tmerc.inverse; + } + + this.x0 = this.x0 !== undefined ? this.x0 : 0; + this.y0 = this.y0 !== undefined ? this.y0 : 0; + this.long0 = this.long0 !== undefined ? this.long0 : 0; + this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; + this.cgb = []; + this.cbg = []; + this.utg = []; + this.gtu = []; + var f = this.es / (1 + Math.sqrt(1 - this.es)); + var n = f / (2 - f); + var np = n; + this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675)))))); + this.cbg[0] = n * (-2 + n * (2 / 3 + n * (4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725)))))); + np = np * n; + this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945))))); + this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * (-13 / 9 + n * (904 / 315 + n * (-1522 / 945))))); + np = np * n; + this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835)))); + this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835)))); + np = np * n; + this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175))); + this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * (-24832 / 14175))); + np = np * n; + this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237)); + this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185)); + np = np * n; + this.cgb[5] = np * (601676 / 22275); + this.cbg[5] = np * (444337 / 155925); + np = Math.pow(n, 2); + this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256))); + this.utg[0] = n * (-0.5 + n * (2 / 3 + n * (-37 / 96 + n * (1 / 360 + n * (81 / 512 + n * (-96199 / 604800)))))); + this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800)))))); + this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720))))); + this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360))))); + np = np * n; + this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720)))); + this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440)))); + np = np * n; + this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600))); + this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600))); + np = np * n; + this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680)); + this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840)); + np = np * n; + this.utg[5] = np * (-20648693 / 638668800); + this.gtu[5] = np * (212378941 / 319334400); + var Z = gatg(this.cbg, this.lat0); + this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z)); +} +function etmerc_forward(p) { + var Ce = adjust_lon(p.x - this.long0); + var Cn = p.y; + Cn = gatg(this.cbg, Cn); + var sin_Cn = Math.sin(Cn); + var cos_Cn = Math.cos(Cn); + var sin_Ce = Math.sin(Ce); + var cos_Ce = Math.cos(Ce); + Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); + Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce)); + Ce = asinhy(Math.tan(Ce)); + var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce); + Cn = Cn + tmp[0]; + Ce = Ce + tmp[1]; + var x; + var y; + + if (Math.abs(Ce) <= 2.623395162778) { + x = this.a * (this.Qn * Ce) + this.x0; + y = this.a * (this.Qn * Cn + this.Zb) + this.y0; + } else { + x = Infinity; + y = Infinity; + } + + p.x = x; + p.y = y; + return p; +} +function etmerc_inverse(p) { + var Ce = (p.x - this.x0) * (1 / this.a); + var Cn = (p.y - this.y0) * (1 / this.a); + Cn = (Cn - this.Zb) / this.Qn; + Ce = Ce / this.Qn; + var lon; + var lat; + + if (Math.abs(Ce) <= 2.623395162778) { + var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce); + Cn = Cn + tmp[0]; + Ce = Ce + tmp[1]; + Ce = Math.atan(sinh(Ce)); + var sin_Cn = Math.sin(Cn); + var cos_Cn = Math.cos(Cn); + var sin_Ce = Math.sin(Ce); + var cos_Ce = Math.cos(Ce); + Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn)); + Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); + lon = adjust_lon(Ce + this.long0); + lat = gatg(this.cgb, Cn); + } else { + lon = Infinity; + lat = Infinity; + } + + p.x = lon; + p.y = lat; + return p; +} +var etmerc_names = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc", "Transverse_Mercator", "Transverse Mercator", "tmerc"]; +/* harmony default export */ var etmerc = ({ + init: etmerc_init, + forward: etmerc_forward, + inverse: etmerc_inverse, + names: etmerc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_zone.js + +/* harmony default export */ function adjust_zone(zone, lon) { + if (zone === undefined) { + zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1; + + if (zone < 0) { + return 0; + } else if (zone > 60) { + return 60; + } + } + + return zone; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/utm.js + + +var dependsOn = 'etmerc'; + +function utm_init() { + var zone = adjust_zone(this.zone, this.long0); + + if (zone === undefined) { + throw new Error('unknown utm zone'); + } + + this.lat0 = 0; + this.long0 = (6 * Math.abs(zone) - 183) * D2R; + this.x0 = 500000; + this.y0 = this.utmSouth ? 10000000 : 0; + this.k0 = 0.9996; + etmerc.init.apply(this); + this.forward = etmerc.forward; + this.inverse = etmerc.inverse; +} +var utm_names = ["Universal Transverse Mercator System", "utm"]; +/* harmony default export */ var utm = ({ + init: utm_init, + names: utm_names, + dependsOn: dependsOn +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/srat.js +/* harmony default export */ function srat(esinp, exp) { + return Math.pow((1 - esinp) / (1 + esinp), exp); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/gauss.js + +var gauss_MAX_ITER = 20; + +function gauss_init() { + var sphi = Math.sin(this.lat0); + var cphi = Math.cos(this.lat0); + cphi *= cphi; + this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); + this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); + this.phic0 = Math.asin(sphi / this.C); + this.ratexp = 0.5 * this.C * this.e; + this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); +} +function gauss_forward(p) { + var lon = p.x; + var lat = p.y; + p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; + p.x = this.C * lon; + return p; +} +function gauss_inverse(p) { + var DEL_TOL = 1e-14; + var lon = p.x / this.C; + var lat = p.y; + var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); + + for (var i = gauss_MAX_ITER; i > 0; --i) { + lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI; + + if (Math.abs(lat - p.y) < DEL_TOL) { + break; + } + + p.y = lat; + } + /* convergence failed */ + + + if (!i) { + return null; + } + + p.x = lon; + p.y = lat; + return p; +} +var gauss_names = ["gauss"]; +/* harmony default export */ var gauss = ({ + init: gauss_init, + forward: gauss_forward, + inverse: gauss_inverse, + names: gauss_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/sterea.js + + +function sterea_init() { + gauss.init.apply(this); + + if (!this.rc) { + return; + } + + this.sinc0 = Math.sin(this.phic0); + this.cosc0 = Math.cos(this.phic0); + this.R2 = 2 * this.rc; + + if (!this.title) { + this.title = "Oblique Stereographic Alternative"; + } +} +function sterea_forward(p) { + var sinc, cosc, cosl, k; + p.x = adjust_lon(p.x - this.long0); + gauss.forward.apply(this, [p]); + sinc = Math.sin(p.y); + cosc = Math.cos(p.y); + cosl = Math.cos(p.x); + k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); + p.x = k * cosc * Math.sin(p.x); + p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); + p.x = this.a * p.x + this.x0; + p.y = this.a * p.y + this.y0; + return p; +} +function sterea_inverse(p) { + var sinc, cosc, lon, lat, rho; + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + p.x /= this.k0; + p.y /= this.k0; + + if (rho = Math.sqrt(p.x * p.x + p.y * p.y)) { + var c = 2 * Math.atan2(rho, this.R2); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); + lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); + } else { + lat = this.phic0; + lon = 0; + } + + p.x = lon; + p.y = lat; + gauss.inverse.apply(this, [p]); + p.x = adjust_lon(p.x + this.long0); + return p; +} +var sterea_names = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea", "Oblique Stereographic Alternative", "Double_Stereographic"]; +/* harmony default export */ var sterea = ({ + init: sterea_init, + forward: sterea_forward, + inverse: sterea_inverse, + names: sterea_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/stere.js + + + + + + +function ssfn_(phit, sinphi, eccen) { + sinphi *= eccen; + return Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen); +} +function stere_init() { + this.coslat0 = Math.cos(this.lat0); + this.sinlat0 = Math.sin(this.lat0); + + if (this.sphere) { + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); + } + } else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (this.lat0 > 0) { + //North pole + //trace('stere:north pole'); + this.con = 1; + } else { + //South pole + //trace('stere:south pole'); + this.con = -1; + } + } + + this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); + + if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { + this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); + } + + this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); + this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; + this.cosX0 = Math.cos(this.X0); + this.sinX0 = Math.sin(this.X0); + } +} // Stereographic forward equations--mapping lat,long to x,y + +function stere_forward(p) { + var lon = p.x; + var lat = p.y; + var sinlat = Math.sin(lat); + var coslat = Math.cos(lat); + var A, X, sinX, cosX, ts, rh; + var dlon = adjust_lon(lon - this.long0); + + if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { + //case of the origine point + //trace('stere:this is the origin point'); + p.x = NaN; + p.y = NaN; + return p; + } + + if (this.sphere) { + //trace('stere:sphere case'); + A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); + p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; + p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; + return p; + } else { + X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; + cosX = Math.cos(X); + sinX = Math.sin(X); + + if (Math.abs(this.coslat0) <= EPSLN) { + ts = tsfnz(this.e, lat * this.con, this.con * sinlat); + rh = 2 * this.a * this.k0 * ts / this.cons; + p.x = this.x0 + rh * Math.sin(lon - this.long0); + p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); //trace(p.toString()); + + return p; + } else if (Math.abs(this.sinlat0) < EPSLN) { + //Eq + //trace('stere:equateur'); + A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); + p.y = A * sinX; + } else { + //other case + //trace('stere:normal case'); + A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); + p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; + } + + p.x = A * cosX * Math.sin(dlon) + this.x0; + } //trace(p.toString()); + + + return p; +} //* Stereographic inverse equations--mapping x,y to lat/long + +function stere_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat, ts, ce, Chi; + var rh = Math.sqrt(p.x * p.x + p.y * p.y); + + if (this.sphere) { + var c = 2 * Math.atan(rh / (2 * this.a * this.k0)); + lon = this.long0; + lat = this.lat0; + + if (rh <= EPSLN) { + p.x = lon; + p.y = lat; + return p; + } + + lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); + + if (Math.abs(this.coslat0) < EPSLN) { + if (this.lat0 > 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); + } else { + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + } + } else { + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); + } + + p.x = lon; + p.y = lat; + return p; + } else { + if (Math.abs(this.coslat0) <= EPSLN) { + if (rh <= EPSLN) { + lat = this.lat0; + lon = this.long0; + p.x = lon; + p.y = lat; //trace(p.toString()); + + return p; + } + + p.x *= this.con; + p.y *= this.con; + ts = rh * this.cons / (2 * this.a * this.k0); + lat = this.con * phi2z(this.e, ts); + lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y)); + } else { + ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); + lon = this.long0; + + if (rh <= EPSLN) { + Chi = this.X0; + } else { + Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); + lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); + } + + lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); + } + } + + p.x = lon; + p.y = lat; //trace(p.toString()); + + return p; +} +var stere_names = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"]; +/* harmony default export */ var stere = ({ + init: stere_init, + forward: stere_forward, + inverse: stere_inverse, + names: stere_names, + ssfn_: ssfn_ +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/somerc.js +/* + references: + Formules et constantes pour le Calcul pour la + projection cylindrique conforme à axe oblique et pour la transformation entre + des systèmes de référence. + http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf + */ +function somerc_init() { + var phy0 = this.lat0; + this.lambda0 = this.long0; + var sinPhy0 = Math.sin(phy0); + var semiMajorAxis = this.a; + var invF = this.rf; + var flattening = 1 / invF; + var e2 = 2 * flattening - Math.pow(flattening, 2); + var e = this.e = Math.sqrt(e2); + this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); + this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); + this.b0 = Math.asin(sinPhy0 / this.alpha); + var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); + var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); + var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); + this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; +} +function somerc_forward(p) { + var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); + var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); + var S = -this.alpha * (Sa1 + Sa2) + this.K; // spheric latitude + + var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); // spheric longitude + + var I = this.alpha * (p.x - this.lambda0); // psoeudo equatorial rotation + + var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); + var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); + p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; + p.x = this.R * rotI + this.x0; + return p; +} +function somerc_inverse(p) { + var Y = p.x - this.x0; + var X = p.y - this.y0; + var rotI = Y / this.R; + var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); + var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); + var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); + var lambda = this.lambda0 + I / this.alpha; + var S = 0; + var phy = b; + var prevPhy = -1000; + var iteration = 0; + + while (Math.abs(phy - prevPhy) > 0.0000001) { + if (++iteration > 20) { + //...reportError("omercFwdInfinity"); + return; + } //S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); + + + S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); + prevPhy = phy; + phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; + } + + p.x = lambda; + p.y = phy; + return p; +} +var somerc_names = ["somerc"]; +/* harmony default export */ var somerc = ({ + init: somerc_init, + forward: somerc_forward, + inverse: somerc_inverse, + names: somerc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/omerc.js +function omerc_typeof(obj) { "@babel/helpers - typeof"; return omerc_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, omerc_typeof(obj); } + + + + + +var TOL = 1e-7; + +function isTypeA(P) { + var typeAProjections = ['Hotine_Oblique_Mercator', 'Hotine_Oblique_Mercator_Azimuth_Natural_Origin']; + var projectionName = omerc_typeof(P.PROJECTION) === "object" ? Object.keys(P.PROJECTION)[0] : P.PROJECTION; + return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1; +} +/* Initialize the Oblique Mercator projection + ------------------------------------------*/ + + +function omerc_init() { + var con, + com, + cosph0, + D, + F, + H, + L, + sinph0, + p, + J, + gamma = 0, + gamma0, + lamc = 0, + lam1 = 0, + lam2 = 0, + phi1 = 0, + phi2 = 0, + alpha_c = 0, + AB; // only Type A uses the no_off or no_uoff property + // https://github.com/OSGeo/proj.4/issues/104 + + this.no_off = isTypeA(this); + this.no_rot = 'no_rot' in this; + var alp = false; + + if ("alpha" in this) { + alp = true; + } + + var gam = false; + + if ("rectified_grid_angle" in this) { + gam = true; + } + + if (alp) { + alpha_c = this.alpha; + } + + if (gam) { + gamma = this.rectified_grid_angle * D2R; + } + + if (alp || gam) { + lamc = this.longc; + } else { + lam1 = this.long1; + phi1 = this.lat1; + lam2 = this.long2; + phi2 = this.lat2; + + if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL || Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL || Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) { + throw new Error(); + } + } + + var one_es = 1.0 - this.es; + com = Math.sqrt(one_es); + + if (Math.abs(this.lat0) > EPSLN) { + sinph0 = Math.sin(this.lat0); + cosph0 = Math.cos(this.lat0); + con = 1 - this.es * sinph0 * sinph0; + this.B = cosph0 * cosph0; + this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es); + this.A = this.B * this.k0 * com / con; + D = this.B * com / (cosph0 * Math.sqrt(con)); + F = D * D - 1; + + if (F <= 0) { + F = 0; + } else { + F = Math.sqrt(F); + + if (this.lat0 < 0) { + F = -F; + } + } + + this.E = F += D; + this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B); + } else { + this.B = 1 / com; + this.A = this.k0; + this.E = D = F = 1; + } + + if (alp || gam) { + if (alp) { + gamma0 = Math.asin(Math.sin(alpha_c) / D); + + if (!gam) { + gamma = alpha_c; + } + } else { + gamma0 = gamma; + alpha_c = Math.asin(D * Math.sin(gamma0)); + } + + this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B; + } else { + H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B); + L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B); + F = this.E / H; + p = (L - H) / (L + H); + J = this.E * this.E; + J = (J - L * H) / (J + L * H); + con = lam1 - lam2; + + if (con < -Math.pi) { + lam2 -= TWO_PI; + } else if (con > Math.pi) { + lam2 += TWO_PI; + } + + this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B); + gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0)) / (F - 1 / F)); + gamma = alpha_c = Math.asin(D * Math.sin(gamma0)); + } + + this.singam = Math.sin(gamma0); + this.cosgam = Math.cos(gamma0); + this.sinrot = Math.sin(gamma); + this.cosrot = Math.cos(gamma); + this.rB = 1 / this.B; + this.ArB = this.A * this.rB; + this.BrA = 1 / this.ArB; + AB = this.A * this.B; + + if (this.no_off) { + this.u_0 = 0; + } else { + this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c))); + + if (this.lat0 < 0) { + this.u_0 = -this.u_0; + } + } + + F = 0.5 * gamma0; + this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F)); + this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F)); +} +/* Oblique Mercator forward equations--mapping lat,long to x,y + ----------------------------------------------------------*/ + +function omerc_forward(p) { + var coords = {}; + var S, T, U, V, W, temp, u, v; + p.x = p.x - this.lam0; + + if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) { + W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B); + temp = 1 / W; + S = 0.5 * (W - temp); + T = 0.5 * (W + temp); + V = Math.sin(this.B * p.x); + U = (S * this.singam - V * this.cosgam) / T; + + if (Math.abs(Math.abs(U) - 1.0) < EPSLN) { + throw new Error(); + } + + v = 0.5 * this.ArB * Math.log((1 - U) / (1 + U)); + temp = Math.cos(this.B * p.x); + + if (Math.abs(temp) < TOL) { + u = this.A * p.x; + } else { + u = this.ArB * Math.atan2(S * this.cosgam + V * this.singam, temp); + } + } else { + v = p.y > 0 ? this.v_pole_n : this.v_pole_s; + u = this.ArB * p.y; + } + + if (this.no_rot) { + coords.x = u; + coords.y = v; + } else { + u -= this.u_0; + coords.x = v * this.cosrot + u * this.sinrot; + coords.y = u * this.cosrot - v * this.sinrot; + } + + coords.x = this.a * coords.x + this.x0; + coords.y = this.a * coords.y + this.y0; + return coords; +} +function omerc_inverse(p) { + var u, v, Qp, Sp, Tp, Vp, Up; + var coords = {}; + p.x = (p.x - this.x0) * (1.0 / this.a); + p.y = (p.y - this.y0) * (1.0 / this.a); + + if (this.no_rot) { + v = p.y; + u = p.x; + } else { + v = p.x * this.cosrot - p.y * this.sinrot; + u = p.y * this.cosrot + p.x * this.sinrot + this.u_0; + } + + Qp = Math.exp(-this.BrA * v); + Sp = 0.5 * (Qp - 1 / Qp); + Tp = 0.5 * (Qp + 1 / Qp); + Vp = Math.sin(this.BrA * u); + Up = (Vp * this.cosgam + Sp * this.singam) / Tp; + + if (Math.abs(Math.abs(Up) - 1) < EPSLN) { + coords.x = 0; + coords.y = Up < 0 ? -HALF_PI : HALF_PI; + } else { + coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up)); + coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B)); + + if (coords.y === Infinity) { + throw new Error(); + } + + coords.x = -this.rB * Math.atan2(Sp * this.cosgam - Vp * this.singam, Math.cos(this.BrA * u)); + } + + coords.x += this.lam0; + return coords; +} +var omerc_names = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "Oblique_Mercator", "omerc"]; +/* harmony default export */ var omerc = ({ + init: omerc_init, + forward: omerc_forward, + inverse: omerc_inverse, + names: omerc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/lcc.js + + + + + + +function lcc_init() { + //double lat0; /* the reference latitude */ + //double long0; /* the reference longitude */ + //double lat1; /* first standard parallel */ + //double lat2; /* second standard parallel */ + //double r_maj; /* major axis */ + //double r_min; /* minor axis */ + //double false_east; /* x offset in meters */ + //double false_north; /* y offset in meters */ + //the above value can be set with proj4.defs + //example: proj4.defs("EPSG:2154","+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"); + if (!this.lat2) { + this.lat2 = this.lat1; + } //if lat2 is not defined + + + if (!this.k0) { + this.k0 = 1; + } + + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; // Standard Parallels cannot be equal and on opposite sides of the equator + + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + + var temp = this.b / this.a; + this.e = Math.sqrt(1 - temp * temp); + var sin1 = Math.sin(this.lat1); + var cos1 = Math.cos(this.lat1); + var ms1 = msfnz(this.e, sin1, cos1); + var ts1 = tsfnz(this.e, this.lat1, sin1); + var sin2 = Math.sin(this.lat2); + var cos2 = Math.cos(this.lat2); + var ms2 = msfnz(this.e, sin2, cos2); + var ts2 = tsfnz(this.e, this.lat2, sin2); + var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); + + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); + } else { + this.ns = sin1; + } + + if (isNaN(this.ns)) { + this.ns = sin1; + } + + this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); + this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); + + if (!this.title) { + this.title = "Lambert Conformal Conic"; + } +} // Lambert Conformal conic forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- + +function lcc_forward(p) { + var lon = p.x; + var lat = p.y; // singular cases : + + if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { + lat = sign(lat) * (HALF_PI - 2 * EPSLN); + } + + var con = Math.abs(Math.abs(lat) - HALF_PI); + var ts, rh1; + + if (con > EPSLN) { + ts = tsfnz(this.e, lat, Math.sin(lat)); + rh1 = this.a * this.f0 * Math.pow(ts, this.ns); + } else { + con = lat * this.ns; + + if (con <= 0) { + return null; + } + + rh1 = 0; + } + + var theta = this.ns * adjust_lon(lon - this.long0); + p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; + p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; + return p; +} // Lambert Conformal Conic inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- + +function lcc_inverse(p) { + var rh1, con, ts; + var lat, lon; + var x = (p.x - this.x0) / this.k0; + var y = this.rh - (p.y - this.y0) / this.k0; + + if (this.ns > 0) { + rh1 = Math.sqrt(x * x + y * y); + con = 1; + } else { + rh1 = -Math.sqrt(x * x + y * y); + con = -1; + } + + var theta = 0; + + if (rh1 !== 0) { + theta = Math.atan2(con * x, con * y); + } + + if (rh1 !== 0 || this.ns > 0) { + con = 1 / this.ns; + ts = Math.pow(rh1 / (this.a * this.f0), con); + lat = phi2z(this.e, ts); + + if (lat === -9999) { + return null; + } + } else { + lat = -HALF_PI; + } + + lon = adjust_lon(theta / this.ns + this.long0); + p.x = lon; + p.y = lat; + return p; +} +var lcc_names = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_1SP", "Lambert_Conformal_Conic_2SP", "lcc"]; +/* harmony default export */ var lcc = ({ + init: lcc_init, + forward: lcc_forward, + inverse: lcc_inverse, + names: lcc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/krovak.js + +function krovak_init() { + this.a = 6377397.155; + this.es = 0.006674372230614; + this.e = Math.sqrt(this.es); + + if (!this.lat0) { + this.lat0 = 0.863937979737193; + } + + if (!this.long0) { + this.long0 = 0.7417649320975901 - 0.308341501185665; + } + /* if scale not set default to 0.9999 */ + + + if (!this.k0) { + this.k0 = 0.9999; + } + + this.s45 = 0.785398163397448; + /* 45 */ + + this.s90 = 2 * this.s45; + this.fi0 = this.lat0; + this.e2 = this.es; + this.e = Math.sqrt(this.e2); + this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2)); + this.uq = 1.04216856380474; + this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa); + this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2); + this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g; + this.k1 = this.k0; + this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)); + this.s0 = 1.37008346281555; + this.n = Math.sin(this.s0); + this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); + this.ad = this.s90 - this.uq; +} +/* ellipsoid */ + +/* calculate xy from lat/lon */ + +/* Constants, identical to inverse transform function */ + +function krovak_forward(p) { + var gfi, u, deltav, s, d, eps, ro; + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + /* Transformation */ + + gfi = Math.pow((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat)), this.alfa * this.e / 2); + u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); + deltav = -delta_lon * this.alfa; + s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); + d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); + eps = this.n * d; + ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); + p.y = ro * Math.cos(eps) / 1; + p.x = ro * Math.sin(eps) / 1; + + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + + return p; +} +/* calculate lat/lon from xy */ + +function krovak_inverse(p) { + var u, deltav, s, d, eps, ro, fi1; + var ok; + /* Transformation */ + + /* revert y, x*/ + + var tmp = p.x; + p.x = p.y; + p.y = tmp; + + if (!this.czech) { + p.y *= -1; + p.x *= -1; + } + + ro = Math.sqrt(p.x * p.x + p.y * p.y); + eps = Math.atan2(p.y, p.x); + d = eps / Math.sin(this.s0); + s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); + u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); + deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); + p.x = this.long0 - deltav / this.alfa; + fi1 = u; + ok = 0; + var iter = 0; + + do { + p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); + + if (Math.abs(fi1 - p.y) < 0.0000000001) { + ok = 1; + } + + fi1 = p.y; + iter += 1; + } while (ok === 0 && iter < 15); + + if (iter >= 15) { + return null; + } + + return p; +} +var krovak_names = ["Krovak", "krovak"]; +/* harmony default export */ var krovak = ({ + init: krovak_init, + forward: krovak_forward, + inverse: krovak_inverse, + names: krovak_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/mlfn.js +/* harmony default export */ function mlfn(e0, e1, e2, e3, phi) { + return e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e0fn.js +/* harmony default export */ function e0fn(x) { + return 1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e1fn.js +/* harmony default export */ function e1fn(x) { + return 0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e2fn.js +/* harmony default export */ function e2fn(x) { + return 0.05859375 * x * x * (1 + 0.75 * x); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/e3fn.js +/* harmony default export */ function e3fn(x) { + return x * x * x * (35 / 3072); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/gN.js +/* harmony default export */ function gN(a, e, sinphi) { + var temp = e * sinphi; + return a / Math.sqrt(1 - temp * temp); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/adjust_lat.js + + +/* harmony default export */ function adjust_lat(x) { + return Math.abs(x) < HALF_PI ? x : x - sign(x) * Math.PI; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/imlfn.js +/* harmony default export */ function imlfn(ml, e0, e1, e2, e3) { + var phi; + var dphi; + phi = ml / e0; + + for (var i = 0; i < 15; i++) { + dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); + phi += dphi; + + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); + + + return NaN; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/cass.js + + + + + + + + + + +function cass_init() { + if (!this.sphere) { + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + } +} +/* Cassini forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ + +function cass_forward(p) { + /* Forward equations + -----------------*/ + var x, y; + var lam = p.x; + var phi = p.y; + lam = adjust_lon(lam - this.long0); + + if (this.sphere) { + x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); + y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); + } else { + //ellipsoid + var sinphi = Math.sin(phi); + var cosphi = Math.cos(phi); + var nl = gN(this.a, this.e, sinphi); + var tl = Math.tan(phi) * Math.tan(phi); + var al = lam * Math.cos(phi); + var asq = al * al; + var cl = this.es * cosphi * cosphi / (1 - this.es); + var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); + y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); + } + + p.x = x + this.x0; + p.y = y + this.y0; + return p; +} +/* Inverse equations + -----------------*/ + +function cass_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var phi, lam; + + if (this.sphere) { + var dd = y + this.lat0; + phi = Math.asin(Math.sin(dd) * Math.cos(x)); + lam = Math.atan2(Math.tan(x), Math.cos(dd)); + } else { + /* ellipsoid */ + var ml1 = this.ml0 / this.a + y; + var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); + + if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { + p.x = this.long0; + p.y = HALF_PI; + + if (y < 0) { + p.y *= -1; + } + + return p; + } + + var nl1 = gN(this.a, this.e, Math.sin(phi1)); + var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); + var tl1 = Math.pow(Math.tan(phi1), 2); + var dl = x * this.a / nl1; + var dsq = dl * dl; + phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); + lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); + } + + p.x = adjust_lon(lam + this.long0); + p.y = adjust_lat(phi); + return p; +} +var cass_names = ["Cassini", "Cassini_Soldner", "cass"]; +/* harmony default export */ var cass = ({ + init: cass_init, + forward: cass_forward, + inverse: cass_inverse, + names: cass_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/qsfnz.js +/* harmony default export */ function qsfnz(eccent, sinphi) { + var con; + + if (eccent > 1.0e-7) { + con = eccent * sinphi; + return (1 - eccent * eccent) * (sinphi / (1 - con * con) - 0.5 / eccent * Math.log((1 - con) / (1 + con))); + } else { + return 2 * sinphi; + } +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/laea.js + + + +/* + reference + "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + */ + +var S_POLE = 1; +var N_POLE = 2; +var EQUIT = 3; +var OBLIQ = 4; +/* Initialize the Lambert Azimuthal Equal Area projection + ------------------------------------------------------*/ + +function laea_init() { + var t = Math.abs(this.lat0); + + if (Math.abs(t - HALF_PI) < EPSLN) { + this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; + } else if (Math.abs(t) < EPSLN) { + this.mode = this.EQUIT; + } else { + this.mode = this.OBLIQ; + } + + if (this.es > 0) { + var sinphi; + this.qp = qsfnz(this.e, 1); + this.mmf = 0.5 / (1 - this.es); + this.apa = authset(this.es); + + switch (this.mode) { + case this.N_POLE: + this.dd = 1; + break; + + case this.S_POLE: + this.dd = 1; + break; + + case this.EQUIT: + this.rq = Math.sqrt(0.5 * this.qp); + this.dd = 1 / this.rq; + this.xmf = 1; + this.ymf = 0.5 * this.qp; + break; + + case this.OBLIQ: + this.rq = Math.sqrt(0.5 * this.qp); + sinphi = Math.sin(this.lat0); + this.sinb1 = qsfnz(this.e, sinphi) / this.qp; + this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); + this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); + this.ymf = (this.xmf = this.rq) / this.dd; + this.xmf *= this.dd; + break; + } + } else { + if (this.mode === this.OBLIQ) { + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + } +} +/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ + +function laea_forward(p) { + /* Forward equations + -----------------*/ + var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; + var lam = p.x; + var phi = p.y; + lam = adjust_lon(lam - this.long0); + + if (this.sphere) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + coslam = Math.cos(lam); + + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + y = this.mode === this.EQUIT ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + + if (y <= EPSLN) { + return null; + } + + y = Math.sqrt(2 / y); + x = y * cosphi * Math.sin(lam); + y *= this.mode === this.EQUIT ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + coslam = -coslam; + } + + if (Math.abs(phi + this.lat0) < EPSLN) { + return null; + } + + y = FORTPI - phi * 0.5; + y = 2 * (this.mode === this.S_POLE ? Math.cos(y) : Math.sin(y)); + x = y * Math.sin(lam); + y *= coslam; + } + } else { + sinb = 0; + cosb = 0; + b = 0; + coslam = Math.cos(lam); + sinlam = Math.sin(lam); + sinphi = Math.sin(phi); + q = qsfnz(this.e, sinphi); + + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinb = q / this.qp; + cosb = Math.sqrt(1 - sinb * sinb); + } + + switch (this.mode) { + case this.OBLIQ: + b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; + break; + + case this.EQUIT: + b = 1 + cosb * coslam; + break; + + case this.N_POLE: + b = HALF_PI + phi; + q = this.qp - q; + break; + + case this.S_POLE: + b = phi - HALF_PI; + q = this.qp + q; + break; + } + + if (Math.abs(b) < EPSLN) { + return null; + } + + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + b = Math.sqrt(2 / b); + + if (this.mode === this.OBLIQ) { + y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); + } else { + y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; + } + + x = this.xmf * b * cosb * sinlam; + break; + + case this.N_POLE: + case this.S_POLE: + if (q >= 0) { + x = (b = Math.sqrt(q)) * sinlam; + y = coslam * (this.mode === this.S_POLE ? b : -b); + } else { + x = y = 0; + } + + break; + } + } + + p.x = this.a * x + this.x0; + p.y = this.a * y + this.y0; + return p; +} +/* Inverse equations + -----------------*/ + +function laea_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x / this.a; + var y = p.y / this.a; + var lam, phi, cCe, sCe, q, rho, ab; + + if (this.sphere) { + var cosz = 0, + rh, + sinz = 0; + rh = Math.sqrt(x * x + y * y); + phi = rh * 0.5; + + if (phi > 1) { + return null; + } + + phi = 2 * Math.asin(phi); + + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + sinz = Math.sin(phi); + cosz = Math.cos(phi); + } + + switch (this.mode) { + case this.EQUIT: + phi = Math.abs(rh) <= EPSLN ? 0 : Math.asin(y * sinz / rh); + x *= sinz; + y = cosz * rh; + break; + + case this.OBLIQ: + phi = Math.abs(rh) <= EPSLN ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); + x *= sinz * this.cosph0; + y = (cosz - Math.sin(phi) * this.sinph0) * rh; + break; + + case this.N_POLE: + y = -y; + phi = HALF_PI - phi; + break; + + case this.S_POLE: + phi -= HALF_PI; + break; + } + + lam = y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ) ? 0 : Math.atan2(x, y); + } else { + ab = 0; + + if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { + x /= this.dd; + y *= this.dd; + rho = Math.sqrt(x * x + y * y); + + if (rho < EPSLN) { + p.x = this.long0; + p.y = this.lat0; + return p; + } + + sCe = 2 * Math.asin(0.5 * rho / this.rq); + cCe = Math.cos(sCe); + x *= sCe = Math.sin(sCe); + + if (this.mode === this.OBLIQ) { + ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; + q = this.qp * ab; + y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; + } else { + ab = y * sCe / rho; + q = this.qp * ab; + y = rho * cCe; + } + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE) { + y = -y; + } + + q = x * x + y * y; + + if (!q) { + p.x = this.long0; + p.y = this.lat0; + return p; + } + + ab = 1 - q / this.qp; + + if (this.mode === this.S_POLE) { + ab = -ab; + } + } + + lam = Math.atan2(x, y); + phi = authlat(Math.asin(ab), this.apa); + } + + p.x = adjust_lon(this.long0 + lam); + p.y = phi; + return p; +} +/* determine latitude from authalic latitude */ + +var P00 = 0.33333333333333333333; +var P01 = 0.17222222222222222222; +var P02 = 0.10257936507936507936; +var P10 = 0.06388888888888888888; +var P11 = 0.06640211640211640211; +var P20 = 0.01641501294219154443; + +function authset(es) { + var t; + var APA = []; + APA[0] = es * P00; + t = es * es; + APA[0] += t * P01; + APA[1] = t * P10; + t *= es; + APA[0] += t * P02; + APA[1] += t * P11; + APA[2] = t * P20; + return APA; +} + +function authlat(beta, APA) { + var t = beta + beta; + return beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t); +} + +var laea_names = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; +/* harmony default export */ var laea = ({ + init: laea_init, + forward: laea_forward, + inverse: laea_inverse, + names: laea_names, + S_POLE: S_POLE, + N_POLE: N_POLE, + EQUIT: EQUIT, + OBLIQ: OBLIQ +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/asinz.js +/* harmony default export */ function asinz(x) { + if (Math.abs(x) > 1) { + x = x > 1 ? 1 : -1; + } + + return Math.asin(x); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/aea.js + + + + + +function aea_init() { + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); + this.e3 = Math.sqrt(this.es); + this.sin_po = Math.sin(this.lat1); + this.cos_po = Math.cos(this.lat1); + this.t1 = this.sin_po; + this.con = this.sin_po; + this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po); + this.sin_po = Math.sin(this.lat2); + this.cos_po = Math.cos(this.lat2); + this.t2 = this.sin_po; + this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po); + this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po); + this.sin_po = Math.sin(this.lat0); + this.cos_po = Math.cos(this.lat0); + this.t3 = this.sin_po; + this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po); + + if (Math.abs(this.lat1 - this.lat2) > EPSLN) { + this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); + } else { + this.ns0 = this.con; + } + + this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; + this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0; +} +/* Albers Conical Equal Area forward equations--mapping lat,long to x,y + -------------------------------------------------------------------*/ + +function aea_forward(p) { + var lon = p.x; + var lat = p.y; + this.sin_phi = Math.sin(lat); + this.cos_phi = Math.cos(lat); + var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi); + var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; + var theta = this.ns0 * adjust_lon(lon - this.long0); + var x = rh1 * Math.sin(theta) + this.x0; + var y = this.rh - rh1 * Math.cos(theta) + this.y0; + p.x = x; + p.y = y; + return p; +} +function aea_inverse(p) { + var rh1, qs, con, theta, lon, lat; + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + + if (this.ns0 >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + + theta = 0; + + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + + con = rh1 * this.ns0 / this.a; + + if (this.sphere) { + lat = Math.asin((this.c - con * con) / (2 * this.ns0)); + } else { + qs = (this.c - con * con) / this.ns0; + lat = this.phi1z(this.e3, qs); + } + + lon = adjust_lon(theta / this.ns0 + this.long0); + p.x = lon; + p.y = lat; + return p; +} +/* Function to compute phi1, the latitude for the inverse of the + Albers Conical Equal-Area projection. +-------------------------------------------*/ + +function phi1z(eccent, qs) { + var sinphi, cosphi, con, com, dphi; + var phi = asinz(0.5 * qs); + + if (eccent < EPSLN) { + return phi; + } + + var eccnts = eccent * eccent; + + for (var i = 1; i <= 25; i++) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + con = eccent * sinphi; + com = 1 - con * con; + dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi = phi + dphi; + + if (Math.abs(dphi) <= 1e-7) { + return phi; + } + } + + return null; +} +var aea_names = ["Albers_Conic_Equal_Area", "Albers", "aea"]; +/* harmony default export */ var aea = ({ + init: aea_init, + forward: aea_forward, + inverse: aea_inverse, + names: aea_names, + phi1z: phi1z +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/gnom.js + + + +/* + reference: + Wolfram Mathworld "Gnomonic Projection" + http://mathworld.wolfram.com/GnomonicProjection.html + Accessed: 12th November 2009 + */ + +function gnom_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.sin_p14 = Math.sin(this.lat0); + this.cos_p14 = Math.cos(this.lat0); // Approximation for projecting points to the horizon (infinity) + + this.infinity_dist = 1000 * this.a; + this.rc = 1; +} +/* Gnomonic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + +function gnom_forward(p) { + var sinphi, cosphi; + /* sin and cos value */ + + var dlon; + /* delta longitude value */ + + var coslon; + /* cos of longitude */ + + var ksp; + /* scale factor */ + + var g; + var x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + + dlon = adjust_lon(lon - this.long0); + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1; + + if (g > 0 || Math.abs(g) <= EPSLN) { + x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; + } else { + // Point is in the opposing hemisphere and is unprojectable + // We still need to return a reasonable point, so we project + // to infinity, on a bearing + // equivalent to the northern hemisphere equivalent + // This is a reasonable approximation for short shapes and lines that + // straddle the horizon. + x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); + y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + } + + p.x = x; + p.y = y; + return p; +} +function gnom_inverse(p) { + var rh; + /* Rho */ + + var sinc, cosc; + var c; + var lon, lat; + /* Inverse equations + -----------------*/ + + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + p.x /= this.k0; + p.y /= this.k0; + + if (rh = Math.sqrt(p.x * p.x + p.y * p.y)) { + c = Math.atan2(rh, this.rc); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = asinz(cosc * this.sin_p14 + p.y * sinc * this.cos_p14 / rh); + lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); + lon = adjust_lon(this.long0 + lon); + } else { + lat = this.phic0; + lon = 0; + } + + p.x = lon; + p.y = lat; + return p; +} +var gnom_names = ["gnom"]; +/* harmony default export */ var gnom = ({ + init: gnom_init, + forward: gnom_forward, + inverse: gnom_inverse, + names: gnom_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/common/iqsfnz.js + +/* harmony default export */ function iqsfnz(eccent, q) { + var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); + + if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { + if (q < 0) { + return -1 * HALF_PI; + } else { + return HALF_PI; + } + } //var phi = 0.5* q/(1-eccent*eccent); + + + var phi = Math.asin(0.5 * q); + var dphi; + var sin_phi; + var cos_phi; + var con; + + for (var i = 0; i < 30; i++) { + sin_phi = Math.sin(phi); + cos_phi = Math.cos(phi); + con = eccent * sin_phi; + dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); + phi += dphi; + + if (Math.abs(dphi) <= 0.0000000001) { + return phi; + } + } //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); + + + return NaN; +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/cea.js + + + + +/* + reference: + "Cartographic Projection Procedures for the UNIX Environment- + A User's Manual" by Gerald I. Evenden, + USGS Open File Report 90-284and Release 4 Interim Reports (2003) +*/ + +function cea_init() { + //no-op + if (!this.sphere) { + this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } +} +/* Cylindrical Equal Area forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ + +function cea_forward(p) { + var lon = p.x; + var lat = p.y; + var x, y; + /* Forward equations + -----------------*/ + + var dlon = adjust_lon(lon - this.long0); + + if (this.sphere) { + x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); + y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); + } else { + var qs = qsfnz(this.e, Math.sin(lat)); + x = this.x0 + this.a * this.k0 * dlon; + y = this.y0 + this.a * qs * 0.5 / this.k0; + } + + p.x = x; + p.y = y; + return p; +} +/* Cylindrical Equal Area inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ + +function cea_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var lon, lat; + + if (this.sphere) { + lon = adjust_lon(this.long0 + p.x / this.a / Math.cos(this.lat_ts)); + lat = Math.asin(p.y / this.a * Math.cos(this.lat_ts)); + } else { + lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); + lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); + } + + p.x = lon; + p.y = lat; + return p; +} +var cea_names = ["cea"]; +/* harmony default export */ var cea = ({ + init: cea_init, + forward: cea_forward, + inverse: cea_inverse, + names: cea_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/eqc.js + + +function eqc_init() { + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.lat0 = this.lat0 || 0; + this.long0 = this.long0 || 0; + this.lat_ts = this.lat_ts || 0; + this.title = this.title || "Equidistant Cylindrical (Plate Carre)"; + this.rc = Math.cos(this.lat_ts); +} // forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- + +function eqc_forward(p) { + var lon = p.x; + var lat = p.y; + var dlon = adjust_lon(lon - this.long0); + var dlat = adjust_lat(lat - this.lat0); + p.x = this.x0 + this.a * dlon * this.rc; + p.y = this.y0 + this.a * dlat; + return p; +} // inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- + +function eqc_inverse(p) { + var x = p.x; + var y = p.y; + p.x = adjust_lon(this.long0 + (x - this.x0) / (this.a * this.rc)); + p.y = adjust_lat(this.lat0 + (y - this.y0) / this.a); + return p; +} +var eqc_names = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; +/* harmony default export */ var eqc = ({ + init: eqc_init, + forward: eqc_forward, + inverse: eqc_inverse, + names: eqc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/poly.js + + + + + + + + + +var poly_MAX_ITER = 20; +function poly_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles + + this.e = Math.sqrt(this.es); + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas +} +/* Polyconic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + +function poly_forward(p) { + var lon = p.x; + var lat = p.y; + var x, y, el; + var dlon = adjust_lon(lon - this.long0); + el = dlon * Math.sin(lat); + + if (this.sphere) { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.a * this.lat0; + } else { + x = this.a * Math.sin(el) / Math.tan(lat); + y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); + } + } else { + if (Math.abs(lat) <= EPSLN) { + x = this.a * dlon; + y = -1 * this.ml0; + } else { + var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); + x = nl * Math.sin(el); + y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); + } + } + + p.x = x + this.x0; + p.y = y + this.y0; + return p; +} +/* Inverse equations + -----------------*/ + +function poly_inverse(p) { + var lon, lat, x, y, i; + var al, bl; + var phi, dphi; + x = p.x - this.x0; + y = p.y - this.y0; + + if (this.sphere) { + if (Math.abs(y + this.a * this.lat0) <= EPSLN) { + lon = adjust_lon(x / this.a + this.long0); + lat = 0; + } else { + al = this.lat0 + y / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var tanphi; + + for (i = poly_MAX_ITER; i; --i) { + tanphi = Math.tan(phi); + dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); + phi += dphi; + + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } + + lon = adjust_lon(this.long0 + Math.asin(x * Math.tan(phi) / this.a) / Math.sin(lat)); + } + } else { + if (Math.abs(y + this.ml0) <= EPSLN) { + lat = 0; + lon = adjust_lon(this.long0 + x / this.a); + } else { + al = (this.ml0 + y) / this.a; + bl = x * x / this.a / this.a + al * al; + phi = al; + var cl, mln, mlnp, ma; + var con; + + for (i = poly_MAX_ITER; i; --i) { + con = this.e * Math.sin(phi); + cl = Math.sqrt(1 - con * con) * Math.tan(phi); + mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); + mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); + ma = mln / this.a; + dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); + phi -= dphi; + + if (Math.abs(dphi) <= EPSLN) { + lat = phi; + break; + } + } //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); + + + cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); + lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); + } + } + + p.x = lon; + p.y = lat; + return p; +} +var poly_names = ["Polyconic", "poly"]; +/* harmony default export */ var poly = ({ + init: poly_init, + forward: poly_forward, + inverse: poly_inverse, + names: poly_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/nzmg.js + +/* + reference + Department of Land and Survey Technical Circular 1973/32 + http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf + OSG Technical Report 4.1 + http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf + */ + +/** + * iterations: Number of iterations to refine inverse transform. + * 0 -> km accuracy + * 1 -> m accuracy -- suitable for most mapping applications + * 2 -> mm accuracy + */ + +var iterations = 1; +function nzmg_init() { + this.A = []; + this.A[1] = 0.6399175073; + this.A[2] = -0.1358797613; + this.A[3] = 0.063294409; + this.A[4] = -0.02526853; + this.A[5] = 0.0117879; + this.A[6] = -0.0055161; + this.A[7] = 0.0026906; + this.A[8] = -0.001333; + this.A[9] = 0.00067; + this.A[10] = -0.00034; + this.B_re = []; + this.B_im = []; + this.B_re[1] = 0.7557853228; + this.B_im[1] = 0; + this.B_re[2] = 0.249204646; + this.B_im[2] = 0.003371507; + this.B_re[3] = -0.001541739; + this.B_im[3] = 0.041058560; + this.B_re[4] = -0.10162907; + this.B_im[4] = 0.01727609; + this.B_re[5] = -0.26623489; + this.B_im[5] = -0.36249218; + this.B_re[6] = -0.6870983; + this.B_im[6] = -1.1651967; + this.C_re = []; + this.C_im = []; + this.C_re[1] = 1.3231270439; + this.C_im[1] = 0; + this.C_re[2] = -0.577245789; + this.C_im[2] = -0.007809598; + this.C_re[3] = 0.508307513; + this.C_im[3] = -0.112208952; + this.C_re[4] = -0.15094762; + this.C_im[4] = 0.18200602; + this.C_re[5] = 1.01418179; + this.C_im[5] = 1.64497696; + this.C_re[6] = 1.9660549; + this.C_im[6] = 2.5127645; + this.D = []; + this.D[1] = 1.5627014243; + this.D[2] = 0.5185406398; + this.D[3] = -0.03333098; + this.D[4] = -0.1052906; + this.D[5] = -0.0368594; + this.D[6] = 0.007317; + this.D[7] = 0.01220; + this.D[8] = 0.00394; + this.D[9] = -0.0013; +} +/** + New Zealand Map Grid Forward - long/lat to x/y + long/lat in radians + */ + +function nzmg_forward(p) { + var n; + var lon = p.x; + var lat = p.y; + var delta_lat = lat - this.lat0; + var delta_lon = lon - this.long0; // 1. Calculate d_phi and d_psi ... // and d_lambda + // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. + + var d_phi = delta_lat / SEC_TO_RAD * 1E-5; + var d_lambda = delta_lon; + var d_phi_n = 1; // d_phi^0 + + var d_psi = 0; + + for (n = 1; n <= 10; n++) { + d_phi_n = d_phi_n * d_phi; + d_psi = d_psi + this.A[n] * d_phi_n; + } // 2. Calculate theta + + + var th_re = d_psi; + var th_im = d_lambda; // 3. Calculate z + + var th_n_re = 1; + var th_n_im = 0; // theta^0 + + var th_n_re1; + var th_n_im1; + var z_re = 0; + var z_im = 0; + + for (n = 1; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; + z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; + } // 4. Calculate easting and northing + + + p.x = z_im * this.a + this.x0; + p.y = z_re * this.a + this.y0; + return p; +} +/** + New Zealand Map Grid Inverse - x/y to long/lat + */ + +function nzmg_inverse(p) { + var n; + var x = p.x; + var y = p.y; + var delta_x = x - this.x0; + var delta_y = y - this.y0; // 1. Calculate z + + var z_re = delta_y / this.a; + var z_im = delta_x / this.a; // 2a. Calculate theta - first approximation gives km accuracy + + var z_n_re = 1; + var z_n_im = 0; // z^0 + + var z_n_re1; + var z_n_im1; + var th_re = 0; + var th_im = 0; + + for (n = 1; n <= 6; n++) { + z_n_re1 = z_n_re * z_re - z_n_im * z_im; + z_n_im1 = z_n_im * z_re + z_n_re * z_im; + z_n_re = z_n_re1; + z_n_im = z_n_im1; + th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; + th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; + } // 2b. Iterate to refine the accuracy of the calculation + // 0 iterations gives km accuracy + // 1 iteration gives m accuracy -- good enough for most mapping applications + // 2 iterations bives mm accuracy + + + for (var i = 0; i < this.iterations; i++) { + var th_n_re = th_re; + var th_n_im = th_im; + var th_n_re1; + var th_n_im1; + var num_re = z_re; + var num_im = z_im; + + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } + + th_n_re = 1; + th_n_im = 0; + var den_re = this.B_re[1]; + var den_im = this.B_im[1]; + + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re * th_re - th_n_im * th_im; + th_n_im1 = th_n_im * th_re + th_n_re * th_im; + th_n_re = th_n_re1; + th_n_im = th_n_im1; + den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); + den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); + } // Complex division + + + var den2 = den_re * den_re + den_im * den_im; + th_re = (num_re * den_re + num_im * den_im) / den2; + th_im = (num_im * den_re - num_re * den_im) / den2; + } // 3. Calculate d_phi ... // and d_lambda + + + var d_psi = th_re; + var d_lambda = th_im; + var d_psi_n = 1; // d_psi^0 + + var d_phi = 0; + + for (n = 1; n <= 9; n++) { + d_psi_n = d_psi_n * d_psi; + d_phi = d_phi + this.D[n] * d_psi_n; + } // 4. Calculate latitude and longitude + // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. + + + var lat = this.lat0 + d_phi * SEC_TO_RAD * 1E5; + var lon = this.long0 + d_lambda; + p.x = lon; + p.y = lat; + return p; +} +var nzmg_names = ["New_Zealand_Map_Grid", "nzmg"]; +/* harmony default export */ var nzmg = ({ + init: nzmg_init, + forward: nzmg_forward, + inverse: nzmg_inverse, + names: nzmg_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/mill.js + +/* + reference + "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + */ + +/* Initialize the Miller Cylindrical projection + -------------------------------------------*/ + +function mill_init() {//no-op +} +/* Miller Cylindrical forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ + +function mill_forward(p) { + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + + var dlon = adjust_lon(lon - this.long0); + var x = this.x0 + this.a * dlon; + var y = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + lat / 2.5)) * 1.25; + p.x = x; + p.y = y; + return p; +} +/* Miller Cylindrical inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ + +function mill_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var lon = adjust_lon(this.long0 + p.x / this.a); + var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); + p.x = lon; + p.y = lat; + return p; +} +var mill_names = ["Miller_Cylindrical", "mill"]; +/* harmony default export */ var mill = ({ + init: mill_init, + forward: mill_forward, + inverse: mill_inverse, + names: mill_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/sinu.js + + + +var sinu_MAX_ITER = 20; + + + + +function sinu_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + if (!this.sphere) { + this.en = pj_enfn(this.es); + } else { + this.n = 1; + this.m = 0; + this.es = 0; + this.C_y = Math.sqrt((this.m + 1) / this.n); + this.C_x = this.C_y / (this.m + 1); + } +} +/* Sinusoidal forward equations--mapping lat,long to x,y + -----------------------------------------------------*/ + +function sinu_forward(p) { + var x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + + lon = adjust_lon(lon - this.long0); + + if (this.sphere) { + if (!this.m) { + lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; + } else { + var k = this.n * Math.sin(lat); + + for (var i = sinu_MAX_ITER; i; --i) { + var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); + lat -= V; + + if (Math.abs(V) < EPSLN) { + break; + } + } + } + + x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); + y = this.a * this.C_y * lat; + } else { + var s = Math.sin(lat); + var c = Math.cos(lat); + y = this.a * pj_mlfn(lat, s, c, this.en); + x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); + } + + p.x = x; + p.y = y; + return p; +} +function sinu_inverse(p) { + var lat, temp, lon, s; + p.x -= this.x0; + lon = p.x / this.a; + p.y -= this.y0; + lat = p.y / this.a; + + if (this.sphere) { + lat /= this.C_y; + lon = lon / (this.C_x * (this.m + Math.cos(lat))); + + if (this.m) { + lat = asinz((this.m * lat + Math.sin(lat)) / this.n); + } else if (this.n !== 1) { + lat = asinz(Math.sin(lat) / this.n); + } + + lon = adjust_lon(lon + this.long0); + lat = adjust_lat(lat); + } else { + lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); + s = Math.abs(lat); + + if (s < HALF_PI) { + s = Math.sin(lat); + temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); //temp = this.long0 + p.x / (this.a * Math.cos(lat)); + + lon = adjust_lon(temp); + } else if (s - EPSLN < HALF_PI) { + lon = this.long0; + } + } + + p.x = lon; + p.y = lat; + return p; +} +var sinu_names = ["Sinusoidal", "sinu"]; +/* harmony default export */ var sinu = ({ + init: sinu_init, + forward: sinu_forward, + inverse: sinu_inverse, + names: sinu_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/moll.js + +function moll_init() {} + +/* Mollweide forward equations--mapping lat,long to x,y + ----------------------------------------------------*/ + +function moll_forward(p) { + /* Forward equations + -----------------*/ + var lon = p.x; + var lat = p.y; + var delta_lon = adjust_lon(lon - this.long0); + var theta = lat; + var con = Math.PI * Math.sin(lat); + /* Iterate using the Newton-Raphson method to find theta + -----------------------------------------------------*/ + + while (true) { + var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); + theta += delta_theta; + + if (Math.abs(delta_theta) < EPSLN) { + break; + } + } + + theta /= 2; + /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" + this is done here because of precision problems with "cos(theta)" + --------------------------------------------------------------------------*/ + + if (Math.PI / 2 - Math.abs(lat) < EPSLN) { + delta_lon = 0; + } + + var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; + var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; + p.x = x; + p.y = y; + return p; +} +function moll_inverse(p) { + var theta; + var arg; + /* Inverse equations + -----------------*/ + + p.x -= this.x0; + p.y -= this.y0; + arg = p.y / (1.4142135623731 * this.a); + /* Because of division by zero problems, 'arg' can not be 1. Therefore + a number very close to one is used instead. + -------------------------------------------------------------------*/ + + if (Math.abs(arg) > 0.999999999999) { + arg = 0.999999999999; + } + + theta = Math.asin(arg); + var lon = adjust_lon(this.long0 + p.x / (0.900316316158 * this.a * Math.cos(theta))); + + if (lon < -Math.PI) { + lon = -Math.PI; + } + + if (lon > Math.PI) { + lon = Math.PI; + } + + arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; + + if (Math.abs(arg) > 1) { + arg = 1; + } + + var lat = Math.asin(arg); + p.x = lon; + p.y = lat; + return p; +} +var moll_names = ["Mollweide", "moll"]; +/* harmony default export */ var moll = ({ + init: moll_init, + forward: moll_forward, + inverse: moll_inverse, + names: moll_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/eqdc.js + + + + + + + + + + +function eqdc_init() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + // Standard Parallels cannot be equal and on opposite sides of the equator + if (Math.abs(this.lat1 + this.lat2) < EPSLN) { + return; + } + + this.lat2 = this.lat2 || this.lat1; + this.temp = this.b / this.a; + this.es = 1 - Math.pow(this.temp, 2); + this.e = Math.sqrt(this.es); + this.e0 = e0fn(this.es); + this.e1 = e1fn(this.es); + this.e2 = e2fn(this.es); + this.e3 = e3fn(this.es); + this.sinphi = Math.sin(this.lat1); + this.cosphi = Math.cos(this.lat1); + this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); + + if (Math.abs(this.lat1 - this.lat2) < EPSLN) { + this.ns = this.sinphi; + } else { + this.sinphi = Math.sin(this.lat2); + this.cosphi = Math.cos(this.lat2); + this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); + this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); + this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); + } + + this.g = this.ml1 + this.ms1 / this.ns; + this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + this.rh = this.a * (this.g - this.ml0); +} +/* Equidistant Conic forward equations--mapping lat,long to x,y + -----------------------------------------------------------*/ + +function eqdc_forward(p) { + var lon = p.x; + var lat = p.y; + var rh1; + /* Forward equations + -----------------*/ + + if (this.sphere) { + rh1 = this.a * (this.g - lat); + } else { + var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); + rh1 = this.a * (this.g - ml); + } + + var theta = this.ns * adjust_lon(lon - this.long0); + var x = this.x0 + rh1 * Math.sin(theta); + var y = this.y0 + this.rh - rh1 * Math.cos(theta); + p.x = x; + p.y = y; + return p; +} +/* Inverse equations + -----------------*/ + +function eqdc_inverse(p) { + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + var con, rh1, lat, lon; + + if (this.ns >= 0) { + rh1 = Math.sqrt(p.x * p.x + p.y * p.y); + con = 1; + } else { + rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); + con = -1; + } + + var theta = 0; + + if (rh1 !== 0) { + theta = Math.atan2(con * p.x, con * p.y); + } + + if (this.sphere) { + lon = adjust_lon(this.long0 + theta / this.ns); + lat = adjust_lat(this.g - rh1 / this.a); + p.x = lon; + p.y = lat; + return p; + } else { + var ml = this.g - rh1 / this.a; + lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); + lon = adjust_lon(this.long0 + theta / this.ns); + p.x = lon; + p.y = lat; + return p; + } +} +var eqdc_names = ["Equidistant_Conic", "eqdc"]; +/* harmony default export */ var eqdc = ({ + init: eqdc_init, + forward: eqdc_forward, + inverse: eqdc_inverse, + names: eqdc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/vandg.js + + + +/* Initialize the Van Der Grinten projection + ----------------------------------------*/ + +function vandg_init() { + //this.R = 6370997; //Radius of earth + this.R = this.a; +} +function vandg_forward(p) { + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + + var dlon = adjust_lon(lon - this.long0); + var x, y; + + if (Math.abs(lat) <= EPSLN) { + x = this.x0 + this.R * dlon; + y = this.y0; + } + + var theta = asinz(2 * Math.abs(lat / Math.PI)); + + if (Math.abs(dlon) <= EPSLN || Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { + x = this.x0; + + if (lat >= 0) { + y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); + } else { + y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); + } // return(OK); + + } + + var al = 0.5 * Math.abs(Math.PI / dlon - dlon / Math.PI); + var asq = al * al; + var sinth = Math.sin(theta); + var costh = Math.cos(theta); + var g = costh / (sinth + costh - 1); + var gsq = g * g; + var m = g * (2 / sinth - 1); + var msq = m * m; + var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); + + if (dlon < 0) { + con = -con; + } + + x = this.x0 + con; //con = Math.abs(con / (Math.PI * this.R)); + + var q = asq + g; + con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); + + if (lat >= 0) { + //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); + y = this.y0 + con; + } else { + //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); + y = this.y0 - con; + } + + p.x = x; + p.y = y; + return p; +} +/* Van Der Grinten inverse equations--mapping x,y to lat/long + ---------------------------------------------------------*/ + +function vandg_inverse(p) { + var lon, lat; + var xx, yy, xys, c1, c2, c3; + var a1; + var m1; + var con; + var th1; + var d; + /* inverse equations + -----------------*/ + + p.x -= this.x0; + p.y -= this.y0; + con = Math.PI * this.R; + xx = p.x / con; + yy = p.y / con; + xys = xx * xx + yy * yy; + c1 = -Math.abs(yy) * (1 + xys); + c2 = c1 - 2 * yy * yy + xx * xx; + c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; + d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; + a1 = (c1 - c2 * c2 / 3 / c3) / c3; + m1 = 2 * Math.sqrt(-a1 / 3); + con = 3 * d / a1 / m1; + + if (Math.abs(con) > 1) { + if (con >= 0) { + con = 1; + } else { + con = -1; + } + } + + th1 = Math.acos(con) / 3; + + if (p.y >= 0) { + lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } else { + lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; + } + + if (Math.abs(xx) < EPSLN) { + lon = this.long0; + } else { + lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); + } + + p.x = lon; + p.y = lat; + return p; +} +var vandg_names = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; +/* harmony default export */ var vandg = ({ + init: vandg_init, + forward: vandg_forward, + inverse: vandg_inverse, + names: vandg_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/aeqd.js + + + + + + + + + + +function aeqd_init() { + this.sin_p12 = Math.sin(this.lat0); + this.cos_p12 = Math.cos(this.lat0); +} +function aeqd_forward(p) { + var lon = p.x; + var lat = p.y; + var sinphi = Math.sin(p.y); + var cosphi = Math.cos(p.y); + var dlon = adjust_lon(lon - this.long0); + var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; + + if (this.sphere) { + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North Pole case + p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); + p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South Pole case + p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); + p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); + return p; + } else { + //default case + cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); + c = Math.acos(cos_c); + kp = c ? c / Math.sin(c) : 1; + p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); + p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); + return p; + } + } else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North Pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); + p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South Pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + Ml = this.a * mlfn(e0, e1, e2, e3, lat); + p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); + p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); + return p; + } else { + //Default case + tanphi = sinphi / cosphi; + Nl1 = gN(this.a, this.e, this.sin_p12); + Nl = gN(this.a, this.e, sinphi); + psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); + Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); + + if (Az === 0) { + s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { + s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); + } else { + s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); + } + + G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); + H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); + GH = G * H; + Hs = H * H; + s2 = s * s; + s3 = s2 * s; + s4 = s3 * s; + s5 = s4 * s; + c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); + p.x = this.x0 + c * Math.sin(Az); + p.y = this.y0 + c * Math.cos(Az); + return p; + } + } +} +function aeqd_inverse(p) { + p.x -= this.x0; + p.y -= this.y0; + var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi; + + if (this.sphere) { + rh = Math.sqrt(p.x * p.x + p.y * p.y); + + if (rh > 2 * HALF_PI * this.a) { + return; + } + + z = rh / this.a; + sinz = Math.sin(z); + cosz = Math.cos(z); + lon = this.long0; + + if (Math.abs(rh) <= EPSLN) { + lat = this.lat0; + } else { + lat = asinz(cosz * this.sin_p12 + p.y * sinz * this.cos_p12 / rh); + con = Math.abs(this.lat0) - HALF_PI; + + if (Math.abs(con) <= EPSLN) { + if (this.lat0 >= 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); + } else { + lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); + } + } else { + /*con = cosz - this.sin_p12 * Math.sin(lat); + if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { + //no-op, just keep the lon value as is + } else { + var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); + lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); + }*/ + lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); + } + } + + p.x = lon; + p.y = lat; + return p; + } else { + e0 = e0fn(this.es); + e1 = e1fn(this.es); + e2 = e2fn(this.es); + e3 = e3fn(this.es); + + if (Math.abs(this.sin_p12 - 1) <= EPSLN) { + //North pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = Mlp - rh; + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y)); + p.x = lon; + p.y = lat; + return p; + } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { + //South pole case + Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); + rh = Math.sqrt(p.x * p.x + p.y * p.y); + M = rh - Mlp; + lat = imlfn(M / this.a, e0, e1, e2, e3); + lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); + p.x = lon; + p.y = lat; + return p; + } else { + //default case + rh = Math.sqrt(p.x * p.x + p.y * p.y); + Az = Math.atan2(p.x, p.y); + N1 = gN(this.a, this.e, this.sin_p12); + cosAz = Math.cos(Az); + tmp = this.e * this.cos_p12 * cosAz; + A = -tmp * tmp / (1 - this.es); + B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); + D = rh / N1; + Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; + F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; + psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); + lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); + sinpsi = Math.sin(psi); + lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es)); + p.x = lon; + p.y = lat; + return p; + } + } +} +var aeqd_names = ["Azimuthal_Equidistant", "aeqd"]; +/* harmony default export */ var aeqd = ({ + init: aeqd_init, + forward: aeqd_forward, + inverse: aeqd_inverse, + names: aeqd_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/ortho.js + + + +function ortho_init() { + //double temp; /* temporary variable */ + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.sin_p14 = Math.sin(this.lat0); + this.cos_p14 = Math.cos(this.lat0); +} +/* Orthographic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + +function ortho_forward(p) { + var sinphi, cosphi; + /* sin and cos value */ + + var dlon; + /* delta longitude value */ + + var coslon; + /* cos of longitude */ + + var ksp; + /* scale factor */ + + var g, x, y; + var lon = p.x; + var lat = p.y; + /* Forward equations + -----------------*/ + + dlon = adjust_lon(lon - this.long0); + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1; + + if (g > 0 || Math.abs(g) <= EPSLN) { + x = this.a * ksp * cosphi * Math.sin(dlon); + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + } + + p.x = x; + p.y = y; + return p; +} +function ortho_inverse(p) { + var rh; + /* height above ellipsoid */ + + var z; + /* angle */ + + var sinz, cosz; + /* sin of z and cos of z */ + + var con; + var lon, lat; + /* Inverse equations + -----------------*/ + + p.x -= this.x0; + p.y -= this.y0; + rh = Math.sqrt(p.x * p.x + p.y * p.y); + z = asinz(rh / this.a); + sinz = Math.sin(z); + cosz = Math.cos(z); + lon = this.long0; + + if (Math.abs(rh) <= EPSLN) { + lat = this.lat0; + p.x = lon; + p.y = lat; + return p; + } + + lat = asinz(cosz * this.sin_p14 + p.y * sinz * this.cos_p14 / rh); + con = Math.abs(this.lat0) - HALF_PI; + + if (Math.abs(con) <= EPSLN) { + if (this.lat0 >= 0) { + lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); + } else { + lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); + } + + p.x = lon; + p.y = lat; + return p; + } + + lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz)); + p.x = lon; + p.y = lat; + return p; +} +var ortho_names = ["ortho"]; +/* harmony default export */ var ortho = ({ + init: ortho_init, + forward: ortho_forward, + inverse: ortho_inverse, + names: ortho_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/qsc.js +// QSC projection rewritten from the original PROJ4 +// https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c + +/* constants */ + +var FACE_ENUM = { + FRONT: 1, + RIGHT: 2, + BACK: 3, + LEFT: 4, + TOP: 5, + BOTTOM: 6 +}; +var AREA_ENUM = { + AREA_0: 1, + AREA_1: 2, + AREA_2: 3, + AREA_3: 4 +}; +function qsc_init() { + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.lat0 = this.lat0 || 0; + this.long0 = this.long0 || 0; + this.lat_ts = this.lat_ts || 0; + this.title = this.title || "Quadrilateralized Spherical Cube"; + /* Determine the cube face from the center of projection. */ + + if (this.lat0 >= HALF_PI - FORTPI / 2.0) { + this.face = FACE_ENUM.TOP; + } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) { + this.face = FACE_ENUM.BOTTOM; + } else if (Math.abs(this.long0) <= FORTPI) { + this.face = FACE_ENUM.FRONT; + } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) { + this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT; + } else { + this.face = FACE_ENUM.BACK; + } + /* Fill in useful values for the ellipsoid <-> sphere shift + * described in [LK12]. */ + + + if (this.es !== 0) { + this.one_minus_f = 1 - (this.a - this.b) / this.a; + this.one_minus_f_squared = this.one_minus_f * this.one_minus_f; + } +} // QSC forward equations--mapping lat,long to x,y +// ----------------------------------------------------------------- + +function qsc_forward(p) { + var xy = { + x: 0, + y: 0 + }; + var lat, lon; + var theta, phi; + var t, mu; + /* nu; */ + + var area = { + value: 0 + }; // move lon according to projection's lon + + p.x -= this.long0; + /* Convert the geodetic latitude to a geocentric latitude. + * This corresponds to the shift from the ellipsoid to the sphere + * described in [LK12]. */ + + if (this.es !== 0) { + //if (P->es != 0) { + lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y)); + } else { + lat = p.y; + } + /* Convert the input lat, lon into theta, phi as used by QSC. + * This depends on the cube face and the area on it. + * For the top and bottom face, we can compute theta and phi + * directly from phi, lam. For the other faces, we must use + * unit sphere cartesian coordinates as an intermediate step. */ + + + lon = p.x; //lon = lp.lam; + + if (this.face === FACE_ENUM.TOP) { + phi = HALF_PI - lat; + + if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_0; + theta = lon - HALF_PI; + } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_1; + theta = lon > 0.0 ? lon - SPI : lon + SPI; + } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) { + area.value = AREA_ENUM.AREA_2; + theta = lon + HALF_PI; + } else { + area.value = AREA_ENUM.AREA_3; + theta = lon; + } + } else if (this.face === FACE_ENUM.BOTTOM) { + phi = HALF_PI + lat; + + if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_0; + theta = -lon + HALF_PI; + } else if (lon < FORTPI && lon >= -FORTPI) { + area.value = AREA_ENUM.AREA_1; + theta = -lon; + } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_2; + theta = -lon - HALF_PI; + } else { + area.value = AREA_ENUM.AREA_3; + theta = lon > 0.0 ? -lon + SPI : -lon - SPI; + } + } else { + var q, r, s; + var sinlat, coslat; + var sinlon, coslon; + + if (this.face === FACE_ENUM.RIGHT) { + lon = qsc_shift_lon_origin(lon, +HALF_PI); + } else if (this.face === FACE_ENUM.BACK) { + lon = qsc_shift_lon_origin(lon, +SPI); + } else if (this.face === FACE_ENUM.LEFT) { + lon = qsc_shift_lon_origin(lon, -HALF_PI); + } + + sinlat = Math.sin(lat); + coslat = Math.cos(lat); + sinlon = Math.sin(lon); + coslon = Math.cos(lon); + q = coslat * coslon; + r = coslat * sinlon; + s = sinlat; + + if (this.face === FACE_ENUM.FRONT) { + phi = Math.acos(q); + theta = qsc_fwd_equat_face_theta(phi, s, r, area); + } else if (this.face === FACE_ENUM.RIGHT) { + phi = Math.acos(r); + theta = qsc_fwd_equat_face_theta(phi, s, -q, area); + } else if (this.face === FACE_ENUM.BACK) { + phi = Math.acos(-q); + theta = qsc_fwd_equat_face_theta(phi, s, -r, area); + } else if (this.face === FACE_ENUM.LEFT) { + phi = Math.acos(-r); + theta = qsc_fwd_equat_face_theta(phi, s, q, area); + } else { + /* Impossible */ + phi = theta = 0; + area.value = AREA_ENUM.AREA_0; + } + } + /* Compute mu and nu for the area of definition. + * For mu, see Eq. (3-21) in [OL76], but note the typos: + * compare with Eq. (3-14). For nu, see Eq. (3-38). */ + + + mu = Math.atan(12 / SPI * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI)); + t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta))))); + /* Apply the result to the real area. */ + + if (area.value === AREA_ENUM.AREA_1) { + mu += HALF_PI; + } else if (area.value === AREA_ENUM.AREA_2) { + mu += SPI; + } else if (area.value === AREA_ENUM.AREA_3) { + mu += 1.5 * SPI; + } + /* Now compute x, y from mu and nu */ + + + xy.x = t * Math.cos(mu); + xy.y = t * Math.sin(mu); + xy.x = xy.x * this.a + this.x0; + xy.y = xy.y * this.a + this.y0; + p.x = xy.x; + p.y = xy.y; + return p; +} // QSC inverse equations--mapping x,y to lat/long +// ----------------------------------------------------------------- + +function qsc_inverse(p) { + var lp = { + lam: 0, + phi: 0 + }; + var mu, nu, cosmu, tannu; + var tantheta, theta, cosphi, phi; + var t; + var area = { + value: 0 + }; + /* de-offset */ + + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + /* Convert the input x, y to the mu and nu angles as used by QSC. + * This depends on the area of the cube face. */ + + nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y)); + mu = Math.atan2(p.y, p.x); + + if (p.x >= 0.0 && p.x >= Math.abs(p.y)) { + area.value = AREA_ENUM.AREA_0; + } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) { + area.value = AREA_ENUM.AREA_1; + mu -= HALF_PI; + } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) { + area.value = AREA_ENUM.AREA_2; + mu = mu < 0.0 ? mu + SPI : mu - SPI; + } else { + area.value = AREA_ENUM.AREA_3; + mu += HALF_PI; + } + /* Compute phi and theta for the area of definition. + * The inverse projection is not described in the original paper, but some + * good hints can be found here (as of 2011-12-14): + * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302 + * (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */ + + + t = SPI / 12 * Math.tan(mu); + tantheta = Math.sin(t) / (Math.cos(t) - 1 / Math.sqrt(2)); + theta = Math.atan(tantheta); + cosmu = Math.cos(mu); + tannu = Math.tan(nu); + cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta)))); + + if (cosphi < -1) { + cosphi = -1; + } else if (cosphi > +1) { + cosphi = +1; + } + /* Apply the result to the real area on the cube face. + * For the top and bottom face, we can compute phi and lam directly. + * For the other faces, we must use unit sphere cartesian coordinates + * as an intermediate step. */ + + + if (this.face === FACE_ENUM.TOP) { + phi = Math.acos(cosphi); + lp.phi = HALF_PI - phi; + + if (area.value === AREA_ENUM.AREA_0) { + lp.lam = theta + HALF_PI; + } else if (area.value === AREA_ENUM.AREA_1) { + lp.lam = theta < 0.0 ? theta + SPI : theta - SPI; + } else if (area.value === AREA_ENUM.AREA_2) { + lp.lam = theta - HALF_PI; + } else + /* area.value == AREA_ENUM.AREA_3 */ + { + lp.lam = theta; + } + } else if (this.face === FACE_ENUM.BOTTOM) { + phi = Math.acos(cosphi); + lp.phi = phi - HALF_PI; + + if (area.value === AREA_ENUM.AREA_0) { + lp.lam = -theta + HALF_PI; + } else if (area.value === AREA_ENUM.AREA_1) { + lp.lam = -theta; + } else if (area.value === AREA_ENUM.AREA_2) { + lp.lam = -theta - HALF_PI; + } else + /* area.value == AREA_ENUM.AREA_3 */ + { + lp.lam = theta < 0.0 ? -theta - SPI : -theta + SPI; + } + } else { + /* Compute phi and lam via cartesian unit sphere coordinates. */ + var q, r, s; + q = cosphi; + t = q * q; + + if (t >= 1) { + s = 0; + } else { + s = Math.sqrt(1 - t) * Math.sin(theta); + } + + t += s * s; + + if (t >= 1) { + r = 0; + } else { + r = Math.sqrt(1 - t); + } + /* Rotate q,r,s into the correct area. */ + + + if (area.value === AREA_ENUM.AREA_1) { + t = r; + r = -s; + s = t; + } else if (area.value === AREA_ENUM.AREA_2) { + r = -r; + s = -s; + } else if (area.value === AREA_ENUM.AREA_3) { + t = r; + r = s; + s = -t; + } + /* Rotate q,r,s into the correct cube face. */ + + + if (this.face === FACE_ENUM.RIGHT) { + t = q; + q = -r; + r = t; + } else if (this.face === FACE_ENUM.BACK) { + q = -q; + r = -r; + } else if (this.face === FACE_ENUM.LEFT) { + t = q; + q = r; + r = -t; + } + /* Now compute phi and lam from the unit sphere coordinates. */ + + + lp.phi = Math.acos(-s) - HALF_PI; + lp.lam = Math.atan2(r, q); + + if (this.face === FACE_ENUM.RIGHT) { + lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI); + } else if (this.face === FACE_ENUM.BACK) { + lp.lam = qsc_shift_lon_origin(lp.lam, -SPI); + } else if (this.face === FACE_ENUM.LEFT) { + lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI); + } + } + /* Apply the shift from the sphere to the ellipsoid as described + * in [LK12]. */ + + + if (this.es !== 0) { + var invert_sign; + var tanphi, xa; + invert_sign = lp.phi < 0 ? 1 : 0; + tanphi = Math.tan(lp.phi); + xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared); + lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa)); + + if (invert_sign) { + lp.phi = -lp.phi; + } + } + + lp.lam += this.long0; + p.x = lp.lam; + p.y = lp.phi; + return p; +} +/* Helper function for forward projection: compute the theta angle + * and determine the area number. */ + +function qsc_fwd_equat_face_theta(phi, y, x, area) { + var theta; + + if (phi < EPSLN) { + area.value = AREA_ENUM.AREA_0; + theta = 0.0; + } else { + theta = Math.atan2(y, x); + + if (Math.abs(theta) <= FORTPI) { + area.value = AREA_ENUM.AREA_0; + } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) { + area.value = AREA_ENUM.AREA_1; + theta -= HALF_PI; + } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) { + area.value = AREA_ENUM.AREA_2; + theta = theta >= 0.0 ? theta - SPI : theta + SPI; + } else { + area.value = AREA_ENUM.AREA_3; + theta += HALF_PI; + } + } + + return theta; +} +/* Helper function: shift the longitude. */ + + +function qsc_shift_lon_origin(lon, offset) { + var slon = lon + offset; + + if (slon < -SPI) { + slon += TWO_PI; + } else if (slon > +SPI) { + slon -= TWO_PI; + } + + return slon; +} + +var qsc_names = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"]; +/* harmony default export */ var qsc = ({ + init: qsc_init, + forward: qsc_forward, + inverse: qsc_inverse, + names: qsc_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/robin.js +// Robinson projection +// Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c +// Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039 + + +var COEFS_X = [[1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06], [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06], [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07], [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06], [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06], [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08], [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06], [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06], [0.9216, -0.00467746, -0.00010457, 4.81243e-06], [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06], [0.8679, -0.00609363, -0.000113898, 3.32484e-06], [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07], [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07], [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06], [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06], [0.6732, -0.00986209, -0.000199569, 1.91974e-05], [0.6213, -0.010418, 8.83923e-05, 6.24051e-06], [0.5722, -0.00906601, 0.000182, 6.24051e-06], [0.5322, -0.00677797, 0.000275608, 6.24051e-06]]; +var COEFS_Y = [[-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11], [0.0620, 0.0124, -1.26793e-09, 4.22642e-10], [0.1240, 0.0124, 5.07171e-09, -1.60604e-09], [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09], [0.2480, 0.0124002, 7.10039e-08, -2.24e-08], [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08], [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07], [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07], [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07], [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07], [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07], [0.6769, 0.011713, -3.20223e-05, -5.16405e-07], [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07], [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06], [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09], [0.8936, 0.00969686, -6.4636e-05, -8.547e-06], [0.9394, 0.00840947, -0.000192841, -4.2106e-06], [0.9761, 0.00616527, -0.000256, -4.2106e-06], [1.0000, 0.00328947, -0.000319159, -4.2106e-06]]; +var FXC = 0.8487; +var FYC = 1.3523; +var C1 = R2D / 5; // rad to 5-degree interval + +var RC1 = 1 / C1; +var NODES = 18; + +var poly3_val = function poly3_val(coefs, x) { + return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3])); +}; + +var poly3_der = function poly3_der(coefs, x) { + return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]); +}; + +function newton_rapshon(f_df, start, max_err, iters) { + var x = start; + + for (; iters; --iters) { + var upd = f_df(x); + x -= upd; + + if (Math.abs(upd) < max_err) { + break; + } + } + + return x; +} + +function robin_init() { + this.x0 = this.x0 || 0; + this.y0 = this.y0 || 0; + this.long0 = this.long0 || 0; + this.es = 0; + this.title = this.title || "Robinson"; +} +function robin_forward(ll) { + var lon = adjust_lon(ll.x - this.long0); + var dphi = Math.abs(ll.y); + var i = Math.floor(dphi * C1); + + if (i < 0) { + i = 0; + } else if (i >= NODES) { + i = NODES - 1; + } + + dphi = R2D * (dphi - RC1 * i); + var xy = { + x: poly3_val(COEFS_X[i], dphi) * lon, + y: poly3_val(COEFS_Y[i], dphi) + }; + + if (ll.y < 0) { + xy.y = -xy.y; + } + + xy.x = xy.x * this.a * FXC + this.x0; + xy.y = xy.y * this.a * FYC + this.y0; + return xy; +} +function robin_inverse(xy) { + var ll = { + x: (xy.x - this.x0) / (this.a * FXC), + y: Math.abs(xy.y - this.y0) / (this.a * FYC) + }; + + if (ll.y >= 1) { + // pathologic case + ll.x /= COEFS_X[NODES][0]; + ll.y = xy.y < 0 ? -HALF_PI : HALF_PI; + } else { + // find table interval + var i = Math.floor(ll.y * NODES); + + if (i < 0) { + i = 0; + } else if (i >= NODES) { + i = NODES - 1; + } + + for (;;) { + if (COEFS_Y[i][0] > ll.y) { + --i; + } else if (COEFS_Y[i + 1][0] <= ll.y) { + ++i; + } else { + break; + } + } // linear interpolation in 5 degree interval + + + var coefs = COEFS_Y[i]; + var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i + 1][0] - coefs[0]); // find t so that poly3_val(coefs, t) = ll.y + + t = newton_rapshon(function (x) { + return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x); + }, t, EPSLN, 100); + ll.x /= poly3_val(COEFS_X[i], t); + ll.y = (5 * i + t) * D2R; + + if (xy.y < 0) { + ll.y = -ll.y; + } + } + + ll.x = adjust_lon(ll.x + this.long0); + return ll; +} +var robin_names = ["Robinson", "robin"]; +/* harmony default export */ var robin = ({ + init: robin_init, + forward: robin_forward, + inverse: robin_inverse, + names: robin_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/geocent.js + +function geocent_init() { + this.name = 'geocent'; +} +function geocent_forward(p) { + var point = geodeticToGeocentric(p, this.es, this.a); + return point; +} +function geocent_inverse(p) { + var point = geocentricToGeodetic(p, this.es, this.a, this.b); + return point; +} +var geocent_names = ["Geocentric", 'geocentric', "geocent", "Geocent"]; +/* harmony default export */ var geocent = ({ + init: geocent_init, + forward: geocent_forward, + inverse: geocent_inverse, + names: geocent_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/lib/projections/tpers.js +var mode = { + N_POLE: 0, + S_POLE: 1, + EQUIT: 2, + OBLIQ: 3 +}; + + +var params = { + h: { + def: 100000, + num: true + }, + // default is Karman line, no default in PROJ.7 + azi: { + def: 0, + num: true, + degrees: true + }, + // default is North + tilt: { + def: 0, + num: true, + degrees: true + }, + // default is Nadir + long0: { + def: 0, + num: true + }, + // default is Greenwich, conversion to rad is automatic + lat0: { + def: 0, + num: true + } // default is Equator, conversion to rad is automatic + +}; +function tpers_init() { + Object.keys(params).forEach(function (p) { + if (typeof this[p] === "undefined") { + this[p] = params[p].def; + } else if (params[p].num && isNaN(this[p])) { + throw new Error("Invalid parameter value, must be numeric " + p + " = " + this[p]); + } else if (params[p].num) { + this[p] = parseFloat(this[p]); + } + + if (params[p].degrees) { + this[p] = this[p] * D2R; + } + }.bind(this)); + + if (Math.abs(Math.abs(this.lat0) - HALF_PI) < EPSLN) { + this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE; + } else if (Math.abs(this.lat0) < EPSLN) { + this.mode = mode.EQUIT; + } else { + this.mode = mode.OBLIQ; + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + + this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius + + if (this.pn1 <= 0 || this.pn1 > 1e10) { + throw new Error("Invalid height"); + } + + this.p = 1 + this.pn1; + this.rp = 1 / this.p; + this.h1 = 1 / this.pn1; + this.pfact = (this.p + 1) * this.h1; + this.es = 0; + var omega = this.tilt; + var gamma = this.azi; + this.cg = Math.cos(gamma); + this.sg = Math.sin(gamma); + this.cw = Math.cos(omega); + this.sw = Math.sin(omega); +} +function tpers_forward(p) { + p.x -= this.long0; + var sinphi = Math.sin(p.y); + var cosphi = Math.cos(p.y); + var coslam = Math.cos(p.x); + var x, y; + + switch (this.mode) { + case mode.OBLIQ: + y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + break; + + case mode.EQUIT: + y = cosphi * coslam; + break; + + case mode.S_POLE: + y = -sinphi; + break; + + case mode.N_POLE: + y = sinphi; + break; + } + + y = this.pn1 / (this.p - y); + x = y * cosphi * Math.sin(p.x); + + switch (this.mode) { + case mode.OBLIQ: + y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + break; + + case mode.EQUIT: + y *= sinphi; + break; + + case mode.N_POLE: + y *= -(cosphi * coslam); + break; + + case mode.S_POLE: + y *= cosphi * coslam; + break; + } // Tilt + + + var yt, ba; + yt = y * this.cg + x * this.sg; + ba = 1 / (yt * this.sw * this.h1 + this.cw); + x = (x * this.cg - y * this.sg) * this.cw * ba; + y = yt * ba; + p.x = x * this.a; + p.y = y * this.a; + return p; +} +function tpers_inverse(p) { + p.x /= this.a; + p.y /= this.a; + var r = { + x: p.x, + y: p.y + }; // Un-Tilt + + var bm, bq, yt; + yt = 1 / (this.pn1 - p.y * this.sw); + bm = this.pn1 * p.x * yt; + bq = this.pn1 * p.y * this.cw * yt; + p.x = bm * this.cg + bq * this.sg; + p.y = bq * this.cg - bm * this.sg; + var rh = hypot(p.x, p.y); + + if (Math.abs(rh) < EPSLN) { + r.x = 0; + r.y = p.y; + } else { + var cosz, sinz; + sinz = 1 - rh * rh * this.pfact; + sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1); + cosz = Math.sqrt(1 - sinz * sinz); + + switch (this.mode) { + case mode.OBLIQ: + r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh); + p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh; + p.x *= sinz * this.cosph0; + break; + + case mode.EQUIT: + r.y = Math.asin(p.y * sinz / rh); + p.y = cosz * rh; + p.x *= sinz; + break; + + case mode.N_POLE: + r.y = Math.asin(cosz); + p.y = -p.y; + break; + + case mode.S_POLE: + r.y = -Math.asin(cosz); + break; + } + + r.x = Math.atan2(p.x, p.y); + } + + p.x = r.x + this.long0; + p.y = r.y; + return p; +} +var tpers_names = ["Tilted_Perspective", "tpers"]; +/* harmony default export */ var tpers = ({ + init: tpers_init, + forward: tpers_forward, + inverse: tpers_inverse, + names: tpers_names +}); +;// CONCATENATED MODULE: ./node_modules/proj4/projs.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* harmony default export */ function proj4_projs(proj4) { + proj4.Proj.projections.add(tmerc); + proj4.Proj.projections.add(etmerc); + proj4.Proj.projections.add(utm); + proj4.Proj.projections.add(sterea); + proj4.Proj.projections.add(stere); + proj4.Proj.projections.add(somerc); + proj4.Proj.projections.add(omerc); + proj4.Proj.projections.add(lcc); + proj4.Proj.projections.add(krovak); + proj4.Proj.projections.add(cass); + proj4.Proj.projections.add(laea); + proj4.Proj.projections.add(aea); + proj4.Proj.projections.add(gnom); + proj4.Proj.projections.add(cea); + proj4.Proj.projections.add(eqc); + proj4.Proj.projections.add(poly); + proj4.Proj.projections.add(nzmg); + proj4.Proj.projections.add(mill); + proj4.Proj.projections.add(sinu); + proj4.Proj.projections.add(moll); + proj4.Proj.projections.add(eqdc); + proj4.Proj.projections.add(vandg); + proj4.Proj.projections.add(aeqd); + proj4.Proj.projections.add(ortho); + proj4.Proj.projections.add(qsc); + proj4.Proj.projections.add(robin); + proj4.Proj.projections.add(geocent); + proj4.Proj.projections.add(tpers); +} +;// CONCATENATED MODULE: ./node_modules/proj4/lib/index.js + + + + + + + + + +core.defaultDatum = 'WGS84'; //default datum + +core.Proj = Proj; +core.WGS84 = new core.Proj('WGS84'); +core.Point = lib_Point; +core.toPoint = toPoint; +core.defs = lib_defs; +core.nadgrid = nadgrid; +core.transform = transform; +core.mgrs = mgrs; +core.version = '__VERSION__'; +proj4_projs(core); +/* harmony default export */ var lib = (core); +;// CONCATENATED MODULE: ./src/leaflet/core/Proj4Leaflet.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * Inspired by https://github.com/kartena/Proj4Leaflet + */ + + +window.proj4 = lib; +window.Proj4js = lib; +(external_L_default()).Proj = (external_L_default()).Proj || {}; + +(external_L_default()).Proj._isProj4Obj = function (a) { + return typeof a.inverse !== 'undefined' && typeof a.forward !== 'undefined'; +}; +/** + * @class L.Proj.Projection + * @private + * @classdesc Proj 投影定义类。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {string} code - proj srsCode + * @param {string} def - 投影的 proj4 定义。{@link [详细]{https://iclient.supermap.io/web/introduction/leafletDevelop.html#projection}} + * @param {L.Bounds} bounds - 投影范围参数 + */ + + +(external_L_default()).Proj.Projection = external_L_default().Class.extend({ + initialize: function initialize(code, def, bounds, wrapLng) { + var isP4 = external_L_default().Proj._isProj4Obj(code); + + this._proj = isP4 ? code : this._projFromCodeDef(code, def); + var boundsOption = bounds; + + if (external_L_default().Util.isArray(bounds)) { + boundsOption = external_L_default().bounds(bounds); + } + + this.bounds = isP4 ? def : boundsOption; + this.wrapLng = wrapLng; + }, + + /** + * @function L.Proj.Projection.prototype.project + * @description 通过地理坐标得到投影坐标。 + * @param {L.Latlng} latlng - 经纬度坐标。 + * @returns {L.Point} 返回投影坐标点。 + */ + project: function project(latlng) { + var point = this._proj.forward([latlng.lng, latlng.lat]); + + return new (external_L_default()).Point(point[0], point[1]); + }, + + /** + * @function L.Proj.Projection.prototype.unproject + * @description 通过投影坐标得到地理坐标。 + * @param {L.Point} point - 坐标点。 + * @param {number} unbounded - 坐标点高程值等。 + * @returns {L.LatLng} 返回经纬度坐标 + */ + unproject: function unproject(point, zoom) { + if (this.bounds && !this.wrapLng) { + point.x = point.x < this.bounds.min.x ? this.bounds.min.x : point.x > this.bounds.max.x ? this.bounds.max.x : point.x; + point.y = point.y < this.bounds.min.y ? this.bounds.min.y : point.y > this.bounds.max.y ? this.bounds.max.y : point.y; + } + + var point2 = this._proj.inverse([point.x, point.y]); + + return new (external_L_default()).LatLng(point2[1], point2[0], zoom); + }, + _projFromCodeDef: function _projFromCodeDef(code, def) { + if (def) { + lib.defs(code, def); + } else if (lib.defs[code] === undefined) { + var urn = code.split(':'); + + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + + if (lib.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + + return lib(code); + }, + getUnits: function getUnits() { + return this._proj.oProj.units || 'degrees'; + } +}); +/** + * @class CRS + * @aliasclass Proj.CRS + * @deprecatedclass L.Proj.CRS + * @deprecatedclassinstance L.supermap.Proj.crs + * @classdesc 基于 Proj4 坐标系统扩展类。 + * 为计算级别,`options.scales` `options.scaleDenominators` `options.resolutions` `options.bounds` 必须指定一个,先后顺序已按优先级排列。 + * 当指定`options.bounds` 时,第 0 级为一张 256 切片包含整个 bounds,即`Math.max(bounds.getSize().x, bounds.getSize().y)/256` 。 + * 为保证切片行列号正确,`options.origin` `options.bounds` 必须指定一个。 + * 当指定`options.bounds` 时,切片原点为 bounds 的左上角。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {string} srsCode - proj srsCode。 + * @param {Object} options - 参数。 + * @param {string} options.def - 投影的proj4定义。[详细]{@link https://iclient.supermap.io/web/introduction/leafletDevelop.html#multiProjection} + * @param {(Array.|L.Point)} [options.origin] - 原点。 + * @param {Array.} [options.scales] - 比例尺数组。 + * @param {Array.} [options.scaleDenominators] - 比例尺分母数组。 + * @param {Array.} [options.resolutions] - 分辨率数组。 + * @param {(Array.|L.Bounds)} [options.bounds] - 范围。 + * @param {number} [options.dpi=96] - dpi。 + * @param {number} [options.wrapLng] - 定义经度(水平)坐标轴是否在给定范围内环绕。大多数情况下默认为[-180,180]。 + * @example + * var crs =new CRS("EPSG:4326",{ + * origin: [-180,90], + * scaleDenominators: [2000,1000,500,200,100,50,20,10], + * }); + * var map=L.map('map', { + * crs: crs + * ... + * }) + * @usage + */ + +var CRS = external_L_default().Class.extend({ + includes: (external_L_default()).CRS, + options: { + transformation: new (external_L_default()).Transformation(1, 0, -1, 0) + }, + initialize: function initialize(srsCode, options) { + var code, proj, def; + + if (external_L_default().Proj._isProj4Obj(srsCode)) { + proj = srsCode; + code = proj.srsCode; + options = options || {}; + this.projection = new (external_L_default()).Proj.Projection(proj, options.bounds, options.wrapLng); + } else { + code = srsCode; + options = options || {}; + def = options.def || ''; + this.projection = new (external_L_default()).Proj.Projection(code, def, options.bounds, options.wrapLng); + } + + external_L_default().Util.setOptions(this, options); + + if (this.options.wrapLng) { + this.wrapLng = this.options.wrapLng; + } + + this.code = code; + this.transformation = this.options.transformation; + this.options.dpi = this.options.dpi || 96; + + if (this.options.bounds) { + this.options.bounds = external_L_default().bounds(this.options.bounds); + } + + if (!this.options.origin && this.options.bounds) { + this.options.origin = [this.options.bounds.min.x, this.options.bounds.max.y]; + } + + if (this.options.origin) { + if (this.options.origin instanceof (external_L_default()).Point) { + this.options.origin = [this.options.origin.x, this.options.origin.y]; + } + + this.transformation = new (external_L_default()).Transformation(1, -this.options.origin[0], -1, this.options.origin[1]); + } + + if (this.options.scales && this.options.scales.length > 0) { + this.scales = this.options.scales; + this._scales = this._toProj4Scales(this.options.scales, this.options.dpi); + } else if (this.options.scaleDenominators && this.options.scaleDenominators.length > 0) { + this.scales = []; + + for (var i = 0; i < this.options.scaleDenominators.length; i++) { + this.scales[i] = 1 / this.options.scaleDenominators[i]; + } + + this._scales = this._toProj4Scales(this.scales, this.options.dpi); + } else if (this.options.resolutions && this.options.resolutions.length > 0) { + this._scales = []; + + for (var _i = this.options.resolutions.length - 1; _i >= 0; _i--) { + if (this.options.resolutions[_i]) { + this._scales[_i] = 1 / this.options.resolutions[_i]; + } + } + } else if (this.options.bounds) { + this._scales = this._getDefaultProj4ScalesByBounds(this.options.bounds); + } + + this._rectify(); + + this.infinite = !this.options.bounds; + }, + _rectify: function _rectify() { + if (this._scales) { + if (!this.resolutions) { + this.resolutions = []; + this.resolutions = this._proj4ScalesToResolutions(this._scales); + } + + if (!this.scales) { + this.scales = []; + + for (var i = 0; i < this.resolutions.length; i++) { + var scaleD = this.resolutions[i] * this.options.dpi * (1 / 0.0254) * this._getMeterPerMapUnit(this.projection.getUnits()); + + this.scales[i] = 1.0 / scaleD; + } + } + } + }, + + /** + * @function CRS.prototype.scale + * @description 通过缩放级别获取比例尺值。 + * @param {number} zoom - 缩放级别。 + * @returns 比例尺值。 + */ + scale: function scale(zoom) { + var iZoom = Math.floor(zoom), + baseScale, + nextScale, + scaleDiff, + zDiff; + + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + // Non-integer zoom, interpolate + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = zoom - iZoom; + return baseScale + scaleDiff * zDiff; + } + }, + + /** + * @function CRS.prototype.zoom + * @description 根据比例尺返回缩放级别。 + * @param {number} scale - 比例尺。 + * @returns {number} 缩放级别。 + */ + zoom: function zoom(scale) { + // Find closest number in this._scales, down + var downScale = this._closestElement(this._scales, scale), + downZoom = this._scales.indexOf(downScale), + nextScale, + nextZoom, + scaleDiff; // Check if scale is downScale => return array index + + + if (!downScale) { + return 0; + } + + if (scale === downScale) { + return downZoom; + } // Interpolate + + + nextZoom = downZoom + 1; + nextScale = this._scales[nextZoom]; + + if (nextScale === undefined) { + return downZoom; + } + + scaleDiff = nextScale - downScale; + return (scale - downScale) / scaleDiff + downZoom; + }, + distance: (external_L_default()).CRS.Earth.distance, + R: (external_L_default()).CRS.Earth.R, + + /* Get the closest lowest element in an array */ + _closestElement: function _closestElement(array, element) { + var low; + + for (var i = array.length; i--;) { + if (array[i] <= element && (low === undefined || low < array[i])) { + low = array[i]; + } + } + + return low; + }, + _proj4ScalesToResolutions: function _proj4ScalesToResolutions(_scales) { + var resolutions = []; + + if (!_scales) { + return resolutions; + } + + for (var i = 0; i < _scales.length; i++) { + resolutions[i] = 1.0 / _scales[i]; + } + + return resolutions; + }, + _toProj4Scales: function _toProj4Scales(scales, dpi) { + var proj4Scales = []; + + if (!scales) { + return proj4Scales; + } + + for (var i = 0; i < scales.length; i++) { + var a = this.projection ? this._getMeterPerMapUnit(this.projection.getUnits()) : 1; + proj4Scales[i] = 1 / (0.0254 / ((dpi || 96) * scales[i]) / a); + } + + return proj4Scales; + }, + _getMeterPerMapUnit: function _getMeterPerMapUnit(mapUnit) { + var earchRadiusInMeters = 6378137; + var meterPerMapUnit = 1; + + if (mapUnit === 'meter') { + meterPerMapUnit = 1; + } else if (mapUnit === 'degrees') { + // 每度表示多少米。 + meterPerMapUnit = Math.PI * 2 * earchRadiusInMeters / 360; + } else if (mapUnit === 'kilometer') { + meterPerMapUnit = 1.0e-3; + } else if (mapUnit === 'inch') { + meterPerMapUnit = 1 / 2.5399999918e-2; + } else if (mapUnit === 'feet') { + meterPerMapUnit = 0.3048; + } + + return meterPerMapUnit; + }, + _getDefaultProj4ScalesByBounds: function _getDefaultProj4ScalesByBounds(bounds) { + if (!bounds) { + return []; + } + + var boundsSize = bounds.getSize(); + var extendsSize = Math.max(boundsSize.x, boundsSize.y); + var resolution = extendsSize / 256; + var scales = []; + var maxZoom = 23; + + for (var i = 0; i < maxZoom; i++) { + scales[i] = Math.pow(2, i) / resolution; + } + + return scales; + } +}); +var crs = function crs(srsCode, options) { + return new CRS(srsCode, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/core/Attributions.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @enum attribution + * @description 版权相关配置。 + * @type {string} + * @private + */ +var Attributions = { + Prefix: "Leaflet\n with \xA9 SuperMap iClient", + Common: { + attribution: "Map Data \xA9 SuperMap iServer" + }, + Online: { + attribution: "Map Data \xA9 SuperMap Online" + }, + ECharts: { + attribution: "\xA9 2018 \u767E\u5EA6 ECharts" + }, + MapV: { + attribution: "\xA9 2018 \u767E\u5EA6 MapV " + }, + Turf: { + attribution: "\xA9 turfjs" + }, + Baidu: { + attribution: "Map Data \xA9 2018 Baidu - GS(2016)2089\u53F7 - Data \xA9 \u957F\u5730\u4E07\u65B9" + }, + Cloud: { + attribution: "Map Data \xA92014 SuperMap - GS(2014)6070\u53F7-data\xA9Navinfo" + }, + Tianditu: { + attribution: "Map Data " + } +}; +/* harmony default export */ var core_Attributions = (Attributions); +;// CONCATENATED MODULE: ./src/leaflet/core/Base.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +external_L_default().Control.Attribution.include({ + options: { + position: 'bottomright', + prefix: core_Attributions.Prefix + } +}); +external_L_default().Map.include({ + /* + * 获取精确的像素坐标. + * 当需要绘制比较平滑的曲线的时候可调用此方法代替latLngToContainerPoint + * @param latlng + */ + latLngToAccurateContainerPoint: function latLngToAccurateContainerPoint(latlng) { + var projectedPoint = this.project(external_L_default().latLng(latlng)); + + var layerPoint = projectedPoint._subtract(this.getPixelOrigin()); + + return external_L_default().point(layerPoint).add(this._getMapPanePos()); + } +}); +wrapToGeoJSON([(external_L_default()).Polyline, (external_L_default()).Polygon, (external_L_default()).Marker, (external_L_default()).CircleMarker, (external_L_default()).Circle, (external_L_default()).LayerGroup]); + +function wrapToGeoJSON(objClassArray) { + objClassArray.map(function (objClass) { + objClass.defaultFunction = objClass.prototype.toGeoJSON; + objClass.include({ + toGeoJSON: function toGeoJSON(precision) { + return objClass.defaultFunction.call(this, precision || 10); + } + }); + return objClass; + }); +} +;// CONCATENATED MODULE: ./src/leaflet/services/ServiceBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ServiceBase + * @classdesc L.supermap 服务基类。 + * @category iServer Core + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @fires ServiceBase#initialized + * @fires ServiceBase#destroy + * @extends {L.Evented} + * @usage + */ + +var ServiceBase = external_L_default().Evented.extend({ + options: { + url: null, + proxy: null, + withCredentials: false, + crossOrigin: null + }, + initialize: function initialize(url, options) { + if (url) { + url = url.indexOf("/") !== url.length - 1 ? url : url.substr(0, url.length - 1); + } + + this.url = url; + external_L_default().setOptions(this, options); + /** + * @event ServiceBase#initialized + * @description 构造函数构造成功后触发。 + * @property {ServiceBase} this - this 对象。 + */ + + this.fire("initialized", this); + }, + + /** + * @function ServiceBase.prototype.destroy + * @description 释放资源,将引用的资源属性置空。 + */ + destroy: function destroy() { + /** + * @event ServiceBase#destroy + * @description 资源释放成功后触发。 + * @property {ServiceBase} this - this 对象。 + */ + this.fire("destroy", this); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/services/MapService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class MapService + * @deprecatedclassinstance L.supermap.mapService + * @classdesc 地图信息服务类。 + * @category iServer Map + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * new MapService(url) + * .getMapInfo(function(result){ + * //doSomething + * }) + * @usage + */ + +var MapService_MapService = ServiceBase.extend({ + options: { + projection: null + }, + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + + if (options.projection) { + this.options.projection = options.projection; + } + + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function MapService.prototype.getMapInfo + * @description 获取地图信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getMapInfo: function getMapInfo(callback) { + var me = this; + var getMapStatusService = new MapService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + projection: me.options.projection + }); + getMapStatusService.processAsync(); + }, + + /** + * @function MapService.prototype.getTilesets + * @description 获取切片列表信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTilesets: function getTilesets(callback) { + var me = this; + var tilesetsService = new TilesetsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + tilesetsService.processAsync(); + } +}); +var mapService = function mapService(url, options) { + return new MapService_MapService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/control/ChangeTileVersion.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ChangeTileVersion + * @aliasclass control.ChangeTileVersion + * @deprecatedclassinstance L.supermap.control.changeTileVersion + * @classdesc 版本切换控件,支持 IE10 及以上。 + * @category Control + * @extends {L.Control} + * @example + * new ChangeTileVersion({ + * layer: baseLayer, + * position: "topleft", + * orientation: "horizontal" + * }).addTo(map); + * @param {Object} options - 参数。 + * @param {L.Layer} options.layer - Leaflet Layer 对象。 + * @param {string} [options.position='topleft'] - 控件位置继承自 Leaflet control。 + * @param {string} [options.title='switch tile version'] - 鼠标滑过时提示。 + * @param {string} [options.tooltip='top'] - tooltip 提示显示位置 top | right | bottom | left。 + * @param {boolean} [options.collapsed=true] - 是否折叠。 + * @param {string} [options.nextText='+'] - 下一个版本的按钮布局。 + * @param {string} [options.lastText='-'] - 上一个版本的按钮布局。 + * @param {string} [options.ico='v'] - 控件显示的 logo。 + * @param {string} [options.orientation='horizontal'] - 方向 horizontal|vertical。 + * @param {boolean} [options.switch=true] - 是否显示上/下一个版本切换控件。 + * @usage + */ + +var ChangeTileVersion = external_L_default().Control.extend({ + options: { + //绑定的底图图层 + layer: null, + //控件位置 继承自leaflet control + position: 'topleft', + //鼠标滑过时提示 + title: 'switch tile version', + //tooltip提示显示位置 top | right | bottom | left + tooltip: "top", + //是否折叠 + collapsed: true, + //下一个版本的按钮布局 + nextText: "+", + //上一个版本的按钮布局 + lastText: "-", + //控件显示的logo + ico: 'V', + //方向horizontal|vertical + orientation: 'horizontal', + //是否显示上/下一个版本切换控件 + "switch": true + }, + + /** + * @private + * @function ChangeTileVersion.prototype.onAdd + * @description 添加控件。 + */ + onAdd: function onAdd() { + if (this.options.orientation !== 'vertical') { + this.options.orientation = 'horizontal'; + } + + var layout = this._initLayout(); + + if (this.options.layer) { + this.setLayer(this.options.layer); + } + + return layout; + }, + + /** + * @function ChangeTileVersion.prototype.setContent + * @description 设置版本信息。 + * @param {Object} version - 版本信息。 + */ + setContent: function setContent(version) { + var content = external_L_default().Util.extend({}, version); + this.setVersionName(content.desc).setToolTip(content.desc); + }, + + /** + * @function ChangeTileVersion.prototype.setVersionName + * @description 设置版本号。 + * @param {string} content - 版本信息。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + setVersionName: function setVersionName(content) { + var value = content; + + if (!content) { + value = this.getValue(); + } + + this._sliderValue.innerHTML = value; + return this; + }, + + /** + * @function ChangeTileVersion.prototype.setToolTip + * @description 设置提示信息。 + * @param {(HTMLElement|string)} tooltip - 提示信息。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + setToolTip: function setToolTip(tooltip) { + this.tooltip.innerHTML = tooltip; + return this; + }, + + /** + * @function ChangeTileVersion.prototype.updateLength + * @description 更新进度条长度。 + * @param {number} length - 进度长度参数。 + */ + updateLength: function updateLength(length) { + if (length > 0) { + this.length = length; + this.max = this.length - 1; + this.slider.setAttribute("max", this.max); + } + }, + + /** + * @function ChangeTileVersion.prototype.setLayer + * @description 设置需要绑定的图层。 + * @param {TiledMapLayer} layer - 绑定的图层。 + */ + setLayer: function setLayer(layer) { + if (layer) { + this.options.layer = layer; + } + + var me = this; + var tileLayer = me.options.layer; + tileLayer.on("tilesetsinfoloaded", function (result) { + var tileVersions = result && result.tileVersions; + me.update(tileVersions); + }); + tileLayer.on("tileversionschanged", function (result) { + var tileVersions = result && result.tileVersion; + me.setContent(tileVersions); + }); + me.getTileSetsInfo(); + }, + + /** + * @function ChangeTileVersion.prototype.update + * @description 更新缓存切片集和进度条长度。 + * @param {number} tileVersions - 待更新的切片版本号。 + */ + update: function update(tileVersions) { + this.tileVersions = tileVersions || []; + this.updateLength(this.tileVersions.length); + }, + + /** + * @function ChangeTileVersion.prototype.getTileSetsInfo + * @description 获取切片集信息。 + */ + getTileSetsInfo: function getTileSetsInfo() { + var me = this; + + if (me.options.layer) { + new MapService_MapService(me.options.layer._url).getTilesets(function getTilesInfoSucceed(info) { + me.options.layer.setTileSetsInfo(info.result); + }); + } + }, + + /** + * @function ChangeTileVersion.prototype.removeLayer + * @description 移除绑定的地图图层。 + */ + removeLayer: function removeLayer() { + this.options.layer = null; + }, + + /** + * @function ChangeTileVersion.prototype.nextTilesVersion + * @description 下一个版本,首次调用该函数默认为无版本。 + * @returns {ChangeTileVersion} ChangeTileVersion的实例对象。 + */ + nextTilesVersion: function nextTilesVersion() { + if (this.firstLoad) { + this.options.layer.nextTilesVersion(); + this.firstLoad = !!0; + return this; + } + + if (parseInt(this.slider.value) > this.max - 1) { + return this; + } + + this.slider.value = parseInt(this.slider.value) + 1; + this.options.layer.nextTilesVersion(); + return this; + }, + + /** + * @function ChangeTileVersion.prototype.lastTilesVersion + * @description 上一个版本。 + */ + lastTilesVersion: function lastTilesVersion() { + if (parseInt(this.slider.value) < this.min + 1) { + return this; + } + + this.slider.value = parseInt(this.slider.value) - 1; + this.options.layer.lastTilesVersion(); + return this; + }, + + /** + * @function ChangeTileVersion.prototype.tilesVersion + * @description 请求指定版本。 + * @param {string} version - 版本号参数。 + */ + tilesVersion: function tilesVersion(version) { + var layer = this.options.layer, + tileVersions = this.tileVersions; + var len = tileVersions.length; + + for (var i = 0; i < len; i++) { + if (tileVersions[i].name == version) { + layer.updateCurrentTileSetsIndex(i); + layer.changeTilesVersion(); + break; + } + } + }, + + /** + * @function ChangeTileVersion.prototype.getValue + * @description 获取进度条的值。(注:进度条的值并不是版本号)。 + */ + getValue: function getValue() { + return this.slider.value; + }, + + /** + * @function ChangeTileVersion.prototype.getVersion + * @description 获取当前进度条的值对应的版本号。 + */ + getVersion: function getVersion() { + var version = this.tileVersions[this.getValue()]; + return version && version.name; + }, + _initLayout: function _initLayout() { + var className = 'leaflet-control-ctv'; + this._container = external_L_default().DomUtil.create('div', className + ' ' + className + '-' + this.options.orientation); //正常情况下显示btn + + this._sliderBtn = external_L_default().DomUtil.create('a', className + '-toggle', this._container); + + this._sliderBtn.setAttribute("title", this.options.title); + + this._sliderBtn.innerHTML = this.options.ico; //滑块拖动时值显示区域 + + this._sliderValue = external_L_default().DomUtil.create('p', className + '-value', this._container); + this._sliderValue.innerHTML = this.options.ico; + var sliderClassName = "leaflet-ctv-slider"; + this._sliderContent = external_L_default().DomUtil.create('div', sliderClassName + "-main" + " tooltip", this._container); //tooltip提示框 + + this.tooltip = external_L_default().DomUtil.create("span", "tooltip-text" + " " + "tooltip-" + this.options.tooltip, this._sliderContent); + this.tooltip.innerHTML = this.options.ico; //加控件 + + if (this.options["switch"]) { + this._next = external_L_default().DomUtil.create('a', sliderClassName + "-incdec" + " " + sliderClassName + '-next', this._sliderContent); + this._next.innerHTML = this.options.nextText; + external_L_default().DomEvent.on(this._next, 'click', this.nextTilesVersion, this); + external_L_default().DomUtil.addClass(this._container, className + '-incdec'); + } //滑块 + + + this._sliderContainer = external_L_default().DomUtil.create('div', sliderClassName + '-container', this._sliderContent); + this.slider = external_L_default().DomUtil.create('input', sliderClassName, this._sliderContainer); + this.min = this.min == null || isNaN(this.min) ? 0 : parseInt(this.min); + this.slider.setAttribute("title", this.options.title); + this.slider.setAttribute("id", "slider"); + this.slider.setAttribute("type", "range"); + this.slider.setAttribute("min", this.min); + this.slider.setAttribute("max", 0); + this.slider.setAttribute("step", 1); + this.slider.setAttribute("value", 0); // //判断浏览器是否支持Range滑动条 + // if (this.slider.type == "text") { + // console.error("抱歉,您的浏览器不支持HTML5 range滑动条,请使用高版本浏览器"); + // } + + this.firstLoad = true; + + if ('oninput' in this.slider || 'onchange' in this.slider) { + external_L_default().DomEvent.on(this.slider, "change", this._tilesVersion, this); + } else { + this.slider.onpropertychange = this._tilesVersion; + } //减控件 + + + if (this.options["switch"]) { + this._last = external_L_default().DomUtil.create('a', sliderClassName + "-incdec" + " " + sliderClassName + '-last', this._sliderContent); + this._last.innerHTML = this.options.lastText; + external_L_default().DomEvent.on(this._last, 'click', this.lastTilesVersion, this); + } //if (window.matchMedia("screen and (-webkit-min-device-pixel-ratio:0)").matches && this.options.orientation == 'vertical') { + + + if (this.options.orientation === 'vertical') { + this.slider.style.width = 170 + 'px'; + this._sliderContainer.style.height = 170 + 'px'; + } else { + this._sliderContainer.style.width = 150 + 'px'; + } + + external_L_default().DomEvent.disableClickPropagation(this._container); + + if (this.options.collapsed) { + if (!(external_L_default()).Browser.android) { + external_L_default().DomEvent.on(this._container, 'mouseenter', this._expand, this).on(this._container, 'mouseleave', this._collapse, this); + } + + if ((external_L_default()).Browser.touch) { + external_L_default().DomEvent.on(this._sliderBtn, 'click', (external_L_default()).DomEvent.stop).on(this._sliderBtn, 'click', this._expand, this); + } else { + external_L_default().DomEvent.on(this._sliderBtn, 'focus', this._expand, this); + } + } else { + this._expand(); + } + + return this._container; + }, + _expand: function _expand() { + external_L_default().DomUtil.addClass(this._container, 'leaflet-control-ctv-expanded'); + }, + _collapse: function _collapse() { + external_L_default().DomUtil.removeClass(this._container, 'leaflet-control-ctv-expanded'); + }, + _tilesVersion: function _tilesVersion() { + var version = this.getVersion(); + this.tilesVersion(version); + } +}); +external_L_default().Map.mergeOptions({ + changeTileVersionControl: false +}); +external_L_default().Map.addInitHook(function () { + if (this.options.changeTileVersionControl) { + this.changeTileVersionControl = new ChangeTileVersion(); + this.addControl(this.changeTileVersionControl); + } +}); +var changeTileVersion = function changeTileVersion(options) { + return new ChangeTileVersion(options); +}; +;// CONCATENATED MODULE: ./src/common/control/img/Logo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var LogoBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAAAdCAYAAAAjHtusAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozYWZlOGIwMi01MWE3LTRiZjYtYWVkYS05MGQ2ZTQ4YjZiMmUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODg0NkFBQUE3RjEzMTFFNzhFRjJFQkY4RjcxQjc1NjIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODg0NkFBQTk3RjEzMTFFNzhFRjJFQkY4RjcxQjc1NjIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MWI3NzdhNC1lZmEyLTQ1MzUtOGQzNi03MmRjNDkyODMzN2UiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjYTYzODVjMi1jNDQ1LTExN2EtYTc0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"; +;// CONCATENATED MODULE: ./src/leaflet/control/Logo.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class Logo + * @aliasclass control.Logo + * @deprecatedclassinstance L.supermap.control.logo + * @classdesc Logo 控件。 + * @category Control + * @extends {L.Control} + * @example + * new Logo({ + * imageUrl: xxx,//非必填项 + * }).addTo(map); + * @param {Object} options - 参数。 + * @param {string} [options.position='bottomright'] - 控件位置继承自 leaflet control。 + * @param {string} [options.imageUrl] - logo 图片地址。 + * @param {string} [options.width] - logo 图片宽度。 + * @param {string} [options.height] - logo 图片高度。 + * @param {string} [options.link] - 跳转链接。 + * @param {string} [options.alt='SuperMap iClient'] - logo 图片失效时显示的提示文本。 + * @usage + */ + +var Logo = external_L_default().Control.extend({ + options: { + position: 'bottomright', + //logo图片地址 + imageUrl: null, + //跳转链接 + link: null, + //logo图片宽 + width: null, + //logo图片高 + height: null, + //logo图片失效时显示文本 + alt: "SuperMap iClient" + }, + + /** + * @private + * @function Logo.prototype.onAdd + * @override + * @description 添加 logo。 + * @returns {HTMLElement} 返回创建 logo 的 div。 + */ + onAdd: function onAdd() { + var div = external_L_default().DomUtil.create('div', 'iclient-leaflet-logo'); + div.style.marginTop = 0; + div.style.marginBottom = 0; + div.style.marginLeft = 0; + div.style.marginRight = 0; //iClient.png base64 + + var imgSrc = LogoBase64; + + if (this.options.imageUrl) { + imgSrc = this.options.imageUrl; + } + + var alt = this.options.alt; + var imageWidth = "94px"; + var imageHeight = "29px"; + var styleSize = "width:" + imageWidth + ";height:" + imageHeight + ";"; + + if (this.options.imageUrl) { + imageWidth = this.options.width; + imageHeight = this.options.height; + styleSize = "width:" + imageWidth + ";height:" + imageHeight + ";"; + + if (!imageWidth || !imageHeight) { + styleSize = ""; + } + } + + var link = this.options.link || "https://iclient.supermap.io"; + div.innerHTML = "" + "" + alt + ""; + return div; + } +}); //map默认开启logoControl + +external_L_default().Map.mergeOptions({ + logoControl: true +}); //map默认开启logoControl + +external_L_default().Map.addInitHook(function () { + if (!this._logoAdded && this.options.logoControl) { + if (this.options.logoControl === true) { + this.logoControl = new Logo(); + } else if (this.options.logoControl instanceof (external_L_default()).Control) { + this.logoControl = this.options.logoControl; + } + + if (this.logoControl) { + this.addControl(this.logoControl); + this._logoAdded = true; + } + } +}); +var logo = function logo(options) { + return new Logo(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/control/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +;// CONCATENATED MODULE: ./src/leaflet/core/CommontypesConversion.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +var isArray = function isArray(obj) { + return Object.prototype.toString.call(obj) == '[object Array]'; +}; +/** + * @class CommontypesConversion + * @category BaseTypes Util + * @classdesc Leaflet 对象和 SuperMap 对象转换工具。 + * @usage + */ + + +var CommontypesConversion = { + /** + * @function CommontypesConversion.toSuperMapBounds + * @description 将 Leaflet 对象的 bounds 转成 SuperMap 的 bounds对象。 + * @param {(L.Bounds|L.LatLngBounds)} bounds - 图层显示范围。 + * @returns {Bounds} SuperMap 的 bounds 对象。 + */ + toSuperMapBounds: function toSuperMapBounds(bounds) { + if (bounds && ["FeatureCollection", "Feature"].indexOf(bounds.type) !== -1) { + bounds = external_L_default().geoJSON(bounds).getBounds(); + } + + if (bounds instanceof (external_L_default()).LatLngBounds) { + return new Bounds(bounds.getSouthWest().lng, bounds.getSouthWest().lat, bounds.getNorthEast().lng, bounds.getNorthEast().lat); + } + + if (bounds instanceof (external_L_default()).Bounds) { + return new Bounds(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y); + } + + if (isArray(bounds)) { + return new Bounds(bounds[0], bounds[1], bounds[2], bounds[3]); + } + + return new Bounds(); + }, + + /** + * @function CommontypesConversion.isArray + * @description 判断是否为数组格式。 + * @param {Object} obj - 待判断的对象。 + * @returns {boolean} 是否是数组。 + */ + isArray: isArray, + + /** + * @function CommontypesConversion.toProcessingParam + * @description 将 Region 节点数组转为 Processing 服务需要的分析参数。 + * @param {Array} points - Region 各个节点数组。 + * @returns processing 服务裁剪、查询分析的分析参数。 + */ + toProcessingParam: function toProcessingParam(points) { + var geometryParam = {}; + + if (points.length < 1) { + geometryParam = ""; + } else { + var results = []; + + for (var i = 0; i < points.length; i++) { + var point = {}; + point.x = points[i][0]; + point.y = points[i][1]; + results.push(point); + } + + geometryParam.type = "REGION"; + geometryParam.points = results; + } + + return geometryParam; + } +}; +;// CONCATENATED MODULE: ./src/leaflet/core/ExtendsCRS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @name BaiduCRS + * @description 百度坐标对象。 + * @namespace + * @category BaseTypes Projection + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { BaiduCRS } from "{npm}"; + * + * const baiduCRS = BaiduCRS; + * ``` + */ + +var BaiduCRS = external_L_default().extend({}, (external_L_default()).CRS.EPSG3857, { + code: 'Baidu', + scale: function scale(zoom) { + return 6378137 * Math.PI * 2 / Math.pow(2, 18 - zoom); + }, + transformation: function () { + var scale = 0.5 / (Math.PI * 6378137); + return new (external_L_default()).Transformation(scale, 0, -scale, 0); + }() +}); +var tdt_WGS84_resolutions = []; + +for (var i = 1; i < 19; i++) { + tdt_WGS84_resolutions.push(0.703125 * 2 / Math.pow(2, i)); +} +/** + * @name TianDiTu_WGS84CRS + * @deprecatedclass L.CRS.TianDiTu_WGS84CRS + * @description 天地图 WGS84 坐标对象。 + * @namespace + * @category BaseTypes Projection + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { TianDiTu_WGS84CRS } from "{npm}"; + * + * const tianDiTu_WGS84CRS = TianDiTu_WGS84CRS; + * + * ``` + */ + + +var TianDiTu_WGS84CRS = crs("EPSG:4326", { + origin: [-180, 90], + resolutions: tdt_WGS84_resolutions, + bounds: external_L_default().bounds([-180, -90], [180, 90]), + wrapLng: [-180, 180] +}); +var c = Math.PI * 2 * 6378137; +var halfC = c / 2; +var tdt_Mercator_resolutions = []; + +for (var _i = 1; _i < 19; _i++) { + tdt_Mercator_resolutions.push(c / 256 / Math.pow(2, _i)); +} +/** + * @name TianDiTu_MercatorCRS + * @deprecatedclass L.CRS.TianDiTu_MercatorCRS + * @description 天地图墨卡托坐标对象。 + * @category BaseTypes Projection + * @namespace + * @usage + * ``` + * // 浏览器 + * + * + * //ES6 Import + * import { TianDiTu_MercatorCRS } from "{npm}"; + * + * const tianDiTu_MercatorCRS = TianDiTu_MercatorCRS; + * + * ``` + */ + + +var TianDiTu_MercatorCRS = crs('EPSG:3857', { + origin: [-halfC, halfC], + resolutions: tdt_Mercator_resolutions, + bounds: external_L_default().bounds([-halfC, -halfC], [halfC, halfC]), + wrapLng: [-180, 180] +}); +;// CONCATENATED MODULE: ./src/leaflet/core/NonEarthCRS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @private + * @class NonProjection + * @classdesc 平面无投影对象。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {L.Bounds} bounds - 坐标范围 + */ + +var NonProjection = external_L_default().Class.extend({ + initialize: function initialize(bounds) { + this.bounds = bounds; + }, + project: function project(latlng) { + return new (external_L_default()).Point(latlng.lng, latlng.lat); + }, + unproject: function unproject(point) { + return new (external_L_default()).LatLng(point.y, point.x); + } +}); +var nonProjection = function nonProjection(bounds) { + return new NonProjection(bounds); +}; +/** + * @class NonEarthCRS + * @aliasclass CRS.NonEarthCRS + * @deprecatedclass L.CRS.NonEarthCRS + * @deprecatedclassinstance L.supermap.CRS.nonEarthCRS + * @classdesc 平面无投影坐标类。 + * @category BaseTypes Projection + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {Object} options.origin - 原点。 + * @param {L.Bounds} options.bounds - 范围。 + * @param {Array.} [options.resolutions] - 分辨率。 + * @usage + */ + +var NonEarthCRS = external_L_default().Class.extend({ + /** + * @member {Object} [NonEarthCRS.prototype.includes=L.CRS] + * @description 坐标对象。 + */ + includes: (external_L_default()).CRS, + initialize: function initialize(options) { + if (options.origin) { + this.transformation = new (external_L_default()).Transformation(1, -options.origin.x, -1, options.origin.y); + } + + this.projection = nonProjection(options.bounds); + this.bounds = options.bounds; + this.origin = options.origin; + this.resolutions = options.resolutions; + }, + + /** + * @function NonEarthCRS.prototype.scale + * @description 通过缩放级别计算比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 返回比例尺值。 + */ + scale: function scale(zoom) { + var defaultScale; + + if (!this.resolutions || this.resolutions.length === 0) { + var width = Math.max(this.bounds.getSize().x, this.bounds.getSize().y); + defaultScale = 1.0 / (width / 256); + return defaultScale * Math.pow(2, zoom); + } + + if (this.resolutions[zoom]) { + return 1.0 / this.resolutions[zoom]; + } + + return 1.0 / this.resolutions[0] * Math.pow(2, zoom); + }, + + /** + * @function NonEarthCRS.prototype.zoom + * @description 通过比例尺计算范围。 + * @param {number} scale - 比例尺。 + * @returns {number} 返回空间范围值。 + */ + zoom: function zoom(scale) { + var defaultScale; + + if (!this.resolutions || this.resolutions.length === 0) { + var width = Math.max(this.bounds.getSize().x, this.bounds.getSize().y); + defaultScale = 1.0 / (width / 256); + return Math.log(scale / defaultScale) / Math.LN2; + } + + var index = this.resolutions.indexOf(1.0 / scale); + + if (index > -1) { + return index; + } + + return Math.log(scale / (1.0 / this.resolutions[0])) / Math.LN2; + }, + + /** + * @function NonEarthCRS.prototype.distance + * @description 通过两个坐标点计算之间的距离。 + * @param {L.LatLng} latlng1 - 坐标点1。 + * @param {L.LatLng} latlng2 - 坐标点2。 + * @returns {number} 返回距离长度。 + */ + distance: function distance(latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + return Math.sqrt(dx * dx + dy * dy); + }, + infinite: false +}); +var nonEarthCRS = function nonEarthCRS(options) { + return new NonEarthCRS(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/core/Util.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** +* @function toGeoJSON +* @category BaseTypes Util +* @description 将传入对象转为 GeoJSON 格式。 +* @param {Object} feature - 待转参数。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { toGeoJSON } from '{npm}'; +* +* const result = toGeoJSON(feature); +* ``` +*/ + +var toGeoJSON = function toGeoJSON(feature) { + if (!feature) { + return feature; + } + + return new GeoJSON().toGeoJSON(feature); +}; +/** +* @function toSuperMapGeometry +* @category BaseTypes Util +* @description 将 GeoJSON 对象转为 SuperMap 几何图形。 +* @param {GeoJSONObject} geometry - GeoJSON 对象。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { toSuperMapGeometry } from '{npm}'; +* +* const result = toSuperMapGeometry(geometry); +* ``` +*/ + +var toSuperMapGeometry = function toSuperMapGeometry(geometry) { + if (!geometry) { + return geometry; + } + + var result, + format = new GeoJSON(); + + if (['FeatureCollection', 'Feature', 'Geometry'].indexOf(geometry.type) != -1) { + result = format.read(geometry, geometry.type); + } else if (typeof geometry.toGeoJSON === 'function') { + var geojson = geometry.toGeoJSON(); + result = geojson ? format.read(geojson, geojson.type) : geometry; + } + + var serverResult = result || geometry; + + if (external_L_default().Util.isArray(result)) { + if (result.length === 1) { + serverResult = result[0]; + } else if (result.length > 1) { + serverResult = []; + result.map(function (item) { + serverResult.push(item.geometry); + return item; + }); + } + } + + return serverResult && serverResult.geometry ? serverResult.geometry : serverResult; +}; +var Util_getMeterPerMapUnit = getMeterPerMapUnit; +/** +* @function resolutionToScale +* @category BaseTypes Util +* @description 通过分辨率计算比例尺。 +* @param {number} resolution - 分辨率。 +* @param {number} dpi - 屏幕分辨率。 +* @param {string} mapUnit - 地图单位。 +* @returns {number} 比例尺。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { resolutionToScale } from '{npm}'; +* +* const result = resolutionToScale(resolution, dpi, mapUnit); +* ``` +*/ + +var resolutionToScale = function resolutionToScale(resolution, dpi, mapUnit) { + var inchPerMeter = 1 / 0.0254; // 地球半径。 + + var meterPerMapUnit = Util_getMeterPerMapUnit(mapUnit); + var scale = resolution * dpi * inchPerMeter * meterPerMapUnit; + scale = 1 / scale; + return scale; +}; +/** +* @function scaleToResolution +* @category BaseTypes Util +* @description 通过比例尺计算分辨率。 +* @param {number} scale - 比例尺。 +* @param {number} dpi - 屏幕分辨率。 +* @param {string} mapUnit - 地图单位。 +* @returns {number} 分辨率。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { scaleToResolution } from '{npm}'; +* +* const result = scaleToResolution(scale, dpi, mapUnit); +* ``` +*/ + +var scaleToResolution = function scaleToResolution(scale, dpi, mapUnit) { + var inchPerMeter = 1 / 0.0254; + var meterPerMapUnitValue = Util_getMeterPerMapUnit(mapUnit); + var resolution = scale * dpi * inchPerMeter * meterPerMapUnitValue; + resolution = 1 / resolution; + return resolution; +}; +/** +* @function normalizeScale +* @category BaseTypes Util +* @description 转换比例尺。 +* @param {number} scale - 比例尺。 +* @returns {number} 正常的 scale 值。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { normalizeScale } from '{npm}'; +* +* const result = normalizeScale(scale); +* ``` +*/ + +var normalizeScale = function normalizeScale(scale) { + return scale > 1.0 ? 1.0 / scale : scale; +}; +/** +* @function getResolutionFromScaleDpi +* @category BaseTypes Util +* @description 根据比例尺和 dpi 计算屏幕分辨率。 +* @param {number} scale - 比例尺。 +* @param {number} dpi - 图像分辨率,表示每英寸内的像素个数。 +* @param {string} [coordUnit] - 投影坐标系统的地图单位。 +* @param {number} [datumAxis=6378137] - 地理坐标系统椭球体长半轴。用户自定义地图的 Options 时,若未指定该参数的值,则 DPI 默认按照 WGS84 参考系的椭球体长半轴 6378137 来计算。 +* @returns {number} 当前比例尺下的屏幕分辨率。 +* @usage +* ``` +* // 浏览器 +* +* +* +* // ES6 Import +* import { getResolutionFromScaleDpi } from '{npm}'; +* +* const result = getResolutionFromScaleDpi(scale, dpi, coordUnit, datumAxis); +* ``` +*/ + +var getResolutionFromScaleDpi = function getResolutionFromScaleDpi(scale, dpi, coordUnit, datumAxis) { + var resolution = null, + ratio = 10000; //用户自定义地图的Options时,若未指定该参数的值,则系统默认为6378137米,即WGS84参考系的椭球体长半轴。 + + datumAxis = datumAxis || 6378137; + coordUnit = coordUnit || ''; + + if (scale > 0 && dpi > 0) { + scale = normalizeScale(scale); + + if (coordUnit.toLowerCase() === 'degree' || coordUnit.toLowerCase() === 'degrees' || coordUnit.toLowerCase() === 'dd') { + //scale = CommonUtil.normalizeScale(scale); + resolution = 0.0254 * ratio / dpi / scale / (Math.PI * 2 * datumAxis / 360) / ratio; + return resolution; + } else { + resolution = 0.0254 * ratio / dpi / scale / ratio; + return resolution; + } + } + + return -1; +}; +;// CONCATENATED MODULE: ./src/leaflet/core/Transform.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @function transform + * @description 转换要素坐标。 + * @category BaseTypes Util + * @param {(L.Marker|L.CircleMarker|L.Polyline|L.Polygon|L.Rectangle|L.LatLngBounds|L.Bounds|Object)} feature - 待转换要素:Leaflet Vector Layers 。 + * 的 {@link L.Marker}|{@link L.CircleMarker}|{@link L.Polyline}|{@link L.Polygon}|{@link L.Rectangle}|{@link L.LatLngBounds}|{@link L.Bounds}|{@link GeoJSONObject} 类型。 + * @param {CRS} [sourceCRS=L.CRS.EPSG4326] - 转换要素的源坐标系。 + * @param {CRS} targetCRS - 转换要素的目标坐标系。 + * @returns {GeoJSONObject} 返回 GeoJSON 规范的数据类型。 + * @usage + * ``` + * // 浏览器 + * + * + * + * // ES6 Import + * import { transform } from '{npm}'; + * + * const result = transform(feature, sourceCRS, targetCRS); + * ``` + */ + +var Transform_transform = function transform(feature) { + var sourceCRS = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (external_L_default()).CRS.EPSG4326; + var targetCRS = arguments.length > 2 ? arguments[2] : undefined; + var selfFeatures = null; + var selfCallback = null; //将数据统一为 geojson 格式处理: + + if (["FeatureCollection", "Feature", "Geometry"].indexOf(feature.type) === -1) { + if (feature.toGeoJSON) { + feature = feature.toGeoJSON(); + } else if (feature instanceof (external_L_default()).LatLngBounds) { + feature = external_L_default().rectangle(feature).toGeoJSON(); + } else if (feature instanceof (external_L_default()).Bounds) { + feature = external_L_default().rectangle([[feature.getTopLeft().x, feature.getTopLeft().y], [feature.getBottomRight().x, feature.getBottomRight().y]]).toGeoJSON(); + } else { + throw new Error("This tool only supports data conversion in geojson format or Vector Layers of Leaflet."); + } + } //geojson 几种数据类型及处理形式 + + + var parseCoords = { + "point": function point(array) { + return selfCallback(array); + }, + "multipoint": function multipoint(array) { + return parseCoords["linestring"].apply(this, [array]); + }, + "linestring": function linestring(array) { + var points = []; + var p = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = parseCoords["point"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + points.push(p); + } + + return points; + }, + "multilinestring": function multilinestring(array) { + return parseCoords["polygon"].apply(this, [array]); + }, + "polygon": function polygon(array) { + var rings = []; + var l; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + l = parseCoords["linestring"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + rings.push(l); + } + + return rings; + }, + "multipolygon": function multipolygon(array) { + var polys = []; + var p = null; + + for (var i = 0, len = array.length; i < len; ++i) { + try { + p = parseCoords["polygon"].apply(this, [array[i]]); + } catch (err) { + throw err; + } + + polys.push(p); + } + + return polys; + } + }; //返回结果: + + return featureTransform(feature, _transformCoordinates); + + function featureTransform(feature, callback) { + selfFeatures = feature; + selfCallback = callback; //分离处理: + + if (feature.type === "Feature") { + selfFeatures = _prepareFeatuers(feature); + } else if (feature.type === "FeatureCollection") { + var featureResults = []; + + for (var i = 0; i < feature.features.length; ++i) { + try { + featureResults.push(_prepareFeatuers(feature.features[i])); + } catch (err) { + featureResults = null; + } + } + + selfFeatures.features = featureResults; + } + + return selfFeatures; + } + + function _prepareFeatuers(feature) { + var geometry = feature.geometry; + + if (!Util.isArray(geometry.coordinates)) { + throw "Geometry must have coordinates array: " + geometry; + } + + if (!parseCoords[geometry.type.toLowerCase()]) { + throw "Unsupported geometry type: " + geometry.type; + } + + try { + geometry.coordinates = parseCoords[geometry.type.toLowerCase()].apply(this, [geometry.coordinates]); + } catch (err) { + throw err; + } + + feature.geometry = geometry; + return feature; + } + + function _transformCoordinates(coordinates) { + //判断code 是投影坐标还是地理坐标 + var point = sourceCRS.unproject({ + x: coordinates[0], + y: coordinates[1] + }); + var transform = targetCRS.project(point); + return [transform.x, transform.y]; + } +}; +;// CONCATENATED MODULE: ./src/leaflet/core/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/mapping/BaiduTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class BaiduTileLayer + * @deprecatedclassinstance L.supermap.baiduTileLayer + * @classdesc 百度地图图层。 + * @category ThirdPartyMap + * @extends {L.TileLayer} + * @param {string} [url='https://online{num}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles={styles}&udt=20150815&scaler=1'] - 切片地址。 + * @param {Object} options - 参数。 + * @param {number} [options.minZoom=3] - 最小缩放级别。 + * @param {number} [options.maxZoom=19] - 最大缩放级别。 + * @param {L.LatLngBounds} [options.bounds=L.latLngBounds([-85.0511287798, -180],[85.0511287798, 180])] - 显示范围。 + * @param {L.Browser} [options.retina=L.Browser.retina] - 浏览器显示分辨率。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.attribution='Map Data © 2018 Baidu - GS(2016)2089号 - Data © 长地万方'] - 版权信息。 + * @usage + */ + +var BaiduTileLayer = external_L_default().TileLayer.extend({ + /** + * @member {string} BaiduTileLayer.prototype.url + * @description 切片地址。 + */ + url: "http://online{num}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles={styles}&udt=20150815&scaler=1", + options: { + minZoom: 3, + maxZoom: 19, + bounds: external_L_default().latLngBounds(external_L_default().latLng(-85.0511287798, -180), external_L_default().latLng(85.0511287798, 180)), + retina: (external_L_default()).Browser.retina, + attribution: core_Attributions.Baidu.attribution + }, + initialize: function initialize(url, options) { + if (url) { + this.url = url; + } + + external_L_default().setOptions(this, options); + + if (this.options.retina) { + this.options.maxZoom = 18; + } + + external_L_default().stamp(this); + }, + + /** + * @function BaiduTileLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function getTileUrl(coords) { + var url = external_L_default().Util.template(this.url, { + num: Math.abs((coords.x + coords.y) % 8) + 1, + x: coords.x, + y: -coords.y - 1, + z: this._getZoomForUrl(), + styles: this.options.retina ? 'ph' : 'pl' + }); //支持代理 + + if (this.options.tileProxy) { + url = this.options.tileProxy + encodeURIComponent(url); + } + + return url; + } +}); +var baiduTileLayer = function baiduTileLayer(url, options) { + return new BaiduTileLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/CloudTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class CloudTileLayer + * @deprecatedclassinstance L.supermap.cloudTileLayer + * @classdesc 超图云服务图层。 + * @category ThirdPartyMap + * @extends {L.TileLayer} + * @param {string} [url='http://t2.dituhui.com/FileService/image?map={mapName}&type={type}&x={x}&y={y}&z={z}'] - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.type='web'] - type。 + * @param {number} [options.minZoom=3] - 最小缩放级别。 + * @param {number} [options.maxZoom=18] - 最大缩放级别。 + * @param {string} [options.mapName='quanguo'] - 地图名称。 + * @param {string} [options.attribution='Map Data ©2014 SuperMap - GS(2014)6070号-data©Navinfo'] - 版权信息。 + * @usage + */ + +var CloudTileLayer = external_L_default().TileLayer.extend({ + defaultURL: 'http://t2.dituhui.com/FileService/image', + options: { + /** + * @member {string} [CloudTileLayer.prototype.options='quanguo'] + * @description 地图名称。 + */ + mapName: "quanguo", + + /** + * @member {string} CloudTileLayer.prototype.type + * @description 地图投影。 + */ + type: "web", + minZoom: 3, + maxZoom: 18, + attribution: core_Attributions.Cloud.attribution + }, + initialize: function initialize(url, options) { + external_L_default().setOptions(this, options); + var cloudURL = url || this.defaultURL; + this._url = cloudURL + "?map=" + this.options.mapName + "&type=" + this.options.type; + external_L_default().stamp(this); + }, + + /** + * @function CloudTileLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function getTileUrl(coords) { + var layerUrl = this._url; + var tileUrl = layerUrl + "&x=" + coords.x + "&y=" + coords.y + "&z=" + coords.z; //支持代理 + + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + + return tileUrl; + } +}); +var cloudTileLayer = function cloudTileLayer(url, options) { + return new CloudTileLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/ImageMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class ImageMapLayer + * @deprecatedclassinstance L.supermap.imageMapLayer + * @classdesc SuperMap iServer 的 REST 地图服务的图层(SuperMap iServer Java 6R 及以上分块动态 REST 图层)。使用 Image 资源出图。 + * @category iServer Map Tile + * @extends {L.Layer} + * @example + * new ImageMapLayer(url).addTo(map); + * @param {string} url - 服务地址,如:http://{ip}:{port}/iserver/services/map-china400/rest/maps/China。 + * @param {Object} options - 参数。 + * @param {string} [options.layersID] - 获取需要切片的地图图层 ID,即指定需要切片的地图图层,可以是临时图层集,也可以是当前地图中图层的组合。 + * @param {boolean} [options.redirect=false] - 是否重定向,如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流。 + * @param {boolean} [options.transparent=true] - 地图瓦片是否透明。 + * @param {boolean} [options.cacheEnabled=true] - 是否启用缓存。 + * @param {boolean} [options.clipRegionEnabled=false] - 是否启用地图裁剪。 + * @param {L.Path} [options.clipRegion] - 地图显示裁剪的区域(区域为一个面对象)。当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。 + * @param {Object} [options.prjCoordSys] - 请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857}。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内,是否重叠显示。 + * @param {string} [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项。 + * @param {number} [options.opacity=1] - 图层不透明度。 + * @param {string} [options.alt] - 图像无法显示时的提示文字。 + * @param {string} [options.pane='tilePane'] - 图层所归属的 map DOM 的分组。 + * @param {boolean} [options.interactive=false] - 是否响应鼠标点击或悬停等交互事件。 + * @param {boolean} [options.crossOrigin=false] - 是否设置跨域属性。 + * @param {string} [options.errorOverlayUrl] - 图层未能加载时显示的瓦片地址。 + * @param {number} [options.zIndex=1] - 设置图层的层级。 + * @param {string} [options.className] - 自定义 dom 元素的 className。 + * @param {number} [options.updateInterval=150] - 平移时图层延迟刷新间隔时间。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.format='png'] - 瓦片表述类型,支持 "png" 、"webp"、"bmp" 、"jpg"、 "gif" 等图片格式。 + * @param {(NDVIParameter|HillshadeParameter)} [options.rasterfunction] - 栅格分析参数。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @fires ImageMapLayer#load + * @fires ImageMapLayer#error + * @fires ImageMapLayer#loading + * @usage + */ + +var ImageMapLayer = external_L_namespaceObject.Layer.extend({ + options: { + //如果有layersID,则是在使用专题图 + layersID: null, + //如果为 true,则将请求重定向到图片的真实地址;如果为 false,则响应体中是图片的字节流 + redirect: false, + //地图图片是否透明 + transparent: true, + //是否启用服务器缓存 + cacheEnabled: true, + //地图显示裁剪的区域是否有效 + clipRegionEnabled: false, + //地图显示裁剪的区域 + clipRegion: null, + //请求的地图的坐标参考系统。 如:prjCoordSys= {"epsgCode":3857}。 + prjCoordSys: null, + //地图对象在同一范围内,是否重叠显示 + overlapDisplayed: false, + //避免地图对象压盖显示的过滤选项 + overlapDisplayedOptions: null, + //图层不透明度 + opacity: 1, + //图像无法显示时的提示文字 + alt: '', + //图层所归属的map DOM的分组。默认为:"tilePane" + pane: 'tilePane', + //是否响应鼠标点击或悬停交互事件 + interactive: false, + //是否设置跨域属性 + crossOrigin: false, + //图层未能加载时显示的瓦片地址 + errorOverlayUrl: '', + //设置图层的显示层级 + zIndex: 1, + //自定义的html class name + className: '', + //版权信息 + attribution: core_Attributions.Common.attribution, + //平移时图层延迟刷新间隔时间。 + updateInterval: 150, + //启用托管地址。 + tileProxy: null, + format: 'png' + }, + initialize: function initialize(url, options) { + this._url = url; + external_L_namespaceObject.Util.setOptions(this, options); + }, + + /** + * @private + * @function ImageMapLayer.prototype.onAdd + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + this.update = external_L_namespaceObject.Util.throttle(this.update, this.options.updateInterval, this); + map.on('moveend', this.update, this); + + if (this._currentImage && this._currentImage._bounds.equals(this._map.getBounds())) { + map.addLayer(this._currentImage); + } else if (this._currentImage) { + this._map.removeLayer(this._currentImage); + + this._currentImage = null; + } + + this.update(); + }, + + /** + * @private + * @function ImageMapLayer.prototype.onRemove + * @description 从地图上移除。 + */ + onRemove: function onRemove() { + // eslint-disable-line no-unused-vars + if (this._currentImage) { + this._map.removeLayer(this._currentImage); + } + + this._map.off('moveend', this.update, this); + }, + + /** + * @function ImageMapLayer.prototype.bringToFront + * @description 置顶当前图层。 + */ + bringToFront: function bringToFront() { + this.options.position = 'front'; + + if (this._currentImage) { + this._currentImage.bringToFront(); + } + + return this; + }, + + /** + * @function ImageMapLayer.prototype.bringToFront + * @description 置底当前图层。 + */ + bringToBack: function bringToBack() { + this.options.position = 'back'; + + if (this._currentImage) { + this._currentImage.bringToBack(); + } + + return this; + }, + + /** + * @function ImageMapLayer.prototype.getOpacity + * @description 获取图层透明度。 + * @returns {number} 图层的透明度。 + */ + getOpacity: function getOpacity() { + return this.options.opacity; + }, + + /** + * @function ImageMapLayer.prototype.setOpacity + * @description 设置图层不透明度。 + */ + setOpacity: function setOpacity(opacity) { + this.options.opacity = opacity; + + if (this._currentImage) { + this._currentImage.setOpacity(opacity); + } + + return this; + }, + + /** + * @function ImageMapLayer.prototype.getImageUrl + * @description 获取 image 图层请求地址,子类可重写实现。 + * @returns {string} 请求瓦片地址。 + */ + getImageUrl: function getImageUrl(params) { + var serviceUrl = Util.urlPathAppend(this._url, "image.".concat(this.options.format)); + var imageUrl = serviceUrl + external_L_namespaceObject.Util.getParamString(Object.assign({}, this._initAllRequestParams(), params), serviceUrl); + imageUrl = SecurityManager.appendCredential(imageUrl); //支持代理 + + if (this.options.tileProxy) { + imageUrl = this.options.tileProxy + encodeURIComponent(imageUrl); + } + + if (!this.options.cacheEnabled) { + imageUrl += '&_t=' + new Date().getTime(); + } + + return imageUrl; + }, + //获取请求瓦片宽高以及请求范围参数 + _getImageParams: function _getImageParams() { + var size = this._calculateImageSize(); + + return { + viewBounds: this._compriseBounds(this._calculateBounds()), + width: size.x, + height: size.y + }; + }, + //初始化服务请求参数 + _initAllRequestParams: function _initAllRequestParams() { + var me = this, + options = me.options || {}, + params = {}; + var redirect = options.redirect === true ? options.redirect : false; + params['redirect'] = redirect; + var transparent = options.transparent === true ? options.transparent : false; + params['transparent'] = transparent; + var cacheEnabled = options.cacheEnabled === false ? options.cacheEnabled : true; + params['cacheEnabled'] = cacheEnabled; + + if (options.prjCoordSys) { + params['prjCoordSys'] = JSON.stringify(options.prjCoordSys); + } + + if (options.layersID) { + params['layersID'] = options.layersID; + } + + if (options.rasterfunction) { + params['rasterfunction'] = JSON.stringify(options.rasterfunction); + } + + if (options.clipRegionEnabled && options.clipRegion) { + params['clipRegionEnabled'] = options.clipRegionEnabled; + params['clipRegion'] = JSON.stringify(ServerGeometry.fromGeometry(toSuperMapGeometry(options.clipRegion))); + } + + if (options.overlapDisplayed === false) { + params['overlapDisplayed'] = false; + + if (options.overlapDisplayedOptions) { + params['overlapDisplayedOptions'] = me.overlapDisplayedOptions.toString(); + } + } else { + params['overlapDisplayed'] = true; + } + + return params; + }, + //初始化请求链接 + _requestImage: function _requestImage(params, bounds) { + var imageUrl = this.getImageUrl(params); + + this._loadImage(imageUrl, bounds); + }, + //加载请求图层 + _loadImage: function _loadImage(url, bounds) { + if (!this._map) { + return; + } + + var image = new external_L_namespaceObject.ImageOverlay(url, bounds, { + opacity: 0, + alt: this.options.alt, + zIndex: this.options.zIndex, + className: this.options.className, + errorOverlayUrl: this.options.error, + crossOrigin: this.options.crossOrigin, + pane: this.options.pane || this.getPane(), + interactive: this.options.interactive + }).addTo(this._map); + + var onLoad = function onLoad(e) { + image.off('error', onLoad, this); + var map = this._map; + + if (!map) { + return; + } + + var newImage = e.target; + var oldImage = this._currentImage; + + if (newImage._bounds && newImage._bounds.equals(bounds) && newImage._bounds.equals(map.getBounds())) { + this._currentImage = newImage; + + if (this.options.position === 'front') { + this.bringToFront(); + } + + if (this.options.position === 'back') { + this.bringToBack(); + } + + if (this._currentImage._map) { + this._currentImage.setOpacity(this.options.opacity); + } + + oldImage && map.removeLayer(oldImage); + oldImage && oldImage._map && oldImage._map.removeLayer(oldImage); + } else { + map.removeLayer(newImage); + } + /** + * @event ImageMapLayer#load + * @description 请求图层加载完成后触发。 + * @property {L.Bounds} bounds - 图层 bounds。 + */ + + + this.fire('load', { + bounds: bounds + }); + }; + + image.once('load', onLoad, this); + image.once('error', function () { + this._map.removeLayer(image); + /** + * @event ImageMapLayer#error + * @description 请求图层加载失败后触发。 + */ + + + this.fire('error'); + image.off('load', onLoad, this); + }, this); + /** + * @event ImageMapLayer#loading + * @description 请求图层加载中触发。 + * @property {L.Bounds} bounds - 图层 bounds。 + */ + + this.fire('loading', { + bounds: bounds + }); + }, + + /** + * @function ImageMapLayer.prototype.update + * @description 更新图层。 + */ + update: function update() { + if (!this._map) { + return; + } + + var zoom = this._map.getZoom(); + + var bounds = this._map.getBounds(); + + if (zoom > (this._map.options.maxZoom || 18) || zoom < (this._map.options.minZoom || 0)) { + if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + + this._currentImage = null; + } + + return; + } + + var params = this._getImageParams(); + + if (params) { + this._requestImage(params, bounds); + } else if (this._currentImage) { + this._currentImage._map.removeLayer(this._currentImage); + + this._currentImage = null; + } + }, + //将像素坐标转成点坐标 + _calculateBounds: function _calculateBounds() { + var pixelBounds = this._map.getPixelBounds(); + + var sw = this._map.unproject(pixelBounds.getBottomLeft()); + + var ne = this._map.unproject(pixelBounds.getTopRight()); + + var neProjected = this._map.options.crs.project(ne); + + var swProjected = this._map.options.crs.project(sw); + + return external_L_default().bounds(neProjected, swProjected); + }, + //转换viewBounds为JSON字符串 + _compriseBounds: function _compriseBounds(boundsProjected) { + var projBounds = { + leftBottom: { + x: boundsProjected.getBottomLeft().x, + y: boundsProjected.getTopRight().y + }, + rightTop: { + x: boundsProjected.getTopRight().x, + y: boundsProjected.getBottomLeft().y + } + }; + return JSON.stringify(projBounds); + }, + //计算图层的宽高 + _calculateImageSize: function _calculateImageSize() { + var map = this._map; + var bounds = map.getPixelBounds(); + var size = map.getSize(); + var sw = map.unproject(bounds.getBottomLeft()); + var ne = map.unproject(bounds.getTopRight()); + var top = map.latLngToLayerPoint(ne).y; + var bottom = map.latLngToLayerPoint(sw).y; + + if (top > 0 || bottom < size.y) { + size.y = bottom - top; + } + + return size; + } +}); +var imageMapLayer = function imageMapLayer(url, options) { + return new ImageMapLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/TileLayer.WMTS.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class WMTSLayer + * @deprecatedclassinstance L.supermap.wmtsLayer + * @classdesc wmts 图层类。 + * @category OGC + * @extends {L.TileLayer} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.layer - 显示的图层。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {Object} [options.style] - 图层样式。 + * @param {string} [options.format='image/png'] - wmts 图像格式('image/png'用于具有透明度的图层)。 + * @param {(number|L.Point)} [options.tileSize='256'] - 瓦片大小。 + * @param {string} [options.requestEncoding='KVP'] - KVP 或者 REST 的请求方式。 + * @param {string} [options.tilematrixSet] - 瓦片矩阵集。 + * @param {Array.} [options.matrixIds] - 瓦片矩阵对象。不设置时,默认为获取当前级别为 tilematrix 参数。 + * @param {string} [options.version='1.0.0'] - 版本。 + * @param {string} [options.attribution] - 版权信息。 + * @param {string} [options.noWrap=true] - 图层是否 X 方向平铺。 + * @usage + */ + +/** + * @typedef {Object} WMTSLayer.matrix + * @description 瓦片矩阵。 + * @property {string} identifier - 瓦片矩阵标识符。 + */ + +var WMTSLayer = external_L_default().TileLayer.extend({ + options: { + version: '1.0.0', + style: '', + tilematrixSet: '', + format: 'image/png', + tileSize: 256, + matrixIds: null, + layer: '', + requestEncoding: 'KVP', + attribution: '', + noWrap: true + }, + //todo 自动获取Capabilities + initialize: function initialize(url, options) { + // (String, Object) + this._url = url; + external_L_default().setOptions(this, options); + var opt = this.options; + + if (opt.requestEncoding === "REST") { + var formatSuffixMap = { + "image/png": "png", + "image/png8": "png", + "image/png24": "png", + "image/png32": "png", + "png": "png", + "image/jpeg": "jpg", + "image/jpg": "jpg", + "jpeg": "jpg", + "jpg": "jpg" + }; + this.formatSuffix = "." + (formatSuffixMap[opt.format] || opt.format.split("/").pop() || "png"); + } else { + opt.requestEncoding = "KVP"; + } + }, + + /** + * @function WMTSLayer.prototype.getTileUrl + * @description 获取切片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 切片地址。 + */ + getTileUrl: function getTileUrl(coords) { + // (Point, Number) -> String + var zoom = this._getZoomForUrl(); + + var ident = this.options.matrixIds ? this.options.matrixIds[zoom].identifier : zoom; + var url = external_L_default().Util.template(this._url, { + s: this._getSubdomain(coords) + }); + var obj = { + service: 'WMTS', + request: 'GetTile', + version: this.options.version, + style: this.options.style, + tilematrixSet: this.options.tilematrixSet, + format: this.options.format, + width: this.options.tileSize, + height: this.options.tileSize, + layer: this.options.layer, + tilematrix: ident, + tilerow: coords.y, + tilecol: coords.x + }; + + if (this.options.tileProxy) { + url = this.options.tileProxy + url; + } + + if (this.options.requestEncoding === 'KVP') { + url += external_L_default().Util.getParamString(obj, url); + } else if (this.options.requestEncoding === 'REST') { + var params = "/" + obj.layer + "/" + obj.style + "/" + obj.tilematrixSet + "/" + obj.tilematrix + "/" + obj.tilerow + "/" + obj.tilecol + this.formatSuffix; + url += params; + } + + return url; + } +}); +var wmtsLayer = function wmtsLayer(url, options) { + return new WMTSLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/TiandituTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TiandituTileLayer + * @deprecatedclassinstance L.supermap.tiandituTileLayer + * @classdesc 天地图图层类。 + * @category ThirdPartyMap + * @extends WMTSLayer + * @param {Object} options - 参数。 + * @param {string} [options.url='https://t{s}.tianditu.gov.cn/{layer}_{proj}/wmts?'] - 服务地址。 + * @param {string} options.key - 天地图服务密钥。详见 {@link https://lbs.tianditu.gov.cn/server/MapService.html} + * @param {string} [options.layerType='vec'] - 图层类型。( vec: 矢量图层,img: 影像图层,ter: 地形图层) + * @param {string} [options.style='default'] - 图层风格。 + * @param {string} [options.format='tiles'] - 格式。 + * @param {boolean} [options.isLabel=false] - 是否是标注图层。 + * @param {Array.} [options.subdomains=[0, 1, 2, 3, 4, 5, 6, 7]] - 子域名数组。 + * @param {string} [options.attribution='Map Data '] - 版权信息 + * @param {string} [options.noWrap=true] - 图层是否 X 方向平铺。 + * @usage + */ + +var TiandituTileLayer = WMTSLayer.extend({ + layerLabelMap: { + vec: 'cva', + ter: 'cta', + img: 'cia' + }, + layerZoomMap: { + vec: 18, + ter: 14, + img: 18 + }, + options: { + layerType: 'vec', + //(vec:矢量图层,vec:矢量标签图层,img:影像图层,cia:影像标签图层,ter:地形,cta:地形标签图层) + isLabel: false, + attribution: core_Attributions.Tianditu.attribution, + url: 'https://t{s}.tianditu.gov.cn/{layer}_{proj}/wmts?', + zoomOffset: 1, + key: '', + dpi: 96, + style: 'default', + format: 'tiles', + subdomains: [0, 1, 2, 3, 4, 5, 6, 7], + bounds: [[-90, -180], [90, 180]], + noWrap: true + }, + initialize: function initialize(options) { + options = options || {}; + external_L_default().setOptions(this, options); + this.options.layer = this.options.isLabel ? this.layerLabelMap[this.options.layerType] : this.options.layerType; + this.options.maxZoom = this.layerZoomMap[this.options.layerType] - 1; + WMTSLayer.prototype.initialize.call(this, this.options.url, this.options); + external_L_default().stamp(this); + + if (this.options.key) { + this._url = "".concat(this._url, "tk=").concat(this.options.key); + } + }, + onAdd: function onAdd(map) { + this.options.tilematrixSet = map.options.crs.code === "EPSG:4326" ? "c" : "w"; + this._url = this._url.replace("{layer}", this.options.layer).replace("{proj}", this.options.tilematrixSet); + WMTSLayer.prototype.onAdd.call(this, map); + }, + _isValidTile: function _isValidTile(coords) { + var crs = this._map.options.crs; + + if (!crs.infinite) { + var bounds = this._globalTileRange; + + if ((!crs.wrapLng || this.options.noWrap) && (coords.x < bounds.min.x || coords.x > bounds.max.x) || !crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y)) { + return false; + } + } + + if (!this.options.bounds) { + return true; + } + + var tileBounds = this._tileCoordsToBounds(coords); + + return external_L_default().latLngBounds(this.options.bounds).overlaps(tileBounds); + } +}); +var tiandituTileLayer = function tiandituTileLayer(options) { + return new TiandituTileLayer(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/TiledMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class TiledMapLayer + * @deprecatedclassinstance L.supermap.tiledMapLayer + * @classdesc SuperMap iServer 的 REST 地图服务的图层(SuperMap iServer Java 6R 及以上分块动态 REST 图层)。使用 TileImage 资源出图。 + * @category iServer Map Tile + * @extends {L.TileLayer} + * @example + * new TiledMapLayer(url).addTo(map); + * @param {string} url - 服务地址,例如: http://{ip}:{port}/iserver/services/map-world/rest/maps/World。 + * @param {Object} options - 参数。 + * @param {string} [options.layersID] - 获取进行切片的地图图层 ID,即指定进行地图切片的图层,可以是临时图层集,也可以是当前地图中图层的组合 + * @param {boolean} [options.redirect=false] - 是否重定向,如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流。 + * @param {boolean} [options.transparent=true] - 是否背景透明。 + * @param {boolean} [options.cacheEnabled=true] - 启用缓存。 + * @param {boolean} [options.clipRegionEnabled=false] - 是否启用地图裁剪。 + * @param {L.Path} [options.clipRegion] - 地图显示裁剪的区域。是一个面对象,当 clipRegionEnabled = true 时有效,即地图只显示该区域覆盖的部分。 + * @param {Object} [options.prjCoordSys] - 请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857}。 + * @param {boolean} [options.overlapDisplayed=false] - 地图对象在同一范围内时,是否重叠显示。 + * @param {string} [options.overlapDisplayedOptions] - 避免地图对象压盖显示的过滤选项。 + * @param {string} [options.tileversion] - 切片版本名称,cacheEnabled 为 true 时有效。如果没有设置 tileversion 参数,而且当前地图的切片集中存在多个版本,则默认使用最后一个更新版本。 + * @param {CRS} [options.crs] - 坐标系统类。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @param {string} [options.format='png'] - 瓦片表述类型,支持 "png" 、"webp"、"bmp" 、"jpg"、 "gif" 等图片格式。 + * @param {(number|L.Point)} [options.tileSize=256] - 瓦片大小。 + * @param {(NDVIParameter|HillshadeParameter)} [options.rasterfunction] - 栅格分析参数。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @param {Array.} [options.subdomains] - 子域名数组。 + * @fires TiledMapLayer#tilesetsinfoloaded + * @fires TiledMapLayer#tileversionschanged + * @usage + */ + +var TiledMapLayer = external_L_default().TileLayer.extend({ + options: { + //如果有layersID,则是在使用专题图 + layersID: null, + //如果为 true,则将请求重定向到瓦片的真实地址;如果为 false,则响应体中是瓦片的字节流 + redirect: false, + transparent: true, + cacheEnabled: true, + clipRegionEnabled: false, + //地图显示裁剪的区域 + clipRegion: null, + //请求的地图的坐标参考系统。 如:prjCoordSys={"epsgCode":3857} + prjCoordSys: null, + //地图对象在同一范围内时,是否重叠显示 + overlapDisplayed: false, + //避免地图对象压盖显示的过滤选项 + overlapDisplayedOptions: null, + //切片版本名称,cacheEnabled 为 true 时有效。 + tileversion: null, + crs: null, + format: 'png', + //启用托管地址。 + tileProxy: null, + attribution: core_Attributions.Common.attribution, + subdomains: null + }, + initialize: function initialize(url, options) { + this._url = url; + external_L_default().TileLayer.prototype.initialize.apply(this, arguments); + external_L_default().setOptions(this, options); + external_L_default().stamp(this); //当前切片在切片集中的index + + this.tileSetsIndex = -1; + this.tempIndex = -1; + }, + + /** + * @private + * @function TiledMapLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + this._crs = this.options.crs || map.options.crs; + external_L_default().TileLayer.prototype.onAdd.call(this, map); + }, + + /** + * @function TiledMapLayer.prototype.getTileUrl + * @description 根据行列号获取瓦片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 瓦片地址。 + */ + getTileUrl: function getTileUrl(coords) { + var scale = this.getScaleFromCoords(coords); + + var layerUrl = this._getLayerUrl(); + + var tileUrl = layerUrl + "&scale=" + scale + "&x=" + coords.x + "&y=" + coords.y; //支持代理 + + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + + if (!this.options.cacheEnabled) { + tileUrl += "&_t=" + new Date().getTime(); + } + + if (this.options.subdomains) { + tileUrl = external_L_default().Util.template(tileUrl, { + s: this._getSubdomain(coords) + }); + } + + return tileUrl; + }, + + /** + * @function TiledMapLayer.prototype.getScale + * @description 根据缩放级别获取比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 比例尺。 + */ + getScale: function getScale(zoom) { + var me = this; //返回当前比例尺 + + var z = zoom || me._map.getZoom(); + + return me.scales[z]; + }, + + /** + * @function TiledMapLayer.prototype.getScaleFromCoords + * @description 通过行列号获取比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 比例尺。 + */ + getScaleFromCoords: function getScaleFromCoords(coords) { + var me = this, + scale; + + if (me.scales && me.scales[coords.z]) { + return me.scales[coords.z]; + } + + me.scales = me.scales || {}; + scale = me.getDefaultScale(coords); + me.scales[coords.z] = scale; + return scale; + }, + + /** + * @private + * @function TiledMapLayer.prototype.getDefaultScale + * @description 获取默认比例尺信息。 + * @param {Object} coords - 坐标对象参数。 + */ + getDefaultScale: function getDefaultScale(coords) { + var me = this, + crs = me._crs; + + if (crs.scales) { + return crs.scales[coords.z]; + } else { + var tileBounds = me._tileCoordsToBounds(coords); + + var ne = crs.project(tileBounds.getNorthEast()); + var sw = crs.project(tileBounds.getSouthWest()); + var tileSize = me.options.tileSize; + var resolution = Math.max(Math.abs(ne.x - sw.x) / tileSize, Math.abs(ne.y - sw.y) / tileSize); + var mapUnit = Unit.METER; + + if (crs.code) { + var array = crs.code.split(':'); + + if (array && array.length > 1) { + var code = parseInt(array[1]); + mapUnit = code && code >= 4000 && code <= 5000 ? Unit.DEGREE : Unit.METER; + } + } + + return resolutionToScale(resolution, 96, mapUnit); + } + }, + + /** + * @function TiledMapLayer.prototype.setTileSetsInfo + * @description 设置瓦片集信息。 + * @param {Object} tileSets - 瓦片对象集。 + */ + setTileSetsInfo: function setTileSetsInfo(tileSets) { + this.tileSets = tileSets; + + if (external_L_default().Util.isArray(this.tileSets)) { + this.tileSets = this.tileSets[0]; + } + + if (!this.tileSets) { + return; + } + /** + * @event TiledMapLayer#tilesetsinfoloaded + * @description 瓦片集信息设置完成后触发。 + * @property {Array.} tileVersions - 瓦片集信息。 + */ + + + this.fire('tilesetsinfoloaded', { + tileVersions: this.tileSets.tileVersions + }); + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.lastTilesVersion + * @description 请求上一个版本切片,并重新绘制。 + */ + lastTilesVersion: function lastTilesVersion() { + this.tempIndex = this.tileSetsIndex - 1; + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.nextTilesVersion + * @description 请求下一个版本切片,并重新绘制。 + */ + nextTilesVersion: function nextTilesVersion() { + this.tempIndex = this.tileSetsIndex + 1; + this.changeTilesVersion(); + }, + + /** + * @function TiledMapLayer.prototype.changeTilesVersion + * @description 切换到某一版本的切片,并重绘。通过 this.tempIndex 保存需要切换的版本索引 + */ + changeTilesVersion: function changeTilesVersion() { + var me = this; //切片版本集信息是否存在 + + if (me.tileSets == null) { + //版本信息为空,重新查询,查询成功继续跳转到相应的版本 + //me.getTileSetsInfo(); + return; + } + + if (me.tempIndex === me.tileSetsIndex || this.tempIndex < 0) { + return; + } //检测index是否可用 + + + var tileVersions = me.tileSets.tileVersions; + + if (tileVersions && me.tempIndex < tileVersions.length && me.tempIndex >= 0) { + var name = tileVersions[me.tempIndex].name; + var result = me.mergeTileVersionParam(name); + + if (result) { + me.tileSetsIndex = me.tempIndex; + /** + * @event TiledMapLayer#tileversionschanged + * @description 切片的版本切换和重绘成功之后触发。 + * @property {Object} tileVersion - 该版本的切片。 + */ + + me.fire('tileversionschanged', { + tileVersion: tileVersions[me.tempIndex] + }); + } + } + }, + + /** + * @function TiledMapLayer.prototype.updateCurrentTileSetsIndex + * @description 手动设置当前切片集索引,目前主要提供给控件使用。 + * @param {number} index - 索引值。 + */ + updateCurrentTileSetsIndex: function updateCurrentTileSetsIndex(index) { + this.tempIndex = index; + }, + + /** + * @function TiledMapLayer.prototype.mergeTileVersionParam + * @description 更改URL请求参数中的切片版本号,并重绘。 + * @param {string} version - 切片版本号。 + * @returns {boolean} 是否成功。 + */ + mergeTileVersionParam: function mergeTileVersionParam(version) { + if (version) { + this.requestParams["tileversion"] = version; + this._paramsChanged = true; + this.redraw(); + this._paramsChanged = false; + return true; + } + + return false; + }, + _getLayerUrl: function _getLayerUrl() { + if (this._paramsChanged) { + this._layerUrl = this._createLayerUrl(); + } + + return this._layerUrl || this._createLayerUrl(); + }, + _createLayerUrl: function _createLayerUrl() { + var layerUrl = Util.urlPathAppend(this._url, "tileImage.".concat(this.options.format)); + this.requestParams = this.requestParams || this._getAllRequestParams(); + layerUrl = Util.urlAppend(layerUrl, external_L_namespaceObject.Util.getParamString(this.requestParams)); + layerUrl = SecurityManager.appendCredential(layerUrl); + this._layerUrl = layerUrl; + return layerUrl; + }, + _getAllRequestParams: function _getAllRequestParams() { + var me = this, + options = me.options || {}, + params = {}; + var tileSize = this.options.tileSize; + + if (!(tileSize instanceof (external_L_default()).Point)) { + tileSize = external_L_default().point(tileSize, tileSize); + } + + params["width"] = tileSize.x; + params["height"] = tileSize.y; + params["redirect"] = options.redirect === true; + params["transparent"] = options.transparent === true; + params["cacheEnabled"] = !(options.cacheEnabled === false); + + if (options.prjCoordSys) { + params["prjCoordSys"] = JSON.stringify(options.prjCoordSys); + } + + if (options.layersID) { + params["layersID"] = options.layersID.toString(); + } + + if (options.clipRegionEnabled && options.clipRegion) { + options.clipRegion = ServerGeometry.fromGeometry(toSuperMapGeometry(options.clipRegion)); + params["clipRegionEnabled"] = options.clipRegionEnabled; + params["clipRegion"] = JSON.stringify(options.clipRegion); + } //切片的起始参考点,默认为地图范围的左上角。 + + + var crs = me._crs; + + if (crs.options && crs.options.origin) { + params["origin"] = JSON.stringify({ + x: crs.options.origin[0], + y: crs.options.origin[1] + }); + } else if (crs.projection && crs.projection.bounds) { + var bounds = crs.projection.bounds; + var tileOrigin = external_L_default().point(bounds.min.x, bounds.max.y); + params["origin"] = JSON.stringify({ + x: tileOrigin.x, + y: tileOrigin.y + }); + } + + if (options.overlapDisplayed === false) { + params["overlapDisplayed"] = false; + + if (options.overlapDisplayedOptions) { + params["overlapDisplayedOptions"] = me.overlapDisplayedOptions.toString(); + } + } else { + params["overlapDisplayed"] = true; + } + + if (params.cacheEnabled === true && options.tileversion) { + params["tileversion"] = options.tileversion.toString(); + } + + if (options.rasterfunction) { + params["rasterfunction"] = JSON.stringify(options.rasterfunction); + } + + return params; + } +}); +var tiledMapLayer = function tiledMapLayer(url, options) { + return new TiledMapLayer(url, options); +}; +// EXTERNAL MODULE: ./node_modules/jsonsql/index.js +var jsonsql = __webpack_require__(879); +var jsonsql_default = /*#__PURE__*/__webpack_require__.n(jsonsql); +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoDefaultStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @constant DefaultStyle + * @description 这个 style 对应的是默认设置。 + * @category BaseTypes Style + * @private + */ + +var DefaultStyle = { + /** + * @constant DefaultStyle.prototype.TEXT + * @description 默认文本样式。 + */ + "TEXT": { + fontSize: "14px", + fontFamily: "Arial Unicode MS Regular,Microsoft YaHei", + textAlign: "left", + color: "rgba(255,255,255,0)", + fillColor: "rgba(80,80,80,1)", + weight: 1, + globalAlpha: 1 + }, + + /** + * @constant DefaultStyle.prototype.POINT + * @description 默认点样式。 + */ + "POINT": { + fillColor: "#ffcc00", + color: "#cc3333", + weight: 1, + radius: 3, + opacity: 1 + }, + + /** + * @constant DefaultStyle.prototype.LINE + * @description 默认线样式。 + */ + "LINE": { + color: "rgba(0,0,0,0)", + weight: 1, + lineCap: "butt", + lineJoin: "round", + dashOffset: 0, + dashArray: [], + opacity: 1 + }, + + /** + * @constant DefaultStyle.prototype.REGION + * @description 默认多边形样式。 + */ + "REGION": { + color: "rgba(0,0,0,0)", + fillColor: "rgba(0,0,0,0)", + weight: 1, + lineCap: "butt", + lineJoin: "round", + dashOffset: 0, + opacity: 1, + fillOpacity: 1, + dashArray: [] + } +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoStyleMap.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @constant CartoStyleMap + * @description CartoCSS 中的 style 属性名与 leaflet 的 style 属性名的对应表。 + * @category BaseTypes Style + * @private + */ + +var CartoStyleMap = { + /* + * @constant CartoStyleMap.prototype.TEXT + * @description 默认文本样式。 + */ + "TEXT": { + "text-size": "fontSize", + "text-face-name": "fontFamily", + "text-align": "textAlign", + "text-name": "textName", + 'text-weight': 'fontWeight', + "text-halo-color": "color", + "text-fill": "fillColor", + "text-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.POINT + * @description 默认点样式。 + */ + "POINT": { + "point-file": "iconUrl", + "point-fill": "fillColor", + "point-radius": "radius", + "point-halo-color": "color", + "point-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.LINE + * @description 默认线样式。 + */ + "LINE": { + "line-color": "color", + "line-width": "weight", + "line-cap": "lineCap", + "line-join": "lineJoin", + "line-dash-offset": "dashOffset", + "line-opacity": "opacity", + "line-dasharray": "dashArray", + "line-comp-op": "globalCompositeOperation" + }, + + /* + * @constant CartoStyleMap.prototype.REGION + * @description 默认多边形样式。 + */ + "REGION": { + "line-color": "color", + "line-width": "weight", + "line-cap": "lineCap", + "line-join": "lineJoin", + "line-dash-offset": "dashOffset", + "line-opacity": "opacity", + "line-dasharray": "dashArray", + "polygon-fill": "fillColor", + "polygon-opacity": "fillOpacity", + "polygon-comp-op": "globalCompositeOperation" + } +}; +/** + * @constant ServerStyleMap + * @description 服务端传过来的 style 属性名与 leaflet 的 style 属性名的对应表。 + * @private + */ + +var ServerStyleMap = { + /** + * @member ServerStyleMap.prototype.lineWidth + * @description 线宽。 + */ + lineWidth: { + leafletStyle: "weight", + type: "number", + unit: "mm", + defaultValue: 0.1 + }, + + /** + * @member ServerStyleMap.prototype.fillForeColor + * @description 填充前景色。 + */ + fillForeColor: { + leafletStyle: "fillColor", + type: "color", + defaultValue: "rgba(0,0,0,0)" + }, + + /** + * @member ServerStyleMap.prototype.foreColor + * @description 前景色。 + */ + foreColor: { + leafletStyle: "color", + type: "color", + defaultValue: "rgba(0,0,0,0)" + }, + + /** + * @member ServerStyleMap.prototype.markerSize + * @description 图标大小。 + */ + markerSize: { + leafletStyle: "markerSize", + type: "number", + unit: "mm", + defaultValue: 2.4 + }, + + /** + * @member ServerStyleMap.prototype.lineColor + * @description 线要素颜色。 + */ + lineColor: { + leafletStyle: "color", + type: "color", + defaultValue: "#000000" + } +}; +/** + * @constant CompOpMap + * @description Canvas 中的 globalCompositeOperation 属性值与 CartoCSS 中的 CompOp 属性值对照表。 + * @private + */ + +var CompOpMap = { + "clear": "", + "src": "", + "dst": "", + "src-over": "source-over", + "dst-over": "destination-over", + "src-in": "source-in", + "dst-in": "destination-in", + "src-out": "source-out", + "dst-out": "destination-out", + "src-atop": "source-atop", + "dst-atop": "destination-atop", + "xor": "xor", + "plus": "lighter", + "minus": "", + "multiply": "", + "screen": "", + "overlay": "", + "darken": "", + "lighten": "lighter", + "color-dodge": "", + "color-burn": "", + "hard-light": "", + "soft-light": "", + "difference": "", + "exclusion": "", + "contrast": "", + "invert": "", + "invert-rgb": "", + "grain-merge": "", + "grain-extract": "", + "hue": "", + "saturation": "", + "color": "", + "value": "" +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/CartoCSSToLeaflet.js +function CartoCSSToLeaflet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function CartoCSSToLeaflet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function CartoCSSToLeaflet_createClass(Constructor, protoProps, staticProps) { if (protoProps) CartoCSSToLeaflet_defineProperties(Constructor.prototype, protoProps); if (staticProps) CartoCSSToLeaflet_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class CartoCSSToLeaflet + * @classdesc CartoCSS 样式转 Leaflet 样式类。 + * @category BaseTypes Style + * @param {string} url - 服务地址。 + * @private + */ + +var CartoCSSToLeaflet = /*#__PURE__*/function () { + function CartoCSSToLeaflet(url) { + CartoCSSToLeaflet_classCallCheck(this, CartoCSSToLeaflet); + + /** + * @member CartoCSSToLeaflet.prototype.cartoCSS + * @description CartoCSS 样式。 + */ + this.cartoCSS = null; + /** + * @member CartoCSSToLeaflet.prototype.mapUrl + * @description 地图服务地址。 + */ + + this.mapUrl = url; + } + /** + * @function CartoCSSToLeaflet.prototype.pretreatedCartoCSS + * @description CartoCSS 样式预处理。 + * @param {string} cartoStr - Carto 信息。 + * @param {Object} processCharacters - 需要处理的特征对象。 + */ + + + CartoCSSToLeaflet_createClass(CartoCSSToLeaflet, [{ + key: "pretreatedCartoCSS", + value: function pretreatedCartoCSS(cartoStr, processCharacters) { + if (processCharacters) { + cartoStr = this.processCharacters(cartoStr); + } + + this.cartoCSS = this.cartoCSS || {}; + var shaders = new CartoCSS(cartoStr).getShaders(); + + if (!shaders) { + return; + } + + for (var i = 0; i < shaders.length; i++) { + var element = shaders[i].elements[0]; + var attachment = shaders[i].attachment; + this.cartoCSS[element.clean] = this.cartoCSS[element.clean] || {}; + this.cartoCSS[element.clean][attachment] = this.cartoCSS[element.clean][attachment] || []; + this.cartoCSS[element.clean][attachment].push(shaders[i]); + } + } + /** + * @function CartoCSSToLeaflet.prototype.processCharacters + * @description 替换一些关键符号。 + * @param {string} cartoCSSStr - cartoCSSS 信息。 + */ + + }, { + key: "processCharacters", + value: function processCharacters(cartoCSSStr) { + var style = cartoCSSStr; + + if (!style) { + return; + } + + var me = this; + style = style.replace(/[@]/gi, "___"); + style = style.replace(/\\#/gi, "\#"); + var cachedLayer = {}; + me.layersInfo && Object.keys(me.layersInfo).sort().forEach(function (attr) { + var newAttr = attr.replace(/[@#\s]/gi, "___"); + var to = attr; + var keys = Object.keys(cachedLayer); + + for (var index = keys.length; index > -1; index--) { + if (attr.indexOf(keys[index]) > -1) { + to = attr.replace(keys[index], cachedLayer[keys[index]]); + break; + } + } + + to = to.replace(/[#]/gi, "\#"); + cachedLayer[attr] = newAttr; + style = style.replace(new RegExp(to, "g"), newAttr); + }); + style = style.replace(/[#]/gi, "\n#"); //将zoom转化为scale,以免引起混淆 + + style = style.replace(/\[zoom/gi, "[scale"); + return style; + } + /** + * @function CartoCSSToLeaflet.prototype.pickShader + * @description 拾取着色对象。 + * @param {string} layerName - 图层名称。 + */ + + }, { + key: "pickShader", + value: function pickShader(layerName) { + if (!this.cartoCSS) { + return null; + } + + var name = layerName.replace(/[@#\s]/gi, "___"); + return this.cartoCSS[name]; + } + /** + * @function CartoCSSToLeaflet.prototype.getDefaultStyle + * @description 获取默认风格。 + * @param {string} type - 默认风格类型。 + */ + + }, { + key: "getDefaultStyle", + value: function getDefaultStyle(type) { + var style = {}; //设置默认值 + + var expandStyle = DefaultStyle[type]; + + for (var prop in expandStyle) { + var val = expandStyle[prop]; + style[prop] = val; + } + + return style; + } + /** + * @function CartoCSSToLeaflet.prototype.getStyleFromiPortalMarker + * @description 从 iPortalMarker 中获取样式。 + * @param {string} icon - iPortal 图标。 + */ + + }, { + key: "getStyleFromiPortalMarker", + value: function getStyleFromiPortalMarker(icon) { + if (icon.indexOf("./") == 0) { + return null; + } //兼容iportal示例的问题 + + + if (icon.indexOf("http://support.supermap.com.cn:8092/static/portal") == 0) { + icon = icon.replace("http://support.supermap.com.cn:8092/static/portal", "http://support.supermap.com.cn:8092/apps/viewer/static"); + } + + return external_L_default().icon({ + iconUrl: icon, + iconSize: external_L_default().point(48, 43), + iconAnchor: external_L_default().point(24, 43), + popupAnchor: external_L_default().point(0, -43) + }); + } + /** + * @function CartoCSSToLeaflet.prototype.getStyleFromiPortalStyle + * @description 从 iPortal 的风格中获取样式。 + * @param {Object} iPortalStyle - iPortal 的样式对象。 + * @param {string} type - 样式类型。 + * @param {Object} [fStyle] - 图标参数。 + */ + + }, { + key: "getStyleFromiPortalStyle", + value: function getStyleFromiPortalStyle(iPortalStyle, type, fStyle) { + var featureStyle = fStyle ? JSON.parse(fStyle) : null; + var style = {}; + + if (type === 'Point' || type === 'MultiPoint') { + var pointStyle = featureStyle || iPortalStyle.pointStyle; + + if (pointStyle.externalGraphic) { + if (pointStyle.externalGraphic.indexOf("./") == 0) { + return null; + } //兼容iportal示例的问题 + + + if (pointStyle.externalGraphic.indexOf("http://support.supermap.com.cn:8092/static/portal") == 0) { + pointStyle.externalGraphic = pointStyle.externalGraphic.replace("http://support.supermap.com.cn:8092/static/portal", "http://support.supermap.com.cn:8092/apps/viewer/static"); + } + + return external_L_default().icon({ + iconUrl: pointStyle.externalGraphic, + iconSize: external_L_default().point(pointStyle.graphicWidth, pointStyle.graphicHeight), + iconAnchor: external_L_default().point(-pointStyle.graphicXOffset, -pointStyle.graphicYOffset), + popupAnchor: external_L_default().point(0, -pointStyle.graphicHeight) + }); + } + + style.radius = pointStyle.pointRadius; + style.color = pointStyle.strokeColor; + style.opacity = pointStyle.strokeOpacity; + style.lineCap = pointStyle.strokeLineCap; + style.weight = pointStyle.strokeWidth; + style.fillColor = pointStyle.fillColor; + style.fillOpacity = pointStyle.fillOpacity; + style.dashArray = this.dashStyle(pointStyle, 1); + return style; + } + + if (type === 'LineString' || type === 'MultiLineString' || type === 'Box') { + var lineStyle = featureStyle || iPortalStyle.lineStyle; + style.color = lineStyle.strokeColor; + style.opacity = lineStyle.strokeOpacity; + style.fillOpacity = lineStyle.fillOpacity; + style.lineCap = lineStyle.strokeLineCap; + style.weight = lineStyle.strokeWidth; + style.dashArray = this.dashStyle(lineStyle, 1); + return style; + } + + if (type === 'Polygon' || type === 'MultiPolygon') { + var polygonStyle = featureStyle || iPortalStyle.polygonStyle; + style.color = polygonStyle.strokeColor; + style.opacity = polygonStyle.strokeOpacity; + style.lineCap = polygonStyle.strokeLineCap; + style.weight = polygonStyle.strokeWidth; + style.fillColor = polygonStyle.fillColor; + style.fillOpacity = polygonStyle.fillOpacity; + style.dashArray = this.dashStyle(polygonStyle, 1); + return style; + } + } + /** + * @function CartoCSSToLeaflet.prototype.dashStyle + * @description 符号样式。 + * @param {Object} style - 样式参数。 + * @param {number} widthFactor - 宽度系数。 + */ + + }, { + key: "dashStyle", + value: function dashStyle(style, widthFactor) { + if (!style) { + return []; + } + + var w = style.strokeWidth * widthFactor; + var str = style.strokeDashstyle; + + switch (str) { + case 'solid': + return []; + + case 'dot': + return [1, 4 * w]; + + case 'dash': + return [4 * w, 4 * w]; + + case 'dashdot': + return [4 * w, 4 * w, 1, 4 * w]; + + case 'longdash': + return [8 * w, 4 * w]; + + case 'longdashdot': + return [8 * w, 4 * w, 1, 4 * w]; + + default: + if (!str) { + return []; + } + + if (Util.isArray(str)) { + return str; + } + + str = StringExt.trim(str).replace(/\s+/g, ","); + return str.replace(/\[|\]/gi, "").split(","); + } + } + /** + * @function CartoCSSToLeaflet.prototype.getValidStyleFromCarto + * @description 从 Carto 中获取有效的样式。 + * @param {number} zoom - 缩放级别。 + * @param {number} scale - 比例尺。 + * @param {Array.} shader - 渲染器对象数组。 + * @param {Object} feature - 要素。 + * @param {string} [fromServer] - 服务源。 + */ + + }, { + key: "getValidStyleFromCarto", + value: function getValidStyleFromCarto(zoom, scale, shader, feature, fromServer) { + if (!shader) { + return null; + } + + var type = feature.type, + attributes = feature.properties.attributes || {}, + style = this.getDefaultStyle(type); + fromServer = fromServer === undefined ? true : fromServer; + attributes.FEATUREID = feature.properties.id; + attributes.SCALE = scale; + var cartoStyleMap = CartoStyleMap[type]; + var fontSize, fontName; + + for (var i = 0, len = shader.length; i < len; i++) { + var _shader = shader[i]; + var prop = cartoStyleMap[_shader.property]; + + var value = _shader.getValue(attributes, zoom, true); + + if (value !== null && prop) { + if (prop === "fontSize") { + if (fromServer) { + value *= 0.8; + } + + fontSize = value + "px"; + style.fontSize = fontSize; + } else if (prop === "fontName") { + fontName = value; + style.fontName = fontName; + } else { + if (prop === "globalCompositeOperation") { + value = CompOpMap[value]; + + if (!value) { + continue; + } + } else if (fromServer && prop === 'iconUrl') { + value = this.mapUrl + '/tileFeature/symbols/' + value.replace(/(___)/gi, '@'); + value = value.replace(/(__0__0__)/gi, '__8__8__'); + style["iconUrl"] = value; + continue; + } + + if (prop === 'weight' && value < 1) { + value = Math.ceil(value); + } + + style[prop] = value; + } + } + } + + return style; + } + /** + * @function CartoCSSToLeaflet.prototype.getValidStyleFromLayerInfo + * @description 通过图层信息获取有效的样式。 + * @param {Feature} feature - 要素。 + * @param {Object} layerInfo - 图层信息。 + */ + + }, { + key: "getValidStyleFromLayerInfo", + value: function getValidStyleFromLayerInfo(feature, layerInfo) { + var type = feature.type, + style = this.getDefaultStyle(type), + shader = layerInfo && layerInfo.layerStyle; + + if (!shader) { + return style; + } + + if (type === "POINT") { + var size = Math.ceil(shader.markerSize * DOTS_PER_INCH * INCHES_PER_UNIT.mm) || 8; + var symbolParameters = { + "transparent": true, + "resourceType": "SYMBOLMARKER", + "picWidth": size, + "picHeight": size, + "style": JSON.stringify(shader) + }; + style.iconUrl = Util.urlAppend(this.mapUrl + "/symbol.png", Util.getParameterString(symbolParameters)); + style.iconSize = [size, size]; + return style; + } + + if (type === "TEXT") { + shader = feature.properties.textStyle || layerInfo.layerStyle; //设置文本是否使用粗体 + + style.fontWeight = shader.bold ? shader.fontWeight : "normal"; //设置文本的尺寸(对应fontHeight属性)和行高,行高iserver不支持,默认5像素 + //固定大小的时候单位是毫米 + + if (shader.fontHeight) { + var text_h = shader.fontHeight * DOTS_PER_INCH * INCHES_PER_UNIT.mm * 0.85; //毫米转像素,服务端的字体貌似要稍微小一点 + + style.fontSize = text_h + "px"; + style.textHeight = text_h; + } //设置文本字体类型 + //在桌面字体钱加@时为了解决对联那种形式,但是在canvas不支持,并且添加了@会导致 + //字体大小被固定,这里需要去掉 + + + if (shader.fontName) { + style.fontFamily = shader.fontName.indexOf("@") ? shader.fontName.replace(/@/g, "") : shader.fontName; + } //设置对齐方式 + + + if (shader.align) { + var alignStr = shader.align.replace(/TOP|MIDDLE|BASELINE|BOTTOM/, ""); + style.textAlign = alignStr.toLowerCase(); + } + + style.weight = shader.outline ? shader.outlineWidth : 0; + + if (shader.backColor) { + style.color = "rgba(" + shader.backColor.red + "," + shader.backColor.green + "," + shader.backColor.blue + ",1)"; + } + + if (shader.foreColor) { + style.fillColor = "rgba(" + shader.foreColor.red + "," + shader.foreColor.green + "," + shader.foreColor.blue + ",1)"; + } + + style.rotation = shader.rotation || 0; + return style; + } //目前只实现桌面系统默认的几种symbolID,非系统默认的面用颜色填充替代,线则用实线来替代 + + + var fillSymbolID = shader["fillSymbolID"] > 7 ? 0 : shader["fillSymbolID"]; + var lineSymbolID = shader["lineSymbolID"] > 5 ? 0 : shader["lineSymbolID"]; + + for (var attr in shader) { + var obj = ServerStyleMap[attr]; + + if (!obj) { + continue; + } + + var leafletStyle = obj.leafletStyle; + + switch (obj.type) { + case "number": + { + var value = shader[attr]; + + if (obj.unit) { + value = value * DOTS_PER_INCH * INCHES_PER_UNIT[obj.unit] * 2.5; + } + + style[leafletStyle] = value; + break; + } + + case "color": + { + var color = shader[attr]; + + var _value = void 0, + alpha = 1; + + if (leafletStyle === "fillColor") { + if (fillSymbolID === 0 || fillSymbolID === 1) { + //当fillSymbolID为0时,用颜色填充,为1是无填充,即为透明填充,alpha通道为0 + alpha = 1 - fillSymbolID; + _value = "rgba(" + color.red + "," + color.green + "," + color.blue + "," + alpha + ")"; + } + } else if (leafletStyle === "color") { + if (lineSymbolID === 0 || lineSymbolID === 5) { + //对于lineSymbolID为0时,线为实线,为lineSymbolID为5时,为无线模式,即线为透明,即alpha通道为0 + alpha = lineSymbolID === 0 ? 1 : 0; + } else { + //以下几种linePattern分别模拟了桌面的SymbolID为1~4几种符号的linePattern + var linePattern = [1, 0]; + + switch (lineSymbolID) { + case 1: + linePattern = [9.7, 3.7]; + break; + + case 2: + linePattern = [3.7, 3.7]; + break; + + case 3: + linePattern = [9.7, 3.7, 2.3, 3.7]; + break; + + case 4: + linePattern = [9.7, 3.7, 2.3, 3.7, 2.3, 3.7]; + break; + + default: + break; + } + + style.lineDasharray = linePattern; + } + + _value = "rgba(" + color.red + "," + color.green + "," + color.blue + "," + alpha + ")"; + } + + style[leafletStyle] = _value; + break; + } + + default: + break; + } + } //处理标签文本的情况 + + + if (layerInfo.textField) { + style.textAlign = "LEFT"; + } + + return style; + } + }]); + + return CartoCSSToLeaflet; +}(); +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/Graphic.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class Graphic + * @deprecatedclassinstance L.supermap.graphic + * @classdesc 高效率点图层要素类。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {L.LatLng} options.latLng - 经纬度。 + * @param {number} options.id - 要素id。 + * @param {(CircleStyle|CloverStyle|ImageStyle)} [options.style] - 点样式。 + * @param {Object} [options.attributes] - 要素属性。 + * @usage + */ + +var Graphic = external_L_default().Class.extend({ + initialize: function initialize(options) { + options = options || {}; + var latLng = options.latLng || options._latLng; + this._latLng = external_L_default().latLng(latLng.lat, latLng.lng); + this._style = options.style || options._canvas; + this.attributes = options.attributes; + this.id = options.id ? options.id : null; + }, + + /** + * @function Graphic.prototype.getId + * @description 获取当前要素 ID。 + * @returns {string} 要素 ID。 + */ + getId: function getId() { + return this.id; + }, + + /** + * @function Graphic.prototype.setId + * @description 设置当前要素 ID。 + * @param {string} id - 要素 ID。 + */ + setId: function setId(id) { + this.id = id; + }, + + /** + * @function Graphic.prototype.setLatLng + * @description 设置经纬度。 + * @param {L.LatLng} latLng - 经纬度参数。 + */ + setLatLng: function setLatLng(latLng) { + this._latLng = latLng; + }, + + /** + * @deprecated + * @function Graphic.prototype.setCanvas + * @description 设置画布,已弃用该设置,请使用 setStyle 接口。 + * @param {HTMLCanvasElement} canvas - 传入需要设置的画布。 + */ + setCanvas: function setCanvas(canvas) { + this._style = canvas; + }, + + /** + * @function Graphic.prototype.setAttributes + * @description 设置要素属性。 + * @param {Object} attributes - 属性对象。 + */ + setAttributes: function setAttributes(attributes) { + this.attributes = attributes; + }, + + /** + * @function Graphic.prototype.getLatLng + * @description 获取经纬度。 + * @returns {L.LatLng} 经纬度。 + */ + getLatLng: function getLatLng() { + return this._latLng; + }, + + /** + * @deprecated + * @function Graphic.prototype.getCanvas + * @description 获取画布,已弃用该设置,请使用 getStyle 接口 + * @returns {HTMLCanvasElement} 画布。 + */ + getCanvas: function getCanvas() { + return this._style; + }, + + /** + * @function Graphic.prototype.getAttributes + * @description 获取要素属性。 + * @returns {Object} 要素属性。 + */ + getAttributes: function getAttributes() { + return this.attributes; + }, + + /** + * @function Graphic.prototype.setStyle + * @description 设置样式。 + * @param {(CircleStyle|ImageStyle|CloverStyle)} style - 样式。 + */ + setStyle: function setStyle(style) { + this._style = style; + }, + + /** + * @function Graphic.prototype.getStyle + * @description 获取样式。 + * @returns {(CircleStyle|ImageStyle|CloverStyle)} 样式。 + */ + getStyle: function getStyle() { + return this._style; + } +}); +var graphic = function graphic(options) { + return new Graphic(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/ThemeFeature.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class ThemeFeature + * @deprecatedclassinstance L.supermap.themeFeature + * @classdesc 客户端专题图要素类。 + * 支持的 geometry 参数类型为 {@link L.Point},{@link L.LatLng},{@link L.Polyline},{@link L.Polygon}。 + * @category Visualization Theme + * @extends {L.Class} + * @param {(L.Path|L.Point|L.LatLng)} geometry - 要素图形。 + * @param {Object} attributes - 要素属性。 + * @usage + */ + +var ThemeFeature = external_L_default().Class.extend({ + initialize: function initialize(geometry, attributes) { + this.geometry = geometry; + this.attributes = attributes; + }, + + /** + * @function ThemeFeature.prototype.toFeature + * @description 转为内部矢量要素。 + * @returns {FeatureVector} 内部矢量要素。 + */ + toFeature: function toFeature() { + var geometry = this.geometry; + + if (geometry.toGeoJSON) { + var geojsonObject = geometry.toGeoJSON(); + geojsonObject.properties = this.attributes; + return new GeoJSON().read(geojsonObject)[0]; + } + + if (geometry.length === 3) { + geometry = new GeoText(geometry[1], geometry[0], geometry[2]); + } else if (geometry.length === 2) { + geometry = new Point(geometry[0], geometry[1]); + } else if (geometry instanceof (external_L_default()).LatLng) { + geometry = new Point(geometry.lng, geometry.lat); + } else if (geometry instanceof (external_L_default()).Point) { + geometry = new Point(geometry.x, geometry.y); + } else if (geometry instanceof (external_L_default()).CircleMarker) { + var latLng = geometry.getLatLng(); + geometry = new Point(latLng.lng, latLng.lat); + } + + return new Vector(geometry, this.attributes); + }, + + /** + * @function ThemeFeature.prototype.reverseLatLngs + * @description 坐标反转。 + * @param {L.LatLng} latlngs - 坐标值。 + */ + reverseLatLngs: function reverseLatLngs(latlngs) { + if (!external_L_default().Util.isArray(latlngs)) { + latlngs = [latlngs]; + } + + for (var i = 0; i < latlngs.length; i++) { + latlngs[i] = [latlngs[i].lng, latlngs[i].lat]; + } + + return latlngs; + } +}); +var themeFeature = function themeFeature(geometry, attributes) { + return new ThemeFeature(geometry, attributes); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/ThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class ThemeLayer + * @classdesc 专题图层基类,调用建议使用其子类实现类。 + * @category Visualization Theme + * @extends {L.Layer} + * @param {string} name - 专题图图层名称。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @fires ThemeLayer#featuresremoved + * @usage + */ + +var ThemeLayer = external_L_default().Layer.extend({ + options: { + //要素坐标是否和地图坐标系一致,默认为false,要素默认是经纬度坐标。 + alwaysMapCRS: false, + id: Util.createUniqueID("themeLayer_"), + opacity: 1, + // {Array} 专题要素事件临时存储,临时保存图层未添加到 map 前用户添加的事件监听,待图层添加到 map 后把这些事件监听添加到图层上,清空此图层。 + //这是一个二维数组,组成二维数组的每个一维数组长度为 2,分别是 event, callback。 + TFEvents: [], + attribution: core_Attributions.Common.attribution + }, + initialize: function initialize(name, options) { + external_L_default().Util.setOptions(this, options); + this.name = name; + this.features = []; + this.TFEvents = this.options.TFEvents; + this.levelRenderer = new LevelRenderer(); + this.movingOffset = [0, 0]; + }, + + /** + * @function ThemeLayer.prototype.getEvents + * @description 获取图层事件。 + * @returns {Object} 返回图层事件。 + */ + getEvents: function getEvents() { + var me = this; + var events = { + zoomend: me._reset, + moveend: me._reset, + resize: me._resize + }; + + if (this._map._zoomAnimated) { + events.zoomanim = me._zoomAnim; + } + + return events; + }, + + /** + * @function ThemeLayer.prototype.onRemove + * @description 删除某个地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onRemove: function onRemove(map) { + var me = this; + external_L_default().DomUtil.remove(me.container); + map.off("mousemove", me.mouseMoveHandler); + }, + + /** + * @function ThemeLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function onAdd(map) { + var me = this; + me.map = me._map = map; + + me._initContainer(); + + if (!me.levelRenderer) { + map.removeLayer(me); + return; + } //初始化渲染器 + + + var size = map.getSize(); + me.container.style.width = size.x + "px"; + me.container.style.height = size.y + "px"; + + me._updateOpacity(); + + me.renderer = me.levelRenderer.init(me.container); + me.renderer.clear(); + + if (me.features && me.features.length > 0) { + me._reset(); + } //处理用户预先(在图层添加到 map 前)监听的事件 + + + me.addTFEvents(); + + me.mouseMoveHandler = function (e) { + var xy = e.layerPoint; + me.currentMousePosition = external_L_default().point(xy.x + me.movingOffset[0], xy.y + me.movingOffset[1]); + }; + + map.on("mousemove", me.mouseMoveHandler); + me.update(map.getBounds()); + }, + + /** + * @function ThemeLayer.prototype.addFeatures + * @description 添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + */ + addFeatures: function addFeatures(features) {// eslint-disable-line no-unused-vars + //子类实现此方法 + }, + + /** + * @function ThemeLayer.prototype.redrawThematicFeatures + * @description 抽象方法,实例化子类前先执行此方法。 + * @param {L.Bounds} bounds - 重绘专题要素范围。 + */ + redrawThematicFeatures: function redrawThematicFeatures(bounds) {// eslint-disable-line no-unused-vars + //子类必须实现此方法 + }, + + /** + * @function ThemeLayer.prototype.destroyFeatures + * @description 销毁要素。 + * @param {Array.} features - 待销毁的要素。 + */ + destroyFeatures: function destroyFeatures(features) { + if (features === undefined) { + features = this.features; + } + + if (!features) { + return; + } + + this.removeFeatures(features); + + for (var i = features.length - 1; i >= 0; i--) { + features[i].destroy(); + } + }, + + /** + * @function ThemeLayer.prototype.removeFeatures + * @description 删除专题图中 features。 + * @param {Array.} features - 待删除的要素。 + */ + removeFeatures: function removeFeatures(features) { + var me = this; + + if (!features || features.length === 0) { + return; + } + + if (features === me.features) { + return me.removeAllFeatures(); + } + + if (!external_L_default().Util.isArray(features)) { + features = [features]; + } + + var featuresFailRemoved = []; + + for (var i = features.length - 1; i >= 0; i--) { + var feature = features[i]; //如果我们传入的feature在features数组中没有的话,则不进行删除, + //并将其放入未删除的数组中。 + + var findex = external_L_default().Util.indexOf(me.features, feature); + + if (findex === -1) { + featuresFailRemoved.push(feature); + continue; + } + + me.features.splice(findex, 1); + } + + var drawFeatures = []; + + for (var hex = 0, len = me.features.length; hex < len; hex++) { + feature = me.features[hex]; + drawFeatures.push(feature); + } + + me.features = []; + me.addFeatures(drawFeatures); //绘制专题要素 + + if (me.renderer) { + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + } + + var succeed = featuresFailRemoved.length == 0; + /** + * @event ThemeLayer#featuresremoved + * @description 成功删除要素之后触发。 + * @property {Array.} features - 事件对象。 + * @property {boolean} succeed - 要素是否删除成功,true 为删除成功,false 为删除失败。 + */ + + me.fire("featuresremoved", { + features: featuresFailRemoved, + succeed: succeed + }); + }, + + /** + * @function ThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function removeAllFeatures() { + var me = this; + + if (me.renderer) { + me.renderer.clear(); + } + + me.features = []; + me.fire("featuresremoved", { + features: [], + succeed: true + }); + }, + + /** + * @function ThemeLayer.prototype.getFeatures + * @description 查看当前图层中的有效数据。 + * @returns {Array} 返回图层中的有效数据。 + */ + getFeatures: function getFeatures() { + var me = this; + var len = me.features.length; + var clonedFeatures = new Array(len); + + for (var i = 0; i < len; ++i) { + clonedFeatures[i] = me.features[i]; + } + + return clonedFeatures; + }, + + /** + * @function ThemeLayer.prototype.getFeatureBy + * @description 过滤属性。 + * @param {string} property - 过滤某个属性名。 + * @param {string} value - 返回属性值。 + */ + getFeatureBy: function getFeatureBy(property, value) { + var me = this; + var feature = null; + + for (var id in me.features) { + if (me.features[id][property] !== value) { + continue; + } + + feature = me.features[id]; + break; + } + + return feature; + }, + + /** + * @function ThemeLayer.prototype.getFeatureById + * @description 返回指定 ID 的矢量要素,不存在则返回 null。 + * @param {number} featureId - 要素 ID。 + */ + getFeatureById: function getFeatureById(featureId) { + return this.getFeatureBy('id', featureId); + }, + + /** + * @function ThemeLayer.prototype.getFeaturesByAttribute + * @description 指定属性名和属性值,返回所有匹配的要素数组。 + * @param {string} attrName - 属性名。 + * @param {string} attrValue - 属性值。 + * @returns {Array} 返回所有匹配的要素数组。 + */ + getFeaturesByAttribute: function getFeaturesByAttribute(attrName, attrValue) { + var me = this, + feature, + foundFeatures = []; + + for (var id in me.features) { + feature = me.features[id]; + + if (feature && feature.attributes && feature.attributes[attrName] === attrValue) { + foundFeatures.push(feature); + } + } + + return foundFeatures; + }, + + /** + * @function ThemeLayer.prototype.update + * @description 更新图层。 + * @param {L.Bounds} bounds - 图层范围。 + */ + update: function update(bounds) { + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + + external_L_default().DomUtil.setPosition(this.container, mapOffset); + var me = this; // var bounds = me._map.getBounds(); + // var topLeft = me._map.latLngToLayerPoint(bounds.getNorthWest()); + // var mapOffset = [parseInt(topLeft.x, 10) || 0, parseInt(topLeft.y, 10) || 0] + // // var offsetLeft = parseInt(me._map.getContainer().style.left, 10); + // // offsetLeft = -Math.round(offsetLeft); + // //var offsetTop = parseInt(me._map.getContainer().style.top, 10); + // //offsetTop = -Math.round(offsetTop); + // me.container.style.left = mapOffset[0] + 'px'; + // me.container.style.top = mapOffset[1] + 'px'; + //绘制专题要素 + + if (me.renderer) { + me.redrawThematicFeatures(bounds); + } + + if (me.currentMousePosition) { + me.currentMousePosition = external_L_default().point(me.currentMousePosition.x - me.movingOffset[0], me.currentMousePosition.y - me.movingOffset[1]); + } + + me.movingOffset = [0, 0]; + me._zoom = me._map.getZoom(); + me._center = me._map.getCenter(); + }, + + /** + * @function ThemeLayer.prototype.setOpacity + * @description 设置图层的不透明度,取值 [0-1] 之间。 + * @param {number} opacity - 不透明度。 + */ + setOpacity: function setOpacity(opacity) { + var me = this; + + if (opacity === me.options.opacity) { + return; + } + + if (!isNaN(opacity)) { + me.options.opacity = opacity; + + me._updateOpacity(); + } + }, + + /** + * @function ThemeLayer.prototype.redraw + * @description 重绘该图层。 + * @returns {boolean} 返回是否重绘成功。 + */ + redraw: function redraw() { + var me = this; + + if (!me.renderer) { + return false; + } + + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + + return true; + }, + + /** + * @function ThemeLayer.prototype.on + * @description 监听事件。监听专题要素事件。 + * @param {Event} event - 监听事件。 + * @param {function} callback - 回调函数。 + * @param {string} context - 信息。 + */ + on: function on(event, callback, context) { + // eslint-disable-line no-unused-vars + if (this.renderer) { + this.renderer.on(event, callback); + } else { + external_L_default().Layer.prototype.on.call(this, event, callback); + } + + return this; + }, + + /** + * @function ThemeLayer.prototype.off + * @description 移除事件监听。 + * @param {Event} event - 监听事件。 + * @param {function} callback - 回调函数。 + * @param {string} context - 信息。 + */ + off: function off(event, callback, context) { + // eslint-disable-line no-unused-vars + var me = this; + + if (me.renderer) { + me.renderer.un(event, callback); + } else { + external_L_default().Layer.prototype.off.call(this, event, callback); + } + + return this; + }, + fire: function fire(type, data, propagate) { + // eslint-disable-line no-unused-vars + if (this.renderer) { + this.renderer.trigger(type, data); + } + + external_L_default().Layer.prototype.fire.call(this, type, data, propagate); + return this; + }, + + /** + * @function ThemeLayer.prototype.addTFEvents + * @description 先把事件监听添加到图层,再把图层添加到地图。 + * @private + */ + addTFEvents: function addTFEvents() { + var me = this; + var tfEs = me.TFEvents; + var len = tfEs.length; + + for (var i = 0; i < len; i++) { + me.renderer.on(tfEs[i][0], tfEs[i][1]); + } + }, + + /** + * @function ThemeLayer.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {Array} coordinate + */ + getLocalXY: function getLocalXY(coordinate) { + if (!this._map) { + return coordinate; + } + + var coor = coordinate; + + if (external_L_default().Util.isArray(coordinate)) { + coor = external_L_default().point(coordinate[0], coordinate[1]); + } + + if (!(coordinate instanceof (external_L_default()).Point)) { + if (coordinate instanceof Point || coordinate instanceof GeoText) { + coor = external_L_default().point(coordinate.x, coordinate.y); + } else { + coor = external_L_default().point(coordinate.lon, coordinate.lat); + } + } + + var point = this._map.latLngToAccurateContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(coor.y, coor.x) : this._map.options.crs.unproject(coor)); + + return [point.x, point.y]; + }, + + /** + * @function ThemeLayer.prototype.toiClientFeature + * @description 转为 iClient 要素。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + * @returns {Array.} 转换后的 iClient 要素。 + */ + toiClientFeature: function toiClientFeature(features) { + //若 features 非数组形式 feature 则先做以下处理: + if (!Util.isArray(features)) { + features = [features]; + } + + var featuresTemp = []; + + for (var i = 0; i < features.length; i++) { + //themeFeature 数据类型 + if (features[i] instanceof ThemeFeature) { + featuresTemp.push(features[i].toFeature()); + } else if (features[i] instanceof Vector) { + // 若是 FeatureVector 类型直接返回 + featuresTemp.push(features[i]); + } else if (["FeatureCollection", "Feature", "Geometry"].indexOf(features[i].type) != -1) { + //GeoJSON 规范数据类型 + var format = new GeoJSON(); + featuresTemp = featuresTemp.concat(format.read(features[i])); + } else if (features[i].geometry && features[i].geometry.parts) { + //iServer服务器返回数据格式 todo 暂未找到更好的参数判断,暂用 geometry.parts 试用 + featuresTemp.push(ServerFeature.fromJson(features[i]).toFeature()); + } else { + throw new Error("features[".concat(i, "]'s type is not be supported.")); + } + } + + return featuresTemp; + }, + + /** + * @function ThemeLayer.prototype.toFeature + * @deprecated + * @description 转为 iClient 要素,该方法将被弃用,由 {@link ThemeLayer#toiClientFeature} 代替。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待转换的要素。 + * @returns {FeatureVector} 转换后的 iClient 要素。 + */ + toFeature: function toFeature(features) { + return this.toiClientFeature(features); + }, + _initContainer: function _initContainer() { + var parentContainer = this.getPane(); + var animated = this._map.options.zoomAnimation && (external_L_default()).Browser.any3d; + var className = 'themeLayer leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide'); + this.container = external_L_default().DomUtil.create("div", className, parentContainer); + var originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + this.container.id = this.options.id; + this.container.style[originProp] = '50% 50%'; + this.container.style.position = "absolute"; + this.container.style.zIndex = 200; + }, + _zoomAnim: function _zoomAnim(e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._getCenterOffset(e.center)._multiplyBy(-scale).subtract(this._map._getMapPanePos()); + + if ((external_L_default()).DomUtil.setTransform) { + external_L_default().DomUtil.setTransform(this.container, offset, scale); + } else { + this.container.style[(external_L_default()).DomUtil.TRANSFORM] = external_L_default().DomUtil.getTranslateString(offset) + ' scale(' + scale + ')'; + } + }, + _updateOpacity: function _updateOpacity() { + var me = this; + Util.modifyDOMElement(me.container, null, null, null, null, null, null, me.options.opacity); + + if (me._map !== null) { + /** + * @event ThemeLayer#changelayer + * @description 图层属性改变之后触发。 + * @property {Object} layer - 图层。 + * @property {string} property - 图层属性。 + */ + me._map.fire("changelayer", { + layer: me, + property: "opacity" + }); + } + }, + //缩放移动重绘 + _reset: function _reset() { + var me = this; + + var latLngBounds = me._map.getBounds(); + + me.update(latLngBounds); + + var size = me._map.getSize(); // var bounds = me._map.getBounds(); + // var topLeft = me._map.latLngToLayerPoint(bounds.getNorthWest()); + // var mapOffset = [parseInt(topLeft.x, 10) || 0, parseInt(topLeft.y, 10) || 0] + // var offsetLeft = parseInt(me._map.getContainer().style.left, 10); + // offsetLeft = -Math.round(offsetLeft); + //var offsetTop = parseInt(me._map.getContainer().style.top, 10); + //offsetTop = -Math.round(offsetTop); + //me.container.style.left = mapOffset[0] + 'px'; + //me.container.style.top = mapOffset[1] + 'px'; + + + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + + external_L_default().DomUtil.setPosition(this.container, mapOffset); + + if (parseFloat(me.container.width) !== parseFloat(size.x)) { + me.container.width = size.x + 'px'; + } + + if (parseFloat(me.container.height) !== parseFloat(size.y)) { + me.container.height = size.y + 'px'; + } + + me.redraw(); + }, + //通知渲染器的尺寸变化 + _resize: function _resize() { + var me = this; + + var newSize = me._map.getSize(); + + me.container.style.width = newSize.x + "px"; + me.container.style.height = newSize.y + "px"; + me.renderer.resize(); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/GeoFeatureThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class GeoFeatureThemeLayer + * @classdesc 地理几何专题要素型专题图层基类。此类型专题图的专题要素形状就是由 feature.geometry 决定。此类不建议直接实例化调用。 + * @category Visualization Theme + * @extends ThemeLayer + * @category Visualization Graphic + * @param {string} name - 专题图名。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 样式(style) 中的有效属性应用到专题图层。 + * 禁止对专题要素使用数据(feature)的 style。 + * 此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @fires GeoFeatureThemeLayer#beforefeaturesadded + * @usage + */ + +var GeoFeatureThemeLayer = ThemeLayer.extend({ + options: { + // {number} 节点抽稀像素距离,默认值 2。 + nodesClipPixel: 2, + //{boolean} 图形是否在 hover 时高亮 ,默认值:false。 + isHoverAble: false, + //{boolean} 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面),默认值:false。 + isMultiHover: false, + // {boolean} 图形是否可点击,默认 true + isClickAble: true, + //是否允许 feature 样式(style) 中的有效属性应用到专题图层。 + //默认值为: false,禁止对专题要素使用数据(feature)的 style。 + //此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + //的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + isAllowFeatureStyle: false + }, + initialize: function initialize(name, options) { + ThemeLayer.prototype.initialize.call(this, name, options); + external_L_default().Util.setOptions(this, options); + var me = this; + me.cache = {}; + me.cacheFields = []; + me.style = {}; + me.highlightStyle = {}; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.addFeatures + * @description 添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待填加的要素。 + */ + addFeatures: function addFeatures(features) { + var me = this; + /** + * @event GeoFeatureThemeLayer#beforefeaturesadded + * @description 添加数据之前触发。 + * @property {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 事件对象。 + */ + + me.fire("beforefeaturesadded", { + features: features + }); //转换 features 形式 + + this.features = this.toiClientFeature(features); + + if (!me.isCustomSetMaxCacheCount) { + me.maxCacheCount = me.features.length * 5; + } + + if (!me.renderer) { + return; + } //绘制专题要素 + + + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + }, + + /** + * @function GeoFeatureThemeLayer.prototype.removeFeatures + * @description 删除专题图中 features。参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature。 + * @param {FeatureVector} features - 待删除的要素。 + */ + removeFeatures: function removeFeatures(features) { + // eslint-disable-line no-unused-vars + this.clearCache(); + ThemeLayer.prototype.removeFeatures.call(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function removeAllFeatures() { + this.clearCache(); + ThemeLayer.prototype.removeAllFeatures.call(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素。 + * 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,抽稀,缓存等步骤。 + * 地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘的范围。 + */ + redrawThematicFeatures: function redrawThematicFeatures(bounds) { + var me = this; //获取高亮专题要素对应的用户 id + + var hoverone = me.renderer.getHoverOne(); + var hoverFid = null; + + if (hoverone && hoverone.refDataID) { + hoverFid = hoverone.refDataID; + } + + if (this.options.alwaysMapCRS && bounds && bounds instanceof (external_L_default()).LatLngBounds) { + var crs = this._map.options.crs; + bounds = external_L_default().bounds(crs.project(bounds.getSouthWest()), crs.project(bounds.getNorthEast())); + } + + bounds = CommontypesConversion.toSuperMapBounds(bounds); //清除当前所有可视元素 + + me.renderer.clearAll(); + var features = me.features; + var cache = me.cache; + var cacheFields = me.cacheFields; + + var cmZoom = me._map.getZoom(); + + var maxCC = me.maxCacheCount; + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var feaBounds = feature.geometry.getBounds(); //剔除当前视图(地理)范围以外的数据 + + if (bounds && !bounds.intersectsBounds(feaBounds)) { + continue; + } //缓存字段 + + + var fields = feature.id + "_zoom_" + cmZoom.toString(); + + if (cache[fields]) { + cache[fields].updateAndAddShapes(); + continue; + } + + var thematicFeature = me.createThematicFeature(features[i]); //检查 thematicFeature 是否有可视化图形 + + if (thematicFeature.getShapesCount() < 1) { + continue; + } //加入缓存 + + + cache[fields] = thematicFeature; + cacheFields.push(fields); //缓存数量限制 + + if (cacheFields.length > maxCC) { + var fieldsTemp = cacheFields[0]; + cacheFields.splice(0, 1); + delete cache[fieldsTemp]; + } + } + + me.renderer.render(); //地图漫游后,重新高亮图形 + + if (hoverFid && me.options.isHoverAble && me.options.isMultiHover) { + var hShapes = this.getShapesByFeatureID(hoverFid); + this.renderer.updateHoverShapes(hShapes); + } + }, + + /** + * @function GeoFeatureThemeLayer.prototype.createThematicFeature + * @description 创建专题要素。 + * @param {FeatureVector} feature - 要创建的要素。 + */ + createThematicFeature: function createThematicFeature(feature) { + var me = this; + var style = me.getStyleByData(feature); + + if (feature.style && me.isAllowFeatureStyle) { + style = Util.copyAttributesWithClip(feature.style); + } //创建专题要素时的可选参数 + + + var options = {}; + options.nodesClipPixel = me.options.nodesClipPixel; + options.isHoverAble = me.options.isHoverAble; + options.isMultiHover = me.options.isMultiHover; + options.isClickAble = me.options.isClickAble; + options.highlightStyle = ShapeFactory.transformStyle(me.highlightStyle); //将数据转为专题要素(Vector) + + var thematicFeature = new ThemeVector(feature, me, ShapeFactory.transformStyle(style), options); //直接添加图形到渲染器 + + for (var m = 0; m < thematicFeature.shapes.length; m++) { + me.renderer.addShape(thematicFeature.shapes[m]); + } + + return thematicFeature; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.redraw + * @description 重绘该图层。 + */ + redraw: function redraw() { + this.clearCache(); + return ThemeLayer.prototype.redraw.apply(this, arguments); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.clearCache + * @description 清除缓存数据。 + */ + clearCache: function clearCache() { + this.cache = {}; + this.cacheFields = []; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.clear + * @description 清除的内容包括数据(features) 、专题要素、缓存。 + */ + clear: function clear() { + var me = this; + me.renderer.clearAll(); + me.renderer.refresh(); + me.removeAllFeatures(); + me.clearCache(); + }, + + /** + * @function GeoFeatureThemeLayer.prototype.getCacheCount + * @description 获取当前缓存数量。 + * @returns {number} 返回当前缓存数量。 + */ + getCacheCount: function getCacheCount() { + return this.cacheFields.length; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.setMaxCacheCount + * @description 设置最大缓存数量。 + * @param {number} cacheCount - 最大缓存量。 + */ + setMaxCacheCount: function setMaxCacheCount(cacheCount) { + if (isNaN(cacheCount)) { + return; + } + + this.maxCacheCount = cacheCount; + this.isCustomSetMaxCacheCount = true; + }, + + /** + * @function GeoFeatureThemeLayer.prototype.getShapesByFeatureID + * @description 通过 FeatureID 获取 feature 关联的所有图形。如果不传入此参数,函数将返回所有图形。 + * @param {number} featureID - 要素 ID。 + */ + getShapesByFeatureID: function getShapesByFeatureID(featureID) { + var me = this, + list = [], + shapeList = me.renderer.getAllShapes(); + + if (!featureID) { + return shapeList; + } + + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + + if (si.refDataID && featureID === si.refDataID) { + list.push(si); + } + } + + return list; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/UniqueThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class UniqueThemeLayer + * @deprecatedclassinstance L.supermap.uniqueThemeLayer + * @category Visualization Theme + * @classdesc 客户端单值专题图。单值专题图是利用不同的颜色或符号(线型、填充)表示图层中某一属性信息的不同属性值,属性值相同的要素具有相同的渲染风格。 + * 比如土壤类型分布图、土地利用图、行政区划图等。单值专题图着重表示现象质的差别,一般不表示数量的特征。 + * @extends GeoFeatureThemeLayer + * @param {string} name - 专题图层名。 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。 + * 此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @usage + */ + +var UniqueThemeLayer = GeoFeatureThemeLayer.extend({ + /** + * @member {Object} UniqueThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} UniqueThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} UniqueThemeLayer.prototype.highlightStyle + * @description 开启 hover 事件后,触发的样式风格。 + */ + initialize: function initialize(name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); //{Array.} 图层中专题要素的样式 + + this.style = []; //{string} 用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + + this.styleGroups = []; + }, + + /** + * @private + * @function UniqueThemeLayer.prototype.getStyleByData + * @description 根据用户数据(feature)设置专题要素的 Style。 + * @param {FeatureVector} feat - 用户要素数据。 + * @returns {Array.} 返回包含专题要素 style 的对象。 + */ + getStyleByData: function getStyleByData(feat) { + var me = this, + feature = feat, + style = Util.copyAttributesWithClip({}, me.style); + var groups = me.styleGroups, + isSfInAttributes = false, + //指定的 themeField 是否是 feature 的属性字段之一 + attribute = null; //属性值 + + var isValidStyleGroup = me.styleGroups && me.styleGroups.length > 0; + + if (me.themeField && isValidStyleGroup && feature.attributes) { + var tf = me.themeField, + attributes = feature.attributes; + + for (var property in attributes) { + if (tf !== property) { + continue; + } + + isSfInAttributes = true; + attribute = attributes[property]; + break; + } + } //判断属性值是否属于styleGroups的某一个范围,以便对获取分组 style + + + if (isSfInAttributes) { + for (var i = 0, len = groups.length; i < len; i++) { + if (attribute.toString() === groups[i].value.toString()) { + var sty1 = groups[i].style; + style = Util.copyAttributesWithClip(style, sty1); + } + } + } + + return style; + } +}); +var uniqueThemeLayer = function uniqueThemeLayer(name, options) { + return new UniqueThemeLayer(name, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/RangeThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RangeThemeLayer + * @deprecatedclassinstance L.supermap.rangeThemeLayer + * @category Visualization Theme + * @classdesc 范围分段专题图。范围分段专题图对数据({@link FeatureVector})属性字段(attributes)的属性值进行分段,使用不同的颜色或符号(线型、填充)渲染不同范围段的属性值。 + * 分段专题图一般用来反映连续分布现象的数量或程度特征,如降水量的分布,土壤侵蚀强度的分布等。 + * @extends GeoFeatureThemeLayer + * @param {string} name - 图层名 + * @param {Object} options - 参数。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ + +var RangeThemeLayer = GeoFeatureThemeLayer.extend({ + /** + * @member {Object} RangeThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} RangeThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} RangeThemeLayer.prototype.highlightStyle + * @description hover 的样式风格。 + */ + initialize: function initialize(name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); //{Array.} 图层中专题要素的样式 + + this.style = []; //{string} 用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + + this.styleGroups = []; + }, + + /** + * @function RangeThemeLayer.prototype.getStyleByData + * @description 根据用户数据( feature )设置专题要素的 Style。 + * @param {FeatureVector} feat - 矢量要素对象。 + * @returns {Array.} 专题要素的 Style。 + */ + getStyleByData: function getStyleByData(feat) { + var me = this, + feature = feat, + style = Util.copyAttributesWithClip({}, me.style); + var groups = me.styleGroups, + isSfInAttributes = false, + //指定的 themeField 是否是 feature 的属性字段之一 + attribute = null; //属性值 + + var isValidStyleGroup = me.styleGroups && me.styleGroups.length > 0; + + if (me.themeField && isValidStyleGroup && feature.attributes) { + var Sf = me.themeField, + attributes = feature.attributes; + + for (var property in attributes) { + if (Sf !== property) { + continue; + } + + isSfInAttributes = true; + attribute = attributes[property]; + break; + } + } //判断属性值是否属于styleGroups的某一个范围,以便对获取分组 style + + + if (isSfInAttributes) { + for (var i = 0, len = groups.length; i < len; i++) { + var isContianed = i === len - 1 ? attribute >= groups[i].start && attribute <= groups[i].end : attribute >= groups[i].start && attribute < groups[i].end; + + if (isContianed) { + var sty1 = groups[i].style; + style = Util.copyAttributesWithClip(style, sty1); + } + } + } + + return style; + } +}); +var rangeThemeLayer = function rangeThemeLayer(name, options) { + return new RangeThemeLayer(name, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/LabelThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class LabelThemeLayer + * @deprecatedclassinstance L.supermap.labelThemeLayer + * @classdesc 标签专题图。 + * @category Visualization Theme + * @extends GeoFeatureThemeLayer + * @param {string} name - 图层名。 + * @param {Object} options - 参数。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {boolean} [options.isAvoid=true] - 是否进行地图边缘的避让处理。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 + * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 + * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 + * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 + * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 的 style 中的有效属性应用到专题图层。此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素 + * 的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ + +var LabelThemeLayer = GeoFeatureThemeLayer.extend({ + /** + * @member {Object} LabelThemeLayer.prototype.style + * @description 专题图样式。 + */ + + /** + * @member {Object} LabelThemeLayer.prototype.styleGroups + * @description 各专题类型样式组。 + */ + + /** + * @member {Object} LabelThemeLayer.prototype.highlightStyle + * @description 开启 hover 事件后,触发的样式风格。 + */ + options: { + //是否进行压盖处理,如果设为true,将隐藏被压盖的标签,默认为true。 + isOverLay: true, + //是否进行地图边缘的避让处理,如果设为true,将把与地图边缘相交的标签移到地图范围内,默认为 true,在地图边缘处做避让处理。 + isAvoid: true + }, + initialize: function initialize(name, options) { + GeoFeatureThemeLayer.prototype.initialize.call(this, name, options); + external_L_default().Util.setOptions(this, options); //图层中专题要素的样式 + + this.style = []; //用于指定专题要素样式的属性字段名称。 + // 此属性字段是要用户数据(feature) attributes 中包含的字段,且字段对应的值的类型必须是数值型。使用标签分组显示还需要设置 styleGroups 属性。 + + this.themeField = null; //使用此属性需要设置 themeField 属性。 + //1.没有同时设置 themeField 和 styleGroups,则所有专题要素都使用本图层的 style 进行渲染; + //2.同时设置 themeField 和 styleGroups,则按照 themeField 指定的字段名称获取用户数据(feature)attributes 中对应的属性值; + // a.如果属性值等于 styleGroups 数组里某个元素定义的 value 值,则此专题要素取 styleGroups 数组中该元素定义的 style 进行渲染。 + // b.如果属性值不等于 styleGroups 数组里任何元素定义的 value 值,则此专题要素按照本图层的 style 进行渲染。 + //此数组每个元素对象必须有两个属性:value : 与字段 themeField 相对应的属性值;style:专题要素 style。 + + this.styleGroups = []; + this.defaultStyle = { + //默认文本样式 + fontColor: "#000000", + fontOpacity: 1, + fontSize: "12px", + fontStyle: "normal", + fontWeight: "normal", + labelAlign: "cm", + labelXOffset: 0, + labelYOffset: 0, + labelRotation: 0, + //默认样式 + fill: false, + fillColor: "#ee9900", + fillOpacity: 0.4, + stroke: false, + strokeColor: "#ee9900", + strokeOpacity: 1, + strokeWidth: 1, + strokeLinecap: "round", + strokeDashstyle: "solid", + //默认显示背景框 + labelRect: true, + //对用户隐藏但必须保持此值的属性 + //cursor: "pointer", + labelSelect: true, + //用 _isGeoTextStrategyStyle 标记此style,携带此类style的要素特指GeoText策略中的标签要素 + _isGeoTextStrategyStyle: true + }; //获取标签像素 bounds 的方式。0 - 表示通过文本类容和文本风格计算获取像素范围,现在支持中文、英文; 1 - 表示通过绘制的文本标签获取像素范围,支持各个语种的文字范围获取,但性能消耗较大(尤其是采用SVG渲染)。默认值为0。 + + this.getPxBoundsMode = 0; + this.labelFeatures = []; + }, + + /** + * @function LabelThemeLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function onAdd(map) { + GeoFeatureThemeLayer.prototype.onAdd.call(this, map); + this.container.style.zIndex = 200; + }, + + /** + * @function LabelThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素。 + * 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,抽稀,缓存等步骤。 + * 地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘范围。 + */ + redrawThematicFeatures: function redrawThematicFeatures(bounds) { + if (this.features.length > 0 && this.labelFeatures.length == 0) { + var feats = this.setLabelsStyle(this.features); + + for (var i = 0, len = feats.length; i < len; i++) { + this.labelFeatures.push(feats[i]); + } + } + + this.features = this.getDrawnLabels(this.labelFeatures); + GeoFeatureThemeLayer.prototype.redrawThematicFeatures.call(this, bounds); + }, + + /** + * @function LabelThemeLayer.prototype.removeFeatures + * @description 从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature。 + * @param {Array.} features - 要删除的要素。 + */ + removeFeatures: function removeFeatures(features) { + // eslint-disable-line no-unused-vars + this.labelFeatures = []; + GeoFeatureThemeLayer.prototype.removeFeatures.call(this, arguments); + }, + + /** + * @function LabelThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function removeAllFeatures() { + this.labelFeatures = []; + GeoFeatureThemeLayer.prototype.removeAllFeatures.call(this, arguments); + }, + + /** + * @function LabelThemeLayer.prototype.getDrawnLabels + * @description 获取经(压盖)处理后将要绘制在图层上的标签要素。 + * @param {Array.} labelFeatures - 所有标签要素的数组。 + * @returns {Array.} 最终要绘制的标签要素数组。 + */ + getDrawnLabels: function getDrawnLabels(labelFeatures) { + var feas = [], + //最终要绘制的标签要素集 + fea, + //最终要绘制的标签要素 + fi, + //临时标签要素,用户的第i个标签 + labelsB = [], + //不产生压盖的标签要素范围集 + styTmp, + //用于临时存储要素style的变量 + feaSty, + //标签要素最终的style + // styleTemp用于屏蔽文本style中带有偏移性质style属性,偏移已经在计算bounds的过程中参与了运算, + // 所以在最终按照bounds来绘制标签时,需屏蔽style中带有偏移性质属性,否则文本的偏移量将扩大一倍。 + styleTemp = { + labelAlign: "cm", + labelXOffset: 0, + labelYOffset: 0 + }; + var map = this._map; + var mapSize = map.getSize(); + var zoom = map.getZoom(); //对用户的每个标签要素进行处理与判断 + + for (var i = 0, len = labelFeatures.length; i < len; i++) { + fi = labelFeatures[i]; //检查fi的style在避让中是否被改变,如果改变,重新设置要素的style + + if (fi.isStyleChange || fi.isStyleChange === undefined) { + fi = this.setStyle(fi); + } //标签最终的中心点像素位置 (偏移后) + + + var loc = this.getLabelPxLocation(fi); //过滤掉地图范围外的标签 (偏移后) + + if (loc.x >= 0 && loc.x <= mapSize.x && loc.y >= 0 && loc.y <= mapSize.y) { + //根据当前地图缩放级别过滤标签 + if (fi.style.minZoomLevel > -1) { + if (zoom <= fi.style.minZoomLevel) { + continue; + } + } + + if (fi.style.maxZoomLevel > -1) { + if (zoom > fi.style.maxZoomLevel) { + continue; + } + } //计算标签bounds + + + var boundsQuad = null; + + if (fi.isStyleChange) { + fi.isStyleChange = null; + boundsQuad = this.calculateLabelBounds(fi, loc); + } else { + if (fi.geometry.bsInfo.w && fi.geometry.bsInfo.h) { + //使用calculateLabelBounds2可以提高bounds的计算效率,尤其是在getPxBoundsMode = 1时 + boundsQuad = this.calculateLabelBounds2(fi, loc); + } else { + boundsQuad = this.calculateLabelBounds(fi, loc); + } + } //避让处理 -start + + + var mapViewBounds = new Bounds(0, mapSize.y, mapSize.x, 0), + //地图像素范围 + quadlen = boundsQuad.length; + + if (this.options.isAvoid) { + var avoidInfo = this.getAvoidInfo(mapViewBounds, boundsQuad); //避让信息 + + if (avoidInfo) { + //横向(x方向)上的避让 + if (avoidInfo.aspectW === "left") { + fi.style.labelXOffset += avoidInfo.offsetX; + + for (var j = 0; j < quadlen; j++) { + boundsQuad[j].x += avoidInfo.offsetX; + } + } else if (avoidInfo.aspectW === "right") { + fi.style.labelXOffset += -avoidInfo.offsetX; + + for (var _j = 0; _j < quadlen; _j++) { + boundsQuad[_j].x += -avoidInfo.offsetX; + } + } //纵向(y方向)上的避让 + + + if (avoidInfo.aspectH === "top") { + fi.style.labelYOffset += avoidInfo.offsetY; + + for (var _j2 = 0; _j2 < quadlen; _j2++) { + boundsQuad[_j2].y += avoidInfo.offsetY; + } + } else if (avoidInfo.aspectH === "bottom") { + fi.style.labelYOffset += -avoidInfo.offsetY; + + for (var _j3 = 0; _j3 < quadlen; _j3++) { + boundsQuad[_j3].y += -avoidInfo.offsetY; + } + } //如果style发生变化,记录下来 + + + fi.isStyleChange = true; + } + } //避让处理 -end + //压盖处理 -start + + + if (this.options.isOverLay) { + //是否压盖 + var isOL = false; + + if (i != 0) { + for (var _j4 = 0; _j4 < labelsB.length; _j4++) { + //压盖判断 + if (this.isQuadrilateralOverLap(boundsQuad, labelsB[_j4])) { + isOL = true; + break; + } + } + } + + if (isOL) { + continue; + } else { + labelsB.push(boundsQuad); + } + } //压盖处理 -end + //背景(事件)-start + //将标签像素范围转为地理范围 + + + var geoBs = []; + + for (var _j5 = 0; _j5 < quadlen - 1; _j5++) { + geoBs.push(map.containerPointToLatLng(boundsQuad[_j5])); + } //屏蔽有偏移性质的style属性,偏移量在算bounds时已经加入计算 + + + var leftBottom = geoBs[3]; + var rightTop = geoBs[1]; + var bounds = new Bounds(leftBottom.lng, leftBottom.lat, rightTop.lng, rightTop.lat); + var center = bounds.getCenterLonLat(); + var label = new GeoText(center.lon, center.lat, fi.attributes[this.themeField]); + label.calculateBounds(); + styTmp = Util.cloneObject(fi.style); + feaSty = Util.cloneObject(Util.copyAttributes(styTmp, styleTemp)); + fea = new Vector(label, fi.attributes, feaSty); //赋予id + + fea.id = fi.id; + fea.fid = fi.fid; + feas.push(fea); + } + } //返回最终要绘制的标签要素 + + + return feas; + }, + + /** + * @function LabelThemeLayer.prototype.getStyleByData + * @description 根据用户数据(feature)设置专题要素的 Style。 + * @param {FeatureVector} feat - 矢量要素对象。 + * @returns {Array.} 专题要素的 Style。 + */ + getStyleByData: function getStyleByData(feat) { + var feature = feat; + feature.style = Util.copyAttributes(feature.style, this.defaultStyle); //将style赋给标签 + + if (this.style && this.style.fontSize && parseFloat(this.style.fontSize) < 12) { + this.style.fontSize = "12px"; + } + + feature.style = Util.copyAttributes(feature.style, this.style); + + if (this.themeField && this.styleGroups && feature.attributes) { + var Sf = this.themeField; + var attributes = feature.attributes; + var groups = this.styleGroups; + var isSfInAttrs = false; //指定的 groupField 是否是geotext的属性字段之一 + + var attr = null; //属性值 + + for (var property in attributes) { + if (Sf === property) { + isSfInAttrs = true; + attr = attributes[property]; + break; + } + } //判断属性值是否属于styleGroups的某一个范围,以便对标签分组 + + + if (isSfInAttrs) { + for (var i = 0, len = groups.length; i < len; i++) { + if (attr >= groups[i].start && attr < groups[i].end) { + var sty1 = groups[i].style; + + if (sty1 && sty1.fontSize && parseFloat(sty1.fontSize) < 12) { + sty1.fontSize = "12px"; + } + + feature.style = Util.copyAttributes(feature.style, sty1); + } + } + } + + feature.style.label = feature.attributes[this.themeField]; + } + + return feature.style; + }, + + /** + * @function LabelThemeLayer.prototype.setLabelsStyle + * @description 设置标签要素的 Style。 + * @param {Array.} labelFeatures - 需要设置 Style 的标签要素数组。 + * @returns {Array.} 赋予 Style 后的标签要素数组。 + */ + setLabelsStyle: function setLabelsStyle(labelFeatures) { + var fea, + labelFeas = []; + + for (var i = 0, len = labelFeatures.length; i < len; i++) { + var feature = labelFeatures[i]; + + if (feature.geometry.CLASS_NAME === "SuperMap.Geometry.GeoText") { + //设置标签的Style + if (feature.geometry.bsInfo.w || feature.geometry.bsInfo.h) { + feature.geometry.bsInfo.w = null; + feature.geometry.bsInfo.h = null; + feature.geometry.labelWTmp = null; + } + + fea = this.setStyle(feature); //为标签要素指定图层 + + fea.layer = this.layer; + labelFeas.push(fea); + } else { + return labelFeatures; + } + } + + return labelFeas; + }, + + /** + * @function LabelThemeLayer.prototype.setStyle + * @description 设置标签要素的 Style。 + * @param {FeatureVector} feat - 需要赋予 style 的要素。 + */ + setStyle: function setStyle(feat) { + var feature = feat; + feature.style = Util.copyAttributes(feature.style, this.defaultStyle); //将style赋给标签 + + if (this.style && this.style.fontSize && parseFloat(this.style.fontSize) < 12) { + this.style.fontSize = "12px"; + } + + feature.style = Util.copyAttributes(feature.style, this.style); + + if (this.groupField && this.styleGroups && feature.attributes) { + var Sf = this.groupField; + var Attrs = feature.attributes; + var Gro = this.styleGroups; + var isSfInAttrs = false; //指定的 groupField 是否是geotext的属性字段之一 + + var attr = null; //属性值 + + for (var property in Attrs) { + if (Sf === property) { + isSfInAttrs = true; + attr = Attrs[property]; + break; + } + } //判断属性值是否属于styleGroups的某一个范围,以便对标签分组 + + + if (isSfInAttrs) { + for (var i = 0, len = Gro.length; i < len; i++) { + if (attr >= Gro[i].start && attr < Gro[i].end) { + //feature.style = Util.copyAttributes(feature.style, this.defaultStyle); + var sty1 = Gro[i].style; + + if (sty1 && sty1.fontSize && parseFloat(sty1.fontSize) < 12) { + sty1.fontSize = "12px"; + } + + feature.style = Util.copyAttributes(feature.style, sty1); + } + } + } + } //将文本内容赋到标签要素的style上 + + + feature.style.label = feature.geometry.text; + return feature; + }, + + /** + * @function LabelThemeLayer.prototype.getLabelPxLocation + * @description 获取标签要素的像素坐标。 + * @param {FeatureVector} feature - 标签要素。 + * @returns {L.Point} 标签位置。 + */ + getLabelPxLocation: function getLabelPxLocation(feature) { + var geoText = feature.geometry; + var styleTmp = feature.style; //将标签的地理位置转为像素位置 + + var locationTmp = geoText.getCentroid(); + + var locTmp = this._map.latLngToContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(locationTmp.y, locationTmp.x) : this._map.options.crs.unproject(external_L_default().point(locationTmp.x, locationTmp.y))); + + var loc = external_L_default().point(locTmp.x, locTmp.y); //偏移处理 + + if (styleTmp.labelXOffset || styleTmp.labelYOffset) { + var xOffset = isNaN(styleTmp.labelXOffset) ? 0 : styleTmp.labelXOffset; + var yOffset = isNaN(styleTmp.labelYOffset) ? 0 : styleTmp.labelYOffset; + var point = loc.add(external_L_default().point(xOffset, -yOffset)); + return external_L_default().point(point.x, point.y); + } else { + return external_L_default().point(loc.x, loc.y); + } + }, + + /** + * @function LabelThemeLayer.prototype.calculateLabelBounds + * @description 获得标签要素的最终范围。 + * + * @param {FeatureVector} feature - 需要计算 bounds 的标签要素数。 + * @param {L.Point} loc - 标签位置。 + * + * @returns {Array.} 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + calculateLabelBounds: function calculateLabelBounds(feature, loc) { + var geoText = feature.geometry; //标签范围(未旋转前) + + var labB = null; + var labelInfo = null; //获取bounds的方式 + + if (this.getPxBoundsMode == 0) { + labB = geoText.getLabelPxBoundsByText(loc, feature.style); + } else if (this.getPxBoundsMode === 1) { + //canvas + labelInfo = this.getLabelInfo(feature.geometry.getCentroid(), feature.style); + labB = geoText.getLabelPxBoundsByLabel(loc, labelInfo.w, labelInfo.h, feature.style); + } else { + return null; + } //旋转Bounds + + + var boundsQuad = []; + + if (feature.style.labelRotation % 180 == 0) { + boundsQuad = [{ + "x": labB.left, + "y": labB.top + }, { + "x": labB.right, + "y": labB.top + }, { + "x": labB.right, + "y": labB.bottom + }, { + "x": labB.left, + "y": labB.bottom + }, { + "x": labB.left, + "y": labB.top + }]; + } else { + boundsQuad = this.rotationBounds(labB, loc, feature.style.labelRotation); + } //重置GeoText的bounds + + + geoText.bounds = new Bounds(boundsQuad[1].x, boundsQuad[3].y, boundsQuad[2].x, boundsQuad[4].y); + return boundsQuad; + }, + + /** + * @function LabelThemeLayer.prototype.calculateLabelBounds2 + * @description 获得标签要素的最终范围的另一种算法(通过记录下的标签宽高),提高计算 bounds 的效率。 + * + * @param {FeatureVector} feature - 需要计算 bounds 的标签要素数。 + * @param {L.Point} loc - 标签位置。 + * + * @returns {Array.} 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + calculateLabelBounds2: function calculateLabelBounds2(feature, loc) { + var labB, left, bottom, top, right; + var labelSize = feature.geometry.bsInfo; + var style = feature.style; + var locationPx = Util.cloneObject(loc); //处理文字对齐 + + if (style.labelAlign && style.labelAlign !== "cm") { + switch (style.labelAlign) { + case "lt": + locationPx.x += labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + + case "lm": + locationPx.x += labelSize.w / 2; + break; + + case "lb": + locationPx.x += labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + + case "ct": + locationPx.y += labelSize.h / 2; + break; + + case "cb": + locationPx.y -= labelSize.h / 2; + break; + + case "rt": + locationPx.x -= labelSize.w / 2; + locationPx.y += labelSize.h / 2; + break; + + case "rm": + locationPx.x -= labelSize.w / 2; + break; + + case "rb": + locationPx.x -= labelSize.w / 2; + locationPx.y -= labelSize.h / 2; + break; + + default: + break; + } + } + + left = locationPx.x - labelSize.w / 2; + bottom = locationPx.y + labelSize.h / 2; //处理斜体字 + + if (style.fontStyle && style.fontStyle === "italic") { + right = locationPx.x + labelSize.w / 2 + parseInt(parseFloat(style.fontSize) / 2); + } else { + right = locationPx.x + labelSize.w / 2; + } + + top = locationPx.y - labelSize.h / 2; + labB = new Bounds(left, bottom, right, top); //旋转Bounds + + var boundsQuad = []; + + if (style.labelRotation % 180 == 0) { + boundsQuad = [{ + "x": labB.left, + "y": labB.top + }, { + "x": labB.right, + "y": labB.top + }, { + "x": labB.right, + "y": labB.bottom + }, { + "x": labB.left, + "y": labB.bottom + }, { + "x": labB.left, + "y": labB.top + }]; + } else { + boundsQuad = this.rotationBounds(labB, loc, style.labelRotation); + } //重置GeoText的bounds + + + feature.geometry.bounds = new Bounds(boundsQuad[1].x, boundsQuad[3].y, boundsQuad[2].x, boundsQuad[4].y); + return boundsQuad; + }, + + /** + * @function LabelThemeLayer.prototype.getLabelInfo + * @description 根据当前位置获取绘制后的标签信息,包括标签的宽,高和行数等。 + * @returns {Object} 绘制后的标签信息。 + */ + getLabelInfo: function getLabelInfo(location, style) { + var LABEL_ALIGN = { + "l": "left", + "r": "right", + "t": "top", + "b": "bottom" + }, + LABEL_FACTOR = { + "l": 0, + "r": -1, + "t": 0, + "b": -1 + }; + style = Util.extend({ + fontColor: "#000000", + labelAlign: "cm" + }, style); + var pt = this.getLocalXY(location); + var labelWidth = 0; + + if (style.labelXOffset || style.labelYOffset) { + var xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset; + var yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset; + pt[0] += xOffset; + pt[1] -= yOffset; + } + + var canvas = document.createElement('canvas'); + canvas.globalAlpha = 0; + canvas.lineWidth = 1; + var ctx = canvas.getContext("2d"); + ctx.fillStyle = style.fontColor; + ctx.globalAlpha = style.fontOpacity || 1.0; + var fontStyle = [style.fontStyle ? style.fontStyle : "normal", "normal", style.fontWeight ? style.fontWeight : "normal", style.fontSize ? style.fontSize : "1em", style.fontFamily ? style.fontFamily : "sans-serif"].join(" "); + var labelRows = style.label.split('\n'); + var numRows = labelRows.length; + var vfactor, lineHeight, labelWidthTmp; + + if (ctx.fillText) { + // HTML5 + ctx.font = fontStyle; + ctx.textAlign = LABEL_ALIGN[style.labelAlign[0]] || "center"; + ctx.textBaseline = LABEL_ALIGN[style.labelAlign[1]] || "middle"; + vfactor = LABEL_FACTOR[style.labelAlign[1]]; + + if (vfactor == null) { + vfactor = -.5; + } + + lineHeight = ctx.measureText('Mg').height || ctx.measureText('xx').width; + pt[1] += lineHeight * vfactor * (numRows - 1); + + for (var i = 0; i < numRows; i++) { + labelWidthTmp = ctx.measureText(labelRows[i]).width; + + if (labelWidth < labelWidthTmp) { + labelWidth = labelWidthTmp; + } + } + } else if (ctx.mozDrawText) { + // Mozilla pre-Gecko1.9.1 (} bounds旋转后形成的多边形节点数组。是一个四边形,形如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + rotationBounds: function rotationBounds(bounds, rotationCenterPoi, angle) { + var ltPoi = external_L_default().point(bounds.left, bounds.top); + var rtPoi = external_L_default().point(bounds.right, bounds.top); + var rbPoi = external_L_default().point(bounds.right, bounds.bottom); + var lbPoi = external_L_default().point(bounds.left, bounds.bottom); + var ver = []; + ver.push(this.getRotatedLocation(ltPoi.x, ltPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(rtPoi.x, rtPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(rbPoi.x, rbPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); + ver.push(this.getRotatedLocation(lbPoi.x, lbPoi.y, rotationCenterPoi.x, rotationCenterPoi.y, angle)); //bounds旋转后形成的多边形节点数组 + + var quad = []; + + for (var i = 0; i < ver.length; i++) { + quad.push({ + "x": ver[i].x, + "y": ver[i].y + }); + } + + quad.push({ + "x": ver[0].x, + "y": ver[0].y + }); + return quad; + }, + + /** + * @function LabelThemeLayer.prototype.getRotatedLocation + * @description 获取一个点绕旋转中心顺时针旋转后的位置。(此方法用于屏幕坐标)。 + * + * @param {number} x - 旋转点横坐标。 + * @param {number} y - 旋转点纵坐标。 + * @param {number} rx - 旋转中心点横坐标。 + * @param {number} ry - 旋转中心点纵坐标。 + * @param {number} angle - 旋转角度。 + * + * @returns {Object} 旋转后的坐标位置对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + */ + getRotatedLocation: function getRotatedLocation(x, y, rx, ry, angle) { + var loc = {}, + x0, + y0; + y = -y; + ry = -ry; + angle = -angle; //顺时针旋转 + + x0 = (x - rx) * Math.cos(angle / 180 * Math.PI) - (y - ry) * Math.sin(angle / 180 * Math.PI) + rx; + y0 = (x - rx) * Math.sin(angle / 180 * Math.PI) + (y - ry) * Math.cos(angle / 180 * Math.PI) + ry; + loc.x = x0; + loc.y = -y0; + return loc; + }, + + /** + * @function LabelThemeLayer.prototype.getAvoidInfo + * @description 获取避让的信息。 + * + * @param {Bounds} bounds - 地图像素范围。 + * @param {Array.} quadrilateral - 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * + * @returns {Object} 避让的信息。 + */ + getAvoidInfo: function getAvoidInfo(bounds, quadrilateral) { + if (quadrilateral.length !== 5) { + return null; + } //不是四边形 + //将bound序列化为点数组形式 + + + var bounddQuad = [{ + "x": bounds.left, + "y": bounds.top + }, { + "x": bounds.right, + "y": bounds.top + }, { + "x": bounds.right, + "y": bounds.bottom + }, { + "x": bounds.left, + "y": bounds.bottom + }, { + "x": bounds.left, + "y": bounds.top + }]; + var isIntersection = false, + bqLen = bounddQuad.length, + quadLen = quadrilateral.length; + var offsetX = 0, + offsetY = 0, + aspectH = "", + aspectW = ""; + + for (var i = 0; i < bqLen - 1; i++) { + for (var j = 0; j < quadLen - 1; j++) { + var isLineIn = Util.lineIntersection(bounddQuad[i], bounddQuad[i + 1], quadrilateral[j], quadrilateral[j + 1]); + + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + //设置避让信息 + setInfo(quadrilateral[j]); + setInfo(quadrilateral[j + 1]); + isIntersection = true; + } + } + } + + if (isIntersection) { + //组织避让操作所需的信息 + return { + "aspectW": aspectW, + "aspectH": aspectH, + "offsetX": offsetX, + "offsetY": offsetY + }; + } else { + return null; + } //内部函数:设置避让信息 + //参数:vec-{Object} quadrilateral四边形单个节点。如:{"x":1,"y":1}。 + + + function setInfo(vec) { + //四边形不在bounds内的节点 + if (!bounds.contains(vec.x, vec.y)) { + //bounds的Top边 + if (vec.y < bounds.top) { + var oY = Math.abs(bounds.top - vec.y); + + if (oY > offsetY) { + offsetY = oY; + aspectH = "top"; + } + } //bounds的Bottom边 + + + if (vec.y > bounds.bottom) { + var _oY = Math.abs(vec.y - bounds.bottom); + + if (_oY > offsetY) { + offsetY = _oY; + aspectH = "bottom"; + } + } //bounds的left边 + + + if (vec.x < bounds.left) { + var oX = Math.abs(bounds.left - vec.x); + + if (oX > offsetX) { + offsetX = oX; + aspectW = "left"; + } + } //bounds的right边 + + + if (vec.x > bounds.right) { + var _oX = Math.abs(vec.x - bounds.right); + + if (_oX > offsetX) { + offsetX = _oX; + aspectW = "right"; + } + } + } + } + }, + + /** + * @function LabelThemeLayer.prototype.isQuadrilateralOverLap + * @description 判断两个四边形是否有压盖。 + * + * @param {Array.} quadrilateral - 四边形节点数组。例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * @param {Array.} quadrilateral2 - 第二个四边形节点数组。 + * + * @returns {boolean} 是否压盖,true表示压盖。 + */ + isQuadrilateralOverLap: function isQuadrilateralOverLap(quadrilateral, quadrilateral2) { + var quadLen = quadrilateral.length, + quad2Len = quadrilateral2.length; + + if (quadLen !== 5 || quad2Len !== 5) { + return null; + } //不是四边形 + + + var OverLap = false; //如果两四边形互不包含对方的节点,则两个四边形不相交 + + for (var i = 0; i < quadLen; i++) { + if (this.isPointInPoly(quadrilateral[i], quadrilateral2)) { + OverLap = true; + break; + } + } + + for (var _i2 = 0; _i2 < quad2Len; _i2++) { + if (this.isPointInPoly(quadrilateral2[_i2], quadrilateral)) { + OverLap = true; + break; + } + } //加上两矩形十字相交的情况 + + + for (var _i3 = 0; _i3 < quadLen - 1; _i3++) { + if (OverLap) { + break; + } + + for (var j = 0; j < quad2Len - 1; j++) { + var isLineIn = Util.lineIntersection(quadrilateral[_i3], quadrilateral[_i3 + 1], quadrilateral2[j], quadrilateral2[j + 1]); + + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + OverLap = true; + break; + } + } + } + + return OverLap; + }, + + /** + * @function LabelThemeLayer.prototype.isPointInPoly + * @description 判断一个点是否在多边形里面。(射线法)。 + * + * @param {Object} pt - 需要判定的点对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Array.} poly - 多边形节点数组。例如一个四边形:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + * @returns {boolean} 点是否在多边形内。 + */ + isPointInPoly: function isPointInPoly(pt, poly) { + for (var isIn = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { + (poly[i].y <= pt.y && pt.y < poly[j].y || poly[j].y <= pt.y && pt.y < poly[i].y) && pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x && (isIn = !isIn); + } + + return isIn; + } +}); +var labelThemeLayer = function labelThemeLayer(name, options) { + return new LabelThemeLayer(name, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/FeatureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +/** + * @class FeatureService + * @deprecatedclassinstance L.supermap.featureService + * @classdesc 要素数据集类。提供:ID 查询,范围查询,SQL 查询,几何查询,bounds 查询,缓冲区查询,地物编辑。 + * @category iServer Data Feature + * @example + * new FeatureService(url) + * .getFeaturesByIDs(param,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FeatureService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function FeatureService.prototype.getFeaturesByIDs + * @description 数据集 ID 查询服务。 + * @param {GetFeaturesByIDsParameters} params - ID 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByIDs: function getFeaturesByIDs(params, callback, resultFormat) { + var me = this; + var getFeaturesByIDsService = new GetFeaturesByIDsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByIDsService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesByBounds + * @description 数据集 bounds 查询服务。 + * @param {GetFeaturesByBoundsParameters} params - 数据集范围查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByBounds: function getFeaturesByBounds(params, callback, resultFormat) { + var me = this; + var getFeaturesByBoundsService = new GetFeaturesByBoundsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByBoundsService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesByBuffer + * @description 数据集 buffer 查询服务。 + * @param {GetFeaturesByBufferParameters} params - 数据集缓冲区查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByBuffer: function getFeaturesByBuffer(params, callback, resultFormat) { + var me = this; + var getFeatureService = new GetFeaturesByBufferService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeatureService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesBySQL + * @description 数据集 SQL 查询服务。 + * @param {GetFeaturesBySQLParameters} params - 数据集 SQL 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesBySQL: function getFeaturesBySQL(params, callback, resultFormat) { + var me = this; + var getFeatureBySQLService = new GetFeaturesBySQLService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeatureBySQLService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.getFeaturesByGeometry + * @description 数据集几何查询服务类。 + * @param {GetFeaturesByGeometryParameters} params - 数据集几何查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getFeaturesByGeometry: function getFeaturesByGeometry(params, callback, resultFormat) { + var me = this; + var getFeaturesByGeometryService = new GetFeaturesByGeometryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + getFeaturesByGeometryService.processAsync(me._processParams(params)); + }, + + /** + * @function FeatureService.prototype.editFeatures + * @description 地物编辑服务。 + * @param {EditFeaturesParameters} params - 数据服务中数据集添加、修改、删除参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + editFeatures: function editFeatures(params, callback) { + if (!params || !params.dataSourceName || !params.dataSetName) { + return; + } + + var me = this, + url = me.url, + dataSourceName = params.dataSourceName, + dataSetName = params.dataSetName; + url = Util.urlPathAppend(url, "datasources/" + dataSourceName + "/datasets/" + dataSetName); + var editFeatureService = new EditFeaturesService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + editFeatureService.processAsync(me._processParams(params)); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + params.returnContent = params.returnContent == null ? true : params.returnContent; + params.fromIndex = params.fromIndex ? params.fromIndex : 0; + params.toIndex = params.toIndex ? params.toIndex : -1; + params.isUseBatch = params.isUseBatch == null ? false : params.isUseBatch; + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + + if (params.geometry) { + params.geometry = toSuperMapGeometry(params.geometry); + } + + if (params.editType) { + params.editType = params.editType.toLowerCase(); + } + + var me = this; + + if (params.features) { + var features = []; + + if (external_L_default().Util.isArray(params.features)) { + params.features.map(function (feature) { + features.push(me._createServerFeature(feature)); + return feature; + }); + } else { + features.push(me._createServerFeature(params.features)); + } + + params.features = features; + } + + return params; + }, + _createServerFeature: function _createServerFeature(geoFeature) { + var geoJSONFeature, + feature = {}, + fieldNames = [], + fieldValues = []; + geoJSONFeature = geoFeature || {}; + + for (var key in geoJSONFeature.properties) { + fieldNames.push(key); + fieldValues.push(geoJSONFeature.properties[key]); + } + + feature.fieldNames = fieldNames; + feature.fieldValues = fieldValues; + + if (geoJSONFeature.id) { + feature.id = geoJSONFeature.id; + } + + feature.geometry = toSuperMapGeometry(geoJSONFeature); + return feature; + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var FeatureService_featureService = function featureService(url, options) { + return new FeatureService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/UnicodeMarker.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class UnicodeMarker + * @deprecatedclassinstance L.supermap.unicodeMarker + * @classdesc Unicode 字符图标。 + * @category Visualization Marker + * @extends {L.Path} + * @param {L.LatLngBounds} latlng - 经纬度坐标。 + * @param {Object} options - 参数。 + * @param {string} options.label - 符号 Unicode 值。 + * @param {string} [options.labelRotation='0'] - 符号旋转角度。 + * @param {string} [options.globalAlpha='1'] - 符号的透明值。 + * @param {string} [options.fontStyle='normal'] - 符号的风格。 + * @param {string} [options.fontWeight='normal'] - 符号的粗细。 + * @param {string} [options.fontSize='1em'] - 符号的尺寸。 + * @param {string} [options.fontFamily='sans-serif'] - 符号的字体。 + * @param {string} [options.textAlign='center'] - 符号内容的对齐方式。 + * @param {string} [options.textBaseline='middle'] - 绘制符号时使用的基线。 + * @fires UnicodeMarker#move + * @usage + */ + +var UnicodeMarker = external_L_default().Path.extend({ + // @section + // @aka CircleMarker options + options: { + fontStyle: "normal", + fontWeight: "normal", + fontSize: "1em", + fontFamily: "sans-serif", + textAlign: "center", + textBaseline: "middle", + vfactor: -.5, + labelRotation: 0, + globalAlpha: 1, + label: "" + }, + initialize: function initialize(latlng, options) { + external_L_default().Util.setOptions(this, options); + this._latlng = latlng; + }, + + /** + * @function UnicodeMarker.prototype.setLatLng + * @description 设置 marker 新坐标。 + * @param {L.LatLng} setLatLng - 需要设置的新坐标。 + */ + setLatLng: function setLatLng(latlng) { + this._latlng = latlng; + this.redraw(); + /** + * @event UnicodeMarker#move + * @description circle marker 重设坐标之后触发。 + * @property {L.LatLng} latlng - 当前 marker 坐标。 + */ + + return this.fire('move', { + latlng: this._latlng + }); + }, + + /** + * @function UnicodeMarker.prototype.getLatLng + * @description 获取 marker 坐标。 + * @returns {L.LatLng} 返回当前 marker 坐标。 + */ + getLatLng: function getLatLng() { + return this._latlng; + }, + _project: function _project() { + this._point = this._map.latLngToLayerPoint(this._latlng); + + this._updateBounds(); + }, + _updateBounds: function _updateBounds() { + var w = this._clickTolerance(), + p = [w, w]; + + this._pxBounds = new (external_L_default()).Bounds(this._point.subtract(p), this._point.add(p)); + }, + _update: function _update() { + if (this._map) { + this._updatePath(); + } + }, + _updatePath: function _updatePath() { + this._renderer._updateUnicode(this); + }, + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function _containsPoint(p) { + return p.distanceTo(this._point) <= this._clickTolerance(); + } +}); +var unicodeMarker = function unicodeMarker(latlng, options) { + return new UnicodeMarker(latlng, options); +}; +external_L_default().Canvas.include({ + _updateUnicode: function _updateUnicode(layer) { + if (!this._drawing) { + return; + } + + var pt = { + x: layer._point.x, + y: layer._point.y + }, + ctx = this._ctx, + fontStyle = [layer.options.fontStyle, "normal", layer.options.fontWeight, layer.options.fontSize, layer.options.fontFamily].join(" "); + var label = layer.options.label.replace(/^&#x/, ''); + label = String.fromCharCode(parseInt(label, 16)); + var labelRows = label.split('\n'); + var numRows = labelRows.length; // if (layer.options.labelXOffset || layer.options.labelYOffset) { + // let xOffset = isNaN(layer.options.labelXOffset) ? 0 : layer.options.labelXOffset; + // let yOffset = isNaN(layer.options.labelYOffset) ? 0 : layer.options.labelYOffset; + // pt.x += xOffset; + // pt.y -= yOffset; + // } + + ctx.fillStyle = layer.options.fontColor; + ctx.globalAlpha = 1.0; + + if (layer.options.fontOpacity >= 0 && layer.options.fontOpacity < 1) { + ctx.globalAlpha = layer.options.fontOpacity; + } + + if (ctx.fillText) { + // HTML5 + ctx.font = fontStyle; + ctx.textAlign = layer.options.textAlign; + ctx.textBaseline = layer.options.textBaseline; + var vfactor = layer.options.vfactor; + var lineHeight = ctx.measureText('Mg').height || ctx.measureText('xx').width; + pt.y += lineHeight * vfactor * (numRows - 1); + + for (var i = 0; i < numRows; i++) { + if (layer.options.labelRotation != 0) { + ctx.save(); + ctx.translate(pt.x, pt.y); + ctx.rotate(layer.options.labelRotation * Math.PI / 180); + ctx.fillText(labelRows[i], 0, lineHeight * i); + ctx.restore(); + } else { + ctx.fillText(labelRows[i], pt.x, pt.y); + } + } + } else if (ctx.mozDrawText) { + // Mozilla pre-Gecko1.9.1 (SuperMap Online'] - 版权信息。 + * @fires WebMap#maploaded + * @fires WebMap#coordconvertsuccess + * @fires WebMap#coordconvertfailed + * @fires WebMap#featureunselected + * @fires WebMap#featureselected + * @fires WebMap#featuremousemove + * @usage + */ + +var WebMap = external_L_default().LayerGroup.extend({ + options: { + map: 'map', + server: 'https://www.supermapol.com', + featureLayerPopupEnable: true, + featureLayerPopup: null, + credentialValue: null, + credentialKey: 'key', + attribution: core_Attributions.Online.attribution + }, + + /** + * @private + * @function WebMap.prototype.defaultFeatureLayerPopup + * @description 默认图层弹出框。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @returns {string} 图层弹出框内容。 + */ + defaultFeatureLayerPopup: function defaultFeatureLayerPopup(layer) { + return layer.feature.properties.attributes.title + ":" + layer.feature.properties.attributes.description; + }, + initialize: function initialize(id, options) { + if (!id && !options) { + return; + } + + this._layers = {}; + external_L_default().setOptions(this, options); + this.id = id; + this.load(); + this.cartoCSSToLeaflet = new CartoCSSToLeaflet(); + }, + + /** + * @private + * @function WebMap.prototype.load + * @description 登陆后添加地图图层。 + */ + load: function load() { + if (this.options.server.indexOf('http://') < 0 && this.options.server.indexOf('https://') < 0) { + this.options.server = "http://" + this.options.server; + } + + var mapUrl = this.options.server + '/web/maps/' + this.id + '.json'; + + if (this.options.credentialValue) { + mapUrl += '?' + this.options.credentialKey + '=' + this.options.credentialValue; + } + + var me = this; + FetchRequest.get(mapUrl).then(function (response) { + return response.json(); + }).then(function (jsonObj) { + if (!jsonObj) { + return; + } + + var layers = jsonObj.layers; + me.mapInfo = jsonObj; + me.createLayersByJson(layers); + }); + }, + + /** + * @private + * @function WebMap.prototype.addLayerWrapper + * @description 添加图层容器。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @param {boolean} [isBaseLayer] - 是否为底图层。 + * @param {Object} options - 参数。 + * @returns {WebMap} WebMap的实例对象。 + */ + addLayerWrapper: function addLayerWrapper(layer, isBaseLayer, options) { + if (isBaseLayer) { + this.createMap(options); + } + + this.addLayer(layer); + + if (layer.labelLayer) { + this.addLayer(layer.labelLayer); + } + + return this; + }, + + /** + * @private + * @function WebMap.prototype.createLayersByJson + * @description 通过 JSON 创建图层。 + * @param {JSONObject} layersJson - 图层的 JSON 信息。 + */ + createLayersByJson: function createLayersByJson(layersJson) { + if (!external_L_default().Util.isArray(layersJson)) { + return; + } + + if (layersJson.length === 0) { + return; + } + + this.layers = []; + var layerQueue = []; + + for (var i = 0; i < layersJson.length; i++) { + var layerJson = layersJson[i]; + layerJson["_originIndex"] = i; + var layerJsonType = layerJson.layerType = layerJson.layerType || "BASE_LAYER"; + + if (layerJsonType !== "BASE_LAYER") { + //如果图层不是底图,则先加到图层队列里面等待底图完成后再处理 + layerQueue.unshift(layerJson); + continue; + } else { + layerJson.isBaseLayer = true; + this.createLayer(layerJson.type, layerJson); + } + } //底图加载完成后开始处理图层队列里的图层 + + + while (layerQueue.length > 0) { + var layerInfo = layerQueue.pop(); + var type = layerInfo.type; + var layerType = layerInfo.layerType = layerInfo.layerType || "BASE_LAYER"; + + if (layerType !== "OVERLAY_LAYER") { + type = layerType; + } + + this.createLayer(type, layerInfo); + } + /** + * @event WebMap#maploaded + * @description 底图加载完成后触发。 + * @property {L.Map} map - Leaflet Map 对象。 + */ + + + this.fire('maploaded', { + map: this._map + }); + }, + + /** + * @private + * @function WebMap.prototype.createCRS + * @description 创建坐标对象。 + * @param {number} epsgCode - epsg 编码。 + * @param {string} type - 坐标类型。 + * @param {number} resolutions - 分辨率。 + * @param {L.Point} origin - 切片原点。 + * @param {L.Bounds} bounds - 地图范围。 + */ + createCRS: function createCRS(epsgCode, type, resolutions, origin, bounds) { + if (epsgCode < 0) { + return new NonEarthCRS({ + bounds: bounds, + origin: origin, + resolutions: resolutions + }); + } + + if (epsgCode === 910112 || epsgCode === 910102) { + return BaiduCRS; + } + + if (epsgCode === 910111) { + epsgCode = 3857; //todo 火星mercator + } + + if (epsgCode === 910101) { + epsgCode = 4326; //todo 火星 + } + + return crs("EPSG:" + epsgCode, { + origin: origin, + resolutions: resolutions, + bounds: bounds + }); + }, + + /** + * @private + * @function WebMap.prototype.createMap + * @description 创建地图。 + * @param {Object} options - 参数。 + */ + createMap: function createMap(options) { + var crs = options.crs || (external_L_default()).CRS.EPSG3857; + var bounds = external_L_default().latLngBounds(crs.unproject(options.bounds.min), crs.unproject(options.bounds.max)); + this._map = external_L_default().map(this.options.map, { + center: bounds.getCenter(), + maxZoom: options.maxZoom || 22, + minZoom: options.minZoom || 0, + zoom: options.zoom || 0, + crs: crs, + renderer: external_L_default().canvas() + }); + + if (crs instanceof NonEarthCRS) { + this._map.setZoom(options.zoom ? options.zoom + 2 : 2, { + maxZoom: options.maxZoom || 22 + }); + } else { + this._map.fitBounds(bounds, { + maxZoom: options.maxZoom || 22 + }); + } + }, + + /** + * @private + * @function WebMap.prototype.getResolutionsFromScales + * @description 通过比例尺获取分辨率。 + * @param {Array.} scales - 排序比例尺数组。 + * @param {number} dpi - 屏幕分辨率。 + * @param {string} units - 地图的单位。 + * @param {Datum} datum - 大地参照系类。 + * @returns {Array.} 返回给定比例尺所对应的分辨率。 + */ + getResolutionsFromScales: function getResolutionsFromScales(scales, dpi, units, datum) { + var resolutions = []; + + for (var i = 0; i < scales.length; i++) { + resolutions.push(getResolutionFromScaleDpi(scales[i], dpi, units, datum)); + } + + return resolutions; + }, + + /** + * @private + * @function WebMap.prototype.createLayer + * @description 创建图层。 + * @param {string} type - 图层类型。 + * @param {Object} layerInfo - 图层信息。 + */ + createLayer: function createLayer(type, layerInfo) { + var prjCoordSys = layerInfo.prjCoordSys, + epsgCode = prjCoordSys && prjCoordSys.epsgCode || this.mapInfo.epsgCode, + center = this.mapInfo.center || layerInfo.center, + level = this.mapInfo.level || layerInfo.level, + bounds = this.mapInfo.extent || layerInfo.bounds, + scales = layerInfo.scales, + isBaseLayer = layerInfo.isBaseLayer, + opacity = layerInfo.opacity; + var mapBounds = external_L_default().bounds([bounds.leftBottom.x, bounds.leftBottom.y], [bounds.rightTop.x, bounds.rightTop.y]); + var layerBounds = layerInfo.bounds ? external_L_default().bounds([layerInfo.bounds.leftBottom.x, layerInfo.bounds.leftBottom.y], [layerInfo.bounds.rightTop.x, layerInfo.bounds.rightTop.y]) : mapBounds; + + if (!center) { + center = layerBounds.getCenter(); + } + + var origin = external_L_default().point(layerBounds.min.x, layerBounds.max.y); + var resolutions = !scales ? null : this.getResolutionsFromScales(scales, 96, layerInfo.units); + var crs = this.createCRS(epsgCode, prjCoordSys ? prjCoordSys.type : '', resolutions, origin, layerBounds); + var mapOptions = { + bounds: mapBounds, + center: external_L_default().point(center.x, center.y), + crs: crs, + zoom: level + }; + var layer; + + switch (type) { + case "SUPERMAP_REST": + layer = tiledMapLayer(layerInfo.url, { + transparent: true, + opacity: opacity + }); + break; + + case "SUPERMAP_REST_VECTOR": + //ToDO + break; + + case "TIANDITU_VEC": + case "TIANDITU_IMG": + case "TIANDITU_TER": + mapOptions.crs = epsgCode === 4326 ? TianDiTu_WGS84CRS : TianDiTu_MercatorCRS; + mapOptions.minZoom = 1; + mapOptions.zoom = 1 + mapOptions.zoom; + layer = this.createTiandituLayer(layerInfo); + break; + + case "BAIDU": + mapOptions.crs = BaiduCRS; + mapOptions.zoom = 3 + mapOptions.zoom; + mapOptions.minZoom = 3; + layer = baiduTileLayer(); + break; + + case 'BING': + //todo + break; + + case "WMS": + layer = this.createWmsLayer(layerInfo); + break; + + case "WMTS": + mapOptions.resolutions = this.getResolutionsFromScales(scales, 90.71446714322, layerInfo.units); + var identifier = layerInfo.identifier; + var layerName = identifier.substring(identifier.indexOf("_") + 1); + layer = wmtsLayer(layerInfo.url, { + layer: layerName, + style: "default", + tilematrixSet: identifier, + format: "image/png" + }); + break; + + case "CLOUD": + mapOptions.crs = (external_L_default()).CRS.EPSG3857; + mapOptions.zoom = 3 + mapOptions.zoom; + mapOptions.minZoom = 3; + layer = cloudTileLayer(layerInfo.url, { + opacity: opacity + }); + break; + + case "MARKER_LAYER": + layer = this.createMarkersLayer(layerInfo, crs); + break; + + case "FEATURE_LAYER": + if (layerInfo.identifier == "ANIMATORVECTOR") {//todo + } else if (layerInfo.identifier == "THEME") { + layer = this.createThemeLayer(layerInfo); + } else { + layer = this.createVectorLayer(layerInfo, crs); + } + + break; + + default: + throw new Error('unSupported Layer Type'); + } + + if (layer && layerInfo.isVisible) { + this.addLayerWrapper(layer, isBaseLayer, mapOptions); + } + }, + + /** + * @private + * @function WebMap.prototype.createTiandituLayer + * @description 创建天地图图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {tiandituTileLayer} 返回天地图图层对象。 + */ + createTiandituLayer: function createTiandituLayer(layerInfo) { + var type = layerInfo.type.split('_')[1].toLowerCase(); + var isLabel = layerInfo.layerType === 'OVERLAY_LAYER'; + var layer = new TiandituTileLayer({ + layerType: type, + isLabel: isLabel + }); + return layer; + }, + + /** + * @private + * @function WebMap.prototype.createMarkersLayer + * @description 创建图标图层。 + * @param {Object} layerInfo - 图层信息。 + * @param {Object} crs - 坐标对象。 + * @returns {L.Layer} 返回 marker 图层。 + */ + createMarkersLayer: function createMarkersLayer(layerInfo, crs) { + var that = this; + var markers = layerInfo.markers || []; //style = layerInfo.style, + //opacity = layerInfo.opacity, + //marker, point, size, offset, icon, that = this; + //todo offset + + var coordsToLatLng = function coordsToLatLng(coords) { + var ll = crs.unproject(external_L_default().point(coords[0], coords[1])); + return new (external_L_default()).LatLng(ll.lat, ll.lng, coords[2]); + }; + + var layer = external_L_default().geoJSON(toGeoJSON(markers), { + pointToLayer: function pointToLayer(geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + }; + + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function style(geoJsonFeature) { + return that.cartoCSSToLeaflet.getStyleFromiPortalMarker(geoJsonFeature.properties.icon); + } + }); + + if (this.options.featureLayerPopupEnable) { + layer.bindPopup(this.options.featureLayerPopup || this.defaultFeatureLayerPopup); + } + + return layer; + }, + + /** + * @private + * @function WebMap.prototype.createWmsLayer + * @description 创建 Wms 图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {L.Layer} 返回 Wms 图层对象。 + */ + createWmsLayer: function createWmsLayer(layerInfo) { + var url = layerInfo.url, + opacity = layerInfo.opacity, + subLayers = layerInfo.subLayers; + + if (!subLayers || subLayers === "undefined" || subLayers === "null") { + subLayers = "0"; + } + + return external_L_default().tileLayer.wms(url, { + layers: subLayers, + format: 'image/png', + transparent: true, + noWrap: true, + opacity: opacity + }); + }, + + /** + * @private + * @function WebMap.prototype.createVectorLayer + * @description 创建矢量要素图层。 + * @param {Object} layerInfo - 图层信息。 + * @param {Object} crs - 坐标对象。 + * @returns {L.Layer} 返回矢量要素图层对象。 + */ + createVectorLayer: function createVectorLayer(layerInfo, crs) { + var _this = this; + + var _style = layerInfo.style, + opacity = layerInfo.opacity, + me = this; //todo readonly = layerInfo.readonly; + + var coordsToLatLng = function coordsToLatLng(coords) { + var ll = crs.unproject(external_L_default().point(coords[0], coords[1])); + return new (external_L_default()).LatLng(ll.lat, ll.lng, coords[2]); + }; + + if (!layerInfo.url) { + var layer = external_L_default().geoJSON(toGeoJSON(layerInfo.features), { + pointToLayer: function pointToLayer(geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + }; + + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function style(geoJsonFeature) { + var lStyle = me.cartoCSSToLeaflet.getStyleFromiPortalStyle(_style ? _style : {}, geoJsonFeature.geometry.type, geoJsonFeature.properties.style); + + if (lStyle && lStyle.dashArray && lStyle.dashArray.length == 0) { + lStyle.dashArray = null; + } + + return lStyle; + }, + opacity: opacity + }); + + if (this.options.featureLayerPopupEnable) { + layer.bindPopup(this.options.featureLayerPopup || this.defaultFeatureLayerPopup); + } + + return layer; + } else { + var url = layerInfo.url, + datasourceName = layerInfo.name, + datasets = layerInfo.features; + + for (var setNameIndex = 0; setNameIndex < datasets.length; setNameIndex++) { + var dataset = datasets[setNameIndex]; + + if (dataset.visible) { + this.getFeaturesBySQL(url, datasourceName, dataset.name, "", DataFormat.GEOJSON, function (serviceResult) { + var layer = external_L_default().geoJSON(serviceResult.result, { + pointToLayer: function pointToLayer(geojson, latlng) { + var m = new (external_L_default()).Marker(latlng); + + m.setStyle = function (style) { + if (style) { + m.setIcon(style); + } + }; + + return m; + }, + coordsToLatLng: coordsToLatLng, + style: function style(geoJsonFeature) { + return this.cartoCSSToLeaflet.getStyleFromiPortalStyle(_style ? _style : {}, geoJsonFeature.geometry.type, geoJsonFeature.properties.style); + }, + opacity: opacity + }); + + if (_this.options.featureLayerPopupEnable) { + layer.bindPopup(me.options.featureLayerPopup || me.defaultFeatureLayerPopup); + } + + _this.addLayer(layer); + }); + } + } + } + }, + getFeaturesBySQL: function getFeaturesBySQL(url, datasourceName, datasetName, filter, format, callback) { + filter = filter || "SMID > 0"; + var sqlParam = new GetFeaturesBySQLParameters({ + queryParameter: { + name: datasetName + "@" + datasourceName, + attributeFilter: filter + }, + datasetNames: [datasourceName + ":" + datasetName], + fromIndex: 0, + toIndex: 100000 + }); + FeatureService_featureService(url).getFeaturesBySQL(sqlParam, callback, format); + }, + + /** + * @private + * @function WebMap.prototype.createThemeLayer + * @description 创建专题图图层。 + * @param {Object} layerInfo - 图层信息。 + * @returns {L.Layer} 返回专题图图层对象。 + */ + createThemeLayer: function createThemeLayer(layerInfo) { + var _this2 = this; + + var themeSettings = layerInfo.themeSettings && JSON.parse(layerInfo.themeSettings); + var layer; + var type = themeSettings.type; + layerInfo.themeSettings = themeSettings; + + if (type === "HEAT") { + layer = this.createHeatLayer(layerInfo, themeSettings); + } else if (type === "UNIQUE") { + layer = this.createUniqueLayer(layerInfo, themeSettings); + } else if (type === "RANGE") { + layer = this.createRangeLayer(layerInfo, themeSettings); + } else { + layer = this.createBaseThemeLayer(layerInfo, themeSettings); + } + + if (layer) { + this.addFeature2ThemeLayer(layerInfo, layer); + layer.on('add', function (e) { + _this2.registerThemeEvent(e.target); + }); + } + + if (themeSettings && themeSettings.labelField) { + var labelLayer = this.createLabelLayer(layerInfo, themeSettings); + labelLayer.on('add', function (e) { + _this2.registerThemeEvent(e.target); + }); + layer.labelLayer = labelLayer; + } + + return layer; + }, + createBaseThemeLayer: function createBaseThemeLayer(layerInfo, themeSettings) { + var style = layerInfo.style, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType, + featureStyle = style.pointStyle; + + if (vectorType === "LINE") { + featureStyle.fill = false; + } else { + featureStyle.fill = true; + } + + var pointStyle = {}; + pointStyle.radius = featureStyle.pointRadius; + pointStyle.color = featureStyle.strokeColor; + pointStyle.opacity = featureStyle.strokeOpacity; + pointStyle.lineCap = featureStyle.strokeLineCap; + pointStyle.weight = featureStyle.strokeWidth; + pointStyle.fillColor = featureStyle.fillColor; + pointStyle.fillOpacity = featureStyle.fillOpacity; + + var pointToLayer = function pointToLayer(geojson, latlng) { + return external_L_default().circleMarker(latlng, pointStyle); + }; + + if (featureStyle.unicode) { + pointToLayer = function pointToLayer(geojson, latlng) { + return new UnicodeMarker(latlng, featureStyle); + }; + } + + return external_L_default().geoJSON({ + type: "GeometryCollection", + geometries: [] + }, { + pointToLayer: pointToLayer, + opacity: opacity + }); //this.registerVectorEvent(vector); + }, + createUniqueLayer: function createUniqueLayer(layerInfo, themeSettings) { + var title = layerInfo.title; + var themeField = themeSettings.field, + styleGroups = [], + settings = themeSettings.settings, + isVisible = layerInfo.isVisible, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType; //组成styleGroup + + for (var i = 0; i < settings.length; i++) { + var object = {}; + object.value = settings[i].value; + object.style = settings[i].style; + styleGroups.push(object); + } + + var unique = new UniqueThemeLayer(title, { + opacity: opacity, + visibility: isVisible + }); + this.registerThemeEvent(unique); + unique.style = layerInfo.style.pointStyle; + + if (vectorType === "LINE") { + unique.style.fill = false; + } else { + unique.style.fill = true; + } + + unique.style.stroke = true; + unique.themeField = themeField; + unique.styleGroups = styleGroups; + var that = this; + unique.on('click', function (event) { + if (event.target && event.target.refDataID) { + var currenFeature = unique.getFeatureById(event.target.refDataID); + that.events.triggerEvent("uniquefeatureclicked", currenFeature, unique); + } + }); + return unique; + }, + createRangeLayer: function createRangeLayer(layerInfo, themeSettings) { + var title = layerInfo.title; + var themeField = themeSettings.field, + styleGroups = [], + settings = themeSettings.settings, + isVisible = layerInfo.isVisible, + opacity = layerInfo.opacity, + vectorType = themeSettings.vectorType, + featureStyle = layerInfo.style.pointStyle; + + if (vectorType === "LINE") { + featureStyle.fill = false; + } else { + featureStyle.fill = true; + } //组成styleGroup + + + for (var i = 0; i < settings.length; i++) { + var object = {}; + object.start = settings[i].start; + object.end = settings[i].end; + object.style = settings[i].style; + styleGroups.push(object); + } + + var range = new RangeThemeLayer(title, { + visibility: isVisible, + opacity: opacity + }); + this.registerThemeEvent(range); + range.style = layerInfo.style.pointStyle; + range.style.stroke = true; + range.themeField = themeField; + range.styleGroups = styleGroups; + return range; + }, + createLabelLayer: function createLabelLayer(layerInfo, themeSettings) { + var title = layerInfo.title; + var labelField = themeSettings.labelField, + settings = themeSettings.settings, + isVisible = layerInfo.isVisible; //目前只是同一样式 + + var style; + + if (!settings || settings.length > 0) { + style = { + "fillColor": "#ffffff" + }; + } else { + style = settings[0].style; + } + + var layerStyle = external_L_default().Util.extend(new ThemeStyle(), style); + layerStyle.fontWeight = "bold"; + layerStyle.fontSize = "14px"; //默认显示标签边框背景 + + layerStyle.labelRect = true; + layerStyle.strokeColor = layerStyle.fillColor; + layerStyle.fontColor = themeSettings.labelColor; + + if (themeSettings.labelFont) { + layerStyle.fontFamily = themeSettings.labelFont; + } + + var label = new LabelThemeLayer(title, { + visibility: isVisible, + opacity: 0.7 + }); + this.registerThemeEvent(label); + label.style = layerStyle; + label.themeField = labelField; //styleGroup, 目前只是同一样式 + + label.styleGroups = []; + return label; + }, + createHeatLayer: function createHeatLayer(layerInfo, themeSettings) { + var colors = themeSettings.colors || ['blue', 'cyan', 'lime', 'yellow', 'red']; + var gradient = {}, + featureWeight; + + for (var i = 0, len = colors.length, index = 1; i < len; i++) { + gradient[index / len] = colors[i]; + index++; + } + + var radius = themeSettings.settings[0].radius; //判断单位 + + if (themeSettings.heatUnit === "千米" || themeSettings.heatUnit === "km") { + radius = themeSettings.heatRadius * 1000; + } //权重 + + + if (themeSettings.settings[0] && themeSettings.settings[0].featureWeight) { + featureWeight = themeSettings.settings[0].featureWeight; + } + + return external_L_default().heatLayer([], { + radius: radius / 2, + minOpacity: layerInfo.opacity, + gradient: gradient, + blur: radius / 2, + featureWeight: featureWeight + }); + }, + addFeature2ThemeLayer: function addFeature2ThemeLayer(layerInfo, layer) { + var _this3 = this; + + if (layerInfo.layerType !== "FEATURE_LAYER" || layerInfo.identifier !== "THEME") { + return; + } + + var me = this; + var isRestData = !!layerInfo.datasourceName; + var cartoCSS = layerInfo.cartoCSS; + + if (cartoCSS) { + var needTransform = this.getCartoCSS2Obj(cartoCSS).needTransform; + var isAddFile = this.getCartoCSS2Obj(cartoCSS).isAddFile; + } + + var url = layerInfo.url, + subLayers, + subLayer, + layerName, + credential = layerInfo.credential, + themeSettings = layerInfo.themeSettings, + filter = themeSettings.filter; + + if (isAddFile) { + var position = JSON.parse(layerInfo.datasourceName); + var sql = this.getSQLFromFilter(filter); + + if (url) { + this.getFeatureFromFileAdded(layerInfo, function (data) { + var sFeaturesArr = [], + features, + result; + + if (data.type === 'EXCEL' || data.type === 'CSV') { + features = me.parseFeatureFromEXCEL.apply(me, [data.content.rows, data.content.colTitles, false, position]); + + for (var x = 0, len = features.length; x < len; x++) { + result = jsonsql_default()({ + attr: features[x].attributes + }, sql); + + if (result.length > 0) { + sFeaturesArr.push(features[x]); + } + } + } else { + features = me.parseFeatureFromJson(data.content); + + for (var i = 0, length = features.length; i < length; i++) { + result = jsonsql_default()({ + attr: features[i].attributes + }, sql); + + if (result.length > 0) { + sFeaturesArr.push(features[i]); + } + } + } + + var newEpsgCode = '4326', + oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + + if (needTransform) { + me.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, sFeaturesArr, function (features) { + addFeatures(features); + }); + } else { + addFeatures(sFeaturesArr); + } + }, function () {}); + } else { + var newFeautures = [], + features = layerInfo.features; + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var sqlResult = jsonsql_default()({ + attr: feature.attributes + }, sql); + + if (sqlResult.length > 0) { + var lon = feature.geometry.points[0].x, + lat = feature.geometry.points[0].y; + var point = new Point(lon, lat); + var vector = new Vector(point, feature.attributes, feature.style); + newFeautures.push(vector); + } + } + + addFeatures(newFeautures); + } + } else if (isRestData) { + var dataSourceName = layerInfo.datasourceName; + subLayers = layerInfo.subLayers && JSON.parse(layerInfo.subLayers); + + if (subLayers.length && subLayers.length > 0) { + subLayer = subLayers[0]; + } else { + subLayer = subLayers; + } + + layerName = subLayer && subLayer.name; + this.getFeaturesBySQL(layerInfo.url, dataSourceName, layerName, themeSettings.filter, DataFormat.ISERVER, function (getFeaturesEventArgs) { + var features, + feature, + result = getFeaturesEventArgs.result, + addedFeatures = []; + + if (result && result.features) { + features = result.features; + + for (var fi = 0, felen = features.length; fi < felen; fi++) { + feature = ServerFeature.fromJson(features[fi]).toFeature(); + addedFeatures.push(feature); + } + + var newEpsgCode = '4326', + oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + + if (needTransform) { + _this3.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, addedFeatures, function (features) { + addFeatures(features); + }); + } else { + addFeatures(features); + } + } + }); + } else { + subLayers = layerInfo.subLayers && JSON.parse(layerInfo.subLayers); + + if (subLayers.length && subLayers.length > 0) { + subLayer = subLayers[0]; + } else { + subLayer = subLayers; + } + + layerName = subLayer && subLayer.name; + var oldEpsgCode = layerInfo.prjCoordSys && layerInfo.prjCoordSys.epsgCode; + this.getFeaturesBySQL(url, credential, layerName, filter, DataFormat.ISERVER, function (features) { + var newEpsgCode = '4326'; + + if (needTransform) { + me.changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, features, function (features) { + addFeatures(features); + }); + } else { + addFeatures(features); + } + }); + } + + function addFeatures(features) { + if (layer && layer.labelLayer instanceof LabelThemeLayer) { + me.addFeature2LabelLayer(layer.labelLayer, features, layerInfo); + } + + if ((external_L_default()).HeatLayer && layer instanceof (external_L_default()).HeatLayer) { + var heatPoints = []; + + for (var _i = 0, _len = features.length; _i < _len; _i++) { + var geometry = features[_i].geometry; + heatPoints[_i] = external_L_default().latLng(geometry.y, geometry.x); + + if (layer.options.featureWeight) { + heatPoints[_i] = [heatPoints[_i].lat, heatPoints[_i].lng, parseFloat(features[_i].attributes[layer.options.featureWeight])]; + } + } + + layer.setLatLngs(heatPoints); + } else if (layer instanceof (external_L_default()).GeoJSON) { + layer.addData(new GeoJSON().toGeoJSON(features)); + } else { + layer.addFeatures(features); + } + } + }, + addFeature2LabelLayer: function addFeature2LabelLayer(layer, features, layerInfo) { + if (!features) { + return; + } + + var feature, geoTextFeature; + var themeSettings = layerInfo.themeSettings; + themeSettings = typeof themeSettings === "string" ? JSON.parse(layerInfo.themeSettings) : layerInfo.themeSettings; + var themeField = themeSettings.labelField; + var style = layer.style; + var labelFeatures = [], + lngLat; + var styleInfo = layerInfo.styleString && JSON.parse(layerInfo.styleString); + + for (var i = 0; i < features.length; i++) { + lngLat = this.getLabelLngLat(themeSettings.vectorType, features[i]); //设置标签的偏移量 + + this.setLabelOffset(themeSettings.vectorType, styleInfo, features[i], style); + feature = features[i]; + var attributes = feature.attributes; + geoTextFeature = new ThemeFeature([lngLat.lat, lngLat.lng, attributes[themeField]], attributes); + labelFeatures.push(geoTextFeature); + } + + layer.style = style; + layer.addFeatures(labelFeatures); + }, + setLabelOffset: function setLabelOffset(vectorType, styleInfo, feature, layerStyle) { + if (vectorType === 'POINT') { + var pointRadius = styleInfo.pointStyle.pointRadius || 0; + var strokeWidth = styleInfo.pointStyle.strokeWidth || 0; + var fontSize = parseInt(styleInfo.pointStyle.fontSize) || 0; + layerStyle.labelXOffset = 0; + layerStyle.labelYOffset = styleInfo.pointStyle.unicode ? 20 + fontSize : 25 + (pointRadius + strokeWidth); + } else { + return; + } + }, + getLabelLngLat: function getLabelLngLat(vectorType, feature) { + var lngLat = {}; + + if (vectorType === 'POINT') { + var geometry = feature.geometry; + lngLat.lng = geometry.x; + lngLat.lat = geometry.y; + } else if (vectorType === 'LINE') { + //一条线所有顶点的数量 + var length, index; + var components = feature.geometry.components; + + if (components[0].x) { + //说明是lineString类型 + length = components.length; //线取中间点下一个显示标签 + + index = parseInt(length / 2); + lngLat.lng = components[index].x; + lngLat.lat = components[index].y; + } else { + //说明是MultiLineString类型,取第一条线 + var lineOne = components[0].components; + length = lineOne.length; + index = parseInt(length / 2); + lngLat.lng = lineOne[index].x; + lngLat.lat = lineOne[index].y; + } + } else { + var centroid = feature.geometry.getCentroid(); + lngLat.lng = centroid.x; + lngLat.lat = centroid.y; + } + + return lngLat; + }, + changeFeatureLayerEpsgCode: function changeFeatureLayerEpsgCode(oldEpsgCode, newEpsgCode, layer, features, success) { + var me = this, + i, + len; + var points = []; + + if (!oldEpsgCode || !newEpsgCode) { + return; + } + + if (features && features.length > 0) { + for (i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var geometry = feature.geometry; + var vertices = geometry.getVertices(); + points = points.concat(vertices); + } + + oldEpsgCode = 'EPSG:' + oldEpsgCode; + newEpsgCode = 'EPSG:' + newEpsgCode; + me.coordsTransform(oldEpsgCode, newEpsgCode, points, function (layer, features) { + return function (newCoors) { + var start = 0, + len = newCoors.length; + + for (i = start; i < len; i++) { + var point = points[i], + coor = newCoors[i]; + point.x = coor.x; + point.y = coor.y; + point.calculateBounds(); + } + + for (i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + var geometry = feature.geometry; + + if (geometry.components) { + me.calculateComponents(geometry.components); + } + + geometry.calculateBounds(); + } + + success && success.call(me, features); + }; + }(layer, features)); + } + + return true; + }, + calculateComponents: function calculateComponents(components) { + if (components) { + if (components.components) { + this.calculateComponents(components.components); + } else { + for (var i = 0, len = components.length; i < len; i++) { + var component = components[i]; + + if (component.components) { + this.calculateComponents(component.components); + } + + component.calculateBounds(); + } + } + } + }, + coordsTransform: function coordsTransform(fromEpsg, toEpsg, point, success) { + var newCoord; + var from = this.SERVER_TYPE_MAP[fromEpsg], + to = this.SERVER_TYPE_MAP[toEpsg]; + + if (fromEpsg === toEpsg || !from || !to) { + if (point && point.length !== undefined) { + newCoord = []; + + for (var i = 0, len = point.length; i < len; i++) { + var coor = { + x: point[i].x, + y: point[i].y + }; + newCoord.push(coor); + } + } else { + newCoord = { + x: point.x, + y: point.y + }; + } + + if (success) { + success.call(this, newCoord); + } + } else { + var mercator = this.SERVER_TYPE_MAP['EPSG:3857'], + wgs84 = this.SERVER_TYPE_MAP['EPSG:4326']; + + if ((from === mercator || from === wgs84) && (to === mercator || to === wgs84)) { + this.projTransform(fromEpsg, toEpsg, point, success); + } else { + var convertType = from + '_' + to; + this.postTransform(convertType, point, success); + } + } + }, + projTransform: function projTransform(fromEpsg, toEpsg, point, success) { + var newCoor, + me = this; + + if (!lib) { + return; + } + + if (point && point.length !== undefined) { + newCoor = []; + + for (var i = 0, len = point.length; i < len; i++) { + var coor = lib(fromEpsg, toEpsg, [point[i].x, point[i].y]); + newCoor.push({ + x: coor[0], + y: coor[1] + }); + } + } else { + newCoor = lib(fromEpsg, toEpsg, [point.x, point.y]); + newCoor = { + x: newCoor[0], + y: newCoor[1] + }; + } + + if (success) { + /** + * @event WebMap#coordconvertsuccess + * @description 坐标转换成功后触发。 + * @property {L.LatLng} newCoor - 转换成功后的坐标。 + */ + me.fire('coordconvertsuccess', { + newCoor: newCoor + }); + success.call(me, newCoor); + } + }, + postTransform: function postTransform(convertType, point, success) { + var _this4 = this; + + var me = this, + epsgArray = []; + + if (!convertType) { + return success.call(me, null); + } + + if (point && point.length !== undefined) { + for (var i = 0, len = point.length; i < len; i++) { + epsgArray.push({ + x: point[i].x, + y: point[i].y + }); + } + } else { + epsgArray = [{ + x: point.x, + y: point.y + }]; + } + + if (epsgArray.length === 0) { + return success.call(me, null); + } + + var postData = { + "convertType": convertType, + "points": epsgArray + }; + var url = this.server + "/apps/viewer/coordconvert.json"; + postData = JSON.stringify(postData); + var options = {}; + + if (!Util.isInTheSameDomain(url) && this.proxy) { + options.proxy = this.proxy; + } + + FetchRequest.post(url, postData, options).then(function (response) { + return response.json(); + }).then(function (jsonObj) { + var newCoors = jsonObj; + + if (!point && point.length !== undefined) { + newCoors = newCoors[0]; + } + + _this4.fire('coordconvertsuccess', { + newCoors: newCoors + }); + + success.call(_this4, newCoors); + })["catch"](function (err) { + if (!_this4.actived) { + return; + } + /** + * @event WebMap#coordconvertfailed + * @description 坐标转换失败后触发。 + * @property {Object} err - error 对象。 + */ + + + _this4.fire('coordconvertfailed', { + err: err + }); + }); + }, + getSQLFromFilter: function getSQLFromFilter(filter) { + if (!filter) { + return ' * where (1==1||1>=0)'; + } else { + filter = filter.replace(/=/g, '==').replace(/and|AND/g, '&&').replace(/or|OR/g, '||').replace(/>==/g, '>=').replace(/<==/g, '<='); + return ' * where (' + filter + ')'; + } + }, + getAttributesObjFromTable: function getAttributesObjFromTable(cols, colTitles) { + if (cols.length === 0 || colTitles.length === 0) { + return; + } + + var attrArr = []; + + for (var i = 0; i < cols.length; i++) { + var obj = {}; + + for (var j = 0; j < colTitles.length; j++) { + obj[colTitles[j]] = cols[i][j]; + } + + attrArr.push(obj); + } + + return attrArr; + }, + parseFeatureFromEXCEL: function parseFeatureFromEXCEL(rows, colTitles, isGraphic, position) { + var attrArr = this.getAttributesObjFromTable(rows, colTitles); + var features = []; + + for (var i = 0, len = attrArr.length; i < len; i++) { + var lon = attrArr[i][position["lon"]]; + var lat = attrArr[i][position["lat"]]; + + if (!lon || !lat) { + continue; + } + + lon = parseFloat(lon); + lat = parseFloat(lat); + var geometry = new Point(lon, lat); + var pointGraphic; + + if (isGraphic) { + pointGraphic = new Graphic(geometry, attrArr[i], null); + } else { + pointGraphic = new Vector(geometry, attrArr[i], null); + } + + features.push(pointGraphic); + } + + return features; + }, + parseFeatureFromJson: function parseFeatureFromJson(feature) { + var format = new GeoJSON(); + var features = format.read(feature); //兼容insights数据格式 + + if (features == null) { + var content = JSON.parse(feature.replace(/'/, '"')); + + if (content.isAnalyseResult || content.type === 'MapEditor' || content.type === 'DataInsights' || content.type === 'ISERVER') { + content = content.data.recordsets[0].features; + } + + format = new GeoJSON(); + features = format.read(content); + } + + for (var i = 0, len = features.length; i < len; i++) { + features[i].attributes = features[i].attributes.properties || features[i].attributes; + } + + return features; + }, + getFeatureFromFileAdded: function getFeatureFromFileAdded(layerInfo, success, failed, isGraphic) { + var url = isGraphic ? layerInfo.url + '?currentPage=1&&pageSize=9999999' : layerInfo.url; + FetchRequest.get(url).then(function (response) { + return response.json(); + }).then(function (data) { + success && success(data); + })["catch"](function (err) { + return failed && failed(err); + }); + }, + getCartoCSS2Obj: function getCartoCSS2Obj(cartoCSS) { + var isAddFile, + needTransform = false; + + if (cartoCSS.indexOf('}') > -1) { + cartoCSS = JSON.parse(cartoCSS); + needTransform = cartoCSS.needTransform; + isAddFile = cartoCSS.isAddFile; + } else { + if (cartoCSS === 'needTransform') { + needTransform = true; //layerInfo.needTransform = true; + + isAddFile = false; + } else { + isAddFile = cartoCSS === 'true'; + } + } + + return { + isAddFile: isAddFile, + needTransform: needTransform + }; + }, + registerThemeEvent: function registerThemeEvent(themeLayer) { + var _this5 = this; + + themeLayer.on('click', function (evt) { + if (!themeLayer.map) { + return; + } + + if (_this5.selectedFeature) { + /** + * @event WebMap#featureunselected + * @description 重置选中的要素为空。 + * @property {FeatureVector} feature - 在重置之前选中的要素。 + */ + _this5.fire('featureunselected', { + feature: _this5.selectedFeature + }); + + _this5.selectedFeature = null; + } + + var feature; + + if (evt.target && evt.target.refDataID) { + feature = themeLayer.getFeatureById(evt.target.refDataID); + } + + if (feature) { + _this5.selectedFeature = feature; + /** + * @event WebMap#featureselected + * @description 点击要素,要素存在之后触发。设置选中的要素。 + * @property {FeatureVector} feature - 点击的要素。 + */ + + _this5.fire('featureselected', { + feature: feature + }); + } + }); + themeLayer.on('mousemove', function (evt) { + if (!themeLayer.map) { + return; + } + + if (evt.target && evt.target.refDataID) { + var feature; + + if (evt.target && evt.target.refDataID) { + feature = themeLayer.getFeatureById(evt.target.refDataID); + } + + if (feature) { + /** + * @event WebMap#featuremousemove + * @description 鼠标移动到要素上之后触发。 + * @property {FeatureVector} feature - 当前被移动到的要素。 + */ + _this5.fire('featuremousemove', { + feature: feature + }); + } + } + }); + }, + SERVER_TYPE_MAP: { + "EPSG:4326": "WGS84", + "EPSG:3857": "MERCATOR", + "EPSG:900913": "MERCATOR", + "EPSG:102113": "MERCATOR", + "EPSG:910101": "GCJ02", + "EPSG:910111": "GCJ02MERCATOR", + "EPSG:910102": "BD", + "EPSG:910112": "BDMERCATOR" + } +}); +var webMap = function webMap(id, options) { + return new WebMap(id, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/ImageTileLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ImageTileLayer + * @deprecatedclassinstance L.supermap.imageTileLayer + * @version 10.2.0 + * @classdesc iServer 影像服务图层源。根据请求参数,返回指定的影像数据栅格瓦片并渲染。 + * @category iServer Image + * @extends {L.TileLayer} + * @example + * new ImageTileLayer(url,{collectionId:'xxx'}).addTo(map); + * @param {string} url - 服务地址,例如: http://{ip}:{port}/iserver/{imageservice-imageserviceName}/restjsr/ + * @param {Object} options - 参数。 + * @param {string} options.collectionId - 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {string} [options.sqlFilter] 对所显示影像的过滤条件。相当于sql查询中的where子句。支持st_geometry空间函数过滤。11.0版本暂不支持通过ECQL进行过滤。 + * @param {ImageRenderingRule} [options.renderingRule] 指定影像显示的风格,包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。不指定时,使用发布服务时所配置的风格。 + * @param {Array.} [options.ids] 返回影像集合中指定ID的影像,该id为系统维护的一个自增id,为SuperMap SDX引擎的SmID字段内容。 + * @param {Array.} [options.names] 返回影像集合中指定名称影像的瓦片资源。影像名称包含文件后缀,如S-60-45.tif。 + * @param {string} [options.format='png'] - 瓦片表述类型,瓦片格式目前支持png、jpg和webp三种格式。 + * @param {boolean} [options.transparent=true] - 瓦片是否透明。默认透明。 + * @param {boolean} [options.cacheEnabled=true] - 启用缓存。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * @param {Array.} [options.subdomains] - 子域名数组。 + * @param {string} [options.tileProxy] - 服务代理地址。 + * @usage + */ + +var ImageTileLayer = external_L_default().TileLayer.extend({ + options: { + collectionId: null, + sqlFilter: null, + ids: null, + names: null, + renderingRule: null, + format: 'png', + zoomOffset: 1, + transparent: true, + cacheEnabled: true, + tileProxy: null, + //启用托管地址。 + attribution: core_Attributions.Common.attribution, + subdomains: null + }, + initialize: function initialize(url, options) { + this._url = url; + external_L_default().TileLayer.prototype.initialize.apply(this, arguments); + external_L_default().setOptions(this, options); + external_L_default().stamp(this); + }, + + /** + * @private + * @function ImageTileLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + external_L_default().TileLayer.prototype.onAdd.call(this, map); + }, + + /** + * @function ImageTileLayer.prototype.getTileUrl + * @description 根据行列号获取瓦片地址。 + * @param {Object} coords - 行列号。 + * @returns {string} 瓦片地址。 + */ + getTileUrl: function getTileUrl(coords) { + var layerUrl = this._getLayerUrl(); + + var tileUrl = layerUrl + '&z=' + this._getZoomForUrl() + '&x=' + coords.x + '&y=' + coords.y; //支持代理 + + if (this.options.tileProxy) { + tileUrl = this.options.tileProxy + encodeURIComponent(tileUrl); + } + + if (!this.options.cacheEnabled) { + tileUrl += '&_t=' + new Date().getTime(); + } + + if (this.options.subdomains) { + tileUrl = external_L_default().Util.template(tileUrl, { + s: this._getSubdomain(coords) + }); + } + + return tileUrl; + }, + _getLayerUrl: function _getLayerUrl() { + return this._layerUrl || this._createLayerUrl(); + }, + _createLayerUrl: function _createLayerUrl() { + var layerUrl = Util.urlPathAppend(this._url, "/collections/".concat(this.options.collectionId, "/tile.").concat(this.options.format)); + this.requestParams = this.requestParams || this._getAllRequestParams(); + layerUrl = Util.urlAppend(layerUrl, external_L_namespaceObject.Util.getParamString(this.requestParams)); + layerUrl = SecurityManager.appendCredential(layerUrl); + this._layerUrl = layerUrl; + return layerUrl; + }, + _getAllRequestParams: function _getAllRequestParams() { + var me = this, + options = me.options || {}, + params = {}; + params['transparent'] = options.transparent === true; + params['cacheEnabled'] = !(options.cacheEnabled === false); + + if (options.sqlFilter) { + params['sqlFilter'] = options.sqlFilter; + } + + if (options.renderingRule) { + params['renderingRule'] = JSON.stringify(options.renderingRule); + } + + if (options.ids) { + params['ids'] = options.ids.join(','); + } + + if (options.names) { + params['names'] = options.names.join(','); + } + + return params; + } +}); +var imageTileLayer = function imageTileLayer(url, options) { + return new ImageTileLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/mapping/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/services/DataFlowService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DataFlowService + * @deprecatedclassinstance L.supermap.dataFlowService + * @classdesc 数据流服务类。 + * @category iServer DataFlow + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {function} [options.style] - 设置数据加载样式。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.excludeField] - 排除字段。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @fires DataFlowService#broadcastSocketConnected + * @fires DataFlowService#broadcastSocketError + * @fires DataFlowService#broadcastFailed + * @fires DataFlowService#broadcastSucceeded + * @fires DataFlowService#subscribeSocketError + * @fires DataFlowService#messageSucceeded + * @fires DataFlowService#setFilterParamSucceeded + * @usage + */ + +var DataFlowService_DataFlowService = ServiceBase.extend({ + options: { + geometry: null, + prjCoordSys: null, + excludeField: null + }, + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + + if (options.projection) { + this.options.prjCoordSys = options.projection; + } + + ServiceBase.prototype.initialize.call(this, url, options); + this.dataFlow = new DataFlowService(url, options); + /** + * @event DataFlowService#broadcastSocketConnected + * @description broadcast Socket 连接成功。 + */ + + /** + * @event DataFlowService#broadcastSocketError + * @description broadcast Socket 连接失败。 + */ + + /** + * @event DataFlowService#broadcastFailed + * @description 广播失败。 + */ + + /** + * @event DataFlowService#broadcastSucceeded + * @description 广播成功。 + */ + + /** + * @event DataFlowService#subscribeSocketConnected + * @description 订阅数据连接成功。 + */ + + /** + * @event DataFlowService#subscribeSocketError + * @description 订阅数据连接失败。 + */ + + /** + * @event DataFlowService#messageSucceeded + * @description 获取信息成功。 + */ + + /** + * @event DataFlowService#setFilterParamSucceeded + * @description 设置过滤参数成功。 + */ + + this.dataFlow.events.on({ + "broadcastSocketConnected": this._defaultEvent, + "broadcastSocketError": this._defaultEvent, + "broadcastFailed": this._defaultEvent, + "broadcastSucceeded": this._defaultEvent, + "subscribeSocketConnected": this._defaultEvent, + "subscribeSocketError": this._defaultEvent, + "messageSucceeded": this._defaultEvent, + "setFilterParamSucceeded": this._defaultEvent, + scope: this + }); + }, + + /** + * @function DataFlowService.prototype.initBroadcast + * @description 初始化广播。 + */ + initBroadcast: function initBroadcast() { + this.dataFlow.initBroadcast(); + return this; + }, + + /** + * @function DataFlowService.prototype.broadcast + * @description 加载广播数据。 + * @param {JSONObject} obj - JSON 格式的要素数据。 + */ + broadcast: function broadcast(obj) { + this.dataFlow.broadcast(obj); + }, + + /** + * @function DataFlowService.prototype.initSubscribe + * @description 初始化订阅数据。 + */ + initSubscribe: function initSubscribe() { + this.dataFlow.initSubscribe(); + return this; + }, + + /** + * @function DataFlowService.prototype.setExcludeField + * @description 设置排除字段。 + * @param {Object} excludeField - 排除字段。 + */ + setExcludeField: function setExcludeField(excludeField) { + this.dataFlow.setExcludeField(excludeField); + this.options.excludeField = excludeField; + return this; + }, + + /** + * @function DataFlowService.prototype.setGeometry + * @description 设置添加的 GeoJSON 几何要素数据。 + * @param {GeoJSONObject} geometry - 指定几何范围,该范围内的要素才能被订阅。 + */ + setGeometry: function setGeometry(geometry) { + this.dataFlow.setGeometry(geometry); + this.options.geometry = geometry; + return this; + }, + + /** + * @function DataFlowService.prototype.unSubscribe + * @description 结束订阅数据。 + */ + unSubscribe: function unSubscribe() { + this.dataFlow.unSubscribe(); + }, + + /** + * @function DataFlowService.prototype.unBroadcast + * @description 结束加载广播。 + */ + unBroadcast: function unBroadcast() { + this.dataFlow.unBroadcast(); + }, + _defaultEvent: function _defaultEvent(e) { + this.fire(e.eventType || e.type, e); + } +}); +var dataFlowService = function dataFlowService(url, options) { + return new DataFlowService_DataFlowService(url, options); +}; +;// CONCATENATED MODULE: external "function(){try{return mapv}catch(e){return {}}}()" +var external_function_try_return_mapv_catch_e_return_namespaceObject = function(){try{return mapv}catch(e){return {}}}(); +;// CONCATENATED MODULE: ./src/leaflet/overlay/mapv/MapVRenderer.js +function MapVRenderer_typeof(obj) { "@babel/helpers - typeof"; return MapVRenderer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, MapVRenderer_typeof(obj); } + +function MapVRenderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MapVRenderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MapVRenderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) MapVRenderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) MapVRenderer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function MapVRenderer_get() { if (typeof Reflect !== "undefined" && Reflect.get) { MapVRenderer_get = Reflect.get; } else { MapVRenderer_get = function _get(target, property, receiver) { var base = MapVRenderer_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return MapVRenderer_get.apply(this, arguments); } + +function MapVRenderer_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = MapVRenderer_getPrototypeOf(object); if (object === null) break; } return object; } + +function MapVRenderer_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) MapVRenderer_setPrototypeOf(subClass, superClass); } + +function MapVRenderer_setPrototypeOf(o, p) { MapVRenderer_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MapVRenderer_setPrototypeOf(o, p); } + +function MapVRenderer_createSuper(Derived) { var hasNativeReflectConstruct = MapVRenderer_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = MapVRenderer_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = MapVRenderer_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return MapVRenderer_possibleConstructorReturn(this, result); }; } + +function MapVRenderer_possibleConstructorReturn(self, call) { if (call && (MapVRenderer_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return MapVRenderer_assertThisInitialized(self); } + +function MapVRenderer_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function MapVRenderer_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function MapVRenderer_getPrototypeOf(o) { MapVRenderer_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MapVRenderer_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +var BaseLayer = external_function_try_return_mapv_catch_e_return_namespaceObject.baiduMapLayer ? external_function_try_return_mapv_catch_e_return_namespaceObject.baiduMapLayer.__proto__ : Function; +/** + * @class MapVRenderer + * @classdesc 地图渲染类。 + * @category Visualization MapV + * @private + * @extends mapv.BaseLayer + * @param {L.Map} map - Leaflet Map 对象。 + * @param {L.Layer} layer - Leaflet Layer 对象。 + * @param {DataSet} dataSet - 待渲染的数据集。 + * @param {Object} options - 参数。 + * @usage + */ + +var MapVRenderer = /*#__PURE__*/function (_BaseLayer) { + MapVRenderer_inherits(MapVRenderer, _BaseLayer); + + var _super = MapVRenderer_createSuper(MapVRenderer); + + function MapVRenderer(map, layer, dataSet, options) { + var _this; + + MapVRenderer_classCallCheck(this, MapVRenderer); + + _this = _super.call(this, map, dataSet, options); + + if (!BaseLayer) { + return MapVRenderer_possibleConstructorReturn(_this); + } + + var self = MapVRenderer_assertThisInitialized(_this); + + options = options || {}; + self.init(options); + self.argCheck(options); + _this.canvasLayer = layer; + _this.clickEvent = _this.clickEvent.bind(MapVRenderer_assertThisInitialized(_this)); + _this.mousemoveEvent = _this.mousemoveEvent.bind(MapVRenderer_assertThisInitialized(_this)); + _this._moveStartEvent = _this.moveStartEvent.bind(MapVRenderer_assertThisInitialized(_this)); + _this._moveEndEvent = _this.moveEndEvent.bind(MapVRenderer_assertThisInitialized(_this)); + _this._zoomStartEvent = _this.zoomStartEvent.bind(MapVRenderer_assertThisInitialized(_this)); + + _this.bindEvent(); + + return _this; + } + /** + * @function MapVRenderer.prototype.clickEvent + * @description 鼠标点击事件。 + * @param {Object} e - 触发对象。 + */ + + + MapVRenderer_createClass(MapVRenderer, [{ + key: "clickEvent", + value: function clickEvent(e) { + var offset = this.map.containerPointToLayerPoint([0, 0]); + var devicePixelRatio = this.devicePixelRatio = this.canvasLayer.devicePixelRatio = window.devicePixelRatio || 1; + var pixel = e.layerPoint; + + MapVRenderer_get(MapVRenderer_getPrototypeOf(MapVRenderer.prototype), "clickEvent", this).call(this, external_L_default().point((pixel.x - offset.x) / devicePixelRatio, (pixel.y - offset.y) / devicePixelRatio), e); + } + /** + * @function MapVRenderer.prototype.mousemoveEvent + * @description 鼠标移动事件。 + * @param {Object} e - 触发对象。 + */ + + }, { + key: "mousemoveEvent", + value: function mousemoveEvent(e) { + var pixel = e.layerPoint; + + MapVRenderer_get(MapVRenderer_getPrototypeOf(MapVRenderer.prototype), "mousemoveEvent", this).call(this, pixel, e); + } + /** + * @function MapVRenderer.prototype.bindEvent + * @description 监听鼠标移动和点击事件。 + * @param {Object} e - 触发对象。 + */ + + }, { + key: "bindEvent", + value: function bindEvent() { + var map = this.map; + + if (this.options.methods) { + if (this.options.methods.click) { + map.on('click', this.clickEvent); + } + + if (this.options.methods.mousemove) { + map.on('mousemove', this.mousemoveEvent); + } + } + + this.map.on('movestart', this._moveStartEvent); + this.map.on('moveend', this._moveEndEvent); + this.map.on('zoomstart', this._zoomStartEvent); + } + /** + * @function MapVRenderer.prototype.destroy + * @description 释放资源。 + */ + + }, { + key: "destroy", + value: function destroy() { + this.unbindEvent(); + this.clearData(); + this.animator && this.animator.stop(); + this.animator = null; + this.canvasLayer = null; + } + /** + * @function MapVRenderer.prototype.unbindEvent + * @description 移除鼠标事件。 + * @param {Object} e - 触发对象。 + */ + + }, { + key: "unbindEvent", + value: function unbindEvent() { + var map = this.map; + + if (this.options.methods) { + if (this.options.methods.click) { + map.off('click', this.clickEvent); + } + + if (this.options.methods.mousemove) { + map.off('mousemove', this.mousemoveEvent); + } + } + + this.map.off('movestart', this._moveStartEvent); + this.map.off('moveend', this._moveEndEvent); + this.map.off('zoomstart', this._zoomStartEvent); + } + /** + * @function MapVRenderer.prototype.getContext + * @description 获取信息。 + */ + + }, { + key: "getContext", + value: function getContext() { + return this.canvasLayer.getCanvas().getContext(this.context); + } + /** + * @function MapVRenderer.prototype.addData + * @description 添加数据。 + * @param {Object} data - 待添加的数据。 + * @param {Object} options - 参数。 + */ + + }, { + key: "addData", + value: function addData(data, options) { + var _data = data; + + if (data && data.get) { + _data = data.get(); + } + + this.dataSet.add(_data); + this.update({ + options: options + }); + } + /** + * @function MapVRenderer.prototype.update + * @description 更新图层。 + * @param {Object} opt - 待更新的数据。 + * @param {Object} opt.data - mapv 数据集。 + * @param {Object} opt.options - mapv 绘制参数。 + */ + + }, { + key: "update", + value: function update(opt) { + var update = opt || {}; + var _data = update.data; + + if (_data && _data.get) { + _data = _data.get(); + } + + if (_data != undefined) { + this.dataSet.set(_data); + } + + MapVRenderer_get(MapVRenderer_getPrototypeOf(MapVRenderer.prototype), "update", this).call(this, { + options: update.options + }); + } + /** + * @function MapVRenderer.prototype.getData + * @description 获取数据 + */ + + }, { + key: "getData", + value: function getData() { + return this.dataSet; + } + /** + * @function MapVRenderer.prototype.removeData + * @description 删除符合过滤条件的数据。 + * @param {function} filter - 过滤条件。参数为数据项,返回值为 true,表示删除该元素;否则表示不删除。 + */ + + }, { + key: "removeData", + value: function removeData(_filter) { + if (!this.dataSet) { + return; + } + + var newData = this.dataSet.get({ + filter: function filter(data) { + return _filter != null && typeof _filter === "function" ? !_filter(data) : true; + } + }); + this.dataSet.set(newData); + this.update({ + options: null + }); + } + /** + * @function MapVRenderer.prototype.clearData + * @description 清除数据。 + */ + + }, { + key: "clearData", + value: function clearData() { + this.dataSet && this.dataSet.clear(); + this.update({ + options: null + }); + } + }, { + key: "_canvasUpdate", + value: function _canvasUpdate(time) { + if (!this.canvasLayer) { + return; + } + + var self = this; + var animationOptions = self.options.animation; + var context = this.getContext(); + var map = this.map; + + if (self.isEnabledTime()) { + if (time === undefined) { + this.clear(context); + return; + } + + if (this.context === '2d') { + context.save(); + context.globalCompositeOperation = 'destination-out'; + context.fillStyle = 'rgba(0, 0, 0, .1)'; + context.fillRect(0, 0, context.canvas.width, context.canvas.height); + context.restore(); + } + } else { + this.clear(context); + } + + if (this.context === '2d') { + for (var key in self.options) { + context[key] = self.options[key]; + } + } else { + context.clear(context.COLOR_BUFFER_BIT); + } + + if (self.options.minZoom && map.getZoom() < self.options.minZoom || self.options.maxZoom && map.getZoom() > self.options.maxZoom) { + return; + } + + var bounds = map.getBounds(); //获取当前像素下的地理范围 + + var dw = bounds.getEast() - bounds.getWest(); + var dh = bounds.getNorth() - bounds.getSouth(); + var mapCanvas = map.getSize(); + var resolutionX = dw / mapCanvas.x, + resolutionY = dh / mapCanvas.y; // 一个像素是多少米 + + var zoomUnit = Util_getMeterPerMapUnit('DEGREE') * resolutionX; //var centerPx = map.latLngToLayerPoint(map.getCenter()); + //获取屏幕左上角的地理坐标坐标 + //左上角屏幕坐标为0,0 + + var topLeft = this.canvasLayer.getTopLeft(); + var topLeftPX = map.latLngToAccurateContainerPoint(topLeft); // var lopLeft = map.containerPointToLatLng([0, 0]); + + var dataGetOptions = { + transferCoordinate: function transferCoordinate(coordinate) { + var offset; + + if (self.context === '2d') { + offset = map.latLngToAccurateContainerPoint(external_L_default().latLng(coordinate[1], coordinate[0])); + } else { + offset = { + 'x': (coordinate[0] - topLeft.lng) / resolutionX, + 'y': (topLeft.lat - coordinate[1]) / resolutionY + }; + } + + var pixel = { + x: offset.x - topLeftPX.x, + y: offset.y - topLeftPX.y + }; + return [pixel.x, pixel.y]; + } + }; + + if (time !== undefined) { + dataGetOptions.filter = function (item) { + var trails = animationOptions.trails || 10; + return time && item.time > time - trails && item.time < time; + }; + } + + var data = self.dataSet.get(dataGetOptions); + this.processData(data); + var worldPoint = map.latLngToContainerPoint(external_L_default().latLng(0, 0)); + var pixel = { + x: worldPoint.x - topLeftPX.x, + y: worldPoint.y - topLeftPX.y + }; // 兼容unit为'm'的情况 + + if (self.options.unit === 'm') { + if (self.options.size) { + self.options._size = self.options.size / zoomUnit; + } + + if (self.options.width) { + self.options._width = self.options.width / zoomUnit; + } + + if (self.options.height) { + self.options._height = self.options.height / zoomUnit; + } + } else { + self.options._size = self.options.size; + self.options._height = self.options.height; + self.options._width = self.options.width; + } + + this.drawContext(context, data, self.options, pixel); + self.options.updateCallback && self.options.updateCallback(time); + } + }, { + key: "init", + value: function init(options) { + var self = this; + self.options = options; + this.initDataRange(options); + this.context = self.options.context || '2d'; + + if (self.options.zIndex) { + this.canvasLayer && this.canvasLayer.setZIndex(self.options.zIndex); + } + + this.initAnimator(); + } + }, { + key: "addAnimatorEvent", + value: function addAnimatorEvent() {} + /** + * @function MapVRenderer.prototype.moveStartEvent + * @description 开始移动事件。 + */ + + }, { + key: "moveStartEvent", + value: function moveStartEvent() { + var animationOptions = this.options.animation; + + if (this.isEnabledTime() && this.animator) { + this.steps.step = animationOptions.stepsRange.start; + + this._hide(); + } + } + /** + * @function MapVRenderer.prototype.moveEndEvent + * @description 移除移动事件。 + */ + + }, { + key: "moveEndEvent", + value: function moveEndEvent() { + this.canvasLayer.draw(); + + this._show(); + } + /** + * @function MapVRenderer.prototype.zoomStartEvent + * @description 隐藏渲染样式。 + */ + + }, { + key: "zoomStartEvent", + value: function zoomStartEvent() { + this._hide(); + } + /** + * @function MapVRenderer.prototype.clear + * @description 清除信息。 + * @param {string} context - 指定要清除的信息。 + */ + + }, { + key: "clear", + value: function clear(context) { + context && context.clearRect && context.clearRect(0, 0, context.canvas.width, context.canvas.height); + } + }, { + key: "_hide", + value: function _hide() { + this.canvasLayer.canvas.style.display = 'none'; + } + }, { + key: "_show", + value: function _show() { + this.canvasLayer.canvas.style.display = 'block'; + } + /** + * @function MapVRenderer.prototype.draw + * @description 绘制渲染。 + */ + + }, { + key: "draw", + value: function draw() { + this.canvasLayer.draw(); + } + }]); + + return MapVRenderer; +}(BaseLayer); +;// CONCATENATED MODULE: ./src/leaflet/overlay/MapVLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class MapVLayer + * @deprecatedclassinstance L.supermap.mapVLayer + * @classdesc MapV 图层。 + * @category Visualization MapV + * @extends {L.Layer} + * @param {Mapv.DataSet} dataSet - MapV 图层数据集。 + * @param {Object} mapVOptions - MapV 图层参数。 + * @param {Object} options - 参数。 + * @param {string} [options.attributionPrefix] - 版权信息前缀。 + * @param {string} [options.attribution='© 2018 百度 MapV'] - 版权信息。 + * @fires MapVLayer#loaded + * @usage + */ + +var MapVLayer = external_L_default().Layer.extend({ + options: { + attributionPrefix: null, + attribution: core_Attributions.MapV.attribution + }, + initialize: function initialize(dataSet, mapVOptions, options) { + options = options || {}; + this.dataSet = dataSet || {}; + this.mapVOptions = mapVOptions || {}; + this.render = this.render.bind(this); + external_L_default().Util.setOptions(this, options); + + if (this.options.attributionPrefix) { + this.options.attribution = this.options.attributionPrefix + this.options.attribution; + } + + this.canvas = this._createCanvas(); + external_L_default().stamp(this); + }, + + /** + * @private + * @function MapVLayer.prototype.onAdd + * @description 添加地图图层。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + this._map = map; + var overlayPane = this.getPane(); + var container = this.container = external_L_default().DomUtil.create("div", "leaflet-layer leaflet-zoom-animated", overlayPane); + container.appendChild(this.canvas); + var size = map.getSize(); + container.style.width = size.x + "px"; + container.style.height = size.y + "px"; + this.renderer = new MapVRenderer(map, this, this.dataSet, this.mapVOptions); + this.draw(); + /** + * @event MapVLayer#loaded + * @description 图层添加完成之后触发。 + */ + + this.fire("loaded"); + }, + // _hide: function () { + // this.canvas.style.display = 'none'; + // }, + // _show: function () { + // this.canvas.style.display = 'block'; + // }, + + /** + * @private + * @function MapVLayer.prototype.onRemove + * @description 删除地图图层。 + */ + onRemove: function onRemove() { + external_L_default().DomUtil.remove(this.container); + this.renderer.destroy(); + }, + + /** + * @function MapVLayer.prototype.addData + * @description 添加数据。 + * @param {Object} data - 需要添加的数据。 + * @param {Object} options - 参数。 + */ + addData: function addData(data, options) { + this.renderer.addData(data, options); + }, + + /** + * @function MapVLayer.prototype.update + * @description 更新图层。 + * @param {Object} opt - 待更新的数据。 + * @param {Object} data - mapv 数据集。 + * @param {Object} options - 参数。 + */ + update: function update(opt) { + this.renderer.update(opt); + }, + + /** + * @function MapVLayer.prototype.getData + * @description 获取数据。 + * @returns {Mapv.DataSet} mapv 数据集。 + */ + getData: function getData() { + if (this.renderer) { + this.dataSet = this.renderer.getData(); + } + + return this.dataSet; + }, + + /** + * @function MapVLayer.prototype.removeData + * @description 删除数据。 + * @param {function} filter - 过滤条件。指定数据项后,返回值为 true,表示删除该元素;否则表示不删除。 + * @example + * filter=function(data){ + * if(data.id=="1"){ + * return true + * } + * return false; + * } + */ + removeData: function removeData(filter) { + this.renderer && this.renderer.removeData(filter); + }, + + /** + * @function MapVLayer.prototype.clearData + * @description 清除数据。 + */ + clearData: function clearData() { + this.renderer.clearData(); + }, + + /** + * @function MapVLayer.prototype.draw + * @description 绘制图层。 + */ + draw: function draw() { + return this._reset(); + }, + + /** + * @function MapVLayer.prototype.setZIndex + * @description 设置 canvas 层级。 + * @param {number} zIndex - canvas 层级。 + */ + setZIndex: function setZIndex(zIndex) { + this.canvas.style.zIndex = zIndex; + }, + + /** + * @function MapVLayer.prototype.render + * @description 渲染。 + */ + render: function render() { + this.renderer._canvasUpdate(); + }, + + /** + * @function MapVLayer.prototype.getCanvas + * @description 获取 canvas。 + * @returns {HTMLElement} 返回 mapV 图层包含的 canvas 对象。 + */ + getCanvas: function getCanvas() { + return this.canvas; + }, + + /** + * @function MapVLayer.prototype.getContainer + * @description 获取容器。 + * @returns {HTMLElement} 返回包含 mapV 图层的 dom 对象。 + */ + getContainer: function getContainer() { + return this.container; + }, + + /** + * @function MapVLayer.prototype.getTopLeft + * @description 获取左上角坐标。 + * @returns {L.Bounds} 返回左上角坐标。 + */ + getTopLeft: function getTopLeft() { + var map = this._map; + var topLeft; + + if (map) { + var bounds = map.getBounds(); + topLeft = bounds.getNorthWest(); + } + + return topLeft; + }, + _createCanvas: function _createCanvas() { + var canvas = document.createElement('canvas'); + canvas.style.position = 'absolute'; + canvas.style.top = 0 + "px"; + canvas.style.left = 0 + "px"; + canvas.style.pointerEvents = "none"; + canvas.style.zIndex = this.options.zIndex || 600; + var global$2 = typeof window === 'undefined' ? {} : window; + var devicePixelRatio = this.devicePixelRatio = global$2.devicePixelRatio || 1; + + if (!this.mapVOptions.context || this.mapVOptions.context === '2d') { + canvas.getContext('2d').scale(devicePixelRatio, devicePixelRatio); + } + + return canvas; + }, + _resize: function _resize() { + var canvas = this.canvas; + + if (!canvas) { + return; + } + + var map = this._map; + var size = map.getSize(); + canvas.width = size.x; + canvas.height = size.y; + canvas.style.width = size.x + 'px'; + canvas.style.height = size.y + 'px'; + var bounds = map.getBounds(); + var topLeft = map.latLngToLayerPoint(bounds.getNorthWest()); + external_L_default().DomUtil.setPosition(canvas, topLeft); + }, + _reset: function _reset() { + this._resize(); + + this._render(); + }, + redraw: function redraw() { + this._resize(); + + this._render(); + }, + _render: function _render() { + this.render(); + } +}); +var mapVLayer = function mapVLayer(dataSet, mapVOptions, options) { + return new MapVLayer(dataSet, mapVOptions, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/dataflow/MapvRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * + * @class MapvRenderer + * @classdesc 数据流图层 MapV 渲染器。 + * @category iServer DataFlow + * @extends {MapVLayer} + * @param {string} url - 服务地址 + * @param {Object} options - 参数。 + * @param {Object} [options.geometry] - GeoJSON 几何对象。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @usage + */ + +var MapvRenderer = MapVLayer.extend({ + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this.data = []; + this.mapVOptions = { + draw: 'simple' + }; + MapVLayer.prototype.initialize.call(this, new window.mapv.DataSet([]), this.mapVOptions, options); + this.idCache = {}; + this.url = url; + this._last = new Date(); + this._imageCache = {}; + }, + onMessageSuccessed: function onMessageSuccessed(msg) { + var _this = this; + + var geoID = msg.featureResult.properties['id']; + var geometry = msg.featureResult.geometry; //设置每个点的经纬度和图片的样式 + + var item = { + geometry: msg.featureResult.geometry + }; + + if (geometry.type === 'Point' && this.options.pointToLayer) { + //const pointStyle = this.options.pointToLayer ? this.options.pointToLayer(msg.featureResult, L.latLng(geometry.coordinates[1],geometry.coordinates[0])) : new L.marker(L.latLng(geometry.coordinates[1],geometry.coordinates[0])); + var pointStyle = this.options.pointToLayer(msg.featureResult, external_L_default().latLng(geometry.coordinates[1], geometry.coordinates[0])); + + if (pointStyle instanceof (external_L_default()).Marker) { + this.mapVOptions.draw = 'icon'; + var icon = pointStyle.options.icon; + + var imgUrl = icon._getIconUrl('icon'); + + var imgWidth = icon.options.iconSize ? icon.options.iconSize[0] : null; + var imgHeight = icon.options.iconSize ? icon.options.iconSize[1] : null; + var iconKey = "".concat(imgUrl, "_").concat(imgWidth, "_").concat(imgHeight); + var img = this._imageCache[iconKey]; + + if (!img) { + img = icon.createIcon(); + this._imageCache[iconKey] = img; + + img.onload = function () { + _this.update({ + data: _this.data, + options: _this.mapVOptions + }); + }; + } + + item.icon = img; + + if (icon.options.iconSize || img.style.height) { + this.mapVOptions.offset = { + x: 0, + y: -(icon.options.iconSize[1] || img.style.height) / 2 + }; + } + + if (this.options.deg) { + item.deg = this.options.deg; + + if (typeof item.deg === 'function') { + if (this.idCache[geoID] && this.data[this.idCache[geoID]]) { + item.deg = item.deg(msg.featureResult, external_L_default().latLng(geometry.coordinates[1], geometry.coordinates[0]), this.data[this.idCache[geoID]]); + } + } + } + } + + if (pointStyle instanceof (external_L_default()).CircleMarker) { + this.mapVOptions.draw = 'simple'; + + var sty = this._toMapvStyle(pointStyle); + + for (var key in sty) { + if (sty.hasOwnProperty(key)) { + item[key] = sty[key]; + } + } + } + } else if (this.options.style) { + var _sty = this._toMapvStyle(this.options.style(msg.featureResult)); + + for (var _key in _sty) { + if (_sty.hasOwnProperty(_key)) { + item[_key] = _sty[_key]; + } + } + } + + if (this.idCache[geoID] == undefined) { + this.data.push(item); + this.idCache[geoID] = this.data.length - 1; + } else { + this.data[this.idCache[geoID]] = item; + } //绘制图层 + + + if (new Date() - this._last > 200) { + this._last = new Date(); + this.update({ + data: this.data, + options: this.mapVOptions + }); + } + }, + _toMapvStyle: function _toMapvStyle(options) { + var mapvOps = { + draw: 'simple' + }; + mapvOps.strokeStyle = options.color; + mapvOps.lineWidth = options.width; + mapvOps.globalAlpha = options.fillOpacity || options.opacity; + mapvOps.lineCap = options.lineCap; + mapvOps.lineJoin = options.lineJoin; + mapvOps.fillStyle = options.fillColor; + mapvOps.size = options.radius; + return mapvOps; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/dataflow/NormalRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class NormalRenderer + * @classdesc 数据流图层普通渲染器。 + * @category iServer DataFlow + * @extends {L.GeoJSON} + * @param {string} url - 服务地址 + * @param {Object} options - 参数。 + * @param {GeoJSONObject} [options.geometry] - GeoJSON 几何对象。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @usage + */ + +var NormalRenderer = external_L_default().GeoJSON.extend({ + initialize: function initialize(url, options) { + options = options || {}; + + if (options.style && !options.pointToLayer) { + options.pointToLayer = function (geojson, latlng) { + return external_L_default().circleMarker(latlng, options.style()); + }; + } + + external_L_default().Util.setOptions(this, options); + this._layers = {}; + external_L_default().stamp(this); + this.url = url; + this.idCache = {}; + }, + onMessageSuccessed: function onMessageSuccessed(msg) { + var geojson = msg.featureResult; + var geoID = msg.featureResult.properties[this.options.idField]; + var layer = null; + + if (geoID !== undefined && this.idCache[geoID]) { + layer = this.getLayer(this.idCache[geoID]); + + this._updateLayerData(layer, geojson); + } else { + layer = external_L_default().GeoJSON.geometryToLayer(geojson, this.options); + layer.feature = external_L_default().GeoJSON.asFeature(geojson); + this.addLayer(layer); + + if (geoID !== undefined) { + this.idCache[geoID] = this.getLayerId(layer); + } + } + + if (this.options.onEachFeature) { + this.options.onEachFeature(geojson, layer); + } + }, + _updateLayerData: function _updateLayerData(layer, geojson) { + if (geojson.properties) { + layer.feature.properties = geojson.properties; + } + + var latlngs = []; + + switch (geojson.geometry.type) { + case 'Point': + latlngs = external_L_default().GeoJSON.coordsToLatLng(geojson.geometry.coordinates); + layer.setLatLng(latlngs); + break; + + case 'LineString': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 0); + layer.setLatLngs(latlngs); + break; + + case 'MultiLineString': + case 'Polygon': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 1); + layer.setLatLngs(latlngs); + break; + + case 'MultiPolygon': + latlngs = external_L_default().GeoJSON.coordsToLatLngs(geojson.geometry.coordinates, 2); + layer.setLatLngs(latlngs); + break; + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/DataFlowLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DataFlowLayer + * @deprecatedclassinstance L.supermap.dataFlowLayer + * @classdesc 数据流图层源。订阅SuperMap iServer 数据流服务并上图。订阅得到的数据会根据 `options.idField` 自动更新。 + * @category iServer DataFlow + * @extends {L.LayerGroup} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {Object} [options.render='normal'] - 绘制方式。可选值为'normal','mapv'。 + 'normal' 表示以 {( {@link L.LatLng}|{@link L.Polyline}|{@link L.Polygon}|{@link L.Marker} )} 方式绘制数据流。'mapv' 表示以 {@link MapVLayer} 方式绘制实时数据。 + * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。 + * @param {Object} [options.prjCoordSys] - 投影坐标对象。 + * @param {string} [options.excludeField] - 排除字段。 + * @param {string} [options.idField='id'] - 要素属性中表示唯一标识的字段。 + * @param {function} [options.pointToLayer] - 定义点要素如何绘制在地图上。 + `function(geoJsonPoint, latlng) { + return L.marker(latlng); + }` + * @param {function} [options.style] - 定义点、线、面要素样式。参数为{@link L.Path-option}。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function|number} [options.deg] - 定义图标的旋转角度。`options.render` 为 `mapv` 时有效。
+ `function (feature,latlng) { + return feature.properties['rotate']; + }` + * @fires DataFlowLayer#subscribesucceeded + * @fires DataFlowLayer#subscribefailed + * @fires DataFlowLayer#setfilterparamsucceeded + * @fires DataFlowLayer#dataupdated + * @usage + */ + +var DataFlowLayer = external_L_default().LayerGroup.extend({ + options: { + geometry: null, + prjCoordSys: null, + excludeField: null, + idField: "id", + render: 'normal' + }, + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this.url = url; + this._layers = {}; + this.dataService = new DataFlowService_DataFlowService(this.url, { + geometry: this.options.geometry, + prjCoordSys: this.options.prjCoordSys, + excludeField: this.options.excludeField + }); + }, + + /** + * @private + * @function DataFlowLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + var _this = this; + + // eslint-disable-line no-unused-vars + this.dataService.initSubscribe(); + /** + * @event DataFlowLayer#subscribesucceeded + * @description 初始化成功后触发。 + * @property {Object} e - 事件对象。 + */ + + this.dataService.on('subscribeSocketConnected', function (e) { + return _this.fire("subscribesucceeded", e); + }); + /** + * @event DataFlowLayer#subscribefailed + * @description 初始化失败后触发。 + * @property {Object} e - 事件对象。 + */ + + this.dataService.on('subscribeSocketError', function (e) { + return _this.fire("subscribefailed", e); + }); + this.dataService.on('messageSucceeded', function (msg) { + return _this._onMessageSuccessed(msg); + }); + /** + * @event DataFlowLayer#setfilterparamsucceeded + * @description 过滤参数设置成功后触发。 + * @property {Object} e - 事件对象。 + */ + + this.dataService.on('setFilterParamSucceeded', function (msg) { + return _this.fire("setfilterparamsucceeded", msg); + }); + + if (this.options.render === 'mapv') { + this.addLayer(new MapvRenderer(this.url, this.options)); + } else { + this.addLayer(new NormalRenderer(this.url, this.options)); + } + + external_L_default().LayerGroup.prototype.onAdd.call(this, map); + }, + + /** + * @private + * @function DataFlowLayer.prototype.onRemove + * @description 删除指定地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onRemove: function onRemove(map) { + // eslint-disable-line no-unused-vars + external_L_default().LayerGroup.prototype.onRemove.call(this, map); + this.dataService && this.dataService.unSubscribe(); + }, + + /** + * @function DataFlowLayer.prototype.setExcludeField + * @description 设置唯一字段。 + * @param {string} excludeField - 唯一字段。 + */ + setExcludeField: function setExcludeField(excludeField) { + this.dataService.setExcludeField(excludeField); + this.options.excludeField = excludeField; + return this; + }, + + /** + * @function DataFlowLayer.prototype.setGeometry + * @description 设置集合要素。 + * @param {GeoJSONObject} geometry - 待设置的 GeoJSON 几何要素对象。 + */ + setGeometry: function setGeometry(geometry) { + this.dataService.setGeometry(geometry); + this.options.geometry = geometry; + return this; + }, + _onMessageSuccessed: function _onMessageSuccessed(msg) { + var _this2 = this; + + this.getLayers().map(function (layer) { + if (layer.onMessageSuccessed) { + layer.onMessageSuccessed(msg); + /** + * @description 图层数据更新成功后触发。 + * @event DataFlowLayer#dataupdated + * @property {Object} layer - 更新数据成功的图层。 + * @property {Object} data - 更新的要素。 + */ + + _this2.fire("dataupdated", { + layer: layer, + data: msg.featureResult + }); + } + + return layer; + }); + } +}); +var dataFlowLayer = function dataFlowLayer(url, options) { + return new DataFlowLayer(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/EChartsLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class EchartsLayer + * @deprecatedclassinstance L.supermap.echartsLayer + * @classdesc 百度 ECharts 图层类。 + * @category Visualization ECharts + * @extends {L.Layer} + * @param {Object} echartsOptions - 图表参数。 + * @param {Object} options - 参数。 + * @param {boolean} [options.loadWhileAnimating=false] - 是否在移动时实时绘制。 + * @param {string} [options.attribution='© 2018 百度 ECharts'] - 版权信息。 + * @usage + */ + +var EchartsLayer = external_L_default().Layer.extend({ + includes: [], + _echartsContainer: null, + _map: null, + _ec: null, + _echartsOptions: null, + options: { + attribution: core_Attributions.ECharts.attribution, + loadWhileAnimating: false + }, + initialize: function initialize(echartsOptions, options) { + external_L_default().Util.setOptions(this, options); + this.setOption(echartsOptions); + }, + + /** + * @function EchartsLayer.prototype.setOption + * @description 设置图表地图参数。 + * @param {Object} echartsOptions - 图表参数。 + * @param {string} lazyUpdate - 后台自动更新。 + * @param {boolean} [notMerge] - 是否合并参数。 + */ + setOption: function setOption(echartsOptions, notMerge, lazyUpdate) { + var baseOption = echartsOptions.baseOption || echartsOptions; + baseOption.LeafletMap = baseOption.LeafletMap || { + roam: true + }; + baseOption.animation = baseOption.animation === true; + this._echartsOptions = echartsOptions; + this._ec && this._ec.setOption(echartsOptions, notMerge, lazyUpdate); + }, + getEcharts: function getEcharts() { + return this._ec; + }, + _disableEchartsContainer: function _disableEchartsContainer() { + this._echartsContainer.style.visibility = "hidden"; + }, + _enableEchartsContainer: function _enableEchartsContainer() { + this._echartsContainer.style.visibility = "visible"; + }, + + /** + * @private + * @function EchartsLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + this._map = map; + + this._initEchartsContainer(); + + this._ec = external_function_try_return_echarts_catch_e_return_default().init(this._echartsContainer); + this._ec.leafletMap = map; + var me = this; + map.on("zoomstart", function () { + me._disableEchartsContainer(); + }); + !me.options.loadWhileAnimating && map.on("movestart", function () { + me._disableEchartsContainer(); + }); + external_function_try_return_echarts_catch_e_return_default().registerAction({ + type: 'LeafletMapLayout', + event: 'LeafletMapLayout', + update: 'updateLayout' + }, function (payload) {// eslint-disable-line no-unused-vars + }); + external_function_try_return_echarts_catch_e_return_default().registerCoordinateSystem('leaflet', LeafletMapCoordSys); + external_function_try_return_echarts_catch_e_return_default().extendComponentModel({ + type: 'LeafletMap', + getBMap: function getBMap() { + return this.__LeafletMap; + }, + defaultOption: { + roam: false + } + }); + external_function_try_return_echarts_catch_e_return_default().extendComponentView({ + type: 'LeafletMap', + render: function render(LeafletMapModel, ecModel, api) { + var rendering = true; + var leafletMap = ecModel.scheduler.ecInstance.leafletMap; + var viewportRoot = api.getZr().painter.getViewportRoot(); + var animated = leafletMap.options.zoomAnimation && (external_L_default()).Browser.any3d; + viewportRoot.className = ' leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide') + ' echarts-layer'; + var originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + viewportRoot.style[originProp] = '50% 50%'; + var coordSys = LeafletMapModel.coordinateSystem; + var ecLayers = api.getZr().painter.getLayers(); + + var moveHandler = function moveHandler() { + if (rendering) { + return; + } + + var offset = me._map.containerPointToLayerPoint([0, 0]); + + var mapOffset = [offset.x || 0, offset.y || 0]; + viewportRoot.style.left = mapOffset[0] + 'px'; + viewportRoot.style.top = mapOffset[1] + 'px'; + + if (!me.options.loadWhileAnimating) { + for (var item in ecLayers) { + if (!ecLayers.hasOwnProperty(item)) { + continue; + } + + ecLayers[item] && clearContext(ecLayers[item].ctx); + } + + me._enableEchartsContainer(); + } + + coordSys.setMapOffset(mapOffset); + LeafletMapModel.__mapOffset = mapOffset; + api.dispatchAction({ + type: 'LeafletMapLayout' + }); + }; + + function clearContext(context) { + context && context.clearRect && context.clearRect(0, 0, context.canvas.width, context.canvas.height); + } + + function zoomEndHandler() { + if (rendering) { + return; + } + + api.dispatchAction({ + type: 'LeafletMapLayout' + }); + + me._enableEchartsContainer(); + } + + if (me._oldMoveHandler) { + leafletMap.off(me.options.loadWhileAnimating ? 'move' : 'moveend', me._oldMoveHandler); + } + + if (me._oldZoomEndHandler) { + leafletMap.off('zoomend', me._oldZoomEndHandler); + } + + leafletMap.on(me.options.loadWhileAnimating ? 'move' : 'moveend', moveHandler); + leafletMap.on('zoomend', zoomEndHandler); + me._oldMoveHandler = moveHandler; + me._oldZoomEndHandler = zoomEndHandler; + rendering = false; + } + }); + + this._ec.setOption(this._echartsOptions); + }, + onRemove: function onRemove() { + // 销毁echarts实例 + this._ec.clear(); + + this._ec.dispose(); + + delete this._ec; + external_L_default().DomUtil.remove(this._echartsContainer); + + if (this._oldZoomEndHandler) { + this._map.off("zoomend", this._oldZoomEndHandler); + + this._oldZoomEndHandler = null; + } + + if (this._oldMoveHandler) { + this._map.off(this.options.loadWhileAnimating ? 'move' : 'moveend', this._oldMoveHandler); + + this._oldMoveHandler = null; + } + + if (this._resizeHandler) { + this._map.off('resize', this._resizeHandler); + + this._resizeHandler = null; + } + + delete this._map; + }, + _initEchartsContainer: function _initEchartsContainer() { + var size = this._map.getSize(); + + var _div = document.createElement('div'); + + _div.style.position = 'absolute'; + _div.style.height = size.y + 'px'; + _div.style.width = size.x + 'px'; + _div.style.zIndex = 10; + this._echartsContainer = _div; + this.getPane().appendChild(this._echartsContainer); + var me = this; + + function _resizeHandler(e) { + var size = e.newSize; + me._echartsContainer.style.width = size.x + 'px'; + me._echartsContainer.style.height = size.y + 'px'; + + me._ec.resize(); + } + + this._map.on('resize', _resizeHandler); + + this._resizeHandler = _resizeHandler; + } +}); +/** + * @class LeafletMapCoordSys + * @private + * @classdesc 地图坐标系统类。 + * @param {L.Map} leafletMap - Leaflet Map 对象。 + */ + +function LeafletMapCoordSys(leafletMap) { + this._LeafletMap = leafletMap; + this.dimensions = ['lng', 'lat']; + this._mapOffset = [0, 0]; +} +LeafletMapCoordSys.prototype.dimensions = ['lng', 'lat']; + +LeafletMapCoordSys.prototype.setMapOffset = function (mapOffset) { + this._mapOffset = mapOffset; +}; + +LeafletMapCoordSys.prototype.getBMap = function () { + return this._LeafletMap; +}; + +LeafletMapCoordSys.prototype.prepareCustoms = function () { + var zrUtil = (external_function_try_return_echarts_catch_e_return_default()).util; + var rect = this.getViewRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'leaflet', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: zrUtil.bind(this.dataToPoint, this), + size: zrUtil.bind(dataToCoordSize, this) + } + }; + + function dataToCoordSize(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return zrUtil.map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } +}; + +LeafletMapCoordSys.prototype.dataToPoint = function (data) { + //处理数据中的null值 + if (data[1] === null) { + data[1] = (external_L_default()).CRS.EPSG3857.projection.MAX_LATITUDE; + } //平面坐标系不能这么处理 + //data[1] = this.fixLat(data[1]); + + + var px = this._LeafletMap.latLngToLayerPoint([data[1], data[0]]); + + var mapOffset = this._mapOffset; + return [px.x - mapOffset[0], px.y - mapOffset[1]]; +}; + +LeafletMapCoordSys.prototype.fixLat = function (lat) { + if (lat >= 90) { + return 89.99999999999999; + } + + if (lat <= -90) { + return -89.99999999999999; + } + + return lat; +}; + +LeafletMapCoordSys.prototype.pointToData = function (pt) { + var mapOffset = this._mapOffset; + + var point = this._LeafletMap.layerPointToLatLng([pt[0] + mapOffset[0], pt[1] + mapOffset[1]]); + + return [point.lng, point.lat]; +}; + +LeafletMapCoordSys.prototype.getViewRect = function () { + var size = this._LeafletMap.getSize(); + + return new (external_function_try_return_echarts_catch_e_return_default()).graphic.BoundingRect(0, 0, size.x, size.y); +}; + +LeafletMapCoordSys.prototype.getRoamTransform = function () { + return external_function_try_return_echarts_catch_e_return_default().matrix.create(); +}; + +LeafletMapCoordSys.dimensions = LeafletMapCoordSys.prototype.dimensions; + +LeafletMapCoordSys.create = function (ecModel) { + var coordSys; + var leafletMap = ecModel.scheduler.ecInstance.leafletMap; + ecModel.eachComponent('LeafletMap', function (leafletMapModel) { + if (!coordSys) { + coordSys = new LeafletMapCoordSys(leafletMap); + } + + leafletMapModel.coordinateSystem = coordSys; + leafletMapModel.coordinateSystem.setMapOffset(leafletMapModel.__mapOffset || [0, 0]); + }); + ecModel.eachSeries(function (seriesModel) { + if (!seriesModel.get('coordinateSystem') || seriesModel.get('coordinateSystem') === 'leaflet') { + if (!coordSys) { + coordSys = new LeafletMapCoordSys(leafletMap); + } + + seriesModel.coordinateSystem = coordSys; + seriesModel.animation = seriesModel.animation === true; + } + }); +}; + +var echartsLayer = function echartsLayer(echartsOptions, options) { + return new EchartsLayer(echartsOptions, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/core/Detector.js +function Detector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Detector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Detector_createClass(Constructor, protoProps, staticProps) { if (protoProps) Detector_defineProperties(Constructor.prototype, protoProps); if (staticProps) Detector_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var Detector = /*#__PURE__*/function () { + function Detector() { + Detector_classCallCheck(this, Detector); + } + + Detector_createClass(Detector, null, [{ + key: "supportWebGL", + value: function supportWebGL() { + return getContext('webgl'); + } + }, { + key: "supportWebGL2", + value: function supportWebGL2() { + return getContext('webgl2'); + } + }, { + key: "supportCanvas", + value: function supportCanvas() { + return getContext('2d'); + } + }]); + + return Detector; +}(); + +function getContext(context) { + var canvas = document.createElement('canvas'); + return canvas && canvas.getContext(context); +} +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CloverStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CloverStyle + * @deprecatedclassinstance L.supermap.cloverStyle + * @classdesc 三叶草要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {number} [options.angle=60] - 三叶草每个扇叶的圆心角,单位弧度。 + * @param {number} [options.spaceAngle=0] - 扇叶间隔角度,通过计算获取。 + * @param {number} [options.count=3] - 扇叶数量。 + * @param {boolean} [options.stroke=true] - 是否描边。 + * @param {number} [options.strokeWidth=1] - 边框宽度。 + * @param {string} [options.color='#3388ff'] - 颜色。 + * @param {number} [options.weight=1] - 线宽。 + * @param {number} [options.opacity=1] - 透明度。 + * @param {string} [options.lineCap='round'] - 线帽形状。 + * @param {string} [options.lineJoin='round'] - 线条交汇边角形状。 + * @param {boolean} [options.fill=false] - 是否填充。 + * @param {string} [options.fillColor='#66ccff'] - 填充色。 + * @param {number} [options.fillOpacity=0.2] - 填充透明度。 + * @param {string} [options.fillRule='evenodd'] - 填充形状。 + * @param {number} [options.radius=10] - 半径。 + * @usage + */ + +var CloverStyle = external_L_default().Class.extend({ + options: { + radius: 10, + angele: 60, + spaceAngle: 0, + count: 3, + fill: false, + stroke: true, + color: '#3388ff', + weight: 1, + lineCap: 'round', + lineJoin: 'round', + fillColor: '#66ccff', + fillOpacity: 0.2, + fillRule: 'evenodd', + opacity: 1, + strokeWidth: 1 + }, + initialize: function initialize(options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + var strokeWidth = this.options.strokeWidth === undefined ? 1 : this.options.strokeWidth; + this.options.width = 2 * (this.options.radius + strokeWidth) + 1; + + this._initStyle(); + }, + + /** + * @function CloverStyle.prototype.getStyle + * @description 获取画布。 + */ + getStyle: function getStyle() { + return this._canvas; + }, + + /** + * @function CloverStyle.prototype.drawSector + * @description 绘制扇形。 + * @param {CanvasRenderingContext2D} ctx - context 对象。 + * @param {number} x - 中心点 x。 + * @param {number} y - 中心点 y。 + * @param {number} r - 中心点 r。 + * @param {number} sAngle - 扇叶起始角度。 + * @param {number} eAngle - 扇叶终止角度。 + */ + drawSector: function drawSector(ctx, x, y, r, sAngle, eAngle) { + //角度转换 + sAngle = sAngle / 180 * Math.PI; + eAngle = eAngle / 180 * Math.PI; + ctx.moveTo(x, y); + ctx.lineTo(x + r * Math.cos(sAngle), y + r * Math.sin(sAngle)); + ctx.arc(x, y, r, sAngle, eAngle); + ctx.lineTo(x, y); + }, + _initStyle: function _initStyle() { + //起始角度 + var sAngle = 0; + var options = this.options; + var eAngle = options.angle; + options.spaceAngle = 360 / options.count - options.angle; + + if (options.spaceAngle < 0) { + return; + } + + this._ctx.beginPath(); + + this.anchor = [options.width / 2, options.width / 2]; + + for (var i = 0; i < options.count; i++) { + this.drawSector(this._ctx, this.anchor[0], this.anchor[1], options.radius, sAngle, eAngle); + sAngle = eAngle + options.spaceAngle; + eAngle = sAngle + options.angle; + } + + this._fillStroke(); + }, + _fillStroke: function _fillStroke() { + var options = this.options; + + if (options.fill) { + this._ctx.globalAlpha = options.fillOpacity; + this._ctx.fillStyle = options.fillColor || options.color; + + this._ctx.fill(options.fillRule || 'evenodd'); + } + + if (options.stroke && options.weight !== 0) { + this._ctx.globalAlpha = options.opacity; + this._ctx.lineWidth = options.weight; + this._ctx.strokeStyle = options.color; + this._ctx.lineCap = options.lineCap; + this._ctx.lineJoin = options.lineJoin; + + this._ctx.stroke(); + } + } +}); +var cloverStyle = function cloverStyle(options) { + return new CloverStyle(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CircleStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class CircleStyle + * @deprecatedclassinstance L.supermap.circleStyle + * @classdesc 圆形要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {boolean} [options.stroke=true] - 是否描边。 + * @param {string} [options.color='#3388ff'] - 颜色。 + * @param {number} [options.weight=1] - 线宽。 + * @param {number} [options.opacity=1] - 透明度。 + * @param {string} [options.lineCap='round'] - 线帽形状。 + * @param {string} [options.lineJoin='round'] - 线条交汇边角形状。 + * @param {boolean} [options.fill=false] - 是否填充。 + * @param {string} [options.fillColor] - 填充色。 + * @param {number} [options.fillOpacity=0.2] - 填充透明度。 + * @param {string} [options.fillRule='evenodd'] - 填充形状。 + * @param {number} [options.radius=3] - 半径。 + * @usage + */ + +var CircleStyle = external_L_default().Class.extend({ + options: { + stroke: true, + color: '#3388ff', + weight: 1, + opacity: 1, + lineCap: 'round', + lineJoin: 'round', + fill: false, + fillColor: null, + fillOpacity: 0.2, + fillRule: 'evenodd', + radius: 3 + }, + initialize: function initialize(options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + + this._initStyle(); + }, + + /** + * @deprecated + * @function CircleStyle.prototype.getCanvas + * @description 获取画布,已弃用该设置,请使用 getStyle 接口。 + */ + getCanvas: function getCanvas() { + return this._canvas; + }, + + /** + * @function CircleStyle.prototype.getStyle + * @description 获取画布。 + */ + getStyle: function getStyle() { + return this._canvas; + }, + _initStyle: function _initStyle() { + this._ctx.beginPath(); + + this._ctx.arc(this._canvas.width / 2, this._canvas.height / 2, this.options.radius, 0, Math.PI * 2); + + this._fillStroke(); + }, + _fillStroke: function _fillStroke() { + var options = this.options; + + if (options.fill) { + this._ctx.globalAlpha = options.fillOpacity; + this._ctx.fillStyle = options.fillColor || options.color; + + this._ctx.fill(options.fillRule || 'evenodd'); + } + + if (options.stroke && options.weight !== 0) { + this._ctx.globalAlpha = options.opacity; + this._ctx.lineWidth = options.weight; + this._ctx.strokeStyle = options.color; + this._ctx.lineCap = options.lineCap; + this._ctx.lineJoin = options.lineJoin; + + this._ctx.stroke(); + } + } +}); +var circleStyle = function circleStyle(options) { + return new CircleStyle(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/ImageStyle.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ImageStyle + * @deprecatedclassinstance L.supermap.imageStyle + * @classdesc 自定义图形要素风格。 + * @category Visualization Graphic + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {HTMLImageElement} options.img - image 对象。 + * @param {Array.} [options.origin=[0.0]] - 中心点。 + * @param {Array} [options.anchor] - 偏移量。 + * @param {Array} [options.size] - 图形大小,即高度和宽度[width,height]。 + * @param {Array} [options.radius] - 半径。 + * @param {Array} [options.weight] - 宽度。 + * @usage + */ + +var ImageStyle = external_L_default().Class.extend({ + options: { + img: null, + origin: [0, 0], + anchor: null, + size: null + }, + initialize: function initialize(options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + this._canvas = document.createElement('canvas'); + this._canvas.width = 2 * (this.options.radius + this.options.weight); + this._canvas.height = 2 * (this.options.radius + this.options.weight); + this._ctx = this._canvas.getContext('2d'); + }, + + /** + * @function ImageStyle.prototype.getStyle + * @description 获取样式。 + */ + getStyle: function getStyle() { + return this.options; + } +}); +var imageStyle = function imageStyle(options) { + return new ImageStyle(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/CanvasRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +var emptyFunc = (external_L_default()).Util.falseFn; +var GraphicCanvasRenderer = external_L_default().Class.extend({ + initialize: function initialize(layer, options) { + this.layer = layer; + options = options || {}; + external_L_default().Util.setOptions(this, options); + }, + + /** + * @private + * @function GraphicCanvasRenderer.prototype.getRenderer + * @description 返回渲染器,提供图层后续的数据增删改。 + * @returns {L.Canvas} + */ + getRenderer: function getRenderer() { + return this.options.renderer; + }, + + /** + * @private + * @function GraphicCanvasRenderer.prototype.update + * @description 更新图层,数据或者样式改变后调用。 + */ + update: function update() { + this.getRenderer()._clear(); + + this.getRenderer()._draw(); + }, + _getGraphicAtPoint: function _getGraphicAtPoint(p) { + var layer = this.layer; + var map = layer._map; + + var graphics = layer._getGraphicsInBounds(); + + for (var i = graphics.length - 1; i >= 0; i--) { + var p1 = void 0, + p2 = void 0, + bounds = void 0; + var center = map.latLngToLayerPoint(graphics[i].getLatLng()); + var style = graphics[i].getStyle(); + + if (!style && this.defaultStyle) { + style = this.defaultStyle; + } + + if (style.img) { + var imgWidth = style.img.width; + var imgHeight = style.img.height; + + if (style.size && style.size[0] && style.size[1]) { + imgWidth = style.size[0]; + imgHeight = style.size[1]; + } + + var anchor = style.anchor || [imgWidth / 2, imgHeight / 2]; + p1 = external_L_default().point(center.x - anchor[0], center.y - anchor[1]); + p2 = external_L_default().point(p1.x + imgWidth, p1.y + imgHeight); + } else { + p1 = external_L_default().point(center.x - style.width / 2, center.y - style.height / 2); + p2 = external_L_default().point(center.x + style.width / 2, center.y + style.height / 2); + } + + bounds = external_L_default().bounds(p1, p2); + + if (bounds.contains(p)) { + return graphics[i]; + } + } + + return null; + }, + containsPoint: function containsPoint(p) { + return !!this._getGraphicAtPoint(p); + }, + _handleClick: function _handleClick(evt) { + evt.target = null; + var layer = this.layer; + var map = layer._map; + + var graphic = this._getGraphicAtPoint(map.latLngToLayerPoint(evt.latlng)); + + if (graphic) { + this.layer._renderer._ctx.canvas.style.cursor = 'pointer'; + evt.target = graphic; + + if (evt.type === 'click' && layer.options.onClick) { + layer.options.onClick.call(layer, graphic, evt); + } + + return; + } + + this.layer._renderer._ctx.canvas.style.cursor = 'auto'; + }, + //跟GraphicWebGLRenderer保持一致 + _clearBuffer: emptyFunc +}); +external_L_default().Canvas.include({ + drawGraphics: function drawGraphics(graphics, defaultStyle) { + var me = this; + + if (!me._drawing) { + return; + } //this._ctx.clearRect(0, 0, this._ctx.canvas.width, me._ctx.canvas.height); + + + graphics.forEach(function (graphic) { + var style = graphic.getStyle(); + + if (!style && defaultStyle) { + style = defaultStyle; + } + + if (style.img) { + //绘制图片 + me._drawImage.call(me, me._ctx, style, graphic.getLatLng()); + } else { + //绘制canvas + me._drawCanvas.call(me, me._ctx, style, graphic.getLatLng()); + } + }); + }, + _drawCanvas: function _drawCanvas(ctx, style, latLng) { + var canvas = style; + + var pt = this._map.latLngToLayerPoint(latLng); + + var p0 = pt.x - canvas.width / 2; + var p1 = pt.y - canvas.height / 2; + var width = canvas.width; + var height = canvas.height; + ctx.drawImage(canvas, p0, p1, width, height); + }, + _drawImage: function _drawImage(ctx, style, latLng) { + //设置图片的大小 + var width, height; + + if (style.size) { + var size = style.size; + width = size[0]; + height = size[1]; + } else { + width = style.img.width; + height = style.img.height; + } //设置偏移 + + + var point = this._coordinateToPoint(latLng); + + var pt = external_L_default().point(point), + ac = external_L_default().point(style.anchor || [width / 2, height / 2]); + point = [pt.x - ac.x, pt.y - ac.y]; //参数分别为:图片,图片裁剪下x,y位置,裁剪长宽,放置在画布的位置x,y, 占取画布长宽 + //ctx.drawImage(style.img, 0, 0, width, height, point[0], point[1], width, height); + + ctx.drawImage(style.img, point[0], point[1], width, height); + }, + _coordinateToPoint: function _coordinateToPoint(coordinate) { + if (!this._map) { + return coordinate; + } + + var latLng = coordinate; + + if (external_L_default().Util.isArray(coordinate)) { + latLng = external_L_default().latLng(coordinate[0], coordinate[1]); + } else if (coordinate instanceof (external_L_default()).LatLng) { + latLng = external_L_default().latLng(coordinate.lat, coordinate.lng); + } + + var point = this._map.latLngToLayerPoint(latLng); + + return [point.x, point.y]; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/WebGLRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +var WebGLRenderer_emptyFunc = (external_L_default()).Util.falseFn; +/** + * @private + * @class GraphicWebGLRenderer + * @classdesc 高效率点图层 webgl 渲染器。 + * @category Visualization Graphic + * @extends {L.Layer} + * @param {Array.} layer - 高效率点图层。 + * @param {Object} options - 参数。 + * @param {number} options.width - 地图宽度。 + * @param {number} options.height - 地图高度。 + * @param {HTMLElement} options.container - 放置渲染器的父元素。 + * @param {Array.} [options.color=[0, 0, 0, 255]] - 颜色,目前只支持 rgba 数组。 + * @param {number} [options.radius=10] - 半径。 + * @param {number} [options.opacity=0.8] - 不透明度。 + * @param {Array} [options.highlightColor] - 高亮颜色,目前只支持 rgba 数组。 + * @param {number} [options.radiusScale=1] - 点放大倍数。 + * @param {number} [options.radiusMinPixels=0] - 半径最小值,单位为像素。 + * @param {number} [options.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - 半径最大值,单位为像素。 + * @param {number} [options.strokeWidth=1] - 边框大小。 + * @param {boolean} [options.outline=false] - 是否显示边框。 + * @param {function} [options.onClick] - 点击事件。 + * @param {function} [options.onHover] - 悬停事件。 + + */ + +var CSS_TRANSFORM = function () { + var div = document.createElement('div'); + var props = ['transform', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform']; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + if (div.style[prop] !== undefined) { + return prop; + } + } + + return props[0]; +}(); + +var GraphicWebGLRenderer = external_L_default().Class.extend({ + initialize: function initialize(layer, options) { + this.layer = layer; + var opt = options || {}; + external_L_default().Util.setOptions(this, opt); + this.options.radius = this._pixelToMeter(this.options.radius); + + this._initContainer(); + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.getRenderer + * @description 返回渲染器,可对图层数据增加、删除和修改。 + * @returns {GraphicWebGLRenderer} + */ + getRenderer: function getRenderer() { + return this; + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.update + * @description 更新图层。 + */ + update: function update(graphics) { + if (graphics && graphics.length > -1) { + this._data = graphics; + } + + this._renderLayer.setChangeFlags({ + dataChanged: true, + propsChanged: true, + viewportChanged: true, + updateTriggersChanged: true + }); + + this._refreshData(); + + var state = this._getLayerState(); + + state.data = this._data || []; + this._layerDefaultStyleCache = null; + + this._renderLayer.setNeedsRedraw(true); + + this._renderLayer.setState(state); + }, + + /** + * @private + * @function GraphicWebGLRenderer.prototype.drawGraphics + * @description 绘制点要素。 + */ + drawGraphics: function drawGraphics(graphics) { + this._clearBuffer(); + + var size = this.layer._map.getSize(); + + if (this._container.width !== size.x) { + this._container.width = size.x; + } + + if (this._container.height !== size.y) { + this._container.height = size.y; + } + + var mapPane = this.layer._map.getPanes().mapPane; + + var point = mapPane._leaflet_pos; + this._container.style[CSS_TRANSFORM] = 'translate(' + -Math.round(point.x) + 'px,' + -Math.round(point.y) + 'px)'; + this._data = graphics || []; + + if (!this._renderLayer) { + this._createInnerRender(); + } + + this._draw(); + }, + _initContainer: function _initContainer() { + this._container = this._createCanvas(this.options.width, this.options.height); + this._layerContainer = this.options.container; + this._wrapper = external_L_default().DomUtil.create('div', "deck-wrapper", this._layerContainer); + + this._wrapper.appendChild(this._container); + }, + _createCanvas: function _createCanvas(width, height) { + //leaflet-layer 对应的css会自动设置position + var canvas = external_L_default().DomUtil.create('canvas', 'graphicLayer leaflet-layer leaflet-zoom-hide'); + canvas.oncontextmenu = (external_L_default()).Util.falseFn; + canvas.width = width; + canvas.height = height; + canvas.style.width = width + "px"; + canvas.style.height = height + "px"; + return canvas; + }, + _pixelToMeter: function _pixelToMeter(pixel) { + var bounds = this.layer._map.getBounds(); + + var latlngRes = (bounds.getEast() - bounds.getWest()) / this.layer._map.getSize().x; + + var meterRes = latlngRes * (Math.PI * 6378137 / 180); + return pixel * meterRes; + }, + _createInnerRender: function _createInnerRender() { + var me = this; + + var state = this._getLayerState(); + + var color = state.color, + radius = state.radius, + opacity = state.opacity, + highlightColor = state.highlightColor, + radiusScale = state.radiusScale, + radiusMinPixels = state.radiusMinPixels, + radiusMaxPixels = state.radiusMaxPixels, + strokeWidth = state.strokeWidth, + outline = state.outline; + var innerLayerOptions = { + id: 'scatter-plot', + data: me._data, + pickable: Boolean(this.options.onClick) || Boolean(this.options.onHover), + autoHighlight: true, + color: color, + opacity: opacity, + radius: radius, + radiusScale: radiusScale, + highlightColor: highlightColor, + radiusMinPixels: radiusMinPixels, + radiusMaxPixels: radiusMaxPixels, + strokeWidth: strokeWidth, + coordinateSystem: this._isWGS84() ? window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS : window.DeckGL.COORDINATE_SYSTEM.LNGLAT, + isGeographicCoordinateSystem: this._isWGS84(), + outline: outline, + getPosition: function getPosition(point) { + if (!point) { + return [0, 0, 0]; + } + + var lngLat = point.getLatLng(); + return lngLat && [lngLat.lng, lngLat.lat, 0]; + }, + getColor: function getColor(point) { + var defaultStyle = me._getLayerDefaultStyle(); + + var style = point && point.options; + return style && style.color || defaultStyle.color; + }, + getRadius: function getRadius(point) { + var defaultStyle = me._getLayerDefaultStyle(); + + var style = point && point.getStyle(); + return style && style.radius || defaultStyle.radius; + }, + updateTriggers: { + getColor: [color], + getRadius: [radius] + } + }; + + var _self = this; + + if (this.options.onClick) { + innerLayerOptions.onClick = function () { + _self._container.style.cursor = "pointer"; + + _self.options.onClick.apply(_self, arguments); + }; + } + + if (this.options.onHover) { + innerLayerOptions.onHover = function () { + _self._container.style.cursor = "pointer"; + + _self.options.onHover.apply(_self, arguments); + }; + } + + me._renderLayer = new window.DeckGL.ScatterplotLayer(innerLayerOptions); + }, + _getLayerDefaultStyle: function _getLayerDefaultStyle() { + if (this._layerDefaultStyleCache) { + return this._layerDefaultStyleCache; + } + + var _this$layer$options = this.layer.options, + color = _this$layer$options.color, + opacity = _this$layer$options.opacity, + radius = _this$layer$options.radius, + radiusScale = _this$layer$options.radiusScale, + radiusMinPixels = _this$layer$options.radiusMinPixels, + radiusMaxPixels = _this$layer$options.radiusMaxPixels, + strokeWidth = _this$layer$options.strokeWidth, + outline = _this$layer$options.outline; + radius = this._pixelToMeter(radius); + this._layerDefaultStyleCache = { + color: color, + opacity: opacity, + radius: radius, + radiusScale: radiusScale, + radiusMinPixels: radiusMinPixels, + radiusMaxPixels: radiusMaxPixels, + strokeWidth: strokeWidth, + outline: outline + }; + return this._layerDefaultStyleCache; + }, + _getLayerState: function _getLayerState() { + var state = this.layer.getState(); + state.zoom = state.zoom - 1; + return state; + }, + _draw: function _draw() { + var state = this._getLayerState(); + + this._refreshData(); + + state.data = this._data || []; + var deckOptions = {}; + + for (var key in state) { + deckOptions[key] = state[key]; + } + + this._layerDefaultStyleCache = null; + + this._renderLayer.setNeedsRedraw(true); + + deckOptions.layers = [this._renderLayer]; + deckOptions.canvas = this._container; + deckOptions.onBeforeRender = this._onBeforeRender.bind(this); + deckOptions.onAfterRender = this._onAfterRender.bind(this); + deckOptions.coordinateSystem = this._isWGS84() ? window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS : window.DeckGL.COORDINATE_SYSTEM.LNGLAT; + deckOptions.isGeographicCoordinateSystem = this._isWGS84(); + + if (!this.deckGL) { + this.deckGL = new window.DeckGL.experimental.DeckGLJS(deckOptions); + } else { + this.deckGL.setProps(deckOptions); + } + }, + _clearBuffer: function _clearBuffer() { + if (this.deckGL) { + var lm = this.deckGL.layerManager; + lm && lm.context.gl.clear(lm.context.gl.COLOR_BUFFER_BIT); + } + + return this; + }, + _refreshData: function _refreshData() { + var graphics = this._data || []; + var sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); //this.layer.props.data不能被重新赋值,只能在原数组上进行操作 + + if (!this._renderLayer.props.data) { + this._renderLayer.props.data = []; + } + + this._renderLayer.props.data.length = 0; + + for (var i = 0; i < sGraphics.length; i++) { + this._renderLayer.props.data.push(sGraphics[i]); + } + + this._data = this._renderLayer.props.data; + }, + _handleClick: WebGLRenderer_emptyFunc, + //deck渲染开始前调用,可以重写 + _onBeforeRender: WebGLRenderer_emptyFunc, + //deck渲染结束后调用,可以重写 + _onAfterRender: WebGLRenderer_emptyFunc, + //以下为leaflet再带的renderer的方法,为了保持接口正常调用,故增加这几个方法 + _removePath: function _removePath() { + this._wrapper.parentElement.removeChild(this._wrapper); + + this._container = null; + this._wrapper = null; + return this; + }, + _initPath: WebGLRenderer_emptyFunc, + _addPath: WebGLRenderer_emptyFunc, + containsPoint: WebGLRenderer_emptyFunc, + _isWGS84: function _isWGS84() { + return this.layer._map.options.crs.code === "EPSG:4326"; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/graphic/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/GraphicLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +var Renderer = ['canvas', 'webgl']; +var defaultProps = { + color: [0, 0, 0, 255], + opacity: 0.8, + radius: 10, + radiusScale: 1, + radiusMinPixels: 0, + radiusMaxPixels: Number.MAX_SAFE_INTEGER, + strokeWidth: 1, + outline: false +}; +var BASE_RESOLUTIONS = { + 'EPSG:4326': 360.0 / 256, + 'EPSG:3857': 20037508.34279 * 2 / 256 +}; +var DEFAULT_ZOOM_OFFSET = { + 'EPSG:4326': 1, + 'EPSG:3857': 0 +}; +/** + * @class GraphicLayer + * @deprecatedclassinstance L.supermap.graphicLayer + * @classdesc 高效率点图层类。 + * @category Visualization Graphic + * @extends {L.Path} + * @param {Array.} graphics - 要素对象。 + * @param {Object} options - 参数。 + * @param {string} [options.render='canvas'] - 指定使用的渲染器。可选值:'webgl','canvas'( webgl 渲染目前只支持散点)。 + * @param {Array.} [options.color=[0, 0, 0, 255]] - 要素颜色。 + * @param {Array.} [options.highlightColor] - webgl 渲染时要素高亮颜色。 + * @param {number} [options.opacity=0.8] - 要素透明度,。当 {@link Graphic} 的 style 参数传入设置了 fillOpacity 或 opacity 的 {@link CircleStyle} 或 {@link CloverStyle},此参数无效。{@link Graphic} 的 style 传入 {@link ImageStyle} 后不支持此参数。 + * @param {number} [options.radius=10] - 要素半径,单位为像素。当 {@link Graphic} 的 style 参数传入了 radius,此参数无效。 + * @param {number} [options.radiusScale=1] - webgl 渲染时的要素放大倍数。 + * @param {number} [options.radiusMinPixels=0] - webgl 渲染时的要素半径最小值,单位为像素。 + * @param {number} [options.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - webgl 渲染时的要素半径最大值,单位为像素。 + * @param {number} [options.strokeWidth=1] - 边框大小。当 {@link Graphic} 的 style 参数传入了 weight,此参数无效。 + * @param {boolean} [options.outline=false] - 是否显示边框。当 {@link Graphic} 的 style 参数传入设置了 stroke 的 {@link CircleStyle} 或 {@link CloverStyle},此参数无效。 + * @param {function} [options.onClick] - 图层鼠标点击响应事件(支持 webgl、canvas 渲染)。 + * @param {function} [options.onHover] - 图层鼠标悬停响应事件(只支持 webgl 渲染)。 + * @usage + */ + +var GraphicLayer = external_L_default().Path.extend({ + initialize: function initialize(graphics, options) { + this.graphics = [].concat(graphics); + var opt = options || {}; // 由于是canvas实现所以不能更改pane + + opt.pane = 'overlayPane'; + external_L_default().Util.setOptions(this, opt); //因为跟基类的renderer冲突,所以采用render这个名字 + + this.options.render = this.options.render || Renderer[0]; //浏览器支持webgl并且指定使用webgl渲染才使用webgl渲染 + + if (!Detector.supportWebGL2()) { + this.options.render = Renderer[0]; + } + + if (this.options.interactive) { + this.on('click mousemove dblclick mousedown mouseup mouseout contextmenu', this._handleClick, this); + } + }, + + /** + * @private + * @function GraphicLayer.prototype.getEvents + * @description 获取事件。 + * @returns {Object} 返回该图层支持的事件对象。 + */ + getEvents: function getEvents() { + var events = { + resize: this._resize.bind(this), + moveend: this._moveEnd.bind(this) + }; + return events; + }, + + /** + * @private + * @function GraphicLayer.prototype.onAdd + * @description 添加图形。 + */ + onAdd: function onAdd(map) { + this._map = map; + this._crs = map.options.crs; + this.defaultStyle = this._getDefaultStyle(this.options); + this._renderer = this._createRenderer(); + this._container = this._renderer._container; // this.addInteractiveTarget(this._container); + + external_L_default().Path.prototype.onAdd.call(this); + }, + + /** + * @private + * @override + * @function GraphicLayer.prototype.onRemove + * @description 移除图层。 + */ + onRemove: function onRemove() { + this.off('click mousemove dblclick mousedown mouseup contextmenu', this._handleClick, this); + + this._renderer._removePath(this); + }, + + /** + * @function GraphicLayer.prototype.setGraphics + * @description 设置绘制的点要素数据,会覆盖之前的所有要素。 + * @param {Array.} graphics - 点要素对象数组。 + */ + setGraphics: function setGraphics(graphics) { + this.graphics = this.graphics || []; + this.graphics.length = 0; + var sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); + this.graphics = [].concat(sGraphics); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.addGraphics + * @description 追加点要素,不会覆盖之前的要素。 + * @param {Array.} graphics - 点要素对象数组。 + */ + addGraphics: function addGraphics(graphics) { + this.graphics = this.graphics || []; + var sGraphics = !external_L_default().Util.isArray(graphics) ? [graphics] : [].concat(graphics); + this.graphics = this.graphics.concat(sGraphics); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.getGraphicBy + * @description 指定属性名和属性值,获取第一个匹配的要素数组。 + * @param {string} property - 属性名称。 + * @param {string} value - 属性值。 + * @returns {Graphic} 返回匹配的 graphic 。 + */ + getGraphicBy: function getGraphicBy(property, value) { + var graphic = null; + + for (var index in this.graphics) { + if (this.graphics[index][property] === value) { + graphic = this.graphics[index]; + break; + } + } + + return graphic; + }, + + /** + * @function GraphicLayer.prototype.getGraphicById + * @description 获取指定 id 的矢量要素。 + * @param {string} graphicId - 矢量要素的属性 id。 + * @returns {Graphic} 返回匹配的 graphic。 + */ + getGraphicById: function getGraphicById(graphicId) { + return this.getGraphicBy('id', graphicId); + }, + + /** + * @function GraphicLayer.prototype.getGraphicsByAttribute + * @description 指定属性名和属性值,获取所有匹配的要素数组。 + * @param {string} attrName - 属性名称。 + * @param {string} attrValue - 属性值。 + * @returns {Array.} 返回匹配的 graphic 数组。 + */ + getGraphicsByAttribute: function getGraphicsByAttribute(attrName, attrValue) { + var graphic, + foundgraphics = []; + + for (var index in this.graphics) { + graphic = this.graphics[index]; + + if (graphic && graphic.attributes) { + if (graphic.attributes[attrName] === attrValue) { + foundgraphics.push(graphic); + } + } + } + + return foundgraphics; + }, + + /** + * @function GraphicLayer.prototype.removeGraphics + * @description 删除要素数组,默认删除所有要素。 + * @param {Array.} [graphics=null] - 删除的 graphics 数组。 + */ + removeGraphics: function removeGraphics() { + var graphics = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + //当 graphics 为 null 、为空数组,或 === this.graphics,则清除所有要素 + if (!graphics || graphics.length === 0 || graphics === this.graphics) { + this.graphics.length = 0; + this.update(); + return; + } + + if (!Util.isArray(graphics)) { + graphics = [graphics]; + } + + for (var i = graphics.length - 1; i >= 0; i--) { + var graphic = graphics[i]; //如果我们传入的grapchic在graphics数组中没有的话,则不进行删除, + //并将其放入未删除的数组中。 + + var findex = Util.indexOf(this.graphics, graphic); + + if (findex === -1) { + continue; + } + + this.graphics.splice(findex, 1); + } //删除完成后重新设置 setGraphics,以更新 + + + this.update(); + }, + + /** + * @function GraphicLayer.prototype.setStyle + * @description 设置图层要素整体样式。 + * @param {Object} styleOptions - 样式对象。 + * @param {Array.} [styleOptions.color=[0, 0, 0, 255]] - 点颜色。 + * @param {number} [styleOptions.radius=10] - 点半径。 + * @param {number} [styleOptions.opacity=0.8] - 不透明度。 + * @param {Array} [styleOptions.highlightColor] - 高亮颜色,目前只支持 rgba 数组。 + * @param {number} [styleOptions.radiusScale=1] - 点放大倍数。 + * @param {number} [styleOptions.radiusMinPixels=0] - 半径最小值,单位为像素。 + * @param {number} [styleOptions.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - 半径最大值,单位为像素。 + * @param {number} [styleOptions.strokeWidth=1] - 边框大小。 + * @param {boolean} [styleOptions.outline=false] - 是否显示边框。 + */ + setStyle: function setStyle(styleOptions) { + var _opt = this.options; + var styleOpt = { + color: _opt.color, + radius: _opt.radius, + opacity: _opt.opacity, + highlightColor: _opt.highlightColor, + radiusScale: _opt.radiusScale, + radiusMinPixels: _opt.radiusMinPixels, + radiusMaxPixels: _opt.radiusMaxPixels, + strokeWidth: _opt.strokeWidth, + outline: _opt.outline + }; + this.options = external_L_default().Util.extend(this.options, styleOpt, styleOptions); + this.defaultStyle = this._getDefaultStyle(this.options); + this.update(); + }, + + /** + * @function GraphicLayer.prototype.update + * @description 更新图层,数据或者样式改变后调用。 + */ + update: function update() { + this._layerRenderer.update(this.graphics); + }, + + /** + * @function GraphicLayer.prototype.clear + * @description 释放图层资源。 + */ + clear: function clear() { + this.removeGraphics(); + }, + + /** + * @function GraphicLayer.prototype.getRenderer + * @description 获取渲染器。 + * @returns {Object} 内部渲染器。 + */ + getRenderer: function getRenderer() { + return this._renderer; + }, + + /** + * @function GraphicLayer.prototype.getState + * @description 获取当前地图和图层状态。 + * @returns {Object} 地图和图层状态,包含地图状态信息和本图层相关状态。 + */ + getState: function getState() { + var map = this._map; + var width = map.getSize().x; + var height = map.getSize().y; + var center = map.getCenter(); + var longitude = center.lng; + var latitude = center.lat; + var zoomOffset = DEFAULT_ZOOM_OFFSET[this._crs.code] || 0; + + if (BASE_RESOLUTIONS[this._crs.code] && this._crs.resolutions && this._crs.resolutions.length > 0) { + zoomOffset = Math.round(Math.log2(BASE_RESOLUTIONS[this._crs.code] / this._crs.resolutions[0])); + } + + var zoom = map.getZoom() + zoomOffset; + var maxZoom = map.getMaxZoom() + zoomOffset; + var mapViewport = { + longitude: longitude, + latitude: latitude, + zoom: zoom, + maxZoom: maxZoom, + pitch: 0, + bearing: 0 + }; + var state = {}; + + for (var key in mapViewport) { + state[key] = mapViewport[key]; + } + + state.width = width; + state.height = height; + var options = this.options; + state.color = options.color; + state.radius = options.radius; + state.opacity = options.opacity; + state.highlightColor = options.highlightColor; + state.radiusScale = options.radiusScale; + state.radiusMinPixels = options.radiusMinPixels; + state.radiusMaxPixels = options.radiusMaxPixels; + state.strokeWidth = options.strokeWidth; + state.outline = options.outline; + return state; + }, + _resize: function _resize() { + var size = this._map.getSize(); + + this._container.width = size.x; + this._container.height = size.y; + this._container.style.width = size.x + 'px'; + this._container.style.height = size.y + 'px'; + + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + + external_L_default().DomUtil.setPosition(this._container, mapOffset); + + this._update(); + }, + _moveEnd: function _moveEnd() { + if (this._layerRenderer instanceof GraphicWebGLRenderer) { + this._update(); + } + }, + //使用canvas渲染或webgl渲染 + _createRenderer: function _createRenderer() { + var map = this._map; + var width = map.getSize().x; + var height = map.getSize().y; + + var _renderer; + + if (this.options.render === Renderer[0]) { + _renderer = new GraphicCanvasRenderer(this, { + width: width, + height: height, + renderer: map.getRenderer(this) + }); + } else { + var optDefault = external_L_default().Util.setOptions({}, defaultProps); + var opt = external_L_default().Util.setOptions({ + options: optDefault + }, this.options); + opt = external_L_default().Util.setOptions(this, opt); + opt.container = map.getPane('overlayPane'); + opt.width = width; + opt.height = height; + _renderer = new GraphicWebGLRenderer(this, opt); + } + + _renderer.defaultStyle = this.defaultStyle; + this._layerRenderer = _renderer; + return this._layerRenderer.getRenderer(); + }, + + /** + * @private + * @override + */ + _update: function _update() { + if (this._map) { + this._updatePath(); + } + }, + + /** + * @private + * @override + */ + _updatePath: function _updatePath() { + var graphics = this._getGraphicsInBounds(); + + this._renderer.drawGraphics(graphics, this.defaultStyle); + }, + + /** + * @private + * @override + */ + _project: function _project() { + var me = this; + + me._getGraphicsInBounds().map(function (graphic) { + var point = me._map.latLngToLayerPoint(graphic.getLatLng()); + + var w = me._clickTolerance(); + + var p = [graphic._anchor + w, graphic._anchor + w]; + graphic._pxBounds = new (external_L_default()).Bounds(point.subtract(p), point.add(p)); + return graphic; + }); + + me._pxBounds = external_L_default().bounds(external_L_default().point(0, 0), external_L_default().point(this._container.width, this._container.height)); + }, + _getDefaultStyle: function _getDefaultStyle(options) { + var target = {}; + + if (options.color) { + target.fill = true; + var color = this.toRGBA(options.color); + target.color = color; + target.fillColor = color; + } + + if (options.opacity) { + target.opacity = options.opacity; + target.fillOpacity = options.opacity; + } + + if (options.radius) { + target.radius = options.radius; + } + + if (options.strokeWidth) { + target.weight = options.strokeWidth; + } + + if (options.outline) { + target.stroke = options.outline; + } + + return new CircleStyle(target).getStyle(); + }, + toRGBA: function toRGBA(colorArray) { + return "rgba(".concat(colorArray[0], ",").concat(colorArray[1], ",").concat(colorArray[2], ",").concat((colorArray[3] || 255) / 255, ")"); + }, + _getGraphicsInBounds: function _getGraphicsInBounds() { + var me = this; + var graphicsInBounds = []; + + var viewBounds = me._map.getBounds(); + + this.graphics.map(function (graphic) { + if (viewBounds.contains(graphic.getLatLng())) { + graphicsInBounds.push(graphic); + } + + return graphic; + }); + return graphicsInBounds; + }, + _handleClick: function _handleClick(evt) { + this._layerRenderer._handleClick(evt); + }, + + /** + * @private + * @override + */ + beforeAdd: (external_L_default()).Util.falseFn, + + /** + * @private + * @override + */ + _containsPoint: function _containsPoint(p) { + return this._layerRenderer.containsPoint(p); + } +}); +var graphicLayer = function graphicLayer(graphics, options) { + return new GraphicLayer(graphics, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/GraphThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class GraphThemeLayer + * @deprecatedclassinstance L.supermap.graphThemeLayer + * @category Visualization Theme + * @classdesc 统计专题图图层。统计专题图通过为每个要素绘制统计图表来反映其对应的专题值的大小。它可同时表示多个字段属性信息,在区域本身与各区域之间形成横向和纵向的对比。 + * 统计专题图多用于具有相关数量特征的地图上,比如表示不同地区多年的粮食产量、GDP、人口等,不同时段客运量、地铁流量等。 + * 目前提供的统计图类型有:柱状图(Bar),折线图(Line),饼图(Pie),三维柱状图(Bar3D),点状图(Point),环状图(Ring)。 + * @extends ThemeLayer + * @param {string} name - 专题图表名称。 + * @param {string} chartsType - 图表类型。目前可用:"Bar","Bar3D","Line","Point","Pie","Ring"。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {Object} [options.cache] - 缓存。 + * @param {Object} [options.charts] - 图表。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。专题要素事件临时存储。 + * @param {Object} options.chartsSetting - 各类型图表的 chartsSetting 对象可设属性请参考具体图表模型类的注释中对 chartsSetting 对象可设属性的描述。chartsSetting 对象通常都具有以下 5 个基础可设属性:
+ * @param {number} options.chartsSetting.width - 专题要素(图表)宽度。 + * @param {number} options.chartsSetting.height - 专题要素(图表)高度。 + * @param {Array.} options.chartsSetting.codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @param {number} [options.chartsSetting.XOffset] - 专题要素(图表)在 X 方向上的偏移值,单位为像素。 + * @param {number} [options.chartsSetting.YOffset] - 专题要素(图表)在 Y 方向上的偏移值,单位为像素。 + * @param {Array.} [options.chartsSetting.dataViewBoxParameter] - 数据视图框 dataViewBox 参数,它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值,长度为 4 的一维数组。 + * @param {number} [options.chartsSetting.decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage +*/ + +var GraphThemeLayer = ThemeLayer.extend({ + options: { + //是否进行压盖处理,如果设为 true,图表绘制过程中将隐藏对已在图层中绘制的图表产生压盖的图表,默认值:true。 + isOverLay: true + }, + initialize: function initialize(name, chartsType, options) { + var newArgs = []; + newArgs.push(name); + newArgs.push(options); + ThemeLayer.prototype.initialize.apply(this, newArgs); + this.chartsType = chartsType; + this.themeFields = options && options.themeFields ? options.themeFields : null; + this.charts = options && options.charts ? options.charts : []; + this.cache = options && options.cache ? options.cache : {}; + this.chartsSetting = options && options.chartsSetting ? options.chartsSetting : {}; + }, + + /** + * @function GraphThemeLayer.prototype.setChartsType + * @description 设置图表类型,此函数可动态改变图表类型。在调用此函数前请通过 chartsSetting 为新类型的图表做相关配置。图表类型,目前支持:"Bar", "Bar3D", "Line","Point","Pie","Ring"。 + * @param {string} chartsType - 图表类型。目前可用:"Bar", "Bar3D", "Line","Point","Pie","Ring"。 + */ + setChartsType: function setChartsType(chartsType) { + this.chartsType = chartsType; + this.redraw(); + }, + + /** + * @function GraphThemeLayer.prototype.addFeatures + * @description 向专题图图层中添加数据。 + * @param {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待添加的要素。 + */ + addFeatures: function addFeatures(features) { + var me = this; + /** + * @event GraphThemeLayer#beforefeaturesadded + * @description 向专题图图层中添加数据之前触发。 + * @property {(ServerFeature|ThemeFeature|GeoJSONObject)} features - 待添加的要素。 + */ + + me.fire("beforefeaturesadded", { + features: features + }); //转换 features 形式 + + this.features = this.toiClientFeature(features); //绘制专题要素 + + if (!me.renderer) { + return; + } + + if (me._map) { + me.redrawThematicFeatures(me._map.getBounds()); + } else { + me.redrawThematicFeatures(); + } + }, + + /** + * @function GraphThemeLayer.prototype.redrawThematicFeatures + * @description 重绘所有专题要素 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,压盖处理,缓存等步骤。地图漫游时调用此方法进行图层刷新。 + * @param {L.Bounds} bounds - 重绘的范围。 + */ + redrawThematicFeatures: function redrawThematicFeatures(bounds) { + var me = this; //清除当前所有可视元素 + + me.renderer.clearAll(); + var features = me.features; + + if (this.options.alwaysMapCRS && bounds && bounds instanceof (external_L_default()).LatLngBounds) { + var crs = this._map.options.crs; + bounds = external_L_default().bounds(crs.project(bounds.getSouthWest()), crs.project(bounds.getNorthEast())); + } + + bounds = CommontypesConversion.toSuperMapBounds(bounds); + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; // 要素范围判断 + + var feaBounds = feature.geometry.getBounds(); //剔除当前视图(地理)范围以外的数据 + + if (bounds && !bounds.intersectsBounds(feaBounds)) { + continue; + } + + var cache = me.cache; // 用feature id 做缓存标识 + + var cacheField = feature.id; // 数据对应的图表是否已缓存,没缓存则重新创建图表 + + if (!cache[cacheField]) { + cache[cacheField] = cacheField; + var chart = me.createThematicFeature(feature); // 压盖处理权重值 + + var isValidOverlayWeightField = me.overlayWeightField && feature.attributes[me.overlayWeightField] && !isNaN(feature.attributes[me.overlayWeightField]); + + if (chart && isValidOverlayWeightField) { + chart["__overlayWeight"] = feature.attributes[me.overlayWeightField]; + } + + if (chart) { + me.charts.push(chart); + } + } + } + + me.drawCharts(); + }, + + /** + * @function GraphThemeLayer.prototype.createThematicFeature + * @description 创建专题要素(图表)。 + * @param {Object} feature - 待创建的要素。 + */ + createThematicFeature: function createThematicFeature(feature) { + var me = this; + var thematicFeature; // 检查图表创建条件并创建图形 + + if (Theme_Theme[me.chartsType] && me.themeFields && me.chartsSetting) { + thematicFeature = new Theme_Theme[me.chartsType](feature, me, me.themeFields, me.chartsSetting); + } // thematicFeature 是否创建成功 + + + if (!thematicFeature) { + return false; + } // 对专题要素执行图形装载 + + + thematicFeature.assembleShapes(); + return thematicFeature; + }, + + /** + * @function GraphThemeLayer.prototype.drawCharts + * @description 绘制图表。包含压盖处理。 + */ + drawCharts: function drawCharts() { + var me = this; + + if (!me.renderer) { + return; + } // 图表权重值处理 + + + if (me.overlayWeightField) { + me._sortChart(); + } + + if (me.options && !me.options.isOverLay) { + // 不进行避让 + me._addOverlayShape(); + } else { + //进行避让 + me._addNoOverlayShape(); + } // 绘制图形 + + + me.renderer.render(); + }, + + /** + * @function GraphThemeLayer.prototype.getShapesByFeatureID + * @description 通过 FeatureID 获取 feature 关联的所有图形。如果不传入此参数,函数将返回所有图形。 + * @param {number} featureID - 要素 ID。 + */ + getShapesByFeatureID: function getShapesByFeatureID(featureID) { + var me = this, + list = []; + var shapeList = me.renderer.getAllShapes(); + + if (!featureID) { + return shapeList; + } + + for (var i = 0, len = shapeList.length; i < len; i++) { + var si = shapeList[i]; + + if (si.refDataID && featureID === si.refDataID) { + list.push(si); + } + } + + return list; + }, + + /** + * @function GraphThemeLayer.prototype.isQuadrilateralOverLap + * @description 判断两个四边形是否有压盖。 + * @param {Array.} quadrilateral - 四边形节点数组。 + * @example + * [{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]; + * @param {Array.} quadrilateral2 - 第二个四边形节点数组。 + */ + isQuadrilateralOverLap: function isQuadrilateralOverLap(quadrilateral, quadrilateral2) { + var me = this; + var quadLen = quadrilateral.length, + quad2Len = quadrilateral2.length; + + if (quadLen !== 5 || quad2Len !== 5) { + return null; + } //不是四边形 + + + var OverLap = false; //如果两四边形互不包含对方的节点,则两个四边形不相交 + + for (var i = 0; i < quadLen; i++) { + if (me.isPointInPoly(quadrilateral[i], quadrilateral2)) { + OverLap = true; + break; + } + } + + for (var _i = 0; _i < quad2Len; _i++) { + if (me.isPointInPoly(quadrilateral2[_i], quadrilateral)) { + OverLap = true; + break; + } + } //加上两矩形十字相交的情况 + + + for (var _i2 = 0; _i2 < quadLen - 1; _i2++) { + if (OverLap) { + break; + } + + for (var j = 0; j < quad2Len - 1; j++) { + var isLineIn = Util.lineIntersection(quadrilateral[_i2], quadrilateral[_i2 + 1], quadrilateral2[j], quadrilateral2[j + 1]); + + if (isLineIn.CLASS_NAME === "SuperMap.Geometry.Point") { + OverLap = true; + break; + } + } + } + + return OverLap; + }, + + /** + * @function GraphThemeLayer.prototype.isPointInPoly + * @description 判断一个点是否在多边形里面(射线法)。 + * @param {Object} pt - 需要判定的点对象,该对象含有属性 x(横坐标),属性 y(纵坐标)。 + * @param {Array.} poly - 多边形节点数组。 + * 例如一个四边形:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + isPointInPoly: function isPointInPoly(pt, poly) { + for (var isIn = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { + (poly[i].y <= pt.y && pt.y < poly[j].y || poly[j].y <= pt.y && pt.y < poly[i].y) && pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x && (isIn = !isIn); + } + + return isIn; + }, + + /** + * @function GraphThemeLayer.prototype.isChartInMap + * @description 判断图表是否在地图里。 + * @param {Bounds} mapPxBounds - 地图像素范围。 + * @param {Array.} chartPxBounds - 图表范围的四边形节点数组。 + * 例如:[{"x":1,"y":1},{"x":3,"y":1},{"x":6,"y":4},{"x":2,"y":10},{"x":1,"y":1}]。 + */ + isChartInMap: function isChartInMap(mapPxBounds, chartPxBounds) { + var mb = mapPxBounds; + var isIn = false; + + for (var i = 0, len = chartPxBounds.length; i < len; i++) { + var cb = chartPxBounds[i]; + + if (cb.x >= mb.left && cb.x <= mb.right && cb.y >= mb.top && cb.y <= mb.bottom) { + isIn = true; + break; + } + } + + return isIn; + }, + + /** + * @function GraphThemeLayer.prototype.clearCache + * @description 清除缓存数据。 + */ + clearCache: function clearCache() { + this.cache = {}; + this.charts = []; + }, + + /** + * @function GraphThemeLayer.prototype.removeFeatures + * @description 从专题图中删除 feature。这个函数删除所有传递进来的矢量要素(数据)。 + * @param {Array.} features - 待删除的要素。 + */ + removeFeatures: function removeFeatures(features) { + // eslint-disable-line no-unused-vars + var me = this; + me.clearCache(); + ThemeLayer.prototype.removeFeatures.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.removeAllFeatures + * @description 清除当前图层所有的矢量要素。 + */ + removeAllFeatures: function removeAllFeatures() { + var me = this; + me.clearCache(); + ThemeLayer.prototype.removeAllFeatures.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.redraw + * @description 重绘该图层,成功则返回 true,否则返回 false。 + */ + redraw: function redraw() { + var me = this; + me.clearCache(); + return ThemeLayer.prototype.redraw.apply(me, arguments); + }, + + /** + * @function GraphThemeLayer.prototype.clear + * @description 清除图层。清除的内容包括数据(features) 、专题要素、缓存。 + */ + clear: function clear() { + var me = this; + + if (me.renderer) { + me.renderer.clearAll(); + me.renderer.refresh(); + } + + me.removeAllFeatures(); + me.clearCache(); + }, + + /** + * @function GraphThemeLayer.prototype.getWeightFieldValue + * @description 获取权重字段的值。 + * @param {FeatureVector} feature - 矢量要素。 + * @param {Array.} weightField - 字段名数组。 + * @param {number} defaultValue - 当通过 weightField 获取不到权重值时,使用 defaultValue 作为权重值。 + */ + getWeightFieldValue: function getWeightFieldValue(feature, weightField, defaultValue) { + if (typeof defaultValue === "undefined" || isNaN(defaultValue)) { + defaultValue = 0; + } + + if (!feature.attributes) { + return defaultValue; + } + + var fieldValue = feature.attributes[weightField]; + + if (typeof fieldValue === "undefined" || isNaN(fieldValue)) { + fieldValue = defaultValue; + } + + return fieldValue; + }, + _sortChart: function _sortChart() { + var me = this; + + if (!me.charts) { + return; + } + + me.charts.sort(function (cs, ce) { + if (typeof cs["__overlayWeight"] === "undefined" && typeof ce["__overlayWeight"] === "undefined") { + return 0; + } else if (typeof cs["__overlayWeight"] !== "undefined" && typeof ce["__overlayWeight"] === "undefined") { + return -1; + } else if (typeof cs["__overlayWeight"] === "undefined" && typeof ce["__overlayWeight"] !== "undefined") { + return 1; + } else if (typeof cs["__overlayWeight"] !== "undefined" && typeof ce["__overlayWeight"] !== "undefined") { + return parseFloat(cs["__overlayWeight"]) < parseFloat(ce["__overlayWeight"]) ? 1 : -1; + } + + return 0; + }); + }, + _addOverlayShape: function _addOverlayShape() { + var me = this; + var charts = me.charts; + + for (var m = 0, len_m = charts.length; m < len_m; m++) { + var chart_m = charts[m]; // 图形参考位置 (reSetLocation 会更新 chartBounds) + + var shapeROP_m = chart_m.resetLocation(); // 添加图形 + + var shapes_m = chart_m.shapes; + + for (var n = 0, slen_n = shapes_m.length; n < slen_n; n++) { + shapes_m[n].refOriginalPosition = shapeROP_m; + me.renderer.addShape(shapes_m[n]); + } + } + }, + _addNoOverlayShape: function _addNoOverlayShape() { + var me = this; // 压盖判断所需 chartsBounds 集合 + + var mapBounds = me._map.getBounds(); + + var crs = this._map.options.crs; + + if (this.options.alwaysMapCRS) { + mapBounds = external_L_default().bounds(crs.project(mapBounds.getSouthWest()), crs.project(mapBounds.getNorthEast())); + } + + mapBounds = CommontypesConversion.toSuperMapBounds(mapBounds); + var charts = me.charts; + var chartsBounds = []; // 获取地图像素 bounds + + var mapPxLT = me.getLocalXY(new LonLat(mapBounds.left, mapBounds.top)); + var mapPxRB = me.getLocalXY(new LonLat(mapBounds.right, mapBounds.bottom)); + var mBounds = new Bounds(mapPxLT[0], mapPxRB[1], mapPxRB[0], mapPxLT[1]); // 压盖处理 & 添加图形 + + for (var i = 0, len = charts.length; i < len; i++) { + var chart = charts[i]; // 图形参考位置 (reSetLocation 会更新 chartBounds) + + var shapeROP = chart.resetLocation(); // 图表框 + + var cbs = chart.chartBounds; + var cBounds = [{ + "x": cbs.left, + "y": cbs.top + }, { + "x": cbs.left, + "y": cbs.bottom + }, { + "x": cbs.right, + "y": cbs.bottom + }, { + "x": cbs.right, + "y": cbs.top + }, { + "x": cbs.left, + "y": cbs.top + }]; // 地图范围外不绘制 + + if (mBounds && !me.isChartInMap(mBounds, cBounds)) { + continue; + } // 是否压盖 + + + var isOverlay = false; + + for (var j = 0; j < chartsBounds.length; j++) { + //压盖判断 + if (me.isQuadrilateralOverLap(cBounds, chartsBounds[j])) { + isOverlay = true; + break; + } + } + + if (isOverlay) { + continue; + } else { + chartsBounds.push(cBounds); + } // 添加图形 + + + var shapes = chart.shapes; + + for (var _j = 0, slen = shapes.length; _j < slen; _j++) { + shapes[_j].refOriginalPosition = shapeROP; + me.renderer.addShape(shapes[_j]); + } + } + } +}); +var graphThemeLayer = function graphThemeLayer(name, chartsType, options) { + return new GraphThemeLayer(name, chartsType, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/RankSymbolThemeLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RankSymbolThemeLayer + * @deprecatedclassinstance L.supermap.rankSymbolThemeLayer + * @category Visualization Theme + * @classdesc 符号专题图图层。符号专题图通过为每个要素绘制符号大小来反映其对应的专题值的大小;它只能表示单个字段属性信息。 + * 符号专题图多用于具有相关数量特征的地图上,比如表示不同地区粮食产量、GDP、人口等。 + * 即通过制作一个符号专题图,就可以清晰展示各个区域相关 Value 的分布差异等。 + * 目前提供的符号图形有:圆形(后续进行扩展、心形、五角星、多角心、图片等)。 + * @extends {GraphThemeLayer} + * @param {string} name - 专题图层名。 + * @param {ChartType} symbolType - 符号类型。目前支持:'Circle'。 + * @param {Object} options - 参数。 + * @param {boolean} [options.isOverLay=true] - 是否进行压盖处理,如果设为 true,表示在图表绘制过程中隐藏对已存在的图表产生压盖的图表。 + * @param {string} options.themeFields - 指定创建专题图字段。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {Array} [options.TFEvents] - 专题要素事件临时存储。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权描述信息。 + * @usage + */ + +var RankSymbolThemeLayer = GraphThemeLayer.extend({ + /** + * @member {Object} RankSymbolThemeLayer.prototype.symbolSetting + * @description 符号 Circle 配置对象。 + * @property {Array} codomain - 值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限。 + * @property {number} [maxR] - 圆形的最大半径。 + * @property {number} [minR] - 圆形的最小半径。 + * @property {string} [fillColor] - 圆形的填充色,如:fillColor: "#FFB980"。 + * @property {Object} [circleStyle] - 圆形的基础 style,此参数控制圆形基础样式,优先级低于 circleStyleByFields 和 circleStyleByCodomain。 + * @property {number} [decimalNumber] - 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。 + * @property {Object} [circleHoverStyle] - 圆形 hover 状态时的样式,circleHoverAble 为 true 时有效。 + * @property {boolean} [circleHoverAble=true] - 是否允许圆形使用 hover 状态。同时设置 circleHoverAble 和 circleClickAble 为 false,可以直接屏蔽图形对专题图层事件的响应。 + * @property {boolean} [circleClickAble=true] - 是否允许圆形被点击。同时设置 circleHoverAble 和 circleClickAble 为 false,可以直接屏蔽图形对专题图层事件的响应。 + */ + initialize: function initialize(name, symbolType, options) { + // eslint-disable-line no-unused-vars + GraphThemeLayer.prototype.initialize.apply(this, arguments); + this.symbolType = symbolType; + this.symbolSetting = {}; + }, + + /** + * @function RankSymbolThemeLayer.prototype.setSymbolType + * @description 设置符号类型,此函数可动态改变图表类型。在调用此函数前请通过 symbolSetting 为新类型的图表做相关配置。 + * @param {ChartType} symbolType - 目前支持:'Circle'。 + * + */ + //todo 这里怎么又是supermap的类型 + setSymbolType: function setSymbolType(symbolType) { + this.symbolType = symbolType; + this.redraw(); + }, + + /** + * @private + * @function RankSymbolThemeLayer.prototype.createThematicFeature + * @description 创建专题要素(图形)。 + * @param {FeatureVector} feature - 要创建的专题图形要素。 + * @returns {FeatureTheme} 专题图形。 + */ + createThematicFeature: function createThematicFeature(feature) { + var me = this; + var thematicFeature; // 检查图形创建条件并创建图形 + + if (Theme_Theme[me.symbolType] && me.themeField && me.symbolSetting) { + thematicFeature = new Theme_Theme[me.symbolType](feature, me, [me.themeField], me.symbolSetting); + } // thematicFeature 是否创建成功 + + + if (!thematicFeature) { + return false; + } // 对专题要素执行图形装载 + + + thematicFeature.assembleShapes(); + return thematicFeature; + } +}); +var rankSymbolThemeLayer = function rankSymbolThemeLayer(name, symbolType, options) { + return new RankSymbolThemeLayer(name, symbolType, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/SVGRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class SVGRenderer + * @classdesc 矢量图层缩放渲染器类。 + * @category Visualization VectorTile + * @private + * @extends {L.SVG} + * @param {Object} tileCoord - 切片坐标系。 + * @param {number} tileSize - 切片大小。 + * @param {Object} options - 渲染器参数。 + */ + +var SVGRenderer = external_L_default().SVG.extend({ + initialize: function initialize(tileCoord, tileSize, options) { + external_L_default().SVG.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + + this._container.setAttribute('width', this._size.x); + + this._container.setAttribute('height', this._size.y); + + this._container.setAttribute('viewBox', [0, 0, this._size.x, this._size.y].join(' ')); + + this._layers = {}; + }, + + /** + * @function SVGRenderer.prototype.getCoord + * @description 获取坐标。 + */ + getCoord: function getCoord() { + return this._tileCoord; + }, + + /** + * @function SVGRenderer.prototype.getContainer + * @description 获取容器。 + */ + getContainer: function getContainer() { + return this._container; + }, + onAdd: (external_L_default()).Util.falseFn, + + /** + * @function SVGRenderer.prototype.addTo + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + addTo: function addTo(map) { + this._map = map; + + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + layer._path.style.pointerEvents = 'auto'; + this._map._targets[external_L_default().stamp(layer._path)] = layer; + } + } + }, + + /** + * @function SVGRenderer.prototype.removeFrom + * @description 从地图移除。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + removeFrom: function removeFrom(map) { + var _map = map || this._map; + + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + delete _map._targets[external_L_default().stamp(layer._path)]; + } + } + + delete this._map; + }, + _addPath: function _addPath(layer) { + if (!this._rootGroup) { + this._initContainer(); + } + + if (!this._rootGroup) { + this._rootGroup = this._container; + } + + this._rootGroup.appendChild(layer._path); + + this._layers[external_L_default().stamp(layer)] = layer; + }, + _updateIcon: function _updateIcon(layer) { + var path = layer._path = external_L_default().SVG.create('image'), + options = layer.options, + iconUrl = options.iconUrl; + + if (options.iconSize) { + var size = external_L_default().point(options.iconSize), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + } else { + var img = new Image(); + img.src = iconUrl; + external_L_default().DomEvent.on(img, 'load', function () { + var size = external_L_default().point([img.width, img.height]), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + }); + } + + path.setAttribute('href', iconUrl); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/CanvasRenderer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class CanvasRenderer + * @private + * @classdesc 画布渲染器。 + * @category Visualization VectorTile + * @extends {L.Canvas} + * @param {Object} tileCoord - 切片坐标系。 + * @param {number} tileSize - 切片大小。 + * @param {Object} options - 渲染器参数。 + */ + +var CanvasRenderer = external_L_default().Canvas.extend({ + initialize: function initialize(tileCoord, tileSize, options) { + external_L_default().Canvas.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + + this._container.setAttribute('width', this._size.x); + + this._container.setAttribute('height', this._size.y); + + this._layers = {}; + this._drawnLayers = {}; + this._drawing = true; + + if (options.interactive) { + this._container.style.pointerEvents = 'auto'; + } + }, + + /** + * @function CanvasRenderer.prototype.getCoord + * @description 获取坐标。 + */ + getCoord: function getCoord() { + return this._tileCoord; + }, + + /** + * @function CanvasRenderer.prototype.getContainer + * @description 获取容器。 + */ + getContainer: function getContainer() { + return this._container; + }, + + /** + * @function CanvasRenderer.prototype.getOffset + * @description 停止渲染。 + */ + getOffset: function getOffset() { + return this._tileCoord.scaleBy(this._size).subtract(this._map.getPixelOrigin()); + }, + onAdd: (external_L_default()).Util.falseFn, + + /** + * @function CanvasRenderer.prototype.addTo + * @description 添加到地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + addTo: function addTo(map) { + this._map = map; + }, + + /** + * @function CanvasRenderer.prototype.removeFrom + * @description 从地图移除。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + removeFrom: function removeFrom(map) { + // eslint-disable-line no-unused-vars + delete this._map; + }, + _updateDashArray: function _updateDashArray(layer) { + var array = layer.options.dashArray; + + if (array && typeof array === "string") { + var parts = array.split(','), + dashArray = [], + i; + + for (i = 0; i < parts.length; i++) { + dashArray.push(Number(parts[i])); + } + + layer.options._dashArray = dashArray; + } else { + layer.options._dashArray = array; + } + }, + _onClick: function _onClick(e) { + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()), + layer, + clickedLayer; + + for (var id in this._layers) { + layer = this._layers[id]; + + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } + } + + if (clickedLayer) { + external_L_default().DomEvent.stop(e); + + this._fireEvent([clickedLayer], e); + } + }, + _onMouseMove: function _onMouseMove(e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { + return; + } + + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()); + + this._handleMouseHover(e, point); + }, + _updateIcon: function _updateIcon(layer) { + if (!this._drawing) { + return; + } + + var options = layer.options, + ctx = this._ctx, + img = layer._getImage(); + + if (options.iconSize && img.complete) { + var size = external_L_default().point(options.iconSize), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + + ctx.drawImage(img, p.x, p.y, size.x, size.y); + } else { + external_L_default().DomEvent.on(img, 'load', function () { + var size = external_L_default().point([img.width, img.height]), + anchor = size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + + ctx.drawImage(img, p.x, p.y, size.x, size.y); + }); + } + + this._drawnLayers[layer._leaflet_id] = layer; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorFeatureType.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @constant VectorFeatureType + * @description 矢量图层要素类型,和 SuperMap.CartoStyleMap 中的类型相对应。 + * @category Visualization VectorTile + * @private + */ +var VectorFeatureType = { + LABEL: "LABEL", + //label实际处理成TEXT + TEXT: "TEXT", + POINT: "POINT", + LINE: "LINE", + REGION: "REGION" +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/Symbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class Symbolizer + * @description 符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {Object} feature — 要素。 + */ + +var Symbolizer = external_L_default().Class.extend({ + initialize: function initialize(feature) { + this.properties = feature.properties; + this.type = feature.type; + this.layerName = feature.layerName; + }, + + /** + * @function Symbolizer.prototype.render + * @description 绘制线符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function render(renderer, style) { + this._renderer = renderer; + this._container = renderer._container; + this.options = style; + + renderer._initPath(this); + + renderer._updateStyle(this); + + var elem = this.getElement(); + + if (elem && this.layerName) { + external_L_default().DomUtil.addClass(elem, this.layerName); + } + }, + + /** + * @function Symbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function updateStyle(renderer, style) { + this.options = style; + + renderer._updateStyle(this); + }, + + /** + * @function Symbolizer.prototype.getElement + * @description 获取文本信息。 + */ + getElement: function getElement() { + return this._path || this._renderer._container; + }, + _getPixelBounds: function _getPixelBounds() { + var parts = this._parts; + var bounds = external_L_default().bounds([]); + + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + + for (var j = 0; j < part.length; j++) { + bounds.extend(part[j]); + } + } + + var w = this._clickTolerance(), + p = new (external_L_default()).Point(w, w); + + bounds.min._subtract(p); + + bounds.max._add(p); + + return bounds; + }, + _clickTolerance: (external_L_default()).Path.prototype._clickTolerance +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/TextSymbolizer.js +function TextSymbolizer_typeof(obj) { "@babel/helpers - typeof"; return TextSymbolizer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, TextSymbolizer_typeof(obj); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TextSymbolizer + * @classdesc 文本符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Path} + * @param {Object} feature - 要素。 + * @param {number} pxPerExtent - 文本符号大小。 + */ + +var TextSymbolizer = external_L_default().Path.extend({ + /** + * @member TextSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: Symbolizer.prototype, + options: { + color: 'white', + fillColor: 'black', + fill: true, + fillOpacity: 1, + opacity: 0.6, + weight: 1, + rotation: 0.0, + stroke: true, + fontFamily: "Arial Unicode MS Regular", + fontSize: 14, + fontWeight: 'normal', + textAlign: 'center', + offsetX: 1, + offsetY: 1 + }, + initialize: function initialize(feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + + this._makeFeatureParts(feature, pxPerExtent); + + this.options.offsetX = pxPerExtent || 1; + this.options.offsetY = pxPerExtent || 1; + }, + + /** + * @function TextSymbolizer.prototype.render + * @description 绘制点符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function render(renderer, style) { + //原本类型就是text的情况 + if (this.properties.texts) { + this._text = this.properties.texts[0]; + } //类型是label的情况 + + + if (!this._text) { + var attributes = this.properties.attributes; + this._text = attributes && this.properties.textField ? attributes[this.properties.textField] || "" : ""; + } + + var options = this.options; + this._pxBounds = external_L_default().bounds(this._point, this._point); + Symbolizer.prototype.render.apply(this, [renderer, style]); + this.options = external_L_default().Util.extend(options, style); + + this._updatePath(); + }, + _makeFeatureParts: function _makeFeatureParts(feat, pxPerExtent) { + pxPerExtent = pxPerExtent || { + x: 1, + y: 1 + }; + var coord = feat.geometry[0]; + + if (TextSymbolizer_typeof(coord[0]) === 'object' && 'x' in coord[0]) { + this._point = external_L_default().point(coord[0]).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } else { + this._point = external_L_default().point(coord).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } + }, + + /** + * @function TextSymbolizer.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function makeInteractive() { + this._updateBounds(); + }, + + /** + * @function TextSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function updateStyle(renderer, style) { + this._updateBounds(); + + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + _updateBounds: function _updateBounds() { + var w = this._renderer._getTextWidth(this); + + var p = [w / 2, w / 2]; + this._pxBounds = external_L_default().bounds(this._point.subtract(p), this._point.add(p)); + }, + _updatePath: function _updatePath() { + this._renderer._updateText(this); + }, + _containsPoint: function _containsPoint(point) { + // eslint-disable-line no-unused-vars + return false; + } +}); +CanvasRenderer.include({ + _getTextWidth: function _getTextWidth(layer) { + return this._ctx.measureText(layer._text).width; + }, + _updateText: function _updateText(layer) { + if (!this._drawing || layer._empty()) { + return; + } + + var container = this.getContainer(); + + var size = this._map.getSize(); + + container.width = size.x; + container.height = size.y; + container.style.width = size.x + 'px'; + container.style.height = size.y + 'px'; + + var ctx = this._ctx, + options = layer.options, + offsetX = options.offsetX || 1, + offsetY = options.offsetY || 1, + p = layer._point.subtract(external_L_default().point(offsetX, offsetY)); + + if (!options.fill) { + return; + } + + this._drawnLayers[layer._leaflet_id] = layer; + ctx.fillRect(0, 0, size.x, size.y); + ctx.font = [options.fontWeight ? options.fontWeight : "normal", options.fontSize ? options.fontSize : "14px", options.fontFamily ? options.fontFamily : "Arial Unicode MS Regular,Microsoft Yahei"].join(" "); + ctx.textAlign = options.textAlign; + ctx.lineWidth = options.weight; + ctx.fillStyle = options.fillColor; + ctx.fillText(layer._text, p.x, p.y); + ctx.strokeStyle = options.color; + ctx.strokeText(layer._text, p.x, p.y); + ctx.rotate(options.rotation); + } +}); +SVGRenderer.include({ + _getTextWidth: function _getTextWidth(layer) { + return layer._path.getComputedTextLength() || 0; + }, + _initPath: function _initPath(layer) { + var path; + + if (TextSymbolizer && layer instanceof TextSymbolizer) { + path = layer._path = external_L_default().SVG.create("text"); + path.textContent = layer._text; + } else { + path = layer._path = external_L_default().SVG.create("path"); + } + + if (layer.options.className) { + external_L_default().DomUtil.addClass(path, layer.options.className); + } + + if (layer.options.interactive) { + external_L_default().DomUtil.addClass(path, 'leaflet-interactive'); + } + + this._updateStyle(layer); + + this._layers[external_L_default().stamp(layer)] = layer; + }, + _updateText: function _updateText(layer) { + var path = layer._path, + options = layer.options, + offsetX = options.offsetX || 1, + offsetY = options.offsetY || 1, + p = layer._point.subtract(external_L_default().point(offsetX, offsetY)); + + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + options.rotation = options.rotation || 0; + path.setAttribute('transform', 'rotate(' + options.rotation / Math.PI * 180 + ' ' + p.x + ' ' + p.y + ')'); + path.setAttribute('text-anchor', options.textAlign === 'center' ? 'middle' : options.textAlign); + path.style.fontSize = options.fontSize; + path.style.fontFamily = options.fontFamily; + path.style.fontWeight = options.fontWeight || "normal"; + path.style.glyphOrientationVertical = options.rotation || ''; + + if (options.stroke) { + path.setAttribute('stroke', options.color); + path.setAttribute('stroke-linecap', 'round'); + path.setAttribute('stroke-linejoin', 'round'); + path.setAttribute('stroke-opacity', options.opacity); + path.setAttribute('stroke-width', options.weight > 1 ? options.weight / 10 : options.weight); + } else { + path.setAttribute('stroke', 'none'); + } + + if (options.fill) { + path.setAttribute('fill', options.fillColor || options.color); + path.setAttribute('fill-opacity', options.fillOpacity); + } else { + path.setAttribute('fill', 'none'); + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/PointSymbolizer.js +function PointSymbolizer_typeof(obj) { "@babel/helpers - typeof"; return PointSymbolizer_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, PointSymbolizer_typeof(obj); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class PointSymbolizer + * @classdesc 点符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.CircleMarker} + * @param {Object} feature - 点要素。 + * @param {number} pxPerExtent - 点符号大小。 + */ + +var PointSymbolizer = external_L_default().CircleMarker.extend({ + /** + * @member PointSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: Symbolizer.prototype, + statics: { + iconCache: {} + }, + initialize: function initialize(feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + + this._makeFeatureParts(feature, pxPerExtent); + }, + getLatLng: undefined, + + /** + * @function PointSymbolizer.prototype.render + * @description 绘制点符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function render(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._radius = style.radius || (external_L_default()).CircleMarker.prototype.options.radius; + + this._updatePath(); + }, + _makeFeatureParts: function _makeFeatureParts(feat, pxPerExtent) { + pxPerExtent = pxPerExtent || { + x: 1, + y: 1 + }; + var coord = feat.geometry[0]; + + if (PointSymbolizer_typeof(coord[0]) === 'object' && 'x' in coord[0]) { + this._point = external_L_default().point(coord[0]).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } else { + this._point = external_L_default().point(coord).scaleBy(pxPerExtent); + this._empty = (external_L_default()).Util.falseFn; + } + }, + + /** + * @function PointSymbolizer.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function makeInteractive() { + this._updateBounds(); + }, + + /** + * @function PointSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function updateStyle(renderer, style) { + this._radius = style.radius || this._radius; + + this._updateBounds(); + + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + _updateBounds: function _updateBounds() { + var icon = this.options.iconUrl; + + if (icon && this.options.iconSize) { + var size = external_L_default().point(this.options.iconSize), + anchor = size && size.divideBy(2, true), + p = this._point.subtract(anchor); + + this._pxBounds = new (external_L_default()).Bounds(p, p.add(size)); + } else { + external_L_default().CircleMarker.prototype._updateBounds.call(this); + } + }, + _updatePath: function _updatePath() { + if (this.options.iconUrl) { + this._renderer._updateIcon(this); + } else { + external_L_default().CircleMarker.prototype._updatePath.call(this); + } + }, + _getImage: function _getImage() { + if (!this.options.iconUrl) { + return null; + } + + var url = this.options.iconUrl, + img = PointSymbolizer.iconCache[url]; + + if (!img) { + var iconSize = this.options.iconSize || [50, 50]; + img = PointSymbolizer.iconCache[url] = this._createIcon(url, iconSize); + } + + return img; + }, + _createIcon: function _createIcon(url, iconSize) { + var src = url; + + if (!src) { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + + var img = document.createElement('img'), + name = "icon"; + img.src = src; + img.className = 'leaflet-marker-' + name + ' ' + (this.layerName || ''); // var options = this.options; + + var sizeOption = iconSize; + + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; + } + + if (sizeOption) { + var size = external_L_default().point(sizeOption), + anchor = external_L_default().point(size && size.divideBy(2, true)); + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + + if (anchor) { + img.style.marginLeft = -anchor.x + 'px'; + img.style.marginTop = -anchor.y + 'px'; + } + } + + img.onload = function () { + if (!sizeOption) { + img.style.width = this.width + 'px'; + img.style.height = this.height + 'px'; + } + }; + + return img; + }, + _containsPoint: function _containsPoint(p) { + var icon = this.options.iconUrl; + + if (icon) { + return this._pxBounds.contains(p); + } else { + return external_L_default().CircleMarker.prototype._containsPoint.call(this, p); + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/SymbolizerPolyBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class PolyBase + * @classdesc 多边形基类。 + * @category Visualization VectorTile + * @private + */ +//@type {{_makeFeatureParts: PolyBase._makeFeatureParts, makeInteractive: PolyBase.makeInteractive}} + +var PolyBase = { + _makeFeatureParts: function _makeFeatureParts(feat, pxPerExtent) { + pxPerExtent = pxPerExtent || { + x: 1, + y: 1 + }; + var rings = feat.geometry; + var coord; + this._parts = []; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + var part = []; + + for (var j = 0; j < ring.length; j++) { + coord = ring[j]; + part.push(external_L_default().point(coord).scaleBy(pxPerExtent)); + } + + this._parts.push(part); + } + }, + + /** + * @function PolyBase.prototype.makeInteractive + * @description 设置交互。 + */ + makeInteractive: function makeInteractive() { + this._pxBounds = this._getPixelBounds(); + } +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/LineSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class LineSymbolizer + * @classdesc 线符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Polyline} + * @param {Object} feature - 线要素。 + * @param {number} pxPerExtent - 线长。 + */ + +var LineSymbolizer = external_L_default().Polyline.extend({ + /** + * @member LineSymbolizer.prototype.includes + * @description 包含符号。 + */ + includes: [Symbolizer.prototype, PolyBase], + initialize: function initialize(feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + + this._makeFeatureParts(feature, pxPerExtent); + }, + + /** + * @function LineSymbolizer.prototype.render + * @description 绘制线符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function render(renderer, style) { + style.fill = false; + Symbolizer.prototype.render.call(this, renderer, style); + + this._updatePath(); + }, + + /** + * @function LineSymbolizer.prototype.updateStyle + * @description 更新符号样式。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + updateStyle: function updateStyle(renderer, style) { + style.fill = false; + Symbolizer.prototype.updateStyle.call(this, renderer, style); + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/RegionSymbolizer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class RegionSymbolizer + * @classdesc 面符号类。 + * @category Visualization VectorTile + * @private + * @extends {L.Polygon} + * @param {Object} feature - 面要素。 + * @param {number} pxPerExtent - 面积像素大小。 + */ + +var RegionSymbolizer = external_L_default().Polygon.extend({ + /** + * @member RegionSymbolizer.prototype.includes + * @description 包含的符号。 + */ + includes: [Symbolizer.prototype, PolyBase], + initialize: function initialize(feature, pxPerExtent) { + Symbolizer.prototype.initialize.call(this, feature); + + this._makeFeatureParts(feature, pxPerExtent); + }, + + /** + * @function RegionSymbolizer.prototype.render + * @description 绘制面符号。 + * @param {Object} renderer - 渲染器。 + * @param {string} style - 符号样式。 + */ + render: function render(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + + this._updatePath(); + } +}); +// EXTERNAL MODULE: ./node_modules/pbf/index.js +var node_modules_pbf = __webpack_require__(943); +var pbf_default = /*#__PURE__*/__webpack_require__.n(node_modules_pbf); +// EXTERNAL MODULE: ./node_modules/@mapbox/vector-tile/index.js +var vector_tile = __webpack_require__(721); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTilePBF.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class VectorTilePBF + * @classdesc 矢量瓦片 PBF(MVT) 表述出图。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {string} url - 服务地址。 + */ + +var VectorTilePBF = external_L_default().Class.extend({ + initialize: function initialize(url) { + this.url = url; + }, + + /** + * @function VectorTilePBF.prototype.getTile + * @description 获取瓦片 PBF(MVT)。 + * @returns {Promise} 返回包含矢量瓦片信息的 Promise 对象。 + */ + getTile: function getTile() { + var me = this; + return FetchRequest.get(me.url, null, { + timeout: 10000 + }).then(function (response) { + if (!response.ok) { + return { + layers: [] + }; + } + + return response.blob().then(function (blob) { + var reader = new FileReader(); + return new Promise(function (resolve) { + reader.addEventListener("loadend", function () { + var pbf = new (pbf_default())(reader.result); + return resolve(new vector_tile.VectorTile(pbf)); + }); + reader.readAsArrayBuffer(blob); + }); + }); + }).then(function (json) { + return me._processVectorTileSpec(json); + }); + }, + _processVectorTileSpec: function _processVectorTileSpec(vectorTile) { + var layers = []; + + for (var layerName in vectorTile.layers) { + var feats = []; + + for (var i = 0; i < vectorTile.layers[layerName].length; i++) { + var feat = vectorTile.layers[layerName].feature(i); + feat.geometry = feat.loadGeometry(); + feat.layerName = layerName; + feat.properties = { + attributes: external_L_default().Util.extend({}, feat.properties), + id: feat.id + }; + + switch (feat.type) { + case 1: + feat.type = VectorFeatureType.POINT; + break; + + case 2: + feat.type = VectorFeatureType.LINE; + break; + + case 3: + feat.type = VectorFeatureType.REGION; + break; + + default: + break; + } + + feats.push(feat); + } + + var layer = {}; + layer.features = feats; + layer.layerName = layerName; + layer.extent = vectorTile.layers[layerName].extent; + layers.push(layer); + } + + return layers; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTileJSON.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class VectorTileJSON + * @classdesc iServer 矢量瓦片 JSON 表述出图。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {string} url - 服务地址。 + */ + +var VectorTileJSON = external_L_default().Class.extend({ + initialize: function initialize(url) { + this.url = url; + }, + + /** + * @function VectorTileJSON.prototype.getTile + * @description 获取瓦片。 + * @returns {Promise} 返回包含矢量瓦片信息的 Promise 对象。 + */ + getTile: function getTile() { + var me = this; + return FetchRequest.get(me.url, null, { + timeout: 10000 + }).then(function (response) { + return response.json(); + }).then(function (json) { + return me._processRecordSets(json, me); + }); + }, + _processRecordSets: function _processRecordSets(records, scope) { + var recordsets = records.recordsets; // 如果iServer支持了tileFeature geojson表述则不需要此步骤 + + recordsets = scope._convertToGeoJSON(recordsets); + + if (!recordsets) { + return null; + } //类似VT标准的数据格式,并为每个要素添加一个layerName字段 + + + for (var i = 0; i < recordsets.length; i++) { + var recordset = recordsets[i]; + + for (var j = 0; j < recordset.features.length; j++) { + var feature = recordset.features[j]; + feature = scope._convertToVectorLayerFeature(feature, scope); + feature.layerName = recordset.layerName; + recordset.features[j] = feature; + } + + recordset.extent = 256; + delete recordset.fieldTypes; + delete recordset.fields; + } + + return recordsets; + }, + _convertToVectorLayerFeature: function _convertToVectorLayerFeature(feature, scope) { + if (!feature.geometry) { + return; + } + + var newFeature = {}; + var geom = feature.geometry, + type = geom.type, + coords = geom.coordinates, + tags = feature.properties, + id = tags.id, + i, + j, + rings, + projectedRing; + + if (type === 'Point') { + newFeature = tags && tags.texts ? scope._createFeature(id, VectorFeatureType.TEXT, [coords], tags) : scope._createFeature(id, VectorFeatureType.POINT, [coords], tags); + } else if (type === 'MultiPoint') { + newFeature = scope._createFeature(id, VectorFeatureType.POINT, coords, tags); + } else if (type === 'LineString') { + newFeature = scope._createFeature(id, VectorFeatureType.LINE, [coords], tags); + } else if (type === 'MultiLineString' || type === 'Polygon') { + rings = []; + + for (i = 0; i < coords.length; i++) { + projectedRing = coords[i]; + + if (type === 'Polygon') { + projectedRing.outer = i === 0; + } + + rings.push(projectedRing); + } + + var featureType = type === 'Polygon' ? VectorFeatureType.REGION : VectorFeatureType.LINE; + newFeature = scope._createFeature(id, featureType, rings, tags); + } else if (type === 'MultiPolygon') { + rings = []; + + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + projectedRing = coords[i][j]; + projectedRing.outer = j === 0; + rings.push(projectedRing); + } + } + + newFeature = scope._createFeature(id, VectorFeatureType.REGION, rings, tags); + } else { + throw new Error('Illegal GeoJSON object'); + } + + return newFeature; + }, + _convertToGeoJSON: function _convertToGeoJSON(recordsets) { + if (!recordsets) { + return; + } + + for (var i = 0; i < recordsets.length; i++) { + var recordset = recordsets[i]; + + for (var j = 0; j < recordset.features.length; j++) { + var feature = recordset.features[j]; + var points = []; + var startIndex = 0; + + for (var k = 0; k < feature.geometry.parts.length; k++) { + var partPointsLength = feature.geometry.parts[k] * 2; + + for (var l = 0, index = startIndex; l < partPointsLength; l += 2, index += 2) { + var x = feature.geometry.points[index]; + var y = feature.geometry.points[index + 1]; + points.push({ + x: x, + y: y + }); + } + + startIndex += partPointsLength; + } + + feature.geometry.points = points; + } + + recordset.features = toGeoJSON(recordset.features).features; + } + + return recordsets; + }, + _createFeature: function _createFeature(id, type, geometry, properties) { + return { + id: id, + type: type, + geometry: geometry, + properties: properties + }; + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/VectorTileFormat.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @enum VectorTileFormat + * @category BaseTypes Constant + * @description 矢量瓦片格式 + * @type {string} + * @usage + * ``` + * // 浏览器 + * + * + * // ES6 Import + * import { VectorTileFormat } from '{npm}'; + * + * const result = VectorTileFormat.JSON; + * ``` + */ + +var VectorTileFormat = { + /** JSON */ + JSON: "JSON", + + /** MVT */ + MVT: "MVT", + + /** PBF */ + PBF: "PBF" +}; + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorTile.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +/** + * @class VectorTile + * @classdesc 矢量瓦片图层基类。 + * @category Visualization VectorTile + * @private + * @extends {L.Class} + * @param {Object} options - 参数。 + * @param {string} [options.layer] - 图层名称。 + * @param {(number|L.Point)} [options.tileSize=256] - 瓦片大小。 + * @param {string} [options.format] - 返回值类型。 + * @param {Object} [options.coords] - 坐标系统对象。 + * @param {Object} [options.renderer] - 渲染器对象。 + * @param {function} done - 回调函数。 + */ + +var VectorTile = external_L_default().Class.extend({ + initialize: function initialize(options, done) { + this.layer = options.layer; + this.tileSize = options.layer.getTileSize(); + this.format = options.format; + this.coords = options.coords; + this.renderer = options.renderer; + this.done = done; + this.layer._textVectorTiles = {}; + }, + + /** + * @function VectorTile.prototype.renderTile + * @description 渲染切片。 + */ + renderTile: function renderTile() { + var me = this, + layer = me.layer, + coords = me.coords; + + var tileFeatureUrl = layer._getTileUrl(coords); + + var format = [VectorTileFormat.MVT, VectorTileFormat.PBF]; + var tileFeaturePromise; + + if (format.indexOf(me.format.toUpperCase()) > -1) { + tileFeaturePromise = new VectorTilePBF(tileFeatureUrl); + } else { + tileFeaturePromise = new VectorTileJSON(tileFeatureUrl); + } + + tileFeaturePromise.getTile().then(function (tileFeature) { + me.render(tileFeature, coords); + }); + }, + + /** + * @function VectorTile.prototype.render + * @description 渲染切片要素。 + * @param {Object} tileFeature - 需要渲染的切片要素。 + * @param {Object} coords - 切片坐标参数对象。 + */ + render: function render(tileFeature, coords) { + if (!tileFeature) { + return; + } + + var me = this, + renderer = me.renderer, + tileLayer = me.layer; + + for (var k = 0; k < tileFeature.length; k++) { + var layer = tileFeature[k], + layerName = layer.layerName; + tileLayer._dataLayerNames[layerName] = true; + var pxPerExtent = me.tileSize.divideBy(layer.extent); + var layerStyleInfo = tileLayer.getLayerStyleInfo(layer.layerName); + + for (var i = 0; i < layer.features.length; i++) { + var feat = layer.features[i]; + + if (!feat) { + continue; + } //标签图层处理为文本 + + + if (layerStyleInfo && layerStyleInfo.type === VectorFeatureType.LABEL && feat.type === VectorFeatureType.POINT && feat.properties.attributes) { + feat.type = VectorFeatureType.TEXT; + } + + var styleOptions = me._getStyleOptions(coords, feat, layerName, me); + + if (!styleOptions.length) { + continue; + } + + var featureLayer = me._createFeatureLayer(feat, pxPerExtent); + + if (!featureLayer) { + continue; + } // 保存文本图层单独绘制,避免被压盖 + + + var param = { + scope: me, + coords: coords, + renderer: renderer + }; + + if (me._extractTextLayer(feat, featureLayer, styleOptions, param)) { + continue; + } + + for (var j = 0; j < styleOptions.length; j++) { + var style = me._validateStyle(styleOptions[j], feat.type); + + featureLayer.render(renderer, style); + + renderer._addPath(featureLayer); + } + + if (tileLayer.options.interactive) { + featureLayer.makeInteractive(); + } + + var featureKey = tileLayer._getFeatureKey(feat.id, layerName); + + renderer._features[featureKey] = { + layerName: layerName, + feature: featureLayer + }; + } + } + + if (tileLayer._map) { + renderer.addTo(tileLayer._map); + } + + external_L_default().Util.requestAnimFrame(me.done.bind(coords, null, me.layer._vectorTiles[me.layer._tileCoordsToKey(coords)])); + }, + // 保存文本图层单独绘制,避免被压盖 + _extractTextLayer: function _extractTextLayer(feat, featureLayer, style, param) { + if (feat.type !== VectorFeatureType.TEXT) { + return false; + } + + var me = param.scope, + coords = param.coords, + tileLayer = me.layer, + key = tileLayer._tileCoordsToKey(coords); + + var id = feat.id, + layerName = feat.layerName; + var textTileLayers = tileLayer._textVectorTiles[key]; + + if (!textTileLayers) { + textTileLayers = { + layers: {}, + coords: coords, + renderer: param.renderer + }; + } // 不同瓦片可能请求到同一个文本图层,为避免重复绘制,只保存绘制最后一个 + + + textTileLayers.layers[id] = { + layer: featureLayer, + style: style, + layerName: layerName + }; + tileLayer._textVectorTiles[key] = textTileLayers; + return true; + }, + _getStyleOptions: function _getStyleOptions(coords, feature, layerName, scope) { + var me = scope; + var tileLayer = me.layer; + + var styleOptions = tileLayer.getVectorTileLayerStyle(coords, feature) || me._defaultStyle(feature.type); //根据id和layerName识别唯一要素 + + + var id = feature.id, + styleKey = tileLayer._getFeatureKey(id, layerName), + styleOverride = tileLayer._overriddenStyles[styleKey]; + + styleOptions = styleOverride ? styleOverride : styleOptions; + styleOptions = styleOptions instanceof Function ? styleOptions(feature.properties, coords.z) : styleOptions; + styleOptions = !(styleOptions instanceof Array) ? [styleOptions] : styleOptions; + return styleOptions; + }, + _createFeatureLayer: function _createFeatureLayer(feat, pxPerExtent) { + var layer; + + switch (feat.type) { + case VectorFeatureType.POINT: + layer = new PointSymbolizer(feat, pxPerExtent); + break; + + case VectorFeatureType.LINE: + layer = new LineSymbolizer(feat, pxPerExtent); + break; + + case VectorFeatureType.REGION: + layer = new RegionSymbolizer(feat, pxPerExtent); + break; + + case VectorFeatureType.TEXT: + layer = new TextSymbolizer(feat, pxPerExtent); + break; + + default: + break; + } + + var vectorLayer = this.layer; + + if (layer && vectorLayer.options.interactive) { + layer.addEventParent(vectorLayer); + } + + return layer; + }, + //矫正一些参数 + _validateStyle: function _validateStyle(style, type) { + //默认leaflet path的边宽为3,矩形颜色填充透明度为0.2,跟iClient不一样,故作调整 + (external_L_default()).Path.prototype.options.weight = 1; + (external_L_default()).Path.prototype.options.fillOpacity = 1; + + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, (external_L_default()).CircleMarker.prototype.options, style); + + case VectorFeatureType.LINE: + return external_L_default().extend({}, (external_L_default()).Polyline.prototype.options, style); + + case VectorFeatureType.REGION: + return external_L_default().extend({}, (external_L_default()).Polygon.prototype.options, style); + + case VectorFeatureType.TEXT: + return external_L_default().extend({}, TextSymbolizer.prototype.options, style); + + default: + break; + } + }, + //如果cartoCSS和layerInfo都没有得到样式,则使用该默认样式 + _defaultStyle: function _defaultStyle(type) { + var defaultOptions = (external_L_default()).Path.prototype.options; + defaultOptions.weight = 1; + defaultOptions.fillOpacity = 1; + defaultOptions.radius = 3; + + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, defaultOptions, (external_L_default()).CircleMarker.prototype.options); + + case VectorFeatureType.LINE: + return external_L_default().extend({}, defaultOptions, (external_L_default()).Polyline.prototype.options); + + case VectorFeatureType.REGION: + return external_L_default().extend({}, defaultOptions, (external_L_default()).Polygon.prototype.options); + + case VectorFeatureType.TEXT: + return external_L_default().extend({}, defaultOptions, TextSymbolizer.prototype.options); + + default: + break; + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/VectorGrid.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * Inspired by https://github.com/Leaflet/Leaflet.VectorGrid + */ + + + + + + + +/** + * @class VectorGrid + * @classdesc 矢量瓦片图层基类。 + * @category Visualization VectorTile + * @extends {L.GridLayer} + * @param {Object} options - 参数。 + * @param {Object} [options.vectorTileLayerStyles] - 矢量网片图层风格。 + * @param {string} [options.renderer='SVG'] - 渲染器类型。 + * @param {VectorTileFormat} [options.format=VectorTileFormat.JSON] - 矢量瓦片格式。 + * @param {boolean} [options.interactive=true] - 是否可交互。 + * @param {number} [options.maxZoom=23] - 最大缩放级别。 + * @usage + */ + +var VectorGrid = external_L_default().GridLayer.extend({ + options: { + vectorTileLayerStyles: null, + //SVG or Canvas + renderer: "SVG", + format: VectorTileFormat.JSON, + interactive: true, + maxZoom: 23 + }, + initialize: function initialize(options) { + var me = this; + external_L_default().setOptions(me, options); + external_L_default().GridLayer.prototype.initialize.call(me, options); + me._vectorTiles = {}; //交互事件使用,键值为id_layerName + + me._overriddenStyles = {}; + me.vectorTileLayerStyles = me.options.vectorTileLayerStyles; + me.on('tileunload', function (e) { + var key = me._tileCoordsToKey(e.coords), + tile = me._vectorTiles[key]; + + if (tile && me._map) { + tile.removeFrom(me._map); + } + + delete me._vectorTiles[key]; + }, me); + me.on('tileerror ', me._renderText, me); + me.on('load', me._renderText, me); + me._dataLayerNames = {}; + }, + + /** + * @private + * @function VectorGrid.prototype.createTile + * @description 创建切片图层。 + * @param {Object} coords - 切片坐标参数对象。 + * @param {function} done - todo。 + */ + createTile: function createTile(coords, done) { + var me = this; + var tileSize = me.getTileSize(); + var renderer = null; + + if (me.options.renderer === "Canvas") { + renderer = new CanvasRenderer(coords, tileSize, me.options); + } else { + renderer = new SVGRenderer(coords, tileSize, me.options); + } + + me._vectorTiles[me._tileCoordsToKey(coords)] = renderer; + renderer._features = {}; + new VectorTile({ + layer: me, + format: me.options.format, + coords: coords, + renderer: renderer + }, done).renderTile(); + return renderer.getContainer(); + }, + + /** + * @function VectorGrid.prototype.getStyles + * @description 获取图层样式。 + * @returns {Object} 所有图层的样式。 + */ + getStyles: function getStyles() { + return this.vectorTileLayerStyles; + }, + + /** + * @function VectorGrid.prototype.getStyle + * @description 获取指定图层样式。 + * @param {string} layerName - 图层名称。 + * @returns {Object} 指定图层的样式。 + */ + getStyle: function getStyle(layerName) { + return this.vectorTileLayerStyles && this.vectorTileLayerStyles[layerName]; + }, + + /** + * @function VectorGrid.prototype.setFeatureStyle + * @description 指定要素 ID 和图层名称设置要素风格。 + * @param {number} id - 要素 ID。 + * @param {string} layerName - 图层名称。 + * @param {(Array|function)} layerStyle - 图层样式。 + * @returns {VectorGrid} VectorGrid的实例对象。 + */ + setFeatureStyle: function setFeatureStyle(id, layerName, layerStyle) { + var featureKey = this._getFeatureKey(id, layerName); + + this._overriddenStyles[featureKey] = layerStyle; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[featureKey]; + + if (data) { + var feat = data.feature; + + this._updateStyles(feat, tile, layerStyle); + } + } + + return this; + }, + + /** + * @function VectorGrid.prototype.resetFeatureStyle + * @description 指定要素 ID 和图层名称重绘要素风格。 + * @param {number} id - 要素 ID。 + * @param {string} layerName - 图层名称。 + * @returns {VectorGrid} VectorGrid的实例对象。 + */ + resetFeatureStyle: function resetFeatureStyle(id, layerName) { + var featureKey = this._getFeatureKey(id, layerName); + + delete this._overriddenStyles[featureKey]; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var data = tile._features[featureKey]; + + if (data) { + var feat = data.feature; + var styleOptions = this.vectorTileLayerStyles[data.layerName]; + + this._updateStyles(feat, tile, styleOptions); + } + } + + return this; + }, + + /** + * @function VectorGrid.prototype.getDataLayerNames + * @description 获取数据图层名称。 + * @returns {Array} 返回数据图层名称数组。 + */ + getDataLayerNames: function getDataLayerNames() { + return Object.keys(this._dataLayerNames); + }, + _removeAllTiles: function _removeAllTiles() { + external_L_default().GridLayer.prototype._removeAllTiles.call(this); + + this._textVectorTiles = {}; + }, + _renderText: function _renderText() { + var textVectorTiles = this._textVectorTiles; + + for (var key in textVectorTiles) { + var textTiles = textVectorTiles[key]; + var renderer = textTiles.renderer; + + for (var layerId in textTiles.layers) { + var tile = textTiles.layers[layerId]; + var styleOptions = tile.style, + featureLayer = tile.layer; + + for (var j = 0; j < styleOptions.length; j++) { + featureLayer.render(renderer, styleOptions[j]); + + renderer._addPath(featureLayer); + } + + if (this.options.interactive) { + featureLayer.makeInteractive(); + } + } + } + }, + _getFeatureKey: function _getFeatureKey(id, layerName) { + id = id || 0; + layerName = layerName || "null"; + return id + "_" + layerName; + }, + _updateStyles: function _updateStyles(feat, renderer, styleOptions) { + styleOptions = styleOptions instanceof Function ? styleOptions(feat.properties, renderer.getCoord().z) : styleOptions; + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + for (var j = 0; j < styleOptions.length; j++) { + var style = this._extendStyle(styleOptions[j], feat.type); + + feat.updateStyle(renderer, style); + } + }, + //矫正一些参数 + _extendStyle: function _extendStyle(style, type) { + switch (type) { + case VectorFeatureType.POINT: + return external_L_default().extend({}, (external_L_default()).CircleMarker.prototype.options, style); + + case VectorFeatureType.LINE: + return external_L_default().extend({}, (external_L_default()).Polyline.prototype.options, style); + + case VectorFeatureType.REGION: + return external_L_default().extend({}, (external_L_default()).Polygon.prototype.options, style); + + case VectorFeatureType.TEXT: + return external_L_default().extend({}, TextSymbolizer.prototype.options, style); + + default: + break; + } + } +}); +;// CONCATENATED MODULE: ./src/leaflet/overlay/TiledVectorLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class TiledVectorLayer + * @deprecatedclassinstance L.supermap.tiledVectorLayer + * @classdesc SuperMap iServer 的矢量瓦片图层。 + * @category Visualization VectorTile + * @extends VectorGrid + * @example + * new TiledVectorLayer(url).addTo(map); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.layerNames - 指定图层的名称列表,支持的类型为矢量图层。 + * @param {string} options.layersID - 获取进行切片的地图图层 ID。 + * @param {string} [options.cartoCSS] - 客户端 CartoCSS 样式字符串。 + * @param {boolean} [options.serverCartoCSSStyle=true] - 是否使用服务端 CartoCSS 样式。 + * @param {boolean} [options.processCharacters=false] - 设置客户端 CartoCSS 样式时是否进行特定字符转换。 + * @param {CRS} [options.crs] - 坐标系统类。 + * @param {boolean} [options.returnAttributes=false] - 是否返回 attributes。 + * @param {string} [options.expands] - expands。 + * @param {boolean} [options.cacheEnabled=true] - 是否启用缓存。 + * @param {Object} [options.tileTemplate] - 瓦片模板,如果设置了此参数,则按此模板出图。默认出图方式为 URL 对接的第三方瓦片。 + * @param {string} [options.subdomains] - 子域名。 + * @param {number} [options.timeout=10000] - 延时。 + * @param {string} [options.attribution='Map Data © SuperMap iServer`] - 版权信息。 + * @usage + */ + +var TiledVectorLayer = VectorGrid.extend({ + options: { + crs: null, + //客户端cartocss样式 + cartoCSS: null, + // 指定图层的名称列表。支持的类型为矢量图层 + layerNames: null, + //获取进行切片的地图图层 ID + layersID: null, + //是否服务端CartoCSS样式,默认使用 + serverCartoCSSStyle: true, + //设置客户端CartoCSS样式时是否进行特定字符转换 + processCharacters: false, + returnAttributes: false, + + /*各图层扩展的像素值。 + *例如: + * 0_15:0_5,1_10:表示顶级0图层的0、1子图层扩展的像素分别为5、10像素;顶级0图层下,除0、1图层外的子图层的扩展像素都为15像素。 + * 0:0_5,1_10:表示顶级0图层的0、1子图层扩展的像素分别为5、10像素;顶级0图层下,其他除0、1图层外的子图层的扩展像素为根据该图层默认样式计算得出的默认值。 + */ + expands: null, + cacheEnabled: false, + //瓦片模板,如果设置了此参数,则按此模板出图,url无效(对接第三方瓦片) + tileTemplate: null, + subdomains: 'abc', + timeout: 10000, + attribution: core_Attributions.Common.attribution + }, + initialize: function initialize(url, options) { + options = options || {}; + options.noWrap = options.noWrap == null ? true : options.noWrap; + external_L_default().setOptions(this, options); + VectorGrid.prototype.initialize.call(this, options); + external_L_default().stamp(this); + var me = this; + + if (!url || url.indexOf("http") < 0) { + url = ""; + return this; + } + + me.url = url; + + if (url.indexOf("/") === url.length - 1) { + url = url.substr(0, url.length - 1); + me.url = url; + } + + this.cartoCSSToLeaflet = new CartoCSSToLeaflet(me.url); + me.initLayersInfo(); + + if (!me.options.serverCartoCSSStyle && me.options.cartoCSS) { + me.setClientCartoCSS(me.options.cartoCSS); + } + }, + + /** + * @private + * @function TiledVectorLayer.prototype.onAdd + * @description 添加地图。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + onAdd: function onAdd(map) { + this._crs = this.options.crs || map.options.crs; + this._map = map; + + this._initLayerUrl(); + + if (this.options.tileTemplate || !this.options.serverCartoCSSStyle) { + this._initGrid(); + } + }, + + /** + * @private + * @function TiledVectorLayer.prototype.initLayersInfo + * @description 获取服务器图层资源下的风格信息(当 CartoCSS 中不存在相应图层渲染信息时使用)。 + */ + initLayersInfo: function initLayersInfo() { + var me = this; + var layersUrl = Util.urlPathAppend(me.url, "layers"); + FetchRequest.get(SecurityManager.appendCredential(layersUrl), null, { + timeout: me.options.timeout + }).then(function (response) { + return response.json(); + }).then(function (json) { + me.layersInfoInitialized = true; + me.layersInfo = json; + + if (!me.layersInfo) { + return; + } + + var layersInfo = {}; + + for (var i = 0, len = me.layersInfo.length; i < len; i++) { + var layers = me.layersInfo[i].subLayers.layers; + + for (var j = 0, len1 = layers.length; j < len1; j++) { + layers[j].layerIndex = len1 - j; + layersInfo[layers[j].name] = layers[j]; + } + } + + me.layersInfo = layersInfo; + me.cartoCSSToLeaflet.layersInfo = layersInfo; + + if (me.options.serverCartoCSSStyle) { + me.getVectorStylesFromServer(); + } + })["catch"](function (ex) { + console.error('error', ex); + }); + }, + + /** + * @function TiledVectorLayer.prototype.getLayerStyleInfo + * @description 获取图层样式信息。 + * @param {string} layerName - 图层名称。 + */ + getLayerStyleInfo: function getLayerStyleInfo(layerName) { + var me = this, + layerInfo_simple; + me.layersStyles = me.layersStyles || {}; + layerInfo_simple = me.layersStyles[layerName]; + + if (layerInfo_simple) { + return layerInfo_simple; + } + + if (!me.layersInfo) { + return {}; + } + + var layerInfo = me.layersInfo[layerName]; + + if (!layerInfo) { + return null; + } + + layerInfo_simple = { + layerIndex: layerInfo.layerIndex, + ugcLayerType: layerInfo.ugcLayerType + }; + + switch (layerInfo.ugcLayerType) { + case "VECTOR": + layerInfo_simple.layerStyle = layerInfo.style ? layerInfo.style : null; + break; + + case "THEME": + var theme = layerInfo.theme; //标注图层特别标明 + + layerInfo_simple.layerStyle = theme ? theme.defaultStyle : null; + + if (theme && theme.type === "LABEL") { + layerInfo_simple.type = theme.type; + layerInfo_simple.textField = theme.labelExpression; + } + + break; + + default: + //SVTile发布出来的地图没有ugcLayerType属性 + if (layerInfo.style) { + layerInfo_simple.layerStyle = layerInfo.style; + } + + break; + } + + me.layersStyles[layerName] = layerInfo_simple; + return layerInfo_simple; + }, + + /* + * @function TiledVectorLayer.prototype.getVectorStylesFromServer + * @description 等待服务器的 carto 返回之后拼接本地配置的 cartoCSS, 并调用 onAdd 出图。 + */ + getVectorStylesFromServer: function getVectorStylesFromServer() { + var me = this; + var vectorStyleUrl = Util.urlPathAppend(me.url, "tileFeature/vectorstyles"); + FetchRequest.get(SecurityManager.appendCredential(vectorStyleUrl), null, { + timeout: me.options.timeout + }).then(function (response) { + return response.json(); + }).then(function (styles) { + if (!styles || !styles.style) { + return null; + } + + if (styles.style && styles.type === 'cartoCSS') { + me.setServerCartoCSS(styles.style); + } + + if (me.options) { + me.setClientCartoCSS(me.options.cartoCSS); + } + + me._initGrid(); + })["catch"](function (ex) { + console.error('error', ex); + }); + }, + + /** + * @private + * @function TiledVectorLayer.prototype.setServerCartoCSS + * @description 设置服务端获取到的 cartoCSS 样式, cartoCSS 请求回来之后自动调用。 + */ + setServerCartoCSS: function setServerCartoCSS(cartoCSSStr) { + this.cartoCSSToLeaflet.pretreatedCartoCSS(cartoCSSStr, true); + }, + + /** + * @function TiledVectorLayer.prototype.setClientCartoCSS + * @description 客户端设置 cartoCSS 样式。 + */ + setClientCartoCSS: function setClientCartoCSS(cartoCSSStr) { + var processCharacters = false; + + if (this.options.processCharacters) { + processCharacters = this.options.processCharacters; + } + + this.cartoCSSToLeaflet.pretreatedCartoCSS(cartoCSSStr, processCharacters); + }, + + /** + * @private + * @function TiledVectorLayer.prototype.getVectorTileLayerStyle + * @description 获取图层风格信息,当 CartoCSS 中包含有对该图层的渲染信息时,优先获取,否则获取图层资源下图层样式的渲染信息。 + * @param {Object} coords - 图层坐标参数对象。 + * @param {Object} feature - 需要获取的要素。 + */ + getVectorTileLayerStyle: function getVectorTileLayerStyle(coords, feature) { + if (!feature) { + return null; + } + + var me = this, + layerName = feature.layerName, + layerStyleInfo = me.getLayerStyleInfo(layerName); //处理标签图层 + + if (layerStyleInfo && layerStyleInfo.textField) { + var textField = layerStyleInfo.textField; + + if (textField && textField.indexOf('.')) { + var arr = textField.split('.'); + textField = arr && arr.length > 0 && arr[arr.length - 1]; + } + + feature.properties.textField = textField; + } + + me.vectorTileLayerStyles = me.vectorTileLayerStyles || {}; + var style = me.vectorTileLayerStyles[layerName]; + + if (style) { + feature = this._mergeFeatureTextField(feature, style); + return style; + } // CartoCSSToLeaflet内部做了客户端配置的cartoCSS和服务端cartoCSS的拼接处理 + // 客户端配置的cartoCSS会覆盖相应图层的服务端cartoCSS + + + var scale = this.getScaleFromCoords(coords); + var shaders = this.cartoCSSToLeaflet.pickShader(layerName) || []; + style = []; + + for (var itemKey in shaders) { + var shader = shaders[itemKey]; + + for (var j = 0; j < shader.length; j++) { + var serverStyle = this.cartoCSSToLeaflet.getValidStyleFromCarto(coords.z, scale, shader[j], feature, this.options.serverCartoCSSStyle); + + if (serverStyle) { + style.push(serverStyle); + } + } + } + + feature = this._mergeFeatureTextField(feature, style); //次优先级是layers资源的默认的样式,最低优先级是CartoDefaultStyle的样式 + + if (feature.type === "TEXT" || style.length === 0) { + style = this.cartoCSSToLeaflet.getValidStyleFromLayerInfo(feature, layerStyleInfo); + + if (feature.type === "TEXT") { + style.textName = "[" + feature.properties.textField + "]"; + } + } + + me.vectorTileLayerStyles[layerName] = style; + return style; + }, + + /** + * @function TiledVectorLayer.prototype.getScale + * @description 通过缩放级别获取比例尺。 + * @param {number} zoom - 缩放级别。 + * @returns {number} 比例尺。 + */ + getScale: function getScale(zoom) { + var me = this; //返回当前比例尺 + + var z = zoom || me._map.getZoom(); + + return me.scales[z]; + }, + + /** + * @function TiledVectorLayer.prototype.getScaleFromCoords + * @description 通过行列号获取比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 比例尺。 + */ + getScaleFromCoords: function getScaleFromCoords(coords) { + var me = this, + scale; + + if (me.scales && me.scales[coords.z]) { + return me.scales[coords.z]; + } + + me.scales = me.scales || {}; + scale = me.getDefaultScale(coords); + me.scales[coords.z] = scale; + return scale; + }, + + /** + * @private + * @function TiledVectorLayer.prototype.getDefaultScale + * @description 根据行列号获取默认比例尺。 + * @param {Object} coords - 行列号。 + * @returns {number} 默认比例尺。 + */ + getDefaultScale: function getDefaultScale(coords) { + var me = this, + crs = me._crs; + + if (crs.scales) { + return crs.scales[coords.z]; + } else { + var tileBounds = me._tileCoordsToBounds(coords); + + var ne = crs.project(tileBounds.getNorthEast()); + var sw = crs.project(tileBounds.getSouthWest()); + var tileSize = me.options.tileSize; + var resolution = Math.max(Math.abs(ne.x - sw.x) / tileSize, Math.abs(ne.y - sw.y) / tileSize); + var mapUnit = Unit.METER; + + if (crs.code) { + var array = crs.code.split(':'); + + if (array && array.length > 1) { + var code = parseInt(array[1]); + mapUnit = code && code >= 4000 && code <= 5000 ? Unit.DEGREE : Unit.METER; + } + } + + return resolutionToScale(resolution, 96, mapUnit); + } + }, + _mergeFeatureTextField: function _mergeFeatureTextField(feature, style) { + //如果设置了使用服务端cartocss样式,则文本专题图图层优先从carto中读取文本字段的key + if (!this.options.serverCartoCSSStyle || !style || feature.type !== "TEXT") { + return feature; + } + + var tempStyle = style; + + if (!external_L_default().Util.isArray(style)) { + tempStyle = [style]; + } + + for (var i = 0; i < tempStyle.length; i++) { + var textName = tempStyle[i].textName; + + if (textName && feature.properties) { + feature.properties.textField = textName.substring(1, textName.length - 1); + } + } + + return feature; + }, + _getTileUrl: function _getTileUrl(coords) { + var me = this, + tileTemplate = me.options.tileTemplate; + + if (!tileTemplate) { + return me._getDefaultTileUrl(coords); + } + + return me._getTileTemplateUrl(coords); + }, + _getTileTemplateUrl: function _getTileTemplateUrl(coords) { + var me = this, + tileTemplate = me.options.tileTemplate; + var data = { + s: me._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: coords.z + }; + + if (me._map && !me._map.options.crs.infinite) { + var invertedY = me._globalTileRange.max.y - coords.y; + + if (me.options.tms) { + data['y'] = invertedY; + } + + data['-y'] = invertedY; + } + + var tileUrl = external_L_default().Util.template(tileTemplate, external_L_default().extend(data, me.options)); + return tileUrl; + }, + _initGrid: function _initGrid() { + VectorGrid.prototype.onAdd.call(this, this._map); + }, + _getSubdomain: (external_L_default()).TileLayer.prototype._getSubdomain, + _getDefaultTileUrl: function _getDefaultTileUrl(coords) { + var x = coords.x, + y = coords.y; + var tileUrl = this._tileUrl + "&x=" + x + "&y=" + y; + var scale = this.getScaleFromCoords(coords); + tileUrl += "&scale=" + scale; + return tileUrl; + }, + _initLayerUrl: function _initLayerUrl() { + var options = this.options; + + if (!this.url) { + return; + } + + var format = options.format.toString().toLowerCase(); + this._tileUrl = Util.urlPathAppend(this.url, "tileFeature." + format); + this._tileUrl = Util.urlAppend(this._tileUrl, encodeURI(this._createURLParam(options))); + }, + _createURLParam: function _createURLParam(options) { + var params = []; //添加安全认证信息 + + var credential = this._getCredential(this._tileUrl); + + if (credential) { + params.push(credential); + } + + if (options.layersID) { + params.push("layersID=" + options.layersID); + } + + if (options.layerNames) { + if (!external_L_default().Util.isArray(options.layerNames)) { + options.layerNames = [options.layerNames]; + } + + var layerNamesString = '[' + options.layerNames.join(',') + ']'; + params.push("layerNames=" + layerNamesString); + } //切片的起始参考点,默认为地图范围的左上角。 + + + var crs = this._crs; + + if (crs.options && crs.options.origin) { + params.push("origin=" + JSON.stringify({ + x: crs.options.origin[0], + y: crs.options.origin[1] + })); + } else if (crs.projection && crs.projection.bounds) { + var bounds = crs.projection.bounds; + var tileOrigin = external_L_default().point(bounds.min.x, bounds.max.y); + params.push("origin=" + JSON.stringify({ + x: tileOrigin.x, + y: tileOrigin.y + })); + } + + if (options.expands) { + params.push("expands=" + options.expands); + } + + params.push("returnAttributes=" + options.returnAttributes); + params.push("cacheEnabled=" + options.cacheEnabled); + var tileSize = this.options.tileSize; + params.push("width=" + tileSize); + params.push("height=" + tileSize); + return params.join("&"); + }, + //获取token或key表达式 + _getCredential: function _getCredential(url) { + var value = SecurityManager.getToken(url); + var credential = value ? new Credential(value, 'token') || new Credential(value, 'key') : null; + + if (credential) { + return credential.getUrlParameters(); + } + + return null; + } +}); +var tiledVectorLayer = function tiledVectorLayer(url, options) { + return new TiledVectorLayer(url, options); +}; +;// CONCATENATED MODULE: external "function(){try{return turf}catch(e){return {}}}()" +var external_function_try_return_turf_catch_e_return_namespaceObject = function(){try{return turf}catch(e){return {}}}(); +;// CONCATENATED MODULE: ./src/leaflet/overlay/TurfLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class TurfLayer + * @deprecatedclassinstance L.supermap.turfLayer + * @classdesc Turf 图层。 + * @category Visualization Turf + * @extends {L.Layer} + * @param {Object} options - 参数。 + * @param {string} [options.attribution='© turfjs'] - 版权信息。 + * @usage + */ + +var TurfLayer = external_L_default().GeoJSON.extend({ + turfMap: { + "Measurement.along": ["line", "distance", "units"], + "Measurement.area": ["geojson"], + "Measurement.bbox": ["geojson"], + "Measurement.bboxPolygon": ["bbox"], + "Measurement.bearing": ["start", "end", "final"], + "Measurement.center": ["geojson", "properties"], + "Measurement.centerOfMass": ["geojson", "properties"], + "Measurement.centroid": ["geojson", "properties"], + "Measurement.destination": ["origin", "distance", "bearing", "units"], + "Measurement.distance": ["from", "to", "units"], + "Measurement.envelope": ["geojson"], + "Measurement.length": ["geojson", "units"], + "Measurement.midpoint": ["point1", "point2"], + "Measurement.pointOnFeature": ["geojson"], + "Measurement.polygonTangents": ["point", "polygon"], + "Measurement.rhumbBearing": ["start", "end", "final"], + "Measurement.rhumbDestination": ["origin", "distance", "bearing", "units"], + "Measurement.rhumbDistance": ["from", "to", "units"], + "Measurement.square": ["bbox"], + "Measurement.greatCircle": ["start", "end", "properties", "npoints", "offset"], + "CoordinateMutation.cleanCoords": ["geojson", "mutate"], + "CoordinateMutation.flip": ["geojson", "mutate"], + "CoordinateMutation.rewind": ["geojson", "reverse", "mutate"], + "CoordinateMutation.round": ["num", "precision"], + "CoordinateMutation.truncate": ["geojson", "precision", "coordinates", "mutate"], + "Transformation.bboxClip": ["feature", "bbox"], + "Transformation.bezierSpline": ["line", "resolution", "sharpness"], + "Transformation.buffer": ["geojson", "radius", "units", "steps"], + "Transformation.circle": ["center", "radius", "steps", "units", "properties"], + "Transformation.clone": ["geojson"], + "Transformation.concave": ["points", "maxEdge", "units"], + "Transformation.convex": ["geojson", "concavity"], + "Transformation.difference": ["polygon1", "polygon2"], + "Transformation.dissolve": ["featureCollection", "propertyName"], + "Transformation.intersect": ["poly1", "poly2"], + "Transformation.lineOffset": ["geojson", "distance", "units"], + "Transformation.simplify": ["feature", "tolerance", "highQuality"], + "Transformation.tesselate": ["poly"], + "Transformation.transformRotate": ["geojson", "angle", "pivot", "mutate"], + "Transformation.transformTranslate": ["geojson", "distance", "direction", "units", "zTranslation", "mutate"], + "Transformation.transformScale": ["geojson", "factor", "origin", "mutate"], + "Transformation.union": ["A"], + "Transformation.voronoi": ["points", "bbox"], + "featureConversion.combine": ["fc"], + "featureConversion.explode": ["geojson"], + "featureConversion.flatten": ["geojson"], + "featureConversion.lineStringToPolygon": ["lines", "properties", "autoComplete", "orderCoords"], + "featureConversion.polygonize": ["geojson"], + "featureConversion.polygonToLineString": ["polygon", "properties"], + "Misc.kinks": ["featureIn"], + "Misc.lineArc": ["center", "radius", "bearing1", "bearing2", "steps", "units"], + "Misc.lineChunk": ["geojson", "segmentLength", "units", "reverse"], + "Misc.lineIntersect": ["line1", "line2"], + "Misc.lineOverlap": ["line1", "line2"], + "Misc.lineSegment": ["geojson"], + "Misc.lineSlice": ["startPt", "stopPt", "line"], + "Misc.lineSliceAlong": ["line", "startDist", "stopDist", "units"], + "Misc.lineSplit": ["line", "splitter"], + "Misc.mask": ["polygon", "mask"], + "Misc.pointOnLine": ["lines", "pt", "units"], + "Misc.sector": ["center", "radius", "bearing1", "bearing2", "steps", "units"], + "Misc.shortestPath": ["start", "end", "obstacles", "units", "resolution"], + "Misc.unkinkPolygon": ["geojson"], + "Helper.featureCollection": ["features", "bbox", "id"], + "Helper.feature": ["geometry", "properties", "bbox", "id"], + "Helper.geometryCollection": ["geometries", "properties", "bbox", "id"], + "Helper.lineString": ["coordinates", "properties", "bbox", "id"], + "Helper.multiLineString": ["coordinates", "properties", "bbox", "id"], + "Helper.multiPoint": ["coordinates", "properties", "bbox", "id"], + "Helper.multiPolygon": ["coordinates", "properties", "bbox", "id"], + "Helper.point": ["coordinates", "properties", "bbox", "id"], + "Helper.polygon": ["coordinates", "properties", "bbox", "id"], + "Data.sample": ["featurecollection", "num"], + "Interpolation.interpolate": ["points", "cellSize", "gridType", "property", "units", "weight"], + "Interpolation.isobands": ["pointGrid", "breaks", "zProperty", "commonProperties", "breaksProperties"], + "Interpolation.isolines": ["pointGrid", "breaks", "zProperty", "commonProperties", "breaksProperties"], + "Interpolation.planepoint": ["point", "triangle"], + "Interpolation.tin": ["points", "z"], + "Joins.pointsWithinPolygon": ["points", "polygons"], + "Joins.tag": ["points", "polygons", "field", "outField", "mask", "properties"], + "Grids.hexGrid": ["bbox", "cellSide", "units", "triangles"], + "Grids.pointGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Grids.squareGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Grids.triangleGrid": ["bbox", "cellSide", "units", "mask", "properties"], + "Classification.nearestPoint": ["targetPoint", "points"], + "Aggregation.collect": ["polygons", "points", "inProperty", "outProperty"], + "Aggregation.clustersDbscan": ["points", "maxDistance", "units", "minPoints", "mutate"], + "Aggregation.clustersKmeans": ["points", "numberOfClusters", "mutate"], + "Meta.coordAll": ["geojson"], + "Meta.coordEach": ["geojson", "callback", "excludeWrapCoord"], + "Meta.coordReduce": ["geojson", "callback", "initialValue", "excludeWrapCoord"], + "Meta.featureEach": ["geojson", "callback"], + "Meta.featureReduce": ["geojson", "callback", "initialValue"], + "Meta.flattenEach": ["geojson", "callback"], + "Meta.flattenReduce": ["geojson", "callback", "initialValue"], + "Meta.getCoord": ["coord"], + "Meta.getCoords": ["coords"], + "Meta.getGeom": ["geojson"], + "Meta.getGeomType": ["geojson", "name"], + "Meta.geomEach": ["geojson", "callback"], + "Meta.geomReduce": ["geojson", "callback", "initialValue"], + "Meta.propEach": ["geojson", "callback"], + "Meta.propReduce": ["geojson", "callback", "initialValue"], + "Meta.segmentEach": ["geojson", "callback"], + "Meta.segmentReduce": ["geojson", "callback", "initialValue"], + "Meta.getCluster": ["geojson", "filter"], + "Meta.clusterEach": ["geojson", "property", "callback"], + "Meta.clusterReduce": ["geojson", "property", "callback", "initialValue"], + "Assertions.collectionOf": ["featureCollection", "type", "name"], + "Assertions.containsNumber": ["coordinates"], + "Assertions.geojsonType": ["value", "type", "name"], + "Assertions.featureOf": ["feature", "type", "name"], + "Booleans.booleanClockwise": ["line"], + "Booleans.booleanContains": ["feature1", "feature2"], + "Booleans.booleanCrosses": ["feature1", "feature2"], + "Booleans.booleanDisjoint": ["feature1", "feature2"], + "Booleans.booleanEqual": ["feature1", "feature2"], + "Booleans.booleanOverlap": ["feature1", "feature2"], + "Booleans.booleanParallel": ["feature1", "feature2"], + "Booleans.booleanPointInPolygon": ["point", "polygon", "ignoreBoundary"], + "Booleans.booleanPointOnLine": ["point", "linestring", "ignoreEndVertices"], + "UnitConversion.bearingToAngle": ["bearing"], + "UnitConversion.convertArea": ["area", "originalUnit", "finalUnit"], + "UnitConversion.convertLength": ["length", "originalUnit", "finalUnit"], + "UnitConversion.degreesToradians": ["degrees"], + "UnitConversion.lengthToRadians": ["distance", "units"], + "UnitConversion.lengthToDegrees": ["distance", "units"], + "UnitConversion.radiansToLength": ["radians", "units"], + "UnitConversion.radiansToDegrees": ["radians"], + "UnitConversion.toMercator": ["geojson", "mutate"], + "UnitConversion.toWgs84": ["geojson", "mutate"] + }, + options: { + attribution: core_Attributions.Turf.attribution + }, + initialize: function initialize(options) { + options = options || {}; + external_L_default().Util.setOptions(this, options); + external_L_default().stamp(this); + this._layers = {}; + }, + // 5.0.0 及以上版本参数配置 + turfOptionMap: { + "Measurement.along": ["line", "distance", { + units: "" + }], + "Measurement.bboxPolygon": ["bbox", { + properties: "", + id: "" + }], + "Measurement.bearing": ["start", "end", { + "final": "" + }], + "Measurement.center": ["geojson", { + properties: "" + }], + "Measurement.destination": ["origin", "distance", "bearing", { + units: "", + properties: "" + }], + "Measurement.distance": ["from", "to", { + units: "" + }], + "Measurement.length": ["geojson", { + units: "" + }], + "Measurement.rhumbBearing": ["start", "end", { + "final": "" + }], + "Measurement.rhumbDestination": ["origin", "distance", "bearing", { + units: "", + properties: "" + }], + "Measurement.rhumbDistance": ["from", "to", { + units: "" + }], + "Measurement.greatCircle": ["start", "end", { + properties: "", + npoints: "", + offset: "" + }], + "CoordinateMutation.cleanCoords": ["geojson", { + mutate: "" + }], + "CoordinateMutation.flip": ["geojson", { + mutate: "" + }], + "CoordinateMutation.rewind": ["geojson", { + mutate: "", + reverse: "" + }], + "CoordinateMutation.truncate": ["geojson", { + precision: "", + coordinates: "", + mutate: "" + }], + "Transformation.bezierSpline": ["line", { + resolution: "", + sharpness: "" + }], + "Transformation.buffer": ["geojson", "radius", { + units: "", + steps: "" + }], + "Transformation.circle": ["center", "radius", { + units: "", + steps: "", + properties: "" + }], + "Transformation.concave": ["points", { + maxEdge: "", + units: "" + }], + "Transformation.convex": ["geojson", { + concavity: "" + }], + "Transformation.dissolve": ["featureCollection", { + propertyName: "" + }], + "Transformation.lineOffset": ["geojson", "distance", { + units: "" + }], + "Transformation.simplify": ["geojson", { + tolerance: "", + highQuality: "" + }], + "Transformation.transformRotate": ["geojson", "angle", { + pivot: "", + mutate: "" + }], + "Transformation.transformTranslate": ["geojson", "distance", "direction", { + units: "", + zTranslation: "", + mutate: "" + }], + "Transformation.transformScale": ["geojson", "factor", { + origin: "", + mutate: "" + }], + "Transformation.voronoi": ["points", { + bbox: "" + }], + "featureConversion.lineStringToPolygon": ["lines", { + properties: "", + autoComplete: "", + orderCoords: "" + }], + "featureConversion.polygonToLineString": ["polygon", { + properties: "" + }], + "Misc.lineArc": ["center", "radius", "bearing1", "bearing2", { + steps: "", + units: "" + }], + "Misc.lineChunk": ["geojson", "segmentLength", { + units: "", + reverse: "" + }], + "Misc.lineOverlap": ["line1", "line2", { + tolerance: "" + }], + "Misc.lineSliceAlong": ["line", "startDist", "stopDist", { + units: "" + }], + "Misc.pointOnLine": ["lines", "pt", { + units: "" + }], + "Misc.sector": ["center", "radius", "bearing1", "bearing2", { + units: "", + steps: "", + properties: "" + }], + "Misc.shortestPath": ["start", "end", { + obstacles: "", + units: "", + resolution: "" + }], + "Helper.feature": ["geometry", "properties", { + bbox: "", + id: "" + }], + "Helper.geometryCollection": ["geometries", "properties", { + bbox: "", + id: "" + }], + "Helper.lineString": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Helper.multiLineString": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Helper.multiPoint": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Helper.multiPolygon": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Helper.point": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Helper.polygon": ["coordinates", "properties", { + bbox: "", + id: "" + }], + "Interpolation.interpolate": ["points", "cellSize", { + gridType: "", + property: "", + units: "", + weight: "" + }], + "Interpolation.isobands": ["pointGrid", "breaks", { + zProperty: "", + commonProperties: "", + breaksProperties: "" + }], + "Interpolation.isolines": ["pointGrid", "breaks", { + zProperty: "", + commonProperties: "", + breaksProperties: "" + }], + "Grids.hexGrid": ["bbox", "cellSide", { + units: "", + triangles: "", + properties: "", + mask: "" + }], + "Grids.pointGrid": ["bbox", "cellSide", { + units: "", + mask: "", + properties: "" + }], + "Grids.squareGrid": ["bbox", "cellSide", { + units: "", + mask: "", + properties: "" + }], + "Grids.triangleGrid": ["bbox", "cellSide", { + units: "", + mask: "", + properties: "" + }], + "Aggregation.clustersDbscan": ["points", "maxDistance", { + units: "", + minPoints: "", + mutate: "" + }], + "Aggregation.clustersKmeans": ["points", { + numberOfClusters: "", + mutate: "" + }], + "Booleans.booleanPointInPolygon": ["point", "polygon", { + ignoreBoundary: "" + }], + "Booleans.booleanPointOnLine": ["point", "linestring", { + ignoreEndVertices: "" + }], + "UnitConversion.toMercator": ["geojson", { + mutate: "" + }], + "UnitConversion.toWgs84": ["geojson", { + mutate: "" + }] + }, + + /** + * @function TurfLayer.prototype.process + * @description 执行 Turf.js 提供的相关空间分析方法。 + * @param {string} type - Turf.js 提供的空间分析方法名。 + * @param {Object} args - Turf.js 提供的空间分析方法对应的参数对象。 + * @param {function} callback - 空间分析完成执行的回调函数,返回执行的结果。 + * @param {boolean} [addFeaturesToMap=true] - 是否添加到地图。 + */ + process: function process(type, args, callback, addFeaturesToMap) { + // 兼容版本4到5 + var result; + + try { + result = external_function_try_return_turf_catch_e_return_namespaceObject[type.split('.')[1]].apply(this, this.parse(type, args)); + } catch (e) { + result = external_function_try_return_turf_catch_e_return_namespaceObject[type.split('.')[1]].apply(this, this.parseOption(type, args)); + } + + addFeaturesToMap = addFeaturesToMap == null ? true : addFeaturesToMap; + + if (addFeaturesToMap) { + this.addData([result]); + } + + if (callback) { + callback(result); + } + }, + parse: function parse(type, args) { + if (type === 'Transformation.union') { + return args['A']; + } + + var result = []; + var tempArgs = this.turfMap[type]; + + if (tempArgs) { + tempArgs.map(function (key) { + result.push(args[key]); + return args[key]; + }); + } + + return result; + }, + parseOption: function parseOption(type, args) { + var result = []; + var tempArgs = this.turfOptionMap[type]; + tempArgs.map(function (key) { + if (key instanceof Object) { + var options = key; + Object.keys(options).forEach(function (k) { + options[k] = args[k]; + }); + result.push(options); + } else { + result.push(args[key]); + } + + return args; + }); + return result; + } +}); +var turfLayer = function turfLayer(options) { + return new TurfLayer(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/HeatMapLayer.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + +/** + * @class HeatMapFeature + * @deprecatedclassinstance L.supermap.heatMapFeature + * @category Visualization HeatMap + * @classdesc 客户端专题图要素类。 + * 支持的 geometry 参数类型为 {@link L.Point}、{@link L.LatLng}、{@link L.CircleMarker}。 + * @extends {L.Class} + * @param {(L.Point|L.LatLng|L.CircleMarker)} geometry - 要素图形。 + * @param {Object} attributes - 要素属性。 + * @usage + */ + +var HeatMapFeature = external_L_default().Class.extend({ + initialize: function initialize(geometry, attributes) { + this.geometry = geometry; + this.attributes = attributes; + }, + + /** + * @function HeatMapFeature.prototype.toFeature + * @description 转为内部矢量要素。 + * @returns {FeatureVector} 内部矢量要素。 + */ + toFeature: function toFeature() { + var geometry = this.geometry; + var points = []; + + if (geometry instanceof (external_L_default()).LatLng) { + points = [geometry.lng, geometry.lat]; + } else if (geometry instanceof (external_L_default()).Point) { + points = [geometry.x, geometry.y]; + } else if (geometry instanceof (external_L_default()).CircleMarker) { + var latLng = geometry.getLatLng(); + points = [latLng.lng, latLng.lat]; + } else { + points = geometry; + } + + if (points.length === 2) { + geometry = new Point(points[0], points[1]); + } + + return new Vector(geometry, this.attributes); + } +}); +var heatMapFeature = function heatMapFeature(geometry, attributes) { + return new HeatMapFeature(geometry, attributes); +}; +/** + * @class HeatMapLayer + * @classdesc 热力图层类。 + * @category Visualization HeatMap + * @param {string} name - 图层名称。 + * @param {boolean} [loadWhileAnimating=true] - 是否实时重绘。(当绘制大数据量要素的情况下会出现卡顿,建议把该参数设为 false)。 + * @param {Array.} [colors=['blue', 'cyan', 'lime', 'yellow', 'red']] - 颜色线性渐变数组,颜色值必须为 canvas 所支持的。 + * @param {Object} options - 构造参数。 + * @param {L.Map} options.map - Leaflet Map 对象。 + * @param {string} [options.id] - 专题图层 ID,默认使用 CommonUtil.createUniqueID("heatMapLayer_") 创建专题图层 ID。 + * @param {boolean} [options.alwaysMapCRS=false] - 要素坐标是否和地图坐标系一致,要素默认是经纬度坐标。 + * @param {string} [options.featureWeight] - 对应 feature 属性中的热点权重字段名称,权重值类型为 number。 + * @param {number} [options.radius=50] - 热点渲染的最大半径(热点像素半径),单位为 px,当 useGeoUnit 参数 为 true 时,单位使用当前图层地理坐标单位。热点显示的时候以精确点为中心点开始往四周辐射衰减,其衰减半径和权重值成比列。 + * @param {number} [options.opacity=1] - 图层透明度。 + * @param {boolean} [options.useGeoUnit=false] - 使用地理单位,即默认热点半径默认使用像素单位。 当设置为 true 时,热点半径和图层地理坐标保持一致。 + * @param {number} [options.blur] - 模糊量,单位为 px。默认值为半径的二分之一。 + * @param {string} [options.attribution='Map Data © SuperMap iServer'] - 版权信息。 + * + * @extends {L.Layer} + * @fires HeatMapLayer#featuresremoved + * @fires HeatMapLayer#changelayer + * @usage + */ + +var HeatMapLayer = external_L_default().Layer.extend({ + options: { + //要素坐标是否和地图坐标系一致,默认为false,要素默认是经纬度坐标。 + alwaysMapCRS: false, + //热力图默认参数: + id: Util.createUniqueID("heatMapLayer_"), + featureWeight: null, + opacity: 1, + colors: ['blue', 'cyan', 'lime', 'yellow', 'red'], + useGeoUnit: false, + radius: 50, + attribution: core_Attributions.Common.attribution + }, + initialize: function initialize(name, options) { + external_L_default().Util.setOptions(this, options); + this.name = name; + this.features = []; + this.maxWeight = null; + this.minWeight = null; + this.rootCanvas = null; + this.canvasContext = null; + this.maxWidth = null; + this.maxHeight = null; //热力图参数: + + this.id = this.options.id; + /* + * options.featureWeight对应 feature 属性中的热点权重字段名称,权重值类型为float + * //例如: + * //feature.attributes中表示权重的字段为height,则在HeatMapLayer的featureWeight参数赋值为"height" + * feature1.attributes.height = 7.0; + * feature2.attributes.height = 6.0; + * var heatMapLayer = new HeatMapLayer("heatmaplayer",{"featureWeight":"height"}); + * heatMapLayer.addFeatures([feature1,feature2]); + * @type {null} + */ + + this.featureWeight = this.options.featureWeight; + this.colors = this.options.colors; + this.useGeoUnit = this.options.useGeoUnit; + this.opacity = this.options.opacity; + this.radius = this.options.radius; + this.blur = this.options.blur; + this.movingOffset = [0, 0]; + }, + + /** + * @function HeatMapLayer.prototype.onRemove + * @description 删除某个地图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onRemove: function onRemove(map) { + var me = this; + external_L_default().DomUtil.remove(me.rootCanvas); + map.off("mousemove", me.mouseMoveHandler); + }, + + /** + * @function HeatMapLayer.prototype.onAdd + * @description 添加专题图。 + * @param {L.Map} map - Leaflet Map 对象。 + * @private + */ + onAdd: function onAdd(map) { + var me = this; + me._map = map; + + me._createCanvasContainer(); + + if (!me.rootCanvas) { + map.removeLayer(me); + return; + } //初始化渲染器 + + + var size = map.getSize(); + me.rootCanvas.width = me.maxWidth = size.x; + me.rootCanvas.height = me.maxHeight = size.y; + + me._updateOpacity(); + + me.mouseMoveHandler = function (e) { + var xy = e.layerPoint; + me.currentMousePosition = external_L_default().point(xy.x + me.movingOffset[0], xy.y + me.movingOffset[1]); + }; + + map.on("mousemove", me.mouseMoveHandler); + me.update(); + }, + + /** + * @function HeatMapLayer.prototype.addFeatures + * @description 添加热点信息。 + * @param {(GeoJSONObject|HeatMapFeature)} features - 待添加的要素数组。 + * + * @example + * var geojson = { + * "type": "FeatureCollection", + * "features": [ + * { + * "type": "feature", + * "geometry": { + * "type": "Point", //只支持point类型 + * "coordinates": [0, 0] + * }, + * "properties": { + * "height": Math.random()*9, + * "geoRadius": useGeoRadius?radius:null + * } + * } + * ] + * }; + * var heatMapLayer = new HeatMapLayer("heatmaplayer",{"id":"heatmap"}); + * heatMapLayer.addFeatures(geojson); + */ + addFeatures: function addFeatures(features) { + this.features = this.toiClientFeature(features); + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype.refresh + * @description 强制刷新当前热点显示,在图层热点数组发生变化后调用,更新显示。 + */ + refresh: function refresh() { + if (this.features.length === 0) { + return; + } + + if (this._map) { + var extent = this._map.getBounds(); + + this.updateHeatPoints(extent); + } + }, + + /** + * @function HeatMapLayer.prototype.updateHeatPoints + * @description 刷新热点图显示。 + * @param {L.LatLngBounds} bounds - 当前显示范围。 + */ + updateHeatPoints: function updateHeatPoints(bounds) { + if (this.features && this.features.length > 0) { + this.convertFastToPixelPoints(bounds); + } else { + this.canvasContext.clearRect(0, 0, this.maxWidth, this.maxWidth); + } + }, + + /** + * @function HeatMapLayer.prototype.convertFastToPixelPoints + * @description 过滤位于当前显示范围内的热点,并转换其为当前分辨率下的像素坐标。 + * @param {L.LatLngBounds} bounds - 当前显示范围。 + * @private + */ + convertFastToPixelPoints: function convertFastToPixelPoints(bounds) { + var data = [], + x, + y, + k, + resolution, + maxTemp, + minTemp, + maxWeightTemp; //获取当前像素下的地理范围 + + var dw = bounds.getEast() - bounds.getWest(); + var dh = bounds.getNorth() - bounds.getSouth(); + + var mapCanvas = this._map.getSize(); + + if (dw / mapCanvas.x > dh / mapCanvas.y) { + resolution = dw / mapCanvas.x; + } else { + resolution = dh / mapCanvas.y; + } //热点半径 + + + this.useRadius = this.useGeoUnit ? parseInt(this.radius / resolution) : this.radius; + + for (var i = 0; i < this.features.length; i++) { + var feature = this.features[i]; + var point = feature.geometry; + var pixelPoint = this.getLocalXY(new LonLat(point.x, point.y)); + + if (this.featureWeight) { + pixelPoint.weight = feature.attributes[this.featureWeight]; //point.value; + + if (!this.maxWeight) { + //找出最大最小权重值 + maxTemp = maxTemp ? maxTemp : pixelPoint.weight; + minTemp = minTemp ? minTemp : pixelPoint.weight; + maxTemp = Math.max(maxTemp, pixelPoint.weight); + minTemp = Math.min(minTemp, pixelPoint.weight); + } + } else { + pixelPoint.weight = 1; + } + + x = Math.floor(pixelPoint[0]); + y = Math.floor(pixelPoint[1]); + k = pixelPoint.weight; + data.push([x, y, k]); + } //无最大权重设置 + + + if (!this.maxWeight) { + if (maxTemp && minTemp) { + maxWeightTemp = (maxTemp + minTemp) / 2; + } else { + maxWeightTemp = 1; + } + + this.draw(data, maxWeightTemp); + } else { + this.draw(data, this.maxWeight); + } + }, + + /** + * @function HeatMapLayer.prototype.draw + * @description 绘制热点图。 + * @param {Array} data - convertToPixelPoints 方法计算出的点。 + * @param {number} maxWeight - 最大权重。 + * @private + */ + draw: function draw(data, maxWeight) { + if (this.maxHeight > 0 && this.maxWidth > 0) { + var ctx = this.canvasContext; //清空 + + this.canvasContext.clearRect(0, 0, this.maxWidth, this.maxHeight); + this.drawCircle(this.useRadius); + this.createGradient(); + + for (var i = 0; i < data.length; i++) { + var p = data[i]; + this.canvasContext.globalAlpha = Math.max(p[2] / maxWeight, 0.05); + this.canvasContext.drawImage(this.circle, p[0] - this.useRadius, p[1] - this.useRadius); + } + + var colored = ctx.getImageData(0, 0, this.maxWidth, this.maxHeight); + this.colorize(colored.data, this.grad); + ctx.putImageData(colored, 0, 0); + } else { + return false; + } + }, + + /** + * @function HeatMapLayer.prototype.colorize + * @description 根据渐变色重置热点图 rgb 值。 + * @param {Array} pixels 像素 RGBA 值。 + * @param {Array} gradient 渐变 canvas.getImageData.data。 + * @private + */ + colorize: function colorize(pixels, gradient) { + for (var i = 0, j; i < pixels.length; i += 4) { + j = pixels[i + 3] * 4; + + if (j) { + pixels[i] = gradient[j]; + pixels[i + 1] = gradient[j + 1]; + pixels[i + 2] = gradient[j + 2]; + } + } + }, + + /** + * @function HeatMapLayer.drawCircle + * @description 绘制热点半径圆。 + * @param {number} r - 热点半径。 + * @private + */ + drawCircle: function drawCircle(r) { + var blur = this.blur || r / 2; + var circle = this.circle = document.createElement('canvas'), + ctx = circle.getContext("2d"); + circle.height = 2 * r; + circle.width = 2 * r; + ctx.shadowOffsetX = ctx.shadowOffsetY = 2 * r; + ctx.shadowBlur = blur; + ctx.shadowColor = "#000000"; + ctx.beginPath(); + ctx.arc(-r, -r, r / 2, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + }, + + /** + * @function HeatMapLayer.createGradient + * @description 根据 this.canvasColors 设置渐变并 getImageData。 + * @private + */ + createGradient: function createGradient() { + var colors = this.colors; + var canvas = document.createElement('canvas'), + ctx = canvas.getContext("2d"), + gradient = ctx.createLinearGradient(0, 0, 0, 256); + canvas.height = 256; + canvas.width = 1; + var index = 1; + + for (var i = 0, len = colors.length; i < len; i++) { + gradient.addColorStop(index / len, colors[i]); + index++; + } + + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 1, 256); + this.grad = ctx.getImageData(0, 0, 1, 256).data; + }, + + /** + * @function HeatMapLayer.prototype.update + * @description 更新图层。 + */ + update: function update() { + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + + external_L_default().DomUtil.setPosition(this.rootCanvas, mapOffset); + var me = this; + me.refresh(); + + if (me.currentMousePosition) { + me.currentMousePosition = external_L_default().point(me.currentMousePosition.x - me.movingOffset[0], me.currentMousePosition.y - me.movingOffset[1]); + } + + me.movingOffset = [0, 0]; + me._zoom = me._map.getZoom(); + me._center = me._map.getCenter(); + }, + + /** + * @function HeatMapLayer.prototype.getLocalXY + * @description 地理坐标转为像素坐标。 + * @param {Array} coordinate - 地理坐标。 + */ + getLocalXY: function getLocalXY(coordinate) { + if (!this._map) { + return coordinate; + } + + var coor = coordinate; + + if (external_L_default().Util.isArray(coordinate)) { + coor = external_L_default().point(coordinate[0], coordinate[1]); + } + + if (!(coordinate instanceof (external_L_default()).Point)) { + if (coordinate instanceof Point || coordinate instanceof GeoText) { + coor = external_L_default().point(coordinate.x, coordinate.y); + } else { + coor = external_L_default().point(coordinate.lon, coordinate.lat); + } + } + + var point = this._map.latLngToContainerPoint(!this.options.alwaysMapCRS ? external_L_default().latLng(coor.y, coor.x) : this._map.options.crs.unproject(coor)); + + return [point.x, point.y]; + }, + + /** + * @function HeatMapLayer.prototype.setOpacity + * @description 设置图层的不透明度,取值 [0-1] 之间。 + * @param {number} opacity - 不透明度。 + */ + setOpacity: function setOpacity(opacity) { + var me = this; + + if (opacity === me.options.opacity) { + return; + } + + if (opacity) { + me.options.opacity = opacity; + } + + me._updateOpacity(); + }, + + /** + * @function HeatMapLayer.prototype.removeFeatures + * @description 移除指定的热点信息。 + * @param {Array.} features - 热点信息数组。 + */ + removeFeatures: function removeFeatures(features) { + if (!features || features.length === 0 || !this.features || this.features.length === 0) { + return; + } + + if (features === this.features) { + return this.removeAllFeatures(); + } + + if (!Util.isArray(features)) { + features = [features]; + } + + var heatPoint, + index, + heatPointsFailedRemoved = []; + + for (var i = 0, len = features.length; i < len; i++) { + heatPoint = features[i]; + index = Util.indexOf(this.features, heatPoint); //找不到视为删除失败 + + if (index === -1) { + heatPointsFailedRemoved.push(heatPoint); + continue; + } //删除热点 + + + this.features.splice(index, 1); + } + + var succeed = heatPointsFailedRemoved.length == 0 ? true : false; //派发删除features成功的事件 + + /** + * @event HeatMapLayer#featuresremoved + * @description 删除features成功后触发。 + * @property {Array.} features - 事件对象。 + * @property {boolean} succeed - 删除是否成功,false 为失败,true 为成功。 + */ + + this._map.fire("featuresremoved", { + features: heatPointsFailedRemoved, + succeed: succeed + }); + + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype.removeAllFeatures + * @description 移除全部的热点信息。 + */ + removeAllFeatures: function removeAllFeatures() { + this.features = []; + this.refresh(); + }, + + /** + * @function HeatMapLayer.prototype._createCanvasContainer + * @description 创建热力图绘制容器。 + * @private + */ + _createCanvasContainer: function _createCanvasContainer() { + //构建绘图面板 + var parentContainer = this.getPane(); + var animated = this._map.options.zoomAnimation && (external_L_default()).Browser.any3d; + var className = 'heatMapLayer leaflet-layer leaflet-zoom-' + (animated ? 'animated' : 'hide'); + this.rootCanvas = external_L_default().DomUtil.create("canvas", className, parentContainer); + var originProp = external_L_default().DomUtil.testProp(['transformOrigin', 'WebkitTransformOrigin', 'msTransformOrigin']); + this.rootCanvas.id = this.id; + this.rootCanvas.style[originProp] = '50% 50%'; + this.rootCanvas.style.position = "absolute"; + this.rootCanvas.style.zIndex = 200; + Util.modifyDOMElement(this.rootCanvas, null, null, null, null, null, null, this.opacity); + this.canvasContext = this.rootCanvas.getContext('2d'); + }, + _updateOpacity: function _updateOpacity() { + var me = this; + Util.modifyDOMElement(me.rootCanvas, null, null, null, null, null, null, me.options.opacity); + + if (me._map !== null) { + /** + * @event HeatMapLayer#changelayer + * @description 图层透明度更新成功之后触发。 + * @property {HeatMapLayer} layer - 图层。 + * @property {string} property - 改变的图层属性。 + */ + me._map.fire("changelayer", { + layer: me, + property: "opacity" + }); + } + }, + + /** + * @function HeatMapLayer.prototype.getEvents + * @description 获取图层事件。 + * @returns {Object} 返回图层支持的事件。 + * @private + */ + getEvents: function getEvents() { + var me = this; + var events = { + zoomend: me._reset, + moveend: me._reset, + resize: me._resize + }; + + if (this._map._zoomAnimated) { + events.zoomanim = me._zoomAnim; + } + + return events; + }, + + /** + * @function HeatMapLayer.prototype.toiClientFeature + * @description 转为 iClient 要素。 + * @param {(GeoJSONObject|HeatMapFeature)} features - 待添加的要素数组。 + * @returns {FeatureVector} 转换后的 iClient 要素。 + */ + toiClientFeature: function toiClientFeature(features) { + if (!external_L_default().Util.isArray(features)) { + features = [features]; + } + + var featuresTemp = []; + + for (var i = 0, len = features.length; i < len; i++) { + //支持ThemeFeature类型的feature + //支持传入ThemeFeature类型,ThemeFeature.geometry instanceof L.LatLng | ThemeFeature.geometry instanceof L.Point + if (features[i] instanceof HeatMapFeature) { + featuresTemp.push(features[i].toFeature()); + } else if (["FeatureCollection", "Feature", "Geometry"].indexOf(features[i].type) != -1) { + var format = new GeoJSON(); + featuresTemp = featuresTemp.concat(format.read(features[i])); + } else if (features[i].geometry && features[i].geometry.parts) { + //iServer服务器返回数据格式 todo 暂未找到更好的参数判断,暂用 geometry.parts 试用 + featuresTemp.push(ServerFeature.fromJson(features[i]).toFeature()); + } else { + throw new Error("Features's type does not match, please check."); + } + } + + return featuresTemp; + }, + _zoomAnim: function _zoomAnim(e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._getCenterOffset(e.center)._multiplyBy(-scale).subtract(this._map._getMapPanePos()); + + if ((external_L_default()).DomUtil.setTransform) { + external_L_default().DomUtil.setTransform(this.rootCanvas, offset, scale); + } else { + this.rootCanvas.style[(external_L_default()).DomUtil.TRANSFORM] = external_L_default().DomUtil.getTranslateString(offset) + ' scale(' + scale + ')'; + } + }, + //缩放移动重绘 + _reset: function _reset() { + var me = this; + me.update(); + + var size = me._map.getSize(); + + var mapOffset = this._map.containerPointToLayerPoint([0, 0]); + + external_L_default().DomUtil.setPosition(this.rootCanvas, mapOffset); + + if (parseFloat(me.rootCanvas.width) !== parseFloat(size.x)) { + me.rootCanvas.width = size.x; + } + + if (parseFloat(me.rootCanvas.height) !== parseFloat(size.y)) { + me.rootCanvas.height = size.y; + } + + me.refresh(); + }, + //通知渲染器的尺寸变化 + _resize: function _resize() { + var me = this; + + var newSize = me._map.getSize(); + + me.maxWidth = newSize.x; + me.maxHeight = newSize.y; + } +}); +var heatMapLayer = function heatMapLayer(name, options) { + return new HeatMapLayer(name, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/overlay/carto/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/mapv/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/theme/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/vectortile/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/overlay/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/services/AddressMatchService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class AddressMatchService + * @deprecatedclassinstance L.supermap.addressMatchService + * @constructs AddressMatchService + * @classdesc 地址匹配服务。 + * @category iServer AddressMatch + * @extends {ServiceBase} + * @example + * new AddressMatchService(url,options) + * .code(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var AddressMatchService_AddressMatchService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function AddressMatchService.prototype.code + * @description 获取正向地址匹配结果。 + * @param {GeoCodingParameter} params - 正向匹配参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + code: function code(params, callback) { + var me = this; + var addressMatchService = new AddressMatchService(this.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + addressMatchService.code(Util.urlPathAppend(me.url, 'geocoding'), params); + }, + + /** + * @function AddressMatchService.prototype.decode + * @description 获取反向地址匹配结果。 + * @param {GeoDecodingParameter} params - 反向匹配参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + decode: function decode(params, callback) { + var me = this; + var addressMatchService = new AddressMatchService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + addressMatchService.decode(Util.urlPathAppend(me.url, 'geodecoding'), params); + } +}); +var addressMatchService = function addressMatchService(url, options) { + return new AddressMatchService_AddressMatchService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/ChartService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ChartService + * @deprecatedclassinstance L.supermap.chartService + * @classdesc 海图服务。 + * @category iServer Map Chart + * @extends {ServiceBase} + * @example + * new ChartService(url) + * .queryChart(param,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ChartService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ChartService.prototype.queryChart + * @description 查询海图服务。 + * @param {ChartQueryParameters} params - 海图查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryChart: function queryChart(params, callback, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var chartQueryService = new ChartQueryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + chartQueryService.processAsync(param); + }, + + /** + * @function ChartService.prototype.getChartFeatureInfo + * @description 获取海图物标信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getChartFeatureInfo: function getChartFeatureInfo(callback) { + var me = this, + url = me.url.concat(); + url = Util.urlPathAppend(url, 'chartFeatureInfoSpecs'); + var chartFeatureInfoSpecsService = new ChartFeatureInfoSpecsService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + chartFeatureInfoSpecsService.processAsync(); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + params.returnContent = params.returnContent == null ? true : params.returnContent; + + if (params.chartQueryFilterParameters && !external_L_default().Util.isArray(params.chartQueryFilterParameters)) { + params.chartQueryFilterParameters = [params.chartQueryFilterParameters]; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var chartService = function chartService(url, options) { + return new ChartService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/DatasetService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class DatasetService + * @deprecatedclassinstance L.supermap.datasetService + * @classdesc 数据集信息服务类。 + * @category iServer Data Dataset + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var DatasetService_DatasetService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function DatasetService.prototype.getDatasets + * @description 数据集查询服务。 + * @example + * new DatasetService(url).getDatasets(datasourceName,function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasets: function getDatasets(datasourceName, callback) { + if (!datasourceName) { + return; + } + + var me = this; + var datasetService = new DatasetService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasetService.getDatasetsService(datasourceName); + }, + + /** + * @function DatasetService.prototype.getDataset + * @description 数据集信息查询服务。 + * @example + * new DatasetService(url).getDataset(datasourceName, datasetName, function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {string} datasetName - 数据集名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDataset: function getDataset(datasourceName, datasetName, callback) { + if (!datasourceName || !datasetName) { + return; + } + + var me = this; + var datasetService = new DatasetService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasetService.getDatasetService(datasourceName, datasetName); + }, + + /** + * @function DatasetService.prototype.setDataset + * @description 数据集信息设置服务。可实现修改已存在数据集,新增不存在数据集。 + * @example + * new DatasetService(url).setDataset(params, function(result){ + * //doSomething + * }); + * @param {CreateDatasetParameters | UpdateDatasetParameters } params - 数据集创建参数类(当前数据源下的数据集不存在时,新建数据集) || 数据集信息更改参数类(当前数据源下的数据集存在时,更改数据集信息) + * @param {RequestCallback} callback - 回调函数。 + */ + setDataset: function setDataset(params, callback) { + if (!(params instanceof CreateDatasetParameters) && !(params instanceof UpdateDatasetParameters)) { + return; + } else if (params instanceof CreateDatasetParameters) { + var datasetParams = { + "datasetType": params.datasetType, + "datasetName": params.datasetName + }; + } else if (params instanceof UpdateDatasetParameters) { + datasetParams = { + "datasetName": params.datasetName, + "isFileCache": params.isFileCache, + "description": params.description, + "prjCoordSys": params.prjCoordSys, + "charset": params.charset + }; + } + + var me = this; + var url = Util.urlPathAppend(me.url, "datasources/name/".concat(params.datasourceName, "/datasets/name/").concat(params.datasetName)); + var datasetService = new DatasetService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasetService.setDatasetService(datasetParams); + }, + + /** + * @function DatasetService.prototype.deleteDataset + * @description 指定数据源下的数据集删除服务。 + * @example + * new DatasetService(url).deleteDataset(datasourceName, datasetName, function(result){ + * //doSomething + * }); + * @param {string} datasourceName - 数据源名称。 + * @param {string} datasetName - 数据集名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + deleteDataset: function deleteDataset(datasourceName, datasetName, callback) { + var me = this; + var url = Util.urlPathAppend(me.url, "datasources/name/".concat(datasourceName, "/datasets/name/").concat(datasetName)); + var datasetService = new DatasetService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasetService.deleteDatasetService(); + } +}); +var datasetService = function datasetService(url, options) { + return new DatasetService_DatasetService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/DatasourceService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. +* This program are made available under the terms of the Apache License, Version 2.0 +* which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DatasourceService + * @deprecatedclassinstance L.supermap.datasourceService + * @classdesc 数据源服务类。 + * @category iServer Data Datasource + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var DatasourceService_DatasourceService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function DatasourceService.prototype.getDatasources + * @description 数据源集查询服务。 + * @example + * new DatasourceService(url).getDatasources(function(result){ + * //doSomething + * }); + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasources: function getDatasources(callback) { + var me = this; + var datasourceService = new DatasourceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.getDatasourcesService(); + }, + + /** + * @function DatasourceService.prototype.getDatasource + * @description 数据源信息查询服务。 + * @example + * new DatasourceService(url).getDatasource(datasourceName,function(result){ + * //doSomething + * }); + * @param datasourceName - 数据源名称。 + * @param {RequestCallback} callback - 回调函数。 + */ + getDatasource: function getDatasource(datasourceName, callback) { + if (!datasourceName) { + return; + } + + var me = this; + var datasourceService = new DatasourceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.getDatasourceService(datasourceName); + }, + + /** + * @function DatasourceService.prototype.setDatasource + * @description 数据源信息设置服务。可实现更改当前数据源信息。 + * @example + * new DatasourceService(url).setDatasource(params, function(result){ + * //doSomething + * }); + * @param {SetDatasourceParameters} params - 数据源信息设置参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setDatasource: function setDatasource(params, callback) { + if (!(params instanceof SetDatasourceParameters)) { + return; + } + + var datasourceParams = { + description: params.description, + coordUnit: params.coordUnit, + distanceUnit: params.distanceUnit + }; + var me = this; + var url = Util.urlPathAppend(me.url, "datasources/name/".concat(params.datasourceName)); + var datasourceService = new DatasourceService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + datasourceService.setDatasourceService(datasourceParams); + } +}); +var datasourceService = function datasourceService(url, options) { + return new DatasourceService_DatasourceService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/FieldService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class FieldService + * @deprecatedclassinstance L.supermap.fieldService + * @classdesc 字段服务类。 + * @category iServer Data Field + * @extends {ServiceBase} + * @example + * new FieldService(url).getFields(function(result){ + * //doSomething + * }); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var FieldService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function FieldService.prototype.getFields + * @description 字段查询服务。 + * @param {FieldParameters} params - 字段信息查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getFields: function getFields(params, callback) { + var me = this; + var getFieldsService = new GetFieldsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + datasource: params.datasource, + dataset: params.dataset + }); + getFieldsService.processAsync(); + }, + + /** + * @function FieldService.prototype.getFieldStatisticsInfo + * @description 字段统计服务。 + * @param {FieldStatisticsParameters} params - 字段统计信息查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getFieldStatisticsInfo: function getFieldStatisticsInfo(params, callback) { + if (!(params instanceof FieldStatisticsParameters)) { + return; + } + + var me = this, + fieldName = params.fieldName, + modes = params.statisticMode; + + if (modes && !external_L_default().Util.isArray(modes)) { + modes = [modes]; + } + + me.currentStatisticResult = { + fieldName: fieldName + }; + me._statisticsCallback = callback; //针对每种统计方式分别进行请求 + + modes.forEach(function (mode) { + me.currentStatisticResult[mode] = null; + + me._fieldStatisticRequest(params.datasource, params.dataset, fieldName, mode); + }); + }, + _fieldStatisticRequest: function _fieldStatisticRequest(dataSourceName, dataSetName, fieldName, statisticMode) { + var me = this; + var statisticService = new FieldStatisticService(me.url, { + eventListeners: { + scope: me, + processCompleted: me._processCompleted, + processFailed: me._statisticsCallback + }, + datasource: dataSourceName, + dataset: dataSetName, + field: fieldName, + statisticMode: statisticMode, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers + }); + statisticService.processAsync(); + }, + _processCompleted: function _processCompleted(fieldStatisticResult) { + var me = this; + var getAll = true, + result = fieldStatisticResult.result; + + if (this.currentStatisticResult) { + if (null == me.currentStatisticResult[result.mode]) { + this.currentStatisticResult[result.mode] = result.result; + } + } + + for (var mode in me.currentStatisticResult) { + if (null == me.currentStatisticResult[mode]) { + getAll = false; + break; + } + } + + if (getAll) { + me._statisticsCallback({ + result: me.currentStatisticResult + }); + } + } +}); +var fieldService = function fieldService(url, options) { + return new FieldService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/GridCellInfosService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class GridCellInfosService + * @deprecatedclassinstance L.supermap.gridCellInfosService + * @classdesc 数据栅格查询服务。 + * @category iServer Data Grid + * @extends {ServiceBase} + * @example + * new GridCellInfosService(url) + * .getGridCellInfos(param,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var GridCellInfosService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function GridCellInfosService.prototype.getGridCellInfos + * @param {GetGridCellInfosParameters} params - 数据服务栅格查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getGridCellInfos: function getGridCellInfos(params, callback) { + if (!(params instanceof GetGridCellInfosParameters)) { + return; + } + + var me = this; + var gridCellQueryService = new GetGridCellInfosService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + gridCellQueryService.processAsync(params); + } +}); +var gridCellInfosService = function gridCellInfosService(url, options) { + return new GridCellInfosService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/GeoprocessingService.js + + + + +/** + * @class GeoprocessingService + * @deprecatedclassinstance L.supermap.geoprocessingService + * @classdesc 处理自动化服务接口类。 + * @version 10.1.0 + * @category iServer ProcessingAutomationService + * @extends ServiceBase + * @example + * //为了安全访问受保护的处理自动化服务,必须通过传递 iserver 令牌( token ),才能正确访问相关资源。 + * SecurityManager.registerToken(serviceUrl, token); + * var geoprocessingService = new GeoprocessingService("http://localhost:8090/iserver/services/geoprocessing/restjsr/gp/v2") + geoprocessingService.submitJob(identifier,params, environments, function(serverResult) { + console.log(serverResult.result); + var jobID = serverResult.result.jobID; + var options = { + interval: 5000, + statusCallback: function(state) { + console.log("Job Status: ", state); + } + }; + geoprocessingService.waitForJobCompletion(jobID, identifier, options, function(serverResult) { + console.log(serverResult); + }) + }) + * + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @usage + */ + +var GeoprocessingService_GeoprocessingService = ServiceBase.extend({ + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + ServiceBase.prototype.initialize.call(this, url, options); + this.headers = {}; + this.crossOrigin = true; + this.withCredentials = true; + this.proxy = true; + }, + + /** + * @function GeoprocessingService.prototype.getTools + * @description 获取处理自动化工具列表。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTools: function getTools(callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getTools(); + }, + + /** + * @function GeoprocessingService.prototype.getTool + * @description 获取工具的ID、名称、描述、输入参数、环境参数和输出结果等相关参数。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTool: function getTool(identifier, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getTool(identifier); + }, + + /** + * @function GeoprocessingService.prototype.execute + * @description 同步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + execute: function execute(identifier, parameter, environment, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.execute(identifier, parameter, environment); + }, + + /** + * @function GeoprocessingService.prototype.submitJob + * @description 异步执行处理自动化工具。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} parameter - 处理自动化工具的输入参数。 + * @param {Object} environment - 处理自动化工具的环境参数。 + * @param {RequestCallback} callback - 回调函数。 + */ + submitJob: function submitJob(identifier, parameter, environment, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.submitJob(identifier, parameter, environment); + }, + + /** + * @function GeoprocessingService.prototype.waitForJobCompletion + * @description 获取处理自动化异步执行状态信息。 + * @param {string} jobId - 处理自动化任务ID。 + * @param {string} identifier - 处理自动化工具ID。 + * @param {Object} options - 参数。 + * @param {number} options.interval - 定时器时间间隔。 + * @param {RequestCallback} options.statusCallback - 任务状态的回调函数。 + * @param {function} callback 回调函数。 + */ + waitForJobCompletion: function waitForJobCompletion(jobId, identifier, options, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.waitForJobCompletion(jobId, identifier, options); + }, + + /** + * @function GeoprocessingService.prototype.getJobInfo + * @description 获取处理自动化任务的执行信息。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + getJobInfo: function getJobInfo(identifier, jobId, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getJobInfo(identifier, jobId); + }, + + /** + * @function GeoprocessingService.prototype.cancelJob + * @description 取消处理自动化任务的异步执行。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {RequestCallback} callback - 回调函数。 + */ + cancelJob: function cancelJob(identifier, jobId, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.cancelJob(identifier, jobId); + }, + + /** + * @function GeoprocessingService.prototype.getJobs + * @description 获取处理自动化服务任务列表。 + * @param {string} identifier - 处理自动化工具 ID。(传参代表 identifier 算子的任务列表,不传参代表所有任务的列表) + * @param {RequestCallback} callback - 回调函数。 + */ + getJobs: function getJobs(identifier, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getJobs(identifier); + }, + + /** + * @function GeoprocessingService.prototype.getResults + * @description 处理自动化工具异步执行的结果,支持结果过滤。 + * @param {string} identifier - 处理自动化工具 ID。 + * @param {string} jobId - 处理自动化任务 ID。 + * @param {string} filter - 输出异步结果的 ID。(可选,传入 filter 参数时对该处理自动化工具执行的结果进行过滤获取,不填参时显示所有的执行结果) + * @param {RequestCallback} callback - 回调函数。 + */ + getResults: function getResults(identifier, jobId, filter, callback) { + var geoprocessingJobsService = new GeoprocessingService(this.url, { + proxy: this.options.proxy, + withCredentials: this.options.withCredentials, + crossOrigin: this.options.crossOrigin, + headers: this.options.headers, + eventListeners: { + scope: this, + processCompleted: callback, + processFailed: callback + } + }); + geoprocessingJobsService.getResults(identifier, jobId, filter); + } +}); +var geoprocessingService = function geoprocessingService(url, options) { + return new GeoprocessingService_GeoprocessingService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/LayerInfoService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class LayerInfoService + * @deprecatedclassinstance L.supermap.layerInfoService + * @classdesc 图层信息类。 + * @category iServer Map Layer + * @extends {ServiceBase} + * @example + * new LayerInfoService(url).getLayersInfo(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var LayerInfoService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function LayerInfoService.prototype.getLayersInfo + * @description 获取图层信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLayersInfo: function getLayersInfo(callback) { + var me = this; + var getLayersInfoService = new GetLayersInfoService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + getLayersInfoService.processAsync(); + }, + + /** + * @function LayerInfoService.prototype.setLayerInfo + * @description 设置图层信息服务。可以实现临时图层中子图层的修改。 + * @param {SetLayerInfoParameters} params - 设置图层信息参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayerInfo: function setLayerInfo(params, callback) { + if (!(params instanceof SetLayerInfoParameters)) { + return; + } + + var me = this, + resourceID = params.resourceID, + tempLayerName = params.tempLayerName, + layerInfoParams = params.layerInfo; + + if (!resourceID || !tempLayerName) { + return; + } + + var url = Util.urlPathAppend(me.url, "tempLayersSet/".concat(resourceID, "/").concat(tempLayerName)); + var setLayerInfoService = new SetLayerInfoService(url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + setLayerInfoService.processAsync(layerInfoParams); + }, + + /** + * @function LayerInfoService.prototype.setLayersInfo + * @description 设置图层信息。可以实现创建新的临时图层和修改现有的临时图层。 + * @param {SetLayersInfoParameters} params - 设置图层信息参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayersInfo: function setLayersInfo(params, callback) { + if (!(params instanceof SetLayersInfoParameters)) { + return; + } + + var me = this, + resourceID = params.resourceID, + isTempLayers = params.isTempLayers ? params.isTempLayers : false, + layersInfo = params.layersInfo; + + if (isTempLayers && !resourceID || !layersInfo) { + return; + } + + var setLayersInfoService = new SetLayersInfoService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + }, + resourceID: resourceID, + isTempLayers: isTempLayers + }); + setLayersInfoService.processAsync(layersInfo); + }, + + /** + * @function LayerInfoService.prototype.setLayerStatus + * @description 负责将子图层显示控制参数传递到服务端,并获取服务端返回的图层显示状态。 + * @param {SetLayerStatusParameters} params - 子图层显示控制参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + setLayerStatus: function setLayerStatus(params, callback) { + if (!(params instanceof SetLayerStatusParameters)) { + return; + } + + var me = this; + var setLayerStatusService = new SetLayerStatusService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + processCompleted: callback, + processFailed: callback + } + }); + setLayerStatusService.processAsync(params); + } +}); +var layerInfoService = function layerInfoService(url, options) { + return new LayerInfoService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/MeasureService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class MeasureService + * @deprecatedclassinstance L.supermap.measureService + * @classdesc 量算服务类。 + * @category iServer Map Measure + * @example + * 用法: + * new MeasureService(url).measureDistance({ + * geometry:xxx + * },function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ + +var MeasureService_MeasureService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function MeasureService.prototype.measureDistance + * @description 测距。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measureDistance: function measureDistance(params, callback) { + this.measure(MeasureMode.DISTANCE, params, callback); + return this; + }, + + /** + * @function MeasureService.prototype.measureArea + * @description 测面积。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measureArea: function measureArea(params, callback) { + this.measure(MeasureMode.AREA, params, callback); + return this; + }, + + /** + * @function MeasureService.measure + * @param {MeasureMode} [type=MeasureMode.DISTANCE] - 量算模式。 + * @param {MeasureParameters} params - 量算参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + measure: function measure(type, params, callback) { + if (!(params instanceof MeasureParameters)) { + return; + } + + var me = this; + + if (params.geometry) { + params.geometry = toSuperMapGeometry(params.geometry); + } + + var measureService = new MeasureService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + measureMode: type, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + measureService.processAsync(params); + } +}); +var measureService = function measureService(url, options) { + return new MeasureService_MeasureService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/NetworkAnalyst3DService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class NetworkAnalyst3DService + * @deprecatedclassinstance L.supermap.networkAnalyst3DService + * @classdesc 3D 网络分析服务类。 + * @category iServer FacilityAnalyst3D + * @extends {ServiceBase} + * @example + * new NetworkAnalyst3DService(url) + * .sinksFacilityAnalyst(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * "http://localhost:8090/iserver/services/components-rest/rest/networkanalyst/RoadNet@Changchun"。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var NetworkAnalyst3DService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function NetworkAnalyst3DService.prototype.sinksFacilityAnalyst + * @description 汇查找服务。 + * @param {FacilityAnalystSinks3DParameters} params - 最近设施分析参数类(汇查找资源)。 + * @param {RequestCallback} callback - 回调函数。 + */ + sinksFacilityAnalyst: function sinksFacilityAnalyst(params, callback) { + var me = this; + var facilityAnalystSinks3DService = new FacilityAnalystSinks3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystSinks3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.sourcesFacilityAnalyst + * @description 源查找服务。 + * @param {FacilityAnalystSources3DParameters} params - 最近设施分析参数类(源查找资源)。 + * @param {RequestCallback} callback - 回调函数。 + * @returns {NetworkAnalyst3DService} NetworkAnalyst3DService的实例对象。 + */ + sourcesFacilityAnalyst: function sourcesFacilityAnalyst(params, callback) { + var me = this; + var facilityAnalystSources3DService = new FacilityAnalystSources3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystSources3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.traceUpFacilityAnalyst + * @description 上游追踪资源服务。 + * @param {FacilityAnalystTraceup3DParameters} params - 上游追踪资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @returns {NetworkAnalyst3DService} NetworkAnalyst3DService的实例对象。 + */ + traceUpFacilityAnalyst: function traceUpFacilityAnalyst(params, callback) { + var me = this; + var facilityAnalystTraceup3DService = new FacilityAnalystTraceup3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystTraceup3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.traceDownFacilityAnalyst + * @description 下游追踪资源服务。 + * @param {FacilityAnalystTracedown3DParameters} params - 下游追踪资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + traceDownFacilityAnalyst: function traceDownFacilityAnalyst(params, callback) { + var me = this; + var facilityAnalystTracedown3DService = new FacilityAnalystTracedown3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystTracedown3DService.processAsync(params); + }, + + /** + * @function NetworkAnalyst3DService.prototype.upstreamFacilityAnalyst + * @description 上游关键设施查找服务。 + * @param {FacilityAnalystUpstream3DParameters} params - 上游关键设施查找资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + upstreamFacilityAnalyst: function upstreamFacilityAnalyst(params, callback) { + var me = this; + var facilityAnalystUpstream3DService = new FacilityAnalystUpstream3DService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + facilityAnalystUpstream3DService.processAsync(params); + } +}); +var networkAnalyst3DService = function networkAnalyst3DService(url, options) { + return new NetworkAnalyst3DService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/NetworkAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + +/** + * @class NetworkAnalystService + * @deprecatedclassinstance L.supermap.networkAnalystService + * @classdesc 网络分析服务类。 + * @category iServer NetworkAnalyst + * @example + * new NetworkAnalystService(url) + * .findPath(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。请求网络分析服务,URL应为: + * http://{服务器地址}:{服务端口号}/iserver/services/{网络分析服务名}/rest/networkanalyst/{网络数据集@数据源}。
+ * 例如: "http://localhost:8090/iserver/services/test/rest/networkanalyst/WaterNet@FacilityNet"。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ + +var NetworkAnalystService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function NetworkAnalystService.prototype.burstPipelineAnalyst + * @description 爆管分析服务:即将给定弧段或节点作为爆管点来进行分析,返回关键结点 ID 数组,普通结点 ID 数组及其上下游弧段 ID 数组。 + * @param {BurstPipelineAnalystParameters} params - 爆管分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + burstPipelineAnalyst: function burstPipelineAnalyst(params, callback) { + var me = this; + var burstPipelineAnalystService = new BurstPipelineAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + burstPipelineAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.computeWeightMatrix + * @description 耗费矩阵分析服务:根据交通网络分析参数中的耗费字段返回一个耗费矩阵。该矩阵是一个二维数组,用来存储任意两点间的资源消耗。 + * @param {ComputeWeightMatrixParameters} params - 耗费矩阵分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + computeWeightMatrix: function computeWeightMatrix(params, callback) { + var me = this; + var computeWeightMatrixService = new ComputeWeightMatrixService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + computeWeightMatrixService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findClosestFacilities + * @description 最近设施分析服务:指在网络上给定一个事件点和一组设施点,查找从事件点到设施点(或从设施点到事件点)以最小耗费能到达的最佳路径。 + * @param {FindClosestFacilitiesParameters} params - 最近设施分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findClosestFacilities: function findClosestFacilities(params, callback, resultFormat) { + var me = this; + var findClosestFacilitiesService = new FindClosestFacilitiesService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findClosestFacilitiesService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.streamFacilityAnalyst + * @description 上游/下游关键设施查找资源服务:查找给定弧段或节点的上游/下游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。 + * @param {FacilityAnalystStreamParameters} params - 上游/下游关键设施查找资源参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + streamFacilityAnalyst: function streamFacilityAnalyst(params, callback, resultFormat) { + var me = this; + var facilityAnalystStreamService = new FacilityAnalystStreamService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + facilityAnalystStreamService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findLocation + * @description 选址分区分析服务:确定一个或多个待建设施的最佳或最优位置。 + * @param {FindLocationParameters} params - 选址分区分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findLocation: function findLocation(params, callback, resultFormat) { + var me = this; + var findLocationService = new FindLocationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findLocationService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findPath + * @description 最佳路径分析服务:在网络数据集中指定一些节点,按照节点的选择顺序,顺序访问这些节点从而求解起止点之间阻抗最小的路经。 + * @param {FindPathParameters} params - 最佳路径分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findPath: function findPath(params, callback, resultFormat) { + var me = this; + var findPathService = new FindPathService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findPathService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findTSPPaths + * @description 旅行商分析服务:路径分析的一种,它从起点开始(默认为用户指定的第一点)查找能够遍历所有途经点且花费最小的路径。 + * @param {FindTSPPathsParameters} params - 旅行商分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findTSPPaths: function findTSPPaths(params, callback, resultFormat) { + var me = this; + var findTSPPathsService = new FindTSPPathsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findTSPPathsService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findMTSPPaths + * @description 多旅行商分析服务:也称为物流配送,是指在网络数据集中,给定 M 个配送中心点和 N 个配送目的地(M,N 为大于零的整数)。查找经济有效的配送路径,并给出相应的行走路线。 + * @param {FindMTSPPathsParameters} params - 多旅行商分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findMTSPPaths: function findMTSPPaths(params, callback, resultFormat) { + var me = this; + var findMTSPPathsService = new FindMTSPPathsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findMTSPPathsService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.findServiceAreas + * @description 服务区分析服务:以指定服务站点为中心,在一定服务范围内查找网络上服务站点能够提供服务的区域范围。 + * @param {FindServiceAreasParameters} params - 服务区分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + findServiceAreas: function findServiceAreas(params, callback, resultFormat) { + var me = this; + var findServiceAreasService = new FindServiceAreasService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + findServiceAreasService.processAsync(me._processParams(params)); + }, + + /** + * @function NetworkAnalystService.prototype.updateEdgeWeight + * @description 更新边的耗费权重服务。 + * @param {UpdateEdgeWeightParameters} params - 更新边的耗费权重服务参数类。 + * @param {RequestCallback} callback -回调函数。 + */ + updateEdgeWeight: function updateEdgeWeight(params, callback) { + var me = this; + var updateEdgeWeightService = new UpdateEdgeWeightService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + updateEdgeWeightService.processAsync(params); + }, + + /** + * @function NetworkAnalystService.prototype.updateTurnNodeWeight + * @description 转向耗费权重更新服务。 + * @param {UpdateTurnNodeWeightParameters} params - 转向耗费权重更新服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + updateTurnNodeWeight: function updateTurnNodeWeight(params, callback) { + var me = this; + var updateTurnNodeWeightService = new UpdateTurnNodeWeightService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + updateTurnNodeWeightService.processAsync(params); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + if (params.centers && external_L_default().Util.isArray(params.centers)) { + params.centers.map(function (point, key) { + params.centers[key] = point instanceof (external_L_default()).LatLng ? { + x: point.lng, + y: point.lat + } : point; + return params.centers[key]; + }); + } + + if (params.nodes && external_L_default().Util.isArray(params.nodes)) { + params.nodes.map(function (point, key) { + params.nodes[key] = point instanceof (external_L_default()).LatLng ? { + x: point.lng, + y: point.lat + } : point; + return params.nodes[key]; + }); + } + + if (params.event && params.event instanceof (external_L_default()).LatLng) { + params.event = { + x: params.event.lng, + y: params.event.lat + }; + } + + if (params.facilities && external_L_default().Util.isArray(params.facilities)) { + params.facilities.map(function (point, key) { + params.facilities[key] = point instanceof (external_L_default()).LatLng ? { + x: point.lng, + y: point.lat + } : point; + return params.facilities[key]; + }); + } + + if (params.parameter && params.parameter.barrierPoints) { + var barrierPoints = params.parameter.barrierPoints; + + if (external_L_default().Util.isArray(barrierPoints)) { + barrierPoints.map(function (point, key) { + params.parameter.barrierPoints[key] = point instanceof (external_L_default()).LatLng ? { + x: point.lng, + y: point.lat + } : point; + return params.parameter.barrierPoints[key]; + }); + } else { + params.parameter.barrierPoints = [barrierPoints instanceof (external_L_default()).LatLng ? { + x: barrierPoints.lng, + y: barrierPoints.lat + } : barrierPoints]; + } + } + + return params; + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var networkAnalystService = function networkAnalystService(url, options) { + return new NetworkAnalystService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/ProcessingService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + +/** + * @class ProcessingService + * @deprecatedclassinstance L.supermap.processingService + * @classdesc 分布式分析服务类。 + * @category iServer ProcessingService + * @extends ServiceBase + * @example + * new ProcessingService(url) + * .getKernelDensityJobs(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ProcessingService = ServiceBase.extend({ + initialize: function initialize(url, options) { + options = options || {}; + external_L_default().setOptions(this, options); + ServiceBase.prototype.initialize.call(this, url, options); + this.kernelDensityJobs = {}; + this.summaryMeshJobs = {}; + this.queryJobs = {}; + this.summaryRegionJobs = {}; + this.vectorClipJobs = {}; + this.overlayGeoJobs = {}; + this.buffersJobs = {}; + this.topologyValidatorJobs = {}; + this.summaryAttributesJobs = {}; + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJobs + * @description 获取密度分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getKernelDensityJobs: function getKernelDensityJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + kernelDensityJobsService.getKernelDensityJobs(); + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJob + * @description 获取指定 ID 的密度分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getKernelDensityJob: function getKernelDensityJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + kernelDensityJobsService.getKernelDensityJob(id); + }, + + /** + * @function ProcessingService.prototype.addKernelDensityJob + * @description 新建密度分析。 + * @param {KernelDensityJobParameter} params - 密度分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addKernelDensityJob: function addKernelDensityJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var kernelDensityJobsService = new KernelDensityJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.kernelDensityJobs[job.id] = job.state; + } + }, + format: format + }); + kernelDensityJobsService.addKernelDensityJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getKernelDensityJobState + * @description 获取密度分析的状态。 + * @param {string} id - 密度分析 ID。 + * @returns {Object} 密度分析的状态。 + */ + getKernelDensityJobState: function getKernelDensityJobState(id) { + return this.kernelDensityJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJobs + * @description 获取点聚合分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryMeshJobs: function getSummaryMeshJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryMeshJobsService.getSummaryMeshJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJob + * @description 获取指定 ID 的点聚合分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryMeshJob: function getSummaryMeshJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryMeshJobsService.getSummaryMeshJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryMeshJob + * @description 新建点聚合分析。 + * @param {SummaryMeshJobParameter} params - 点聚合分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryMeshJob: function addSummaryMeshJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var summaryMeshJobsService = new SummaryMeshJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.summaryMeshJobs[job.id] = job.state; + } + }, + format: format + }); + summaryMeshJobsService.addSummaryMeshJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryMeshJobState + * @description 获取点聚合分析的状态。 + * @param {string} id - 点聚合分析的 ID。 + * @returns {Object} 点聚合分析的状态。 + */ + getSummaryMeshJobState: function getSummaryMeshJobState(id) { + return this.summaryMeshJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getQueryJobs + * @description 获取单对象查询分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getQueryJobs: function getQueryJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + singleObjectQueryJobsService.getQueryJobs(); + }, + + /** + * @function ProcessingService.prototype.getQueryJob + * @description 获取指定 ID 的单对象查询分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getQueryJob: function getQueryJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + singleObjectQueryJobsService.getQueryJob(id); + }, + + /** + * @function ProcessingService.prototype.addQueryJob + * @description 新建单对象查询分析。 + * @param {SingleObjectQueryJobsParameter} params - 单对象空间查询分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addQueryJob: function addQueryJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var singleObjectQueryJobsService = new SingleObjectQueryJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.queryJobs[job.id] = job.state; + } + }, + format: format + }); + singleObjectQueryJobsService.addQueryJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getQueryJobState + * @description 获取单对象查询分析的状态。 + * @param {string} id - 单对象查询分析的 ID。 + * @returns {Object} 单对象查询分析的状态。 + */ + getQueryJobState: function getQueryJobState(id) { + return this.queryJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJobs + * @description 获取区域汇总分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryRegionJobs: function getSummaryRegionJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryRegionJobsService.getSummaryRegionJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJob + * @description 获取指定 ID 的区域汇总分析。 + * @param {string} id - 区域汇总分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryRegionJob: function getSummaryRegionJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryRegionJobsService.getSummaryRegionJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryRegionJob + * @description 新建区域汇总分析。 + * @param {SummaryRegionJobParameter} params - 区域汇总分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryRegionJob: function addSummaryRegionJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var summaryRegionJobsService = new SummaryRegionJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.summaryRegionJobs[job.id] = job.state; + } + }, + format: format + }); + summaryRegionJobsService.addSummaryRegionJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryRegionJobState + * @description 获取区域汇总分析的状态。 + * @param {string} id - 区域汇总分析的 ID。 + * @returns {Object} 区域汇总分析的状态。 + */ + getSummaryRegionJobState: function getSummaryRegionJobState(id) { + return this.summaryRegionJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getVectorClipJobs + * @description 获取矢量裁剪分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getVectorClipJobs: function getVectorClipJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + vectorClipJobsService.getVectorClipJobs(); + }, + + /** + * @function ProcessingService.prototype.getVectorClipJob + * @description 获取指定 ID 的矢量裁剪分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getVectorClipJob: function getVectorClipJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + vectorClipJobsService.getVectorClipJob(id); + }, + + /** + * @function ProcessingService.prototype.addVectorClipJob + * @description 新建矢量裁剪分析。 + * @param {VectorClipJobsParameter} params - 矢量裁剪分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addVectorClipJob: function addVectorClipJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var vectorClipJobsService = new VectorClipJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.vectorClipJobs[job.id] = job.state; + } + }, + format: format + }); + vectorClipJobsService.addVectorClipJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getVectorClipJobState + * @description 获取矢量裁剪分析的状态。 + * @param {string} id - 矢量裁剪分析的 ID。 + * @returns {Object} 矢量裁剪分析的状态。 + */ + getVectorClipJobState: function getVectorClipJobState(id) { + return this.vectorClipJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getOverlayGeoJobs + * @description 获取叠加分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getOverlayGeoJobs: function getOverlayGeoJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + overlayGeoJobsService.getOverlayGeoJobs(); + }, + + /** + * @function ProcessingService.prototype.getOverlayGeoJob + * @description 获取指定 ID 的叠加分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getOverlayGeoJob: function getOverlayGeoJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + overlayGeoJobsService.getOverlayGeoJob(id); + }, + + /** + * @function ProcessingService.prototype.addOverlayGeoJob + * @description 新建叠加分析。 + * @param {OverlayGeoJobParameter} params - 叠加分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addOverlayGeoJob: function addOverlayGeoJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var overlayGeoJobsService = new OverlayGeoJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.overlayGeoJobs[job.id] = job.state; + } + }, + format: format + }); + overlayGeoJobsService.addOverlayGeoJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getoverlayGeoJobState + * @description 获取叠加分析的状态。 + * @param {string} id - 叠加分析的 ID。 + * @returns {Object} 叠加分析的状态 + */ + getoverlayGeoJobState: function getoverlayGeoJobState(id) { + return this.overlayGeoJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getBuffersJobs + * @description 获取缓冲区分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getBuffersJobs: function getBuffersJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + buffersAnalystJobsService.getBuffersJobs(); + }, + + /** + * @function ProcessingService.prototype.getBuffersJob + * @description 获取指定 ID 的缓冲区分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getBuffersJob: function getBuffersJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + buffersAnalystJobsService.getBuffersJob(id); + }, + + /** + * @function ProcessingService.prototype.addBuffersJob + * @description 新建缓冲区分析。 + * @param {BuffersAnalystJobsParameter} params - 缓冲区分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addBuffersJob: function addBuffersJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var buffersAnalystJobsService = new BuffersAnalystJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.buffersJobs[job.id] = job.state; + } + }, + format: format + }); + buffersAnalystJobsService.addBuffersJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getBuffersJobState + * @description 获取缓冲区分析的状态。 + * @param {string} id - 缓冲区分析的 ID。 + * @returns {Object} 缓冲区分析的状态 + */ + getBuffersJobState: function getBuffersJobState(id) { + return this.buffersJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJobs + * @description 获取拓扑检查分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getTopologyValidatorJobs: function getTopologyValidatorJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + topologyValidatorJobsService.getTopologyValidatorJobs(); + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJob + * @description 获取指定 ID 的拓扑检查分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getTopologyValidatorJob: function getTopologyValidatorJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + topologyValidatorJobsService.getTopologyValidatorJob(id); + }, + + /** + * @function ProcessingService.prototype.addTopologyValidatorJob + * @description 新建拓扑检查分析。 + * @param {TopologyValidatorJobsParameter} params - 拓扑检查分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addTopologyValidatorJob: function addTopologyValidatorJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var topologyValidatorJobsService = new TopologyValidatorJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.topologyValidatorJobs[job.id] = job.state; + } + }, + format: format + }); + topologyValidatorJobsService.addTopologyValidatorJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getTopologyValidatorJobState + * @description 获取拓扑检查分析的状态。 + * @param {string} id - 拓扑检查分析的 ID。 + * @returns {Object} 拓扑检查分析的状态。 + */ + getTopologyValidatorJobState: function getTopologyValidatorJobState(id) { + return this.topologyValidatorJobs[id]; + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJobs + * @description 获取属性汇总分析的列表。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryAttributesJobs: function getSummaryAttributesJobs(callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryAttributesJobsService.getSummaryAttributesJobs(); + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJob + * @description 获取指定 ID 的属性汇总分析。 + * @param {string} id - 空间分析的 ID。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getSummaryAttributesJob: function getSummaryAttributesJob(id, callback, resultFormat) { + var me = this, + format = me._processFormat(resultFormat); + + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: format + }); + summaryAttributesJobsService.getSummaryAttributesJob(id); + }, + + /** + * @function ProcessingService.prototype.addSummaryAttributesJob + * @description 新建属性汇总分析。 + * @param {SummaryAttributesJobsParameter} params - 属性汇总分析任务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {number} [seconds=1000] - 开始创建后,获取创建成功结果的时间间隔。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + addSummaryAttributesJob: function addSummaryAttributesJob(params, callback, seconds, resultFormat) { + var me = this, + param = me._processParams(params), + format = me._processFormat(resultFormat); + + var summaryAttributesJobsService = new SummaryAttributesJobsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback, + processRunning: function processRunning(job) { + me.summaryAttributesJobs[job.id] = job.state; + } + }, + format: format + }); + summaryAttributesJobsService.addSummaryAttributesJob(param, seconds); + }, + + /** + * @function ProcessingService.prototype.getSummaryAttributesJobState + * @description 获取属性汇总分析的状态。 + * @param {string} id - 属性汇总分析的 ID。 + * @returns {Object} 属性汇总分析的状态。 + */ + getSummaryAttributesJobState: function getSummaryAttributesJobState(id) { + return this.summaryAttributesJobs[id]; + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + + if (params.query) { + params.query = CommontypesConversion.toSuperMapBounds(params.query); + } + + if (params.geometryQuery) { + params.geometryQuery = CommontypesConversion.toProcessingParam(params.geometryQuery); + } + + if (params.geometryClip) { + params.geometryClip = CommontypesConversion.toProcessingParam(params.geometryClip); + } + + return params; + } +}); +var processingService = function processingService(url, options) { + return new ProcessingService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/QueryService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + +/** + * @class QueryService + * @deprecatedclassinstance L.supermap.queryService + * @classdesc 地图查询服务类。 + * @category iServer Map QueryResults + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @example + * new QueryService(url).queryByBounds(param,function(result){ + * //doSomething + * }) + * @usage + */ + +var QueryService_QueryService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function QueryService.prototype.queryByBounds + * @description bounds 查询地图服务。 + * @param {QueryByBoundsParameters} params - Bounds 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByBounds: function queryByBounds(params, callback, resultFormat) { + var me = this; + var queryService = new QueryByBoundsService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + queryService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryByDistance + * @description 地图距离查询服务。 + * @param {QueryByDistanceParameters} params - Distance 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByDistance: function queryByDistance(params, callback, resultFormat) { + var me = this; + var queryByDistanceService = new QueryByDistanceService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + queryByDistanceService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryBySQL + * @description 地图 SQL 查询服务。 + * @param {QueryBySQLParameters} params - SQL 查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryBySQL: function queryBySQL(params, callback, resultFormat) { + var me = this; + var queryBySQLService = new QueryBySQLService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + queryBySQLService.processAsync(me._processParams(params)); + }, + + /** + * @function QueryService.prototype.queryByGeometry + * @description 地图几何查询服务。 + * @param {QueryByGeometryParameters} params - Geometry 查询相关参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + queryByGeometry: function queryByGeometry(params, callback, resultFormat) { + var me = this; + var queryByGeometryService = new QueryByGeometryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + queryByGeometryService.processAsync(me._processParams(params)); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + params.returnContent = params.returnContent == null ? true : params.returnContent; + + if (params.queryParams && !external_L_default().Util.isArray(params.queryParams)) { + params.queryParams = [params.queryParams]; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + + if (params.geometry) { + if (params.geometry instanceof (external_L_default()).Point) { + params.geometry = new Point(params.geometry.x, params.geometry.y); + } else { + params.geometry = toSuperMapGeometry(params.geometry); + } + } + + return params; + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var queryService = function queryService(url, options) { + return new QueryService_QueryService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/SpatialAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + +/** + * @class SpatialAnalystService + * @deprecatedclassinstance L.supermap.spatialAnalystService + * @classdesc 空间分析服务类。提供:地区太阳辐射、缓冲区分析、点密度分析、动态分段分析、空间关系分析、插值分析、栅格代数运算、叠加分析、路由定位、路由测量计算、表面分析、地形曲率计算、泰森多边形分析。 + * @category iServer SpatialAnalyst + * @example + * new SpatialAnalystService(url) + * .bufferAnalysis(params,function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @extends {ServiceBase} + * @usage + */ + +var SpatialAnalystService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function SpatialAnalystService.prototype.getAreaSolarRadiationResult + * @description 地区太阳辐射。 + * @param {AreaSolarRadiationParameters} params - 地区太阳辐射参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + getAreaSolarRadiationResult: function getAreaSolarRadiationResult(params, callback, resultFormat) { + var me = this; + var areaSolarRadiationService = new AreaSolarRadiationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + areaSolarRadiationService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.bufferAnalysis + * @description 缓冲区分析。 + * @param {DatasetBufferAnalystParameters} params - 数据集缓冲区分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + bufferAnalysis: function bufferAnalysis(params, callback, resultFormat) { + var me = this; + var bufferAnalystService = new BufferAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + bufferAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.densityAnalysis + * @description 点密度分析。 + * @param {DensityKernelAnalystParameters} params - 核密度分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + densityAnalysis: function densityAnalysis(params, callback, resultFormat) { + var me = this; + var densityAnalystService = new DensityAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + densityAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.generateSpatialData + * @description 动态分段分析。 + * @param {GenerateSpatialDataParameters} params - 动态分段操作参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + generateSpatialData: function generateSpatialData(params, callback, resultFormat) { + var me = this; + var generateSpatialDataService = new GenerateSpatialDataService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + generateSpatialDataService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.geoRelationAnalysis + * @description 空间关系分析。 + * @param {GeoRelationAnalystParameters} params - 空间关系分析服务参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + geoRelationAnalysis: function geoRelationAnalysis(params, callback, resultFormat) { + var me = this; + var geoRelationAnalystService = new GeoRelationAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + geoRelationAnalystService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.interpolationAnalysis + * @description 插值分析。 + * @param {InterpolationDensityAnalystParameters|InterpolationIDWAnalystParameters|InterpolationRBFAnalystParameters|InterpolationKrigingAnalystParameters} params - 样条插值(径向基函数插值法)分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + interpolationAnalysis: function interpolationAnalysis(params, callback, resultFormat) { + var me = this; + var interpolationAnalystService = new InterpolationAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + interpolationAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.mathExpressionAnalysis + * @description 栅格代数运算。 + * @param {MathExpressionAnalysisParameters} params - 栅格代数运算参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + mathExpressionAnalysis: function mathExpressionAnalysis(params, callback, resultFormat) { + var me = this; + var mathExpressionAnalysisService = new MathExpressionAnalysisService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + mathExpressionAnalysisService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.overlayAnalysis + * @description 叠加分析。 + * @param {DatasetOverlayAnalystParameters|GeometryOverlayAnalystParameters} params - 数据集叠加分析参数类。|| 几何对象叠加分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + overlayAnalysis: function overlayAnalysis(params, callback, resultFormat) { + var me = this; + var overlayAnalystService = new OverlayAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + overlayAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.routeCalculateMeasure + * @description 路由测量计算。 + * @param {RouteCalculateMeasureParameters} params - 基于路由对象计算指定点 M 值操作的参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + routeCalculateMeasure: function routeCalculateMeasure(params, callback, resultFormat) { + var me = this; + var routeCalculateMeasureService = new RouteCalculateMeasureService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + routeCalculateMeasureService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.routeLocate + * @description 路由定位。 + * @param {RouteLocatorParameters} params - 路由对象定位空间对象的参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + routeLocate: function routeLocate(params, callback, resultFormat) { + var me = this; + var routeLocatorService = new RouteLocatorService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + routeLocatorService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.surfaceAnalysis + * @description 表面分析。 + * @param {SurfaceAnalystParameters} params - 表面分析提取操作参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + surfaceAnalysis: function surfaceAnalysis(params, callback, resultFormat) { + var me = this; + var surfaceAnalystService = new SurfaceAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + surfaceAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.terrainCurvatureCalculate + * @description 地形曲率计算。 + * @param {TerrainCurvatureCalculationParameters} params - 地形曲率计算参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + terrainCurvatureCalculate: function terrainCurvatureCalculate(params, callback, resultFormat) { + var me = this; + var terrainCurvatureCalculationService = new TerrainCurvatureCalculationService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + terrainCurvatureCalculationService.processAsync(params); + }, + + /** + * @function SpatialAnalystService.prototype.thiessenAnalysis + * @description 泰森多边形分析。 + * @param {DatasetThiessenAnalystParameters|GeometryThiessenAnalystParameters} params - 数据集泰森多边形分析参数类。 + * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + thiessenAnalysis: function thiessenAnalysis(params, callback, resultFormat) { + var me = this; + var thiessenAnalystService = new ThiessenAnalystService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); + thiessenAnalystService.processAsync(me._processParams(params)); + }, + + /** + * @function SpatialAnalystService.prototype.geometrybatchAnalysis + * @description 批量空间分析。 + * @param {Array.} params -批量分析参数对象数组;包括:
+ * @param {string} params.analystName - 空间分析方法的名称。包括:
+ * "buffer","overlay","interpolationDensity","interpolationidw","interpolationRBF","interpolationKriging","isoregion","isoline" + * @param {Object} param - 空间分析类型对应的请求参数,包括:
+ * {@link GeometryBufferAnalystParameters} 缓冲区分析参数类。
+ * {@link GeometryOverlayAnalystParameters} 叠加分析参数类。
+ * {@link InterpolationAnalystParameters} 插值分析参数类。
+ * {@link SurfaceAnalystParameters} 表面分析参数类。
+ * @param {RequestCallback} callback - 回调函数。 + * @param {DataFormat} [resultFormat=DataFormat.GEOJSON] - 返回结果类型。 + */ + geometrybatchAnalysis: function geometrybatchAnalysis(params, callback, resultFormat) { + var me = this; + var geometryBatchAnalystService = new GeometryBatchAnalystService(me.url, { + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + }, + format: me._processFormat(resultFormat) + }); //处理批量分析中各个分类类型的参数: + + var analystParameters = []; + + for (var i = 0; i < params.length; i++) { + var tempParameter = params[i]; + analystParameters.push({ + analystName: tempParameter.analystName, + param: me._processParams(tempParameter.param) + }); + } + + geometryBatchAnalystService.processAsync(analystParameters); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + if (params.bounds) { + params.bounds = CommontypesConversion.toSuperMapBounds(params.bounds); + } + + if (params.inputPoints) { + for (var i = 0; i < params.inputPoints.length; i++) { + var inputPoint = params.inputPoints[i]; + + if (external_L_default().Util.isArray(inputPoint)) { + params.inputPoints[i] = { + x: inputPoint[0], + y: inputPoint[1], + tag: inputPoint[2] + }; + } + } + } + + if (params.points) { + for (var _i = 0; _i < params.points.length; _i++) { + var point = params.points[_i]; + + if (external_L_default().Util.isArray(point)) { + params.points[_i] = { + x: point[0], + y: point[1] + }; + } else if (point instanceof (external_L_default()).LatLng) { + params.points[_i] = { + x: point.lng, + y: point.lat + }; + } else { + params.points[_i] = { + x: point.x, + y: point.y + }; + } + } + } + + if (params.point) { + if (external_L_default().Util.isArray(params.point)) { + params.point = { + x: params.point[0], + y: params.point[1] + }; + } else if (params.point instanceof (external_L_default()).LatLng) { + params.point = { + x: params.point.lng, + y: params.point.lat + }; + } else { + params.point = { + x: params.point.x, + y: params.point.y + }; + } + } + + if (params.extractRegion) { + params.extractRegion = toSuperMapGeometry(params.extractRegion); + } + + if (params.extractParameter && params.extractParameter.clipRegion) { + params.extractParameter.clipRegion = toSuperMapGeometry(params.extractParameter.clipRegion); + } + + if (params.clipParam && params.clipParam.clipRegion) { + params.clipParam.clipRegion = toSuperMapGeometry(params.clipParam.clipRegion); + } //支持格式:Vector Layers; GeoJson + + + if (params.sourceGeometry) { + var SRID = null; + + if (params.sourceGeometrySRID) { + SRID = params.sourceGeometrySRID; + } + + params.sourceGeometry = toSuperMapGeometry(params.sourceGeometry); + + if (SRID) { + params.sourceGeometry.SRID = SRID; + } + + delete params.sourceGeometry.sourceGeometrySRID; + } + + if (params.operateGeometry) { + params.operateGeometry = toSuperMapGeometry(params.operateGeometry); + } //支持传入多个几何要素进行叠加分析: + + + if (params.sourceGeometries) { + var sourceGeometries = []; + + for (var k = 0; k < params.sourceGeometries.length; k++) { + sourceGeometries.push(toSuperMapGeometry(params.sourceGeometries[k])); + } + + params.sourceGeometries = sourceGeometries; + } //支持传入多个几何要素进行叠加分析: + + + if (params.operateGeometries) { + var operateGeometries = []; + + for (var j = 0; j < params.operateGeometries.length; j++) { + operateGeometries.push(toSuperMapGeometry(params.operateGeometries[j])); + } + + params.operateGeometries = operateGeometries; + } + + if (params.sourceRoute) { + if (params.sourceRoute instanceof (external_L_default()).Polyline) { + var target = {}; + target.type = 'LINEM'; + target.parts = [params.sourceRoute.getLatLngs().length]; + target.points = []; + + for (var _i2 = 0; _i2 < params.sourceRoute.getLatLngs().length; _i2++) { + var _point = params.sourceRoute.getLatLngs()[_i2]; + + target.points = target.points.concat({ + x: _point.lng, + y: _point.lat, + measure: _point.alt + }); + } + + params.sourceRoute = target; + } + } + + if (params.operateRegions && external_L_default().Util.isArray(params.operateRegions)) { + params.operateRegions.map(function (geometry, key) { + params.operateRegions[key] = toSuperMapGeometry(geometry); + return params.operateRegions[key]; + }); + } // if (params.sourceRoute && params.sourceRoute.components && L.Util.isArray(params.sourceRoute.components)) { + // params.sourceRoute.components.map(function (geometry, key) { + // params.sourceRoute.components[key] = Util.toSuperMapGeometry(geometry); + // }); + // } + + + return params; + }, + _processFormat: function _processFormat(resultFormat) { + return resultFormat ? resultFormat : DataFormat.GEOJSON; + } +}); +var spatialAnalystService = function spatialAnalystService(url, options) { + return new SpatialAnalystService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/ThemeService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ThemeService + * @deprecatedclassinstance L.supermap.themeService + * @classdesc 专题图服务类。 + * @category iServer Map Theme + * @extends {ServiceBase} + * @example + * new ThemeService(url,{ + * projection:projection + * }).getThemeInfo(params,function(result){ + * //doSomething + * }); + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ThemeService_ThemeService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ThemeService.prototype.getThemeInfo + * @description 获取专题图信息。 + * @param {ThemeParameters} params - 专题图参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + getThemeInfo: function getThemeInfo(params, callback) { + var me = this; + var themeService = new ThemeService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + themeService.processAsync(params); + } +}); +var themeService = function themeService(url, options) { + return new ThemeService_ThemeService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/TrafficTransferAnalystService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class TrafficTransferAnalystService + * @deprecatedclassinstance L.supermap.trafficTransferAnalystService + * @classdesc 交通换乘分析服务类。 + * @category iServer TrafficTransferAnalyst + * @example + * new TrafficTransferAnalystService(url).queryStop(params,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var TrafficTransferAnalystService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function TrafficTransferAnalystService.prototype.queryStop + * @description 站点查询服务。 + * @param {StopQueryParameters} params - 站点查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + queryStop: function queryStop(params, callback) { + var me = this; + var stopQueryService = new StopQueryService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + stopQueryService.processAsync(params); + }, + + /** + * @function TrafficTransferAnalystService.prototype.analysisTransferPath + * @description 交通换乘线路查询服务。 + * @param {TransferPathParameters} params - 交通换乘线路查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + analysisTransferPath: function analysisTransferPath(params, callback) { + var me = this; + var transferPathService = new TransferPathService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + transferPathService.processAsync(me._processParams(params)); + }, + + /** + * @function TrafficTransferAnalystService.prototype.analysisTransferSolution + * @description 交通换乘方案查询服务。 + * @param {TransferSolutionParameters} params - 交通换乘方案查询参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + analysisTransferSolution: function analysisTransferSolution(params, callback) { + var me = this; + var transferSolutionService = new TransferSolutionService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + transferSolutionService.processAsync(me._processParams(params)); + }, + _processParams: function _processParams(params) { + if (!params) { + return {}; + } + + if (params.points && external_L_default().Util.isArray(params.points)) { + params.points.map(function (point, key) { + params.points[key] = point instanceof (external_L_default()).LatLng ? { + x: point.lng, + y: point.lat + } : point; + return params.points[key]; + }); + } + + return params; + } +}); +var trafficTransferAnalystService = function trafficTransferAnalystService(url, options) { + return new TrafficTransferAnalystService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/WebPrintingJobService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class WebPrintingJobService + * @deprecatedclassinstance L.supermap.webPrintingJobService + * @classdesc Web 打印服务类。 + * 提供:创建 Web 打印任务,获取 Web 打印任务内容,获取 Web 打印输出文档流,获取 Web 打印服务的布局模板信息。 + * @category iServer WebPrintingJob + * @example + * new WebPrintingJobService(url) + * .createWebPrintingJob(param,function(result){ + * //doSomething + * }) + * @extends {ServiceBase} + * @version 10.1.0 + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var WebPrintingJobService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function WebPrintingJobService.prototype.createWebPrintingJob + * @description 创建 Web 打印任务。 + * @param {WebPrintingJobParameters} params - Web 打印参数类。 + * @param {RequestCallback} callback - 回调函数。 + */ + createWebPrintingJob: function createWebPrintingJob(params, callback) { + if (!params) { + return; + } + + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + webPrintingService.createWebPrintingJob(me._processParams(params)); + }, + + /** + * @function WebPrintingJobService.prototype.getPrintingJob + * @description 获取 Web 打印输出文档任务。 + * @param {string} jobId - Web 打印输入文档任务 Id。 + * @param {RequestCallback} callback - 回调函数。 + */ + getPrintingJob: function getPrintingJob(jobId, callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + webPrintingService.getPrintingJob(jobId); + }, + + /** + * @function WebPrintingJobService.prototype.getPrintingJobResult + * @description 获取 Web 打印任务的输出文档。 + * @param {string} jobId - Web 打印输入文档任务 Id。 + * @param {RequestCallback} callback - 回调函数。 + */ + getPrintingJobResult: function getPrintingJobResult(jobId, callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + webPrintingService.getPrintingJobResult(jobId); + }, + + /** + * @function WebPrintingJobService.prototype.getLayoutTemplates + * @description 查询 Web 打印服务所有可用的模板信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLayoutTemplates: function getLayoutTemplates(callback) { + var me = this; + var webPrintingService = new WebPrintingService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + webPrintingService.getLayoutTemplates(); + }, + _processParams: function _processParams(params) { + if (params.layoutOptions && params.layoutOptions.littleMapOptions) { + params.layoutOptions.littleMapOptions.center = this._toPointObject(params.layoutOptions.littleMapOptions.center); + } + + if (params.exportOptions) { + params.exportOptions.center = this._toPointObject(params.exportOptions.center); + } + + return params; + }, + _toPointObject: function _toPointObject(point) { + if (external_L_default().Util.isArray(point)) { + return { + x: point[0], + y: point[1] + }; + } else if (point instanceof Point || point instanceof (external_L_default()).Point) { + return { + x: point.x, + y: point.y + }; + } else if (point instanceof (external_L_default()).LatLng) { + return { + x: point.lng, + y: point.lat + }; + } + + return point; + } +}); +var webPrintingJobService = function webPrintingJobService(url, options) { + return new WebPrintingJobService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/ImageService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ImageService + * @deprecatedclassinstance L.supermap.imageService + * @version 10.2.0 + * @constructs ImageService + * @classdesc 影像服务类 + * @category iServer Image + * @extends {ServiceBase} + * @example + * new ImageService(url,options) + * .getCollections(function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ImageService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ImageService.prototype.getCollections + * @description 返回影像集合列表(Collections)。 + * @param {RequestCallback} callback - 回调函数。 + */ + getCollections: function getCollections(callback) { + var me = this; + var ImageService = new ImageService_ImageService(this.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.getCollections(); + }, + + /** + * @function ImageService.prototype.getCollectionByID + * @description ID值等于`collectionId`参数值的影像集合(Collection)。 ID值用于在服务中唯一标识该影像集合。 + * @param {string} collectionId 影像集合( Collection )的 ID ,在一个影像服务中唯一标识影像集合。 + * @param {RequestCallback} callback - 回调函数。 + */ + getCollectionByID: function getCollectionByID(collectionId, callback) { + var me = this; + var ImageService = new ImageService_ImageService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.getCollectionByID(collectionId); + }, + + /** + * @function ImageService.prototype.search + * @description 查询与过滤条件匹配的影像数据。 + * @param {ImageSearchParameter} [itemSearch] 查询参数 + * @param {RequestCallback} callback - 回调函数。 + */ + search: function search(itemSearch, callback) { + var me = this; + var ImageService = new ImageService_ImageService(me.url, { + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageService.search(itemSearch); + } +}); +var imageService = function imageService(url, options) { + return new ImageService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/ImageCollectionService.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class ImageCollectionService + * @deprecatedclassinstance L.supermap.imageCollectionService + * @version 10.2.0 + * @constructs ImageCollectionService + * @classdesc 影像集合服务类 + * @category iServer Image + * @extends {ServiceBase} + * @example + * new ImageCollectionService(url,options) + * .getLegend(queryParams, function(result){ + * //doSomething + * }) + * @param {string} url - 服务地址。 + * @param {Object} options - 参数。 + * @param {string} options.collectionId 影像集合(Collection)的ID,在一个影像服务中唯一标识影像集合。 + * @param {string} [options.proxy] - 服务代理地址。 + * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。 + * @param {boolean} [options.crossOrigin] - 是否允许跨域请求。 + * @param {Object} [options.headers] - 请求头。 + * @usage + */ + +var ImageCollectionService = ServiceBase.extend({ + initialize: function initialize(url, options) { + ServiceBase.prototype.initialize.call(this, url, options); + }, + + /** + * @function ImageCollectionService.prototype.getLegend + * @param {Object} queryParams query 参数。 + * @param {ImageRenderingRule} [queryParams.renderingRule] 指定影像显示的风格,包含拉伸显示方式、颜色表、波段组合以及应用栅格函数进行快速处理等。默认使用发布服务时所配置的风格。 + * @param {RequestCallback} callback - 回调函数。 + */ + getLegend: function getLegend(queryParams, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(this.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getLegend(queryParams); + }, + + /** + * @function ImageCollectionService.prototype.getStatistics + * @description 返回当前影像集合的统计信息。包括文件数量,文件大小等信息。 + * @param {RequestCallback} callback - 回调函数。 + */ + getStatistics: function getStatistics(callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getStatistics(); + }, + + /** + * @function ImageCollectionService.prototype.getTileInfo + * @description 返回影像集合所提供的服务瓦片的信息,包括:每层瓦片的分辨率,比例尺等信息,方便前端进行图层叠加。 + * @param {RequestCallback} callback - 回调函数。 + */ + getTileInfo: function getTileInfo(callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getTileInfo(); + }, + + /** + * @function ImageCollectionService.prototype.deleteItemByID + * @description 删除影像集合中指定ID (`featureId`)的Item对象,即从影像集合中删除指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + * @param {RequestCallback} callback - 回调函数。 + */ + deleteItemByID: function deleteItemByID(featureId, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(this.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.deleteItemByID(featureId); + }, + + /** + * @function ImageCollectionService.prototype.getItemByID + * @description 返回影像集合中指定ID (`featureId`)的Item对象,即返回影像集合中指定的影像。 + * @param {string} featureId Feature 的本地标识符。 + * @param {RequestCallback} callback - 回调函数。 + */ + getItemByID: function getItemByID(featureId, callback) { + var me = this; + var ImageCollectionService = new ImageCollectionService_ImageCollectionService(me.url, { + collectionId: me.options.collectionId, + proxy: me.options.proxy, + withCredentials: me.options.withCredentials, + crossOrigin: me.options.crossOrigin, + headers: me.options.headers, + eventListeners: { + scope: me, + processCompleted: callback, + processFailed: callback + } + }); + ImageCollectionService.getItemByID(featureId); + } +}); +var imageCollectionService = function imageCollectionService(url, options) { + return new ImageCollectionService(url, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/services/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/components/ComponentsViewBase.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. +* This program are made available under the terms of the Apache License, Version 2.0 +* which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class ComponentsViewBase + * @aliasclass Components.ComponentsViewBase + * @deprecatedclassinstance L.supermap.components.componentsViewBase + * @classdesc Lealfet 组件基类。 + * @category Components Common + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @extends {L.Control} + * @usage + */ + +var ComponentsViewBase = external_L_default().Control.extend({ + options: { + //控件位置 继承自leaflet control + position: 'topright', + //默认样式,以支持组件设置图层基本样式 + style: function style(feature, latLng) { + if (latLng + /*&& feature instanceof L.latLng || feature.geometry.type.toLowerCase() === "point"*/ + ) { + return external_L_default().circleMarker(latLng, { + fillColor: 'blue', + weight: 1, + opacity: 1, + color: 'blue', + fillOpacity: 0.6 + }); + } else { + return { + fillColor: 'blue', + weight: 1, + opacity: 1, + color: 'blue', + fillOpacity: 0.6 + }; + } + }, + onEachFeature: null + }, + initialize: function initialize(options) { + external_L_default().setOptions(this, options); //组件事件处理对象://todo 确认一些公开或私有的成员变量 + + this._event = new (external_L_default()).Evented(); //组件根 dom 元素: + + this.rootContainer = null; //图层参数,主要配置组件返回数据图层的样式和事件等 + }, + + /** + * @function ComponentsViewBase.prototype.onAdd + * @description 向地图添加组件。 + */ + onAdd: function onAdd(map) { + //子类实现此方法 + this.map = map; + this.rootContainer = this._initView(); + return this.rootContainer; + }, + + /** + * @function ComponentsViewBase.prototype.on + * @param {string} eventType - 监听的事件类型。 + * @param {function} callback - 监听事件的回调函数。 + */ + on: function on(eventType, callback) { + this._event.on(eventType, callback); + }, + + /** + * @function ComponentsViewBase.prototype.off + * @description 事件关闭。 + * @param {string} eventType - 监听的事件名。 + * @param {function} callback - 监听事件的回调函数。 + */ + off: function off(eventType, callback) { + this._event.off(eventType, callback); + }, + + /** + * @function ComponentsViewBase.prototype._initView + * @description 初始化组件 UI。 + * @private + */ + _initView: function _initView() {//子类实现此方法 + }, + + /** + * @function ComponentsViewBase.prototype._preventMapEvent + * @description 阻止 map 默认事件。 + * @private + */ + _preventMapEvent: function _preventMapEvent(div, map) { + if (!div || !map) { + return; + } + + div.addEventListener('mouseover', function () { + map.dragging.disable(); + map.scrollWheelZoom.disable(); + map.doubleClickZoom.disable(); + }); + div.addEventListener('mouseout', function () { + map.dragging.enable(); + map.scrollWheelZoom.enable(); + map.doubleClickZoom.enable(); + }); + } +}); +var componentsViewBase = function componentsViewBase(options) { + return new ComponentsViewBase(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/openfile/OpenFileViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + +/** + * @class OpenFileViewModel + * @aliasclass Components.OpenFileViewModel + * @deprecatedclassinstance L.supermap.components.openFileViewModel + * @classdesc 打开本地文件组件功能类,目前只支持 WGS84 经纬度坐标。 + * @version 9.1.1 + * @category Components OpenFile + * @param {L.Map} map - Leaflet Map 对象。 + * @fires OpenFileViewModel#filesizeexceed + * @fires OpenFileViewModel#errorfileformat + * @fires OpenFileViewModel#openfilesucceeded + * @fires OpenFileViewModel#openfilefailed + * @extends {L.Evented} + * @usage + */ + +var OpenFileViewModel = external_L_default().Evented.extend({ + initialize: function initialize() { + this.fileModel = new FileModel(); + }, + + /** + * @function OpenFileViewModel.prototype.readFile + * @description 打开文件并加载到地图。 + * @param {Object} fileEventObject - 本地文件对象。 + */ + readFile: function readFile(fileEventObject) { + var inputDom = fileEventObject.target; + var file = inputDom.files[0]; //文件大小限制 + + if (file.size > this.fileModel.FileConfig.fileMaxSize) { + // document.alert("File supports up to 10M."); + + /** + * @event OpenFileViewModel#filesizeexceed + * @description 超出文件大小限制后触发。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + this.fire("filesizeexceed", { + messageType: "warring", + message: Lang.i18n('msg_fileSizeExceeded') + }); + return false; + } + + var filePath = inputDom.value; + var fileName = file.name; + var fileType = ComponentsUtil.getFileType(fileName); //文件格式不支持 + + if (!fileType) { + // document.alert("Unsupported data type."); + + /** + * @event OpenFileViewModel#errorfileformat + * @description 文件格式不支持时触发。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + this.fire("errorfileformat", { + messageType: "failure", + message: Lang.i18n('msg_fileTypeUnsupported') + }); + return false; + } //文件类型限制 + + + if (fileName !== "") { + //给control 一份数据 + //todo MVVM模式 应该是数据变化触发数据变化的事件 + this.fileModel.set("loadFileObject", { + file: file, + filePath: filePath, + fileName: fileName, + fileType: fileType + }); //响应选中文件添加到地图 + + this._readData(); + } + }, + + /** + * @function OpenFileViewModel.prototype._readData + * @description 数据文件中的数据。 + * @private + */ + _readData: function _readData() { + var _this = this; + + //todo 需要测试另外两个 + var me = this; + var type = this.fileModel.loadFileObject.fileType; + FileReaderUtil.readFile(type, { + file: this.fileModel.loadFileObject.file, + path: this.fileModel.loadFileObject.filePath + }, function (data) { + //将数据统一转换为 geoJson 格式加载到底图 + FileReaderUtil.processDataToGeoJson(type, data, function (geojson) { + if (geojson) { + /** + * @event OpenFileViewModel#openfilesucceeded + * @description 打开文件成功。 + * @property {GeoJSONObject} result - GeoJSON 格式数据。 + * @property {string} layerName - 图层名。 + */ + _this.fire("openfilesucceeded", { + result: geojson, + layerName: _this.fileModel.loadFileObject.fileName.split('.')[0] + }); + } + }, function (e) { + me.fire("openfilefailed", { + messageType: "failure", + message: e + }); + }, _this); + }, function () { + /** + * @event OpenFileViewModel#openfilefailed + * @description 打开文件失败。 + * @property {string} messageType - 警告类型。 + * @property {string} message - 警告内容。 + */ + me.fire("openfilefailed", { + messageType: "failure", + message: Lang.i18n('msg_openFileFail') + }); + }, this); + } +}); +var openFileViewModel = function openFileViewModel(options) { + return new OpenFileViewModel(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/openfile/OpenFileView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class OpenFileView + * @aliasclass Components.OpenFileView + * @deprecatedclassinstance L.supermap.components.openFile + * @classdesc 打开文件组件,用于打开本地数据文件并加载到地图,目前支持打开.csv|.xls|.xlsx|.geojson|.json 格式,只支持 WGS84 经纬度坐标。 + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires OpenFileView#openfilesucceeded + * @fires OpenFileView#openfilefailed + * @extends {ComponentsViewBase} + * @category Components OpenFile + * @usage + */ + +var OpenFileView = ComponentsViewBase.extend({ + options: { + //绑定的底图图层 + layer: null + }, + initialize: function initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); //初始化 ViewModel: + + this.viewModel = new OpenFileViewModel(); + }, + + /** + * @function OpenFileView.prototype.setViewStyle + * @description 设置组件样式。 + * @param {string} styleName - css 样式名称。 + * @param {string} value - css 样式值。 + */ + setViewStyle: function setViewStyle(styleName, value) { + this.rootContainer.style[styleName] = value; + }, + + /** + * @function OpenFileView.prototype._initView + * @description 创建打开文件组件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView: function _initView() { + var _this = this; + + //初始化 view + var uploadContent = external_L_default().DomUtil.create('div', 'component-openfile'); + uploadContent.id = 'openFile'; + this.fileSelect = external_L_default().DomUtil.create('div', '', uploadContent); + this.label = external_L_default().DomUtil.create('label', 'component-openfile__span--select', this.fileSelect); + this.label.htmlFor = "input_file"; + external_L_default().DomUtil.create('div', 'supermapol-icons-upload', this.label); + var fileSpan = external_L_default().DomUtil.create('span', 'component-openfile__span', this.label); + fileSpan.appendChild(document.createTextNode(Lang.i18n('text_chooseFile'))); + this.fileInput = external_L_default().DomUtil.create('input', 'component-openfile__input', this.fileSelect); + this.fileInput.id = "input_file"; + this.fileInput.type = "file"; + this.fileInput.accept = ".json,.geojson,.csv,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"; + + this.fileInput.onchange = function (fileEventObject) { + _this.messageBox.closeView(); + + _this.viewModel.readFile(fileEventObject); + }; //增加提示框: + + + this.messageBox = new MessageBox(); //添加监听 + + this.viewModel.on("filesizeexceed", function (e) { + _this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("errorfileformat", function (e) { + _this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("openfilefailed", function (e) { + _this.messageBox.showView(e.message, e.messageType); + /** + * @event OpenFileView#openfilefailed + * @description 打开文件失败。 + * @property {Object} e - 事件对象。 + */ + + + _this._event.fire("openfilefailed", e); + }); + this.viewModel.on("readdatafail", function (e) { + _this.messageBox.showView(e.message, e.messageType); + }); + this.viewModel.on("openfilesucceeded", function (e) { + /** + * @event OpenFileView#openfilesucceeded + * @description 打开文件成功。 + * @property {Object} e - 事件对象。 + */ + _this._event.fire("openfilesucceeded", e); + }); // 阻止 map 默认事件 + + this._preventMapEvent(uploadContent, this.map); + + return uploadContent; + } +}); +var openFileView = function openFileView(options) { + return new OpenFileView(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/search/CityConfig.js +var config = { + HOT: { + HOT: ["北京市", "上海市", "广州市", "深圳市", "南京市", "杭州市", "天津市", "重庆市", "成都市", "青岛市", "苏州市", "无锡市", "常州市", "温州市", "武汉市", "长沙市", "南昌市", "三亚市", "合肥市", "石家庄市"] + }, + AB: { + A: ["阿拉善盟", "鞍山市", "安庆市", "安阳市", "阿坝藏族羌族自治州", "安顺市", "阿里地区", "安康市", "阿克苏地区", "阿勒泰地区", "阿拉尔市"], + B: ["北京市", "保定市", "包头市", "巴彦淖尔市", "本溪市", "白山市", "白城市", "蚌埠市", "亳州市", "滨州市", "北海市", "百色市", "白沙黎族自治县", "保亭黎族苗族自治县", "巴中市", "毕节地区", "保山市", "宝鸡市", "白银市", "博尔塔拉蒙古自治州", "巴音郭楞蒙古自治州", "北区"] + }, + CD: { + C: ["重庆市", "成都市", "常州市", "长沙市", "承德市", "沧州市", "长治市", "赤峰市", "朝阳市", "长春市", "滁州市", "巢湖市", "池州市", "常德市", "郴州市", "潮州市", "崇左市", "澄迈县", "昌江黎族自治县", "楚雄彝族自治州", "昌都地区", "昌吉回族自治州"], + D: ["大同市", "大连市", "丹东市", "大庆市", "大兴安岭地区", "东营市", "德州市", "东莞市", "儋州市", "东方市", "定安县", "德阳市", "达州市", "大理白族自治州", "德宏傣族景颇族自治州", "迪庆藏族自治州", "定西市", "东区", "大埔区", "大堂区"] + }, + EFG: { + E: ["鄂尔多斯市", "鄂州市", "恩施土家族苗族自治州"], + F: ["抚顺市", "阜新市", "阜阳市", "福州市", "抚州市", "佛山市", "防城港市"], + G: ["广州市", "赣州市", "桂林市", "贵港市", "广元市", "广安市", "贵阳市", "固原市", "高雄市", "高雄县", "甘南藏族自治州", "甘孜藏族自治州"] + }, + H: { + H: ["杭州市", "合肥市", "邯郸市", "衡水市", "呼和浩特市", "呼伦贝尔市", "葫芦岛市", "哈尔滨市", "鹤岗市", "黑河市", "淮安市", "湖州市", "淮南市", "淮北市", "黄山市", "菏泽市", "鹤壁市", "黄石市", "黄冈市", "衡阳市", "怀化市", "惠州市", "河源市", "贺州市", "河池市", "海口市", "红河哈尼族彝族自治州", "汉中市", "海东地区", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州", "果洛藏族自治州", "海西蒙古族藏族自治州", "哈密地区", "和田地区", "花莲县", "黄大仙区", "花地玛堂区"] + }, + J: { + J: ["晋城市", "晋中市", "锦州市", "吉林市", "鸡西市", "佳木斯市", "嘉兴市", "金华市", "景德镇市", "九江市", "吉安市", "济南市", "济宁市", "焦作市", "济源市", "荆门市", "荆州市", "江门市", "湛江市", "揭阳市", "嘉峪关市", "金昌市", "酒泉市", "基隆市", "嘉义市", "嘉义县", "九龙城区", "嘉模堂区"] + }, + KL: { + K: ["开封市", "昆明市", "克拉玛依市", "克孜勒苏柯尔克孜自治州", "喀什地区"], + L: ["廊坊市", "临汾市", "吕梁市", "辽阳市", "辽源市", "连云港市", "丽水市", "六安市", "龙岩市", "莱芜市", "临沂市", "聊城市", "洛阳市", "漯河市", "娄底市", "柳州市", "来宾市", "临高县", "乐东黎族自治县", "陵水黎族自治县", "泸州市", "乐山市", "凉山彝族自治州", "六盘水市", "丽江市", "临沧市", "拉萨市", "林芝地区", "兰州市", "陇南市", "临夏回族自治州"] + }, + MNP: { + M: ["牡丹江市", "马鞍山市", "茂名市", "梅州市", "绵阳市", "眉山市", "苗栗县"], + N: ["南京市", "南昌市", "南通市", "宁波市", "南平市", "宁德市", "南阳市", "南宁市", "南沙群岛", "内江市", "南充市", "怒江傈傈族自治州", "那曲地区", "南投县"], + P: ["盘锦市", "莆田市", "萍乡市", "平顶山市", "濮阳市", "攀枝花市", "平凉市", "屏东县", "澎湖县"] + }, + QR: { + Q: ["青岛市", "秦皇岛市", "齐齐哈尔市", "黔西南布依族苗族自治州", "七台河市", "衢州市", "泉州市", "潜江市", "清远市", "钦州市", "琼海市", "曲靖市", "庆阳市", "荃湾区", "黔东南苗族侗族自治州", "黔南布依族苗族自治州", "琼中黎族苗族自治县"], + R: ["日照市", "日喀则地区"] + }, + S: { + S: ["上海市", "深圳市", "苏州市", "石家庄市", "三亚市", "朔州市", "沈阳市", "四平市", "松原市", "双鸭山市", "绥化市", "宿迁市", "绍兴市", "宿州市", "三明市", "上饶市", "三门峡市", "商丘市", "十堰市", "随州市", "邵阳市", "韶关市", "汕头市", "汕尾市", "三亚市", "遂宁市", "思茅市", "山南地区", "商洛市", "石嘴山市", "石河子市", "深水埗区", "沙田区", "神农架林区", "圣安多尼堂区", "圣方济各堂区"] + }, + T: { + T: ["天津市", "唐山市", "太原市", "通辽市", "铁岭市", "通化市", "泰州市", "台州市", "铜陵市", "泰安市", "天门市", "屯昌县", "铜仁地区", "铜川市", "天水市", "吐鲁番地区", "塔城地区", "图木舒克市", "台北市", "台中市", "台南市", "台北县", "桃园县", "台中县", "台南县", "台东县", "屯门区"] + }, + W: { + W: ["无锡市", "温州市", "武汉市", "乌海市", "乌兰察布市", "芜湖市", "潍坊市", "威海市", "梧州市", "五指山市", "文昌市", "万宁市", "文山壮族苗族自治州", "渭南市", "武威市", "吴忠市", "乌鲁木齐市", "五家渠市", "湾仔区", "望德堂区"] + }, + X: { + X: ["邢台市", "忻州市", "兴安盟", "徐州市", "宣城市", "厦门市", "新余市", "新乡市", "许昌市", "信阳市", "襄樊市", "孝感市", "咸宁市", "仙桃市", "湘潭市", "西安市", "咸阳市", "西宁市", "新竹市", "新竹县", "西贡区", "锡林郭勒盟", "西沙群岛", "湘西土家族苗族自治州", "西双版纳傣族自治州"] + }, + Y: { + Y: ["阳泉市", "运城市", "营口市", "延边朝鲜族自治州", "伊春市", "盐城市", "扬州市", "鹰潭市", "宜春市", "烟台市", "宜昌市", "岳阳市", "益阳市", "永州市", "阳江市", "云浮市", "玉林市", "宜宾市", "雅安市", "玉溪市", "延安市", "榆林市", "玉树藏族自治州", "银川市", "伊犁哈萨克自治州", "宜兰县", "云林县", "油尖旺区", "元朗区"] + }, + Z: { + Z: ["郑州市", "张家口市", "镇江市", "舟山市", "漳州市", "淄博市", "枣庄市", "周口市", "驻马店市", "株洲市", "张家界市", "珠海市", "肇庆市", "中山市", "自贡市", "资阳市", "遵义市", "昭通市", "张掖市", "中卫市", "彰化县", "中西区", "中沙群岛的岛礁及其海域"] + } +}; +;// CONCATENATED MODULE: ./src/leaflet/components/commonmodels/GeoJsonLayersModel.js +function GeoJsonLayersModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GeoJsonLayersModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoJsonLayersModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoJsonLayersModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoJsonLayersModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + +/** + * @class GeoJsonLayersDataModel + * @aliasclass Components.GeoJsonLayersDataModel + * @deprecatedclassinstance L.supermap.components.GeoJsonLayersDataModel + * @description 多图层数据模型。 + * @category Components Common + * @private + * @param {Array.} layers - 图层数组。 + * @param {GeoJSONLayerWithName} layers.layerObject - 含有 layerName 与 GeoJSON 图层的对象。 + * @fires GeoJsonLayersDataModel#newlayeradded + * @usage + */ +// todo 看看如何完善 + +var GeoJsonLayersDataModel = /*#__PURE__*/function () { + function GeoJsonLayersDataModel(layers) { + GeoJsonLayersModel_classCallCheck(this, GeoJsonLayersDataModel); + + this.layers = []; + + if (layers && layers.length > 0) { + this.addLayers(layers); + } + + this.currentLayerDataModel = null; + } + + GeoJsonLayersModel_createClass(GeoJsonLayersDataModel, [{ + key: "addLayers", + value: function addLayers(layers, success, failed, context) { + for (var i = 0; i < layers.length; i++) { + var layerName = layers[i].layerName; + + if (layers[i].layer instanceof (external_L_default()).GeoJSON) { + var geoJsonLayerDataModel = new GeoJsonLayerDataModel(layers[i].layer); //赋给 GeoJsonLayersDataModel 对象 layerName 属性,每个图层名对应一个 layerDataModel 对象 + + this.layers[layerName] = geoJsonLayerDataModel; + success && success.call(context, { + layerName: layerName, + layer: geoJsonLayerDataModel + }); + } else { + failed && failed.call(context, ""); + } + } + } + /** + * @function GeoJsonLayersDataModel.prototype.setCurrentLayerDataModel + * @description 设置当前选中的图层。 + * @param {string} layerName - 选中的图层名称。 + */ + + }, { + key: "setCurrentLayerDataModel", + value: function setCurrentLayerDataModel(layerName) { + if (this.layers[layerName]) { + this.currentLayerDataModel = this.layers[layerName]; + } + } + }]); + + return GeoJsonLayersDataModel; +}(); +/** + * @class GeoJsonLayerDataModel + * @classdesc 图层数据模型,可用于图层要素数据、属性管理等。 + * @category Components Common + * @param {L.GeoJSON} layer - GeoJSON 图层。 + * 注:leaflet 没有 feature 的概念 + * @usage + */ + +var GeoJsonLayerDataModel = /*#__PURE__*/function () { + function GeoJsonLayerDataModel(layer) { + GeoJsonLayersModel_classCallCheck(this, GeoJsonLayerDataModel); + + //图层对象 + this.layer = layer; //要素图层数组 + + this.features = layer.getLayers(); //图层属性字段 + + this.attributeNames = []; //这里一个图层默认共用一套属性字段 + + if (this.features[0].feature.properties) { + for (var field in this.features[0].feature.properties) { + this.attributeNames.push(field); + } + } //指定图层操作属性字段 + + + this.operatingAttributeNames = []; //图层属性对象 + + this.attributes = {}; + } + /** + * @function GeoJsonLayerDataModel.prototype.setOperatingAttributeNames + * @description 指定操作字段。 + * @param {Array.} operatingAttr - 查询属性字段数组,该数组为 this.attributeNames 的子集。 + */ + + + GeoJsonLayersModel_createClass(GeoJsonLayerDataModel, [{ + key: "setOperatingAttributeNames", + value: function setOperatingAttributeNames(operatingAttr) { + this.operatingAttributeNames = operatingAttr; + } + /** + * @function GeoJsonLayerDataModel.prototype.getAllAttributeNames + * @description 获取图层所有属性名称。 + * @returns {Array.} 返回图层所有属性名称。 + */ + + }, { + key: "getAllAttributeNames", + value: function getAllAttributeNames() { + return this.attributeNames; + } + /** + * @function GeoJsonLayerDataModel.prototype.getAttributeNamesByType + * @description 获取指定类型的图层属性字段。 + * @param {string} [type] - 类型参数。默认返回所有字段,可选 'Num'。 + * @returns {Array.} 返回指定类型的图层属性字段。 + */ + + }, { + key: "getAttributeNamesByType", + value: function getAttributeNamesByType(type) { + //图层属性字段 + if (this.features[0].feature.properties) { + var properties = this.features[0].feature.properties; + var attributeNames = []; + + if (type === 'Num') { + for (var field in properties) { + if (!isNaN(properties[field])) { + attributeNames.push(field); + } + } + } else { + attributeNames = this.attributeNames; + } + + return attributeNames; + } + } + /** + * @function GeoJsonLayerDataModel.prototype.getAllFeatures + * @description 获取图层所有要素。 + * @returns {Array.} 返回图层所有要素。 + */ + + }, { + key: "getAllFeatures", + value: function getAllFeatures() { + return this.features; + } + /** + * @function GeoJsonLayerDataModel.prototype.getAttributeValueByAttributeName + * @description 获取属性值。 + * @param {string} attributeName - 属性名称。 + * @returns {Object} 返回属性值对象。 + */ + + }, { + key: "getAttributeValueByAttributeName", + value: function getAttributeValueByAttributeName(attributeName) { + //如果图层属性对象中已存在该属性,则直接返回 + if (this.attributes[attributeName]) { + return this.attributes[attributeName]; + } //若图层属性对象还未存储该属性,则遍历每个feature 读取其属性值,并存储到图层属性对象中 + + + this.attributes[attributeName] = []; + + for (var i = 0; i < this.features.length; i++) { + this.attributes[attributeName].push([this.features[i].feature.properties[attributeName]]); + } + + return this.attributes[attributeName]; + } //getAttributeValueByAttributeName(feature,attributeName) + //getAllFeatures() + //todo getFeatureByID() + //getFeaturesByKeywords(keyword,searchAttributeNames) + //getAllAttributeValues(attributeName) ?? + //getAllAttributeNames() + + /** + * @function GeoJsonLayerDataModel.prototype.getFeaturesByKeyWord + * @description 查询要素对象。 + * @param {string} keyWord - 查询关键字。 + * @returns {Array.} 返回要素对象数组。 + */ + + }, { + key: "getFeaturesByKeyWord", + value: function getFeaturesByKeyWord(keyWord) { + var features = [], + keyReg = new RegExp(keyWord.toLowerCase()); + var self = this; + this.features.forEach(function (feature) { + if (!feature.feature.properties) { + return null; + } + + var fAttr = feature.feature.properties; + var operatingAttributeNames; //若设置了过滤字段,则按过滤字段查询 + + if (self.operatingAttributeNames.length > 0) { + operatingAttributeNames = self.operatingAttributeNames; + } else { + //若未设置了过滤字段,则按图层字段查询 + operatingAttributeNames = self.attributeNames; + } //遍历要素,查询符合条件的要素 + + + for (var i = 0, len = operatingAttributeNames.length; i < len; i++) { + if (fAttr[operatingAttributeNames[i]] && keyReg.test(fAttr[operatingAttributeNames[i]].toString().toLowerCase())) { + var filterAttributeName = operatingAttributeNames[i]; + var filterAttributeValue = fAttr[operatingAttributeNames[i]]; //将查询出的属性字段及属性值赋给 feature 并返回 + + feature.filterAttribute = { + filterAttributeName: filterAttributeName, + filterAttributeValue: filterAttributeValue + }; + features.push(feature); + break; + } + } + }); + return features; + } + }]); + + return GeoJsonLayerDataModel; +}(); +;// CONCATENATED MODULE: ./src/leaflet/components/search/SearchViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class SearchViewModel + * @aliasclass Components.SearchViewModel + * @deprecatedclassinstance L.supermap.components.searchViewModel + * @classdesc 图层查询组件功能类。 + * @version 9.1.1 + * @category Components Search + * @param {L.Map} map - Leaflet Map 对象。 + * @param {Object} options - 参数。 + * @param {Object} [options.cityGeoCodingConfig] - 城市地址匹配服务配置,包括:{addressUrl:"",key:""},默认为 online 本地搜索服务。 + * @fires SearchViewModel#newlayeradded + * @fires SearchViewModel#searchlayersucceeded + * @fires SearchViewModel#searchfailed + * @fires SearchViewModel#geocodesucceeded + * @extends {L.Evented} + * @usage + */ + +var SearchViewModel = external_L_default().Evented.extend({ + options: { + cityGeoCodingConfig: { + addressUrl: "https://www.supermapol.com/iserver/services/localsearch/rest/searchdatas/China/poiinfos", + key: "fvV2osxwuZWlY0wJb8FEb2i5" + } + }, + initialize: function initialize(map, options) { + if (map) { + /** + * @member {L.Map} SearchViewModel.prototype.map + * @description 当前组件所在的地图。 + */ + this.map = map; + } else { + return new Error("Cannot find map, fileModel.map cannot be null."); + } + + external_L_default().Util.setOptions(this, options); //初始化Model + + this.dataModel = new GeoJsonLayersDataModel(); //初始话地址匹配服务 + + this.geoCodeParam = { + keyWords: '北京市', + city: "北京市", + pageSize: this.options.pageSize, + pageNum: this.options.pageNum + }; //查询缓存 + + this.searchCache = {}; + }, + + /** + * @function SearchViewModel.prototype.search + * @description 查询。 + * @param {string} keyWords - 查询的关键字。 + * @param {string} [searchLayerName] - 执行的查询类型,支执行矢量图层属性查询,当为 "geocode" 则执行地址匹配。 + */ + search: function search(keyWord, searchLayerName) { + if (!searchLayerName) { + this.searchFromCityLocalSearchService(keyWord); + } else { + this.searchFromLayer(keyWord, searchLayerName); + } + }, + + /** + * @function SearchViewModel.prototype.searchFromLayer + * @description 图层属性查询。 + * @param {string} searchLayerName - 查询的图层名。 + * @param {string} keyWord - 图层属性搜索关键字。 + */ + searchFromLayer: function searchFromLayer(keyWord, searchLayerName) { + if (this.dataModel.layers[searchLayerName]) { + var resultFeatures = this.dataModel.layers[searchLayerName].getFeaturesByKeyWord(keyWord); + + if (resultFeatures && resultFeatures.length > 0) { + /** + * @event SearchViewModel#searchlayersucceeded + * @description 图层属性查询成功后触发。 + * @property {Object} result - 图层数据。 + */ + this.fire("searchlayersucceeded", { + result: resultFeatures + }); + } else { + /** + * @event SearchViewModel#searchfailed + * @description 图层属性查询失败后触发。 + * @property {string} searchType - 图层属性查询状态。 + */ + this.fire("searchfailed", { + searchType: "searchLayersField" + }); + } + } + }, + + /** + * @function SearchViewModel.prototype.searchFromCityLocalSearchService + * @description 城市地址匹配查询。 + * @param {string} keyWords - 城市地址匹配查询关键字。 + */ + searchFromCityLocalSearchService: function searchFromCityLocalSearchService(keyWords) { + //todo 是否保留缓存?请求过的数据保留一份缓存? + if (this.searchCache[keyWords]) { + /** + * @event SearchViewModel#geocodesucceeded + * @description 城市地址匹配成功后触发。 + * @property {Object} result - 城市匹配成功后返回的数据。 + */ + this.fire("geocodesucceeded", { + result: this.searchCache[keyWords] + }); + } else { + this.geoCodeParam.keyWords = keyWords || this.geoCodeParam.city; + var self = this; + + var url = this._getSearchUrl(this.geoCodeParam); + + FetchRequest.get(url).then(function (response) { + return response.json(); + }).then(function (geocodingResult) { + if (geocodingResult.error || geocodingResult.poiInfos.length === 0) { + self.fire("searchfailed", { + searchType: "searchGeocodeField" + }); + return; + } + + if (geocodingResult.poiInfos) { + var geoJsonResult = self._dataToGeoJson(geocodingResult.poiInfos, self.geoCodeParam); + + self.fire("geocodesucceeded", { + result: geoJsonResult + }); + } + }); + } + }, + + /** + * @function SearchViewModel.prototype.addSearchLayers + * @description 添加新的可查询图层。 + * @param {Array.} layers - 新添加的图层对象。 + */ + addSearchLayers: function addSearchLayers(layers) { + var _this = this; + + this.dataModel.addLayers(layers, function (e) { + /** + * @event SearchViewModel#newlayeradded + * @description 添加查询图层事件。 + * @property {Object} result - 事件返回的新的查询图层对象。 + * @property {string} layerName - 事件返回的新的查询图层对象名。 + */ + _this.fire("newlayeradded", { + layerName: e.layerName + }); + }, null, this); + }, + + /** + * @function SearchViewModel.prototype.panToLayer + * @description 缩放到指定图层。 + * @param {string} layerName - 指定缩放的图层名。 + */ + panToLayer: function panToLayer(layerName) { + if (this.dataModel.layers[layerName]) { + this.map.flyToBounds(this.dataModel.layers[layerName].layer.getBounds()); + } + }, + + /** + * @function SearchViewModel.prototype.panToCity + * @description 缩放到指定城市。 + * @param {string} city - 指定缩放的城市名。 + */ + panToCity: function panToCity(city) { + this.geoCodeParam.keyWords = city; + this.geoCodeParam.city = city; + var self = this; + + var url = this._getSearchUrl(this.geoCodeParam); + + FetchRequest.get(url).then(function (response) { + return response.json(); + }).then(function (geocodingResult) { + if (geocodingResult.poiInfos.length > 0) { + //缩放至城市 + var center = external_L_default().latLng(geocodingResult.poiInfos[0].location.y, geocodingResult.poiInfos[0].location.x); + self.map.setView(center, 8); + } else { + self.fire("searchfailed", { + searchType: "cityGeocodeField" + }); + } + }); + }, + + /** + * @description 将地址匹配返回的数据转为 GeoJSON 格式数据。 + * @param data + * @private + */ + _dataToGeoJson: function _dataToGeoJson(data, geoCodeParam) { + var features = []; + + for (var i = 0; i < data.length; i++) { + var feature = { + type: "Feature", + geometry: { + type: "Point", + coordinates: [data[i].location.x, data[i].location.y] + }, + properties: { + name: data[i].name || geoCodeParam.keyWords, + address: data[i].formatedAddress || data[i].address + } + }; + features.push(feature); + } + + return features; + }, + + /** + * @function SearchViewModel.prototype._getSearchUrl + * @description 获取地理编码查询地址。 + * @param {Object} geoCodeParam - 地理编码查询参数。 + * @private + */ + _getSearchUrl: function _getSearchUrl(geoCodeParam) { + var url = this.options.cityGeoCodingConfig.addressUrl + ".json?keywords=".concat(geoCodeParam.keyWords, "&city=").concat(geoCodeParam.city, "&pageSize=").concat(geoCodeParam.pageSize, "&pageNum=").concat(geoCodeParam.pageNum, "&key=").concat(this.options.cityGeoCodingConfig.key); + return url; + } +}); +var searchViewModel = function searchViewModel(options) { + return new SearchViewModel(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/search/SearchView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class SearchView + * @aliasclass Components.Search + * @deprecatedclassinstance L.supermap.components.search + * @classdesc 图层查询组件。 + * @category Components Search + * @version 9.1.1 + * @param {Object} options - 参数。 + * @param {Object|Array.} [options.cityConfig] - 城市地址匹配配置,默认为全国城市,与 options.cityGeoCodingConfig 支持匹配的服务对应; + * 配置两种格式:{key1:{A:[],B:[]}, key2:{C:[],D:[]}} 或 ["成都市","北京市"],用户可根据自己的项目需求进行配置。 + * @param {Object} [options.cityGeoCodingConfig] - 城市地址匹配服务配置,包括:{addressUrl:"",key:""} 默认为 online 地址匹配服务,与 options.cityConfig 对应。 + * @param {boolean} [options.isGeoCoding=true] - 是否支持城市地址匹配功能。 + * @param {number} [options.pageSize=10] - 地址匹配查询返回记录结果数,最大设置为 20。 + * @param {number} [options.pageNum=1] - 地址匹配查询分页页码,默认 1 代表第一页。 + * @param {number} [options.perPageDataNum=8] - 每页显示个数,最大值为 8。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @extends {ComponentsViewBase} + * @fires SearchView#searchlayersucceeded + * @fires SearchView#searchfailed + * @fires SearchView#geocodesucceeded + * @usage + */ + +var SearchView = ComponentsViewBase.extend({ + options: { + cityConfig: config, + cityGeoCodingConfig: { + addressUrl: "https://www.supermapol.com/iserver/services/localsearch/rest/searchdatas/China/poiinfos", + key: "fvV2osxwuZWlY0wJb8FEb2i5" + }, + isGeoCoding: true, + pageSize: 10, + pageNum: 1, + perPageDataNum: 8 + }, + initialize: function initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); //当前选中查询的图层名: + + this.currentSearchLayerName = ""; + this.isSearchLayer = false; + this.perPageDataNum = this.options.perPageDataNum; + }, + + /*------以下是一些接口-----*/ + + /** + * @function SearchView.prototype.onAdd + * @description 向底图添加组件。 + * @private + * @override + */ + onAdd: function onAdd(map) { + //初始化组件业务逻辑执行对象 viewModel + this.viewModel = new SearchViewModel(map, this.options); + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function SearchView.prototype.addSearchLayer + * @description 添加可查询的图层。 + * @param {Array.|L.GeoJSON} layers - 可查询的图层。 + */ + addSearchLayer: function addSearchLayer(layers) { + //将可查询图层数据传入vm处理 + this.viewModel.addSearchLayers(layers); + }, + + /*----------以下是创建 dom 元素的方法---------*/ + + /** + * @function SearchView.prototype._initView + * @description 创建地址匹配或图层要素查询组件。 + * @override + * @returns {HTMLElement} + * @private + */ + _initView: function _initView() { + var _this = this; + + // self 便于 this 对象的使用 + var self = this; + var div = document.createElement("div"); + div.setAttribute("class", "component-search-container"); //外框 + + var poiContainer = document.createElement("div"); + poiContainer.setAttribute("class", "component-search"); //主体 + //---------下拉框: + + var poiSettings = document.createElement("div"); + poiSettings.setAttribute("class", "component-search__settings"); //下拉框 + + var poiSearchName = document.createElement("div"); //由View 维护,进行交互操作 + + poiSearchName.setAttribute("class", "component-search__settings__name"); //poiSettings.innerHTML 通过下拉框选项改变 + + poiSettings.appendChild(poiSearchName); //下拉标记 + + var triangleIcon = document.createElement("span"); + triangleIcon.setAttribute("class", "supermapol-icons-solid-down-triangle"); + poiSettings.appendChild(triangleIcon); //城市地址匹配页面, 以及图层查询页面 + //城市地址匹配页面: + + var citySelect = null; + + if (this.options.isGeoCoding) { + var cityTabsPageObj = new CityTabsPage({ + config: this.options.cityConfig + }); + citySelect = cityTabsPageObj.getElement(); //点选城市名,修改显示,并执行定位城市查询【城市列表列表点击事件】 + + cityTabsPageObj.content.onclick = function (e) { + if (e.target.nodeName === "SPAN" && e.target.innerText) { + _this.viewModel.panToCity(e.target.innerHTML); + + _this.messageBox.closeView(); + + poiSearchName.removeChild(poiSearchName.firstChild); + poiSearchName.insertBefore(document.createTextNode(e.target.innerHTML), poiSearchName.firstChild); + _this.isSearchLayer = false; + } + }; //支持城市地址匹配,则初始化显示配置的第一个城市名: + + + poiSearchName.appendChild(document.createTextNode(cityTabsPageObj.content.getElementsByTagName("span")[0].innerText)); + } //图层查询页面:写法是为了为了代码可读性 + + + var layersSelect = function () { + var layersSelect = document.createElement("div"); + layersSelect.setAttribute("class", "component-search__layers"); + var layersContent = document.createElement("div"); + layersContent.setAttribute("class", "component-search-layers-content"); + layersSelect.appendChild(layersContent); //header todo 两个选项的功能暂没用到,先关闭,后续用到再打开 + + var layersHeader = document.createElement("div"); + layersHeader.setAttribute("class", "component-search__layers__header"); //加载搜索条件 + + var loadBtn = document.createElement("div"); + loadBtn.setAttribute("class", "load-btn"); + layersHeader.appendChild(loadBtn); + var loadIcon = document.createElement("span"); + loadIcon.setAttribute("class", "supermapol-icons-poi-load"); + loadBtn.appendChild(loadIcon); + var loadBtnText = document.createElement("span"); + loadBtnText.appendChild(document.createTextNode(Lang.i18n("text_loadSearchCriteria"))); + loadBtn.appendChild(loadBtnText); //保存搜索条件 + + var saveBtn = document.createElement("div"); + saveBtn.setAttribute("class", "save-btn"); + layersHeader.appendChild(saveBtn); + var icon = document.createElement("span"); + icon.setAttribute("class", "supermapol-icons-poi-save"); + saveBtn.appendChild(icon); + var saveBtnText = document.createElement("span"); + saveBtnText.appendChild(document.createTextNode(Lang.i18n("text_saveSearchCriteria"))); + saveBtn.appendChild(saveBtnText); //body + + var layerSelectOptions = document.createElement("div"); + layerSelectOptions.setAttribute("class", "component-search__layers__body"); //选中查询图层监听 + //选择查询图层【图层列表点击事件】 + + layerSelectOptions.onclick = function (e) { + //先进行清除操作 + self.clearSearchResult(); + var selectLayerOption = null; + + if (e.target.classList[0] === "component-search__layers__itme__singleselect") { + selectLayerOption = e.target; + } else if (e.target.classList[0] === "component-single-default-img" || e.target.classList[0] === "single-label") { + selectLayerOption = e.target.parentNode; + } else { + return; + } + + if (document.getElementsByClassName("component-single-checked-img").length > 0) { + document.getElementsByClassName("component-single-checked-img")[0].setAttribute("class", "component-single-default-img"); + } + + selectLayerOption.firstChild.setAttribute("class", "component-single-checked-img"); + self.currentSearchLayerName = selectLayerOption.lastChild.innerText; + self.isSearchLayer = true; + poiSearchName.removeChild(poiSearchName.firstChild); + poiSearchName.insertBefore(document.createTextNode(self.currentSearchLayerName), poiSearchName.firstChild); + self.viewModel.panToLayer(self.currentSearchLayerName); + self.messageBox.closeView(); + }; + + layersContent.appendChild(layerSelectOptions); //读取当前图层数据,并展现 + //只有调用添加查询图层接口才能添加图层选项 + + return layersSelect; + }(); //配置开启 城市匹配功能则添加 + + + var navTabs = []; + + if (citySelect) { + navTabs.push({ + title: Lang.i18n("title_searchCity"), + content: citySelect + }); + } + + navTabs.push({ + title: Lang.i18n("title_searchLayer"), + content: layersSelect + }); + var navTabsPageObject = new NavTabsPage({ + tabs: navTabs + }); + var navTabsPage = navTabsPageObject.getElement(); + navTabsPageObject.closeView(); + poiContainer.appendChild(navTabsPage); + + poiSettings.onclick = function () { + if (navTabsPage.hidden) { + navTabsPageObject.showView(); + } else { + navTabsPageObject.closeView(); + } + }; + + poiContainer.appendChild(poiSettings); //初始时,下拉框若没赋值显示信息,则再次赋值: + + if (!poiSearchName.innerText) { + poiSearchName.appendChild(document.createTextNode(Lang.i18n("text_label_chooseSearchLayers"))); + } //---------下拉框 END + //---------搜索输入框: + + + var poiInputContainer = document.createElement("div"); + poiInputContainer.setAttribute("class", "component-search__input"); + var poiInput = document.createElement("input"); + poiInput.type = "text"; + poiInput.placeholder = Lang.i18n("text_label_searchTips"); + poiInputContainer.appendChild(poiInput); //由View 维护,进行交互操作 + + this.poiInput = poiInput; //清除输入内容按钮: + + var poiInputClose = document.createElement("span"); + poiInputClose.setAttribute("class", "supermapol-icons-close"); + poiInputClose.hidden = true; + poiInputContainer.appendChild(poiInputClose); + poiContainer.appendChild(poiInputContainer); //---------搜索输入框 END + //--------搜索按钮: + + var searchBtn = document.createElement("div"); + searchBtn.setAttribute("class", "component-search-icon supermapol-icons-search"); //查询结果页面 + + var resultDomObj = new PaginationContainer(); + this._resultDomObj = resultDomObj; //查询要素或匹配要素【搜索按钮点击事件】 + + searchBtn.onclick = function () { + //若是遮挡结果显示,则关闭 + resultDomObj.closeView(); + + _this.clearSearchResult(); + + _this.messageBox.closeView(); + + navTabsPageObject.closeView(); + + var keyWord = _this.poiInput.value.trim(); + + if (keyWord === "") { + _this.messageBox.showView(Lang.i18n('msg_searchKeywords')); + + return; + } + + if (_this.isSearchLayer) { + _this.viewModel.search(keyWord, _this.currentSearchLayerName); + } else { + _this.viewModel.search(keyWord); + } + }; //【输入框输入内容回车事件】 + + + poiInput.onkeypress = function (e) { + //.which属性判断按下的是哪个键,回车键的键位序号为13 + if (e.which == 13) { + //手动触发 searchBtn 得点击事件,执行查询操作 + var evt = document.createEvent("HTMLEvents"); + evt.initEvent("click", false, true); + searchBtn.dispatchEvent(evt); + } + }; + + poiContainer.appendChild(searchBtn); //--------搜索按钮 END + + var resultContainer = function createResultPage() { + var resultContainer = resultDomObj.getElement(); + resultContainer.style.position = "absolute"; + resultContainer.style.top = "44px"; + resultContainer.style.right = "0"; //先关闭结果界面,当有数据时再打开 + + resultDomObj.closeView(); //【结果列表点击事件】,以支持联动map上对应要素: + + resultDomObj.content.onclick = function (e) { + var selectFeatureOption = null; + + if (e.target.parentNode.className === "component-search-result-info") { + selectFeatureOption = e.target.parentNode.parentNode; + } else if (e.target.parentNode.className === "component-search__resultitme") { + selectFeatureOption = e.target.parentNode; + } else if (e.target.className === "component-search__resultitme") { + selectFeatureOption = e.target; + } else { + return; + } //修改 + + + if (document.getElementsByClassName("component-search__resultitme-selected").length > 0) { + document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"); + } + + selectFeatureOption.firstChild.classList.add("component-search__resultitme-selected"); + var filter = selectFeatureOption.children[1].firstChild.innerText; //联动地图上要素响应 + + self._linkageFeature(filter); + }; + + return resultContainer; + }(); + + poiContainer.appendChild(resultContainer); //清除输入框内容【输入框删除按钮点击事件】 + + poiInputClose.onclick = function (e) { + _this.clearSearchResult(); + + poiInput.value = ""; + e.target.hidden = true; + resultDomObj.closeView(); + }; //【输入框输入内容事件】 + + + poiInput.oninput = function () { + poiInputClose.hidden = false; + }; //添加提示框 + + + this.messageBox = new MessageBox(); //绑定 VM 的监听 + + this._addViewModelListener(); + + div.appendChild(poiContainer); //阻止 map 默认事件 + + this._preventMapEvent(div, this.map); + + return div; + }, + + /** + * @function SearchView.prototype._createSearchLayerItem + * @description 创建查询图层选项。 + * @private + */ + _createSearchLayerItem: function _createSearchLayerItem(layerName) { + var layerOption = document.createElement("div"); + layerOption.setAttribute("class", "component-search__layers__itme"); // 创建圆形单选框 + + var singleSelect = document.createElement("div"); + singleSelect.setAttribute("class", "component-search__layers__itme__singleselect"); + var singleIcon = document.createElement("div"); + singleIcon.setAttribute("class", "component-single-default-img"); + singleSelect.appendChild(singleIcon); + var singleLabel = document.createElement("span"); + singleLabel.setAttribute("class", "single-label"); + singleLabel.innerHTML = layerName; + singleSelect.appendChild(singleLabel); + layerOption.appendChild(singleSelect); //attributes-select todo 暂不支持该功能 + // const attributesSelect = (new ComponentSelect(layer.layer.attributeNames)).getElement(); + //选择查询的字段 todo 限制图层查找属性功能待属性选择框优化后完善 + + /*attributesSelect.onchange = (e) => { + this.searchAttributes = e.target.value; + };*/ + // layerOption.appendChild(attributesSelect); + + document.getElementsByClassName("component-search__layers__body")[0].appendChild(layerOption); + }, + + /** + * @function SearchView.prototype._createResultItem + * @description 创建查询结果列表。 + * @private + */ + _createResultItem: function _createResultItem(featureType, properties) { + var item = document.createElement("div"); + item.setAttribute("class", "component-search__resultitme"); + var icon = document.createElement("div"); + + if (featureType === "Point" || featureType === "MultiPoint") { + icon.setAttribute("class", "supermapol-icons-marker-layer component-search-result-icon"); + } else if (featureType === "LineString" || featureType === "MultiLineString ") { + icon.setAttribute("class", "supermapol-icons-line-layer component-search-result-icon"); + } else if (featureType === "Polygon" || featureType === "MultiPolygon") { + icon.setAttribute("class", "supermapol-icons-polygon-layer component-search-result-icon"); + } else { + icon.setAttribute("class", "supermapol-icons-point-layer component-search-result-icon"); + } + + item.appendChild(icon); + var info = document.createElement("div"); + info.setAttribute("class", "component-search-result-info"); + var info1 = document.createElement("div"); + info.appendChild(info1); + var info2 = document.createElement("div"); //分地址匹配和图层搜索的两种数据展现形式: + + if (properties.name) { + info1.innerHTML = properties.name; + info2.innerHTML = properties.address; + info.appendChild(info2); + } else { + info1.innerHTML = properties.filterAttributeName + ": " + properties.filterAttributeValue; + } + + item.appendChild(info); //暂时删除复选框UI + + var check = document.createElement("div"); + check.setAttribute("class", "component-checkbox component-checkbox-default-img"); // item.appendChild(check); + + return item; + }, + + /*----------对 VM 的一些事件监听 ----------*/ + + /** + * @function SearchView.prototype._addViewModelListener + * @description 绑定对 VM 的事件监听。 + * @private + */ + _addViewModelListener: function _addViewModelListener() { + var _this2 = this; + + //----可查询图层变化监听 + this.viewModel.on("searchlayerschanged", function (layers) { + for (var i = 0; i < layers.length; i++) { + _this2._createSearchLayerItem(layers[i]); + } + }); //----可查询图层变化监听 + + this.viewModel.on("newlayeradded", function (e) { + _this2._createSearchLayerItem(e.layerName); + }); //----图层查询结果监听 + + this.viewModel.on("searchlayersucceeded", function (e) { + var data = e.result; + + _this2.clearSearchResult(); + + _this2.searchResultLayer = external_L_default().featureGroup(data, { + pointToLayer: _this2.options.style, + style: _this2.options.style + }).bindPopup(function (layer) { + if (layer.feature.properties) { + return new AttributesPopContainer({ + attributes: layer.feature.properties + }).getElement(); + } + }).addTo(_this2.map); + + _this2.searchResultLayer.eachLayer(function (layer) { + _this2.options.onEachFeature ? _this2.options.onEachFeature(layer.toGeoJSON(), layer) : _this2._featureOnclickEvent.bind(_this2)(layer.toGeoJSON(), layer); + }); + + _this2.searchLayersData = data; //查询结果列表: + + _this2._prepareResultData(data); + /** + * @event SearchView#searchlayersucceeded + * @description 图层查询成功后触发。 + * @property {Object} result - 事件返回的 GeoJSON 格式数据对象。 + */ + + + _this2._event.fire("searchlayersucceeded", { + result: _this2.searchResultLayer.toGeoJSON() + }); + }); //----地址匹配服务监听 + + this.viewModel.on("geocodesucceeded", function (e) { + var data = e.result; //先清空当前有的地址匹配图层 + + _this2.clearSearchResult(); + + _this2.searchResultLayer = external_L_default().geoJSON(data, { + pointToLayer: _this2.options.style, + style: _this2.options.style, + onEachFeature: _this2.options.onEachFeature || _this2._featureOnclickEvent.bind(_this2) + }).bindPopup(function (layer) { + if (layer.feature.properties) { + return new AttributesPopContainer({ + attributes: layer.feature.properties + }).getElement(); + } + }).addTo(_this2.map); + _this2.searchLayersData = data; //查询结果列表: + + _this2._prepareResultData(data); + /** + * @event SearchView#geocodesucceeded + * @description 地址匹配服务成功后触发。 + * @property {Object} result - 事件返回的 GeoJSON 格式数据对象。 + */ + + + _this2._event.fire("geocodesucceeded", { + result: data + }); + }); //----地址匹配或图层查询失败监听 + + this.viewModel.on("searchfailed", function (e) { + var message = ""; + + if (e.searchType === "searchGeocodeField") { + message = Lang.i18n("msg_searchGeocodeField"); + } else if (e.searchType === "cityGeocodeField") { + message = Lang.i18n("msg_cityGeocodeField"); + } else { + message = Lang.i18n("msg_getFeatureField"); + } + + _this2.messageBox.showView(message); + /** + * @event SearchView#searchfailed + * @description 图层属性查询失败后触发。 + * @property {string} message - 失败原因。 + */ + + + _this2._event.fire("searchfailed", { + message: message + }); + }); + }, + + /*-------以下是一些辅助性功能函数 -------*/ + + /** + * @function SearchView.prototype._prepareResultData + * @description 展示数据。 + * @param {Array.} data - 图层查询或地址匹配返回的要素数据数组。 + * @private + */ + _prepareResultData: function _prepareResultData(data) { + this.currentResult = data; //向下取舍,这只页码 + + var pageCounts = Math.ceil(data.length / this.perPageDataNum); + + this._resultDomObj.setPageLink(pageCounts); //初始结果页面内容: + + + this._createResultListByPageNum(1, data); + + this._resultDomObj.showView(); //给页面模板设置联动事件 + + + this._resultDomObj.setLinkageEvent(_linkageEvent); + + var self = this; + + function _linkageEvent(page) { + self._createResultListByPageNum(page, self.currentResult); + } + }, + + /** + * @function SearchView.prototype._createResultListByPageNum + * @description 填充内容。 + * @param {number} page - 页数。 + * @param {Array.} data - 图层查询或地址匹配返回的要素数据数组。 + * @private + */ + _createResultListByPageNum: function _createResultListByPageNum(page, data) { + var start = 0, + end; + + if (page === 1 && data.length < this.perPageDataNum) { + //data数据不满8个时: + end = data.length - 1; + } else if (page * this.perPageDataNum > data.length) { + //最后一页且数据不满8个时 + start = this.perPageDataNum * (page - 1); + end = data.length - 1; + } else { + //中间页面的情况 + start = this.perPageDataNum * (page - 1); + end = page * this.perPageDataNum - 1; + } + + var content = document.createElement("div"); + + for (var i = start; i <= end; i++) { + var properties = void 0, + featureType = "Point"; + + if (data[i].filterAttribute) { + featureType = data[i].feature.geometry.type; + properties = data[i].filterAttribute; + } else { + properties = data[i].properties; + } + + content.appendChild(this._createResultItem(featureType, properties)); + } + + this._resultDomObj.setContent(content); + + this._resultDomObj.showView(); //查询完成默认选中第一个结果: + + + content.firstChild.getElementsByClassName("component-search-result-icon")[0].classList.add("component-search__resultitme-selected"); + var filter = content.firstChild.getElementsByClassName("component-search-result-info")[0].firstChild.innerText; + !this._selectMarkerFeature && this._linkageFeature(filter); + }, + + /** + * @function SearchView.prototype._flyToBounds + * @param {L.Bounds} bounds - 当前图层范围。 + * @description 移动到该范围。 + * @private + */ + _flyToBounds: function _flyToBounds(bounds) { + var sw = bounds.getSouthWest(); + var ne = bounds.getNorthEast(); + + if (sw.lat === ne.lat && sw.lng === ne.lng) { + this.map.flyTo(sw); + } else { + // this.map.fitBounds(this.searchResultLayer.getBounds()); + this.map.fitBounds(bounds); + } + }, + + /** + * @function SearchView.prototype._linkageFeature + * @description 点击结果列表联动地图上要素响应。 + * @private + */ + _linkageFeature: function _linkageFeature(filter) { + var _this3 = this; + + var filterValue = ""; + + if (this.isSearchLayer) { + filterValue = filter.split(":")[1].trim(); + } else { + filterValue = filter; + } + + this._selectFeature && this._selectFeature.addTo(this.map); + this.searchResultLayer.eachLayer(function (layer) { + // this._resetLayerStyleToDefault(layer); + if (!filterValue || layer.filterAttribute && layer.filterAttribute.filterAttributeValue === filterValue || layer.feature.properties && layer.feature.properties.name === filterValue) { + layer.remove(); + + _this3._setSelectedLayerStyle(layer); + /*layer.bindPopup(function () { + return (new AttributesPopContainer(layer.feature.properties)).getElement() + }, {closeOnClick: false}).openPopup().addTo(this.map);*/ + //若这个图层只有一个点的话,则直接 flyTo 到点: + + } + }); + }, + + /** + * @function SearchView.prototype.clearSearchResult + * @description 清空查询结果。 + */ + clearSearchResult: function clearSearchResult() { + if (this.searchResultLayer) { + this.map.closePopup(); //若当前是查询图层的结果,则不删除图层,只修改样式 + + !this.isSearchLayer && this.map.removeLayer(this.searchResultLayer); + this._selectMarkerFeature && this.map.removeLayer(this._selectMarkerFeature); + this._selectFeaturethis && this.map.removeLayer(this._selectFeature); + this._selectMarkerFeature = null; + this._selectFeature = null; + this.searchResultLayer = null; + this.currentResult = null; + } + }, + + /** + * @function SearchView.prototype._featureOnclickEvent + * @description 要素点击事件 + * @param {L.layer} layer - Leaflet Layer 对象。 + * @private + */ + _featureOnclickEvent: function _featureOnclickEvent(feature, layer) { + var _this4 = this; + + layer.on('click', function () { + var pageEles1 = document.getElementsByClassName('component-pagination__link')[0]; + + _this4._resultDomObj._changePageEvent({ + target: pageEles1.children[0].children[0] + }); + + _this4._selectFeature && _this4._selectFeature.addTo(_this4.map); + layer.remove(); + var page, dataIndex; + + for (var i = 0; i < _this4.searchLayersData.length; i++) { + var item = _this4.searchLayersData[i]; + + if (item.properties && item.properties.name === feature.properties.name || item.filterAttribute && item.filterAttribute.filterAttributeName + ": " + item.filterAttribute.filterAttributeValue === layer.filterAttribute.filterAttributeName + ": " + layer.filterAttribute.filterAttributeValue) { + dataIndex = i % _this4.perPageDataNum; + page = parseInt(i / _this4.perPageDataNum) + 1; + break; + } + } + + if (page > 1) { + for (var _i = 1; _i < page; _i++) { + var pageEles = void 0; + pageEles = document.getElementsByClassName('component-pagination__link')[0]; + + _this4._resultDomObj._changePageEvent({ + target: pageEles.children[pageEles.children.length - 2].children[0] + }); + } + } + + var pageList = document.getElementsByClassName('component-search-result-info'); + var target = pageList[dataIndex].children[0]; + + if (target.innerHTML === feature.properties.name || target.innerHTML === layer.filterAttribute.filterAttributeName + ": " + layer.filterAttribute.filterAttributeValue) { + var selectFeatureOption = pageList[dataIndex].parentNode; //修改 + + if (document.getElementsByClassName("component-search__resultitme-selected").length > 0) { + document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"); + } + + selectFeatureOption.firstChild.classList.add("component-search__resultitme-selected"); + + _this4._setSelectedLayerStyle(layer); + } + }, this); + }, + + /** + * @function SearchView.prototype._setSelectedLayerStyle + * @description 设置图层选中样式。 + * @param {L.layer} layer - Leaflet Layer 对象。 + * @private + */ + _setSelectedLayerStyle: function _setSelectedLayerStyle(layer) { + this._selectMarkerFeature && this._selectMarkerFeature.remove(); + this._selectMarkerFeature = null; + this._selectFeature = layer; //circleMarker 需要变成 marker 的样式: + + this._selectMarkerFeature = external_L_default().geoJSON(layer.toGeoJSON(), { + //点选中样式, todo marker 显示位置需要调整 + pointToLayer: function pointToLayer(geoJsonPoint, latlng) { + return external_L_default().marker(latlng, { + icon: external_L_default().divIcon({ + className: 'component-select-marker-icon', + iconAnchor: [15, 0] + }) + }); + }, + //线和面选中样式: + style: { + fillColor: 'red', + weight: 1, + opacity: 1, + color: 'red', + fillOpacity: 0.2 + } + }).addTo(this.map); + + this._selectMarkerFeature.bindPopup(function () { + return new AttributesPopContainer({ + attributes: layer.feature.properties + }).getElement(); + }, { + closeOnClick: false + }).openPopup().addTo(this.map); + + this._flyToBounds(this.searchResultLayer.getBounds()); + + var center; + + if (layer.getLatLng) { + center = layer.getLatLng(); + } else if (layer.getCenter) { + center = layer.getCenter(); + } + + this.map.setView(center); + } +}); +var searchView = function searchView(options) { + return new SearchView(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/dataflow/DataFlowViewModel.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + +/** + * @class DataFlowViewModel + * @aliasclass Components.DataFlowViewModel + * @deprecatedclassinstance L.supermap.components.dataFlowViewModel + * @classdesc 数据流组件功能类。 + * @version 9.1.1 + * @category Components DataFlow + * @param {L.Map} map - Leaflet Map 对象。 + * @param {Object} [dataFlowLayerOptions] - 数据流服务返回数据数据展示样式,默认采用 ViewModel 默认样式。 + * @param {Object} options - 参数。 + * @param {function} [options.style] - 定义点、线、面要素样式。参数为{@link L.Path-option}。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗,默认对新创建的图层不执行任何操作。 + * @fires DataFlowViewModel#dataflowservicesubscribed + * @fires DataFlowViewModel#subscribesucceeded + * @fires DataFlowViewModel#subscribefailed + * @fires DataFlowViewModel#dataupdated + * @extends {L.Evented} + * @usage + */ + +var DataFlowViewModel = external_L_default().Evented.extend({ + options: { + _defaultLayerOptions: { + //style 返回 marker样式或者 L.path 样式 + style: null, + onEachFeature: function onEachFeature(feature, layer) { + var content = "属性信息如下:
"; + + for (var key in feature.properties) { + content += key + ": " + feature.properties[key] + "
"; + } + + layer.bindPopup(content); + } + } + }, + initialize: function initialize(map) { + var dataFlowLayerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + if (map) { + /** + * @member {L.Map} DataFlowViewModel.prototype.map + * @description Leaflet Map 对象。 + */ + this.map = map; + } else { + return new Error("Cannot find map, fileModel.map cannot be null."); + } //合并用户的 dataFlowLayerOptions + + + external_L_default().Util.extend(this.options._defaultLayerOptions, dataFlowLayerOptions); //点样式也存储在style里 + + this.options._defaultLayerOptions.pointToLayer = this.options._defaultLayerOptions.style; + /** + * @member {boolean} [DataFlowViewModel.prototype.popupsStatus=true] + * @description 图层 popup 打开 "true" 或关闭 "false" 的状态。 + */ + + this.popupsStatus = true; + /** + * @member {boolean} [DataFlowViewModel.prototype.dataFlowStatus=false] + * @description 数据流服务当前状态,订阅 "true" 或未订阅 "false" 的状态。 + */ + + this.dataFlowStatus = false; + /** + * @member {string} [DataFlowViewModel.prototype.dataFlowUrl=""] + * @description 数据流地址。 + */ + + this.dataFlowUrl = ""; + /** + * @member {Array.} [DataFlowViewModel.prototype.currentFeatures] + * @description 当前订阅数据流返回的要素数组。 + */ + + this.currentFeatures = []; + /** + * @member {DataFlowLayer} [DataFlowViewModel.prototype.dataFlowLayer=null] + * @description 当前 dataFlowLayer 图层对象。 + */ + + this.dataFlowLayer = null; + }, + + /** + * @function DataFlowViewModel.prototype.subscribe + * @description 订阅数据流。 + * @param {string} dataFlowUrl - 数据流服务地址。 + */ + subscribe: function subscribe(dataFlowUrl) { + var _this = this; + + //若当前数据流服务没变,则不进行重新订阅 todo 或者没点击暂停 + if (this.dataFlowUrl === dataFlowUrl) { + if (this.dataFlowStatus) { + /** + * @event DataFlowViewModel#dataflowservicesubscribed + * @description 数据流订阅成功后触发。 + */ + this.fire("dataflowservicesubscribed"); + return; + } + } else { + this.dataFlowUrl = dataFlowUrl; + } + + this.dataFlowStatus = true; //移除已有图层 + + if (this.dataFlowLayer) { + this.dataFlowLayer.remove(); + this.dataFlowLayer = null; + } //创建DataFlowLayer,创建DataFlowLayer订阅iServer dataflow服务并将结果加载到地图上 + + + var dataFlowLayer = new DataFlowLayer(dataFlowUrl, this.options._defaultLayerOptions); + dataFlowLayer.on('subscribesucceeded', function (result) { + /** + * @event DataFlowViewModel#subscribesucceeded + * @description 数据流订阅成功后触发。 + * @property {Object} result - 返回的数据。 + */ + _this.fire("subscribesucceeded", { + result: result + }); + }); + dataFlowLayer.on('subscribefailed', function (result) { + /** + * @event DataFlowViewModel#subscribefailed + * @description 数据流订阅失败后触发。 + * @property {Object} result - 返回的数据。 + */ + _this.fire("subscribefailed", { + result: result + }); + }); + dataFlowLayer.on('dataupdated', function (result) { + //派发出订阅返回的数据: + + /** + * @event DataFlowViewModel#dataupdated + * @description 数据返回成功后触发。 + * @property {Object} result - 返回的数据。 + */ + _this.fire("dataupdated", { + result: result + }); //若数据超出当前视图范围,则移动到数据所在视图范围: + + + var layerBounds = result.layer.getBounds(), + mapBounds = CommontypesConversion.toSuperMapBounds(_this.map.getBounds()), + layerBoundsSuperMap = CommontypesConversion.toSuperMapBounds(layerBounds); + + if (!mapBounds.intersectsBounds(layerBoundsSuperMap)) { + if (layerBoundsSuperMap.left === layerBoundsSuperMap.right && layerBoundsSuperMap.top === layerBoundsSuperMap.bottom) { + _this.map.setView(layerBounds.getCenter()); + } else { + _this.map.flyToBounds(layerBounds); + } + } + + if (_this.popupsStatus) { + _this.openPopups(); + } + }); + dataFlowLayer.addTo(this.map); + this.dataFlowLayer = dataFlowLayer; + }, + + /** + * @function DataFlowViewModel.prototype.cancelSubscribe + * @description 取消订阅的数据流。 + */ + cancelSubscribe: function cancelSubscribe() { + if (this.dataFlowLayer) { + this.dataFlowStatus = false; + this.dataFlowLayer.dataService.unSubscribe(); + this.dataFlowLayer.remove(); + this.dataFlowLayer = null; + } + }, + + /** + * @function DataFlowViewModel.prototype.openPopups + * @description 打开图层要素弹窗。 + */ + openPopups: function openPopups() { + this.popupsStatus = true; + + if (this.dataFlowLayer) { + var layers = this.dataFlowLayer.getLayers(); + + for (var i = 0; i < layers.length; i++) { + for (var j = 0; j < layers[i].getLayers().length; j++) { + layers[i].getLayers()[j].openPopup(); + } + } + } + }, + + /** + * @function DataFlowViewModel.prototype.closePopups + * @description 关闭图层要素弹窗。 + */ + closePopups: function closePopups() { + this.popupsStatus = false; + + if (this.dataFlowLayer) { + var layers = this.dataFlowLayer.getLayers(); + + for (var i = 0; i < layers.length; i++) { + for (var j = 0; j < layers[i].getLayers().length; j++) { + layers[i].getLayers()[j].closePopup(); + } + } + } + } +}); +var dataFlowViewModel = function dataFlowViewModel(options) { + return new DataFlowViewModel(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/dataflow/DataFlowView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class DataFlowView + * @aliasclass Components.DataFlowView + * @deprecatedclassinstance L.supermap.components.dataFlow + * @classdesc 数据流组件。 + * @version 9.1.1 + * @category Components DataFlow + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。
+ `function (feature) { + return { + fillColor: "red", + fillOpacity: 1, + radius: 6, + weight: 0 + }; + }` + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DataFlowView#dataupdated + * @extends {ComponentsViewBase} + * @usage + */ + +var DataFlowView = ComponentsViewBase.extend({ + initialize: function initialize(options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + }, + + /** + * @function DataFlowView.prototype.onAdd + * @description 给地图添加组件。 + * @override + * @private + */ + onAdd: function onAdd(map) { + //为了避免空对象为复写默认配置的现象,先判断参数是否为空 + var options = {}; + + if (this.options.style) { + options.style = this.options.style; + } + + if (this.options.onEachFeature) { + options.style = this.options.onEachFeature; + } + + this.viewModel = new DataFlowViewModel(map, options); + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DataFlowView.prototype._initView + * @description 创建数据组件,用于打开本地文件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView: function _initView() { + var _this = this; + + var containerObj = new CommonContainer({ + title: Lang.i18n("title_dataFlowService") + }); + var container = containerObj.getElement(); + var componentContent = containerObj.getContentElement(); + componentContent.style.padding = "10px 18px"; + var dataFlowContainer1 = document.createElement("div"); + dataFlowContainer1.setAttribute("class", "component-dataflow__container"); //输入框 + + var dataFlowInputContainer = document.createElement("div"); + dataFlowInputContainer.setAttribute("class", "component-input-default"); + var dataFlowInput = document.createElement("input"); + dataFlowInput.setAttribute("class", "component-input-default"); + dataFlowInput.type = "text"; + dataFlowInput.placeholder = Lang.i18n('text_input_value_inputDataFlowUrl'); + dataFlowInput.title = Lang.i18n('text_input_value_inputDataFlowUrl'); + dataFlowInputContainer.appendChild(dataFlowInput); //删除输入值按钮: + + var inputClearBtn = document.createElement("span"); + inputClearBtn.setAttribute("class", "supermapol-icons-close"); + inputClearBtn.hidden = true; //---清除输入值【清除按钮点击事件】 + + inputClearBtn.onclick = function (e) { + dataFlowInput.value = ""; + e.target.hidden = true; + }; //---输入框值改变,打开清除按钮【输入框内容改变事件】 + + + dataFlowInput.oninput = function () { + inputClearBtn.hidden = false; + }; + + dataFlowInputContainer.appendChild(inputClearBtn); + dataFlowContainer1.appendChild(dataFlowInputContainer); + componentContent.appendChild(dataFlowContainer1); //复选框条件 + + var dataFlowContainer2 = document.createElement("div"); + dataFlowContainer2.setAttribute("class", "component-dataflow__container"); + var checkboxContainer = document.createElement("div"); + checkboxContainer.setAttribute("class", "component-checkbox-container"); + var attributesCheckbox = document.createElement("div"); + attributesCheckbox.setAttribute("class", "component-checkbox-default component-checkbox-selected-img"); + attributesCheckbox.checked = true; + checkboxContainer.appendChild(attributesCheckbox); + var checkboxLabel = document.createElement("div"); + checkboxLabel.setAttribute("class", "component-label component-label-selected"); + checkboxLabel.innerHTML = Lang.i18n('text_displayFeaturesInfo'); + checkboxContainer.appendChild(checkboxLabel); //----是否显示属性框【属性框复选框点击事件】 + + attributesCheckbox.onclick = function (e) { + e.target.checked = !e.target.checked; + + if (e.target.checked) { + checkboxLabel.setAttribute("class", "component-label component-label-selected"); + e.target.setAttribute("class", "component-checkbox-default component-checkbox-selected-img"); + + _this.viewModel.openPopups(); + } else { + checkboxLabel.setAttribute("class", "component-label"); + e.target.setAttribute("class", "component-checkbox-default component-checkbox-default-img"); + + _this.viewModel.closePopups(); + } + }; + + dataFlowContainer2.appendChild(checkboxContainer); + componentContent.appendChild(dataFlowContainer2); //订阅按钮,取消按钮: + + var dataFlowContainer3 = document.createElement("div"); + dataFlowContainer3.setAttribute("class", "component-dataflow__container component-init-center"); + var subscribe = document.createElement("button"); + subscribe.setAttribute("class", "component-button-default"); + subscribe.innerHTML = Lang.i18n('text_subscribe'); //----订阅服务【订阅按钮点击事件】 + + subscribe.onclick = function () { + var urlDataFlow = dataFlowInput.value; + + if (urlDataFlow === "") { + _this.messageBox.showView(Lang.i18n('msg_inputDataFlowUrlFirst')); + + return; + } + + _this.viewModel.subscribe(urlDataFlow); + }; + + dataFlowContainer3.appendChild(subscribe); + var cancelSubscribe = document.createElement("button"); + cancelSubscribe.setAttribute("class", "component-button-default"); + cancelSubscribe.innerHTML = Lang.i18n('text_cancelSubscribe'); //----取消订阅服务【取消订阅按钮点击事件】 + + cancelSubscribe.onclick = function () { + _this.viewModel.cancelSubscribe(); + }; + + dataFlowContainer3.appendChild(cancelSubscribe); + componentContent.appendChild(dataFlowContainer3); //增加提示框: + + this.messageBox = new MessageBox(); + this.viewModel.on("dataflowservicesubscribed", function () { + _this.messageBox.showView(Lang.i18n("msg_dataflowservicesubscribed")); + }); + this.viewModel.on("subscribesucceeded", function () { + _this.messageBox.showView(Lang.i18n("msg_subscribesucceeded")); + }); + /** + * @event DataFlowView#dataupdated + * @description 数据流服务成功返回数据后触发。 + * @property {Object} result - 事件返回的数据对象。 + */ + + this.viewModel.on("dataupdated", function (result) { + _this.messageBox.closeView(); + + _this._event.fire("dataupdated", result); + }); //关闭在控件上触发地图的事件响应: + //阻止 map 默认事件 + + this._preventMapEvent(container, this.map); + + return container; + } +}); +var dataFlowView = function dataFlowView(options) { + return new DataFlowView(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/commonmodels/GeoJSONLayerWithName.js +function GeoJSONLayerWithName_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GeoJSONLayerWithName_createClass(Constructor, protoProps, staticProps) { if (protoProps) GeoJSONLayerWithName_defineProperties(Constructor.prototype, protoProps); if (staticProps) GeoJSONLayerWithName_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function GeoJSONLayerWithName_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class GeoJSONLayerWithName + * @aliasclass Components.GeoJSONLayerWithName + * @deprecatedclassinstance L.supermap.components.geoJSONLayerWithName + * @classdesc 含有 layerName 与 GeoJSON 图层的对象。 + * @param {Object} layerObject - 图层对象。 + * @param {string} layerName - 图层名称。 + * @param {L.GeoJSON} layer - 图层。 + * @category Components Common + * @usage + */ + +var GeoJSONLayerWithName = /*#__PURE__*/GeoJSONLayerWithName_createClass(function GeoJSONLayerWithName(layerName, layer) { + GeoJSONLayerWithName_classCallCheck(this, GeoJSONLayerWithName); + + this.layerName = layerName; + this.layer = layer; +}); +var geoJSONLayerWithName = function geoJSONLayerWithName(layerName, layer) { + return new GeoJSONLayerWithName(layerName, layer); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationViewModel.js +function ClientComputationViewModel_typeof(obj) { "@babel/helpers - typeof"; return ClientComputationViewModel_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ClientComputationViewModel_typeof(obj); } + +function ClientComputationViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ClientComputationViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ClientComputationViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) ClientComputationViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) ClientComputationViewModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ClientComputationViewModel_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) ClientComputationViewModel_setPrototypeOf(subClass, superClass); } + +function ClientComputationViewModel_setPrototypeOf(o, p) { ClientComputationViewModel_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ClientComputationViewModel_setPrototypeOf(o, p); } + +function ClientComputationViewModel_createSuper(Derived) { var hasNativeReflectConstruct = ClientComputationViewModel_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = ClientComputationViewModel_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = ClientComputationViewModel_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return ClientComputationViewModel_possibleConstructorReturn(this, result); }; } + +function ClientComputationViewModel_possibleConstructorReturn(self, call) { if (call && (ClientComputationViewModel_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return ClientComputationViewModel_assertThisInitialized(self); } + +function ClientComputationViewModel_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function ClientComputationViewModel_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function ClientComputationViewModel_getPrototypeOf(o) { ClientComputationViewModel_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ClientComputationViewModel_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + +/** + * @class ClientComputationViewModel + * @aliasclass Components.ClientComputationViewModel + * @deprecatedclassinstance L.supermap.components.clientComputationViewModel + * @classdesc 客户端计算组件功能类。 + * @version 9.1.1 + * @category Components ClientComputation + * @param {string} workerUrl - worker 地址,原始位置为 dist/leaflet/workers/TurfWorker.js。 + * @fires ClientComputationViewModel#analysisfailed + * @fires ClientComputationViewModel#analysissucceeded + * @fires ClientComputationViewModel#layerloaded + * @fires ClientComputationViewModel#layersremoved + * @extends {L.Evented} + * @usage + */ + +var ClientComputationViewModel = /*#__PURE__*/function (_L$Evented) { + ClientComputationViewModel_inherits(ClientComputationViewModel, _L$Evented); + + var _super = ClientComputationViewModel_createSuper(ClientComputationViewModel); + + function ClientComputationViewModel() { + ClientComputationViewModel_classCallCheck(this, ClientComputationViewModel); + + return _super.apply(this, arguments); + } + + ClientComputationViewModel_createClass(ClientComputationViewModel, [{ + key: "initialize", + value: function initialize(workerUrl) { + this.workerUrl = workerUrl; + this.turfLayers = []; + } + /** + * @function ClientComputationViewModel.prototype.getLayersData + * @description 获取填充到 view 的数据。 + * @param {Array.} layersArr - 图层数组。 + * @returns {Object} layers 数据。 + */ + + }, { + key: "getLayersData", + value: function getLayersData(layersArr) { + var result = {}; + var pointData = {}, + lineData = {}, + polygonData = {}; + + for (var i = 0; i < layersArr; i++) { + layersArr[i] = new GeoJSONLayerWithName(layersArr[i].layerName, layersArr[i].layer); + } + + this.geoJsonLayersDataModel = new GeoJsonLayersDataModel(layersArr); // 把 layersArr 转成 key = layername 对象,方便获取 fields 时遍历 + + var dataObj = []; + + for (var _i = 0; _i < layersArr.length; _i++) { + dataObj[layersArr[_i].layerName] = { + fields: layersArr[_i].fields, + layer: layersArr[_i].layer.toGeoJSON() + }; + } + + for (var key in this.geoJsonLayersDataModel.layers) { + var fields = void 0; + + if (dataObj[key].fields) { + fields = dataObj[key].fields; + } else { + fields = this.geoJsonLayersDataModel.layers[key].getAttributeNamesByType("Num"); + } + + var fieldsValue = []; + + for (var _i2 = 0; _i2 < fields.length; _i2++) { + fieldsValue[fields[_i2]] = this.geoJsonLayersDataModel.layers[key].getAttributeValueByAttributeName(fields[_i2]); // 去空 & 去重 & 转 number + + var arr = fieldsValue[fields[_i2]]; + + for (var j = 0; j < arr.length; j++) { + if (arr[j] == "" || typeof arr[j] == "undefined") { + arr.splice(j, 1); + j = j - 1; + } + + arr[j] = parseFloat(arr[j]); + } + + fieldsValue[fields[_i2]] = Array.from(new Set(arr.sort(function (a, b) { + return a - b; + }))); + } + + var obj = { + layerName: key, + fields: fields, + fieldsValue: fieldsValue, + features: dataObj[key].layer + }; + var layersType = dataObj[key].layer.features[0].geometry.type; + + if (layersType === "Point") { + pointData[key] = obj; + } else if (layersType === "LineString") { + lineData[key] = obj; + } else if (layersType === "Polygon") { + polygonData[key] = obj; + } + } + + result['point'] = pointData; + result['lineString'] = lineData; + result['polygon'] = polygonData; + return result; + } + /** + * @function ClientComputationViewModel.prototype.analysis + * @description 客户端计算。 + * @param {Object} params - 客户端计算参数。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + + }, { + key: "analysis", + value: function analysis(params, map) { + this.geoJsonLayersDataModel.setCurrentLayerDataModel(params.analysisLayers); + this.worker = new Worker(this.workerUrl); + var resultData = this.geoJsonLayersDataModel.currentLayerDataModel.layer.toGeoJSON(); + + if (params.analysisMethod === "isolines") { + var fieldsValue = params.analysisFieldsValue.split(","); + var pointGrid = resultData; + + for (var j = 0; j < fieldsValue.length; j++) { + fieldsValue[j] = parseFloat(fieldsValue[j]); + } + + var me = this; + var analysisParams = { + "pointGrid": pointGrid, + "analysisMethod": params.analysisMethod, + "breaks": fieldsValue, + "zProperty": params.analysisFields, + "analysisCellSize": params.analysisCellSize, + "options": { + gridType: "point", + property: params.analysisFields, + weight: Number(params.analysisBreaks) + } + }; + this.worker.postMessage(analysisParams); + + this.worker.onmessage = function (e) { + if (e.data.features.length === 0) { + /** + * @event ClientComputationViewModel#analysisfailed + * @description 事件分析失败后触发,返回结果为空。 + */ + me.fire('analysisfailed'); + } else { + /** + * @event ClientComputationViewModel#analysissucceeded + * @description 事件分析成功后触发。 + * @property {Object} data - 分析成功后的数据。 + */ + me.fire('analysissucceeded', { + 'data': e.data + }); + var turfLayer = external_L_default().geoJSON(e.data, { + style: { + color: '#1060C2', + weight: 3 + }, + onEachFeature: function onEachFeature(feature, layer) { + if (feature.properties) { + layer.bindPopup(new AttributesPopContainer(feature.properties).getElement()); + } + + layer.on({ + 'mouseover': function mouseover() { + layer.setStyle({ + color: "#ffffff", + weight: 5 + }); + }, + 'mouseout': function mouseout() { + layer.setStyle({ + color: '#1060C2', + weight: 3 + }); + }, + "click": function click() { + layer.setStyle({ + color: "#ffffff", + weight: 5 + }); + } + }); + } + }).addTo(map); + me.turfLayers.push(turfLayer); + /** + * @event ClientComputationViewModel#layerloaded + * @description 结果图层加载完成后触发。 + * @property {L.GeoJSON} layer - 加载完成后的结果图层。 + * @property {string} name - 加载完成后的结果图层名称。 + */ + + me.fire('layerloaded', { + "layer": turfLayer, + "name": params.resultLayersName + }); + me.worker.terminate(); + } + }; + } else if (params.analysisMethod === "buffer") { + var _me = this; + + var _analysisParams = { + "analysisMethod": "buffer", + "radius": params.radius, + "unit": params.unit, + "isSave": params.isSaveStatus, + "isUnion": params.isUnion, + 'geoJson': resultData + }; + this.worker.postMessage(_analysisParams); + + this.worker.onmessage = function (e) { + var turfLayer = external_L_default().geoJSON(e.data, { + style: { + color: "#ffffff", + fillColor: '#1060C2', + fillOpacity: .5, + weight: 1.5 + }, + onEachFeature: function onEachFeature(feature, layer) { + if (feature.properties) { + layer.bindPopup(new AttributesPopContainer(feature.properties).getElement()); + } + + layer.on({ + 'mouseover': function mouseover() { + layer.setStyle({ + color: "#ffffff", + fillColor: "rgb(46,40,79)", + fillOpacity: .5, + weight: 5 + }); + }, + 'mouseout': function mouseout() { + layer.setStyle({ + color: "#ffffff", + fillColor: '#1060C2', + fillOpacity: .5, + weight: 1.5 + }); + }, + "click": function click() { + layer.setStyle({ + color: "#ffffff", + fillColor: "rgb(46,40,79)", + fillOpacity: .5, + weight: 2 + }); + } + }); + } + }).addTo(map); + + _me.turfLayers.push(turfLayer); + + _me.fire('layerloaded', { + "layer": turfLayer, + "name": params.resultLayersName + }); + + _me.worker.terminate(); + }; + } + } + /** + * @function ClientComputationViewModel.prototype.clearLayers + * @description 清空分析图层。 + */ + + }, { + key: "clearLayers", + value: function clearLayers() { + for (var i in this.turfLayers) { + this.turfLayers[i].clearLayers(); + } + /** + * @event ClientComputationViewModel#layersremoved + * @description 图层删除之后触发。 + * @property {Array.} layer - 需要删除的图层数组。 + */ + + + this.fire('layersremoved', { + layers: this.turfLayers + }); + } + /** + * @function ClientComputationViewModel.prototype.cancelAnalysis + * @description 取消分析。 + */ + + }, { + key: "cancelAnalysis", + value: function cancelAnalysis() { + this.worker.terminate(); + } + }]); + + return ClientComputationViewModel; +}((external_L_default()).Evented); +var clientComputationViewModel = function clientComputationViewModel(options) { + return new ClientComputationViewModel(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class ClientComputationView + * @aliasclass Components.ClientComputationView + * @deprecatedclassinstance L.supermap.components.clientComputation + * @classdesc 叠加图层的客户端计算。 + * @version 9.1.1 + * @param {string} workerUrl - worker 地址,原始位置为 dist/leaflet/workers/TurfWorker.js。 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires ClientComputationView#analysissucceeded + * @fires ClientComputationView#analysisfailed + * @fires ClientComputationView#layersremoved + * @category Components ClientComputation + * @extends {ComponentsViewBase} + * @usage + */ + +var ClientComputationView = ComponentsViewBase.extend({ + initialize: function initialize(workerUrl, options) { + if (!workerUrl) { + throw new Error('workerUrl is required'); + } + + this.workerUrl = workerUrl; + ComponentsViewBase.prototype.initialize.apply(this, [options]); + }, + + /** + * @function ClientComputationView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function onAdd(map) { + this.map = map; + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function ClientComputationView.prototype.addLayer + * @description 添加叠加图层。 + */ + addLayer: function addLayer(layer) { + this.layers = this.layers || []; + this.layers.push(layer); + var fillData = this.viewModel.getLayersData(this.layers); + this.fillDataToView(fillData); + }, + + /** + * @function ClientComputationView.prototype.fillDataToView + * @private + * @description 填充数据到 view。 + * @param {Object} fillData - 待填充的数据。 + */ + fillDataToView: function fillDataToView(fillData) { + if (!fillData) { + return; + } + + this.fillData = fillData; + var analysisMethod = document.getElementById('dropDownTop').getAttribute('data-value'); + var currentFillData = {}; + + switch (analysisMethod) { + case 'isolines': + currentFillData = fillData['point']; + break; + + case 'buffer': + currentFillData = fillData['point']; + break; + } + + if (JSON.stringify(currentFillData) == '{}') { + return; + } // 填充分析图层下拉框 + + + var layserArr = []; + + for (var layerName in currentFillData) { + layserArr.push(layerName); + } + + var layersSelect = document.getElementById('layersSelect'); + var layerSelectName = document.getElementById('layerSelectName'); // 清空 layersSelect; + + layersSelect.innerHTML = ''; + layerSelectName.title = layserArr[0]; + layerSelectName.innerHTML = layserArr[0]; + + this._createOptions(layersSelect, layserArr); // 设置 layer select option 点击事件 + + + this.layerSelectObj.optionClickEvent(layersSelect, layerSelectName, this.layersSelectOnchange); // 当前选中图层数据 + + var currentData = currentFillData[layerSelectName.title]; + var fieldsArr = currentData.fields; + var textAreaData = currentData.fieldsValue; // 设置当前数据 + + this.currentData = currentData; + this.currentFillData = currentFillData; // 填充字段下拉框 + + var fieldsSelect = document.getElementById('fieldsSelect'); // 清空 fieldsSelect + + fieldsSelect.innerHTML = ''; + var fieldsSelectNameDiv = document.getElementById('fieldsSelectName'); + fieldsSelectNameDiv.innerHTML = fieldsArr[0]; + fieldsSelectNameDiv.title = fieldsArr[0]; + + this._createOptions(fieldsSelect, fieldsArr); + + this.fieldsSelectObj.optionClickEvent(fieldsSelect, fieldsSelectNameDiv, this.fieldsSelectOnchange); // 当前选中字段 + + var fieldsSelectName = fieldsSelectNameDiv.title; // 通过当前选中字段 填充 TextArea 初始值 + + var getValueTextArea = document.getElementById('getValueTextArea'); + getValueTextArea.value = textAreaData[fieldsSelectName].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', textAreaData[fieldsSelectName]); // 结果图层 + + var resultLayersName = document.getElementById('resultLayersName'); + var analysisType = document.getElementById('dropDownTop').getAttribute('data-value'); + + switch (analysisType) { + case 'isolines': + resultLayersName.value = Lang.i18n('text_label_isolines') + layerSelectName.title; + break; + + case 'buffer': + resultLayersName.value = Lang.i18n('text_label_buffer') + layerSelectName.title; + break; + } + }, + + /** + * @function ClientComputationView.prototype._initView + * @description 创建客户端计算组件。 + * @returns {HTMLElement} + * @private + */ + _initView: function _initView() { + var _this = this; + + //初始化 ViewModel + this.workerUrl && (this.viewModel = new ClientComputationViewModel(this.workerUrl)); //初始化 view + // Container + + var container = new CommonContainer({ + title: Lang.i18n('title_clientComputing') + }).getElement(); + container.classList.add('component-analysis'); + container.children[0].style.fontSize = '12px'; + var analysisOptionsArr = [{ + 'title': Lang.i18n('text_isoline'), + 'dataValue': 'isolines', + 'remark': Lang.i18n('text_extractDiscreteValue'), + 'icon': { + 'className': 'component-analyst-isoline-img' + } + }, { + 'title': Lang.i18n('text_buffer'), + 'dataValue': 'buffer', + 'remark': Lang.i18n('text_specifyTheDistance'), + 'icon': { + 'className': 'component-analyst-buffer-img' + } + }]; + var componentContentContainer = container.children[1]; + componentContentContainer.classList.add('component-content--scroll'); + componentContentContainer.classList.add('component-content--analysis'); // 下拉框 + + var dropDownBox = new DropDownBox(analysisOptionsArr).getElement(); + componentContentContainer.appendChild(dropDownBox); + var dropDownTopContainer = dropDownBox.children[0].children[0]; + var dropDownItems = dropDownBox.children[0].children[2].children[0]; + dropDownTopContainer.children[0].id = 'dropDownTop'; // analysisContainer + + var analysisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); // 分析图层 + + var analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisTypeContainer); + var layerSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', analysisLayer); + layerSelectControl.id = 'layerSelectControl'; + var layerOptions = { + 'optionsArr': [''], + 'labelName': Lang.i18n('text_label_analysisLayer') + }; + var layerSelectObj = new Select(layerOptions); + var layerSelectTool = layerSelectObj.getElement(); + this.layerSelectObj = layerSelectObj; + layerSelectControl.appendChild(layerSelectTool); // 图层选中div + + var layerSelectName = layerSelectTool.children[1].children[0]; + layerSelectName.id = 'layerSelectName'; // 图层下拉框select + + var layersSelect = layerSelectTool.children[1].children[2].children[0].children[0]; + layersSelect.id = 'layersSelect'; // ISOLINE + // 提取字段 + + var div = external_L_default().DomUtil.create('div', 'component-analysis__container__analysistype', analysisTypeContainer); + var isolineDiv = external_L_default().DomUtil.create('div', 'component-clientcomputation__isoline', div); + var fieldsOptions = { + 'optionsArr': [''], + 'labelName': Lang.i18n('text_label_extractField'), + 'optionsClickCb': this.fieldsSelectOnchange + }; + var fieldsSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', isolineDiv); + var fieldsSelectObj = new Select(fieldsOptions); + var fieldsSelectTool = fieldsSelectObj.getElement(); + this.fieldsSelectObj = fieldsSelectObj; + var fieldsSelectName = fieldsSelectTool.children[1].children[0]; + fieldsSelectName.id = 'fieldsSelectName'; + var fieldsSelect = fieldsSelectTool.children[1].children[2].children[0].children[0]; + fieldsSelect.id = 'fieldsSelect'; + fieldsSelectControl.appendChild(fieldsSelectTool); // 提取值 + + var textareaContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', isolineDiv); + var textareaSpan = external_L_default().DomUtil.create('span', 'component-textarea__name', textareaContainer); + textareaSpan.innerHTML = Lang.i18n('text_label_extractedValue'); + var textareaControl = external_L_default().DomUtil.create('div', 'component-textarea', textareaContainer); + textareaControl.id = 'getValueText'; + var scrollarea = external_L_default().DomUtil.create('div', '', textareaControl); + var scrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', scrollarea); + scrollareaContent.setAttribute('tabindex', '1'); + var getValueTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content', scrollareaContent); + getValueTextArea.id = 'getValueTextArea'; + getValueTextArea.setAttribute('rows', '20'); // 距离衰减 + + var breaksDiv = external_L_default().DomUtil.create('div', '', isolineDiv); + var breaksSpan = external_L_default().DomUtil.create('span', '', breaksDiv); + breaksSpan.innerHTML = Lang.i18n('text_label_distanceAttenuation'); + var breaks = external_L_default().DomUtil.create('input', '', breaksDiv); + breaks.value = '3'; // 栅格大小 + + var cellSizeDiv = external_L_default().DomUtil.create('div', '', isolineDiv); + var cellSizeSpan = external_L_default().DomUtil.create('span', '', cellSizeDiv); + cellSizeSpan.innerHTML = Lang.i18n('text_label_gridSize'); + var cellSize = external_L_default().DomUtil.create('input', '', cellSizeDiv); + cellSize.value = '30'; // BUFFER + // 缓冲半径 + + var bufferDiv = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer hidden', div); + var bufferRadius = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--radius', bufferDiv); + var bufferRadiusSpan = external_L_default().DomUtil.create('span', '', bufferRadius); + bufferRadiusSpan.innerHTML = Lang.i18n('text_label_bufferRadius'); + var bufferRadiusDiv = external_L_default().DomUtil.create('div', '', bufferRadius); + var bufferRadiusInput = external_L_default().DomUtil.create('input', 'buffer-radius-input', bufferRadiusDiv); + bufferRadiusInput.id = 'bufferRadiusInput'; + bufferRadiusInput.value = '10'; + bufferRadiusInput.setAttribute('placeholder', Lang.i18n('text_label_defaultkilometers')); + var bufferUnit = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--unit', bufferRadiusDiv); + bufferUnit.id = 'bufferUnit'; // 半径单位选择下拉框 + + var bufferUnitOptions = { + 'optionsArr': [Lang.i18n('text_option_kilometer')], + 'labelName': Lang.i18n('text_label_unit') + }; + var bufferUnitSelectTool = new Select(bufferUnitOptions).getElement(); + var bufferUnitSelectName = bufferUnitSelectTool.children[1].children[0]; + bufferUnitSelectName.id = 'bufferUnitSelectName'; + var bufferUnitSelect = bufferUnitSelectTool.children[1].children[2].children[0].children[0]; + bufferUnitSelect.id = 'bufferUnitSelect'; + bufferUnitSelectTool.children[0].style.display = 'none'; + bufferUnit.appendChild(bufferUnitSelectTool); // 保留原对象字段属性 + + var saveFieldDiv = external_L_default().DomUtil.create('div', '', bufferRadius); + var saveAttrsContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--issaveattrs', saveFieldDiv); + saveAttrsContainer.id = 'saveAttrsContainer'; + var saveAttrsCheckbox = external_L_default().DomUtil.create('div', 'checkbox checkbox-fault', saveAttrsContainer); + saveAttrsCheckbox.id = 'saveAttrsCheckbox'; + var saveAttrsLabel = external_L_default().DomUtil.create('div', 'lable', saveAttrsContainer); + saveAttrsLabel.id = 'saveAttrsLabel'; + saveAttrsLabel.innerHTML = Lang.i18n('text_retainOriginal'); // 合并缓冲区 + + var isUnionContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--isunion', saveFieldDiv); + isUnionContainer.id = 'isUnionContainer'; + var isUnionCheckbox = external_L_default().DomUtil.create('div', 'checkbox checkbox-fault', isUnionContainer); + isUnionCheckbox.id = 'isUnionCheckbox'; + var isUnionLabel = external_L_default().DomUtil.create('div', 'lable', isUnionContainer); + isUnionLabel.innerHTML = Lang.i18n('text_mergeBuffer'); + isUnionLabel.id = 'isUnionLabel'; // 结果图层 + + var resultLayerDiv = external_L_default().DomUtil.create('div', 'component-analysis__container__resultLayersName', analysisTypeContainer); + var resultLayerSpan = external_L_default().DomUtil.create('span', '', resultLayerDiv); + resultLayerSpan.innerHTML = Lang.i18n('text_label_resultLayerName'); + var resultLayersName = external_L_default().DomUtil.create('input', '', resultLayerDiv); + resultLayersName.id = 'resultLayersName'; // 分析按钮 + + var runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisTypeContainer); + var runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + var analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_analyze'); + var analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + var analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); + var svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.id = 'analyse_background'; + svgContainer.innerHTML = "\n \n \n \n \n "; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_analyzing'); + var analysisCancelBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--cancel', analysingContainer); + analysisCancelBtn.innerHTML = Lang.i18n('btn_cancelAnalysis'); + var deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheAnalysisLayer'); + + var _loop = function _loop(i) { + // 点击何种分析类型 判断使用图层数据 + dropDownItems.children[i].onclick = function () { + dropDownTopContainer.innerHTML = dropDownItems.children[i].outerHTML; + dropDownTopContainer.children[0].id = 'dropDownTop'; + var layersSelect = document.getElementById('layersSelect'); + var layerSelectName = document.getElementById('layerSelectName'); + var analysisMethod = dropDownItems.children[i].getAttribute('data-value'); + var currentFillData = {}; + + switch (analysisMethod) { + case 'buffer': + isolineDiv.classList.add('hidden'); + bufferDiv.classList.remove('hidden'); + componentContentContainer.style.height = '422px'; + resultLayersName.value = Lang.i18n('text_label_buffer') + layerSelectName.title; + currentFillData = _this.fillData['point']; + break; + + case 'isolines': + isolineDiv.classList.remove('hidden'); + bufferDiv.classList.add('hidden'); + componentContentContainer.style.height = '712px'; + resultLayersName.value = Lang.i18n('text_label_isolines') + layerSelectName.title; + currentFillData = _this.fillData['point']; + break; + } // 清空 layersSelect; + // 清空 layersSelect; + + + if (_this.currentFillData === currentFillData) { + return; + } + + layersSelect.innerHTML = ''; + + if (JSON.stringify(currentFillData) == '{}') { + resultLayersName.value = ''; + layerSelectName.title = ''; + layerSelectName.innerHTML = ''; + return; + } + + var layserArr = []; + + for (var layerName in currentFillData) { + layserArr.push(layerName); + } + + layerSelectName.title = layserArr[0]; + layerSelectName.innerHTML = layserArr[0]; + + _this._createOptions(layersSelect, layserArr); // 设置 layer select option 点击事件 + + + _this.layerSelectObj.optionClickEvent(layersSelect, layerSelectName, _this.layersSelectOnchange); + + if (analysisMethod === 'buffer') { + resultLayersName.value = Lang.i18n('text_label_buffer') + layserArr[0]; + } else if (analysisMethod === 'isolines') { + resultLayersName.value = Lang.i18n('text_label_isolines') + layserArr[0]; + } // 当前选中图层数据 + + + _this.currentData = currentFillData[layerSelectName.title]; + _this.currentFillData = currentFillData; + }; + }; + + for (var i = 0; i < dropDownItems.children.length; i++) { + _loop(i); + } // 字段下拉框 onchange 事件 + + + this.fieldsSelectOnchange = fieldsSelectOnchange.bind(this); + + function fieldsSelectOnchange(option) { + if (this.currentData) { + var displayData = this.currentData; + var _fieldsSelectName = option.title; + getValueTextArea.value = displayData.fieldsValue[_fieldsSelectName].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', displayData.fieldsValue[_fieldsSelectName]); + } + } // 选中图层实时改变事件 + + + this.layersSelectOnchange = layersSelectOnchange.bind(this); + + function layersSelectOnchange(option) { + if (this.currentData) { + var _layerSelectName = option.title; + var displayData = this.currentFillData[_layerSelectName]; + this.currentData = displayData; + fieldsSelect.innerHTML = ''; + + this._createOptions(fieldsSelect, displayData.fields); + + var fieldsSelectNameDiv = document.getElementById('fieldsSelectName'); + var field = displayData.fields[0]; + fieldsSelectNameDiv.title = field; + fieldsSelectNameDiv.innerHTML = field; + var _fieldsSelectName2 = field; + this.fieldsSelectObj.optionClickEvent(fieldsSelect, fieldsSelectNameDiv, this.fieldsSelectOnchange); + getValueTextArea.value = displayData.fieldsValue[_fieldsSelectName2].toString().replace(/,/g, ",\r\n"); + getValueTextArea.setAttribute('data-value', displayData.fieldsValue[_fieldsSelectName2]); + var analysisMethod = document.getElementById('dropDownTop').getAttribute('data-value'); + + switch (analysisMethod) { + case 'buffer': + resultLayersName.value = Lang.i18n('text_label_buffer') + _layerSelectName; + break; + + case 'isolines': + resultLayersName.value = Lang.i18n('text_label_isolines') + _layerSelectName; + break; + } + } + } //复选框事件 + + + var isSaveStatus = true; //合并缓冲区 + //合并缓冲区,默认不选中,即为false + + var isUnion = false; //选中select + + saveAttrsLabel.classList.add("selected"); + saveAttrsCheckbox.classList.add("checkbox-active"); + + saveAttrsContainer.onclick = function () { + if (isSaveStatus) { + //将当前状态和样式->不选中的样式和状态 + saveAttrsCheckbox.classList.add("checkbox-fault"); + saveAttrsCheckbox.classList.remove("checkbox-active"); + saveAttrsLabel.classList.remove("selected"); + isSaveStatus = false; + } else { + //将当前样式和状态改为选中 + saveAttrsCheckbox.classList.add("checkbox-active"); + saveAttrsCheckbox.classList.remove("checkbox-fault"); + saveAttrsLabel.classList.add("selected"); + isSaveStatus = true; //如果当前状态为选中的状态,则将上一个复选框的样式和状态由选中-不选中 + + if (isUnion) { + //移除dom样式和复选框的状态改变 + isUnionCheckbox.classList.add("checkbox-fault"); + isUnionCheckbox.classList.remove("checkbox-active"); + isUnion = false; + } + } + }; + + isUnionContainer.onclick = function () { + if (isUnion) { + //将选中状态 由选中->不选中,修改其样式和状态 + isUnionCheckbox.classList.add("checkbox-fault"); + isUnionCheckbox.classList.remove("checkbox-active"); + isUnionLabel.classList.remove("selected"); + isUnion = false; + } else { + //将状态由不选中->选中,修改其样式和状态 + isUnionCheckbox.classList.add("checkbox-active"); + isUnionCheckbox.classList.remove("checkbox-fault"); + isUnionLabel.classList.add("selected"); + isUnion = true; //如果当前状态为选中的,将上一个复选框改为不选中的状态 + + if (isSaveStatus) { + //修改当前样式和状态 + saveAttrsCheckbox.classList.add("checkbox-fault"); + saveAttrsCheckbox.classList.remove("checkbox-active"); + isSaveStatus = false; + } + } + }; // 提示框 + + + this.messageBox = new MessageBox(); // 分析按钮点击事件 + + analysisBtn.onclick = function () { + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + var dropDownTop = document.getElementById('dropDownTop'); + var analysisMethod = dropDownTop.getAttribute('data-value'); + var params; + + switch (analysisMethod) { + case 'isolines': + params = getIsolinesAnalysisParams(); + break; + + case 'buffer': + params = getBufferAnalysisParams(); + break; + } + + _this.viewModel.analysis(params, _this.map); + + _this.viewModel.on('layerloaded', function (e) { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event ClientComputationView#analysissucceeded + * @description 分析完成之后触发。 + * @property {L.GeoJSON} layer - 加载完成后的结果图层。 + * @property {string} name - 加载完成后的结果图层名称。 + */ + + _this._event.fire('analysissucceeded', { + "layer": e.layer, + "name": e.name + }); + }); // 若分析的结果为空 + + + _this.viewModel.on('analysisfailed', function () { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + + _this.messageBox.showView(Lang.i18n('msg_resultIsEmpty'), "failure"); + /** + * @event ClientComputationView#analysisfailed + * @description 分析失败之后触发。 + */ + + + _this._event.fire('analysisfailed'); + }); + }; // 取消按钮点击事件 + + + analysisCancelBtn.onclick = function () { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + + _this.viewModel.cancelAnalysis(); + }; // 删除按钮点击事件 + + + deleteLayersBtn.onclick = function () { + /** + * @event ClientComputationView#layersremoved + * @description 结果图层删除后触发。 + * @property {Array.} layers - 被删除的结果图层。 + */ + _this.viewModel.on('layersremoved', function (e) { + _this._event.fire('layersremoved', { + 'layers': e.layers + }); + }); + + _this.viewModel.clearLayers(); + }; // 获取分析数据 + + + function getIsolinesAnalysisParams() { + var dropDownTop = document.getElementById('dropDownTop'); + var analysisMethod = dropDownTop.getAttribute('data-value'); + var resultLayersName = document.getElementById('resultLayersName').value; + var analysisLayers = layerSelectName.title; + var analysisFields = fieldsSelectName.title; + var analysisFieldsValue = getValueTextArea.value.replace(/[\r\n]/g, "").split(',').toString(); + var analysisBreaks = breaks.value; + var analysisCellSize = cellSize.value; + var param = { + 'analysisMethod': analysisMethod, + 'analysisLayers': analysisLayers, + 'analysisFields': analysisFields, + 'analysisFieldsValue': analysisFieldsValue, + 'analysisBreaks': analysisBreaks, + 'analysisCellSize': analysisCellSize, + 'resultLayersName': resultLayersName + }; + return param; + } + + function getBufferAnalysisParams() { + var dropDownTop = document.getElementById('dropDownTop'); + var resultLayersName = document.getElementById('resultLayersName').value; + var analysisLayers = layerSelectName.title; + var analysisMethod = dropDownTop.getAttribute('data-value'); + var radius = bufferRadiusInput.value; + var unit = bufferUnitSelectName.title; + var param = { + 'analysisMethod': analysisMethod, + 'analysisLayers': analysisLayers, + 'radius': radius, + 'unit': unit, + 'resultLayersName': resultLayersName, + 'isSaveStatus': isSaveStatus, + 'isUnion': isUnion + }; + return param; + } // 阻止 map 默认事件 + + + this._preventMapEvent(container, this.map); + + return container; + }, + + /** + * @function ClientComputationView.prototype._createOptions + * @description 创建 select 下拉框的 options。 + * @private + */ + _createOptions: function _createOptions(container, optionsArr) { + for (var i in optionsArr) { + var option = document.createElement('div'); + var optData = optionsArr[i]; + option.className = 'component-selecttool__option'; + option.title = optData; + option.innerHTML = optData; + option.setAttribute('data-value', optData); + container.appendChild(option); + } + } +}); +var clientComputationView = function clientComputationView(options) { + return new ClientComputationView(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/clientcomputation/ClientComputationLayer.js +function ClientComputationLayer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ClientComputationLayer_createClass(Constructor, protoProps, staticProps) { if (protoProps) ClientComputationLayer_defineProperties(Constructor.prototype, protoProps); if (staticProps) ClientComputationLayer_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function ClientComputationLayer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +/** + * @class ClientComputationLayer + * @aliasclass Components.ClientComputationLayer + * @deprecatedclassinstance L.supermap.components.clientComputationLayer + * @classdesc 客户端计算图层对象。 + * @version 9.1.1 + * @param {Object} layerObject - 图层对象。 + * @param {string} layerObject.layerName - 图层名称。 + * @param {L.GeoJSON} layerObject.layer - 图层。 + * @param {Array.} [layerObject.fields] - 字段数组。 + * @category Components ClientComputation + * @usage + */ + +var ClientComputationLayer = /*#__PURE__*/ClientComputationLayer_createClass(function ClientComputationLayer(layerObject) { + ClientComputationLayer_classCallCheck(this, ClientComputationLayer); + + this.layerName = layerObject.layerName; + this.layer = layerObject.layer; + this.fields = layerObject.fields || null; +}); +var clientComputationLayer = function clientComputationLayer(layerObject) { + return new ClientComputationLayer(layerObject); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisModel.js +function DistributedAnalysisModel_typeof(obj) { "@babel/helpers - typeof"; return DistributedAnalysisModel_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DistributedAnalysisModel_typeof(obj); } + +function DistributedAnalysisModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DistributedAnalysisModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DistributedAnalysisModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) DistributedAnalysisModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) DistributedAnalysisModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DistributedAnalysisModel_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DistributedAnalysisModel_setPrototypeOf(subClass, superClass); } + +function DistributedAnalysisModel_setPrototypeOf(o, p) { DistributedAnalysisModel_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DistributedAnalysisModel_setPrototypeOf(o, p); } + +function DistributedAnalysisModel_createSuper(Derived) { var hasNativeReflectConstruct = DistributedAnalysisModel_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DistributedAnalysisModel_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DistributedAnalysisModel_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DistributedAnalysisModel_possibleConstructorReturn(this, result); }; } + +function DistributedAnalysisModel_possibleConstructorReturn(self, call) { if (call && (DistributedAnalysisModel_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DistributedAnalysisModel_assertThisInitialized(self); } + +function DistributedAnalysisModel_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DistributedAnalysisModel_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DistributedAnalysisModel_getPrototypeOf(o) { DistributedAnalysisModel_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DistributedAnalysisModel_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +/** + * @class DistributedAnalysisModel + * @aliasclass Components.DistributedAnalysisModel + * @deprecatedclassinstance L.supermap.components.DistributedAnalysisModel + * @classdesc 分布式分析组件数据模型。 + * @private + * @category Components DistributedAnalysis + * @param {string} processingUrl - 分布式分析地址。 + * @fires DistributedAnalysisModel#datasetsloaded + * @fires DistributedAnalysisModel#datasetinfoloaded + * @extends {L.Evented} + */ + +var DistributedAnalysisModel = /*#__PURE__*/function (_L$Evented) { + DistributedAnalysisModel_inherits(DistributedAnalysisModel, _L$Evented); + + var _super = DistributedAnalysisModel_createSuper(DistributedAnalysisModel); + + function DistributedAnalysisModel() { + DistributedAnalysisModel_classCallCheck(this, DistributedAnalysisModel); + + return _super.apply(this, arguments); + } + + DistributedAnalysisModel_createClass(DistributedAnalysisModel, [{ + key: "initialize", + value: function initialize(processingUrl) { + this.processingUrl = processingUrl; + } + /** + * @function DistributedAnalysisModel.prototype.getDatasetsName + * @description 获取所有可进行分布式分析的数据集名称。 + * @param {string} url - 服务地址。 + */ + + }, { + key: "getDatasetsName", + value: function getDatasetsName() { + var url = this.processingUrl; + this.dataset = []; + this.dataset['datasetNames'] = []; + this.dataset['childUrl'] = []; + var host = 'http://' + url.split('/')[2]; + var sharefileUrl = host + '/iserver/services/datacatalog/rest/datacatalog/sharefile.json'; + var datasetsUrl = host + '/iserver/services/datacatalog/rest/datacatalog/relationship/datasets.json'; + var me = this; + FetchRequest.get(sharefileUrl).then(function (response) { + return response.json(); + }).then(function (result) { + me.dataset['datasetNames'] = me.dataset['datasetNames'].concat(result.datasetNames); + me.dataset['childUrl'] = me.dataset['childUrl'].concat(result.childUriList); + var _me = me; + FetchRequest.get(datasetsUrl).then(function (response) { + return response.json(); + }).then(function (result) { + _me.dataset['datasetNames'] = _me.dataset['datasetNames'].concat(result.datasetNames); + _me.dataset['childUrl'] = _me.dataset['childUrl'].concat(result.childUriList); + var datasetHash = []; + + for (var i in _me.dataset['datasetNames']) { + datasetHash[_me.dataset.datasetNames[i]] = _me.dataset.childUrl[i]; + } + /** + * @event DistributedAnalysisModel#datasetsloaded + * @description 数据集获取完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {Array.} result.dataset - 数据集名称数组。 + * @property {Object} result.datasetHash - 数据集名称数组与数据集 URL 一一对应的对象。 + */ + + + _me.fire('datasetsloaded', { + 'result': { + 'dataset': _me.dataset, + 'datasetHash': datasetHash + } + }); + }); + }); + } + /** + * @function DistributedAnalysisModel.prototype.getDatasetInfo + * @description 获取数据集类型和字段。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + + }, { + key: "getDatasetInfo", + value: function getDatasetInfo(datasetUrl) { + var type; + var me = this; + FetchRequest.get(datasetUrl).then(function (response) { + return response.json(); + }).then(function (data) { + var datasetInfo = data.datasetInfo; + + if (datasetInfo.datasetType === 'LINE' || datasetInfo.type === 'LINE') { + type = 'LINE'; + } else if (datasetInfo.datasetType === 'POINT' || datasetInfo.type === 'POINT' || datasetInfo.type === 'CSV') { + type = 'POINT'; + } else if (datasetInfo.datasetType === 'REGION' || datasetInfo.type === 'REGION') { + type = 'REGION'; + } + + var fields = []; + var fieldInfos = datasetInfo.fieldInfos || datasetInfo.fieldInfo || null; + + if (fieldInfos) { + for (var i in fieldInfos) { + fields.push(fieldInfos[i].name); + } + /** + * @event DistributedAnalysisModel#datasetinfoloaded + * @description 数据集查询完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {string} result.type - 数据集类型。 + * @property {Array.} result.fields - 数据集字段。 + */ + + + me.fire('datasetinfoloaded', { + 'result': { + 'type': type, + 'fields': fields + } + }); + } else { + var fieldsUrl = data.childUriList[0].replace('//fields', '/fields'); + FetchRequest.get(fieldsUrl).then(function (response) { + return response.json(); + }).then(function (data) { + var fieldNames = data.fieldNames; + var fields = []; + + for (var _i in fieldNames) { + fields.push(fieldNames[_i]); + } + + me.fire('datasetinfoloaded', { + 'result': { + 'type': type, + 'fields': fields + } + }); + }); + } + }); + } + }]); + + return DistributedAnalysisModel; +}((external_L_default()).Evented); +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisViewModel.js +function DistributedAnalysisViewModel_typeof(obj) { "@babel/helpers - typeof"; return DistributedAnalysisViewModel_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DistributedAnalysisViewModel_typeof(obj); } + +function DistributedAnalysisViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DistributedAnalysisViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DistributedAnalysisViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) DistributedAnalysisViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) DistributedAnalysisViewModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DistributedAnalysisViewModel_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DistributedAnalysisViewModel_setPrototypeOf(subClass, superClass); } + +function DistributedAnalysisViewModel_setPrototypeOf(o, p) { DistributedAnalysisViewModel_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DistributedAnalysisViewModel_setPrototypeOf(o, p); } + +function DistributedAnalysisViewModel_createSuper(Derived) { var hasNativeReflectConstruct = DistributedAnalysisViewModel_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DistributedAnalysisViewModel_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DistributedAnalysisViewModel_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DistributedAnalysisViewModel_possibleConstructorReturn(this, result); }; } + +function DistributedAnalysisViewModel_possibleConstructorReturn(self, call) { if (call && (DistributedAnalysisViewModel_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DistributedAnalysisViewModel_assertThisInitialized(self); } + +function DistributedAnalysisViewModel_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DistributedAnalysisViewModel_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DistributedAnalysisViewModel_getPrototypeOf(o) { DistributedAnalysisViewModel_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DistributedAnalysisViewModel_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + +/** + * @class DistributedAnalysisViewModel + * @aliasclass Components.DistributedAnalysisViewModel + * @deprecatedclassinstance L.supermap.components.distributedAnalysisViewModel + * @classdesc 分布式分析组件功能类。 + * @version 9.1.1 + * @category Components DistributedAnalysis + * @param {string} processingUrl - 分布式分析地址。 + * @fires DistributedAnalysisViewModel#datasetsloaded + * @fires DistributedAnalysisViewModel#datasetinfoloaded + * @fires DistributedAnalysisViewModel#analysisfailed + * @fires DistributedAnalysisViewModel#analysissucceeded + * @fires DistributedAnalysisViewModel#layerloaded + * @fires DistributedAnalysisViewModel#layersremoved + * @extends {L.Evented} + * @usage + */ + +var DistributedAnalysisViewModel = /*#__PURE__*/function (_L$Evented) { + DistributedAnalysisViewModel_inherits(DistributedAnalysisViewModel, _L$Evented); + + var _super = DistributedAnalysisViewModel_createSuper(DistributedAnalysisViewModel); + + function DistributedAnalysisViewModel() { + DistributedAnalysisViewModel_classCallCheck(this, DistributedAnalysisViewModel); + + return _super.apply(this, arguments); + } + + DistributedAnalysisViewModel_createClass(DistributedAnalysisViewModel, [{ + key: "initialize", + value: function initialize(processingUrl) { + this.processingUrl = processingUrl; + } + /** + * @function DistributedAnalysisViewModel.prototype.getDatasetsName + * @description 获取所有数据集名称。 + * @param {string} url - 服务地址。 + */ + + }, { + key: "getDatasetsName", + value: function getDatasetsName() { + var processingUrl = this.processingUrl; + this.resultLayers = []; + this.datasetNames = []; + this.distributedAnalysisModel = new DistributedAnalysisModel(processingUrl); + this.distributedAnalysisModel.getDatasetsName(); + var me = this; + this.distributedAnalysisModel.on('datasetsloaded', function (e) { + /** + * @event DistributedAnalysisViewModel#datasetsloaded + * @description 数据集获取完成之后触发。 + * @property {Object} result - 数据集数据。 + */ + me.fire('datasetsloaded', { + 'result': e.result + }); + }); + } + /** + * @function DistributedAnalysisViewModel.prototype.getDatasetInfo + * @description 获取数据集类型和字段。 + * @param {string} datasetUrl - 数据集资源地址。 + */ + + }, { + key: "getDatasetInfo", + value: function getDatasetInfo(datasetUrl) { + // 判断数据集类型 + this.distributedAnalysisModel.getDatasetInfo(datasetUrl); + var me = this; + this.distributedAnalysisModel.on('datasetinfoloaded', function (e) { + var type = e.result.type; + var fields = e.result.fields; + /** + * @event DistributedAnalysisViewModel#datasetinfoloaded + * @description 数据集类型与字段获取完成之后触发。 + * @property {Object} result - 数据集数据。 + * @property {string} result.type - 数据集类型。 + * @property {Array.} result.fields - 数据集所含有的字段。 + */ + + me.fire('datasetinfoloaded', { + 'result': { + 'type': type, + 'fields': fields + } + }); + }); + } + /** + * @function DistributedAnalysisViewModel.prototype.analysis + * @description 分布式分析。 + * @param {Object.} params - 参数。 + * @param {KernelDensityJobParameter} params.analysisParam - 密度分析任务参数类。 + * @param {string} [params.resultLayerName] - 结果图层名称。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + + }, { + key: "analysis", + value: function analysis(params, map) { + var processingService = new ProcessingService(this.processingUrl); + + if (params.analysisParam instanceof KernelDensityJobParameter) { + var kernelDensityJobParameter = params.analysisParam; + var me = this; + processingService.addKernelDensityJob(kernelDensityJobParameter, function (serviceResult) { + if (serviceResult.error) { + /** + * @event DistributedAnalysisViewModel#analysisfailed + * @description 分析失败后触发。 + */ + me.fire('analysisfailed', { + 'error': serviceResult.error + }); + return; + } + + serviceResult.result.setting.serviceInfo.targetServiceInfos.map(function (info) { + if (info.serviceType === 'RESTMAP') { + FetchRequest.get(info.serviceAddress + '/maps').then(function (response) { + return response.json(); + }).then(function (result) { + var mapUrl = result[0].path; + /** + * @event DistributedAnalysisViewModel#analysissucceeded + * @description 分析成功后服务器返回的数据。 + */ + + me.fire('analysissucceed', { + 'result': result + }); + var layer = tiledMapLayer(mapUrl, { + noWrap: true, + transparent: true + }); + me.resultLayers.push(layer); + layer.addTo(map); + /** + * @event DistributedAnalysisViewModel#layerloaded + * @description 分析结果图层加载完成后触发。 + * @property {L.GeoJSON} layer - 结果图层。 + * @property {string} name - 结果图层名称。 + */ + + var date = new Date(); + var resultLayerName = params.resultLayerName || date.getTime(); + me.fire('layerloaded', { + 'layer': layer, + 'name': resultLayerName + }); + }); + } + + return info; + }); + }); + } + } + /** + * @function DistributedAnalysisViewModel.prototype.clearLayers + * @description 清空分析图层。 + */ + + }, { + key: "clearLayers", + value: function clearLayers() { + for (var i in this.resultLayers) { + this.resultLayers[i].remove(); + } + /** + * @event DistributedAnalysisViewModel#layersremoved + * @description 图层删除后触发。 + * @property {Array.} layers - 结果图层数组。 + */ + + + this.fire('layersremoved', { + 'layers': this.resultLayers + }); + this.resultLayers = []; + } + }]); + + return DistributedAnalysisViewModel; +}((external_L_default()).Evented); +var distributedAnalysisViewModel = function distributedAnalysisViewModel(options) { + return new DistributedAnalysisViewModel(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/distributedanalysis/DistributedAnalysisView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + +/** + * @class DistributedAnalysisView + * @aliasclass Components.DistributedAnalysisView + * @deprecatedclassinstance L.supermap.components.distributedAnalysis + * @classdesc 分布式分析组件。 + * @version 9.1.1 + * @param {string} processingUrl - 分布式分析服务地址。 + * @param {Object} options - 参数。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DistributedAnalysisView#analysissucceeded + * @fires DistributedAnalysisView#analysisfailed + * @fires DistributedAnalysisView#layersremoved + * @extends {ComponentsViewBase} + * @category Components DistributedAnalysis + * @usage + */ + +var DistributedAnalysisView = ComponentsViewBase.extend({ + initialize: function initialize(processingUrl, options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); //初始化 ViewModel: + + this.viewModel = new DistributedAnalysisViewModel(processingUrl); + }, + + /** + * @function DistributedAnalysisView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function onAdd(map) { + this._fillDataToView(); + + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DistributedAnalysisView.prototype._fillDataToView + * @description 添加数据。 + * @private + */ + _fillDataToView: function _fillDataToView() { + var _this = this; + + // 获取数据集 + this.viewModel.on('datasetsloaded', function (e) { + var datasetOptionsArr = e.result.dataset.datasetNames; + _this.datasetSelect.innerHTML = ''; + + _this._createOptions(_this.datasetSelect, datasetOptionsArr); + + _this.datasetSelectObj.optionClickEvent(_this.datasetSelect, _this.datasetSelectName, _this.datasetSelectOnchange); + + _this.dataHash = e.result.datasetHash; + }); + this.viewModel.getDatasetsName(); + }, + + /** + * @function DistributedAnalysisView.prototype._initView + * @description 创建分布式分析组件。 + * @returns {HTMLElement} + * @private + * @override + */ + _initView: function _initView() { + var _this2 = this; + + // 组件 container + var container = new CommonContainer({ + title: Lang.i18n('title_distributedAnalysis') + }).getElement(); + container.classList.add('component-analysis'); + container.children[0].style.fontSize = '12px'; // 组件内容 container + + var componentContentContainer = external_L_default().DomUtil.create('div', 'component-content component-content--scroll component-content--analysis', container); // 分析方式下拉框 + + var analysisOptionsArr = [{ + 'title': Lang.i18n('text_densityAnalysis'), + 'dataValue': 'density', + 'remark': Lang.i18n('text_CalculateTheValuePerUnitArea'), + 'icon': { + 'className': 'component-analyst-density-img' + } + }]; + var dropDownBox = new DropDownBox(analysisOptionsArr).getElement(); + componentContentContainer.appendChild(dropDownBox); // 选中的 dropDownItem + + var dropDownTop = dropDownBox.children[0].children[0].children[0]; // 各分析参数 container + + var analysisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); + var analysisType = external_L_default().DomUtil.create('div', 'analysistype', analysisTypeContainer); + var analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisType); // 数据集下拉框 + + var datasetSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', analysisLayer); + var datasetOptions = { + 'optionsArr': [Lang.i18n('text_option_selectDataset')], + 'labelName': Lang.i18n('text_label_dataset'), + "optionsClickCb": datasetSelectOnchange.bind(this) + }; + var datasetSelectObj = new Select(datasetOptions); + var datasetSelectTool = datasetSelectObj.getElement(); + this.datasetSelectObj = datasetSelectObj; + datasetSelectControl.appendChild(datasetSelectTool); // 选中的 dataset + + var datasetSelectName = datasetSelectTool.children[1].children[0]; + this.datasetSelectName = datasetSelectName; // dataset select container + + var datasetSelect = datasetSelectTool.children[1].children[2].children[0].children[0]; + datasetSelect.children[0].style.display = 'none'; + this.datasetSelect = datasetSelect; // 分析方法下拉框 & 网格面类型下拉框 + + var analyseIDW = external_L_default().DomUtil.create('div', 'component-analysis__idw', analysisLayer); + var analysisOptions = [{ + 'optionsArr': [Lang.i18n('text_option_simplePointDensityAnalysis'), Lang.i18n('text_option_nuclearDensityAnalysis')], + 'labelName': Lang.i18n('text_label_analyticalMethod') // 'optionsClickCb': analysisMethodSelectOnchange.bind(this) + + }, { + 'optionsArr': [Lang.i18n('text_option_quadrilateral'), Lang.i18n('text_option_hexagon')], + 'labelName': Lang.i18n('text_label_meshType') + }]; // 分析参数 select control + + var analysisSelectControl = external_L_default().DomUtil.create('div', 'component-analysis__idw__selecttool', analyseIDW); + + for (var i in analysisOptions) { + var selectTool = new Select(analysisOptions[i]).getElement(); + analysisSelectControl.appendChild(selectTool); + } // 权重选择下拉框 + + + var weightFieldsSelectOptions = { + 'optionsArr': [Lang.i18n('text_option_notSet')], + 'labelName': Lang.i18n('text_label_weightField') + }; + var weightFieldsSelectObj = new Select(weightFieldsSelectOptions); + var weightFieldsSelectTool = weightFieldsSelectObj.getElement(); + analysisSelectControl.appendChild(weightFieldsSelectTool); + this.weightFieldsSelectObj = weightFieldsSelectObj; // 分析方法选中值 & option attr设置 + + var analysisMethodSelectName = analysisSelectControl.children[0].children[1].children[0]; + analysisMethodSelectName.setAttribute('data-value', '0'); + var analysisMethodSelect = analysisSelectControl.children[0].children[1].children[2].children[0].children[0]; + var analysisMethodDV = ['0', '1']; + + this._setEleAtribute(analysisMethodDV, 'data-value', analysisMethodSelect.children); // 网格面类型选中值 & option attr设置 + + + var gridTypeSelectName = analysisSelectControl.children[1].children[1].children[0]; + gridTypeSelectName.setAttribute('data-value', '0'); + var gridTypeSelect = analysisSelectControl.children[1].children[1].children[2].children[0].children[0]; + var gridTypeDV = ['0', '1']; + + this._setEleAtribute(gridTypeDV, 'data-value', gridTypeSelect.children); // 权重值选中值 + + + var weightFieldsSelectName = analysisSelectControl.children[2].children[1].children[0]; + var weightFieldsSelect = analysisSelectControl.children[2].children[1].children[2].children[0].children[0]; // 分析范围 & 网格大小 & 搜索半径 & 面积单位 + // 分析范围 + + var inputOptions = [{ + 'spanName': Lang.i18n('text_label_queryRange'), + 'value': '' + }]; + + for (var _i in inputOptions) { + this._creatInputBox(inputOptions[_i], analysisSelectControl); + } + + var queryRangeInput = analysisSelectControl.children[3].children[1]; + queryRangeInput.setAttribute('placeholder', Lang.i18n('text_label_queryRangeTips')); + queryRangeInput.title = Lang.i18n('text_label_queryRangeTips'); // 网格大小 + + var gridSizeUnitSelectOptions = { + 'optionsArr': ['Meter', 'Kilometer', 'Yard', 'Foot', 'Mile'] + }; + var gridSizeOptions = { + 'labelName': Lang.i18n('text_label_gridSizeInMeters'), + 'selectOptions': gridSizeUnitSelectOptions + }; + + var gridSizeContainer = this._creatUnitSelectBox(gridSizeOptions, analysisSelectControl); + + var gridSizeInput = gridSizeContainer.children[1].children[0]; + gridSizeInput.value = '1000'; + var gridSizeUnitSelectName = gridSizeContainer.children[1].children[1].children[0].children[0].children[0]; // 搜索半径 + + var searchRadiusUnitSelectOptions = { + 'optionsArr': ['Meter', 'Kilometer', 'Yard', 'Foot', 'Mile'] + }; + var searchRadiusOptions = { + 'labelName': Lang.i18n('text_label_searchRadius'), + 'selectOptions': searchRadiusUnitSelectOptions + }; + + var searchRadiusContainer = this._creatUnitSelectBox(searchRadiusOptions, analysisSelectControl); + + var searchRadiusInput = searchRadiusContainer.children[1].children[0]; + searchRadiusInput.value = '300'; + var searchRadiusSelectName = searchRadiusContainer.children[1].children[1].children[0].children[0].children[0]; // 面积单位 + + var areaUnitSelectOptions = { + 'labelName': Lang.i18n('text_label_areaUnit'), + 'optionsArr': ['SquareMile', 'SquareMeter', 'Hectare', 'Acre', 'SquareFoot', 'SquareYard'] + }; + var areaUnitSelectTool = new Select(areaUnitSelectOptions).getElement(); + analysisSelectControl.appendChild(areaUnitSelectTool); + var areaUnitSelectName = areaUnitSelectTool.children[1].children[0]; // 专题图分段 + + var rangeContent = external_L_default().DomUtil.create('div', 'range-content', analysisType); + var rangeContentOptions = { + 'optionsArr': [Lang.i18n('text_option_notSet'), Lang.i18n('text_option_equidistantSegmentation'), Lang.i18n('text_option_logarithm'), Lang.i18n('text_option_equalCountingSegment'), Lang.i18n('text_option_squareRootSegmentation')], + 'labelName': Lang.i18n('text_label_thematicMapSegmentationMode'), + "optionsClickCb": themeModelSelectOnchange + }; + rangeContent.appendChild(new Select(rangeContentOptions).getElement()); + var themeModelSelectName = rangeContent.children[0].children[1].children[0]; + themeModelSelectName.setAttribute('data-value', 'NOTSET'); + var themeModelSelect = rangeContent.children[0].children[1].children[2].children[0].children[0]; + var themeModelDataValue = ['NOTSET', 'EQUALINTERVAL', 'LOGARITHM', 'QUANTILE', 'SQUAREROOT']; + + this._setEleAtribute(themeModelDataValue, 'data-value', themeModelSelect.children); + + var rangeContentParamInput = this._creatInputBox({ + 'spanName': Lang.i18n('text_label_thematicMapSegmentationParameters'), + 'value': '20' + }, rangeContent); + + rangeContentParamInput.classList.add('hidden'); + var rangeContentModelSelectTool = new Select({ + 'optionsArr': [Lang.i18n('text_option_greenOrangePurpleGradient'), Lang.i18n('text_option_greenOrangeRedGradient'), Lang.i18n('text_option_rainbowGradient'), Lang.i18n('text_option_spectralGradient'), Lang.i18n('text_option_terrainGradient')], + 'labelName': Lang.i18n('text_label_thematicMapColorGradientMode') + }).getElement(); + rangeContent.appendChild(rangeContentModelSelectTool); + rangeContentModelSelectTool.classList.add('hidden'); + var rangeContentModelSelect = rangeContentModelSelectTool.children[1].children[2].children[0].children[0]; + var rangeContentModelSelectName = rangeContentModelSelectTool.children[1].children[0]; + rangeContentModelSelectName.setAttribute('data-value', 'GREENORANGEVIOLET'); + var rangeContentModelDV = ['GREENORANGEVIOLET', 'GREENORANGERED', 'RAINBOW', 'SPECTRUM', 'TERRAIN']; + + this._setEleAtribute(rangeContentModelDV, 'data-value', rangeContentModelSelect.children); // 专题图分段模式下拉框 onchange 事件 + + + function themeModelSelectOnchange(option) { + if (option.getAttribute('data-value') !== 'NOTSET') { + rangeContentParamInput.classList.remove('hidden'); + rangeContentModelSelectTool.classList.remove('hidden'); + } else { + rangeContentParamInput.classList.add('hidden'); + rangeContentModelSelectTool.classList.add('hidden'); + } + } // 结果图层 + + + var resultLayerContainer = external_L_default().DomUtil.create('div', '', analysisType); + var resultLayerSpan = external_L_default().DomUtil.create('span', '', resultLayerContainer); + resultLayerSpan.innerHTML = Lang.i18n('text_label_resultLayerName'); + var resultLayerInput = external_L_default().DomUtil.create('input', 'component-distributeanalysis__input', resultLayerContainer); // 分析 & 分析中 & 取消 按钮 + + var runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisTypeContainer); + var runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + var analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_analyze'); + var analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + var analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising', analysingContainer); + analysisingBtn.style.width = '200px'; + var svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.innerHTML = "\n \n \n \n \n "; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_analyzing'); // 删除按钮 + + var deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.id = 'deleteLayersBtn'; + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheAnalysisLayer'); // 交互 + // 弹框 + + this.messageBox = new MessageBox(); // 数据集下拉框 onchange 事件 + + this.datasetSelectOnchange = datasetSelectOnchange.bind(this); + + function datasetSelectOnchange(option) { + this.messageBox.closeView(); + + if (this.dataHash) { + weightFieldsSelect.innerHTML = ''; // 获取当前选中数据集类型 + + var datasetUrl = this.dataHash[option.title]; // 判断当前选中数据集是否支持该选中分析类,并填充分析权重字段 + + var _me = this; + + this.viewModel.on('datasetinfoloaded', function (e) { + weightFieldsSelectName.title = Lang.i18n('text_option_notSet'); + weightFieldsSelectName.innerHTML = Lang.i18n('text_option_notSet'); + weightFieldsSelect.innerHTML = ''; + var analyseType = dropDownTop.getAttribute('data-value'); + var type = e.result.type; + var fields = e.result.fields; + + if (analyseType === 'density') { + if (type === 'REGION' || type === 'LINE') { + _me.messageBox.showView(Lang.i18n('msg_datasetOrMethodUnsupport'), "failure"); + } else { + _me.messageBox.closeView(); + + _me._createOptions(weightFieldsSelect, fields); + + _me.weightFieldsSelectObj.optionClickEvent(weightFieldsSelect, weightFieldsSelectName); + } + } + }); + this.viewModel.getDatasetInfo(datasetUrl); + } + } // 分析按钮点击事件 + + + analysisBtn.onclick = function () { + _this2.messageBox.closeView(); + + var params = getAnalysisParam(); + + if (datasetSelectName.title === Lang.i18n('text_option_selectDataset')) { + _this2.messageBox.showView(Lang.i18n('msg_selectDataset'), "failure"); + } else if (weightFieldsSelectName.title === Lang.i18n('text_option_notSet')) { + _this2.messageBox.showView(Lang.i18n('msg_setTheWeightField'), "failure"); + } else { + _this2.messageBox.closeView(); + + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + + _this2.viewModel.on('layerloaded', function (e) { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event DistributedAnalysisView#analysissucceeded + * @description 分析完成后触发。 + * @property {L.GeoJSON} layer - 结果图层。 + * @property {string} name - 结果图层名称。 + */ + + _this2._event.fire('analysissucceeded', { + 'layer': e.layer, + 'name': e.name + }); + }); + + _this2.viewModel.on('analysisfailed', function (e) { + _this2.messageBox.showView(Lang.i18n('msg_theFieldNotSupportAnalysis'), "failure"); + + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + /** + * @event DistributedAnalysisView#analysisfailed + * @description 分析失败后触发。 + * @property {string} error - 服务器返回的错误。 + */ + + _this2._event.fire('analysisfailed', { + 'error': e.error + }); + }); + + _this2.viewModel.analysis(params, _this2.map); + } + }; // 删除按钮点击事件 + + + deleteLayersBtn.onclick = function () { + /** + * @event DistributedAnalysisView#layersremoved + * @description 结果图层删除后触发。 + * @property {Array.} layers - 被删除的结果图层。 + */ + _this2.viewModel.on('layersremoved', function (e) { + _this2._event.fire('layersremoved', { + 'layers': e.layers + }); + }); + + _this2.viewModel.clearLayers(); + }; // 获取分析参数 + + + function getAnalysisParam() { + var analysisType = dropDownTop.getAttribute('data-value'); + var analysisMethod = analysisMethodSelectName.getAttribute('data-value'); + var gridType = gridTypeSelectName.getAttribute('data-value'); + var queryRange = queryRangeInput.value; + var gridSizeUnit = gridSizeUnitSelectName.title; + var searchRadiusUnit = searchRadiusSelectName.title; + var areaUnit = areaUnitSelectName.title; + var colorGradientType = rangeContentModelSelectName.getAttribute('data-value'); + var themeModel = themeModelSelectName.getAttribute('data-value'); + var date = new Date(); + var resultLayerName = resultLayerInput.value || date.getTime(); + var mappingParameter; + + if (themeModel === 'NOTSET') { + mappingParameter = ''; + } else { + mappingParameter = { + 'rangeMode': themeModel, + 'rangeCount': rangeContentParamInput.value, + 'colorGradientType': colorGradientType + }; + } + + var analysisParam; + + if (analysisType === 'density') { + analysisParam = new KernelDensityJobParameter({ + 'datasetName': datasetSelectName.title, + 'method': analysisMethod, + 'meshType': gridType, + 'resolution': gridSizeInput.value, + 'fields': weightFieldsSelectName.title, + 'radius': searchRadiusInput.value, + 'meshSizeUnit': gridSizeUnit, + 'radiusUnit': searchRadiusUnit, + 'areaUnit': areaUnit, + 'query': queryRange, + 'mappingParameters': new MappingParameters({ + 'rangeMode': mappingParameter.rangeMode, + 'rangeCount': mappingParameter.rangeCount, + 'colorGradientType': mappingParameter.colorGradientType + }) + }); + } + + var params = { + 'analysisParam': analysisParam, + 'resultLayerName': resultLayerName + }; + return params; + } //阻止 map 默认事件 + + + this._preventMapEvent(container, this.map); + + return container; + }, + + /** + * @function DistributedAnalysisView.prototype._createOptions + * @description 创建下拉框。 + * @private + */ + _createOptions: function _createOptions(container, optionsArr) { + for (var i in optionsArr) { + var option = document.createElement('div'); + option.className = 'component-selecttool__option'; + option.title = optionsArr[i]; + option.innerHTML = optionsArr[i]; + option.setAttribute('data-value', optionsArr[i]); + container.appendChild(option); + } + }, + + /** + * @function DistributedAnalysisView.prototype._creatInputBox + * @description 创建输入框。 + * @private + */ + _creatInputBox: function _creatInputBox(inputOptions, parentEle) { + var div = external_L_default().DomUtil.create('div', '', parentEle); + var span = external_L_default().DomUtil.create('span', '', div); + span.innerHTML = inputOptions.spanName; + var input = external_L_default().DomUtil.create('input', '', div); + input.value = inputOptions.value; + input.className = 'component-distributeanalysis__input'; + return div; + }, + + /** + * @function DistributedAnalysisView.prototype._creatUnitSelectBox + * @description 创建选择框。 + * @private + */ + _creatUnitSelectBox: function _creatUnitSelectBox(options, parentEle) { + var unitSelectBoxContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--radius', parentEle); + var unitSelectSpan = external_L_default().DomUtil.create('span', '', unitSelectBoxContainer); + unitSelectSpan.innerHTML = options.labelName; + var unitSelectInputContainer = external_L_default().DomUtil.create('div', '', unitSelectBoxContainer); + external_L_default().DomUtil.create('input', 'buffer-radius-input', unitSelectInputContainer); + var unitSelectUnitContainer = external_L_default().DomUtil.create('div', 'component-clientcomputation__buffer--unit', unitSelectInputContainer); + var unitSelectOptions = options.selectOptions; + var unitSelectTool = new Select(unitSelectOptions).getElement(); + unitSelectUnitContainer.appendChild(unitSelectTool); + return unitSelectBoxContainer; + }, + + /** + * @function DistributedAnalysisView.prototype._setEleAtribute + * @description 设置元素的属性名和属性值。 + * @private + */ + _setEleAtribute: function _setEleAtribute(daraValueArr, attributeName, eleArr) { + for (var i = 0; i < eleArr.length; i++) { + eleArr[i].setAttribute(attributeName, daraValueArr[i]); + } + } +}); +var distributedAnalysisView = function distributedAnalysisView(options) { + return new DistributedAnalysisView(options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/dataservicequery/DataServiceQueryViewModel.js +function DataServiceQueryViewModel_typeof(obj) { "@babel/helpers - typeof"; return DataServiceQueryViewModel_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, DataServiceQueryViewModel_typeof(obj); } + +function DataServiceQueryViewModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function DataServiceQueryViewModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function DataServiceQueryViewModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataServiceQueryViewModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataServiceQueryViewModel_defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } + +function DataServiceQueryViewModel_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) DataServiceQueryViewModel_setPrototypeOf(subClass, superClass); } + +function DataServiceQueryViewModel_setPrototypeOf(o, p) { DataServiceQueryViewModel_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataServiceQueryViewModel_setPrototypeOf(o, p); } + +function DataServiceQueryViewModel_createSuper(Derived) { var hasNativeReflectConstruct = DataServiceQueryViewModel_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = DataServiceQueryViewModel_getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = DataServiceQueryViewModel_getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return DataServiceQueryViewModel_possibleConstructorReturn(this, result); }; } + +function DataServiceQueryViewModel_possibleConstructorReturn(self, call) { if (call && (DataServiceQueryViewModel_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return DataServiceQueryViewModel_assertThisInitialized(self); } + +function DataServiceQueryViewModel_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function DataServiceQueryViewModel_isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + +function DataServiceQueryViewModel_getPrototypeOf(o) { DataServiceQueryViewModel_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataServiceQueryViewModel_getPrototypeOf(o); } + +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + +/** + * @class DataServiceQueryViewModel + * @aliasclass Components.DataServiceQueryViewModel + * @deprecatedclassinstance L.supermap.components.dataServiceQueryViewModel + * @classdesc 数据服务查询组件功能类。 + * @version 9.1.1 + * @category Components DataServiceQuery + * @param {string} dataserviceUrl - 数据服务地址。 + * @fires DataServiceQueryViewModel#getfeaturessucceeded + * @fires DataServiceQueryViewModel#getfeaturesfailed + * @extends {L.Evented} + * @usage + */ + +var DataServiceQueryViewModel = /*#__PURE__*/function (_L$Evented) { + DataServiceQueryViewModel_inherits(DataServiceQueryViewModel, _L$Evented); + + var _super = DataServiceQueryViewModel_createSuper(DataServiceQueryViewModel); + + function DataServiceQueryViewModel() { + DataServiceQueryViewModel_classCallCheck(this, DataServiceQueryViewModel); + + return _super.apply(this, arguments); + } + + DataServiceQueryViewModel_createClass(DataServiceQueryViewModel, [{ + key: "initialize", + value: function initialize(dataserviceUrl) { + this.dataserviceUrl = dataserviceUrl; + this.resultLayers = []; + } + /** + * @function DataServiceQueryViewModel.prototype.getFeatures + * @description 获取 features。 + * @param {(GetFeaturesByIDsParameters|GetFeaturesByBufferParameters|GetFeaturesByBoundsParameters|GetFeaturesBySQLParameters|GetFeaturesByGeometryParameters)} queryParam - 查询参数。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + + }, { + key: "getFeatures", + value: function getFeatures(queryParam, map) { + var dataserviceUrl = this.dataserviceUrl; + var me = this; + var featureService = FeatureService_featureService(dataserviceUrl); + + if (queryParam instanceof GetFeaturesByIDsParameters) { + featureService.getFeaturesByIDs(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesBySQLParameters) { + featureService.getFeaturesBySQL(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByBoundsParameters) { + featureService.getFeaturesByBounds(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByBufferParameters) { + featureService.getFeaturesByBuffer(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } else if (queryParam instanceof GetFeaturesByGeometryParameters) { + featureService.getFeaturesByGeometry(queryParam, function (serviceResult) { + me._getQureyResult(serviceResult, map); + }); + } + } + /** + * @function DataServiceQueryViewModel.prototype._getQureyResult + * @description 获取查询结果。 + * @private + * @param {Object} serviceResult - 返回查询结果。 + * @param {L.Map} map - Leaflet Map 对象。 + */ + + }, { + key: "_getQureyResult", + value: function _getQureyResult(serviceResult, map) { + if (serviceResult.error) { + /** + * @event DataServiceQueryViewModel#getfeaturesfailed + * @description features 获取失败时触发。 + * @property {string} error - 服务器返回的错误。 + */ + this.fire('getfeaturesfailed', { + 'error': serviceResult.error + }); + return; + } + + var resultLayer = external_L_default().geoJSON(serviceResult.result.features, { + onEachFeature: function onEachFeature(feature, layer) { + layer.bindPopup("ID: " + feature.properties.SMID); + }, + pointToLayer: function pointToLayer(geoJsonPoint, latLng) { + return external_L_default().circleMarker(latLng, { + radius: 6 + }); + } + }).addTo(map); + this.resultLayers.push(resultLayer); + /** + * @event DataServiceQueryViewModel#getfeaturessucceeded + * @description features 获取成功时触发。 + * @property {Object} result - 服务器返回的结果。 + */ + + this.fire('getfeaturessucceeded', { + 'result': serviceResult.result.features + }); + } + /** + * @function DataServiceQueryViewModel.prototype.clearLayers + * @description 清除所有结果图层。 + */ + + }, { + key: "clearLayers", + value: function clearLayers() { + for (var i in this.resultLayers) { + this.resultLayers[i].remove(); + } + + this.resultLayers = []; + } + }]); + + return DataServiceQueryViewModel; +}((external_L_default()).Evented); +var dataServiceQueryViewModel = function dataServiceQueryViewModel(dataserviceUrl) { + return new dataServiceQueryViewModel(dataserviceUrl); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/dataservicequery/DataServiceQueryView.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + +/** + * @class DataServiceQueryView + * @aliasclass Components.DataServiceQueryView + * @deprecatedclassinstance L.supermap.components.dataServiceQuery + * @classdesc 数据服务查询组件。 + * @version 9.1.1 + * @param {string} dataServiceUrl - 数据服务地址。 + * @param {(Array.|string)} dataSetNames - 配置查询方式和查询的数据集数组。格式:" 数据源名:数据集名 ",例:"World: Countries"。 + * @param {Object} options - 参数。 + * @param {(Array.|GetFeatureMode)} [options.getFeatureMode] - 查询方式。 + * @param {string} [options.position='topright'] - 组件在地图中显示的位置( 'topleft'|'topright'|'bottomleft'|'bottomright' )。 + * @param {function} [options.style] - 默认图层样式。返回类型:点样式( maker|circleMaker);线和面样式( L.path )。 + * @param {function} [options.onEachFeature] - 给该元素绑定事件和弹窗。 + * @fires DataServiceQueryView#getfeaturessucceeded + * @fires DataServiceQueryView#getfeaturesfailed + * @category Components DataServiceQuery + * @extends {ComponentsViewBase} + * @usage + */ + +var DataServiceQueryView = ComponentsViewBase.extend({ + initialize: function initialize(dataServiceUrl, dataSetNames, options) { + ComponentsViewBase.prototype.initialize.apply(this, [options]); + this.dataServiceUrl = dataServiceUrl; + + if (!dataSetNames || dataSetNames.length === 0) { + throw new Error('Please configure the dataset of the query!'); + } + + if (dataSetNames instanceof Array) { + this.dataSetNames = dataSetNames; + } else { + this.dataSetNames = dataSetNames.split(" "); + } + }, + + /** + * @function DataServiceQueryView.prototype.onAdd + * @description 添加控件。 + * @private + * @override + */ + onAdd: function onAdd(map) { + return ComponentsViewBase.prototype.onAdd.apply(this, [map]); + }, + + /** + * @function DataServiceQueryView.prototype.onRemove + * @description 移除控件。 + * @private + */ + onRemove: function onRemove() { + this.map.off('pm:create'); + }, + + /** + * @function DataServiceQueryView.prototype.setDataSetNames + * @description 设置查询的数据集名称。 + * @param {(Array.|string)} dataSetNames - 配置查询方式和查询的数据集数组。格式:" 数据源名:数据集名 ",例:"World: Countries"; + */ + setDataSetNames: function setDataSetNames(dataSetNames) { + if (dataSetNames instanceof Array) { + this.dataSetNames = dataSetNames; + } else { + this.dataSetNames = dataSetNames.split(" "); + } + }, + + /** + * @function DataServiceQueryView.prototype.setGetFeatureMode + * @description 设置查询方式。 + * @param {(Array.|GetFeatureMode)} getFeatureMode - 查询方式。 + */ + setGetFeatureMode: function setGetFeatureMode(getFeatureMode) { + this.getFeatureMode = getFeatureMode; + + this._getFeatureModeOnchange(this.getFeatureMode); + }, + + /** + * @function DataServiceQueryView.prototype.setDataServiceUrl + * @description 设置查询的数据服务地址。 + * @param {string} dataServiceUrl - 数据服务地址。 + */ + setDataServiceUrl: function setDataServiceUrl(dataServiceUrl) { + this.dataServiceUrl = dataServiceUrl; + this.viewModel = new DataServiceQueryViewModel(this.dataServiceUrl); + }, + + /** + * @function DataServiceQueryView.prototype._getFeatureModeOnchange + * @private + * @description 改变查询方式时改变 UI。 + * @param {string} getFeatureMode - 查询方式。 + */ + _getFeatureModeOnchange: function _getFeatureModeOnchange(getFeatureMode) { + var queryModelOptionsArr; + + if (!getFeatureMode || JSON.stringify(getFeatureMode) == '{}') { + queryModelOptionsArr = ['ID', 'SQL', 'BOUNDS', 'BUFFER', 'SPATIAL']; + } else { + queryModelOptionsArr = getFeatureMode; + } + + var queryModelControl = document.getElementById('queryModelControl'); + queryModelControl.innerHTML = ''; + this.creatQueryModeSelect(queryModelOptionsArr, queryModelControl); + }, + + /** + * @function DataServiceQueryView.prototype._initView + * @description 创建数据服务查询组件。 + * @returns {HTMLElement} + * @private + */ + _initView: function _initView() { + var _this = this; + + // 初始化 ViewModel: + this.viewModel = new DataServiceQueryViewModel(this.dataServiceUrl); + this.messageBox = new MessageBox(); // 组件 container + + var container = new CommonContainer({ + title: Lang.i18n('title_dataServiceQuery') + }).getElement(); + container.classList.add('component-servicequery__container'); + container.children[0].classList.add('component-servicequery__title'); + var componentContentContainer = container.children[1]; + componentContentContainer.classList.add('component-content--scroll'); + componentContentContainer.classList.add('data-services'); // 组件内容 container + + var analyusisTypeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container', componentContentContainer); + var analysisType = external_L_default().DomUtil.create('div', 'component-servicequery__analysistype', analyusisTypeContainer); + var analysisLayer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisLayer', analysisType); + var queryModelOptionsArr, + getFeatureModeArr = this.options.getFeatureMode; // 获取查询模式 + + if (!getFeatureModeArr || JSON.stringify(getFeatureModeArr) == '{}') { + queryModelOptionsArr = ['ID', 'SQL', 'BOUNDS', 'BUFFER', 'SPATIAL']; + } else { + queryModelOptionsArr = getFeatureModeArr; + } // 查询模式 + + + var queryModelContainer = external_L_default().DomUtil.create('div', '', analysisLayer); + queryModelContainer.id = 'queryModelContainer'; + var queryModelControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', queryModelContainer); + queryModelControl.id = 'queryModelControl'; + this.creatQueryModeSelect = creatQueryModeSelect.bind(this); + this.queryModeltOnchange = queryModeltOnchange.bind(this); + this.creatQueryModeSelect(queryModelOptionsArr, queryModelControl); // 要素 ID 数组 + + var featuresIdArrContainer = external_L_default().DomUtil.create('div', 'component-analysis__container component-textarea--dataservice__container', analysisLayer); + var textareaSpan = external_L_default().DomUtil.create('span', 'textarea-name', featuresIdArrContainer); + textareaSpan.innerHTML = Lang.i18n('text_label_IDArrayOfFeatures'); + var textareaControl = external_L_default().DomUtil.create('div', 'component-textarea component-textarea--dataservice', featuresIdArrContainer); + textareaControl.id = 'getfeaturesIdArr'; + var scrollarea = external_L_default().DomUtil.create('div', 'scrollarea', textareaControl); + var scrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', scrollarea); + scrollareaContent.setAttribute('tabindex', '1'); + var getValueTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content', scrollareaContent); + getValueTextArea.value = '[1,2,3]'; + getValueTextArea.id = 'getValueTextArea'; // SQL 最多可返回的要素数量 + + var maxFeaturesContainer = external_L_default().DomUtil.create('div', 'component-servicequery__maxfeatures-container hidden', analysisLayer); + var maxFeaturesOtions = { + 'spanName': Lang.i18n('text_label_maxFeatures'), + 'value': '1000' + }; + + var maxFeaturesInputBox = this._creatInputBox(maxFeaturesOtions, maxFeaturesContainer); + + var maxFeaturesInput = maxFeaturesInputBox.children[1]; + maxFeaturesInput.classList.add('max-features-input'); // Buffer 缓冲区距离 + + var bufferDistanceContainer = external_L_default().DomUtil.create('div', 'component-servicequery__distance-container hidden', analysisLayer); + var bufferDistanceOtions = { + 'spanName': Lang.i18n('text_label_bufferDistance'), + 'value': '10' + }; + + var bufferDistanceInputBox = this._creatInputBox(bufferDistanceOtions, bufferDistanceContainer); + + var bufferDistanceInput = bufferDistanceInputBox.children[1]; // Bounds 查询范围; + + var queryRangeContainer = external_L_default().DomUtil.create('div', 'component-analysis__container component-textarea--dataservice__container hidden', analysisLayer); + var queryRangetextareaSpan = external_L_default().DomUtil.create('span', 'textarea-name', queryRangeContainer); + var queryRangeMainContent = external_L_default().DomUtil.create('div', '', queryRangeContainer); + var queryRangeIconContainer = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon-container', queryRangeMainContent); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_queryRange1'); + var queryRangeRecIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-polygon-layer bounds', queryRangeIconContainer); + var queryRangeLineIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-line-layer hidden', queryRangeIconContainer); + var queryRangePointIcon = external_L_default().DomUtil.create('div', 'component-servicequery__rangeicon supermapol-icons-point-layer hidden', queryRangeIconContainer); + var queryRangetextareaControl = external_L_default().DomUtil.create('div', 'component-textarea component-textarea--rangequery', queryRangeMainContent); + queryRangetextareaControl.id = 'getfeaturesIdArr'; + var queryRangescrollarea = external_L_default().DomUtil.create('div', '', queryRangetextareaControl); + var queryRangescrollareaContent = external_L_default().DomUtil.create('div', 'component-scrollarea-content', queryRangescrollarea); + queryRangescrollareaContent.setAttribute('tabindex', '1'); + var queryRangeTextArea = external_L_default().DomUtil.create('textarea', 'component-textarea__content component-textarea--rangequery__content', queryRangescrollareaContent); + queryRangeTextArea.value = '{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}'; // geometry 空间查询模式 + + var spatialQueryModeContainer = external_L_default().DomUtil.create('div', 'component-servicequery__spatialquerymode-container hidden', analysisLayer); + var spatialQueryModeOptions = { + 'optionsArr': ['CONTAIN', 'CROSS', 'DISJOINT', 'IDENTITY', 'INTERSECT', 'NONE', 'OVERLAP', 'TOUCH', 'WITHIN'], + 'labelName': Lang.i18n('text_label_spatialQueryMode') + }; + var spatialQueryModeControl = external_L_default().DomUtil.create('div', 'component-analysis__selecttool', spatialQueryModeContainer); + var spatialQueryModeSelectTool = new Select(spatialQueryModeOptions).getElement(); + spatialQueryModeSelectTool.children[1].classList.add('dataservice-select'); + spatialQueryModeControl.appendChild(spatialQueryModeSelectTool); + var spatialQueryModeSelectName = spatialQueryModeSelectTool.children[1].children[0]; + spatialQueryModeSelectName.id = 'spatialQueryModeSelectName'; + var spatialQueryModeSelectContent = spatialQueryModeSelectTool.children[1].children[2]; + spatialQueryModeSelectContent.classList.add('component-servicequery__spatialquerymode__selectcontent'); // 分析按钮 + + var runBtnContainer = external_L_default().DomUtil.create('div', 'component-analysis__container__analysisbtn', analysisLayer); + var runBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn', runBtnContainer); + var analysisBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis', runBtn); + analysisBtn.innerHTML = Lang.i18n('btn_query'); + var analysingContainer = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysing-container hidden', runBtn); + var analysisingBtn = external_L_default().DomUtil.create('div', 'component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying', analysingContainer); + var svgContainer = external_L_default().DomUtil.create('div', 'component-analysis__svg-container', analysisingBtn); + svgContainer.innerHTML = "\n \n \n \n \n "; + external_L_default().DomUtil.create('span', '', analysisingBtn).innerHTML = Lang.i18n('btn_querying'); // 删除按钮 + + var deleteLayersBtn = external_L_default().DomUtil.create('button', 'component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers', runBtn); + deleteLayersBtn.innerHTML = Lang.i18n('btn_emptyTheRresultLayer'); // 设置当前显示参数 + + queryModeltOnchange(queryModelOptionsArr[0]); // 分析按钮点击事件 + + var me = this; + + analysisBtn.onclick = function () { + _this.messageBox.closeView(); + + analysingContainer.style.display = 'block'; + analysisBtn.style.display = 'none'; + var queryParams = getQueryParams(); + + _this.viewModel.on('getfeaturessucceeded', function (e) { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + + if (e.result.features.length === 0) { + _this.messageBox.showView(Lang.i18n('msg_dataReturnedIsEmpty'), "success"); + } + /** + * @event DataServiceQueryView#getfeaturessucceeded + * @description features 获取成功时触发。 + * @property {Object} result - 服务器返回的结果。 + */ + + + _this._event.fire('getfeaturessucceeded', { + 'result': e.result + }); + }); + + _this.viewModel.on('getfeaturesfailed', function (e) { + analysingContainer.style.display = 'none'; + analysisBtn.style.display = 'block'; + + _this.messageBox.showView(e.error.errorMsg, "failure"); + /** + * @event DataServiceQueryView#getfeaturesfailed + * @description features 获取失败时触发。 + * @property {string} error - 服务器返回的错误。 + */ + + + _this._event.fire('getfeaturesfailed', { + 'error': e.error + }); + }); + + _this.viewModel.getFeatures(queryParams, _this.map); + }; + + var bounds, resultLayer; // 矩形 & 多边形绘制 + + queryRangeRecIcon.onclick = function (e) { + var queryModelSelectName = document.getElementById('queryModelSelectName'); + var getFeatureMode = queryModelSelectName.title; + + if (resultLayer) { + resultLayer.remove(); + } // 矩形 + + + if (getFeatureMode === 'BOUNDS') { + _this.map.pm.enableDraw('Rectangle'); // 多边形 + + } else { + _this.map.pm.enableDraw('Poly'); + } + + e.stopPropagation(); + e.preventDefault(); + }; // 线绘制 + + + queryRangeLineIcon.onclick = function (e) { + if (resultLayer) { + resultLayer.remove(); + } + + _this.map.pm.enableDraw('Line'); + + e.stopPropagation(); + e.preventDefault(); + }; // 点绘制 + + + queryRangePointIcon.onclick = function (e) { + if (resultLayer) { + resultLayer.remove(); + } + + _this.map.pm.enableDraw('Marker'); + + e.stopPropagation(); + e.preventDefault(); + }; + + this.map.on('pm:create', function (e) { + if (e.shape === 'Rectangle') { + resultLayer = e.layer; + var boundsT = resultLayer.getBounds(); + bounds = external_L_default().bounds([boundsT._southWest.lng, boundsT._southWest.lat], [boundsT._northEast.lng, boundsT._northEast.lat]); + var geo = { + 'leftBottom': { + 'x': boundsT._southWest.lng, + 'y': boundsT._southWest.lat + }, + 'rightTop': { + 'x': boundsT._northEast.lng, + 'y': boundsT._northEast.lat + } + }; + queryRangeTextArea.value = JSON.stringify(geo); + } + + if (e.shape === 'Marker') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + + _this.map.pm.disableDraw("Marker"); + } + + if (e.shape === 'Line') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + } + + if (e.shape === 'Polygon') { + resultLayer = e.layer; + queryRangeTextArea.value = JSON.stringify(e.layer.toGeoJSON()); + } + }); // 删除按钮点击事件 + + deleteLayersBtn.onclick = function () { + _this.viewModel.clearLayers(); + }; + + function creatQueryModeSelect(queryModelOptionsArr, queryModelControl) { + // 查询模式 + var queryModelSelectName; + + if (queryModelOptionsArr instanceof Array && queryModelOptionsArr.length > 1) { + var queryModelOptions = { + 'optionsArr': queryModelOptionsArr, + 'labelName': Lang.i18n('text_label_queryMode'), + 'optionsClickCb': this.queryModeltOnchange + }; + var queryModelSelectTool = new Select(queryModelOptions).getElement(); + queryModelControl.appendChild(queryModelSelectTool); + queryModelSelectName = queryModelSelectTool.children[1].children[0]; + queryModelSelectTool.children[1].classList.add('dataservice-select'); + var queryModelSelect = queryModelSelectTool.children[1]; + queryModelSelect.classList.add('dataservice-select'); + queryModelSelect.classList.add('querymodel-select'); + } else { + var span = external_L_default().DomUtil.create('span', '', queryModelContainer); + span.innerHTML = Lang.i18n('text_label_queryMode'); + queryModelSelectName = external_L_default().DomUtil.create('div', 'component-servicequery__querymode-selectname', queryModelContainer); + var text = external_L_default().DomUtil.create('span', '', queryModelSelectName); + + if (queryModelOptionsArr instanceof Array) { + text.innerHTML = queryModelOptionsArr[0]; + } else { + text.innerHTML = queryModelOptionsArr; + } + + queryModelSelectName.title = text.innerHTML; + this.queryModeltOnchange(queryModelSelectName); + } + + queryModelSelectName.id = 'queryModelSelectName'; + return queryModelSelectName; + } // 查询模式下拉框 onchange 事件 + + + function queryModeltOnchange(option) { + // 获取当前选中查询模式 + var queryModelSelectName; + + if (option.title) { + queryModelSelectName = option.title; + } else { + queryModelSelectName = option; + } // 控制部分查询参数元素隐藏和显示 + + + maxFeaturesContainer.classList.add('hidden'); + queryRangeContainer.classList.add('hidden'); + bufferDistanceContainer.classList.add('hidden'); + queryRangeLineIcon.classList.add('hidden'); + queryRangePointIcon.classList.add('hidden'); + queryRangeRecIcon.classList.remove('bounds'); + spatialQueryModeContainer.classList.add('hidden'); + textareaSpan.innerHTML = Lang.i18n('text_label_featureFilter'); + getValueTextArea.value = 'SMID<10'; + + if (queryModelSelectName === 'BUFFER' || queryModelSelectName === 'SPATIAL') { + queryRangeContainer.classList.remove('hidden'); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_geometricObject'); + queryRangeTextArea.value = '{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[84.90234375,40.25390625]}}'; + queryRangeLineIcon.classList.remove('hidden'); + queryRangePointIcon.classList.remove('hidden'); + } + + switch (queryModelSelectName) { + case 'ID': + textareaSpan.innerHTML = Lang.i18n('text_label_IDArrayOfFeatures'); + getValueTextArea.value = '[1,2,3]'; + break; + + case 'SQL': + maxFeaturesContainer.classList.remove('hidden'); + break; + + case 'BOUNDS': + queryRangeContainer.classList.remove('hidden'); + queryRangetextareaSpan.innerHTML = Lang.i18n('text_label_queryRange'); + queryRangeTextArea.value = '{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}'; + queryRangeRecIcon.classList.add('bounds'); + break; + + case 'BUFFER': + bufferDistanceContainer.classList.remove('hidden'); + break; + + case 'SPATIAL': + spatialQueryModeContainer.classList.remove('hidden'); + break; + } + } // 获取查询参数 + + + function getQueryParams() { + // 数据集数组 + var datasetArr = me.dataSetNames; + var queryModelSelectName = document.getElementById('queryModelSelectName'); + var getFeatureMode = queryModelSelectName.title; // 过滤条件 + + var attributeFilter = getValueTextArea.value; + var queryParam; + + if (getFeatureMode === 'ID') { + var value = getValueTextArea.value; + var ids = value.substring(1, value.length - 1).split(','); + queryParam = new GetFeaturesByIDsParameters({ + IDs: ids, + datasetNames: datasetArr + }); + } else if (getFeatureMode === 'SQL') { + var maxFeatures = maxFeaturesInput.value; + queryParam = new GetFeaturesBySQLParameters({ + queryParameter: { + attributeFilter: attributeFilter + }, + datasetNames: datasetArr, + maxFeatures: maxFeatures + }); + } else if (getFeatureMode === 'BOUNDS') { + if (!bounds) { + var _value = JSON.parse(queryRangeTextArea.value); + + bounds = external_L_default().bounds([_value.leftBottom.x, _value.leftBottom.y], [_value.rightTop.x, _value.rightTop.y]); + } + + queryParam = new GetFeaturesByBoundsParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + bounds: bounds + }); + } else if (getFeatureMode === 'BUFFER') { + var bufferDistance = bufferDistanceInput.value; + var defaultGeometryValue = JSON.parse(queryRangeTextArea.value); + var geometryLayer = resultLayer || defaultGeometryValue; + queryParam = new GetFeaturesByBufferParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + bufferDistance: bufferDistance, + geometry: geometryLayer + }); + } else if (getFeatureMode === 'SPATIAL') { + var spatialQueryMode = spatialQueryModeSelectName.title; + + var _defaultGeometryValue = JSON.parse(queryRangeTextArea.value); + + var _geometryLayer = resultLayer || _defaultGeometryValue; + + queryParam = new GetFeaturesByGeometryParameters({ + attributeFilter: attributeFilter, + datasetNames: datasetArr, + spatialQueryMode: spatialQueryMode, + geometry: _geometryLayer + }); + } + + return queryParam; + } //阻止 map 默认事件 + + + this._preventMapEvent(container, this.map); + + return container; + }, + + /** + * @function DataServiceQueryView.prototype._creatInputBox + * @description 创建含有 span 的 input 框。 + * @private + */ + _creatInputBox: function _creatInputBox(inputOptions, parentEle) { + var div = external_L_default().DomUtil.create('div', '', parentEle); + var span = external_L_default().DomUtil.create('span', '', div); + span.innerHTML = inputOptions.spanName; + var input = external_L_default().DomUtil.create('input', '', div); + input.value = inputOptions.value; // input.className = 'distributeInput' + + return div; + } +}); +var dataServiceQueryView = function dataServiceQueryView(dataServiceUrl, dataSetNames, options) { + return new DataServiceQueryView(dataServiceUrl, dataSetNames, options); +}; +;// CONCATENATED MODULE: ./src/leaflet/components/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/index.js +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/leaflet/namespace.js +function leaflet_namespace_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + +function leaflet_namespace_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? leaflet_namespace_ownKeys(Object(source), !0).forEach(function (key) { leaflet_namespace_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : leaflet_namespace_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + +function leaflet_namespace_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/* Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + + + + + + // 注:命名空间重复,内容会被覆盖 +// 例如SuperMap.Components=>L.supermap.Componets,再写L.supermap.Componets = {}, SuprMap的Components就不会挂在L.supermap上了 +// L.supermap.d3Layer是在别的地方挂上的 + +(external_L_default()).supermap = leaflet_namespace_objectSpread(leaflet_namespace_objectSpread({}, SuperMap), {}, { + Components: leaflet_namespace_objectSpread({}, SuperMap.Components) +}, (external_L_default()).supermap); +(external_L_default()).supermap.components = (external_L_default()).supermap.components || {}; +(external_L_default()).supermap.Components = (external_L_default()).supermap.Components || {}; +(external_L_default()).supermap.control = (external_L_default()).supermap.control || {}; +(external_L_default()).supermap.Util = {}; // ./core +// L.Util.supermap_callbacks = coreUtil.supermap_callbacks; + +(external_L_default()).Util.toGeoJSON = toGeoJSON; +(external_L_default()).supermap.Util.toGeoJSON = toGeoJSON; +(external_L_default()).Util.toSuperMapGeometry = toSuperMapGeometry; +(external_L_default()).supermap.Util.toSuperMapGeometry = toSuperMapGeometry; +(external_L_default()).Util.resolutionToScale = resolutionToScale; +(external_L_default()).supermap.Util.resolutionToScale = resolutionToScale; +(external_L_default()).Util.scaleToResolution = scaleToResolution; +(external_L_default()).supermap.Util.scaleToResolution = scaleToResolution; +(external_L_default()).Util.getMeterPerMapUnit = Util_getMeterPerMapUnit; +(external_L_default()).supermap.Util.getMeterPerMapUnit = Util_getMeterPerMapUnit; +(external_L_default()).Util.GetResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).supermap.Util.getResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).supermap.Util.GetResolutionFromScaleDpi = getResolutionFromScaleDpi; +(external_L_default()).Util.NormalizeScale = normalizeScale; +(external_L_default()).supermap.Util.normalizeScale = normalizeScale; +(external_L_default()).supermap.Util.NormalizeScale = normalizeScale; +(external_L_default()).Util.transform = Transform_transform; +(external_L_default()).supermap.Util.transform = Transform_transform; // L.Proj4Leaflet + +(external_L_default()).Proj = (external_L_default()).Proj || {}; +(external_L_default()).supermap.Proj = (external_L_default()).supermap.Proj || {}; +(external_L_default()).Proj.CRS = crs; +(external_L_default()).supermap.Proj.crs = crs; +(external_L_default()).supermap.Proj.CRS = CRS; // core/NonEarthCRS + +(external_L_default()).Projection = {}; +(external_L_default()).supermap.Projection = (external_L_default()).supermap.Projection || {}; +(external_L_default()).Projection.NonProjection = nonProjection; +(external_L_default()).supermap.Projection.nonProjection = nonProjection; +(external_L_default()).supermap.Projection.NonProjection = NonProjection; +(external_L_default()).supermap.CRS = (external_L_default()).supermap.CRS || {}; +(external_L_default()).CRS.NonEarthCRS = nonEarthCRS; +(external_L_default()).supermap.CRS.NonEarthCRS = NonEarthCRS; +(external_L_default()).supermap.CRS.nonEarthCRS = nonEarthCRS; // core/ExtendsCRS + +(external_L_default()).CRS.BaiduCRS = BaiduCRS; +(external_L_default()).supermap.CRS.BaiduCRS = BaiduCRS; +(external_L_default()).CRS.TianDiTu_WGS84CRS = TianDiTu_WGS84CRS; +(external_L_default()).supermap.CRS.TianDiTu_WGS84CRS = TianDiTu_WGS84CRS; +(external_L_default()).CRS.TianDiTu_MercatorCRS = TianDiTu_MercatorCRS; +(external_L_default()).supermap.CRS.TianDiTu_MercatorCRS = TianDiTu_MercatorCRS; +(external_L_default()).CRS.TianDiTu_Mercator = TianDiTu_MercatorCRS; +(external_L_default()).supermap.CRS.TianDiTu_Mercator = TianDiTu_MercatorCRS; +(external_L_default()).CRS.TianDiTu_WGS84 = TianDiTu_WGS84CRS; +(external_L_default()).supermap.CRS.TianDiTu_WGS84 = TianDiTu_WGS84CRS; +(external_L_default()).CRS.Baidu = BaiduCRS; +(external_L_default()).supermap.CRS.Baidu = BaiduCRS; +(external_L_default()).supermap.CommontypesConversion = CommontypesConversion; // components + +(external_L_default()).supermap.components.clientComputationLayer = clientComputationLayer; +(external_L_default()).supermap.Components.ClientComputationLayer = ClientComputationLayer; +(external_L_default()).supermap.components.clientComputation = clientComputationView; +(external_L_default()).supermap.Components.ClientComputation = ClientComputationView; +(external_L_default()).supermap.components.clientComputationViewModel = clientComputationViewModel; +(external_L_default()).supermap.Components.ClientComputationViewModel = ClientComputationViewModel; +(external_L_default()).supermap.components.geoJSONLayerWithName = geoJSONLayerWithName; +(external_L_default()).supermap.Components.GeoJSONLayerWithName = GeoJSONLayerWithName; +(external_L_default()).supermap.components.GeoJsonLayersDataModel = GeoJsonLayersDataModel; +(external_L_default()).supermap.Components.GeoJsonLayersDataModel = GeoJsonLayersDataModel; +(external_L_default()).supermap.components.dataFlow = dataFlowView; +(external_L_default()).supermap.Components.DataFlow = DataFlowView; +(external_L_default()).supermap.components.dataFlowViewModel = dataFlowViewModel; +(external_L_default()).supermap.Components.DataFlowViewModel = DataFlowViewModel; +(external_L_default()).supermap.components.dataServiceQuery = dataServiceQueryView; +(external_L_default()).supermap.Components.DataServiceQuery = DataServiceQueryView; +(external_L_default()).supermap.components.dataServiceQueryViewModel = dataServiceQueryViewModel; +(external_L_default()).supermap.Components.DataServiceQueryViewModel = DataServiceQueryViewModel; +(external_L_default()).supermap.components.DistributedAnalysisModel = DistributedAnalysisModel; +(external_L_default()).supermap.Components.DistributedAnalysisModel = DistributedAnalysisModel; +(external_L_default()).supermap.components.distributedAnalysis = distributedAnalysisView; +(external_L_default()).supermap.Components.DistributedAnalysis = DistributedAnalysisView; +(external_L_default()).supermap.components.distributedAnalysisViewModel = distributedAnalysisViewModel; +(external_L_default()).supermap.Components.DistributedAnalysisViewModel = DistributedAnalysisViewModel; +(external_L_default()).supermap.components.openFile = openFileView; +(external_L_default()).supermap.Components.OpenFile = OpenFileView; +(external_L_default()).supermap.components.openFileViewModel = openFileViewModel; +(external_L_default()).supermap.Components.OpenFileViewModel = OpenFileViewModel; +(external_L_default()).supermap.components.search = searchView; +(external_L_default()).supermap.Components.Search = SearchView; +(external_L_default()).supermap.components.searchViewModel = searchViewModel; +(external_L_default()).supermap.Components.SearchViewModel = SearchViewModel; +(external_L_default()).supermap.components.componentsViewBase = componentsViewBase; +(external_L_default()).supermap.Components.ComponentsViewBase = ComponentsViewBase; // control + +(external_L_default()).supermap.control.changeTileVersion = changeTileVersion; +(external_L_default()).supermap.control.ChangeTileVersion = ChangeTileVersion; +(external_L_default()).supermap.control.logo = logo; +(external_L_default()).supermap.control.Logo = Logo; // mapping + +(external_L_default()).supermap.baiduTileLayer = baiduTileLayer; +(external_L_default()).supermap.BaiduTileLayer = BaiduTileLayer; +(external_L_default()).supermap.cloudTileLayer = cloudTileLayer; +(external_L_default()).supermap.CloudTileLayer = CloudTileLayer; +(external_L_default()).supermap.imageMapLayer = imageMapLayer; +(external_L_default()).supermap.ImageMapLayer = ImageMapLayer; +(external_L_default()).supermap.imageTileLayer = imageTileLayer; +(external_L_default()).supermap.ImageTileLayer = ImageTileLayer; +(external_L_default()).supermap.tiandituTileLayer = tiandituTileLayer; +(external_L_default()).supermap.TiandituTileLayer = TiandituTileLayer; +(external_L_default()).supermap.tiledMapLayer = tiledMapLayer; +(external_L_default()).supermap.TiledMapLayer = TiledMapLayer; +(external_L_default()).supermap.wmtsLayer = wmtsLayer; +(external_L_default()).supermap.WMTSLayer = WMTSLayer; +(external_L_default()).supermap.webmap = webMap; +(external_L_default()).supermap.WebMap = WebMap; // overlay + +(external_L_default()).supermap.CartoCSSToLeaflet = CartoCSSToLeaflet; +(external_L_default()).supermap.DefaultStyle = DefaultStyle; +(external_L_default()).supermap.CartoStyleMap = CartoStyleMap; +(external_L_default()).supermap.ServerStyleMap = ServerStyleMap; +(external_L_default()).supermap.CompOpMap = CompOpMap; +(external_L_default()).supermap.circleStyle = circleStyle; +(external_L_default()).supermap.CircleStyle = CircleStyle; +(external_L_default()).supermap.cloverStyle = cloverStyle; +(external_L_default()).supermap.CloverStyle = CloverStyle; +(external_L_default()).supermap.graphic = graphic; +(external_L_default()).supermap.Graphic = Graphic; +(external_L_default()).supermap.imageStyle = imageStyle; +(external_L_default()).supermap.ImageStyle = ImageStyle; +(external_L_default()).supermap.themeFeature = themeFeature; +(external_L_default()).supermap.ThemeFeature = ThemeFeature; +(external_L_default()).supermap.dataFlowLayer = dataFlowLayer; +(external_L_default()).supermap.DataFlowLayer = DataFlowLayer; +(external_L_default()).supermap.echartsLayer = echartsLayer; +(external_L_default()).supermap.EchartsLayer = EchartsLayer; +(external_L_default()).supermap.graphicLayer = graphicLayer; +(external_L_default()).supermap.GraphicLayer = GraphicLayer; +(external_L_default()).supermap.graphThemeLayer = graphThemeLayer; +(external_L_default()).supermap.GraphThemeLayer = GraphThemeLayer; +(external_L_default()).supermap.heatMapFeature = heatMapFeature; +(external_L_default()).supermap.HeatMapFeature = HeatMapFeature; +(external_L_default()).supermap.heatMapLayer = heatMapLayer; +(external_L_default()).supermap.HeatMapLayer = HeatMapLayer; +(external_L_default()).supermap.labelThemeLayer = labelThemeLayer; +(external_L_default()).supermap.LabelThemeLayer = LabelThemeLayer; +(external_L_default()).supermap.mapVLayer = mapVLayer; +(external_L_default()).supermap.MapVLayer = MapVLayer; +(external_L_default()).supermap.rangeThemeLayer = rangeThemeLayer; +(external_L_default()).supermap.RangeThemeLayer = RangeThemeLayer; +(external_L_default()).supermap.rankSymbolThemeLayer = rankSymbolThemeLayer; +(external_L_default()).supermap.RankSymbolThemeLayer = RankSymbolThemeLayer; +(external_L_default()).supermap.tiledVectorLayer = tiledVectorLayer; +(external_L_default()).supermap.TileVectorLayer = TiledVectorLayer; +(external_L_default()).supermap.TiledVectorLayer = TiledVectorLayer; +(external_L_default()).supermap.turfLayer = turfLayer; +(external_L_default()).supermap.TurfLayer = TurfLayer; +(external_L_default()).supermap.unicodeMarker = unicodeMarker; +(external_L_default()).supermap.UnicodeMarker = UnicodeMarker; +(external_L_default()).supermap.uniqueThemeLayer = uniqueThemeLayer; +(external_L_default()).supermap.UniqueThemeLayer = UniqueThemeLayer; +(external_L_default()).supermap.VectorTileFormat = VectorTileFormat; +(external_L_default()).supermap.addressMatchService = addressMatchService; +(external_L_default()).supermap.AddressMatchService = AddressMatchService_AddressMatchService; +(external_L_default()).supermap.chartService = chartService; +(external_L_default()).supermap.ChartService = ChartService; +(external_L_default()).supermap.dataFlowService = dataFlowService; +(external_L_default()).supermap.DataFlowService = DataFlowService_DataFlowService; +(external_L_default()).supermap.datasetService = datasetService; +(external_L_default()).supermap.DatasetService = DatasetService_DatasetService; +(external_L_default()).supermap.datasourceService = datasourceService; +(external_L_default()).supermap.DatasourceService = DatasourceService_DatasourceService; +(external_L_default()).supermap.featureService = FeatureService_featureService; +(external_L_default()).supermap.FeatureService = FeatureService; +(external_L_default()).supermap.fieldService = fieldService; +(external_L_default()).supermap.FieldService = FieldService; +(external_L_default()).supermap.geoprocessingService = geoprocessingService; +(external_L_default()).supermap.GeoprocessingService = GeoprocessingService_GeoprocessingService; +(external_L_default()).supermap.gridCellInfosService = gridCellInfosService; +(external_L_default()).supermap.GridCellInfosService = GridCellInfosService; +(external_L_default()).supermap.imageCollectionService = imageCollectionService; +(external_L_default()).supermap.ImageCollectionService = ImageCollectionService; +(external_L_default()).supermap.imageService = imageService; +(external_L_default()).supermap.ImageService = ImageService; +(external_L_default()).supermap.layerInfoService = layerInfoService; +(external_L_default()).supermap.LayerInfoService = LayerInfoService; +(external_L_default()).supermap.mapService = mapService; +(external_L_default()).supermap.MapService = MapService_MapService; +(external_L_default()).supermap.measureService = measureService; +(external_L_default()).supermap.MeasureService = MeasureService_MeasureService; +(external_L_default()).supermap.networkAnalyst3DService = networkAnalyst3DService; +(external_L_default()).supermap.NetworkAnalyst3DService = NetworkAnalyst3DService; +(external_L_default()).supermap.networkAnalystService = networkAnalystService; +(external_L_default()).supermap.NetworkAnalystService = NetworkAnalystService; +(external_L_default()).supermap.processingService = processingService; +(external_L_default()).supermap.ProcessingService = ProcessingService; +(external_L_default()).supermap.queryService = queryService; +(external_L_default()).supermap.QueryService = QueryService_QueryService; +(external_L_default()).supermap.ServiceBase = ServiceBase; +(external_L_default()).supermap.spatialAnalystService = spatialAnalystService; +(external_L_default()).supermap.SpatialAnalystService = SpatialAnalystService; +(external_L_default()).supermap.themeService = themeService; +(external_L_default()).supermap.ThemeService = ThemeService_ThemeService; +(external_L_default()).supermap.trafficTransferAnalystService = trafficTransferAnalystService; +(external_L_default()).supermap.TrafficTransferAnalystService = TrafficTransferAnalystService; +(external_L_default()).supermap.webPrintingJobService = webPrintingJobService; +(external_L_default()).supermap.WebPrintingJobService = WebPrintingJobService; // 处理命名空间重名 + +(external_L_default()).supermap.CommonUtil = Util; + +}(); +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +!function() { +"use strict"; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + + + +}(); +/******/ })() +; \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.css b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.css new file mode 100644 index 00000000..fc7874e4 --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.css @@ -0,0 +1,8 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */@font-face{font-family:supermapol-icons;src:url(data:application/vnd.ms-fontobject;base64,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AAAAPwAA5nwAAOZ8AAAAQAAA5n0AAOZ9AAAAQQAA5n4AAOZ+AAAAQgAA5n8AAOZ/AAAAQwAA5oAAAOaAAAAARAAA5oEAAOaBAAAARQAA5oIAAOaCAAAARgAA5oMAAOaDAAAARwAA5oQAAOaEAAAASAAA5oUAAOaFAAAASQAA5oYAAOaGAAAASgAA5ocAAOaHAAAASwAA5ogAAOaIAAAATAAA5okAAOaJAAAATQAA5ooAAOaKAAAATgAA5osAAOaLAAAATwAA5owAAOaMAAAAUAAA5o0AAOaNAAAAUQAA5o4AAOaOAAAAUgAA5o8AAOaPAAAAUwAA5pAAAOaQAAAAVAAA5pEAAOaRAAAAVQAA5pIAAOaSAAAAVgAA5pMAAOaTAAAAVwAA5pQAAOaUAAAAWAAA5pUAAOaVAAAAWQAA5pYAAOaWAAAAWgAA5pcAAOaXAAAAWwAA5pgAAOaYAAAAXAAA5pkAAOaZAAAAXQAA5poAAOaaAAAAXgAA5psAAOabAAAAXwAA5pwAAOacAAAAYAAA5p0AAOadAAAAYQAA5p4AAOaeAAAAYgAA5p8AAOafAAAAZQAA5qAAAOagAAAAYwAA5qEAAOahAAAAZAAA5qIAAOaiAAAAZgAA5qMAAOajAAAAZwAA5qQAAOakAAAAaAAA5qUAAOalAAAAaQAA5qYAAOamAAAAagAA5qcAAOanAAAAawAA5qgAAOaoAAAAbAAA5qkAAOapAAAAbQAA5qoAAOaqAAAAbgAA5qsAAOarAAAAbwAA5qwAAOasAAAAcAAA5q0AAOatAAAAcQAA5q4AAOauAAAAcgAA5q8AAOavAAAAcwAA5rAAAOawAAAAdAAA5rEAAOaxAAAAdQAA5rIAAOayAAAAdgAA5rMAAOazAAAAdwAA5rQAAOa0AAAAeAAA5rUAAOa1AAAAeQAA5rYAAOa2AAAAegAA5rcAAOa3AAAAewAA5rgAAOa4AAAAfAAA5rkAAOa5AAAAfQAA5roAAOa6AAAAfgAA5rsAAOa7AAAAfwAA5rwAAOa8AAAAgAAA5r0AAOa9AAAAgQAA5r4AAOa+AAAAggAA5r8AAOa/AAAAgwAA5sAAAObAAAAAhAAA5sEAAObBAAAAhQAA5sIAAObCAAAAhgAA5sMAAObDAAAAhwAA5sQAAObEAAAAiAAA5sUAAObFAAAAiQAA5sYAAObG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dABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUABG1vcmUGZGVsZXRlB3Zpc2libGUHem9vbS10bwZvdXRwdXQHb3BhY2l0eQpsYXllci1pbmZvBHNhdmULbGF5ZXItc3R5bGUKbGluZS1sYXllcgRza2luDG1hcmtlci1sYXllcgtwb2ludC1sYXllcg1wb2x5Z29uLWxheWVyCWludmlzaWJsZQZzZWFyY2gEZWRpdAZsYXllcnMJYmFzZWxheWVyB3NldHRpbmcDYWRkB3ByZXZpZXcHcmVmcmVzaA5zb2xpZC10cmlhbmdsZQtyb2FkbmV0d29yawZyZXR1cm4GcGFja3VwBXNoYXJlDGJhY2tob21lcGFnZQZNeU1hcHMJQ3JlYXRlTWFwCGZlZWRiYWNrBXNraW4xBlNoYXBlLQdhY2NvdW50B1NoYXBlLTEHU2hhcGUtMgdTaGFwZS0zB1NoYXBlLTQHU2hhcGUtNQdTaGFwZS02B1NoYXBlLTcHU2hhcGUtOAdTaGFwZS05CFNoYXBlLTEwCFNoYXBlLTExCFNoYXBlLTEyCFNoYXBlLTEzCFNoYXBlLTE0CFNoYXBlLTE1CFNoYXBlLTE2CFNoYXBlLTE3CFNoYXBlLTE4CFNoYXBlLTE5CFNoYXBlLTIwCFNoYXBlLTIxCFNoYXBlLTIyCFNoYXBlLTIzCFNoYXBlLTI0CFNoYXBlLTI1CFNoYXBlLTI2CFNoYXBlLTI3CFNoYXBlLTI4CFNoYXBlLTI5CFNoYXBlLTMwCFNoYXBlLTMxCFNoYXBlLTMyCFNoYXBlLTMzCFNoYXBlLTM0CFNoYXBlLTM1CFNoYXBlLTM2CFNoYXBlLTM3CFNoYXBlLTM4CFNoYXBlLTM5CFNoYXBlLTQwCFNoYXBlLTQxCFNoYXBlLTQyCFNoYXBlLTQzCFNoYXBlLTQ0CFNoYXBlLTQ1CFNoYXBlLTQ2CFNoYXBlLTQ3CFNoYXBlLTQ4CFNoYXBlLTQ5CFNoYXBlLTUwCFNoYXBlLTUxCFNoYXBlLTUyCFNoYXBlLTUzCFNoYXBlLTU0CFNoYXBlLTU1CFNoYXBlLTU2CFNoYXBlLTU3CFNoYXBlLTU4CFNoYXBlLTU5BE92YWwJUmVjdGFuZ2xlBFN0YXIIVHJpYW5nbGUOcmVzdG9yZWRlZmF1bHQJdXBsb2FkaW5nBWVycm9yBnpvb21pbgd6b29tb3V0BWZpcnN0BG5leHQEbGFzdARwcmV2CHBvaS1sb2FkCHBvaS1zYXZlBGZvbGQMbGFiZWwtZGVsZXRlBnVwbG9hZAZ1bmZvbGQFY2xvc2UEbWFyawd0cmFmZmljC2Z1bGwtZmlndXJlB21lYXN1cmUMZGlzcGxheS1saXN0CWhpZGUtbGlzdAZyZW5hbWUEY29weQdxcS16b25lCnNpbmEtd2VpYm8MY29sb3ItY2hhbmdlEGNyZWF0LWN1c3RvbS1tYXAKY3VzdG9tLW1hcAtsZWdlbmQtZm9sZA1sZWdlbmQtdW5mb2xkCmxlZ2VuZC1iaWcJYXR0cmlidXRlDGxlZ2VuZC1zbWFsbAxjbG9zZS1sZWdlbmQKZm9udC1jb2xvcgRib2xkB2l0YWxpY3MEZm9udA1qdXN0aWZ5LWFsaWduD21pZGRsZS1hbGlnbm1lbglmb250LXNpemUJc3RyaWtlb3V0CnRleHQtbGF5ZXIPcmlnaHQtYWxpZ25tZW50DmxlZnQtYWxpZ25tZW50FHRyYW5zcGFyZW50LWJhY2tncm91CXVuZGVybGluZQVxdWVyeQAAAAA=);src:url(data:application/vnd.ms-fontobject;base64,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AAAAPwAA5nwAAOZ8AAAAQAAA5n0AAOZ9AAAAQQAA5n4AAOZ+AAAAQgAA5n8AAOZ/AAAAQwAA5oAAAOaAAAAARAAA5oEAAOaBAAAARQAA5oIAAOaCAAAARgAA5oMAAOaDAAAARwAA5oQAAOaEAAAASAAA5oUAAOaFAAAASQAA5oYAAOaGAAAASgAA5ocAAOaHAAAASwAA5ogAAOaIAAAATAAA5okAAOaJAAAATQAA5ooAAOaKAAAATgAA5osAAOaLAAAATwAA5owAAOaMAAAAUAAA5o0AAOaNAAAAUQAA5o4AAOaOAAAAUgAA5o8AAOaPAAAAUwAA5pAAAOaQAAAAVAAA5pEAAOaRAAAAVQAA5pIAAOaSAAAAVgAA5pMAAOaTAAAAVwAA5pQAAOaUAAAAWAAA5pUAAOaVAAAAWQAA5pYAAOaWAAAAWgAA5pcAAOaXAAAAWwAA5pgAAOaYAAAAXAAA5pkAAOaZAAAAXQAA5poAAOaaAAAAXgAA5psAAOabAAAAXwAA5pwAAOacAAAAYAAA5p0AAOadAAAAYQAA5p4AAOaeAAAAYgAA5p8AAOafAAAAZQAA5qAAAOagAAAAYwAA5qEAAOahAAAAZAAA5qIAAOaiAAAAZgAA5qMAAOajAAAAZwAA5qQAAOakAAAAaAAA5qUAAOalAAAAaQAA5qYAAOamAAAAagAA5qcAAOanAAAAawAA5qgAAOaoAAAAbAAA5qkAAOapAAAAbQAA5qoAAOaqAAAAbgAA5qsAAOarAAAAbwAA5qwAAOasAAAAcAAA5q0AAOatAAAAcQAA5q4AAOauAAAAcgAA5q8AAOavAAAAcwAA5rAAAOawAAAAdAAA5rEAAOaxAAAAdQAA5rIAAOayAAAAdgAA5rMAAOazAAAAdwAA5rQAAOa0AAAAeAAA5rUAAOa1AAAAeQAA5rYAAOa2AAAAegAA5rcAAOa3AAAAewAA5rgAAOa4AAAAfAAA5rkAAOa5AAAAfQAA5roAAOa6AAAAfgAA5rsAAOa7AAAAfwAA5rwAAOa8AAAAgAAA5r0AAOa9AAAAgQAA5r4AAOa+AAAAggAA5r8AAOa/AAAAgwAA5sAAAObAAAAAhAAA5sEAAObBAAAAhQAA5sIAAObCAAAAhgAA5sMAAObDAAAAhwAA5sQAAObEAAAAiAAA5sUAAObFAAAAiQAA5sYAAObG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dABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUABG1vcmUGZGVsZXRlB3Zpc2libGUHem9vbS10bwZvdXRwdXQHb3BhY2l0eQpsYXllci1pbmZvBHNhdmULbGF5ZXItc3R5bGUKbGluZS1sYXllcgRza2luDG1hcmtlci1sYXllcgtwb2ludC1sYXllcg1wb2x5Z29uLWxheWVyCWludmlzaWJsZQZzZWFyY2gEZWRpdAZsYXllcnMJYmFzZWxheWVyB3NldHRpbmcDYWRkB3ByZXZpZXcHcmVmcmVzaA5zb2xpZC10cmlhbmdsZQtyb2FkbmV0d29yawZyZXR1cm4GcGFja3VwBXNoYXJlDGJhY2tob21lcGFnZQZNeU1hcHMJQ3JlYXRlTWFwCGZlZWRiYWNrBXNraW4xBlNoYXBlLQdhY2NvdW50B1NoYXBlLTEHU2hhcGUtMgdTaGFwZS0zB1NoYXBlLTQHU2hhcGUtNQdTaGFwZS02B1NoYXBlLTcHU2hhcGUtOAdTaGFwZS05CFNoYXBlLTEwCFNoYXBlLTExCFNoYXBlLTEyCFNoYXBlLTEzCFNoYXBlLTE0CFNoYXBlLTE1CFNoYXBlLTE2CFNoYXBlLTE3CFNoYXBlLTE4CFNoYXBlLTE5CFNoYXBlLTIwCFNoYXBlLTIxCFNoYXBlLTIyCFNoYXBlLTIzCFNoYXBlLTI0CFNoYXBlLTI1CFNoYXBlLTI2CFNoYXBlLTI3CFNoYXBlLTI4CFNoYXBlLTI5CFNoYXBlLTMwCFNoYXBlLTMxCFNoYXBlLTMyCFNoYXBlLTMzCFNoYXBlLTM0CFNoYXBlLTM1CFNoYXBlLTM2CFNoYXBlLTM3CFNoYXBlLTM4CFNoYXBlLTM5CFNoYXBlLTQwCFNoYXBlLTQxCFNoYXBlLTQyCFNoYXBlLTQzCFNoYXBlLTQ0CFNoYXBlLTQ1CFNoYXBlLTQ2CFNoYXBlLTQ3CFNoYXBlLTQ4CFNoYXBlLTQ5CFNoYXBlLTUwCFNoYXBlLTUxCFNoYXBlLTUyCFNoYXBlLTUzCFNoYXBlLTU0CFNoYXBlLTU1CFNoYXBlLTU2CFNoYXBlLTU3CFNoYXBlLTU4CFNoYXBlLTU5BE92YWwJUmVjdGFuZ2xlBFN0YXIIVHJpYW5nbGUOcmVzdG9yZWRlZmF1bHQJdXBsb2FkaW5nBWVycm9yBnpvb21pbgd6b29tb3V0BWZpcnN0BG5leHQEbGFzdARwcmV2CHBvaS1sb2FkCHBvaS1zYXZlBGZvbGQMbGFiZWwtZGVsZXRlBnVwbG9hZAZ1bmZvbGQFY2xvc2UEbWFyawd0cmFmZmljC2Z1bGwtZmlndXJlB21lYXN1cmUMZGlzcGxheS1saXN0CWhpZGUtbGlzdAZyZW5hbWUEY29weQdxcS16b25lCnNpbmEtd2VpYm8MY29sb3ItY2hhbmdlEGNyZWF0LWN1c3RvbS1tYXAKY3VzdG9tLW1hcAtsZWdlbmQtZm9sZA1sZWdlbmQtdW5mb2xkCmxlZ2VuZC1iaWcJYXR0cmlidXRlDGxlZ2VuZC1zbWFsbAxjbG9zZS1sZWdlbmQKZm9udC1jb2xvcgRib2xkB2l0YWxpY3MEZm9udA1qdXN0aWZ5LWFsaWduD21pZGRsZS1hbGlnbm1lbglmb250LXNpemUJc3RyaWtlb3V0CnRleHQtbGF5ZXIPcmlnaHQtYWxpZ25tZW50DmxlZnQtYWxpZ25tZW50FHRyYW5zcGFyZW50LWJhY2tncm91CXVuZGVybGluZQVxdWVyeQAAAAA=#iefix) format('embedded-opentype'),url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),url(data:font/ttf;base64,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AADmIgAAAAUAAOYlAADmJQAAAAYAAOYnAADmJwAAAAcAAOYoAADmKAAAAAgAAOYpAADmKQAAAAkAAOYqAADmKgAAAAoAAOYrAADmKwAAAAsAAOYsAADmLAAAAAwAAOYtAADmLQAAAA0AAOYuAADmLgAAAA4AAOYvAADmLwAAAA8AAOYwAADmMAAAABAAAOYzAADmMwAAABEAAOY0AADmNAAAABIAAOY1AADmNQAAABMAAOY2AADmNgAAABQAAOY3AADmNwAAABYAAOY4AADmOAAAABUAAOY5AADmOQAAABcAAOY6AADmOgAAABgAAOY7AADmOwAAABkAAOY8AADmPAAAABoAAOY9AADmPQAAABsAAOY+AADmPgAAABwAAOZZAADmWQAAAB0AAOZaAADmWgAAAB4AAOZbAADmWwAAAB8AAOZcAADmXAAAACAAAOZdAADmXQAAACEAAOZeAADmXgAAACIAAOZfAADmXwAAACMAAOZgAADmYAAAACQAAOZhAADmYQAAACUAAOZiAADmYgAAACYAAOZjAADmYwAAACcAAOZkAADmZAAAACgAAOZlAADmZQAAACkAAOZmAADmZgAAACoAAOZnAADmZwAAACsAAOZoAADmaAAAACwAAOZpAADmaQAAAC0AAOZqAADmagAAAC4AAOZrAADmawAAAC8AAOZsAADmbAAAADAAAOZtAADmbQAAADEAAOZuAADmbgAAADIAAOZvAADmbwAAADMAAOZwAADmcAAAADQAAOZxAADmcQAAADUAAOZyAADmcgAAADYAAOZzAADmcwAAADcAAOZ0AADmdAAAADgAAOZ1AADmdQAAADkAAOZ2AADmdgAAADoAAOZ3AADmdwAAADsAAOZ4AADmeAAAADwAAOZ5AADmeQAAAD0AAOZ6AADmegAAAD4AAOZ7AADmewAAAD8AAOZ8AADmfAAAAEAAAOZ9AADmfQAAAEEAAOZ+AADmfgAAAEIAAOZ/AADmfwAAAEMAAOaAAADmgAAAAEQAAOaBAADmgQAAAEUAAOaCAADmggAAAEYAAOaDAADmgwAAAEcAAOaEAADmhAAAAEgAAOaFAADmhQAAAEkAAOaGAADmhgAAAEoAAOaHAADmhwAAAEsAAOaIAADmiAAAAEwAAOaJAADmiQAAAE0AAOaKAADmigAAAE4AAOaLAADmiwAAAE8AAOaMAADmjAAAAFAAAOaNAADmjQAAAFEAAOaOAADmjgAAAFIAAOaPAADmjwAAAFMAAOaQAADmkAAAAFQAAOaRAADmkQAAAFUAAOaSAADmkgAAAFYAAOaTAADmkwAAAFcAAOaUAADmlAAAAFgAAOaVAADmlQAAAFkAAOaWAADmlgAAAFoAAOaXAADmlwAAAFsAAOaYAADmmAAAAFwAAOaZAADmmQAAAF0AAOaaAADmmgAAAF4AAOabAADmmwAAAF8AAOacAADmnAAAAGAAAOadAADmnQAAAGEAAOaeAADmngAAAGIAAOafAADmnwAAAGUAAOagAADmoAAAAGMAAOahAADmoQAAAGQAAOaiAADmogAAAGYAAOajAADmowAAAGcAAOakAADmpAAAAGgAAOalAADmpQAAAGkAAOamAADmpgAAAGoAAOanAADmpwAAAGsAAOaoAADmqAAAAGwAAOapAADmqQAAAG0AAOaqAADmqgAAAG4AAOarAADmqwAAAG8AAOasAADmrAAAAHAAAOatAADmrQAAAHEAAOauAADmrgAAAHIAAOavAADmrwAAAHMAAOawAADmsAAAAHQAAOaxAADmsQAAAHUAAOayAADmsgAAAHYAAOazAADmswAAAHcAAOa0AADmtAAAAHgAAOa1AADmtQAAAHkAAOa2AADmtgAAAHoAAOa3AADmtwAAAHsAAOa4AADmuAAAAHwAAOa5AADmuQAAAH0AAOa6AADmugAAAH4AAOa7AADmuwAAAH8AAOa8AADmvAAAAIAAAOa9AADmvQAAAIEAAOa+AADmvgAAAIIAAOa/AADmvwAAAIMAAObAAADmwAAAAIQAAObBAADmwQAAAIUAAObCAADmwgAAAIYAAObDAADmwwAAAIcAAObEAADmxAAAAIgAAObFAADmxQAAAIkAAObGAADmxgAAAIoAAObHAADmxwAAAIsAAObIAADmyAAAAIwAAObJAADmyQAAAI0AAObKAADmygAAAI4AAObLAADmywAAAI8AAObMAADmzAAAAJAAAObNAADmzQAAAJEAAObOAADmzgAAAJIAAObPAADmzwAAAJMAAAAAAC4AuAEcAXYByAH2AmACogMOAz4DxgP2BDgEqAUcBWgFsgXiBrAHLgdCB7QIYgh8COIJAglICYwKBgpaCqwK/gt8C6AMRAywDPANYA3KDgYOeA7e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AUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAARtb3JlBmRlbGV0ZQd2aXNpYmxlB3pvb20tdG8Gb3V0cHV0B29wYWNpdHkKbGF5ZXItaW5mbwRzYXZlC2xheWVyLXN0eWxlCmxpbmUtbGF5ZXIEc2tpbgxtYXJrZXItbGF5ZXILcG9pbnQtbGF5ZXINcG9seWdvbi1sYXllcglpbnZpc2libGUGc2VhcmNoBGVkaXQGbGF5ZXJzCWJhc2VsYXllcgdzZXR0aW5nA2FkZAdwcmV2aWV3B3JlZnJlc2gOc29saWQtdHJpYW5nbGULcm9hZG5ldHdvcmsGcmV0dXJuBnBhY2t1cAVzaGFyZQxiYWNraG9tZXBhZ2UGTXlNYXBzCUNyZWF0ZU1hcAhmZWVkYmFjawVza2luMQZTaGFwZS0HYWNjb3VudAdTaGFwZS0xB1NoYXBlLTIHU2hhcGUtMwdTaGFwZS00B1NoYXBlLTUHU2hhcGUtNgdTaGFwZS03B1NoYXBlLTgHU2hhcGUtOQhTaGFwZS0xMAhTaGFwZS0xMQhTaGFwZS0xMghTaGFwZS0xMwhTaGFwZS0xNAhTaGFwZS0xNQhTaGFwZS0xNghTaGFwZS0xNwhTaGFwZS0xOAhTaGFwZS0xOQhTaGFwZS0yMAhTaGFwZS0yMQhTaGFwZS0yMghTaGFwZS0yMwhTaGFwZS0yNAhTaGFwZS0yNQhTaGFwZS0yNghTaGFwZS0yNwhTaGFwZS0yOAhTaGFwZS0yOQhTaGFwZS0zMAhTaGFwZS0zMQhTaGFwZS0zMghTaGFwZS0zMwhTaGFwZS0zNAhTaGFwZS0zNQhTaGFwZS0zNghTaGFwZS0zNwhTaGFwZS0zOAhTaGFwZS0zOQhTaGFwZS00MAhTaGFwZS00MQhTaGFwZS00MghTaGFwZS00MwhTaGFwZS00NAhTaGFwZS00NQhTaGFwZS00NghTaGFwZS00NwhTaGFwZS00OAhTaGFwZS00OQhTaGFwZS01MAhTaGFwZS01MQhTaGFwZS01MghTaGFwZS01MwhTaGFwZS01NAhTaGFwZS01NQhTaGFwZS01NghTaGFwZS01NwhTaGFwZS01OAhTaGFwZS01OQRPdmFsCVJlY3RhbmdsZQRTdGFyCFRyaWFuZ2xlDnJlc3RvcmVkZWZhdWx0CXVwbG9hZGluZwVlcnJvcgZ6b29taW4Hem9vbW91dAVmaXJzdARuZXh0BGxhc3QEcHJldghwb2ktbG9hZAhwb2ktc2F2ZQRmb2xkDGxhYmVsLWRlbGV0ZQZ1cGxvYWQGdW5mb2xkBWNsb3NlBG1hcmsHdHJhZmZpYwtmdWxsLWZpZ3VyZQdtZWFzdXJlDGRpc3BsYXktbGlzdAloaWRlLWxpc3QGcmVuYW1lBGNvcHkHcXEtem9uZQpzaW5hLXdlaWJvDGNvbG9yLWNoYW5nZRBjcmVhdC1jdXN0b20tbWFwCmN1c3RvbS1tYXALbGVnZW5kLWZvbGQNbGVnZW5kLXVuZm9sZApsZWdlbmQtYmlnCWF0dHJpYnV0ZQxsZWdlbmQtc21hbGwMY2xvc2UtbGVnZW5kCmZvbnQtY29sb3IEYm9sZAdpdGFsaWNzBGZvbnQNanVzdGlmeS1hbGlnbg9taWRkbGUtYWxpZ25tZW4JZm9udC1zaXplCXN0cmlrZW91dAp0ZXh0LWxheWVyD3JpZ2h0LWFsaWdubWVudA5sZWZ0LWFsaWdubWVudBR0cmFuc3BhcmVudC1iYWNrZ3JvdQl1bmRlcmxpbmUFcXVlcnkAAAAA) format('truetype'),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPCEtLQoyMDEzLTktMzA6IENyZWF0ZWQuCi0tPgo8c3ZnPgo8bWV0YWRhdGE+CkNyZWF0ZWQgYnkgaWNvbmZvbnQKPC9tZXRhZGF0YT4KPGRlZnM+Cgo8Zm9udCBpZD0ic3VwZXJtYXBvbC1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiID4KICA8Zm9udC1mYWNlCiAgICBmb250LWZhbWlseT0ic3VwZXJtYXBvbC1pY29ucyIKICAgIGZvbnQtd2VpZ2h0PSI1MDAiCiAgICBmb250LXN0cmV0Y2g9Im5vcm1hbCIKICAgIHVuaXRzLXBlci1lbT0iMTAyNCIKICAgIGFzY2VudD0iODk2IgogICAgZGVzY2VudD0iLTEyOCIKICAvPgogICAgPG1pc3NpbmctZ2x5cGggLz4KICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im1vcmUiIHVuaWNvZGU9IiYjNTg5MDk7IiBkPSJNNTMwLjI4NTcxNCAxMjhhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwLTE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwIDE4Mi44NTcxNDN6IG0wIDM2NS42NDExNDNhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwLTE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwIDE4Mi44NTcxNDN6IG0wIDE4Mi44NTcxNDNhOTEuNDI4NTcxIDkxLjQyODU3MSAwIDEgMSAwIDE4Mi44NTcxNDMgOTEuNDI4NTcxIDkxLjQyODU3MSAwIDAgMSAwLTE4Mi44NTcxNDN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZGVsZXRlIiB1bmljb2RlPSImIzU4OTExOyIgZD0iTTEzNS44ODE0OC0xMTQuOTgyNDMxYTEwNy41MDQ2NDIgMTA3LjUwNDY0MiAwIDAgMC04LjU1NjQ5MiA4LjU1NjQ5MmMzLjE0NDY5NC0zLjA3MTU2MSA1LjcwNDMyOC02LjA2OTk5IDguNTU2NDkyLTguNTU2NDkyeiBtLTEwLjk2OTg2MSA0LjY4MDQ3NGMtMi45MjUyOTYgMi43NzkwMzItNS44NTA1OTMgNS40ODQ5MzEtOC42Mjk2MjUgOC41NTY0OTIgMi43MDU4OTktMy4wNzE1NjEgNS42MzExOTYtNS44NTA1OTMgOC41NTY0OTItOC41NTY0OTJ6TTEwMTEuNzg4MzUgNzM3LjA4MzI3NGE0Mi45Mjg3MjQgNDIuOTI4NzI0IDAgMCAxLTI5Ljk4NDI4OCAxMi4yMTMxMTJoLTIxMC4xODI1NDV2NjUuODE5MTY5Qzc3MS42OTQ2NSA4NTkuNzk5NDU3IDczNS42NDAzNzIgODk2IDY5MS4zOTUyNjQgODk2SDMzMi4zODgyNjVDMjg4LjE0MzE1NyA4OTYgMjUyLjA4ODg3OSA4NTkuNzk5NDU3IDI1Mi4wODg4NzkgODE1LjE4ODY4N3YtNjUuODkyMzAxSDQwLjczNjIxNUE0MC45NTQxNDkgNDAuOTU0MTQ5IDAgMCAxIDAuMDAxNDYzIDcwOC4xOTU5NzJjMC0yMi42NzEwNDcgMTguMjgzMTAyLTQwLjk1NDE0OSA0MC44MDc4ODQtNDAuOTU0MTQ5aDM1Ljk4MTE0NnYtNzE0LjI4NDI0NmMwLTQ0LjYxMDc3IDM1Ljk4MTE0Ni04MC44MTEzMTMgODAuMjk5Mzg2LTgwLjgxMTMxMmg3MjEuMDg1NTU5YzQ0LjMxODI0IDAgODAuMjk5Mzg2IDM2LjIwMDU0MyA4MC4yOTkzODYgODAuODExMzEyVjY2Ny4xNjg2OWgyMy40MDIzNzFjMjIuNTI0NzgyIDAgNDEuOTc4MDAzIDE4LjI4MzEwMiA0MS45NzgwMDMgNDEuMDI3MjgyYTQwLjY2MTYyIDQwLjY2MTYyIDAgMCAxLTExLjk5MzcxNSAyOC44ODczMDJ6TTMzMi4yNDIgODE0Ljk2OTI5aDM1OC43MTQ0Njl2LTY2LjMzMTA5NUgzMzIuMjQyeiBtNTQ1Ljc4NzE3My04NjEuODY1NDQ4SDE1Ny4wODk4NzlWNjY3LjI0MTgyM2g3MjAuOTM5Mjk0ek01MTEuMzQzMjcxIDUyOS42MDY2MjhjLTIyLjY3MTA0NyAwLTQwLjk1NDE0OS0xOC41MDI1LTQwLjk1NDE0OS00MS4zMTk4MTJ2LTM4Mi44NDgxNjRjMC0yMi43NDQxNzkgMTguMjgzMTAyLTQxLjI0NjY3OSA0MC45NTQxNDktNDEuMjQ2Njc5czQxLjAyNzI4MiAxOC41MDI1IDQxLjAyNzI4MiA0MS4yNDY2NzlWNDg4LjM1OTk0OWE0MS4xMDA0MTQgNDEuMTAwNDE0IDAgMCAxLTQwLjk1NDE0OSA0MS4zMTk4MTF6IG0tMjIyLjEwMzEyOCAwYy0yMi42NzEwNDcgMC00MC45NTQxNDktMTguNTAyNS00MC45NTQxNDktNDEuMzE5ODEydi0zODIuODQ4MTY0YzAtMjIuNzQ0MTc5IDE4LjI4MzEwMi00MS4yNDY2NzkgNDAuOTU0MTQ5LTQxLjI0NjY3OXM0MC45NTQxNDkgMTguNTAyNSA0MC45NTQxNDkgNDEuMjQ2Njc5VjQ4OC4zNTk5NDlhNDEuMTAwNDE0IDQxLjEwMDQxNCAwIDAgMS00MC45NTQxNDkgNDEuMzE5ODExeiBtNDQyLjAxMjI4NCAwYy0yMi42NzEwNDcgMC00MS4wMjcyODItMTguNTAyNS00MS4wMjcyODItNDEuMzE5ODEydi0zODIuODQ4MTY0YzAtMjIuNzQ0MTc5IDE4LjI4MzEwMi00MS4yNDY2NzkgNDAuOTU0MTUtNDEuMjQ2Njc5czQxLjAyNzI4MiAxOC41MDI1IDQxLjAyNzI4MSA0MS4yNDY2NzlWNDg4LjM1OTk0OWE0MS4xMDA0MTQgNDEuMTAwNDE0IDAgMCAxLTQwLjk1NDE0OSA0MS4zMTk4MTF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idmlzaWJsZSIgdW5pY29kZT0iJiM1ODkxMjsiIGQ9Ik01MTIuMDM4MDM0LTU0Ljg1NzE0M0MxNzkuNzUwMDM0LTU0Ljg1NzE0MyA0My4wNDYwMzQgMjIzLjUyNDU3MSA3LjM1MjMyIDMwOC44MDkxNDNhMTA1LjEwNjI4NiAxMDUuMTA2Mjg2IDAgMCAwIDAgNzcuMjM4ODU3QzQzLjExOTE3NyA0NzEuMzMyNTcxIDE3OS44MjMxNzcgNzQ5LjcxNDI4NiA1MTIuMDM4MDM0IDc0OS43MTQyODZjMzMwLjc1MiAwIDQ2OS4wNjUxNDMtMjc4LjM4MTcxNCA1MDQuNjg1NzE1LTM2My42NjYyODYgOS44MDExNDMtMjUuMjM0Mjg2IDkuODAxMTQzLTUyLjAwNDU3MSAwLTc3LjIzODg1N0M5ODEuMTAzMTc3IDIyMy41MjQ1NzEgODQyLjc5MDAzNC01NC44NTcxNDMgNTEyLjAzODAzNC01NC44NTcxNDN6TTc1LjQ0ODMyIDM2MC41OTQyODZhMzQuNzQyODU3IDM0Ljc0Mjg1NyAwIDAgMSAwLTI0Ljc5NTQyOUMxMDUuMzYzNzQ5IDI2MC4wOTYgMjI1LjkwMzE3NyAxOC4yODU3MTQgNTEyLjAzODAzNCAxOC4yODU3MTRjMjg2LjIwOCAwIDQwNi42NzQyODYgMjQxLjczNzE0MyA0MzYuNTg5NzE1IDMxNS45NzcxNDNhMzQuNzQyODU3IDM0Ljc0Mjg1NyAwIDAgMSAwIDI0Ljc5NTQyOUM5MTguNzEyMzIgNDM0Ljc2MTE0MyA3OTguMjQ2MDM0IDY3Ni41NzE0MjkgNTEyLjAzODAzNCA2NzYuNTcxNDI5IDIyNS45MDMxNzcgNjc2LjU3MTQyOSAxMDUuMzYzNzQ5IDQzNC44MzQyODYgNzUuNDQ4MzIgMzYwLjU5NDI4NnpNNTEyLjAzODAzNCAxNjQuNTcxNDI5Yy0xMDAuNzkwODU3IDAtMTgyLjg1NzE0MyA4Mi42NTE0MjktMTgyLjg1NzE0MyAxODIuODU3MTQyUzQxMS4yNDcxNzcgNTMwLjI4NTcxNCA1MTIuMDM4MDM0IDUzMC4yODU3MTRzMTgyLjg1NzE0My04Mi42NTE0MjkgMTgyLjg1NzE0My0xODIuODU3MTQzUzYxMi44Mjg4OTEgMTY0LjU3MTQyOSA1MTIuMDM4MDM0IDE2NC41NzE0Mjl6IG0wIDI5Mi41NzE0MjhjLTYwLjEyMzQyOSAwLTEwOS43MTQyODYtNDkuMDA1NzE0LTEwOS43MTQyODUtMTA5LjcxNDI4NlM0NTEuMzI5NDYzIDIzNy43MTQyODYgNTEyLjAzODAzNCAyMzcuNzE0Mjg2czEwOS43MTQyODYgNDkuMDA1NzE0IDEwOS43MTQyODYgMTA5LjcxNDI4NVM1NzIuMTYxNDYzIDQ1Ny4xNDI4NTcgNTEyLjAzODAzNCA0NTcuMTQyODU3eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Inpvb20tdG8iIHVuaWNvZGU9IiYjNTg5MTM7IiBkPSJNODcxLjQ5NzE0MyA4MzcuNDg1NzE0YzQzLjg4NTcxNCAwIDc5LjM2LTM1LjU0NzQyOSA3OS4zNi03OS4zNlY0NDEuNzgyODU3aC04MC40NTcxNDNWNjgyLjY0MjI4NmMwIDQxLjEwNjI4Ni0zMy4yOCA3NC4zODYyODYtNzQuMzg2Mjg2IDc0LjM4NjI4NUg1NTMuNjkxNDI5TDU1My4zMjU3MTQgODM3LjQ4NTcxNHogbS03NS40ODM0MjktODg1Ljc2YzQxLjEwNjI4NiAwIDc0LjM4NjI4NiAzMy4yOCA3NC4zODYyODYgNzQuMzg2Mjg2VjI3Ny4yMTE0MjlIOTUwLjg1NzE0M3YtMzMwLjgyNTE0M2MwLTQxLjEwNjI4Ni0zMy4yOC03NC4zODYyODYtNzQuMzg2Mjg2LTc0LjM4NjI4Nkg1NTMuMzI1NzE0djc5LjcyNTcxNHpNMC4wNzMxNDMgNzU4LjEyNTcxNEMwIDgwMi4wMTE0MjkgMzUuNTQ3NDI5IDgzNy40ODU3MTQgNzkuMzYgODM3LjQ4NTcxNGgzMTYuNDE2di04MC40NTcxNDNIMTU0LjExMmMtNDEuMTA2Mjg2IDAtNzQuMzg2Mjg2LTMzLjI4LTc0LjM4NjI4Ni03NC4zODYyODV2LTI0MC45MzI1NzJIMHpNNzkuMzYgMjc3LjIxMTQyOXYtMjUxLjA5OTQyOWMwLTQxLjEwNjI4NiAzMy4yOC03NC4zODYyODYgNzQuMzg2Mjg2LTc0LjM4NjI4NkgzOTUuNzAyODU3Vi0xMjhINzQuMzg2Mjg2QTc0LjM4NjI4NiA3NC4zODYyODYgMCAwIDAgMC01My42MTM3MTRWMjc3LjIxMTQyOXpNNjc4Ljc2NTcxNCA0MDguNzIyMjg2di04OS42SDUxOS40NjA1NzF2LTE1NC4xODUxNDNINDI5Ljc4NzQyOVYzMTkuMTIyMjg2SDI3Mi4zODRWNDA4LjcyMjI4NmgxNTcuNDAzNDI5VjU2My45MzE0MjloODkuNjczMTQydi0xNTUuMjA5MTQzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im91dHB1dCIgdW5pY29kZT0iJiM1ODkxNDsiIGQ9Ik0zMjUuNDEyNTcxIDQxMy40NzY1NzFhNDQuMzI0NTcxIDQ0LjMyNDU3MSAwIDAgMS0zMS42NzA4NTctMTMuMTY1NzE0IDQ0LjMyNDU3MSA0NC4zMjQ1NzEgMCAwIDEgMC02My4wNDkxNDNsMTgyLjI3Mi0xODEuMTc0ODU3YTQ0LjgzNjU3MSA0NC44MzY1NzEgMCAwIDEgNjMuMzQxNzE1IDBMNzIxLjYyNzQyOSAzMzcuMTg4NTcxYTQ0LjMyNDU3MSA0NC4zMjQ1NzEgMCAwIDEgMCA2My4xMjIyODYgNDQuOTgyODU3IDQ0Ljk4Mjg1NyAwIDAgMS02My40ODggMEw1NTIuNDQ4IDI5NS4yMDQ1NzFWODUxLjM4Mjg1N0M1NTIuNDQ4IDg3Ni4wMzIgNTMyLjQ4IDg5NiA1MDcuNjExNDI5IDg5NnMtNDQuNzYzNDI5LTE5Ljk2OC00NC43NjM0MjktNDQuNjE3MTQzdi01NTYuMTc4Mjg2bC0xMDUuNjkxNDI5IDEwNS4zMjU3MTVhNDUuMjAyMjg2IDQ1LjIwMjI4NiAwIDAgMS0zMS43NDQgMTIuOTQ2Mjg1eiBtNjU5LjAxNzE0My0xNzguMTAyODU3YTM5LjQ5NzE0MyAzOS40OTcxNDMgMCAwIDEtMzkuNDk3MTQzLTM5LjM1MDg1N3YtMjIyLjIwOGMwLTEyLjg3MzE0My0xMC41MzI1NzEtMjMuNDA1NzE0LTIzLjU1Mi0yMy40MDU3MTRIMTAyLjU0NjI4NmEyMy41NTIgMjMuNTUyIDAgMCAwLTIzLjU1MiAyMy40MDU3MTR2MjIyLjM1NDI4NmEzOS40OTcxNDMgMzkuNDk3MTQzIDAgMCAxLTc4Ljk5NDI4NiAwdi0yNTMuNTEzMTQzYzAtMzkuMDU4Mjg2IDMxLjg5MDI4Ni03MC42NTYgNzAuOTQ4NTcxLTcwLjY1Nmg4ODIuMTAyODU4YzM5LjIwNDU3MSAwIDcwLjk0ODU3MSAzMS43NDQgNzAuOTQ4NTcxIDcwLjY1NlYxOTYuMDIyODU3YTM5LjQ5NzE0MyAzOS40OTcxNDMgMCAwIDEtMzkuNDk3MTQzIDM5LjI3NzcxNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJvcGFjaXR5IiB1bmljb2RlPSImIzU4OTE3OyIgZD0iTTY1NC4yNTA2NjcgMjQxLjc0OTMzM0g5MzguNjY2NjY3Vi00Mi42NjY2NjdINjU0LjI1MDY2N3pNMzY5Ljc0OTMzMyA1MjYuMjUwNjY3aDI4NC41MDEzMzR2LTI4NC41MDEzMzRIMzY5Ljc0OTMzM3pNNjU0LjI1MDY2NyA4MTAuNjY2NjY3SDkzOC42NjY2Njd2LTI4NC40MTZINjU0LjI1MDY2N3pNODUuMzMzMzMzIDI0MS43NDkzMzNoMjg0LjQxNlYtNDIuNjY2NjY3SDg1LjMzMzMzM3pNODUuMzMzMzMzIDgxMC42NjY2NjdoMjg0LjQxNnYtMjg0LjQxNkg4NS4zMzMzMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGF5ZXItaW5mbyIgdW5pY29kZT0iJiM1ODkxOTsiIGQ9Ik01MTIgODk1LjA2MTMzM0E1MTEuMTQ2NjY3IDUxMS4xNDY2NjcgMCAxIDEgNTEyLTEyNy4xNDY2NjcgNTExLjE0NjY2NyA1MTEuMTQ2NjY3IDAgMCAxIDUxMiA4OTUuMTQ2NjY3eiBtMC05MjguNDI2NjY2YTQxNy4yOCA0MTcuMjggMCAxIDAgMCA4MzQuNTYgNDE3LjI4IDQxNy4yOCAwIDAgMCAwLTgzNC41NnpNNDg4Ljc4OTMzMyA2MjQuODk2YTYwLjE2IDYwLjE2IDAgMSAxIDEyMC4zMiAwIDYwLjE2IDYwLjE2IDAgMCAxLTEyMC4zMiAwek01MzEuNjI2NjY3IDcwLjgyNjY2N2MtNDQuMzczMzMzLTExLjA5MzMzMy0xMDUuODEzMzMzLTEwLjA2OTMzMy0xMzYuNTMzMzM0IDIuMjE4NjY2LTMwLjcyIDEyLjM3MzMzMy00MS44OTg2NjcgNTcuMTczMzMzLTI0LjgzMiA5OS42NjkzMzRsNzYuNTQ0IDE5MC44MDUzMzNhNzIuOTYgNzIuOTYgMCAwIDEtNDkuMTUyIDk5LjQ5ODY2N2wtMTQuNjc3MzMzIDQuMDk2Yy00NC4wMzIgMTIuMjAyNjY3LTQzLjE3ODY2NyAyOC4yNDUzMzMgMS45NjI2NjcgMzUuNTg0bDQzLjg2MTMzMyA3LjE2OGM0NS4yMjY2NjcgNy4zMzg2NjcgMTA3LjI2NCAzLjI0MjY2NyAxMzcuOTg0LTkuMDQ1MzM0IDMwLjcyLTEyLjM3MzMzMyA0MS44MTMzMzMtNTcuMTczMzMzIDI0Ljc0NjY2Ny05OS41ODRsLTcxLjUwOTMzNC0xNzYuODEwNjY2Yy0xNy4wNjY2NjctNDIuNDk2IDQuMzUyLTg3Ljg5MzMzMyA0Ny43MDEzMzQtMTAxLjAzNDY2NyA0My4zNDkzMzMtMTMuMDU2IDQyLjQ5Ni0zMi44NTMzMzMtMS44NzczMzQtNDQuMDMybC0zNC4xMzMzMzMtOC41MzMzMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ic2F2ZSIgdW5pY29kZT0iJiM1ODkyMDsiIGQ9Ik03MzIuOCA4MTAuNjg4bDIwNS44ODgtMjA1Ljg4OHYtNjQ3LjQ4OEg4NS4zMTJWODEwLjY4OHpNNzY4IDg5Nkg4NS4zMTJDMzguNCA4OTYgMCA4NTcuNiAwIDgxMC42ODh2LTg1My4zNzZDMC04OS42IDM4LjQtMTI4IDg1LjMxMi0xMjhoODUzLjM3NkM5ODUuNi0xMjggMTAyNC04OS42IDEwMjQtNDIuNjg4VjY0MHpNMTcwLjY4OCA3MjUuMzEyaDQyNi42MjR2LTE3MC42MjRIMTcwLjY4OHpNNTEyIDQyLjY4OGExNzEuMiAxNzEuMiAwIDAgMC0xNzAuNjg4IDE3MC42MjRDMzQxLjMxMiAzMDcuMiA0MTguMTEyIDM4NCA1MTIgMzg0czE3MC42ODgtNzYuOCAxNzAuNjg4LTE3MC42ODhjMC05My44MjQtNzYuOC0xNzAuNjI0LTE3MC42ODgtMTcwLjYyNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsYXllci1zdHlsZSIgdW5pY29kZT0iJiM1ODkyMTsiIGQ9Ik05OTMuNzI4ODUzIDMzMy41Njh2LTAuMDg1MzMzTDUzMC40NTQxODcgMTE0LjM0NjY2N2wtMC4xNzA2NjctMC4wODUzMzQtMC4yNTYtMC4wODUzMzNhNDIuODM3MzMzIDQyLjgzNzMzMyAwIDAgMC0zNi42OTMzMzMgMEg0OTMuMjQ4ODUzYy0wLjA4NTMzMyAwLTAuMTcwNjY3IDAtMC4yNTYgMC4xNzA2NjdMMjkuNzE4MTg3IDMzMy40ODI2NjdBNTUuMzgxMzMzIDU1LjM4MTMzMyAwIDAgMCAwLjAyMjE4NyAzODQuMjU2YzAgMzAuMjkzMzMzIDIxLjUwNCA1NC43ODQgNDcuOTU3MzMzIDU0Ljc4NCA2LjU3MDY2NyAwIDEyLjgtMS41MzYgMTguNDMyLTQuMDk2bDAuMTcwNjY3LTAuMDg1MzMzIDAuMTcwNjY2LTAuMDg1MzM0IDQ0NS4wMTMzMzQtMjEwLjUxNzMzMyA0NDQuOTI4IDIxMC41MTczMzNoMC4yNTZsMC4xNzA2NjYgMC4yNTZ2LTAuMDg1MzMzYTQyLjkyMjY2NyA0Mi45MjI2NjcgMCAwIDAgMTguMjYxMzM0IDQuMDk2YzI2LjQ1MzMzMyAwIDQ3Ljk1NzMzMy0yNC40OTA2NjcgNDcuOTU3MzMzLTU0Ljc4NGE1NS4zODEzMzMgNTUuMzgxMzMzIDAgMCAwLTI5LjYxMDY2Ny01MC42MDI2Njd6IG0wIDIzNy41NjhMNTMwLjQ1NDE4NyAzNTEuOTE0NjY3aC0wLjE3MDY2N2wtMC4yNTYtMC4xNzA2NjdhNDMuOTQ2NjY3IDQzLjk0NjY2NyAwIDAgMC0xOC4yNjEzMzMtNC4yNjY2NjcgNDMuODYxMzMzIDQzLjg2MTMzMyAwIDAgMC0xOC40MzIgNC4yNjY2NjdsLTAuMTcwNjY3IDAuMDg1MzMzLTAuMjU2IDAuMDg1MzM0LTQ2My4xODkzMzMgMjE5LjMwNjY2NkE1NS4zODEzMzMgNTUuMzgxMzMzIDAgMCAwIDAuMDIyMTg3IDYyMS42NTMzMzNjMCAyMi44NjkzMzMgMTIuMzczMzMzIDQyLjQ5NiAyOS42OTYgNTAuNjg4TDQ5Mi45MDc1MiA4OTEuNTYyNjY3IDQ5My4yNDg4NTMgODkxLjczMzMzM2gwLjE3MDY2N2E0Mi40OTYgNDIuNDk2IDAgMCAwIDM2LjY5MzMzMyAwaDAuNDI2NjY3bDQ2My4yNzQ2NjctMjE5LjMwNjY2NmMxNy4zMjI2NjctOC4xOTIgMjkuNjEwNjY3LTI3LjgxODY2NyAyOS42MTA2NjYtNTAuNjAyNjY3YTU1LjM4MTMzMyA1NS4zODEzMzMgMCAwIDAtMjkuNjEwNjY2LTUwLjY4OHpNNDcuOTc5NTIgMjAxLjM4NjY2N2M2LjU3MDY2NyAwIDEyLjgtMS41MzYgMTguNDMyLTQuMjY2NjY3SDY2LjU4MjE4N3MwLjE3MDY2NyAwIDAuMTcwNjY2LTAuMTcwNjY3bDQ0NS4wMTMzMzQtMjEwLjQzMiA0NDQuOTI4IDIxMC40MzIgMC4yNTYgMC4wODUzMzQgMC4xNzA2NjYgMC4wODUzMzNhNDEuODEzMzMzIDQxLjgxMzMzMyAwIDAgMCAxOC4yNjEzMzQgNC4yNjY2NjdjMjYuNDUzMzMzIDAgNDcuOTU3MzMzLTI0LjU3NiA0Ny45NTczMzMtNTQuODY5MzM0IDAtMjIuNzg0LTEyLjI4OC00Mi40MTA2NjctMjkuNjEwNjY3LTUwLjY4OGwtNDYzLjI3NDY2Ni0yMTkuMTM2cy0wLjE3MDY2NyAwLTAuMTcwNjY3LTAuMTcwNjY2SDUyOS45NDIxODdhNDEuNzI4IDQxLjcyOCAwIDAgMC0zNi42OTMzMzQgMEg0OTMuMjQ4ODUzbC0wLjI1NiAwLjE3MDY2NkwyOS43MTgxODcgOTUuODI5MzMzQTU1LjQ2NjY2NyA1NS40NjY2NjcgMCAwIDAgMC4wMjIxODcgMTQ2LjUxNzMzM2MwIDMwLjI5MzMzMyAyMS41MDQgNTQuODY5MzMzIDQ3Ljk1NzMzMyA1NC44NjkzMzR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGluZS1sYXllciIgdW5pY29kZT0iJiM1ODkyMjsiIGQ9Ik03NjcuMzA2OTA4IDU3Ny44NDg1MTFMMzE4LjEzMDU4MyAxMjguNjcyMTg2YTE3MC42NTk2OTggMTcwLjY1OTY5OCAwIDEgMC00NS41NjYxMzkgNTAuOTQxOTJsNDQzLjcxNTIxNSA0NDMuODg1ODc0YTE3MC42NTk2OTggMTcwLjY1OTY5OCAwIDEgMCA1MC45NDE5MTktNDUuNTY2MTM5eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNraW4iIHVuaWNvZGU9IiYjNTg5MjM7IiBkPSJNOTIwLjkwMzA0IDgxNi4yNTZoLTU0Ljg0OGMtNTMuNTA0LTU3LjQ3Mi0xNjcuNDI0LTkzLjQ0LTI1Ny45ODQtOTMuNDQtOTAuNTYgMC0yMDQuNDggMzUuOTY4LTI1Ny45MiA5My40NGgtNTQuOTEyTDk1LjYyMzA0IDYxMS4ybDg5LjI4LTkxLjcxMmE4Ny44NzIgODcuODcyIDAgMCAwIDExOS41NTItODIuMTEydi00ODUuNjMyaDYwNy4xNjhWNDM3LjM3NmE4Ny44NzIgODcuODcyIDAgMCAwIDExOS42MTYgODIuMTEybDg5LjI4IDkxLjcxMnpNMjI0LjcxMTA0IDM2Ni4zMzZ2NzEuMDRhOC4xMjggOC4xMjggMCAwIDEtOC4wNjQgOC4zMiA3LjgwOCA3LjgwOCAwIDAgMS01LjYzMi0yLjQzMmwtNC42NzItNC44YTM3LjQ0IDM3LjQ0IDAgMCAwLTUzLjgyNCAwTDExLjIwNzA0IDU4My41NTJhMzkuODcyIDM5Ljg3MiAwIDAgMCAwIDU1LjI5NkwyNDIuODg3MDQgODc2LjhBNjMuMTA0IDYzLjEwNCAwIDAgMCAyODguMDcxMDQgODk2aDY5LjYzMmMxOC40OTYgMCAzNi4yMjQtOC4wNjQgNDguMTkyLTIyLjQ2NCAzNS43MTItNDMuMDcyIDEzNy44NTYtNzAuOTc2IDIwMi4xNzYtNzAuOTc2czE2Ni40IDI3LjkwNCAyMDIuMjQgNzAuOTc2QTYyLjQ2NCA2Mi40NjQgMCAwIDAgODU4LjM3NTA0IDg5Nkg5MjguMDcxMDRjMTYuOTYgMCAzMy4yOC02LjkxMiA0NS4yNDgtMTkuMmwyMzEuNjE2LTIzNy45NTJhMzkuODcyIDM5Ljg3MiAwIDAgMCAwLTU1LjI5NmwtMTQxLjMxMi0xNDUuMDg4YTM3LjQ0IDM3LjQ0IDAgMCAwLTUzLjgyNCAwbC00LjY3MiA0LjhhNy43NDQgNy43NDQgMCAwIDEtNS42MzIgMi40MzIgOC4xMjggOC4xMjggMCAwIDEtOC4wNjQtOC4zMnYtNTA1Ljg1NmMwLTMyLjg5Ni0yNS45ODQtNTkuNTItNTcuOTg0LTU5LjUySDI4Mi42OTUwNGE1OC43NTIgNTguNzUyIDAgMCAwLTU3Ljk4NCA1OS41MlYzNTYuMzUyek00MjUuOTI3MDQgNTAzLjY4aDI2Mi45MTJjMjQuMjU2IDAgNDMuODQtMTMuODg4IDQzLjg0LTMxLjA0di0yNDguMzJjMC0xNy4xNTItMTkuNTg0LTMxLjA0LTQzLjg0LTMxLjA0SDQyNS45MjcwNGMtMjQuMTkyIDAtNDMuNzc2IDEzLjg4OC00My43NzYgMzEuMDR2MjQ4LjMyYzAgMTcuMTUyIDE5LjU4NCAzMS4wNCA0My43NzYgMzEuMDR6IiAgaG9yaXotYWR2LXg9IjEyMTYiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibWFya2VyLWxheWVyIiB1bmljb2RlPSImIzU4OTI0OyIgZD0iTTUxMiA4OTZDMjc2LjM5NDY2NyA4OTYgODUuMzMzMzMzIDcwOS43MTczMzMgODUuMzMzMzMzIDQ4MFM1MTItMTI4IDUxMi0xMjhzNDI2LjY2NjY2NyAzNzguMjgyNjY3IDQyNi42NjY2NjcgNjA4Uzc0Ny42MDUzMzMgODk2IDUxMiA4OTZ6IG0wLTU5Ny4zMzMzMzNhMTcwLjY2NjY2NyAxNzAuNjY2NjY3IDAgMSAwIDAgMzQxLjMzMzMzMyAxNzAuNjY2NjY3IDE3MC42NjY2NjcgMCAwIDAgMC0zNDEuMzMzMzMzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InBvaW50LWxheWVyIiB1bmljb2RlPSImIzU4OTI1OyIgZD0iTTY4Mi42NjY2NjcgMzg0YTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDAgMCAwLTUxMnpNMTcwLjY2NjY2NyAxMjhhMTcwLjY2NjY2NyAxNzAuNjY2NjY3IDAgMSAwIDAgMzQxLjMzMzMzMyAxNzAuNjY2NjY3IDE3MC42NjY2NjcgMCAwIDAgMC0zNDEuMzMzMzMzeiBtNTU0LjY2NjY2Ni0xNzAuNjY2NjY3YTEyOCAxMjggMCAxIDAgMCAyNTYgMTI4IDEyOCAwIDAgMCAwLTI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiB1bmljb2RlPSImIzU4OTI2OyIgZD0iTTE2MCA1NzZhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtNzA0IDBhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtMC03MDRhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMCAwIDAtMzIweiBtLTcwNCAwYTE2MCAxNjAgMCAxIDAgMCAzMjAgMTYwIDE2MCAwIDAgMCAwLTMyMHpNMzIwIDc2OGgzODR2LTY0aC0zODR6IG0wLTcwNGgzODR2LTY0aC0zODR6IG0tMTI4IDUxMnYtMzg0SDEyOHYzODR6IG03MDQgMHYtMzg0aC02NHYzODR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iaW52aXNpYmxlIiB1bmljb2RlPSImIzU4OTI3OyIgZD0iTTMwNi4xNDA4OTEgMjIuODkzNzE0bDU2LjUzOTQyOSA1Ni42MTI1NzJBNDQ2LjAyNTE0MyA0NDYuMDI1MTQzIDAgMCAxIDUxMi4wMzgwMzQgNTQuODU3MTQzYzI4Ni4yMDggMCA0MDYuNjc0Mjg2IDI0MS43MzcxNDMgNDM2LjU4OTcxNSAzMTUuOTc3MTQzYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMCAyNC43OTU0MjggNTc4Ljg1MjU3MSA1NzguODUyNTcxIDAgMCAxLTEwMi45ODUxNDMgMTY2Ljc2NTcxNWw1MS4xMjY4NTcgNTEuMmE2ODkuNjY0IDY4OS42NjQgMCAwIDAgMTE5Ljk1NDI4Ni0xOTAuOTc2YzkuODAxMTQzLTI1LjIzNDI4NiA5LjgwMTE0My01Mi4wMDQ1NzEgMC03Ny4yMzg4NThDOTgxLjEwMzE3NyAyNjAuMDk2IDg0Mi43OTAwMzQtMTguMjg1NzE0IDUxMi4wMzgwMzQtMTguMjg1NzE0YTUxMS4wNDkxNDMgNTExLjA0OTE0MyAwIDAgMC0yMDUuODk3MTQzIDQxLjI1MjU3MXogbS0xNzkuMTI2ODU3IDEzMS4yOTE0MjlBNjg4LjU2Njg1NyA2ODguNTY2ODU3IDAgMCAwIDcuMzUyMzIgMzQ1LjM4MDU3MWExMDUuMTA2Mjg2IDEwNS4xMDYyODYgMCAwIDAgMCA3Ny4yMzg4NThDNDIuOTcyODkxIDUwNy45MDQgMTc5Ljc1MDAzNCA3ODYuMjg1NzE0IDUxMi4wMzgwMzQgNzg2LjI4NTcxNGM3OS4yMTM3MTQgMCAxNDcuMzgyODU3LTE1Ljk0NTE0MyAyMDUuNjc3NzE1LTQxLjM5ODg1N2wtNTYuMzItNTYuMzkzMTQzQTQ0Ni4wMjUxNDMgNDQ2LjAyNTE0MyAwIDAgMSA1MTIuMDM4MDM0IDcxMy4xNDI4NTdjLTI4Ni4yMDggMC00MDYuNjc0Mjg2LTI0MS43MzcxNDMtNDM2LjU4OTcxNC0zMTUuOTc3MTQzYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMC0yNC43OTU0MjhjMTMuNTMxNDI5LTM0LjIzMDg1NyA0NS40OTQ4NTctMTAyLjQgMTAyLjk4NTE0My0xNjYuNzY1NzE1eiBtMzU5LjEzMTQyOSA0OC43ODYyODZsMTAxLjAxMDI4NiAxMDEuMDEwMjg1IDQuOTAwNTcxIDQuODI3NDI5IDEwMS4wMTAyODYgMTAxLjAxMDI4NmExODMuNTE1NDI5IDE4My41MTU0MjkgMCAwIDAtMjA2LjkyMTE0My0yMDYuOTIxMTQzek0zMzEuMDA5NDYzIDM1OC4xMDc0MjlhMTgzLjUxNTQyOSAxODMuNTE1NDI5IDAgMCAwIDIwNi45MjExNDMgMjA2LjkyMTE0MnogbTUxNy4xOTMxNDMgMzYyLjA1NzE0MmEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAwIDAtNTEuNzEybC02MjAuNjE3MTQzLTYyMC42MTcxNDJhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMC01MS43MTIgNTEuNzEybDYyMC42MTcxNDMgNjIwLjYxNzE0MmEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAwIDUxLjcxMiAweiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNlYXJjaCIgdW5pY29kZT0iJiM1ODkyODsiIGQ9Ik03NzAuNjU5NTgyIDY4Mi4zMTE4OGEzNTAuNzA3MDY4IDM1MC43MDcwNjggMCAwIDEtNDk4LjkyNTYwMiAwIDM1Ny43NDY4MDggMzU3Ljc0NjgwOCAwIDAgMSAwLTUwMy4wMjE0NTEgMzUwLjc3MTA2NSAzNTAuNzcxMDY1IDAgMCAxIDQ5OC45MjU2MDIgMCAzNTcuNzQ2ODA4IDM1Ny43NDY4MDggMCAwIDEgMCA1MDMuMDIxNDUxeiBtLTU3NS43MjI3Ny01ODAuNDU4NTk2Yy0xODAuMTUzMzU3IDE4MS43NTMyOTgtMTgwLjE1MzM1NyA0NzYuMjA2NDQgMCA2NTcuODk1NzRhNDU4Ljg2MzA3OSA0NTguODYzMDc5IDAgMCAwIDY1Mi41ODM5MzYgMGMxODAuMTUzMzU3LTE4MS42ODkzIDE4MC4xNTMzNTctNDc2LjE0MjQ0MiAwLTY1Ny44OTU3NGE0NTguODYzMDc5IDQ1OC44NjMwNzkgMCAwIDAtNjUyLjU4MzkzNiAweiBtODYyLjA0ODIxMi0yMTEuMTkyMjEyYTYyLjcxNzY4NyA2Mi43MTc2ODcgMCAwIDAtODkuMTQ4NzEzIDBsLTg5LjE0ODcxMyA4OS44NTI2ODdhNjMuOTMzNjQyIDYzLjkzMzY0MiAwIDAgMCAwIDg5Ljg1MjY4NiA2Mi43MTc2ODcgNjIuNzE3Njg3IDAgMCAwIDg5LjE0ODcxMyAwbDg5LjE0ODcxMy04OS44NTI2ODZhNjMuODY5NjQ1IDYzLjg2OTY0NSAwIDAgMCAwLTg5Ljg1MjY4N3oiICBob3Jpei1hZHYteD0iMTA4NyIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJlZGl0IiB1bmljb2RlPSImIzU4OTMxOyIgZD0iTTk3OC4yMjE1NjQtMzYuNjMyNTE3MDAwMDAwMDFINDUuNzc4NDM2YTQ1LjcyNjM5NyA0NS43MjYzOTcgMCAwIDEgMC05MS4zNjc0ODNoOTMyLjQ0MzEyOGE0NS43MjYzOTcgNDUuNzI2Mzk3IDAgMCAxIDAgOTEuMzY3NDgzek0yNzUuODYwNjk3IDEwMC40NjEzNjNhNTEuNTI3NTA3IDUxLjUyNzUwNyAwIDAgMSAxOC44NTM2MDggMy44Mzg5N2gwLjQyNjU1MmwyNTkuNjg0OTg1IDEyMi4xNjQ1NTIgMi42NDQ2MjMgMS4yNzk2NTcgNDQxLjczNzQ2OCA0NDIuNTA1MjYxYTc5LjU5NDY0MiA3OS41OTQ2NDIgMCAwIDEgMCAxMTIuOTUxMDI1TDkxMC4wNTg1MjEgODcyLjQzNTU1YTc5Ljc2NTI2MyA3OS43NjUyNjMgMCAwIDEtMTEyLjk1MTAyNS0wLjE3MDYyMWwtNDM5Ljk0NTk0OC00NDAuMjAxODc5LTIuMDQ3NDUtMS45NjIxNC0xLjE5NDM0Ni0yLjU1OTMxNC0xMjEuNDgyMDY5LTI1OC40OTA2MzhhNDcuMjYxOTg1IDQ3LjI2MTk4NSAwIDAgMSAyLjkwMDU1NS00Ni40MDg4OGM4Ljk1NzU5Ni0xMy42NDk2NzEgMjQuMzk4Nzg2LTIyLjE4MDcxNSA0MC41MjI0NTktMjIuMTgwNzE1eiBtNTI0LjY1OTIxNyA2NDYuMjI2NTk2bDUyLjg5MjQ3NCA1Mi45Nzc3ODQgNzMuMDI1NzM4LTczLjExMTA0OS01Mi44OTI0NzQtNTIuOTc3Nzg0ek0zNjUuOTQ4NTI0IDIzOC44MzQ4OTg5OTk5OTk5NWw2NC44MzU5MzYgMTM3Ljk0Njk4NSAzMDUuMDcwMTM5IDMwNS4zMjYwNyA3My4wMjU3MzgtNzMuMTExMDQ4TDUwMy44OTU1MDggMzAzLjY3MDgzNXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsYXllcnMiIHVuaWNvZGU9IiYjNTg5MzI7IiBkPSJNNTQwLjQ0NDQ0NCAyNTEuMDUwNjY3TDEuMDgwODg5IDU3My4xNTU1NTYgNTQwLjQ0NDQ0NCA4OTUuMjAzNTU2bDUzOS4zNjM1NTYtMzIyLjA0OHpNMTAxMi4zOTQ2NjcgNDMzLjA5NTExMWwtNjcuNDEzMzM0LTQxLjk4NEw1NDAuNDQ0NDQ0IDE1My4wMzExMTEgNjguNDk0MjIyIDQzMy4wOTUxMTFsLTY3LjQxMzMzMy00MS45ODRMNTQwLjQ0NDQ0NCA2OS4wMDYyMjJsNTM5LjM2MzU1NiAzMjIuMTA0ODg5ek0xMDEyLjM5NDY2NyAyMzcuMDU2bC02Ny40MTMzMzQtNDIuMDQwODg5TDU0MC40NDQ0NDQtNDMuMDA4di02Ljk5NzMzM2wtNDcxLjk1MDIyMiAyODAuMDY0LTY3LjQxMzMzMy0zNS4wNDM1NTZMNTQwLjQ0NDQ0NC0xMjcuMDMyODg5bDUzOS4zNjM1NTYgMzIyLjA0OHoiICBob3Jpei1hZHYteD0iMTA4MCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJiYXNlbGF5ZXIiIHVuaWNvZGU9IiYjNTg5MzM7IiBkPSJNMTAyMi45NzYgMzg0LjM5ODIyMkMxMDIyLjk3NiA2NjYuMzk2NDQ0IDc5NC4xNjg4ODkgODk0Ljk3NiA1MTIgODk0Ljk3NiAyMjkuODMxMTExIDg5NC45NzYgMS4wMjQgNjY2LjM5NjQ0NCAxLjAyNCAzODQuMzk4MjIyYzAtMjYwLjQzNzMzMyAxOTUuMjQyNjY3LTQ3NS4zNjM1NTYgNDQ3LjQzMTExMS01MDYuNTk1NTU1YTI1NS4yNjA0NDQgMjU1LjI2MDQ0NCAwIDAgMSA2OC44OTI0NDUtMy45MjUzMzRjMjc5LjcyMjY2NyAyLjkwMTMzMyA1MDUuNjI4NDQ0IDIzMC40IDUwNS42Mjg0NDQgNTEwLjUyMDg4OXogbS03My4xMDIyMjItNy4yMjQ4ODlhNDk5LjgyNTc3OCA0OTkuODI1Nzc4IDAgMCAxLTkuOTU1NTU2IDc0LjYzODIyM2MwLjQ1NTExMSA4LjY0NzExMSAwLjU2ODg4OSAxNi44OTYgMC4zNDEzMzQgMjQuNDYyMjIyYTQzOS4wMTE1NTYgNDM5LjAxMTU1NiAwIDAgMCA5LjY3MTExMS05OS4xMDA0NDV6TTc0LjA2OTMzMyAzODQuMzk4MjIyYzAgMzAuOTQ3NTU2IDMuMTg1Nzc4IDYxLjE1NTU1NiA5LjMyOTc3OCA5MC4yODI2NjcgMTguODg3MTExLTIwLjI1MjQ0NCA2My40ODgtMTkuNzQwNDQ0IDc0LjM1Mzc3OCAxMC40Njc1NTUgMTkuNDU2LTExLjYwNTMzMyA0NS41NjgtMTMuNjUzMzMzIDQ1LjU2OC0zNi44NjQgMC03Ni40NTg2NjcgMi43MzA2NjctMTU4LjQzNTU1NiA3Mi4yNDg4ODktMTU5Ljc0NCAxLjkzNDIyMiAwIDM4LjY4NDQ0NC0xMy45Mzc3NzggNTYuMjA2MjIyLTU5LjMzNTExMSA2LjA4NzExMS0xNS43MDEzMzMgMzAuMDM3MzMzIDAgNTYuMzIgMCAxMy4wODQ0NDQgMCAwLTIyLjA3Mjg4OSAwLTY5Ljg1OTU1NSAwLTQ3LjU1OTExMSAxMDIuNTcwNjY3LTEyMC44MzIgMTAyLjU3MDY2Ny0xMjAuODMyYTU1MC41MTM3NzggNTUwLjUxMzc3OCAwIDAgMSAzLjQxMzMzMy03Ny4zMTIgMTcxLjc0NzU1NiAxNzEuNzQ3NTU2IDAgMCAxLTU4LjAyNjY2Ny03Ljg1MDY2N2MtMjA1LjY1MzMzMyAzNS45NTM3NzgtMzYxLjk4NCAyMTUuMjY3NTU2LTM2MS45ODQgNDMxLjA0NzExMXogbTU0NS43MzUxMTEtNDI0LjIyMDQ0NGMtMi4yNzU1NTYgMTEuMDkzMzMzLTEyLjE3NDIyMiAxNy4xODA0NDQtMzAuMzIxNzc3IDEyLjQ1ODY2NiAxNC40NDk3NzggNjEuNTUzNzc4IDIxLjUwNCA5Ni4wMjg0NDQgNTEuNzEyIDEyMi4yNTQyMjMgNDMuNjMzNzc4IDM3LjgzMTExMSA1LjE3Njg4OSA3OS45Mjg4ODktMjguMDQ2MjIzIDc0Ljk3OTU1NS0yNi4xNjg4ODktMy45ODIyMjItOS42NzExMTEgMzIuNDI2NjY3LTMyLjk5NTU1NSAzNC40MTc3NzgtMjMuNDM4MjIyIDEuOTkxMTExLTUzLjkzMDY2NyA0OC40NjkzMzMtODcuNjA4ODg5IDY0LjUxMi0xNy44MDYyMjIgOC40MTk1NTYtMzUuMzg0ODg5IDMxLjExODIyMi02Mi44NjIyMjIgMzIuMTQyMjIyLTI0LjQwNTMzMyAwLjk2NzExMS02MC4wMTc3NzgtMjAuNTkzNzc4LTYwLjAxNzc3OC0zLjk4MjIyMiAwIDUzLjUzMjQ0NC01LjQwNDQ0NCA5MS43NjE3NzgtNi41NDIyMjIgMTA2Ljk1MTExMS0wLjkxMDIyMiAxMi4yODgtNy45NjQ0NDQgNC4xNTI4ODkgMjQuOTc0MjIyIDMuNDEzMzMzIDE3LjkyLTAuNTEyIDkuMTAyMjIyIDM2LjAxMDY2NyAyNi45MDg0NDQgMzcuNDMyODg5IDE3LjQ2NDg4OSAxLjM2NTMzMyA1OC45OTM3NzgtMTYuMzI3MTExIDY5LjU3NTExMi05LjI3Mjg4OSA5Ljg0MTc3OCA2LjU0MjIyMiA3Mi4zMDU3NzgtMTYzLjk1Mzc3OCA3Mi4zMDU3NzctMjguMTYgMCAxNi4wOTk1NTYtOC4zNjI2NjcgNDQuMDg4ODg5IDAgNTkuMzM1MTEyIDMyLjk5NTU1NiA2MC4zMDIyMjIgNjMuODg2MjIyIDEwOS40NTQyMjIgNjEuMDk4NjY3IDExNi42MjIyMjItMS41MzYgNC4wMzkxMTEtMzMuNzM1MTExIDcuMzk1NTU2LTU5LjUwNTc3OC0xLjI1MTU1Ni04LjcwNC0yLjkwMTMzMyAyLjc4NzU1Ni0xNi40OTc3NzgtOS42NzExMTEtMTkuMzk5MTExLTQ2LjgxOTU1Ni0xMC44MDg4ODktODguMTc3Nzc4IDEyLjU3MjQ0NC03My42NzExMTEgMzQuNTg4NDQ1IDE0Ljc5MTExMSAyMi41MjggNjguNDk0MjIyIDkuODQxNzc4IDczLjIxNiA1NS4wNjg0NDQgMi43MzA2NjcgMjUuODg0NDQ0IDQuOTQ5MzMzIDU1LjkyMTc3OCA2LjQ4NTMzMyA3OC4yMjIyMjIgNjIuOTE5MTExLTkuODQxNzc4IDU1Ljk3ODY2NyA4MS42OTI0NDQtMzcuNTQ2NjY2IDkxLjQ3NzMzNGE0MzguMTAxMzMzIDQzOC4xMDEzMzMgMCAwIDAgNDA4LjYzMjg4OS0yOTQuMTcyNDQ1IDE3Ljg2MzExMSAxNy44NjMxMTEgMCAwIDEtMTAuNDY3NTU2IDQuNzc4NjY3Yy0yOC4yNzM3NzggNzAuNjU2LTk2Ljk5NTU1NiAxOS41MTI4ODktNzMuNjcxMTExLTQyLjgzNzMzNC0xMjQuODcxMTExLTk1Ljk3MTU1Ni05Mi44OTk1NTYtMTYyLjg3Mjg4OS01MS44ODI2NjctMjAxLjIxNiAyMS42MTc3NzgtMjAuMTM4NjY3IDQyLjE1NDY2Ny01MC40MDM1NTYgNTUuNTgwNDQ1LTcyLjE5Mi0xNC42MjA0NDQtNDIuNDk2IDUzLjcwMzExMS0yNS40ODYyMjIgODcuMzgxMzMzIDQ2LjY0ODg4OWE0MzguNjEzMzMzIDQzOC42MTMzMzMgMCAwIDAtMzEzLjA1OTU1Ni0zMDIuODE5NTU1eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNldHRpbmciIHVuaWNvZGU9IiYjNTg5MzQ7IiBkPSJNOTUwLjg0MDg4OSA0NTcuMTU5MTExaC04MS4xODA0NDVhMzY0LjgyODQ0NCAzNjQuODI4NDQ0IDAgMCAxLTUzLjM2MTc3NyAxMjcuMjYwNDQ1bDU3Ljc0MjIyMiA1Ny43OTkxMTFhNzIuODE3Nzc4IDcyLjgxNzc3OCAwIDEgMS0xMDMuMTM5NTU2IDEwMy4xMzk1NTVsLTU3Ljc0MjIyMi01Ny43OTkxMTFhMzUwLjQzNTU1NiAzNTAuNDM1NTU2IDAgMCAxLTEyOCA1NC44NDA4ODlWODIyLjg0MDg4OUM1ODUuMTU5MTExIDg2My4wNjEzMzMgNTUyLjIyMDQ0NCA4OTYgNTEyIDg5NlM0MzguODQwODg5IDg2My4wNjEzMzMgNDM4Ljg0MDg4OSA4MjIuODQwODg5Vjc0Mi40YTM2MS45MjcxMTEgMzYxLjkyNzExMSAwIDAgMS0xMjgtNTQuMTAxMzMzTDI1My4xNTU1NTYgNzQ2LjA0MDg4OWE3Mi44MTc3NzggNzIuODE3Nzc4IDAgMCAxLTEwMy4xMzk1NTYgMCA3Mi44MTc3NzggNzIuODE3Nzc4IDAgMCAxIDAtMTAzLjEzOTU1NkwyMDcuNjQ0NDQ0IDU4NS4xNTkxMTFhMzc0LjM4NTc3OCAzNzQuMzg1Nzc4IDAgMCAxLTUzLjM2MTc3Ny0xMjhINzMuMTU5MTExQzMyLjkzODY2NyA0NTcuMTU5MTExIDAgNDI0LjIyMDQ0NCAwIDM4NHMzMi45Mzg2NjctNzMuMTU5MTExIDczLjE1OTExMS03My4xNTkxMTFoODEuMTgwNDQ1YzkuNTAwNDQ0LTQ2LjgxOTU1NiAyOC41MDEzMzMtODkuMjAxNzc4IDUzLjM2MTc3Ny0xMjcuMjYwNDQ1bC01Ny43NDIyMjItNTcuNzk5MTExYTcyLjgxNzc3OCA3Mi44MTc3NzggMCAwIDEgMC0xMDMuMDgyNjY2IDcyLjgxNzc3OCA3Mi44MTc3NzggMCAwIDEgMTAzLjEzOTU1NiAwbDU3Ljc0MjIyMiA1Ny43NDIyMjJhMzUwLjQzNTU1NiAzNTAuNDM1NTU2IDAgMCAxIDEyOC01NC44NDA4ODl2LTgwLjQ0MDg4OUM0MzguODQwODg5LTk1LjA2MTMzMyA0NzEuNzc5NTU2LTEyOCA1MTItMTI4czczLjE1OTExMSAzMi45Mzg2NjcgNzMuMTU5MTExIDczLjE1OTExMVYyNS42YTM2MS45MjcxMTEgMzYxLjkyNzExMSAwIDAgMSAxMjggNTQuMTAxMzMzbDU3Ljc0MjIyMi01Ny43NDIyMjJjMjguNTU4MjIyLTI4LjU1ODIyMiA3NC42MzgyMjItMjguNTU4MjIyIDEwMy4xMzk1NTYgMHMyOC41NTgyMjIgNzQuNTgxMzMzIDAgMTAzLjEzOTU1NmwtNTcuNzQyMjIyIDU3Ljc0MjIyMmEzNzAuNzQ0ODg5IDM3MC43NDQ4ODkgMCAwIDEgNTMuMzYxNzc3IDEyNy4yNjA0NDRoODEuMTgwNDQ1YTczLjUwMDQ0NCA3My41MDA0NDQgMCAwIDEgMCAxNDcuMDAwODg5ek01MTIgMjM3LjczODY2N0ExNDYuNzE2NDQ0IDE0Ni43MTY0NDQgMCAwIDAgMzY1LjczODY2NyAzODQgMTQ2LjcxNjQ0NCAxNDYuNzE2NDQ0IDAgMCAwIDUxMiA1MzAuMjYxMzMzIDE0Ni43MTY0NDQgMTQ2LjcxNjQ0NCAwIDAgMCA2NTguMjYxMzMzIDM4NCAxNDYuNzE2NDQ0IDE0Ni43MTY0NDQgMCAwIDAgNTEyIDIzNy43Mzg2Njd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYWRkIiB1bmljb2RlPSImIzU4OTM2OyIgZD0iTTAgNDY5LjMzMzMzM2gxMDI0di0xNzAuNjY2NjY2SDB6TTQyNi42NjY2NjcgODk2aDE3MC42NjY2NjZ2LTEwMjRINDI2LjY2NjY2N3oiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwcmV2aWV3IiB1bmljb2RlPSImIzU4OTM1OyIgZD0iTTc3Mi4zNTIgMTk3LjYzMmM5Mi4xNiAxMjYuNTQ5MzMzIDgwLjA0MjY2NyAzMDEuOTk0NjY3LTMxLjA2MTMzMyA0MTIuNDE2QTMxNi4zMzA2NjcgMzE2LjMzMDY2NyAwIDAgMSA1MTUuNzU0NjY3IDcwMy4xNDY2NjdjLTg1LjE2MjY2NyAwLTE2NS4xMi0zMy4zNjUzMzMtMjI1LjUzNi05My4xODRhMzIwLjQyNjY2NyAzMjAuNDI2NjY3IDAgMCAxLTkyLjY3Mi0yMjUuNTM2QTMxOC40NjQgMzE4LjQ2NCAwIDAgMSA1MTYuMjY2NjY3IDY1Ljk2MjY2N2M2Ny4yNDI2NjcgMCAxMzEuNzU0NjY3IDIxLjMzMzMzMyAxODYuOTY1MzMzIDYyLjEyMjY2NmwxNjUuNzE3MzMzLTE2NS4xMmE0OC4yOTg2NjcgNDguMjk4NjY3IDAgMCAxIDY5LjEyIDAgNDguOTgxMzMzIDQ4Ljk4MTMzMyAwIDAgMSAwIDY5LjEyeiBtLTQxMi41ODY2NjcgMzAuNDY0YTIyMC42NzIgMjIwLjY3MiAwIDAgMCAxNTYuNTg2NjY3IDM3Ni43NDY2NjcgMjIwLjY3MiAyMjAuNjcyIDAgMCAwIDE1Ni41MDEzMzMtMzc2LjY2MTMzNGMtODMuNDU2LTgyLjg1ODY2Ny0yMjkuNTQ2NjY3LTgyLjg1ODY2Ny0zMTMuMDg4IDB6TTc2Mi41Mzg2NjcgODk1LjMxNzMzM0gyNjEuOTczMzMzYTI2MS4zNzYgMjYxLjM3NiAwIDAgMS0yNjEuMjA1MzMzLTI2MS4xMnYtNTAwLjM5NDY2NmEyNjEuMzc2IDI2MS4zNzYgMCAwIDEgMjYxLjEyLTI2MS4xMmgyNzEuNzAxMzMzYTQ4LjgxMDY2NyA0OC44MTA2NjcgMCAxIDEgMCA5Ny43OTJIMjYxLjk3MzMzM2ExNjIuOTg2NjY3IDE2Mi45ODY2NjcgMCAwIDAtMTYyLjgxNiAxNjIuNzMwNjY2VjYzMy42QTE2Mi45ODY2NjcgMTYyLjk4NjY2NyAwIDAgMCAyNjEuOTczMzMzIDc5Ni4zMzA2NjdoNTAwLjU2NTMzNGExNjIuOTg2NjY3IDE2Mi45ODY2NjcgMCAwIDAgMTYyLjk4NjY2Ni0xNjIuNzMwNjY3di0yNjYuMjRhNDguODEwNjY3IDQ4LjgxMDY2NyAwIDEgMSA5Ny43MDY2NjcgMFY2MzQuNjI0QTI2MC43Nzg2NjcgMjYwLjc3ODY2NyAwIDAgMSA3NjIuNTM4NjY3IDg5NS4zMTczMzN6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icmVmcmVzaCIgdW5pY29kZT0iJiM1ODkzNzsiIGQ9Ik02OTguMDAyMjg2IDExMS4xNzcxNDNhMzE2LjU2MjI4NiAzMTYuNTYyMjg2IDAgMCAwLTE4OS44Nzg4NTctNTkuOTc3MTQzYy04Ljk5NjU3MSAwLjA3MzE0My0xNy43NzM3MTQgMC43MzE0MjktMjYuNTUwODU4IDEuNDYyODU3LTMuNjU3MTQzIDAuMzY1NzE0LTcuMTY4IDAuOTUwODU3LTEwLjc1MiAxLjQ2Mjg1N2EyNjEuMTIgMjYxLjEyIDAgMCAwLTIwLjQ4IDMuMjE4Mjg2Yy00LjE2OTE0MyAwLjczMTQyOS04LjI2NTE0MyAxLjk3NDg1Ny0xMi4yODggMi45MjU3MTQtNi41ODI4NTcgMS40NjI4NTctMTMuMTY1NzE0IDIuOTI1NzE0LTE5LjY3NTQyOCA0LjkwMDU3Mi0yLjk5ODg1NyAxLjI0MzQyOS01LjkyNDU3MSAyLjE5NDI4Ni04Ljk5NjU3MiAzLjQzNzcxNGEyNDMuMzQ2Mjg2IDI0My4zNDYyODYgMCAwIDAtMjIuMDE2IDguMTkybC00LjgyNzQyOCAxLjk3NDg1N2E1NDguNTcxNDI5IDU0OC41NzE0MjkgMCAwIDAtMjQuNzIyMjg2IDEyLjM2MTE0M2wtMS4wMjQgMC41ODUxNDNhMzI0LjQ2MTcxNCAzMjQuNDYxNzE0IDAgMCAwLTczLjg3NDI4NiA1Ni44MzJsLTEuMDI0IDEuMjQzNDI4YTI3NS4wOTAyODYgMjc1LjA5MDI4NiAwIDAgMC0xOS4zODI4NTcgMjEuODY5NzE1QTMzNi44MjI4NTcgMzM2LjgyMjg1NyAwIDAgMCAxODcuNzU3NzE0IDM4NGg4NS40MzA4NTdMMTM2LjYzMDg1NyA1OTQuMjg1NzE0IDAuMDczMTQzIDM4NGg4NS4yODQ1NzFjMC05Mi4wODY4NTcgMjguMDg2ODU3LTE3Ny41MTc3MTQgNzUuNTU2NTcyLTI0OC4yNDY4NTcgMC41ODUxNDMtMS4wOTcxNDMgMC45NTA4NTctMi4xOTQyODYgMS42MDkxNDMtMy4wNzIgNC45MDA1NzEtNy4zMTQyODYgMTAuMzg2Mjg2LTEzLjk3MDI4NiAxNS42NTI1NzEtMjAuNjk5NDI5IDIuMDQ4LTIuNDg2ODU3IDMuNzMwMjg2LTUuMDQ2ODU3IDUuODUxNDI5LTcuNzUzMTQzIDcuNzUzMTQzLTkuNTgxNzE0IDE2LjA5MTQyOS0xOC43MjQ1NzEgMjQuNTAyODU3LTI3LjY0OGwyLjM0MDU3MS0yLjQ4Njg1N2MyOC41OTg4NTctMjkuNDAzNDI5IDYwLjg1NDg1Ny01NC4xMjU3MTQgOTUuOTYzNDI5LTczLjk0NzQyOGwyLjg1MjU3MS0xLjYwOTE0M2MxMC4wOTM3MTQtNS41NTg4NTcgMjAuNDgtMTAuNzUyIDMwLjkzOTQyOS0xNS4zNmw3LjgyNjI4NS0zLjU4NGE2OTIuODA5MTQzIDY5Mi44MDkxNDMgMCAwIDEgNDAuODg2ODU4LTE1LjA2NzQyOWM4LjExODg1Ny0yLjQxMzcxNCAxNi4zODQtNC42MDggMjQuODY4NTcxLTYuNTgyODU3IDUuNTU4ODU3LTEuMjQzNDI5IDEwLjk3MTQyOS0yLjc3OTQyOSAxNi42NzY1NzEtMy44MDM0MjggMi4zNDA1NzEtMC41ODUxNDMgNC41MzQ4NTctMS4zODk3MTQgNi44NzU0MjktMS42MDkxNDMgOC4wNDU3MTQtMS40NjI4NTcgMTUuOTQ1MTQzLTIuMTk0Mjg2IDIzLjc3MTQyOS0zLjIxODI4NiAyLjkyNTcxNC0wLjUxMiA1Ljc3ODI4Ni0xLjAyNCA4LjYzMDg1Ny0xLjMxNjU3MSAxNC4xODk3MTQtMS40NjI4NTcgMjguMzc5NDI5LTIuMzQwNTcxIDQyLjU2OTE0My0yLjM0MDU3MmE0MTUuNzQ0IDQxNS43NDQgMCAwIDEgMjQzLjkzMTQyOCA3OS41MDYyODYgNTMuNTQwNTcxIDUzLjU0MDU3MSAwIDAgMSAxMi42NTM3MTQgNzMuMTQyODU3IDUwLjAyOTcxNCA1MC4wMjk3MTQgMCAwIDEtNzEuMzE0Mjg1IDEyLjk0NjI4NnpNOTM4LjQ5NiAzODRhNDQyLjg4IDQ0Mi44OCAwIDAgMS03NS4wNDQ1NzEgMjQ3LjY2MTcxNGMtMC43MzE0MjkgMS4xNzAyODYtMS4wOTcxNDMgMi40MTM3MTQtMS42ODIyODYgMy41MTA4NTdhNTM1Ljk5MDg1NyA1MzUuOTkwODU3IDAgMCAxLTE4Ljg3MDg1NyAyNC44Njg1NzIgMzAuNjQ2ODU3IDMwLjY0Njg1NyAwIDAgMC0yLjEyMTE0MyAyLjkyNTcxNCA0MjcuNzM5NDI5IDQyNy43Mzk0MjkgMCAwIDEtMTU5LjMwNTE0MyAxMjIuODhsLTUuMTIgMi4yNjc0MjlhNTA0LjUzOTQyOSA1MDQuNTM5NDI5IDAgMCAxLTMwLjIwOCAxMS40MTAyODVsLTEwLjgyNTE0MyAzLjY1NzE0M2E0MTYuNDAyMjg2IDQxNi40MDIyODYgMCAwIDEtMjYuNzcwMjg2IDcuMTY4bC0xNS4xNDA1NzEgMy41MTA4NTdjLTIuNDg2ODU3IDAuNDM4ODU3LTQuNzU0Mjg2IDEuMTcwMjg2LTcuMzE0Mjg2IDEuNjgyMjg2LTYuODAyMjg2IDEuMDk3MTQzLTEzLjM4NTE0MyAxLjgyODU3MS0yMC4xODc0MjggMi42MzMxNDMtNC42ODExNDMgMC41MTItOS4yMTYgMS4yNDM0MjktMTMuODk3MTQzIDEuNzU1NDI5YTQzMS4wMzA4NTcgNDMxLjAzMDg1NyAwIDAgMS0zMy45MzgyODYgMS44Mjg1NzFjLTIuMDQ4IDAtNC4wOTYgMC4yOTI1NzEtNi4xNDQgMC4yOTI1NzFhNDE1LjE1ODg1NyA0MTUuMTU4ODU3IDAgMCAxLTI0NC41ODk3MTQtNzkuMjg2ODU3IDUzLjM5NDI4NiA1My4zOTQyODYgMCAwIDEtMTIuNTA3NDI5LTczLjIxNmMxNi4wOTE0MjktMjMuNjk4Mjg2IDQ4LjEyOC0yOS41NDk3MTQgNzEuMzE0Mjg2LTEyLjhhMzE1LjYxMTQyOSAzMTUuNjExNDI5IDAgMCAwIDIxNi43OTU0MjkgNTguNTE0Mjg2YzIuOTI1NzE0LTAuMjE5NDI5IDUuNzA1MTQzLTAuNzMxNDI5IDguNTU3NzE0LTEuMTcwMjg2IDcuNzUzMTQzLTAuOTUwODU3IDE1LjM2LTEuOTc0ODU3IDIyLjk2Njg1Ny0zLjY1NzE0MyAzLjIxODI4Ni0wLjU4NTE0MyA2LjU4Mjg1Ny0xLjQ2Mjg1NyA5LjcyOC0yLjE5NDI4NSA3LjQ2MDU3MS0xLjc1NTQyOSAxNC43NzQ4NTctMy41MTA4NTcgMjEuOTQyODU3LTUuNzc4Mjg2IDIuNDEzNzE0LTAuNzMxNDI5IDQuNjA4LTEuNDYyODU3IDYuODAyMjg2LTIuNDEzNzE0IDguMzM4Mjg2LTIuNzc5NDI5IDE2LjQ1NzE0My01LjYzMiAyNC4zNTY1NzEtOS4wNjk3MTUgMC44Nzc3MTQtMC4yMTk0MjkgMS42ODIyODYtMC45NTA4NTcgMi40ODY4NTctMS4yNDM0MjhhMzI2LjIxNzE0MyAzMjYuMjE3MTQzIDAgMCAwIDEyMi44OC05NC43OTMxNDNBMzM3LjMzNDg1NyAzMzcuMzM0ODU3IDAgMCAwIDgzNi4yNDIyODYgMzg0aC04NS41MDRsMTM2Ljc3NzE0My0yMTAuMzU4ODU3TDEwMjMuOTI2ODU3IDM4NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJzb2xpZC10cmlhbmdsZSIgdW5pY29kZT0iJiM1ODkzODsiIGQ9Ik00NzEuMTQyNCAxMjIuMTYzMmMyMi41MjgtMjUuMDg4IDU4LjY3NTItMjUuNiA4MS43MTUyIDBsMjQ1Ljk2NDggMjczLjQwOGM0NS4xNTg0IDUwLjE3NiAyNi40MTkyIDkwLjgyODgtNDEuNTc0NCA5MC44Mjg4aC00OTAuNDk2Yy02OC4wOTYgMC04Ni43MzI4LTQwLjc1NTItNDEuNTc0NC05MC45MzEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJvYWRuZXR3b3JrIiB1bmljb2RlPSImIzU4OTM5OyIgZD0iTTUwMi43MTA4NTcgODE4LjQ2ODU3MWEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxLTM1LjYyMDU3MS0zNy4zMDI4NTd2LTE2Mi4yMzA4NTdhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMSAzNS42MjA1NzEtMzcuMzAyODU3IDM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEgMzUuNjkzNzE0IDM3LjMwMjg1N1Y3ODEuMTY1NzE0YTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEtMzUuNjkzNzE0IDM3LjMwMjg1N3ogbS0xLjYwOTE0My0zNTIuNzY4YTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEtMzUuNjkzNzE0LTM3LjMwMjg1N3YtMTYyLjMwNGEzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxIDM1LjY5MzcxNC0zNy4zMDI4NTcgMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMSAzNS42MjA1NzIgMzcuMzAyODU3VjQyOC4zOTc3MTRhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMS0zNS42MjA1NzIgMzcuMzAyODU3eiBtMC0zNTMuMjhhMzYuNTcxNDI5IDM2LjU3MTQyOSAwIDAgMS0zNS42OTM3MTQtMzcuMzAyODU3di0xNjIuMzc3MTQzYTM2LjU3MTQyOSAzNi41NzE0MjkgMCAwIDEgMzUuNjkzNzE0LTM3LjMwMjg1NyAzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxIDM1LjYyMDU3MiAzNy4zMDI4NTd2MTYyLjM3NzE0M2EzNi41NzE0MjkgMzYuNTcxNDI5IDAgMCAxLTM1LjYyMDU3MiAzNy4zMDI4NTd6IG01MDYuNzMzNzE1LTE5My4wOTcxNDJsLTE4OS4xNDc0MjkgODczLjMyNTcxNGMtNC40NjE3MTQgMjAuNzcyNTcxLTIzLjY5ODI4NiAzMy43MTg4NTctNDIuODYxNzE0IDI5LjAzNzcxNC0xOS4yMzY1NzEtNC43NTQyODYtMzEuMTU4ODU3LTI1LjM4MDU3MS0yNi42OTcxNDMtNDYuMDhsMTg5LjE0NzQyOC04NzMuMzk4ODU3YzQuNTM0ODU3LTIwLjc3MjU3MSAyMy42OTgyODYtMzMuNzE4ODU3IDQyLjkzNDg1OC0yOS4wMzc3MTQgMTkuMjM2NTcxIDQuNzU0Mjg2IDMxLjE1ODg1NyAyNS4zODA1NzEgMjYuNjI0IDQ2LjA4ek0yMzMuODM3NzE0IDgyMS42ODY4NTdjLTE5LjE2MzQyOSA0LjY4MTE0My0zOC40LTguMjY1MTQzLTQyLjg2MTcxNC0yOS4wMzc3MTRMMS44Mjg1NzEtODAuNjc2NTcxYy00LjUzNDg1Ny0yMC43NzI1NzEgNy4zODc0MjktNDEuMzk4ODU3IDI2LjYyNC00Ni4wOCAxOS4yMzY1NzEtNC43NTQyODYgMzguNCA4LjE5MiA0Mi45MzQ4NTggMjguOTY0NTcxbDE4OS4xNDc0MjggODczLjMyNTcxNGM0LjQ2MTcxNCAyMC43NzI1NzEtNy40NjA1NzEgNDEuMzk4ODU3LTI2LjY5NzE0MyA0Ni4wOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJyZXR1cm4iIHVuaWNvZGU9IiYjNTg5NDA7IiBkPSJNOTQxLjMxMiAzNDIuNzg0SDI0MC4zODRsMzQ3LjItMzQ3LjItNTguMjQtNTguMjRMODIuNjg4IDM4NGw0NDYuNzIgNDQ2LjY1NiA1OC4yNC01OC4yNC0zNDcuMjY0LTM0Ny4yaDcwMC45Mjh6TTE5OS4yMzIgMzgxLjQ0bDMuNjQ4LTMuMnY2LjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icGFja3VwIiB1bmljb2RlPSImIzU4OTQxOyIgZD0iTTEwNi40OTYgODAwaDgyMC40MTZjMjIuNjU2IDAgNDAuOTYgMjEuNTA0IDQwLjk2IDQ4cy0xOC4zMDQgNDgtNDAuOTYgNDhIMTA2LjQ5NmMtMjIuNTkyIDAtNDAuOTYtMjEuNTA0LTQwLjk2LTQ4czE4LjM2OC00OCA0MC45Ni00OHpNNTQwLjIyNCA0NDhIOTkuNzc2QzgwIDQ0OCA2NCA0MjYuNDk2IDY0IDQwMHMxNi00OCAzNS44NC00OGg0NDAuMzJjMTkuODQgMCAzNS44NCAyMS41MDQgMzUuODQgNDhTNTYwIDQ0OCA1NDAuMTYgNDQ4eiBtMzg1LjE1Mi00NDhIMTA1LjAyNGMtMjIuNjU2IDAtNDEuMDI0LTIxLjUwNC00MS4wMjQtNDhzMTguMzY4LTQ4IDQwLjk2LTQ4aDgyMC40OGMyMi41OTIgMCA0MC45NiAyMS41MDQgNDAuOTYgNDhzLTE4LjM2OCA0OC00MC45NiA0OHogbTMxLjQyNCA2MDcuOTM2bC0yNDAtMjA4IDI0MC0yMDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ic2hhcmUiIHVuaWNvZGU9IiYjNTg5NDI7IiBkPSJNOTE1LjUyIDIzOC43MnYtMjE3LjcyOGMwLTM3LjQ0LTMwLjcyLTY4Ljg2NC02Ni44MTYtNjguODY0bC03MDYuNTYtMS4yOGMtMzYuMDk2IDAtNjUuNiAzMC40LTY1LjYgNjcuODRsMS4yMTYgNzI4LjA2NGMwIDM3LjMxMiAzMC43MiA2OC45MjggNjYuODggNjguOTI4aDM5MC43ODRWODk1LjgwOEgxNDQuNjRDNjIuMDE2IDg5NS44MDggMC4xOTIgODA5LjY2NCAwLjE5MiA3MzIuNjA4di03MTMuODU2YzAtODAuNzY4IDYzLjYxNi0xNDYuNTYgMTQyLjIwOC0xNDYuNTZoNjkyLjczNmM4Mi44MTYgMCAxNTguMTQ0IDcwLjk3NiAxNTguMTQ0IDE0OC44VjIzOC43MnogbS0xODMuMTY4IDU1My40NzJsMjkxLjQ1Ni0yODIuMTEyLTI5MS40NTYtMjgxLjk4NFYzODkuMjQ4cy0yODkuMjggMzEuMDQtNDU4LjA0OC0yMDEuNmMwIDAgNTMuMTIgNDQzLjM5MiA0NTguMDQ4IDQ0My4zOTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYmFja2hvbWVwYWdlIiB1bmljb2RlPSImIzU4OTY5OyIgZD0iTTcyOS4yNDggNDguMTI4aC0xMzkuOTY4YTE5Ljg0IDE5Ljg0IDAgMCAwLTE5Ljg0IDE5Ljg0djI2OS4xMmExOC4wNDggMTguMDQ4IDAgMCAxLTE4LjA0OCAxOC4wMTZoLTc2LjczNmExOC4wNDggMTguMDQ4IDAgMCAxLTE4LjA0OC0xOC4wMTZ2LTI2OS4xMmExOS44NCAxOS44NCAwIDAgMC0xOS44NC0xOS44NEgyOTIuNDhhNTguNDY0IDU4LjQ2NCAwIDAgMC01OC40NjQgNTguNDY0djI0Ny4zNmExMy40NCAxMy40NCAwIDAgMS0xMy40NCAxMy40NEgxODMuNzQ0Yy0zNC40IDAtNTEuODcyIDQxLjI4LTI3Ljk2OCA2NS45ODRsMzI4LjMyIDMzOS4wNGEzOC45MTIgMzguOTEyIDAgMCAwIDU1LjY0OCAwLjMyTDg3Mi41MTIgNDM2LjQ4YzI1LjM3Ni0yNS42IDcuMi02OS4xMi0yOC44MzItNjkuMTJIODA0LjE2YTE0LjQ2NCAxNC40NjQgMCAwIDEtMTQuNDY0LTE0LjQ2NHYtMjQ0LjM1MmE2MC40OCA2MC40OCAwIDAgMC02MC40OC02MC40OHogbS04NS42NjQgNDkuODg4aDcxLjk2OGMxMy40MDggMCAyNC4yNTYgMTAuODggMjQuMjU2IDI0LjI1NnYyNzAuMjA4YzAgMTMuNjk2IDExLjEwNCAyNC44IDI0LjggMjQuOGg0Ni40OTZhNC4yODggNC4yODggMCAwIDEgMy4wNCA3LjI5Nkw1MjMuOTY4IDcxNy43NmExNi4zODQgMTYuMzg0IDAgMCAxLTIzLjQyNC0wLjEyOGwtMjkwLjg4LTMwMC4zODRoNDkuNDcyYzEzLjY5NiAwIDI0LjgtMTEuMTA0IDI0LjgtMjQuOHYtMjcwLjIwOGMwLTEzLjQwOCAxMC44OC0yNC4yNTYgMjQuMjU2LTI0LjI1Nmg3NC4yNGMxMy40NCAwIDI0LjMyIDEwLjg4IDI0LjMyIDI0LjI1NlYzMzQuNzJjMCAzOC44NDggMzEuNDU2IDcwLjMwNCA3MC4yNzIgNzAuMzA0aDcyYzM4LjgxNiAwIDcwLjMwNC0zMS40NTYgNzAuMzA0LTcwLjMwNHYtMjEyLjQxNmMwLTEzLjQwOCAxMC44OC0yNC4yNTYgMjQuMjU2LTI0LjI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJNeU1hcHMiIHVuaWNvZGU9IiYjNTg5NzA7IiBkPSJNODMwLjU5MiA3MjguNTc2Yy01LjE1MiAwLTEwLjQzMi0wLjg2NC0xNS41ODQtMi44MTZsLTE3Mi44OTYtNjIuODE2YTQ1LjI0OCA0NS4yNDggMCAwIDAtMTUuNTg0LTIuNzJjLTUuNzYgMC0xMS40NTYgMS4wNTYtMTYuODY0IDMuMjY0bC0xOTUuMiA3OC4xMTJhNDUuNiA0NS42IDAgMCAxLTMyLjQ0OCAwLjUxMkwxNzcuOTg0IDY2Ny45NjhhNDUuNDQgNDUuNDQgMCAwIDEtMjkuOTItNDIuNzg0di01NDAuMTZhNDUuNTA0IDQ1LjUwNCAwIDAgMSA2MC45OTItNDIuNjg4bDE3Mi44OTYgNjIuODQ4YzQuOTkyIDEuODI0IDEwLjMwNCAyLjY4OCAxNS41NTIgMi42ODggNS43NiAwIDExLjQ4OC0xLjA1NiAxNi44OTYtMy4ybDE5NS4yLTc4LjE3NmE0NS4yNDggNDUuMjQ4IDAgMCAxIDMyLjQ4LTAuNTEybDIwMy45NjggNzQuMjA4YTQ1LjQ0IDQ1LjQ0IDAgMCAxIDI5LjkyIDQyLjc4NFY2ODMuMTA0YzAgMjUuOTUyLTIxLjM0NCA0NS40NzItNDUuNDQgNDUuNDcyek0xOTMuNDcyIDg0LjkyOFY2MjUuMTUybDE4Mi4wMTYgNjYuMTQ0di01NDAuNzM2YTgzLjkzNiA4My45MzYgMCAwIDEtOS4wODgtMi44MTZ6IG0yMjcuNTIgNjUuMjhWNjg5Ljg4OGwxNzEuNzc2LTY4LjY3MmMzLjM5Mi0xLjMxMiA2LjgxNi0yLjQ2NCAxMC4yNC0zLjQyNHYtNTM5LjY4bC0xNzEuNzc2IDY4LjY3MmE3MC4yNCA3MC4yNCAwIDAgMS0xMC4yNCAzLjQyNHogbTQwOS41MDQtNy4zNmwtMTgxLjk4NC02Ni4xNDRWNjE3LjQ0YzMuMDQgMC44IDYuMTEyIDEuNjY0IDkuMDg4IDIuODE2bDE3Mi44OTYgNjIuODE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IkNyZWF0ZU1hcCIgdW5pY29kZT0iJiM1ODk3MTsiIGQ9Ik01MTIgNzM2QzMwMC4wMzIgNzM2IDEyOCA1NjMuOTY4IDEyOCAzNTJzMTcyLjAzMi0zODQgMzg0LTM4NCAzODQgMTcyLjAzMiAzODQgMzg0UzcyMy45NjggNzM2IDUxMiA3MzZ6IG0wLTcxNC4yNGMtMTgyLjAxNiAwLTMzMC4yNCAxNDguMjI0LTMzMC4yNCAzMzAuMjRTMzI5Ljk4NCA2ODIuMjQgNTEyIDY4Mi4yNCA4NDIuMjQgNTM0Ljc4NCA4NDIuMjQgMzUyIDY5NC4wMTYgMjEuNzYgNTEyIDIxLjc2ek02NjcuMTM2IDM4NS43OTJoLTEyMS4zNDR2MTIxLjM0NGMwIDE0LjU5Mi0xMi4yODggMjYuODgtMjYuODggMjYuODhzLTI2Ljg4LTEyLjI4OC0yNi44OC0yNi44OHYtMTIxLjM0NGgtMTIxLjM0NGMtMTQuNTkyIDAtMjYuODgtMTIuMjg4LTI2Ljg4LTI2Ljg4czEyLjI4OC0yNi44OCAyNi44OC0yNi44OGgxMjEuMzQ0di0xMjEuMzQ0YzAtMTQuNTkyIDEyLjI4OC0yNi44OCAyNi44OC0yNi44OHMyNi44OCAxMi4yODggMjYuODggMjYuODh2MTIxLjM0NGgxMjEuMzQ0YzE0LjU5MiAwIDI2Ljg4IDEyLjI4OCAyNi44OCAyNi44OHMtMTIuMjg4IDI2Ljg4LTI2Ljg4IDI2Ljg4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZlZWRiYWNrIiB1bmljb2RlPSImIzU4OTcyOyIgZD0iTTQxMC4zMDQgMTUyLjg5NmwtMTc1LjY0OC0xMzguNjg4djEzOC42ODhoLTI4LjQ0OGE2NCA2NCAwIDAgMC02NCA2NFY2NDMuNTJhNjQgNjQgMCAwIDAgNjQgNjRoNjExLjU4NGE2NCA2NCAwIDAgMCA2NC02NHYtNDI2LjY1NmE2NCA2NCAwIDAgMC02NC02NHogbS03LjM2IDQ2LjIwOGg0MDAuNjRhMzIgMzIgMCAwIDEgMzIgMzJWNjI5LjM0NGEzMiAzMiAwIDAgMS0zMiAzMkgyMjAuNDE2YTMyIDMyIDAgMCAxLTMyLTMydi0zOTguMjRhMzIgMzIgMCAwIDEgMzItMzJoMjguNDQ4YTMyIDMyIDAgMCAwIDMyLTMydi01NS44MDhsMTAyLjIwOCA4MC44OTZhMzIgMzIgMCAwIDAgMTkuODQgNi45MTJ6TTI4MC44OTYgMzg0aDQ2Mi4yMDh2LTQ2LjIwOEgyODAuODk2eiBtMCAxMzguNjU2aDQ2Mi4yMDh2LTQ2LjIwOEgyODAuODk2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNraW4xIiB1bmljb2RlPSImIzU4OTczOyIgZD0iTTc0MC4xOTIgNzgwdi01NmwxNDIuODE2LTE0MS40MDgtNzkuODA4LTc5Ljc3NmE1NS4yIDU1LjIgMCAwIDEtMzcuNzkyIDEzLjk4NCA1Ni43NjggNTYuNzY4IDAgMCAxLTU3LjQwOC01Ny40MDh2LTI5NS4zOTJjMC0zMC44MTYtMjUuMTg0LTU2LTU2LTU2aC0yODBjLTMwLjc4NCAwLTU2IDI1LjE4NC01NiA1NnYyOTUuMzkyYTU2Ljc2OCA1Ni43NjggMCAwIDEtNTcuNDA4IDU3LjQwOGMtMTMuOTg0IDAtMjgtNS42LTM3Ljc5Mi0xNC4wMTZMMTQwLjk5MiA1ODIuNTkybDE0MS40MDggMTQxLjQwOGgzNS4wMDhsMS40MDgtMS40MDhDMzU4LjAxNiA2NjMuODA4IDQzMi4xOTIgNjI1Ljk4NCA1MTIgNjI1Ljk4NHMxNTQuMDE2IDM2LjQxNiAxOTMuMTg0IDk2LjY0YzAgMS4zNzYgMS40MDggMS4zNzYgMS40MDggMS4zNzZoMzMuNnogbS00MjEuMzc2IDBIMjg4Yy0xOS41ODQgMC0zMy42LTUuNi00My4zOTItMTYuOEwxMDEuNzYgNjIxLjc5MmMtMjIuNC0yMi40LTIyLjQtNTcuNDA4IDAtNzguNEwxODQuNDE2IDQ2MC44YzkuNzkyLTkuNzkyIDIzLjc3Ni0xNS4zOTIgMzYuMzg0LTE1LjM5MnMyNi41OTIgNS42IDM2LjQxNiAxNS4zOTJoMS4zNzZjMS40MDggMCAxLjQwOCAwIDEuNDA4LTEuNDA4di0yOTUuMzkyYTExMi4zMiAxMTIuMzIgMCAwIDEgMTEyLTExMmgyODBhMTEyLjMyIDExMi4zMiAwIDAgMSAxMTIgMTEydjI5NS4zOTJjMCAxLjQwOCAwIDEuNDA4IDEuNDA4IDEuNDA4aDEuMzc2YzkuODI0LTkuNzkyIDIzLjgwOC0xNS4zOTIgMzYuNDE2LTE1LjM5MiAxMy45ODQgMCAyNi41OTIgNS42IDM2LjM4NCAxNS4zOTJsODIuNjI0IDgyLjU5MmMyMi40IDIyLjQgMjIuNCA1Ny40MDggMCA3OC40TDc4MC44IDc2My4yYTU2LjA2NCA1Ni4wNjQgMCAwIDEtNDAuNjA4IDE2LjhoLTM1LjAwOGMtMTkuNTg0IDAtMzYuMzg0LTkuNzkyLTQ3LjU4NC0yNi41OTItMjkuNDA4LTQzLjQyNC04NC03MS40MjQtMTQ3LjAwOC03MS40MjRzLTExNy42IDI5LjQ0LTE0Ny4wMDggNzEuNDI0Yy04LjM4NCAxNi44LTI2LjU2IDI2LjU5Mi00NC44IDI2LjU5MnpNMzg0IDQ4MGgxMjh2LTE2MGgtMTI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLSIgdW5pY29kZT0iJiM1ODk3NDsiIGQ9Ik02MTMuNjMyIDgzOS4zNmMxNC41MjggMTguNDMyIDIxLjY5NiAxNS4wNCAxNS44MDgtOEw1NTUuMzkyIDU0MC40OCA3OTguNzg0IDQ2Ny4yYzExLjItMy4zMjggMTQuNTkyLTEzLjYzMiA3LjQ4OC0yMy4wNGwtMzg3LjUyLTUxNi4wOTZjLTE0LjE0NC0xOC45NDQtMjAuODY0LTE1LjgwOC0xNC45MTIgNy4xMDRMNDgyLjI0IDIzNi44IDIwMC45NiAyODYuMjcyYy0xMS41ODQgMi4wNDgtMTUuMTY4IDExLjA3Mi03Ljc0NCAyMC40OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJhY2NvdW50IiB1bmljb2RlPSImIzU4OTc1OyIgZD0iTTg0Ny42OCA2NjEuNDRjMTcuNiAwIDMxLjg3Mi0xNC4yNzIgMzEuODcyLTMxLjg0di00OTEuMmMwLTE3LjU2OC0xNC4yNzItMzEuODcyLTMxLjg3Mi0zMS44NzJIMTc2LjMyYTMxLjkwNCAzMS45MDQgMCAwIDAtMzEuODcyIDMxLjg3MlY2MjkuNmMwIDE3LjU2OCAxNC4yNzIgMzEuODcyIDMxLjg3MiAzMS44NzJ6IG0wIDUyLjUxMkgxNzYuMzJhODQuMzg0IDg0LjM4NCAwIDAgMS04NC4zODQtODQuMzUydi00OTEuMkE4NC4zODQgODQuMzg0IDAgMCAxIDE3Ni4zMiA1NC4wOGg2NzEuMzZhODQuMzg0IDg0LjM4NCAwIDAgMSA4NC4zODQgODQuMzUyVjYyOS42QTg0LjM4NCA4NC4zODQgMCAwIDEgODQ3LjY4IDcxMy45MnpNODEyLjQ0OCA1MzcuNzZjMC0xNC40MzItMTEuODQtMjYuMjQtMjYuMjQtMjYuMjRoLTE3Mi40OGMtMTQuNDMyIDAtMjYuMjQgMTEuODA4LTI2LjI0IDI2LjI0czExLjgwOCAyNi4yNCAyNi4yNCAyNi4yNGgxNzIuNDhjMTQuNCAwIDI2LjI0LTExLjg0IDI2LjI0LTI2LjI0eiBtMC0xMjMuNzQ0YzAtMTQuNDMyLTExLjg0LTI2LjI0LTI2LjI0LTI2LjI0aC0xMTYuOTZhMjYuMzM2IDI2LjMzNiAwIDAgMC0yNi4yNCAyNi4yNGMwIDE0LjQzMiAxMS44MDggMjYuMjQgMjYuMjQgMjYuMjRoMTE2LjkyOGMxNC40NjQgMCAyNi4yNC0xMS44MDggMjYuMjQtMjYuMjR6IG0wLTEyMy43NDRjMC0xNC40LTExLjg0LTI2LjI0LTI2LjI0LTI2LjI0aC02NS43NmMtMTQuNDMyIDAtMjYuMjQgMTEuODQtMjYuMjQgMjYuMjRzMTEuODA4IDI2LjI0IDI2LjI0IDI2LjI0aDY1LjcyOGMxNC40NjQgMCAyNi4yNC0xMS43NzYgMjYuMjQtMjYuMjR6TTQ4MS4wMjQgMzc0LjA4YTE4Ny41MiAxODcuNTIgMCAwIDAgMTA2LjQ2NC0xNjkuMTUyaC01Mi41MTJhMTM0LjExMiAxMzQuMTEyIDAgMCAxLTM5LjU1MiA5NS40NTYgMTM0LjAxNiAxMzQuMDE2IDAgMCAxLTg4Ljg5NiAzOS4zOTIgMTE0LjE3NiAxMTQuMTc2IDAgMCAwLTEzLjEyIDBjLTMzLjYtMS42LTY0Ljk2LTE1LjQyNC04OC44OTYtMzkuMzZhMTM0LjExMiAxMzQuMTEyIDAgMCAxLTM5LjUyLTk1LjQ4OEgyMTIuNDhhMTg3LjUyIDE4Ny41MiAwIDAgMCAxMDYuNDY0IDE2OS4xMiAxMTIuNTEyIDExMi41MTIgMCAxIDAgMTYyLjA4IDB6IG0tMTQxLjA1NiA3OC4wMTZjMC0zMS4yMzIgMjQtNTYuOTYgNTQuNDY0LTU5Ljc0NGExOTAuMTEyIDE5MC4xMTIgMCAwIDAgMTEuMDcyIDAgNjAuMDY0IDYwLjA2NCAwIDAgMSA1NC40NjQgNTkuNzQ0YzAgMzMuMDU2LTI2Ljg4IDYwLTYwIDYwcy02MC0yNi45NDQtNjAtNjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMSIgdW5pY29kZT0iJiM1ODk3NjsiIGQ9Ik04MjMuMjMyIDUxMkg3MDRWNjcyYzAgMTcuNi0xNC40IDMyLTMyIDMyaC01NzZjLTE3LjYgMC0zMi0xNC40LTMyLTMydi00NDhjMC0xNy42IDE0LjQtMzIgMzItMzJIMTI4YzAtNzAuNCA1Ny42LTEyOCAxMjgtMTI4czEyOCA1Ny42IDEyOCAxMjhoMjU2YzAtNzAuNCA1Ny42LTEyOCAxMjgtMTI4czEyOCA1Ny42IDEyOCAxMjhoMzJjMTcuNiAwIDMyIDE0LjQgMzIgMzJWMzE0LjQzMmMwIDMuMi0wLjgzMiA2LjQtMi4zNjggOC43NjhsLTEyMC44MzIgMTgxLjU2OEExNS43NDQgMTUuNzQ0IDAgMCAxIDgyMy4yMzIgNTEyek0yNjguOCAxMjkuNmE2NCA2NCAwIDEgMC0yNC43NjggMTI1LjYzMiA2NCA2NCAwIDAgMCA3NS4yLTc1LjJjLTUuNjMyLTI1LjYtMjUuNi00NS42MzItNTAuNDMyLTUwLjQzMnogbTUxMiAwYTY0IDY0IDAgMSAwLTI0Ljc2OCAxMjUuNjMyIDY0IDY0IDAgMCAwIDc1LjEzNi03NS4yYy01LjU2OC0yNS42LTI1LjYtNDUuNjMyLTUwLjM2OC01MC40MzJ6TTcwNCAzMjBWNDQ4aDk1LjIzMmM1LjU2OCAwIDEwLjM2OC0yLjM2OCAxMi44LTcuMjMyTDg5NiAzMjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMiIgdW5pY29kZT0iJiM1ODk3NzsiIGQ9Ik05MjggNTEyYTMyIDMyIDAgMCAwLTE0LjA4IDMuMkw1NDQgNzA0IDE3NC4wOCA1MTYuNDhBMzIuODk2IDMyLjg5NiAwIDAgMCAxNDUuOTIgNTc2TDU0NCA3NzMuMTIgOTQyLjA4IDU3NmEzMi43NjggMzIuNzY4IDAgMCAwLTE0LjA4LTY0ek0zODQgMTkySDE5MnYtMTkyaDE5MnogbTI1NiAwSDQ0OHYtMTkyaDE5MnogbTI1NiAwaC0xOTJ2LTE5MmgxOTJ6IG0tMTI4IDI1Nkg1NzZ2LTE5MmgxOTJ6TTUxMiA0NDhIMzIwdi0xOTJoMTkyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTMiIHVuaWNvZGU9IiYjNTg5Nzg7IiBkPSJNNjk2LjMyIDM2MC40NDhjMC0yNi42MjQtNC45MjgtNTEuNTItMTQuODQ4LTc0Ljc1MnMtMjMuNTUyLTQzLjUyLTQwLjk2LTYwLjkyOC0zNy43Ni0zMS4wNC02MC45MjgtNDAuOTYtNDguMTI4LTE0Ljg0OC03NC43NTItMTQuODQ4LTUxLjUyIDQuOTI4LTc0Ljc1MiAxNC44NDgtNDMuNTIgMjMuNTUyLTYwLjkyOCA0MC45Ni0zMS4wNCAzNy43Ni00MC45NiA2MC45MjgtMTQuODQ4IDQ4LjEyOC0xNC44NDggNzQuNzUyIDQuOTI4IDUxLjUyIDE0Ljg0OCA3NC43NTIgMjMuNTUyIDQzLjUyIDQwLjk2IDYwLjkyOCAzNy43NiAzMS4wNCA2MC45MjggNDAuOTYgNDguMTI4IDE0Ljg0OCA3NC43NTIgMTQuODQ4IDUxLjUyLTQuOTI4IDc0Ljc1Mi0xNC44NDggNDMuNTItMjMuNTUyIDYwLjkyOC00MC45NiAzMS4wNC0zNy43NiA0MC45Ni02MC45MjggMTQuODQ4LTQ4LjEyOCAxNC44NDgtNzQuNzUyeiBtNjQuNTEyLTM3Ny44NTZjMC03LjQ4OC0zLjA3Mi0xNC4zMzYtOS4yMTYtMjAuNDhzLTE0LjAxNi0xMS40NTYtMjMuNTUyLTE1Ljg3Mi0yMC44LTgtMzMuNzkyLTEwLjc1Mi0yNS45Mi00LjA5Ni0zOC45MTItNC4wOTZIMzQ3LjEzNmMtMTEuNTg0IDAtMjMuMjMyIDEuMzQ0LTM0LjgxNiA0LjA5NnMtMjIuMDE2IDYuMzM2LTMxLjIzMiAxMC43NTItMTYuNzA0IDkuNzI4LTIyLjUyOCAxNS44NzItOC43MDQgMTIuOTkyLTguNzA0IDIwLjQ4eiBtOS4yMTYgODY1LjI4YzI5LjM3NiAwIDUwLjY4OC04LjUxMiA2NC0yNS42czE5Ljk2OC0zNy41NjggMTkuOTY4LTYxLjQ0di02NTcuNDA4YzAtMjMuODcyLTguNTEyLTQ0LjM1Mi0yNS42LTYxLjQ0cy0zOC41OTItMjUuNi02NC41MTItMjUuNkgyNDUuNzZjLTI2LjYyNCAwLTQ4LjEyOCA4LjUxMi02NC41MTIgMjUuNnMtMjQuNTc2IDM3LjU2OC0yNC41NzYgNjEuNDRWNzYwLjgzMmMwIDIzLjg3MiA3LjQ4OCA0NC4xNiAyMi41MjggNjAuOTI4czM1LjUyIDI1LjA4OCA2MS40NCAyNS4wODh6TTIyNS4yOCA3MjguMDY0YzAtNy40ODggMi41Ni0xNC41MjggNy42OC0yMC45OTJzMTMuNDQtOS43MjggMjUuMDg4LTkuNzI4aDc3LjgyNGMxMS41ODQgMCAyMC4xNiAzLjkwNCAyNS42IDExLjc3NnM4LjE5MiAxNS41NTIgOC4xOTIgMjMuMDR2MTUuMzZjMCA3LjQ4OC0zLjA3MiAxNC4zMzYtOS4yMTYgMjAuNDhzLTE0LjcyIDkuMjE2LTI1LjYgOS4yMTZIMjYwLjA5NmMtMTEuNTg0IDAtMjAuMjg4LTMuMi0yNi4xMTItOS43MjhzLTguNzA0LTEzLjQ0LTguNzA0LTIwLjk5MnogbTI3OS41NTItNjIzLjYxNmMzNS41MiAwIDY4LjggNi42NTYgOTkuODQgMTkuOTY4czU4LjI0IDMxLjU1MiA4MS40MDggNTQuNzg0IDQxLjQ3MiA1MC4zNjggNTQuNzg0IDgxLjQwOGEyNTAuNzUyIDI1MC43NTIgMCAwIDEgMTkuOTY4IDk5Ljg0YzAgMzQuODE2LTYuNjU2IDY3Ljc3Ni0xOS45NjggOTguODE2cy0zMS41NTIgNTguMjQtNTQuNzg0IDgxLjQwOC01MC4zNjggNDEuNDcyLTgxLjQwOCA1NC43ODQtNjQuMzIgMTkuOTY4LTk5Ljg0IDE5Ljk2OGMtMzQuODE2IDAtNjcuNzc2LTYuNjU2LTk4LjgxNi0xOS45NjhzLTU4LjI0LTMxLjU1Mi04MS40MDgtNTQuNzg0LTQxLjQ3Mi01MC4zNjgtNTQuNzg0LTgxLjQwOC0xOS45NjgtNjQtMTkuOTY4LTk4LjgxNmMwLTM1LjUyIDYuNjU2LTY4LjggMTkuOTY4LTk5Ljg0IDEzLjMxMi0zMS4wNCAzMS41NTItNTguMjQgNTQuNzg0LTgxLjQwOHM1MC4zNjgtNDEuNDcyIDgxLjQwOC01NC43ODQgNjQtMTkuOTY4IDk4LjgxNi0xOS45Njh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNCIgdW5pY29kZT0iJiM1ODk3OTsiIGQ9Ik02NzcuNzYgMTg0Ljc2OGExOC43NTIgMTguNzUyIDAgMCAwLTUuMTg0IDEyLjU0NGMwIDkuNDcyIDcuNjggMTcuMjE2IDE3LjA4OCAxNy4zNDRoMTAwLjQxNmM5LjYgMCAxNy4zNDQgNy44MDggMTcuMzQ0IDE3LjQwOGExNy45ODQgMTcuOTg0IDAgMCAxLTUuNTA0IDEyLjQ4TDY1Mi44IDM5NC40OTZhMjAuOTI4IDIwLjkyOCAwIDAgMC00LjI4OCAxMS44NCAxNy40MDggMTcuNDA4IDAgMCAwIDE3LjI4IDE3LjI4aDc5LjM2YzkuNiAwLjEyOCAxNy4zNDQgNy45MzYgMTcuMzQ0IDE3LjUzNmExNy4yOCAxNy4yOCAwIDAgMS01LjMxMiAxMi40MTZMNjA4LjU3NiA2MDIuNDMybC0wLjk2IDAuOTZhMTcuNDA4IDE3LjQwOCAwIDAgMCAxMi42MDggMjkuMjQ4aDYwLjE2YzkuNiAwIDE3LjI4IDcuODA4IDE3LjI4IDE3LjQ3MmExNy4xNTIgMTcuMTUyIDAgMCAxLTQuNjcyIDExLjM5MmgwLjM4NEw1NTcuNzYgODI1LjA4OEExNy4yOCAxNy4yOCAwIDAgMSA1NDMuODcyIDgzMmExNy4yOCAxNy4yOCAwIDAgMS0xMy44ODgtNi45MTJMMzk0Ljg4IDY2MS41MDRhMTcuMTUyIDE3LjE1MiAwIDAgMS00LjczNi0xMS4zOTJjMC05LjYgNy43NDQtMTcuNDA4IDE3LjM0NC0xNy40MDhoNjAuMTZhMTYuODMyIDE2LjgzMiAwIDAgMCAxMi44LTI5LjI0OGwtMS4wMjQtMS4wMjQtMTQ4LjQ4LTE0OC44NjRhMTcuMjggMTcuMjggMCAwIDEtNS4zNzYtMTIuNDE2YzAtOS41MzYgNy42MTYtMTcuMjggMTcuMDg4LTE3LjQ3Mmg3OS40ODhhMTcuMjggMTcuMjggMCAwIDAgMTcuMzQ0LTE3LjM0NCAyMC45MjggMjAuOTI4IDAgMCAwLTQuMzUyLTExLjg0TDI4NS44MjQgMjQ0LjQ4YTE3Ljk4NCAxNy45ODQgMCAwIDEtNS42OTYtMTIuNDhjMC05LjYgNy44MDgtMTcuNDA4IDE3LjM0NC0xNy40MDhoMTAwLjY3MmExNy40MDggMTcuNDA4IDAgMCAwIDE3LjIxNi0xNy4yOCAxOC43NTIgMTguNzUyIDAgMCAwLTUuMTItMTIuNjA4bC0xNDguNTQ0LTE0OC40OC0wLjY0LTAuNjRhMTcuMjggMTcuMjggMCAwIDEgMC0yNC40NDggMTcuNzI4IDE3LjcyOCAwIDAgMSAxMi40OC01LjUwNGgyMzUuNjQ4Vi02NGw2OS4zNzYgMC41NzZ2NjkuMTJoMjM1LjM5MmExOC4zMDQgMTguMzA0IDAgMCAxIDE4LjA0OCAxNy42NjQgMTcuMjggMTcuMjggMCAwIDEtNC45MjggMTIuMzUyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTUiIHVuaWNvZGU9IiYjNTg5ODA7IiBkPSJNMjk0LjE0NCAzMjcuMTA0bDEuMzQ0LTEuNjY0IDE1NC41Ni0xNjQuOTI4YzMzLjkyLTM5LjkzNiA5MC42ODgtMzkuOTM2IDEyNS4xMiAwLjUxMmwxNTMuNiAxNjQuODY0IDMuNzc2IDQuMDMyIDIuMjQgMi40MzJBMTQ2LjY4OCAxNDYuNjg4IDAgMCAxIDc2OCA0MjcuNTg0YTE0OC40OCAxNDguNDggMCAwIDEtMjU2IDEwMi4yNzIgMTQ4LjQ4IDE0OC40OCAwIDAgMS0yNTYtMTAyLjI3MmMwLTM3LjEyIDE0LjA4LTczLjQwOCAzOC4xNDQtMTAwLjQ4ek01MTItMzJhNDE2IDQxNiAwIDEgMCAwIDgzMiA0MTYgNDE2IDAgMCAwIDAtODMyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTYiIHVuaWNvZGU9IiYjNTg5ODE7IiBkPSJNNjA4IDMyMGEyMi40IDIyLjQgMCAwIDAgMC00NC44SDUzNC40di0xOS4yYTIyLjQgMjIuNCAwIDEgMC00NC44IDB2MTkuMkg0MTZhMjIuNCAyMi40IDAgMSAwIDAgNDQuOGg3My42djUxLjJINDE2YTIyLjQgMjIuNCAwIDAgMCAwIDQ0LjhoNjQuMzg0bC0wLjI1NiAwLjE5Mi02NCA2NGEyMi40IDIyLjQgMCAwIDAgMzEuNzQ0IDMxLjY4bDY0LTY0TDUxMiA0NDcuNjE2bDAuMTkyIDAuMjU2IDY0IDY0YTIyLjQgMjIuNCAwIDEgMCAzMS42MTYtMzEuNjhsLTY0LTY0LTAuMTkyLTAuMTkySDYwOGEyMi40IDIyLjQgMCAwIDAgMC00NC44SDUzNC40VjMyMHogbTI1NiAxNjBoMzJWNjQwLjE5MkE2NCA2NCAwIDAgMSA4MzEuOTM2IDcwNEgxOTIuMDY0QTY0IDY0IDAgMCAxIDEyOCA2NDAuMTkyVjQ4MGgzMkMyMTIuOTI4IDQ4MCAyNTYgNDM2LjkyOCAyNTYgMzg0cy00My4wNzItOTYtOTYtOTZIMTI4di0xNjAuMTkyQTY0IDY0IDAgMCAxIDE5Mi4wNjQgNjRoNjM5Ljg3MkE2NCA2NCAwIDAgMSA4OTYgMTI3LjgwOFYyODhoLTMyYy01Mi45MjggMC05NiA0My4wNzItOTYgOTZzNDMuMDcyIDk2IDk2IDk2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTciIHVuaWNvZGU9IiYjNTg5ODI7IiBkPSJNMTY0Ljk5MiAyODcuMzZjLTIzLjY4LTQyLjgxNi02Ny4xMzYtMTIwLjgzMiA5LjY2NC0xNzIuOTkyIDI0LjEyOC0xNi4xOTIgNTEuMi0yNy40NTYgNzkuNTUyLTMzLjAyNCAyMS42MzItMy4yIDIyLjcyLTM3LjEyLTIuNjg4LTM2LjI4OC0yNy4wNzIgMS40MDgtMTU4LjkxMiAxMy44MjQtMTgwLjA5NiAxMTQuNDMyLTEwLjk0NCA1OC43NTIgMS40MDggMTExLjM2IDM1LjQ1NiAxNjguNTEybDQ5LjAyNCA4OC4xMjhMNjQgNDY5LjMxMmwyNDQuOCAxNDcuOTY4di0yODYuMDhMMjE2Ljk2IDM4MC44eiBtMjk4LjU2IDQ3MC41MjhjODEuMjE2IDQ0LjkyOCAxMjguMTkyLTMwLjcyIDE1NC4wNDgtNzJsNTYuNzA0LTkwLjM2OC04OS4wMjQtNTcuNzkyIDI1MS4wMDgtMTM0LjAxNi0xMy44MjQgMjg4LTg4Ljk2LTU3LjcyOC01My40NCA4NC45OTJjLTM2LjY3MiA1My4zNzYtNjMuNTUyIDkyLjgtMTI5LjAyNCAxMTAuNTI4LTExNS4yIDIyLjQtMTg1LjkyLTExMy40NzItMTg1LjIxNi0xMTIuNTc2LTExLjUyLTIwLjQ4IDE1LjE2OC0zOC41OTIgMzEuNzQ0LTE1LjA0YTIyMS4xODQgMjIxLjE4NCAwIDAgMCA2NS45MiA1NnogbTQ2My43NDQtNDQyLjQ5NmMtNi4xNDQgMTMuNTY4LTM4LjU5MiAxMC4xMTItMjkuNDQtMTkuMTM2IDkuMjE2LTI3Ljg0IDEyLjkyOC01Ny4yMTYgMTEuMDA4LTg2LjUyOC02LjUyOC05My44MjQtOTQuNzg0LTkzLjEyLTE0Mi45MTItOTMuMTJINjYwLjQ4djEwNy4yNjRsLTI0Ni4yMDgtMTQzLjA0TDY1OS41ODQtNjRsMC4zODQgMTA5LjA1NmgxMDUuOTg0YzYyLjY1Ni0xLjA4OCAxMTIuNTEyIDEyLjYwOCAxNTQuNzUyIDUxLjAwOCA4NC40MTYgNzUuOTA0IDYuNTkyIDIxOS4zMjggNi41OTIgMjE5LjMyOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS04IiB1bmljb2RlPSImIzU4OTgzOyIgZD0iTTQ5MC4xNzYgNjM0LjI0YzEwLjMwNCAwIDE5LjMyOC0zLjcxMiAyNy4xMzYtMTEuMDA4czExLjU4NC0xNi4zODQgMTEuNTg0LTI3LjA3MmMwLTEwLjY4OC0zLjg0LTE5LjcxMi0xMS41ODQtMjcuMDcycy0xNi44MzItMTAuOTQ0LTI3LjEzNi0xMC45NDRhMzcuODI0IDM3LjgyNCAwIDAgMC0zOC43ODQgMzguMDE2YzAgMTAuNjg4IDMuNzEyIDE5LjcxMiAxMS4yIDI3LjA3MnMxNi42NCAxMC45NDQgMjcuNTIgMTAuOTQ0ek0xOTIgMzg0YzAgMjkuMzEyIDEuOTg0IDU3LjYgNi4wMTYgODQuOTI4IDQuMDMyIDI3LjMyOCAxMC4wNDggNTMuNjk2IDE4LjExMiA3OS4wNGw2NDcuMTA0LTM1My4yOGE0NzguNDY0IDQ3OC40NjQgMCAwIDAtNTQuMjcyLTEwNC44MzIgNDAxLjYgNDAxLjYgMCAwIDAtNzQuMTEyLTgxLjZjLTI3LjUyLTIyLjc4NC01Ny42LTQwLjU3Ni05MC4wNDgtNTMuMjQ4QTI3NS44NCAyNzUuODQgMCAwIDAgNTQzLjU1Mi02NGMtNDguMjU2IDAtOTMuNzYgMTEuNzEyLTEzNi41NzYgMzUuMDcycy04MC4xMjggNTUuMzYtMTEyIDk2LTU2Ljk2IDg4LTc1LjM5MiAxNDIuNEE1NDEuNTA0IDU0MS41MDQgMCAwIDAgMTkyIDM4NHogbTY3Mi45NiAxODMuNDI0YzkuNzkyLTI4LjE2IDE3LjQwOC01Ny42IDIyLjg0OC04OC4zMlM4OTYgNDE2LjY0IDg5NiAzODRjMC01MC42ODgtNi41OTItOTkuNDU2LTE5Ljg0LTE0Ni4yNEw2MDQuOCAzODYuNTZ6TTU2NC4yMjQgNDA4LjUxMkwyMzEuNjggNTkwLjI3MmMxNC40IDM2LjAzMiAzMi40NDggNjguODY0IDU0LjMzNiA5OC40MzJzNDYuMDggNTQuOTc2IDcyLjc2OCA3Ni4wOTYgNTUuNjggMzcuNjMyIDg3LjA0IDQ5LjQ3MkM0NzcuMTIgODI2LjExMiA1MDkuNjk2IDgzMiA1NDMuNTUyIDgzMmMzMi43NjggMCA2NC4wNjQtNS4zNzYgOTMuOTUyLTE2YTMyMi41NiAzMjIuNTYgMCAwIDAgODQuMDMyLTQ1LjMxMmMyNi4xMTItMTkuMzkyIDQ5Ljc5Mi00Mi44MTYgNzEuMDQtNzAuMTQ0IDIxLjI0OC0yNy4zMjggMzkuNjgtNTcuNiA1NS4xNjgtOTAuODhMNTYyLjQ5NiA0MTEuMDcyeiBtLTExLjIgNTcuNDcyTDczNi42NCA1ODYuODhhMjM3LjQ0IDIzNy40NCAwIDAgMS0zOC43ODQgNzEuMDQgMTc3LjQwOCAxNzcuNDA4IDAgMCAxLTI0Ljk2IDI2LjE3NiAxODkuNTY4IDE4OS41NjggMCAwIDEtMzMuMjE2IDIyLjc4NCAxNzkuNTIgMTc5LjUyIDAgMCAxLTQxLjM0NCAxNi4wNjQgMjAwLjgzMiAyMDAuODMyIDAgMCAxLTUwLjM2OCA1Ljk1MmMtMTcuMjggMC0zMy4wODgtMi4xMTItNDcuMzYtNi40YTE5MS4xMDQgMTkxLjEwNCAwIDAgMS03Mi44OTYtMzkuNjggMjk5LjU4NCAyOTkuNTg0IDAgMCAxLTI3LjEzNi0yNi42MjQgMjg3LjQ4OCAyODcuNDg4IDAgMCAxLTQ2LjUyOC03MS44NzJ6IG00NC44IDE2OC4xOTJhMzcuODI0IDM3LjgyNCAwIDAgMCAzOC43ODQtMzguMDE2IDM3LjgyNCAzNy44MjQgMCAwIDAtMzguNzg0LTM4LjAxNiAzNy44MjQgMzcuODI0IDAgMCAwLTM4LjcyIDM4LjAxNmMwIDEwLjY4OCAzLjcxMiAxOS43MTIgMTEuMiAyNy4wNzJzMTYuNjQgMTAuOTQ0IDI3LjUyIDEwLjk0NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS05IiB1bmljb2RlPSImIzU4OTg0OyIgZD0iTTYzMS44MDggNjIzLjYxNmMwLTM1LjUyLTYuMzM2LTY4LjkyOC0xOC45NDQtMTAwLjM1MnMtMjkuNTA0LTU4Ljg4LTUwLjY4OC04Mi40MzItNDUuNTY4LTQyLjE3Ni03My4yMTYtNTUuODA4LTU2LjgzMi0yMC40OC04Ny41NTItMjAuNDhTMzQxLjMxMiAzNzEuMDA4IDMxMy4zNDQgMzg0cy01Mi41NDQgMzEuMjMyLTczLjcyOCA1NC43ODQtMzguMDggNTEuNTItNTAuNjg4IDgzLjk2OC0xOC45NDQgNjguMDk2LTE4Ljk0NCAxMDcuMDA4YzAgMzAuNzIgNi4xNDQgNTkuOTA0IDE4LjQzMiA4Ny41NTJBMjQ1Ljc2IDI0NS43NiAwIDAgMCAzMTAuMjcyIDg0MS4yMTZjMjcuMzI4IDEyLjYwOCA1Ni4zMiAxOC45NDQgODcuMDQgMTguOTQ0czYwLjA5Ni02LjY1NiA4OC4wNjQtMTkuOTY4IDUyLjkyOC0zMC45MTIgNzQuNzUyLTUyLjczNiAzOS4yMzItNDYuOTEyIDUyLjIyNC03NS4yNjQgMTkuNDU2LTU3Ljg1NiAxOS40NTYtODguNTc2eiBtLTI3MS4zNi0zMzAuNzUybC0xLjAyNC0zNjMuNTIgMzYuODY0IDQ4LjEyOCAzOC45MTItNDguMTI4djM2My41MnpNNjA0LjE2IDgxMS4wMDhjMTQuMzM2LTE3LjA4OCAyNy4zMjgtMzUuNTIgMzguOTEyLTU1LjI5NiA5LjYtMTcuMDg4IDE4LjQzMi0zNi40OCAyNi42MjQtNTguMzY4czEyLjI4OC00NC43MzYgMTIuMjg4LTY4LjYwOGMtMS4zNDQtNDEuNi01Ljk1Mi03Ni40OC0xMy44MjQtMTA0LjQ0OHMtMTYuNTc2LTUwLjU2LTI2LjExMi02Ny41ODRjLTExLjU4NC0xOS44NC0yNC4yNTYtMzUuNTItMzcuODg4LTQ3LjEwNCAxOS44NCAyLjA0OCAzOS42MTYgNS4xMiA1OS4zOTIgOS4yMTYgMTcuMDg4IDMuMzkyIDM1LjUyIDcuODcyIDU1LjI5NiAxMy4zMTJzMzguNTkyIDEyLjk5MiA1Ni4zMiAyMi41MjhjMTUuNjggOC4xOTIgMzAuNTI4IDE4Ljk0NCA0NC41NDQgMzIuMjU2czI1LjkyIDI5LjE4NCAzNS44NCA0Ny42MTYgMTYuODk2IDM5LjA0IDIwLjk5MiA2MS45NTIgNC4wOTYgNDguMzIgMCA3Ni4yODhjLTQuMDk2IDI4LjY3Mi0xNiA1NC4yNzItMzUuODQgNzYuOHMtNDMuMzI4IDQwLjQ0OC03MC42NTYgNTMuNzYtNTUuODA4IDIxLjEyLTg1LjUwNCAyMy41NTItNTYuNTEyLTIuODgtODAuMzg0LTE1Ljg3MnogbTEuMDI0LTQ1OC43NTJMNjA0LjE2IDUuMTJsMzUuODQgNDcuMTA0IDM4LjkxMi00Ny4xMDRWMzUyLjI1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xMCIgdW5pY29kZT0iJiM1ODk4NTsiIGQ9Ik0yNTYuNTEyIDgzMmwtNjQtMzUyYy05LjM0NC01MS41MiAxMTMuOTg0LTc1LjU4NCAxMTItMTI4bC0xNi00MTZjLTIuNDMyLTY0IDY0LTY0IDY0LTY0czY2LjQzMiAwIDY0IDY0bC0xNiA0MTZjLTEuOTg0IDUyLjM1MiAxMTAuOTEyIDc1LjUyIDExMiAxMjhsLTY0IDM1MmgtMzJsMTYtMjU2LTQ4LTMyLTE2IDI4OGgtMzJsLTE2LTI4OC00OCAzMiAxNiAyNTZ6IG01NDQgMGMtNDcuMTA0IDAtMTI1LjY5Ni00MS45Mi0xNTcuMTItMTA0Ljc2OC0yNi4yNC00Ny4xMDQtMzQuODgtMTUyLjM4NC0zNC44OC0yMTUuMjMydi0xNjBjMC01Mi4zNTIgNjkuNzYtNjQgOTYtNjRsLTMyLTM1MmMtNS43Ni02My43NDQgNjQtNjQgNjQtNjRzNjQgMCA2NCA2NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xMSIgdW5pY29kZT0iJiM1ODk4NjsiIGQ9Ik01MTMuNjY0IDUyNS4zMTJhMTE3LjEyIDExNy4xMiAwIDAgMCAxMTYuOTI4IDExNi45OTJjNjQuNTEyIDAgMTE2LjkyOC01Mi40OCAxMTYuOTI4LTExNi45OTJTNjk1LjA0IDQwOC4zMiA2MzAuNTkyIDQwOC4zMmExMTcuMTIgMTE3LjEyIDAgMCAwLTExNi45MjggMTE2Ljk5Mm0zNzcuNiAxNzEuNzEyYzAgMzYuOC0yOS44MjQgNjYuNjg4LTY1LjM0NCA2Ni42ODhoLTAuMDY0QzgyNC43MDQgNzYzLjcxMiA3MDkuMjQ4IDc2OCA2MjIuMDggNzY4Yy0xMDAuNDE2IDAtMTA5LjQ0LTQuODY0LTEyMC4zMi0xNS43NDRMMzQ2LjY4OCA1OTYuOTI4IDE0Ny41MiAzOTcuNjk2YTY3LjA3MiA2Ny4wNzIgMCAwIDEgMC4xMjgtOTQuNzJsMjgzLjItMjgzLjMyOGMxMi42NzItMTIuNjcyIDI5LjQ0LTE5LjY0OCA0Ny40MjQtMTkuNjQ4IDE3LjkyIDAgMzQuNjg4IDYuOTEyIDQ3LjE2OCAxOS40NTZsMjIxLjU2OCAyMjEuNjk2IDEzMi44IDEzMi45MjhjMTEuNzEyIDExLjY0OCAyMi43MiAyMi43MiAxMS41MiAzMjIuOTQ0IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTIiIHVuaWNvZGU9IiYjNTg5ODc7IiBkPSJNODM5LjkzNiA1MDYuNjg4YzAgMTc5Ljg0LTE0Ny4wMDggMzI1Ljc2LTMyOC41NzYgMzI1Ljc2LTE4MS40NCAwLTMyOC41MTItMTQ1LjkyLTMyOC41MTItMzI1Ljc2IDAtNTkuNTIgMTYuMjU2LTExNS4wMDggNDQuMjg4LTE2Mi45NDRoLTAuMzg0bDI4NC42MDgtNDA3LjM2IDI4NC42NzIgNDA3LjM2aC0wLjM4NGMyOC4xNiA0OCA0NC4yODggMTAzLjQ4OCA0NC4yODggMTYyLjk0NE01MTEuNDI0IDM0My44MDhhMTYzLjU4NCAxNjMuNTg0IDAgMCAwLTE2NC4yODggMTYyLjg4IDE2My42NDggMTYzLjY0OCAwIDAgMCAxNjQuMjg4IDE2Mi45NDQgMTYzLjU4NCAxNjMuNTg0IDAgMCAwIDE2NC4yODgtMTYyLjk0NEExNjMuNTIgMTYzLjUyIDAgMCAwIDUxMS4zNiAzNDMuODA4IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTMiIHVuaWNvZGU9IiYjNTg5ODg7IiBkPSJNOTQwLjggNDgwVjEyOGE2NCA2NCAwIDAgMC02NC02NGgtNzA0YTY0IDY0IDAgMCAwLTY0IDY0VjQ4MGEzMiAzMiAwIDAgMCAzMiAzMiAzMS4zNiAzMS4zNiAwIDAgMCAxMy40NCAwbDM3MC41Ni0yNTZMODk2IDUxMmEzMS4yMzIgMzEuMjMyIDAgMCAwIDEyLjggMCAzMiAzMiAwIDAgMCAzMi0zMnpNMTI0LjggNjQ1LjEybDUuMTItNS4xMkw1MjQuOCAzODRsMzk2LjE2IDI1NmgzLjg0YTMxLjM2IDMxLjM2IDAgMCAxIDE2IDMyIDMyIDMyIDAgMCAxLTMyIDMyaC03NjhhMzIgMzIgMCAwIDEtMzItMzIgMzEuMzYgMzEuMzYgMCAwIDEgMTYtMjYuODh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTQiIHVuaWNvZGU9IiYjNTg5ODk7IiBkPSJNMTg4LjE2IDQxMi4yMjRjMTAuNjI0IDIuNzUyIDc4LjIwOCAzMiA4OC44OTYgMzQuNzUyLTI4LjQ4IDMxLjY4LTQ5LjYgNzMuMTUyLTc2LjA5NiAxMzMuNzYtMzUuMDcyLTguNzY4LTk1LjkzNi0yNi44OC05NS45MzYtMjYuODhTMTgzLjgwOCA0MjAuNDggMTg4LjE2IDQxMi4xNnogbTM5MS4wNC0xMTMuNTM2bDcyLjQ0OC04MS45MmMxMjQuMTYgNDEuODU2IDI4OS40NzIgMjA3LjM2IDI4OS40NzIgMjA3LjM2TDg1OC4wNDggNTA4LjhTNzc3LjAyNCAzODMuMzYgNTc5LjIgMjk4LjY4OHpNNDI5LjgyNCA0NjAuMjI0bDY3LjAwOC0zNS4yYzYyLjkxMiA2Mi44NDggMTE1LjIgMTYyLjMwNCAxMTUuMiAxNjIuMzA0bC0xMDQuNTEyIDM5LjA0cy00MC45Ni0xMTMuMTUyLTc3LjY5Ni0xNjYuMTQ0eiBtMjMxLjU1Mi0zMC4zMzZjMTA0Ljk2IDUxLjg0IDI0Ni43ODQgMjI4LjczNiAyNDYuNzg0IDIyOC43MzZMODI2LjE3NiA3MzZzLTExOC42NTYtMTc0LjkxMi0yMzEuMTY4LTIzMy42NjR6IG0tNDkuNDA4LTI1Ny40NzJMNDIwLjE2IDI3My42NjRINjA4LjY0djExMS4zNkg0MTEuNjQ4djUxLjM5MkgyODMuMTM2di01MS4zOTJINjkuMTJ2LTExMS4zNkgyMzEuNjhjLTQ4LjMyLTY1LjQwOC03Mi44MzItOTIuOTkyLTE2Mi41Ni0xNDguMzUybDY1LjcyOC05Ny4yOGM4MS4yOCA1OS45NjggMTEyLjgzMiA5Ny41MzYgMTQ4LjIyNCAxNDIuODQ4di0xOTYuOTkyaDEyOC41MTJWMTcwLjg4bDE0MC40OC04Mi4wNDh6IG0yNjUuOTg0IDEyMS41MzZzLTg5LjQ3Mi0xNjAtMzU2LjQxNi0yMzMuMjhsMzkuMDQtODYuNzg0YzI2NS40NzIgNjQuNzY4IDM3Ni4zMiAyMDUuNjMyIDM5OS4xNjggMjI4LjE2eiBtLTU2My4yIDE3MS45NjhzODEuMjgtMC41NzYgOTQuNTI4IDBjLTkuMjggNDkuMzQ0LTExLjQ1NiA3MC45MTItMTguODggMTMyLjQ4bC0xMTMuODU2LTE4LjI0YzE1LjY4LTM3LjgyNCAzMC43Mi02NS45ODQgMzguMjcyLTExNC4yNHogbTI4OC44OTYgMjA4LjEyOGwtMzIuNDQ4IDExMy41MzZzLTc4LjE0NC03MC4yNzItNDg0LjM1Mi03OC4wOGw0LjkyOC05My44MjRjNDgyLjExMi05LjcyOCA1MTEuODcyIDU4LjM2OCA1MTEuODcyIDU4LjM2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xNSIgdW5pY29kZT0iJiM1ODk5MDsiIGQ9Ik04MzUuMiA1NTQuNjg4aC01ODIuNGMtNzAuNzIgMC0xMjQuOC01NS40ODgtMTI0LjgtMTI4di0yNTZoMTY2LjRWMGg0OTkuMnYxNzAuNjg4SDk2MHYyNTZjMCA3Mi41MTItNTQuMTQ0IDEyOC0xMjQuOCAxMjh6IG0tMTI0LjgtNDY5LjM3NkgzNzcuNlYyOTguNjI0aDMzMi44ek04MzUuMiAzODRjLTI0Ljk2IDAtNDEuNiAxNy4wODgtNDEuNiA0Mi42ODhzMTYuNjQgNDIuNjI0IDQxLjYgNDIuNjI0IDQxLjYtMTcuMDI0IDQxLjYtNDIuNjI0LTE2LjY0LTQyLjY4OC00MS42LTQyLjY4OHogbS00MS42IDM4NEgyOTQuNHYtMTcwLjY4OGg0OTkuMnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0xNiIgdW5pY29kZT0iJiM1ODk5MTsiIGQ9Ik05MjEuNiA2NTAuNTZsLTI0Ljk2IDIyLjAxNiAyMS4zMTIgMjQuNDQ4YTM1LjU4NCAzNS41ODQgMCAwIDEgMy41ODQgNTAuMzY4bC0zNy43NiA0Mi44OGEzNi4wOTYgMzYuMDk2IDAgMCAxLTUwLjY4OCAzLjJsLTMwMS40NC0yMzMuNkEzMDMuMjMyIDMwMy4yMzIgMCAwIDEgMjAzLjI2NCA1MTJjLTEyNi41OTItMTExLjIzMi0xNDAuMTYtMzAzLjc0NC0zMC4zMzYtNDMwLjA4IDEwOS43Ni0xMjYuMjA4IDMwMS40NC0xMzguNDMyIDQyNy45NjgtMjcuMmEzMDYuODE2IDMwNi44MTYgMCAwIDEgNzQuMTEyIDM2My43NzZsNDguODk2IDU2IDMwLjIwOC0yNi44OGMxMC44MTYtOS42IDI3Ljg0LTcuNjggMzguMDE2IDQuMjI0bDI5LjYzMiAzNC43NTJjMTAuMjQgMTEuOTY4IDkuNzI4IDI5LjUwNC0xLjA4OCAzOS4xNjhsLTI5LjMxMiAyNi4xMTIgMzcuNjMyIDQzLjIgMjcuMDA4LTIzLjY4YzEwLjg4LTkuNiAyNy44NC03LjU1MiAzNy45NTIgNC42MDhsMjkuMTIgMzUuMmMxMC4xMTIgMTIuMTYgOS40MDggMjkuNzYtMS40NzIgMzkuMzZ6IG0tNTExLjQ4OC01MDkuNjk2YTEwNi4xNzYgMTA2LjE3NiAwIDAgMC0xNTAuNTI4IDkuNiAxMDcuNzc2IDEwNy43NzYgMCAwIDAgMTAuNzUyIDE1MS4zNiAxMDYuMTc2IDEwNi4xNzYgMCAwIDAgMTUwLjUyOC05LjYgMTA3Ljc3NiAxMDcuNzc2IDAgMCAwLTEwLjc1Mi0xNTEuMzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTciIHVuaWNvZGU9IiYjNTg5OTI7IiBkPSJNOTYwIDU3NmgtMjU2di0yMjRhMTI4IDEyOCAwIDAgMSA5Ni0xMjMuNTJWMEg3NjhhMzIgMzIgMCAwIDEgMC02NGgxMjhhMzIgMzIgMCAwIDEgMCA2NGgtMzJ2MjI4LjQ4QTEyOCAxMjggMCAwIDEgOTYwIDM1MnYzLjg0eiBtLTY0LTIyNGE2NCA2NCAwIDEgMC0xMjggMFY1MTJoMTI4eiBtLTQ4MCAzMjBWNzA0YTMyIDMyIDAgMCAxIDAgNjR2MzJBMzIgMzIgMCAwIDEgMzg0IDgzMkgzMjBhMzIgMzIgMCAwIDEtMzItMzJWNzY4YTMyIDMyIDAgMCAxIDAtNjR2LTMyQzI4OCA1ODAuNDggMTI4IDQ3NS41MiAxMjggMzg0di0zODRhNjQgNjQgMCAwIDEgNjQtNjRoMzIwYTcwLjQgNzAuNCAwIDAgMSA2NCA2NFYzODRjMCA4Ni40LTE2MCAyMDEuNi0xNjAgMjg4eiBtLTY0LTYwOGExNjAgMTYwIDAgMSAwIDAgMzIwIDE2MCAxNjAgMCAwIDAgMC0zMjB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTgiIHVuaWNvZGU9IiYjNTg5OTM7IiBkPSJNODMyIDQyMS42MzJjMzcuNjMyIDEyLjggNjQgNDguNzY4IDY0IDkwLjM2OCAwIDUuNTY4LTMwLjQgMjQxLjYtMzAuNCAyNDEuNmExNi4zODQgMTYuMzg0IDAgMCAxLTE2IDE0LjRIMTc0LjRjLTggMC0xNS4yMzItNi40LTE2LTE0LjQgMCAwLTMwLjQtMjM2LjgtMzAuNC0yNDEuNiAwLTQxLjYgMjYuMzY4LTc3LjU2OCA2NC05MC40MzJ2LTQwNS41NjhjMC04LjgzMiA3LjE2OC0xNiAxNi0xNmg2MDhhMTYgMTYgMCAwIDEgMTYgMTZ6TTcyMC43NjggNzA0bDIxLjYzMi0xOTJoLTMybC0yMS42MzIgMTkyek01OTIgNzA0bDcuMjMyLTE5MmgtMzJMNTYwIDcwNHogbS0xNjAgMGgzMmwtNy4yMzItMTkyaC0zMnpNMzAzLjE2OCA3MDRoMzJMMzEzLjYgNTEyaC0zMnpNNjA4IDY0aC0xOTJ2MTYwaDE5MnpNNzY4IDM1MkgyNTZWNDIxLjU2OGMxNS4xNjggNS42MzIgMjkuNjMyIDE1LjIzMiA0MCAyNy4yNjRhOTUuNjE2IDk1LjYxNiAwIDAgMSAxNDQgMCA5NS42MTYgOTUuNjE2IDAgMCAxIDE0NCAwIDk1LjYxNiA5NS42MTYgMCAwIDEgMTQ0IDBjMTAuNDMyLTEyLjAzMiAyNC44MzItMjEuNjMyIDQwLTI3LjJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMTkiIHVuaWNvZGU9IiYjNTg5OTQ7IiBkPSJNOTA4LjggODAwcy04OS4wMjQgMi42MjQtMTI0LjU0NC0zMmMtMzQuMTc2LTMzLjI4LTQ4LjI1Ni01OC43NTItNDguMjU2LTEyOEgxNDAuOGw4OS4yMTYtMzA4LjA5NmMwLjE5Mi0wLjUxMiAwLjY0LTAuOTYgMC44MzItMS40MDggMTUuMDQtNDIuMDQ4IDU0LjI3Mi03Mi4zMiAxMDEuMDU2LTc0LjExMmwwLjgzMi0wLjM4NGg0MTZ2LTEyLjhzMC4wNjQtMTkuMi0xMi43MzYtNDQuOC0xOS4yLTM4LjQtNzAuNC0zOC40SDI0OS42Yy02NCAwLTY0LTk2IDAtOTZINjU5LjJjNzYuOCAwIDEzNC40IDQ0LjggMTUzLjYgODkuNnMxOS4yIDgzLjIgMTkuMiA4My4yVjY0MGMwIDMzLjUzNiAxNC42NTYgNjQgNDQuOCA2NGgzNS4yYTQ4IDQ4IDAgMCAxIDAgOTZ6IG0tMjU2LTczNmMtMzguNCAwLTY0LTI1LjYtNjQtNjRzMjUuNi02NCA2NC02NCA2NCAyNS42IDY0IDY0LTI1LjYgNjQtNjQgNjR6IG0tMzIwIDBjLTM4LjQgMC02NC0yNS42LTY0LTY0czI1LjYtNjQgNjQtNjQgNjQgMjUuNiA2NCA2NC0yNS42IDY0LTY0IDY0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTIwIiB1bmljb2RlPSImIzU4OTk1OyIgZD0iTTk1MS41NjYwOCAwLjM4NGwtOTAxLjc2IDAuNDQ4cy05Ny4wODgtNC40OC0yMC4xNiA3MC43ODRhNDczLjc5MiA0NzMuNzkyIDAgMCAwIDcwLjQ2NCAzMS43NDQgMTI3Ljg3MiAxMjcuODcyIDAgMCAwLTEwLjQzMiA1MC42ODhjMCA2NC44OTYgNDcuMjMyIDExNy41MDQgMTA1LjUzNiAxMTcuNTA0czEwNS41MzYtNTIuNjA4IDEwNS41MzYtMTE3LjUwNGMwLTEuNDA4LTAuMTI4LTIuNzUyLTAuMTkyLTQuMDk2IDYuNzg0IDAuODk2IDEzLjY5NiAxLjc5MiAyMC42MDggMi41NlY3NjAuNDQ4QzMyMS4xNjYwOCA4MDAuMzg0IDM0OS44MzgwOCA4MzIgMzg4LjY4NjA4IDgzMmg0MDQuNTQ0YzM4Ljg0OCAwIDY1LjkyLTMxLjYxNiA2NS45Mi03MS42MTZ2LTY0MS45MmM0Ny4yOTYtMTMuNjMyIDg3Ljg3Mi0yOS44ODggMTE5LjY4LTQ4LjE5MiAxMTUuNzEyLTc5LjYxNi0yNy4zMjgtNjkuODg4LTI3LjMyOC02OS44ODh6TTU0Ni43NjYwOCA2NzAuOTEyYTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNjg4IDM1Ljg0SDQ0Mi42MzgwOGEzNC45NDQgMzQuOTQ0IDAgMCAxLTM0LjY4OC0zNS44NHYtOTguNDMyYzAtMTkuOTY4IDIzLjkzNi0zNS44NCA0My4zOTItMzUuODRoNjAuOGEzNC45NDQgMzQuOTQ0IDAgMCAxIDM0LjYyNCAzNS44NFY2NzAuOTEyeiBtMC0yNTkuNTJhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC42ODggMzUuODRINDQyLjYzODA4YTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNjg4LTM1Ljg0VjMxMi45NmMwLTE5LjkwNCAyMy45MzYtMzUuNzc2IDQzLjM5Mi0zNS43NzZoNjAuOGEzNC45NDQgMzQuOTQ0IDAgMCAxIDM0LjYyNCAzNS44NFY0MTEuMzI4eiBtMjI1LjY2NCAyNTkuNTJhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC42ODggMzUuODRoLTY5LjQ0YTM0Ljk0NCAzNC45NDQgMCAwIDEtMzQuNzUyLTM1Ljg0di05OC40MzJjMC0xOS45NjggMjQtMzUuODQgNDMuMzkyLTM1Ljg0aDYwLjhhMzUuMDA4IDM1LjAwOCAwIDAgMSAzNC42ODggMzUuODR6IG0wLTI1OS41MmEzNC45NDQgMzQuOTQ0IDAgMCAxLTM0LjY4OCAzNS44NGgtNjkuNDRhMzQuOTQ0IDM0Ljk0NCAwIDAgMS0zNC43NTItMzUuODRWMzEyLjk2YzAtMTkuOTA0IDI0LTM1Ljc3NiA0My4zOTItMzUuNzc2aDYwLjhhMzUuMDA4IDM1LjAwOCAwIDAgMSAzNC42ODggMzUuODR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjEiIHVuaWNvZGU9IiYjNTg5OTY7IiBkPSJNNTEyIDc2OGMtMjAuNjcyIDAtMjcuNTItMTMuOTUyLTQxLjM0NC0yNy45MDRMNzAuOTEyIDc2LjhDNjQgNjkuNzYgNjQgNTUuODcyIDY0IDQ4Ljg5NmMwLTM0Ljk0NCAyNy41Mi00OC44OTYgNDguMjU2LTQ4Ljg5Nmg3OTkuNDg4YzI3LjUyIDAgNDguMjU2IDEzLjk1MiA0OC4yNTYgNDguODk2IDAgMTMuOTUyIDAgMTMuOTUyLTYuOTEyIDI3LjkwNEw1NjAuMjU2IDc0MC4wOTZDNTQ2LjQzMiA3NTQuMDQ4IDUzMi43MzYgNzY4IDUxMiA3Njh6IG0wLTEwNC43MDRsMjI3LjQ1Ni0zODRoLTU1LjE2OEw1ODAuOTI4IDM4NCA1MTIgMjc5LjI5NiA0NDMuMDcyIDM4NCAzMzkuNzEyIDI3OS4yOTZoLTYyLjA4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTIyIiB1bmljb2RlPSImIzU4OTk3OyIgZD0iTTg0OCA0MzguODQ4TDc5MiAzODRsNTEuNjQ4LTM1My45ODRhMjYuNDk2IDI2LjQ5NiAwIDAgMC0yNi41Ni0zMC4wMTZoLTY0YTI2Ljg4IDI2Ljg4IDAgMCAwLTI0IDE0LjUyOGwtNDEuMzQ0IDgwLjc2OGE5NC41MjggOTQuNTI4IDAgMCAxLTE4LjExMiAyNC41MTJsLTM4LjIwOCAzNy4zNzZhMjIuMTQ0IDIyLjE0NCAwIDAgMS0xNS40ODggNi4yNzJoLTE0OS4xMmEyMi4xNDQgMjIuMTQ0IDAgMCAxLTE1LjQ4OC02LjI3MmwtMzguMjcyLTM3LjM3NmMtNy4yOTYtNy4xNjgtMTMuNDQtMTUuNDI0LTE4LjA0OC0yNC41MTJsLTQxLjM0NC04MC43NjhhMjYuODggMjYuODggMCAwIDAtMjQtMTQuNTI4aC01Mi40OGEyNi4zMDQgMjYuMzA0IDAgMCAwLTI0LjE5MiAzNy41NjhsMjQuOTYgNTEuMzkyYzYuNTkyIDEzLjYzMiAxMC4wNDggMjguNjA4IDEwLjA0OCA0My43NzZWMzg0bDE2OCAxMDkuNjk2LTI0IDIzLjU1Mi0zMi0yMy41NTItMzMuNiAzMi45Ni0xMzQuNC04Ny44MDhMMjg4IDM4NHMtMjIuMTQ0IDE5Ljk2OC01NiA1NC44NDhjMC4xOTIgNDUuNDQtNzUuNDU2IDkwLjI0LTEwMi41MjggMTA0LjgzMmE0MS4yMTYgNDEuMjE2IDAgMCAxLTE5LjUyIDQuODY0aC0yNEEyMS43NiAyMS43NiAwIDAgMCA2NCA1NzAuMTEydjE5LjQ1NmMwIDguNDQ4IDUuMDU2IDE2LjEyOCAxMi45MjggMTkuNTg0bDE5MC43ODQgODQuNTQ0TDMwNC4xMjggNzY4bDQ2LjIwOC02NS40NzJjOS4yMTYtMTMuMDU2IDE1LjkzNi0yNy43MTIgMTkuNjQ4LTQzLjJsMTguODE2LTc3LjgyNEw1NjggNzY4bDU2LTU0Ljg0OC0xOTItMTk1LjkwNCA2Ni41Ni02NS4yMTZhNDYuNDY0IDQ2LjQ2NCAwIDAgMSAzMi41MTItMTMuMTg0aDEzNi4wNjRhNDYuNzIgNDYuNzIgMCAwIDEgMjMuODcyIDYuNTkybDI0Ni41MjggMTQ3LjAwOGExNS40ODggMTUuNDg4IDAgMCAwIDIyLjQ2NC0xMy42MzJ2LTYuNTI4YTU2LjY0IDU2LjY0IDAgMCAwLTE3LjA4OC00MC40NDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjMiIHVuaWNvZGU9IiYjNTg5OTg7IiBkPSJNNjkwLjI0IDc2OGMtNy42OCAwLTI5LjY5Ni0xMC4yNC0yOS42OTYtMTAuMjRMNDMzLjcyOCA2NDAuNTEyYy0zMC4yMDgtMTIuMjg4LTQyLjE3Ni02MS41NjgtMjQtODYuMjA4bDY2LjMwNC05OC4zMDQtMjcxLjEwNC0xNDEuNjk2IDEzNi4zODQtMTA0LjcwNCAxNzAuODggMTA0LjcwNCAxNzAuNjI0LTEwNC43MDQgNjguNDE2IDY5Ljk1Mi0yMDQuOCAyNzkuMjk2TDcyMC45NiA2NjUuNmMzNi4wMzIgMTguNTYgMzAuMjcyIDQ5LjIxNiAzMC4yNzIgNjcuNzc2LTAuMzIgMTQuNjU2LTI0LjY0IDM0LjYyNC02MC45OTIgMzQuNjI0eiBtMTQ2LjE3Ni0yMDkuNDcyYy02Ni4wNDggMC0xMTkuNjE2LTU0LjY1Ni0xMTkuNjE2LTEyMi4xNzYgMC02Ny41MiA1My41NjgtMTIyLjMwNCAxMTkuNjE2LTEyMi4zMDRzMTE5LjQyNCA1NC43ODQgMTE5LjQyNCAxMjIuMzA0YzAgNjcuNTItNTMuNDQgMTIyLjI0LTExOS40MjQgMTIyLjI0ek0xNzAuNjg4IDIwOS40NzJMMCAxMDQuNzA0VjBsMTcwLjY4OCAxMDQuNzA0TDM0MS4zMTIgMGwxNzAuODggMTA0LjcwNEw2ODIuNzUyIDBsMTM2LjM4NCAxMDQuNzA0TDEwMjQgMHYxMDQuNzA0bC0yMDQuOCAxMDQuNzY4LTEzNi4zODQtMTA0Ljc2OC0xNzAuNjg4IDEwNC43NjgtMTcwLjgxNi0xMDQuNzY4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTI0IiB1bmljb2RlPSImIzU4OTk5OyIgZD0iTTcyOC4zMiA2NjguMzUyYTIyMS4yNDggMjIxLjI0OCAwIDAgMS03NC4xMTIgMTEuMzkyIDI3MiAyNzIgMCAwIDEtNjIuNDY0LTguMzJjLTYuMDE2LTEuNjY0LTEyLjE2LTMuMDcyLTE3LjkyLTQuOTI4IDQuMTYgMi4zNjggOC4zODQgNC4yODggMTIuNjA4IDYuMDE2IDMwLjU5MiAxMi45OTIgNjMuMjMyIDE0LjcyIDg4LjMyIDEyLjE2LTI3LjkwNCAxOC44OC03OC4yNzIgMTkuNzc2LTExMC45NzYtMC44OTZsLTAuMTkyIDAuNDQ4YzcuMzYgNC40OCAxNS4yMzIgOC44OTYgMjMuNTUyIDEyLjk5MiAzNi45OTIgMTguMTc2IDgxLjQ3MiAyNi45NDQgMTEyLjM4NCAxNC41OTJhMTI4LjM4NCAxMjguMzg0IDAgMCAxLTQ1Ljk1MiAyMi41OTJjMzMuNiA2LjU5MiA2OC4yMjQgMS45MiA5Ny4xNTItNi4wMTYtMTUuMjk2IDE1LjQyNC0zOC41OTIgMjMuNTUyLTYzLjM2IDI1LjZhMTc0LjA4IDE3NC4wOCAwIDAgMCAxMDAuMDMyLTQuOTI4IDE1NC4yNCAxNTQuMjQgMCAwIDEtNTEuNTIgMzUuOTY4YzQxLjkyIDEuMDI0IDg0LjYwOC0xNS4zNiAxMTYuMjg4LTM1Ljk2OGExOTQuNTYgMTk0LjU2IDAgMCAxLTU5LjY0OCA1MS45NjhjNDcuMjMyLTAuNjQgOTkuNDU2LTIwLjg2NCAxMzAuNTYtNTAuMzY4LTQwLjgzMiA2My44NzItMTEyLjI1NiA4OS41MzYtMTg4LjczNiA3Ni45MjgtNzUuMjY0LTExLjY0OC0xNTcuNDQtNjQuNTc2LTE5OC4xNDQtMTQ0LjU3Ni0xLjUzNi0yLjk0NC0zLjItNi4yNzItNC42NzItOS42YTI3OS45MzYgMjc5LjkzNiAwIDAgMS0zMC43ODQgMzcuNTY4Yy02MC45OTIgNjIuOTc2LTEyNy42OCA3OC41OTItMTc0LjI3MiA2MC41NDQtMzguNC0xMy42OTYtNjguNTQ0LTYxLjUwNC02MC4wOTYtMTE3LjYzMi0yLjg4IDI5Ljc2IDE1LjI5NiA2My4zNiAzNS44NCA3Ny4yNDgtOC44MzItMTcuNTM2LTE0LjMzNi0zOS42OC0xNi40NDgtNTcuMzQ0IDguNzY4IDI1LjI4IDI2LjExMiA1MC4zNjggNDcuNjggNjIuMjA4LTkuMDg4LTEzLjQ0LTE2LjEyOC0zMC4xNDQtMTkuODQtNDQuNTQ0YTgyLjU2IDgyLjU2IDAgMCAwIDUzLjYzMiAzMi44MzIgNzUuNzc2IDc1Ljc3NiAwIDAgMS0zMS4zNi00MC41NzZjMTQuNDY0IDE0LjcyIDM0LjI0IDI4LjggNTcuMDg4IDMzLjkyYTExNi41NDQgMTE2LjU0NCAwIDAgMS0yNC41MTItMzUuMTM2YzE3LjAyNCAyMC40OCA0OS42NjQgMjYuNTYgODMuMDcyIDIyLjQgOC4wNjQtMC45NiAxNi4wNjQtMi4zMDQgMjMuOTM2LTQuMTZ2LTAuNjRjLTI5LjEyIDcuMDQtNjAuOTI4LTUuODI0LTc4LjQ2NC0yNi43NTItMTAzLjQ4OC0zLjY0OC0yMDQuOTI4LTQ3LjE2OC0yNDEuNi0xNDguNzM2IDI0LjE5MiAzNC41NiA2NS45MiA2Ny41MiAxMDUuNzkyIDg2LjAxNmEyMjYuMzY4IDIyNi4zNjggMCAwIDEtMzQuODE2LTY2Ljg4YzIyLjg0OCAyOC45OTIgNTQuMjA4IDU4LjY4OCA4OC43MDQgNzYuMjI0YTE2OS45MiAxNjkuOTIgMCAwIDEtMjguOC01Mi4yODggMjIzLjM2IDIyMy4zNiAwIDAgMCA3OC43MiA0OC42NCAyNjAuNDggMjYwLjQ4IDAgMCAxLTI5LjI0OC0yNC44OTZjLTQ5Ljg1Ni01MC4yNC04Ny44MDgtMTE5LjE2OC0xMDMuNDI0LTIxNC4wOCAyMy4zNiA1NC4yMDggNTYuNTc2IDExMS4yOTYgODYuOTEyIDE0OS45NTItNi45NzYtMjkuNDQtMTAuMTEyLTYyLjUyOC05LjYtODcuODcyIDEzLjQ0IDQyLjI0IDMwLjA4IDg3LjY4IDUyLjczNiAxMjAuNTEyYTI0NS4xMiAyNDUuMTIgMCAwIDEtNS41NjgtNjUuMjE2IDI1NC4wOCAyNTQuMDggMCAwIDAgNDcuMzYgODMuMTM2Yy05LjA4OC0yMC42NzItMTUuMjMyLTQzLjg0LTEzLjI0OC02NS40NzJhNDA4Ljk2IDQwOC45NiAwIDAgMCAyNS41MzYgNjAuMjg4di0wLjEyOGwtMC42NC0xLjY2NCAwLjk2IDAuNzA0YTQzLjY0OCA0My42NDggMCAwIDEgNy42OC0xMy44MjRjMC00LjU0NCAwLTguNzY4IDAuMTkyLTEyLjkyOCAwLjcwNCAzLjMyOCAxLjUzNiA2LjY1NiAyLjQ5NiA5Ljk4NCA2LjY1Ni02Ljc4NCAxNS4zNi0xMS41MiAyNS4xNTItMTMuMDU2LTQ5LjAyNC0xMDguNjA4LTg3LjM2LTIzOC4wOC04OS4yOC0zNjMuMi0xMjEuNDA4LTE4LjQzMi0yMDYuNDY0LTk2LjA2NC0yMDYuNDY0LTEyMS45ODQgMC0yNC45NiAxMDAuNDgtNjEuMjQ4IDI1Ny45Mi02MS4yNDggMTU3LjU2OCAwIDI1OC4wNDggMzYuMjI0IDI1OC4wNDggNjEuMjQ4IDAgMjguOTI4LTEwNi40MzIgMTIyLjU2LTI1MC44OCAxMjUuNzYgMy4wNzIgOTIuNjA4IDI4LjI4OCAyMDAuMzg0IDcwLjIwOCAzMDMuMDRBNDUuMjQ4IDQ1LjI0OCAwIDAgMSA1NTguMDggNTI1LjQ0YzAgMS43MjgtMC4xMjggMy41ODQtMC4zMiA1LjU2OGE0NS4yNDggNDUuMjQ4IDAgMCAxIDYyLjk3NiA0MS40NzJjMCAyLjM2OC0wLjMyIDQuODY0LTAuNTc2IDcuNDI0IDcuMDQtMTUuMDQgMTAuOTQ0LTMwLjQgMTIuNjA4LTQzLjcxMiAxMC4yNCAyNy4wMDggMC41MTIgNjkuNzYtMjYuMDQ4IDkyLjE2YTIwLjA5NiAyMC4wOTYgMCAwIDEgMS40NzItMC43MDRjNS41MDQtNC43MzYgMTAuNjg4LTkuOTg0IDE1Ljg3Mi0xNS40ODggMjQuNzY4LTI2Ljg4IDQwLjcwNC02My4xMDQgMzYuMDMyLTkxLjI2NGExMDguOCAxMDguOCAwIDAgMSAxMC4yNCA0My4wMDhjMTIuMTYtMjcuMiAxNC40LTU3LjE1MiAxMi4xNi04Mi44OCAxMC43NTIgMTUuMzYgMTMuNjk2IDM2LjQ4IDEwLjc1MiA1Ny43OTIgMTMuMzEyLTI2LjgxNiAxNy40NzItNTguMTc2IDExLjk2OC04NS4xMiA5LjkyIDEyLjM1MiAxOS4wMDggMzAuMjcyIDIzLjA0IDQ5LjE1MiA3LjY4LTM1Ljg0LTAuNzY4LTc0LjYyNC0xNi0xMDIuNTI4IDE0LjI3MiAxMy4wNTYgMjkuODg4IDMzLjYgMzcuODI0IDU2LjEyOCA2LjA4LTQwLjUxMi04LTg4LjA2NC0zNS43MTItMTA5LjMxMiA1Ny45MiAyOS4xMiA3My43OTIgOTkuMDA4IDQ5LjkyIDE2My4wMDgtOS40MDggMjYuMzA0LTI1LjUzNiA1Mi40OC00Ni43MiA3NS4xMzZhMTM2LjMyIDEzNi4zMiAwIDAgMS04LjI1NiAyOC41NDRjMjYuNTYtMjMuNzQ0IDQzLjg0LTU0LjcyIDU0LjQtODMuOTY4IDMuODQgMjIuMDgtMy4zMjggNDYuNDY0LTE3LjIxNiA2OC4xNiAyOC4wMzItMjIuNDY0IDQ3LjYxNi01NC43MiA1Ni4zODQtODYuNCAzLjk2OCAxOC40MzIgNC4yODggNDIuMjQtMC41MTIgNjQuODk2IDI1Ljk4NC0zNS4wNzIgMzcuMzc2LTgwLjI1NiAzOS42OC0xMTkuNTUyIDYuNzIgMjIuMDggMTEuMDA4IDUzLjE4NCA3LjU1MiA4MS4xNTJhMjUxLjUyIDI1MS41MiAwIDAgMCA0MS4wODgtMTQwLjYwOGMyMi4xNDQgNzUuMiAzLjAwOCAxNDguNDgtNTMuNTA0IDIwNS4yNDhhMjYyLjI3MiAyNjIuMjcyIDAgMCAxLTEwOC44IDY1LjY2NHogbS0yMjQuNjQtNS4xMmE0MTQuOTc2IDQxNC45NzYgMCAwIDEtOTEuMiAxMC4zNjggMTE1Ljk2OCAxMTUuOTY4IDAgMCAwIDEwMS4xMi0xMi41NDRsLTkuOTIgMi4yNHogbTEwOS41NjgtMTYuMzJhNTIuMTYgNTIuMTYgMCAwIDEtNS41MDQgMi44MTZsMC4xMjggMC43MDQgMTMuMTItNi40Yy0yLjU2IDEuMDI0LTUuMTIgMS45Mi03Ljc0NCAyLjg4eiBtNjkuMTItNTgwLjkyOGMxLjI4LTMuMzkyIDEuOTItNi41OTIgMS45Mi05LjQwOCAwLTQwLjMyLTEyMC43NjgtNzIuOTYtMjY5LjY5Ni03Mi45Ni0xNDguOTkyIDAtMjY5LjY5NiAzMi42NC0yNjkuNjk2IDcyLjk2IDAgMi44MTYgMC42NCA2LjAxNiAxLjg1NiA5LjQwOC0yOS4xMi0xMi43MzYtNDUuODI0LTI3Ljg0LTQ1LjgyNC00NC4wOTYgMC00Ni41OTIgMTQwLjQxNi04NC42MDggMzEzLjYtODQuNjA4IDE3My4yNDggMCAzMTMuNzI4IDM4LjAxNiAzMTMuNzI4IDg0LjYwOCAwIDE2LjI1Ni0xNi44MzIgMzEuMzYtNDUuOTUyIDQ0LjA5NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0yNSIgdW5pY29kZT0iJiM1OTAwMDsiIGQ9Ik02NCAzODguMjg4YzAgNTMuMDU2IDE5LjU4NCAxMDAuNDggNTguODE2IDE0Mi40IDguMzg0IDguMzIgMTYuNzY4IDE5LjUyIDIyLjQgMjcuOTA0IDUzLjE4NCA2Ny4wMDggMTE0Ljc1MiAxMjUuNjMyIDE3OS4yIDE4MS40NCAxOS41ODQgMTYuNzY4IDM2LjM1MiAzMy41MzYgNTYgNDcuNDg4IDI3Ljk2OCAyMi4zMzYgNjEuNTY4IDM2LjI4OCAxMDAuOCA0MS44NTYgNjcuMiA4LjM4NCAxMjUuOTUyLTExLjEzNiAxNzYuMzg0LTU4LjYyNCAxOS41ODQtMTYuNzY4IDM5LjIzMi0zMy40NzIgNjEuNjMyLTUwLjI0IDY0LjM4NC01NS44NzIgMTIzLjItMTE0LjQ5NiAxNzMuNTY4LTE4MS41MDQgOC4zODQtMTEuMTM2IDE5LjU4NC0yMi4zMzYgMjguMDMyLTM2LjI4OCAzMC43Mi00NC42NzIgNDEuOTg0LTk3LjY2NCAzMy42LTE1MC43Mi01LjYzMi00NC42NzItMjUuMjE2LTgwLjk2LTU2LTExNC40OTZsLTUwLjQzMi01OC42MjRjLTM2LjQxNi00MS44NTYtNzIuNzY4LTgwLjk2LTExNC44MTYtMTE3LjI0OC0yMi40LTE5LjUyLTQ0LjgtMzYuMjg4LTY3LjItNTUuODA4LTEzLjk1Mi0xMS4yLTI1LjE1Mi0yMi40LTM5LjE2OC0zMC43MmEyMTQuNTkyIDIxNC41OTIgMCAwIDAtMTUzLjk4NC0zMy41MzZjLTQ0LjggNS41NjgtODEuMjggMjUuMTUyLTExNC44MTYgNTUuODcyLTguMzg0IDguMzItMTYuODMyIDEzLjk1Mi0yOC4wMzIgMjIuMzM2YTExMzkuNTIgMTEzOS41MiAwIDAgMC0xNTYuOCAxNTAuNzJjLTE2Ljc2OCAyMi40LTM2LjM1MiA0MS45Mi01My4xODQgNjQuMjU2LTIuODE2IDguMzItMTQuMDE2IDIyLjMzNi0yMi40IDM2LjI4OEM3NS4yIDMwNC41MTIgNjQgMzQzLjYxNiA2NCAzODguMjg4eiBtMzcyLjQxNi04MC45NnYtMTc1Ljg3MmMwLTE5LjU4NCAxMS4yLTMwLjcyIDMwLjc4NC0zMC43Mmg4OS42YTIxLjQ0IDIxLjQ0IDAgMCAxIDE0LjAxNiA1LjU2OCA1Ni43MDQgNTYuNzA0IDAgMCAxIDE2Ljc2OCA0MS44NTZ2MTUzLjZjMCA1LjU2OCAwIDUuNTY4IDUuNjMyIDUuNTY4aDE3Ni4zODRjMTQuMDE2IDAgMjUuMjE2IDExLjEzNiAyNy45NjggMjUuMDg4djkyLjE2YzAgNS41NjgtMi43NTIgMTEuMTM2LTUuNTY4IDE2Ljc2OC01LjYzMiA4LjMyLTE2LjgzMiAxMS4xMzYtMjguMDMyIDExLjEzNkg1ODcuNTg0VjYyOC4zNTJjMCAyMi40LTExLjIgMzMuNTM2LTMzLjYgMzMuNTM2SDQ3MC4wMTZjLTUuNjMyIDAtMTEuMiAwLTE2LjgzMi0yLjgxNmEzMC43MiAzMC43MiAwIDAgMS0xNi43NjgtMjcuOTA0di0xNzUuODcySDI1OS45NjhjLTE5LjU4NCAwLTMwLjcyLTExLjItMzAuNzItMzAuNzJ2LTg2LjUyOGMwLTguMzg0IDIuNzUyLTE0LjAxNiA1LjU2OC0xOS41ODQgNS41NjgtOC4zMiAxNi43NjgtMTEuMTM2IDI3Ljk2OC0xMS4xMzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjYiIHVuaWNvZGU9IiYjNTkwMDE7IiBkPSJNMzI1LjMxMjM1IDQ1Mi45MjY5MTFjLTEwMy4wMzk4MDcgMC0xODYuNjIzNjUgODIuNjIzODQ1LTE4Ni42MjM2NSAxODQuNjM5NjU0Vjc4NS4yMTQyODhhMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDAgMzcuMzExOTMgMzYuOTI3OTNoMzcuMzExOTNhMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDEgMzcuMzc1OTMgMzYuOTI3OTMxQTM3LjExOTkzIDM3LjExOTkzIDAgMCAxIDIxMy4zMTI1NiA4OTUuOTk4MDhIMTc2LjAwMDYzQTExMS4zNTk3OTEgMTExLjM1OTc5MSAwIDAgMSA2NC4wMDA4NCA3ODUuMjc4Mjg4di0xNDcuNzExNzIzQTI1Ni45NTk1MTggMjU2Ljk1OTUxOCAwIDAgMSAxNzYuNzY4NjI5IDQyNS41OTg5NjIgMzI0LjI4NzM5MiAzMjQuMjg3MzkyIDAgMCAwIDI4OC4wMDA0MiAxOTQuNDMxMzk1QzI4OC4wMDA0MiA1MS43MTE2NjMgNDA0Ljk5MjIwMS02NC4wMDAxMiA1NDkuMzExOTMtNjQuMDAwMTJzMjYxLjM3NTUxIDExNS43MTE3ODMgMjYxLjM3NTUxIDI1OC40MzE1MTV2NDIuMTExOTIxYTE0Ny41ODM3MjMgMTQ3LjU4MzcyMyAwIDAgMSAxMDcuMjYzNzk5IDE3OS45Njc2NjNjLTIwLjY3MTk2MSA3OC45NzU4NTItMTAyLjA3OTgwOSAxMjYuNDYzNzYzLTE4MS45NTE2NTkgMTA2LjA0NzgwMWExNDcuNTgzNzIzIDE0Ny41ODM3MjMgMCAwIDEtMTA3LjI2Mzc5OS0xNzkuOTAzNjYyIDE0OC40Nzk3MjIgMTQ4LjQ3OTcyMiAwIDAgMSAxMDcuMjYzNzk5LTEwNi4xMTE4MDJ2LTQyLjExMTkyMWMwLTEwMS45NTE4MDktODMuNTgzODQzLTE4NC41NzU2NTQtMTg2LjY4NzY1LTE4NC41NzU2NTMtMTAzLjAzOTgwNyAwLTE4Ni42MjM2NSA4Mi42MjM4NDUtMTg2LjYyMzY1IDE4NC41NzU2NTNhMzI0LjI4NzM5MiAzMjQuMjg3MzkyIDAgMCAwIDExMS45OTk3OSAyMzEuMTY3NTY3IDI1Ni44OTU1MTggMjU2Ljg5NTUxOCAwIDAgMSAxMTEuOTk5NzkgMjExLjk2NzYwM1Y3ODUuMjE0Mjg4QTExMS4zNTk3OTEgMTExLjM1OTc5MSAwIDAgMSA0NzQuNjg4MDcgODk1Ljk5ODA4aC0zNy4zNzU5M2EzNy4xMTk5MyAzNy4xMTk5MyAwIDAgMS0zNy4zMTE5My0zNi45Mjc5MzEgMzcuMTE5OTMgMzcuMTE5OTMgMCAwIDEgMzcuMzExOTMtMzYuOTI3OTMxaDM3LjM3NTkzQTM3LjExOTkzIDM3LjExOTkzIDAgMCAwIDUxMiA3ODUuMjc4Mjg4di0xNDcuNjQ3NzI0YzAtMTAyLjAxNTgwOS04My41ODM4NDMtMTg0LjYzOTY1NC0xODYuNjg3NjUtMTg0LjYzOTY1M3ogbTQ0Ny45OTkxNi0xNDcuNzExNzIzYy00MS4yMTU5MjMgMC03NC42MjM4NiAzMy4wODc5MzgtNzQuNjIzODYgNzMuODU1ODYxczMzLjQwNzkzNyA3My44NTU4NjIgNzQuNjIzODYgNzMuODU1ODYyIDc0LjY4Nzg2LTMzLjA4NzkzOCA3NC42ODc4Ni03My44NTU4NjItMzMuNDA3OTM3LTczLjg1NTg2Mi03NC42ODc4Ni03My44NTU4NjF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjciIHVuaWNvZGU9IiYjNTkwMDI7IiBkPSJNODEwLjYyNCAyMzkuMTA0YTI5Ny42IDI5Ny42IDAgMCAxLTI0MS45Mi0xMjQuMDk2Yy04LjM4NC0xMS42NDgtMjYuODgtNS40NC0yNi44OCA4Ljk2djYyLjY1NmEzMC43MiAzMC43MiAwIDAgMCAxNS44MDggMjYuMjRjMzAuMjA4IDE3Ljg1NiA0Ny4yMzIgNTEuNzEyIDQzLjQ1NiA4Ni41OTIgMS45Mi0yLjQzMiAzLjY0OC01LjA1NiA1Ljk1Mi03LjI5NmE4OS42IDg5LjYgMCAwIDEgMTI2LjcyIDEyNi43MmMtMi4zMDQgMi4yNC00Ljg2NCAzLjk2OC03LjI5NiA1Ljk1MiAxOC44OC0xLjk4NCAzOS4yMzIgMS4yMTYgNjEuOTUyIDE5LjMyOCAyMy40ODggMTguODE2IDM5LjIzMiA0Ni43MiAzNi45MjggNzYuNjcyYTg5LjYgODkuNiAwIDAgMS05OC44OCA4Mi4xNzZjMi40MzIgMS45MiA0Ljk5MiAzLjY0OCA3LjI5NiA1Ljk1MmE4OS42IDg5LjYgMCAwIDEtMTI2LjcyIDEyNi43MmMtMi4zMDQtMi4zMDQtMy45NjgtNC44NjQtNS45NTItNy4yOTYgMi4xNzYgMjAuNDgtMS43OTIgNDIuODgtMjQuNDQ4IDY3Ljg0LTE2LjY0IDE4LjMwNC0zOS40MjQgMzEuMTY4LTY0LjEyOCAzMS4yOTZhODkuNiA4OS42IDAgMCAxLTg5LjYtOTkuMmMtMS45MiAyLjQ5Ni0zLjY0OCA1LjEyLTUuOTUyIDcuMzZhODkuNiA4OS42IDAgMCAxLTEyNi43Mi0xMjYuNzJjMi4zMDQtMi4zMDQgNC44NjQtNC4wMzIgNy4yOTYtNS45NTItMjAuNDggMi4xNzYtNDIuODgtMS44NTYtNjcuODQtMjQuNTEyLTE4LjMwNC0xNi42NC0zMS4xNjgtMzkuMzYtMzEuMjk2LTY0LjA2NGE4OS42IDg5LjYgMCAwIDEgOTkuMi04OS42Yy0yLjQ5Ni0xLjkyLTUuMTItMy43MTItNy4zNi01Ljk1MmE4OS42IDg5LjYgMCAwIDEgMTI2LjcyLTEyNi43MmMyLjMwNCAyLjI0IDMuOTY4IDQuODY0IDUuOTUyIDcuMjk2YTg5LjM0NCA4OS4zNDQgMCAwIDEgNDMuNTItODYuNTkyIDMwLjc4NCAzMC43ODQgMCAwIDAgMTUuNjgtMjYuMjR2LTYyLjcyYzAtMTQuMzM2LTE4LjQzMi0yMC41NDQtMjYuODE2LTguOTZhMjk3LjYgMjk3LjYgMCAwIDEtMzIzLjM5MiAxMTIuODMyIDMwLjE0NCAzMC4xNDQgMCAwIDEtMTkuMi00Mi40OTZBNDQ3LjkzNiA0NDcuOTM2IDAgMCAxIDUxMi01OS41Mkg1MTJhNDQ3LjkzNiA0NDcuOTM2IDAgMCAxIDM5OS4xNjggMjQ0LjggMzAuMTQ0IDMwLjE0NCAwIDAgMS0xOS4yIDQyLjQ5NiAyOTcuMzQ0IDI5Ny4zNDQgMCAwIDEtODEuNDA4IDExLjMyOHogbS00MDMuMiAyNzQuODE2YTEwNC41MTIgMTA0LjUxMiAwIDEgMCAyMDkuMDg4IDAgMTA0LjUxMiAxMDQuNTEyIDAgMCAwLTIwOS4wMjQgMHogbTEwNS4wMjQtNTc3LjM0NGMwIDIuMTEyLTAuMzg0IDQuMjI0LTAuNTEyIDYuNGgxLjA4OGMtMC4xMjgtMi4yNC0wLjU3Ni00LjI4OC0wLjU3Ni02LjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjgiIHVuaWNvZGU9IiYjNTkwMDM7IiBkPSJNNTEyIDgzMkMyNjQuODMyIDgzMiA2NCA2MzEuMTY4IDY0IDM4NHMyMDAuODMyLTQ0OCA0NDgtNDQ4IDQ0OCAyMDAuODMyIDQ0OCA0NDgtMjAwLjgzMiA0NDgtNDQ4IDQ0OHogbTIyNC02NTQuNGMwLTE0LjQtMTEuMi0yNS42LTI0LjgzMi0yNS42LTIzNS45NjggMC00MjcuMTM2IDE5Ni4wMzItNDI3LjEzNiA0MzguNCAwIDE0LjQgMTEuMiAyNS42IDI0Ljc2OCAyNS42SDM5Ni44YzEzLjYzMiAwIDI0LjgzMi0xMS4yIDI0LjgzMi0yNS42IDAtMzIgNC44LTYzLjIzMiAxNC40LTkyLjggMi4zNjgtOC44MzIgMC43NjgtMTkuMi02LjQtMjYuNDMybC01NS4yMzItNTYuNzY4YTM4MS41MDQgMzgxLjUwNCAwIDAgMSAxNjUuNjMyLTE2OS42bDU1LjE2OCA1Ni43NjhjNi40IDcuMjMyIDE2LjgzMiA5LjYgMjUuNiA2LjQgMjguMDMyLTkuNiA1OC40MzItMTQuNCA4OS42LTE0LjRhMjUuNiAyNS42IDAgMCAwIDI0LjgzMi0yNS42di05MC4zNjh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMjkiIHVuaWNvZGU9IiYjNTkwMDQ7IiBkPSJNNTYzLjc3NiAzMTAuNTkySDQ2NS40MDh2LTE5Ni4zNTJIMzY3LjEwNFY2MDUuMTg0aDE5Ni42NzJjOTcuMDg4IDAgMTQ0LjM4NC02Ny40NTYgMTQ0LjM4NC0xNDcuMiAwLTc5Ljg3Mi0zNy4yNDgtMTQ3LjMyOC0xMzQuNC0xNDcuMzI4aC05Ljk4NHpNNTEyIDgzMy45MkMyNjMuMTY4IDgzMy45MiA2MS40NCA2MzIuNTEyIDYxLjQ0IDM4NGMwLTI0OC41MTIgMjAxLjcyOC00NDkuOTg0IDQ1MC41Ni00NDkuOTg0czQ1MC41NiAyMDEuNDcyIDQ1MC41NiA0NDkuOTJDOTYyLjU2IDYzMi41MTIgNzYwLjgzMiA4MzMuOTIgNTEyIDgzMy45MnogbTUxLjc3Ni0zMjYuODQ4SDQ2NS40MDh2LTk4LjI0SDU2My44NGM0MS42IDAgNDkuMDg4IDEwLjg4IDQ5LjA4OCA0OS4wODggMCAzOC4yNzIgMi4zNjggNDkuMTUyLTM5LjI5NiA0OS4xNTJINTYzLjg0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTMwIiB1bmljb2RlPSImIzU5MDA1OyIgZD0iTTMxNy42OTYgNTQ0LjE5MlY2OTEuNzEySDE2MC44MzJ6IG0zODguNjA4IDE0Ny41MnYtMTQ3LjQ1NmwxNTYuODY0IDE0Ny40NTZ6TTMxNy42OTYgMzI5LjI4VjQ3Ni42NzJIMTYwLjgzMnogbTM4OC42MDggMGwxNTYuODY0IDE0Ny40NTZoLTE1Ni44NjR6TTMxOC40LTY0aDM4Ny41ODRWODMySDMxOC40ek01MDkuMzc2IDc2OS45ODRjNjEuNzYgMCAxMTEuODcyLTQ5LjY2NCAxMTEuODcyLTExMC45NzZzLTUwLjExMi0xMTAuOTc2LTExMS44NzItMTEwLjk3Ni0xMTEuODcyIDQ5LjY2NC0xMTEuODcyIDExMC45NzYgNTAuMTEyIDExMC45NzYgMTExLjg3MiAxMTAuOTc2eiBtMC0yNzUuNTJhMTExLjM2IDExMS4zNiAwIDAgMCAxMTEuODcyLTExMC45MTJjMC02MS4zMTItNTAuMTEyLTExMC45NzYtMTExLjg3Mi0xMTAuOTc2cy0xMTEuODcyIDQ5LjYtMTExLjg3MiAxMTAuOTEyIDUwLjExMiAxMTAuOTc2IDExMS44NzIgMTEwLjk3NnogbTAtMjc1LjUyYzYxLjc2IDAgMTExLjg3Mi00OS42NjQgMTExLjg3Mi0xMTAuOTc2IDAtNjEuMjQ4LTUwLjExMi0xMTAuOTEyLTExMS44NzItMTEwLjkxMnMtMTExLjg3MiA0OS42NjQtMTExLjg3MiAxMTAuOTEyYzAgNjEuMzEyIDUwLjExMiAxMTAuOTc2IDExMS44NzIgMTEwLjk3NnogbTE5Ni45MjgtMTA0LjcwNGwxNTYuODY0IDE0Ny40NTZoLTE1Ni44NjR6IG0tMzg4LjYwOCAwVjI2MS42OTZIMTYwLjgzMnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMSIgdW5pY29kZT0iJiM1OTAwNjsiIGQ9Ik02NTguNDMyIDQyNi42ODhBNDIuNjg4IDQyLjY4OCAwIDEgMCA2NTYuNTEyIDUxMmE0Mi42ODggNDIuNjg4IDAgMCAwIDEuOTItODUuMzEyeiBtLTI5OC42ODggMEE0Mi42ODggNDIuNjg4IDAgMSAwIDM1Ny44MjQgNTEyYTQyLjY4OCA0Mi42ODggMCAwIDAgMS45Mi04NS4zMTJ6IG0wLjk2IDI1MS4zOTJDMzYwLjcwNCA3NjMuMiA0MjcuNDU2IDgzMiA1MDkuNTY4IDgzMmM4Mi4wNDggMCAxNDguODY0LTY4LjggMTQ4Ljg2NC0xNTMuOTJ2LTM4Ljc4NEwzNjAuNzA0IDY0MHogbTU1Ni42NzItMTAwLjM1MkE2Ny45MDQgNjcuOTA0IDAgMCAxIDg1MC40MzIgNjQwaC0xNDkuMzc2djM4LjA4YzAgMTA4LjQxNi04NS41NjggMTk2LjYwOC0xOTEuNDg4IDE5Ni42MDhTMzE4LjAxNiA3ODYuNDk2IDMxOC4wMTYgNjc4LjA4VjY0MEgxNjcuNzQ0Yy0zNC44MTYgMC02NC41MTItMjcuNjQ4LTY3LjAwOC02Mi4yNzJsLTM2LjU0NC01MTIuMzg0QTYwLjQ4IDYwLjQ4IDAgMCAxIDEyNC45OTIgMGg3NjguMTI4YTYwLjM1MiA2MC4zNTIgMCAwIDEgNjAuODY0IDY1LjM0NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMiIgdW5pY29kZT0iJiM1OTAwNzsiIGQ9Ik0yMjAuNDE2IDgxNS41NTJ2LTE0LjY1NmMwLTI5LjI0OCAyMS4zNzYtNTEuMiA0OS43OTItNTEuMiAyMS4zMTIgMCAzNS41ODQgMTQuNjU2IDQyLjY4OCAzNi42MDhsMTQuMjA4IDM2LjU0NCAzOTguMjA4LTE2OC4xOTJMNDQ4IDQ1Ny4xNTJjLTI4LjQxNi0yMS45NTItMjguNDE2LTUxLjItMjEuMzEyLTgwLjQ0OGw2NC0xNTMuNi05Mi40OC0yODUuMjQ4QTQ3LjE2OCA0Ny4xNjggMCAwIDEgNDQwLjk2LTEyOGMyMS4zMTIgMCAzNS41MiA3LjI5NiA0Mi42ODggMzYuNTQ0bDk5LjUyIDI5Mi42MDggNy4xMDQtMjEuOTUydi0yNTZzMC01MS4yIDQ5Ljc5Mi01MS4yIDQ5Ljc5MiA1MS4yIDQ5Ljc5MiA1MS4ydjI0MS4zNDRjMCAxNC42NTYgMCAyMS45NTItNy4xMDQgMzYuNjA4TDU4My4wNCA0NDkuODU2bDE5MiAxMzguOTQ0YzE0LjIwOCAxNC42NTYgMjguNDggMjEuOTUyIDI4LjQ4IDQzLjkwNHMtMTQuMjcyIDM2LjU0NC0yOC40OCA0My44NGwtNTEyIDIxMi4xNmMtNi4yMDggMC04LjM4NC0xLjI4LTE0LjIwOC03LjM2ek0zNjkuNzkyIDY3Ni40OGMtNTYuOTYgMC0xMDYuNjg4LTUxLjItMTA2LjY4OC0xMDkuNjk2IDAtNTguNDk2IDQ5Ljc5Mi0xMDkuNjk2IDEwNi42ODgtMTA5LjY5NnMxMDYuNjI0IDUxLjIgMTA2LjYyNCAxMDkuNjk2YzAgNTguNDk2LTQ5LjcyOCAxMDkuNjk2LTEwNi42MjQgMTA5LjY5NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zMyIgdW5pY29kZT0iJiM1OTAwODsiIGQ9Ik03NjggODAwYTk2IDk2IDAgMSAwLTE5MiAwIDk2IDk2IDAgMCAwIDE5MiAweiBtMC02MDhhNjQgNjQgMCAxIDEgMC0xMjggNjQgNjQgMCAwIDEgMCAxMjh6IG0xMTcuNzYgMzE0LjI0bC0xMjIuMjQgMTIyLjI0YTMwLjcyIDMwLjcyIDAgMCAxLTIzLjY4IDExLjUySDI4OGEzMiAzMiAwIDAgMSAwLTY0aDE3Mi44TDI1NiAxNzIuOGEzMS4yMzIgMzEuMjMyIDAgMCAxIDAtMTIuOCAzMi43MDQgMzIuNzA0IDAgMCAxIDY0LTEzLjQ0TDM4NCAyNTZoMTI4bC0xMjMuNTItMjcxLjM2YTMxLjM2IDMxLjM2IDAgMCAxLTQuNDgtMTYuNjQgMzIuNjQgMzIuNjQgMCAwIDEgNjQtMTIuOGwzMDAuOCA2MDAuMzIgOTIuMTYtOTQuNzJhMzIgMzIgMCAwIDEgNDQuOCA0NS40NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNCIgdW5pY29kZT0iJiM1OTAwOTsiIGQ9Ik04MzYuOTI4IDQ3Mi42NHYtMzI0LjkyOGEyOS41NjggMjkuNTY4IDAgMCAwLTU5LjA3MiAwVjI2NS44NTZjMCA0OC45Ni0zOS42OCA4OC41NzYtODguNjQgODguNTc2SDYwMC42NFY3MDguOTI4QTU5LjA3MiA1OS4wNzIgMCAwIDEgNTQxLjU2OCA3NjhIMTg3LjA3MkE1OS4wNzIgNTkuMDcyIDAgMCAxIDEyOCA3MDguOTI4di02NDkuODU2YzAtMzIuNjQgMjYuNDMyLTU5LjA3MiA1OS4wNzItNTkuMDcyaDM1NC40OTZjMzIuNjQgMCA1OS4wNzIgMjYuNDMyIDU5LjA3MiA1OS4wNzJWMjk1LjM2aDg4LjU3NmMxNi4zMiAwIDI5LjU2OC0xMy4xODQgMjkuNTY4LTI5LjUwNHYtMTE4LjE0NGE4OC42NCA4OC42NCAwIDAgMSAxNzcuMjE2IDB2Mzg0YTU5LjA3MiA1OS4wNzIgMCAwIDEtNTkuMDcyIDU5LjA3MlY2ODBhMjkuNTA0IDI5LjUwNCAwIDAgMS0yOS41NjggMjguOTI4IDMwLjA4IDMwLjA4IDAgMCAxLTI5LjUwNC0zMi41MTJ2LTE0NC43MDRhNTkuMDcyIDU5LjA3MiAwIDEgMSA1OS4wNzIgNTkuMDcyeiBtLTI5NS4zNi0yOS41NjhBMjkuNTY4IDI5LjU2OCAwIDAgMCA1MTIgNDEzLjU2OEgyMTYuNjRhMjkuNTY4IDI5LjU2OCAwIDAgMC0yOS41NjggMjkuNTA0djE3Ny4yOGMwIDE2LjI1NiAxMy4yNDggMjkuNDQgMjkuNTY4IDI5LjQ0SDUxMmMxNi4zMiAwIDI5LjU2OC0xMy4xODQgMjkuNTY4LTI5LjQ0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTM1IiB1bmljb2RlPSImIzU5MDEwOyIgZD0iTTMwOC41NDQgNjkyLjU0NGMzMC43ODQgNS4xMiAyOS4wNTYgMzIuNTEyIDEwOS40NCA1MS4zMjggMCAwIDM0LjE3NiA0Mi42ODggNzYuOTI4IDM5LjI5NiAwIDAgNDcuODcyLTYuODQ4IDM1Ljg0IDEzLjY5NlM0OTMuMjQ4IDg2OC42NzIgNTM3LjcyOCA4ODUuNzZzNjYuNjI0LTMuNDU2IDc1LjItMTEuOTY4YzguNTc2LTguNTc2IDguNTc2LTIzLjkzNiA4LjU3Ni0yMy45MzZzMy4zOTItMjcuMzkyIDEuNjY0LTM0LjE3NmMtMS42NjQtNi44NDgtMjMuOTM2LTIwLjU0NC0xMS45NjgtMjcuMzkyIDExLjk2OC02Ljg0OCA5Mi4zNTIgNS4xMiA5NS43NDQtNzAuMDggMCAwIDM5LjI5Ni01NC43MiA1Mi45OTItNzguNjU2IDAgMCA1NC43Mi00NC40MTYgNjguNDE2LTcwLjA4IDAgMCA1Mi45OTItNDQuNDE2IDU2LjM4NC00Ny44NzIgMS43MjgtMy4zOTIgNjYuNjg4LTUxLjI2NCAzNy42MzItNTYuMzg0IDAgMCAxLjY2NC0zNC4xNzYtMTUuMzYtNi44NDgtMTUuNDI0IDI3LjMyOC0xMy42OTYgOC41MTItMTMuNjk2IDUuMTIgMC0zLjM5MiAxMC4yNC0zNS44NC0yMC40OC0xNy4wODgtMjkuMTIgMTguODE2LTI0IDQ0LjQxNi0yNCA0NC40MTZzMTEuOTY4IDYuODQ4LTEzLjY5NiAyMi4yNzJjLTI1LjYgMTUuMzYtNjYuNjI0IDQ2LjA4LTY2LjYyNCA1NC42NTYgMCAwLTQ5LjYgMzUuOTA0LTU2LjQ0OCA1Mi45OTItNi44NDggMTUuMzYtNi44NDggMC0xMC4yNC02Ljc4NCAwIDAtMjUuNi00Mi43NTItMjAuNDgtNjEuNTY4IDMuMzkyLTE4LjgxNiAyOC45OTItOTkuMiAyNS42LTExOS42OC0zLjM5Mi0yMC40OC0xOC44MTYtODUuNDQtMTcuMDg4LTg4Ljg5NiAxLjcyOC0zLjM5MiAyMi4yMDgtODAuMzItMjUuNi0xMTEuMTA0IDAgMC04Mi4xMTItMTU3LjI0OC04MC4zODQtMTc0LjMzNiAxLjcyOC0xOC44MTYgMS43MjgtMjkuMTIgMS43MjgtMjkuMTJsMS42NjQtMjUuNmMtNi44NDgtOC41NzYgNS4xMi02My4yOTYgMTguODE2LTc1LjI2NCAxMy42OTYtMTEuOTY4IDMyLjUxMi02NC45Ni0yNy4zMjgtNDIuNjg4QzUxOC44NDgtOTMuODI0IDUxMi0zOS4xMDQgNTEyLTM5LjEwNHMtNDYuMTQ0IDIwLjQ4LTE1LjM2IDU2LjM4NGMyOS4wNTYgMzUuOTA0IDM5LjI5NiAzNC4yNCAzOS4yOTYgMzQuMjRzMS43MjggMjAuNDggNi44NDggMTcuMDg4YzMuMzkyLTEuNzI4IDE4LjgxNiAyMTMuNjk2IDcwLjA4IDIwNi44NDhsLTEwLjI0IDIwLjQ4cy0xNy4wODgtMzUuODQtMjUuNjY0LTQyLjY4OGMtOC41NzYtNi44NDgtNi44NDgtMzAuNzg0LTM3LjYzMi00Mi43NTItMzAuNzItMTEuOTY4LTg1LjQ0LTU2LjQ0OC0xMjkuOTItODcuMTY4IDAgMC02Ljg0OC0zNy42MzItMTEuOTY4LTM5LjM2LTMuMzkyLTEuNzI4LTMwLjcyLTUxLjI2NC0yNS42LTYxLjUwNCA2Ljg0OC0xMS45NjgtMjIuMjcyLTgwLjM4NC00Ny44NzItOC41NzYtMjUuNiA3MC4wOC02Ljg0OCA3Ni45MjgtNi44NDggNzYuOTI4cy0yMC40OCA1OS44NCA1LjEyIDYxLjU2OCA0Ny44NzItMS43MjggNTEuMjY0IDBjMy40NTYgMS42NjQgOC41NzYgMy4zOTIgOC41NzYgMy4zOTJzODMuNzc2IDExNy45NTIgMTIxLjM0NCAxMTQuNTZjMCAwLTYuNzg0IDE1Mi4xMjggMTAuMjQgMTYwLjY0IDAgMC01Ni4zMiA5MC42MjQtNi43ODQgMTQxLjk1MiAwIDAtMzQuMTc2IDgzLjcxMi0yMi4yMDggOTQuMDE2IDAgMC0yNS42NjQgMTguODE2LTE4LjgxNiAyNS42IDAgMC03OC42NTYtMzIuNDQ4LTExNi4yODgtMzIuNDQ4IDAgMC0yMC40OC01LjEyLTI3LjMyOC0xMS45NjggMCAwLTExOC4yNzItMjUuNi0xMzAuMjQtOC41NzYtMTAuMjQgMTUuMzYgNTMuMzEyIDM3LjYzMiA1My4zMTIgMzcuNjMyczMyLjUxMiAxMC4yNCA2My4yMzIgMTUuMzZ6IG0tMjEzLjY5Ni0xLjY2NGE3My41MzYgNzMuNTM2IDAgMSAxIDE0Ny4wNzIgMCA3My41MzYgNzMuNTM2IDAgMCAxLTE0Ny4wNzIgMHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNiIgdW5pY29kZT0iJiM1OTAxMTsiIGQ9Ik02ODIuNjg4IDc2OGMtMzcuNzYgMC02OC4yODgtMzEuMDQtNjguMjg4LTY5LjMxMnMzMC41OTItNjkuMzc2IDY4LjI4OC02OS4zNzYgNjguMjI0IDMxLjA0IDY4LjIyNCA2OS4zNzZTNzIwLjM4NCA3NjggNjgyLjY4OCA3Njh6IG0tMTI2LjcyLTEzOC4yNGEzMy45MiAzMy45MiAwIDAgMS0yMy42OC05LjkyTDM1MiA0NDYuNTI4YTM1LjAwOCAzNS4wMDggMCAwIDEgMi45NDQtNTIuOTI4bDEyMi44OC05My41Njh2LTE5MC43MmMtMC42NC00Ni44NDggNjguOTkyLTQ2Ljg0OCA2OC4yODggMHYyMDhhMzQuODggMzQuODggMCAwIDEtMTMuNTY4IDI3Ljc3NmwtNTIuNDE2IDM5LjkzNiAxMjQuMTYgMTE5LjM2IDUxLjA3Mi02OS4yNDhhMzMuOTIgMzMuOTIgMCAwIDEgMjcuMzI4LTEzLjgyNGgxMDIuNGM0Ni4wOC0wLjY0IDQ2LjA4IDcwLjAxNiAwIDY5LjM3NmgtODUuMzc2bC01MS4yIDY5LjMxMi00MC45NiA1NS41NTJhMzMuOTg0IDMzLjk4NCAwIDAgMS0yNi4yNCAxNC4yMDh6TTIwNC44IDM1MkM5MS43MTIgMzUyIDAgMjU4Ljg4IDAgMTQ0UzkxLjcxMi02NCAyMDQuOC02NHMyMDQuOCA5My4xMiAyMDQuOCAyMDhTMzE3Ljg4OCAzNTIgMjA0LjggMzUyeiBtNjE0LjQgMGMtMTEzLjA4OCAwLTIwNC44LTkzLjEyLTIwNC44LTIwOFM3MDYuMTEyLTY0IDgxOS4yLTY0czIwNC44IDkzLjEyIDIwNC44IDIwOC05MS43MTIgMjA4LTIwNC44IDIwOHpNMjA0LjggMjgyLjY4OGM3NS4zOTIgMCAxMzYuNTEyLTYyLjA4IDEzNi41MTItMTM4LjY4OHMtNjEuMTItMTM4LjY4OC0xMzYuNTEyLTEzOC42ODgtMTM2LjUxMiA2Mi4wOC0xMzYuNTEyIDEzOC42ODggNjEuMTIgMTM4LjY4OCAxMzYuNTEyIDEzOC42ODh6IG02MTQuNCAwYzc1LjM5MiAwIDEzNi41MTItNjIuMDggMTM2LjUxMi0xMzguNjg4cy02MS4xMi0xMzguNjg4LTEzNi41MTItMTM4LjY4OC0xMzYuNTEyIDYyLjA4LTEzNi41MTIgMTM4LjY4OCA2MS4xMiAxMzguNjg4IDEzNi41MTIgMTM4LjY4OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS0zNyIgdW5pY29kZT0iJiM1OTAxMjsiIGQ9Ik01MTIgNzY4QzQwOS42IDc2OCAzMzIuOCA2ODcuNzQ0IDMzMi44IDU4OC44YTE3OC43NTIgMTc4Ljc1MiAwIDAgMSAxMjgtMTcwLjg4di0zMDkuMjQ4Yy00Ny42MTYgOC40NDgtOTYgMjguMTYtMTM1LjYxNiA2NS4wMjQtNTMuODg4IDUwLjE3Ni05NC43MiAxMzAuMDQ4LTk0LjcyIDI2MS42MzJhNTEuMiA1MS4yIDAgMSAxLTEwMi40NjQgMGMwLTE1My43OTIgNTEuODQtMjY2LjA0OCAxMjcuNDg4LTMzNi41MTJTNDI2Ljg4IDAgNTEyIDBjODUuMjQ4IDAgMTgwLjk5MiAyOC42NzIgMjU2LjY0IDk5LjMyOHMxMjcuMjMyIDE4Mi45NzYgMTI3LjIzMiAzMzZjMy4zMjggNzEuNDI0LTEwNS42IDcxLjQyNC0xMDIuMjcyIDAgMC0xMzAuNzUyLTQwLjk2LTIxMC42ODgtOTQuOTEyLTI2MS4xMi0zOS42MTYtMzYuOTkyLTg3LjkzNi01Ni44OTYtMTM1LjQ4OC02NS40MDhWNDE3LjcyOGExNzguODggMTc4Ljg4IDAgMCAxIDEyOCAxNzEuMDcyQzY5MS4yIDY4Ny43NDQgNjE0LjQgNzY4IDUxMiA3Njh6IG0wLTEwMi40QTc2LjggNzYuOCAwIDEgMCA1MTIgNTEyYTc2LjggNzYuOCAwIDAgMCAwIDE1My42eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTM4IiB1bmljb2RlPSImIzU5MDEzOyIgZD0iTTM4My44MDggMTczLjE4NGMzOS44NzItMC41NzYgNzguMzM2LTE0LjcyIDEwOS4zMTItNDAuMzJsMTUuMzYtMTMuODg4aDIuOTQ0bDE4LjMwNCAxNi44MzJhMTY4LjEyOCAxNjguMTI4IDAgMCAwIDIwMy4yIDEwLjg4bDEzMy41MDQgMjY3LjQ1Ni04OC41NzYgNjAuMTZWNjg4LjI1NmE5MS44NCA5MS44NCAwIDAgMS04OC42NCA4Ny4zNmgtMjkuNTA0YTU2LjI1NiA1Ni4yNTYgMCAwIDEtNTkuMDcyIDYwLjE2aC0xNzcuMjhhNTUuOTM2IDU1LjkzNiAwIDAgMS01OS4wNzItNjAuMTZoLTI5LjUwNGE5MS44NCA5MS44NCAwIDAgMS04OC42NC04Ny4zNnYtMjEzLjgyNGwtODguNTc2LTYwLjIyNCAxMzIuODY0LTI3Mi44OTZhMTcwLjg4IDE3MC44OCAwIDAgMCA5My4zNzYgMzEuOTM2ek0zMDUuMjE2IDY4OC4xOTJhMjcuOTY4IDI3Ljk2OCAwIDAgMCAyOC44NjQgMjcuMTM2aDM1NS4yYTI3Ljk2OCAyNy45NjggMCAwIDAgMjkuNDQtMzAuMTQ0di0xODAuNzM2TDUxMiA2MjQuOTYgMzA1LjI4IDUwNy40NTZ6TTg5NiA1Mi42NzJ2LTYwLjE2YTU4LjY4OCA1OC42ODggMCAwIDEtNDAuMTkyLTIwLjQ4Yy0xNi0xNy40MDgtMzYuNDgtMjkuODg4LTU5LjA3Mi0zNi4xNi0zNi4yODgtMTAuOTQ0LTc1LjUyLTIuNTYtMTA0LjU3NiAyMi4yNzJsLTIzLjA0IDIxLjEyYTQ1LjQ0IDQ1LjQ0IDAgMCAxLTY0Ljk2IDBjLTguMzItNy4yOTYtMTYtMTUuMTA0LTI0LjgzMi0yMi4zMzZhMTExLjc0NCAxMTEuNzQ0IDAgMCAwLTE0Ni40OTYgNC4yMjRsLTIzLjA0IDIxLjEyYTQ0LjIyNCA0NC4yMjQgMCAwIDEtNTkuMDcyIDBjLTExLjItOS4wODgtMjEuMjQ4LTE5LjMyOC0zMi41MTItMjguMzUyLTQxLjYtMzEuMzYtOTguODE2LTI5Ljk1Mi0xMzguODE2IDMuNTg0bC0xOC4zMDQgMTYuMzJBNTUuMjMyIDU1LjIzMiAwIDAgMSAxMjgtNy41NTJ2NjAuMjg4YzE1LjI5NiAxLjkyIDMwLjcyLTEuMDI0IDQ0LjI4OC04LjQ0OCAxNi40NDgtMTAuMzY4IDMyLjA2NC0yMi4wOCA0Ni43Mi0zNC45NDQgMTIuMDk2LTEzLjQ0IDMwLjQtMTkuMiA0Ny44MDgtMTUuMDRhNTQuNTkyIDU0LjU5MiAwIDAgMSAxOC4zMDQgOS42YzkuNDcyIDcuMjMyIDE3LjE1MiAxNS42OCAyNi42MjQgMjMuNDg4YTExMS43NDQgMTExLjc0NCAwIDAgMCAxNDQuNzA0IDBjOS40NzItNy44MDggMTguMzA0LTE2LjgzMiAyNy43NzYtMjQuNzA0YTQ0LjIyNCA0NC4yMjQgMCAwIDEgNTkuMDcyIDBjOS40NzIgNy44NzIgMTguMzA0IDE2Ljg5NiAyNy43NzYgMjQuNzA0YTExMS43NDQgMTExLjc0NCAwIDAgMCAxNDUuMjggMGM4Ljk2LTcuODA4IDE3LjIxNi0xNi4yNTYgMjYuMDQ4LTIzLjQ4OGE0NC4yMjQgNDQuMjI0IDAgMCAxIDU5LjA3MiAwbDI3Ljc3NiAyNC43MDRBMTA0LjUxMiAxMDQuNTEyIDAgMCAwIDg5NiA1Mi43MzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtMzkiIHVuaWNvZGU9IiYjNTkwMTQ7IiBkPSJNNzE1LjYzNTI3MyA3MzguNDQxODQ3YzQ0Ljk4OTE4OCAwIDgxLjQ2NjkwOCAzNS4yNjE3OTYgODEuNDY2OTA4IDc4Ljc3OTA3N1M3NjAuNjI0NDYxIDg5NiA3MTUuNjM1MjczIDg5NiA2MzQuMTY4MzY0IDg2MC43MzgyMDQgNjM0LjE2ODM2NCA4MTcuMjg0OTJjMC00My41MTcyOCAzNi40Nzc3Mi03OC44NDMwNzIgODEuNDY2OTA5LTc4Ljg0MzA3M3ogbS02MTAuOTA1ODE5LTU1MS4zMjU1NDJoMjAzLjYzNTI3M2w4MS40NjY5MDkgMjM2LjI3MzIzM0w0NzEuMjk4NTQ0IDU2MS4zMDA5MTkgMzg5Ljc2NzY0IDU4MC45NDc2OTFsLTE4Ny4zMTYyOTMtNzguNzE1MDgxYTQ0LjM0OTIyOCA0NC4zNDkyMjggMCAwIDAtNTcuMDIwNDM2IDIzLjU1MDUyOSA0MS45ODEzNzYgNDEuOTgxMzc2IDAgMCAwIDI0LjQ0NjQ3MiA1NS4xNjQ1NTJsMjE5Ljg5MDI1NyA3OC43MTUwOGgxNjIuODY5ODJsMTYyLjkzMzgxNy03OC43MTUwOCA4MS40NjY5MDgtNzguNzE1MDgxaDEyMi4xNjgzNjVjMjIuNDYyNTk2IDAgNDAuNzAxNDU2LTE3LjY2Mjg5NiA0MC43MDE0NTYtMzkuNDIxNTM2IDAtMjEuNzU4NjQtMTguMjM4ODYtMzkuNDIxNTM2LTQwLjcwMTQ1Ni0zOS40MjE1MzZoLTIwMy42MzUyNzNMNjM0LjE2ODM2NCA1MDIuMTY4NjE0IDU1Mi43MDE0NTYgMzQ0LjY3NDQ1OGwxNjIuOTMzODE3LTE1Ny41NTgxNTN2LTI3NS42OTQ3NjljMC0yMS43NTg2NC0xOC4yMzg4Ni0zOS4zNTc1NC00MC43NjU0NTItMzkuMzU3NTRzLTQwLjcwMTQ1NiAxNy42NjI4OTYtNDAuNzAxNDU3IDM5LjM1NzU0djI0NC45NzY2ODlsLTE2Mi44Njk4MiAxMDkuNDMzMTYxLTgxLjQ2NjkwOC0xNTcuNDMwMTYxSDEwNC43Mjk0NTRjLTIyLjQ2MjU5NiAwLTQwLjcwMTQ1NiAxNy41OTg5LTQwLjcwMTQ1NiAzOS4zNTc1NHMxOC4yMzg4NiAzOS4zNTc1NCA0MC43MDE0NTYgMzkuMzU3NTR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDAiIHVuaWNvZGU9IiYjNTkwMTU7IiBkPSJNMTI4IDY0MGMtMzUuNDU2IDAtNjQtMjguNTQ0LTY0LTY0di00NDhjMC0zNS40NTYgMjguNTQ0LTY0IDY0LTY0aDgzMmMzNS40NTYgMCA2NCAyOC41NDQgNjQgNjRWNTc2YzAgMzUuNDU2LTI4LjU0NCA2NC02NCA2NHogbTAtNjRoOTZhMzIgMzIgMCAxIDAtMzItMzJsLTMyLTMyYTMyIDMyIDAgMSAwLTMyLTMyeiBtNDE2IDBDNjMyLjMyIDU3NiA3MDQgNDc1LjcxMiA3MDQgMzUyUzYzMi4zMiAxMjggNTQ0IDEyOCAzODQgMjI4LjI4OCAzODQgMzUyIDQ1NS42OCA1NzYgNTQ0IDU3NnogbTMyMCAwSDk2MHYtOTZhMzIgMzIgMCAxIDAtMzIgMzJsLTMyIDMyYTMyIDMyIDAgMSAwLTMyIDMyeiBtLTMyMC05NmMtMjAuNjcyIDAtMzQuMTc2LTYuOTc2LTQzLjY0OC0xNmg4Ny4yOTZjLTkuNDcyIDkuMDI0LTIyLjk3NiAxNi00My42NDggMTZ6IG0tNTYtMzJjLTIuODgtNS44MjQtMy45NjgtMTAuOTQ0LTUuMTItMTZoMTIyLjI0Yy0xLjE1MiA1LjA1Ni0yLjI0IDEwLjE3Ni01LjEyIDE2eiBtLTgtMzJ2LTE2aDEyOFY0MTZ6IG0wLTMydi0xNmgxMjhWMzg0eiBtMC0zMnYtMTZoMTI4VjM1MnogbTAtMzJsLTE2LTE2aDEyOEw2MDggMzIweiBtLTMyLTMyczIuMjQtNi41MjggNi41MjgtMTZoMTQ1LjQ3Mkw1NzYgMjg4eiBtLTI4OC0zMmEzMiAzMiAwIDAgMCAwLTY0bDMyLTMyYTMyIDMyIDAgMSAwIDMyLTMySDEyOHY5NmEzMiAzMiAwIDAgMCAzMiAzMnogbTMwMy4yMzIgMGMyLjk0NC01LjUwNCA0Ljg2NC0xMC4xNzYgOC43NjgtMTZoMTQ1LjE1MmM0LjIyNCA4LjgzMiA2Ljg0OCAxNiA2Ljg0OCAxNnogbTQ2NC43NjggMGEzMiAzMiAwIDAgMCAzMi0zMlYxMjhoLTk2YTMyIDMyIDAgMSAwIDMyIDMybDMyIDMyYTMyIDMyIDAgMCAwIDAgNjR6IG0tNDQzLjc3Ni0zMmM1LjA1Ni01LjgyNCAxMC41Ni0xMS4yNjQgMTYuNjQtMTZoOTAuODhjNi40IDQuOTI4IDEyLjAzMiAxMC4zNjggMTYuMjU2IDE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQxIiB1bmljb2RlPSImIzU5MDE2OyIgZD0iTTUxMiA3NjhjLTExNy4wNTYgMC00MDkuNi0xNC43Mi0zODAuMzUyLTQ0LjI4OGwzNTEuMTA0LTM2OS4yOHYtMjM2LjI4OGMwLTU5LjA3Mi0xNzUuNTUyLTI5LjUwNC0xNzUuNTUyLTExOC4xNDRoNDA5LjZjMCA4OC42NC0xNzUuNTUyIDU5LjA3Mi0xNzUuNTUyIDExOC4xNDRWMzU0LjQzMmwzNTEuMTA0IDM2OS4yOEM5MjEuNiA3NTMuMjE2IDYyOS4wNTYgNzY4IDUxMiA3Njh6IG0wLTU5LjA3MmMxNDYuMzA0IDAgMjc3Ljk1Mi0xNC43MiAyNzcuOTUyLTE0LjcybC00My45MDQtNDQuMzUySDI3Ny45NTJsLTQzLjkwNCA0NC4yODhzMTMxLjY0OCAxNC43MiAyNzcuOTUyIDE0LjcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQyIiB1bmljb2RlPSImIzU5MDE3OyIgZD0iTTg4NS4zMTIgNTYzLjJoLTEzOC42MjRWNzA0SDE5MnYtMjgxLjZjMC44OTYtMTU1LjUyIDEyNS44MjQtMjgwLjgzMiAyNzkuMDQtMjc5Ljg3MkEyNzYuNjA4IDI3Ni42MDggMCAwIDEgNzA4LjQ4IDI4MS42aDE3Ni44MzJDOTYxLjkyIDI4MS42IDEwMjQgMzQ0LjY0IDEwMjQgNDIyLjRzLTYyLjA4IDE0MC44LTEzOC42ODggMTQwLjh6IG0wLTIxMS4yaC0xNDguMzUyYzYuMTQ0IDIyLjk3NiA5LjQwOCA0Ni41OTIgOS43MjggNzAuNFY0OTIuOGgxMzguNjI0YzM4LjMzNiAwIDY5LjM3Ni0zMS40ODggNjkuMzc2LTcwLjRzLTMxLjA0LTcwLjQtNjkuMzc2LTcwLjR6IG0tMTM4LjYyNC0zMTYuOGMwLTE5LjQ1Ni0xNS41NTItMzUuMi0zNC42ODgtMzUuMkgyMjYuNjg4Yy0xOS4yIDAtMzQuNjg4IDE1Ljc0NC0zNC42ODggMzUuMnMxNS41NTIgMzUuMiAzNC42ODggMzUuMmg0ODUuMzEyYzE5LjIgMCAzNC42ODgtMTUuNzQ0IDM0LjY4OC0zNS4yeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQzIiB1bmljb2RlPSImIzU5MDE4OyIgZD0iTTk3Mi41NDQgNDA5LjI4aC0xNTAuMDE2di0yNTMuNjMyaDgzLjMyOHYtNjcuNjQ4aDUwLjA0OHYtNjcuNjQ4SDg5LjI4djY3LjY0OGg0OS45ODR2NjcuNjQ4aDk5Ljk2OFY0MDkuMjhINzYuOGwyMjkuMTIgMTUyLjE5MkgxNDMuNDg4TDUwNS45MiA3OTguMDhWODMyaDMzLjI4di0zMy44NTZsMzgzLjM2LTIzNi42NzJoLTE2OC4xOTJ6IG0tNjgzLjI2NCAwdi0yMDIuODhoODMuMzI4djIwMi44OHogbTIxNi42NCAwSDQyMi41OTJ2LTIwMi44OGg4My4zMjh6IG0xMzMuMzEyIDBINTU1LjkwNHYtMjAyLjg4aDgzLjMyOHogbTQ5Ljk4NC0yMDIuODhoODMuMzI4djIwMi44OEg2ODkuMjh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDQiIHVuaWNvZGU9IiYjNTkwMTk7IiBkPSJNOTYgNzM2Yy0xOS4yIDAtMzItMTIuOC0zMi0zMnYtNjA4YzAtMTkuMiAxMi44LTMyIDMyLTMyczMyIDEyLjggMzIgMzJWMTkyaDgzMnYtOTZjMC0xOS4yIDEyLjgtMzIgMzItMzJzMzIgMTIuOCAzMiAzMnYxMjhjMCAxOS4yLTEyLjggMzItMzIgMzJIMTI4VjcwNGMwIDE5LjItMTIuOCAzMi0zMiAzMnogbTE5Mi0zMkMyMzYuOCA3MDQgMTkyIDY1OS4yIDE5MiA2MDhTMjM2LjggNTEyIDI4OCA1MTIgMzg0IDU1Ni44IDM4NCA2MDggMzM5LjIgNzA0IDI4OCA3MDR6TTUxMiA2NDBDNDE2IDY0MCA0MTYgNTQ0IDQxNiA1NDRWNDQ4aC0xOTJjLTE5LjIgMC0zMi0xMi44LTMyLTMydi02NGMwLTE5LjIgMTIuOC0zMiAzMi0zMkgxMDI0VjQ4MEMxMDI0IDY0MCA4NjQgNjQwIDg2NCA2NDB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDUiIHVuaWNvZGU9IiYjNTkwMjA7IiBkPSJNODk0LjI3MiAzNC44OGMtNDAuOTYtMjAuOTI4LTk1LjU1Mi02Ljk3Ni0xMjIuODggMzQuOTQ0bC03NS4wNzIgOTcuNzI4SDMyNy42OGwtNzUuMDcyLTk3LjcyOGMtMzQuMTc2LTQ4Ljg5Ni05NS42MTYtNTUuODcyLTE0My4zNi0yMC45MjgtMzQuMTc2IDI3LjkwNC00Ny44MDggNjkuNzYtNDAuOTYgMTA0LjcwNGw0Ny43NDQgMjU4LjMwNEMxMjkuNzI4IDQ5NS43NDQgMjA0LjggNTU4LjUyOCAyODYuNzIgNTU4LjUyOGgxOTEuMTY4VjY2My4yOTZDNDc3Ljg4OCA3MTkuMTA0IDUxOC44NDggNzY4IDU3My40NCA3NjhoMjExLjY0OGMyMC40OCAwIDM0LjExMi0xMy45NTIgMzQuMTEyLTM0Ljg4IDAtMjAuOTkyLTEzLjYzMi0zNC45NDQtMzQuMTEyLTM0Ljk0NGgtMjA0LjhjLTIwLjQ4IDAtMzQuMTc2LTEzLjk1Mi0zNC4xNzYtMjcuOTA0di0xMTEuNzQ0aDE5MS4xNjhjODEuOTIgMCAxNTYuOTkyLTYyLjg0OCAxNzAuNjg4LTE0Ni41Nmw0Ny43NDQtMjU4LjM2OGM2Ljg0OC00OC44OTYtMTMuNjMyLTk3LjcyOC02MS40NC0xMTguNzJ6TTQwOS42IDM4NGMwIDU1Ljg3Mi00Ny44MDggMTA0LjcwNC0xMDIuNCAxMDQuNzA0UzIwNC44IDQzOS44NzIgMjA0LjggMzg0czQ3LjgwOC0xMDQuNzA0IDEwMi40LTEwNC43MDRTNDA5LjYgMzI4LjEyOCA0MDkuNiAzODR6IG00MDkuNiAwYzAgMjAuOTI4LTEzLjYzMiAzNC44OC0zNC4xMTIgMzQuODhoLTM0LjE3NnYzNC45NDRjMCAyMC45MjgtMTMuNjMyIDM0Ljg4LTM0LjExMiAzNC44OHMtMzQuMTEyLTEzLjk1Mi0zNC4xMTItMzQuODh2LTM0Ljk0NGgtMzQuMTc2Yy0yMC40OCAwLTM0LjExMi0xMy45NTItMzQuMTEyLTM0Ljg4czEzLjYzMi0zNC44OCAzNC4xMTItMzQuODhoMzQuMTc2di0zNC45NDRjMC0yMC45MjggMTMuNjMyLTM0Ljg4IDM0LjExMi0zNC44OHMzNC4xMTIgMTMuOTUyIDM0LjExMiAzNC44OHYzNC45NDRoMzQuMTc2YzIwLjQ4IDAgMzQuMTEyIDEzLjk1MiAzNC4xMTIgMzQuODh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDYiIHVuaWNvZGU9IiYjNTkwMjE7IiBkPSJNMzQxLjEyIDc2OEg2NHYtNjg1LjMxMmgyNTkuMDcyYzQ2LjkxMiAwIDE0OC4wMzItMjcuMDcyIDE0OC4wMzItODIuNjg4VjY0My45NjhDNDcxLjEwNCA2OTAuMTEyIDQwMC4xOTIgNzY4IDM0MS4xMiA3Njh6IG0zNDEuNTA0IDBjLTU5LjEzNiAwLTEzMC4wNDgtNzcuODg4LTEzMC4wNDgtMTI0LjAzMlYwYzAgNTUuNjE2IDEwMS4xMiA4Mi42ODggMTQ3Ljk2OCA4Mi42ODhoMjU5LjEzNlY3Njh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNDciIHVuaWNvZGU9IiYjNTkwMjI7IiBkPSJNMTAyNCAzNzQuNHYtMTY2LjRjMC0yMi45NzYtMTcuOTItNDEuNi00MC00MS42cy00MCAxOC42MjQtNDAgNDEuNmMwIDAgNC44IDQxLjYtODAgNDEuNmgtODB2LTIwOGMwLTIyLjk3Ni0xNy45Mi00MS42LTQwLTQxLjZoLTY0MEE0MC44MzIgNDAuODMyIDAgMCAwIDY0IDQxLjZ2MzMyLjhjMCAyMi45NzYgMTcuOTIgNDEuNiA0MCA0MS42aDY0MGMyMi4wOCAwIDQwLTE4LjYyNCA0MC00MS42di00MS42aDgwYzg0LjggMCA4MCA0MS42IDgwIDQxLjYgMCAyMi45NzYgMTcuOTIgNDEuNiA0MCA0MS42czQwLTE4LjYyNCA0MC00MS42ek0yMjQgNzQ4LjhDMTM1LjY4IDc0OC44IDY0IDY3NC4zMDQgNjQgNTgyLjRzNzEuNjgtMTY2LjQgMTYwLTE2Ni40UzM4NCA0OTAuNDk2IDM4NCA1ODIuNCAzMTIuMzIgNzQ4LjggMjI0IDc0OC44eiBtMC0yNDkuNmMtNDQuMTYgMC04MCAzNy4yNDgtODAgODMuMnMzNS44NCA4My4yIDgwIDgzLjIgODAtMzcuMjQ4IDgwLTgzLjItMzUuODQtODMuMi04MC04My4yek01ODQgODMyQzQ3My41MzYgODMyIDM4NCA3MzguODggMzg0IDYyNFM0NzMuNiA0MTYgNTg0IDQxNnMyMDAgOTMuMTIgMjAwIDIwOFM2OTQuNCA4MzIgNTg0IDgzMnogbTAtMzMyLjhjLTY2LjMwNCAwLTEyMCA1NS44NzItMTIwIDEyNC44UzUxNy43NiA3NDguOCA1ODQgNzQ4LjggNzA0IDY5Mi45MjggNzA0IDYyNCA2NTAuMjQgNDk5LjIgNTg0IDQ5OS4yeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQ4IiB1bmljb2RlPSImIzU5MDIzOyIgZD0iTTg5MS45MDQgNzYwYTIyNS45ODQgMjI1Ljk4NCAwIDAgMS0zODYuNDk2LTE0OC42MDhsMjM3LjY5Ni0yMzcuNjk2YTIyNS45ODQgMjI1Ljk4NCAwIDAgMSAxNDguOCAzODYuMzA0ek0zMzAuMTEyIDM1OC45MTJMMTY5LjYgMTk4LjRhNzUuNjQ4IDc1LjY0OCAwIDAgMSAwLTEwNi45NDRsNTMuNTA0LTUzLjUwNGMyOS41MDQtMjkuNTA0IDc3LjQ0LTI5LjUwNCAxMDYuODggMEw0OTAuNDk2IDE5OC40bDE2MC41MTIgMTYwLjUxMi0xNjAuNDQ4IDE2MC4zODR6IG01Ni4wNjQtMTU3Ljg4OGwtNTMuNTA0IDUzLjUwNCAxNTcuODI0IDE1Ny44MjQgNTMuNTA0LTUzLjQ0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTQ5IiB1bmljb2RlPSImIzU5MDI0OyIgZD0iTTk1MS4wNCA0MDAuNDQ4TDE1Mi4wNjQgODMwLjIwOGMtMTEuNTIgNS43Ni0yNS42LTMuMzI4LTIzLjkzNi0xNS44MDhsNjEuOTUyLTc0Mi4zMzZjMC44MzItMTEuNjQ4IDEyLjQxNi0xOC4zMDQgMjMuMTY4LTE0LjA4bDI1Ny43MjggMTA4LjggMTQxLjMxMi0xNjEuMjE2YzkuMDg4LTkuOTg0IDI0Ljc2OC01Ljc2IDI4LjA5NiA2LjY1Nmw2Ny43MTIgMjU1LjIzMiAyNDIuOTQ0IDEwMy4wNGExNi45NiAxNi45NiAwIDAgMSAwIDI5Ljk1MnogbS0zMzguNzUyLTMxNy41NjhsLTc0LjM2OCAxMzIuOTkyLTM4MC4wMzIgNTkwLjIwOCA1MDMuOTM2LTUyMy43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTAiIHVuaWNvZGU9IiYjNTkwMjU7IiBkPSJNOTYwIDIxNnY4MGwtMzY2LjU5MiAyNDBWODE2UzU5My40MDggODk2IDUxMiA4OTZDNDMwLjUyOCA4OTYgNDMwLjUyOCA4MTYgNDMwLjUyOCA4MTZ2LTI4MEw2NCAyOTZ2LTgwbDM2Ni41MjggMTIwLjA2NHYtMjI0LjA2NGwtMTIyLjE3Ni05NlYtNjRMNTEyIDE2IDcxNS42NDgtNjR2ODBsLTEyMi4yNCA5NnYyMjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTEiIHVuaWNvZGU9IiYjNTkwMjY7IiBkPSJNOTgwLjczNiA1MjQuMDk2di0xNzEuNzEybDM1LjY0OC0zNi4wOTYtNzQuMzY4LTc4LjQ2NC03NS4yNjQgNzYuMTYgNTEuNTg0IDQ3LjQ4OFY0OTYuOTZDNjk5LjUyIDQwNS41NjggNjI5LjUwNCAzNzcuMTUyIDU4MC45OTIgMzU1LjAwOHMtODMuNDU2LTIyLjA4LTEzMS41ODQtMy43MTJDNDAxLjM0NCAzNjkuNjY0IDE3Mi4yODggNDU0LjQgNTguNTYgNTA5LjU2OGMtNzUuODQgMzYuOC04MC43NjggNjAuMTYgMS4yOCA5MS4zMjggMTA3LjEzNiA0MS4yOCAyODQuMTYgMTA3LjI2NCAzNzguMDQ4IDE0My4zNiA1NS41NTIgMjIuNzg0IDg0LjkyOCAzNS4yIDEzNS44NzIgOS4yMTYgOTEuMDcyLTM4LjA4IDI5OS4xMzYtMTE3LjE4NCA0MDIuNTYtMTYwLjUxMiA5MC4wNDgtMzkuODA4IDI5LjUwNC01Mi45MjggNC40MTYtNjguODY0ek01OTEuNTUyIDI4Ny4wNGM1Mi44NjQgMjIuMTQ0IDEyNC4xNiA1OC42ODggMjAxLjkyIDkyLjQ4di0yNzEuMTA0UzY5Mi45MjggMCA1MTYuMTYgMGMtMTkwLjQgMC0yOTMuMjQ4IDEwOC40MTYtMjkzLjI0OCAxMDguNDE2VjM2MS40NzJjNTkuOTY4LTI0LjgzMiAxMjcuMzYtNDYuMDggMjA4Ljk2LTc0LjQzMiA1MC4yNC0xOC4xMTIgMTE0LjA0OC0yNC4zODQgMTU5LjY4IDB6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTIiIHVuaWNvZGU9IiYjNTkwMjc7IiBkPSJNNzc3LjM0NCA2NTAuNDk2SDg3Ni44YzQ0Ljg2NC0wLjA2NCA4MS4yOC0zNS4wMDggODEuNTM2LTc4LjIwOEw5NjAgMTQyLjAxNmMwLjEyOC0yMC43MzYtOC4zODQtNDAuNjQtMjMuNjgtNTUuMjk2cy0zNS44NC0yMi44NDgtNTcuNDA4LTIyLjcybC03MzEuNjQ4IDEuNjY0Yy00NC45OTIgMC4xMjgtODEuNDA4IDM1LjItODEuNjY0IDc4LjRMNjQgNTcyLjIyNGMtMC4xMjggMjAuNzM2IDguMzg0IDQwLjY0IDIzLjYxNiA1NS4zNnMzNS44NCAyMi45MTIgNTcuMzQ0IDIyLjkxMmgxMjQuMjg4YTM2LjU0NCAzNi41NDQgMCAwIDEgMjkuNjMyIDE3LjZsMzMuMjggNjMuNjE2YzkuOTIgMTkuMiAzNi4yODggMzQuOTQ0IDU4LjY4OCAzNS4wNzJMNjU0LjcyIDc2OGMyMi41MjggMC4xMjggNDguNzY4LTE1LjQ4OCA1OC44OC0zNC44MTZsMzQuMjQtNjUuMzQ0YzUuMDU2LTkuNiAxOC4yNC0xNy4zNDQgMjkuNDQtMTcuMzQ0eiBtLTI2Ni40MzItMzguODQ4Yy0xMzQuNzg0IDAtMjQzLjkwNC0xMDUuMDg4LTI0My45MDQtMjM0Ljc1MiAwLTEyOS43MjggMTA5LjEyLTIzNC44OCAyNDMuODQtMjM0Ljg4IDEzNC43ODQgMCAyNDMuOTY4IDEwNS4xNTIgMjQzLjk2OCAyMzQuODggMCAxMjkuNjY0LTEwOS4xODQgMjM0Ljc1Mi0yNDMuOTA0IDIzNC43NTJ6IG0tNS4xMi0zODEuNTA0YzgxLjQwOCAwIDE0Ny4zOTIgNjMuNDg4IDE0Ny4zOTIgMTQxLjgyNGExOS45NjggMTkuOTY4IDAgMCAxLTIwLjM1MiAxOS41ODQgMTkuOTY4IDE5Ljk2OCAwIDAgMS0yMC4yODgtMTkuNTg0YzAtNTYuNzA0LTQ3LjgwOC0xMDIuNzItMTA2Ljc1Mi0xMDIuNzJhMTkuOTY4IDE5Ljk2OCAwIDAgMS0yMC4yODgtMTkuNTg0YzAtMTAuODE2IDkuMDg4LTE5LjUyIDIwLjI4OC0xOS41MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01MyIgdW5pY29kZT0iJiM1OTAyODsiIGQ9Ik01MTIgNzY4YTM4NCAzODQgMCAxIDEgMC03NjhBMzg0IDM4NCAwIDAgMSA1MTIgNzY4eiBtMC02ODIuNjg4YTI5OC42ODggMjk4LjY4OCAwIDEgMCAwIDU5Ny4zNzYgMjk4LjY4OCAyOTguNjg4IDAgMCAwIDAtNTk3LjM3NnogbTAgNDY5LjMxMmExNzAuNjg4IDE3MC42ODggMCAxIDAgMC0zNDEuMzEyIDE3MC42ODggMTcwLjY4OCAwIDAgMCAwIDM0MS4zMTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iU2hhcGUtNTQiIHVuaWNvZGU9IiYjNTkwMjk7IiBkPSJNNTE3LjQ0IDY5OS4wNzJjLTg0LjA5NiAwLTE0OS41NjgtOTUuMTA0LTE3NS4xMDQtMTI1LjQ0YTMzLjc5MiAzMy43OTIgMCAwIDEtNy41NTItMjIuMDh2LTMwMy4yMzJhMzAuMzM2IDMwLjMzNiAwIDAgMSA0OS42LTI0LjgzMiAyMDYuNzIgMjA2LjcyIDAgMCAwIDEzMy4wNTYgODAuNjRjOTcuMTUyIDAgMTM0LjQtODcuNDg4IDIzNS43MTItODcuNDg4YTM2My45NjggMzYzLjk2OCAwIDAgMSAxODguMTYgNzUuMDcyYzguNzY4IDYuNDY0IDEzLjg4OCAxNi43MDQgMTMuNzYgMjcuNTg0VjY2OC4xNmEzMC4zMzYgMzAuMzM2IDAgMCAxLTQyLjc1MiAzMC45NzYgMzk2LjM1MiAzOTYuMzUyIDAgMCAwLTE1OS4xNjgtNzMuMDI0Yy0xMDEuMzEyLTEuNDA4LTEzNC40IDczLjAyNC0yMzUuNzEyIDczLjAyNHogbS0yODYuMDgtNjguOTI4YTY4LjkyOCA2OC45MjggMCAxIDAgMCAxMzcuODU2IDY4LjkyOCA2OC45MjggMCAwIDAgMC0xMzcuODU2eiBtMzQuNDk2LTY4LjkyOFYtOTIuMTZhMzQuNDk2IDM0LjQ5NiAwIDAgMC02OC45MjggMFY1NjEuMjhhMzQuNDk2IDM0LjQ5NiAwIDAgMCA2OC45MjggMHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01NSIgdW5pY29kZT0iJiM1OTAzMDsiIGQ9Ik00NzQuMjQxMDYyIDc2OC42Nzg3ODFoLTEzNC4zOTYyMmEzMS43NDMxMDcgMzEuNzQzMTA3IDAgMCAwLTIxLjQzOTM5NyA2LjQ2MzgxOCAzNC4yMzkwMzcgMzQuMjM5MDM3IDAgMCAwLTEwLjQzMTcwNyAxNi40NDc1MzhjLTEuOTgzOTQ0IDYuNTkxODE1LTMuMDA3OTE1IDE0LjA3OTYwNC0zLjAwNzkxNSAyMi4zOTkzN3MwLjYzOTk4MiAxNi4wNjM1NDggMi4wNDc5NDIgMjMuMzU5MzQzYzAuNjM5OTgyIDcuMjk1Nzk1IDEuOTE5OTQ2IDE1LjI5NTU3IDMuOTY3ODg5IDIzLjg3MTMyOEE3My41OTc5MyA3My41OTc5MyAwIDAgMCAzMTkuMzY1NDE4IDg4My4xNzE1NjFhMjYuNTU5MjUzIDI2LjU1OTI1MyAwIDAgMCAxNC4zOTk1OTUgMTEuOTY3NjYzYzYuMDE1ODMxIDEuOTgzOTQ0IDEzLjMxMTYyNiAwLjMxOTk5MSAyMS45NTEzODItNC45OTE4NTkgOS45MTk3MjEtNS45NTE4MzMgMjEuMTgzNDA0LTEyLjQxNTY1MSAzMy43OTEwNS0xOS4zOTE0NTUgMTIuNjA3NjQ1LTYuOTc1ODA0IDI0Ljg5NTMtMTMuOTUxNjA4IDM2Ljg2Mjk2My0yMC45Mjc0MTEgMTEuOTAzNjY1LTYuOTExODA2IDIzLjAzOTM1Mi0xMy4yNDc2MjcgMzMuMjc5MDY0LTE4Ljg3OTQ2OSAxMC4zMDM3MS01LjYzMTg0MiAxOC4xMTE0OTEtMTAuMTExNzE2IDIzLjQyMzM0Mi0xMy40Mzk2MjIgNi42NTU4MTMtNC42NzE4NjkgMTEuNTgzNjc0LTkuNzkxNzI1IDE0LjkxMTU4LTE1LjQyMzU2N3M0LjY3MTg2OS0xMC45NDM2OTIgMy45Njc4ODktMTUuOTM1NTUxLTMuMjYzOTA4LTkuMDg3NzQ0LTcuOTM1Nzc3LTEyLjQxNTY1MWEzMy45MTkwNDYgMzMuOTE5MDQ2IDAgMCAwLTE5LjgzOTQ0Mi00Ljk5MTg2eiBtNzcuNTY1ODE4IDEuMDIzOTcxaDEzMy4zNzIyNDlhMzEuNzQzMTA3IDMxLjc0MzEwNyAwIDAgMSAyMS4zNzUzOTkgNi4zOTk4MiAzNC4yMzkwMzcgMzQuMjM5MDM3IDAgMCAxIDEwLjQzMTcwNyAxNi40NDc1MzhjMi4wNDc5NDIgNi42NTU4MTMgMy4wMDc5MTUgMTQuMDc5NjA0IDMuMDA3OTE1IDIyLjM5OTM3cy0wLjMxOTk5MSAxNi4xMjc1NDYtMC45NTk5NzMgMjMuNDIzMzQxYTEzNjEuODgxNjk3IDEzNjEuODgxNjk3IDAgMCAxLTQuNDc5ODc0IDIzLjM1OTM0M0E2NS4yNzgxNjQgNjUuMjc4MTY0IDAgMCAxIDcwNi41NTQ1MjggODgzLjE3MTU2MWEyNi41NTkyNTMgMjYuNTU5MjUzIDAgMCAxLTE0LjM5OTU5NSAxMS45Njc2NjNjLTYuMDE1ODMxIDEuOTgzOTQ0LTEzLjMxMTYyNiAwLjYzOTk4Mi0yMS44ODczODQtMy45Njc4ODgtOS45ODM3MTktNi4wMTU4MzEtMjEuMjQ3NDAyLTEyLjQ3OTY0OS0zMy45MTkwNDYtMTkuMzkxNDU1cy0yNC45NTkyOTgtMTMuOTUxNjA4LTM3LjI0Njk1My0yMC45Mjc0MTFjLTEyLjI4NzY1NC02Ljk3NTgwNC0yMy41NTEzMzgtMTMuMjQ3NjI3LTMzLjg1NTA0OC0xOC44Nzk0NjktMTAuMjM5NzEyLTUuNjk1ODQtMTcuNzI3NTAxLTEwLjE3NTcxNC0yMi4zOTkzNy0xMy40Mzk2MjItNy4yOTU3OTUtNC42NzE4NjktMTIuNjA3NjQ1LTkuNzkxNzI1LTE1LjkzNTU1MS0xNS40MjM1NjZzLTQuNjA3ODctMTAuOTQzNjkyLTMuOTY3ODg5LTE1Ljk5OTU1IDMuMzI3OTA2LTkuMDg3NzQ0IDcuOTM1Nzc3LTEyLjQxNTY1MSAxMS42NDc2NzItNC45Mjc4NjEgMjAuOTI3NDExLTQuOTI3ODYyek00NjAuMjg5NDU0IDcwMy45NzY2MDFoLTI4OC42MzE4ODJjLTIxLjI0NzQwMiAwLTM1LjAwNzAxNS0zLjQ1NTkwMy00MS4zNDI4MzctMTAuNDMxNzA3LTYuMjcxODI0LTYuOTc1ODA0LTkuNDA3NzM1LTE4LjA0NzQ5Mi05LjQwNzczNi0zMy4yNzkwNjR2LTg3LjY3NzUzNGMwLTE2LjU3NTUzNCAzLjQ1NTkwMy0yOC43OTkxOSAxMC40MzE3MDctMzYuNzk4OTY1IDYuOTc1ODA0LTcuOTM1Nzc3IDIwLjczNTQxNy0xMS45MDM2NjUgNDEuMjc4ODM5LTExLjkwMzY2NWgyODcuNjA3OTExeiBtMTA4LjQxMjk1MSAwaDI4NC42NjM5OTRjMjEuMjQ3NDAyIDAgMzUuNjQ2OTk3LTQuMTU5ODgzIDQzLjI2Mjc4My0xMi40MTU2NTEgNy42Nzk3ODQtOC4zMTk3NjYgMTEuNTE5Njc2LTIwLjA5NTQzNSAxMS41MTk2NzYtMzUuMzI3MDA3di04NS41NjU1OTNjMC0xNS45OTk1NS0zLjUxOTkwMS0yNy43MTEyMjEtMTAuNDk1NzA0LTM1LjM5MTAwNS02Ljk3NTgwNC03LjYxNTc4Ni0yMC43MzU0MTctMTEuMzkxNjgtNDEuMjc4ODQtMTEuMzkxNjc5SDU2OC43MDI0MDV6TTQ2MC4yMjU0NTYgNDcxLjA4NzE1MUgxNTQuNjk4MDQ5di0zNzYuMTgxNDJjMC0zMy43OTEwNSA5LjU5OTczLTYwLjAzMDMxMiAyOC44NjMxODgtNzguNTg5NzkgMTkuMjYzNDU4LTE4LjU1OTQ3OCA0OS4wODY2MTktMjcuOTAzMjE1IDg5LjU5NzQ4LTI3LjkwMzIxNUg0NjAuMTYxNDU4eiBtMTA4LjQ3Njk0OSAwaDMwNC41Njc0MzR2LTM3My4xNzM1MDVjLTAuNjM5OTgyLTMzLjg1NTA0OC0xMC4yMzk3MTItNjAuNTQyMjk3LTI4Ljg2MzE4OC04MC4xMjU3NDYtMTguNTU5NDc4LTE5LjU4MzQ0OS00OC4xMjY2NDYtMjkuMzc1MTc0LTg4LjU3MzUwOS0yOS4zNzUxNzRINTY4LjcwMjQwNXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTaGFwZS01NiIgdW5pY29kZT0iJiM1OTAzMTsiIGQ9Ik05MTUuMiA3NjUuMzEyYTI5LjQ0IDI5LjQ0IDAgMCAxLTIxLjg4OCAyMS45NTJBNDkzLjE4NCA0OTMuMTg0IDAgMCAxIDM4NC43MDQgNTk5LjA0YTI5Ljc2IDI5Ljc2IDAgMCAwLTE2Ljk2LTExLjMyOCAzODUuNiAzODUuNiAwIDAgMS0xNzkuOTY4LTEwMi4yNzIgMzk0LjA0OCAzOTQuMDQ4IDAgMCAxLTYwLjQxNi03Ny42OTZjLTE0LjI3Mi0yNC4wNjQgMTAuMTEyLTUyLjQ4IDM2LjM1Mi00Mi43NTJhMzgxLjUwNCAzODEuNTA0IDAgMCAwIDEzMi4xNiAyMi44NDhjLTAuNjQtMy45MDQtMS41MzYtNy44MDgtMi4xMTItMTEuNzEyQTE5ODcuMzI4IDE5ODcuMzI4IDAgMCAxIDM5NC44OCAyNjYuODhhMTk4MS45NTIgMTk4MS45NTIgMCAwIDEgMTA5LjI0OC0xMDEuMTJjMy44NCAwLjUxMiA3LjgwOCAxLjQwOCAxMS43MTIgMi4wNDggMC00Ni4wOC03LjU1Mi05MC43NTItMjIuODQ4LTEzMi4xNi05LjY2NC0yNi4yNCAxOC42ODgtNTAuNjI0IDQyLjc1Mi0zNi4zNTIgMjguMjg4IDE2Ljc2OCA1NC40IDM3LjEyIDc3LjY5NiA2MC40MTZhMzg1LjY2NCAzODUuNjY0IDAgMCAxIDEwMi4yNzIgMTc5Ljk2OCAyOS44MjQgMjkuODI0IDAgMCAwIDExLjI2NCAxNi45NiA0OTMuMjQ4IDQ5My4yNDggMCAwIDEgMTg4LjI4OCA1MDguNjA4eiBtLTIwMC45Ni0zMjAuMTI4YTk5Ljc3NiA5OS43NzYgMCAxIDAtMTQxLjA1NiAxNDEuMTIgOTkuNzc2IDk5Ljc3NiAwIDAgMCAxNDEuMTItMTQxLjEyek0yMjQuNTc2IDIyOC42NzJjLTMwLjI3Mi0zMC4yMDgtMTU4LjQ2NC0yMTcuNi0xMjEuOTg0LTI1NC4wOCAzNi40OC0zNi40OCAyMjMuODcyIDkxLjcxMiAyNTQuMDggMTIxLjkyIDMwLjI3MiAzMC4yNzIgMjUuMjE2IDg0LjM1Mi0xMS4zMjggMTIwLjgzMi0zNi40OCAzNi40OC05MC41NiA0MS42LTEyMC43NjggMTEuMzI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU3IiB1bmljb2RlPSImIzU5MDMyOyIgZD0iTTMwNS4yOCA4MzJDMjI0LjY0IDgzMiAxMjggNzg3LjU4NCAxMjggNjY3Ljk2OFYxMTUuMnMwLTU5LjcxMiA1OS4wNzItNTkuNzEydi01OS43NzZzMC01OS43MTIgNTkuMDcyLTU5LjcxMiA1OS4wNzIgNTkuNzEyIDU5LjA3MiA1OS43MTJ2NTkuNzc2aDQxMy41Njh2LTU5Ljc3NnMwLTU5LjcxMiA1OS4wNzItNTkuNzEyIDU5LjA3MiA1OS43MTIgNTkuMDcyIDU5LjcxMnY1OS43NzZzNTkuMDcyIDAgNTkuMDcyIDU5LjcxMlY2NjcuOTY4Qzg5NiA3OTAuMjA4IDgyMy4wNCA4MzIgNzQyLjQgODMyek0zMjAgNzQyLjRoMzg0YzguMTkyIDAgMTQuNzItNi42NTYgMTQuNzItMTQuOTEyIDAtOC4zMi02LjUyOC0xNC45NzYtMTQuNzItMTQuOTc2SDMyMGExNC44NDggMTQuODQ4IDAgMCAwLTE0LjcyIDE0Ljk3NmMwIDguMjU2IDYuNTI4IDE0LjkxMiAxNC43MiAxNC45MTJ6TTI0Ni4xNDQgNjUyLjhoNTMxLjcxMmM1OS4wNzIgMCA1OS4wNzItNTcuNzI4IDU5LjA3Mi01Ny43Mjh2LTE4MS4xODRzMC01OS43NzYtNTkuMDcyLTU5Ljc3NkgyNDYuMTQ0Yy01OS4wNzIgMC01OS4wNzIgNTkuNzc2LTU5LjA3MiA1OS43NzZ2MTc5LjJzMCA1OS43MTIgNTkuMDcyIDU5LjcxMnogbTAtNDE4LjExMmMzMi42NCAwIDU5LjA3Mi0yNi43NTIgNTkuMDcyLTU5Ljc3NnMtMjYuNDMyLTU5LjcxMi01OS4wNzItNTkuNzEyLTU5LjA3MiAyNi43NTItNTkuMDcyIDU5LjcxMiAyNi40MzIgNTkuNzc2IDU5LjA3MiA1OS43NzZ6IG01MzEuNzEyIDBjMzIuNjQgMCA1OS4wNzItMjYuNzUyIDU5LjA3Mi01OS43NzZzLTI2LjQzMi01OS43MTItNTkuMDcyLTU5LjcxMi01OS4wNzIgMjYuNzUyLTU5LjA3MiA1OS43MTIgMjYuNDMyIDU5Ljc3NiA1OS4wNzIgNTkuNzc2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU4IiB1bmljb2RlPSImIzU5MDMzOyIgZD0iTTk2MCA0MTguODhhMTA0LjQ0OCAxMDQuNDQ4IDAgMCAxLTc5LjIzMiAxMDEuMjQ4bC05NS44MDggMjI2LjI0QTM0LjQzMiAzNC40MzIgMCAwIDEgNzUzLjIxNiA3NjhIMjcwLjc4NGEzNC40MzIgMzQuNDMyIDAgMCAxLTMwLjMzNi0xOS41MkwxNDMuMjMyIDUyMC44MzJBMTA0LjQ0OCAxMDQuNDQ4IDAgMCAxIDY0IDQxOC44OHYtMjQ0LjM1Mmg2OC45Mjh2LTY5Ljc2YzAtMzguNTkyIDMwLjg0OC02OS44ODggNjguOTI4LTY5Ljg4OHM2OC45MjggMzEuMjk2IDY4LjkyOCA2OS44MjR2NjkuODI0aDQ4Mi40MzJ2LTY5Ljc2YzAtMzguNTkyIDMwLjg0OC02OS44ODggNjguOTI4LTY5Ljg4OHM2OC45MjggMzEuMjk2IDY4LjkyOCA2OS44MjR2NjkuODI0SDk2MHpNMjkxLjQ1NiA2OTguMjRoNDQxLjA4OGw3Mi4zMi0xNzQuNTI4SDIxOS4xMzZ6IG0tODkuNi00MTguODhhNjkuMzc2IDY5LjM3NiAwIDAgMC02OC45MjggNjkuNzZjMCAzOC41OTIgMzAuODQ4IDY5LjgyNCA2OC45MjggNjkuODI0czY4LjkyOC0zMS4yMzIgNjguOTI4LTY5Ljc2YzAtMzguNTkyLTMwLjg0OC02OS44MjQtNjguOTI4LTY5LjgyNHogbTYyMC4yODggMGE2OS4zNzYgNjkuMzc2IDAgMCAwLTY4LjkyOCA2OS43NmMwIDM4LjU5MiAzMC44NDggNjkuODI0IDY4LjkyOCA2OS44MjRzNjguOTI4LTMxLjIzMiA2OC45MjgtNjkuNzZjMC0zOC41OTItMzAuODQ4LTY5LjgyNC02OC45MjgtNjkuODI0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlNoYXBlLTU5IiB1bmljb2RlPSImIzU5MDM0OyIgZD0iTTI1NiA4MzJhNjQgNjQgMCAwIDEtNjQtNjR2LTUxMmE2NCA2NCAwIDAgMSA2NC02NGg1NzZhNjQgNjQgMCAwIDEgNjQgNjRWNzY4YTY0IDY0IDAgMCAxLTY0IDY0eiBtMTc2LTMyaDIyNC42NGExNiAxNiAwIDEgMCAwLTMySDQzMmExNiAxNiAwIDEgMCAwIDMyek0yODggNzA0SDUxMnYtMjU2SDI4OGEzMiAzMiAwIDAgMC0zMiAzMnYxOTJhMzIgMzIgMCAwIDAgMzIgMzJ6TTU3NiA3MDRoMjI0YTMyIDMyIDAgMCAwIDMyLTMydi0xOTJhMzIgMzIgMCAwIDAtMzItMzJINTc2ek0zODQgMzg0YTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMCAwIDAgMTI4eiBtMzIwIDBhNjQgNjQgMCAxIDAgMC0xMjggNjQgNjQgMCAwIDAgMCAxMjh6IG0yOC40OC0yNTUuNjE2YTMyLjI1NiAzMi4yNTYgMCAwIDEtMjcuMi00My4yNjRsMTAuODgtMjEuMTJIMzcxLjg0bDguMzIgMTcuMjhhMzIgMzIgMCAwIDEtNTguMjQgMjYuMjRsLTY0LTEyOGEzMS4xNjggMzEuMTY4IDAgMCAxLTEuOTItMTEuNTIgMzIgMzIgMCAwIDEgMzItMzIgMzEuMzYgMzEuMzYgMCAwIDEgMjcuNTIgMTYuNjR2My4ySDMyMGwxOS44NCA0NC4xNmg0MDguMzJsMTkuODQtNDQuMTZ2LTMuMmEzMS4zNiAzMS4zNiAwIDAgMSAyNy41Mi0xNi42NCAzMiAzMiAwIDAgMSAzMiAzMiAzMS4zNiAzMS4zNiAwIDAgMSAwIDE1LjM2bC02NCAxMjhhMzIgMzIgMCAwIDEtMzEuMDQgMTcuMDI0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Ik92YWwiIHVuaWNvZGU9IiYjNTkwMzU7IiBkPSJNNTEyIDM4NG0tMzIwIDBhMzIwIDMyMCAwIDEgMSA2NDAgMCAzMjAgMzIwIDAgMSAxLTY0MCAwWiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9IlJlY3RhbmdsZSIgdW5pY29kZT0iJiM1OTAzNjsiIGQ9Ik0xOTIgNzA0aDY0MHYtNjQwSDE5MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJTdGFyIiB1bmljb2RlPSImIzU5MDM3OyIgZD0iTTUxMiAxNjBsLTI2My4yOTYtMTM4LjQzMiA1MC4yNCAyOTMuMTg0LTIxMi45OTIgMjA3LjY4IDI5NC40IDQyLjgxNkw1MTIgODMybDEzMS42NDgtMjY2Ljc1MiAyOTQuNC00Mi44MTYtMjEyLjk5Mi0yMDcuNjggNTAuMjQtMjkzLjE4NHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJUcmlhbmdsZSIgdW5pY29kZT0iJiM1OTAzODsiIGQ9Ik01MTIgNzA0bDM4NC02NDBIMTI4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJlc3RvcmVkZWZhdWx0IiB1bmljb2RlPSImIzU5MDQwOyIgZD0iTTg4MC44Njc1NTYgMzI1LjQwNDQ0NGEzNzIuNTA4NDQ0IDM3Mi41MDg0NDQgMCAwIDAtMTk4LjcxMjg4OS0xOTYuNzc4NjY2Yy00Ni4wOC0xOS4zNDIyMjItOTQuNzItMjkuMDcwMjIyLTE0NS40NjQ4ODktMjkuMDcwMjIydjcxLjczNjg4OGMxNjUuNzE3MzMzIDAgMzAwLjk0MjIyMiAxMzMuNjg4ODg5IDMwMC45NDIyMjIgMjk4LjA0MDg4OXMtMTM0LjgyNjY2NyAyOTguMDQwODg5LTMwMC43MTQ2NjcgMjk4LjA0MDg4OWMtMTY1Ljg4OCAwLTMwMC44ODUzMzMtMTMzLjY4ODg4OS0zMDAuODg1MzMzLTI5OC4wNDA4ODkgMC0zMS40MDI2NjcgNC44MzU1NTYtNjIuMDA4ODg5IDE0LjM5Mjg4OS05MS4yNDk3NzdsNjguMjY2NjY3IDM3LjQzMjg4OC0yLjEwNDg4OS0xMTUuOTk2NDQ0LTIuMTA0ODg5LTExNS45OTY0NDQtMTAwLjM1MiA1OS43OTAyMjJMMTEzLjc3Nzc3OCAzMDMuMjE3Nzc4bDcyLjI0ODg4OSAzOS41OTQ2NjZBMzY0LjIwMjY2NyAzNjQuMjAyNjY3IDAgMCAwIDE2My42NjkzMzMgNDY5LjMzMzMzM2MwIDQ5Ljg5MTU1NiA5Ljg5ODY2NyA5OC4zNjA4ODkgMjkuMzU0NjY3IDE0My45Mjg4ODlBMzcyLjIyNCAzNzIuMjI0IDAgMCAwIDM5MS42MjMxMTEgODEwLjA5Nzc3OCAzNzQuMTAxMzMzIDM3NC4xMDEzMzMgMCAwIDAgNTM2LjkxNzMzMyA4MzkuMTExMTExYTM3NC4wNDQ0NDQgMzc0LjA0NDQ0NCAwIDAgMCAyNjMuOTY0NDQ1LTEwOC4zMTY0NDQgMzY4LjI5ODY2NyAzNjguMjk4NjY3IDAgMCAwIDc5Ljk4NTc3OC0xMTcuNTMyNDQ1YzE5LjUxMjg4OS00NS41NjggMjkuMzU0NjY3LTk0LjAzNzMzMyAyOS4zNTQ2NjYtMTQzLjkyODg4OXMtOS44OTg2NjctOTguMzYwODg5LTI5LjM1NDY2Ni0xNDMuOTI4ODg5ek05Ni43MTExMTEtMjUuNmg4MzAuNTc3Nzc4YTM5LjgyMjIyMiAzOS44MjIyMjIgMCAwIDAgMzkuODIyMjIyLTM5LjgyMjIyMnYtNS42ODg4ODlhMzkuODIyMjIyIDM5LjgyMjIyMiAwIDAgMC0zOS44MjIyMjItMzkuODIyMjIySDk2LjcxMTExMUEzOS44MjIyMjIgMzkuODIyMjIyIDAgMCAwIDU2Ljg4ODg4OS03MS4xMTExMTF2NS42ODg4ODlhMzkuODIyMjIyIDM5LjgyMjIyMiAwIDAgMCAzOS44MjIyMjIgMzkuODIyMjIyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InVwbG9hZGluZyIgdW5pY29kZT0iJiM1OTA0MTsiIGQ9Ik03ODQgMTE1LjJhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00OCA0OC44OTZjMCAyNi45NDQgMjEuNTA0IDQ4LjgzMiA0OCA0OC44MzIgNzkuNTUyIDAgMTQ0IDY1LjY2NCAxNDQgMTQ2LjYyNGExNDcuMjY0IDE0Ny4yNjQgMCAwIDEtNTguMTc2IDExNy41MDRsLTAuNjQgMC41MTJhMTQ4LjY3MiAxNDguNjcyIDAgMCAxLTkuNiA2LjU5MmwtMS40NzIgMC45NmExNDYuODE2IDE0Ni44MTYgMCAwIDEtOS40NzIgNS4zMTJsLTIuNjg4IDEuMjhhMTUwLjcyIDE1MC43MiAwIDAgMS04Ljk2IDQuMDk2bC00LjAzMiAxLjQ3MmExNDcuMDA4IDE0Ny4wMDggMCAwIDEtOC4zMiAyLjg4Yy0xLjg1NiAwLjU3Ni0zLjcxMiAwLjk2LTUuNjMyIDEuNDcyLTIuNDMyIDAuNjQtNC44NjQgMS4yOC03LjI5NiAxLjc5Mi0yLjU2IDAuNTEyLTUuMjQ4IDAuODMyLTcuOTM2IDEuMjE2LTEuOTIgMC4yNTYtMy43NzYgMC42NC01LjY5NiAwLjgzMmExNDQuNTEyIDE0NC41MTIgMCAwIDEtMTQuMDggMC43MDRjLTEuNDcyIDAtMi45NDQtMC4xOTItNC40OC0wLjE5MmEyNzEuOTM2IDI3MS45MzYgMCAwIDEtNS40NCAyNC41NzZjLTAuNTEyIDEuOTg0LTEuMjggMy44NC0xLjg1NiA1LjgyNGEyNzQuMDQ4IDI3NC4wNDggMCAwIDEtNS43NiAxOC4xMTJjLTAuNjQgMS43OTItMS41MzYgMy41Mi0yLjE3NiA1LjMxMmEyOTQuNTI4IDI5NC41MjggMCAwIDEtNy42MTYgMTcuNzkyYy0wLjY0IDEuNDA4LTEuNDA4IDIuNzUyLTIuMTEyIDQuMDk2YTI4NC4yMjQgMjg0LjIyNCAwIDAgMS05LjYgMTcuOTJDNjk3LjUzNiA2ODAuMjU2IDYxMS4xMzYgNzM0LjI3MiA1MTIgNzM0LjI3MnMtMTg1LjQ3Mi01NC4wOC0yMzIuOTYtMTM0LjY1NmMtMy40NTYtNS44MjQtNi41OTItMTEuODQtOS42LTE3LjkyLTAuNjQtMS4zNDQtMS40NzItMi42ODgtMi4xMTItNC4wOTYtMi43NTItNS43Ni01LjI0OC0xMS43NzYtNy42MTYtMTcuNzkyLTAuNjQtMS43OTItMS40NzItMy41Mi0yLjExMi01LjMxMmEyNzQuMDQ4IDI3NC4wNDggMCAwIDEtNS44MjQtMTguMTEybC0xLjg1Ni01Ljc2YTI3MS40MjQgMjcxLjQyNCAwIDAgMS01LjQ0LTI0LjY0Yy0xLjUzNiAwLTMuMDA4IDAuMTkyLTQuNDggMC4xOTItNC44IDAtOS40NzItMC4yNTYtMTQuMDgtMC43MDQtMS45Mi0wLjE5Mi0zLjg0LTAuNTc2LTUuNzYtMC44MzItMi41Ni0wLjM4NC01LjI0OC0wLjcwNC03Ljg3Mi0xLjI4LTIuNDk2LTAuNDQ4LTQuODY0LTEuMDg4LTcuMjk2LTEuNzI4LTEuOTItMC41MTItMy44NC0wLjg5Ni01LjY5Ni0xLjQ3MmExNDcuMzkyIDE0Ny4zOTIgMCAwIDEtOC4zMi0yLjg4bC0zLjk2OC0xLjQ3MmMtMy4wNzItMS4yOC02LjA4LTIuNTYtOC45Ni00LjAzMmwtMi42ODgtMS4yOGMtMy4yLTEuNjY0LTYuNC0zLjQ1Ni05LjQwOC01LjM3NmwtMS41MzYtMC45NmExNTIuMDY0IDE1Mi4wNjQgMCAwIDEtOS42LTYuNTkybC0wLjY0LTAuNTEyQTE0Ny4zMjggMTQ3LjMyOCAwIDAgMSA5NiAzNTkuNTUyYzAtODAuOTYgNjQuNDQ4LTE0Ni41NiAxNDQtMTQ2LjU2IDI2LjQ5NiAwIDQ4LTIxLjk1MiA0OC00OC44OTZhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00OC00OC44OTZDMTA3LjQ1NiAxMTUuMiAwIDIyNC42NCAwIDM1OS41NTJjMCAxMTAuMDggNzEuNTUyIDIwMy4xMzYgMTY5Ljg1NiAyMzMuNzI4QzIyMy4yMzIgNzMyLjggMzU1Ljk2OCA4MzIgNTEyIDgzMnMyODguNzY4LTk5LjIgMzQyLjIwOC0yMzguNzJDOTUyLjQ0OCA1NjIuNjg4IDEwMjQgNDY5LjYzMiAxMDI0IDM1OS41NTJjMC0xMzQuOTEyLTEwNy40NTYtMjQ0LjM1Mi0yNDAtMjQ0LjM1MnogbS00NTEuNjQ4IDExNC4xNzZ2MC4wNjRjMC4xMjggMCAwLjEyOCAwLjA2NCAwLjEyOCAwLjEyOEw0NzYuMzUyIDM5Mi4zMmwwLjEyOC0wLjEyOEE0Ny4zNiA0Ny4zNiAwIDAgMCA1MTIgNDA4LjQ0OGMxNC4xNDQgMCAyNi43NTItNi40IDM1LjU4NC0xNi4zMmwwLjA2NCAwLjEyOCAxNDMuODcyLTE2Mi42ODh2LTAuMDY0bDAuMTI4LTAuMTI4YzYuNzItNy42MTYgMTEuMTM2LTE3LjI4IDEyLjE2LTI4LjAzMnYtMC4xMjhhNDguNDQ4IDQ4LjQ0OCAwIDAgMC00Ny44MDgtNTMuNDRoLTEuNTM2bC0wLjk2IDAuMDY0LTEuMDI0IDAuMDY0LTEuNiAwLjE5MmgtMC41MTJsLTIuMTEyIDAuMzJhNDcuNjE2IDQ3LjYxNiAwIDAgMC0yNy45MDQgMTUuNTUybC02MC4zNTIgNjguMjI0di0yNDcuMjk2QTQ4LjQ0OCA0OC40NDggMCAwIDAgNTEyLTY0YTQ4LjQ0OCA0OC40NDggMCAwIDAtNDggNDguODk2djI0Ny4yOTZsLTYwLjM1Mi02OC4yMjRhNDcuNDI0IDQ3LjQyNCAwIDAgMC0yNy44NC0xNS40ODhjLTAuNzA0LTAuMTkyLTEuNDA4LTAuMjU2LTIuMTEyLTAuMzJhMTAuNjI0IDEwLjYyNCAwIDAgMC0wLjY0LTAuMDY0bC0xLjUzNi0wLjE5MkgzNzAuNTZsLTAuODk2LTAuMDY0SDM2OGE0Ny44NzIgNDcuODcyIDAgMCAwLTQyLjI0IDI1LjUzNiA0OS4yOCA0OS4yOCAwIDAgMCA2LjU5MiA1NnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJlcnJvciIgdW5pY29kZT0iJiM1OTAzOTsiIGQ9Ik01MTItMTI4QTUxMiA1MTIgMCAxIDAgNTEyIDg5NmE1MTIgNTEyIDAgMCAwIDAtMTAyNHogbTAgMjI3LjU4NEE1Ni45MTczMzMgNTYuOTE3MzMzIDAgMSAxIDUxMiAyMTMuMzMzMzMzYTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEgMC0xMTMuNzQ5MzMzeiBtMCA1NjguODMyYTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEtNTYuOTE3MzMzLTU2LjgzMnYtMjg0LjUwMTMzM2E1Ni45MTczMzMgNTYuOTE3MzMzIDAgMCAxIDExMy44MzQ2NjYgMFY2MTEuNTg0QTU2LjkxNzMzMyA1Ni45MTczMzMgMCAwIDEgNTEyIDY2OC40MTZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iem9vbWluIiB1bmljb2RlPSImIzU5MDQyOyIgZD0iTTU4NS4xNDI4NTcgNDU3LjE0Mjg1N2gzNjUuNzE0Mjg2di0xNDYuMjg1NzE0SDU4NS4xNDI4NTd2LTM2NS43MTQyODZINDM4Ljg1NzE0M1YzMTAuODU3MTQzSDczLjE0Mjg1N1Y0NTcuMTQyODU3aDM2NS43MTQyODZWODIyLjg1NzE0M2gxNDYuMjg1NzE0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Inpvb21vdXQiIHVuaWNvZGU9IiYjNTkwNDM7IiBkPSJNNzMuMTQyODU3IDQ1Ny4xNDI4NTdoODc3LjcxNDI4NnYtMTQ2LjI4NTcxNEg3My4xNDI4NTd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZmlyc3QiIHVuaWNvZGU9IiYjNTkwNDQ7IiBkPSJNMjg0LjQ0NDQ0NCA2MTEuNTU1NTU2aDU2Ljg4ODg4OXYtNTEySDI4NC40NDQ0NDR6IG00MjYuNDk2LTUxMS4zMTczMzRhMjkuNDExNTU2IDI5LjQxMTU1NiAwIDAgMC0xOC4yMDQ0NDQgNi40Mjg0NDVMNDEwLjYyNCAzMzMuNDgyNjY3YTI5LjEyNzExMSAyOS4xMjcxMTEgMCAwIDAgMCA0NS4zNDA0NDRsMjgwLjgwMzU1NiAyMjUuNjc4MjIyYTI5LjA3MDIyMiAyOS4wNzAyMjIgMCAwIDAgMzYuNDA4ODg4LTQ1LjM0MDQ0NGwtMjUyLjU4NjY2Ni0yMDIuOTc5NTU2IDI1My44MzgyMjItMjA0LjIzMTExMWEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NC01MS43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibmV4dCIgdW5pY29kZT0iJiM1OTA0NTsiIGQ9Ik0zNzAuNDAzNTU2IDEwMC45MjA4ODg5OTk5OTk5OWEyOS40MTE1NTYgMjkuNDExNTU2IDAgMCAxIDE4LjIwNDQ0NCA2LjQyODQ0NGwyODIuMDU1MTExIDIyNi44MTZhMjkuMTI3MTExIDI5LjEyNzExMSAwIDAgMSAwIDQ1LjM0MDQ0NUwzODkuODU5NTU2IDYwNS4xMjcxMTFhMjkuMDcwMjIyIDI5LjA3MDIyMiAwIDAgMS0zNi40MDg4ODktNDUuMjgzNTU1bDI1Mi41ODY2NjYtMjAyLjk3OTU1Ni0yNTMuODM4MjIyLTIwNC4yMzExMTFhMjkuMDcwMjIyIDI5LjA3MDIyMiAwIDAgMSAxOC4yMDQ0NDUtNTEuNzEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Imxhc3QiIHVuaWNvZGU9IiYjNTkwNDY7IiBkPSJNNzA5LjUxODIyMiA2MTEuNTU1NTU2YTI4LjQ0NDQ0NCAyOC40NDQ0NDQgMCAwIDAgMjguNDQ0NDQ1LTI4LjQ0NDQ0NXYtNDU1LjExMTExMWEyOC40NDQ0NDQgMjguNDQ0NDQ0IDAgMSAwLTU2Ljg4ODg4OSAwdjQ1NS4xMTExMTFhMjguNDQ0NDQ0IDI4LjQ0NDQ0NCAwIDAgMCAyOC40NDQ0NDQgMjguNDQ0NDQ1eiBtLTM5NS45NDY2NjYtNTExLjMxNzMzNGEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NSA1MS43MTJsMjUzLjgzODIyMiAyMDQuMjMxMTExLTI1Mi41ODY2NjYgMjAyLjk3OTU1NmEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwIDM2LjM1MiA0NS4zNDA0NDRsMjgwLjgwMzU1NS0yMjUuNjc4MjIyYTI5LjAxMzMzMyAyOS4wMTMzMzMgMCAwIDAgMC00NS4zNDA0NDRsLTI4MS45OTgyMjItMjI2LjgxNmEyOS40MTE1NTYgMjkuNDExNTU2IDAgMCAwLTE4LjIwNDQ0NC02LjQyODQ0NXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJwcmV2IiB1bmljb2RlPSImIzU5MDQ3OyIgZD0iTTY1Mi40NTg2NjcgMTAwLjkyMDg4ODk5OTk5OTk5YTI5LjQxMTU1NiAyOS40MTE1NTYgMCAwIDAtMTguMjA0NDQ1IDYuNDI4NDQ0TDM1Mi4xNDIyMjIgMzM0LjE2NTMzMzAwMDAwMDAzYTI5LjEyNzExMSAyOS4xMjcxMTEgMCAwIDAgMCA0NS4zNDA0NDVsMjgwLjgwMzU1NiAyMjUuNjIxMzMzYTI5LjA3MDIyMiAyOS4wNzAyMjIgMCAwIDAgMzYuNDA4ODg5LTQ1LjI4MzU1NWwtMjUyLjU4NjY2Ny0yMDIuOTc5NTU2IDI1My44MzgyMjItMjA0LjIzMTExMWEyOS4wNzAyMjIgMjkuMDcwMjIyIDAgMCAwLTE4LjIwNDQ0NC01MS43MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icG9pLWxvYWQiIHVuaWNvZGU9IiYjNTkwNDg7IiBkPSJNMjEyLjMzMzcxNCA1NjYuODU3MTQzaDQzOC4zNDUxNDNjMjEuOTQyODU3IDAgMzYuNTcxNDI5IDE0LjYyODU3MSAzNi41NzE0MjkgMzYuNTcxNDI4cy0xNC42Mjg1NzEgMzYuNTcxNDI5LTM2LjU3MTQyOSAzNi41NzE0MjlIMjEyLjMzMzcxNGMtMjEuOTQyODU3IDAtMzYuNTcxNDI5LTE0LjYyODU3MS0zNi41NzE0MjgtMzYuNTcxNDI5czE0LjYyODU3MS0zNi41NzE0MjkgMzYuNTcxNDI4LTM2LjU3MTQyOHpNNjg3LjI1MDI4NiAzODRjMCAyMS45NDI4NTctMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjkgMzYuNTcxNDI5SDIxMi4zMzM3MTRjLTIxLjk0Mjg1NyAwLTM2LjU3MTQyOS0xNC42Mjg1NzEtMzYuNTcxNDI4LTM2LjU3MTQyOXMxNC42Mjg1NzEtMzYuNTcxNDI5IDM2LjU3MTQyOC0zNi41NzE0MjloNDM4LjM0NTE0M2MyMS45NDI4NTcgMCAzNi41NzE0MjkgMTQuNjI4NTcxIDM2LjU3MTQyOSAzNi41NzE0Mjl6TTIxMi4zMzM3MTQgMjAxLjE0Mjg1N2MtMjEuOTQyODU3IDAtMzYuNTcxNDI5LTE0LjYyODU3MS0zNi41NzE0MjgtMzYuNTcxNDI4czE0LjYyODU3MS0zNi41NzE0MjkgMzYuNTcxNDI4LTM2LjU3MTQyOWgyNTUuNzA3NDI5YzIxLjk0Mjg1NyAwIDM2LjU3MTQyOSAxNC42Mjg1NzEgMzYuNTcxNDI4IDM2LjU3MTQyOXMtMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjggMzYuNTcxNDI4ek0xMDA4LjY0IDE1Ny4yNTcxNDNjLTE0LjU1NTQyOSAxNC42Mjg1NzEtMzYuNDk4Mjg2IDE0LjYyODU3MS01MS4wNTM3MTQgMGwtODAuNDU3MTQzLTgwLjQ1NzE0M1Y3NDkuNzE0Mjg2YzAgODAuNDU3MTQzLTY1LjY4MjI4NiAxNDYuMjg1NzE0LTE0Ni4wNjYyODYgMTQ2LjI4NTcxNEgxNDYuNTc4Mjg2QzY2LjE5NDI4NiA4OTYgMC40Mzg4NTcgODMwLjE3MTQyOSAwLjQzODg1NyA3NDkuNzE0Mjg2di03MzEuNDI4NTcyYzAtODAuNDU3MTQzIDY1LjgyODU3MS0xNDYuMjg1NzE0IDE0Ni4xMzk0MjktMTQ2LjI4NTcxNGg1MDQuMTAwNTcxYzIxLjk0Mjg1NyAwIDM2LjU3MTQyOSAxNC42Mjg1NzEgMzYuNTcxNDI5IDM2LjU3MTQyOXMtMTQuNjI4NTcxIDM2LjU3MTQyOS0zNi41NzE0MjkgMzYuNTcxNDI4SDE0Ni41NzgyODZjLTQzLjg4NTcxNCAwLTczLjA2OTcxNCAzNi41NzE0MjktNzMuMDY5NzE1IDczLjE0Mjg1N1Y3NDkuNzE0Mjg2YzAgNDMuODg1NzE0IDM2LjU3MTQyOSA3My4xNDI4NTcgNzMuMDY5NzE1IDczLjE0Mjg1N2g1ODQuNDg0NTcxYzQzLjg4NTcxNCAwIDczLjA2OTcxNC0yOS4yNTcxNDMgNzMuMDY5NzE0LTczLjE0Mjg1N3YtNjgwLjIyODU3MmwtODAuMzg0IDgwLjQ1NzE0M2MtMTQuNjI4NTcxIDE0LjYyODU3MS0zNi41NzE0MjkgMTQuNjI4NTcxLTUxLjEyNjg1NyAwLTE0LjYyODU3MS0xNC42Mjg1NzEtMTQuNjI4NTcxLTM2LjU3MTQyOSAwLTUxLjJsMTQ2LjEzOTQyOS0xNDYuMjg1NzE0czcuMzE0Mjg2LTcuMzE0Mjg2IDE0LjYyODU3MS03LjMxNDI4NmgyOS4yNTcxNDNjNy4yNDExNDMgMCA3LjI0MTE0MyA3LjMxNDI4NiAxNC41NTU0MjkgNy4zMTQyODZsMTQ2LjEzOTQyOCAxNDYuMjg1NzE0Yy03LjMxNDI4NiAxNC42Mjg1NzEtNy4zMTQyODYgNDMuODg1NzE0LTE0LjYyODU3MSA1OC41MTQyODZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icG9pLXNhdmUiIHVuaWNvZGU9IiYjNTkwNDk7IiBkPSJNODY3LjY5MzcxNCA4MjIuMjcySDIyOS40NDkxNDNjLTg2LjAxNiAwLTE1NS43OTQyODYtNjkuNzA1MTQzLTE1NS43OTQyODYtMTU1Ljc5NDI4NnYtNjM4LjY4MzQyOGMwLTg2LjA4OTE0MyA2OS43NzgyODYtMTU1Ljc5NDI4NiAxNTUuNzk0Mjg2LTE1NS43OTQyODZoNjM4LjI0NDU3MWM4Ni4wMTYgMCAxNTUuNzk0Mjg2IDY5LjcwNTE0MyAxNTUuNzk0Mjg2IDE1NS43OTQyODZWNjY2LjU1MDg1N2MwIDg2LjAxNi02OS43NzgyODYgMTU1Ljc5NDI4Ni0xNTUuNzk0Mjg2IDE1NS43OTQyODZ6IG0tNTg0Ljg1MDI4NS02OC4wMjI4NTdoNTMxLjQ1NnYtMjM3LjQ5NDg1N2MwLTMyLjEwOTcxNC0zMy4yMDY4NTctNTguMjIxNzE0LTc0LjAyMDU3Mi01OC4yMjE3MTVIMzU2Ljg2NGMtNDAuODEzNzE0IDAtNzQuMDIwNTcxIDI2LjExMi03NC4wMjA1NzEgNTguMjIxNzE1eiBtNjcyLjU0ODU3MS03MjUuOTQyODU3YzAtNDguNDkzNzE0LTM5LjIwNDU3MS04Ny42OTgyODYtODcuNzcxNDI5LTg3LjY5ODI4NkgyMjkuNTIyMjg2YTg3LjYyNTE0MyA4Ny42MjUxNDMgMCAwIDAtODcuNjk4Mjg2IDg3Ljc3MTQyOVY2NjYuNDc3NzE0YzAgNDMuNTIgMzEuNTk3NzE0IDc5LjUwNjI4NiA3Mi45OTY1NzEgODYuMDE2di0yMzYuMzI0NTcxYzAtNjkuNzA1MTQzIDYzLjcwNzQyOS0xMjYuMzE3NzE0IDE0Mi4xMTY1NzItMTI2LjMxNzcxNGgzODMuNDE0ODU3Yzc4LjQwOTE0MyAwIDE0Mi4xMTY1NzEgNTYuNjEyNTcxIDE0Mi4xMTY1NzEgMTI2LjMxNzcxNFY3NTMuMTUyYzQxLjM5ODg1Ny03LjA5NDg1NyA3Mi45OTY1NzEtNDMuMDgxMTQzIDcyLjk5NjU3Mi04Ni4wODkxNDN6TTcwNS45NzQ4NTcgNTA5LjczMjU3MWEzMy42NDU3MTQgMzMuNjQ1NzE0IDAgMCAxIDMzLjcxODg1NyAzMy43MTg4NThWNjYwLjU1MzE0M2EzMy42NDU3MTQgMzMuNjQ1NzE0IDAgMCAxLTMzLjcxODg1NyAzMy43OTIgMzQuMDg0NTcxIDM0LjA4NDU3MSAwIDAgMS0zNC4zNzcxNDMtMzMuNzkydi0xMTcuMDI4NTcyYTM0Ljc0Mjg1NyAzNC43NDI4NTcgMCAwIDEgMzQuMzc3MTQzLTMzLjc5MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJmb2xkIiB1bmljb2RlPSImIzU5MDUwOyIgZD0iTTUxMi0xMjhBNTEyIDUxMiAwIDEgMSA1MTIgODk2YTUxMiA1MTIgMCAwIDEgMC0xMDI0ek0yNzMuNTc4NjY3IDQyNC4yNzczMzNsMTk1LjQxMzMzMyAxNTguMjkzMzM0QTY3LjkyNTMzMyA2Ny45MjUzMzMgMCAwIDAgNTEyIDU5Ni45MDY2NjdjMTUuNTMwNjY3IDAgMzEuMTQ2NjY3LTQuNjkzMzMzIDQzLjAwOC0xNC4zMzZsMTk1LjQxMzMzMy0xNTguMjkzMzM0YzIzLjQ2NjY2Ny0xOS4xMTQ2NjcgMjMuNDY2NjY3LTUwLjAwNTMzMyAwLTY5LjEyYTcwLjU3MDY2NyA3MC41NzA2NjcgMCAwIDAtODUuMzMzMzMzIDBMNTEyIDQ3OS4yMzIgMzU4LjkxMiAzNTUuMTU3MzMzYTcwLjY1NiA3MC42NTYgMCAwIDAtODUuMzMzMzMzIDBjLTIzLjQ2NjY2NyAxOS4xMTQ2NjctMjMuNDY2NjY3IDUwLjAwNTMzMyAwIDY5LjEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxhYmVsLWRlbGV0ZSIgdW5pY29kZT0iJiM1OTA1MTsiIGQ9Ik04NzQuMDY5MzMzIDgxNy4xNTJINjg5LjE1MmMwIDM1LjY2OTMzMy0yNy4wNTA2NjcgNzguNjc3MzMzLTYwLjU4NjY2NyA3OC42NzczMzNINDE2LjkzODY2N2MtMzMuNDUwNjY3IDAtNjAuNTg2NjY3LTQzLjAwOC02MC41ODY2NjctNzguNjc3MzMzSDE3MS41MmMtNDAuODc0NjY3IDAtODUuODQ1MzMzLTYuMjI5MzMzLTg1Ljg0NTMzMy00OC4wNDI2Njd2LTY0Ljc2OEg5MzguNjY2NjY3djY0Ljc2OGMwIDQxLjgxMzMzMy0yMy42MzczMzMgNDguMDQyNjY3LTY0LjUxMiA0OC4wNDI2Njd6TTE2MS4wMjQgNjI4LjY1MDY2N3YtNjE2LjM2MjY2N2MwLTYyLjYzNDY2NyA2MC4wNzQ2NjctMTM5LjA5MzMzMyAxMjEuMzQ0LTEzOS4wOTMzMzNoNDgwLjc2OGM2MS4yNjkzMzMgMCAxMDEuNDYxMzMzIDc2LjQ1ODY2NyAxMDEuNDYxMzMzIDEzOS4wOTMzMzNWNjI4LjY1MDY2N3ogbTIwMi4wNjkzMzMtNjI5LjI0OGgtNzQuMDY5MzMzVjU0NC44NTMzMzNoNzQuMDY5MzMzeiBtMTg1LjM0NCAwSDQ3NC40NTMzMzNWNTQ0Ljg1MzMzM2g3My45ODR6IG0xODUuNDI5MzM0IDBoLTc0LjA2OTMzNFY1NDQuODUzMzMzSDczMy44NjY2Njd6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idXBsb2FkIiB1bmljb2RlPSImIzU5MDUyOyIgZD0iTTk1Mi4wMjc0MjkgNzYuOGMtMzIuMTgyODU3IDAtNTguMjk0ODU3IDI1LjAxNDg1Ny01OC4yOTQ4NTggNTUuODgxMTQzIDAgMzAuNzkzMTQzIDI2LjExMiA1NS44MDggNTguMjk0ODU4IDU1LjgwOCA5Ni41NDg1NzEgMCAxNzQuODExNDI5IDc1LjA0NDU3MSAxNzQuODExNDI4IDE2Ny41NzAyODZhMTY0LjEzMjU3MSAxNjQuMTMyNTcxIDAgMCAxLTcwLjU4Mjg1NyAxMzQuMjkwMjg1bC0wLjczMTQyOSAwLjU4NTE0M2ExODEuMzk0Mjg2IDE4MS4zOTQyODYgMCAwIDEtMTEuNzAyODU3IDcuNTMzNzE0bC0xLjkwMTcxNCAxLjA5NzE0M2ExODEuNjEzNzE0IDE4MS42MTM3MTQgMCAwIDEtMTEuNDEwMjg2IDYuMDcwODU3bC0zLjIxODI4NSAxLjQ2Mjg1OGExODguODU0ODU3IDE4OC44NTQ4NTcgMCAwIDEtMTAuOTcxNDI5IDQuNjgxMTQybC00LjgyNzQyOSAxLjY4MjI4NmExODYuMjIxNzE0IDE4Ni4yMjE3MTQgMCAwIDEtMTAuMDkzNzE0IDMuMjkxNDI5Yy0yLjI2NzQyOSAwLjY1ODI4Ni00LjYwOCAxLjA5NzE0My02Ljg3NTQyOCAxLjY4MjI4NS0yLjkyNTcxNCAwLjczMTQyOS01Ljg1MTQyOSAxLjQ2Mjg1Ny04Ljg1MDI4NiAyLjA0OC0zLjIxODI4NiAwLjU4NTE0My02LjQzNjU3MSAwLjk1MDg1Ny05LjY1NDg1NyAxLjM4OTcxNS0yLjI2NzQyOSAwLjI5MjU3MS00LjUzNDg1NyAwLjczMTQyOS02Ljg3NTQyOSAwLjk1MDg1N2ExODYuMzY4IDE4Ni4zNjggMCAwIDEtMTcuMTE1NDI4IDAuODA0NTcxYy0xLjgyODU3MSAwLTMuNjU3MTQzLTAuMjE5NDI5LTUuNDEyNTcyLTAuMjE5NDI4YTI5NS4yMDQ1NzEgMjk1LjIwNDU3MSAwIDAgMS02LjY1NiAyOC4wODY4NTdjLTAuNjU4Mjg2IDIuMjY3NDI5LTEuNDYyODU3IDQuMzg4NTcxLTIuMTk0Mjg2IDYuNjU2LTIuMTk0Mjg2IDcuMDIxNzE0LTQuMzg4NTcxIDEzLjg5NzE0My03LjA5NDg1NyAyMC42OTk0MjgtMC44MDQ1NzEgMi4wNDgtMS44Mjg1NzEgNC4wMjI4NTctMi42MzMxNDMgNi4wNzA4NThhMzI2LjIxNzE0MyAzMjYuMjE3MTQzIDAgMCAxLTkuMjE2IDIwLjMzMzcxNGMtMC43MzE0MjkgMS42MDkxNDMtMS43NTU0MjkgMy4xNDUxNDMtMi41NiA0LjY4MTE0M2EzMTguOTc2IDMxOC45NzYgMCAwIDEtMTEuNjI5NzE0IDIwLjQ4Yy01Ny42MzY1NzEgOTIuMTYtMTYyLjY2OTcxNCAxNTMuODkyNTcxLTI4Mi45MTY1NzEgMTUzLjg5MjU3MS0xMjAuMzIgMC0yMjUuMjgtNjEuODA1NzE0LTI4Mi45MTY1NzItMTUzLjg5MjU3MS00LjE2OTE0My02LjY1Ni03Ljk3MjU3MS0xMy41MzE0MjktMTEuNzAyODU3LTIwLjQ4LTAuNzMxNDI5LTEuNTM2LTEuNjgyMjg2LTMuMDcyLTIuNDg2ODU3LTQuNjgxMTQzYTMxNi43MDg1NzEgMzE2LjcwODU3MSAwIDAgMS05LjIxNi0yMC4zMzM3MTRjLTAuODA0NTcxLTIuMDQ4LTEuODI4NTcxLTQuMDIyODU3LTIuNjMzMTQzLTYuMDcwODU4YTMwMC4xMDUxNDMgMzAwLjEwNTE0MyAwIDAgMS03LjA5NDg1Ny0yMC42OTk0MjhsLTIuMTk0Mjg2LTYuNTgyODU3YTI5NC42MTk0MjkgMjk0LjYxOTQyOSAwIDAgMS02LjU4Mjg1Ny0yOC4xNmMtMS45MDE3MTQgMC0zLjY1NzE0MyAwLjIxOTQyOS01LjQ4NTcxNCAwLjIxOTQyOC01Ljc3ODI4NiAwLTExLjQ4MzQyOS0wLjI5MjU3MS0xNy4xMTU0MjktMC44MDQ1NzEtMi4zNDA1NzEtMC4yMTk0MjktNC42MDgtMC42NTgyODYtNi44NzU0MjgtMC45NTA4NTctMy4yMTgyODYtMC40Mzg4NTctNi40MzY1NzEtMC44MDQ1NzEtOS42NTQ4NTctMS40NjI4NTctMi45MjU3MTQtMC41MTItNS44NTE0MjktMS4yNDM0MjktOC43NzcxNDMtMS45NzQ4NTgtMi4zNDA1NzEtMC41ODUxNDMtNC42ODExNDMtMS4wMjQtNi45NDg1NzItMS42ODIyODVhMTg2LjY2MDU3MSAxODYuNjYwNTcxIDAgMCAxLTEwLjA5MzcxNC0zLjI5MTQyOWwtNC45MDA1NzEtMS42ODIyODZjLTMuNjU3MTQzLTEuNDYyODU3LTcuMzE0Mjg2LTIuOTI1NzE0LTEwLjg5ODI4Ni00LjYwOGwtMy4yMTgyODYtMS40NjI4NTdhMTczLjg2MDU3MSAxNzMuODYwNTcxIDAgMCAxLTExLjQxMDI4Ni02LjE0NGwtMS45MDE3MTQtMS4wOTcxNDNhMTg1LjU2MzQyOSAxODUuNTYzNDI5IDAgMCAxLTExLjcwMjg1Ny03LjUzMzcxNGwtMC43MzE0MjktMC41ODUxNDNhMTY0LjIwNTcxNCAxNjQuMjA1NzE0IDAgMCAxLTcwLjU4Mjg1Ny0xMzQuMjkwMjg1YzAtOTIuNTI1NzE0IDc4LjI2Mjg1Ny0xNjcuNDk3MTQzIDE3NC44MTE0MjktMTY3LjQ5NzE0MyAzMi4xODI4NTcgMCA1OC4yOTQ4NTctMjUuMDg4IDU4LjI5NDg1Ny01NS44ODExNDMgMC0zMC44NjYyODYtMjYuMTEyLTU1Ljg4MTE0My01OC4yOTQ4NTctNTUuODgxMTQzQzEzMC40ODY4NTcgNzYuOCAwIDIwMS44NzQyODYgMCAzNTYuMDU5NDI5YzAgMTI1LjgwNTcxNCA4Ni44MjA1NzEgMjMyLjE1NTQyOSAyMDYuMjYyODU3IDI2Ny4xMTc3MTRDMjcwLjk5NDI4NiA3ODIuNjI4NTcxIDQzMi4yNzQyODYgODk2IDYyMS43MTQyODYgODk2czM1MC42NDY4NTctMTEzLjM3MTQyOSA0MTUuNTI0NTcxLTI3Mi44MjI4NTdDMTE1Ni42MDggNTg4LjIxNDg1NyAxMjQzLjQyODU3MSA0ODEuODY1MTQzIDEyNDMuNDI4NTcxIDM1Ni4wNTk0MjljMC0xNTQuMTg1MTQzLTEzMC40ODY4NTctMjc5LjI1OTQyOS0yOTEuNDAxMTQyLTI3OS4yNTk0Mjl6TTQwMy41MjkxNDMgMjA3LjI4Njg1N2wwLjA3MzE0MyAwLjA3MzE0MyAwLjE0NjI4NSAwLjE0NjI4Nkw1NzguNDEzNzE0IDM5My41MDg1NzFsMC4xNDYyODYtMC4xNDYyODVhNTkuMDk5NDI5IDU5LjA5OTQyOSAwIDAgMCA4Ni4zMDg1NzEgMGwwLjE0NjI4NiAwLjE0NjI4NSAxNzQuNjY1MTQzLTE4NS45MjkxNDJ2LTAuMDczMTQzbDAuMjE5NDI5LTAuMTQ2Mjg2YzguMTE4ODU3LTguNzA0IDEzLjQ1ODI4Ni0xOS43NDg1NzEgMTQuNjI4NTcxLTMyLjAzNjU3MXYtMC4xNDYyODZhNDguNDIwNTcxIDQ4LjQyMDU3MSAwIDAgMCAwLjM2NTcxNC01LjEyYzAtMzAuOTM5NDI5LTI2LjExMi01NS45NTQyODYtNTguMjk0ODU3LTU1Ljk1NDI4NmgtMS45MDE3MTRsLTEuMTcwMjg2IDAuMDczMTQzLTEuMjQzNDI4IDAuMDczMTQzLTEuOTAxNzE1IDAuMjE5NDI4aC0wLjczMTQyOGwtMi40ODY4NTcgMC4zNjU3MTVhNTguODA2ODU3IDU4LjgwNjg1NyAwIDAgMC0zMy45MzgyODYgMTcuNzczNzE0TDY4MC4wMDkxNDMgMjEwLjUwNTE0M3YtMjgyLjYyNGMwLTMwLjg2NjI4Ni0yNi4xMTItNTUuODgxMTQzLTU4LjI5NDg1Ny01NS44ODExNDMtMzIuMTgyODU3IDAtNTguMjk0ODU3IDI1LjAxNDg1Ny01OC4yOTQ4NTcgNTUuODgxMTQzVjIxMC41MDUxNDNsLTczLjIxNi03Ny45NzAyODZhNTguNTg3NDI5IDU4LjU4NzQyOSAwIDAgMC0zMy44NjUxNDMtMTcuNzAwNTcxYy0wLjg3NzcxNC0wLjIxOTQyOS0xLjY4MjI4Ni0wLjI5MjU3MS0yLjU2LTAuMzY1NzE1YTEzLjY3NzcxNCAxMy42Nzc3MTQgMCAwIDAtMC43MzE0MjktMC4wNzMxNDJsLTEuOTAxNzE0LTAuMjE5NDI5aC0xLjI0MzQyOWwtMS4wOTcxNDMtMC4wNzMxNDNoLTEuOTc0ODU3YTU4LjY2MDU3MSA1OC42NjA1NzEgMCAwIDAtNTEuMiAyOS4xODQgNTMuNjg2ODU3IDUzLjY4Njg1NyAwIDAgMCA3Ljg5OTQyOSA2NHoiICBob3Jpei1hZHYteD0iMTI0MyIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJ1bmZvbGQiIHVuaWNvZGU9IiYjNTkwNTM7IiBkPSJNNTEyIDg5NmE1MTIgNTEyIDAgMSAwIDAtMTAyNEE1MTIgNTEyIDAgMCAwIDUxMiA4OTZ6TTI3My41Nzg2NjcgMzQzLjcyMjY2N2wxOTUuNDEzMzMzLTE1OC4yOTMzMzRBNjcuOTI1MzMzIDY3LjkyNTMzMyAwIDAgMSA1MTIgMTcxLjA5MzMzM2E2OC4wMTA2NjcgNjguMDEwNjY3IDAgMCAxIDQzLjAwOCAxNC4zMzZsMTk1LjQxMzMzMyAxNTguMjkzMzM0YzIzLjQ2NjY2NyAxOS4xMTQ2NjcgMjMuNDY2NjY3IDUwLjAwNTMzMyAwIDY5LjEyYTcwLjU3MDY2NyA3MC41NzA2NjcgMCAwIDEtODUuMzMzMzMzIDBMNTEyIDI4OC43NjggMzU4LjkxMiA0MTIuODQyNjY3YTcwLjY1NiA3MC42NTYgMCAwIDEtODUuMzMzMzMzIDBjLTIzLjQ2NjY2Ny0xOS4xMTQ2NjctMjMuNDY2NjY3LTUwLjAwNTMzMyAwLTY5LjEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImNsb3NlIiB1bmljb2RlPSImIzU5MDU0OyIgZD0iTTY0MS4zNjUzMzMgMzg0bDM1NS40MTMzMzQtMzU1LjMyOGMzNi4wMTA2NjctMzYuMDEwNjY3IDM2LjQzNzMzMy05My44NjY2NjcgMC40MjY2NjYtMTI5Ljg3NzMzM2E5MS43MzMzMzMgOTEuNzMzMzMzIDAgMCAwLTEyOS44NzczMzMgMC40MjY2NjZMNTEyIDI1NC42MzQ2NjdsLTM1NS4zMjgtMzU1LjQxMzMzNGMtMzYuMDEwNjY3LTM2LjAxMDY2Ny05My44NjY2NjctMzYuNDM3MzMzLTEyOS44NzczMzMtMC40MjY2NjZhOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMCAwLjQyNjY2NiAxMjkuODc3MzMzTDM4Mi42MzQ2NjcgMzg0IDI3LjIyMTMzMyA3MzkuMzI4QTkxLjY0OCA5MS42NDggMCAwIDAgMjYuNzk0NjY3IDg2OS4yMDUzMzNhOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMCAxMjkuODc3MzMzLTAuNDI2NjY2TDUxMiA1MTMuMzY1MzMzIDg2Ny4zMjggODY4Ljc3ODY2N2E5MS42NDggOTEuNjQ4IDAgMCAwIDEyOS44NzczMzMgMC40MjY2NjYgOTEuNzMzMzMzIDkxLjczMzMzMyAwIDAgMC0wLjQyNjY2Ni0xMjkuODc3MzMzeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9Im1hcmsiIHVuaWNvZGU9IiYjNTkwNTU7IiBkPSJNMjU2IDE4LjY1MTQyOWE1MS4zNDYyODYgNTEuMzQ2Mjg2IDAgMCAwLTQ0LjM5NzcxNCAyNS4zODA1NzFMNy42OCAzOTQuMzg2Mjg2Yy0xNC4xMTY1NzEgMjQuMTM3MTQzLTUuNDg1NzE0IDU0Ljg1NzE0MyAxOS4wMTcxNDMgNjguNjgxMTQzczU1Ljg4MTE0MyA1LjQxMjU3MSA2OS45MjQ1NzEtMTguNzI0NTcybDE3MC40OTYtMjkzLjE1NjU3MSA2MjguNTE2NTcyIDYxOS4xNTQyODVhNTEuOTMxNDI5IDUxLjkzMTQyOSAwIDAgMCA3Mi40MTE0MjggMC4wNzMxNDMgNDkuNzM3MTQzIDQ5LjczNzE0MyAwIDAgMCAwLjE0NjI4Ni03MS4xNjhMMjk0LjYxOTQyOSAzNS44NGwtMi40MTM3MTUtMi40MTM3MTRhNTEuNjM4ODU3IDUxLjYzODg1NyAwIDAgMC0zNi4yMDU3MTQtMTQuNjI4NTcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InRyYWZmaWMiIHVuaWNvZGU9IiYjNTkwNTY7IiBkPSJNNTEyIDY5MS4yYy04NC44Mzg0IDAtMTUzLjYtNDkuNjY0LTE1My42LTExMC45NTA0di00NDMuNjk5MkMzNTguNCA3NS4yNjQgNDI3LjE2MTYgMjUuNiA1MTIgMjUuNnMxNTMuNiA0OS42NjQgMTUzLjYgMTEwLjk1MDRWNTgwLjI0OTZDNjY1LjYgNjQxLjUzNiA1OTYuODM4NCA2OTEuMiA1MTIgNjkxLjJ6IG0wIDEwMi40YzE0MS4zNjMyIDAgMjU2LTk3LjQzMzYgMjU2LTIxNy42di00MzUuMmMwLTEyMC4xNjY0LTExNC42MzY4LTIxNy42LTI1Ni0yMTcuNnMtMjU2IDk3LjQzMzYtMjU2IDIxNy42djQzNS4yQzI1NiA2OTYuMTY2NCAzNzAuNjM2OCA3OTMuNiA1MTIgNzkzLjZ6TTUxMiA1NjMuMm0tNzYuOCAwYTc2LjggNzYuOCAwIDEgMSAxNTMuNiAwIDc2LjggNzYuOCAwIDEgMS0xNTMuNiAwWk01MTIgMzU4LjRtLTc2LjggMGE3Ni44IDc2LjggMCAxIDEgMTUzLjYgMCA3Ni44IDc2LjggMCAxIDEtMTUzLjYgMFpNNTEyIDE1My42bS03Ni44IDBhNzYuOCA3Ni44IDAgMSAxIDE1My42IDAgNzYuOCA3Ni44IDAgMSAxLTE1My42IDBaIiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZnVsbC1maWd1cmUiIHVuaWNvZGU9IiYjNTkwNTc7IiBkPSJNMjYwLjYwOCA2NDBDMjI5LjgzNjggNjQwIDIwNC44IDYxNC41NTM2IDIwNC44IDU4My4xMTY4di0zOTguMjMzNkMyMDQuOCAxNTMuNDQ2NCAyMjkuNzg1NiAxMjggMjYwLjYwOCAxMjhoNTAyLjc4NGMzMC44MjI0IDAgNTUuODA4IDI1LjQ0NjQgNTUuODA4IDU2Ljg4MzJWNTgzLjE2OEM4MTkuMiA2MTQuNTUzNiA3OTQuMjE0NCA2NDAgNzYzLjM5MiA2NDB6IG01LjYzMiAxMDIuNGg0OTEuNTJDODQ4LjIzMDQgNzQyLjQgOTIxLjYgNjY4LjM2NDggOTIxLjYgNTc3LjAyNHYtMzg2LjA0OGMwLTkxLjM0MDgtNzMuMzY5Ni0xNjUuMzc2LTE2My44NC0xNjUuMzc2SDI2Ni4yNEMxNzUuNzY5NiAyNS42IDEwMi40IDk5LjYzNTIgMTAyLjQgMTkwLjk3NlY1NzcuMDI0QzEwMi40IDY2OC4zMTM2IDE3NS43Njk2IDc0Mi40IDI2Ni4yNCA3NDIuNHpNMzIzLjg5MTIgNDE4LjY2MjRhMzUuODQgMzUuODQgMCAwIDAtMzUuODQgMzUuNDMwNFY1MjUuMDA0OGEzNS44NCAzNS44NCAwIDAgMCAzNS44NCAzNS40MzA0bDcxLjY4LTAuNjE0NGMxOS42MDk2IDAgMzUuNzg4OC0xNS4zNiAzNS43ODg4LTM0LjgxNnMtMTYuMTc5Mi0zNS40MzA0LTM1Ljg0LTM1LjQzMDRoLTM1Ljg0di0zNS40ODE2YTM1Ljg0IDM1Ljg0IDAgMCAwLTM1Ljc4ODgtMzUuNDMwNHogbTcxLjY4LTIxMi42ODQ4aC03MS42OGEzNS44NCAzNS44NCAwIDAgMC0zNS44NCAzNS40ODE2VjMxMi4zMmEzNS44NCAzNS44NCAwIDAgMCA3MS42OCAwdi0zNS40MzA0aDM1Ljg0YzE5LjYwOTYgMCAzNS43ODg4LTE2LjAyNTYgMzUuNzg4OC0zNS40MzA0cy0xNi4xNzkyLTM1LjQ4MTYtMzUuODQtMzUuNDgxNnogbTMxMC4zNzQ0IDIxMi42ODQ4YTM1Ljg0IDM1Ljg0IDAgMCAwLTM1Ljg0IDM1LjQzMDR2MzUuNDgxNmgtMzUuNzg4OGMtMTkuNjYwOCAwLTM1Ljg0IDE1Ljk3NDQtMzUuODQgMzUuNDMwNHMxNi4xNzkyIDM1LjQzMDQgMzUuODQgMzUuNDMwNGg3MS42OGEzNS44NCAzNS44NCAwIDAgMCAzNS43ODg4LTM1LjQzMDR2LTcwLjkxMmEzNS44NCAzNS44NCAwIDAgMC0zNS44NC0zNS40MzA0eiBtMC0yMTIuNjg0OEg2MzQuMzY4Yy0xOS42NjA4IDAtMzUuODQgMTYuMDI1Ni0zNS44NCAzNS40ODE2czE2LjE3OTIgMzUuNDMwNCAzNS44NCAzNS40MzA0aDM1Ljg0VjMxMi4zMmEzNS44NCAzNS44NCAwIDAgMCA3MS42Mjg4IDB2LTcwLjg2MDhhMzUuODQgMzUuODQgMCAwIDAtMzUuODQtMzUuNDgxNnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJtZWFzdXJlIiB1bmljb2RlPSImIzU5MDU4OyIgZD0iTTEyOS4xMjY0IDIwMy4wMDhhMTAyLjI5NzYgMTAyLjI5NzYgMCAwIDAtMC4yMDQ4IDE0NC41ODg4bDQzNC44NDE2IDQzNC44NDE2YTEwMS45OTA0IDEwMS45OTA0IDAgMCAwIDE0NC41ODg4LTAuMjA0OGwyMTcuMjQxNi0yMTcuMjQxNmMzOS45ODcyLTM5LjkzNiA0MC4wMzg0LTEwNC43NTUyIDAuMjA0OC0xNDQuNTg4OEw0OTEuMDA4LTE0LjQzODRhMTAxLjk5MDQgMTAxLjk5MDQgMCAwIDAtMTQ0LjU4ODggMC4yMDQ4eiBtMTA4LjI4OCAzNi41MDU2bDE0NS40NTkyLTE0NS40NTkyYTUxLjI1MTIgNTEuMjUxMiAwIDAgMSA3Mi4xOTIgMC40MDk2bDM2MS44MzA0IDM2MS44MzA0YTUxLjI1MTIgNTEuMjUxMiAwIDAgMSAwLjQwOTYgNzIuMTkybC0xNDUuNDU5MiAxNDUuNDU5MmE1MS4yNTEyIDUxLjI1MTIgMCAwIDEtNzIuMTkyLTAuNDA5NmwtMzYxLjgzMDQtMzYxLjgzMDRhNTEuMjUxMiA1MS4yNTEyIDAgMCAxLTAuNDA5Ni03Mi4xOTJ6TTI0Ny45NjE2IDMyNi45NjMybDM2LjE5ODQgMzYuMTk4NCAxMDguNjQ2NC0xMDguNTk1Mi0zNi4yNDk2LTM2LjI0OTZ6TTMyMC4zNTg0IDM5OS4zNmwzNi4xOTg0IDM2LjE5ODQgMTQ0Ljg0NDgtMTQ0Ljc5MzYtMzYuMTk4NC0zNi4xOTg0eiBtNzIuNDQ4IDcyLjM5NjhsMzYuMTk4NCAzNi4xOTg0TDUzNy42IDM5OS4zNmwtMzYuMTk4NC0zNi4xOTg0ek01MzcuNiA2MTYuNjAxNmwzNi4xOTg0IDM2LjE5ODQgMTA4LjU5NTItMTA4LjY0NjQtMzYuMTk4NC0zNi4xOTg0ek00NjUuMjAzMiA1NDQuMTUzNmwzNi4xOTg0IDM2LjI0OTYgMTQ0Ljc5MzYtMTQ0Ljg0NDgtMzYuMTk4NC0zNi4xOTg0eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImRpc3BsYXktbGlzdCIgdW5pY29kZT0iJiM1OTA1OTsiIGQ9Ik0wIDc5LjI3NDY2N2gyNTZWLTQyLjY2NjY2N0gweiBtMzg0IDBoMjU2Vi00Mi42NjY2NjdoLTI1NnogbTM4NCAwaDI1NlYtNDIuNjY2NjY3SDc2OHpNMCAzMjMuMDcyaDI1NnYtMTIxLjk0MTMzM0gweiBtMzg0IDBoMjU2di0xMjEuOTQxMzMzaC0yNTZ6IG0zODQgMGgyNTZ2LTEyMS45NDEzMzNINzY4ek01MTIgNjg4LjY0TDAgNDQ0LjkyOFY1NjYuODY5MzMzTDUxMiA4MTAuNjY2NjY3eiBtNTEyLTI0My43OTczMzNMNTEyIDY4OC43MjUzMzNWODEwLjY2NjY2N2w1MTItMjQzLjc5NzMzNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJoaWRlLWxpc3QiIHVuaWNvZGU9IiYjNTkwNjA7IiBkPSJNMCA2ODguNzI1MzMzaDI1NlY4MTAuNjY2NjY3SDB6IG0zODQgMGgyNTZWODEwLjY2NjY2N2gtMjU2eiBtMzg0IDBoMjU2VjgxMC42NjY2NjdINzY4ek0wIDQ0NC45MjhoMjU2VjU2Ni44NjkzMzNIMHogbTM4NCAwaDI1NlY1NjYuODY5MzMzaC0yNTZ6IG0zODQgMGgyNTZWNTY2Ljg2OTMzM0g3Njh6TTUxMiA3OS4zNkwwIDMyMy4wNzJ2LTEyMS45NDEzMzNMNTEyLTQyLjY2NjY2N3ogbTUxMiAyNDMuNzk3MzMzTDUxMiA3OS4yNzQ2NjdWLTQyLjY2NjY2N2w1MTIgMjQzLjc5NzMzNHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJyZW5hbWUiIHVuaWNvZGU9IiYjNTkwNjE7IiBkPSJNOTYwIDY4Mi42NjY2NjdoLTk5LjU4NHYtOTkuNTg0aDQ5LjgzNDY2N3YtMzk4LjE2NTMzNGgtNDkuODM0NjY3Vjg1LjMzMzMzM2g5OS41ODRhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMSA0OS43NDkzMzMgNDkuNzQ5MzM0VjYzMi45MTczMzNhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMS00OS43NDkzMzMgNDkuNzQ5MzM0eiBtLTg5Ni01OTcuMzMzMzM0aDQ5Ny43NDkzMzNWMTg0LjkxNzMzM2gtNDQ4VjU4My4wODI2NjdoNDQ4VjY4Mi42NjY2NjdINjRhNDkuNzQ5MzMzIDQ5Ljc0OTMzMyAwIDAgMS00OS43NDkzMzMtNDkuNzQ5MzM0di00OTcuODM0NjY2YzAtMjcuNDc3MzMzIDIyLjE4NjY2Ny00OS43NDkzMzMgNDkuNzQ5MzMzLTQ5Ljc0OTMzNHpNMjEzLjMzMzMzMyA0ODMuNTg0aDM0OC40MTZ2LTE5OS4xNjhIMjEzLjMzMzMzM3pNNzYwLjkxNzMzMyA2ODEuNDcyYzAuNTk3MzMzIDE2LjgxMDY2NyAxMC45MjI2NjcgMTAwLjY5MzMzMyAxNDkuMzMzMzM0IDEwMC42OTMzMzNWODgxLjgzNDY2N2MtOTguOTAxMzMzIDAtMTYxLjI4LTMzLjI4LTE5OC44MjY2NjctNzUuMTc4NjY3QzY3NC4xMzMzMzMgODQ4LjM4NCA2MTEuNTg0IDg4MS43NDkzMzMgNTEyIDg4MS43NDkzMzN2LTk5LjQ5ODY2NmMxMzkuMzQ5MzMzIDAgMTQ4LjgyMTMzMy04My42MjY2NjcgMTQ5LjMzMzMzMy05OS41ODR2LTU5Ny4yNDhjMC00LjA5Ni0xLjg3NzMzMy05OS42NjkzMzMtMTQ5LjMzMzMzMy05OS42NjkzMzR2LTk5LjQ5ODY2NmM5OS42NjkzMzMgMCAxNjIuMTMzMzMzIDMzLjQ1MDY2NyAxOTkuNjggNzUuNTIgMi4zODkzMzMtMi43MzA2NjcgNC4zNTItNS41NDY2NjcgNy4wODI2NjctOC4yNzczMzQgNDQuNDU4NjY3LTQ0LjYyOTMzMyAxMDguODg1MzMzLTY3LjI0MjY2NyAxOTEuNDg4LTY3LjI0MjY2NnY5OS40OTg2NjZjLTEzOS41MiAwLTE0OC45MDY2NjcgODMuNDU2LTE0OS4zMzMzMzQgOTkuNDk4NjY3eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImNvcHkiIHVuaWNvZGU9IiYjNTkwNjI7IiBkPSJNNjM5Ljg3MiA2MzkuNjhIMTkyLjM4NGMtMzUuMiAwLTYzLjg3Mi0yOC44LTYzLjg3Mi02My44NzJ2LTU3NS4zNmMwLTM1LjIgMjguOC02NCA2My44NzItNjRoNDQ3LjQ4OGMzNS4yIDAgNjMuOTM2IDI4LjggNjMuOTM2IDY0djU3NS4zNmMwIDM1LjA3Mi0yOC44IDYzLjg3Mi02My45MzYgNjMuODcyeiBtMC02MzkuMjk2SDE5Mi4zODR2NTc1LjM2aDQ0Ny40ODh2LTU3NS4zNnogbTE5MS43NDQgODMxLjEwNEgzODQuMTI4Yy0zNS4yIDAtNjMuOTM2LTI4LjgtNjMuOTM2LTYzLjg3MnYtNjMuOTM2aDYzLjkzNnY2My45MzZoNDQ3LjQ4OHYtNTc1LjM2aC02My45MzZ2LTY0aDYzLjkzNmMzNS4yIDAgNjMuODcyIDI4LjggNjMuODcyIDY0djU3NS4zNmE2NCA2NCAwIDAgMS02My44NzIgNjMuODcyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InFxLXpvbmUiIHVuaWNvZGU9IiYjNTkwNjM7IiBkPSJNNTEyIDg5NkMyMjkuMDE3NiA4OTYgMCA2NjYuOTgyNCAwIDM4NHMyMjkuMDE3Ni01MTIgNTEyLTUxMiA1MTIgMjI5LjAxNzYgNTEyIDUxMlM3OTQuOTgyNCA4OTYgNTEyIDg5NnogbTM1NC4xNTA0LTQxOC44MTZsLTE4My42NTQ0LTE1NS40OTQ0IDYuMjQ2NC0yNC42Nzg0Yy0xMjkuNTM2LTEuMjI4OC0yMTUuMDkxMiAxMS4xMTA0LTIxNS4wOTEyIDExLjExMDRsMjEzLjg2MjQgMTQ5LjI5OTJjLTE3My42MTkyIDM1Ljc4ODgtNDA4Ljg4MzItNi4xNDQtMzkwLjA0MTYtNy40MjQgMjY1LjQ3Mi04LjY1MjggMjczLjA0OTYtMjIuMjIwOCAyNzMuMDQ5Ni0yMi4yMjA4TDM1Ny44ODggMjc4LjUyOGMyOTMuMTItMTguNTM0NCAzNzQuODg2NCAxOS43MTIgMzc0Ljg4NjQgMTkuNzEycy0yMC4xMjE2LTE2LjAyNTYtMzguOTYzMi0yNC42Nzg0bDQ0LjAzMi0xODIuNTc5MmMxLjIyODgtMy42ODY0LTEuMjgtOC42NTI4LTMuNzg4OC0xMS4xMTA0LTIuNTYtMS4yMjg4LTMuNzg4OC0yLjQ1NzYtNi4yOTc2LTIuNDU3NnMtMy43ODg4IDAtNi4yOTc2IDEuMjI4OGwtMjA4Ljg0NDggMTIyLjE2MzItMjA4Ljg0NDgtMTIyLjE2MzJhMTEuNjIyNCAxMS42MjI0IDAgMCAwLTEyLjU0NCAwIDkuODMwNCA5LjgzMDQgMCAwIDAtMy43ODg4IDExLjExMDRsNTUuMzQ3MiAyMzEuOTM2TDE1Ny44NDk2IDQ3Ny4xODRjLTMuNzg4OCAyLjQ1NzYtNS4wMTc2IDcuNDI0LTMuNzg4OCAxMS4xMTA0czUuMDY4OCA3LjQyNCAxMC4wODY0IDcuNDI0bDI0Mi43OTA0IDE5LjcxMkw1MDIuNTc5MiA3MzYuMjU2YzEuMjI4OCAzLjY4NjQgNi4yOTc2IDYuMTQ0IDEwLjAzNTIgNi4xNDQgNS4wNjg4IDAgOC44MDY0LTIuNDU3NiAxMC4wODY0LTYuMTQ0bDk0LjM2MTYtMjE4LjQxOTIgMjQyLjc5MDQtMTkuNzEyYzUuMDE3NiAwIDguODA2NC0zLjY4NjQgMTAuMDg2NC03LjQyNCAxLjIyODgtMy42ODY0IDAtMTEuMTEwNC0zLjc4ODgtMTMuNTY4eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InNpbmEtd2VpYm8iIHVuaWNvZGU9IiYjNTkwNjQ7IiBkPSJNMzk5Ljg3MiAyODAuMDY0Yy0yMi44MzUyIDAtNDMuODI3Mi0xOC43OTA0LTQ0LjE4NTYtMzkuNDc1Mi0wLjMwNzItMTcuNjY0IDE0LjU0MDgtMzEuMTI5NiAzNC40NTc2LTMxLjEyOTYgMjMuNjU0NCAwIDQzLjUyIDE3LjgxNzYgNDMuNjIyNCAzOS4yMTkyIDAuMjA0OCAxOC4yNzg0LTE0LjA4IDMxLjM4NTYtMzMuOTQ1NiAzMS4zODU2eiBtNTYuNzI5NiAxNS43MTg0Yy02Ljc1ODQtMy4zMjgtMTMuMzEyLTguMTkyLTE3Ljk3MTItMTQuMTMxMi0xLjAyNC0xLjI4IDUuOTM5Mi04LjgwNjQgMTEuNTcxMi0xNi44OTYgNy4yMTkyIDcuOTM2IDEzLjc3MjggMTIuNDkyOCAxNi4xNzkyIDE4LjY4OCAxLjAyNCAyLjYxMTItOC42NTI4IDEyLjk1MzYtOS43MjggMTIuMzM5MnogbTE0My4zMDg4IDg5LjgwNDhhMjI1LjY4OTYgMjI1LjY4OTYgMCAwIDEtMzQuOTY5NiAxNy41MTA0Yy00MC40NDggMTYuMTc5Mi04Mi45NDQgMjAuOTkyLTEyNi4xMDU2IDE3LjIwMzItNjUuMjgtNS42MzItMTI1LjU0MjQtMjQuODgzMi0xNzIuNDQxNi03My4zMTg0LTU0LjM3NDQtNTYuMDY0LTQ3LjAwMTYtMTI3LjA3ODQgMTYuOTk4NC0xNzEuNTcxMiA0My4zMTUyLTMwLjEwNTYgOTIuNTE4NC00MC40NDggMTQ0LjQ4NjQtMzkuMTY4IDkuNDIwOCAwIDE4Ljk0NC0wLjc2OCAyOC4yNjI0IDAuMTAyNCA1OS4xODcyIDUuNjMyIDExMy42NjQgMjMuNjAzMiAxNTguODIyNCA2My42NDE2IDY1Ljk5NjggNTguMzY4IDU5LjM5MiAxMzguODAzMi0xNS4wNTI4IDE4NS42eiBtLTczLjIxNi0xNjQuOTE1MmMtMjIuNDc2OC0zNC4wNDgtNjIuMjU5Mi01NC43MzI4LTEwNS40NzItNTQuOTM3Ni01NC40MjU2LTAuMzU4NC05NS4yODMyIDMwLjIwOC0xMDIuNTUzNiA3Ny44MjRhNzkuMjA2NCA3OS4yMDY0IDAgMCAwIDEuMDc1MiAyOS45NTJjMTAuOTU2OCA0Ni42OTQ0IDQzLjMxNTIgNzIuNzU1MiA4Ny4yOTYgODQuNTMxMiA0My40Njg4IDExLjUyIDgzLjg2NTYgMy45OTM2IDExNS41MDcyLTMwLjUxNTIgMjYuMTEyLTI4LjU2OTYgMjcuMTg3Mi03Mi4xNDA4IDQuMDk2LTEwNi44NTQ0ek01MTIgODk2QzIyOS4yMjI0IDg5NiAwIDY2Ni43Nzc2IDAgMzg0czIyOS4yMjI0LTUxMiA1MTItNTEyYzI4Mi43MjY0IDAgNTEyIDIyOS4yMjI0IDUxMiA1MTIgMCAyODIuNzI2NC0yMjkuMjIyNCA1MTItNTEyIDUxMnogbTI0NC4xMjE2LTY2NC44ODMyYy00My43MjQ4LTY3LjI3NjgtMTEwLjk1MDQtMTAwLjY1OTItMTg2LjAwOTYtMTE5LjA0LTM2LjM1Mi04Ljk2LTc0LjI0LTExLjcyNDgtOTMuOTUyLTE0Ljc0NTYtOTMuMDgxNiAyLjMwNC0xNjUuMDY4OCAxNi4wNzY4LTIyOS45OTA0IDU2LjQyMjQtODEuODE3NiA1MC44NDE2LTEwNS42NzY4IDEyNy4wMjcyLTYyLjg3MzYgMjEzLjQ1MjggNDUuOTI2NCA5Mi42NzIgMTE3LjQwMTYgMTYxLjIyODggMjExLjI1MTIgMjA1LjMxMiAxNy40MDggOC4xNDA4IDM3LjIyMjQgMTIuOCA1Ni4zMiAxNS4xMDQgMzkuMzcyOCA0LjkxNTIgNjIuMzEwNC0xNy40MDggNjEuMzM3Ni01Ny4wMzY4LTAuMjA0OC04LjcwNC0yLjIwMTYtMTcuMjAzMi0yLjY2MjQtMjUuOTU4NC0wLjQwOTYtNy40MjQgMC4xNTM2LTE1LjA1MjggMC4zMDcyLTIyLjUyOCA3LjY4IDEuMjggMTUuMzYgMi4wNDggMjIuODg2NCAzLjczNzYgMzAuMzEwNCA2LjUwMjQgNjAuMzEzNiAxNy4zMDU2IDkwLjg4IDE4Ljk0NCA1My4wOTQ0IDIuODE2IDc2LjgtMjkuMjg2NCA2MC43MjMyLTc5LjcxODQtNi45NjMyLTIxLjQ1MjgtMS43NDA4LTI4LjY3MiAxOC4yNzg0LTM1Ljg0IDc1LjQ2ODgtMjcuMjM4NCA5Ny4yMjg4LTkwLjkzMTIgNTMuNTA0LTE1OC4xMDU2eiBtLTM5LjU3NzYgMjgyLjU3MjhjLTEyLjQ5MjggMTUuODcyLTQwLjgwNjQgMTkuNTA3Mi00OS43NjY0IDE5LjYwOTZhMjMuOTYxNiAyMy45NjE2IDAgMCAwIDAuMTUzNiA0Ny45NzQ0aDAuMjA0OGM1LjgzNjggMCA1OC4zNjgtMS41MzYgODcuMDQtMzcuOTM5MiAxMS40MTc2LTE0LjQzODQgMjMuMDkxMi00MC4wODk2IDEzLjgyNC04MC4wMjU2YTI0LjAxMjggMjQuMDEyOCAwIDEgMC00Ni42OTQ0IDEwLjc1MmM0LjA5NiAxNy41MTA0IDIuNDU3NiAzMC40NjQtNC43NjE2IDM5LjYyODh6TTg1Ny43MDI0IDQzNS4yYTI0LjA2NCAyNC4wNjQgMCAwIDAtMjcuNDQzMi0xOS45NjggMjMuOTYxNiAyMy45NjE2IDAgMCAwLTE5Ljk2OCAyNy40NDMyYzguOTA4OCA1Ni41NzYtMC4xNTM2IDEwMC42MDgtMjcuMDMzNiAxMzAuNzEzNi00Ni43OTY4IDUyLjQyODgtMTMyLjU1NjggNDkuMzA1Ni0xMzMuNDI3MiA0OS4zMDU2YTIzLjk2MTYgMjMuOTYxNiAwIDEgMC0yLjA0OCA0Ny45MjMyYzQuNDU0NCAwLjE1MzYgMTA5LjQxNDQgMy44NCAxNzEuMjY0LTY1LjI4IDM2Ljg2NC00MS4zNjk2IDQ5Ljg2ODgtOTguNjExMiAzOC42NTYtMTcwLjEzNzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY29sb3ItY2hhbmdlIiB1bmljb2RlPSImIzU5MDY1OyIgZD0iTTQ4LjcxMzE0MyA0NzEuNzcxNDI5aDkyNi45Mzk0MjhhNDkuMDA1NzE0IDQ5LjAwNTcxNCAwIDEgMSAzMC4xMzQ4NTggODcuMjU5NDI4IDQ4Ljg1OTQyOSA0OC44NTk0MjkgMCAwIDEtMTAuMzg2Mjg2IDkuODc0Mjg2bC0zNDYuMjU4Mjg2IDI0NS4wMjg1NzFhNDguMjAxMTQzIDQ4LjIwMTE0MyAwIDAgMS00OC40MjA1NzEgNC4zODg1NzIgNDkuMDc4ODU3IDQ5LjA3ODg1NyAwIDAgMS03LjMxNDI4Ni04NC40OGwyMzIuMDA5MTQzLTE2NC4yMDU3MTVINDguNjRjLTI2Ljc3MDI4NiAwLTQ4LjQ5MzcxNC0yMS45NDI4NTctNDguNDkzNzE0LTQ4LjkzMjU3MSAwLTI3LjA2Mjg1NyAyMS43MjM0MjktNDguOTMyNTcxIDQ4LjU2Njg1Ny00OC45MzI1NzF6IG05MjYuOTM5NDI4LTE3NS41NDI4NThINDguNjRhNDguMjc0Mjg2IDQ4LjI3NDI4NiAwIDAgMS0zNC4zMDQtMTQuMzM2IDQ5LjE1MiA0OS4xNTIgMCAwIDEgNC4yNDIyODYtNzIuOTIzNDI4YzIuODUyNTcxLTMuNjU3MTQzIDYuMjkwMjg2LTcuMDIxNzE0IDEwLjI0LTkuODc0Mjg2bDM0Ni4zMzE0MjgtMjQ1LjAyODU3MWE0OC4yMDExNDMgNDguMjAxMTQzIDAgMCAxIDY3LjU4NCAxMS45MjIyODUgNDkuMjI1MTQzIDQ5LjIyNTE0MyAwIDAgMS0xMS44NDkxNDMgNjguMTY5MTQzTDE5OC44NzU0MjkgMTk4LjM2MzQyOWg3NzYuNzc3MTQyYzI2Ljc3MDI4NiAwIDQ4LjQ5MzcxNCAyMS45NDI4NTcgNDguNDkzNzE1IDQ4LjkzMjU3MWE0OC43MTMxNDMgNDguNzEzMTQzIDAgMCAxLTQ4LjQ5MzcxNSA0OC45MzI1NzF6IiAgaG9yaXotYWR2LXg9IjEwNTUiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY3JlYXQtY3VzdG9tLW1hcCIgdW5pY29kZT0iJiM1OTA2NjsiIGQ9Ik03NzAuOTI1NzE0LTU0LjcxMDg1N0gyNTMuMDc0Mjg2YTE3OS45MzE0MjkgMTc5LjkzMTQyOSAwIDAgMC0xNzkuNzEyIDE3OS43MTJWNjQyLjkyNTcxNGExNzkuOTMxNDI5IDE3OS45MzE0MjkgMCAwIDAgMTc5LjcxMiAxNzkuNzEyaDI1MS4zOTJhNTAuMTc2IDUwLjE3NiAwIDEgMCAwLTEwMC40MjUxNDNIMjUzLjAwMTE0M2MtNDMuNzM5NDI5IDAtNzkuMjg2ODU3LTM1LjU0NzQyOS03OS4yODY4NTctNzkuMjg2ODU3di01MTcuOTk3NzE0YzAtNDMuNzM5NDI5IDM1LjU0NzQyOS03OS4yODY4NTcgNzkuMjg2ODU3LTc5LjI4Njg1N2g1MTcuOTk3NzE0YzQzLjczOTQyOSAwIDc5LjI4Njg1NyAzNS41NDc0MjkgNzkuMjg2ODU3IDc5LjI4Njg1N1YzODguMTY5MTQzYTUwLjE3NiA1MC4xNzYgMCAxIDAgMTAwLjQyNTE0MyAwdi0yNjMuMTY4YTE3OS45MzE0MjkgMTc5LjkzMTQyOSAwIDAgMC0xNzkuNzEyLTE3OS43MTJ6TTkwMC41MzQ4NTcgNTUyLjM3NDg1N0g1NjAuNTY2ODU3YTUwLjE3NiA1MC4xNzYgMCAwIDAgMCAxMDAuMzUyaDMzOS45NjhhNTAuMjQ5MTQzIDUwLjI0OTE0MyAwIDAgMCAwLTEwMC4zNTJ6TTczMC41NTA4NTcgMzgyLjM5MDg1N2E1MC4xNzYgNTAuMTc2IDAgMCAwLTUwLjE3NiA1MC4xNzZWNzcyLjUzNDg1N2E1MC4xNzYgNTAuMTc2IDAgMSAwIDEwMC4zNTIgMHYtMzM5Ljk2OGE1MC4yNDkxNDMgNTAuMjQ5MTQzIDAgMCAwLTUwLjE3Ni01MC4xNzZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY3VzdG9tLW1hcCIgdW5pY29kZT0iJiM1OTA2NzsiIGQ9Ik05MzYuNTUwNCA3ODMuMzZMNzUyLjUzNzYgODMwLjcyYTI4LjA1NzYgMjguMDU3NiAwIDAgMS0xOS43NjMyLTIuMjI3MmwtMjE1LjYyODgtMTEwLjA4LTE5OC40IDkyLjI4OGEyOC4wNTc2IDI4LjA1NzYgMCAwIDEtMjMuMDY1NiAwLjMwNzJMODIuMTc2IDcxOC4xODI0Yy0xMS44NTI4LTUuMTQ1Ni0xOS42MDk2LTE3LjkyLTE5LjYwOTYtMzIuMDUxMnYtNjUzLjUxNjhjMC0xMS4zNjY0IDQuOTkyLTIyLjAxNiAxMy40MTQ0LTI4LjQxNiA4LjM5NjgtNi40IDE5LjA5NzYtNy43MzEyIDI4LjU2OTYtMy42MzUybDIwMS45MzI4IDg3Ljc4MjQgMTk5LjM0NzItOTIuNzc0NGMzLjc4ODgtMS43NDA4IDcuODMzNi0yLjYzNjggMTEuODc4NC0yLjYzNjggNC4zNzc2IDAgOC43NTUyIDEuMDQ5NiAxMi44NTEyIDMuMTIzMmwxNS45NzQ0IDguMTY2NC0yNy4zNDA4IDYxLjY5Ni0yLjA0OC0xLjA0OTYtMTk4LjQgOTIuMjg4YTI4LjE2IDI4LjE2IDAgMCAxLTIzLjA2NTYgMC4zMzI4TDEyNC4yMTEyIDgyLjk0NFY2NjIuNjA0OGwxODIuMjcyIDc5LjI1NzYgMTk5LjM0NzItOTIuNzQ4OGM3LjkzNi0zLjcxMiAxNi44OTYtMy41MzI4IDI0LjcyOTYgMC40NjA4bDIxOC4zNDI0IDExMS40NjI0IDE0OS44ODgtMzguNTUzNnYtNTgyLjkxMmwtMjkuMDMwNCA3LjQ0OTYtMTQuNjY4OC0zMy4wNzUyYy0yLjMwNC01Ljc4NTYtNC44NjQtMTEuNTItNy42MDMyLTE3LjA3NTJsLTAuNDYwOC0xLjEwMDgtNS4zNzYtMTIuMTA4OCA4MS4wNDk2LTIwLjgzODRhMjguNDE2IDI4LjQxNiAwIDAgMSAyNi4xMTIgNi42MDQ4YzcuMzcyOCA2LjUwMjQgMTEuNjQ4IDE2LjQwOTYgMTEuNjQ4IDI2LjkzMTJWNzQ5LjgyNGMwIDE2LjAyNTYtOS45MDcyIDI5LjkwMDgtMjMuOTEwNCAzMy41MzZ6TTI4Ny44MjA4IDY1My4yODY0di00MTQuNzJjMC03LjYwMzIgOC41NTA0LTEzLjc0NzIgMTkuMDQ2NC0xMy43NDcyczE5LjA0NjQgNi4xNDQgMTkuMDQ2NCAxMy43NDcydjQxNC43MmMwIDcuNjAzMi04LjU1MDQgMTMuNzcyOC0xOS4wNDY0IDEzLjc3MjhzLTE5LjA0NjQtNi4xNjk2LTE5LjA0NjQtMTMuNzcyOHogbTIxMC44NDE2LTkxLjYyMjR2LTIwOC42OTEyYzAtNy42MDMyIDguNTUwNC0xMy43NzI4IDE5LjA0NjQtMTMuNzcyOHMxOS4wNDY0IDYuMTQ0IDE5LjA0NjQgMTMuNzcyOHYyMDguNjkxMmMwIDcuNjAzMi04LjU1MDQgMTMuNzk4NC0xOS4wNDY0IDEzLjc5ODRzLTE5LjA0NjQtNi4xOTUyLTE5LjA0NjQtMTMuNzk4NHogbTI3MC4wOC0xMzAuOTY5NlY2ODIuNzAwOGMwIDcuNjAzMi04LjUyNDggMTMuNzcyOC0xOS4wNDY0IDEzLjc3MjgtMTAuNTQ3MiAwLTE5LjA0NjQtNi4xNjk2LTE5LjA0NjQtMTYuNjE0NHYtMjUyLjAzMmMwLTQuNzM2IDguNDk5Mi0xMC45MzEyIDE5LjA0NjQtMTAuOTMxMiAxMC41MjE2IDAgMTkuMDcyIDYuMTk1MiAxOS4wNzIgMTMuNzcyOHogbS0xNzguNTA4OC00OTAuOTA1Nmw4MS40MDggNTkuOTA0LTYzLjg5NzYgNDguNDM1Mi0xNy41MTA0LTEwOC4zMzkyeiBtMjI0LjIzMDQgMjg1LjQxNDRsLTY2LjQ1NzYgNTIuOTY2NC0xMzIuOTQwOC0yMTEuNDA0OCA2OS4xMi01NS40NDk2IDEzMC4yNzg0IDIxMy44ODh6IG0zMy40ODQ4IDg2LjM0ODhzLTE3Ljc5MiAxNS4yNTc2LTM3LjEyIDI1LjY3NjhjLTE5LjMwMjQgMTAuNDE5Mi0zMC4xMzEyLTYuMTQ0LTMwLjEzMTItNi4xNDRsLTIzLjU1Mi0zOC4wNDE2IDY5LjE3MTItNTMuMTQ1NnMyMC4xNDcyIDMyLjgxOTIgMjYuMTg4OCA0My44NTI4YzYuMDQxNiAxMS4wNTkyLTQuNTU2OCAyNy44MDE2LTQuNTU2OCAyNy44MDE2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxlZ2VuZC1mb2xkIiB1bmljb2RlPSImIzU5MDY4OyIgZD0iTTUxMiA2NzYuNTcxNDI5YTYwLjYzNTQyOSA2MC42MzU0MjkgMCAwIDEtNDMuNDQ2ODU3LTE4LjQzMmwtMzc3LjQxNzE0My0zODYuMTk0Mjg2YTYzLjkyNjg1NyA2My45MjY4NTcgMCAwIDEgMC04OC45NDE3MTQgNjAuNDg5MTQzIDYwLjQ4OTE0MyAwIDAgMSA4Ni45NjY4NTcgMEw1MTIgNTI0LjcyNjg1N2wzMzMuODk3MTQzLTM0MS43MjM0MjhhNjAuNDg5MTQzIDYwLjQ4OTE0MyAwIDAgMSA4Ni45NjY4NTcgMCA2My45MjY4NTcgNjMuOTI2ODU3IDAgMCAxIDAgODguOTQxNzE0bC0zNzcuNDE3MTQzIDM4Ni4xOTQyODZBNjAuNTYyMjg2IDYwLjU2MjI4NiAwIDAgMSA1MTIgNjc2LjU3MTQyOXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsZWdlbmQtdW5mb2xkIiB1bmljb2RlPSImIzU5MDY5OyIgZD0iTTUxMiA5MS40Mjg1NzFhNjAuNjM1NDI5IDYwLjYzNTQyOSAwIDAgMC00My40NDY4NTcgMTguNDMybC0zNzcuNDE3MTQzIDM4Ni4xOTQyODZhNjMuOTI2ODU3IDYzLjkyNjg1NyAwIDAgMCAwIDg4Ljk0MTcxNCA2MC40ODkxNDMgNjAuNDg5MTQzIDAgMCAwIDg2Ljk2Njg1NyAwTDUxMiAyNDMuMjczMTQzbDMzMy44OTcxNDMgMzQxLjcyMzQyOGE2MC40ODkxNDMgNjAuNDg5MTQzIDAgMCAwIDg2Ljk2Njg1NyAwIDYzLjkyNjg1NyA2My45MjY4NTcgMCAwIDAgMC04OC45NDE3MTRsLTM3Ny40MTcxNDMtMzg2LjE5NDI4NkE2MC41NjIyODYgNjAuNTYyMjg2IDAgMCAwIDUxMiA5MS40Mjg1NzF6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ibGVnZW5kLWJpZyIgdW5pY29kZT0iJiM1OTA3MDsiIGQ9Ik0zMDcuMiA0ODYuNGgxMDIuNFY1ODguOEgzMDcuMnogbTAtMTUzLjZoMTAyLjRWNDM1LjJIMzA3LjJ6IG0wLTE1My42aDEwMi40djEwMi40SDMwNy4yeiBtMTUzLjYgMzA3LjJoMjU2VjU4OC44SDQ2MC44eiBtMzA3LjIgMzA3LjJIMjU2YTE1My42IDE1My42IDAgMCAxLTE1My42LTE1My42di01MTJhMTUzLjYgMTUzLjYgMCAwIDEgMTUzLjYtMTUzLjZoNTEyYTE1My42IDE1My42IDAgMCAxIDE1My42IDE1My42VjY0MGExNTMuNiAxNTMuNiAwIDAgMS0xNTMuNiAxNTMuNnogbTUxLjItNjY1LjZhNTEuMiA1MS4yIDAgMCAwLTUxLjItNTEuMkgyNTZhNTEuMiA1MS4yIDAgMCAwLTUxLjIgNTEuMlY2NDBhNTEuMiA1MS4yIDAgMCAwIDUxLjIgNTEuMmg1MTJhNTEuMiA1MS4yIDAgMCAwIDUxLjItNTEuMnogbS0zNTguNCAyMDQuOGgyNTZWNDM1LjJINDYwLjh6IG0wLTE1My42aDI1NnYxMDIuNEg0NjAuOHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJhdHRyaWJ1dGUiIHVuaWNvZGU9IiYjNTkwNzE7IiBkPSJNMTAyNCA1MTEuMzQxNzE0VjcyNC42MjYyODZDMTAyNCA4MDMuMTA4NTcxIDk1OC40NjQgODY2Ljc0Mjg1NyA4NzcuNzE0Mjg2IDg2Ni43NDI4NTdIMTQ2LjI4NTcxNEM2NS41MzYgODY2Ljc0Mjg1NyAwIDgwMy4xMDg1NzEgMCA3MjQuNjI2Mjg2di03MTAuNTA5NzE1QzAtNjQuMzY1NzE0IDY1LjUzNi0xMjggMTQ2LjI4NTcxNC0xMjhoNzMxLjQyODU3MmM4MC43NDk3MTQgMCAxNDYuMjg1NzE0IDYzLjYzNDI4NiAxNDYuMjg1NzE0IDE0Mi4xMTY1NzF6TTk0LjU3MzcxNCA3NzQuODc1NDI5YzEzLjY3NzcxNCAxMy4zODUxNDMgMzIuMzI5MTQzIDIwLjkxODg1NyA1MS43ODUxNDMgMjAuODQ1NzE0aDczMS41MDE3MTRjMTkuNDU2IDAgMzguMDM0Mjg2LTcuNTMzNzE0IDUxLjcxMi0yMC44NDU3MTQgMTMuNzUwODU3LTEzLjM4NTE0MyAyMS4zNTc3MTQtMzEuNDUxNDI5IDIxLjM1NzcxNS01MC4zMjIyODZ2LTE0Mi4xODk3MTRINzMuMDY5NzE0VjcyNC41NTMxNDNjMCAxOC44NzA4NTcgNy42OCAzNy4wMTAyODYgMjEuNTA0IDUwLjMyMjI4NnogbTMwNy41NjU3MTUtNTEyLjIxOTQyOXYyNDguNjg1NzE0aDIxOS43MjExNDJ2LTI0OC42ODU3MTR6IG0yMTkuNzIxMTQyLTcwLjk0ODU3MXYtMjQ4LjY4NTcxNUg0MDIuMTM5NDI5djI0OC42ODU3MTV6IG0tMjkyLjc5MDg1NyA3MC45NDg1NzFINzMuMTQyODU3djI0OC42ODU3MTRoMjU2eiBtLTIzNC40OTYtMjk4LjkzNDg1N2E2OS40ODU3MTQgNjkuNDg1NzE0IDAgMCAwLTIxLjUwNCA1MC4xNzZWMTkxLjYzNDI4NmgyNTZ2LTI0OC42ODU3MTVIMTQ2LjM1ODg1N2E3My44NzQyODYgNzMuODc0Mjg2IDAgMCAwLTUxLjc4NTE0MyAyMC43NzI1NzJ6TTk1MC44NTcxNDMgMTMuODk3MTQzYzAtMTguNzk3NzE0LTcuNjgtMzYuODY0LTIxLjM1NzcxNC01MC4xNzZzLTMyLjMyOTE0My0yMC43NzI1NzEtNTEuNzEyLTIwLjY5OTQyOUg2OTQuOTMwMjg2djI0OC42ODU3MTVIOTUwLjg1NzE0M3ogbTAgMjQ4Ljc1ODg1N0g2OTQuODU3MTQzdjI0OC42ODU3MTRIOTUwLjg1NzE0M3oiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJsZWdlbmQtc21hbGwiIHVuaWNvZGU9IiYjNTkwNzI7IiBkPSJNMjczLjM0Njg1MSAxODUuNTY0Mjc5Yy0xOS4wMTcwNjEgMC0zOC4xMDcyNjUtMTkuMTYzMzQ2LTM4LjEwNzI2NS0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xMDcyNjUtMzguMzk5ODM2IDM4LjEwNzI2NSAxOS4yMzY0ODkgMzguMTA3MjY2IDM4LjM5OTgzNmMwIDI1LjU5OTg5LTEyLjY1MzY2IDM4LjM5OTgzNS0zOC4xMDcyNjYgMzguMzk5ODM1eiBtMCA0NzMuNTk3OTdjLTE5LjAxNzA2MSAwLTM4LjEwNzI2NS0xOS4xNjMzNDYtMzguMTA3MjY1LTM4LjM5OTgzNXMxOS4wMTcwNjEtMzguMzk5ODM1IDM4LjEwNzI2NS0zOC4zOTk4MzYgMzguMTA3MjY1IDE5LjIzNjQ4OSAzOC4xMDcyNjYgMzguMzk5ODM2LTEyLjY1MzY2IDM4LjM5OTgzNS0zOC4xMDcyNjYgMzguMzk5ODM1eiBtMC0yMzYuNzYyNDE0Yy0xOS4wMTcwNjEgMC0zOC4xMDcyNjUtMTkuMjM2NDg5LTM4LjEwNzI2NS0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xMDcyNjUtMzguMzk5ODM1IDM4LjEwNzI2NSAxOS4xNjMzNDYgMzguMTA3MjY2IDM4LjM5OTgzNS0xMi42NTM2NiAzOC4zOTk4MzUtMzguMTA3MjY2IDM4LjM5OTgzNXpNODU4LjEyMTQ4OCA4OTUuOTk3ODA2aC02OTkuMjQyNzE3QTE1Ny45MTQ3NTIgMTU3LjkxNDc1MiAwIDAgMSAwLjAxMzE2NiA3MzUuOTYxOTJWMjUuNjAxNTM2QzAuMDEzMTY2LTU3LjYzNDY3OSA2OS45Mzc0MzctMTI3Ljk5NzgwNiAxNTguOTUxOTEzLTEyNy45OTc4MDZoNzA1LjUzMjk3NmExNTcuOTE0NzUyIDE1Ny45MTQ3NTIgMCAwIDEgMTU4LjkzODc0OCAxNTkuOTYyNzQzVjczNS45NjE5MkMxMDE3LjA2MDIzNiA4MjUuNTYxNTM2IDk0Ny4xMzU5NjQgODk1Ljk5NzgwNiA4NTguMTIxNDg4IDg5NS45OTc4MDZ6IG04Mi42NTEwNzQtODY0LjAzMjg2OWE3Ny41MzEwOTYgNzcuNTMxMDk2IDAgMCAwLTc2LjI4NzY3My03Ni43OTk2NzFIMTU4Ljk1MTkxM2MtNDQuNTQzODA5IDAtNzYuMjg3NjczIDM4LjM5OTgzNS03Ni4yODc2NzMgNzYuNzk5NjcxVjczNi4wMzUwNjNjMCA0NC43NjMyMzcgMzguMTA3MjY1IDc2Ljc5OTY3MSA3Ni4yODc2NzMgNzYuNzk5NjcxaDcwNS41MzI5NzZjNDQuNTQzODA5IDAgNzYuMjg3NjczLTM4LjM5OTgzNSA3Ni4yODc2NzMtNzYuNzk5NjcxeiBtLTE5Ny4wNDYwMTIgNjI3LjE5NzMxMkg0MzIuMjg1NTk5Yy0yNS40NTM2MDUgMC0zOC4xODA0MDgtMTkuMTYzMzQ2LTM4LjE4MDQwOC0zOC4zOTk4MzVzMTkuMDE3MDYxLTM4LjM5OTgzNSAzOC4xODA0MDgtMzguMzk5ODM2aDMxMS40NDA5NTFjMTkuMDE3MDYxIDAgMzguMTA3MjY1IDE5LjIzNjQ4OSAzOC4xMDcyNjUgMzguMzk5ODM2cy0xOS4wMTcwNjEgMzguMzk5ODM1LTM4LjEwNzI2NSAzOC4zOTk4MzV6IG0wLTIzNi43NjI0MTRINDMyLjI4NTU5OWMtMjUuNDUzNjA1IDAtMzguMTgwNDA4LTE5LjIzNjQ4OS0zOC4xODA0MDgtMzguMzk5ODM1czE5LjAxNzA2MS0zOC4zOTk4MzUgMzguMTgwNDA4LTM4LjM5OTgzNWgzMTEuNDQwOTUxYzE5LjAxNzA2MSAwIDM4LjEwNzI2NSAxOS4xNjMzNDYgMzguMTA3MjY1IDM4LjM5OTgzNXMtMTkuMDE3MDYxIDM4LjM5OTgzNS0zOC4xMDcyNjUgMzguMzk5ODM1eiBtMC0yMzYuODM1NTU2SDQzMi4yODU1OTljLTE5LjA5MDIwNCAwLTM4LjE4MDQwOC0xOS4xNjMzNDYtMzguMTgwNDA4LTM4LjM5OTgzNXMxOS4wMTcwNjEtMzguMzk5ODM1IDM4LjE4MDQwOC0zOC4zOTk4MzZoMzExLjQ0MDk1MWMxOS4wMTcwNjEgMCAzOC4xMDcyNjUgMTkuMjM2NDg5IDM4LjEwNzI2NSAzOC4zOTk4MzYgMCAyNS41OTk4OS0xOS4wMTcwNjEgMzguMzk5ODM1LTM4LjEwNzI2NSAzOC4zOTk4MzV6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iY2xvc2UtbGVnZW5kIiB1bmljb2RlPSImIzU5MDczOyIgZD0iTTY0My4xNDUxNDMgNTg2Ljg5ODI4Nkw1MTIgNDU1LjY4IDM4MC44NTQ4NTcgNTg2Ljg5ODI4NmwtNzEuNjgtNzEuNzUzMTQzTDQ0MC4xNzM3MTQgMzg0IDMwOS4xMDE3MTQgMjUyLjg1NDg1N2w3MS43NTMxNDMtNzEuNjhMNTEyIDMxMi4xNzM3MTRsMTMxLjE0NTE0My0xMzEuMTQ1MTQzIDcxLjY4IDcxLjc1MzE0M0w1ODMuODI2Mjg2IDM4NGwxMzEuMTQ1MTQzIDEzMS4xNDUxNDN6TTUxMiA4OTEuMTcyNTcxQTUwNy4wOTk0MjkgNTA3LjA5OTQyOSAwIDAgMSA0Ljc1NDI4NiAzODQgNTA3LjA5OTQyOSA1MDcuMDk5NDI5IDAgMCAxIDUxMi0xMjMuMjQ1NzE0IDUwNy4wOTk0MjkgNTA3LjA5OTQyOSAwIDAgMSAxMDE5LjI0NTcxNCAzODQgNTA3LjA5OTQyOSA1MDcuMDk5NDI5IDAgMCAxIDUxMiA4OTEuMjQ1NzE0eiBtMC05MTIuOTY5MTQyQTQwNi4zMDg1NzEgNDA2LjMwODU3MSAwIDAgMCAxMDYuMjAzNDI5IDM4NCA0MDYuMzA4NTcxIDQwNi4zMDg1NzEgMCAwIDAgNTEyIDc4OS43OTY1NzEgNDA2LjMwODU3MSA0MDYuMzA4NTcxIDAgMCAwIDkxNy43OTY1NzEgMzg0IDQwNi4zMDg1NzEgNDA2LjMwODU3MSAwIDAgMCA1MTItMjEuNzk2NTcxeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZvbnQtY29sb3IiIHVuaWNvZGU9IiYjNTkwNzQ7IiBkPSJNNDk1Ljg3MiA4MzJMMjQ0LjIyNCAxNjBoMTE5LjY4bDUyLjIyNCAxNTYuOGgyNTUuNzQ0bDU2LjMyLTE1Ni44aDExOS42OEw1OTYuMjg4IDgzMkg0OTUuODcyek01NDQgNjg5LjE1Mmw5Mi4xNi0yNzguNTI4SDQ0Ny43NDRMNTQ0IDY4OS4yMTZ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iYm9sZCIgdW5pY29kZT0iJiM1OTA3NTsiIGQ9Ik0zODQgMzk3LjgyNGgyMDguODk2YzMwLjcyIDAgNTYuMzIgOC43MDQgNzYuOCAyNi4xMTIgMjAuNDggMTcuNDA4IDMwLjcyIDQyLjQ5NiAzMC43MiA3NS4yNjQgMCAzNi44NjQtOS4yMTYgNjIuNzg0LTI3LjY0OCA3Ny44MjQtMTguNDMyIDE1LjA0LTQ1LjA1NiAyMi41MjgtNzkuODcyIDIyLjUyOEgzODR2LTIwMS43Mjh6TTI1NiA3MDRoMzU1LjMyOGM2NS41MzYgMCAxMTguMDgtMTUuMDQgMTU3LjY5Ni00NS4wNTYgMzkuNjE2LTMwLjA4IDU5LjM5Mi03NS40NTYgNTkuMzkyLTEzNi4xOTIgMC0zNi44NjQtOS4wMjQtNjguNDgtMjcuMTM2LTk0LjcyLTE4LjExMi0yNi4yNC00My44NC00Ni41OTItNzcuMzEyLTYwLjkyOHYtMi4wNDhjNDUuMDU2LTkuNiA3OS4xNjgtMzAuOTEyIDEwMi40LTY0czM0LjgxNi03NC41NiAzNC44MTYtMTI0LjQxNmMwLTI4LjY3Mi01LjEyLTU1LjQ4OC0xNS4zNi04MC4zODQtMTAuMjQtMjQuOTYtMjYuMjQtNDYuNC00OC4xMjgtNjQuNTEyLTIxLjgyNC0xOC4xMTItNDkuODU2LTMyLjQ0OC04My45NjgtNDMuMDA4LTM0LjExMi0xMC41Ni03NC43NTItMTUuODcyLTEyMS44NTYtMTUuODcySDI1NlY3MDR6IG0xMjgtNjI2LjY4OGgyMjYuMzA0YzM4LjkxMiAwIDY5LjEyIDEwLjA0OCA5MC42MjQgMzAuMjA4IDIxLjUwNCAyMC4xNiAzMi4yNTYgNDguNjQgMzIuMjU2IDg1LjUwNCAwIDM2LjE2LTEwLjc1MiA2NC0zMi4yNTYgODMuNDU2LTIxLjUwNCAxOS40NTYtNTEuNzEyIDI5LjE4NC05MC42MjQgMjkuMTg0SDM4NHYtMjI4LjM1MnoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJpdGFsaWNzIiB1bmljb2RlPSImIzU5MDc2OyIgZD0iTTYxNi41MTIgNTc2bC03OS4wNC00NDhINzA0di0xMjhIMjU2djEyOGgxNTEuNDg4bDc5LjA0IDQ0OEgzMjBWNzA0aDQ0OHYtMTI4SDYxNi41MTJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0iZm9udCIgdW5pY29kZT0iJiM1OTA3NzsiIGQ9Ik04NzUuMjY0IDBoLTEwNi42ODhhMjAuNjA4IDIwLjYwOCAwIDAgMC0xOS4zMjggMTMuNTY4bC03Ny40NCAyMDYuMjA4SDQwNC40OGwtNzIuODMyLTIwNS43NmEyMC43MzYgMjAuNzM2IDAgMCAwLTE5LjQ1Ni0xNC4wMTZIMjEyLjczNmEyMC44IDIwLjggMCAwIDAtMTcuMTUyIDkuMjE2IDIxLjY5NiAyMS42OTYgMCAwIDAtMi4xNzYgMTkuNjQ4TDQ2NS4yMTYgNzU0LjQzMkEyMC42NzIgMjAuNjcyIDAgMCAwIDQ4NC42MDggNzY4aDEwMC45MjhjOC4zMiAwIDE2LTUuMTg0IDE5LjItMTMuMTg0bDI4OS43MjgtNzI1LjUwNGEyMS40NCAyMS40NCAwIDAgMC0xLjk4NC0xOS44NCAyMC42NzIgMjAuNjcyIDAgMCAwLTE3LjIxNi05LjQ3MnpNNDQ2Ljg0OCAzNDAuNDE2aDE4MC4yMjRsLTYzLjM2IDE3Mi4yMjRjLTEwLjU2IDI4LjgtMTkuOTY4IDU1LjI5Ni0yOC4wOTYgNzkuMzYtNi4yNzItMjIuNTI4LTEzLjQ0LTQ0Ljk5Mi0yMS40NC02Ny4zMjhsLTY3LjMyOC0xODQuMzJ6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0ianVzdGlmeS1hbGlnbiIgdW5pY29kZT0iJiM1OTA3ODsiIGQ9Ik0xMjggMzg0VjUxMmg3Njh2LTEyOEgxMjh6IG0wIDE5MlY3MDRoNzY4di0xMjhIMTI4eiBtMC01NzZ2MTI4aDc2OHYtMTI4SDEyOHogbTc2OCAzMjB2LTEyOEgxMjhWMzIwaDc2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJtaWRkbGUtYWxpZ25tZW4iIHVuaWNvZGU9IiYjNTkwNzk7IiBkPSJNMjU2IDM4NFY1MTJoNTEydi0xMjhIMjU2ek0xMjggNTc2VjcwNGg3Njh2LTEyOEgxMjh6IG0wLTU3NnYxMjhoNzY4di0xMjhIMTI4eiBtNjQwIDMyMHYtMTI4SDI1NlYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImZvbnQtc2l6ZSIgdW5pY29kZT0iJiM1OTA4MDsiIGQ9Ik0yNjEuNTA0IDI5My42MzJsMTAzLjY4IDM0Mi44NDggMTA0LjA2NC0zNDIuODQ4SDI2MS41MDRNNDU4LjY4OCA3NjhoLTE1OC4wOEw2NCAwaDEwOS42MzJsNTUuOTM2IDE4Mi43ODRINTAzLjY4TDU2MC42NCAwaDEzNy4yOEw0NTguNjg4IDc2OG0yNDguNTc2LTU5MC4wOGw2MC4xNiAxNjMuODQgNjAuMjI0LTE2My44NGgtMTIwLjM4NG0xMTQuMzA0IDI0MC4xMjhoLTkxLjU4NGwtNzMuNi0yMDMuNDU2IDMxLjg3Mi0xMDIuNDY0IDAuNTEyIDEuNDcyaDE1OC43ODRsMzMuMDI0LTEwNS43OTJIOTYwbC0xMzguNDMyIDQxMC4yNCIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InN0cmlrZW91dCIgdW5pY29kZT0iJiM1OTA4MTsiIGQ9Ik0zMzIuNDggMzg0QzI4NS41MDQgNDI0LjE5MiAyNTYgNDgwLjQ0OCAyNTYgNTQ0IDI1NiA2NzAuNTI4IDM3Mi45MjggNzY4IDUxMiA3NjhzMjU2LTk3LjQ3MiAyNTYtMjI0aC0xMjhDNjQwIDU5NC4xNzYgNTg0Ljk2IDY0MCA1MTIgNjQwYy03Mi45NiAwLTEyOC00NS44MjQtMTI4LTk2UzQzOS4wNCA0NDggNTEyIDQ0OGM2OS4yNDggMCAxMzIuOTI4LTI0LjEyOCAxNzkuNTItNjRIODMydi02NGgtODguMzJjMTUuNTUyLTI4Ljg2NCAyNC4zMi02MS4zNzYgMjQuMzItOTYgMC0xMjYuNTI4LTExNi45MjgtMjI0LTI1Ni0yMjRzLTI1NiA5Ny40NzItMjU2IDIyNGgxMjhjMC01MC4xNzYgNTUuMDQtOTYgMTI4LTk2IDcyLjk2IDAgMTI4IDQ1LjgyNCAxMjggOTZTNTg0Ljk2IDMyMCA1MTIgMzIwSDI1NlYzODRoNzYuNDh6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0idGV4dC1sYXllciIgdW5pY29kZT0iJiM1OTA4MjsiIGQ9Ik01NzYgNjQwdi03NjhINDQ4VjY0MEg2NFY4MzJoODk2di0xOTJINTc2eiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InJpZ2h0LWFsaWdubWVudCIgdW5pY29kZT0iJiM1OTA4MzsiIGQ9Ik0zODQgNTc2VjcwNGg1MTJ2LTEyOEgzODR6IG0xMjgtMTkyVjUxMmgzODR2LTEyOEg1MTJ6IG0tMzg0LTM4NHYxMjhoNzY4di0xMjhIMTI4eiBtNzY4IDMyMHYtMTI4SDM4NFYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9ImxlZnQtYWxpZ25tZW50IiB1bmljb2RlPSImIzU5MDg0OyIgZD0iTTEyOCA1NzZWNzA0aDUxMnYtMTI4SDEyOHogbTAtMTkyVjUxMmgzODR2LTEyOEgxMjh6IG0wLTM4NHYxMjhoNzY4di0xMjhIMTI4eiBtNTEyIDMyMHYtMTI4SDEyOFYzMjBoNTEyeiIgIGhvcml6LWFkdi14PSIxMDI0IiAvPgoKICAgIAogICAgPGdseXBoIGdseXBoLW5hbWU9InRyYW5zcGFyZW50LWJhY2tncm91IiB1bmljb2RlPSImIzU5MDg1OyIgZD0iTTIyMC44IDgzMkw2NCA2NzUuMnYtNzEuMTY4TDI5MS45NjggODMySDIyMC44NjR6IG0xOTMuMzQ0IDBMNjQgNDgxLjg1NnYtNzEuMTY4TDQ4NS4zMTIgODMySDQxNC4wOHogbTE5My4yOCAwTDY0IDI4OC41MTJ2LTcxLjEwNEw2NzguNTkyIDgzMkg2MDcuNDg4eiBtMTkzLjM0NCAwTDY0IDk1LjIzMnYtNzEuMTY4TDg3MS45MzYgODMyaC03MS4xNjh6TTk2MCA3OTUuMzkyYTQ0LjggNDQuOCAwIDAgMS05Ljc5Mi03LjI5NkwxMDAuNjcyLTYxLjQ0Yy0wLjgzMi0wLjc2OC0xLjIxNi0xLjcyOC0xLjkyLTIuNTZoNzAuNDY0TDk2MCA3MjYuNzg0Vjc5NS4zOTJ6IG0wLTE5MC43ODRMMjkxLjM5Mi02NGg3MS4xNjhMOTYwIDUzMy40NFY2MDQuNjA4eiBtMC0xOTMuMjhMNDg0LjczNi02NGg3MS4xMDRMOTYwIDM0MC4xNlY0MTEuMjY0eiBtMC0xOTMuMzQ0TDY3OC4wMTYtNjRoNzEuMTY4TDk2MCAxNDYuODE2djcxLjE2OHoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKICAgIDxnbHlwaCBnbHlwaC1uYW1lPSJ1bmRlcmxpbmUiIHVuaWNvZGU9IiYjNTkwODY7IiBkPSJNNjQwIDcwNGgxMjh2LTM1OC40YzAtMTE5LjI5Ni05Mi4xNi0yMTcuNi0yMDgtMjE3LjZoLTk2QzM0OC4xNiAxMjggMjU2IDIyNi4zMDQgMjU2IDM0NS42VjcwNGgxMjh2LTM1OC40YzAtNTAuMzY4IDM2LjgtODkuNiA4MC04OS42aDk2QzYwMy4yIDI1NiA2NDAgMjk1LjIzMiA2NDAgMzQ1LjZWNzA0ek0yNTYgNjRoNTEydi02NEgyNTZ2NjR6IiAgaG9yaXotYWR2LXg9IjEwMjQiIC8+CgogICAgCiAgICA8Z2x5cGggZ2x5cGgtbmFtZT0icXVlcnkiIHVuaWNvZGU9IiYjNTkwODc7IiBkPSJNNTEyIDg5NC45NzZDMjI5LjIyOTcxNCA4OTQuOTc2IDAgNjY2LjE4NTE0MyAwIDM4NGMwLTI4Mi4xODUxNDMgMjI5LjIyOTcxNC01MTAuOTc2IDUxMi01MTAuOTc2UzEwMjQgMTAxLjgxNDg1NyAxMDI0IDM4NEMxMDI0IDY2Ni4xODUxNDMgNzk0Ljc3MDI4NiA4OTQuOTc2IDUxMiA4OTQuOTc2eiBtNDkuNzM3MTQzLTgwNS44MTQ4NTdhMjUuNiAyNS42IDAgMCAwLTI1LjYtMjUuNkg0NTkuMzM3MTQzYTI1LjYgMjUuNiAwIDAgMC0yNS42IDI1LjZWMTY1LjgxNDg1N2EyNS42IDI1LjYgMCAwIDAgMjUuNiAyNS41MjY4NTdoNzYuOGEyNS42IDI1LjYgMCAwIDAgMjUuNi0yNS42di03Ni41ODA1NzF6IG0xMjYuODI5NzE0IDM1MS42NzA4NTdjLTEwLjI0LTE0LjYyODU3MS0zMy42NDU3MTQtMzMuMjgtNjIuOTAyODU3LTU2LjAyNzQyOWwtMzIuNDAyMjg2LTIyLjM4MTcxNGMtMTUuNzI1NzE0LTEyLjE0MTcxNC0yOS42OTYtMjYuMzMxNDI5LTM0LjgxNi00Mi41NjkxNDNhMTMwLjE5NDI4NiAxMzAuMTk0Mjg2IDAgMCAxLTMuOTQ5NzE0LTI0LjQyOTcxNGMtMC41MTItNC45NzM3MTQtNC45MDA1NzEtMTUuMDY3NDI5LTE1LjI4Njg1Ny0xNS4wNjc0MjloLTgzLjM4Mjg1N2MtMTMuNDU4Mjg2IDAtMTUuODcyIDEwLjYwNTcxNC0xNS42NTI1NzIgMTUuNzk4ODU4IDEuNDYyODU3IDMzLjkzODI4NiA0LjYwOCA2NC4wNzMxNDMgMTguNDMyIDgwLjMxMDg1NyAyOC4wODY4NTcgMzIuODQxMTQzIDkxLjk0MDU3MSA3My43MjggOTEuOTQwNTcyIDczLjcyOCA5LjcyOCA3LjMxNDI4NiAxNy41NTQyODYgMTUuMjg2ODU3IDIzLjU1MiAyMy45MTc3MTQgMTAuODI1MTQzIDE0LjkyMTE0MyAxOS43NDg1NzEgMzEuMjMyIDE5Ljc0ODU3MSA0OS4xNTIgMCAyMC40OC01Ljk5NzcxNCAzOS4yNzc3MTQtMTguMDY2Mjg2IDU2LjE3MzcxNC0xMi4wNjg1NzEgMTYuODk2LTM0LjA4NDU3MSAyNS4zODA1NzEtNjYuMDQ4IDI1LjM4MDU3Mi0zMS40NTE0MjkgMC01My42ODY4NTctMTAuNDU5NDI5LTY2Ljg1MjU3MS0zMS4yMzItOS43MjgtMTUuMzYtMTUuNzk4ODU3LTI5LjU0OTcxNC0xOC4yODU3MTQtNDQuOTA5NzE1LTAuOTUwODU3LTUuNDg1NzE0LTQuMzg4NTcxLTE2Ljk2OTE0My0xNi4wOTE0MjktMTYuOTY5MTQySDMyNy4xNjhjLTE3LjI2MTcxNCAwLTIxLjA2NTE0MyAxMS4xOTA4NTctMjAuNjI2Mjg2IDE2LjYwMzQyOCA2LjI5MDI4NiA2OC4wMjI4NTcgMzIuOTE0Mjg2IDExNC40Njg1NzEgODAuMDE4Mjg2IDE0NC4zMTA4NTcgMzEuOTYzNDI5IDIwLjQ4IDcxLjM4NzQyOSAzMC44NjYyODYgMTE4LjEyNTcxNCAzMC44NjYyODYgNjEuMzY2ODU3IDAgMTEyLjM0NzQyOS0xNC42Mjg1NzEgMTUyLjk0MTcxNS00My44ODU3MTQgNDAuNTk0Mjg2LTI5LjI1NzE0MyA2MC45MjgtNzIuNDg0NTcxIDYwLjkyOC0xMjkuOTAxNzE1IDAtMzUuMTA4NTcxLTEyLjQzNDI4Ni02NC44MDQ1NzEtMjkuOTg4NTcyLTg4Ljg2ODU3MXoiICBob3Jpei1hZHYteD0iMTAyNCIgLz4KCiAgICAKCgogIDwvZm9udD4KPC9kZWZzPjwvc3ZnPgo=#supermapol-icons) format('svg')}[class*=" supermapol-icons-"],[class^=supermapol-icons-]{font-family:supermapol-icons!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.supermapol-icons-map:before{content:""}.supermapol-icons-more:before{content:"\e61d"}.supermapol-icons-delete:before{content:"\e61f"}.supermapol-icons-visible:before{content:"\e620"}.supermapol-icons-zoom-to:before{content:"\e621"}.supermapol-icons-output:before{content:"\e622"}.supermapol-icons-opacity:before{content:"\e625"}.supermapol-icons-layer-info:before{content:"\e627"}.supermapol-icons-save:before{content:"\e628"}.supermapol-icons-layer-style:before{content:"\e629"}.supermapol-icons-line-layer:before{content:"\e62a"}.supermapol-icons-skin:before{content:"\e62b"}.supermapol-icons-marker-layer:before{content:"\e62c"}.supermapol-icons-point-layer:before{content:"\e62d"}.supermapol-icons-polygon-layer:before{content:"\e62e"}.supermapol-icons-invisible:before{content:"\e62f"}.supermapol-icons-search:before{content:"\e630"}.supermapol-icons-edit:before{content:"\e633"}.supermapol-icons-layers:before{content:"\e634"}.supermapol-icons-baselayer:before{content:"\e635"}.supermapol-icons-setting:before{content:"\e636"}.supermapol-icons-add:before{content:"\e638"}.supermapol-icons-preview:before{content:"\e637"}.supermapol-icons-refresh:before{content:"\e639"}.supermapol-icons-solid-triangle:before{content:"\e63a"}.supermapol-icons-roadnetwork:before{content:"\e63b"}.supermapol-icons-return:before{content:"\e63c"}.supermapol-icons-packup:before{content:"\e63d"}.supermapol-icons-share:before{content:"\e63e"}.supermapol-icons-backhomepage:before{content:"\e659"}.supermapol-icons-MyMaps:before{content:"\e65a"}.supermapol-icons-CreateMap:before{content:"\e65b"}.supermapol-icons-feedback:before{content:"\e65c"}.supermapol-icons-skin1:before{content:"\e65d"}.supermapol-icons-Shape-:before{content:"\e65e"}.supermapol-icons-account:before{content:"\e65f"}.supermapol-icons-Shape-1:before{content:"\e660"}.supermapol-icons-Shape-2:before{content:"\e661"}.supermapol-icons-Shape-3:before{content:"\e662"}.supermapol-icons-Shape-4:before{content:"\e663"}.supermapol-icons-Shape-5:before{content:"\e664"}.supermapol-icons-Shape-6:before{content:"\e665"}.supermapol-icons-Shape-7:before{content:"\e666"}.supermapol-icons-Shape-8:before{content:"\e667"}.supermapol-icons-Shape-9:before{content:"\e668"}.supermapol-icons-Shape-10:before{content:"\e669"}.supermapol-icons-Shape-11:before{content:"\e66a"}.supermapol-icons-Shape-12:before{content:"\e66b"}.supermapol-icons-Shape-13:before{content:"\e66c"}.supermapol-icons-Shape-14:before{content:"\e66d"}.supermapol-icons-Shape-15:before{content:"\e66e"}.supermapol-icons-Shape-16:before{content:"\e66f"}.supermapol-icons-Shape-17:before{content:"\e670"}.supermapol-icons-Shape-18:before{content:"\e671"}.supermapol-icons-Shape-19:before{content:"\e672"}.supermapol-icons-Shape-20:before{content:"\e673"}.supermapol-icons-Shape-21:before{content:"\e674"}.supermapol-icons-Shape-22:before{content:"\e675"}.supermapol-icons-Shape-23:before{content:"\e676"}.supermapol-icons-Shape-24:before{content:"\e677"}.supermapol-icons-Shape-25:before{content:"\e678"}.supermapol-icons-Shape-26:before{content:"\e679"}.supermapol-icons-Shape-27:before{content:"\e67a"}.supermapol-icons-Shape-28:before{content:"\e67b"}.supermapol-icons-Shape-29:before{content:"\e67c"}.supermapol-icons-Shape-30:before{content:"\e67d"}.supermapol-icons-Shape-31:before{content:"\e67e"}.supermapol-icons-Shape-32:before{content:"\e67f"}.supermapol-icons-Shape-33:before{content:"\e680"}.supermapol-icons-Shape-34:before{content:"\e681"}.supermapol-icons-Shape-35:before{content:"\e682"}.supermapol-icons-Shape-36:before{content:"\e683"}.supermapol-icons-Shape-37:before{content:"\e684"}.supermapol-icons-Shape-38:before{content:"\e685"}.supermapol-icons-Shape-39:before{content:"\e686"}.supermapol-icons-Shape-40:before{content:"\e687"}.supermapol-icons-Shape-41:before{content:"\e688"}.supermapol-icons-Shape-42:before{content:"\e689"}.supermapol-icons-Shape-43:before{content:"\e68a"}.supermapol-icons-Shape-44:before{content:"\e68b"}.supermapol-icons-Shape-45:before{content:"\e68c"}.supermapol-icons-Shape-46:before{content:"\e68d"}.supermapol-icons-Shape-47:before{content:"\e68e"}.supermapol-icons-Shape-48:before{content:"\e68f"}.supermapol-icons-Shape-49:before{content:"\e690"}.supermapol-icons-Shape-50:before{content:"\e691"}.supermapol-icons-Shape-51:before{content:"\e692"}.supermapol-icons-Shape-52:before{content:"\e693"}.supermapol-icons-Shape-53:before{content:"\e694"}.supermapol-icons-Shape-54:before{content:"\e695"}.supermapol-icons-Shape-55:before{content:"\e696"}.supermapol-icons-Shape-56:before{content:"\e697"}.supermapol-icons-Shape-57:before{content:"\e698"}.supermapol-icons-Shape-58:before{content:"\e699"}.supermapol-icons-Shape-59:before{content:"\e69a"}.supermapol-icons-Oval:before{content:"\e69b"}.supermapol-icons-Rectangle:before{content:"\e69c"}.supermapol-icons-Star:before{content:"\e69d"}.supermapol-icons-Triangle:before{content:"\e69e"}.supermapol-icons-restoredefault:before{content:"\e6a0"}.supermapol-icons-uploading:before{content:"\e6a1"}.supermapol-icons-error:before{content:"\e69f"}.supermapol-icons-zoomin:before{content:"\e6a2"}.supermapol-icons-zoomout:before{content:"\e6a3"}.supermapol-icons-first:before{content:"\e6a4"}.supermapol-icons-next:before{content:"\e6a5"}.supermapol-icons-last:before{content:"\e6a6"}.supermapol-icons-prev:before{content:"\e6a7"}.supermapol-icons-poi-load:before{content:"\e6a8"}.supermapol-icons-poi-save:before{content:"\e6a9"}.supermapol-icons-fold:before{content:"\e6aa"}.supermapol-icons-label-delete:before{content:"\e6ab"}.supermapol-icons-upload:before{content:"\e6ac"}.supermapol-icons-unfold:before{content:"\e6ad"}.supermapol-icons-close:before{content:"\e6ae"}.supermapol-icons-mark:before{content:"\e6af"}.supermapol-icons-traffic:before{content:"\e6b0"}.supermapol-icons-full-figure:before{content:"\e6b1"}.supermapol-icons-measure:before{content:"\e6b2"}.supermapol-icons-display-list:before{content:"\e6b3"}.supermapol-icons-hide-list:before{content:"\e6b4"}.supermapol-icons-rename:before{content:"\e6b5"}.supermapol-icons-copy:before{content:"\e6b6"}.supermapol-icons-qq-zone:before{content:"\e6b7"}.supermapol-icons-sina-weibo:before{content:"\e6b8"}.supermapol-icons-color-change:before{content:"\e6b9"}.supermapol-icons-creat-custom-map:before{content:"\e6ba"}.supermapol-icons-custom-map:before{content:"\e6bb"}.supermapol-icons-legend-fold:before{content:"\e6bc"}.supermapol-icons-legend-unfold:before{content:"\e6bd"}.supermapol-icons-legend-big:before{content:"\e6be"}.supermapol-icons-attribute:before{content:"\e6bf"}.supermapol-icons-legend-small:before{content:"\e6c0"}.supermapol-icons-close-legend:before{content:"\e6c1"}.supermapol-icons-font-color:before{content:"\e6c2"}.supermapol-icons-bold:before{content:"\e6c3"}.supermapol-icons-italics:before{content:"\e6c4"}.supermapol-icons-font:before{content:"\e6c5"}.supermapol-icons-justify-align:before{content:"\e6c6"}.supermapol-icons-middle-alignmen:before{content:"\e6c7"}.supermapol-icons-font-size:before{content:"\e6c8"}.supermapol-icons-strikeout:before{content:"\e6c9"}.supermapol-icons-text-layer:before{content:"\e6ca"}.supermapol-icons-right-alignment:before{content:"\e6cb"}.supermapol-icons-left-alignment:before{content:"\e6cc"}.supermapol-icons-transparent-backgrou:before{content:"\e6cd"}.supermapol-icons-underline:before{content:"\e6ce"}.supermapol-icons-query:before{content:"\e6cf"}@font-face{font-family:supermapol-icons;src:url(data:application/vnd.ms-fontobject;base64,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);src:url(data:application/vnd.ms-fontobject;base64,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#iefix) format('embedded-opentype'),url(data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBsUAAAC8AAAAYGNtYXAXVtMSAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZnXmE48AAAF4AABJdGhlYWQP4o6CAABK7AAAADZoaGVhCUoF5wAASyQAAAAkaG10eEEFRIwAAEtIAAACQGxvY2HmKtN4AABNiAAAASJtYXhwAKIA+AAATqwAAAAgbmFtZfrmE40AAE7MAAAB8nBvc3QAAwAAAABQwAAAACAAAwQQAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpiwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Yv//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAADAIYATQN6AzMADgAaAB4AAAEhIgYVERQWMyEyNjURJwMiJjU0NjMyFhUUBhMhNSECzv4MIzExIwJMIzGszzRKSjQ1SUlK/lwBpAMzMCL9viIwMCIB7Kj9aUkzM0lJMzNJAZ2lAAAAAAQAiQBJA3cDNwAUAEUAWQB4AAABIg4CFRQeAjMyPgI1NC4CIwM0JjU0JjU0NicuASc+AzcOAQcOAQcOARUUFjc2MhceAQcOAQcOARUGFiMiJjUxFyImJz4BNzI2Nz4BNzYWFw4BIzE3LgE3PgEnLgEjLgEnJjYnJgYnNDY3HgMVFAYHMQIATohmOztmiE5OiGY7O2aITr8LMxoFBDgPDSw5RCYFFggREwkKKxcHCCILDG8bCToKAggBCQwML7waMhcOCw0OGxAPMBcUPQsmWDD8CAsIBwUCARMWFSANGlQaCDgGBwUqRzMdHxsDNztmiE5OiGY7O2aITk6IZjv95Qk0GRoUIh8kDw8GAihENCIGCwwJEggREisMDRYCAwUFJFUbEiwHKgkOTEIJjwcHBg0BBwQCEwIBCBAWF4gHIBITRREROwETHDstIAkmPQUMBw85TFwzNV8nAAAAAAIAzQAEAzMDfAAUACAAAAEiDgIVFB4CMTA+AjU0LgIjExQGIyImNTQ2MzIWAgBAcFMwYHNgYHNgMFNwQKtkR0dkZEdHZAN8NFdzP0vFsXp6scVLP3NXNP7NR2RkR0ZkZAAAAAABAGoALAOTA1UADwAAASEiBhURFBYzITI2NRE0JgMg/b4wREQwAkIwQ0MDVUQw/b4wQ0MwAkIwRAAAAAACAGwALAOVA1UADwAVAAABISIGFREUFjMhMjY1ETQmASc3FyUXAyH9vzBERDACQTBERP587De1ARg7A1VEMP2+MENDMAJCMET9pu03k/07AAEAQAArA3UDVQAgAAABIzU0JiMiBh0BIyIGFRQWOwEVFBYzMjY9ATMyNjU0JiMDE+YwIiIx5ik5OSnmMSIiMOYpOTkpAhPhKDk5KOExIiIx4Sg5OSjhMSIiMQAAAQCIAEYDeAM2AAsAAAEnCQEHCQEXCQE3AQN4VP7c/txUASX+21QBJAEkVP7cAuJU/tsBJVT+3P7bUwEk/txTASUAAAADAIAAQQOAA0AACwBUAGAAAAEiBhUUFjMyNjU0JgU1Iy4BJzcnBy4BJzcnBy4BJzUjFQ4BBycHFw4BBycHFw4BByMVMx4BFwcXNx4BFwcXNx4BFxUzNT4BNxc3Jz4BNxc3Jz4BNzMFIiY1NDYzMhYVFAYCAB8rKx8fKysBYTkDCwgyLTINHhAdTB4TKBVYFCcSIUwhEBsMOi07BwoDREQDCgc7LToMGxAhTCESJxRYFSgTHkwdEB4NMi0yCAsDOf6AUHBwUE9xcQIKKx4fKysfHit2WRUoFBxNHRAdDDMtNQgKAj4/AwsIOC04DRwQIk0iEiUUWRMmEiJMIRAcDDksNwgKA0A+AgoINCwzDB0RHUwdEygVk3BQT3BwT09xAAAFAIUAQwN4AzYABgAMABMAGQAlAAABIxUzFTMRAyMVIREjAREzNTM1IxEjESE1IwEjNSMVIxUzFTM1MwM5/Pw/P/wBOz/9TD/8/D8BO/wB9359fn59fgM2P/sBOv1MPwE8Abf+xvs//kn+xD8Bent7fXt7AAMAbgBmA5IDGwAaAFMAWAAAASEiBhUROgEzESERIx4BMQ4BBzMyNjURNCYjAzAmJyYiIw4BByMuASczMDY1PAExMCYjKgErASoBIyoBIyoBMRUwHgIzMD4CNz4BNzAmJy4BJwUzESMRA2b97hIaCRYNAhI4BggDBQI0EhoaEngPBAUDAg0iG7QJDwZkHAUXB0gtFg8cDQ4aChASPlVZGTZRYCsCBgMJBwYQCf2AY2MDGxoR/rsBA/6TDRQDBQIZEgGvERr+GwwBAQMpEwcRCQQQEScc7RMWEgEULSwDBgMWDg4bCdABRf67AAAABAA9AKMDyALdAAwAGAAmADQAAAEyNjU0JiMiBhUUFjMhMjY1NCYjIgYVFBYXIg4CMRUhNTAuAiMlKgEjMzAWHwEzNTAmJwKnM0lJMzNJSTP+tjNJSTMzSUkzXHE+FQJBFD1xXwEmAgICAUYHBfhf5gHpRzMzR0czM0dHMzNHRzMzR1onLydvbycvJwhAMIRvfgcAAAYAsAA/A1ADQAAOABIAHgAjACkALgAAATU0JisBIgYdASMVITUjKwE1MwURFBYzITI2NREhFQU1MxEjJzUzESM1IzUzESMCYBwUYBQc8AKg8DBgYP6wOCgBgCg4/cABgGBgkGBgkGBgAuAwFBwcFDAwMDDA/k8oODgoAeEw8cH+f8DB/n/Awf5/AAAAAQDPAEgC5gMxAAYAAAkBMxEhETMB2/70iwECigMx/p7+eQGHAAAAAAMAfwBAA38DQQAUACEAPgAAAQ4DFx4DNz4DJy4DBxcyFhUUBiMiJjc0NjMDIiY/ATY0IyIGByc+ATMyFg8BBhYzMjY3Fw4BIwH6T4tnOwEBP2mNT1CLZzoBAT5qjFArHRUlIRsbASInZBQWDh8EBAYqDw4xYxgUCAojBQMEBiMTDy9bFANBAT9pjVBPi2c7AQE/aY1QT4tnOwGAHRQYJhoXFCr+DyI2fg8NEQoWKC4sJYQSDg8PFDAoAAAAAgCFAGQDdQM1AAQACwAANyE1IRUJATcJARcBsgLB/T8BUgEeU/6P/oFTASxkXl4CK/7iUwFx/oFUAS0AAgCaAFADVQNCACcAMwAAJSc4ATEnPgE1NC4CIyIOAhUUHgIzMjY3FzAUMTMXFjI/ATY0JyUiJjU0NjMyFhUUBgNVfxQVFy9QbT4+bFEvL1FsPiA7HDwBXhIxESsREf5vSmlpSkppadOEFCRRLUBxVDAwVHFAQHFUMQ4MPgFiEhIsEjMSgG1NTWxsTU1tAAAAAQF/AUACfwJAAAIAAAEzEQF//wFAAQAAAQBkAW8DmQIRAA0AAAEhIgYVFBYzITI2NTQmAzf9jyg6OigCcSk5OQIRLyIiLy8iIi8AAAMAlAA9A24DQwAEAAsAEgAAASUNASUBJQcFJScFFSUHBSUnBQNu/pP+kwFtAW3+k/6+KwFtAW0s/r/+visBbQFtLP6/Akr5+fr6/s7ULPr6LdWK1S35+S7WAAAAAQCIAEcDeAM3ACAAAAEhETQmIyIGFREhIgYVFBYzIREUFjMyNjURITI2NTQmIwNR/vAmGxsm/vAbDAwbARAmGxsmARAbDAwbAf8BERsMDBv+7yYaGyb+7xoMDBoBESYbGiYAAAIAawB+A44DHgAlADIAAAEwBgcwDgIHJgYxBhYHDgExFzA2NzI2MTA2Jz4DMT4DIwEUBjEwHgE2NycwBhUDjjhpMElVJSEdHgUGEBODCxEYIxYJH0Q4JBEpIxUE/WCDV3qCK3uAAx4PTig8Rx8HHRkgBQ0PhBEVHDMJJlFDLBU+Oir9ylwOJwY9Y3omXQAAAAMAQABZA8ADAAANABgALAAAATcXASc3LgExMD4CFwkBLgEjIgYVFBYXJR4BFw4DJzcyFjMyNjU0JjU3ApZfWv20W1haZlmf24P+wgEFFS8ZT3EMDAHZI0clSo6Fezg7BQsFT3EBcgKiXlr9s1tXN3hvcDwz/sEBBQwMcFAZLxXkHEYrVGg3Cgo6AXBQBQsFcgAAAAABALgAJwL9A1EABgAAJQEzESERMwHb/t2XARiWJwGBAan+VwADALsAXQNFAyIAGgAmADMAAAEmBgcOARcBJgYHBhYXFjY3PgEnARY2NzYmJwEOAScuATc+ARceAQEOAScuATc+ARceAQcDOStzJiICHf77KmMhJgcrK3MmIgMeAQYqYiEmByv+IAQlFxcbBAQmFhcbAbcEJhYXGwQEJRcXGwQDIicIKyZjJ/7YGA8mK3MmJgcrJmMnASgYDyYrcyb9mhcbBAQlFxcbBAQmAd4WGwQDJhcWGwQDJhcAAwCKAEoDaAMoAAMAFAAZAAA/AScHAScmIgcBDgEfARY2NwE2NCcFJzcXB4rAd0kC3mUOJw7+ag45Dn0OSQ4BlQ4O/uoiqyGqSkh3vwJ4Zg4O/moOSQ59DjoOAZUOJw7OIqskqQAAAAACAIAAQgN9Az4ADAAaAAABMjY1NCYjIgYVFBYzFyIOAjEVITUwLgIjAfxObm5OTm5uTgJ6llIcAv0aUZZ+AcNvT05vb05Pb2Y1PzVycjU/NQAAAAABAMwARgLqAzMACwAAJSE1MwMzESERMwMzAur94uDgjAEFjODhRj8BIwGL/nX+3QABANEARwLvAzUACwAAASEVMwMzESERMwMzAu/94uHgjAEFi9/gAzVA/t3+dQGLASMAAAAAAgCrAGsDVQMVAAQACQAAEyEVITUFMxEjEasCqv1WARGIiAMViIiI/d4CIgAEAIAAQgOAA0AAEQAdADIARgAAAS4BIyIGBzM+ATcHMyceARczJzI2NTQmIyIGFRQWEyIOAhUUHgIzMj4CNTQuAiMRIi4CNTQ+AjMyHgIVFA4CAs0CRX19RQNCBQ8KAdACCQ0FQcMlMzMlJDQ0GlCLaD09aItQT4xoPT1ojE8+bFEvL1FsPj5tUS8vUW0BJFx9b2oXJQ+Beg4iFOAzJSQ0NCQlMwE8PWiLT1CLaDw8aItQT4xnPf1XL1FsPj5sUS8vUWw+PmxRLwAAAAAGAJwAXgNkAycAIAAsAD0AagB7AIcAAAE2JicmBgcGFhceARcRDgEHBhYXFjY3NiYnLgEnET4BNwMOAScuATc+ARceAQMxKgEnLgE3PgEXHgEHDgEHARE+ATc2JicmBgcOAQchFSEeARceARcRDgEHDgEHIRUhHgEXFjY3NiYnLgEnAz4BFx4BBw4BBzEiJiMuATcTDgEnLgE3PgEXHgEBXiQHKClrIyQHKA0fEBQlDiQHKChrJCQHKA4eEBQkDy4EIxUVGQQDIxUVGTQDBQMVGQQDIxUVGQMDHBICHhQlDiQHKChsIwwOA/77AQUEFBAOHhAUJQ4MDgP++wEFBBQQKWsjJAcoDR8QTQQjFRUZBAMcEgMFAhYYA2YDIxUWGQQEIxUVGQJwKGskIwYpKGskCw4E/vcEFRAoayQjBikoayMMDgQBCQQUEf5GFRkEAyMVFRkDBCMBxgEDIxYVGQQDIxYSGAH+rQEJBBQRKGskIwYpDR8QNBQkDwsOBP73BBUQDR8QNBQkDyMGKShrIwwOBAGQFRkEAyMWEhgBAQMjFv3oFRkEAyMVFRkDBCMAAAACAIAAQAOAA0AAAgAGAAABEQEBMxEjAZAB8P0AsbEDQP0AAYD+gAMAAAAAAAIAiQCNA3cC8wAIAA0AABM3BSURBSUHERcRBRElibYBOAEA/wD+yLbMARH+7wK7ODg4/d5EODgCLgz+VzUBqTUAAAAAAwDNAI0DMwM3AAwAGQAlAAABMjY1NCYjIgYVFBYzBTI2NTQmIyIGFRQWMwUyNjU0JiMiBhUUFgJER2RkR0ZkZEb+7ys8PCsqPDwqAZoqPDwqKzw8AeJkR0djY0dHZM08Kyo8PCorPIg8Kis8PCsqPAAAAAADAIAAgAOAAwAAAwAHAAsAABMhNSERITUhERUhNYADAP0AAwD9AAMAAYCA/oCAAgCAgAAAAQFTARMCrQJtAAIAAAEhEQFTAVoBEwFaAAAAAAIAiQBJA3cDNwAPADgAAAEOAQcRHgEXIT4BNxEuASclIT4BMzIWFRQGBxEeARUUBiMiJichDgEjIiY1NDY3ES4BNTQ2MzIWFwFQCCEWFiEIAWAIIRYWIQj+oAFgCzUhKjwmHh4mPCohNQv+oAs1ISo8Jh4eJjwqITULAq8WIQj+oAghFhYhCAFgCCEWRB4mPCohNQv+oAs1ISo8Jh4eJjwqITULAWALNSEqPCYeAAAAAgCAAEADgANAAAIABgAAJREBAREzEQJw/hACT7FAAwD+gAGA/QADAAAAAAABAIAAQAOAA0AAHwAAASERNCYjIgYVESEiBhUUFjMhERQWMzI2NREhMjY1NCYDWv7mIx0dI/7mHAoKHAEaIx0dIwETIgsKAgABGhwKChz+5iMdHSP+7SILChwBGiMdHSMAAAAAAQEgAUAC4AJAAAIAAAEbAQEg4OACQP8AAQAAAAEA3gCeAyIC4gAaAAABJgYHBhQXFjI3PgEnARY2NzY0JyYiBw4BFwEBUx1AGB4eHlUeGAoOASodQBgeHh5VHhgKDv7WAUMOChgeVR4eHhhAHQEqDgoYHlUeHh4YQB3+1gAAAAAF////wAUzA8AAEAAcACgANAA4AAABISIGFREUFjMhMjY1ETQmIwcyFhUUBiMiJjU0NiMyFhUUBiMiJjU0NiMyFhUUBiMiJjU0NgEhESEE2vt+JTQ0JQSCJTQ0JWQOExMODhMTVg4UFA4OExNWDhQUDg0UFAE5+34EggPAMyT8riQzMyQDUiQzVxMODRMTDQ4TEw4NExMNDhMTDg0TEw0OE/yuAroAAAADAAH/xAVdA7wABgANABwAACU1CQE1CQEBFQkBFQkBJyYGBwMGFhcWNjcTNiYnAZT/AAEA/m0BkwIuAQT+/AGb/mWMGjEI7QgYGhoxCO0IGBoglgECAQKV/mn+aAM2lP7+/v6UAZYBlmYIGRr8hxsxCAgZGgN6GjEIAAAAAwAA/8AFiAPAABgAHQApAAAlMjY1ETQmIyEiBhURFBYzIxQWMyEyNjUjASERIREBIiY1NDYzMhYVFAYEnDFFRTH8UDFFRTHsRTEEnDFF7PxQA7D8UAHYGCMjGBkiIjhHMgKXMkZGMv1pMkYyR0cxAxD9aQKX/LQkGRgkJBgZJAACADP/5gO+A3EACQAOAAABNjQvASYiDwEXARUzAScDvg8PeA4rD17A/NPAAjbAArEPKw54Dw9ewP5TwAI3wAAAAQAzAEADzQNAAAoAAAkBMxEzETMRMxEzAgD+M4rnuOeKA0D+af6XAQ/+8QFpAAAAAgCNAEsDdQMzAAcAFgAAARUhNSMRIRERJRUiDgIxPgMzFSUDHf3HVwLo/vh4mFghIlNicUEBCAFSr6/++QEHARHQfWF2YjU+HwmM1wAAAAACAE0ADQOzA3MACQAdAAATATcBMzUhETM1JSEVIREhESMRFBYzITI2NRE0JiOtAdxE/iWt/q5gAqX+rgFS/VtgOCgCpSk4OCkCzv4lRAHbYf6uraVh/VsBU/6uKTg4KQKkKDkAAgEgAMAC4ALAAAYADQAAATcnBycHFycHFzcnBycCAOAzra0z4K0z4OAzra0Bpuczra0z5zQ05uY0ra0AAgEgAMAC4ALAAAUACwAAJRc3FzcnNRc3JwcXASAzra0z4K0z4OAz8zOtrTPnea005uY0AAEBQACAAsADAAAFAAABBxcHFwEBhkbt7UYBOgMATfPzTQFAAAEBQACAAsADAAAFAAABFwcXBwECekbt7Ub+xgMATfPzTQFAAAIAgABAA4ADQAAaACYAAAkBLgEjISIGFREUFhcBHgEzMjY3AT4BNTQmJyUiJjU0NjMyFhUOAQNo/qoOHBH+9h8uCg4BVg4aDQ4fCQEJEgwKDv2gFiUgGxYlBCEB0gFWDgouH/7wERsJ/qQJCQoOAQ8JGxINGg6xIBsWJSAbGyAAAQBvAGQDkQMcAAoAAAkBMxEzNTMVMxEzAgD+b3vGoMZ7Axz+j/659vYBRwACAAD/wAQAA8AAEwAZAAABIg4CFRQeAjMyPgI1NC4CEyURMxEXAgBqu4tQUIu7amq7i1BQi7tb/uxP7APAUIu7amq7i1BQi7tqaruLUPzsvQFr/sWeAAAAAwAA/8AEAAPAABMAFwAbAAABIg4CFRQeAjMyPgI1NC4CAyMRMzUjNTMCAGq6i1FRi7pqarqLUVGLujdmZmZmA8BRi7pqarqLUVGLumpquotR/QABM2dmABEAAP/ABTwDwAAGAA4AFwAdACQAKgAyADsARABNAFQAXQBkAG0AdgB/APUAAAEnDgEHFzcnIgYHFz4BNxc3LgEjDgEHFxcnBxc+AQcnBxc+ATcFFzcnDgElLgEnFgYHFyc2JicuAScHFw8BHgEzPgE3Jx8BPgE3Jw4BBwcyNjcnDgEBJw4BBxc+ATUFHgEXLgE3FwYWFx4BFzcnNycOAQcXPgE3Bw4BHwE+ATcnJS4DIyIGBy4DIyIOAgcOAxUUHgIXOQEyNjU0JiMxNS4BNTQ+AjMxMhYzMjY1NDY3MT4BMzIWFzMeATMyNjczPgEzMhYVMBQVOQEUBhUUFjsBHgEVFAYjOQEjIgYVFBYzMTMwMjMyPgI1LgEnAq5wDRYOeSgkNWIoZhstESg2ESIQFDQab4FvKHgKDyJ4KG8OGQr+2nAoeQoOAb8GMiUDAQdicwoDAw0cETpw1jUQIhAUNBpvjmcUIAp4ChUOYjZdKGEbLgERawMSCngKCP25BjQoBAIKEgoCAw4cEDZrR28UIQp9ChoNsgoHBGoEEgp9AyEDKUNYMhEgDQ84SloyN2JONQo6aE4tKUdgNxQdHRRKYB41SCkHDQcXIwEDDnFKTXIOBAceEAcSBwQNGw4/XAQeFwUvQEUvaxAYGBBnAQMqSjghA19DAVEsFDAeLGKyJiEpLDMRnI4HBw42LCxHLGYtGzRlLWcsGjEbBC1mLRs0UzNaIRdELyQtMkoXChAKjyjaigcHDjYsKB8oFC4bLR4wFH0mISQoNgEmKBc0Gy0YOBs6Ml4iGEQuCTJNFAoOB48j/igULxotGzMURxs6GigXNBsx0TFVQSUFBC1MNh4kQVgzBDFPaDo5ZU8yBx0UFB0ECnFJKEc2HwQiGAMMB0ZjZEoQGAYDAwZYPwEEAwcDFB0DQSsvRRwREBwfNkkqQ2sNAAAAAAEAhgBgAr4DIAAlAAABNCIxNCIxNCIxNS4BIyIGFREuAQYWMR4DMSE0PgI9ATQiMQJ4R0ZHAyodHilCPBQFKEEuGQEeISghRgHsGhsanx0pKR3+5kIFLjwbaWpPDUdPRg18GgABAKAAYANgAyAAEwAAARQOAiMiLgI1ND4CMzIeAgNgN2CASUmAYDc3YIBJSYBgNwHASYBgNzdggElJgGA3N2CAAAAAAAEAlAAAA2wDgAAdAAABIiYjIgYHNTQmIyIGFREzETA2MzIWMzI2MREwBiMCqEc9bTZkKhwRECJfV21IPG1tV1dtAullHBEtFR0dFfyyAVtlZWUBjmUAAAADAAD/wAQAA8AACwAfADMAAAEiBhUUFjMyNjU0JgMiDgIVFB4CMzI+AjU0LgIDIi4CNTQ+AjMyHgIVFA4CAgA+XFw+PlxcPmq6i1FRi7pqarqLUVGLumpUlXBBQXCVVFSVcEFBcJUCWlw+PlxcPj5cAWZRi7pqarqLUVGLumpquotR/GZBcJVUVJVwQUFwlVRUlXBBAAAAAAIApQBABIADQAARABkAAAEhJyEiBhURFBYzITI2NRE0JgMVIzUjNxcjBB3+dWL+1yk5OSkDFik6Ou5jn9DRnwLjXTgl/cApOjopAd0pOv6swMDLywAAAAAGANEAYARqAyAACwAXACMAKAAtADIAAAEiBhUUFjMyNjU0JgMiBhUUFjMyNjU0JgMiBhUUFjMyNjU0JhMVITUhESE1IRURITUhFQEdICwsICErKyEgLCwgISsrISAsLCAhKytxArv9RQK7/UUCu/1FAyAqHB0qKh0cKv7mKhwcKiocHCr+5yodHCoqHB0qAh1cXP1sXFwBGWJiAAAFAJoAQAQzA0AACgAOABIAFgAaAAATERQWMyEyNjURIQEhESEBITUhNSE1ITUhNSGaNyUC4SU3/GcBm/7BAT8Bov66AUb+ugFG/R8C4QNA/WIqODgqAp79YgEe/uJiWmJiiwAABQCgAGADYAMgAAMABwALAA8AEwAAEzMVIzsBFSMjMxUjATMVIxUzFSOg6+vr6urr6+sB1evr6+sDIOvq6wLA6+rrAAABATUBPQLLAksADAAAAQcGIi8BJjYzITIWBwLLuwYUBrsKDA8BdA8MCgIe4QgI4Q0gIA0AAgBAAUADwAJAAAkAFQAAEzA+AQQXBgQuASUiBhUUFjMyNjU0JkCM8wFHurr+ufOMAcA1S0s1NUtLAbqmbjfd0zVqnoZLNTVLSzU1SwAAAAACAIAAQAOAA0AAEwArAAABMh4CFRQOAiMiLgI1ND4CAxceATMyNj8BNjQnJiIPAScmIgcGFBcxAgBQi2k8PGmLUFCLaTw8aYtjkwYRCQkRBpMNDQ0mDXNzDSYNDQ0DQDxpi1BQi2k8PGmLUFCLaTz+YncFBgYFdwseCwoKXV0KCgseCwARAEQASQO8AzcAAwAHAAsADwAUABkAHgAiACYAKwAwADUAOgA+AEMASABMAAATFTM1IRUzNQUVMzUnFTM1BRUzNSMhFTM1IyUzFSM1ITMVIzczFSMTMxEjERczFSM1ASEVITURIRUhNREzFSMlMxUjNREzFSM1ITMVI0TNAd6I/iOIiIj+Is3NAquIiP1VRUUBEUVFzUREiUREzEVF/M0DePyIA3j8iEVFAzNFRUVF/M1FRQImRERERIhERIhERMxFRUVFiIiIzc3NARH+7wERRIiIAVVERP1WREQCZoiIiIj93kRERAAADACJAK8DdwLRAAsAFwAjAC8APABIAFQAYABtAHkAhgCSAAATIiY1NDYzMhYVFAYHIiY1NDYzMhYVFAYHIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYjIiY1NDYzMhYVFAYjIyImNTQ2MzIWFRQGAyImNTQ2MzIWFRQGByImNTQ2MzIWFRQGNyImNTQ2MzIWFRQGIzMiJjU0NjMyFhUUBgciJjU0NjMyFhUUBiMzIiY1NDYzMhYVFAbNHCgoHBwoKBwcKCgcHCgoHBwoKBwcKCgCShwoKBwcKCjpHCgoHB0oKB3MHSgoHRwoKBwdKCgdHCgoHB0oKB0cKCiwHCgoHB0oKB3NHCgoHBwoKOkcKCgcHSgoHc0cKCgcHCgoAkkoHBwoKBwcKM0oHBwoKBwcKM0oHBwoKBwcKCgcHCgoHBwoKBwcKCgcHCgoHBwoKBwcKAGaKBwcKCgcHCjNKBwcKCgcHCjNKBwcKCgcHCgoHBwoKBwcKM0oHBwoKBwcKCgcHCgoHBwoAAYARABJA7wDNwAFABIAFwAcACEAJgAANxsBNxMhASImNTQ2MzIWFRQGIwEhFSE1ESEVITUBMxEjESEzESMRzYirZs39mgHeHSgoHRwoKBz9mQN4/IgDePyIAzNFRfzNRUXRAVX+783+7wFVKB0cKCgcHSgBEURE/VZERAJm/ZoCZv2aAmYAAAAEAHgAgAP4AwAABQAJAA8AFQAAAQUlNyUFIQUtAQUXBSU3BSUXBSU3BQPT/mX+QCUBmwHA/RUBKwEr/tUBdUv+QP5ASwF1AXVL/kD+QEsBdQIwsMAQsMCAgIDgIMDAIKAgIMDAIKAAAAMAfwBOA3MDQQATACgANgAAASIOAhUUHgIzMj4CNTQuAgMiLgI1ND4CMzIeAhUUDgIjBTYyHwEWFAcGIi8BJjQB1kd9XTY2XX1HR31dNjZdfUczWUInJ0JZMzNZQyYmQ1kzARIOKQ5GDg4PKA9FDgNBNl19R0d9XTY2XX1HR31dNv20JkNZMzNZQicnQlkzM1lDJh0ODkUOKQ4PD0UOKQADAEAAAAPAA4AAEwAnADgAAAEiDgIVFB4CMzI+AjU0LgIDIi4CNTQ+AjMyHgIVFA4CJwcGJjURNDYfAh4BFRQGBwIAXaN6RkZ6o11do3pGRnqjXVCLaTw8aYtQUItpPDxpi1lMDxwcD0y4CAkJCAOARnqjXV2jekZGeqNdXaN6RvzAPGmLUFCLaTw8aYtQUItpPPEtCRUUATgUFQktbwURCgoRBQAAAAAEAEAAAAPAA4AAEwAnADUAQwAAASIOAhUUHgIzMj4CNTQuAgMiLgI1ND4CMzIeAhUUDgIDMhYVERQGIyImNRE0NjMyFhURFAYjIiY1ETQ2AgBdo3pGRnqjXV2jekZGeqNdUItpPDxpi1BQi2k8PGmLsA0TEw0NExPNDRMTDQ0TEwOARnqjXV2jekZGeqNdXaN6RvzAPGmLUFCLaTw8aYtQUItpPAIgEw3/AA0TEw0BAA0TEw3/AA0TEw0BAA0TAAACADsAAANwA4AAEQAiAAAlIxE0JisBNTQ2MyEyFhURFAYDERQGIyEiJjURNDYzITIWFQMEbD8s2D8tAUMtPz/bPy3+vCw/PywBRC0/4AGILkI4LkJCLv5ALkIBUP5ALkJCLgHALkJCLgAAAAACAEAAAAPAA4AAVABoAAABNSY2PwE2Ji8BLgEvASYiDwEOAQ8BDgEfAR4BDwEGFj8BNjIfARY2LwE+ATcHDgEjIiYnLgEnJjYxNzA2Iy4BKwE+ATMyFhcwFhcWBjEHMAYXHgEXAyIuAjU0PgIzMh4CFRQOAgKLAQYGawYECJMIEQRCBAoEQgQRCJMIBAZrBgYBGQIJB4QHFgeEBwkCFQYPCAwiSyUSIhAOHA0EBagDAzRwNQYlWjEeNxoWBwUFqQMEI1Ani12jekZGeqNdXaN6RkZ6owF/AQgUBmgGCgEVAgwHhgcHhgcMAhUBCgZoBhQIkwgGBEUEBEUEBgh+AggEAgYGAQEBAwEBBXcDCAYICQMDAwEBBHUCAQUFAf6BRnqjXV2jekZGeqNdXaN6RgAAAgCFAF8DewM7AB8ARwAAAR4BFRQGDwEOAScuAT0BIyImPQE0NjsBNTQ2NzYyHwEFMhYdARQGIyEiJjURNyEyFhURFAYrASImNREjFRQGKwERITU0NjsBA3gCAQECnAMGAgMCjwYFBQaNAwQCBQOd/v8IBwcI/h0IB9wBFggHBwg2CAezCAeXAVkHCDYBSQEEBAMEAXACAQEBBQQ1BgVgBQU1BAUBAgJwbgcIYAYHBwYB9doGB/6FBwcHBwE0lQgH/nEYCAcAAAADAEAAAAPAA4AAEwAtAF8AAAEiDgIVFB4CMzI+AjU0LgIDIyImNSY2NyY2Nz4BFx4BBw4BJw4BFxQGIzciJicuATc+ARceATMyNjU0JiMiBhUUFhcWBgcGJicuATU0PgIzMh4CFRQOAiMxAgBdo3pGRnqjXV2jekZGeqPkAQgMA0IeDAMPFUEaGQgUEjoZGjsDDAiNCxUKCAkCAQ8ICBAJP1lZP0BZBAQCBwgIDwMFBR41RygoRjUeHjVGKAOARnqjXV2jekZGeqNdXaN6Rv0cDAhnfR4VMhQbCBUVQhsYCw8ZblwJDXkDAgIOCQgKAgICXEBBW1tBDBkMCQ8DAwgIDyAQKUg2Hx82SCkpSDYfAAgAQAABA8ADfwAMABoALQA6AE8AaQCQAKkAAAEOARceATc+AScuAQcHBiY3PgEzMhYHDgEHMTcUFhcWMjc+ATU0JicmIgcOARUHIgYXFBY3PgE1NCYHEyIOAhUUHgIzMj4CNTQuAiMTOAExIyImNTQ2MzYWMQ4BIyImNTwBNzYmBxcUBgcOAS4BJy4BNz4BNz4BFx4BBwYWNz4BNzYWFxYGMTAGFx4BFTcOASMiJjU0Njc2JjEjIiY1PgE3Mx4BOQEB1UBVBQRhQUBVBQRhQQEiLwICMSEhLgIBMCEIAgMCBgICAwMCAgYCAwIfDBIBEAwLEQ4NQ12jekZGeqNdXaN5R0d5o12BAwYJCAZJBAEHBAUHAQEsB0sUOSlqZVQTBAgMB1ARDkgVFAwGAwsGBQsRFx0SEwwFCDQMSAEMBwgMAQEMcwMICwEJBwWFCAHeB0QpKTAHB0MpKTEHtQIoICArKh0eKgJUAwQCAQECBAMDBQEBAQEFAwQPCgsNAQEOCgoOAQIGRnqjXF2jeUZGeaNdXKN6Rv6vCAYFCAVPBAUHBQICASQFAqcJOCYaEA8wJwowHRJiCA8fBgUmEQsJAwIKBQQBDQ0pCwISLAlpBwgNCAICAlkXDQgHCwEInAAAAAYAeAEJA4gCqwADAAgADAAQABQAGAAAEyERIRMVITUhOwEVIzczFSM3MxUjNzMVI3gDEPzwaQI+/cJoNDRpNDRoNDRpNDQCq/5eATrR0WlpnZ1paZ0AAAACAMAAYAQNAyAABAAIAAATIRUhNQUzESPAA038swFgjY0DII2Njf3NAAAAAAYAhgAgBRMDYAAEAAkADgATABgAHQAAASEVITURIRUhNREhFSE1ATMVIzURMxUjNREzFSM1AiYC7f0TAu39EwLt/RP+YPr6+vr6+gNgpqb+s6am/rOmpgKapqb+s6am/rOmpgACAFAABQLvA0EAQwBZAAATITIWFx4BFRQGBw4BBxUeARceARceARceARceARUeARceARceARcjLgEnLgE1LgEnNCYnLgEnLgEnLgEnLgEjIREjEQEyNjc+ATc+ATc+ATU0JicuASMhETNQAYY7XSEhIhIRETclEh0LDBIGBwoDAwUCAQIBAwICBwQFDQl7BggCAgMBAQEEAwIGAwQLBwgTDQwgFf7zbgFUEyURER8NDRUICAcRERI4J/7u5gNBHR0dUDImQhwdJwoCBAwICBMMCxkODh0PDx8PEB8PDx0NDhgKBhELCxkODR4PEB8PDxwODhcLChAGBgb+nwM8/oIDAwMLCAkXDg4lFiAzExQU/t8AAAADAAD/wASJA8AACQANABcAAAElJgYVERQWFwUzJREFAQUWNjURNCYnJQFV/uoaJSUaARZFAVP+rQGZARYaJiUb/uoDN3AKGRz9ER02C2+GA3qJ/RJwChkcAu8dNgtvAAACAAD/wAQAA8AAEwAzAAABIg4CFRQeAjMyPgI1NC4CAzUjMCY1NDYxMzUwNjMyFjEVMzIWFRQGKwEVMAYjIiYCAGq7i1BQi7tqaruLUFCLu6PjOTnjDisrDuMUJSUU4w4rKw4DwFCLu2pqu4tQUIu7amq7i1D85OMOKysO4zk54yQVFSTjOTkAAwAA/8AEgAPAABIAIAAvAAATIgYVERQWOwEVNyEyNjURNCYjAyEwJjU0NjEhMBYVFAYBMCY1NDYxITAWFRQGMSGAMFBQMEDAAoAwUFAwtf3qNTUCFjU1/eo1NQIWNTX96gPAUS/9wC9RwMBRLwJAL1H9wBAwMBAQMDAQAQAQMDAQEDAwEAAAAAEADf/YA7wDrwAmAAATBhY7AREUFjsBMjY9ATQ2OwEyFh0BFBYXMzI2NREzMjYnASYiBwENEQoXciIYcBgiIRhxGCEiGHEXInIXChH+UREvEf5RAgARF/45FyEhGOIYISEY4hghASEXAcgXEQGvERH+UQAAAgCA/+sDgAOVABEAGAAAASEiBhURFBYXBSU+ATURNCYjASc3FwEXAQMr/aojMhURAVoBWhEVMiP+gNY8mgFEPP6AA5UyI/3YFiUM5uYMJRYCKCMy/YDWPJkBRD3+gAAAAgBWACIDqwNrABkAJgAACQEuASMiBgcBDgEVFBYXARYyNwE+ATU0JicFNSMVIzU0NjsBNRcHA57+gAUQCQkPBv6ABgYGBgGADSMMAYAGBwcG/reqVhkS1ZaWAd4BgAYHBwb+gAUQCQkPBv6ADAwBgAYPCQkQBYlrgKsRGWuVlgAGAAAAFQQAA40ACwAfACsARABYAGQAAAEyNjU0JiMiBhUUFhMiDgIVFB4CMzI+AjU0LgIDIiY1NDYzMhYVFAYDMzUjJy4BIyIGDwEOARUUFh8BFTMRJzcXBSIOAhUUHgIzMj4CNTQuAgMiJjU0NjMyFhUUBgKrHy0tHyAtLaAsTjoiIjpOLCxOOSIiOU4sPlhYPj1YWPG0iVIKIRMPGwqeCgsTEY9NYGNJ/l4sTjkiIjlOLCxOOiIiOk4sPVhYPT5YWALzLSAgLS0gIC3+zSI5TiwsTjoiIjpOLCxOOSL+lVg+PVhYPT5YAcBNjBATCwqeChoPFCEKV9UBFEhjalUiOU4sLE46IiI6TiwsTjki/pVYPj1YWD0+WAAAAAQAqwBAA1UDawAlADEAPQBCAAATFBYXFRQWOwEyNj0BIRUUFjsBMjY9AT4BNRE0LgIjIg4CFREXIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYTITUhFasXExkSKxEZAVYZESsSGRMXNV18R0d8XTWVGyUlGxslJQFlGyUlGxslJSX+AAIAARUcMRFMEhkZEioqEhkZEkwRMRwBqzhDJAwMJEM4/lUqJRsaJiYaGyUlGxomJhobJQEA1dUAAAAABACAAEADgALrABwAKAA0ADkAAAEuASMhIgYHAxEUFjsBMjY9ASEVFBY7ATI2NREDASImNTQ2MzIWFRQGISImNTQ2MzIWFRQGJTchFyEDJwYhFf4qFSEGWRkSKhIZAgAZEioSGVn97homJhobJSUBuxslJRsaJib90EAB1kD9qgLAEhkZEv8A/qsSGRkSKioSGRkSAVUBAP5VJhobJSUbGiYmGhslJRsaJtbAwAAAAAADAFX/6wOrA5UAHgBLAFAAACUiJicOASImJw4BKwEVMzI2Nx4BMzI2NwceATsBNSMlMzI2Nx4BMzI2Nx4BOwETNiYnLgEvATU0JisBNSEVIyIGHQEHDgEVFBYXIxMTIRUlBQNVLFcnJ1hYWCcnVyxWVixWKCZWLy9XJwIoVixWVv1UAjNYHyBYMzNYIB9YMwJRAwIDBA4INzIjgP8AgCMyNw4RAQIBUlcCAP8A/wBAHRsbGxsbGx1VFRUUFRYUARUVVVUyJCQyMiQkMgEdCREIBwsDEsUjMoCAMiPFEgQXDgQHA/7jAiupVFQAAAMAqwBAA1UDlQAXACMAJwAAExQWMwcVITUnMjY1ETQuAiMiDgIVEQUiJjU0NjMyFhUUBhMhNSGrVz5AAgBAPlc1XXxHR3xdNQFVIzIyIyMyMt3+AAIAASs+WEAVFUBYPgHAOEMkCwskQzj+QEAyIyMyMiMjMgEq1gAAAAAFAKsAQANVA2sAFwAjACgANAA5AAABIg4CFREUFjMHFSE1JzI2NRE0LgIjAyImNTQ2MzIWFRQGEyM1MxUTIiY1NDYzMhYVFAYTIzUzFQIAR3xdNVc+QAIAQD5XNV18R8AbJSUbGyUletXV6xslJRsbJSUl1dUDawwkQzj+az5YQBUVQFg+AZU4QyQM/YAlGxomJhobJQEA1dX/ACUbGiYmGhslAQDV1QACAQAAFQMrA7cADQAnAAABMjY1NCYjIgYVMRQWMxMzNSMnLgEjIgYPARUzNTcDMxMXFTMRJzcXAlUgLS0gHy0sIAXRm1UKIRMGCwToTVqnTXpkTGofLgMeLSAfLS0fIC3+902OEBQCAUjenBz9cgFahNYBEsJ6TgABAFUAFQOAA2sAFQAAATUlNTQmIyIGHQEFFSUVBxU3FzUnNQOA/qsmGhsl/qoBVlaWlVUBFVbV6xomJhrr1VZr60BAKytAQOsAAAAAAgArAGsD1QLrAAsAGwAAATI2NTQmIyIGFRQWASERIREjETM1IRUzETQmIwErNUtLNTVLSwI1/qr+q1VVAwBVZEYBlUs1NUtLNTVLAQD+1gGA/YCAgAGARmQAAAABAFUAFQOAA2sAFQAAATUlNTQmIyIGHQEFFSUVBxU3FzUnNQOA/qsmGhsl/qoBVlaWlVUBFVbV6xomJhrr1VZr60BAKytAQOsAAAAAAwBVAGsDqwMVACAAMQA1AAAlMzUzMjY9ATQmKwE1MzUjNSMVIyIGHQEUFjsBFSMVMxUBISIGFQMUFjMhMjY1ETQmIxEhESEB1VYqEhkZEoCrVVYqEhkZEoCrVQGA/VYkMQEyJAKqJDIyJP1WAqrrKhkSgBIZKlYqKhkSgBIZKlYqAioxJP4AJDExJAIAJDH9qwIAAAIAVQBrA6sDFQAdACgAAAE0NjM1NCYjISIGHQEyFhUUBiMVFBYzITI2PQEiJgcnBzcnPwEfAQcXA1UyJDIk/VYkMSMyMiQyJAKqJDIkMryZmS6MtUJCtY0vAcAjMqsjMjIjqzIjIzKrIzIyI6syqmJisHMKqakLcrAAAAACAIAAQAOAA0AACwAQAAABESMVITUjEQE1IRUXJyEHIQHV1QIA1QFV/QDAVQIqVf6AAZX/AFVVAQABVlVVVlZWAAAAAAMAVQBAA6sDQAASABYAGwAAASERFBYzITI2PQEzMjY9ATQmIxUjNTMBITUhFQNV/VZkRgEAR2RVJDIyJFVV/QADAP0AA0D+VUZkZEaAMiSAIzLVgP1VVVUAAAAABwCA/+sDgAOeAAsAFwAjAEAATABYAF0AAAEyNjU0JjEwBhUUFiMyNjU0JjEwBhUUFiMyNjU0JjEwBhUUFgUuASMhIgYPAREUFjsBMjY9ASEVFBY7ATI2NREnASImNTQ2MzIWFRQGISImNTQ2MzIWFRQGJTchFyEC1RslQEAmuxslQEAluhomQEAlAhcGIRX+KhUhBlkZEioSGQIAGRIqEhlZ/e4aJiYaGyUlAbsbJSUbGiYm/dBAAdZA/aoC6yUbIFNTIBslJRsgU1MgGyUlGyBTUyAbJYETGBgT//6qERkZESsrERkZEQFW//5WJRsbJSUbGyUlGxslJRsbJdXAwAAAAAADAFUAawOrAxUADAAZACQAAAE1IRUjESE1MxUhESMFIxUzFSM1MzUjNTMVFyM1IzUzFTM1MxUDK/2qgAFWqgFWgP6qVVWAVlaA1itVKisrApWAgP3WqqoCKoAqK4ArKoBVVYBVVdUAAAMAgAAVA4ADawAKABoAHgAAGwEeATMhMjY3EyEBIiY1ND4CMTAeAhUUBhMhJyGAVgQwIQGqITAEVv0AAYA1SygwKCgwKEvZ/eQTAkEDa/z2ICwsIAMK/SpLNSBQRzAwR1AgNUsB1qoABACAABUDgAOVAAsATABbAGcAACUyPgI1MSIOAhUBOAExFBYzMjY3IwcUFjMyNjUxJx4BMzI2NTE0Jic+ATU4ATE0JiMiBgc/ATQmIyIGFTEXLgEjIgYVMRQWFw4BFSUyFhUUBiMxIiY1NDYzMQEUHgIzMTQuAiMCAFCLaTxQi2k8/u8+LREfDQEBPywsPwENHhEtPiIbGyI+LREfDQEBPywsPwENHhEtPiIbGyIBESw/PywsPz8s/oA8aYtQPGmLUBU9aIxPPGiMUAH2LT4KCQgtPj4tCAkKPi0gMw0MNCAsPgoJAQgsPj4sCAkJPiwgNAwNMyDKPiwtPj4tLD7+wE+MaD1QjGg8AAAAAAMAqwBAA2sDQAAyADYAQwAAATEnBxcOARUUFjMxMjY3ERQGIyImPQE0JisBETQmIyEiBhURIREzFRQWMzI2NTERNCYnBSE1IQUiJjU0NjMyFhUUBiMDTJ8tWh4nPywMFQoZEhIZMiMrMiP/ACMyAapAPywsPxEO/rT/AAEAAQASGRkSEhkZEgKMny5aCzYiLD8FBP7NEhkZEsAjMgErIzIyI/1VAUDVLT4+LQGVFicPd9bWGRISGRkSEhkAAwArABUDgANrAAwALQA5AAAlIgYVFBYzMjY1NCYjARUzEwcOARUUFjMhNSEiJjU/ASEyNjcTPgE1NCYjIScjASIGFRQWMzI2NTQmASskMTEkIzIyI/8AVZo6BQYyJAIA/hIFBgEnAT0YKAuZAgMZEv2JKIsCqiMyMiMkMjLAMiMkMjIkIzICq1b+vGgJFQsjMlUGBQVFGBQBFQUKBhEZVv1VMiMkMjIkIzIAAAIAgABAA4ADQAAQABwAAAEhIgYVERQWMyEyNjURNCYjAyMVIzUjNTM1MxUzAyv9qiMyMiMCViMyMiMrq6qrq6qrA0AyI/2qIzIyIwJWIzL+K6urqqurAAAFAKsAFQNVA2sADwAgAC0AOgBOAAAlHgEzMjY3MT4BNTQmJzEHASUiBhURFBYzITI2NRE0JiMFMhYVFAYjIiY1NDYzIzIWFRQGIyImNTQ2MxMiLgI1ND4CMzIeAhUUDgIBhxc/IyM/FxcbGxfyAXn+ACQxMSQCACQxMST+qxEZGRESGRkSgBEZGRESGRkS1TVdRigoRl01NV1GKChGXfIXGxsXFz4kIz4X8QJ4ATIk/VYkMjIkAqokMVUZERIZGRIRGRkREhkZEhEZ/VYoRV41NV1FKSlFXTU1XkUoAAAAAAIAgP/+A4ADawAWACIAAAEuAyMRMh4CFz4DMxEiDgIHNTI2NTQmIyIGFRQWAgAmV2JpODhpYlcmJldiaTg4aWJXJjVLSzU1S0sB0yM5JxX+KhUnOCMjOCcVAdYVJzkjmEs1NUtLNTVLAAAAAAMAgAAVA4ADlQAbACIANAAAASM0LgIjIg4CFSMiBhURFBYzITI2NRE0JiMlMhYVITQ2EyIuAjUzFBYzMjY1MxQOAgMrViE6TiwsTjohViMyMiMCViMyMiP+1TVL/wBLNSxOOiFVSzU1S1UhOk4CwCxOOiEhOk4sMiP+ACQyMiQCACMygEs1NUv+VSI6Tiw1S0s1LE46IgAABwCrAEADVQNAABQAGQAeACMAJwArAC8AAAEVIzUhFSM1IxEzNTMVITUzFTMRIwEjNTMVNSM1MxU1IzUzFQEjNTM1IzUzNSM1MwMAVf6qVVVVVQFWVVVV/lVVVVVVVVUBq1VVVVVVVQNAVVVVVf0AVVVVVQMA/atVVapWVqtVVf6rVVVWVVUAAAIAVQAVA6sDawAaACcAAAkBLgEjISIGFREUFhcBHgEzMjY3AT4BNTQmJyUiJjU0NjMyFhUUBiMDkf6ACx8S/tYkMg4MAYALHxIRHwwBKgwODgz9WhslJRsaJiYaAdIBgAsOMiT+1hIfDP6ACw4ODAEqDB8REh8MwyYaGyUlGxomAAAAAAIBAABAAysDQAAOABgAAAEhETMRMzI+AjU0LgIDIzUzMhYVFAYjAiv+1auANV1FKSlFXS2IiCMzMyMDQP0AAQAoRl01NV1GKP6rqjIjIzIAAgCAAEADgAOVAA4AGgAAASM3JwchFRMDFSE1AxM1AyMVIzUjNTM1MxUzA4BxMWQ//eNVVQMAVVXVgFaAgFaAAuuGJKpW/wD/AFVVAQABAFb+gICAVYCAAAEAgABAA4ADQAAmAAABHgMXNz4BFx4BMzIWHQEUBiMiJCYCNTQ2OwEyFhUUFhcWBg8BARoXPEdSLl0JGAskTScSGRkSlv74xXIZEpUSGQwMBAYJXgH0LlFIOxheCQUDDA0ZEZUSGXLFAQiWEhkZEihMJAsYCV0AAAMAgAAVA4ADawALABgAJAAAASIOAgcJAS4DBTQ2MzIWFRQGIyImNRMiJjU0NjMyFhUUBgIAOWxhViQBgAGAJFZhbP7yMiMjMjIjIzLVIzIyIyMyMgNrGCxAJ/1VAqsnPy0Y1iQyMiQjMjIj/qsyIyQyMiQjMgAAAAIAVQBrA6sDFQAdACgAAAE0NjM1NCYjISIGHQEyFhUUBiMVFBYzITI2PQEiJgcnBzcnPwEfAQcXA1UyJDIk/VYkMSMyMiQyJAKqJDIkMryZmS6MtUJCtY0vAcAjMqsjMjIjqzIjIzKrIzIyI6syqmJisHMKqakLcrAAAAACAFUAawOrAxUAEAAWAAABISIGFQMUFjMhMjY1ETQmIxUFJTUFJQNV/VYkMQEyJAKqJDIyJP6r/qsBVQFVAxUyI/4AIzIyIwIAIzKq1tZV1dUAAAAEAFUAQAOrA0AADgASAB4AIgAAASEiBhURMxUhNTMRNCYjAyE1ITciJjU0NjMyFhUUBgMhFSEDK/2qNUurAgCrSzWA/qoBVoASGRkSERkZPP4AAgACa0s1/wCrqwEANUv+KtZVGRIRGRkREhkBgKsAAgB1ADQDfgMrAAoAHgAAATcBDgEVFBYXMRclFjY3PgEnJgYHDgEXARcJATcBNwFaeP7VFxsbF7MBITF9Mz0ULy6ZPjMeFv5gPAEmASY8/to/AYd5ASsYPiMjPxeyTRcfMz2ZLy8UPjJ9Mf5fPAEl/ts8ASU/AAAAAwBVAGsDqwNrAA0AIgA2AAABFBYzMjY1MTQmIyIGFRMHIyIGFREUFjMhMjY1ETQmKwEnIRMiLgI1ND4CMzIeAhUUDgIBd1A5OVBQOTlQCU6HJDIyJAKqJDIyJIdO/wCALE46ISE6TiwsTjohITpOAcA5UFA5OVBQOQGrVjIj/gAjMjIjAgAjMlb9gCE6TiwsTjohITpOLCxOOiEABAArAGsD1QMVABgAJAApADUAAAEjNSEiBhURMxQWMzI2NSEUFjMyNjUzNScBIiY1NDYzMhYVFAYBFyM1MwMiJjU0NjMyFhUUBgNVgP2rIzJVSzU1SwEASzU1S1WA/asbJSUbGyUlAiVUv2tAGyUlGxslJQJrqjIj/is1S0s1NUtLNdWr/kAlGxomJhobJQGAa2v+gCUbGiYmGhslAAAAAAQAgABAA4ADQAAgACwAOAA9AAABLgErATUhFSMiBgcDERQWOwEyNj0BIRUUFjsBMjY1EQMBIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYlNyEXIQMnBiEVa/8AaxUhBlkZEioSGQIAGRIqEhlZ/e4aJiYaGyUlAbsbJSUbGiYm/dBAAdZA/aoCwBIZVVUZEv8A/qsSGRkSKioSGRkSAVUBAP5VJhobJSUbGiYmGhslJRsaJtbAwAAAAAADAID/6wOAA2sAFAAgAC0AAAEhIgYVERQWMzEzFzczMjY1ETQmIwUyFhUUBiMiJjU0NgEhNTQ+AjMyHgIVAyv9qiMyMiOrgICrIzIyI/7VMENDMDBDQwEw/gA4UFggIFhQOANrMiT9qyMygIAyIwJVJDKNRC8wREQwL0T+NycgMSIRESIxIAAAAwAr/+sD1QOVAAwAMQBGAAABIgYVFBYzMjY1NCYjBS4DJyM1IxUOAwcVIxUzHgMXMxUzNT4DNzUzNSMBIi4CNTQ+AjMyHgIVFA4CIwIAR2RkR0dkZEcBfQc6WXRDAVZDdFo6B1hYBzpZdEMBVkN0WjoHWFj+gz5tUS8vUW0+Pm1RLy9RbT4Ca2RHR2RkR0dkgEN0WjoHWFgHOll0QwFWQ3RaOgdYWAc6WXRDAVb+qi9RbT4+bVEvL1FtPj5tUS8AAQDAAEADQANrAAUAAAkBFyUFNwIA/sAeASIBIh4Da/zzHoCAHgAAAAMA1QAVAysDawATACEAJgAAATQuAiMiDgIVFB4CMTA+AiU0NjMyFhUUBiMiJjUxAxUhNSEDAChGXTU1XUYoUGBQUGBQ/qsyIyMyMiMjMtYCVv2qAms1XUUpKUVdNUiljF1djKVIIzIyIyQyMiT+AFZWAAAAAgDVABUDKwNrABQAIwAAASIOAhUUHgIxMD4CNTQuAiMRIiY1NDYzMTIWFRQGIzECAD5tUS9ecF1dcF4vUW0+LD8/LCw/PywDay9RbT5UwqZvb6bCVD5tUS/+aj8sLD8/LCw/AAMAVQAVA6sDawAOABoAHgAAASEiBhUDNyEyNjURNCYjATUBNjIfARYUBwEjKQE3MwNV/VYkMQGrAlUkMjIk/asBJgYRB0sHB/7aaQIA/sBV6wNrMiT9AKsyIwIAJDL+AGkBJgYGTAYSBv7bVQAAAAACAHUANAN+AysACgAeAAABNwEOARUUFhcxFyUWNjc+AScmBgcOARcBFwkBNwE3AVp4/tUXGxsXswEhMX0zPRQvLpk+Mx4W/mA8ASYBJjz+2j8Bh3kBKxg+IyM/F7JNFx8zPZkvLxQ+Mn0x/l88ASX+2zwBJT8AAAAEAIAAQAOAA0AADwAVACIAKAAAASEiBhURFBYzITI2NRE0JgUzFAYjNRE1Mj4CNTMUDgIjETcXNxMhAyv9qiMyMiMCViMyMv2HgEs1LE46IlUvUW0+lmqWwP2qA0AyI/2qIzIyIwJWIzJVNUuA/tVVIjpOLD5tUS//AMCAwP8AAAMAgABrA4ADFQADABIAFgAAASEVIRM1JyEHFTMRIREzETMRMwUhNSEDVf1WAqorK/1WKysBqqtVK/6A/wABAAMVVf6rVdXVVf8AAQD/AAEAq6sAAAEAKwDAA9UCwAALAAABBxcHLgMxASEBAlWgekQbQzsn/wADqv6AAsDVojQkWU41/qsCAAAEAKsAQANVA0AALgBDAFgAZgAAASM1PgE1IzU0JiMhIgYdASMUFhcVIxQWFxUjFBYXFRQWMyEyNj0BPgE1IzU+ATUBMCIjIiY1NDYzOgE5AR4BFRQGBzE1MCIjIiY1NDYzOgE5AR4BFRQGIzE1IiY1MTQ2MzIWFRQGIwNVgDdJgBkR/qoRGYBJN4BJN4BJNxkRAVYRGTdJgDdJ/qsBASMyMiMBASMwMCMBASMyMiMBASMwMCMjMjEkIzIyIwIVMQ5bPCoSGRkSKjxbDjE7Ww4xPFoPMBIZGRIwD1o8MQ5bO/6AMiQjMgEyIiMyAdYyIyMyATEjIzLVMiMkMjIkIzIAAwAgAWAD4AIgABQALgBBAAATLgEjMSIGFRQWMzEyNjc+ATU0JichLgEjMSIGBw4BFRQWFx4BMzI2Nz4BNTQmJyUiBgcOARUUFhceATMyNjU0JiOwChkNKDg4KA0YCxUbGxUBgAoZDQ0YCxUbGxULGA0NGAsVGxsVAVANGAsVGxsVCxgNKDg4KAITBgc4KCg4BwYNKxsbKw0GBwcGDSsbGysNBgcHBg0rGxsrDQ0HBg0rGxsrDQYHOCgoOAAGAHoAIASdA2AAEQAeADAAPQBPAFwAABMhMhYdARQGIyEiJj0BNDYzMQUyNjU0JiMiBhUUFjMFITIWHQEUBiMhIiY9ATQ2MzEFMjY1NCYjIgYVFBYzBSEyFh0BFAYjISImPQE0NjMxBTI2NTQmIyIGFRQWM8YDiyAsLCD8dSAsLCAC9B8tLR8fLCwf/QwDiyAsLCD8dSAsLCAC9B8tLR8fLCwf/QwDiyAsLCD8dSAsLCAC9B8tLR8fLCwfA2AsIEsgLCwgSyAsvSwgHywsHyAsciwfTB8sLB9MHyy9LR8fLS0fHy1xLCBLICwsIEsgLL0sHyAsLCAfLAAAAAABAAAAA8zNjcZq5V8PPPUACwQAAAAAANWcvpwAAAAA1Zy+nP///8AFiAPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAWa/////AWIAAEAAAAAAAAAAAAAAAAAAACQBAAAAAAAAAAAAAAAAgAAAAQAAIYEAACJBAAAzQP+AGoD/gBsA/4AQAQAAIgEAACAA/4AhQQAAG4EAgA9BAAAsAO1AM8EAAB/BAAAhQQAAJoD/gF/A/4AZAQCAJQEAACIBAAAawQAAEADtQC4BAAAuwQAAIoD/gCAA7UAzAP+ANED/gCrBAAAgAQAAJwEAACABAAAiQQAAM0EAACABAABUwQAAIkEAACABAAAgAQAASAEAADeBTL//wVdAAEFiAAABAAAMwQAADMEAgCNBAAATQQAASAEAAEgBAABQAQAAUAEAACABAAAbwQAAAAEAAAABTgAAANAAIYEAACgBAAAlAQAAAAFJQClBTsA0QTNAJoEAACgBAABNQQAAEAEAACABAAARAQAAIkEAABEBNoAeAQAAH8EAABABAAAQAOrADsEAABABAAAhQQAAEAEAABABAAAeATNAMAFmgCGA2IAUASJAAAEAAAABIAAAAPHAA0EAACABAAAVgQAAAAEAACrBAAAgAQAAFUEAACrBAAAqwQAAQAEAABVBAAAKwQAAFUEAABVBAAAVQQAAIAEAABVBAAAgAQAAFUEAACABAAAgAQAAKsEAAArBAAAgAQAAKsEAACABAAAgAQAAKsEAABVBAABAAQAAIAEAACABAAAgAQAAFUEAABVBAAAVQQAAHUEAABVBAAAKwQAAIAEAACABAAAKwQAAMAEAADVBAAA1QQAAFUEAAB1BAAAgAQAAIAEAAArBAAAqwQAACAFFwB6AAAAAAAKABQAHgBSAQABMgFQAXgBpgHIAlgCkgMIA1IDmAOsBAoEKARwBHwElgTEBPYFPgWIBZoF9gYqBlQGbAaGBpwHAgfaB/AIEghMCGYIdAjMCOIJFAkiCVQJqAnmCiYKRgpeCoYKuArWCvALAgsUC1QLaguWC8INJA1WDXgNpA3wDhwOag6cDr4O2A8AD0IPthB4ELwQ8BFAEZQR9BIqEsITJhOuFJ4UyhTgFRIVnBXMFhAWVBaOFr4W/heMF+oYQhi4GPYZShmGGawZ2hoAGkoaiBqqGtgbWhuOG8IcSBymHPwdKB2YHc4eGh5eHqAeyB70HzAfbB+qH9QgDCBIIJYg5iFCIYYh5iH6IjQiZiKeItojGiNEI14j3iQ8JLoAAAABAAAAkAD2ABEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEAEAAAAAEAAAAAAAIABwCxAAEAAAAAAAMAEABRAAEAAAAAAAQAEADGAAEAAAAAAAUACwAwAAEAAAAAAAYAEACBAAEAAAAAAAoAGgD2AAMAAQQJAAEAIAAQAAMAAQQJAAIADgC4AAMAAQQJAAMAIABhAAMAAQQJAAQAIADWAAMAAQQJAAUAFgA7AAMAAQQJAAYAIACRAAMAAQQJAAoANAEQc3VwZXJtYXBvbC1pY29ucwBzAHUAcABlAHIAbQBhAHAAbwBsAC0AaQBjAG8AbgBzVmVyc2lvbiAzLjgAVgBlAHIAcwBpAG8AbgAgADMALgA4c3VwZXJtYXBvbC1pY29ucwBzAHUAcABlAHIAbQBhAHAAbwBsAC0AaQBjAG8AbgBzc3VwZXJtYXBvbC1pY29ucwBzAHUAcABlAHIAbQBhAHAAbwBsAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByc3VwZXJtYXBvbC1pY29ucwBzAHUAcABlAHIAbQBhAHAAbwBsAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'),url(data:font/woff;base64,d09GRgABAAAAAFEsAAsAAAAAUOAAAwAIAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIGxWNtYXAAAAFoAAAAVAAAAFQXVtMSZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAASXQAAEl0deYTj2hlYWQAAEs4AAAANgAAADYP4o6CaGhlYQAAS3AAAAAkAAAAJAlKBedobXR4AABLlAAAAkAAAAJAQQVEjGxvY2EAAE3UAAABIgAAASLmKtN4bWF4cAAATvgAAAAgAAAAIACiAPhuYW1lAABPGAAAAfIAAAHy+uYTjXBvc3QAAFEMAAAAIAAAACAAAwAAAAMEEAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6YsDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOmL//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAwCGAE0DegMzAA4AGgAeAAABISIGFREUFjMhMjY1EScDIiY1NDYzMhYVFAYTITUhAs7+DCMxMSMCTCMxrM80Sko0NUlJSv5cAaQDMzAi/b4iMDAiAeyo/WlJMzNJSTMzSQGdpQAAAAAEAIkASQN3AzcAFABFAFkAeAAAASIOAhUUHgIzMj4CNTQuAiMDNCY1NCY1NDYnLgEnPgM3DgEHDgEHDgEVFBY3NjIXHgEHDgEHDgEVBhYjIiY1MRciJic+ATcyNjc+ATc2FhcOASMxNy4BNz4BJy4BIy4BJyY2JyYGJzQ2Nx4DFRQGBzECAE6IZjs7ZohOTohmOztmiE6/CzMaBQQ4Dw0sOUQmBRYIERMJCisXBwgiCwxvGwk6CgIIAQkMDC+8GjIXDgsNDhsQDzAXFD0LJlgw/AgLCAcFAgETFhUgDRpUGgg4BgcFKkczHR8bAzc7ZohOTohmOztmiE5OiGY7/eUJNBkaFCIfJA8PBgIoRDQiBgsMCRIIERIrDA0WAgMFBSRVGxIsByoJDkxCCY8HBwYNAQcEAhMCAQgQFheIByASE0URETsBExw7LSAJJj0FDAcPOUxcMzVfJwAAAAACAM0ABAMzA3wAFAAgAAABIg4CFRQeAjEwPgI1NC4CIxMUBiMiJjU0NjMyFgIAQHBTMGBzYGBzYDBTcECrZEdHZGRHR2QDfDRXcz9LxbF6erHFSz9zVzT+zUdkZEdGZGQAAAAAAQBqACwDkwNVAA8AAAEhIgYVERQWMyEyNjURNCYDIP2+MEREMAJCMENDA1VEMP2+MENDMAJCMEQAAAAAAgBsACwDlQNVAA8AFQAAASEiBhURFBYzITI2NRE0JgEnNxclFwMh/b8wREQwAkEwRET+fOw3tQEYOwNVRDD9vjBDQzACQjBE/abtN5P9OwABAEAAKwN1A1UAIAAAASM1NCYjIgYdASMiBhUUFjsBFRQWMzI2PQEzMjY1NCYjAxPmMCIiMeYpOTkp5jEiIjDmKTk5KQIT4Sg5OSjhMSIiMeEoOTko4TEiIjEAAAEAiABGA3gDNgALAAABJwkBBwkBFwkBNwEDeFT+3P7cVAEl/ttUASQBJFT+3ALiVP7bASVU/tz+21MBJP7cUwElAAAAAwCAAEEDgANAAAsAVABgAAABIgYVFBYzMjY1NCYFNSMuASc3JwcuASc3JwcuASc1IxUOAQcnBxcOAQcnBxcOAQcjFTMeARcHFzceARcHFzceARcVMzU+ATcXNyc+ATcXNyc+ATczBSImNTQ2MzIWFRQGAgAfKysfHysrAWE5AwsIMi0yDR4QHUweEygVWBQnEiFMIRAbDDotOwcKA0REAwoHOy06DBsQIUwhEicUWBUoEx5MHRAeDTItMggLAzn+gFBwcFBPcXECCiseHysrHx4rdlkVKBQcTR0QHQwzLTUICgI+PwMLCDgtOA0cECJNIhIlFFkTJhIiTCEQHAw5LDcICgNAPgIKCDQsMwwdER1MHRMoFZNwUE9wcE9PcQAABQCFAEMDeAM2AAYADAATABkAJQAAASMVMxUzEQMjFSERIwERMzUzNSMRIxEhNSMBIzUjFSMVMxUzNTMDOfz8Pz/8ATs//Uw//Pw/ATv8Afd+fX5+fX4DNj/7ATr9TD8BPAG3/sb7P/5J/sQ/AXp7e317ewADAG4AZgOSAxsAGgBTAFgAAAEhIgYVEToBMxEhESMeATEOAQczMjY1ETQmIwMwJicmIiMOAQcjLgEnMzA2NTwBMTAmIyoBKwEqASMqASMqATEVMB4CMzA+Ajc+ATcwJicuAScFMxEjEQNm/e4SGgkWDQISOAYIAwUCNBIaGhJ4DwQFAwINIhu0CQ8GZBwFFwdILRYPHA0OGgoQEj5VWRk2UWArAgYDCQcGEAn9gGNjAxsaEf67AQP+kw0UAwUCGRIBrxEa/hsMAQEDKRMHEQkEEBEnHO0TFhIBFC0sAwYDFg4OGwnQAUX+uwAAAAQAPQCjA8gC3QAMABgAJgA0AAABMjY1NCYjIgYVFBYzITI2NTQmIyIGFRQWFyIOAjEVITUwLgIjJSoBIzMwFh8BMzUwJicCpzNJSTMzSUkz/rYzSUkzM0lJM1xxPhUCQRQ9cV8BJgICAgFGBwX4X+YB6UczM0dHMzNHRzMzR0czM0daJy8nb28nLycIQDCEb34HAAAGALAAPwNQA0AADgASAB4AIwApAC4AAAE1NCYrASIGHQEjFSE1IysBNTMFERQWMyEyNjURIRUFNTMRIyc1MxEjNSM1MxEjAmAcFGAUHPACoPAwYGD+sDgoAYAoOP3AAYBgYJBgYJBgYALgMBQcHBQwMDAwwP5PKDg4KAHhMPHB/n/Awf5/wMH+fwAAAAEAzwBIAuYDMQAGAAAJATMRIREzAdv+9IsBAooDMf6e/nkBhwAAAAADAH8AQAN/A0EAFAAhAD4AAAEOAxceAzc+AycuAwcXMhYVFAYjIiY3NDYzAyImPwE2NCMiBgcnPgEzMhYPAQYWMzI2NxcOASMB+k+LZzsBAT9pjU9Qi2c6AQE+aoxQKx0VJSEbGwEiJ2QUFg4fBAQGKg8OMWMYFAgKIwUDBAYjEw8vWxQDQQE/aY1QT4tnOwEBP2mNUE+LZzsBgB0UGCYaFxQq/g8iNn4PDREKFiguLCWEEg4PDxQwKAAAAAIAhQBkA3UDNQAEAAsAADchNSEVCQE3CQEXAbICwf0/AVIBHlP+j/6BUwEsZF5eAiv+4lMBcf6BVAEtAAIAmgBQA1UDQgAnADMAACUnOAExJz4BNTQuAiMiDgIVFB4CMzI2NxcwFDEzFxYyPwE2NCclIiY1NDYzMhYVFAYDVX8UFRcvUG0+PmxRLy9RbD4gOxw8AV4SMRErERH+b0ppaUpKaWnThBQkUS1AcVQwMFRxQEBxVDEODD4BYhISLBIzEoBtTU1sbE1NbQAAAAEBfwFAAn8CQAACAAABMxEBf/8BQAEAAAEAZAFvA5kCEQANAAABISIGFRQWMyEyNjU0JgM3/Y8oOjooAnEpOTkCES8iIi8vIiIvAAADAJQAPQNuA0MABAALABIAAAElDQElASUHBSUnBRUlBwUlJwUDbv6T/pMBbQFt/pP+visBbQFtLP6//r4rAW0BbSz+vwJK+fn6+v7O1Cz6+i3VitUt+fku1gAAAAEAiABHA3gDNwAgAAABIRE0JiMiBhURISIGFRQWMyERFBYzMjY1ESEyNjU0JiMDUf7wJhsbJv7wGwwMGwEQJhsbJgEQGwwMGwH/AREbDAwb/u8mGhsm/u8aDAwaAREmGxomAAACAGsAfgOOAx4AJQAyAAABMAYHMA4CByYGMQYWBw4BMRcwNjcyNjEwNic+AzE+AyMBFAYxMB4BNjcnMAYVA444aTBJVSUhHR4FBhATgwsRGCMWCR9EOCQRKSMVBP1gg1d6git7gAMeD04oPEcfBx0ZIAUND4QRFRwzCSZRQywVPjoq/cpcDicGPWN6Jl0AAAADAEAAWQPAAwAADQAYACwAAAE3FwEnNy4BMTA+AhcJAS4BIyIGFRQWFyUeARcOAyc3MhYzMjY1NCY1NwKWX1r9tFtYWmZZn9uD/sIBBRUvGU9xDAwB2SNHJUqOhXs4OwULBU9xAXICol5a/bNbVzd4b3A8M/7BAQUMDHBQGS8V5BxGK1RoNwoKOgFwUAULBXIAAAAAAQC4ACcC/QNRAAYAACUBMxEhETMB2/7dlwEYlicBgQGp/lcAAwC7AF0DRQMiABoAJgAzAAABJgYHDgEXASYGBwYWFxY2Nz4BJwEWNjc2JicBDgEnLgE3PgEXHgEBDgEnLgE3PgEXHgEHAzkrcyYiAh3++ypjISYHKytzJiIDHgEGKmIhJgcr/iAEJRcXGwQEJhYXGwG3BCYWFxsEBCUXFxsEAyInCCsmYyf+2BgPJitzJiYHKyZjJwEoGA8mK3Mm/ZoXGwQEJRcXGwQEJgHeFhsEAyYXFhsEAyYXAAMAigBKA2gDKAADABQAGQAAPwEnBwEnJiIHAQ4BHwEWNjcBNjQnBSc3FweKwHdJAt5lDicO/moOOQ59DkkOAZUODv7qIqshqkpId78CeGYODv5qDkkOfQ46DgGVDicOziKrJKkAAAAAAgCAAEIDfQM+AAwAGgAAATI2NTQmIyIGFRQWMxciDgIxFSE1MC4CIwH8Tm5uTk5ubk4CepZSHAL9GlGWfgHDb09Ob29OT29mNT81cnI1PzUAAAAAAQDMAEYC6gMzAAsAACUhNTMDMxEhETMDMwLq/eLg4IwBBYzg4UY/ASMBi/51/t0AAQDRAEcC7wM1AAsAAAEhFTMDMxEhETMDMwLv/eLh4IwBBYvf4AM1QP7d/nUBiwEjAAAAAAIAqwBrA1UDFQAEAAkAABMhFSE1BTMRIxGrAqr9VgERiIgDFYiIiP3eAiIABACAAEIDgANAABEAHQAyAEYAAAEuASMiBgczPgE3BzMnHgEXMycyNjU0JiMiBhUUFhMiDgIVFB4CMzI+AjU0LgIjESIuAjU0PgIzMh4CFRQOAgLNAkV9fUUDQgUPCgHQAgkNBUHDJTMzJSQ0NBpQi2g9PWiLUE+MaD09aIxPPmxRLy9RbD4+bVEvL1FtASRcfW9qFyUPgXoOIhTgMyUkNDQkJTMBPD1oi09Qi2g8PGiLUE+MZz39Vy9RbD4+bFEvL1FsPj5sUS8AAAAABgCcAF4DZAMnACAALAA9AGoAewCHAAABNiYnJgYHBhYXHgEXEQ4BBwYWFxY2NzYmJy4BJxE+ATcDDgEnLgE3PgEXHgEDMSoBJy4BNz4BFx4BBw4BBwERPgE3NiYnJgYHDgEHIRUhHgEXHgEXEQ4BBw4BByEVIR4BFxY2NzYmJy4BJwM+ARceAQcOAQcxIiYjLgE3Ew4BJy4BNz4BFx4BAV4kBygpayMkBygNHxAUJQ4kBygoayQkBygOHhAUJA8uBCMVFRkEAyMVFRk0AwUDFRkEAyMVFRkDAxwSAh4UJQ4kBygobCMMDgP++wEFBBQQDh4QFCUODA4D/vsBBQQUEClrIyQHKA0fEE0EIxUVGQQDHBIDBQIWGANmAyMVFhkEBCMVFRkCcChrJCMGKShrJAsOBP73BBUQKGskIwYpKGsjDA4EAQkEFBH+RhUZBAMjFRUZAwQjAcYBAyMWFRkEAyMWEhgB/q0BCQQUEShrJCMGKQ0fEDQUJA8LDgT+9wQVEA0fEDQUJA8jBikoayMMDgQBkBUZBAMjFhIYAQEDIxb96BUZBAMjFRUZAwQjAAAAAgCAAEADgANAAAIABgAAAREBATMRIwGQAfD9ALGxA0D9AAGA/oADAAAAAAACAIkAjQN3AvMACAANAAATNwUlEQUlBxEXEQURJYm2ATgBAP8A/si2zAER/u8Cuzg4OP3eRDg4Ai4M/lc1Aak1AAAAAAMAzQCNAzMDNwAMABkAJQAAATI2NTQmIyIGFRQWMwUyNjU0JiMiBhUUFjMFMjY1NCYjIgYVFBYCREdkZEdGZGRG/u8rPDwrKjw8KgGaKjw8Kis8PAHiZEdHY2NHR2TNPCsqPDwqKzyIPCorPDwrKjwAAAAAAwCAAIADgAMAAAMABwALAAATITUhESE1IREVITWAAwD9AAMA/QADAAGAgP6AgAIAgIAAAAEBUwETAq0CbQACAAABIREBUwFaARMBWgAAAAACAIkASQN3AzcADwA4AAABDgEHER4BFyE+ATcRLgEnJSE+ATMyFhUUBgcRHgEVFAYjIiYnIQ4BIyImNTQ2NxEuATU0NjMyFhcBUAghFhYhCAFgCCEWFiEI/qABYAs1ISo8Jh4eJjwqITUL/qALNSEqPCYeHiY8KiE1CwKvFiEI/qAIIRYWIQgBYAghFkQeJjwqITUL/qALNSEqPCYeHiY8KiE1CwFgCzUhKjwmHgAAAAIAgABAA4ADQAACAAYAACURAQERMxECcP4QAk+xQAMA/oABgP0AAwAAAAAAAQCAAEADgANAAB8AAAEhETQmIyIGFREhIgYVFBYzIREUFjMyNjURITI2NTQmA1r+5iMdHSP+5hwKChwBGiMdHSMBEyILCgIAARocCgoc/uYjHR0j/u0iCwocARojHR0jAAAAAAEBIAFAAuACQAACAAABGwEBIODgAkD/AAEAAAABAN4AngMiAuIAGgAAASYGBwYUFxYyNz4BJwEWNjc2NCcmIgcOARcBAVMdQBgeHh5VHhgKDgEqHUAYHh4eVR4YCg7+1gFDDgoYHlUeHh4YQB0BKg4KGB5VHh4eGEAd/tYAAAAABf///8AFMwPAABAAHAAoADQAOAAAASEiBhURFBYzITI2NRE0JiMHMhYVFAYjIiY1NDYjMhYVFAYjIiY1NDYjMhYVFAYjIiY1NDYBIREhBNr7fiU0NCUEgiU0NCVkDhMTDg4TE1YOFBQODhMTVg4UFA4NFBQBOft+BIIDwDMk/K4kMzMkA1IkM1cTDg0TEw0OExMODRMTDQ4TEw4NExMNDhP8rgK6AAAAAwAB/8QFXQO8AAYADQAcAAAlNQkBNQkBARUJARUJAScmBgcDBhYXFjY3EzYmJwGU/wABAP5tAZMCLgEE/vwBm/5ljBoxCO0IGBoaMQjtCBgaIJYBAgEClf5p/mgDNpT+/v7+lAGWAZZmCBka/IcbMQgIGRoDehoxCAAAAAMAAP/ABYgDwAAYAB0AKQAAJTI2NRE0JiMhIgYVERQWMyMUFjMhMjY1IwEhESERASImNTQ2MzIWFRQGBJwxRUUx/FAxRUUx7EUxBJwxRez8UAOw/FAB2BgjIxgZIiI4RzIClzJGRjL9aTJGMkdHMQMQ/WkCl/y0JBkYJCQYGSQAAgAz/+YDvgNxAAkADgAAATY0LwEmIg8BFwEVMwEnA74PD3gOKw9ewPzTwAI2wAKxDysOeA8PXsD+U8ACN8AAAAEAMwBAA80DQAAKAAAJATMRMxEzETMRMwIA/jOK57jnigNA/mn+lwEP/vEBaQAAAAIAjQBLA3UDMwAHABYAAAEVITUjESERESUVIg4CMT4DMxUlAx39x1cC6P74eJhYISJTYnFBAQgBUq+v/vkBBwER0H1hdmI1Ph8JjNcAAAAAAgBNAA0DswNzAAkAHQAAEwE3ATM1IREzNSUhFSERIREjERQWMyEyNjURNCYjrQHcRP4lrf6uYAKl/q4BUv1bYDgoAqUpODgpAs7+JUQB22H+rq2lYf1bAVP+rik4OCkCpCg5AAIBIADAAuACwAAGAA0AAAE3JwcnBxcnBxc3JwcnAgDgM62tM+CtM+DgM62tAabnM62tM+c0NObmNK2tAAIBIADAAuACwAAFAAsAACUXNxc3JzUXNycHFwEgM62tM+CtM+DgM/Mzra0z53mtNObmNAABAUAAgALAAwAABQAAAQcXBxcBAYZG7e1GAToDAE3z800BQAABAUAAgALAAwAABQAAARcHFwcBAnpG7e1G/sYDAE3z800BQAACAIAAQAOAA0AAGgAmAAAJAS4BIyEiBhURFBYXAR4BMzI2NwE+ATU0JiclIiY1NDYzMhYVDgEDaP6qDhwR/vYfLgoOAVYOGg0OHwkBCRIMCg79oBYlIBsWJQQhAdIBVg4KLh/+8BEbCf6kCQkKDgEPCRsSDRoOsSAbFiUgGxsgAAEAbwBkA5EDHAAKAAAJATMRMzUzFTMRMwIA/m97xqDGewMc/o/+ufb2AUcAAgAA/8AEAAPAABMAGQAAASIOAhUUHgIzMj4CNTQuAhMlETMRFwIAaruLUFCLu2pqu4tQUIu7W/7sT+wDwFCLu2pqu4tQUIu7amq7i1D87L0Ba/7FngAAAAMAAP/ABAADwAATABcAGwAAASIOAhUUHgIzMj4CNTQuAgMjETM1IzUzAgBquotRUYu6amq6i1FRi7o3ZmZmZgPAUYu6amq6i1FRi7pqarqLUf0AATNnZgARAAD/wAU8A8AABgAOABcAHQAkACoAMgA7AEQATQBUAF0AZABtAHYAfwD1AAABJw4BBxc3JyIGBxc+ATcXNy4BIw4BBxcXJwcXPgEHJwcXPgE3BRc3Jw4BJS4BJxYGBxcnNiYnLgEnBxcPAR4BMz4BNycfAT4BNycOAQcHMjY3Jw4BAScOAQcXPgE1BR4BFy4BNxcGFhceARc3JzcnDgEHFz4BNwcOAR8BPgE3JyUuAyMiBgcuAyMiDgIHDgMVFB4CFzkBMjY1NCYjMTUuATU0PgIzMTIWMzI2NTQ2NzE+ATMyFhczHgEzMjY3Mz4BMzIWFTAUFTkBFAYVFBY7AR4BFRQGIzkBIyIGFRQWMzEzMDIzMj4CNS4BJwKucA0WDnkoJDViKGYbLREoNhEiEBQ0Gm+Bbyh4Cg8ieChvDhkK/tpwKHkKDgG/BjIlAwEHYnMKAwMNHBE6cNY1ECIQFDQab45nFCAKeAoVDmI2XShhGy4BEWsDEgp4Cgj9uQY0KAQCChIKAgMOHBA2a0dvFCEKfQoaDbIKBwRqBBIKfQMhAylDWDIRIA0POEpaMjdiTjUKOmhOLSlHYDcUHR0USmAeNUgpBw0HFyMBAw5xSk1yDgQHHhAHEgcEDRsOP1wEHhcFL0BFL2sQGBgQZwEDKko4IQNfQwFRLBQwHixisiYhKSwzEZyOBwcONiwsRyxmLRs0ZS1nLBoxGwQtZi0bNFMzWiEXRC8kLTJKFwoQCo8o2ooHBw42LCgfKBQuGy0eMBR9JiEkKDYBJigXNBstGDgbOjJeIhhELgkyTRQKDgePI/4oFC8aLRszFEcbOhooFzQbMdExVUElBQQtTDYeJEFYMwQxT2g6OWVPMgcdFBQdBApxSShHNh8EIhgDDAdGY2RKEBgGAwMGWD8BBAMHAxQdA0ErL0UcERAcHzZJKkNrDQAAAAABAIYAYAK+AyAAJQAAATQiMTQiMTQiMTUuASMiBhURLgEGFjEeAzEhND4CPQE0IjECeEdGRwMqHR4pQjwUBShBLhkBHiEoIUYB7BobGp8dKSkd/uZCBS48G2lqTw1HT0YNfBoAAQCgAGADYAMgABMAAAEUDgIjIi4CNTQ+AjMyHgIDYDdggElJgGA3N2CASUmAYDcBwEmAYDc3YIBJSYBgNzdggAAAAAABAJQAAANsA4AAHQAAASImIyIGBzU0JiMiBhURMxEwNjMyFjMyNjERMAYjAqhHPW02ZCocERAiX1dtSDxtbVdXbQLpZRwRLRUdHRX8sgFbZWVlAY5lAAAAAwAA/8AEAAPAAAsAHwAzAAABIgYVFBYzMjY1NCYDIg4CFRQeAjMyPgI1NC4CAyIuAjU0PgIzMh4CFRQOAgIAPlxcPj5cXD5quotRUYu6amq6i1FRi7pqVJVwQUFwlVRUlXBBQXCVAlpcPj5cXD4+XAFmUYu6amq6i1FRi7pqarqLUfxmQXCVVFSVcEFBcJVUVJVwQQAAAAACAKUAQASAA0AAEQAZAAABISchIgYVERQWMyEyNjURNCYDFSM1IzcXIwQd/nVi/tcpOTkpAxYpOjruY5/Q0Z8C4104Jf3AKTo6KQHdKTr+rMDAy8sAAAAABgDRAGAEagMgAAsAFwAjACgALQAyAAABIgYVFBYzMjY1NCYDIgYVFBYzMjY1NCYDIgYVFBYzMjY1NCYTFSE1IREhNSEVESE1IRUBHSAsLCAhKyshICwsICErKyEgLCwgISsrcQK7/UUCu/1FArv9RQMgKhwdKiodHCr+5iocHCoqHBwq/ucqHRwqKhwdKgIdXFz9bFxcARliYgAABQCaAEAEMwNAAAoADgASABYAGgAAExEUFjMhMjY1ESEBIREhASE1ITUhNSE1ITUhmjclAuElN/xnAZv+wQE/AaL+ugFG/roBRv0fAuEDQP1iKjg4KgKe/WIBHv7iYlpiYosAAAUAoABgA2ADIAADAAcACwAPABMAABMzFSM7ARUjIzMVIwEzFSMVMxUjoOvr6+rq6+vrAdXr6+vrAyDr6usCwOvq6wAAAQE1AT0CywJLAAwAAAEHBiIvASY2MyEyFgcCy7sGFAa7CgwPAXQPDAoCHuEICOENICANAAIAQAFAA8ACQAAJABUAABMwPgEEFwYELgElIgYVFBYzMjY1NCZAjPMBR7q6/rnzjAHANUtLNTVLSwG6pm433dM1ap6GSzU1S0s1NUsAAAAAAgCAAEADgANAABMAKwAAATIeAhUUDgIjIi4CNTQ+AgMXHgEzMjY/ATY0JyYiDwEnJiIHBhQXMQIAUItpPDxpi1BQi2k8PGmLY5MGEQkJEQaTDQ0NJg1zcw0mDQ0NA0A8aYtQUItpPDxpi1BQi2k8/mJ3BQYGBXcLHgsKCl1dCgoLHgsAEQBEAEkDvAM3AAMABwALAA8AFAAZAB4AIgAmACsAMAA1ADoAPgBDAEgATAAAExUzNSEVMzUFFTM1JxUzNQUVMzUjIRUzNSMlMxUjNSEzFSM3MxUjEzMRIxEXMxUjNQEhFSE1ESEVITURMxUjJTMVIzURMxUjNSEzFSNEzQHeiP4jiIiI/iLNzQKriIj9VUVFARFFRc1ERIlERMxFRfzNA3j8iAN4/IhFRQMzRUVFRfzNRUUCJkRERESIRESIRETMRUVFRYiIiM3NzQER/u8BEUSIiAFVRET9VkREAmaIiIiI/d5EREQAAAwAiQCvA3cC0QALABcAIwAvADwASABUAGAAbQB5AIYAkgAAEyImNTQ2MzIWFRQGByImNTQ2MzIWFRQGByImNTQ2MzIWFRQGISImNTQ2MzIWFRQGIyImNTQ2MzIWFRQGIyMiJjU0NjMyFhUUBgMiJjU0NjMyFhUUBgciJjU0NjMyFhUUBjciJjU0NjMyFhUUBiMzIiY1NDYzMhYVFAYHIiY1NDYzMhYVFAYjMyImNTQ2MzIWFRQGzRwoKBwcKCgcHCgoHBwoKBwcKCgcHCgoAkocKCgcHCgo6RwoKBwdKCgdzB0oKB0cKCgcHSgoHRwoKBwdKCgdHCgosBwoKBwdKCgdzRwoKBwcKCjpHCgoHB0oKB3NHCgoHBwoKAJJKBwcKCgcHCjNKBwcKCgcHCjNKBwcKCgcHCgoHBwoKBwcKCgcHCgoHBwoKBwcKCgcHCgBmigcHCgoHBwozSgcHCgoHBwozSgcHCgoHBwoKBwcKCgcHCjNKBwcKCgcHCgoHBwoKBwcKAAGAEQASQO8AzcABQASABcAHAAhACYAADcbATcTIQEiJjU0NjMyFhUUBiMBIRUhNREhFSE1ATMRIxEhMxEjEc2Iq2bN/ZoB3h0oKB0cKCgc/ZkDePyIA3j8iAMzRUX8zUVF0QFV/u/N/u8BVSgdHCgoHB0oARFERP1WREQCZv2aAmb9mgJmAAAABAB4AIAD+AMAAAUACQAPABUAAAEFJTclBSEFLQEFFwUlNwUlFwUlNwUD0/5l/kAlAZsBwP0VASsBK/7VAXVL/kD+QEsBdQF1S/5A/kBLAXUCMLDAELDAgICA4CDAwCCgICDAwCCgAAADAH8ATgNzA0EAEwAoADYAAAEiDgIVFB4CMzI+AjU0LgIDIi4CNTQ+AjMyHgIVFA4CIwU2Mh8BFhQHBiIvASY0AdZHfV02Nl19R0d9XTY2XX1HM1lCJydCWTMzWUMmJkNZMwESDikORg4ODygPRQ4DQTZdfUdHfV02Nl19R0d9XTb9tCZDWTMzWUInJ0JZMzNZQyYdDg5FDikODw9FDikAAwBAAAADwAOAABMAJwA4AAABIg4CFRQeAjMyPgI1NC4CAyIuAjU0PgIzMh4CFRQOAicHBiY1ETQ2HwIeARUUBgcCAF2jekZGeqNdXaN6RkZ6o11Qi2k8PGmLUFCLaTw8aYtZTA8cHA9MuAgJCQgDgEZ6o11do3pGRnqjXV2jekb8wDxpi1BQi2k8PGmLUFCLaTzxLQkVFAE4FBUJLW8FEQoKEQUAAAAABABAAAADwAOAABMAJwA1AEMAAAEiDgIVFB4CMzI+AjU0LgIDIi4CNTQ+AjMyHgIVFA4CAzIWFREUBiMiJjURNDYzMhYVERQGIyImNRE0NgIAXaN6RkZ6o11do3pGRnqjXVCLaTw8aYtQUItpPDxpi7ANExMNDRMTzQ0TEw0NExMDgEZ6o11do3pGRnqjXV2jekb8wDxpi1BQi2k8PGmLUFCLaTwCIBMN/wANExMNAQANExMN/wANExMNAQANEwAAAgA7AAADcAOAABEAIgAAJSMRNCYrATU0NjMhMhYVERQGAxEUBiMhIiY1ETQ2MyEyFhUDBGw/LNg/LQFDLT8/2z8t/rwsPz8sAUQtP+ABiC5COC5CQi7+QC5CAVD+QC5CQi4BwC5CQi4AAAAAAgBAAAADwAOAAFQAaAAAATUmNj8BNiYvAS4BLwEmIg8BDgEPAQ4BHwEeAQ8BBhY/ATYyHwEWNi8BPgE3Bw4BIyImJy4BJyY2MTcwNiMuASsBPgEzMhYXMBYXFgYxBzAGFx4BFwMiLgI1ND4CMzIeAhUUDgICiwEGBmsGBAiTCBEEQgQKBEIEEQiTCAQGawYGARkCCQeEBxYHhAcJAhUGDwgMIkslEiIQDhwNBAWoAwM0cDUGJVoxHjcaFgcFBakDBCNQJ4tdo3pGRnqjXV2jekZGeqMBfwEIFAZoBgoBFQIMB4YHB4YHDAIVAQoGaAYUCJMIBgRFBARFBAYIfgIIBAIGBgEBAQMBAQV3AwgGCAkDAwMBAQR1AgEFBQH+gUZ6o11do3pGRnqjXV2jekYAAAIAhQBfA3sDOwAfAEcAAAEeARUUBg8BDgEnLgE9ASMiJj0BNDY7ATU0Njc2Mh8BBTIWHQEUBiMhIiY1ETchMhYVERQGKwEiJjURIxUUBisBESE1NDY7AQN4AgEBApwDBgIDAo8GBQUGjQMEAgUDnf7/CAcHCP4dCAfcARYIBwcINggHswgHlwFZBwg2AUkBBAQDBAFwAgEBAQUENQYFYAUFNQQFAQICcG4HCGAGBwcGAfXaBgf+hQcHBwcBNJUIB/5xGAgHAAAAAwBAAAADwAOAABMALQBfAAABIg4CFRQeAjMyPgI1NC4CAyMiJjUmNjcmNjc+ARceAQcOAScOARcUBiM3IiYnLgE3PgEXHgEzMjY1NCYjIgYVFBYXFgYHBiYnLgE1ND4CMzIeAhUUDgIjMQIAXaN6RkZ6o11do3pGRnqj5AEIDANCHgwDDxVBGhkIFBI6GRo7AwwIjQsVCggJAgEPCAgQCT9ZWT9AWQQEAgcICA8DBQUeNUcoKEY1Hh41RigDgEZ6o11do3pGRnqjXV2jekb9HAwIZ30eFTIUGwgVFUIbGAsPGW5cCQ15AwICDgkICgICAlxAQVtbQQwZDAkPAwMICA8gEClINh8fNkgpKUg2HwAIAEAAAQPAA38ADAAaAC0AOgBPAGkAkACpAAABDgEXHgE3PgEnLgEHBwYmNz4BMzIWBw4BBzE3FBYXFjI3PgE1NCYnJiIHDgEVByIGFxQWNz4BNTQmBxMiDgIVFB4CMzI+AjU0LgIjEzgBMSMiJjU0NjM2FjEOASMiJjU8ATc2JgcXFAYHDgEuAScuATc+ATc+ARceAQcGFjc+ATc2FhcWBjEwBhceARU3DgEjIiY1NDY3NiYxIyImNT4BNzMeATkBAdVAVQUEYUFAVQUEYUEBIi8CAjEhIS4CATAhCAIDAgYCAgMDAgIGAgMCHwwSARAMCxEODUNdo3pGRnqjXV2jeUdHeaNdgQMGCQgGSQQBBwQFBwEBLAdLFDkpamVUEwQIDAdQEQ5IFRQMBgMLBgULERcdEhMMBQg0DEgBDAcIDAEBDHMDCAsBCQcFhQgB3gdEKSkwBwdDKSkxB7UCKCAgKyodHioCVAMEAgEBAgQDAwUBAQEBBQMEDwoLDQEBDgoKDgECBkZ6o1xdo3lGRnmjXVyjekb+rwgGBQgFTwQFBwUCAgEkBQKnCTgmGhAPMCcKMB0SYggPHwYFJhELCQMCCgUEAQ0NKQsCEiwJaQcIDQgCAgJZFw0IBwsBCJwAAAAGAHgBCQOIAqsAAwAIAAwAEAAUABgAABMhESETFSE1ITsBFSM3MxUjNzMVIzczFSN4AxD88GkCPv3CaDQ0aTQ0aDQ0aTQ0Aqv+XgE60dFpaZ2daWmdAAAAAgDAAGAEDQMgAAQACAAAEyEVITUFMxEjwANN/LMBYI2NAyCNjY39zQAAAAAGAIYAIAUTA2AABAAJAA4AEwAYAB0AAAEhFSE1ESEVITURIRUhNQEzFSM1ETMVIzURMxUjNQImAu39EwLt/RMC7f0T/mD6+vr6+voDYKam/rOmpv6zpqYCmqam/rOmpv6zpqYAAgBQAAUC7wNBAEMAWQAAEyEyFhceARUUBgcOAQcVHgEXHgEXHgEXHgEXHgEVHgEXHgEXHgEXIy4BJy4BNS4BJzQmJy4BJy4BJy4BJy4BIyERIxEBMjY3PgE3PgE3PgE1NCYnLgEjIREzUAGGO10hISISERE3JRIdCwwSBgcKAwMFAgECAQMCAgcEBQ0JewYIAgIDAQEBBAMCBgMECwcIEw0MIBX+824BVBMlEREfDQ0VCAgHERESOCf+7uYDQR0dHVAyJkIcHScKAgQMCAgTDAsZDg4dDw8fDxAfDw8dDQ4YCgYRCwsZDg0eDxAfDw8cDg4XCwoQBgYG/p8DPP6CAwMDCwgJFw4OJRYgMxMUFP7fAAAAAwAA/8AEiQPAAAkADQAXAAABJSYGFREUFhcFMyURBQEFFjY1ETQmJyUBVf7qGiUlGgEWRQFT/q0BmQEWGiYlG/7qAzdwChkc/REdNgtvhgN6if0ScAoZHALvHTYLbwAAAgAA/8AEAAPAABMAMwAAASIOAhUUHgIzMj4CNTQuAgM1IzAmNTQ2MTM1MDYzMhYxFTMyFhUUBisBFTAGIyImAgBqu4tQUIu7amq7i1BQi7uj4zk54w4rKw7jFCUlFOMOKysOA8BQi7tqaruLUFCLu2pqu4tQ/OTjDisrDuM5OeMkFRUk4zk5AAMAAP/ABIADwAASACAALwAAEyIGFREUFjsBFTchMjY1ETQmIwMhMCY1NDYxITAWFRQGATAmNTQ2MSEwFhUUBjEhgDBQUDBAwAKAMFBQMLX96jU1AhY1Nf3qNTUCFjU1/eoDwFEv/cAvUcDAUS8CQC9R/cAQMDAQEDAwEAEAEDAwEBAwMBAAAAABAA3/2AO8A68AJgAAEwYWOwERFBY7ATI2PQE0NjsBMhYdARQWFzMyNjURMzI2JwEmIgcBDREKF3IiGHAYIiEYcRghIhhxFyJyFwoR/lERLxH+UQIAERf+ORchIRjiGCEhGOIYIQEhFwHIFxEBrxER/lEAAAIAgP/rA4ADlQARABgAAAEhIgYVERQWFwUlPgE1ETQmIwEnNxcBFwEDK/2qIzIVEQFaAVoRFTIj/oDWPJoBRDz+gAOVMiP92BYlDObmDCUWAigjMv2A1jyZAUQ9/oAAAAIAVgAiA6sDawAZACYAAAkBLgEjIgYHAQ4BFRQWFwEWMjcBPgE1NCYnBTUjFSM1NDY7ATUXBwOe/oAFEAkJDwb+gAYGBgYBgA0jDAGABgcHBv63qlYZEtWWlgHeAYAGBwcG/oAFEAkJDwb+gAwMAYAGDwkJEAWJa4CrERlrlZYABgAAABUEAAONAAsAHwArAEQAWABkAAABMjY1NCYjIgYVFBYTIg4CFRQeAjMyPgI1NC4CAyImNTQ2MzIWFRQGAzM1IycuASMiBg8BDgEVFBYfARUzESc3FwUiDgIVFB4CMzI+AjU0LgIDIiY1NDYzMhYVFAYCqx8tLR8gLS2gLE46IiI6TiwsTjkiIjlOLD5YWD49WFjxtIlSCiETDxsKngoLExGPTWBjSf5eLE45IiI5TiwsTjoiIjpOLD1YWD0+WFgC8y0gIC0tICAt/s0iOU4sLE46IiI6TiwsTjki/pVYPj1YWD0+WAHATYwQEwsKngoaDxQhClfVARRIY2pVIjlOLCxOOiIiOk4sLE45Iv6VWD49WFg9PlgAAAAEAKsAQANVA2sAJQAxAD0AQgAAExQWFxUUFjsBMjY9ASEVFBY7ATI2PQE+ATURNC4CIyIOAhURFyImNTQ2MzIWFRQGISImNTQ2MzIWFRQGEyE1IRWrFxMZEisRGQFWGRErEhkTFzVdfEdHfF01lRslJRsbJSUBZRslJRsbJSUl/gACAAEVHDERTBIZGRIqKhIZGRJMETEcAas4QyQMDCRDOP5VKiUbGiYmGhslJRsaJiYaGyUBANXVAAAAAAQAgABAA4AC6wAcACgANAA5AAABLgEjISIGBwMRFBY7ATI2PQEhFRQWOwEyNjURAwEiJjU0NjMyFhUUBiEiJjU0NjMyFhUUBiU3IRchAycGIRX+KhUhBlkZEioSGQIAGRIqEhlZ/e4aJiYaGyUlAbsbJSUbGiYm/dBAAdZA/aoCwBIZGRL/AP6rEhkZEioqEhkZEgFVAQD+VSYaGyUlGxomJhobJSUbGibWwMAAAAAAAwBV/+sDqwOVAB4ASwBQAAAlIiYnDgEiJicOASsBFTMyNjceATMyNjcHHgE7ATUjJTMyNjceATMyNjceATsBEzYmJy4BLwE1NCYrATUhFSMiBh0BBw4BFRQWFyMTEyEVJQUDVSxXJydYWFgnJ1csVlYsVigmVi8vVycCKFYsVlb9VAIzWB8gWDMzWCAfWDMCUQMCAwQOCDcyI4D/AIAjMjcOEQECAVJXAgD/AP8AQB0bGxsbGxsdVRUVFBUWFAEVFVVVMiQkMjIkJDIBHQkRCAcLAxLFIzKAgDIjxRIEFw4EBwP+4wIrqVRUAAADAKsAQANVA5UAFwAjACcAABMUFjMHFSE1JzI2NRE0LgIjIg4CFREFIiY1NDYzMhYVFAYTITUhq1c+QAIAQD5XNV18R0d8XTUBVSMyMiMjMjLd/gACAAErPlhAFRVAWD4BwDhDJAsLJEM4/kBAMiMjMjIjIzIBKtYAAAAABQCrAEADVQNrABcAIwAoADQAOQAAASIOAhURFBYzBxUhNScyNjURNC4CIwMiJjU0NjMyFhUUBhMjNTMVEyImNTQ2MzIWFRQGEyM1MxUCAEd8XTVXPkACAEA+VzVdfEfAGyUlGxslJXrV1esbJSUbGyUlJdXVA2sMJEM4/ms+WEAVFUBYPgGVOEMkDP2AJRsaJiYaGyUBANXV/wAlGxomJhobJQEA1dUAAgEAABUDKwO3AA0AJwAAATI2NTQmIyIGFTEUFjMTMzUjJy4BIyIGDwEVMzU3AzMTFxUzESc3FwJVIC0tIB8tLCAF0ZtVCiETBgsE6E1ap016ZExqHy4DHi0gHy0tHyAt/vdNjhAUAgFI3pwc/XIBWoTWARLCek4AAQBVABUDgANrABUAAAE1JTU0JiMiBh0BBRUlFQcVNxc1JzUDgP6rJhobJf6qAVZWlpVVARVW1esaJiYa69VWa+tAQCsrQEDrAAAAAAIAKwBrA9UC6wALABsAAAEyNjU0JiMiBhUUFgEhESERIxEzNSEVMxE0JiMBKzVLSzU1S0sCNf6q/qtVVQMAVWRGAZVLNTVLSzU1SwEA/tYBgP2AgIABgEZkAAAAAQBVABUDgANrABUAAAE1JTU0JiMiBh0BBRUlFQcVNxc1JzUDgP6rJhobJf6qAVZWlpVVARVW1esaJiYa69VWa+tAQCsrQEDrAAAAAAMAVQBrA6sDFQAgADEANQAAJTM1MzI2PQE0JisBNTM1IzUjFSMiBh0BFBY7ARUjFTMVASEiBhUDFBYzITI2NRE0JiMRIREhAdVWKhIZGRKAq1VWKhIZGRKAq1UBgP1WJDEBMiQCqiQyMiT9VgKq6yoZEoASGSpWKioZEoASGSpWKgIqMST+ACQxMSQCACQx/asCAAACAFUAawOrAxUAHQAoAAABNDYzNTQmIyEiBh0BMhYVFAYjFRQWMyEyNj0BIiYHJwc3Jz8BHwEHFwNVMiQyJP1WJDEjMjIkMiQCqiQyJDK8mZkujLVCQrWNLwHAIzKrIzIyI6syIyMyqyMyMiOrMqpiYrBzCqmpC3KwAAAAAgCAAEADgANAAAsAEAAAAREjFSE1IxEBNSEVFychByEB1dUCANUBVf0AwFUCKlX+gAGV/wBVVQEAAVZVVVZWVgAAAAADAFUAQAOrA0AAEgAWABsAAAEhERQWMyEyNj0BMzI2PQE0JiMVIzUzASE1IRUDVf1WZEYBAEdkVSQyMiRVVf0AAwD9AANA/lVGZGRGgDIkgCMy1YD9VVVVAAAAAAcAgP/rA4ADngALABcAIwBAAEwAWABdAAABMjY1NCYxMAYVFBYjMjY1NCYxMAYVFBYjMjY1NCYxMAYVFBYFLgEjISIGDwERFBY7ATI2PQEhFRQWOwEyNjURJwEiJjU0NjMyFhUUBiEiJjU0NjMyFhUUBiU3IRchAtUbJUBAJrsbJUBAJboaJkBAJQIXBiEV/ioVIQZZGRIqEhkCABkSKhIZWf3uGiYmGhslJQG7GyUlGxomJv3QQAHWQP2qAuslGyBTUyAbJSUbIFNTIBslJRsgU1MgGyWBExgYE//+qhEZGRErKxEZGREBVv/+ViUbGyUlGxslJRsbJSUbGyXVwMAAAAAAAwBVAGsDqwMVAAwAGQAkAAABNSEVIxEhNTMVIREjBSMVMxUjNTM1IzUzFRcjNSM1MxUzNTMVAyv9qoABVqoBVoD+qlVVgFZWgNYrVSorKwKVgID91qqqAiqAKiuAKyqAVVWAVVXVAAADAIAAFQOAA2sACgAaAB4AABsBHgEzITI2NxMhASImNTQ+AjEwHgIVFAYTISchgFYEMCEBqiEwBFb9AAGANUsoMCgoMChL2f3kEwJBA2v89iAsLCADCv0qSzUgUEcwMEdQIDVLAdaqAAQAgAAVA4ADlQALAEwAWwBnAAAlMj4CNTEiDgIVATgBMRQWMzI2NyMHFBYzMjY1MSceATMyNjUxNCYnPgE1OAExNCYjIgYHPwE0JiMiBhUxFy4BIyIGFTEUFhcOARUlMhYVFAYjMSImNTQ2MzEBFB4CMzE0LgIjAgBQi2k8UItpPP7vPi0RHw0BAT8sLD8BDR4RLT4iGxsiPi0RHw0BAT8sLD8BDR4RLT4iGxsiAREsPz8sLD8/LP6APGmLUDxpi1AVPWiMTzxojFAB9i0+CgkILT4+LQgJCj4tIDMNDDQgLD4KCQEILD4+LAgJCT4sIDQMDTMgyj4sLT4+LSw+/sBPjGg9UIxoPAAAAAADAKsAQANrA0AAMgA2AEMAAAExJwcXDgEVFBYzMTI2NxEUBiMiJj0BNCYrARE0JiMhIgYVESERMxUUFjMyNjUxETQmJwUhNSEFIiY1NDYzMhYVFAYjA0yfLVoeJz8sDBUKGRISGTIjKzIj/wAjMgGqQD8sLD8RDv60/wABAAEAEhkZEhIZGRICjJ8uWgs2Iiw/BQT+zRIZGRLAIzIBKyMyMiP9VQFA1S0+Pi0BlRYnD3fW1hkSEhkZEhIZAAMAKwAVA4ADawAMAC0AOQAAJSIGFRQWMzI2NTQmIwEVMxMHDgEVFBYzITUhIiY1PwEhMjY3Ez4BNTQmIyEnIwEiBhUUFjMyNjU0JgErJDExJCMyMiP/AFWaOgUGMiQCAP4SBQYBJwE9GCgLmQIDGRL9iSiLAqojMjIjJDIywDIjJDIyJCMyAqtW/rxoCRULIzJVBgUFRRgUARUFCgYRGVb9VTIjJDIyJCMyAAACAIAAQAOAA0AAEAAcAAABISIGFREUFjMhMjY1ETQmIwMjFSM1IzUzNTMVMwMr/aojMjIjAlYjMjIjK6uqq6uqqwNAMiP9qiMyMiMCViMy/iurq6qrqwAABQCrABUDVQNrAA8AIAAtADoATgAAJR4BMzI2NzE+ATU0JicxBwElIgYVERQWMyEyNjURNCYjBTIWFRQGIyImNTQ2MyMyFhUUBiMiJjU0NjMTIi4CNTQ+AjMyHgIVFA4CAYcXPyMjPxcXGxsX8gF5/gAkMTEkAgAkMTEk/qsRGRkREhkZEoARGRkREhkZEtU1XUYoKEZdNTVdRigoRl3yFxsbFxc+JCM+F/ECeAEyJP1WJDIyJAKqJDFVGRESGRkSERkZERIZGRIRGf1WKEVeNTVdRSkpRV01NV5FKAAAAAACAID//gOAA2sAFgAiAAABLgMjETIeAhc+AzMRIg4CBzUyNjU0JiMiBhUUFgIAJldiaTg4aWJXJiZXYmk4OGliVyY1S0s1NUtLAdMjOScV/ioVJzgjIzgnFQHWFSc5I5hLNTVLSzU1SwAAAAADAIAAFQOAA5UAGwAiADQAAAEjNC4CIyIOAhUjIgYVERQWMyEyNjURNCYjJTIWFSE0NhMiLgI1MxQWMzI2NTMUDgIDK1YhOk4sLE46IVYjMjIjAlYjMjIj/tU1S/8ASzUsTjohVUs1NUtVITpOAsAsTjohITpOLDIj/gAkMjIkAgAjMoBLNTVL/lUiOk4sNUtLNSxOOiIAAAcAqwBAA1UDQAAUABkAHgAjACcAKwAvAAABFSM1IRUjNSMRMzUzFSE1MxUzESMBIzUzFTUjNTMVNSM1MxUBIzUzNSM1MzUjNTMDAFX+qlVVVVUBVlVVVf5VVVVVVVVVAatVVVVVVVUDQFVVVVX9AFVVVVUDAP2rVVWqVlarVVX+q1VVVlVVAAACAFUAFQOrA2sAGgAnAAAJAS4BIyEiBhURFBYXAR4BMzI2NwE+ATU0JiclIiY1NDYzMhYVFAYjA5H+gAsfEv7WJDIODAGACx8SER8MASoMDg4M/VobJSUbGiYmGgHSAYALDjIk/tYSHwz+gAsODgwBKgwfERIfDMMmGhslJRsaJgAAAAACAQAAQAMrA0AADgAYAAABIREzETMyPgI1NC4CAyM1MzIWFRQGIwIr/tWrgDVdRSkpRV0tiIgjMzMjA0D9AAEAKEZdNTVdRij+q6oyIyMyAAIAgABAA4ADlQAOABoAAAEjNycHIRUTAxUhNQMTNQMjFSM1IzUzNTMVMwOAcTFkP/3jVVUDAFVV1YBWgIBWgALrhiSqVv8A/wBVVQEAAQBW/oCAgFWAgAABAIAAQAOAA0AAJgAAAR4DFzc+ARceATMyFh0BFAYjIiQmAjU0NjsBMhYVFBYXFgYPAQEaFzxHUi5dCRgLJE0nEhkZEpb++MVyGRKVEhkMDAQGCV4B9C5RSDsYXgkFAwwNGRGVEhlyxQEIlhIZGRIoTCQLGAldAAADAIAAFQOAA2sACwAYACQAAAEiDgIHCQEuAwU0NjMyFhUUBiMiJjUTIiY1NDYzMhYVFAYCADlsYVYkAYABgCRWYWz+8jIjIzIyIyMy1SMyMiMjMjIDaxgsQCf9VQKrJz8tGNYkMjIkIzIyI/6rMiMkMjIkIzIAAAACAFUAawOrAxUAHQAoAAABNDYzNTQmIyEiBh0BMhYVFAYjFRQWMyEyNj0BIiYHJwc3Jz8BHwEHFwNVMiQyJP1WJDEjMjIkMiQCqiQyJDK8mZkujLVCQrWNLwHAIzKrIzIyI6syIyMyqyMyMiOrMqpiYrBzCqmpC3KwAAAAAgBVAGsDqwMVABAAFgAAASEiBhUDFBYzITI2NRE0JiMVBSU1BSUDVf1WJDEBMiQCqiQyMiT+q/6rAVUBVQMVMiP+ACMyMiMCACMyqtbWVdXVAAAABABVAEADqwNAAA4AEgAeACIAAAEhIgYVETMVITUzETQmIwMhNSE3IiY1NDYzMhYVFAYDIRUhAyv9qjVLqwIAq0s1gP6qAVaAEhkZEhEZGTz+AAIAAmtLNf8Aq6sBADVL/irWVRkSERkZERIZAYCrAAIAdQA0A34DKwAKAB4AAAE3AQ4BFRQWFzEXJRY2Nz4BJyYGBw4BFwEXCQE3ATcBWnj+1RcbGxezASExfTM9FC8umT4zHhb+YDwBJgEmPP7aPwGHeQErGD4jIz8Xsk0XHzM9mS8vFD4yfTH+XzwBJf7bPAElPwAAAAMAVQBrA6sDawANACIANgAAARQWMzI2NTE0JiMiBhUTByMiBhURFBYzITI2NRE0JisBJyETIi4CNTQ+AjMyHgIVFA4CAXdQOTlQUDk5UAlOhyQyMiQCqiQyMiSHTv8AgCxOOiEhOk4sLE46ISE6TgHAOVBQOTlQUDkBq1YyI/4AIzIyIwIAIzJW/YAhOk4sLE46ISE6TiwsTjohAAQAKwBrA9UDFQAYACQAKQA1AAABIzUhIgYVETMUFjMyNjUhFBYzMjY1MzUnASImNTQ2MzIWFRQGARcjNTMDIiY1NDYzMhYVFAYDVYD9qyMyVUs1NUsBAEs1NUtVgP2rGyUlGxslJQIlVL9rQBslJRsbJSUCa6oyI/4rNUtLNTVLSzXVq/5AJRsaJiYaGyUBgGtr/oAlGxomJhobJQAAAAAEAIAAQAOAA0AAIAAsADgAPQAAAS4BKwE1IRUjIgYHAxEUFjsBMjY9ASEVFBY7ATI2NREDASImNTQ2MzIWFRQGISImNTQ2MzIWFRQGJTchFyEDJwYhFWv/AGsVIQZZGRIqEhkCABkSKhIZWf3uGiYmGhslJQG7GyUlGxomJv3QQAHWQP2qAsASGVVVGRL/AP6rEhkZEioqEhkZEgFVAQD+VSYaGyUlGxomJhobJSUbGibWwMAAAAAAAwCA/+sDgANrABQAIAAtAAABISIGFREUFjMxMxc3MzI2NRE0JiMFMhYVFAYjIiY1NDYBITU0PgIzMh4CFQMr/aojMjIjq4CAqyMyMiP+1TBDQzAwQ0MBMP4AOFBYICBYUDgDazIk/asjMoCAMiMCVSQyjUQvMEREMC9E/jcnIDEiEREiMSAAAAMAK//rA9UDlQAMADEARgAAASIGFRQWMzI2NTQmIwUuAycjNSMVDgMHFSMVMx4DFzMVMzU+Azc1MzUjASIuAjU0PgIzMh4CFRQOAiMCAEdkZEdHZGRHAX0HOll0QwFWQ3RaOgdYWAc6WXRDAVZDdFo6B1hY/oM+bVEvL1FtPj5tUS8vUW0+AmtkR0dkZEdHZIBDdFo6B1hYBzpZdEMBVkN0WjoHWFgHOll0QwFW/qovUW0+Pm1RLy9RbT4+bVEvAAEAwABAA0ADawAFAAAJARclBTcCAP7AHgEiASIeA2v88x6AgB4AAAADANUAFQMrA2sAEwAhACYAAAE0LgIjIg4CFRQeAjEwPgIlNDYzMhYVFAYjIiY1MQMVITUhAwAoRl01NV1GKFBgUFBgUP6rMiMjMjIjIzLWAlb9qgJrNV1FKSlFXTVIpYxdXYylSCMyMiMkMjIk/gBWVgAAAAIA1QAVAysDawAUACMAAAEiDgIVFB4CMTA+AjU0LgIjESImNTQ2MzEyFhUUBiMxAgA+bVEvXnBdXXBeL1FtPiw/PywsPz8sA2svUW0+VMKmb2+mwlQ+bVEv/mo/LCw/PywsPwADAFUAFQOrA2sADgAaAB4AAAEhIgYVAzchMjY1ETQmIwE1ATYyHwEWFAcBIykBNzMDVf1WJDEBqwJVJDIyJP2rASYGEQdLBwf+2mkCAP7AVesDazIk/QCrMiMCACQy/gBpASYGBkwGEgb+21UAAAAAAgB1ADQDfgMrAAoAHgAAATcBDgEVFBYXMRclFjY3PgEnJgYHDgEXARcJATcBNwFaeP7VFxsbF7MBITF9Mz0ULy6ZPjMeFv5gPAEmASY8/to/AYd5ASsYPiMjPxeyTRcfMz2ZLy8UPjJ9Mf5fPAEl/ts8ASU/AAAABACAAEADgANAAA8AFQAiACgAAAEhIgYVERQWMyEyNjURNCYFMxQGIzURNTI+AjUzFA4CIxE3FzcTIQMr/aojMjIjAlYjMjL9h4BLNSxOOiJVL1FtPpZqlsD9qgNAMiP9qiMyMiMCViMyVTVLgP7VVSI6Tiw+bVEv/wDAgMD/AAADAIAAawOAAxUAAwASABYAAAEhFSETNSchBxUzESERMxEzETMFITUhA1X9VgKqKyv9VisrAaqrVSv+gP8AAQADFVX+q1XV1VX/AAEA/wABAKurAAABACsAwAPVAsAACwAAAQcXBy4DMQEhAQJVoHpEG0M7J/8AA6r+gALA1aI0JFlONf6rAgAABACrAEADVQNAAC4AQwBYAGYAAAEjNT4BNSM1NCYjISIGHQEjFBYXFSMUFhcVIxQWFxUUFjMhMjY9AT4BNSM1PgE1ATAiIyImNTQ2MzoBOQEeARUUBgcxNTAiIyImNTQ2MzoBOQEeARUUBiMxNSImNTE0NjMyFhUUBiMDVYA3SYAZEf6qERmASTeASTeASTcZEQFWERk3SYA3Sf6rAQEjMjIjAQEjMDAjAQEjMjIjAQEjMDAjIzIxJCMyMiMCFTEOWzwqEhkZEio8Ww4xO1sOMTxaDzASGRkSMA9aPDEOWzv+gDIkIzIBMiIjMgHWMiMjMgExIyMy1TIjJDIyJCMyAAMAIAFgA+ACIAAUAC4AQQAAEy4BIzEiBhUUFjMxMjY3PgE1NCYnIS4BIzEiBgcOARUUFhceATMyNjc+ATU0JiclIgYHDgEVFBYXHgEzMjY1NCYjsAoZDSg4OCgNGAsVGxsVAYAKGQ0NGAsVGxsVCxgNDRgLFRsbFQFQDRgLFRsbFQsYDSg4OCgCEwYHOCgoOAcGDSsbGysNBgcHBg0rGxsrDQYHBwYNKxsbKw0NBwYNKxsbKw0GBzgoKDgABgB6ACAEnQNgABEAHgAwAD0ATwBcAAATITIWHQEUBiMhIiY9ATQ2MzEFMjY1NCYjIgYVFBYzBSEyFh0BFAYjISImPQE0NjMxBTI2NTQmIyIGFRQWMwUhMhYdARQGIyEiJj0BNDYzMQUyNjU0JiMiBhUUFjPGA4sgLCwg/HUgLCwgAvQfLS0fHywsH/0MA4sgLCwg/HUgLCwgAvQfLS0fHywsH/0MA4sgLCwg/HUgLCwgAvQfLS0fHywsHwNgLCBLICwsIEsgLL0sIB8sLB8gLHIsH0wfLCwfTB8svS0fHy0tHx8tcSwgSyAsLCBLICy9LB8gLCwgHywAAAAAAQAAAAPMzY3GauVfDzz1AAsEAAAAAADVnL6cAAAAANWcvpz////ABYgDwAAAAAgAAgAAAAAAAAABAAADwP/AAAAFmv////wFiAABAAAAAAAAAAAAAAAAAAAAkAQAAAAAAAAAAAAAAAIAAAAEAACGBAAAiQQAAM0D/gBqA/4AbAP+AEAEAACIBAAAgAP+AIUEAABuBAIAPQQAALADtQDPBAAAfwQAAIUEAACaA/4BfwP+AGQEAgCUBAAAiAQAAGsEAABAA7UAuAQAALsEAACKA/4AgAO1AMwD/gDRA/4AqwQAAIAEAACcBAAAgAQAAIkEAADNBAAAgAQAAVMEAACJBAAAgAQAAIAEAAEgBAAA3gUy//8FXQABBYgAAAQAADMEAAAzBAIAjQQAAE0EAAEgBAABIAQAAUAEAAFABAAAgAQAAG8EAAAABAAAAAU4AAADQACGBAAAoAQAAJQEAAAABSUApQU7ANEEzQCaBAAAoAQAATUEAABABAAAgAQAAEQEAACJBAAARATaAHgEAAB/BAAAQAQAAEADqwA7BAAAQAQAAIUEAABABAAAQAQAAHgEzQDABZoAhgNiAFAEiQAABAAAAASAAAADxwANBAAAgAQAAFYEAAAABAAAqwQAAIAEAABVBAAAqwQAAKsEAAEABAAAVQQAACsEAABVBAAAVQQAAFUEAACABAAAVQQAAIAEAABVBAAAgAQAAIAEAACrBAAAKwQAAIAEAACrBAAAgAQAAIAEAACrBAAAVQQAAQAEAACABAAAgAQAAIAEAABVBAAAVQQAAFUEAAB1BAAAVQQAACsEAACABAAAgAQAACsEAADABAAA1QQAANUEAABVBAAAdQQAAIAEAACABAAAKwQAAKsEAAAgBRcAegAAAAAACgAUAB4AUgEAATIBUAF4AaYByAJYApIDCANSA5gDrAQKBCgEcAR8BJYExAT2BT4FiAWaBfYGKgZUBmwGhgacBwIH2gfwCBIITAhmCHQIzAjiCRQJIglUCagJ5gomCkYKXgqGCrgK1grwCwILFAtUC2oLlgvCDSQNVg14DaQN8A4cDmoOnA6+DtgPAA9CD7YQeBC8EPARQBGUEfQSKhLCEyYTrhSeFMoU4BUSFZwVzBYQFlQWjha+Fv4XjBfqGEIYuBj2GUoZhhmsGdoaABpKGogaqhrYG1objhvCHEgcphz8HSgdmB3OHhoeXh6gHsge9B8wH2wfqh/UIAwgSCCWIOYhQiGGIeYh+iI0ImYiniLaIxojRCNeI94kPCS6AAAAAQAAAJAA9gARAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAAcAsQABAAAAAAADABAAUQABAAAAAAAEABAAxgABAAAAAAAFAAsAMAABAAAAAAAGABAAgQABAAAAAAAKABoA9gADAAEECQABACAAEAADAAEECQACAA4AuAADAAEECQADACAAYQADAAEECQAEACAA1gADAAEECQAFABYAOwADAAEECQAGACAAkQADAAEECQAKADQBEHN1cGVybWFwb2wtaWNvbnMAcwB1AHAAZQByAG0AYQBwAG8AbAAtAGkAYwBvAG4Ac1ZlcnNpb24gMy44AFYAZQByAHMAaQBvAG4AIAAzAC4AOHN1cGVybWFwb2wtaWNvbnMAcwB1AHAAZQByAG0AYQBwAG8AbAAtAGkAYwBvAG4Ac3N1cGVybWFwb2wtaWNvbnMAcwB1AHAAZQByAG0AYQBwAG8AbAAtAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcnN1cGVybWFwb2wtaWNvbnMAcwB1AHAAZQByAG0AYQBwAG8AbAAtAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('woff'),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+Cjxqc29uPgo8IVtDREFUQVsKewoJImZvbnRGYW1pbHkiOiAic3VwZXJtYXBvbC1pY29ucyIsCgkibWFqb3JWZXJzaW9uIjogMywKCSJtaW5vclZlcnNpb24iOiA4LAoJInZlcnNpb24iOiAiVmVyc2lvbiAzLjgiLAoJImZvbnRJZCI6ICJzdXBlcm1hcG9sLWljb25zIiwKCSJwc05hbWUiOiAic3VwZXJtYXBvbC1pY29ucyIsCgkic3ViRmFtaWx5IjogIlJlZ3VsYXIiLAoJImZ1bGxOYW1lIjogInN1cGVybWFwb2wtaWNvbnMiLAoJImRlc2NyaXB0aW9uIjogIkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uIgp9Cl1dPgo8L2pzb24+CjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0ic3VwZXJtYXBvbC1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiPgo8Zm9udC1mYWNlIHVuaXRzLXBlci1lbT0iMTAyNCIgYXNjZW50PSI5NjAiIGRlc2NlbnQ9Ii02NCIgLz4KPG1pc3NpbmctZ2x5cGggaG9yaXotYWR2LXg9IjEwMjQiIC8+CjxnbHlwaCB1bmljb2RlPSImI3gyMDsiIGhvcml6LWFkdi14PSI1MTIiIGQ9IiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MDA7IiBnbHlwaC1uYW1lPSJzYXZlIiBkYXRhLXRhZ3M9IuS/neWtmCIgZD0iTTcxOC4xNzEgODE5LjIwNGgtNTAwLjEyYy00Ni4zNzggMC04My45OC0zNi45NDUtODMuOTgtODIuNDk1di01NzcuNDYyYzAtNDUuNTUgMzcuNjAxLTgyLjQ5NSA4My45OC04Mi40OTVoNTg3Ljg1NWM0Ni40MjIgMCA4My45OCAzNi45NDUgODMuOTggODIuNDk1djQ5MS4yNTVsLTE3MS43MTQgMTY4LjcwMnpNNTExLjQzMiAxNTYuMTAzYy02OS41NjggMC0xMjUuOTkxIDU1LjQxOS0xMjUuOTkxIDEyMy43NjMgMCA2OC4zMDEgNTYuNDIyIDEyMy43MiAxMjUuOTkxIDEyMy43MnMxMjUuOTkxLTU1LjQxOSAxMjUuOTkxLTEyMy43MmMwLTY4LjM0Ni01Ni40MjItMTIzLjc2My0xMjUuOTkxLTEyMy43NjN6TTYzNy44NiA1NjkuMjc0aC00MTkuODk3djE2NC45OWg0MTkuODk3di0xNjQuOTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwMTsiIGdseXBoLW5hbWU9ImJhc2VsYXllciIgZGF0YS10YWdzPSLlupXlm74iIGQ9Ik01MTEuOTMyIDgyMy40NjdjLTIwNi45ODUgMC0zNzUuMzk4LTE2OC40MTQtMzc1LjM5OC0zNzUuNDY3czE2OC40MTQtMzc1LjQ2NyAzNzUuMzk4LTM3NS40NjdjMjA3LjEyMSAwIDM3NS41MzUgMTY4LjQxNCAzNzUuNTM1IDM3NS40NjdzLTE2OC40MTQgMzc1LjQ2Ny0zNzUuNTM1IDM3NS40Njd6TTMyMC45OSAyODQuMDkyYzAgMTEuNjA1LTExLjE5NiA1MS44ODMtMTEuMTk2IDg2LjM1NyAwIDM0LjU0My01MS4yIDMzLjkyOS01MS4yIDc5Ljg3MiAwIDQxLjM3IDI3Ljc4NSA2MS45MTggMjEuNTA0IDgxLjcxNS02LjA3NiAxOS43OTctNTQuOTU1IDIwLjQ4LTc1LjI5OCAyMi45MzggMzUuNTY3IDEwNS44MTMgMTE5LjI2MiAxODQuMjUyIDIyMC4xNiAyMDAuMjI2LTYuNjIyLTE0Ljc0Ni0yNC4wOTgtMjAuNzUzLTM0LjY3OS0zMS44MTItMjMuMDc0LTI0LjAzMC0zMy4wNDEtMjAuNjg1LTQ1LjUzNC00My43NTktMTIuNDkzLTIyLjkzOC01Mi45MDctNTYuMTE1LTUyLjkwNy03Mi43MDQgMC0xNi42NTcgMjAuNDEyLTM2LjI1IDMwLjU4My0zMi40OTUgMTAuMTcyIDMuODkxIDM3LjEzNyAzLjY4NiA1Mi45NzUtMi42NjIgMTUuODM4LTYuNDE3IDEzMi4zMDEtMTIuODM0IDk1LjIzMi0xMjUuNTQyLTExLjc0Mi0zNS45MDgtNjMuMzUxLTI5LjkwMS03Ny4wMDUtODkuMjI1LTIuMDQ4LTguNzM4LTkuMTQ4LTQ1Ljg3NS05LjY5NC01OC4wOTUtMC44MTktMTguODQyIDExLjYwNS04OS44MzktNC4yMzMtODkuODM5LTE1LjkwNiAwLTU4LjcwOSA2My40ODgtNTguNzA5IDc1LjAyNXYwek01MDguNzIzIDE0MC44Yy0zNC42NzkgMC02Ny45MjUgNC44NDctOTkuMTIzIDEzLjc5IDE4LjkxIDguNjAyIDIwLjgyMSAxOS42NjEgMzcuOTU2IDIwLjM0MyAxOS43MjkgMC42ODMgMzUuNzAzIDYuNDg1IDU3Ljc1NCAxMC43MTggMTkuNzI5IDMuNjE4IDU0Ljg4NiAyMC44MjEgODUuODc5IDIzLjAwNiAyNi4wNzggMS43NzUgNzcuNTUxLTEuMjI5IDkxLjQ3Ny0yMi44MDEtNDkuOTcxLTI4LjUzNS0xMDkuNzA1LTQ1LjA1Ni0xNzMuOTQzLTQ1LjA1NnYwek03NjAuNTU5IDI3Ny4zMzNjLTEwLjM3NyA4LjgwNi0yMS4zNjcgMzIuNDk1LTEwLjk5MSA1Ny4xMzkgMTAuNDQ1IDI0Ljc4MSAxMy4xNzUgODIuMDU3IDEwLjg1NCAxMDQuMzExLTIuMzIxIDIyLjMyMy0xMy4wMzkgNzUuOTgxLTQyLjA1MiA3Ni41MjctMjkuMDEzIDAuNDEtNDguODc5IDEwLjg1NC02Ni4wODIgNDguMTI4LTM1LjcwMyA3Ny41NTEgNjcuMTA2IDkyLjUwMSAzMS4zMzQgMTM1LjQ0MS0xMC4wMzUgMTIuMDE1LTYxLjY0NS00OS42My02OS4xNTQgMzIuNTYzLTAuNTQ2IDUuODAzIDQuNjQyIDE0LjYwOSAxMS41MzcgMjMuNzU3IDExMi4xNjItNDAuODkyIDE5My4xOTUtMTU1Ljg1MyAxOTMuMTk1LTI5MS4wODkgMC03MC4xNzgtMjEuOTE0LTEzNC45NjMtNTguNTczLTE4Ni43NzhoLTAuMDY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MDI7IiBnbHlwaC1uYW1lPSJtYXJrZXIiIGRhdGEtdGFncz0i54K5IiBkPSJNNTEyIDg5MS43MzNjLTE2OS42NDMgMC0zMDcuMi0xNDkuMDI2LTMwNy4yLTMxNi45NjIgMC0xOTkuNjEyIDMwNy4yLTU3MC41MDUgMzA3LjItNTcwLjUwNXMzMDcuMiAzNzAuODkzIDMwNy4yIDU3MC41MDVjMCAxNjcuOTM2LTEzNy41NTcgMzE2Ljk2Mi0zMDcuMiAzMTYuOTYyek02ODIuNjY3IDU4NC41MzNjMC05NC4yMDgtNzYuMzktMTcwLjY2Ny0xNzAuNjY3LTE3MC42NjdzLTE3MC42NjcgNzYuNDU5LTE3MC42NjcgMTcwLjY2N2MwIDk0LjI3NiA3Ni4zOSAxNzAuNjY3IDE3MC42NjcgMTcwLjY2N3MxNzAuNjY3LTc2LjM5IDE3MC42NjctMTcwLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTAzOyIgZ2x5cGgtbmFtZT0idW5jaGVjayIgZGF0YS10YWdzPSLlpJrpgIlf5pyq6YCJ5LitIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc5OS42NjggODUyLjUzM2gtNTc3Ljc4OGMtNjMuODk4IDAtMTE1LjU4OC01MS43OTItMTE1LjU4OC0xMTUuNTg4di01NzcuODM5YzAtNjMuNzk2IDUxLjY5LTExNS41ODggMTE1LjU4OC0xMTUuNTg4aDU3Ny44MzljNjMuNzk2IDAgMTE1LjU4OCA1MS43OTIgMTE1LjU4OCAxMTUuNTg4djU3Ny44MzljLTAuMDUxIDYzLjc5Ni01MS44NDQgMTE1LjU4OC0xMTUuNjM5IDExNS41ODh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNDsiIGdseXBoLW5hbWU9ImNoZWNrZWQiIGRhdGEtdGFncz0i5aSa6YCJX+mAieS4rSIgaG9yaXotYWR2LXg9IjEwMjIiIGQ9Ik04MDEuMzU0IDg1Mi41MzNoLTU3Ny43ODhjLTYzLjg5OCAwLTExNS41ODgtNTEuNzkyLTExNS41ODgtMTE1LjU4OHYtNTc3LjgzOWMwLTYzLjc5NiA1MS42OS0xMTUuNTg4IDExNS41ODgtMTE1LjU4OGg1NzcuODM5YzYzLjc5NiAwIDExNS41ODggNTEuNzkyIDExNS41ODggMTE1LjU4OHY1NzcuODM5Yy0wLjA1MSA2My43OTYtNTEuODQ0IDExNS41ODgtMTE1LjYzOSAxMTUuNTg4ek00NjEuMjI5IDI1MC44OTJsLTIzNi42OTMgMjM2Ljc0NCA1NS42MjMgNTUuNjc0IDE4MS4xMjEtMTQ3LjE1NCAyODAuMjExIDI1Mi45MzUgNTguOTQzLTU4Ljk0My0zMzkuMjA1LTMzOS4yNTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNTsiIGdseXBoLW5hbWU9Inpvb20taW4iIGRhdGEtdGFncz0i5pS+5aSnIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc4Ny40NiA1MzAuNzQ1aC0yMzAuMzA4djIyNS43MTFjMCA1My4yNzQtMzYuOTggOTYuNDM0LTgyLjM4OCA5Ni40MzQtNDUuNTYxIDAtODIuNDM5LTQzLjE2LTgyLjQzOS05Ni40MzR2LTIyNS43MTFoLTIzMC4zMDhjLTU0LjA0MCAwLTk3LjcxMS0zNy4wODItOTcuNzExLTgyLjY5NCAwLTQ1Ljc2NSA0My42NzEtODIuNzQ1IDk3LjcxMS04Mi43NDVoMjMwLjMwOHYtMjI1LjY2YzAtNTMuMjc0IDM2LjkyOS05Ni40ODUgODIuNDM5LTk2LjQ4NSA0NS40NTkgMCA4Mi4zODggNDMuMjExIDgyLjM4OCA5Ni40ODV2MjI1LjY2aDIzMC4zMDhjNTMuOTg5IDAgOTcuNjYgMzcuMDMxIDk3LjY2IDgyLjc0NSAwIDQ1LjYxMi00My42NzEgODIuNjk0LTk3LjY2IDgyLjY5NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA2OyIgZ2x5cGgtbmFtZT0iY2xlYXIiIGRhdGEtdGFncz0i5YWz6ZetIiBkPSJNODg3LjgxNCA3MzguMDM1bC04My40NjcgODMuNTE0LTI5Mi4zLTI5Mi4zOTQtMjkyLjMgMjkyLjM5NC04My41MTQtODMuNTE0IDI5Mi4zLTI5Mi4zNDctMjkyLjMtMjkyLjM5NCA4My41MTQtODMuNTE0IDI5Mi4zIDI5Mi40NDIgMjkyLjMtMjkyLjQ0MiA4My40NjcgODMuNTE0LTI5Mi4zIDI5Mi4zOTR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwNzsiIGdseXBoLW5hbWU9InNldHRpbmciIGRhdGEtdGFncz0i566h55CGIiBkPSJNNTEyIDUyMi4zMDNjLTQwLjcyMiAwLTczLjgwNi0zMi45NjktNzMuODA2LTczLjY5IDAtNDAuNjQ1IDMzLjA4Mi03My42OSA3My44MDYtNzMuNjkgNDAuNzk4IDAgNzMuODQ1IDMzLjA0NiA3My44NDUgNzMuNjkgMCA0MC42ODQtMzMuMDQ2IDczLjY5LTczLjg0NSA3My42OXpNODk1LjkxOCA0MDQuMzYydjg4LjQ2N2gtNTYuOTE4Yy0zLjg3NSAyOC4xNzItMTEuMDU0IDU1LjMwNy0yMS42MDkgODAuNjc0bDQ5LjIwMiAyOC40LTQ0LjIxNCA3Ni42MDctNTAuMjQxLTI4Ljg2MmMtMTcuMTk0IDIxLjY0NS0zNy4xNTMgNDAuOTktNTkuMjk2IDU3LjY0NmwyOS40MzggNTEuMDQ0LTc2LjY4MyA0NC4yMTQtMzAuMDUyLTUyLjA4MmMtMjUuMDYyIDkuNzQ5LTUxLjYyIDE2LjU4LTc5LjE3OCAxOS44ODJ2NjEuNDQ3aC04OC41ODJ2LTYzLjEzNmMtMjYuOTgyLTQuMTg1LTUyLjg4OS0xMS4yNDYtNzcuMTgzLTIxLjU3bC0zMi4xMjQgNTUuNDYtNzYuNzIxLTQ0LjIxNCAzMi44NTQtNTYuODA0Yy0yMC41NzEtMTYuNTA0LTM4Ljk1Ni0zNS40NjUtNTQuOTk4LTU2LjM4MWwtNTcuODM4IDMzLjM1My00NC4yOS03Ni42MDcgNTguMzc1LTMzLjY1OGMtOS40NzgtMjMuOTEtMTYuMTU5LTQ5LjE2NC0xOS42OS03NS40MTZoLTY3Ljk3MXYtODguNDY3aDY3Ljk3MWMzLjUzLTI2LjI1MyAxMC4yMDktNTEuNTA2IDE5LjY5LTc1LjQxNmwtNTguMzc1LTMzLjY1OCA0NC4yOS03Ni41MjkgNTcuODc4IDMzLjM1M2MxNi4wNDItMjAuOTE2IDM0LjM4Ny0zOS44NzcgNTQuOTk4LTU2LjQ1N2wtMzIuODU0LTU2LjgwNCA3Ni42ODMtNDQuMjE0IDMyLjEyNCA1NS41MzVjMjQuMjk0LTEwLjM2NCA1MC4yMDItMTcuNDY0IDc3LjE4My0yMS42MDl2LTYzLjE3NWg4OC41ODJ2NjEuNDg2YzI3LjU5NyAzLjI5OSA1NC4xMTYgMTAuMTMzIDc5LjE3OCAxOS44ODJsMzAuMDUyLTUyLjA4MiA3Ni42ODMgNDQuMTc1LTI5LjQ3NyA1MS4wNDRjMjIuMTQ2IDE2LjY1NyA0Mi4xMDIgMzYuMDM5IDU5LjI5NiA1Ny43MjVsNTAuMjQxLTI4Ljg2MiA0NC4yMTQgNzYuNTI5LTQ5LjIwMiAyOC40YzEwLjU1NiAyNS40MDYgMTcuNzcgNTIuNTQxIDIxLjYwOSA4MC42NzRoNTYuOTU3ek01MTEuNzY5IDI1Ny4yODljLTEwNi4wMDYgMC0xOTEuOSA4NS43NDEtMTkxLjkgMTkxLjUxNiAwIDEwNS44NTQgODUuODk0IDE5MS42NjkgMTkxLjkgMTkxLjY2OXMxOTEuOTM5LTg1LjgxOSAxOTEuOTM5LTE5MS42NjljMC0xMDUuNzM2LTg1LjkzMy0xOTEuNTE2LTE5MS45MzktMTkxLjUxNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA4OyIgZ2x5cGgtbmFtZT0iem9vbS10byIgZGF0YS10YWdzPSLpnaIiIGhvcml6LWFkdi14PSIxMDIyIiBkPSJNODI1LjMyOSA4MjIuMDU0aC0yNTIuNzEydi02My4wMDJoMjUyLjcxMnYtMjUxLjNoNjMuMDAydjMxNC4zMDJ6TTgyNS4zMjkgMTI5Ljk3OGgtMjUyLjcxMnYtNjMuMDAyaDMxNS43MTR2MzE1LjcxNGgtNjMuMDAyek0xMzMuMjA2IDgyMi4wNTR2LTMxNC4zMDJoNjMuMDAydjI1MS4zaDI1MS4zdjYzLjAwMmgtMjUxLjN6TTE5Ni4yMDggMzgyLjY5MmgtNjMuMDAydi0zMTUuNzE0aDMxNC4zMDJ2NjMuMDAyaC0yNTEuM3pNNjk5LjEzOCA1MDcuNzUyaC0xMjYuNTIxdjEyMy4yNzJoLTEyNS4xMDl2LTEyMy4yNzJoLTEyNS4wNjJ2LTEyNS4wNjJoMTI1LjA2MnYtMTIyLjQ3MWgxMjUuMTA5djEyMi40NzFoMTI2LjUyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTA5OyIgZ2x5cGgtbmFtZT0iZGVmYXVsdC1sYXllciIgZGF0YS10YWdzPSLpu5jorqTlupXlm74iIGQ9Ik04NjkuNzA3IDc5NC41MzloLTUyOS42MTFjLTI0LjQ2NyAwLTQ0LjE5MS0xOS4yODQtNDQuMTkxLTQzLjAyN3YtMzI0LjQwM2MxMi4zMzQgMCAyNy4zNTggMCA0NC4xOTEgMHYyNTkuMjgyaDUyOS42MTF2LTM2NS41MDFoLTU1Ljc2MWM4LjM5Ny0xNy43NTYgMTMuNzM5LTMyLjc0MyAxMy43MzktMzIuNzQzLTMuMjUzLTMuNjk2LTYuNTg4LTYuODY5LTkuOTIyLTEwLjM2Nmg1MS45NDZjMjQuMjY1IDAgNDQuMDcwIDE5LjI4NCA0NC4wNzAgNDMuMTA2djQzMC42MjFjMCAyMy43NDMtMTkuNzY2IDQzLjAyNy00NC4wNzAgNDMuMDI3ek03NDkuNjI4IDMxMC4yODNjMCAwLTEyLjY5NSAxMS4wODgtMTkuMTIyIDEyLjQxMy02LjQ2NyAxLjQ0Ny02LjQ2NyAxLjQ0Ny05LjY4MSAwLjg0NC0xNi43OTQtMi45MzQtMzguMzY2LTM3LjMyMy03NC4wNDAtNjMuMDMyaC0xNzkuODk4Yy0xMS4yODggOS44ODMtMjEuMzczIDIwLjg5MS0yOS40ODcgMzMuNDYzaDk5LjU5MmMwIDAgMjguNDAyLTEuODQ4IDI4LjQwMiAyMC4zMjcgMCAyMi4yNTcgMCA1NS41NjEgMCA1NS41NjFzMS44MDggMjcuNzU5LTI4LjQwMiAyNy43NTljLTkuODgzIDAtNjQuNTYgMC0xMjMuNTM0IDBoLTIyLjgxOGMtMTkuMjg0IDAtMzguMjg1IDAtNTYuMDAzIDAtMTguODQxIDAtMzUuNzk0IDAtNDkuNjU0IDAtMjAuNzI5IDAtMzQuNDI4IDAtMzQuNDI4IDB2LTIzNi44NjVjMCAwIDE5My40NzYtNTkuMTc2IDI2MS42OTEtNTkuMTc2IDAgMCAxNTkuODUyLTYuNTg4IDI3My4zODMgMTEwLjQ3OSAzLjY5NiAzLjg1NiA3LjU1MyA3LjQ3IDExLjA4OCAxMS41NjkgMCAwLTUuOTA2IDE2Ljk1My0xNS40MjkgMzYuODQtOC4yNzYgMTcuMzk1LTE5LjI4NCAzNy4wODEtMzEuNjU4IDQ5LjgxNXpNMTEwLjI2MiAxMDEuNTgxaDk4LjYyN3YzMjUuNTI4aC05OC42Mjd2LTMyNS41Mjh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwYTsiIGdseXBoLW5hbWU9Imdyb3VwIiBkYXRhLXRhZ3M9Iue+pOe7hCIgaG9yaXotYWR2LXg9IjEwMjYiIGQ9Ik02NzguOTA5IDQ4OC43NTljNjguMzk3IDAgMTIzLjcxMiA1NC43MDIgMTIzLjcxMiAxMjIuMTQxIDAgNjcuNTE1LTU1LjI3OSAxMjIuMTc5LTEyMy43MTIgMTIyLjE3OS02OC4yNDMgMC0xMjMuNjM3LTU0LjY2NC0xMjMuNjM3LTEyMi4xNzkgMC02Ny40MzggNTUuMzk0LTEyMi4xNDEgMTIzLjYzNy0xMjIuMTQxek0zNDkuMTYxIDQ4OC43NTljNjguMzIgMCAxMjMuNzEyIDU0LjcwMiAxMjMuNzEyIDEyMi4xNDEgMCA2Ny41MTUtNTUuMzU0IDEyMi4xNzktMTIzLjcxMiAxMjIuMTc5LTY4LjI0MyAwLTEyMy43MTItNTQuNjY0LTEyMy43MTItMTIyLjE3OSAwLjAzOS02Ny40MzggNTUuNDY5LTEyMi4xNDEgMTIzLjcxMi0xMjIuMTQxek0zNDkuMTYxIDM5OS4zMDJjLTI0NS41ODQgMC0yODguNTg4LTEyNS42MzEtMjg4LjU4OC0xMjUuNjMxdi0xMTAuNzA5aDU3Ny4xMzZ2MTEwLjcwOWMwIDAtMzYuNTU3IDEyNS42MzEtMjg4LjU0OCAxMjUuNjMxek02NDIuODg5IDQwNy4zMTljLTEuOTU1IDAuMDM5LTMuODM1IDAuMDM5LTUuNzU0IDAuMDM5bDAuNjEzLTAuMDM5YzAgMCA2Ny44OTktNDcuODM2IDc3LjMzNS0xMTIuMDE0bDQuOTQ4LTEzMi4zNDNoMjQ3LjU0MnYxMTAuNzA5Yy0wLjAzOSAwLTE4LjI1OSAxMjMuNTk3LTMyNC42ODUgMTMzLjY0OXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTBiOyIgZ2x5cGgtbmFtZT0iZGVsZXRlIiBkYXRhLXRhZ3M9IuWIoOmZpCIgZD0iTTYwOC4xNSA3MzUuOTg2djQ4LjA5NGMwIDI2LjU0My0yMS41ODggNDguMDU1LTQ4LjA1NSA0OC4wNTVoLTk2LjE1Yy0yNi41NDMgMC00OC4wNTUtMjEuNTEyLTQ4LjA1NS00OC4wNTV2LTQ4LjA5NGgtMjQwLjM1NHYtNDguMDU1aDY3Mi45MjZ2NDguMDU1aC0yNDAuMzE1ek01NjAuMDk0IDczNS45ODZoLTk2LjE1djQ4LjA5NGg5Ni4xNXYtNDguMDk0ek0yMjMuNTkgNTkxLjc4MnYtNDMyLjU3NWMwLTUzLjEyNiA0My4wNjItOTYuMTUgOTYuMTUtOTYuMTVoMzg0LjUyYzUzLjEyNiAwIDk2LjE1IDQzLjAyNCA5Ni4xNSA5Ni4xNXY0ODAuNjY3aC01NzYuODE1di00OC4wOTR6TTYwOC4xNSAzNTEuNDY2djE5Mi4yNmg5Ni4xMXYtMzg0LjUyaC05Ni4xMXYxOTIuMjZ6TTQ2My45NDUgMzUxLjQ2NnYxOTIuMjZoOTYuMTV2LTM4NC41MmgtOTYuMTV2MTkyLjI2ek0zMTkuNzQgMzUxLjQ2NnYxOTIuMjZoOTYuMTV2LTM4NC41MmgtOTYuMTV2MTkyLjI2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MGM7IiBnbHlwaC1uYW1lPSJ1cCIgZGF0YS10YWdzPSLkuIrnp7siIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik00NzQuNjQ5IDgxNy4zNjFsLTI2Ny41MTgtMzU0LjY4NGgxMzguNDg3di0zOTEuMDQ3aDI1OC4wNjR2MzkxLjA0N2gxMzguNDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwZDsiIGdseXBoLW5hbWU9Indhcm5pbmciIGRhdGEtdGFncz0i6K6+572uIiBkPSJNNTA2LjIyOCA4MzIuNzU2Yy0yMTIuMTU1LTIuOTIzLTM4MS43NTQtMTc3LjE4LTM3OC45NDgtMzg5LjQ5IDIuODEtMjEyLjE1NSAxNzcuMTAzLTM4MS44MzMgMzg5LjE4MS0zNzkuMDYyIDIxMi4xMTggMi44NDkgMzgxLjc5NCAxNzcuMTggMzc4Ljk4NCAzODkuNDExLTIuODEgMjEyLjE1NS0xNzcuMTQgMzgxLjkxMS0zODkuMjE5IDM3OS4xNDF6TTU0OC43ODMgNzA0LjYzMmMzOS4wNTIgMCA1MC41OTYtMjIuNjI1IDUwLjU5Ni00OC41NTcgMC0zMi4zOTYtMjUuOTcyLTYyLjI5My03MC4xMDItNjIuMjkzLTM3LjAxNCAwLTU0LjU5NyAxOC42Mi01My41OTggNDkuMzY2IDAuMDM5IDI1LjkzMyAyMS43NCA2MS40ODUgNzMuMTA0IDYxLjQ4NXpNNDQ4LjcwOCAyMDguMzM1Yy0yNi43MDEgMC00Ni4zMjUgMTYuMTYtMjcuNjI2IDg3LjM3OWwzMC42NjYgMTI2LjMxN2M1LjI3IDIwLjIgNi4xNTYgMjguMzE5IDAgMjguMzE5LTguMDQxIDAtNDIuNjY5LTEzLjk2Ni02My4xNzgtMjcuNzQxbC0xMy4zMSAyMS45MzJjNjQuOTQ2IDU0LjI1MiAxMzkuNTkgODYuMDMxIDE3MS41NjQgODYuMDMxIDI2LjY2MyAwIDMxLjEyOC0zMS41NTEgMTcuNzczLTgwLjE4NmwtMzUuMDEyLTEzMi43NzljLTYuMjM0LTIzLjUwOC0zLjU3OC0zMS42MjYgMi42NTQtMzEuNjI2IDguMDQxIDAgMzQuMjQ0IDkuNzczIDYwLjAyMiAzMC4wNTBsMTUuMTIyLTIwLjI3N2MtNjMuMTM5LTYzLjEzOS0xMzEuOTcyLTg3LjQxOS0xNTguNjczLTg3LjQxOXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTBlOyIgZ2x5cGgtbmFtZT0icmV0cmFjdCIgZGF0YS10YWdzPSLmlLbotbfpnaLmnb8iIGQ9Ik0xNzcuOTY4IDEwMC4xOWg3MDUuNDAydjk0LjA1NGgtNzA1LjQwMnYtOTQuMDU0ek01MTYuNDY4IDY1NS4xNTNsMjg1Ljc4Mi0yODUuNzgyIDgzLjA5NiA4My4wOTYtMzY4Ljg3OCAzNjguOTI1LTM4My44OC0zODMuODggODMuMDk2LTgzLjE0NCAzMDAuNzgzIDMwMC43ODN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkwZjsiIGdseXBoLW5hbWU9InNlYXJjaCIgZGF0YS10YWdzPSLmkJzntKIiIGQ9Ik04NTIuNiAyMTEuMjc1bC0xMjYuNDkxIDEzMS4zMDhjMCAwLjA3OC0wLjA3OCAwLjA3OC0wLjA3OCAwLjA3OGwtMjAuMDM2IDIwLjc2OWMyNy44NTggNDcuMDQzIDQ0LjMwOCAxMDIuMDI2IDQ0LjMwOCAxNjEuMjgzIDAgMTcwLjk5NC0xMzMuNTA0IDMwOS41MDYtMjk4LjEzOSAzMDkuNTA2LTE2NC43MTIgMC0yOTguMjE2LTEzOC41NTEtMjk4LjIxNi0zMDkuNTA2czEzMy41MDQtMzA5LjU4NCAyOTguMjE2LTMwOS41ODRjNDIuMjI3IDAgODIuMDI5IDkuNzEgMTE4LjM2MiAyNi4yNzhsNjAuNDkyLTYyLjc2NWMwLjA3OC0wLjA3OCAwLjA3OC0wLjE1MyAwLjE1My0wLjE1M2wwLjc3Mi0wLjgwOSA5NC4xMjYtOTcuNjcyYzIzLjI3My0yNC4yMzUgNjEuMDI5LTI0LjIzNSA4NC4zNDEgMGw0Mi4xNTIgNDMuNzMyYzIzLjI3MyAyNC4xOTggMjMuMjczIDYzLjM0MSAwLjAzOSA4Ny41Mzh6TTQ1Mi4xNjMgMzM4LjkyNWMtOTguODY3IDAtMTc4Ljg5MSA4My4xNDYtMTc4Ljg5MSAxODUuNzg3IDAgMTAyLjU2NiA3OS45ODcgMTg1LjcxMiAxNzguODkxIDE4NS43MTIgOTguNzg5IDAgMTc4Ljg5MS04My4xNDYgMTc4Ljg5MS0xODUuNzEyIDAtMTAyLjY0MS04MC4wNjQtMTg1Ljc4Ny0xNzguODkxLTE4NS43ODd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxMDsiIGdseXBoLW5hbWU9InRyaWFuZ2xlLW9sZCIgZGF0YS10YWdzPSLlm77lsYLlvLnnqpfkuInop5IiIGhvcml6LWFkdi14PSIxMDIyIiBkPSJNMzgzLjEgMzIwLjI3NWgyNTUuNHYyNTUuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTExOyIgZ2x5cGgtbmFtZT0iem9vbS1vdXQiIGRhdGEtdGFncz0i57yp5bCPIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTgyMy40NjkgNTI5LjI2NGgtNjI1LjQ0NGMtNTMuOTM4IDAtOTcuNjYtMzYuNDY4LTk3LjY2LTgxLjI2NCAwLTQ0Ljk0OSA0My43MjItODEuMzY2IDk3LjY2LTgxLjM2Nmg2MjUuNDQ0YzUzLjk5IDAgOTcuNzYzIDM2LjQxNyA5Ny43NjMgODEuMzY2IDAgNDQuODQ2LTQzLjc3MyA4MS4yNjQtOTcuNzYzIDgxLjI2NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTEyOyIgZ2x5cGgtbmFtZT0ibGF5ZXJzIiBkYXRhLXRhZ3M9IuaJgOacieW6leWbviIgaG9yaXotYWR2LXg9IjEwMjYiIGQ9Ik04NzcuNzk1IDU4NS42MjJsLTM2NC45ODcgMjQ5LjgxMy0zNjQuOTA0LTI0OS44MTMgMzY0LjkwNC0yNDkuODEzIDM2NC45ODcgMjQ5LjgxM3pNNTEyLjgwOCAyODAuMDM5bC0zMjIuMDgwIDIxMi4zODgtNDIuNzg3LTQ0LjQwMyAzNjQuOTA0LTI0OS44MTMgMzY0Ljk4NyAyNDkuODEzLTQzLjM2NyA0NS4zNjUtMzIxLjY1Ni0yMTMuMzV6TTUxMi44MDggMTQyLjQzNGwtMzIyLjA4MCAyMTIuNDI0LTQyLjc4Ny00NC40ODIgMzY0LjkwNC0yNDkuODEzIDM2NC45ODcgMjQ5LjgxMy00My4zNjcgNDUuNDQ5LTMyMS42NTYtMjEzLjM4NnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTEzOyIgZ2x5cGgtbmFtZT0iYWRkLW9sZCIgZGF0YS10YWdzPSLmt7vliqDlm77lsYIiIGQ9Ik04NDkuMTMzIDUxMS40NjNoLTI3Mi4zMDF2MjcyLjI1NGMwIDM1LjgxMy0yOS4wMTggMzguODgtNjQuODMyIDM4Ljg4cy02NC44MzItMy4wNjctNjQuODMyLTM4Ljg4di0yNzIuMzAxaC0yNzIuMzAxYy0zNS44MTMgMC0zOC44OC0yOS4wMTgtMzguODgtNjQuODMyczMuMDY3LTY0LjgzMiAzOC44OC02NC44MzJoMjcyLjMwMXYtMjcyLjMwMWMwLTM1LjgxMyAyOS4wMTgtMzguODggNjQuODMyLTM4Ljg4czY0LjgzMiAzLjA2NyA2NC44MzIgMzguODh2MjcyLjMwMWgyNzIuMzAxYzM1LjgxMyAwIDM4Ljg4IDI5LjAxOCAzOC44OCA2NC44MzJzLTMuMTE0IDY0Ljg3OS0zOC44OCA2NC44Nzl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxNDsiIGdseXBoLW5hbWU9ImJydXNoIiBkYXRhLXRhZ3M9IuWbvuWxguagt+W8jyIgZD0iTTkxMC4xNzUgNzk3Ljk1MmMwIDAtMjEuMDU4IDEwLjU1LTE2MS40OC05Mi42ODQgMCAwLTE0My40ODgtMTE5LjgwMi0yNDMuMTY2LTIwMS45MzYtNDIuODAzIDkuNDE5LTYxLjYwMS0yMi4zNTQtNjEuNjAxLTIyLjM1NC0zOS40ODgtMzMuMjY1LTIzLjM2NC01NS4yNTctMzEuMTY1LTYxLjcxOS0yMS4yMjMtMTcuNTQ0LTM0LjM5Ny0yOC4zNzMtMzQuMzk3LTI4LjM3M2wxMzAuMTktMTMxLjg5MmMwIDAgNS45ODQgMTAuNzExIDI4LjI1NiAzNy44MzUgMzIuNDE2IDAuMTI0IDU5LjU3OSAyOC4yNTYgNTkuNTc5IDI4LjI1NnMyNC4wMDkgNDcuMjkgMTIuODkzIDYwLjE0NWM4Mi44NiAxMDEuMDA5IDE5MC45NDMgMjI5LjUwNiAxOTAuOTQzIDIyOS41MDYgNDQuMDE3IDU3LjAzMyAxMjEuMDE3IDE4Mi4wMTAgMTA5Ljk0MyAxODMuMjI0ek0yMzguNDc5IDIzMi4yODFjMC0xMjMuMTk5LTEzMS40ODktMTA2LjU4Ny0xMzEuNDg5LTEwNi41ODdzMjY2Ljc3LTE0OS4xOSAzODEuODAyIDExNS42NDJsLTEyMi40MzEgMTIxLjc4NmMwIDAtMTI3Ljg4OC03LjU2LTEyNy44ODgtMTMwLjgzOXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE1OyIgZ2x5cGgtbmFtZT0iZXllLWNsb3NlZCIgZGF0YS10YWdzPSLlt7LpmpDol49pY29uIiBkPSJNNjYyLjQ2NCA2NzMuODA0bDk0LjI3MiA5NC4yMDggOTAuNDk2LTkwLjQ5Ni01ODguMzUyLTU4OC4zNTItOTAuNDk2IDkwLjQ5NiA4Ny42MTYgODcuNjhjLTEyMC4zODQgNzMuNTM2LTE5MiAxNzQuNTI4LTE5MiAxNzQuNTI4czI0OC44MzIgMzY4LjA2NCA1OTguNDY0IDIzMS45MzZ6TTM0My44NzIgMzU1LjIxMmwyNjAuOTI4IDI2MC45MjhjLTI3LjUyIDE1LjE2OC01OS4xMzYgMjMuODcyLTkyLjggMjMuODcyLTEwNS45ODQgMC0xOTItODUuOTUyLTE5Mi0xOTIgMC0zMy42NjQgOC42NC02NS4zNDQgMjMuODcyLTkyLjh6TTgxNi43NjggNTgzLjA1MmM0Ni41OTItMzYuOCA5NC40NjQtODMuMzI4IDE0My4yMzItMTQxLjE4NC0xOTcuNzYtMjIzLjYxNi0zNzkuOTY4LTI2OS4zNzYtNTI3Ljc0NC0yNDMuMzI4bDU4LjYyNCA1OC42MjRjNi45MTItMC43NjggMTMuOTUyLTEuMTUyIDIxLjEyLTEuMTUyIDEwNS45ODQgMCAxOTIgODUuOTUyIDE5MiAxOTIgMCA3LjEwNC0wLjM4NCAxNC4yMDgtMS4xNTIgMjEuMTJsMTEzLjkyIDExMy45MnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE2OyIgZ2x5cGgtbmFtZT0iZG93biIgZGF0YS10YWdzPSLkuIvnp7siIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik00NzQuNzEzIDM5LjMzbC0yOTAuNDc3IDM4NS4xMjRoMTUwLjM3MnY0MjQuNjA3aDI4MC4yMTF2LTQyNC42MDdoMTUwLjMyMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTE3OyIgZ2x5cGgtbmFtZT0ibGluZSIgZGF0YS10YWdzPSLnur8iIGQ9Ik04MjQuOTc3IDgwMi40NjJjLTU3LjYgNTAuODI3LTE0NS41NTIgNDUuMzAxLTE5Ni4zNzktMTIuMjYtNDQuNTk5LTUwLjU5Mi00NS43NjctMTI0LjQ5Ny02LjQxOS0xNzYuMTgxbC0yNjEuNDEtMjk2LjI4MmMtNTYuMTk3IDMyLjU3NC0xMjkuMzI1IDIyLjE4NC0xNzQuMDAxLTI4LjM3MS01MC44MjctNTcuNjM4LTQ1LjMwMS0xNDUuNTEzIDEyLjMzOC0xOTYuNDE4IDU3LjYtNTAuODI3IDE0NS41NTItNDUuMzAxIDE5Ni4zNzkgMTIuMzM4IDQ0LjQ0NCA1MC40MDEgNDUuODA2IDEyMy45NTIgNi45MjYgMTc1LjYzNmwyNjEuNTY3IDI5Ni4zOThjNTYuMTE4LTMyLjEwOCAxMjguODk0LTIxLjU2MSAxNzMuMzQxIDI4LjggNTAuODI3IDU3LjYgNDUuMzAxIDE0NS41NTItMTIuMzM4IDE5Ni4zNHpNMzQ1LjAwNSAxODcuNjAxYy01LjA2MC0zMC4zMTctMzMuNzQyLTUwLjc0OS02NC4wNTktNDUuNjg5LTMwLjIzOCA1LjA5OS01MC43ODggMzMuNzgyLTQ1LjY1IDY0LjA5OCA1LjA2MCAzMC4yNzggMzMuNzQyIDUwLjc4OCA2NC4wNTkgNDUuNjUgMzAuMzE3LTUuMDYwIDUwLjc4OC0zMy43NDIgNDUuNjUtNjQuMDU5ek03ODcuODEgNjg4LjI3NmMtNS4wNjAtMzAuMzE3LTMzLjc0Mi01MC43ODgtNjQuMDU5LTQ1LjcyOC0zMC4zMTcgNS4xMzgtNTAuNzg4IDMzLjgyMS00NS43MjggNjQuMTM4IDUuMTM4IDMwLjIzOCAzMy44MjEgNTAuNzg4IDY0LjEzOCA0NS42NSAzMC4yMzgtNS4wNjAgNTAuNzQ5LTMzLjc0MiA0NS42NS02NC4wNTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxODsiIGdseXBoLW5hbWU9InBlbiIgZGF0YS10YWdzPSLkv67mlLnmoLflvI8iIGQ9Ik0xMzcuNjA2IDc0LjM3bDE5Mi40NjkgNzEuNjU1LTExOS4zNjIgMTE5LjM2Mi03My4xMDctMTkxLjAxOHpNODcyLjM3NyA3MDYuMzU3bC0xMDEuMjIgMTAxLjMzNGMtMTguNjM5IDE4LjYwMi00OC45MjggMTguNjAyLTY3LjYwOCAwbC00MDUuMjU4LTQwNS4yMjFjLTE4LjYzOS0xOC42MzktNzYuMzE0LTgyLjY1Ny01Ny42NzYtMTAxLjI1N2wxMjUuMTY2LTEyNS4xNjZjMTguNjM5LTE4LjY3NyA4Mi43MzEgMzguOTYgMTAxLjM3MyA1Ny42MzdsNDA1LjIyMSA0MDUuMTQyYzE4LjcxNiAxOC42NzcgMTguNzE2IDQ4Ljg5MiAwIDY3LjUzek01OTQuMDA2IDUwMC40MDZsLTMzLjgwNCAzMy44MDQgMTcwLjMxNyAxNzAuMzE3IDMzLjgwNC0zNS4yNTQtMTcwLjMxNy0xNjguODYzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MTk7IiBnbHlwaC1uYW1lPSJ1c2VyIiBkYXRhLXRhZ3M9IueUqOaItyIgaG9yaXotYWR2LXg9IjEwMjIiIGQ9Ik01MDcuODQ2IDQ1MS4yMTVjMTAzLjkyMiAwIDE4OC4xMDIgODQuODY5IDE4OC4xMDIgMTg5LjQ3OSAwIDEwNC42NDktODQuMTc4IDE4OS41MTgtMTg4LjEwMiAxODkuNTE4LTEwMy44ODQgMC0xODguMTAyLTg0Ljg2OS0xODguMTAyLTE4OS41MThzODQuMjE3LTE4OS40NzkgMTg4LjEwMi0xODkuNDc5ek01MTAuMzczIDM0OC41MTVjLTMyNS4zMTYgMC0zODIuMTczLTE2OC40MzUtMzgyLjE3My0xNjguNDM1di0xMTQuMjkyaDc2NC40MjV2MTE0LjI5MmMwIDAtNDguNDc5IDE2OC40MzUtMzgyLjI1MSAxNjguNDM1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWE7IiBnbHlwaC1uYW1lPSJkb3duLWVuZCIgZGF0YS10YWdzPSLnva7lupUiIGhvcml6LWFkdi14PSI5NDkiIGQ9Ik03NDUuNzkxIDY5Ljk0NmgtNTQyLjE4OXY2My4yOTFoMjI0LjU1NWwtMjIzLjcwOCAyOTAuODExaDEzOS44NTN2Mzk0Ljk0OGgyNjAuNjAxdi0zOTQuOTQ4aDEzOS44NTNsLTIyMy44MDItMjkwLjgxMWgyMjQuODM4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWI7IiBnbHlwaC1uYW1lPSJ1cC1lbmQiIGRhdGEtdGFncz0i572u6aG2IiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTc1MS40ODcgODIwLjUwMmgtNTQyLjE4OXYtNjMuMjkxaDIyNC41NTVsLTIyMy42NjEtMjkwLjgxMWgxMzkuODA2di0zOTQuOTQ4aDI2MC42MDF2Mzk0Ljk0OGgxMzkuOWwtMjIzLjg0OSAyOTAuODExaDIyNC44Mzh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkxYzsiIGdseXBoLW5hbWU9InRleHQiIGRhdGEtdGFncz0i6YeN5ZG95ZCNIiBob3Jpei1hZHYteD0iMTAyMiIgZD0iTTE3MC42NjcgNzg5LjMzM2g2ODIuNjY3di0xMzYuNTMzaC02ODIuNjY3djEzNi41MzN6TTQ0My43MzMgNjUyLjhoMTM2LjUzM3YtNTQ2LjEzM2gtMTM2LjUzM3Y1NDYuMTMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWQ7IiBnbHlwaC1uYW1lPSJjdXN0b21pemUiIGRhdGEtdGFncz0i6Ieq5a6a5LmJ5bqV5Zu+IiBkPSJNNzE3LjQ0IDI5Mi4xMzhjLTMuOTE0IDEyMi44MjctMjkuNjYyIDIxNi44NzQtMTk2LjU3NCAyMTYuODc0LTE2Ni4zNCAwLTE5Mi43MzgtNzUuNjMtMTk2LjYxMy0yMTYuODc0aDY1LjM0NmM2Ljc5IDI5Ljk2NyAxNi44MDYgNTUuMTc4IDMwLjYyMiA3NC44NjNsLTEuNDU4LTEyOC41NDRoMjA4LjIwM2wtMS43NjUgMTIxLjEzOGMxMS41NTEtMTguNTczIDIwLjQ4OS00MC45NDIgMjYuNjI5LTY3LjQ1OGg2NS42MTZ6TTUyMi4wNTQgNTE2LjA2OWM0OC42MTYgMCA4Ny45ODYgMzkuMjkzIDg3Ljk4NiA4Ny43OTRzLTM5LjM2OCA4Ny44Ny04Ny45ODYgODcuODctODguMDI1LTM5LjM2OC04OC4wMjUtODcuODcgMzkuNDA2LTg3Ljc5NCA4OC4wMjUtODcuNzk0ek01MTEuODg2IDgzMS41OTZjLTIxMS44MDggMC0zODMuNTk2LTE3MS40NDItMzgzLjU5Ni0zODIuODNzMTcxLjc4Ni0zODIuODY2IDM4My41OTYtMzgyLjg2NmMyMTEuODQ3IDAgMzgzLjYzNCAxNzEuNDQyIDM4My42MzQgMzgyLjg2NnMtMTcxLjc0OSAzODIuODMtMzgzLjYzNCAzODIuODN6TTUxMi4yMzEgMTUxLjA4M2MtMTY0LjkxOCAwLTI5OC42MDMgMTMzLjQ1NC0yOTguNjAzIDI5OC4xMDUgMCAxNjQuNTczIDEzMy42ODUgMjk4LjAyOSAyOTguNjAzIDI5OC4wMjkgMTY0Ljk5NiAwIDI5OC42ODEtMTMzLjQ1NCAyOTguNjgxLTI5OC4wMjkgMC0xNjQuNjktMTMzLjY4NS0yOTguMTA1LTI5OC42ODEtMjk4LjEwNXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTFlOyIgZ2x5cGgtbmFtZT0icG9seWdvbiIgZGF0YS10YWdzPSLpnaIiIGQ9Ik0zNTAuMDA3IDYyMy44NzFjNDcuMzUgNTMuNjg3IDQyLjIxOSAxMzUuNTU4LTExLjQ2OCAxODIuOTA4LTUzLjY4NyA0Ny4zMS0xMzUuNTU4IDQyLjIxOS0xODIuOTA4LTExLjQ2OC00Ny4zMS01My42NDgtNDIuMjE5LTEzNS41MTkgMTEuNDY4LTE4Mi44NjkgMTcuNTctMTUuNTEyIDM4LjIxNC0yNC44NDEgNTkuNzExLTI5LjIzNHYtMjY1LjUxNmMtMjYuNjY3LTUuNDQ0LTUxLjgyMi0xOC43MzgtNzEuMTc5LTQwLjcwMi00Ny4zMS01My42ODctNDIuMjE5LTEzNS41NTggMTEuNDY4LTE4Mi45MDggNTMuNjg3LTQ3LjQyOCAxMzUuNDgtNDIuMjE5IDE4Mi45MDggMTEuNDY4IDQ3LjM1IDUzLjYwOSA0Mi4yMTkgMTM1LjUxOS0xMS40NjggMTgyLjgzLTE3LjY0OSAxNS41NS0zOC40MSAyNC45MTktNTkuOTA3IDI5LjIzNHYyNjUuNTE2YzI2LjcwNiA1LjQwNSA1MS45NzUgMTguNzc4IDcxLjM3NSA0MC43NDJ6TTMwMy45MDIgMTgyLjA5NWMtNC43MDMtMjguMjYyLTMxLjQ0OS00Ny4zMS01OS42NzItNDIuNTI5LTI4LjI2MiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNTI5IDU5LjY3MiA0LjcwMyAyOC4yMjMgMzEuNDg4IDQ3LjIzMiA1OS42NzIgNDIuNTI5IDI4LjE0NS00LjcwMyA0Ny4zMS0zMS40MSA0Mi41MjktNTkuNjcyek0yNTQuODAxIDY1Ny4yMjZoLTAuMjMzYy0zLjM4Mi0wLjExOC02Ljg0MyAwLjExOC0xMC4zNzggMC43LTI4LjI2MiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNTI5IDU5LjY3MiA0LjcwMyAyOC4yMjMgMzEuNDg4IDQ3LjMxIDU5LjY3MiA0Mi41MjkgMjguMTg0LTQuNzAzIDQ3LjMxLTMxLjQ0OSA0Mi41MjktNTkuNjcyLTQuMDQ0LTI0LjcyMy0yNC45OTgtNDIuMzczLTQ5LjA2MC00My4yM3pNNzk2Ljk5NCAzMTcuNjEydjI2NS41MTZjMjYuNzA2IDUuNDQ0IDUxLjk3NSAxOC43NzggNzEuMzc1IDQwLjc4MSA0Ny4zMSA1My42ODcgNDIuMjE5IDEzNS41NTgtMTEuNTA3IDE4Mi45MDgtNTMuNjQ4IDQ3LjMxLTEzNS41NTggNDIuMjE5LTE4Mi44NjktMTEuNDY4LTE1LjY2Ni0xNy43NjYtMjUuMTE0LTM4LjY4LTI5LjM1Mi02MC4zNzRoLTI2MC42OTV2LTUxLjg2MWgyNjAuODEzYzUuNTk3LTI2LjQzNiAxOC44NTYtNTEuMzk0IDQwLjY2My03MC42MzUgMTcuNTctMTUuNTEyIDM4LjI1My0yNC44NDEgNTkuNzExLTI5LjIzNHYtMjY1LjQ3N2MtMjYuNjI4LTUuNDgyLTUxLjgyMi0xOC43NzgtNzEuMTQtNDAuNzgxLTE1LjY2Ni0xNy43NjYtMjUuMTE0LTM4LjcxOS0yOS4zOTEtNjAuNDEzaC0yNjAuNjU2di01MS44MjJoMjYwLjgxM2M1LjU5Ny0yNi40MzYgMTguODU2LTUxLjM5NCA0MC42NjMtNzAuNTk3IDUzLjcyNi00Ny40NjcgMTM1LjUxOS00Mi4yOTggMTgyLjk0NyAxMS4zOSA0Ny4zMSA1My42ODcgNDIuMjE5IDEzNS41OTgtMTEuNTA3IDE4Mi45MDgtMTcuNjEgMTUuNTUtMzguMzcgMjQuODQxLTU5Ljg2OCAyOS4xNTZ6TTcyMC4wNTggNzE3LjZjNC43MDMgMjguMjIzIDMxLjQ4OCA0Ny4zMSA1OS42NzIgNDIuNTI5IDI4LjI2Mi00LjcwMyA0Ny4zMS0zMS40NDkgNDIuNTI5LTU5LjY3Mi00LjA0NC0yNC42ODUtMjUuMDc2LTQyLjMzNi00OS4xMzctNDMuMTkxaC0wLjIzM2MtMy4zODItMC4xMTgtNi44NDMgMC4xMTgtMTAuMzM5IDAuNy0yOC4yMjMgNC42NjQtNDcuMjMyIDMxLjM3Mi00Mi40OSA1OS42MzN6TTgyMi4yMjQgMTgyLjA5NWMtNC43MDMtMjguMjYyLTMxLjQ4OC00Ny4zMS01OS42NzItNDIuNTI5LTI4LjMwMiA0LjcwMy00Ny4zMSAzMS40NDktNDIuNjA3IDU5LjY3MiA0Ljc4MiAyOC4yMjMgMzEuNTI3IDQ3LjIzMiA1OS43MTEgNDIuNTI5czQ3LjM4OS0zMS40MSA0Mi41NjgtNTkuNjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MWY7IiBnbHlwaC1uYW1lPSJvcGVuIiBkYXRhLXRhZ3M9IuaJk+W8gOmdouadvyIgZD0iTTM5OS43NTQgODMydi03NjhsNDk2LjI0NiAzODQtNDk2LjI0NiAzODR6TTEyOCA2NGgxNzcuMjMxdjc2OGgtMTc3LjIzMXYtNzY4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjA7IiBnbHlwaC1uYW1lPSJvdmVybGF5IiBkYXRhLXRhZ3M9IuWcsOWbvuacjeWKoeWbvuWxgiIgZD0iTTEzNi41MzMgNjk5LjM1OGwxODIuMDY3IDU1Ljg0MiAzMTIuODY2LTU1Ljg0MiAyNTYgNTUuODQydi01NDYuMTMzbC0yNTYtNjguMjY3LTMxMi44NjYgNTUuODQyLTE4Mi4wNjctNTUuODQydjU1OC41NTh6TTM0MS4zMzMgNjg2LjkzM3YtNDI0Ljc1NWwyNzMuMDY3LTUzLjExMXY0MjQuNzU1bC0yNzMuMDY3IDUzLjExMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTIxOyIgZ2x5cGgtbmFtZT0icG9pbnQtbGF5ZXIiIGRhdGEtdGFncz0i54K55Zu+5bGCIiBkPSJNNTgwLjI2NyA0ODIuMTMzYzk0LjI3NiAwIDE3MC42NjcgNzYuMzkgMTcwLjY2NyAxNzAuNjY3cy03Ni4zOSAxNzAuNjY3LTE3MC42NjcgMTcwLjY2N2MtOTQuMjc2IDAtMTcwLjY2Ny03Ni4zOS0xNzAuNjY3LTE3MC42NjdzNzYuMzktMTcwLjY2NyAxNzAuNjY3LTE3MC42Njd6TTMwNy4yIDI3Ny4zMzNjNTYuNTI1IDAgMTAyLjQgNDUuODc1IDEwMi40IDEwMi40cy00NS44NzUgMTAyLjQtMTAyLjQgMTAyLjRjLTU2LjUyNSAwLTEwMi40LTQ1Ljg3NS0xMDIuNC0xMDIuNHM0NS44NzUtMTAyLjQgMTAyLjQtMTAyLjR6TTcxNi44IDE0MC44YzU2LjUyNSAwIDEwMi40IDQ1Ljg3NSAxMDIuNCAxMDIuNHMtNDUuODc1IDEwMi40LTEwMi40IDEwMi40Yy01Ni41MjUgMC0xMDIuNC00NS44NzUtMTAyLjQtMTAyLjRzNDUuODc1LTEwMi40IDEwMi40LTEwMi40eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjI7IiBnbHlwaC1uYW1lPSJoYW1idXJnIiBkYXRhLXRhZ3M9IuaxieWgoeWMhSIgZD0iTTEyOCAzODRoNzY4djEyOGgtNzY4di0xMjh6TTEyOCAxMjhoNzY4djEyOGgtNzY4di0xMjh6TTEyOCA3Njh2LTEyOGg3Njh2MTI4aC03Njh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyMzsiIGdseXBoLW5hbWU9InRyaWFuZ2xlIiBkYXRhLXRhZ3M9IuaJqeWxleS4ieinkiIgZD0iTTMzOS4yIDI3NS4yaDM0NS42djM0NS42eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjQ7IiBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiBkYXRhLXRhZ3M9IumdouWbvuWxgiIgZD0iTTMzNS41MzEgNjg2LjkzM2MtMTAuMzA4LTI5LjA4Mi0zMy4zODItNTIuMTU2LTYyLjQ2NC02Mi40NjR2LTM1Mi45MzljMjkuMDgyLTEwLjMwOCA1Mi4xNTYtMzMuMzgyIDYyLjQ2NC02Mi40NjRoMzUyLjkzOWMxMC4zMDggMjkuMDgyIDMzLjM4MiA1Mi4xNTYgNjIuNDY0IDYyLjQ2NHYzNTIuOTM5Yy0yOS4wODIgMTAuMzA4LTUyLjE1NiAzMy4zODItNjIuNDY0IDYyLjQ2NGgtMzUyLjkzOXpNMzM1LjUzMSA3NTUuMmgzNTIuOTM5YzE0LjA2MyAzOS43OTkgNTIuMDE5IDY4LjI2NyA5Ni41OTcgNjguMjY3IDU2LjUyNSAwIDEwMi40LTQ1Ljg3NSAxMDIuNC0xMDIuNCAwLTQ0LjU3OC0yOC40NjctODIuNTM0LTY4LjI2Ny05Ni41OTd2LTM1Mi45MzljMzkuNzk5LTE0LjA2MyA2OC4yNjctNTIuMDE5IDY4LjI2Ny05Ni41OTcgMC01Ni41MjUtNDUuODc1LTEwMi40LTEwMi40LTEwMi40LTQ0LjU3OCAwLTgyLjUzNCAyOC40NjctOTYuNTk3IDY4LjI2N2gtMzUyLjkzOWMtMTQuMDYzLTM5Ljc5OS01Mi4wMTktNjguMjY3LTk2LjU5Ny02OC4yNjctNTYuNTI1IDAtMTAyLjQgNDUuODc1LTEwMi40IDEwMi40IDAgNDQuNTc4IDI4LjQ2NyA4Mi41MzQgNjguMjY3IDk2LjU5N3YzNTIuOTM5Yy0zOS43OTkgMTQuMDYzLTY4LjI2NyA1Mi4wMTktNjguMjY3IDk2LjU5NyAwIDU2LjUyNSA0NS44NzUgMTAyLjQgMTAyLjQgMTAyLjQgNDQuNTc4IDAgODIuNTM0LTI4LjQ2NyA5Ni41OTctNjguMjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MjU7IiBnbHlwaC1uYW1lPSJjbG9zZSIgZGF0YS10YWdzPSLmlLbotbfpnaLmnb8iIGQ9Ik02MjQuMjQ2IDY0djc2OGwtNDk2LjI0Ni0zODQgNDk2LjI0Ni0zODR6TTcxOC43NjkgODMydi03NjhoMTc3LjIzMXY3NjhoLTE3Ny4yMzF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyNjsiIGdseXBoLW5hbWU9ImFkZCIgZGF0YS10YWdzPSLmt7vliqDlm77lsYIiIGQ9Ik04NTcuNiA1MTJoLTI4MS42djI4MS42YzAgMzguNC0yNS42IDM4LjQtNjQgMzguNHMtNjQgMC02NC0zOC40di0yODEuNmgtMjgxLjZjLTM4LjQgMC0zOC40LTI1LjYtMzguNC02NHMwLTY0IDM4LjQtNjRoMjgxLjZ2LTI3NS4yYzAtNDQuOCAyNS42LTQ0LjggNjQtNDQuOHM2NCAwIDY0IDM4LjR2MjgxLjZoMjc1LjJjNDQuOCAwIDQ0LjggMjUuNiA0NC44IDY0czAgNjQtMzguNCA2NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI3OyIgZ2x5cGgtbmFtZT0ibW9yZSIgZGF0YS10YWdzPSLkuIvmi4nkuInop5IiIGQ9Ik0yODggNTc2bDIyNC0yNTYgMjI0IDI1NnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI4OyIgZ2x5cGgtbmFtZT0ibGluZS1sYXllciIgZGF0YS10YWdzPSLnur/lm77lsYIiIGQ9Ik0zMzguOTI0IDMyMy4xNjhjLTM4LjAyNSAxOC4yMjctODUuMDYwIDExLjUzNy0xMTYuNTMxLTIwLjAwMi00MC4wMDQtNDAuMDA0LTQwLjAwNC0xMDQuNzg5IDAtMTQ0Ljc5NCAzOS45MzYtNDAuMDA0IDEwNC43ODktNDAuMDA0IDE0NC43OTQgMCAzMS41MzkgMzEuNTM5IDM4LjIyOSA3OC41MDcgMjAuMDAyIDExNi41MzFsMjk3LjkxNiAyOTcuOTE2YzM4LjAyNS0xOC4yMjcgODQuOTkyLTExLjUzNyAxMTYuNTMxIDIwLjAwMiA0MC4wMDQgNDAuMDA0IDQwLjAwNCAxMDQuNzg5IDAgMTQ0Ljc5NHMtMTA0Ljg1OCA0MC4wMDQtMTQ0Ljc5NCAwYy0zMS41MzktMzEuNTM5LTM4LjIyOS03OC41MDctMjAuMDcwLTExNi41MzFsLTI5Ny44NDctMjk3LjkxNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTI5OyIgZ2x5cGgtbmFtZT0icmVzdC1hcGkiIGRhdGEtdGFncz0iV2Vi5pyN5Yqh5o6l5Y+jIiBob3Jpei1hZHYteD0iMTMzMCIgZD0iTTEyNDEuOTA3IDk2MC40MWgtMTE1My42NzljLTQ5LjAyOSAwLTg4Ljc2LTM5LjAzNS04OC43Ni04Ny4yNDV2LTg1MC4zNzFjMC00OC4xNjkgMzkuNzMxLTg3LjIwNCA4OC43Ni04Ny4yMDRoMTE1My42NzljNDkuMDcwIDAgODguODAxIDM5LjAzNSA4OC44MDEgODcuMjA0djg1MC4zNzFjMCA0OC4yMS0zOS43MzEgODcuMjQ1LTg4LjgwMSA4Ny4yNDV6TTExNDIuMTI5IDg3My4xMjRjMTguMzA5IDAgMzMuMy0xNC42MjMgMzMuMy0zMi42ODZzLTE0Ljk1LTMyLjY4Ni0zMy4zLTMyLjY4NmMtMTguNDMyIDAtMzMuMyAxNC42MjMtMzMuMyAzMi42ODZzMTQuODY4IDMyLjY4NiAzMy4zIDMyLjY4NnpNMTA0Mi4zMDkgODczLjEyNGMxOC4zMDkgMCAzMy4zLTE0LjYyMyAzMy4zLTMyLjY4NnMtMTQuOTUtMzIuNjg2LTMzLjMtMzIuNjg2Yy0xOC40MzIgMC0zMy4zIDE0LjYyMy0zMy4zIDMyLjY4NnMxNC44NjggMzIuNjg2IDMzLjMgMzIuNjg2ek05NDIuNDQ5IDg3My4xMjRjMTguMzA5IDAgMzMuMy0xNC42MjMgMzMuMy0zMi42ODZzLTE0Ljk1LTMyLjY4Ni0zMy4zLTMyLjY4NmMtMTguNDMyIDAtMzMuMyAxNC42MjMtMzMuMyAzMi42ODZzMTQuODY4IDMyLjY4NiAzMy4zIDMyLjY4NnpNMTI0MS45MDcgMjIuNzk0aC0xMTUzLjY3OXY2OTcuNzk1aDExNTMuNjc5di02OTcuNzk1eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmE7IiBnbHlwaC1uYW1lPSJqYXZhc2NyaXB0LWFwaSIgZGF0YS10YWdzPSJXZWLlvIDlj5EiIGhvcml6LWFkdi14PSIxMzczIiBkPSJNNDAzLjkwNyAzMi4yMTV2MTQ5LjI5OWwtMjU1LjYzMSAyNTguMjEyIDI1NS42MzEgMjU4LjIxMnYxNDkuMjk5bC00MDMuMzc0LTQwNy41MTEgNDAzLjM3NC00MDcuNTExek05NjIuMTA5IDg1NC40ODd2LTE0OC45MzFsMjYwLjIxOS0yNTcuNTU2LTI2MC4yMTktMjU3LjU1NnYtMTQ4LjkzMWw0MTAuNTQyIDQwNi40ODctNDEwLjU0MiA0MDYuNDg3ek04MjEuNjk5IDk1NS45ODZjLTM0LjUyOSAxMS4yMjMtNzEuNTE2LTcuOTQ2LTgyLjY1Ny00Mi44MDNsLTIzNy4xNTgtODg5LjY1MWMtMTEuMS0zNC44OTggNy44NjQtNzIuMjk0IDQyLjM5NC04My40NzYgMzQuNTI5LTExLjIyMyA3MS41NTcgNy45MDUgODIuNjU3IDQyLjg0NGwyMzcuMTU4IDg4OS42NTFjMTEuMSAzNC44MTYtNy44MjMgNzIuMTcyLTQyLjM5NCA4My40MzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyYjsiIGdseXBoLW5hbWU9ImRlc2t0b3AtZGV2IiBkYXRhLXRhZ3M9IuahjOmdouW8gOWPkSIgaG9yaXotYWR2LXg9IjE0MTYiIGQ9Ik0xMTgwLjA1OCA1Ni40NjNjNjUuMjA4IDAgMTE4LjAwNiA1My45MDMgMTE4LjAwNiAxMjAuNDYzdjY2Mi42MWMwIDY2Ljg0Ny01My4xMjUgMTIwLjQ2My0xMTguMDA2IDEyMC40NjNoLTk0NC4wNDZjLTY1LjQ5NSAwLTExOC4wMDYtNTMuNjE3LTExOC4wMDYtMTIwLjQ2M3YtNjYyLjU2OWMwLTY2LjU2IDUyLjgzOC0xMjAuNDYzIDExOC4wMDYtMTIwLjQ2M2gtMjM2LjAxMmMwLTY2LjU2IDUyLjgzOC0xMjAuNTA0IDExOC4wMDYtMTIwLjUwNGgxMTgwLjA1OGM2NS4yMDggMCAxMTguMDg4IDUzLjk0NCAxMTguMDg4IDEyMC40NjNoLTIzNi4wOTN6TTIzNi4wMTIgODM5LjUzN2g5NDQuMDQ2di02NjIuNTY5aC05NDQuMDQ2djY2Mi41Njl6TTcwOC4wMzUtMy43NDhjLTMyLjU2MyAwLTU4Ljk4MiAyNi45NTItNTguOTgyIDYwLjI1MnMyNi40NiA2MC4yNTIgNTguOTgyIDYwLjI1MmMzMi42NDUgMCA1OC45ODItMjYuOTUyIDU4Ljk4Mi02MC4yNTJzLTI2LjMzNy02MC4yNTItNTguOTgyLTYwLjI1MnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTJjOyIgZ2x5cGgtbmFtZT0iZWRpdCIgZGF0YS10YWdzPSLnvJbovpEiIGQ9Ik05NTcuOTAxIDY4OS4xNTJjMTkuOTY4IDIwLjAxOSAxOS45NjggNTMuMjQ4IDAgNzIuMTkybC0xMTkuODA4IDExOS44MDhjLTE4Ljk0NCAyMC4wMTktNTIuMjc1IDIwLjAxOS03Mi4xOTIgMGwtOTQuMjA4LTkzLjY5NiAxOTItMTkyek01MS4xNDkgMTY2LjR2LTE5MmgxOTJsNTY2LjMyMyA1NjYuNzMzLTE5MiAxOTItNTY2LjMyMy01NjYuNzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmQ7IiBnbHlwaC1uYW1lPSJob21lIiBkYXRhLXRhZ3M9Iui/lOWbnuS4u+mhtSIgZD0iTTUxMiA4MzJsLTQ2MC44LTQwNi41NzloMTM4LjI0di0zNjEuNDIxaDIzMC4zNDl2MjcxLjA1M2gxODQuMzcxdi0yNzEuMDUzaDIzMC40djM2MS40MjFoMTM4LjI0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MmU7IiBnbHlwaC1uYW1lPSJzaGFyZSIgZGF0YS10YWdzPSLliIbkuqsiIGhvcml6LWFkdi14PSIxMDI2IiBkPSJNNzk3LjI0NSAzMzcuNTk2di0xNzVoLTU2OC43NTF2MTc1aC04Ny41MDF2LTI2Mi41MDFoNzQzLjc1MXYyNjIuNTAxek04ODQuNzQ0IDYxMS4yMWwtMjYzLjQyIDIwNy42Mzh2LTEyNC4zODJjLTMxOS45NDUgMC0zOTIuODMyLTMxMy4xMTktMzkyLjgzMi0zMTMuMTE5IDkwLjUxOSAxNDEuMjI2IDIxOS4xODggMTU0Ljc4OCAzOTIuODMyIDE1NC43ODh2LTE0MC4xNzVsMjYzLjQyIDIxNS4yNTF6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkyZjsiIGdseXBoLW5hbWU9ImJhY2siIGRhdGEtdGFncz0i5pS26LW357yW6L6R6Z2i5p2/IiBkPSJNMTczLjQ2NiA3MTguMjg1bDQ3NS4zNDEtNDc1LjM0MSA2OC4xOTggNjguMTk4LTQ3NS4zNDEgNDc1LjM0MWgxNzMuNTY4djk2LjcxN2gtMzM4LjQ4M3YtMzM4LjQ4M2g5Ni43MTd2MTczLjU2OHpNODUwLjM4MSA4ODMuMmgtMzM4LjQzMnYtOTYuNzE3aDMzOC40MzJ2LTY3Ny4wMThoLTY3Ni45MTV2MzM4LjUzNGgtOTYuNzE3di0zMzguNDgzYzAtNTMuNDAyIDQzLjMxNS05Ni43MTcgOTYuNzE3LTk2LjcxN2g2NzYuOTY2YzUzLjQ1MyAwIDk2Ljc2OCA0My4zMTUgOTYuNzY4IDk2LjcxN3Y2NzYuOTY2Yy0wLjA1MSA1My4xOTctNDMuMTEgOTYuNzE3LTk2LjgxOSA5Ni43MTd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMDsiIGdseXBoLW5hbWU9InVuZm9sZCIgZGF0YS10YWdzPSLmiZPlvIDlm77moIfmoYYiIGQ9Ik01MTIgNDIyLjRsMjI0IDIzMC40LTUxLjIgNTEuMi0xNzIuOC0xNzIuOC0xNzIuOCAxNzIuOC01MS4yLTUxLjIgMjI0LTIzMC40ek0zMzkuMiA0NzMuNmwtNTEuMi01MS4yIDIyNC0yMzAuNCAyMjQgMjMwLjQtNTEuMiA1MS4yLTE3Mi44LTE3Mi44LTE3Mi44IDE3Mi44eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzE7IiBnbHlwaC1uYW1lPSJmb2xkIiBkYXRhLXRhZ3M9IuaUtui1t+Wbvuagh+ahhiIgZD0iTTI4OCAyNDMuMmw1MS4yLTUxLjIgMTcyLjggMTcyLjggMTcyLjgtMTcyLjggNTEuMiA1MS4yLTIyNCAyMzAuNC0yMjQtMjMwLjR6TTUxMiA1OTUuMmwxNzIuOC0xNzIuOCA1MS4yIDUxLjItMjI0IDIzMC40LTIyNC0yMzAuNCA1MS4yLTUxLjIgMTcyLjggMTcyLjh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMjsiIGdseXBoLW5hbWU9InJpZ2h0IiBkYXRhLXRhZ3M9IuWQkeWPsyIgZD0iTTM5MC40IDc2OGwtNzAuNC03Ni44IDIzNi44LTI0My4yLTIzNi44LTI0My4yIDcwLjQtNzYuOCAzMTMuNiAzMjB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzMzsiIGdseXBoLW5hbWU9ImxlZnQiIGRhdGEtdGFncz0i5ZCR5bemIiBkPSJNNjMzLjYgNzY4bDcwLjQtNzYuOC0yMzYuOC0yNDMuMiAyMzYuOC0yNDMuMi03MC40LTc2LjgtMzEzLjYgMzIweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzQ7IiBnbHlwaC1uYW1lPSJ0YWciIGRhdGEtdGFncz0i5qCH562+IiBkPSJNODcyLjM2OCA0NjUuNzIzbC0zNDIuNjQ2IDM0Mi42NDZjLTE3LjcyMyAxNy43MjMtMzUuNDQ2IDIzLjYzMi01OS4wNzcgMjMuNjMyaC0yNjUuODQ2Yy00MS4zNTQgMC03Ni44LTM1LjQ0Ni03Ni44LTc2Ljh2LTI3MS43NTRjMC0yMy42MzIgNS45MDktNDEuMzU0IDIzLjYzMi01My4xNjhsMzQyLjY0Ni0zNDguNTU0YzE3LjcyMy0xMS44MTQgMzUuNDQ2LTE3LjcyMyA1My4xNjgtMTcuNzIzczQxLjM1NCA1LjkwOSA1My4xNjggMjMuNjMybDI2NS44NDYgMjcxLjc1NGMyMy42MzIgMTEuODE0IDI5LjUzOCAyOS41MzggMjkuNTM4IDUzLjE2OCAwIDE3LjcyMy01LjkwOSAzNS40NDYtMjMuNjMyIDUzLjE2OHpNMjYzLjg3NyA2NDIuOTU0Yy0yOS41MzggMC01OS4wNzcgMjMuNjMyLTU5LjA3NyA1OS4wNzcgMCAyOS41MzggMjMuNjMyIDU5LjA3NyA1OS4wNzcgNTkuMDc3IDI5LjUzOCAwIDU5LjA3Ny0yMy42MzIgNTkuMDc3LTU5LjA3Ny01LjkwOS0zNS40NDYtMjkuNTM4LTU5LjA3Ny01OS4wNzctNTkuMDc3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5MzU7IiBnbHlwaC1uYW1lPSJuZXdfaG9tZSIgZGF0YS10YWdzPSLov5Tlm57pppbpobUiIGQ9Ik01MTIgNzk1LjczM2wtNDAxLjIzMS0zNjkuMTMzaDEyMy4wNDR2LTMyNi4zMzRoMTk3Ljk0MXYyNDYuMDg5aDE2MC40OTN2LTI0Ni4wODloMTk3Ljk0MXYzMjYuMzM0aDEyMy4wNDR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzNjsiIGdseXBoLW5hbWU9InVwZGF0ZSIgZGF0YS10YWdzPSLmm7TmlrDml7bpl7QiIGQ9Ik01MTIgOTYwYy0yODMuNTY5IDAtNTEyLTIyOC40MzEtNTEyLTUxMnMyMjguNDMxLTUxMiA1MTItNTEyYzI4My41NjkgMCA1MTIgMjI4LjQzMSA1MTIgNTEycy0yMjguNDMxIDUxMi01MTIgNTEyek03MDguOTIzIDE3Mi4zMDhsLTI3NS42OTIgMTg5LjA0NnYzNjIuMzM4aDc4Ljc2OXYtMzE1LjA3N2wyMzYuMzA4LTE1Ny41MzgtMzkuMzg1LTc4Ljc2OXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTM3OyIgZ2x5cGgtbmFtZT0iaW5mbyIgZGF0YS10YWdzPSLkv6Hmga8iIGQ9Ik01MTIgOTYwYy0yODEuNiAwLTUxMi0yMzAuNC01MTItNTEyczIzMC40LTUxMiA1MTItNTEyYzI4MS42IDAgNTEyIDIzMC40IDUxMiA1MTJzLTIzMC40IDUxMi01MTIgNTEyek01NjMuMiAxOTJoLTEwMi40djMwNy4yaDEwMi40di0zMDcuMnpNNTYzLjIgNjAxLjZoLTEwMi40djEwMi40aDEwMi40di0xMDIuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTM4OyIgZ2x5cGgtbmFtZT0ibG9nbyIgZGF0YS10YWdzPSJsb2dvIiBob3Jpei1hZHYteD0iMTMzNiIgZD0iTTY4NS42MzUgMzM2LjY5NmwtMTExLjMwNCA0NC41MjJjLTE3LjgwOS0yNi43MTMtMzEuMTY1LTU3Ljg3OC00OC45NzQtOTcuOTQ4bDEyMC4yMDktNDQuNTIyIDQwLjA3MCA5Ny45NDh6TTY1MC4wMTcgNTE0Ljc4M2MtNzEuMjM1IDAtMTM4LjAxNy0yNi43MTMtMTkxLjQ0My03MS4yMzVsMTAyLjQtNDAuMDcwYzM1LjYxNyA1Ny44NzggNjYuNzgzIDg5LjA0MyA4OS4wNDMgMTExLjMwNHpNNjkwLjA4NyAzNTguOTU3bDUzLjQyNiAxNDIuNDdjLTIyLjI2MSA4LjkwNC00NC41MjIgMTMuMzU3LTY2Ljc4MyAxMy4zNTctMjYuNzEzLTE3LjgwOS02Mi4zMy01My40MjYtOTcuOTQ4LTExMS4zMDRsMTExLjMwNC00NC41MjJ6TTgxOS4yIDI4Ny43MjJsLTExMS4zMDQgNDQuNTIyLTQwLjA3MC0xMDIuNCAxMjAuMjA5LTQ0LjUyMmMxMy4zNTcgMzUuNjE3IDIyLjI2MSA3MS4yMzUgMzEuMTY1IDEwMi40ek03NzkuMTMgMTYzLjA2MWwtMTIwLjIwOSA0NC41MjItNDAuMDcwLTEwMi40IDExMS4zMDQtNDQuNTIyYzE3LjgwOSAzNS42MTcgMzUuNjE3IDY2Ljc4MyA0OC45NzQgMTAyLjR6TTQ4NS4yODcgMTU4LjYwOWwxMTEuMzA0LTQ0LjUyMiA0MC4wNzAgMTAyLjQtMTIwLjIwOSA0NC41MjJjLTEzLjM1Ny0zNS42MTctMjIuMjYxLTcxLjIzNS0zMS4xNjUtMTAyLjR6TTkzOS40MDkgMjY1LjQ2MWMtOC45MDQgNjYuNzgzLTQ0LjUyMiAxMjkuMTEzLTkzLjQ5NiAxNzMuNjM1IDQuNDUyLTMxLjE2NSA0LjQ1Mi03NS42ODctNC40NTItMTM4LjAxN2w5Ny45NDgtMzUuNjE3ek04MjMuNjUyIDMwOS45ODNjMTMuMzU3IDY2Ljc4MyA4LjkwNCAxMTUuNzU3IDQuNDUyIDE0Ni45MjItMTcuODA5IDEzLjM1Ny0zNS42MTcgMjIuMjYxLTU3Ljg3OCAzNS42MTdsLTU3Ljg3OC0xNDIuNDcgMTExLjMwNC00MC4wNzB6TTYwOS45NDggOTEuODI2bC01My40MjYtMTM4LjAxN2MyMi4yNjEtOC45MDQgNDQuNTIyLTEzLjM1NyA2Ni43ODMtMTMuMzU3IDI2LjcxMyAxNy44MDkgNjIuMzMgNTMuNDI2IDk3Ljk0OCAxMTEuMzA0bC0xMTEuMzA0IDQwLjA3MHpNNzUyLjQxNyA2MC42NjFsMTAyLjQtNDAuMDcwYzI2LjcxMyAyNi43MTMgNDguOTc0IDU3Ljg3OCA2Mi4zMyA5My40OTZsLTEyMC4yMDkgNDQuNTIyYy0xMy4zNTctNDAuMDcwLTI2LjcxMy03MS4yMzUtNDQuNTIyLTk3Ljk0OHpNNjU0LjQ3LTY0YzcxLjIzNSAwIDEzMy41NjUgMjYuNzEzIDE4Ni45OTEgNzEuMjM1bC05Ny45NDggMzUuNjE3Yy0zNS42MTctNTMuNDI2LTY2Ljc4My04OS4wNDMtODkuMDQzLTEwNi44NTJ6TTk0My44NjEgMjQzLjJsLTEwNi44NTIgNDAuMDcwYy00LjQ1Mi0zMS4xNjUtMTcuODA5LTY2Ljc4My0zMS4xNjUtMTAyLjRsMTIwLjIwOS00NC41MjJjMTMuMzU3IDMxLjE2NSAxNy44MDkgNzEuMjM1IDE3LjgwOSAxMDYuODUyek0zNjAuNjI2IDE4NS4zMjJjOC45MDQtNjYuNzgzIDQ0LjUyMi0xMzMuNTY1IDk3Ljk0OC0xNzguMDg3LTQuNDUyIDMxLjE2NS04LjkwNCA3NS42ODcgNC40NTIgMTM4LjAxN2wtMTAyLjQgNDAuMDcwek00ODAuODM1IDEzNi4zNDhjLTEzLjM1Ny02Ni43ODMtOC45MDQtMTIwLjIwOS00LjQ1Mi0xNDYuOTIyIDE3LjgwOS0xMy4zNTcgMzUuNjE3LTIyLjI2MSA1Ny44NzgtMzEuMTY1bDUzLjQyNiAxNDIuNDctMTA2Ljg1MiAzNS42MTd6TTU1Mi4wNzAgMzkwLjEyMmwtMTExLjMwNCA0MC4wNzBjLTI2LjcxMy0yNi43MTMtNDguOTc0LTU3Ljg3OC02Mi4zMy05My40OTZsMTI0LjY2MS00NC41MjJjMTMuMzU3IDM1LjYxNyAzMS4xNjUgNzEuMjM1IDQ4Ljk3NCA5Ny45NDh6TTM3My45ODMgMzE4Ljg4N2MtMTMuMzU3LTM1LjYxNy0xNy44MDktNzUuNjg3LTEzLjM1Ny0xMTEuMzA0bDEwNi44NTItNDAuMDcwYzQuNDUyIDMxLjE2NSAxNy44MDkgNjYuNzgzIDMxLjE2NSAxMDIuNGwtMTI0LjY2MSA0OC45NzR6TTExNzUuMzc0IDUyOC4xMzljLTguOTA0IDEyOS4xMTMtMTE1Ljc1NyAyMzUuOTY1LTI0OS4zMjIgMjM1Ljk2NS0yMi4yNjEgMC00NC41MjItNC40NTItNjIuMzMtOC45MDQtNDAuMDcwIDEyMC4yMDktMTUxLjM3NCAyMDQuOC0yODQuOTM5IDIwNC44LTE0Ni45MjIgMC0yNjcuMTMtMTAyLjQtMjkzLjg0My0yNDAuNDE3LTE1NS44MjYtOC45MDQtMjg0LjkzOS0xMzguMDE3LTI4NC45MzktMjkzLjg0MyAwLTE1MS4zNzQgMTE1Ljc1Ny0yNzYuMDM1IDI2Mi42NzgtMjkzLjg0M3YwIDBjMjYuNzEzIDAgNDguOTc0IDIyLjI2MSA0OC45NzQgNDguOTc0cy0yMi4yNjEgNDguOTc0LTQ4Ljk3NCA0OC45NzR2MCA0LjQ1MmMtOTcuOTQ4IDEzLjM1Ny0xNjkuMTgzIDk3Ljk0OC0xNjkuMTgzIDE5NS44OTYgMCAxMDYuODUyIDg0LjU5MSAxOTUuODk2IDE5NS44OTYgMTk1Ljg5NnYwYzguOTA0IDAgMTcuODA5LTQuNDUyIDI2LjcxMy00LjQ1MiAzMS4xNjUgMCA1Ny44NzggMjYuNzEzIDU3Ljg3OCA1Ny44NzggMCA0LjQ1MiAwIDEzLjM1NyA0LjQ1MiAyMi4yNjF2MGMxNy44MDkgOTMuNDk2IDEwMi40IDE2OS4xODMgMjAwLjM0OCAxNjkuMTgzIDEwMi40IDAgMTg2Ljk5MS03NS42ODcgMjA0LjgtMTczLjYzNWg0LjQ1MmM4LjkwNC0yMi4yNjEgMzEuMTY1LTQwLjA3MCA1My40MjYtNDAuMDcwIDguOTA0IDAgMjIuMjYxIDQuNDUyIDMxLjE2NSA4LjkwNGg0LjQ1MmMxNy44MDkgNC40NTIgMzUuNjE3IDguOTA0IDUzLjQyNiA4LjkwNCA4NC41OTEgMCAxNTUuODI2LTY2Ljc4MyAxNTUuODI2LTE1MS4zNzQgMCAwIDAgMCAwLTQuNDUydjAgMGMwLTQuNDUyLTQuNDUyLTguOTA0LTQuNDUyLTEzLjM1NyAwLTI2LjcxMyAyMi4yNjEtNDguOTc0IDUzLjQyNi00OC45NzRoNC40NTJjNjIuMzMtNC40NTIgMTExLjMwNC01My40MjYgMTExLjMwNC0xMTEuMzA0IDAtNjIuMzMtNTMuNDI2LTExNS43NTctMTE1Ljc1Ny0xMTUuNzU3djAgMGgtMTA2Ljg1MmMtMjIuMjYxIDAtNDAuMDcwLTIyLjI2MS00MC4wNzAtNDQuNTIyczE3LjgwOS00NC41MjIgNDAuMDcwLTQ0LjUyMnYwaDEwMi40YzAgMCAwIDAgNC40NTIgMCAxMTEuMzA0IDAgMjA0LjggODkuMDQzIDIwNC44IDIwMC4zNDgtNC40NTIgODkuMDQzLTc1LjY4NyAxNjkuMTgzLTE2NC43MyAxODYuOTkxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5Mzk7IiBnbHlwaC1uYW1lPSJzZWxlY3QiIGRhdGEtdGFncz0i6YCJ5oup5a+56LGhIiBob3Jpei1hZHYteD0iODMyIiBkPSJNNjMxLjYgNDkyYzAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40IDAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40IDAgMzUuMi03MC40IDI2LjQtNzAuNCAyNi40djE1OC40Yy00LjQgMzkuNi0zNS4yIDcwLjQtNzQuOCA3MC40cy03MC40LTMwLjgtNzAuNC03MC40di0yODEuNmMtMTc2IDE3Ni0xNDAuOC0zNS4yLTE0MC44LTM1LjIgMTA1LjYtNzAuNCAxNzYtMzE2LjggMTc2LTMxNi44aDI4NmMwIDM1LjIgMTA1LjYgMjExLjIgMTA1LjYgMjQ2LjR2MTIzLjJjMCAzNS4yLTcwLjQgMjYuNC03MC40IDI2LjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzYTsiIGdseXBoLW5hbWU9InNvbGlkLXBvaW50IiBkYXRhLXRhZ3M9IueCueagt+W8jzEiIGQ9Ik04NjQgNDQ4YzAtMTk0LjQwNC0xNTcuNTk2LTM1Mi0zNTItMzUycy0zNTIgMTU3LjU5Ni0zNTIgMzUyYzAgMTk0LjQwNCAxNTcuNTk2IDM1MiAzNTIgMzUyczM1Mi0xNTcuNTk2IDM1Mi0zNTJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzYjsiIGdseXBoLW5hbWU9ImZsYWciIGRhdGEtdGFncz0i54K55qC35byPMiIgZD0iTTY4MCA3NDQuOGMtOTUuMiAwLTk1LjIgMTAwLjgtMjQwLjggMTAwLjgtNzIuOCAwLTE0MC0yMi40LTE5Ni00NC44djQ0LjhjMCAyOC0yMi40IDUwLjQtNDQuOCA1MC40cy01MC40LTIyLjQtNTAuNC01MC40di04NDUuNmg5NS4ydjM0Ny4yYzAgMCA1MC40IDEwMC44IDE5NiAxMDAuOCA5NS4yIDAgOTUuMi0xMDAuOCAyNDAuOC0xMDAuOHMxOTYgMTAwLjggMTk2IDEwMC44djM5Ny42YzAgMC01MC40LTEwMC44LTE5Ni0xMDAuOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTNjOyIgZ2x5cGgtbmFtZT0idGFyZ2V0IiBkYXRhLXRhZ3M9IueCueagt+W8jzMiIGQ9Ik01MTIgNjAxLjZjLTgzLjIgMC0xNTMuNi03MC40LTE1My42LTE1My42czcwLjQtMTUzLjYgMTUzLjYtMTUzLjZjODMuMiAwIDE1My42IDcwLjQgMTUzLjYgMTUzLjZzLTcwLjQgMTUzLjYtMTUzLjYgMTUzLjZ6TTUxMiA5NjBjLTI4MS42IDAtNTEyLTIzMC40LTUxMi01MTJzMjMwLjQtNTEyIDUxMi01MTJjMjgxLjYgMCA1MTIgMjMwLjQgNTEyIDUxMnMtMjMwLjQgNTEyLTUxMiA1MTJ6TTUxMiAzOC40Yy0yMjQgMC00MDkuNiAxODUuNi00MDkuNiA0MDkuNnMxODUuNiA0MDkuNiA0MDkuNiA0MDkuNmMyMjQgMCA0MDkuNi0xODUuNiA0MDkuNi00MDkuNnMtMTg1LjYtNDA5LjYtNDA5LjYtNDA5LjZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZDsiIGdseXBoLW5hbWU9InVwbG9hZCIgZGF0YS10YWdzPSLpgInmi6nmlofku7YiIGhvcml6LWFkdi14PSIxMzE3IiBkPSJNMTA1My4zMSA3MzguNzQyaC0zOTQuOTczbC05OC43NDIgOTMuMjU4aC0yOTYuMjI3Yy01NC44NTggMC05OC43NDItNDMuODg2LTk4Ljc0Mi05My4yNTh2LTU3NmMwLTU0Ljg1OCA0My44ODYtOTguNzQyIDk4Ljc0Mi05OC43NDJoNzg5Ljk0MmM1NC44NTggMCA5OC43NDIgNDMuODg2IDk4Ljc0MiA5OC43NDJ2NDc3LjI1OGMwIDU0Ljg1OC00My44ODYgOTguNzQyLTk4Ljc0MiA5OC43NDJ6TTg1NS44MjQgMzk4LjYyN3YtMTkyaC05OC43NDJ2MTkyaC0xNTkuMDg2bDIwOC40NTggMjAyLjk3MyAyMDguNDU4LTIwMi45NzNoLTE1OS4wODZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZTsiIGdseXBoLW5hbWU9ImxlZ2VuZCIgZGF0YS10YWdzPSLlm77kvosiIGhvcml6LWFkdi14PSIxMzM5IiBkPSJNMjg1LjAzNCA4MDBjLTQzLjMyMyAwLTc1LjgxNy0zMi40OTItNzUuODE3LTcwLjRzMzIuNDkyLTcwLjQgNzUuODE3LTcwLjQgNzUuODE3IDMyLjQ5MiA3NS44MTcgNzAuNC0zMi40OTIgNzAuNC03NS44MTcgNzAuNHpNMjg1LjAzNCA1MTguNGMtNDMuMzIzIDAtNzUuODE3LTMyLjQ5Mi03NS44MTctNzAuNHMzMi40OTItNzAuNCA3NS44MTctNzAuNCA3NS44MTcgMzIuNDkyIDc1LjgxNyA3MC40LTMyLjQ5MiA3MC40LTc1LjgxNyA3MC40ek0yODUuMDM0IDIzNi44Yy00My4zMjMgMC03NS44MTctMzIuNDkyLTc1LjgxNy03MC40czMyLjQ5Mi03MC40IDc1LjgxNy03MC40IDc1LjgxNyAzMi40OTIgNzUuODE3IDcwLjRjMCAzNy45MDgtMzIuNDkyIDcwLjQtNzUuODE3IDcwLjR6TTQzMS4yNDkgNzc4LjMzN3YtOTIuMDYzaDY5OC41ODN2OTIuMDYzaC02OTguNTgzek00MzEuMjQ5IDExNy42NjNoNjk4LjU4M3Y5Mi4wNjNoLTY5OC41ODN2LTkyLjA2M3pNNDMxLjI0OSAzOTkuMjYzaDY5OC41ODN2OTcuNDc2aC02OTguNTgzdi05Ny40NzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTkzZjsiIGdseXBoLW5hbWU9InRhYmxlIiBkYXRhLXRhZ3M9IuWxnuaAp+ihqCIgaG9yaXotYWR2LXg9IjEyMjkiIGQ9Ik0xNTMuNjI0IDgzMnYtNjcwLjI0OGMwLTU1Ljg0OCA0Mi41MjItOTcuNzUyIDkyLjE2My05Ny43NTJoNzM3LjI3NGM0OS42MTQgMCA5Mi4xNjMgNDEuODggOTIuMTYzIDk3Ljc1MnY2NzAuMjQ4aC05MjEuNjAxek01NjQuNzk5IDE2MS43NTJoLTMxOS4wMTJ2Mjg2LjI0OGgzMTkuMDEydi0yODYuMjQ4ek05ODMuMDM4IDE2MS43NTJoLTMyNi4xMDN2OTcuNzUyaDMyNi4xMDN2LTk3Ljc1MnpNOTgzLjAzOCAzNTAuMjQ4aC0zMjYuMTAzdjk3Ljc1MmgzMjYuMTAzdi05Ny43NTJ6TTk4My4wMzggNTQ1Ljc1MmgtNzM3LjI3NHYxMzkuNjMyaDczNy4yNzR2LTEzOS42MzJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0MDsiIGdseXBoLW5hbWU9Im9wYWNpdHkiIGRhdGEtdGFncz0i6YCP5piO5bqmIiBkPSJNMTYwIDgwMGgyMzQuNjczdi0yMzQuNjczaC0yMzQuNjczdjIzNC42NzN6TTM5NC42NzMgNTY1LjMyN2gyMzQuNjczdi0yMzQuNjczaC0yMzQuNjczdjIzNC42NzN6TTE2MCAzMzAuNjczaDIzNC42NzN2LTIzNC42NzNoLTIzNC42NzN2MjM0LjY3M3pNNjI5LjMyNyA4MDBoMjM0LjY3M3YtMjM0LjY3M2gtMjM0LjY3M3YyMzQuNjczek02MjkuMzI3IDMzMC42NzNoMjM0LjY3M3YtMjM0LjY3M2gtMjM0LjY3M3YyMzQuNjczeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NDE7IiBnbHlwaC1uYW1lPSJzb2xpZC10cmlhbmdsZSIgZGF0YS10YWdzPSLkuInop5JpY29uIiBkPSJNNzE0LjU3NSA1NDIuMzM2bC0xODYuMzQ0LTIyNS41NjdjLTguODUtMTAuNzk3LTIzLjYxMy0xMC43OTctMzIuNDYzIDBsLTE4Ni4zNDQgMjI1LjU2N2MtMTMuOTM2IDE2Ljc4NS0zLjY5MSA0NS4wMDMgMTYuMjk5IDQ1LjAwM2gzNzIuNTU2YzE5Ljk5MiAwIDMwLjIzOC0yOC4yMTYgMTYuMjk5LTQ1LjAwM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQyOyIgZ2x5cGgtbmFtZT0iZXllIiBkYXRhLXRhZ3M9IumakOiXj2ljb24iIGQ9Ik02NCA0NDEuODU2YzAgMCAzOTguNzg0IDU4OS44MjQgODk2IDAtNDk3LjIxNi01NjIuMTc2LTg5NiAwLTg5NiAwek01MTIgNTc2Yy03MC42NTYgMC0xMjgtNTcuMjgtMTI4LTEyOHM1Ny4zNDQtMTI4IDEyOC0xMjhjNzAuNjU2IDAgMTI4IDU3LjI4IDEyOCAxMjhzLTU3LjM0NCAxMjgtMTI4IDEyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQzOyIgZ2x5cGgtbmFtZT0iZHJvcGRvd24iIGRhdGEtdGFncz0i5LiL5ouJ5bGV5byAaWNvbiIgZD0iTTUxMiA4MzIuMDAxYzIxMi4wOTYgMCAzODQtMTcxLjkwNCAzODQtMzg0cy0xNzEuOTA0LTM4NC0zODQtMzg0Yy0yMTIuMDk2IDAtMzg0IDE3MS45MDQtMzg0IDM4NHMxNzEuOTA0IDM4NCAzODQgMzg0ek0zMzMuMTg0IDQxNy43OTNsMTQ2LjYyNC0xMTguNzJjOC44OTYtNy4yMzIgMjAuNTQ0LTEwLjgxNiAzMi4xOTItMTAuNzUyIDExLjY0OC0wLjA2NCAyMy4zNiAzLjUyIDMyLjI1NiAxMC43NTJsMTQ2LjQ5NiAxMTguNzJjMTcuNjY0IDE0LjMzNiAxNy42NjQgMzcuNTA0IDAgNTEuODQtMTcuNjY0IDE0LjI3Mi00Ni4yNzIgMTQuMjcyLTYzLjg3MiAwbC0xMTQuODgtOTMuMDU2LTExNC44MTYgOTMuMDU2Yy0xNy42NjQgMTQuMjcyLTQ2LjMzNiAxNC4yNzItNjQgMC0xNy42LTE0LjMzNi0xNy42LTM3LjUwNCAwLTUxLjg0djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0NDsiIGdseXBoLW5hbWU9ImNhZCIgZGF0YS10YWdzPSJjYWQiIGQ9Ik02OC4yNjcgNTUwLjR2LTY4LjI2N2gyMDQuOHY2OC4yNjdoLTIwNC44ek03NTAuOTMzIDU1MC40di02OC4yNjdoMTM2LjUzM3Y2OC4yNjdoLTEzNi41MzN6TTQwOS42IDQxMy44Njd2LTY4LjI2N2gxMzYuNTMzdjY4LjI2N2gtMTM2LjUzM3pNNDA5LjYgNTUwLjR2LTY4LjI2N2gxMzYuNTMzdjY4LjI2N2gtMTM2LjUzM3pNNjguMjY3IDM0NS42di02OC4yNjdoMjA0Ljh2NjguMjY3aC0yMDQuOHpNNzUwLjkzMyAzNDUuNnYtNjguMjY3aDEzNi41MzN2NjguMjY3aC0xMzYuNTMzek02OC4yNjcgNDgyLjEzM2g2OC4yNjd2LTEzNi41MzNoLTY4LjI2N3YxMzYuNTMzek0zNDEuMzMzIDQ4Mi4xMzNoNjguMjY3di0yMDQuOGgtNjguMjY3djIwNC44ek01NDYuMTMzIDQ4Mi4xMzNoNjguMjY3di0yMDQuOGgtNjguMjY3djIwNC44ek02ODIuNjY3IDU1MC40aDY4LjI2N3YtMjczLjA2N2gtNjguMjY3djI3My4wNjd6TTg4Ny40NjcgNDgyLjEzM2g2OC4yNjd2LTEzNi41MzNoLTY4LjI2N3YxMzYuNTMzek02OC4yNjcgODIzLjQ2N2g4ODcuNDY3di02OC4yNjdoLTg4Ny40Njd2NjguMjY3ek02OC4yNjcgMTQwLjhoODg3LjQ2N3YtNjguMjY3aC04ODcuNDY3djY4LjI2N3pNNjguMjY3IDc1NS4yaDY4LjI2N3YtMTM2LjUzM2gtNjguMjY3djEzNi41MzN6TTg4Ny40NjcgNzU1LjJoNjguMjY3di0xMzYuNTMzaC02OC4yNjd2MTM2LjUzM3pNODg3LjQ2NyAyMDkuMDY3aDY4LjI2N3YtNjguMjY3aC02OC4yNjd2NjguMjY3ek02OC4yNjcgMjA5LjA2N2g2OC4yNjd2LTY4LjI2N2gtNjguMjY3djY4LjI2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ1OyIgZ2x5cGgtbmFtZT0iZ3JpZCIgZGF0YS10YWdzPSLmoIXmoLwiIGQ9Ik0yMDQuOCA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek0yMDQuOCAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek0yMDQuOCAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiAxNzQuOTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek00MDkuNiAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiA1ODQuNTMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek02MTQuNCAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3ek04MTkuMiAzNzkuNzMzYy0zNy42ODMgMC02OC4yNjcgMzAuNTgzLTY4LjI2NyA2OC4yNjdzMzAuNTgzIDY4LjI2NyA2OC4yNjcgNjguMjY3YzM3LjY4MyAwIDY4LjI2Ny0zMC41ODMgNjguMjY3LTY4LjI2N3MtMzAuNTgzLTY4LjI2Ny02OC4yNjctNjguMjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NDY7IiBnbHlwaC1uYW1lPSJpbWFnZSIgZGF0YS10YWdzPSLlvbHlg48iIGQ9Ik0yMDQuOCAyMDkuMDY3bDEzNi41MzMgMzQxLjMzMyAxNzAuNjY3LTI3My4wNjcgMTAyLjQgMjA0LjggMjA0LjgtMjczLjA2N2gtNjE0LjR6TTY4Mi42NjcgNTUwLjRjLTM3LjY4MyAwLTY4LjI2NyAzMC41ODMtNjguMjY3IDY4LjI2N3MzMC41ODMgNjguMjY3IDY4LjI2NyA2OC4yNjdjMzcuNjgzIDAgNjguMjY3LTMwLjU4MyA2OC4yNjctNjguMjY3cy0zMC41ODMtNjguMjY3LTY4LjI2Ny02OC4yNjd6TTY4LjI2NyA4MjMuNDY3aDg4Ny40Njd2LTY4LjI2N2gtODg3LjQ2N3Y2OC4yNjd6TTY4LjI2NyAxNDAuOGg4ODcuNDY3di02OC4yNjdoLTg4Ny40Njd2NjguMjY3ek04ODcuNDY3IDc1NS4yaDY4LjI2N3YtNjE0LjRoLTY4LjI2N3Y2MTQuNHpNNjguMjY3IDc1NS4yaDY4LjI2N3YtNjE0LjRoLTY4LjI2N3Y2MTQuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ3OyIgZ2x5cGgtbmFtZT0ibGF5ZXJTdHlsZSIgZGF0YS10YWdzPSLlm77lsYLmoLflvI8iIGhvcml6LWFkdi14PSIxMjQyIiBkPSJNOTc4Ljc4OSA1NjBsLTQxMC44OC0xNzYtNDQ4IDE5MiAzNy4xMiAxNiA0MTAuODggMTc2IDQ0OC0xOTJ6TTI2OS4wMjkgNTc2bDI5OC44OC0xMjggMjk4Ljg4IDEyOC0yOTguODggMTI4ek05NDEuMDI2IDQ4MGw3NC44OC0zMi00NDgtMTkyLTQ0OCAxOTIgNzQuODggMzIgMzczLjEyLTE2MCAzNzMuMTIgMTYwek05NDEuMDI2IDM1Mmw3NC44OC0zMi00NDgtMTkyLTQ0OCAxOTIgNzQuODggMzIgMzczLjEyLTE2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTQ4OyIgZ2x5cGgtbmFtZT0ic2VhcmNoLXRoaW4iIGRhdGEtdGFncz0i5pCc57SiLee7huagt+W8jyIgZD0iTTQ3MC4xMTggODMyLjc4OGMtMTg5LjM4MiAwLTM0Mi45MDYtMTUzLjUyMy0zNDIuOTA2LTM0Mi45MDZzMTUzLjUyMy0zNDIuOTA2IDM0Mi45MDYtMzQyLjkwNmMxODkuMzgyIDAgMzQyLjkwNiAxNTMuNTIzIDM0Mi45MDYgMzQyLjkwNnMtMTUzLjUyMyAzNDIuOTA2LTM0Mi45MDYgMzQyLjkwNnpNNDcwLjExOCAyNDQuOTUxYy0xMzUuMjc0IDAtMjQ0LjkzMSAxMDkuNjYxLTI0NC45MzEgMjQ0LjkzMXMxMDkuNjYxIDI0NC45MzEgMjQ0LjkzMSAyNDQuOTMxYzEzNS4yNzQgMCAyNDQuOTMxLTEwOS42NjEgMjQ0LjkzMS0yNDQuOTMxcy0xMDkuNjYxLTI0NC45MzEtMjQ0LjkzMS0yNDQuOTMxek03NDMuOTgyIDIxNi4xMjZjMTkuMTMxIDE5LjEzMSA1MC4xNDYgMTkuMTMxIDY5LjI3NiAwbDY5LjI3Ni02OS4yNzZjMTkuMTMxLTE5LjEzMSAxOS4xMzEtNTAuMTQ2IDAtNjkuMjc2cy01MC4xNDYtMTkuMTMxLTY5LjI3NiAwbC02OS4yNzYgNjkuMjc2Yy0xOS4xMzEgMTkuMTMxLTE5LjEzMSA1MC4xNDYgMCA2OS4yNzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0OTsiIGdseXBoLW5hbWU9InBsYXkiIGRhdGEtdGFncz0i5pKt5pS+IiBkPSJNNTEyIDg5NmMtMjQ3LjQyNCAwLTQ0OC0yMDAuNTc2LTQ0OC00NDhzMjAwLjU3Ni00NDggNDQ4LTQ0OGMyNDcuNDI0IDAgNDQ4IDIwMC41NzYgNDQ4IDQ0OHMtMjAwLjU3NiA0NDgtNDQ4IDQ0OHpNNTEyIDY0LjAwMWMtMjEyLjA3OCAwLTM4My45OTkgMTcxLjkyMy0zODMuOTk5IDM4My45OTlzMTcxLjkyMyAzODMuOTk5IDM4My45OTkgMzgzLjk5OWMyMTIuMDc4IDAgMzgzLjk5OS0xNzEuOTIzIDM4My45OTktMzgzLjk5OXMtMTcxLjkyMy0zODMuOTk5LTM4My45OTktMzgzLjk5OXpNNTAzLjA0MCAzMDUuMjc5bC03Ni4xNi00NS40MzljLTE5Ljg0LTEyLjE1OS00Mi44OCA1LjExOS00Mi44OCAzMS45OTl2MzEyLjMxOWMwIDI2LjI0MSAyMy4wMzkgNDMuNTE5IDQyLjg4IDMxLjk5OWw3Ni4xNi00NS40MzkgMTg0LjMxOS0xMTAuNzE5YzEwLjEzNy03LjE0OSAxNi42NzctMTguODExIDE2LjY3Ny0zMS45OTlzLTYuNTQtMjQuODUtMTYuNTU1LTMxLjkxN3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRhOyIgZ2x5cGgtbmFtZT0icGF1c2UiIGRhdGEtdGFncz0i5pqC5YGcIiBkPSJNNTEyIDg5NmMtMjQ3LjQyNCAwLTQ0OC0yMDAuNTc2LTQ0OC00NDhzMjAwLjU3Ni00NDggNDQ4LTQ0OGMyNDcuNDI0IDAgNDQ4IDIwMC41NzYgNDQ4IDQ0OHMtMjAwLjU3NiA0NDgtNDQ4IDQ0OHpNNTEyIDY0LjAwMWMtMjEyLjA3OCAwLTM4My45OTkgMTcxLjkyMy0zODMuOTk5IDM4My45OTlzMTcxLjkyMyAzODMuOTk5IDM4My45OTkgMzgzLjk5OWMyMTIuMDc4IDAgMzgzLjk5OS0xNzEuOTIzIDM4My45OTktMzgzLjk5OXMtMTcxLjkyMy0zODMuOTk5LTM4My45OTktMzgzLjk5OXpNNDE2IDYwNy45OTljMTcuNjc0IDAgMzEuOTk5LTE0LjMyOCAzMS45OTktMzEuOTk5di0yNTUuOTk5YzAtMTcuNjc0LTE0LjMyOC0zMS45OTktMzEuOTk5LTMxLjk5OXMtMzEuOTk5IDE0LjMyOC0zMS45OTkgMzEuOTk5djI1NS45OTljMCAxNy42NzQgMTQuMzI4IDMxLjk5OSAzMS45OTkgMzEuOTk5ek02MDggNjA3Ljk5OWMxNy42NzQgMCAzMS45OTktMTQuMzI4IDMxLjk5OS0zMS45OTl2LTI1NS45OTljMC0xNy42NzQtMTQuMzI4LTMxLjk5OS0zMS45OTktMzEuOTk5cy0zMS45OTkgMTQuMzI4LTMxLjk5OSAzMS45OTl2MjU1Ljk5OWMwIDE3LjY3NCAxNC4zMjggMzEuOTk5IDMxLjk5OSAzMS45OTl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0YjsiIGdseXBoLW5hbWU9ImNvcHkiIGRhdGEtdGFncz0i5aSN5Yi2IiBob3Jpei1hZHYteD0iOTM5IiBkPSJNNzcyLjIyMSAyMjRoLTEwNy44djM5MmMwIDYxLjg1Ny00OC4yNjQgMTEyLTEwNy44IDExMmgtMjE1LjZ2NTZjMCA2MS44NTcgNDguMjY0IDExMiAxMDcuOCAxMTJoMzIzLjRjNTkuNTM0IDAgMTA3LjgtNTAuMTQzIDEwNy44LTExMnYtNDQ4YzAtNjEuODU3LTQ4LjI2NC0xMTItMTA3LjgtMTEyek01OTcuNjg4IDU2MHYtNDQ4YzAtNjEuODU3LTQ4LjI2NC0xMTItMTA3LjgtMTEyaC0zMjMuNGMtNTkuNTM2IDAtMTA3LjggNTAuMTQzLTEwNy44IDExMnY0NDhjMCA2MS44NTcgNDguMjY0IDExMiAxMDcuOCAxMTJoMzIzLjRjNTkuNTM2IDAgMTA3LjgtNTAuMTQzIDEwNy44LTExMnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NGM7IiBnbHlwaC1uYW1lPSJ6b25lIiBkYXRhLXRhZ3M9IuepuumXtCIgZD0iTTY1MS4wOTYgMzgzLjM3bC0wLjEwNCAwLjYxMmMtMS44ODQgMTAuOTY4IDMuMDcxIDI2LjI5OCAxMS4wODMgMzQuMTFsMTA2LjU1MiAxMDMuODYyYzcuOTcgNy43NjggNS41MzIgMTUuNDQ3LTUuNTQxIDE3LjA1NmwtMTQ3LjI1MiAyMS4zOThjLTExLjAxMyAxLjYwMS0yNC4wNjQgMTEuMDQ4LTI5LjAxNCAyMS4wODFsLTY1Ljg1MyAxMzMuNDMyYy00LjkyNSA5Ljk4LTEyLjk4MSAxMC4wMzQtMTcuOTMzIDBsLTY1Ljg1My0xMzMuNDMyYy00LjkyNS05Ljk4LTE3Ljk0My0xOS40NzItMjkuMDE0LTIxLjA4MWwtMTQ3LjI1Mi0yMS4zOThjLTExLjAxMy0xLjYwMS0xMy41NTUtOS4yNDgtNS41NDEtMTcuMDU2bDEwNi41NTItMTAzLjg2MmM3Ljk3LTcuNzY4IDEyLjk3NC0yMy4wODIgMTEuMDgzLTM0LjExbC0yNS4xNTMtMTQ2LjY1OGMtMS44ODItMTAuOTcgNC42MDQtMTUuNzQ3IDE0LjUwOS0xMC41NDFsMTMxLjcwNCA2OS4yNDJjOS44NSA1LjE3OSAyNS45NjIgNS4yMDcgMzUuODY2IDBsMTMxLjcwNi02OS4yNDJjOS44NDgtNS4xNzkgMTYuNC0wLjQ4NyAxNC41MDkgMTAuNTQxbC0yMS41MTYgMTI1LjQ1YzguOTczIDIuOTY4IDE5LjI3IDguMzI0IDI5LjEwNyAxNC40OTNsLTEyLjEzLTIuNzA0Yy00NC4yMjItNy40ODktOTYuNTMyLTExLjg4OC0xNDUuODA0LTExLjg4OC0yMy40OTggMC00Ni4xMDMgMC45MzctNjcuNzcgMi4yODEtMTkuMDIwIDEuMzQ0LTM3LjU1MSAzLjEzNi01NC42OTcgNS40MTctNi4zMTMgMC44OTYgMC40NDggNS40MTcgMC40NDggNS40MTdsMTY4LjEyMiAxMTkuMzI4YzAgMCA0LjUyMSAyLjcyOSAwIDMuMTM2LTY5LjE1MiAxMC44NzQtMTQ1LjU1OSAxMy41NjItMjE3LjQwMiAxMy41NjJoLTUuNDE3YzQ4Ljc5MSAxMS4zMjIgMTA5LjgwMSAxNy42MzQgMTc2LjI2OCAxNy42MzQgMzkuMzQzIDAgNzYuMzYyLTIuMjgxIDExMC43MzctNi4zMTMgMCAwIDE5LjQyNC0yLjcyOSAyOC40Ny00LjA3MyA3LjI0OS0wLjg5NiAwLjQ0OC01LjQ1NyAwLjQ0OC01LjQ1N2wtMTY4LjU3LTExNi41NjFjMCAwLTQuMTEzLTIuMjgxIDAuNDQ4LTMuMTc3IDQ2LjMyOS02LjQ2MiAxMDIuMDEwLTkuMzAxIDE1NC4yMDgtMTAuNTA0ek01MTIgMGMtMjQ3LjQyNCAwLTQ0OCAyMDAuNTc2LTQ0OCA0NDhzMjAwLjU3NiA0NDggNDQ4IDQ0OGMyNDcuNDI0IDAgNDQ4LTIwMC41NzYgNDQ4LTQ0OHMtMjAwLjU3Ni00NDgtNDQ4LTQ0OHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRkOyIgZ2x5cGgtbmFtZT0iZXhwb3J0IiBkYXRhLXRhZ3M9IuWvvOWHuiIgZD0iTTg4OC4wNTIgMzI4LjcyMmMyLjIwOS0xLjEwNCAzLjMxMi0zLjg2NSAzLjMxMi04LjI4M3MtMS4xMDQtNy4xNzktMy4zMTItOC4yODNsLTE1NS43MjItMTEyLjY1MWMtNC40MTgtMi4yMDktOC4yODMtMi43NjItMTEuNTk2LTEuNjU2cy00Ljk3MSA0LjQxOC00Ljk3MSA5LjkzOXY1My4wMTJoLTE0Mi40N2MtNy43MyAwLTExLjU5NiAzLjg2NS0xMS41OTYgMTEuNTk2djk2LjA4NWMwIDYuNjI3IDMuODY1IDkuOTM5IDExLjU5NiA5LjkzOWgxNDAuODEydjUzLjAxMmMwIDQuNDE4IDIuMjA5IDcuNzMgNi42MjcgOS45MzkgMy4zMTIgMi4yMDkgNi42MjcgMi4yMDkgOS45MzkgMGwxNTcuMzc4LTExMi42NTF6TTYzMS4yNzggMjE5LjM4NmM5LjkzOSAwIDE0LjkxLTQuOTcxIDE0LjkxLTE0Ljkxdi05Ni4wODVjMC04LjgzNi00Ljk3MS0xMy4yNTUtMTQuOTEtMTMuMjU1aC00ODMuNzM1Yy05LjkzOSAwLTE0LjkxIDQuNDE4LTE0LjkxIDEzLjI1NXY1MDAuMzAybDIyMC4zMyAyMTguNjc1aDI3OC4zMTJjOS45MzkgMCAxNC45MS00LjQxOCAxNC45MS0xMy4yNTR2LTM3OS4zNjhjMC04LjgzNi00Ljk3MS0xMy4yNTQtMTQuOTEtMTMuMjU0aC01NC42N2MtOS45MzkgMC0xNC45MSA0LjQxOC0xNC45MSAxMy4yNTR2MzA4LjEzMmgtMTc4LjkxNXYtMTQ5LjA5NWMwLTkuOTM5LTQuOTcxLTE0LjkxLTE0LjkxLTE0LjkxaC0xNTAuNzU0di0zOTkuMjQ2aDM0NC41Nzh2MjQuODQ5YzAgOS45MzkgNC45NzEgMTQuOTEgMTQuOTEgMTQuOTFoNTQuNjd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk0ZTsiIGdseXBoLW5hbWU9InFxYmxvZyIgZGF0YS10YWdzPSLohb7orq/lvq7ljZoiIGQ9Ik01MTEuOTc3IDg5NmMtMjQ3LjQwOCAwLTQ0Ny45NzctMjAwLjU0NC00NDcuOTc3LTQ0OCAwLTI0Ny40MjQgMjAwLjU3Mi00NDggNDQ3Ljk3Ny00NDggMjQ3LjQyIDAgNDQ4LjAyMyAyMDAuNTc2IDQ0OC4wMjMgNDQ4IDAgMjQ3LjQ1OS0yMDAuNjAzIDQ0OC00NDguMDIzIDQ0OHpNMzc2Ljg1NSAxNTUuOTYyaC0wLjU2Yy0xMS4wNzUgMC0yMC4xODIgOS4wMTQtMjAuNDcgMjAuMzU3LTMuNzI1IDEzNy4wNzQgNTIuNTA2IDIxNy40NDggOTMuNjM4IDI1Ny42MjItMTYuMjMyIDI3Ljk5Ni0xNS4wMjIgNjQuMzAyIDUuODE2IDkxLjQzNSAyNy4wNzAgMzUuMTIyIDc2Ljk1NCA0MS4xNjQgMTExLjM5MiAxMy41MTYgMzQuNDM0LTI3LjYxMiA0MC4zMzItNzguNTUzIDEzLjI5NC0xMTMuNzA4LTI0LjQ5Ny0zMS44My02Ny43MzYtMzkuNzI0LTEwMS4yLTIwLjQyMi0zNC44OTctMzMuNjQ4LTg1LjM2My0xMDMuODk3LTgxLjk3NC0yMjcuMjYgMC4zMjQtMTEuNTcyLTguNjI0LTIxLjIxOC0xOS45MzctMjEuNTR6TTUxNy42NjUgMjc3LjM0M2MtMTMuOTAzIDAtMjcuOSAxLjUzMi00MS4zNTQgNC41MzUtMTEuMDU3IDIuMzk4LTE4LjA1OCAxMy41NTItMTUuNjc1IDI0Ljg2NyAyLjQxMyAxMS4zMTMgMTMuMzc4IDE4LjQ0MiAyNC4zODIgMTUuOTgyIDEwLjY1OS0yLjMzNCAyMS42MjEtMy41MTYgMzIuNjQ3LTMuNTE2IDg0LjI3NCAwIDE1Mi44MSA2OS45NTkgMTUyLjgxIDE1Ni4wODkgMCA4Ni4wMzEtNjguNTAzIDE1Ni4wODktMTUyLjgxIDE1Ni4wODlzLTE1Mi44ODYtNzAuMDU3LTE1Mi44ODYtMTU2LjA4OWMwLTE3LjAzNCAyLjcxNy0zMy43NDggNy45MjItNDkuNzY0IDMuNTk3LTEwLjkzLTIuMTcyLTIyLjg1LTEyLjkxMS0yNi40OTMtMTAuNzA3LTMuNjc0LTIyLjM0IDIuMjA2LTI1LjkxOSAxMy4xMzYtNi42NDcgMjAuMjk1LTEwLjA2OCA0MS41MTgtMTAuMDY4IDYzLjExOCAwIDEwOS4wNzYgODYuOTI4IDE5Ny44OTEgMTkzLjg2MiAxOTcuODkxIDEwNi44MDMgMCAxOTMuNzk0LTg4LjgxNSAxOTMuNzk0LTE5Ny44OTEgMC4wMDMtMTA5LjE3NC04Ni45ODgtMTk3Ljk1Mi0xOTMuNzk0LTE5Ny45NTJ2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTRmOyIgZ2x5cGgtbmFtZT0ic2luYSIgZGF0YS10YWdzPSLmlrDmtarlvq7ljZoiIGQ9Ik00NjkuNDQ5IDQ3Ny42MTVjLTg1LjYyNi05LjQxNS0xNTAuODI5LTYwLjQxNS0xNDQuNTQ3LTExNS4zMzcgNS41MDEtNTQuOTIzIDgwLjEyOS05MS44MDIgMTY1Ljc1Ni04Mi4zODRzMTUwLjgyOSA2MC40MTUgMTQ0LjU0NyAxMTUuMzM3Yy01LjUwMSA1NC45MjItODAuMTI5IDkxLjgwMi0xNjUuNzU2IDgyLjM4M3pNNDY3Ljg4IDI5Ny4xNTRjLTQ0Ljc3OC0yLjM1Ni04MS42OTkgMjcuNDYxLTc4LjU1NyA2OS44MjkgMi4zNTYgNDIuMzY5IDM5LjI3OCA3NC41MzkgODMuMjcxIDc0LjUzOSA0NC43NzcgMCA3OS4zNDMtMzEuMzg0IDc3Ljc3LTcwLjYxNS0xLjU3MS0zOS4yMzEtMzcuNzA3LTcxLjM5OS04Mi40ODQtNzMuNzU0djB6TTQ3NS43MzYgMzgxLjEwOGMtMC4wMDEtMy42NDUgMS45NDUtNy4wMTMgNS4xMDYtOC44MzdzNy4wNTMtMS44MjUgMTAuMjE0IDBjMy4xNjEgMS44MjUgNS4xMDcgNS4xOTEgNS4xMDYgOC44MzcgMC4wMDEgMy42NDQtMS45NDUgNy4wMTItNS4xMDYgOC44MzZzLTcuMDUzIDEuODI1LTEwLjIxNCAwYy0zLjE2MS0xLjgyNS01LjEwNy01LjE5MS01LjEwNi04LjgzNnYwek00NDUuMDk4IDM3Ny4xODVjLTE2LjUgMC0yOS44NTItMTEuNzY5LTI5LjA2Ni0yNS4xMDkgMC0xNC4xMjQgMTIuNTctMjQuMzIzIDI3LjQ5Ni0yMi43NTQgMTQuOTI2IDAuNzg2IDI4LjI3OSAxMS43NjkgMjguMjc5IDI0LjMyNCAwLjc4NyAxMy4zNDEtOS40MjggMjQuMzIzLTI2LjcwOSAyMy41Mzl6TTUxMS44NzIgODk1LjAyOGMtMjQ3LjQ1NSAwLTQ0Ny43NzYtMjAwLjA3NS00NDcuNzc2LTQ0Ny4yMjkgMC0yNDcuMTUyIDIwMC4zMjEtNDQ3LjIyNyA0NDcuNzc2LTQ0Ny4yMjdzNDQ3Ljc3NCAyMDAuMDc1IDQ0Ny43NzQgNDQ3LjIyN2MwIDI0Ny4xNTMtMjAwLjMyMSA0NDcuMjI5LTQ0Ny43NzQgNDQ3LjIyOXpNNjQxLjQ5MSA1NTguNDI5Yy0wLjc4NiAwLTAuNzg2IDAgMCAwaC0zLjE0MmMtOC42NDIgMC0xNC45MjUgNi4yNzgtMTQuOTI1IDEzLjM0MXM1LjUwMSAxMi41NTQgMTMuMzU1IDEzLjM0MWM5OC4xOTcgNi4yNzYgNzYuOTg1LTczLjc1NCA3Ni45ODUtNzMuNzU0LTAuNzg3LTUuNDkzLTYuMjg0LTkuNDE1LTExLjc4NS05LjQxNS03LjA3MCAwLTExLjc4NCA1LjQ5Mi0xMS43ODQgMTIuNTU0IDAgMS41NyAwIDMuMTM5IDAuNzg3IDQuNzA3IDAuNzg2IDQ3LjA3OS00MC44NSA0MS41ODQtNDkuNDkyIDM5LjIzMXpNNzE2LjEyMSAzOTEuMzA4YzAtMTEuNzY5LTAuNzg3LTUyLjU2OS03Ni45ODUtMTAzLjU2Ny0xMTAuNzY3LTY3LjQ3Ny0yOTkuMjk5LTQzLjkzOC0zNTEuMTUyIDYwLjQxNS01LjUwMSAxMi41NTUtMTYuNSA0Ny44NTkgMCA4Ny4wOTIgOS40MjggMjQuMzIzIDgxLjY5OSAxMTIuOTg1IDEwMy42OTUgMTIzLjk2OCAxOC44NTQgMTkuNjE0IDc5LjM0MyA0Ny4wNzkgMTA2Ljg0IDQwLjAxNnMzMy43NzktMzcuNjYyIDI2LjcwOS02MC40MTVjLTQuNzE0LTE0LjEyNCA1LjUwMS0yMC4zOTkgMTMuMzU1LTE2LjQ3OCA3LjA3MCAxLjU3IDEwLjIxMyA5LjQxNiAzMy43OCAxNi40NzggMzAuNjM3IDUuNDkyIDQ1LjU2MyA3Ljg0NiA2OS45MTMtMTAuMiAyNS4xMzgtMTcuMjYxIDYuMjgxLTUzLjM1NCA2LjI4MS01My4zNTRzLTcuMDcwLTEwLjk4NSAzLjE0My0xMy4zNDFjNjkuOTEzLTIzLjUzOSA2NC40MTctNTguODQ0IDY0LjQxNy03MC42MTJ6TTc4OC4zOTUgNDk2LjQ0NmMtMi4zNTYtOS40MTUtMTAuOTk4LTE1LjY5MS0yMC40MjctMTUuNjkxLTEwLjk5OCAwLjc4NC0xOS42NCAxMC4xOTktMTkuNjQgMjEuMTg0IDAgMi4zNTYgMC43ODcgMy45MjIgMS41NzEgNi4yNzYgMTUuNzEyIDExOC40NzctMTAyLjkxIDExMS40MTUtMTAyLjkxIDExMS40MTVoLTMuMTQzYy0xMC45OTcgMC43ODYtMTguODU0IDEwLjItMTguODU0IDIxLjE4NCAwLjc4NyAxMC4yIDcuODU3IDE4LjA0NyAxNy4yOCAxOC44MzFoNC43MTRjMTc2Ljc1My0xMC4yIDE0MS40MDItMTYzLjIgMTQxLjQwMi0xNjMuMnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTA7IiBnbHlwaC1uYW1lPSJydWxlciIgZGF0YS10YWdzPSLmoIflsLoiIGQ9Ik0xMjAgNjgzLjJoNzg0di00MTguMTMzaC03ODR2NDE4LjEzM3pNMjI0LjUzMyA1NzguNjY3di0yMDkuMDY3aDU3NC45MzN2MjA5LjA2N2gtNTc0LjkzM3pNMzI5LjA2NyA1NzguNjY3aDUyLjI2N3YtMTA0LjUzM2gtNTIuMjY3djEwNC41MzN6TTQzMy42IDU3OC42NjdoNTIuMjY3di0xNTYuOGgtNTIuMjY3djE1Ni44ek01MzguMTMzIDU3OC42NjdoNTIuMjY3di0xMDQuNTMzaC01Mi4yNjd2MTA0LjUzM3pNNjQyLjY2NyA1NzguNjY3aDUyLjI2N3YtMTU2LjhoLTUyLjI2N3YxNTYuOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTUxOyIgZ2x5cGgtbmFtZT0iZmllbGQiIGRhdGEtdGFncz0i5a2X5q61aWNvbiIgaG9yaXotYWR2LXg9IjEyMjkiIGQ9Ik0xOTIuMDMwIDgwMGg4NDQuOHYtMTQwLjhoLTg0NC44djE0MC44ek01NDQuMDMwIDY1OS4yaDE0MC44di01NjMuMmgtMTQwLjh2NTYzLjJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1MjsiIGdseXBoLW5hbWU9Im1lbnUiIGRhdGEtdGFncz0i6I+c5Y2VIiBob3Jpei1hZHYteD0iMTQzNCIgZD0iTTU1MC40MzggODY0aDc0OC44di0xNjYuNGgtNzQ4Ljh2MTY2LjR6TTU1MC40MzggNTMxLjJoNzQ4Ljh2LTE2Ni40aC03NDguOHYxNjYuNHpNNTUwLjQzOCAxOTguNGg3NDguOHYtMTY2LjRoLTc0OC44djE2Ni40ek0xMzQuNDM4IDg2NGgyNDkuNnYtMTY2LjRoLTI0OS42djE2Ni40ek0xMzQuNDM4IDUzMS4yaDI0OS42di0xNjYuNGgtMjQ5LjZ2MTY2LjR6TTEzNC40MzggMTk4LjRoMjQ5LjZ2LTE2Ni40aC0yNDkuNnYxNjYuNHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTUzOyIgZ2x5cGgtbmFtZT0icmVuYW1lIiBkYXRhLXRhZ3M9IlIiIGhvcml6LWFkdi14PSI4NjYiIGQ9Ik04MC4yMDkgODMyLjY0N2gzODkuNjk0Yzc4Ljg2OCAwIDE0MC41MjktMTkuMzMgMTg0Ljk4OS01Ny45OXM2Ni42ODktOTEuNjI1IDY2LjY4OS0xNTguODk0YzAtNTAuMjU5LTExLjQwNS05NC4zMzEtMzQuMjE1LTEzMi4yMThzLTU5LjM0NC02My43ODktMTA5LjYwMS03Ny43MDZ2LTIuMzJjMjMuOTctNC42MzkgNDMuNDkzLTEyLjM3MSA1OC41NjktMjMuMTk2czI3LjA2Mi0yMy43NzYgMzUuOTUzLTM4Ljg1M2M4Ljg5Mi0xNS4wNzggMTUuNDY0LTMxLjg5NSAxOS43MTYtNTAuNDUyczcuNTM4LTM3Ljg4NyA5Ljg1OC01Ny45OWMxLjU0Ni0yMC4xMDMgMi43MDctNDAuNTk0IDMuNDc5LTYxLjQ2OXMyLjcwNi00MS4zNjYgNS43OTktNjEuNDY5YzMuMDkzLTIwLjEwMyA3LjUzOC0zOS4yMzkgMTMuMzM3LTU3LjQxczE0LjQ5OC0zNC4yMTUgMjYuMDk1LTQ4LjEzMmgtMTIyLjk0Yy03LjczMSA4LjUwNi0xMi45NTEgMjAuMTAzLTE1LjY1OCAzNC43OTRzLTQuNDQ1IDMxLjEyMi01LjIyIDQ5LjI5MmMtMC43NzMgMTguMTcxLTEuNTQ2IDM3LjY5NC0yLjMyIDU4LjU2OXMtMy4wOTMgNDEuMzY2LTYuOTU4IDYxLjQ2OWMtMy4wOTMgMjAuMTAzLTYuOTU4IDM5LjIzOS0xMS41OTkgNTcuNDFzLTExLjk4NSAzNC4wMjItMjIuMDM2IDQ3LjU1MmMtMTAuMDUxIDEzLjUzMS0yMy4xOTUgMjQuMzU3LTM5LjQzMyAzMi40NzRzLTM3Ljg4NyAxMi4xNzgtNjQuOTQ4IDEyLjE3OGgtMjY5LjA3NXYtMzUzLjc0aC0xMTAuMTgydjgyOC4xMDF6TTQyMC4wMzIgNDUxLjA3MWMyNS41MTYgMCA0OS44NzIgMS45MzQgNzMuMDY4IDUuNzk5czQzLjQ5MyAxMS40MDYgNjAuODkgMjIuNjE2YzE3LjM5NyAxMS4yMTIgMzEuMzE1IDI2LjI4OCA0MS43NTMgNDUuMjMyczE1LjY1OCA0My40OTMgMTUuNjU4IDczLjY0N2MwIDQxLjc1My0xMS41OTkgNzUuNzc0LTM0Ljc5NCAxMDIuMDYzcy02MC42OTYgMzkuNDMzLTExMi41IDM5LjQzM2gtMjczLjcxNHYtMjg4Ljc5MmgyMjkuNjQxeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTQ7IiBnbHlwaC1uYW1lPSJtYXBzIiBkYXRhLXRhZ3M9IuaIkeeahOWcsOWbviIgaG9yaXotYWR2LXg9IjExNjEiIGQ9Ik0zNDEuMzMzIDgyMy40NjdsLTI3Ny45MzEgMTExLjE3MmMtMzUuMDE2IDE0LjAwNi02My40MDItNS4xODgtNjMuNDAyLTQyLjgwNHYtNzUxLjEzOGMwLTM3LjY0NiAyNy45MzMtNzkuMzM4IDYzLjQwMi05My41MjVsMjc3LjkzMS0xMTEuMTcydjg4Ny40Njd6TTQwOS42LTY0bDMzOS4wNDggMTM0LjM3MXY4ODkuNjI5bC0zMzkuMDQ4LTEzNi41MzN2LTg4Ny40Njd6TTgxOS4yIDcyLjUzM2wyNzcuOTMxLTExMS4xNzJjMzUuMDE2LTE0LjAwNiA2My40MDIgNS4xODggNjMuNDAyIDQyLjgwNHY3NTEuMTM4YzAgMzcuNjQ2LTI3LjkzMyA3OS4zMzgtNjMuNDAyIDkzLjUyNWwtMjc3LjkzMSAxMTEuMTcydi04ODcuNDY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTU7IiBnbHlwaC1uYW1lPSJuZXciIGRhdGEtdGFncz0i5Yib5bu6IiBkPSJNNTEyIDk2MGMtMjgyLjc3IDAtNTEyLTIyOS4yMy01MTItNTEyczIyOS4yMy01MTIgNTEyLTUxMmMyODIuNzcgMCA1MTIgMjI5LjIzIDUxMiA1MTJzLTIyOS4yMyA1MTItNTEyIDUxMnpNNDU1LjExMSAxNjMuNTU2djIyNy41NTZoLTIyNy41NTZjMCAwLTU2Ljg4OSAwLTU2Ljg4OSA1Ni44ODlzNTYuODg5IDU2Ljg4OSA1Ni44ODkgNTYuODg5aDIyNy41NTZ2MjI3LjU1NmMwIDAgMCA1Ni44ODkgNTYuODg5IDU2Ljg4OXM1Ni44ODktNTYuODg5IDU2Ljg4OS01Ni44ODl2LTIyNy41NTZoMjI3LjU1NmMyNi42NCAwLjA4MCA1Ni44ODktMjguNDQ0IDU2Ljg4OS01Ni44ODlzLTMwLjMyLTU2LjgwOS01Ni44ODktNTYuODg5aC0yMjcuNTU2di0yMjcuNTU2YzAgMCAwLTU2Ljg4OS01Ni44ODktNTYuODg5cy01Ni44ODkgNTYuODg5LTU2Ljg4OSA1Ni44ODl6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1NjsiIGdseXBoLW5hbWU9ImZlZWRiYWNrIiBkYXRhLXRhZ3M9IuWPjemmiCIgaG9yaXotYWR2LXg9IjExNTIiIGQ9Ik0xMjggOTYwYy02My42MjcgMC0xMjgtNjUuMTU4LTEyOC0xMjh2LTU3NmMwLTYyLjgzOCA2NC4zNzMtMTI4IDEyOC0xMjhoNjR2LTE5MmwxOTIgMTkyaDY0MGM2My42MjEgMCAxMjggNjUuMTYyIDEyOCAxMjh2NTc2YzAgNjIuODQyLTY0LjM3OSAxMjgtMTI4IDEyOHpNODQyLjY2NyAzODRoLTUzMy4zMzNjMCAwLTUzLjMzMyAwLTUzLjMzMyA2NHM1My4zMzMgNjQgNTMuMzMzIDY0aDUzMy4zMzNjMCAwIDUzLjMzMyAwIDUzLjMzMy02NHMtNTMuMzMzLTY0LTUzLjMzMy02NHpNMzA5LjMzMyA2NDBjMCAwLTUzLjMzMyAwLTUzLjMzMyA2NHM1My4zMzMgNjQgNTMuMzMzIDY0aDUzMy4zMzNjMCAwIDUzLjMzMyAwIDUzLjMzMy02NHMtNTMuMzMzLTY0LTUzLjMzMy02NGgtNTMzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTU3OyIgZ2x5cGgtbmFtZT0iaG9tZXBhZ2UiIGRhdGEtdGFncz0i6aaW6aG1IiBob3Jpei1hZHYteD0iOTY3IiBkPSJNMTIuODQ1IDUxMS43OThjLTIyLjE4OC0yMi4xODgtMTQuOTkzLTQwLjE3NiAxNi42NTQtNDAuMTc2aDExMy44Mzd2LTQ1NC4yMWMwLTMxLjI3IDI1LjIyMi01Ni42MiA1Ny40MjItNTYuNjJoMTEyLjcxMmMzMS43MTMgMCA1Ny40MjIgMjUuNTY4IDU3LjQyMiA1Ni45MzZ2MjI2LjI5MmMwIDMxLjQ0NSAyNS4yMjIgNTYuOTM2IDU3LjQyMiA1Ni45MzZoMTEyLjcxMmMzMS43MTMgMCA1Ny40MjItMjUuNTY4IDU3LjQyMi01Ni45MzZ2LTIyNi4yOTJjMC0zMS40NDUgMjUuMjIyLTU3LjA2NSA1Ny40MjItNTcuMjMxbDExMi43MTItMC41OGMzMS43MTMtMC4xNjMgNTcuNDIyIDI1LjA5NSA1Ny40MjIgNTYuNDU0djQ1NS4yNTFoMTEzLjgzN2MzMS4zODYgMCAzOC42MDcgMTguMjIyIDE2LjY1NCA0MC4xNzZsLTQzMS42NDggNDMxLjY0OGMtMjIuMTg4IDIyLjE4OC01OC4zOTggMjEuOTUzLTgwLjM1MiAwbC00MzEuNjQ4LTQzMS42NDh6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1ODsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9iZWVuaGVyZSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fYmVlbmhlcmUiIGQ9Ik04MTAuNjY3IDkxNy4zMzNoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTU1MS42OGMwLTI5LjQ0IDE0LjkzMy01NS40NjcgMzcuNTQ3LTcwLjgyN2wzNDYuNDUzLTIzMC44MjcgMzQ2LjAyNyAyMzAuODI3YzIyLjYxMyAxNS4zNiAzNy41NDcgNDEuMzg3IDM3LjU0NyA3MC44MjdsMC40MjcgNTUxLjY4YzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTQyNi42NjcgMjc3LjMzM2wtMjEzLjMzMyAyMTMuMzMzIDYwLjE2IDYwLjE2IDE1My4xNzMtMTUyLjc0NyAzMjMuODQgMzIzLjg0IDYwLjE2LTYwLjU4Ny0zODQtMzg0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NTk7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9ucyIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9ucyIgZD0iTTkyNi4yOTMgNDc4LjI5M2wtMzg0IDM4NGMtNy42OTMgNy43MDktMTguMzMgMTIuNDc4LTMwLjA4MCAxMi40NzhzLTIyLjM4Ny00Ljc2OS0zMC4wNzktMTIuNDc3bC0zODQuMDAxLTM4NC4wMDFjLTcuNzA5LTcuNjkzLTEyLjQ3OC0xOC4zMy0xMi40NzgtMzAuMDgwczQuNzY5LTIyLjM4NyAxMi40NzctMzAuMDc5bDM4NC4wMDEtMzg0LjAwMWMxNi42NC0xNi42NCA0My41Mi0xNi42NCA2MC4xNiAwbDM4NCAzODRjNy43MDkgNy42OTMgMTIuNDc4IDE4LjMzIDEyLjQ3OCAzMC4wODBzLTQuNzY5IDIyLjM4Ny0xMi40NzcgMzAuMDc5bC0wLjAwMSAwLjAwMXpNNTk3LjMzMyAzNDEuMzMzdjEwNi42NjdoLTE3MC42Njd2LTEyOGgtODUuMzMzdjE3MC42NjdjMCAyMy40NjcgMTkuMiA0Mi42NjcgNDIuNjY3IDQyLjY2N2gyMTMuMzMzdjEwNi42NjdsMTQ5LjMzMy0xNDkuMzMzLTE0OS4zMzMtMTQ5LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTVhOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfYmlrZSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19iaWtlXzI0cHgiIGQ9Ik02ODIuNjY3IDc1NS4yYzQyLjI0IDAgNzYuOCAzNC41NiA3Ni44IDc2LjhzLTM0LjU2IDc2LjgtNzYuOCA3Ni44Yy00Mi42NjcgMC03Ni44LTM0LjU2LTc2LjgtNzYuOHMzNC4xMzMtNzYuOCA3Ni44LTc2Ljh6TTgxMC42NjcgNDQ4Yy0xMTcuNzYgMC0yMTMuMzMzLTk1LjU3My0yMTMuMzMzLTIxMy4zMzNzOTUuNTczLTIxMy4zMzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzMgOTUuNTczIDIxMy4zMzMgMjEzLjMzMy05NS41NzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzN6TTgxMC42NjcgODUuMzMzYy04Mi4zNDcgMC0xNDkuMzMzIDY2Ljk4Ny0xNDkuMzMzIDE0OS4zMzNzNjYuOTg3IDE0OS4zMzMgMTQ5LjMzMyAxNDkuMzMzIDE0OS4zMzMtNjYuOTg3IDE0OS4zMzMtMTQ5LjMzMy02Ni45ODctMTQ5LjMzMy0xNDkuMzMzLTE0OS4zMzN6TTYzMS40NjcgNTMzLjMzM2gxNzkuMnY3Ni44aC0xMzYuNTMzbC04Mi4zNDcgMTM5LjUyYy0xMi44NTggMjEuMzI1LTM1Ljg5NyAzNS4zNjctNjIuMjE1IDM1LjM2Ny0yMC4wMzQgMC0zOC4xNjgtOC4xMzctNTEuMjc3LTIxLjI4NWwtMTU3Ljg2OS0xNTcuODY5Yy0xMy42NTMtMTIuOC0yMS43Ni0zMS4xNDctMjEuNzYtNTEuMiAwLTI2Ljg4IDE0LjA4MC00OS40OTMgMzYuMjY3LTYyLjcybDE0Mi45MzMtODYuNjEzdi0yMTMuMzMzaDc2Ljh2Mjc2LjQ4bC05NiA3MS4yNTMgOTguOTg3IDk5LjQxMyA3My44MTMtMTA1LjgxM3pNMjEzLjMzMyA0NDhjLTExNy43NiAwLTIxMy4zMzMtOTUuNTczLTIxMy4zMzMtMjEzLjMzM3M5NS41NzMtMjEzLjMzMyAyMTMuMzMzLTIxMy4zMzMgMjEzLjMzMyA5NS41NzMgMjEzLjMzMyAyMTMuMzMzLTk1LjU3MyAyMTMuMzMzLTIxMy4zMzMgMjEzLjMzM3pNMjEzLjMzMyA4NS4zMzNjLTgyLjM0NyAwLTE0OS4zMzMgNjYuOTg3LTE0OS4zMzMgMTQ5LjMzM3M2Ni45ODcgMTQ5LjMzMyAxNDkuMzMzIDE0OS4zMzMgMTQ5LjMzMy02Ni45ODcgMTQ5LjMzMy0xNDkuMzMzLTY2Ljk4Ny0xNDkuMzMzLTE0OS4zMzMtMTQ5LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTViOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfYnVzIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX2J1c18yNHB4IiBkPSJNMTcwLjY2NyAyNzcuMzMzYzAtMzcuNTQ3IDE2LjY0LTcxLjI1MyA0Mi42NjctOTQuNzJ2LTc1Ljk0N2MwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDQyLjY2N2MyMy40NjcgMCA0Mi42NjcgMTkuMiA0Mi42NjcgNDIuNjY3djQyLjY2N2gzNDEuMzMzdi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y3NS45NDdjMjYuMDI3IDIzLjQ2NyA0Mi42NjcgNTcuMTczIDQyLjY2NyA5NC43MnY0MjYuNjY3YzAgMTQ5LjMzMy0xNTIuNzQ3IDE3MC42NjctMzQxLjMzMyAxNzAuNjY3cy0zNDEuMzMzLTIxLjMzMy0zNDEuMzMzLTE3MC42Njd2LTQyNi42Njd6TTMyMCAyMzQuNjY3Yy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTcwNCAyMzQuNjY3Yy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc2OCA0OTAuNjY3aC01MTJ2MjEzLjMzM2g1MTJ2LTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1YzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX2NhciIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19jYXJfMjRweCIgZD0iTTgwNy4yNTMgNzAzLjU3M2MtOC41MzMgMjUuMTczLTMyLjQyNyA0My4wOTMtNjAuNTg3IDQzLjA5M2gtNDY5LjMzM2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAyNzcuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc0Ni42NjcgMjc3LjMzM2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0ek0yMTMuMzMzIDQ5MC42NjdsNjQgMTkyaDQ2OS4zMzNsNjQtMTkyaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NWQ7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19mZXJyeSIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc19mZXJyeV8yNHB4IiBkPSJNODUzLjMzMyA2NGMtNTkuMzA3IDAtMTE4LjYxMyAyMC4wNTMtMTcwLjY2NyA1Ni4zMi0xMDQuMTA3LTcyLjk2LTIzNy4yMjctNzIuOTYtMzQxLjMzMyAwLTUyLjA1My0zNi4yNjctMTExLjM2LTU2LjMyLTE3MC42NjctNTYuMzJoLTg1LjMzM3YtODUuMzMzaDg1LjMzM2M1OC44OCAwIDExNi45MDcgMTQuOTMzIDE3MC42NjcgNDIuMjQgNDkuNTkzLTI2LjAxNiAxMDguMzQ3LTQxLjI4MyAxNzAuNjY3LTQxLjI4M3MxMjEuMDczIDE1LjI2NiAxNzIuNzI2IDQyLjI2MmwtMi4wNTktMC45OGM1My43Ni0yNy43MzMgMTExLjc4Ny00Mi4yNCAxNzAuNjY3LTQyLjI0aDg1LjMzM3Y4NS4zMzNoLTg1LjMzM3pNMTY4LjUzMyAxNDkuMzMzaDIuMTMzYzY4LjI2NyAwIDEyOC44NTMgMzcuNTQ3IDE3MC42NjcgODUuMzMzIDQxLjgxMy00Ny43ODcgMTAyLjQtODUuMzMzIDE3MC42NjctODUuMzMzczEyOC44NTMgMzcuNTQ3IDE3MC42NjcgODUuMzMzYzQxLjgxMy00Ny43ODcgMTAyLjQtODUuMzMzIDE3MC42NjctODUuMzMzaDIuMTMzbDgwLjY0IDI4NS4wMTNjMy40MTMgMTEuMDkzIDIuNTYgMjMuMDQwLTIuNTYgMzMuMjhzLTE0LjUwNyAxNy45Mi0yNS42IDIxLjMzM2wtNTQuNjEzIDE3LjkydjE5Ny4xMmMwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzaC0xMjh2MTI4aC0yNTZ2LTEyOGgtMTI4Yy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi0xOTcuMTJsLTU1LjA0MC0xNy45MmMtMTcuNzItNS41NjctMzAuMzUtMjEuODQ0LTMwLjM1LTQxLjA3MiAwLTQuODQ0IDAuODAyLTkuNSAyLjI3OS0xMy44NDRsLTAuMDg5IDAuMzAzIDgxLjA2Ny0yODUuMDEzek0yNTYgNzA0aDUxMnYtMTY5LjM4N2wtMjU2IDg0LjA1My0yNTYtODQuMDUzdjE2OS4zODd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk1ZTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3RyYWluIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3RyYWluXzI0cHgiIGQ9Ik0xNzAuNjY3IDI5OC42NjdjMC04Mi4zNDcgNjYuOTg3LTE0OS4zMzMgMTQ5LjMzMy0xNDkuMzMzbC02NC02NHYtMjEuMzMzaDUxMnYyMS4zMzNsLTY0IDY0YzgyLjM0NyAwIDE0OS4zMzMgNjYuOTg3IDE0OS4zMzMgMTQ5LjMzM3Y0NDhjMCAxNDkuMzMzLTE1Mi43NDcgMTcwLjY2Ny0zNDEuMzMzIDE3MC42NjdzLTM0MS4zMzMtMjEuMzMzLTM0MS4zMzMtMTcwLjY2N3YtNDQ4ek01MTIgMjM0LjY2N2MtNDYuOTMzIDAtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3MzOC40IDg1LjMzMyA4NS4zMzMgODUuMzMzIDg1LjMzMy0zOC40IDg1LjMzMy04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzLTg1LjMzM3pNNzY4IDUzMy4zMzNoLTUxMnYyMTMuMzMzaDUxMnYtMjEzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTVmOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2RpcmVjdGlvbnNfdHJhbnNpdCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fX2RpcmVjdGlvbnNfdHJhbnNpdCIgZD0iTTUxMiA4NzQuNjY3Yy0xODguNTg3IDAtMzQxLjMzMy0yMS4zMzMtMzQxLjMzMy0xNzAuNjY3di00MDUuMzMzYzAtODIuMzQ3IDY2Ljk4Ny0xNDkuMzMzIDE0OS4zMzMtMTQ5LjMzM2wtNjQtNjR2LTIxLjMzM2g1MTJ2MjEuMzMzbC02NCA2NGM4Mi4zNDcgMCAxNDkuMzMzIDY2Ljk4NyAxNDkuMzMzIDE0OS4zMzN2NDA1LjMzM2MwIDE0OS4zMzMtMTUyLjc0NyAxNzAuNjY3LTM0MS4zMzMgMTcwLjY2N3pNMzIwIDIzNC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNDY5LjMzMyA0OTAuNjY3aC0yMTMuMzMzdjIxMy4zMzNoMjEzLjMzM3YtMjEzLjMzM3pNNzA0IDIzNC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNzY4IDQ5MC42NjdoLTIxMy4zMzN2MjEzLjMzM2gyMTMuMzMzdi0yMTMuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NjA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fZGlyZWN0aW9uc193YWxrIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9kaXJlY3Rpb25zX3dhbGtfMjRweCIgZD0iTTU5Ny4zMzMgNzk3Ljg2N2M0Mi4zNzQgMC4wMjQgNzYuNzE1IDM0LjM4IDc2LjcxNSA3Ni43NTcgMCA0Mi4zOTItMzQuMzY1IDc2Ljc1Ny03Ni43NTcgNzYuNzU3LTQyLjM3NyAwLTc2LjczMy0zNC4zNDEtNzYuNzU3LTc2LjcxMnYtMC4wMDJjMC00Mi4yNCAzNC4xMzMtNzYuOCA3Ni44LTc2Ljh6TTYwMi40NTMgNTMzLjMzM2gyMDguMjEzdjc2LjhoLTE1NC40NTNsLTg1LjMzMyAxNDIuMDgwYy0xMi44IDIxLjMzMy0zNS44NCAzNS40MTMtNjIuMjkzIDM1LjQxMy03LjI1MyAwLTE0LjUwNy0xLjI4LTIwLjkwNy0yLjk4N2wtMjMxLjY4LTcyLjEwN3YtMjIxLjg2N2g3Ni44djE1Ni41ODdsOTAuMDI3IDI4LjE2LTE2Ni44MjctNjU0LjA4MGg3Ni44bDEyMi40NTMgMzQ2LjAyNyA5OS40MTMtMTMyLjY5M3YtMjEzLjMzM2g3Ni44djI3My40OTNsLTEwNi4yNCAxOTMuNzA3IDMxLjE0NyAxMjIuNDUzIDQ2LjA4MC03Ny42NTN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2MTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9mbGlnaHQiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2ZsaWdodF8yNHB4IiBkPSJNODk2IDI3Ny4zMzN2ODUuMzMzbC0zNDEuMzMzIDIxMy4zMzN2MjM0LjY2N2MwIDM1LjQxMy0yOC41ODcgNjQtNjQgNjRzLTY0LTI4LjU4Ny02NC02NHYtMjM0LjY2N2wtMzQxLjMzMy0yMTMuMzMzdi04NS4zMzNsMzQxLjMzMyAxMDYuNjY3di0yMzQuNjY3bC04NS4zMzMtNjR2LTY0bDE0OS4zMzMgNDIuNjY3IDE0OS4zMzMtNDIuNjY3djY0bC04NS4zMzMgNjR2MjM0LjY2N2wzNDEuMzMzLTEwNi42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2MjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9ob3RlbCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25faG90ZWxfMjRweCIgZD0iTTI5OC42NjcgNDA1LjMzM2M3MC44MjcgMCAxMjggNTcuMTczIDEyOCAxMjhzLTU3LjE3MyAxMjgtMTI4IDEyOC0xMjgtNTcuMTczLTEyOC0xMjggNTcuMTczLTEyOCAxMjgtMTI4ek04MTAuNjY3IDY2MS4zMzNoLTM0MS4zMzN2LTI5OC42NjdoLTM0MS4zMzN2Mzg0aC04NS4zMzN2LTY0MGg4NS4zMzN2MTI4aDc2OHYtMTI4aDg1LjMzM3YzODRjMCA5NC4yOTMtNzYuMzczIDE3MC42NjctMTcwLjY2NyAxNzAuNjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NjM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfYWlycG9ydCIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfYWlycG9ydF8yNHB4IiBkPSJNODk2IDI3Ny4zMzN2ODUuMzMzbC0zNDEuMzMzIDIxMy4zMzN2MjM0LjY2N2MwIDM1LjQxMy0yOC41ODcgNjQtNjQgNjRzLTY0LTI4LjU4Ny02NC02NHYtMjM0LjY2N2wtMzQxLjMzMy0yMTMuMzMzdi04NS4zMzNsMzQxLjMzMyAxMDYuNjY3di0yMzQuNjY3bC04NS4zMzMtNjR2LTY0bDE0OS4zMzMgNDIuNjY3IDE0OS4zMzMtNDIuNjY3djY0bC04NS4zMzMgNjR2MjM0LjY2N2wzNDEuMzMzLTEwNi42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2NDsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9hdG0iIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0bV8yNHB4IiBkPSJNNDY5LjMzMyAyMzQuNjY3aDg1LjMzM3Y0Mi42NjdoNDIuNjY3YzIzLjQ2NyAwIDQyLjY2NyAxOS4yIDQyLjY2NyA0Mi42Njd2MTI4YzAgMjMuNDY3LTE5LjIgNDIuNjY3LTQyLjY2NyA0Mi42NjdoLTEyOHY0Mi42NjdoMTcwLjY2N3Y4NS4zMzNoLTg1LjMzM3Y0Mi42NjdoLTg1LjMzM3YtNDIuNjY3aC00Mi42NjdjLTIzLjQ2NyAwLTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42Njd2LTEyOGMwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDEyOHYtNDIuNjY3aC0xNzAuNjY3di04NS4zMzNoODUuMzMzdi00Mi42Njd6TTg1My4zMzMgNzg5LjMzM2gtNjgyLjY2N2MtNDcuMzYgMC04NC45MDctMzcuOTczLTg0LjkwNy04NS4zMzNsLTAuNDI3LTUxMmMwLTQ3LjM2IDM3Ljk3My04NS4zMzMgODUuMzMzLTg1LjMzM2g2ODIuNjY3YzQ3LjM2IDAgODUuMzMzIDM3Ljk3MyA4NS4zMzMgODUuMzMzdjUxMmMwIDQ3LjM2LTM3Ljk3MyA4NS4zMzMtODUuMzMzIDg1LjMzM3pNODUzLjMzMyAxOTJoLTY4Mi42Njd2NTEyaDY4Mi42Njd2LTUxMnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY1OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0dHJhY3Rpb24iIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2F0dHJhY3Rpb25fMjRweCIgZD0iTTg1My4zMzMgNDQ4YzAgNDYuOTMzIDM4LjQgODUuMzMzIDg1LjMzMyA4NS4zMzN2MTcwLjY2N2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzaC02ODIuNjY3Yy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzdi0xNzAuNjY3YzQ2LjkzMyAwIDg0LjkwNy0zOC40IDg0LjkwNy04NS4zMzNzLTM3Ljk3My04NS4zMzMtODUuMzMzLTg1LjMzM3YtMTcwLjY2N2MwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDY4Mi42NjdjNDYuOTMzIDAgODUuMzMzIDM4LjQgODUuMzMzIDg1LjMzM3YxNzAuNjY3Yy00Ni45MzMgMC04NS4zMzMgMzguNC04NS4zMzMgODUuMzMzek02NjQuNzQ3IDI0My4ybC0xNTIuNzQ3IDk4LjEzMy0xNTIuNzQ3LTk4LjEzMyA0Ni4wODAgMTc1Ljc4Ny0xNDAuMzczIDExNC43NzMgMTgwLjkwNyAxMC42NjcgNjYuMTMzIDE2OC4xMDcgNjUuNzA3LTE2OC41MzMgMTgwLjkwNy0xMC42NjctMTQwLjM3My0xMTQuNzczIDQ2LjUwNy0xNzUuMzZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2NjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9iYXIiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2Jhcl8yNHB4IiBkPSJNNDY5LjMzMyA0MDUuMzMzdi0yNTZoLTIxMy4zMzN2LTg1LjMzM2g1MTJ2ODUuMzMzaC0yMTMuMzMzdjI1NmwzNDEuMzMzIDM0MS4zMzN2ODUuMzMzaC03Njh2LTg1LjMzM2wzNDEuMzMzLTM0MS4zMzN6TTMyMCA2NjEuMzMzbC04NS4zMzMgODUuMzMzaDU1NC42NjdsLTg1LjMzMy04NS4zMzNoLTM4NHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY3OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NhZmUiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NhZmVfMjRweCIgZD0iTTg1My4zMzMgODMyaC02ODIuNjY3di00MjYuNjY3YzAtOTQuMjkzIDc2LjM3My0xNzAuNjY3IDE3MC42NjctMTcwLjY2N2gyNTZjOTQuMjkzIDAgMTcwLjY2NyA3Ni4zNzMgMTcwLjY2NyAxNzAuNjY3djEyOGg4NS4zMzNjNDcuMzYgMCA4NS4zMzMgMzcuOTczIDg1LjMzMyA4NS4zMzN2MTI4YzAgNDcuMzYtMzcuOTczIDg1LjMzMy04NS4zMzMgODUuMzMzek04NTMuMzMzIDYxOC42NjdoLTg1LjMzM3YxMjhoODUuMzMzdi0xMjh6TTg1LjMzMyA2NGg3Njh2ODUuMzMzaC03Njh2LTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY4OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2Nhcl93YXNoIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9jYXJfd2FzaF8yNHB4IiBkPSJNNzI1LjMzMyA3NDYuNjY3YzM1LjQxMyAwIDY0IDI4LjU4NyA2NCA2NCAwIDQyLjY2Ny02NCAxMTUuMi02NCAxMTUuMnMtNjQtNzIuNTMzLTY0LTExNS4yYzAtMzUuNDEzIDI4LjU4Ny02NCA2NC02NHpNNTEyIDc0Ni42NjdjMzUuNDEzIDAgNjQgMjguNTg3IDY0IDY0IDAgNDIuNjY3LTY0IDExNS4yLTY0IDExNS4ycy02NC03Mi41MzMtNjQtMTE1LjJjMC0zNS40MTMgMjguNTg3LTY0IDY0LTY0ek0yOTguNjY3IDc0Ni42NjdjMzUuNDEzIDAgNjQgMjguNTg3IDY0IDY0IDAgNDIuNjY3LTY0IDExNS4yLTY0IDExNS4ycy02NC03Mi41MzMtNjQtMTE1LjJjMC0zNS40MTMgMjguNTg3LTY0IDY0LTY0ek04MDcuMjUzIDYxOC4yNGMtOC41MzMgMjUuMTczLTMyLjQyNyA0My4wOTMtNjAuNTg3IDQzLjA5M2gtNDY5LjMzM2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAxOTJjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNNzQ2LjY2NyAxOTJjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNMjEzLjMzMyA0MDUuMzMzbDY0IDE5Mmg0NjkuMzMzbDY0LTE5MmgtNTk3LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTY5OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2NvbnZlbmllbmNlX3N0b3JlIiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9jb252ZW5pZW5jZV9zdG9yZV8yNHB4IiBkPSJNODEwLjY2NyA2NjEuMzMzdjEyOGgtNTk3LjMzM3YtMTI4aC0xMjh2LTU1NC42NjdoMzQxLjMzM3YxNzAuNjY3aDE3MC42Njd2LTE3MC42NjdoMzQxLjMzM3Y1NTQuNjY3aC0xMjh6TTQ2OS4zMzMgNTMzLjMzM2gtODUuMzMzdi00Mi42NjdoODUuMzMzdi00Mi42NjdoLTEyOHYxMjhoODUuMzMzdjQyLjY2N2gtODUuMzMzdjQyLjY2N2gxMjh2LTEyOHpNNjgyLjY2NyA0NDhoLTQyLjY2N3Y4NS4zMzNoLTg1LjMzM3YxMjhoNDIuNjY3di04NS4zMzNoNDIuNjY3djg1LjMzM2g0Mi42Njd2LTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9kcmluayIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfZHJpbmtfMjRweCIgZD0iTTEyOCA4NzQuNjY3bDg1Ljc2LTc3Ny44MTNjNS4xMi00Mi42NjcgNDAuOTYtNzUuNTIgODQuOTA3LTc1LjUyaDQyNi42NjdjNDMuOTQ3IDAgNzkuNzg3IDMyLjg1MyA4NC45MDcgNzUuNTJsODUuNzYgNzc3LjgxM2gtNzY4ek01MTIgMTQ5LjMzM2MtNzAuODI3IDAtMTI4IDU3LjE3My0xMjggMTI4IDAgODUuMzMzIDEyOCAyMzAuNCAxMjggMjMwLjRzMTI4LTE0NS4wNjcgMTI4LTIzMC40YzAtNzAuODI3LTU3LjE3My0xMjgtMTI4LTEyOHpNNzgyLjA4MCA2MTguNjY3aC01NDAuMTZsLTE4Ljc3MyAxNzAuNjY3aDU3Ny4yOGwtMTguMzQ3LTE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9mbG9yaXN0IiBkYXRhLXRhZ3M9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9mbG9yaXN0XzI0cHgiIGQ9Ik01MTIgMjEuMzMzYzIxMi4wNzcgMCAzODQgMTcxLjkyMyAzODQgMzg0djBjLTIxMi4wNzcgMC0zODQtMTcxLjkyMy0zODQtMzg0djB6TTIzOC45MzMgNTIyLjY2N2MwLTAuMDMxIDAtMC4wNjcgMC0wLjEwNCAwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2NyAyMi42NTUgMCA0My42NiA3LjA2MyA2MC45MzQgMTkuMTA2bC0wLjM0OC0wLjIyOS0wLjg1My04LjEwN2MwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2N3MxMDYuNjY3IDQ3Ljc1NiAxMDYuNjY3IDEwNi42Njd2MGwtMC44NTMgOC4xMDdjMTcuMDY3LTExLjk0NyAzNy45NzMtMTguNzczIDYwLjU4Ny0xOC43NzMgNTguOTEgMCAxMDYuNjY3IDQ3Ljc1NiAxMDYuNjY3IDEwNi42Njd2MGMwIDQyLjY2Ny0yNS4xNzMgNzguOTMzLTYxLjAxMyA5NiAzNS44NCAxNy4wNjcgNjEuMDEzIDUzLjMzMyA2MS4wMTMgOTYgMCAwLjAzMSAwIDAuMDY3IDAgMC4xMDQgMCA1OC45MS00Ny43NTYgMTA2LjY2Ny0xMDYuNjY3IDEwNi42NjctMjIuNjU1IDAtNDMuNjYtNy4wNjMtNjAuOTM0LTE5LjEwNmwwLjM0OCAwLjIyOSAwLjg1MyA4LjEwN2MwIDU4LjkxLTQ3Ljc1NiAxMDYuNjY3LTEwNi42NjcgMTA2LjY2N3MtMTA2LjY2Ny00Ny43NTYtMTA2LjY2Ny0xMDYuNjY3djBsMC44NTMtOC4xMDdjLTE3LjA2NyAxMS45NDctMzcuOTczIDE4Ljc3My02MC41ODcgMTguNzczLTU4LjkxIDAtMTA2LjY2Ny00Ny43NTYtMTA2LjY2Ny0xMDYuNjY3djBjMC00Mi42NjcgMjUuMTczLTc4LjkzMyA2MS4wMTMtOTYtMzUuODQtMTcuMDY3LTYxLjAxMy01My4zMzMtNjEuMDEzLTk2ek01MTIgNzI1LjMzM2M1OC45MDYtMC4wMDYgMTA2LjY1Ni00Ny43NiAxMDYuNjU2LTEwNi42NjdzLTQ3Ljc1LTEwNi42NjEtMTA2LjY1Ni0xMDYuNjY3aC0wLjAwMWMtNTguOTA2IDAuMDA2LTEwNi42NTYgNDcuNzYtMTA2LjY1NiAxMDYuNjY3czQ3Ljc1IDEwNi42NjEgMTA2LjY1NiAxMDYuNjY3aDAuMDAxek0xMjggNDA1LjMzM2MwLTIxMi4wNzcgMTcxLjkyMy0zODQgMzg0LTM4NHYwYzAgMjEyLjA3Ny0xNzEuOTIzIDM4NC0zODQgMzg0djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2YzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9nYXNfc3RhdGlvbiIgZGF0YS10YWdzPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfZ2FzX3N0YXRpb25fMjRweCIgZD0iTTg0My41MiA2NTEuNTJsMC40MjcgMC40MjctMTU4LjcyIDE1OC43Mi00NS4yMjctNDUuMjI3IDkwLjAyNy05MC4wMjdjLTQwLjEwNy0xNS4zNi02OC42OTMtNTMuNzYtNjguNjkzLTk5LjQxMyAwLTU4LjkxIDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjctMTA2LjY2N3YwYzE1LjM2IDAgMjkuNDQgMy40MTMgNDIuNjY3IDguOTZ2LTMwNy42MjdjMC0yMy40NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2N3MtNDIuNjY3IDE5LjItNDIuNjY3IDQyLjY2N3YxOTJjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM2gtNDIuNjY3djI5OC42NjdjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM2gtMjU2Yy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi02ODIuNjY3aDQyNi42Njd2MzIwaDY0di0yMTMuMzMzYzAtNTguOTEgNDcuNzU2LTEwNi42NjcgMTA2LjY2Ny0xMDYuNjY3czEwNi42NjcgNDcuNzU2IDEwNi42NjcgMTA2LjY2N3YwIDQwNS4zMzNjMCAyOS40NC0xMS45NDcgNTYuMzItMzEuMTQ3IDc1LjUyek01MTIgNTMzLjMzM2gtMjU2djIxMy4zMzNoMjU2di0yMTMuMzMzek03NjggNTMzLjMzM2MtMjMuNDY3IDAtNDIuNjY3IDE5LjItNDIuNjY3IDQyLjY2N3MxOS4yIDQyLjY2NyA0Mi42NjcgNDIuNjY3IDQyLjY2Ny0xOS4yIDQyLjY2Ny00Mi42NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTZkOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2dyb2Nlcnlfc3RvcmUiIGRhdGEtdGFncz0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2dyb2Nlcnlfc3RvcmVfMjRweCIgZD0iTTI5OC42NjcgMTkyYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzczM3Ljk3My04NS4zMzMgODQuOTA3LTg1LjMzMyA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTQyLjY2NyA4NzQuNjY3di04NS4zMzNoODUuMzMzbDE1My42LTMyMy44NC01Ny42LTEwNC41MzNjLTYuODI3LTExLjk0Ny0xMC42NjctMjYuMDI3LTEwLjY2Ny00MC45NiAwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDUxMnY4NS4zMzNoLTQ5NC4wODBjLTUuOTczIDAtMTAuNjY3IDQuNjkzLTEwLjY2NyAxMC42NjdsMS4yOCA1LjEyIDM4LjQgNjkuNTQ3aDMxNy44NjdjMzIgMCA2MC4xNiAxNy40OTMgNzQuNjY3IDQzLjk0N2wxNTIuNzQ3IDI3Ni45MDdjMy4yNDIgNS44ODMgNS4xNDkgMTIuODk1IDUuMTQ5IDIwLjM1MiAwIDIzLjYtMTkuMTA0IDQyLjczOC00Mi42OTEgNDIuNzk1aC02MzEuMDQ1bC00MC4xMDcgODUuMzMzaC0xMzkuNTJ6TTcyNS4zMzMgMTkyYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzczM3Ljk3My04NS4zMzMgODQuOTA3LTg1LjMzMyA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk2ZTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9ob3NwaXRhbCIgZGF0YS10YWdzPSJpY19sb2NhbF9ob3NwaXRhbF8yNHB4IiBkPSJNODEwLjY2NyA4MzJoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTU5Ny4zMzNjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek03NjggMzYyLjY2N2gtMTcwLjY2N3YtMTcwLjY2N2gtMTcwLjY2N3YxNzAuNjY3aC0xNzAuNjY3djE3MC42NjdoMTcwLjY2N3YxNzAuNjY3aDE3MC42Njd2LTE3MC42NjdoMTcwLjY2N3YtMTcwLjY2N3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTZmOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX2xhdW5kcnlfc2VydmljZSIgZGF0YS10YWdzPSJpY19sb2NhbF9sYXVuZHJ5X3NlcnZpY2VfMjRweCIgZD0iTTM5MS4yNTMgMjQxLjkyYzMwLjkyOS0zMC44NDIgNzMuNjExLTQ5LjkxMyAxMjAuNzQ3LTQ5LjkxM3M4OS44MTggMTkuMDcxIDEyMC43NTEgNDkuOTE3bC0wLjAwNC0wLjAwNGMzMC44NDIgMzAuOTI5IDQ5LjkxMyA3My42MTEgNDkuOTEzIDEyMC43NDdzLTE5LjA3MSA4OS44MTgtNDkuOTE3IDEyMC43NTFsMC4wMDQtMC4wMDQtMjQxLjQ5My0yNDEuNDkzek03NjggODc0LjI0bC01MTIgMC40MjdjLTQ3LjM2IDAtODUuMzMzLTM3Ljk3My04NS4zMzMtODUuMzMzdi02ODIuNjY3YzAtNDcuMzYgMzcuOTczLTg1LjMzMyA4NS4zMzMtODUuMzMzaDUxMmM0Ny4zNiAwIDg1LjMzMyAzNy45NzMgODUuMzMzIDg1LjMzM3Y2ODIuNjY3YzAgNDcuMzYtMzcuOTczIDg0LjkwNy04NS4zMzMgODQuOTA3ek00MjYuNjY3IDc4OS4zMzNjMjMuNDY3IDAgNDIuNjY3LTE5LjIgNDIuNjY3LTQyLjY2N3MtMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2Ny00Mi42NjcgMTkuMi00Mi42NjcgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42Njd6TTI5OC42NjcgNzg5LjMzM2MyMy40NjcgMCA0Mi42NjctMTkuMiA0Mi42NjctNDIuNjY3cy0xOS4yLTQyLjY2Ny00Mi42NjctNDIuNjY3LTQyLjY2NyAxOS4yLTQyLjY2NyA0Mi42NjcgMTkuMiA0Mi42NjcgNDIuNjY3IDQyLjY2N3pNNTEyIDEwNi42NjdjLTE0MS4yMjcgMC0yNTYgMTE0Ljc3My0yNTYgMjU2czExNC43NzMgMjU2IDI1NiAyNTYgMjU2LTExNC43NzMgMjU2LTI1Ni0xMTQuNzczLTI1Ni0yNTYtMjU2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfbGlicmFyeSIgZGF0YS10YWdzPSJpY19sb2NhbF9saWJyYXJ5XzI0cHgiIGQ9Ik01MTIgNDY3LjJjLTEwMC42OTMgOTMuODY3LTIzNS41MiAxNTEuNDY3LTM4NCAxNTEuNDY3di00NjkuMzMzYzE0OC40OCAwIDI4My4zMDctNTcuNiAzODQtMTUxLjQ2NyAxMDAuNjkzIDkzLjQ0IDIzNS41MiAxNTEuNDY3IDM4NCAxNTEuNDY3djQ2OS4zMzNjLTE0OC40OCAwLTI4My4zMDctNTcuNi0zODQtMTUxLjQ2N3pNNTEyIDYxOC42NjdjNzAuODI3IDAgMTI4IDU3LjE3MyAxMjggMTI4cy01Ny4xNzMgMTI4LTEyOCAxMjgtMTI4LTU3LjE3My0xMjgtMTI4IDU3LjE3My0xMjggMTI4LTEyOHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTcxOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX21hbGwiIGRhdGEtdGFncz0iaWNfbG9jYWxfbWFsbF8yNHB4IiBkPSJNODEwLjY2NyA3MDRoLTg1LjMzM2MwIDExNy43Ni05NS41NzMgMjEzLjMzMy0yMTMuMzMzIDIxMy4zMzNzLTIxMy4zMzMtOTUuNTczLTIxMy4zMzMtMjEzLjMzM2gtODUuMzMzYy00Ni45MzMgMC04NC45MDctMzguNC04NC45MDctODUuMzMzbC0wLjQyNy01MTJjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTUxMiA4MzJjNzAuODI3IDAgMTI4LTU3LjE3MyAxMjgtMTI4aC0yNTZjMCA3MC44MjcgNTcuMTczIDEyOCAxMjggMTI4ek01MTIgNDA1LjMzM2MtMTE3Ljc2IDAtMjEzLjMzMyA5NS41NzMtMjEzLjMzMyAyMTMuMzMzaDg1LjMzM2MwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDg1LjMzM2MwLTExNy43Ni05NS41NzMtMjEzLjMzMy0yMTMuMzMzLTIxMy4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3MjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9tb3ZpZXMiIGRhdGEtdGFncz0iaWNfbG9jYWxfbW92aWVzXzI0cHgiIGQ9Ik03NjggODMydi04NS4zMzNoLTg1LjMzM3Y4NS4zMzNoLTM0MS4zMzN2LTg1LjMzM2gtODUuMzMzdjg1LjMzM2gtODUuMzMzdi03NjhoODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM2gzNDEuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM2g4NS4zMzN2NzY4aC04NS4zMzN6TTM0MS4zMzMgMjM0LjY2N2gtODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM3pNMzQxLjMzMyA0MDUuMzMzaC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzek0zNDEuMzMzIDU3NmgtODUuMzMzdjg1LjMzM2g4NS4zMzN2LTg1LjMzM3pNNzY4IDIzNC42NjdoLTg1LjMzM3Y4NS4zMzNoODUuMzMzdi04NS4zMzN6TTc2OCA0MDUuMzMzaC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzek03NjggNTc2aC04NS4zMzN2ODUuMzMzaDg1LjMzM3YtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfb2ZmZXIiIGRhdGEtdGFncz0iaWNfbG9jYWxfb2ZmZXJfMjRweCIgZD0iTTkxMy40OTMgNDY1LjkybC0zODQgMzg0Yy0xNS4zNiAxNS4zNi0zNi42OTMgMjQuNzQ3LTYwLjE2IDI0Ljc0N2gtMjk4LjY2N2MtNDYuOTMzIDAtODUuMzMzLTM4LjQtODUuMzMzLTg1LjMzM3YtMjk4LjY2N2MwLTIzLjQ2NyA5LjM4Ny00NC44IDI1LjE3My02MC41ODdsMzg0LTM4NGMxNS4zNi0xNS4zNiAzNi42OTMtMjQuNzQ3IDYwLjE2LTI0Ljc0N3M0NC44IDkuMzg3IDYwLjE2IDI1LjE3M2wyOTguNjY3IDI5OC42NjdjMTUuNzg3IDE1LjM2IDI1LjE3MyAzNi42OTMgMjUuMTczIDYwLjE2cy05LjgxMyA0NS4yMjctMjUuMTczIDYwLjU4N3pNMjM0LjY2NyA2NjEuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3NDsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9wYXJraW5nIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3BhcmtpbmdfMjRweCIgZD0iTTU1NC42NjcgODMyaC0yOTguNjY3di03NjhoMTcwLjY2N3YyNTZoMTI4YzE0MS4yMjcgMCAyNTYgMTE0Ljc3MyAyNTYgMjU2cy0xMTQuNzczIDI1Ni0yNTYgMjU2ek01NjMuMiA0OTAuNjY3aC0xMzYuNTMzdjE3MC42NjdoMTM2LjUzM2M0Ni45MzMgMCA4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzcy0zOC40LTg1LjMzMy04NS4zMzMtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzU7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfcGhhcm1hY3kiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGhhcm1hY3lfMjRweCIgZD0iTTg5NiA3NDYuNjY3aC0xMTIuNjRsNDguNjQgMTMzLjk3My0xMDAuMjY3IDM2LjY5My02Mi4yOTMtMTcwLjY2N2gtNTQxLjQ0di04NS4zMzNsODUuMzMzLTI1Ni04NS4zMzMtMjU2di04NS4zMzNoNzY4djg1LjMzM2wtODUuMzMzIDI1NiA4NS4zMzMgMjU2djg1LjMzM3pNNjgyLjY2NyAzNjIuNjY3aC0xMjh2LTEyOGgtODUuMzMzdjEyOGgtMTI4djg1LjMzM2gxMjh2MTI4aDg1LjMzM3YtMTI4aDEyOHYtODUuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5NzY7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfcGhvbmUiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGhvbmVfMjRweCIgZD0iTTI4Mi40NTMgNDk5LjYyN2M2MS40NC0xMjAuNzQ3IDE2MC40MjctMjE5LjMwNyAyODEuMTczLTI4MS4xNzNsOTMuODY3IDkzLjg2N2MxMS41MiAxMS41MiAyOC41ODcgMTUuMzYgNDMuNTIgMTAuMjQgNDcuNzg3LTE1Ljc4NyA5OS40MTMtMjQuMzIgMTUyLjMyLTI0LjMyIDIzLjQ2NyAwIDQyLjY2Ny0xOS4yIDQyLjY2Ny00Mi42Njd2LTE0OC45MDdjMC0yMy40NjctMTkuMi00Mi42NjctNDIuNjY3LTQyLjY2Ny00MDAuNjQgMC03MjUuMzMzIDMyNC42OTMtNzI1LjMzMyA3MjUuMzMzIDAgMjMuNDY3IDE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42NjdoMTQ5LjMzM2MyMy40NjcgMCA0Mi42NjctMTkuMiA0Mi42NjctNDIuNjY3IDAtNTMuMzMzIDguNTMzLTEwNC41MzMgMjQuMzItMTUyLjMyIDQuNjkzLTE0LjkzMyAxLjI4LTMxLjU3My0xMC42NjctNDMuNTJsLTkzLjg2Ny05My44Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3NzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9waXp6YSIgZGF0YS10YWdzPSJpY19sb2NhbF9waXp6YV8yNHB4IiBkPSJNNTEyIDg3NC42NjdjLTE1Mi4zMiAwLTI4OC44NTMtNjUuNzA3LTM4My41NzMtMTcwLjY2N2wzODMuNTczLTY4Mi42NjcgMzgzLjU3MyA2ODIuNjY3Yy05NC4yOTMgMTA0LjUzMy0yMzEuMjUzIDE3MC42NjctMzgzLjU3MyAxNzAuNjY3ek0yOTguNjY3IDY2MS4zMzNjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3M4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzLTM4LjQtODUuMzMzLTg1LjMzMy04NS4zMzMtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3pNNTEyIDMyMGMtNDYuOTMzIDAtODUuMzMzIDM4LjQtODUuMzMzIDg1LjMzM3MzOC40IDg1LjMzMyA4NS4zMzMgODUuMzMzIDg1LjMzMy0zOC40IDg1LjMzMy04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzLTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTc4OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3BsYXkiIGRhdGEtdGFncz0iaWNfbG9jYWxfcGxheV8yNHB4IiBkPSJNODUzLjMzMyA0NDhjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3YxNzAuNjY3YzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzNoLTY4Mi42NjdjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzN2LTE3MC42NjdjNDYuOTMzIDAgODQuOTA3LTM4LjQgODQuOTA3LTg1LjMzM3MtMzcuOTczLTg1LjMzMy04NS4zMzMtODUuMzMzdi0xNzAuNjY3YzAtNDYuOTMzIDM4LjQtODUuMzMzIDg1LjMzMy04NS4zMzNoNjgyLjY2N2M0Ni45MzMgMCA4NS4zMzMgMzguNCA4NS4zMzMgODUuMzMzdjE3MC42NjdjLTQ2LjkzMyAwLTg1LjMzMyAzOC40LTg1LjMzMyA4NS4zMzN6TTY2NC43NDcgMjQzLjJsLTE1Mi43NDcgOTguMTMzLTE1Mi43NDctOTguMTMzIDQ2LjA4MCAxNzUuNzg3LTE0MC4zNzMgMTE0Ljc3MyAxODAuOTA3IDEwLjY2NyA2Ni4xMzMgMTY4LjEwNyA2NS43MDctMTY4LjUzMyAxODAuOTA3LTEwLjY2Ny0xNDAuMzczLTExNC43NzMgNDYuNTA3LTE3NS4zNnoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTc5OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3Bvc3Rfb2ZmaWNlIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3Bvc3Rfb2ZmaWNlXzI0cHgiIGQ9Ik04NTMuMzMzIDc4OS4zMzNoLTY4Mi42NjdjLTQ2LjkzMyAwLTg0LjkwNy0zOC40LTg0LjkwNy04NS4zMzNsLTAuNDI3LTUxMmMwLTQ2LjkzMyAzOC40LTg1LjMzMyA4NS4zMzMtODUuMzMzaDY4Mi42NjdjNDYuOTMzIDAgODUuMzMzIDM4LjQgODUuMzMzIDg1LjMzM3Y1MTJjMCA0Ni45MzMtMzguNCA4NS4zMzMtODUuMzMzIDg1LjMzM3pNODUzLjMzMyA2MTguNjY3bC0zNDEuMzMzLTIxMy4zMzMtMzQxLjMzMyAyMTMuMzMzdjg1LjMzM2wzNDEuMzMzLTIxMy4zMzMgMzQxLjMzMyAyMTMuMzMzdi04NS4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3YTsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9wcmludF9zaG9wIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3ByaW50X3Nob3BfMjRweCIgZD0iTTgxMC42NjcgNjE4LjY2N2gtNTk3LjMzM2MtNzAuODI3IDAtMTI4LTU3LjE3My0xMjgtMTI4di0yNTZoMTcwLjY2N3YtMTcwLjY2N2g1MTJ2MTcwLjY2N2gxNzAuNjY3djI1NmMwIDcwLjgyNy01Ny4xNzMgMTI4LTEyOCAxMjh6TTY4Mi42NjcgMTQ5LjMzM2gtMzQxLjMzM3YyMTMuMzMzaDM0MS4zMzN2LTIxMy4zMzN6TTgxMC42NjcgNDQ4Yy0yMy40NjcgMC00Mi42NjcgMTkuMi00Mi42NjcgNDIuNjY3czE5LjIgNDIuNjY3IDQyLjY2NyA0Mi42NjcgNDIuNjY3LTE5LjIgNDIuNjY3LTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42NjctNDIuNjY3ek03NjggODMyaC01MTJ2LTE3MC42NjdoNTEydjE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk3YjsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9sb2NhbF9yZXN0YXVyYW50IiBkYXRhLXRhZ3M9ImljX2xvY2FsX3Jlc3RhdXJhbnRfMjRweCIgZD0iTTM0NS42IDM5MC44MjdsMTIwLjc0NyAxMjAuNzQ3LTI5OS41MiAyOTkuMDkzYy0zMC44NDItMzAuOTI5LTQ5LjkxMy03My42MTEtNDkuOTEzLTEyMC43NDdzMTkuMDcxLTg5LjgxOCA0OS45MTctMTIwLjc1MWwtMC4wMDQgMC4wMDQgMTc4Ljc3My0xNzguMzQ3ek02MzQuODggNDY4LjA1M2M2NS4yOC0zMC4yOTMgMTU3LjAxMy04Ljk2IDIyNC44NTMgNTguODggODEuNDkzIDgxLjQ5MyA5Ny4yOCAxOTguNCAzNC41NiAyNjEuMTItNjIuMjkzIDYyLjI5My0xNzkuMiA0Ni45MzMtMjYxLjEyLTM0LjU2LTY3Ljg0LTY3Ljg0LTg5LjE3My0xNTkuNTczLTU4Ljg4LTIyNC44NTNsLTQxNi40MjctNDE2LjQyNyA2MC4xNi02MC4xNiAyOTMuOTczIDI5My4xMiAyOTMuNTQ3LTI5My41NDcgNjAuMTYgNjAuMTYtMjkzLjU0NyAyOTMuNTQ3IDYyLjcyIDYyLjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2M7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfc2VlIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3NlZV8yNHB4IiBkPSJNMzc1LjQ2NyA0NDhjMC03NS40MDUgNjEuMTI4LTEzNi41MzMgMTM2LjUzMy0xMzYuNTMzczEzNi41MzMgNjEuMTI4IDEzNi41MzMgMTM2LjUzM3YwYzAgNzUuNDA1LTYxLjEyOCAxMzYuNTMzLTEzNi41MzMgMTM2LjUzM3MtMTM2LjUzMy02MS4xMjgtMTM2LjUzMy0xMzYuNTMzdjB6TTM4NCA4NzQuNjY3bC03OC4wODAtODUuMzMzaC0xMzUuMjUzYy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi01MTJjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g2ODIuNjY3YzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzNoLTEzNS4yNTNsLTc4LjA4MCA4NS4zMzNoLTI1NnpNNTEyIDIzNC42NjdjLTExNy43NiAwLTIxMy4zMzMgOTUuNTczLTIxMy4zMzMgMjEzLjMzM3M5NS41NzMgMjEzLjMzMyAyMTMuMzMzIDIxMy4zMzMgMjEzLjMzMy05NS41NzMgMjEzLjMzMy0yMTMuMzMzLTk1LjU3My0yMTMuMzMzLTIxMy4zMzMtMjEzLjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTdkOyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX2xvY2FsX3NoaXBwaW5nIiBkYXRhLXRhZ3M9ImljX2xvY2FsX3NoaXBwaW5nXzI0cHgiIGQ9Ik04NTMuMzMzIDYxOC42NjdoLTEyOHYxNzAuNjY3aC01OTcuMzMzYy00Ni45MzMgMC04NS4zMzMtMzguNC04NS4zMzMtODUuMzMzdi00NjkuMzMzaDg1LjMzM2MwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDI1NmMwLTcwLjgyNyA1Ny4xNzMtMTI4IDEyOC0xMjhzMTI4IDU3LjE3MyAxMjggMTI4aDg1LjMzM3YyMTMuMzMzbC0xMjggMTcwLjY2N3pNMjU2IDE3MC42NjdjLTM1LjQxMyAwLTY0IDI4LjU4Ny02NCA2NHMyOC41ODcgNjQgNjQgNjQgNjQtMjguNTg3IDY0LTY0LTI4LjU4Ny02NC02NC02NHpNODMyIDU1NC42NjdsODMuNjI3LTEwNi42NjdoLTE5MC4yOTN2MTA2LjY2N2gxMDYuNjY3ek03NjggMTcwLjY2N2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2U7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYWxfdGF4aSIgZGF0YS10YWdzPSJpY19sb2NhbF90YXhpXzI0cHgiIGQ9Ik04MDcuMjUzIDcwMy41NzNjLTguNTMzIDI1LjE3My0zMi40MjcgNDMuMDkzLTYwLjU4NyA0My4wOTNoLTEwNi42Njd2ODUuMzMzaC0yNTZ2LTg1LjMzM2gtMTA2LjY2N2MtMjguMTYgMC01MS42MjctMTcuOTItNjAuNTg3LTQzLjA5M2wtODguNzQ3LTI1NS41NzN2LTM0MS4zMzNjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0Mi42NjdoNTEydi00Mi42NjdjMC0yMy40NjcgMTkuMi00Mi42NjcgNDIuNjY3LTQyLjY2N2g0Mi42NjdjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3YzNDEuMzMzbC04OC43NDcgMjU1LjU3M3pNMjc3LjMzMyAyNzcuMzMzYy0zNS40MTMgMC02NCAyOC41ODctNjQgNjRzMjguNTg3IDY0IDY0IDY0IDY0LTI4LjU4NyA2NC02NC0yOC41ODctNjQtNjQtNjR6TTc0Ni42NjcgMjc3LjMzM2MtMzUuNDEzIDAtNjQgMjguNTg3LTY0IDY0czI4LjU4NyA2NCA2NCA2NCA2NC0yOC41ODcgNjQtNjQtMjguNTg3LTY0LTY0LTY0ek0yMTMuMzMzIDQ5MC42NjdsNjQgMTkyaDQ2OS4zMzNsNjQtMTkyaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5N2Y7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbG9jYXRpb25faGlzdG9yeSIgZGF0YS10YWdzPSJpY19sb2NhdGlvbl9oaXN0b3J5XzI0cHgiIGQ9Ik04MTAuNjY3IDg3NC42NjdoLTU5Ny4zMzNjLTQ3LjEyOCAwLTg1LjMzMy0zOC4yMDUtODUuMzMzLTg1LjMzM3YtNTk3LjMzM2MwLTQ3LjEyOCAzOC4yMDUtODUuMzMzIDg1LjMzMy04NS4zMzN2MGgxNzAuNjY3bDEyOC0xMjggMTI4IDEyOGgxNzAuNjY3YzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek01MTIgNzMzLjg2N2M2My41NzMgMCAxMTUuMi01MS42MjcgMTE1LjItMTE1LjJzLTUxLjYyNy0xMTUuMi0xMTUuMi0xMTUuMmMtNjMuNTczIDAtMTE1LjIgNTEuNjI3LTExNS4yIDExNS4yczUxLjYyNyAxMTUuMiAxMTUuMiAxMTUuMnpNNzY4IDI3Ny4zMzNoLTUxMnYzOC40YzAgODUuMzMzIDE3MC42NjcgMTMyLjI2NyAyNTYgMTMyLjI2N3MyNTYtNDYuOTMzIDI1Ni0xMzIuMjY3di0zOC40eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODA7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbXlfbG9jYXRpb24iIGRhdGEtdGFncz0iaWNfbXlfbG9jYXRpb25fMjRweCIgZD0iTTUxMiA2MTguNjY3Yy05NC4yOTMgMC0xNzAuNjY3LTc2LjM3My0xNzAuNjY3LTE3MC42NjdzNzYuMzczLTE3MC42NjcgMTcwLjY2Ny0xNzAuNjY3IDE3MC42NjcgNzYuMzczIDE3MC42NjcgMTcwLjY2Ny03Ni4zNzMgMTcwLjY2Ny0xNzAuNjY3IDE3MC42Njd6TTg5My40NCA0OTAuNjY3Yy0yMC40ODcgMTc4LjI1LTE2MC41MjQgMzE4LjI4Ny0zMzYuOTk4IDMzOC42MDdsLTEuNzc2IDAuMTY2djg3Ljg5M2gtODUuMzMzdi04Ny44OTNjLTE3OC4yNS0yMC40ODctMzE4LjI4Ny0xNjAuNTI0LTMzOC42MDctMzM2Ljk5OGwtMC4xNjYtMS43NzZoLTg3Ljg5M3YtODUuMzMzaDg3Ljg5M2MyMC40ODctMTc4LjI1IDE2MC41MjQtMzE4LjI4NyAzMzYuOTk4LTMzOC42MDdsMS43NzYtMC4xNjZ2LTg3Ljg5M2g4NS4zMzN2ODcuODkzYzE3OC4yNSAyMC40ODcgMzE4LjI4NyAxNjAuNTI0IDMzOC42MDcgMzM2Ljk5OGwwLjE2NiAxLjc3Nmg4Ny44OTN2ODUuMzMzaC04Ny44OTN6TTUxMiAxNDkuMzMzYy0xNjUuMTIgMC0yOTguNjY3IDEzMy41NDctMjk4LjY2NyAyOTguNjY3czEzMy41NDcgMjk4LjY2NyAyOTguNjY3IDI5OC42NjcgMjk4LjY2Ny0xMzMuNTQ3IDI5OC42NjctMjk4LjY2Ny0xMzMuNTQ3LTI5OC42NjctMjk4LjY2Ny0yOTguNjY3eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODE7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fbmF2aWdhdGlvbiIgZGF0YS10YWdzPSJpY19uYXZpZ2F0aW9uXzI0cHgiIGQ9Ik01MTIgODc0LjY2N2wtMzIwLTc4MC4zNzMgMzAuMjkzLTMwLjI5MyAyODkuNzA3IDEyOCAyODkuNzA3LTEyOCAzMC4yOTMgMzAuMjkzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODI7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcGluX2Ryb3AiIGRhdGEtdGFncz0iaWNfcGluX2Ryb3BfMjRweCIgZD0iTTc2OCA2MTguNjY3YzAgMTQxLjIyNy0xMTQuNzczIDI1Ni0yNTYgMjU2cy0yNTYtMTE0Ljc3My0yNTYtMjU2YzAtMTkyIDI1Ni00NjkuMzMzIDI1Ni00NjkuMzMzczI1NiAyNzcuMzMzIDI1NiA0NjkuMzMzek00MjYuNjY3IDYxOC42NjdjMCA0Ni45MzMgMzguNCA4NS4zMzMgODUuMzMzIDg1LjMzM3M4NS4zMzMtMzguNCA4NS4zMzMtODUuMzMzYzAtNDcuMTI4LTM4LjIwNS04NS4zMzMtODUuMzMzLTg1LjMzM3MtODUuMzMzIDM4LjIwNS04NS4zMzMgODUuMzMzdjB6TTIxMy4zMzMgMTA2LjY2N3YtODUuMzMzaDU5Ny4zMzN2ODUuMzMzaC01OTcuMzMzeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODM7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcGxhY2UiIGRhdGEtdGFncz0iaWNfcGxhY2VfMjRweCIgZD0iTTUxMiA4NzQuNjY3Yy0xNjUuMTIgMC0yOTguNjY3LTEzMy41NDctMjk4LjY2Ny0yOTguNjY3IDAtMjI0IDI5OC42NjctNTU0LjY2NyAyOTguNjY3LTU1NC42NjdzMjk4LjY2NyAzMzAuNjY3IDI5OC42NjcgNTU0LjY2N2MwIDE2NS4xMi0xMzMuNTQ3IDI5OC42NjctMjk4LjY2NyAyOTguNjY3ek01MTIgNDY5LjMzM2MtNTguOTEgMC0xMDYuNjY3IDQ3Ljc1Ni0xMDYuNjY3IDEwNi42NjdzNDcuNzU2IDEwNi42NjcgMTA2LjY2NyAxMDYuNjY3djBjNTguOTEgMCAxMDYuNjY3LTQ3Ljc1NiAxMDYuNjY3LTEwNi42NjdzLTQ3Ljc1Ni0xMDYuNjY3LTEwNi42NjctMTA2LjY2N3YweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODQ7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fcmF0ZV9yZXZpZXciIGRhdGEtdGFncz0iaWNfcmF0ZV9yZXZpZXdfMjRweCIgZD0iTTg1My4zMzMgODc0LjY2N2gtNjgyLjY2N2MtNDYuOTMzIDAtODQuOTA3LTM4LjQtODQuOTA3LTg1LjMzM2wtMC40MjctNzY4IDE3MC42NjcgMTcwLjY2N2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTEyYzAgNDYuOTMzLTM4LjQgODUuMzMzLTg1LjMzMyA4NS4zMzN6TTI1NiAzNjIuNjY3djEwNS4zODdsMjkzLjU0NyAyOTMuNTQ3YzguNTMzIDguNTMzIDIxLjc2IDguNTMzIDMwLjI5MyAwbDc1LjUyLTc1LjUyYzguNTMzLTguNTMzIDguNTMzLTIxLjc2IDAtMzAuMjkzbC0yOTMuOTczLTI5My4xMmgtMTA1LjM4N3pNNzY4IDM2Mi42NjdoLTMyMGw4NS4zMzMgODUuMzMzaDIzNC42Njd2LTg1LjMzM3oiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOTg1OyIgZ2x5cGgtbmFtZT0ibWF0ZXJpYWxfZGVzaWduX3Jlc3RhdXJhbnRfbWVudSIgZGF0YS10YWdzPSJpY19yZXN0YXVyYW50X21lbnVfMjRweCIgZD0iTTM0NS42IDM5MC44MjdsMTIwLjc0NyAxMjAuNzQ3LTI5OS41MiAyOTkuMDkzYy0zMC44NDItMzAuOTI5LTQ5LjkxMy03My42MTEtNDkuOTEzLTEyMC43NDdzMTkuMDcxLTg5LjgxOCA0OS45MTctMTIwLjc1MWwtMC4wMDQgMC4wMDQgMTc4Ljc3My0xNzguMzQ3ek02MzQuODggNDY4LjA1M2M2NS4yOC0zMC4yOTMgMTU3LjAxMy04Ljk2IDIyNC44NTMgNTguODggODEuNDkzIDgxLjQ5MyA5Ny4yOCAxOTguNCAzNC41NiAyNjEuMTItNjIuMjkzIDYyLjI5My0xNzkuMiA0Ni45MzMtMjYxLjEyLTM0LjU2LTY3Ljg0LTY3Ljg0LTg5LjE3My0xNTkuNTczLTU4Ljg4LTIyNC44NTNsLTQxNi40MjctNDE2LjQyNyA2MC4xNi02MC4xNiAyOTMuOTczIDI5My4xMiAyOTMuNTQ3LTI5My41NDcgNjAuMTYgNjAuMTYtMjkzLjU0NyAyOTMuNTQ3IDYyLjcyIDYyLjcyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODY7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fc2F0ZWxsaXRlIiBkYXRhLXRhZ3M9ImljX3NhdGVsbGl0ZV8yNHB4IiBkPSJNODEwLjY2NyA4MzJoLTU5Ny4zMzNjLTQ2LjkzMyAwLTg1LjMzMy0zOC40LTg1LjMzMy04NS4zMzN2LTU5Ny4zMzNjMC00Ni45MzMgMzguNC04NS4zMzMgODUuMzMzLTg1LjMzM2g1OTcuMzMzYzQ2LjkzMyAwIDg1LjMzMyAzOC40IDg1LjMzMyA4NS4zMzN2NTk3LjMzM2MwIDQ2LjkzMy0zOC40IDg1LjMzMy04NS4zMzMgODUuMzMzek0yMTMuMzMzIDc0Ny4wOTNoMTI4YzAtNzAuODI3LTU3LjE3My0xMjguNDI3LTEyOC0xMjguNDI3djEyOC40Mjd6TTIxMy4zMzMgNDQ4djg1LjMzM2MxMTcuNzYgMCAyMTMuMzMzIDk2IDIxMy4zMzMgMjEzLjc2aDg1LjMzM2MwLTE2NS4xMi0xMzMuNTQ3LTI5OS4wOTMtMjk4LjY2Ny0yOTkuMDkzek0yMTMuMzMzIDE5MmwxNDkuMzMzIDE5MiAxMDYuNjY3LTEyOC40MjcgMTQ5LjMzMyAxOTIuNDI3IDE5Mi0yNTZoLTU5Ny4zMzN6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk4NzsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl9zdG9yZV9tYWxsX2RpcmVjdG9yeSIgZGF0YS10YWdzPSJpY19zdG9yZV9tYWxsX2RpcmVjdG9yeV8yNHB4IiBkPSJNODUzLjMzMyA3ODkuMzMzaC02ODIuNjY3di04NS4zMzNoNjgyLjY2N3Y4NS4zMzN6TTg5NiAzNjIuNjY3djg1LjMzM2wtNDIuNjY3IDIxMy4zMzNoLTY4Mi42NjdsLTQyLjY2Ny0yMTMuMzMzdi04NS4zMzNoNDIuNjY3di0yNTZoNDI2LjY2N3YyNTZoMTcwLjY2N3YtMjU2aDg1LjMzM3YyNTZoNDIuNjY3ek01MTIgMTkyaC0yNTZ2MTcwLjY2N2gyNTZ2LTE3MC42Njd6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk4ODsiIGdseXBoLW5hbWU9Im1hdGVyaWFsX2Rlc2lnbl90ZXJyYWluIiBkYXRhLXRhZ3M9ImljX3RlcnJhaW5fMjRweCIgZD0iTTU5Ny4zMzMgNzA0bC0xNjAtMjEzLjMzMyAxMjEuNi0xNjIuMTMzLTY4LjI2Ny01MS4yYy03Mi4xMDcgOTYtMTkyIDI1Ni0xOTIgMjU2bC0yNTYtMzQxLjMzM2g5MzguNjY3bC0zODQgNTEyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5ODk7IiBnbHlwaC1uYW1lPSJtYXRlcmlhbF9kZXNpZ25fdHJhZmZpYyIgZGF0YS10YWdzPSJpY190cmFmZmljXzI0cHgiIGQ9Ik04NTMuMzMzIDUzMy4zMzNoLTEyOHY0OC42NGM3My4zODcgMTkuMiAxMjggODUuMzMzIDEyOCAxNjQuNjkzaC0xMjh2NDIuNjY3YzAgMjMuNDY3LTE5LjIgNDIuNjY3LTQyLjY2NyA0Mi42NjdoLTM0MS4zMzNjLTIzLjQ2NyAwLTQyLjY2Ny0xOS4yLTQyLjY2Ny00Mi42Njd2LTQyLjY2N2gtMTI4YzAtNzkuMzYgNTQuNjEzLTE0NS40OTMgMTI4LTE2NC42OTN2LTQ4LjY0aC0xMjhjMC03OS4zNiA1NC42MTMtMTQ1LjQ5MyAxMjgtMTY0LjY5M3YtNDguNjRoLTEyOGMwLTc5LjM2IDU0LjYxMy0xNDUuNDkzIDEyOC0xNjQuNjkzdi00OC42NGMwLTIzLjQ2NyAxOS4yLTQyLjY2NyA0Mi42NjctNDIuNjY3aDM0MS4zMzNjMjMuNDY3IDAgNDIuNjY3IDE5LjIgNDIuNjY3IDQyLjY2N3Y0OC42NGM3My4zODcgMTkuMiAxMjggODUuMzMzIDEyOCAxNjQuNjkzaC0xMjh2NDguNjRjNzMuMzg3IDE5LjIgMTI4IDg1LjMzMyAxMjggMTY0LjY5M3pNNTEyIDE0OS4zMzNjLTAuNTc0LTAuMDE0LTEuMjUxLTAuMDIyLTEuOTI5LTAuMDIyLTQ3LjEyOCAwLTg1LjMzMyAzOC4yMDUtODUuMzMzIDg1LjMzM3MzOC4yMDUgODUuMzMzIDg1LjMzMyA4NS4zMzNjMC42NjMgMCAxLjMyNS0wLjAwOCAxLjk4NS0wLjAyM2wtMC4wOTggMC4wMDJjNDYuMzEtMS4wNTYgODMuNDQ3LTM4Ljg0OCA4My40NDctODUuMzEyIDAtNDYuNDUtMzcuMTEzLTg0LjIzMi04My4zMDQtODUuMzFsLTAuMS0wLjAwMnpNNTEyIDM2Mi42NjdjLTAuNTc0LTAuMDE0LTEuMjUxLTAuMDIyLTEuOTI5LTAuMDIyLTQ3LjEyOCAwLTg1LjMzMyAzOC4yMDUtODUuMzMzIDg1LjMzM3MzOC4yMDUgODUuMzMzIDg1LjMzMyA4NS4zMzNjMC42NjMgMCAxLjMyNS0wLjAwOCAxLjk4NS0wLjAyM2wtMC4wOTggMC4wMDJjNDYuMzEtMS4wNTYgODMuNDQ3LTM4Ljg0OCA4My40NDctODUuMzEyIDAtNDYuNDUtMzcuMTEzLTg0LjIzMi04My4zMDQtODUuMzFsLTAuMS0wLjAwMnpNNTEyIDU3NmMtNDcuMTI4IDAtODUuMzMzIDM4LjIwNS04NS4zMzMgODUuMzMzdjBjMCA0Ny4zNiAzNy45NzMgODUuMzMzIDg1LjMzMyA4NS4zMzMgNDcuMTI4IDAgODUuMzMzLTM4LjIwNSA4NS4zMzMtODUuMzMzcy0zOC4yMDUtODUuMzMzLTg1LjMzMy04NS4zMzN2MHoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlOThhOyIgZ2x5cGgtbmFtZT0ib3RoZXJzIiBkYXRhLXRhZ3M9IuabtOWkmiIgZD0iTTE3NiA1MzAuNzA0Yy0xMy43MjIgOC4yOC0zMC4yNzYgMTMuMjExLTQ3Ljk3NiAxMy4yOTZoLTAuMDI0Yy01My4wMTkgMC05Ni00Mi45ODEtOTYtOTZzNDIuOTgxLTk2IDk2LTk2djBjMTcuNTY4IDAgMzMuODQgNS4wODggNDggMTMuMzQ0IDI4LjU2IDE2LjYwOCA0OCA0Ny4yMzIgNDggODIuNjU2IDAgMzUuNDcyLTE5LjQ0IDY2LjA5Ni00OCA4Mi43MDR6TTU2MCA1MzAuNzA0Yy0xMy43MjIgOC4yOC0zMC4yNzYgMTMuMjExLTQ3Ljk3NiAxMy4yOTZoLTAuMDI0Yy0xNy41NjggMC0zMy44NC01LjA0MC00OC0xMy4yOTYtMjguNTYtMTYuNjA4LTQ4LTQ3LjIzMi00OC04Mi43MDQgMC0zNS40MjQgMTkuNDQtNjYuMDQ4IDQ4LTgyLjY1NiAxNC4xNi04LjI1NiAzMC40MzItMTMuMzQ0IDQ4LTEzLjM0NHMzMy44NCA1LjA4OCA0OCAxMy4zNDRjMjguNTYgMTYuNjA4IDQ4IDQ3LjIzMiA0OCA4Mi42NTYgMCAzNS40NzItMTkuNDQgNjYuMDk2LTQ4IDgyLjcwNHpNODk2IDU0NGMtMTcuNTY4IDAtMzMuODQtNS4wODgtNDgtMTMuMjk2LTI4LjU2LTE2LjY1Ni00OC00Ny4yOC00OC04Mi43MDRzMTkuNDQtNjYuMDQ4IDQ4LTgyLjcwNGMxNC4xNi04LjIwOCAzMC40MzItMTMuMjk2IDQ4LTEzLjI5NiA1My4wMTkgMCA5NiA0Mi45ODEgOTYgOTZzLTQyLjk4MSA5Ni05NiA5NnYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OGI7IiBnbHlwaC1uYW1lPSJzZXJ2ZXIiIGRhdGEtdGFncz0i5pyN5Yqh5ZmoIiBob3Jpei1hZHYteD0iMTMwMyIgZD0iTTE5Ny43OTIgODY0aDkwNy42MzdjNDEuNzc0IDAgNzUuNjM3LTMzLjg2MyA3NS42MzctNzUuNjM3di03NS42MzdjMC00MS43NzQtMzMuODYzLTc1LjYzNy03NS42MzctNzUuNjM3aC05MDcuNjM3Yy00MS43NzQgMC03NS42MzcgMzMuODYzLTc1LjYzNyA3NS42Mzd2NzUuNjM3YzAgNDEuNzc0IDMzLjg2MyA3NS42MzcgNzUuNjM3IDc1LjYzN3Ywek05NTQuMTU3IDY3NC45MDljNDEuNzc0IDAgNzUuNjM3IDMzLjg2MyA3NS42MzcgNzUuNjM3cy0zMy44NjMgNzUuNjM3LTc1LjYzNyA3NS42MzdjLTQxLjc3NCAwLTc1LjYzNy0zMy44NjMtNzUuNjM3LTc1LjYzN3MzMy44NjMtNzUuNjM3IDc1LjYzNy03NS42Mzd6TTE5Ny43OTIgNTYxLjQ1NWg5MDcuNjM3YzQxLjc3NCAwIDc1LjYzNy0zMy44NjMgNzUuNjM3LTc1LjYzN3YtNzUuNjM3YzAtNDEuNzc0LTMzLjg2My03NS42MzctNzUuNjM3LTc1LjYzN2gtOTA3LjYzN2MtNDEuNzc0IDAtNzUuNjM3IDMzLjg2My03NS42MzcgNzUuNjM3djc1LjYzN2MwIDQxLjc3NCAzMy44NjMgNzUuNjM3IDc1LjYzNyA3NS42Mzd2MHpNOTU0LjE1NyAzNzIuMzYzYzQxLjc3NCAwIDc1LjYzNyAzMy44NjMgNzUuNjM3IDc1LjYzN3MtMzMuODYzIDc1LjYzNy03NS42MzcgNzUuNjM3Yy00MS43NzQgMC03NS42MzctMzMuODYzLTc1LjYzNy03NS42MzdzMzMuODYzLTc1LjYzNyA3NS42MzctNzUuNjM3ek0xOTcuNzkyIDI1OC45MDhoOTA3LjYzN2M0MS43NzQgMCA3NS42MzctMzMuODYzIDc1LjYzNy03NS42Mzd2LTc1LjYzN2MwLTQxLjc3NC0zMy44NjMtNzUuNjM3LTc1LjYzNy03NS42MzdoLTkwNy42MzdjLTQxLjc3NCAwLTc1LjYzNyAzMy44NjMtNzUuNjM3IDc1LjYzN3Y3NS42MzdjMCA0MS43NzQgMzMuODYzIDc1LjYzNyA3NS42MzcgNzUuNjM3djB6TTk1NC4xNTcgNjkuODE4YzQxLjc3NCAwIDc1LjYzNyAzMy44NjMgNzUuNjM3IDc1LjYzN3MtMzMuODYzIDc1LjYzNy03NS42MzcgNzUuNjM3Yy00MS43NzQgMC03NS42MzctMzMuODYzLTc1LjYzNy03NS42MzdzMzMuODYzLTc1LjYzNyA3NS42MzctNzUuNjM3eiIgLz4KPC9mb250PjwvZGVmcz48L3N2Zz4=#supermapol-icons) format('svg');font-weight:400;font-style:normal}[class*=" supermapol-icons-"],[class^=supermapol-icons-]{font-family:supermapol-icons,sans-serif!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.supermapol-icons-material_design_beenhere:before{content:"\e958"}.supermapol-icons-material_design_directions:before{content:"\e959"}.supermapol-icons-material_design_directions_bike:before{content:"\e95a"}.supermapol-icons-material_design_directions_bus:before{content:"\e95b"}.supermapol-icons-material_design_directions_car:before{content:"\e95c"}.supermapol-icons-material_design_directions_ferry:before{content:"\e95d"}.supermapol-icons-material_design_directions_train:before{content:"\e95e"}.supermapol-icons-material_design_directions_transit:before{content:"\e95f"}.supermapol-icons-material_design_directions_walk:before{content:"\e960"}.supermapol-icons-material_design_flight:before{content:"\e961"}.supermapol-icons-material_design_hotel:before{content:"\e962"}.supermapol-icons-material_design_local_airport:before{content:"\e963"}.supermapol-icons-material_design_local_atm:before{content:"\e964"}.supermapol-icons-material_design_local_attraction:before{content:"\e965"}.supermapol-icons-material_design_local_bar:before{content:"\e966"}.supermapol-icons-material_design_local_cafe:before{content:"\e967"}.supermapol-icons-material_design_local_car_wash:before{content:"\e968"}.supermapol-icons-material_design_local_convenience_store:before{content:"\e969"}.supermapol-icons-material_design_local_drink:before{content:"\e96a"}.supermapol-icons-material_design_local_florist:before{content:"\e96b"}.supermapol-icons-material_design_local_gas_station:before{content:"\e96c"}.supermapol-icons-material_design_local_grocery_store:before{content:"\e96d"}.supermapol-icons-material_design_local_hospital:before{content:"\e96e"}.supermapol-icons-material_design_local_laundry_service:before{content:"\e96f"}.supermapol-icons-material_design_local_library:before{content:"\e970"}.supermapol-icons-material_design_local_mall:before{content:"\e971"}.supermapol-icons-material_design_local_movies:before{content:"\e972"}.supermapol-icons-material_design_local_offer:before{content:"\e973"}.supermapol-icons-material_design_local_parking:before{content:"\e974"}.supermapol-icons-material_design_local_pharmacy:before{content:"\e975"}.supermapol-icons-material_design_local_phone:before{content:"\e976"}.supermapol-icons-material_design_local_pizza:before{content:"\e977"}.supermapol-icons-material_design_local_play:before{content:"\e978"}.supermapol-icons-material_design_local_post_office:before{content:"\e979"}.supermapol-icons-material_design_local_print_shop:before{content:"\e97a"}.supermapol-icons-material_design_local_restaurant:before{content:"\e97b"}.supermapol-icons-material_design_local_see:before{content:"\e97c"}.supermapol-icons-material_design_local_shipping:before{content:"\e97d"}.supermapol-icons-material_design_local_taxi:before{content:"\e97e"}.supermapol-icons-material_design_location_history:before{content:"\e97f"}.supermapol-icons-material_design_my_location:before{content:"\e980"}.supermapol-icons-material_design_navigation:before{content:"\e981"}.supermapol-icons-material_design_pin_drop:before{content:"\e982"}.supermapol-icons-material_design_place:before{content:"\e983"}.supermapol-icons-material_design_rate_review:before{content:"\e984"}.supermapol-icons-material_design_restaurant_menu:before{content:"\e985"}.supermapol-icons-material_design_satellite:before{content:"\e986"}.supermapol-icons-material_design_store_mall_directory:before{content:"\e987"}.supermapol-icons-material_design_terrain:before{content:"\e988"}.supermapol-icons-material_design_traffic:before{content:"\e989"}.supermapol-icons-server:before{content:"\e98b"}.supermapol-icons-others:before{content:"\e98a"}.supermapol-icons-maps:before{content:"\e954"}.supermapol-icons-new:before{content:"\e955"}.supermapol-icons-feedback:before{content:"\e956"}.supermapol-icons-homepage:before{content:"\e957"}.supermapol-icons-ruler:before{content:"\e950"}.supermapol-icons-menu:before{content:"\e952"}.supermapol-icons-rename:before{content:"\e953"}.supermapol-icons-field:before{content:"\e951"}.supermapol-icons-export:before{content:"\e94d"}.supermapol-icons-zone:before{content:"\e94c"}.supermapol-icons-copy:before{content:"\e94b"}.supermapol-icons-qqblog:before{content:"\e94e"}.supermapol-icons-sina:before{content:"\e94f"}.supermapol-icons-play:before{content:"\e949"}.supermapol-icons-pause:before{content:"\e94a"}.supermapol-icons-search-thin:before{content:"\e948"}.supermapol-icons-layerStyle:before{content:"\e947"}.supermapol-icons-cad:before{content:"\e944"}.supermapol-icons-grid:before{content:"\e945"}.supermapol-icons-image:before{content:"\e946"}.supermapol-icons-eye-closed:before{content:"\e915"}.supermapol-icons-dropdown:before{content:"\e943"}.supermapol-icons-solid-triangle:before{content:"\e941"}.supermapol-icons-eye:before{content:"\e942"}.supermapol-icons-opacity:before{content:"\e940"}.supermapol-icons-table:before{content:"\e93f"}.supermapol-icons-upload:before{content:"\e93d"}.supermapol-icons-solid-point:before{content:"\e93a"}.supermapol-icons-flag:before{content:"\e93b"}.supermapol-icons-target:before{content:"\e93c"}.supermapol-icons-legend:before{content:"\e93e"}.supermapol-icons-select:before{content:"\e939"}.supermapol-icons-logo:before{content:"\e938"}.supermapol-icons-tag:before{content:"\e934"}.supermapol-icons-new_home:before{content:"\e935"}.supermapol-icons-update:before{content:"\e936"}.supermapol-icons-info:before{content:"\e937"}.supermapol-icons-unfold:before{content:"\e930"}.supermapol-icons-fold:before{content:"\e931"}.supermapol-icons-right:before{content:"\e932"}.supermapol-icons-left:before{content:"\e933"}.supermapol-icons-edit:before{content:"\e92c"}.supermapol-icons-home:before{content:"\e92d"}.supermapol-icons-share:before{content:"\e92e"}.supermapol-icons-back:before{content:"\e92f"}.supermapol-icons-rest-api:before{content:"\e929"}.supermapol-icons-javascript-api:before{content:"\e92a"}.supermapol-icons-desktop-dev:before{content:"\e92b"}.supermapol-icons-open:before{content:"\e91f"}.supermapol-icons-overlay:before{content:"\e920"}.supermapol-icons-point-layer:before{content:"\e921"}.supermapol-icons-hamburg:before{content:"\e922"}.supermapol-icons-triangle:before{content:"\e923"}.supermapol-icons-polygon-layer:before{content:"\e924"}.supermapol-icons-close:before{content:"\e925"}.supermapol-icons-add:before{content:"\e926"}.supermapol-icons-more:before{content:"\e927"}.supermapol-icons-line-layer:before{content:"\e928"}.supermapol-icons-polygon:before{content:"\e91e"}.supermapol-icons-triangle-old:before{content:"\e910";color:#474747}.supermapol-icons-save:before{content:"\e900"}.supermapol-icons-baselayer:before{content:"\e901"}.supermapol-icons-marker:before{content:"\e902"}.supermapol-icons-uncheck:before{content:"\e903"}.supermapol-icons-checked:before{content:"\e904"}.supermapol-icons-zoom-in:before{content:"\e905"}.supermapol-icons-clear:before{content:"\e906"}.supermapol-icons-setting:before{content:"\e907"}.supermapol-icons-zoom-to:before{content:"\e908"}.supermapol-icons-default-layer:before{content:"\e909"}.supermapol-icons-group:before{content:"\e90a"}.supermapol-icons-delete:before{content:"\e90b"}.supermapol-icons-up:before{content:"\e90c"}.supermapol-icons-warning:before{content:"\e90d"}.supermapol-icons-retract:before{content:"\e90e"}.supermapol-icons-search:before{content:"\e90f"}.supermapol-icons-zoom-out:before{content:"\e911"}.supermapol-icons-layers:before{content:"\e912"}.supermapol-icons-add-old:before{content:"\e913"}.supermapol-icons-brush:before{content:"\e914"}.supermapol-icons-down:before{content:"\e916"}.supermapol-icons-line:before{content:"\e917"}.supermapol-icons-pen:before{content:"\e918"}.supermapol-icons-user:before{content:"\e919"}.supermapol-icons-down-end:before{content:"\e91a"}.supermapol-icons-up-end:before{content:"\e91b"}.supermapol-icons-text:before{content:"\e91c"}.supermapol-icons-customize:before{content:"\e91d"}@font-face{font-family:supermapol-icons;src:url(data:application/vnd.ms-fontobject;base64,uBQAAPwTAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wxR0gAAAAAAAAAAAAAAAAAAAAAAABoAdwBpAGQAZwBlAHQAcwAtAGkAYwBvAG4AcwAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADQALgA4AAAAGgB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzAAAAAAAAAQAAAAsAgAADADBPUy8yD50FtQAAALwAAABgY21hcLaxausAAAEcAAAAlGdhc3AAAAAQAAABsAAAAAhnbHlmXWV0BAAAAbgAAA9QaGVhZBNIzqwAABEIAAAANmhoZWEIEAQmAAARQAAAACRobXR4TRoHogAAEWQAAABYbG9jYSA4G6wAABG8AAAALm1heHAAHwEYAAAR7AAAACBuYW1lCXFvjwAAEgwAAAHOcG9zdAADAAAAABPcAAAAIAADBBABkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOmUAzP/NADMAzMAzAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAB4AAAAGgAQAAMACgABACDmKuYu5jDmO+ap5qzmrumR6ZT//f//AAAAAAAg5irmLOYw5jrmpOas5q7pkemT//3//wAB/+MZ2hnZGdgZzxlnGWUZZBaCFoEAAwABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAD/QAQAA0AAIgAACQEeARUUBiMiJjU0NjMyFhc1AS4BNTQ2MzIWFRQGIyImJzMC//4/CwxkRkdkZEcdNBUBuxARZEZHZGRHGCsUAQIC/j8TLBdHZGRHRmQSEAEBvBU0HEdkZEdGZAwLAAACAFX/QAOrA0AAHAAxAAABIgcOAQcGFRQXHgEXFjEwNz4BNzY1NCcuAScmIxE4ATEiJjU0NjM4ATkBMhYVFAYjMQIAWE5OdCEiQ0OgQkNDQqBDQyIhdE5OWEdkZEdHZGRHA0AhIHFMTFZWamq5Pj8/PrlqalZWTExxICH9q2RGR2RkR0ZkAAAAAwAA/5UDqwNAAB0AMgBAAAABIicuAScmNTQ3PgE3NjMxMhceARcWFRQHDgEHBiMBOAExIiY1NDYzOAE5ATIWFRQGIzEFIiY1NDYzMTIWFRQGIwKrNS8vRRQUFBRFLy81NS4vRRUUFBVFLy41/gBHZGRHRmRkRgIqNUtLNTVLSzUBQBQURi4vNTUvLkYUFBQURi4vNTUvLkYUFP8AZEdGZGRGR2SrSzU1S0s1NUsAAAAIAAD/QAQAA0AADQAbACkANwA7AD8AQwBHAAATIiY1NDYzMTIWFRQGIyEiJjU0NjMxMhYVFAYjESImNTQ2MzEyFhUUBiMhIiY1NDYzMTIWFRQGIxMhFSERIRUhAxEjESERIxGgQl5eQkJeXkICwEJeXkJCXl5CQl5eQkJeXkL9QEJeXkJCXl5CoAGA/oABgP6AgEADAEACAF5CQl5eQkJeXkJCXl5CQl79QF5CQl5eQkJeXkJCXl5CQl4DgED9gEACQP6AAYD+gAGAAAADAF7/QAQzA0AAHABJAGcAAAEuASMiBgcxDgEVFBYXMR4BMzI2NzE+ATU0JicxASYnJjQ3Njc2Nz4BNzYzMhceARcWFzMWFxYUBwYHBgcOAQcGIyInLgEnJicxBQ4BIyImJzEnLgE1NDY3MT4BMzIWFzEXHgEVFAYHAwMwgUlJgS8wODgwL4FJSYEwMDc3MP3ARCEiIiFEHyUlUy0tMDAtLlIlJR8BQyIiIiJDICUlUi4tMDAtLVMlJR8DXgkXDQ0XCFkJCgoJCBcNDRcJWQkJCQkCajE4ODEwgklKgTEwODgwMYFKSYIw/bxEVlayVlZEHxoZIwoJCQojGRofRFZWslZWRCAZGSMKCQkKIxkZINMJCgoJWggXDQ4XCAkKCglZCRcNDhcIAAEA4QDaAx8CRgALAAABJiIHAwYWMyEyNicCKREwEfYiGTMB6jMZIgJGExP+7iU1NSYAAAABAOEAOgMfAaYACwAAJRYyNxM2JiMhIgYXAdcRMBH2Ihkz/hYzGSI6ExMBEiU1NSYAAAAAAgEcACQC5AIkAAMAJAAAATMRIyEiJicxJS4BNTQ2NzElPgEzMhYVFAYHMQcXHgEVFAYjMQEcOTkBqwUKA/7mBQYGBQEYBAkGDBEGBf3+BQYRDAIk/gAEA+IFCwcHDATiAgQRDAcMBMvMBAwHDBEAAAEBVQAlAqoCIwAgAAAlMjY3MSU+ATU0Jic1JS4BIyIGFRQWFzEXBw4BFRQWMzEBcgYJBAEaBQYGBf7nBAkFDBEGBP3+BQYRDCUDA+MEDAcHCwQB4QMDEQwHCwTLzAQMBwwRAAACAR0AJALiAiQAEAAxAAABMhYVMREUBiMiJjUxETQ2MwEiJjU0NjcxNycuATU0NjMyFhc1BR4BFRQGBxUFDgEjMQLGCxERCwwREQz+dAwRBQX+/AUGEQwFCQQBGQUGBgX+5gQJBQIkEQz+OQwQEAwBxwwR/gARDAcMBMzLBAwGDBEDAwHiBAwHBwsEAeIDBAABAVUAJQKpAiMAIAAAJSImJzElLgE1NDY3NSU+ATMyFhUUBgcxBxceARUUBiMxAowFCQT+5gUGBgUBGQQIBQwRBQX8/gUFEQwlAwPjBAwHBwsEAeEDAxEMBwsEy8wEDAcMEQAABAAA/0AD/wNAAA4AHAAqAGIAABMhMjY1NCYjISIGFRQWMwU0JiMhIgYVFBYzITI2BSIGFRQWMyEyNjU0JiMFJiIPARE0JiMhIgYVERQWMyEyNjU0JiMhIiY1ETQ2MyEyFhURJyYiBwYUHwEwFjsBMjYzNy4BJ9QBtxAUFBD+SRAUFBAB2xQQ/kkQFBQQAbcQFP4lEBQUEAEAEBUVEAIdCx0LUVY8/bg9VlY9AfgQFBQQ/gghKC0cAkghKFALHQsLC5IJBR4FBAWSBQQFAfcUEBEUFBEQFLcQFRUQEBUVpxQQERQUERAULAsLUAKhPFZWPP0kPFYUERAULhsC3CEoKCH9V1ELCwsdC5MHB5MLJAsAAAAABABK/0AD/wL2ABAAGgA5AFoAAAEhIgYVERQWMyEyNjURNCYjBSEVFAYjISImNQEUBiMhMCIxIiY1OAE5ARE0NjcVFBYzITI2PQEeARUHOAExMjY1OAE5ATU4ATE0JiM4ATkBOAExIgYdARQWMzEDZP2BQFtbQAJ/QFtbQP23AhMrH/6BHysCoDMk/YIBJDMqH1M7AX87UyAp+Q4UFA4OFBQOAvZbQf2CQVtbQQJ/QFtE7RgiIhj+FyQzMyQCfiExBOw0Sko07QUxIJ0TDnYOExMOdQ4UAAAAAgAA/0AE2wNAAMwBFQAAJSImNTQ2MzI2NTQmJyM1LgEnIycuAS8CLgEvAi4BIyciJiMuASMuASMiJiMiJiMxIgYjLgEnFy4BNS4BJy4BJy4BJxcuAScuAScXJicuAScmIyIHDgEHBgcOAQcUBhUOAQ8BFAYVDgEHFQcOAQcVIiYjIgYjIgYjIgYHIgYHIgYjDgEHMwcOAQ8BDgEHNwcOAQczBw4BFTEUFjMyFhUUBiMiJy4BJyY1NDc+ATc2NzY3PgE3NjMyFx4BFxYXFhceARcWFRQHDgEHBiMlNTcXPgEzMhYXMTUXHgEXMRwBFTEUBisEMScuAScxJxEUBiMiJjURBw4BByMwIhUwIjkBKwMwIjEiJicxLgE1NDY3MQO4GCIiGEhnJx8BAwUDAQICBgIBBAIFAgIFAQUCAgEEAQMEAgMFAgIDAgQIBQEDAQIEAgEBAQIDAgEBAQMFAgEBAQEDBgMBFh4eSSkqLS0qKkkeHhUDBgMCAgUCAQICAwIDAQMCAgICBAgFAQQCAgUCAgUCAgMCBAUCAQUDBQMDBAYCAQIEBgMBASAmZkgZIiIZPDU1TxcXDxA3JiUtGSkpbEFBR0dAQWwqKRgtJiY3Dw8WF082NTz93K4BCBYNDBcIrwYIASIYAgECAgMKEQdJIhgYI0kGEQoBAgECAQECARAbBwQECQcNIRcXIGNFKkYWAQIDAgIBAwEBAQECAQEBAQIBAQEBAQEBAQEJDwcDAgMCBQsFAQMCBwoFAgEDAQYLBQIjHB0oCwsLCygdHCMFCgUBAwEDCgUCAgMBBAkGAgYGDgcCAQEBAQEBAQEBAgEBAQMBAQIDAgECAgMCARZGKkViIRcXIRYWTDIzOi8rK0YZGg08MjJJFBQUFEkyMjwNGhlGKysvOjMyTBYWggG6AQkKCgkBuwYQCgEDARchAQEKB07+5RchIRcBG04HCgEBEA0GDgcLEwcAAAAAAQAA/0AEAANAADQAAAkBFhQHDgEjIiYnCQEGIicuATU0NjcJAS4BNTQ2NzE+ATMyFhcJAT4BMzIWFzEeARUUBgcxAoEBZBsbDCITEyEN/p3+nRtMGw0ODwwBZP6cDA8ODQwiExMhDQFjAWMNIRMTIgwNDg8MAUD+nRtMGw0ODwwBZP6cGxsMIhMTIQ0BYwFjDSETEyIMDQ4PDP6cAWQMDw4NDCITEyENAAAAAAMAAP9ABAADQAAcADkAagAACQEnLgEHDgEfAR4BMzI2Nz4BNzA2MQE2NCcmIgcDIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIwEOAQcOASMiJicuAScuAScuATU0Njc+ATc+ATc+ATMyFhceARceARceARUUBgcOAQcC0f65VgcdDQ0ICG0FEQkFCQQCBAIBAWcLCwoeC9FqXV6LKCgoKIteXWpqXV6LKCgoKIteXWoBNx5GKChWLS1WKCdHHh4wEBIRERERLx8eRigoVi0tVignRx4eMBASERERETAeAg7+uJUNCAcIHA2/CQkCAwEDAgEBaAseCgsLATIoKIteXWpqXV6LKCgoKIteXWpqXV6LKCj8yR4wEBIRERERMB4eRigoVi0tVignRx4eMBASERERES8fHkYoKFYtLVYoJ0ceAAMAAP9ABAADQAAnAEQAdQAAASYiDwEnJiIHBhQfAQcGFBceATMyNj8BFx4BMzI2NzY0LwE3NjQnMQMiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjAQ4BBw4BIyImJy4BJy4BJy4BNTQ2Nz4BNz4BNz4BMzIWFx4BFx4BFx4BFRQGBw4BBwLNCh4LmpoLHgoLC5qaCwsFDQcHDQaamgYNBwcNBQsLmpoLC81qXV6LKCgoKIteXWpqXV6LKCgoKIteXWoBNx5GKChWLS1WKCdHHh4wEBIRERERLx8eRigoVi0tVignRx4eMBASERERETAeAg4KCpubCgoLHgqbmwoeCwUFBQWbmwUFBQULHQubmwoeCwEyKCiLXl1qal1eiygoKCiLXl1qal1eiygo/MkeMBASERERETAeHkYoKFYtLVYoJ0ceHjAQEhEREREvHx5GKChWLS1WKCdHHgAAAAAEAAD/QAQAA0AAMABOAF0AagAAATIWFx4BFx4BFx4BFRQGBw4BBw4BBw4BIyImJy4BJy4BJy4BNTQ2Nz4BNz4BNz4BMzUiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjMREiJjURNDYzMhYVERQGIwc0NjMyFhUUBiMiJjUCAC1WKCdHHh4wEBIRERERLx8eRigoVi0tVignRx4eMBASERERES8fHkYoKFYtal1eiygoKCiLXl1qal1eiygoKCiLXl1qERcXEREXFxEtGhMTGhoTExoC+BERES8fHkYoKFYtLVYoJ0ceHjAQEhEREREwHh5GKChWLS1WKCdHHh4wEBIRSCgoi15dampdXosoKCgoi15dampdXosoKP2AFxEBcREXFxH+jxEXbRMaGhMTGhoTAAEAAAAEzM3SUQz/Xw889QALBAAAAAAA16VfMQAAAADXpV8xAAD/QATbA0AAAAAIAAIAAAAAAAAAAQAAAzP/NAAABNsAAAAABNsAAQAAAAAAAAAAAAAAAAAAABYEAAAAAAAAAAAAAAAAAAAABAAAAAQAAFUEAAAABAAAAAQ/AF4EAADhBAAA4QQAARwEAAFVBAABHQQAAVUEAAAABAAASgTbAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAKABQAHgBUAJgA8AFWAeoCBAIeAlYCiALQAwIDjAP4BWYFvAZeBw4HqAAAAAEAAAAWARYACAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQANAAAAAQAAAAAAAgAHAOQAAQAAAAAAAwANAJYAAQAAAAAABAANAPkAAQAAAAAABQALAHUAAQAAAAAABgANAL0AAQAAAAAACgAaACcAAwABBAkAAQAaAA0AAwABBAkAAgAOAOsAAwABBAkAAwAaAKMAAwABBAkABAAaAQYAAwABBAkABQAWAIAAAwABBAkABgAaAMoAAwABBAkACgA0AEF3aWRnZXRzLWljb25zAHcAaQBkAGcAZQB0AHMALQBpAGMAbwBuAHNGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC5WZXJzaW9uIDQuOABWAGUAcgBzAGkAbwBuACAANAAuADh3aWRnZXRzLWljb25zAHcAaQBkAGcAZQB0AHMALQBpAGMAbwBuAHN3aWRnZXRzLWljb25zAHcAaQBkAGcAZQB0AHMALQBpAGMAbwBuAHNSZWd1bGFyAFIAZQBnAHUAbABhAHJ3aWRnZXRzLWljb25zAHcAaQBkAGcAZQB0AHMALQBpAGMAbwBuAHMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA);src:url(data:application/vnd.ms-fontobject;base64,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#iefix) format('embedded-opentype'),url(data:font/ttf;base64,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HgIO/riVDQgHCBwNvwkJAgMBAwIBAWgLHgoLCwEyKCiLXl1qal1eiygoKCiLXl1qal1eiygo/MkeMBASERERETAeHkYoKFYtLVYoJ0ceHjAQEhEREREvHx5GKChWLS1WKCdHHgADAAD/QAQAA0AAJwBEAHUAAAEmIg8BJyYiBwYUHwEHBhQXHgEzMjY/ARceATMyNjc2NC8BNzY0JzEDIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIwEOAQcOASMiJicuAScuAScuATU0Njc+ATc+ATc+ATMyFhceARceARceARUUBgcOAQcCzQoeC5qaCx4KCwuamgsLBQ0HBw0GmpoGDQcHDQULC5qaCwvNal1eiygoKCiLXl1qal1eiygoKCiLXl1qATceRigoVi0tVignRx4eMBASERERES8fHkYoKFYtLVYoJ0ceHjAQEhEREREwHgIOCgqbmwoKCx4Km5sKHgsFBQUFm5sFBQUFCx0Lm5sKHgsBMigoi15dampdXosoKCgoi15dampdXosoKPzJHjAQEhEREREwHh5GKChWLS1WKCdHHh4wEBIRERERLx8eRigoVi0tVignRx4AAAAABAAA/0AEAANAADAATgBdAGoAAAEyFhceARceARceARUUBgcOAQcOAQcOASMiJicuAScuAScuATU0Njc+ATc+ATc+ATM1IgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIzERIiY1ETQ2MzIWFREUBiMHNDYzMhYVFAYjIiY1AgAtVignRx4eMBASERERES8fHkYoKFYtLVYoJ0ceHjAQEhEREREvHx5GKChWLWpdXosoKCgoi15dampdXosoKCgoi15dahEXFxERFxcRLRoTExoaExMaAvgREREvHx5GKChWLS1WKCdHHh4wEBIRERERMB4eRigoVi0tVignRx4eMBASEUgoKIteXWpqXV6LKCgoKIteXWpqXV6LKCj9gBcRAXERFxcR/o8RF20TGhoTExoaEwABAAAABMzN0lEM/18PPPUACwQAAAAAANelXzEAAAAA16VfMQAA/0AE2wNAAAAACAACAAAAAAAAAAEAAAMz/zQAAATbAAAAAATbAAEAAAAAAAAAAAAAAAAAAAAWBAAAAAAAAAAAAAAAAAAAAAQAAAAEAABVBAAAAAQAAAAEPwBeBAAA4QQAAOEEAAEcBAABVQQAAR0EAAFVBAAAAAQAAEoE2wAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AVACYAPABVgHqAgQCHgJWAogC0AMCA4wD+AVmBbwGXgcOB6gAAAABAAAAFgEWAAgAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADQAAAAEAAAAAAAIABwDkAAEAAAAAAAMADQCWAAEAAAAAAAQADQD5AAEAAAAAAAUACwB1AAEAAAAAAAYADQC9AAEAAAAAAAoAGgAnAAMAAQQJAAEAGgANAAMAAQQJAAIADgDrAAMAAQQJAAMAGgCjAAMAAQQJAAQAGgEGAAMAAQQJAAUAFgCAAAMAAQQJAAYAGgDKAAMAAQQJAAoANABBd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuVmVyc2lvbiA0LjgAVgBlAHIAcwBpAG8AbgAgADQALgA4d2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByd2lkZ2V0cy1pY29ucwB3AGkAZABnAGUAdABzAC0AaQBjAG8AbgBzAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'),url(data:font/woff;base64,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) format('woff'),url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiID4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8bWV0YWRhdGE+Cjxqc29uPgo8IVtDREFUQVsKewoJImZvbnRGYW1pbHkiOiAiY29tcG9uZW50cy1pY29ucyIsCgkiZGVzY3JpcHRpb24iOiAiRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4iLAoJIm1ham9yVmVyc2lvbiI6IDQsCgkibWlub3JWZXJzaW9uIjogOCwKCSJ2ZXJzaW9uIjogIlZlcnNpb24gNC44IiwKCSJmb250SWQiOiAiY29tcG9uZW50cy1pY29ucyIsCgkicHNOYW1lIjogImNvbXBvbmVudHMtaWNvbnMiLAoJInN1YkZhbWlseSI6ICJSZWd1bGFyIiwKCSJmdWxsTmFtZSI6ICJjb21wb25lbnRzLWljb25zIgp9Cl1dPgo8L2pzb24+CjwvbWV0YWRhdGE+CjxkZWZzPgo8Zm9udCBpZD0iY29tcG9uZW50cy1pY29ucyIgaG9yaXotYWR2LXg9IjEwMjQiPgo8Zm9udC1mYWNlIHVuaXRzLXBlci1lbT0iMTAyNCIgYXNjZW50PSI4MTkuMiIgZGVzY2VudD0iLTIwNC44IiAvPgo8bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMTAyNCIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeDIwOyIgaG9yaXotYWR2LXg9IjAiIGQ9IiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmE7IiBnbHlwaC1uYW1lPSJsaW5lLWxheWVyIiBkYXRhLXRhZ3M9ImxpbmUtbGF5ZXIiIGQ9Ik03NjcuMzA3IDUxMy44NDlsLTQ0OS4xNzYtNDQ5LjE3NmMxNC42MTYtMjQuNjM4IDIzLjI1NC01NC4zMTEgMjMuMjU0LTg2LjAwMSAwLTk0LjI1My03Ni40MDctMTcwLjY2LTE3MC42Ni0xNzAuNjZzLTE3MC42NiA3Ni40MDctMTcwLjY2IDE3MC42NmMwIDk0LjI1MyA3Ni40MDcgMTcwLjY2IDE3MC42NiAxNzAuNjYgMzguMzY4IDAgNzMuNzc5LTEyLjY2MiAxMDIuMjgyLTM0LjAzNGwtMC40NDIgMC4zMTcgNDQzLjcxNSA0NDMuODg2Yy0yMS4wNTUgMjguMDYxLTMzLjcxNyA2My40NzItMzMuNzE3IDEwMS44NCAwIDk0LjI1MyA3Ni40MDcgMTcwLjY2IDE3MC42NiAxNzAuNjZzMTcwLjY2LTc2LjQwNyAxNzAuNjYtMTcwLjY2YzAtOTQuMjUzLTc2LjQwNy0xNzAuNjYtMTcwLjY2LTE3MC42Ni0zMS42OSAwLTYxLjM2MyA4LjYzOC04Ni43OTMgMjMuNjg3bDAuNzkyLTAuNDM0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmM7IiBnbHlwaC1uYW1lPSJtYXJrZXItbGF5ZXIiIGRhdGEtdGFncz0ibWFya2VyLWxheWVyIiBkPSJNNTEyIDgzMmMtMjM1LjYwNSAwLTQyNi42NjctMTg2LjI4My00MjYuNjY3LTQxNnM0MjYuNjY3LTYwOCA0MjYuNjY3LTYwOCA0MjYuNjY3IDM3OC4yODMgNDI2LjY2NyA2MDgtMTkxLjA2MSA0MTYtNDI2LjY2NyA0MTZ6TTUxMiAyMzQuNjY3Yy0wLjAwNCAwLTAuMDA4IDAtMC4wMTMgMC05NC4yNTcgMC0xNzAuNjY3IDc2LjQxLTE3MC42NjcgMTcwLjY2N3M3Ni40MSAxNzAuNjY3IDE3MC42NjcgMTcwLjY2N2MwLjAwNSAwIDAuMDA5IDAgMC4wMTQgMGgtMC4wMDFjOTQuMjUxLTAuMDA3IDE3MC42NTQtNzYuNDE1IDE3MC42NTQtMTcwLjY2N3MtNzYuNDAzLTE3MC42NTktMTcwLjY1My0xNzAuNjY3aC0wLjAwMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNjJkOyIgZ2x5cGgtbmFtZT0icG9pbnQtbGF5ZXIiIGRhdGEtdGFncz0icG9pbnQtbGF5ZXIiIGQ9Ik02ODIuNjY3IDMyMGMtMTQxLjM4NSAwLTI1NiAxMTQuNjE1LTI1NiAyNTZzMTE0LjYxNSAyNTYgMjU2IDI1NnYwYzE0MS4zODUgMCAyNTYtMTE0LjYxNSAyNTYtMjU2cy0xMTQuNjE1LTI1Ni0yNTYtMjU2djB6TTE3MC42NjcgNjRjLTAuMDA0IDAtMC4wMDggMC0wLjAxMyAwLTk0LjI1NyAwLTE3MC42NjcgNzYuNDEtMTcwLjY2NyAxNzAuNjY3czc2LjQxIDE3MC42NjcgMTcwLjY2NyAxNzAuNjY3YzAuMDA1IDAgMC4wMDkgMCAwLjAxNCAwaC0wLjAwMWM5NC4yNTEtMC4wMDcgMTcwLjY1NC03Ni40MTUgMTcwLjY1NC0xNzAuNjY3cy03Ni40MDMtMTcwLjY1OS0xNzAuNjUzLTE3MC42NjdoLTAuMDAxek03MjUuMzMzLTEwNi42NjdjLTcwLjY5MiAwLTEyOCA1Ny4zMDgtMTI4IDEyOHM1Ny4zMDggMTI4IDEyOCAxMjh2MGM3MC42OTIgMCAxMjgtNTcuMzA4IDEyOC0xMjhzLTU3LjMwOC0xMjgtMTI4LTEyOHYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MmU7IiBnbHlwaC1uYW1lPSJwb2x5Z29uLWxheWVyIiBkYXRhLXRhZ3M9InBvbHlnb24tbGF5ZXIiIGQ9Ik0xNjAgNTEyYy04OC4zNjYgMC0xNjAgNzEuNjM0LTE2MCAxNjBzNzEuNjM0IDE2MCAxNjAgMTYwdjBjODguMzY2IDAgMTYwLTcxLjYzNCAxNjAtMTYwcy03MS42MzQtMTYwLTE2MC0xNjB2MHpNODY0IDUxMmMtODguMzY2IDAtMTYwIDcxLjYzNC0xNjAgMTYwczcxLjYzNCAxNjAgMTYwIDE2MHYwYzg4LjM2NiAwIDE2MC03MS42MzQgMTYwLTE2MHMtNzEuNjM0LTE2MC0xNjAtMTYwdjB6TTg2NC0xOTJjLTg4LjM2NiAwLTE2MCA3MS42MzQtMTYwIDE2MHM3MS42MzQgMTYwIDE2MCAxNjB2MGM4OC4zNjYgMCAxNjAtNzEuNjM0IDE2MC0xNjBzLTcxLjYzNC0xNjAtMTYwLTE2MHYwek0xNjAtMTkyYy04OC4zNjYgMC0xNjAgNzEuNjM0LTE2MCAxNjBzNzEuNjM0IDE2MCAxNjAgMTYwdjBjODguMzY2IDAgMTYwLTcxLjYzNCAxNjAtMTYwcy03MS42MzQtMTYwLTE2MC0xNjB2MHpNMzIwIDcwNGgzODR2LTY0aC0zODR6TTMyMCAwaDM4NHYtNjRoLTM4NHpNMTkyIDUxMnYtMzg0aC02NHYzODR6TTg5NiA1MTJ2LTM4NGgtNjR2Mzg0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2MzA7IiBnbHlwaC1uYW1lPSJzZWFyY2giIGRhdGEtdGFncz0ic2VhcmNoIiBob3Jpei1hZHYteD0iMTA4NyIgZD0iTTc3MC42NiA2MTguMzEyYy02My42MDkgNjQuMzUxLTE1MS44ODIgMTA0LjIwNC0yNDkuNDYzIDEwNC4yMDRzLTE4NS44NTQtMzkuODUzLTI0OS40My0xMDQuMTdsLTAuMDMzLTAuMDM0Yy02My44NzYtNjQuNTkxLTEwMy4zMzUtMTUzLjQ0My0xMDMuMzM1LTI1MS41MTFzMzkuNDYtMTg2LjkxOSAxMDMuMzY4LTI1MS41NDNsLTAuMDMyIDAuMDMzYzYzLjYxNy02NC4zMzUgMTUxLjg4Ny0xMDQuMTc3IDI0OS40NjMtMTA0LjE3N3MxODUuODQ3IDM5Ljg0MiAyNDkuNDMxIDEwNC4xNDVsMC4wMzIgMC4wMzJjNjMuODc2IDY0LjU5MSAxMDMuMzM1IDE1My40NDMgMTAzLjMzNSAyNTEuNTExcy0zOS40NiAxODYuOTE5LTEwMy4zNjggMjUxLjU0M2wwLjAzMi0wLjAzM3pNMTk0LjkzNyAzNy44NTNjLTE4MC4xNTMgMTgxLjc1My0xODAuMTUzIDQ3Ni4yMDYgMCA2NTcuODk2IDgzLjIxNiA4NC4xMzQgMTk4LjY3IDEzNi4yMzUgMzI2LjI5MiAxMzYuMjM1czI0My4wNzYtNTIuMTAxIDMyNi4yNTEtMTM2LjE5NGwwLjA0MS0wLjA0MWMxODAuMTUzLTE4MS42ODkgMTgwLjE1My00NzYuMTQyIDAtNjU3Ljg5Ni04My4yMTYtODQuMTM0LTE5OC42Ny0xMzYuMjM1LTMyNi4yOTItMTM2LjIzNXMtMjQzLjA3NiA1Mi4xMDEtMzI2LjI1MSAxMzYuMTk0bC0wLjA0MSAwLjA0MXpNMTA1Ni45ODUtMTczLjMzOWMtMTEuMzcyLTExLjQ4NS0yNy4xNDMtMTguNTk3LTQ0LjU3NC0xOC41OTdzLTMzLjIwMyA3LjExMi00NC41NjkgMTguNTkybC0wLjAwNSAwLjAwNS04OS4xNDkgODkuODUzYy0xMS40MDMgMTEuNTQxLTE4LjQ0NiAyNy40MTEtMTguNDQ2IDQ0LjkyNnM3LjA0MyAzMy4zODUgMTguNDUyIDQ0LjkzM2wtMC4wMDYtMC4wMDZjMTEuMzcyIDExLjQ4NSAyNy4xNDMgMTguNTk3IDQ0LjU3NCAxOC41OTdzMzMuMjAzLTcuMTEyIDQ0LjU2OS0xOC41OTJsMC4wMDUtMC4wMDUgODkuMTQ5LTg5Ljg1M2MxMS40MTgtMTEuNTM0IDE4LjQ3Mi0yNy40MDYgMTguNDcyLTQ0LjkyNnMtNy4wNTQtMzMuMzkyLTE4LjQ3Ny00NC45MzJsMC4wMDUgMC4wMDV6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTYzYTsiIGdseXBoLW5hbWU9InNvbGlkLS11cC10cmlhbmdsZSIgZGF0YS10YWdzPSJzb2xpZC11cC10cmlhbmdsZSIgZD0iTTU1Mi44NTggNTgxLjgzN2MtMjIuNTI4IDI1LjA4OC01OC42NzUgMjUuNi04MS43MTUgMGwtMjQ1Ljk2NS0yNzMuNDA4Yy00NS4xNTgtNTAuMTc2LTI2LjQxOS05MC44MjkgNDEuNTc0LTkwLjgyOWg0OTAuNDk2YzY4LjA5NiAwIDg2LjczMyA0MC43NTUgNDEuNTc0IDkwLjkzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNjNiOyIgZ2x5cGgtbmFtZT0ic29saWQtZG93bi10cmlhbmdsZSIgZGF0YS10YWdzPSJzb2xpZC1kb3duLXRyaWFuZ2xlIiBkPSJNNDcxLjE0MiA1OC4xNjNjMjIuNTI4LTI1LjA4OCA1OC42NzUtMjUuNiA4MS43MTUgMGwyNDUuOTY1IDI3My40MDhjNDUuMTU4IDUwLjE3NiAyNi40MTkgOTAuODI5LTQxLjU3NCA5MC44MjloLTQ5MC40OTZjLTY4LjA5NiAwLTg2LjczMy00MC43NTUtNDEuNTc0LTkwLjkzMXoiIC8+CjxnbHlwaCB1bmljb2RlPSImI3hlNmE0OyIgZ2x5cGgtbmFtZT0iZmlyc3QiIGRhdGEtdGFncz0iZmlyc3QiIGQ9Ik0yODQuNDQ0IDU0Ny41NTZoNTYuODg5di01MTJoLTU2Ljg4OXpNNzEwLjk0IDM2LjIzOGMtNi45MTYgMC4wMzYtMTMuMjYgMi40NTMtMTguMjYyIDYuNDczbDAuMDU3LTAuMDQ0LTI4Mi4xMTIgMjI2LjgxNmMtNi42MzQgNS4zODMtMTAuODM5IDEzLjUzNS0xMC44MzkgMjIuNjdzNC4yMDUgMTcuMjg3IDEwLjc4NSAyMi42MjhsMC4wNTQgMC4wNDIgMjgwLjgwNCAyMjUuNjc4YzQuOTM2IDMuOTkgMTEuMjg4IDYuNDA1IDE4LjIwNCA2LjQwNSAxNi4wNTggMCAyOS4wNzUtMTMuMDE3IDI5LjA3NS0yOS4wNzUgMC05LjE0MS00LjIxOS0xNy4yOTctMTAuODE1LTIyLjYyN2wtMC4wNTUtMC4wNDMtMjUyLjU4Ny0yMDIuOTggMjUzLjgzOC0yMDQuMjMxYzYuNjMzLTUuMzcyIDEwLjgzOC0xMy41MTYgMTAuODM4LTIyLjY0MiAwLTE2LjA0NS0xMi45OTktMjkuMDU0LTI5LjA0MS0yOS4wNzBoLTAuMDAyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTU7IiBnbHlwaC1uYW1lPSJuZXh0IiBkYXRhLXRhZ3M9Im5leHQiIGQ9Ik0zNzAuNDA0IDM2LjkyMWM2LjkxNiAwLjAzNiAxMy4yNiAyLjQ1MyAxOC4yNjIgNi40NzNsLTAuMDU3LTAuMDQ0IDI4Mi4wNTUgMjI2LjgxNmM2LjYzNCA1LjM4MyAxMC44MzkgMTMuNTM1IDEwLjgzOSAyMi42N3MtNC4yMDUgMTcuMjg3LTEwLjc4NSAyMi42MjhsLTAuMDU0IDAuMDQyLTI4MC44MDQgMjI1LjYyMWMtNC43OTMgMy42MTctMTAuODUgNS43OTQtMTcuNDE1IDUuNzk0LTE2LjA1NSAwLTI5LjA3MC0xMy4wMTUtMjkuMDcwLTI5LjA3MCAwLTguNzc3IDMuODktMTYuNjQ2IDEwLjA0MC0yMS45NzZsMC4wMzYtMC4wMzEgMjUyLjU4Ny0yMDIuOTgtMjUzLjgzOC0yMDQuMjMxYy02LjYzMy01LjM3Mi0xMC44MzgtMTMuNTE2LTEwLjgzOC0yMi42NDIgMC0xNi4wNDUgMTIuOTk5LTI5LjA1NCAyOS4wNDEtMjkuMDcwaDAuMDAyeiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTY7IiBnbHlwaC1uYW1lPSJsYXN0IiBkYXRhLXRhZ3M9Imxhc3QiIGQ9Ik03MDkuNTE4IDU0Ny41NTZjMTUuNzA5IDAgMjguNDQ0LTEyLjczNSAyOC40NDQtMjguNDQ0djAtNDU1LjExMWMwLTE1LjcwOS0xMi43MzUtMjguNDQ0LTI4LjQ0NC0yOC40NDRzLTI4LjQ0NCAxMi43MzUtMjguNDQ0IDI4LjQ0NHYwIDQ1NS4xMTFjMCAxNS43MDkgMTIuNzM1IDI4LjQ0NCAyOC40NDQgMjguNDQ0djB6TTMxMy41NzIgMzYuMjM4Yy0xNi4wNDMgMC4wMTYtMjkuMDQyIDEzLjAyNS0yOS4wNDIgMjkuMDcwIDAgOS4xMjYgNC4yMDUgMTcuMjcgMTAuNzgzIDIyLjU5OWwwLjA1NCAwLjA0MyAyNTMuODM4IDIwNC4yMzEtMjUyLjU4NyAyMDIuOThjLTYuMjY0IDUuMzY1LTEwLjIwOSAxMy4yODItMTAuMjA5IDIyLjEyMSAwIDE2LjA1NSAxMy4wMTUgMjkuMDcwIDI5LjA3MCAyOS4wNzAgNi41OTggMCAxMi42ODQtMi4xOTggMTcuNTYzLTUuOTAzbC0wLjA3MiAwLjA1MiAyODAuODA0LTIyNS42NzhjNi42NzMtNS4zNjIgMTAuOTA3LTEzLjUyMSAxMC45MDctMjIuNjdzLTQuMjM1LTE3LjMwOS0xMC44NTEtMjIuNjI2bC0wLjA1Ni0wLjA0NC0yODEuOTk4LTIyNi44MTZjLTQuOTQ0LTMuOTc1LTExLjI4OS02LjM5Mi0xOC4xOTYtNi40MjhoLTAuMDA4eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTc7IiBnbHlwaC1uYW1lPSJwcmV2IiBkYXRhLXRhZ3M9InByZXYiIGQ9Ik02NTIuNDU5IDM2LjkyMWMtNi45MTYgMC4wMzYtMTMuMjYgMi40NTMtMTguMjYyIDYuNDczbDAuMDU3LTAuMDQ0LTI4Mi4xMTIgMjI2LjgxNmMtNi42MzQgNS4zODMtMTAuODM5IDEzLjUzNS0xMC44MzkgMjIuNjdzNC4yMDUgMTcuMjg3IDEwLjc4NSAyMi42MjhsMC4wNTQgMC4wNDIgMjgwLjgwNCAyMjUuNjIxYzQuNzkzIDMuNjE3IDEwLjg1IDUuNzk0IDE3LjQxNSA1Ljc5NCAxNi4wNTUgMCAyOS4wNzAtMTMuMDE1IDI5LjA3MC0yOS4wNzAgMC04Ljc3Ny0zLjg5LTE2LjY0Ni0xMC4wNDAtMjEuOTc2bC0wLjAzNi0wLjAzMS0yNTIuNTg3LTIwMi45OCAyNTMuODM4LTIwNC4yMzFjNi42MzMtNS4zNzIgMTAuODM4LTEzLjUxNiAxMC44MzgtMjIuNjQyIDAtMTYuMDQ1LTEyLjk5OS0yOS4wNTQtMjkuMDQxLTI5LjA3MGgtMC4wMDJ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTZhODsiIGdseXBoLW5hbWU9InBvaS1sb2FkIiBkYXRhLXRhZ3M9InBvaS1sb2FkIiBkPSJNMjEyLjMzNCA1MDIuODU3aDQzOC4zNDVjMjEuOTQzIDAgMzYuNTcxIDE0LjYyOSAzNi41NzEgMzYuNTcxcy0xNC42MjkgMzYuNTcxLTM2LjU3MSAzNi41NzFoLTQzOC4zNDVjLTIxLjk0MyAwLTM2LjU3MS0xNC42MjktMzYuNTcxLTM2LjU3MXMxNC42MjktMzYuNTcxIDM2LjU3MS0zNi41NzF6TTY4Ny4yNSAzMjBjMCAyMS45NDMtMTQuNjI5IDM2LjU3MS0zNi41NzEgMzYuNTcxaC00MzguMzQ1Yy0yMS45NDMgMC0zNi41NzEtMTQuNjI5LTM2LjU3MS0zNi41NzFzMTQuNjI5LTM2LjU3MSAzNi41NzEtMzYuNTcxaDQzOC4zNDVjMjEuOTQzIDAgMzYuNTcxIDE0LjYyOSAzNi41NzEgMzYuNTcxek0yMTIuMzM0IDEzNy4xNDNjLTIxLjk0MyAwLTM2LjU3MS0xNC42MjktMzYuNTcxLTM2LjU3MXMxNC42MjktMzYuNTcxIDM2LjU3MS0zNi41NzFoMjU1LjcwN2MyMS45NDMgMCAzNi41NzEgMTQuNjI5IDM2LjU3MSAzNi41NzFzLTE0LjYyOSAzNi41NzEtMzYuNTcxIDM2LjU3MXpNMTAwOC42NCA5My4yNTdjLTE0LjU1NSAxNC42MjktMzYuNDk4IDE0LjYyOS01MS4wNTQgMGwtODAuNDU3LTgwLjQ1N3Y2NzIuOTE0YzAgODAuNDU3LTY1LjY4MiAxNDYuMjg2LTE0Ni4wNjYgMTQ2LjI4NmgtNTg0LjQ4NWMtODAuMzg0IDAtMTQ2LjEzOS02NS44MjktMTQ2LjEzOS0xNDYuMjg2di03MzEuNDI5YzAtODAuNDU3IDY1LjgyOS0xNDYuMjg2IDE0Ni4xMzktMTQ2LjI4Nmg1MDQuMTAxYzIxLjk0MyAwIDM2LjU3MSAxNC42MjkgMzYuNTcxIDM2LjU3MXMtMTQuNjI5IDM2LjU3MS0zNi41NzEgMzYuNTcxaC01MDQuMTAxYy00My44ODYgMC03My4wNzAgMzYuNTcxLTczLjA3MCA3My4xNDN2NzMxLjQyOWMwIDQzLjg4NiAzNi41NzEgNzMuMTQzIDczLjA3MCA3My4xNDNoNTg0LjQ4NWM0My44ODYgMCA3My4wNzAtMjkuMjU3IDczLjA3MC03My4xNDN2LTY4MC4yMjlsLTgwLjM4NCA4MC40NTdjLTE0LjYyOSAxNC42MjktMzYuNTcxIDE0LjYyOS01MS4xMjcgMC0xNC42MjktMTQuNjI5LTE0LjYyOS0zNi41NzEgMC01MS4ybDE0Ni4xMzktMTQ2LjI4NnM3LjMxNC03LjMxNCAxNC42MjktNy4zMTRoMjkuMjU3YzcuMjQxIDAgNy4yNDEgNy4zMTQgMTQuNTU1IDcuMzE0bDE0Ni4xMzkgMTQ2LjI4NmMtNy4zMTQgMTQuNjI5LTcuMzE0IDQzLjg4Ni0xNC42MjkgNTguNTE0eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YTk7IiBnbHlwaC1uYW1lPSJwb2ktc2F2ZSIgZGF0YS10YWdzPSJwb2ktc2F2ZSIgZD0iTTg2Ny42OTQgNzU4LjI3MmgtNjM4LjI0NWMtODYuMDE2IDAtMTU1Ljc5NC02OS43MDUtMTU1Ljc5NC0xNTUuNzk0di02MzguNjgzYzAtODYuMDg5IDY5Ljc3OC0xNTUuNzk0IDE1NS43OTQtMTU1Ljc5NGg2MzguMjQ1Yzg2LjAxNiAwIDE1NS43OTQgNjkuNzA1IDE1NS43OTQgMTU1Ljc5NHY2MzguNzU3YzAgODYuMDE2LTY5Ljc3OCAxNTUuNzk0LTE1NS43OTQgMTU1Ljc5NHpNMjgyLjg0MyA2OTAuMjQ5aDUzMS40NTZ2LTIzNy40OTVjMC0zMi4xMS0zMy4yMDctNTguMjIyLTc0LjAyMS01OC4yMjJoLTM4My40MTVjLTQwLjgxNCAwLTc0LjAyMSAyNi4xMTItNzQuMDIxIDU4LjIyMnpNOTU1LjM5Mi0zNS42OTRjMC00OC40OTQtMzkuMjA1LTg3LjY5OC04Ny43NzEtODcuNjk4aC02MzguMDk4Yy0wLjAyMiAwLTAuMDQ4IDAtMC4wNzMgMC00OC4zOTQgMC04Ny42MjUgMzkuMjMxLTg3LjYyNSA4Ny42MjUgMCAwLjA1MSAwIDAuMTAzIDAgMC4xNTR2LTAuMDA4IDYzOC4wOThjMCA0My41MiAzMS41OTggNzkuNTA2IDcyLjk5NyA4Ni4wMTZ2LTIzNi4zMjVjMC02OS43MDUgNjMuNzA3LTEyNi4zMTggMTQyLjExNy0xMjYuMzE4aDM4My40MTVjNzguNDA5IDAgMTQyLjExNyA1Ni42MTMgMTQyLjExNyAxMjYuMzE4djIzNi45ODNjNDEuMzk5LTcuMDk1IDcyLjk5Ny00My4wODEgNzIuOTk3LTg2LjA4OXpNNzA1Ljk3NSA0NDUuNzMzYzAuMDIyIDAgMC4wNDcgMCAwLjA3MyAwIDE4LjU4MiAwIDMzLjY0NiAxNS4wNjQgMzMuNjQ2IDMzLjY0NiAwIDAuMDI2IDAgMC4wNTEgMCAwLjA3N3YtMC4wMDQgMTE3LjEwMmMwIDAuMDQzIDAgMC4wOTUgMCAwLjE0NiAwIDE4LjU4Mi0xNS4wNjQgMzMuNjQ2LTMzLjY0NiAzMy42NDYtMC4wMjYgMC0wLjA1MiAwLTAuMDc3IDBoMC4wMDRjLTAuMDg3IDAuMDAxLTAuMTkxIDAuMDAxLTAuMjk0IDAuMDAxLTE4LjcyMiAwLTMzLjkxOC0xNS4wOTUtMzQuMDgzLTMzLjc3OHYtMTE3LjA0NWMwLjUyNi0xOC42NTIgMTUuNjc0LTMzLjU5NiAzNC4zNTgtMzMuNzkyaDAuMDE5eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU2YWM7IiBnbHlwaC1uYW1lPSJ1cGxvYWQiIGRhdGEtdGFncz0idXBsb2FkIiBob3Jpei1hZHYteD0iMTI0MyIgZD0iTTk1Mi4wMjcgMTIuOGMtMzIuMTgzIDAtNTguMjk1IDI1LjAxNS01OC4yOTUgNTUuODgxIDAgMzAuNzkzIDI2LjExMiA1NS44MDggNTguMjk1IDU1LjgwOCA5Ni41NDkgMCAxNzQuODExIDc1LjA0NSAxNzQuODExIDE2Ny41Ny0wLjIgNTUuNDMzLTI3Ljg0OSAxMDQuMzY3LTcwLjA1NSAxMzMuOTRsLTAuNTI3IDAuMzUtMC43MzEgMC41ODVjLTMuMTQ2IDIuMjQzLTYuOTY0IDQuNzMxLTEwLjg3OCA3LjA3NmwtMC44MjUgMC40NTgtMS45MDIgMS4wOTdjLTIuODAxIDEuNjgyLTYuNTM5IDMuNzA0LTEwLjM1MiA1LjU5NmwtMS4wNTggMC40NzUtMy4yMTggMS40NjNjLTIuNDA3IDEuMTk0LTYuMDIzIDIuNzctOS42OTYgNC4yMzNsLTEuMjc1IDAuNDQ4LTQuODI3IDEuNjgyYy0yLjAyMCAwLjc5OS01LjM3NyAxLjkyMS04Ljc3NSAyLjk0OWwtMS4zMTkgMC4zNDNjLTIuMjY3IDAuNjU4LTQuNjA4IDEuMDk3LTYuODc1IDEuNjgyLTIuOTI2IDAuNzMxLTUuODUxIDEuNDYzLTguODUgMi4wNDgtMy4yMTggMC41ODUtNi40MzcgMC45NTEtOS42NTUgMS4zOS0yLjI2NyAwLjI5My00LjUzNSAwLjczMS02Ljg3NSAwLjk1MS01LjEyMiAwLjUwNi0xMS4wODAgMC43OTgtMTcuMTA1IDAuODA1aC0wLjAxMGMtMS44MjkgMC0zLjY1Ny0wLjIxOS01LjQxMy0wLjIxOS0yLjEzNCAxMS40NjQtNC40NCAyMC45MTUtNy4xODggMzAuMTc1bDAuNTMyLTIuMDg5Yy0wLjY1OCAyLjI2Ny0xLjQ2MyA0LjM4OS0yLjE5NCA2LjY1Ni0yLjE5NCA3LjAyMi00LjM4OSAxMy44OTctNy4wOTUgMjAuNjk5LTAuODA1IDIuMDQ4LTEuODI5IDQuMDIzLTIuNjMzIDYuMDcxLTMuNjcgOC45NTItNi43NjMgMTUuNjQyLTEwLjA3MSAyMi4yMDVsMC44NTUtMS44NzFjLTAuNzMxIDEuNjA5LTEuNzU1IDMuMTQ1LTIuNTYgNC42ODEtNC40NTcgOC41ODEtOC4zMTggMTUuMjc5LTEyLjQxIDIxLjgxOGwwLjc4MS0xLjMzOGMtNTcuNjM3IDkyLjE2LTE2Mi42NyAxNTMuODkzLTI4Mi45MTcgMTUzLjg5My0xMjAuMzIgMC0yMjUuMjgtNjEuODA2LTI4Mi45MTctMTUzLjg5My00LjE2OS02LjY1Ni03Ljk3My0xMy41MzEtMTEuNzAzLTIwLjQ4LTAuNzMxLTEuNTM2LTEuNjgyLTMuMDcyLTIuNDg3LTQuNjgxLTIuNDg0LTQuNzQ3LTUuNTc3LTExLjQzNy04LjQzOS0xOC4yNDhsLTAuNzc3LTIuMDg2Yy0wLjgwNS0yLjA0OC0xLjgyOS00LjAyMy0yLjYzMy02LjA3MS0xLjk0Ny00LjcxNi00LjM2MS0xMS41OS02LjUyNy0xOC41NzNsLTAuNTY4LTIuMTI2LTIuMTk0LTYuNTgzYy0yLjIwMy03LjIwNi00LjQ4NS0xNi42ODYtNi4yOTctMjYuMzMybC0wLjI4NS0xLjgyOGMtMS45MDIgMC0zLjY1NyAwLjIxOS01LjQ4NiAwLjIxOS01Ljc3OCAwLTExLjQ4My0wLjI5My0xNy4xMTUtMC44MDUtMi4zNDEtMC4yMTktNC42MDgtMC42NTgtNi44NzUtMC45NTEtMy4yMTgtMC40MzktNi40MzctMC44MDUtOS42NTUtMS40NjMtMi45MjYtMC41MTItNS44NTEtMS4yNDMtOC43NzctMS45NzUtMi4zNDEtMC41ODUtNC42ODEtMS4wMjQtNi45NDktMS42ODItNC43Mi0xLjM3MS04LjA3Ny0yLjQ5My0xMS4zOS0zLjcwN2wxLjI5NiAwLjQxNS00LjkwMS0xLjY4MmMtMy42NTctMS40NjMtNy4zMTQtMi45MjYtMTAuODk4LTQuNjA4bC0zLjIxOC0xLjQ2M2MtNC44MjEtMi4zNjQtOC41NTgtNC40MDktMTIuMjA4LTYuNTg0bDAuNzk3IDAuNDQtMS45MDItMS4wOTdjLTQuNzUzLTIuODE2LTguNTcxLTUuMzA0LTEyLjI4OS03LjkyNmwwLjU4NiAwLjM5Mi0wLjczMS0wLjU4NWMtNDIuNzI1LTI5LjkzMi03MC4zNy03OC44Ni03MC41ODMtMTM0LjI1N3YtMC4wMzNjMC05Mi41MjYgNzguMjYzLTE2Ny40OTcgMTc0LjgxMS0xNjcuNDk3IDMyLjE4MyAwIDU4LjI5NS0yNS4wODggNTguMjk1LTU1Ljg4MSAwLTMwLjg2Ni0yNi4xMTItNTUuODgxLTU4LjI5NS01NS44ODEtMTYwLjkxNCAwLTI5MS40MDEgMTI1LjA3NC0yOTEuNDAxIDI3OS4yNTkgMCAxMjUuODA2IDg2LjgyMSAyMzIuMTU1IDIwNi4yNjMgMjY3LjExOCA2NC43MzEgMTU5LjQ1MSAyMjYuMDExIDI3Mi44MjMgNDE1LjQ1MSAyNzIuODIzczM1MC42NDctMTEzLjM3MSA0MTUuNTI1LTI3Mi44MjNjMTE5LjM2OS0zNC45NjIgMjA2LjE5LTE0MS4zMTIgMjA2LjE5LTI2Ny4xMTggMC0xNTQuMTg1LTEzMC40ODctMjc5LjI1OS0yOTEuNDAxLTI3OS4yNTl6TTQwMy41MjkgMTQzLjI4N2wwLjIxOSAwLjIxOSAxNzQuNjY1IDE4Ni4wMDIgMC4xNDYtMC4xNDZjMTAuODEzIDExLjUzNCAyNi4xNDQgMTguNzIxIDQzLjE1NCAxOC43MjFzMzIuMzQyLTcuMTg2IDQzLjEyNC0xOC42ODhsMC4wMzAtMC4wMzIgMC4xNDYgMC4xNDYgMTc0Ljg4NS0xODYuMTQ5YzguMTE5LTguNzA0IDEzLjQ1OC0xOS43NDkgMTQuNjI5LTMyLjAzN3YtMC4xNDZjMC4xOTktMS41MDMgMC4zMzEtMy4yNzYgMC4zNjUtNS4wNzNsMC4wMDEtMC4wNDdjMC0zMC45MzktMjYuMTEyLTU1Ljk1NC01OC4yOTUtNTUuOTU0aC0xLjkwMmwtMS4xNyAwLjA3My0xLjI0MyAwLjA3My0xLjkwMiAwLjIxOWgtMC43MzFsLTIuNDg3IDAuMzY2Yy0xMy40NzUgMi4wOTgtMjUuMTc2IDguNTA2LTMzLjkxMiAxNy43NDZsLTAuMDI2IDAuMDI4LTczLjIxNiA3Ny44OTd2LTI4Mi42MjRjMC0zMC44NjYtMjYuMTEyLTU1Ljg4MS01OC4yOTUtNTUuODgxcy01OC4yOTUgMjUuMDE1LTU4LjI5NSA1NS44ODF2MjgyLjYyNGwtNzMuMjE2LTc3Ljk3Yy04Ljc0NC05LjI0LTIwLjQyMS0xNS42MjUtMzMuNTM3LTE3LjY1OWwtMC4zMjktMC4wNDJjLTAuODc4LTAuMjE5LTEuNjgyLTAuMjkzLTIuNTYtMC4zNjYtMC4xOC0wLjAyNS0wLjQzMi0wLjA1MS0wLjY4Ni0wLjA3MGwtMC4wNDYtMC4wMDMtMS45MDItMC4yMTloLTEuMjQzbC0xLjA5Ny0wLjA3M2gtMS45NzVjLTAuMTQzLTAuMDAxLTAuMzEzLTAuMDAyLTAuNDgyLTAuMDAyLTIxLjU0IDAtNDAuMzY4IDExLjYwOS01MC41NjkgMjguOTEybC0wLjE0OSAwLjI3NGMtNC40ODYgNy42NzYtNy4xMzQgMTYuODk5LTcuMTM0IDI2Ljc0MiAwIDE0LjQ3OCA1LjczMSAyNy42MTggMTUuMDQ5IDM3LjI3NGwtMC4wMTUtMC4wMTZ6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTZhZTsiIGdseXBoLW5hbWU9ImNsb3NlIiBkYXRhLXRhZ3M9ImNsb3NlIiBkPSJNNjQxLjM2NSAzMjBsMzU1LjQxMy0zNTUuMzI4YzM2LjAxMS0zNi4wMTEgMzYuNDM3LTkzLjg2NyAwLjQyNy0xMjkuODc3LTE2LjU4Ni0xNi41MTctMzkuNDY0LTI2LjcyOS02NC43MjYtMjYuNzI5LTI1LjQ3NCAwLTQ4LjUyMyAxMC4zODQtNjUuMTQ1IDI3LjE0OWwtMzU1LjMzNCAzNTUuNDE5LTM1NS4zMjgtMzU1LjQxM2MtMzYuMDExLTM2LjAxMS05My44NjctMzYuNDM3LTEyOS44NzctMC40MjctMTYuNTE3IDE2LjU4Ni0yNi43MjkgMzkuNDY0LTI2LjcyOSA2NC43MjYgMCAyNS40NzQgMTAuMzg0IDQ4LjUyMyAyNy4xNDkgNjUuMTQ1bDM1NS40MTkgMzU1LjMzNC0zNTUuNDEzIDM1NS4zMjhjLTE2Ljc5MyAxNi42MTktMjcuMTkxIDM5LjY3MS0yNy4xOTEgNjUuMTUxIDAgMjUuMjY5IDEwLjIyNiA0OC4xNDkgMjYuNzY2IDY0LjcyOGwtMC4wMDItMC4wMDJjMTYuNTg2IDE2LjUxNyAzOS40NjQgMjYuNzI5IDY0LjcyNiAyNi43MjkgMjUuNDc0IDAgNDguNTIzLTEwLjM4NCA2NS4xNDUtMjcuMTQ5bDM1NS4zMzQtMzU1LjQxOSAzNTUuMzI4IDM1NS40MTNjMTYuNjE5IDE2Ljc5MyAzOS42NzEgMjcuMTkxIDY1LjE1MSAyNy4xOTEgMjUuMjY5IDAgNDguMTQ5LTEwLjIyNiA2NC43MjgtMjYuNzY2bC0wLjAwMiAwLjAwMmMxNi41MTctMTYuNTg2IDI2LjcyOS0zOS40NjQgMjYuNzI5LTY0LjcyNiAwLTI1LjQ3NC0xMC4zODQtNDguNTIzLTI3LjE0OS02NS4xNDVsLTAuMDA2LTAuMDA2eiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OTE7IiBnbHlwaC1uYW1lPSJtZXNzYWdlLXN1Y2Nlc3MiIGRhdGEtdGFncz0i5oiQ5YqfaWNvbiIgZD0iTTcyMS4zIDUyNi40bC0zMjcuNS0zMjguNS04NS40IDE0OS41Yy05LjkgMTcuMy0zMS44IDIzLjMtNDkuMSAxMy40cy0yMy4zLTMxLjgtMTMuNC00OS4xbDEwOC44LTE5MC41YzYuNi0xMS42IDE4LjgtMTguMiAzMS4zLTE4LjIgNi4xIDAgMTIuMiAxLjUgMTcuOCA0LjcgMy4yIDEuOSA2LjEgNC4xIDguNSA2LjcgMC4xIDAuMSAwLjMgMC4zIDAuNCAwLjRsMzU5LjUgMzYwLjZjMTQgMTQuMSAxNCAzNi45LTAuMSA1MC45LTE0IDE0LjItMzYuNyAxNC4yLTUwLjggMC4xdjB6TTUxMiA4MzJjLTI4Mi44IDAtNTEyLTIyOS4yLTUxMi01MTJzMjI5LjItNTEyIDUxMi01MTJjMjgyLjggMCA1MTIgMjI5LjIgNTEyIDUxMnMtMjI5LjIgNTEyLTUxMiA1MTJ2MHpNODIzLjEgOC45Yy00MC40LTQwLjQtODcuNS03Mi4yLTEzOS45LTk0LjMtNTQuMi0yMy0xMTEuOC0zNC42LTE3MS4yLTM0LjZzLTExNyAxMS42LTE3MS4yIDM0LjVjLTUyLjQgMjIuMi05OS40IDUzLjktMTM5LjkgOTQuMy00MC40IDQwLjQtNzIuMiA4Ny41LTk0LjMgMTM5LjktMjMgNTQuMy0zNC42IDExMS45LTM0LjYgMTcxLjNzMTEuNiAxMTcgMzQuNSAxNzEuMmMyMi4yIDUyLjQgNTMuOSA5OS40IDk0LjMgMTM5LjkgNDAuNCA0MC40IDg3LjUgNzIuMiAxMzkuOSA5NC4zIDU0LjMgMjMgMTExLjkgMzQuNiAxNzEuMyAzNC42czExNy0xMS42IDE3MS4yLTM0LjVjNTIuNC0yMi4yIDk5LjQtNTMuOSAxMzkuOS05NC4zIDQwLjQtNDAuNCA3Mi4yLTg3LjUgOTQuMy0xMzkuOSAyMy01NC4zIDM0LjYtMTExLjkgMzQuNi0xNzEuM3MtMTEuNi0xMTctMzQuNS0xNzEuMmMtMjIuMi01Mi40LTUzLjktOTkuNS05NC40LTEzOS45djB6IiAvPgo8Z2x5cGggdW5pY29kZT0iJiN4ZTk5MzsiIGdseXBoLW5hbWU9Im1lc3NhZ2UtZmFpbHVyZSIgZGF0YS10YWdzPSLlpLHotKVpY29uIiBkPSJNNzE3LjIgNTI1LjhjLTE0LjEgMTQtMzYuOSAxNC01MC45LTAuMWwtMTU0LjMtMTU0LjctMTU0LjMgMTU0LjdjLTE0IDE0LjEtMzYuOCAxNC4xLTUwLjkgMC4xcy0xNC4xLTM2LjgtMC4xLTUwLjlsMTU0LjUtMTU0LjktMTU0LjUtMTU0LjljLTE0LTE0LjEtMTQtMzYuOSAwLjEtNTAuOSA3LTcgMTYuMi0xMC41IDI1LjQtMTAuNXMxOC41IDMuNSAyNS41IDEwLjZsMTU0LjMgMTU0LjcgMTU0LjMtMTU0LjhjNy03LjEgMTYuMy0xMC42IDI1LjUtMTAuNnMxOC40IDMuNSAyNS40IDEwLjVjMTQuMSAxNCAxNC4xIDM2LjggMC4xIDUwLjlsLTE1NC41IDE1NSAxNTQuNCAxNTQuOWMxNC4xIDE0LjEgMTQuMSAzNi45IDAgNTAuOXYwek01MTIgODMyYy0yODIuOCAwLTUxMi0yMjkuMi01MTItNTEyczIyOS4yLTUxMiA1MTItNTEyYzI4Mi44IDAgNTEyIDIyOS4yIDUxMiA1MTJzLTIyOS4yIDUxMi01MTIgNTEydjB6TTgyMy4xIDguOWMtNDAuNC00MC40LTg3LjUtNzIuMi0xMzkuOS05NC4zLTU0LjItMjMtMTExLjgtMzQuNi0xNzEuMi0zNC42cy0xMTcgMTEuNi0xNzEuMiAzNC41Yy01Mi40IDIyLjItOTkuNCA1My45LTEzOS45IDk0LjMtNDAuNCA0MC40LTcyLjIgODcuNS05NC4zIDEzOS45LTIzIDU0LjMtMzQuNiAxMTEuOS0zNC42IDE3MS4zczExLjYgMTE3IDM0LjUgMTcxLjJjMjIuMiA1Mi40IDUzLjkgOTkuNCA5NC4zIDEzOS45IDQwLjQgNDAuNCA4Ny41IDcyLjIgMTM5LjkgOTQuMyA1NC4zIDIzIDExMS45IDM0LjYgMTcxLjMgMzQuNnMxMTctMTEuNiAxNzEuMi0zNC41YzUyLjQtMjIuMiA5OS40LTUzLjkgMTM5LjktOTQuMyA0MC40LTQwLjQgNzIuMi04Ny41IDk0LjMtMTM5LjkgMjMtNTQuMyAzNC42LTExMS45IDM0LjYtMTcxLjNzLTExLjYtMTE3LTM0LjUtMTcxLjJjLTIyLjItNTIuNC01My45LTk5LjUtOTQuNC0xMzkuOXYweiIgLz4KPGdseXBoIHVuaWNvZGU9IiYjeGU5OTQ7IiBnbHlwaC1uYW1lPSJtZXNzYWdlLXdhcm5pbmciIGRhdGEtdGFncz0i5byC5bi4aWNvbiIgZD0iTTUxMiA3NjBjNTkuNCAwIDExNy0xMS42IDE3MS4yLTM0LjUgNTIuNC0yMi4yIDk5LjQtNTMuOSAxMzkuOS05NC4zIDQwLjQtNDAuNCA3Mi4yLTg3LjUgOTQuMy0xMzkuOSAyMy01NC4zIDM0LjYtMTExLjkgMzQuNi0xNzEuM3MtMTEuNi0xMTctMzQuNS0xNzEuMmMtMjIuMi01Mi40LTUzLjktOTkuNC05NC4zLTEzOS45LTQwLjQtNDAuNC04Ny41LTcyLjItMTM5LjktOTQuMy01NC4zLTIzLTExMS45LTM0LjYtMTcxLjMtMzQuNnMtMTE3IDExLjYtMTcxLjIgMzQuNWMtNTIuNCAyMi4yLTk5LjQgNTMuOS0xMzkuOSA5NC4zLTQwLjQgNDAuNC03Mi4yIDg3LjUtOTQuMyAxMzkuOS0yMyA1NC4zLTM0LjYgMTExLjktMzQuNiAxNzEuM3MxMS42IDExNyAzNC41IDE3MS4yYzIyLjIgNTIuNCA1My45IDk5LjQgOTQuMyAxMzkuOSA0MC40IDQwLjQgODcuNSA3Mi4yIDEzOS45IDk0LjMgNTQuMyAyMyAxMTEuOSAzNC42IDE3MS4zIDM0LjZ2MHpNNTEyIDgzMmMtMjgyLjggMC01MTItMjI5LjItNTEyLTUxMnMyMjkuMi01MTIgNTEyLTUxMmMyODIuOCAwIDUxMiAyMjkuMiA1MTIgNTEycy0yMjkuMiA1MTItNTEyIDUxMnYwIDB6TTUxMiAxOTJjLTIyLjEgMC00MCAxNy45LTQwIDQwdjM2OWMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwdi0zNjljMC0yMi4xLTE3LjktNDAtNDAtNDB2MHpNNDY3IDgzYzAgMjQuODUzIDIwLjE0NyA0NSA0NSA0NXM0NS0yMC4xNDcgNDUtNDVjMC0yNC44NTMtMjAuMTQ3LTQ1LTQ1LTQ1cy00NSAyMC4xNDctNDUgNDV2MHoiIC8+CjwvZm9udD48L2RlZnM+PC9zdmc+#components-icon) format('svg');font-weight:400;font-style:normal}.supermapol-icons{font-family:supermapol-icons!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.supermapol-icons-line-layer:before{content:"\e62a"}.supermapol-icons-marker-layer:before{content:"\e62c"}.supermapol-icons-point-layer:before{content:"\e62d"}.supermapol-icons-polygon-layer:before{content:"\e62e"}.supermapol-icons-search:before{content:"\e630"}.supermapol-icons-solid-up-triangle:before{content:"\e63a"}.supermapol-icons-solid-down-triangle:before{content:"\e63b"}.supermapol-icons-first:before{content:"\e6a4"}.supermapol-icons-next:before{content:"\e6a5"}.supermapol-icons-last:before{content:"\e6a6"}.supermapol-icons-prev:before{content:"\e6a7"}.supermapol-icons-poi-load:before{content:"\e6a8"}.supermapol-icons-poi-save:before{content:"\e6a9"}.supermapol-icons-upload:before{content:"\e6ac"}.supermapol-icons-close:before{content:"\e6ae"}.supermapol-icons-message-success:before{content:"\e991"}.supermapol-icons-message-failure:before{content:"\e993"}.supermapol-icons-message-warning:before{content:"\e994"}.component-checkbox-default-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAKxJREFUKBXVU8ENwyAMxObDBB0qU2SzTtFhADFAswA8EC1HigoE8eivfhBz5zvZFiHn3BZjfAit9QtBSJj5INwEolIAEJnlozD5CCGIoqnAV5cRrii+3eXienqfZ1/ZelxsBpKstc+U0m3AhZRy61prC4wxQ3ctm/PfG1orsb1ZlA1jFO99u5hljlpoGPMrpWbGUwy10Cx7nSo/4B8JCS8+D3ufPZLZjOVfINrfB86l+5fF8g4AAAAASUVORK5CYII=) no-repeat}.component-checkbox-selected-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAXdJREFUKBWFUr8vQ1EU/u7rK61I9bbRQWIgEWI0iIkYWzGIIF1Ewsbib7BXYjJYDAxCYqCd7BYSMYmNSGilbSR+9rXXPef2vb6Kpmc495zzne/e8+MKuZ1PKqWyFqkuGxDRzIsSEI/ix6mpxE7BRKClMwB8VwGLYAqQQ8IcY2rUNUqbCeM8bfRCv9Oc1sRxKe7Jd6RHQxjoCSCsq6IrqDoSj3k6H8XcSRnKxA0oM/kHBdXvi7FpBUTS+g8gtFZVOa9ul3m7GsdeKmLYpKkhkou0xOtnDWvZN/aZeV90cLUSg6296cMSA6QYHN8vYlDamDpoAB5IBo3HL7yAVq34E//aRGzZpj85qAu7XI4h0iE4TKOpD9ikhfS2v+oLpgit4XxRYjhm4043q3+HSdTaI66PhbE12Y3rZwezxyWcLUiMxG3QdIZ2C/hwPA4b3i7Jm+gLIrckGbjJVzBzVMZ7pfEKA3XVRPQD7WxLCJFyP3C7ZMJ5ovrz/AKWB4FZ7esInwAAAABJRU5ErkJggg==) no-repeat}.component-analyst-buffer-img{background:url(data:image/png;base64,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) no-repeat}.component-analyst-isoline-img{background:url(data:image/png;base64,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) no-repeat}.component-triangle-down-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAAXNSR0IArs4c6QAAAK1JREFUGBljDA0NZf706VMwExOTAAMe8P////e8vLzrWAQFBZmAGlz+/fsniUc9SOo5UO0GRhDL09NTFKihFcjEpek50AXV27dvf80M0nDnzp1venp6x/78+WMK5PKBxGCAkZHxKRcXV9XmzZvfgMTAGkCMGzdufFdXVz8KdKsxkMsPEgMqfsTMzFy9adOmdyA+CICdBGFCSBcXF36golIQ7+/fv9179uz5iCwPACiFOzeuZwjoAAAAAElFTkSuQmCC) no-repeat}.component-triangle-up-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAAXNSR0IArs4c6QAAAIdJREFUGBljYMACvLy87EAYixQDM7qgu7t77P///9OA2FpFRYXl7t27l5DVoGjw9PRMAioMQVKgraamxnnnzp3zMDG4BqDitH///vnDJGA00ABNVVVVPqCmsyAxsAagMzKAEj4wRVhoNaDz+IHOO8Po4ODAAQRTgBoEsCiECzEyMn748eNHDgB9NzNjSerR7QAAAABJRU5ErkJggg==) no-repeat}.component-single-default-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAIVBMVEUAAADf39/a2tra2trb29vg4ODa2trp6enu7u709PT39/f55+/dAAAACHRSTlMAGGbDzvP3+8NM9hYAAAA4SURBVAjXY2BgcktRYGBgNO2cESzAwFy1atVyAwbVVUAQxOABoloYMkHUNBgFFYQqgWqAaocYBgAJPR7RKZkaAQAAAABJRU5ErkJggg==) no-repeat}.component-single-checked-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMBAMAAACkW0HUAAAAMFBMVEUAAAAxm9YkldMKiM4Kj9YpmNQ9odiy2vDm8/p6v+T9///////5/f53veQZkNEAg8soFNrEAAAABnRSTlMAfen9GeE1grYoAAAAPklEQVQI12NkYFTiv/eBkSUISN1mZJ2qyPBuOaPYNCP+u9MZ1ac5MdyZzmjR5sjwZgaMggpClUA1QLVDDAMAeFYb2eH90LsAAAAASUVORK5CYII=) no-repeat}.component-default-marker-icon{height:41px!important;width:25px!important;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=) no-repeat}.component-select-marker-icon{height:42px!important;width:30px!important;background:url(data:image/png;base64,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) no-repeat}.component-analyst-density-img{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAqCAMAAADCkShIAAAAElBMVEVNXXNcvv8zp/8hg9mF0v+t5P+bmLduAAAANklEQVR42u3LMQoAIBADQU/P/39ZCBaBNGK9U4bswJ+SKUsI8hrBRdDGA0ewJTO/EmTmOwEeHNAtB+F8eBWwAAAAAElFTkSuQmCC) no-repeat}.component-openfile__span--select{position:relative;width:110px;height:32px;font-size:14px;color:#595959;text-align:center;letter-spacing:.75px;line-height:32px;border:1px solid #d9d9d9;border-radius:4px;cursor:pointer;background-color:#fff;display:block}.component-openfile__span--select:hover{border:1px solid #38adf5;color:#38adf5;cursor:pointer}.component-openfile__span--select .supermapol-icons-upload{position:absolute;top:8px;left:10px;height:14px;width:18px;color:#1591ea;margin:auto auto;padding-right:5px}.component-openfile__span--select .component-openfile__span{display:block;position:absolute;left:32px}.component-openfile__input{position:relative;left:190px;top:49px;height:32px;width:160px;display:none!important}.component-messageboxcontainer{position:absolute;top:20px;left:0;right:0;margin:auto;min-height:50px;max-width:500px;border-radius:2px;background-color:#fff;z-index:1000}.component-border-bottom-orange{border-bottom:orange solid 1.5px}.component-border-bottom-red{border-bottom:red solid 1.5px}.component-border-bottom-green{border-bottom:green solid 1.5px}.component-messageboxcontainer .icon{float:left;font-size:24px;margin-left:20px;margin-top:6px;display:inline-block}.component-messageboxcontainer .supermapol-icons-message-success{color:green}.component-messageboxcontainer .supermapol-icons-message-failure{color:red}.component-messageboxcontainer .supermapol-icons-message-warning{color:orange}.component-messagebox{float:left;color:#595959;font-size:12px;margin:15px 10px}.component-messagebox__cancelbtncontainer{position:relative;height:5px}.component-messagebox__cancelBtn{position:absolute;top:15px;right:5px;border:none;background:0 0;color:#a4a4a4;cursor:pointer}.component-messagebox__cancelBtn:hover{border:none;font-weight:600}.component-init-center{text-align:center}.component-dataflow__container{line-height:36px}.component-dataflow__container div{float:left;min-width:300px}.component-input-default{position:relative;border:#d9d9d9 solid .2px;background-color:#fff}.component-input-default:hover{border:#108fe9 solid .2px}.component-input-default input[type=text]{margin:2px;font-family:MicrosoftYaHei;font-size:12px;color:#919191;height:18px;min-width:292px;line-height:18px;padding-left:8px;padding-right:25px;border:none!important;outline:0!important}.component-dataflow__container .supermapol-icons-close:before{content:"\e6ae"}.component-input-default input[type=text]~span.supermapol-icons-close{position:absolute;right:5px;cursor:pointer;color:#e9e9e9;width:20px;height:20px;line-height:20px;top:9px;text-align:center;z-index:10}.component-button-default{position:relative;margin:0 5px;padding:0 10px;height:36px;font-size:16px;color:#fff;text-align:center;letter-spacing:.75px;line-height:32px;border-radius:4px;cursor:pointer;background-color:#108ee9;outline:0;border:none}.component-button-default:hover{background-color:#38adf5;color:#fff;border:none;cursor:pointer}.component-checkbox-container{margin:10px auto}.component-checkbox-default{position:absolute;margin-top:1px;height:14px;width:14px}.component-checkbox-default:hover{cursor:pointer}.component-label{margin-left:20px;line-height:16px;font-size:12px;color:#919191}.component-label-selected{color:#595959!important}.component-search-container{position:absolute;top:32px;right:96px;width:385px}.component-search{float:right;min-width:290px;height:36px;line-height:36px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.26);border-radius:4px;z-index:999;font-size:12px}.component-search>div{float:left}.component-search__settings{position:relative}.component-search__settings .component-search__settings__name{background-color:#f5f5f5;border-top-left-radius:4px;border-bottom-left-radius:4px;max-width:120px;padding-left:12px;padding-right:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.component-search__settings__name>div:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-search__settings .supermapol-icons-solid-down-triangle{position:absolute;right:8px;top:10px;margin-left:4px}.component-search input[type=text]{font-family:MicrosoftYaHei;font-size:12px;color:#919191;height:18px;width:155px;line-height:18px;padding-left:8px;padding-right:24px;border:none!important;outline:0!important}.component-search__input input[type=text]~span.supermapol-icons-close{position:absolute;right:2px;cursor:pointer;color:#e9e9e9;width:20px;height:20px;line-height:20px;top:9px;text-align:center;z-index:10}.component-search__input{position:relative}.component-search .supermapol-icons-search{font-size:16px;cursor:pointer;height:16px;width:39px;line-height:16px;text-align:center;color:#4a90e2;margin-top:10px;border-left:1px solid #e9e9e9}.component-search__layers{box-sizing:border-box;padding-top:2px;margin:0 auto;width:488px;max-height:364px}.component-search__layers__header{width:100%;height:41px;border-bottom:1px solid #e9e9e9}.component-search__layers__header>div{float:left;height:100%;line-height:42px;cursor:pointer}.component-search__layers__header>div>span{display:inline-block;vertical-align:middle;margin-right:16px}.component-search__layers__header>div>span:first-child{font-size:16px;color:#0083cb;margin-right:8px}.component-search__layers__body{position:relative;overflow:hidden;width:490px;max-height:310px;padding-bottom:8px}.component-search__layers__itme{width:100%;margin-top:8px;line-height:24px}.component-search__layers__itme>div{display:inline-block;vertical-align:middle;margin-right:20px}.component-search__layers__itme__singleselect{width:145px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:24px;line-height:24px;font-weight:400;cursor:pointer}.component-search__layers__itme__singleselect>div{float:left}.component-search__layers__itme__singleselect>.single-label{float:left;margin-left:6px}.component-search__layers__itme__singleselect>div:first-child{width:12px;height:12px}.component-search__layers__itme__singleselect .component-single-checked-img,.component-search__layers__itme__singleselect .component-single-default-img{margin-top:6px;width:12px;height:12px}.component-search__layers__itme>.component-search__layers__itme--select{float:right;margin-right:20px;margin-top:0;margin-bottom:0;position:relative;width:280px;height:22px;background:#fff;border:1px solid #d9d9d9;border-radius:4px;line-height:22px;outline:0}.component-search__resultitme{width:100%;height:56px;margin:8px auto;cursor:pointer}.component-search__resultitme.selected,.component-search__resultitme:hover{background-color:#f5f5f5}.component-search__resultitme>div{float:left;height:100%;cursor:pointer}.component-search__resultitme>.component-search-result-icon{width:34px;height:20px;font-size:20px;line-height:43px;text-align:right;color:#0083cb}.component-search__resultitme>.component-search__resultitme-selected{color:red;font-size:24px}.component-search-result-info{width:180px;padding-left:11px;margin-right:48px}.component-search-result-info>div{height:18px;line-height:18px;width:100%;margin-top:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-search-result-info>div:first-child{color:#292929}.component-search-result-info>div:last-child{color:#919191}.component-search__resultitme>div.component-checkbox{float:right;margin:14px 16px 14px 0;width:14px;height:14px}.component-container{position:absolute;top:30px;right:56px;background:#f1f3f3;box-shadow:0 2px 4px 0 rgba(0,0,0,.26);z-index:999}.component-title{padding:0 18px;height:34px;color:#108ee9;line-height:36px;font-weight:700;font-size:15px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:#fff}.component-content{color:#595959;border-radius:4px;font-size:12px}.component-title div{height:33px;width:fit-content;border-bottom:2px solid #108ee9}.component-dropdownbox--container{position:relative;width:200px;height:58px;margin-bottom:16px}.component-dropdownbox{width:192px;height:50px;background:#fff;margin:0 auto;padding:8px 0 0 8px;border:1px solid #d9d9d9;border-radius:2px}.component-dropdownbox:hover{border:1px solid #108ee9}.component-dropdownbox__triangle-btn{position:relative;bottom:46px;left:173px;width:10px;height:10px;cursor:pointer}.component-dropdownbox__triangle-btn>div{width:105%;height:100%}.component-dropdownbox__content{position:absolute!important;top:61px;left:0;width:184px;background:#fff;padding:8px;box-shadow:0 1px 4px 0 rgba(0,0,0,.15);border:1px solid #d9d9d9;border-radius:2px;z-index:10001}.component-dropdownbox__item{width:177px;height:42px;margin-bottom:8px;cursor:pointer;color:#595959}.component-dropdownbox__content .component-dropdownbox__item:hover .component-dropdownbox__item__title{color:#108ee9}.component-dropdownbox__content .component-dropdownbox__item:hover .component-dropdownbox__item__remark{color:#108ee9}.component-dropdownbox__item__img div{width:48px;height:42px}.component-dropdownbox__item__title{position:relative;bottom:40px;left:57px;width:120px;height:16px;font-size:12px;font-weight:700;color:#595959;overflow:hidden}.component-dropdownbox__item__remark{position:relative;bottom:32px;left:57px;width:120px;height:16px;font-size:12px;color:#919191;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-dropdownbox__content--chart{display:none}.component-selecttool{width:100%;height:100%;font-size:12px}.component-selecttool__lable--describe{display:inline-block;margin-bottom:5px;max-width:100%;height:16px;font-size:12px;color:#595959;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.component-selecttool,.component-selecttool .component-selecttool__content{width:100%;left:0;min-height:28px}.component-selecttool__scrollarea__content{margin-top:0;margin-left:0;padding-bottom:5px}.component-selecttool__option{width:99%;height:17px;line-height:20px;padding:5px 8px 7px 8px;font-size:12px;color:#595959;cursor:pointer;background:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-selecttool__option:hover{background-color:#e6f9ff}.component-selecttool .component-selecttool--chart{left:0;height:26px;position:relative}.component-selecttool--chart{height:28px;width:192px;background:#fff;border:1px solid #d9d9d9;border-radius:2px;padding-left:8px;font-size:12px;color:#595959}.component-selecttool--chart:hover{border:1px solid #108ee9}.component-selecttool__name{width:170px;height:26px;line-height:26px;overflow:hidden;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-selecttool__trianglebtn--chart{position:relative;bottom:18px;left:173px;width:13px;height:10px;cursor:pointer}.component-selecttool__trianglebtn--chart>div{width:100%;height:100%}.component-selecttool__content{position:absolute;left:0;top:30px;width:200px;padding:5px 0 0;background:#fff;box-shadow:0 1px 4px 0 rgba(0,0,0,.15);border-radius:2px;z-index:10000;display:none;overflow:hidden scroll;max-height:200px}.component-selecttool__content--chart{width:186px}::-webkit-scrollbar{width:6px;height:6px;background-color:#fff}::-webkit-scrollbar-thumb{border-radius:10px;background-color:#c8ccd1}.component-tabpage{width:488px;margin:3px auto 0 auto;box-shadow:0 1px 3px rgba(0,0,0,.2)}.component-tabpage ul{margin:0;padding:0;height:39px;line-height:31px;overflow:hidden}.component-tabpage ul li{float:left;list-style:none;padding:7px 7px 0 7px;border-bottom:1px solid transparent;cursor:pointer;display:inline;color:#0083cb}.component-tabpage ul li.on{border-bottom-color:#0083cb;position:relative}.component-tabpage__content{border-top:1px solid #ddd;margin-top:-1px;clear:left;overflow:hidden;padding-bottom:10px;padding-top:10px}.component-tabpage__content div{float:left}.component-citytabpage--noneBoxShadow{box-shadow:none}.component-citytabpag__py-key{display:inline-block;padding-left:7px;font-weight:700;font-size:12px;color:#0083cb;vertical-align:top}.component-citytabpag__content{margin-left:14px;max-width:450px}.component-citytabpag__content>span{display:inline-block;float:left;height:18px;line-height:18px;margin:8px 24px 8px 0;text-align:left;cursor:pointer}.component-citytabpag__content>span:hover{color:#0083cb}.component-navtabspage{position:absolute;overflow:hidden;min-width:520px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.26);border-radius:4px;font-family:MicrosoftYaHei-Bold;font-size:12px;color:#595959;top:44px;right:0;z-index:1000}.component-navtabspage .supermapol-icons-close{position:absolute;cursor:pointer;top:11px;right:15px;color:#bfbfbf}.component-navtabspage__title{height:35px;line-height:36px;background-color:#f5f5f5;box-shadow:0 1px 0 0 #e9e9e9}.component-navtabspage__title>span{float:left;color:#919191;cursor:pointer;height:100%;width:90px;text-align:center}.component-navtabspage__title>span.component-navtabspage__tabs--select{color:#595959;background:#fff;border-bottom:2px solid transparent}.component-pagination{line-height:normal;width:303px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.26);border-radius:4px;max-height:610px}.component-pagination__content{max-height:505px}.component-pagination__link{display:table;padding:0;margin:10px auto;text-align:center}.component-pagination__link li{float:left;display:inline;width:5px;height:10px;list-style:none;padding:0 7px 7px 5px;margin:0 2px;color:#0083cb;cursor:pointer;border-radius:2px;border-bottom:1px solid transparent}.component-pagination__link li.disable{color:#919191}.component-pagination__link li.disable:hover{cursor:not-allowed}.component-pagination__link li.active{color:#fff;background-color:#0083cb}.component-popcontainer{background-color:#fff;box-shadow:1px 2px 1px 0 rgba(0,0,0,.15)}.component-popcontainer__header{position:relative;width:100%;height:36px;background-color:#0083cb;left:0;top:0;border-top-left-radius:2px;border-top-right-radius:2px}.component-popcontainer__header__title{color:#fff;font-size:14px;margin-left:16px;margin-bottom:0;overflow:hidden;font-weight:700;line-height:36px;text-overflow:ellipsis}.component-popcontainer__header__close{position:absolute;right:10px;top:10px;font-size:15px;color:#fff;opacity:.6;cursor:pointer;z-index:1000}.component-popcontainer__content{position:relative;max-height:200px;overflow-x:hidden;overflow-y:overlay;padding-bottom:15px}.component-popcontainer__content__table{font-size:12px;line-height:18px;word-wrap:break-word;color:#919191;border-spacing:0;border-collapse:collapse}.component-popcontainer__content__table span{display:inline-block;color:#595959;overflow:hidden;max-width:133px;text-overflow:ellipsis;font-weight:700}.component-popcontainer__content__table td{min-height:28px;padding:4px 18px}.component-popcontainer__content__td--color{background-color:#f9f9f9}.display_none,.hidden{display:none}.component-content--scroll{max-height:500px;overflow:auto;padding:16px 10px 16px 16px;font-size:12px;overflow-x:hidden}.component-analysis{position:absolute;right:10px;top:32px;font-size:12px}.component-content--analysis{font-size:12px;padding:16px 10px 16px 16px}.component-analysis__container__analysisbtn{position:relative;font-size:12px;margin-bottom:12px;margin-top:16px;z-index:100}.component-analysis__container .component-textarea{display:block;width:183px;margin-top:8px;padding-left:8px;padding-right:8px;outline:0;font-size:12px;color:#595959;letter-spacing:.14px;background:#fff;border:1px solid #d9d9d9;border-radius:2px}.component-analysis__container input,.component-analysis__container select,.component-analysis__container span{display:block;color:#595959;letter-spacing:.14px}.component-analysis__container input,.component-analysis__container select{margin-top:8px;height:28px;width:183px;padding-left:8px;padding-right:8px;background:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:0;font-size:12px}.component-analysis__container input:hover,.component-analysis__container select:hover{border:1px solid #108ee9}.component-analysis__container .component-textarea:hover{border:1px solid #108ee9}.component-analysis__container input:focus,.component-analysis__container select:focus,.component-textarea:focus{border:1px solid #108ee9}.component-analysis__container__analysisLayer,.component-analysis__container__selectpram .clip-layer,.component-analysis__container__selectpram .operateLayer{margin-bottom:16px}.component-clientcomputation__buffer>div,.component-clientcomputation__isoline>div{margin-bottom:16px}.component-analysis__analysisbtn button{border:none;border-radius:2px;color:#fff;padding-right:0;line-height:2em;text-transform:none}.component-analysis__analysisbtn button.disabled{cursor:not-allowed;background-color:#80b5cf}.component-analysis__analysisbtn--analysis,.component-analysis__analysisbtn--analysising-container{width:100%;height:28px;padding-right:0;background:#108ee9;outline:0}.component-analysis__analysisbtn--analysis:hover{background:#38adf5}.component-analysis__analysisbtn--analysising{position:relative;width:64%;height:28px;line-height:28px;display:inline-block;border-radius:2px;background:#38adf5;cursor:not-allowed;text-align:center;vertical-align:bottom}.component-analysis__analysisbtn--cancel{width:29%;height:28px;margin-left:12px;padding-left:0;line-height:27px;text-align:center;background:#485465}.component-analysis__analysisbtn--cancel:hover{background:#747d8a}.component-analysis__analysisbtn--cancel:focus{background:#3e4857;outline:0}.component-analysis__analysisbtn--analysising span{position:relative;height:28px;line-height:28px;vertical-align:bottom;display:inline-block;margin-left:10px;color:#fff}.component-analysis__svg-container{position:relative;display:inline-block;cursor:not-allowed;vertical-align:bottom}svg:not(:root){overflow:hidden}.component-analysis__svg-rotate{position:relative;top:4px;animation-name:svgrotate;animation-duration:1s;animation-iteration-count:infinite;animation-timing-function:linear;-ms-animation-name:svgrotate;-ms-animation-duration:1s;-ms-animation-iteration-count:infinite;-ms-animation-timing-function:linear;-moz-animation-name:svgrotate;-moz-animation-duration:1s;-moz-animation-iteration-count:infinite;-moz-animation-timing-function:linear;-webkit-animation-name:svgrotate;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@keyframes svgrotate{0%{-webkit-transform:rotate(0) translateZ(0);transform:rotate(0) translateZ(0)}50%{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}100%{-webkit-transform:rotate(1turn) translateZ(0);transform:rotate(1turn) translateZ(0)}}@-webkit-keyframes svgrotate{0%{-webkit-transform:rotate(0) translateZ(0);transform:rotate(0) translateZ(0)}50%{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}100%{-webkit-transform:rotate(1turn) translateZ(0);transform:rotate(1turn) translateZ(0)}}@-moz-keyframes svgrotate{0%{-webkit-transform:rotate(0) translateZ(0);transform:rotate(0) translateZ(0)}50%{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}100%{-webkit-transform:rotate(1turn) translateZ(0);transform:rotate(1turn) translateZ(0)}}select.component-select-options{width:202px;height:28px;margin-top:-3px;margin-bottom:16px}select.component-select-options>option{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.component-content--scroll::-webkit-scrollbar{width:6px;height:6px;background-color:#f5f5f5}.component-content--scroll::-webkit-scrollbar-thumb{border-radius:10px;background-color:#bfc3c9}.component-content--analysis .component-selecttool{margin-bottom:16px}.component-analysis__analysisbtn--deletelayers{margin-top:10px}.component-distributeanalysis__input{height:24px;margin-bottom:16px}.component-textarea{height:200px;padding-right:0;overflow:hidden}.component-scrollarea-content{margin-top:0;margin-left:0;overflow:visible;width:188px;min-height:28px}.component-textarea__content{overflow:scroll;text-align:left;font-family:"Microsoft Yahei";line-height:1;height:200px;color:#595959;letter-spacing:.14px;border:0;width:96%;font-size:12px}.component-textarea__content:focus{border:1px solid transparent;outline:0}.component-clientcomputation__buffer--radius>div{line-height:28px;margin-top:8px;vertical-align:middle;margin-bottom:16px}.component-clientcomputation__buffer--radius>div>input{width:112px;height:24px;margin-right:5px;margin-top:0;display:inline-block}.component-clientcomputation__buffer--unit{position:relative;width:62px;height:28px;display:inline-block;vertical-align:bottom}.component-clientcomputation__buffer--issaveattrs .checkbox,.component-clientcomputation__buffer--isunion .checkbox{position:absolute;margin-top:1px;height:14px;width:14px}.component-clientcomputation__buffer--issaveattrs .lable,.component-clientcomputation__buffer--isunion .lable{margin-left:20px;line-height:16px;font-size:12px;color:#919191}.component-clientcomputation__buffer--issaveattrs,.component-clientcomputation__buffer--isunion{height:16px;width:100%;margin-top:8px;position:relative}.component-clientcomputation__buffer--issaveattrs .checkbox-fault,.component-clientcomputation__buffer--isunion .checkbox-fault{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAKxJREFUKBXVU8ENwyAMxObDBB0qU2SzTtFhADFAswA8EC1HigoE8eivfhBz5zvZFiHn3BZjfAit9QtBSJj5INwEolIAEJnlozD5CCGIoqnAV5cRrii+3eXienqfZ1/ZelxsBpKstc+U0m3AhZRy61prC4wxQ3ctm/PfG1orsb1ZlA1jFO99u5hljlpoGPMrpWbGUwy10Cx7nSo/4B8JCS8+D3ufPZLZjOVfINrfB86l+5fF8g4AAAAASUVORK5CYII=) no-repeat center}.component-clientcomputation__buffer--issaveattrs .checkbox-active,.component-clientcomputation__buffer--isunion .checkbox-active{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAFoTx1HAAAABGdBTUEAALGPC/xhBQAAAXdJREFUKBWFUr8vQ1EU/u7rK61I9bbRQWIgEWI0iIkYWzGIIF1Ewsbib7BXYjJYDAxCYqCd7BYSMYmNSGilbSR+9rXXPef2vb6Kpmc495zzne/e8+MKuZ1PKqWyFqkuGxDRzIsSEI/ix6mpxE7BRKClMwB8VwGLYAqQQ8IcY2rUNUqbCeM8bfRCv9Oc1sRxKe7Jd6RHQxjoCSCsq6IrqDoSj3k6H8XcSRnKxA0oM/kHBdXvi7FpBUTS+g8gtFZVOa9ul3m7GsdeKmLYpKkhkou0xOtnDWvZN/aZeV90cLUSg6296cMSA6QYHN8vYlDamDpoAB5IBo3HL7yAVq34E//aRGzZpj85qAu7XI4h0iE4TKOpD9ikhfS2v+oLpgit4XxRYjhm4043q3+HSdTaI66PhbE12Y3rZwezxyWcLUiMxG3QdIZ2C/hwPA4b3i7Jm+gLIrckGbjJVzBzVMZ7pfEKA3XVRPQD7WxLCJFyP3C7ZMJ5ovrz/AKWB4FZ7esInwAAAABJRU5ErkJggg==) no-repeat center}.component-clientcomputation__buffer--issaveattrs .selected,.component-clientcomputation__buffer--isunion .selected{color:#595959!important}.component-clientcomputation__buffer--unit .component-select-options{width:100%;outline:0}.component-clientcomputation__buffer--unit .__selecttool{width:65px}.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__name{width:32px}.component-clientcomputation__buffer--unit .component-selecttool__trianglebtn--chart{left:39px}.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__content--chart{width:62px}.component-clientcomputation__buffer--unit .component-selecttool--chart{width:57px}.component-clientcomputation__buffer--unit .component-selecttool .component-selecttool__content{overflow:unset}.component-clientcomputation__buffer--unit .component-selecttool__scrollarea__content .component-selecttool__option{width:unset}.component-servicequery__rangeicon{width:12px;height:12px;cursor:pointer;border:1px solid #d9d9d9;padding:5px;color:#0083cb}.component-servicequery__rangeicon.bounds{position:relative;top:-47px}.component-textarea.component-textarea--rangequery{height:70px;padding-left:5px;display:inline-block;width:76%}.component-textarea .component-textarea--rangequery__content{height:73px;width:85%}.component-servicequery__rangeicon-container{display:inline-block;margin-right:5px;position:relative;bottom:8px}.component-servicequery__spatialquerymode-container{margin-top:16px}.component-servicequery__spatialquerymode__selectcontent{margin-bottom:16px}.component-content-container.component-scroll-content.data-services{padding-bottom:0;height:unset}.component-servicequery__container.component-container{position:absolute;right:17px;top:110px;font-size:12px}.component-servicequery__title{font-size:12px}.component-textarea--dataservice__container{margin-top:16px}.component-servicequery__analysistype{margin-top:0}.component-textarea.component-textarea--dataservice{height:40px;padding-left:5px;width:unset}.component-textarea--dataservice textarea{height:43px;padding-left:5px}.component-servicequery__maxfeatures-container{margin-top:16px}.component-servicequery__distance-container{margin-top:16px}.component-analysis__analysisbtn--analysising.component-servicequery__querybtn--querying{width:100%}.component-servicequery__querymode-selectname{margin:8px 0 0 0;border:1px solid #d9d9d9;padding:5px 5px 5px 7px;background:#d4d1d13d}.component-servicequery__rangeicon:hover{border:1px solid #108ee9}.leaflet-control-ctv{box-shadow:0 1px 5px rgba(0,0,0,.4);background:none repeat scroll 0 0 #fff;border:1px solid #ddd;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}a.leaflet-control-ctv-toggle{width:34px;height:34px;background-position:50% 50%;background-repeat:no-repeat;display:block;line-height:34px!important;font-weight:bolder;text-align:center;text-decoration:none;color:#000;font-size:1.3em}.leaflet-control-ctv p.leaflet-control-ctv-value{line-height:26px;text-align:center;text-decoration:none;color:#000;font-weight:700;font-size:1.1em;display:none;overflow:hidden;text-overflow:ellipsis}.leaflet-control-ctv.leaflet-control-ctv-horizontal p.leaflet-control-ctv-value{line-height:34px;height:34px;margin:0;border-right:1px solid #ccc;min-width:35px;max-width:100px;float:left;clear:none;white-space:nowrap}.leaflet-control-ctv.leaflet-control-ctv-vertical p.leaflet-control-ctv-value{min-height:25px;max-height:100px;line-height:26px;margin:0 0 5px 0;border-bottom:1px solid #ccc;width:34px;white-space:pre-wrap}.leaflet-control-ctv input.leaflet-ctv-slider{margin:0}.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-main{display:inline}.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-main{display:block}.leaflet-control-ctv .leaflet-ctv-slider-container,.leaflet-control-ctv input.leaflet-ctv-slider{display:none;padding:0}.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-container{float:right;clear:none;width:90%;height:34px}.leaflet-control-ctv.leaflet-control-ctv-horizontal input.leaflet-ctv-slider{height:34px}.leaflet-control-ctv.leaflet-control-ctv-vertical input.leaflet-ctv-slider{writing-mode:bt-lr;width:34px;height:100%}.leaflet-control-ctv.leaflet-control-ctv-expanded p.leaflet-control-ctv-value{display:block}.leaflet-control-ctv.leaflet-control-ctv-expanded a.leaflet-control-ctv-toggle{display:none}.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-container,.leaflet-control-ctv.leaflet-control-ctv-expanded input.leaflet-ctv-slider{display:inherit}.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-container{width:34px;transform:rotate(180deg);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg)}.leaflet-control-ctv.leaflet-control-ctv-vertical .leaflet-ctv-slider-container{margin:10px 0}.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-container{margin:0 10px}.leaflet-control-ctv.leaflet-control-ctv-vertical.leaflet-control-ctv-incdec .leaflet-ctv-slider-container{margin:0 0}.leaflet-control-ctv input[type=range]{-webkit-appearance:none;width:100%}.leaflet-control-ctv input[type=range]:focus{outline:0}.leaflet-control-ctv input[type=range]::-webkit-slider-runnable-track{width:100%;height:5px;cursor:pointer;box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0);background:#ddd;border-radius:25px;border:0 solid transparent}.leaflet-control-ctv input[type=range]::-webkit-slider-thumb{box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0);border:0 solid transparent;height:16px;width:16px;border-radius:8px;background:#a4a4a4;cursor:pointer;-webkit-appearance:none;margin-top:-5.5px}.leaflet-control-ctv input[type=range]:focus::-webkit-slider-runnable-track{background:#eaeaea}.leaflet-control-ctv input[type=range]::-moz-range-track{width:100%;height:5px;cursor:pointer;box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0);background:#ddd;border-radius:25px;border:0 solid transparent}.leaflet-control-ctv input[type=range]::-moz-range-thumb{box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0);border:0 solid transparent;height:16px;width:16px;border-radius:8px;background:#a4a4a4;cursor:pointer}.leaflet-control-ctv input[type=range]::-ms-track{width:100%;height:5px;cursor:pointer;background:0 0;border-color:transparent;color:transparent}.leaflet-control-ctv input[type=range]::-ms-fill-lower{background:#d0d0d0;border:0 solid transparent;border-radius:50px;box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0)}.leaflet-control-ctv input[type=range]::-ms-fill-upper{background:#ddd;border:0 solid transparent;border-radius:50px;box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0)}.leaflet-control-ctv input[type=range]::-ms-thumb{box-shadow:0 0 0 transparent,0 0 0 rgba(13,13,13,0);border:0 solid transparent;width:16px;border-radius:8px;background:#a4a4a4;cursor:pointer;height:5px}.leaflet-control-ctv input[type=range]:focus::-ms-fill-lower{background:#ddd}.leaflet-control-ctv input[type=range]:focus::-ms-fill-upper{background:#eaeaea}.leaflet-control-ctv.leaflet-control-ctv-vertical input[type=range]::-moz-range-track{height:100%;width:5px}.leaflet-ctv-slider-last,.leaflet-ctv-slider-next{width:34px;height:34px;background-position:50% 50%;background-repeat:no-repeat;line-height:32px!important;font-weight:bolder;text-align:center;vertical-align:middle;text-decoration:none;color:#000;font-size:1.3em;display:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-last,.leaflet-control-ctv.leaflet-control-ctv-expanded .leaflet-ctv-slider-next{display:block}.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-last,.leaflet-control-ctv.leaflet-control-ctv-horizontal .leaflet-ctv-slider-next{float:right}.leaflet-control-ctv input[type=range]::-moz-focus-outer{border:0}.leaflet-ctv-slider-incdec{cursor:pointer}@media screen and (-webkit-min-device-pixel-ratio:0){.leaflet-control-ctv.leaflet-control-ctv-vertical input[type=range]{transform-origin:17px 17px;-webkit-transform-origin:17px 17px;-moz-transform-origin:17px 17px;transform:rotate(90deg);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);height:34px}}.leaflet-control-ctv .tooltip .tooltip-text{display:none;width:120px;background-color:#000;color:#fff;text-align:center;border-radius:6px;padding:5px 0;position:absolute;z-index:1}.leaflet-control-ctv .tooltip .tooltip-text::after{content:"";position:absolute;margin-left:-5px;border-width:5px;border-style:solid}.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-bottom{top:120%;left:50%;margin-left:-60px}.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-bottom::after{bottom:100%;left:50%;border-color:transparent transparent #000 transparent}.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-top{bottom:120%;left:50%;margin-left:-60px}.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip .tooltip-text.tooltip-top::after{top:100%;left:50%;border-color:#000 transparent transparent transparent}.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-right{top:50%;left:120%}.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-right::after{top:33%;right:100%;border-color:transparent #000 transparent transparent}.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-left{top:50%;right:110%}.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip .tooltip-text.tooltip-left::after{top:33%;left:104%;border-color:transparent transparent transparent #000}.leaflet-control-ctv.leaflet-control-ctv-horizontal .tooltip:hover .tooltip-text,.leaflet-control-ctv.leaflet-control-ctv-vertical .tooltip:hover .tooltip-text{display:block} \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.js b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.js new file mode 100644 index 00000000..c54a9db5 --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/iclient-leaflet.min.js @@ -0,0 +1,1421 @@ +/*! + * + * iclient-leaflet.(https://iclient.supermap.io) + * Copyright© 2000 - 2022 SuperMap Software Co.Ltd + * license: Apache-2.0 + * version: v11.0.0-beta + * + */!function(){var e={525:function(e){"use strict";function t(e,t){this.x=e,this.y=t}e.exports=t,t.prototype={clone:function(){return new t(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},multByPoint:function(e){return this.clone()._multByPoint(e)},divByPoint:function(e){return this.clone()._divByPoint(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},rotateAround:function(e,t){return this.clone()._rotateAround(e,t)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,r=e.y-this.y;return t*t+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,r=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=r,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_multByPoint:function(e){return this.x*=e.x,this.y*=e.y,this},_divByPoint:function(e){return this.x/=e.x,this.y/=e.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),r=Math.sin(e),n=t*this.x-r*this.y,o=r*this.x+t*this.y;return this.x=n,this.y=o,this},_rotateAround:function(e,t){var r=Math.cos(e),n=Math.sin(e),o=t.x+r*(this.x-t.x)-n*(this.y-t.y),i=t.y+n*(this.x-t.x)+r*(this.y-t.y);return this.x=o,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},t.convert=function(e){return e instanceof t?e:Array.isArray(e)?new t(e[0],e[1]):e}},721:function(e,t,r){e.exports.VectorTile=r(473),r(233),r(557)},473:function(e,t,r){"use strict";var n=r(557);function o(e,t,r){if(3===e){var o=new n(r,r.readVarint()+r.pos);o.length&&(t[o.name]=o)}}e.exports=function(e,t){this.layers=e.readFields(o,{},t)}},233:function(e,t,r){"use strict";var n=r(525);function o(e,t,r,n,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=n,this._values=o,e.readFields(i,this,t)}function i(e,t,r){1==e?t.id=r.readVarint():2==e?function(e,t){var r=e.readVarint()+e.pos;for(;e.pos>3}if(i--,1===o||2===o)a+=e.readSVarint(),s+=e.readSVarint(),1===o&&(t&&l.push(t),t=[]),t.push(new n(a,s));else{if(7!==o)throw new Error("unknown command "+o);t&&t.push(t[0].clone())}}return t&&l.push(t),l},o.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,n=0,o=0,i=0,a=1/0,s=-1/0,l=1/0,u=-1/0;e.pos>3}if(n--,1===r||2===r)o+=e.readSVarint(),i+=e.readSVarint(),os&&(s=o),iu&&(u=i);else if(7!==r)throw new Error("unknown command "+r)}return[a,l,s,u]},o.prototype.toGeoJSON=function(e,t,r){var n,i,s=this.extent*Math.pow(2,r),l=this.extent*e,u=this.extent*t,c=this.loadGeometry(),f=o.types[this.type];function p(e){for(var t=0;t>3;t=1===n?e.readString():2===n?e.readFloat():3===n?e.readDouble():4===n?e.readVarint64():5===n?e.readVarint():6===n?e.readSVarint():7===n?e.readBoolean():null}return t}(r))}e.exports=o,o.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new n(this._pbf,t,this.extent,this._keys,this._values)}},937:function(e){!function(t){"use strict";if(t.__disableNativeFetch||!t.fetch){s.prototype.append=function(e,t){e=i(e),t=a(t);var r=this.map[e];r||(r=[],this.map[e]=r),r.push(t)},s.prototype.delete=function(e){delete this.map[i(e)]},s.prototype.get=function(e){var t=this.map[i(e)];return t?t[0]:null},s.prototype.getAll=function(e){return this.map[i(e)]||[]},s.prototype.has=function(e){return this.map.hasOwnProperty(i(e))},s.prototype.set=function(e,t){this.map[i(e)]=[a(t)]},s.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(r){this.map[r].forEach(function(n){e.call(t,n,r,this)},this)},this)};var r={blob:"FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in t,arrayBuffer:"ArrayBuffer"in t},n=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];p.prototype.clone=function(){return new p(this)},f.call(p.prototype),f.call(y.prototype),y.prototype.clone=function(){return new y(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new s(this.headers),url:this.url})},y.error=function(){var e=new y(null,{status:0,statusText:""});return e.type="error",e};var o=[301,302,303,307,308];y.redirect=function(e,t){if(-1===o.indexOf(t))throw new RangeError("Invalid status code");return new y(null,{status:t,headers:{location:e}})},t.Headers=s,t.Request=p,t.Response=y,t.fetch=function(e,t){return new Promise(function(n,o){var i;i=p.prototype.isPrototypeOf(e)&&!t?e:new p(e,t);var a=new XMLHttpRequest;var l=!1;function u(){if(4===a.readyState){var e=1223===a.status?204:a.status;if(e<100||e>599){if(l)return;return l=!0,void o(new TypeError("Network request failed"))}var t={status:e,statusText:a.statusText,headers:function(e){var t=new s;return e.getAllResponseHeaders().trim().split("\n").forEach(function(e){var r=e.trim().split(":"),n=r.shift().trim(),o=r.join(":").trim();t.append(n,o)}),t}(a),url:"responseURL"in a?a.responseURL:/^X-Request-URL:/m.test(a.getAllResponseHeaders())?a.getResponseHeader("X-Request-URL"):void 0},r="response"in a?a.response:a.responseText;l||(l=!0,n(new y(r,t)))}}a.onreadystatechange=u,a.onload=u,a.onerror=function(){l||(l=!0,o(new TypeError("Network request failed")))},a.open(i.method,i.url,!0);try{"include"===i.credentials&&("withCredentials"in a?a.withCredentials=!0:console&&console.warn&&console.warn("withCredentials is not supported, you can ignore this warning"))}catch(e){console&&console.warn&&console.warn("set withCredentials error:"+e)}"responseType"in a&&r.blob&&(a.responseType="blob"),i.headers.forEach(function(e,t){a.setRequestHeader(t,e)}),a.send(void 0===i._bodyInit?null:i._bodyInit)})},t.fetch.polyfill=!0,e.exports&&(e.exports=t.fetch)}function i(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function a(e){return"string"!=typeof e&&(e=String(e)),e}function s(e){this.map={},e instanceof s?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function l(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function u(e){return new Promise(function(t,r){e.onload=function(){t(e.result)},e.onerror=function(){r(e.error)}})}function c(e){var t=new FileReader;return t.readAsArrayBuffer(e),u(t)}function f(){return this.bodyUsed=!1,this._initBody=function(e,t){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else if(r.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e,this._options=t;else if(r.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(e){if(!r.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e))throw new Error("unsupported BodyInit type")}else this._bodyText=""},r.blob?(this.blob=function(){var e=l(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this.blob().then(c)},this.text=function(){var e,t,r,n,o,i,a,s=l(this);if(s)return s;if(this._bodyBlob)return e=this._bodyBlob,t=this._options,r=new FileReader,n=t.headers.map["content-type"]?t.headers.map["content-type"].toString():"",o=/charset\=[0-9a-zA-Z\-\_]*;?/,i=e.type.match(o)||n.match(o),a=[e],i&&a.push(i[0].replace(/^charset\=/,"").replace(/;$/,"")),r.readAsText.apply(r,a),u(r);if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)}):this.text=function(){var e=l(this);return e||Promise.resolve(this._bodyText)},r.formData&&(this.formData=function(){return this.text().then(h)}),this.json=function(){return this.text().then(JSON.parse)},this}function p(e,t){var r,o,i=(t=t||{}).body;if(p.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new s(e.headers)),this.method=e.method,this.mode=e.mode,i||(i=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new s(t.headers)),this.method=(r=t.method||this.method||"GET",o=r.toUpperCase(),n.indexOf(o)>-1?o:r),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(i,t)}function h(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var r=e.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");t.append(decodeURIComponent(n),decodeURIComponent(o))}}),t}function y(e,t){t||(t={}),this._initBody(e,t),this.type="default",this.status=t.status,this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText,this.headers=t.headers instanceof s?t.headers:new s(t.headers),this.url=t.url||""}}("undefined"!=typeof self?self:this)},238:function(e,t){var r,n,o;n=[t,e],void 0===(o="function"==typeof(r=function(e,t){"use strict";var r={timeout:5e3,jsonpCallback:"callback",jsonpCallbackFunction:null};function n(e){try{delete window[e]}catch(t){window[e]=void 0}}function o(e){var t=document.getElementById(e);t&&document.getElementsByTagName("head")[0].removeChild(t)}t.exports=function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=e,a=t.timeout||r.timeout,s=t.jsonpCallback||r.jsonpCallback,l=void 0;return new Promise(function(r,u){var c=t.jsonpCallbackFunction||"jsonp_"+Date.now()+"_"+Math.ceil(1e5*Math.random()),f=s+"_"+c;window[c]=function(e){r({ok:!0,json:function(){return Promise.resolve(e)}}),l&&clearTimeout(l),o(f),n(c)},i+=-1===i.indexOf("?")?"?":"&";var p=document.createElement("script");p.setAttribute("src",""+i+s+"="+c),t.charset&&p.setAttribute("charset",t.charset),p.id=f,document.getElementsByTagName("head")[0].appendChild(p),l=setTimeout(function(){u(new Error("JSONP request to "+e+" timed out")),n(c),o(f),window[c]=function(){n(c)}},a),p.onerror=function(){u(new Error("JSONP request to "+e+" failed")),n(c),o(f),l&&clearTimeout(l)}})}})?r.apply(t,n):r)||(e.exports=o)},299:function(e,t){t.read=function(e,t,r,n,o){var i,a,s=8*o-n-1,l=(1<>1,c=-7,f=r?o-1:0,p=r?-1:1,h=e[t+f];for(f+=p,i=h&(1<<-c)-1,h>>=-c,c+=s;c>0;i=256*i+e[t+f],f+=p,c-=8);for(a=i&(1<<-c)-1,i>>=-c,c+=n;c>0;a=256*a+e[t+f],f+=p,c-=8);if(0===i)i=1-u;else{if(i===l)return a?NaN:1/0*(h?-1:1);a+=Math.pow(2,n),i-=u}return(h?-1:1)*a*Math.pow(2,i-n)},t.write=function(e,t,r,n,o,i){var a,s,l,u=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=n?0:i-1,y=n?1:-1,d=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=c):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),(t+=a+f>=1?p/l:p*Math.pow(2,1-f))*l>=2&&(a++,l/=2),a+f>=c?(s=0,a=c):a+f>=1?(s=(t*l-1)*Math.pow(2,o),a+=f):(s=t*Math.pow(2,f-1)*Math.pow(2,o),a=0));o>=8;e[r+h]=255&s,h+=y,s/=256,o-=8);for(a=a<0;e[r+h]=255&a,h+=y,a/=256,u-=8);e[r+h-y]|=128*d}},879:function(e,t,r){function n(e){"@babel/helpers - typeof";return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var o=r(99),i="&&",a="||",s="and",l="or",u="=",c="~",f="!"+u,p="!"+c,h=">",y=">=",d="<",v="<=",m="*",b=",",g=".",w="(",S=")",O="where",_={pathway:[],groups:{}},P={},x={},C=console.log;function T(e){var t=j(e,O),r=t[0],n=t[1];_.pathway=j(r,b);for(var o=0,s=_.pathway.length;ol&&-1!==l){var T="gr_"+(new Date).getTime();_.groups[T]=n.substring(l+1,x),n=n.replace(w+_.groups[T]+S,T),C=-1}C+=1}!function e(t,r){var n=E(r,i),o=E(r,a);if(n!==Number.MAX_VALUE||o!==Number.MAX_VALUE)if(n-1}function M(e,t){var r=j(t,g),n=e;for(var i in r){if(!n.hasOwnProperty(r[i]))return"";n=n[r[i]]}return n=o.isDate(n)?n.valueOf():o.isDateString(n)?o.parseDateFromString(n):n.toString()}function R(e,t){var r=!1;for(var n in e){if(r=r||(n===s?A:n===l?R:L)(e[n],t),x.trace&&C(_.step,"======((( or",e[n],r),r)return r}return r}function A(e,t){var r=!0;for(var n in e){if(r=r&&(n===s?A:n===l?R:L)(e[n],t),x.trace&&C(_.step,"======((( and",e[n],r),!r)return r}return r}function L(e,t){if(_.step+=1,e.or){var r=R(e.or,t);return x.trace&&C(_.step,"OR",e,r),r}if(e.and){r=A(e.and,t);return x.trace&&C(_.step,"AND",e,r),r}if("object"===n(e))return e.eq?M(t,e.eq[0])===e.eq[1]:e.ne?M(t,e.ne[0])!==e.ne[1]:e.req?k(M(t,e.req[0]),e.req[1]):e.nreq?!k(M(t,e.nreq[0]),e.nreq[1]):e.gt?M(t,e.gt[0])>e.gt[1]:e.ge?M(t,e.ge[0])>=e.ge[1]:e.lt?M(t,e.lt[0])0?n.map(function(e){for(var t={},r=0,n=_.pathway.length;r-1&&e%1==0&&e-1&&e%1==0&&e<=o}(e.length)&&!Y(e)}function Y(e){var t=Q(e)?x.call(e):"";return t==a||t==s}function Q(e){var t=n(e);return!!e&&("object"==t||"function"==t)}var X,K=(X=function(e){return W(e)?B(e):U(e)},function(e){var t,r,n,o=V(e);return o==l?(t=e,r=-1,n=Array(t.size),t.forEach(function(e,t){n[++r]=[t,e]}),n):o==u?function(e){var t=-1,r=Array(e.size);return e.forEach(function(e){r[++t]=[e,e]}),r}(e):d(e,X(e))});e.exports=K},943:function(e,t,r){"use strict";e.exports=o;var n=r(299);function o(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}o.Varint=0,o.Fixed64=1,o.Bytes=2,o.Fixed32=5;var i="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function a(e){return e.type===o.Bytes?e.readVarint()+e.pos:e.pos+1}function s(e,t,r){return r?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function l(e,t,r){var n=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.floor(Math.log(t)/(7*Math.LN2));r.realloc(n);for(var o=r.pos-1;o>=e;o--)r.buf[o+n]=r.buf[o]}function u(e,t){for(var r=0;r>>8,e[r+2]=t>>>16,e[r+3]=t>>>24}function w(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}o.prototype={destroy:function(){this.buf=null},readFields:function(e,t,r){for(r=r||this.length;this.pos>3,i=this.pos;this.type=7&n,e(o,t,this),this.pos===i&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=b(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=w(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=b(this.buf,this.pos)+4294967296*b(this.buf,this.pos+4);return this.pos+=8,e},readSFixed64:function(){var e=b(this.buf,this.pos)+4294967296*w(this.buf,this.pos+4);return this.pos+=8,e},readFloat:function(){var e=n.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=n.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,r,n=this.buf;return t=127&(r=n[this.pos++]),r<128?t:(t|=(127&(r=n[this.pos++]))<<7,r<128?t:(t|=(127&(r=n[this.pos++]))<<14,r<128?t:(t|=(127&(r=n[this.pos++]))<<21,r<128?t:function(e,t,r){var n,o,i=r.buf;if(o=i[r.pos++],n=(112&o)>>4,o<128)return s(e,n,t);if(o=i[r.pos++],n|=(127&o)<<3,o<128)return s(e,n,t);if(o=i[r.pos++],n|=(127&o)<<10,o<128)return s(e,n,t);if(o=i[r.pos++],n|=(127&o)<<17,o<128)return s(e,n,t);if(o=i[r.pos++],n|=(127&o)<<24,o<128)return s(e,n,t);if(o=i[r.pos++],n|=(1&o)<<31,o<128)return s(e,n,t);throw new Error("Expected varint not more than 10 bytes")}(t|=(15&(r=n[this.pos]))<<28,e,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=12&&i?function(e,t,r){return i.decode(e.subarray(t,r))}(this.buf,t,e):function(e,t,r){var n="",o=t;for(;o239?4:l>223?3:l>191?2:1;if(o+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(i=e[o+1]))&&(u=(31&l)<<6|63&i)<=127&&(u=null):3===c?(i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&((u=(15&l)<<12|(63&i)<<6|63&a)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(i=e[o+1],a=e[o+2],s=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&s)&&((u=(15&l)<<18|(63&i)<<12|(63&a)<<6|63&s)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,n+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),n+=String.fromCharCode(u),o+=c}return n}(this.buf,t,e)},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){if(this.type!==o.Bytes)return e.push(this.readVarint(t));var r=a(this);for(e=e||[];this.pos127;);else if(t===o.Bytes)this.pos=this.readVarint()+this.pos;else if(t===o.Fixed32)this.pos+=4;else{if(t!==o.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t268435455||e<0?function(e,t){var r,n;e>=0?(r=e%4294967296|0,n=e/4294967296|0):(n=~(-e/4294967296),4294967295^(r=~(-e%4294967296))?r=r+1|0:(r=0,n=n+1|0));if(e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),function(e,t,r){r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos++]=127&e|128,e>>>=7,r.buf[r.pos]=127&e}(r,0,t),function(e,t){var r=(7&e)<<4;if(t.buf[t.pos++]|=r|((e>>>=3)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;t.buf[t.pos++]=127&e}(n,t)}(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length),this.pos++;var t=this.pos;this.pos=function(e,t,r){for(var n,o,i=0;i55295&&n<57344){if(!o){n>56319||i+1===t.length?(e[r++]=239,e[r++]=191,e[r++]=189):o=n;continue}if(n<56320){e[r++]=239,e[r++]=191,e[r++]=189,o=n;continue}n=o-55296<<10|n-56320|65536,o=null}else o&&(e[r++]=239,e[r++]=191,e[r++]=189,o=null);n<128?e[r++]=n:(n<2048?e[r++]=n>>6|192:(n<65536?e[r++]=n>>12|224:(e[r++]=n>>18|240,e[r++]=n>>12&63|128),e[r++]=n>>6&63|128),e[r++]=63&n|128)}return r}(this.buf,e,this.pos);var r=this.pos-t;r>=128&&l(t,r,this),this.pos=t-1,this.writeVarint(r),this.pos+=r},writeFloat:function(e){this.realloc(4),n.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),n.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;r=128&&l(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(e,t,r){this.writeTag(e,o.Bytes),this.writeRawMessage(t,r)},writePackedVarint:function(e,t){t.length&&this.writeMessage(e,u,t)},writePackedSVarint:function(e,t){t.length&&this.writeMessage(e,c,t)},writePackedBoolean:function(e,t){t.length&&this.writeMessage(e,h,t)},writePackedFloat:function(e,t){t.length&&this.writeMessage(e,f,t)},writePackedDouble:function(e,t){t.length&&this.writeMessage(e,p,t)},writePackedFixed32:function(e,t){t.length&&this.writeMessage(e,y,t)},writePackedSFixed32:function(e,t){t.length&&this.writeMessage(e,d,t)},writePackedFixed64:function(e,t){t.length&&this.writeMessage(e,v,t)},writePackedSFixed64:function(e,t){t.length&&this.writeMessage(e,m,t)},writeBytesField:function(e,t){this.writeTag(e,o.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,o.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,o.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,o.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,o.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,o.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,o.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,o.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,o.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,o.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}},957:function(e,t,r){var n,o,i;function a(e){"@babel/helpers - typeof";return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}i=function(){"use strict";function e(e){var t=this.constructor;return this.then(function(r){return t.resolve(e()).then(function(){return r})},function(r){return t.resolve(e()).then(function(){return t.reject(r)})})}function t(e){return new this(function(t,r){if(!e||void 0===e.length)return r(new TypeError(a(e)+" "+e+" is not iterable(cannot read property Symbol(Symbol.iterator))"));var n=Array.prototype.slice.call(e);if(0===n.length)return t([]);var o=n.length;function i(e,r){if(r&&("object"===a(r)||"function"==typeof r)){var s=r.then;if("function"==typeof s)return void s.call(r,function(t){i(e,t)},function(r){n[e]={status:"rejected",reason:r},0==--o&&t(n)})}n[e]={status:"fulfilled",value:r},0==--o&&t(n)}for(var s=0;s0&&(r=parseFloat(e.toPrecision(t))),r},format:function(e,t,r,n){t=void 0!==t?t:0,r=void 0!==r?r:Q.thousandsSeparator,n=void 0!==n?n:Q.decimalSeparator,null!=t&&(e=parseFloat(e.toFixed(t)));var o=e.toString().split(".");1===o.length&&null==t&&(t=0);var i,a=o[0];if(r)for(var s=/(-?[0-9]+)([0-9]{3})/;s.test(a);)a=a.replace(s,"$1"+r+"$2");if(0==t)i=a;else{var l=o.length>1?o[1]:"0";null!=t&&(l+=new Array(t-l.length+1).join("0")),i=a+n+l}return i}};Number.prototype.limitSigDigs||(Number.prototype.limitSigDigs=function(e){return Q.limitSigDigs(this,e)});var X={bind:function(e,t){var r=Array.prototype.slice.apply(arguments,[2]);return function(){var n=r.concat(Array.prototype.slice.apply(arguments,[0]));return e.apply(t,n)}},bindAsEventListener:function(e,t){return function(r){return e.call(t,r||window.event)}},False:function(){return!1},True:function(){return!0},Void:function(){}},K={filter:function(e,t,r){var n=[];if(Array.prototype.filter)n=e.filter(t,r);else{var o=e.length;if("function"!=typeof t)throw new TypeError;for(var i=0;i-1||ie.indexOf("trident")>-1&&ie.indexOf("rv")>-1?(re="msie",te=ie.match(/msie ([\d.]+)/)||ie.match(/rv:([\d.]+)/)):ie.indexOf("chrome")>-1?(re="chrome",te=ie.match(/chrome\/([\d.]+)/)):ie.indexOf("firefox")>-1?(re="firefox",te=ie.match(/firefox\/([\d.]+)/)):ie.indexOf("opera")>-1?(re="opera",te=ie.match(/version\/([\d.]+)/)):ie.indexOf("safari")>-1&&(re="safari",te=ie.match(/version\/([\d.]+)/)),ne=te?te[1]:"",ie.indexOf("ipad")>-1||ie.indexOf("ipod")>-1||ie.indexOf("iphone")>-1?oe="apple":ie.indexOf("android")>-1&&(ne=(te=ie.match(/version\/([\d.]+)/))?te[1]:"",oe="android"),{name:re,version:ne,device:oe}),ue=(ae=!0,se=le,document.createElement("canvas").getContext?("firefox"===se.name&&parseFloat(se.version)<5&&(ae=!1),"safari"===se.name&&parseFloat(se.version)<4&&(ae=!1),"opera"===se.name&&parseFloat(se.version)<10&&(ae=!1),"msie"===se.name&&parseFloat(se.version)<9&&(ae=!1)):ae=!1,ae),ce=function(){var e=navigator.userAgent.toLowerCase();return-1===e.indexOf("webkit")&&-1!==e.indexOf("gecko")}(),fe={extend:function(e,t){if(e=e||{},t){for(var r in t){var n=t[r];void 0!==n&&(e[r]=n)}!("function"==typeof window.Event&&t instanceof window.Event)&&t.hasOwnProperty&&t.hasOwnProperty("toString")&&(e.toString=t.toString)}return e},copy:function(e,t){var r;if(e=e||{},t)for(var n in e)void 0!==(r=t[n])&&(e[n]=r)},reset:function(e){for(var t in e=e||{})if(e.hasOwnProperty(t)){if("object"===ee(e[t])&&e[t]instanceof Array){for(var r in e[t])e[t][r].destroy&&e[t][r].destroy();e[t].length=0}else"object"===ee(e[t])&&e[t]instanceof Object&&e[t].destroy&&e[t].destroy();e[t]=null}},getElement:function(){for(var e=[],t=0,r=arguments.length;t=0;r--)e[r]===t&&e.splice(r,1);return e},indexOf:function(e,t){if(null==e)return-1;if("function"==typeof e.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r=0&&parseFloat(s)<1?(e.style.filter="alpha(opacity="+100*s+")",e.style.opacity=s):1===parseFloat(s)&&(e.style.filter="",e.style.opacity="")},applyDefaults:function(e,t){e=e||{};var r="function"==typeof window.Event&&t instanceof window.Event;for(var n in t)(void 0===e[n]||!r&&t.hasOwnProperty&&t.hasOwnProperty(n)&&!e.hasOwnProperty(n))&&(e[n]=t[n]);return!r&&t&&t.hasOwnProperty&&t.hasOwnProperty("toString")&&!e.hasOwnProperty("toString")&&(e.toString=t.toString),e},getParameterString:function(e){var t=[];for(var r in e){var n,o=e[r];if(null!=o&&"function"!=typeof o)n=Array.isArray(o)||"[object Object]"===o.toString()?encodeURIComponent(JSON.stringify(o)):encodeURIComponent(o),t.push(encodeURIComponent(r)+"="+n)}return t.join("&")},urlAppend:function(e,t){var r=e;if(t){0===t.indexOf("?")&&(t=t.substring(1));var n=(e+" ").split(/[?&]/);r+=" "===n.pop()?t:n.length?"&"+t:"?"+t}return r},urlPathAppend:function(e,t){var r=e;if(!t)return r;0===t.indexOf("/")&&(t=t.substring(1));var n=e.split("?");return n[0].indexOf("/",n[0].length-1)<0&&(n[0]+="/"),r="".concat(n[0]).concat(t).concat(n.length>1?"?".concat(n[1]):"")},DEFAULT_PRECISION:14,toFloat:function(e,t){return null==t&&(t=fe.DEFAULT_PRECISION),"number"!=typeof e&&(e=parseFloat(e)),0===t?e:parseFloat(e.toPrecision(t))},rad:function(e){return e*Math.PI/180},getParameters:function(e){e=null===e||void 0===e?window.location.href:e;var t="";if(Y.contains(e,"?")){var r=e.indexOf("?")+1,n=Y.contains(e,"#")?e.indexOf("#"):e.length;t=e.substring(r,n)}for(var o={},i=t.split(/[&;]/),a=0,s=i.length;a1?1/e:e},getResolutionFromScale:function(e,t){var r;e&&(null==t&&(t="degrees"),r=1/(fe.normalizeScale(e)*pe[t]*96));return r},getScaleFromResolution:function(e,t){return null==t&&(t="degrees"),e*pe[t]*96},getBrowser:function(){return le},isSupportCanvas:ue,supportCanvas:function(){return fe.isSupportCanvas},isInTheSameDomain:function(e){if(!e)return!0;var t=e.indexOf("//"),r=document.location.toString(),n=r.indexOf("//");if(-1===t)return!0;var o,i=o=e.substring(0,t),a=r.substring(n+2);n=a.indexOf("/");var s=a.indexOf(":"),l=a.substring(0,n),u=document.location.protocol;if(-1!==s||(l+=":"+("http:"===u.toLowerCase()?80:443)),u.toLowerCase()!==i.toLowerCase())return!1;var c=(i=e.substring(t+2)).indexOf(":");t=i.indexOf("/");var f,p=i.substring(0,t);return-1!==c?f=i.substring(0,c):(f=i.substring(0,t),p+=":"+("http:"===o.toLowerCase()?80:443)),f===document.domain&&p===l},calculateDpi:function(e,t,r,n,o){if(e&&t&&r){var i,a=e.getWidth(),s=e.getHeight(),l=t.w,u=t.h;if(o=o||6378137,"degree"===(n=n||"degrees").toLowerCase()||"degrees"===n.toLowerCase()||"dd"===n.toLowerCase()){var c=a/l,f=s/u;i=254/(c>f?c:f)/r/(2*Math.PI*o/360)/1e4}else{i=254/(a/l)/r/1e4}return i}},toJSON:function(e){var t=e;if(null==t)return null;switch(t.constructor){case String:return t=(t=(t=(t=(t=(t=(t='"'+t.replace(/(["\\])/g,"\\$1")+'"').replace(/\n/g,"\\n")).replace(/\r/g,"\\r")).replace("<","<")).replace(">",">")).replace(/%/g,"%25")).replace(/&/g,"%26");case Array:for(var r="",n=0,o=t.length;n0?"{"+l.join(",")+"}":"{}"}return t.toString()}},getResolutionFromScaleDpi:function(e,t,r,n){return n=n||6378137,r=r||"",e>0&&t>0?(e=fe.normalizeScale(e),"degree"===r.toLowerCase()||"degrees"===r.toLowerCase()||"dd"===r.toLowerCase()?254/t/e/(2*Math.PI*n/360)/1e4:254/t/e/1e4):-1},getScaleFromResolutionDpi:function(e,t,r,n){return n=n||6378137,r=r||"",e>0&&t>0?"degree"===r.toLowerCase()||"degrees"===r.toLowerCase()||"dd"===r.toLowerCase()?254/t/e/(2*Math.PI*n/360)/1e4:254/t/e/1e4:-1},transformResult:function(e){return e.responseText&&"string"==typeof e.responseText&&(e=JSON.parse(e.responseText)),e},copyAttributes:function(e,t){if(e=e||{},t)for(var r in t){var n=t[r];void 0!==n&&"CLASS_NAME"!==r&&"function"!=typeof n&&(e[r]=n)}return e},copyAttributesWithClip:function(e,t,r){if(e=e||{},t)for(var n in t){var o=!1;if(r&&r.length)for(var i=0,a=r.length;i=0&&i<=1&&o<=1&&i>=0?new $.Point(e.x+o*(t.x-e.x),e.y+o*(t.y-e.y)):"No Intersection";else if(0==s&&0==l){var c=Math.max(e.y,t.y),f=Math.min(e.y,t.y),p=Math.max(e.x,t.x),h=Math.min(e.x,t.x);a=(r.y>=f&&r.y<=c||n.y>=f&&n.y<=c)&&r.x>=h&&r.x<=p||n.x>=h&&n.x<=p?"Coincident":"Parallel"}else a="Parallel";return a},getTextBounds:function(e,t,r){document.body.appendChild(r),r.style.width="auto",r.style.height="auto",e.fontSize&&(r.style.fontSize=e.fontSize),e.fontFamily&&(r.style.fontFamily=e.fontFamily),e.fontWeight&&(r.style.fontWeight=e.fontWeight),r.style.position="relative",r.style.visibility="hidden",r.style.display="inline-block",r.innerHTML=t;var n=r.clientWidth,o=r.clientHeight;return document.body.removeChild(r),{textWidth:n,textHeight:o}},convertPath:function(e,t){return t?e.replace(/\{([\w-\.]+)\}/g,function(e,r){var n;return n=t.hasOwnProperty(r)?function(e){if(void 0==e||null==e)return"";if(e instanceof Date)return e.toJSON();if(function(e){if("string"!=typeof e&&"object"!==ee(e))return!1;try{var t=e.toString();return"[object Object]"===t||"[object Array]"===t}catch(e){return!1}}(e))return JSON.stringify(e);return e.toString()}(t[r]):e,encodeURIComponent(n)}):e}},pe={inches:1,ft:12,mi:63360,m:39.3701,km:39370.1,dd:4374754,yd:36};pe.in=pe.inches,pe.degrees=pe.dd,pe.nmi=1852*pe.m;var he=.0254000508001016;function ye(e,t){for(var r=0;re.right;)t.lon-=e.getWidth()}return t}},{key:"destroy",value:function(){this.lon=null,this.lat=null}}])&&ye(t.prototype,r),n&&ye(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function ve(e,t){for(var r=0;rthis.right)&&(this.right=r.right),(null==this.top||r.top>this.top)&&(this.top=r.top))}}},{key:"containsLonLat",value:function(e,t){"boolean"==typeof t&&(t={inclusive:t}),t=t||{};var r=this.contains(e.lon,e.lat,t.inclusive),n=t.worldBounds;if(n&&!r){var o=n.getWidth(),i=(n.left+n.right)/2,a=Math.round((e.lon-i)/o);r=this.containsLonLat({lon:e.lon-a*o,lat:e.lat},{inclusive:t.inclusive})}return r}},{key:"containsPixel",value:function(e,t){return this.contains(e.x,e.y,t)}},{key:"contains",value:function(e,t,r){if(null==r&&(r=!0),null==e||null==t)return!1;var n=!1;return n=r?e>=this.left&&e<=this.right&&t>=this.bottom&&t<=this.top:e>this.left&&ethis.bottom&&t=r.bottom&&e.bottom<=r.top||r.bottom>=e.bottom&&r.bottom<=e.top,a=e.top>=r.bottom&&e.top<=r.top||r.top>e.bottom&&r.top=r.left&&e.left<=r.right||r.left>=e.left&&r.left<=e.right,l=e.right>=r.left&&e.right<=r.right||r.right>=e.left&&r.right<=e.right;n=(i||a)&&(s||l)}if(t.worldBounds&&!n){var u=t.worldBounds,c=u.getWidth(),f=!u.containsBounds(r),p=!u.containsBounds(e);f&&!p?(e=e.add(-c,0),n=r.intersectsBounds(e,{inclusive:t.inclusive})):p&&!f&&(r=r.add(-c,0),n=e.intersectsBounds(r,{inclusive:t.inclusive}))}return n}},{key:"containsBounds",value:function(e,t,r){null==t&&(t=!1),null==r&&(r=!0);var n=this.contains(e.left,e.bottom,r),o=this.contains(e.right,e.bottom,r),i=this.contains(e.left,e.top,r),a=this.contains(e.right,e.top,r);return t?n||o||i||a:n&&o&&i&&a}},{key:"determineQuadrant",value:function(e){var t="",r=this.getCenterLonLat();return t+=e.lat=e.right&&o.right>e.right;)o=o.add(-i,0);var a=o.left+r;ae.left&&o.right-n>e.right&&(o=o.add(-i,0))}return o}},{key:"toServerJSONObject",value:function(){return{rightTop:{x:this.right,y:this.top},leftBottom:{x:this.left,y:this.bottom},left:this.left,right:this.right,top:this.top,bottom:this.bottom}}},{key:"destroy",value:function(){this.left=null,this.right=null,this.top=null,this.bottom=null,this.centerLonLat=null}}])&&ve(t.prototype,r),n&&ve(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function be(e){"@babel/helpers - typeof";return(be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ge(e,t){for(var r=0;r-1)){if(null!=t&&t=0;--r)t=this.removeComponent(e[r])||t;return t}},{key:"removeComponent",value:function(e){return fe.removeItem(this.components,e),this.clearBounds(),!0}},{key:"getArea",value:function(){for(var e=0,t=0,r=this.components.length;t=1?1:m)<=-1?-1:m,c=180*Math.acos(m)/Math.PI,a=(c=o.x==r.x?t.x>r.x&&n.x>r.x||t.xp*t.x+h&&n.y>p*n.x+h||t.yr.y?n.xr.x&&(s=!1):o.xp*n.x+h&&(s=!1):o.x>r.x?n.y>r.y&&(s=!1):n.y=0?180*Math.atan(b)/Math.PI:Math.abs(180*Math.atan(b)/Math.PI)+90,w=Math.abs(t.y);r.y==w&&w==o.y&&r.x=0?b>=0?u+=l:u=180-(u-90)+l:u=b>0?u-180+l:90-u+l:S>=0?b>=0?u-=l:u=180-(u-90)-l:u=b>=0?u-180-l:90-u-l,u=u*Math.PI/180;var _=t.x+i*Math.cos(u),P=t.y+i*Math.sin(u);f.push(new Ve(_,P))}f.push(o)}return f}},{key:"createLineEPS",value:function(e){var t=[],r=e.length;if(r<2)return e;for(var n=0;n2;return t&&He(Qe(i.prototype),"removeComponent",this).apply(this,arguments),t}},{key:"getSortedSegments",value:function(){for(var e,t,r=this.components.length-1,n=new Array(r),o=0;o1&&(r=parseFloat(r)*u),n.labelAlign&&"cm"!==n.labelAlign)switch(n.labelAlign){case"lt":l.x+=t/2,l.y+=r/2;break;case"lm":l.x+=t/2;break;case"lb":l.x+=t/2,l.y-=r/2;break;case"ct":l.y+=r/2;break;case"cb":l.y-=r/2;break;case"rt":l.x-=t/2,l.y+=r/2;break;case"rm":l.x-=t/2;break;case"rb":l.x-=t/2,l.y-=r/2}return this.bsInfo.h=r,this.bsInfo.w=t,o=l.x-parseFloat(t)/2,i=l.y+parseFloat(r)/2,s=l.x+parseFloat(t)/2,a=l.y-parseFloat(r)/2,new me(o,i,s,a)}},{key:"getLabelPxBoundsByText",value:function(e,t){var r,n,o,i,a=this.getLabelPxSize(t),s=fe.cloneObject(e);if(t.labelAlign&&"cm"!==t.labelAlign)switch(t.labelAlign){case"lt":s.x+=a.w/2,s.y+=a.h/2;break;case"lm":s.x+=a.w/2;break;case"lb":s.x+=a.w/2,s.y-=a.h/2;break;case"ct":s.y+=a.h/2;break;case"cb":s.y-=a.h/2;break;case"rt":s.x-=a.w/2,s.y+=a.h/2;break;case"rm":s.x-=a.w/2;break;case"rb":s.x-=a.w/2,s.y-=a.h/2}return this.bsInfo.h=a.h,this.bsInfo.w=a.w,r=s.x-a.w/2,n=s.y+a.h/2,i=t.fontStyle&&"italic"===t.fontStyle?s.x+a.w/2+parseInt(parseFloat(t.fontSize)/2):s.x+a.w/2,o=s.y-a.h/2,new me(r,n,i,o)}},{key:"getLabelPxSize",value:function(e){var t,r,n,o,i=parseFloat(e.strokeWidth);t=e.label||this.text,r=e.fontSize?parseFloat(e.fontSize):parseFloat("12px");var a=t.split("\n"),s=a.length;o=s>1?r*s+s+i+.2*r:r+i+.2*r+1,n=0,this.labelWTmp&&n255?r++:n++;return t.cnC=r,t.enC=n,t.textC=e.length,t}}])&&Ze(t.prototype,r),n&&Ze(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function ot(e){"@babel/helpers - typeof";return(ot="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function it(e,t){for(var r=0;r3;if(t){this.components.pop(),at(ut(i.prototype),"removeComponent",this).apply(this,arguments);var r=this.components[0];at(ut(i.prototype),"addComponent",this).apply(this,[r])}return t}},{key:"getArea",value:function(){var e=0;if(this.components&&this.components.length>2){for(var t=0,r=0,n=this.components.length;r0){e+=Math.abs(this.components[0].getArea());for(var t=1,r=this.components.length;t1},isLeftClick:function(e){return e.which&&1===e.which||e.button&&1===e.button},isRightClick:function(e){return e.which&&3===e.which||e.button&&2===e.button},stop:function(e,t){t||(e.preventDefault?e.preventDefault():e.returnValue=!1),e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},findElement:function(e,t){for(var r=Ft.element(e);r.parentNode&&(!r.tagName||r.tagName.toUpperCase()!=t.toUpperCase());)r=r.parentNode;return r},observe:function(e,t,r,n){var o=fe.getElement(e);if(n=n||!1,"keypress"===t&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||o.attachEvent)&&(t="keydown"),this.observers||(this.observers={}),!o._eventCacheID){var i="eventCacheID_";o.id&&(i=o.id+"_"+i),o._eventCacheID=fe.createUniqueID(i)}var a=o._eventCacheID;this.observers[a]||(this.observers[a]=[]),this.observers[a].push({element:o,name:t,observer:r,useCapture:n}),o.addEventListener?"mousewheel"===t?o.addEventListener(t,r,{useCapture:n,passive:!1}):o.addEventListener(t,r,n):o.attachEvent&&o.attachEvent("on"+t,r)},stopObservingElement:function(e){var t=fe.getElement(e)._eventCacheID;this._removeElementObservers(Ft.observers[t])},_removeElementObservers:function(e){if(e)for(var t=e.length-1;t>=0;t--){var r=e[t],n=new Array(r.element,r.name,r.observer,r.useCapture);Ft.stopObserving.apply(this,n)}},stopObserving:function(e,t,r,n){n=n||!1;var o=fe.getElement(e),i=o._eventCacheID;"keypress"===t&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||o.detachEvent)&&(t="keydown");var a=!1,s=Ft.observers[i];if(s)for(var l=0;!a&&l0&&r.push(","),r.push(this.writeNewline(),this.writeIndent(),t));return this.level-=1,r.push(this.writeNewline(),this.writeIndent(),"]"),r.join("")},string:function(e){var t={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return/["\\\x00-\x1f]/.test(e)?'"'+e.replace(/([\x00-\x1f\\"])/g,function(e,r){var n=t[r];return n||(n=r.charCodeAt(),"\\u00"+Math.floor(n/16).toString(16)+(n%16).toString(16))})+'"':'"'+e+'"'},number:function(e){return isFinite(e)?String(e):"null"},boolean:function(e){return String(e)},date:function(e){function t(e){return e<10?"0"+e:e}return'"'+e.getFullYear()+"-"+t(e.getMonth()+1)+"-"+t(e.getDate())+"T"+t(e.getHours())+":"+t(e.getMinutes())+":"+t(e.getSeconds())+'"'}},t}return t=i,(r=[{key:"read",value:function(e,t){var r;if(this.nativeJSON)try{r=JSON.parse(e,t)}catch(e){}return this.keepData&&(this.data=r),r}},{key:"write",value:function(e,t){this.pretty=!!t;var r=null,n=nr(e);if(this.serialize[n])try{r=!this.pretty&&this.nativeJSON?JSON.stringify(e):this.serialize[n].apply(this,[e])}catch(e){}return r}},{key:"writeIndent",value:function(){var e=[];if(this.pretty)for(var t=0;t0))return null;for(var a=0,s=0,l=[];a0){e+='"points":[';for(var r=0,n=this.components.length;re[i]){var a=e[i];e[i]=e[o],e[o]=a;var s=t[i];if(t[i]=t[o],t[o]=s,r&&r.length>0){var l=r[i];r[i]=r[o],r[o]=l}if(n&&n.length>0){var u=n[i];n[i]=n[o],n[o]=u}}}}],(r=[{key:"destroy",value:function(){var e=this;e.id=null,e.style=null,e.parts=null,e.partTopo=null,e.points=null,e.type=null,e.prjCoordSys=null}},{key:"toGeometry",value:function(){var e=this;switch(e.type.toUpperCase()){case o.POINT:return e.toGeoPoint();case o.LINE:return e.toGeoLine();case o.LINEM:return e.toGeoLinem();case o.REGION:return e.toGeoRegion();case o.POINTEPS:return e.toGeoPoint();case o.LINEEPS:return e.toGeoLineEPS();case o.REGIONEPS:return e.toGeoRegionEPS();case o.GEOCOMPOUND:return e.transformGeoCompound()}}},{key:"toGeoPoint",value:function(){var e=this.parts||[],t=this.points||[],r=e.length;if(r>0){if(1===r)return new Ve(t[0].x,t[0].y);for(var n=[],o=0;o0){if(1===r){for(var n=[],o=0;o0){if(1===s){for(e=0,r=[];e=0;g--)if(m[b]=-1,f[g].containsBounds(f[b])){p[b]=-1*p[g],p[b]<0&&(m[b]=g);break}for(var w=0;w0?i.push(c[w]):(i[m[w]].components=i[m[w]].components.concat(c[w].components),i.push(""))}else{i=new Array;for(var S=0;S0&&i.length>0&&(i[i.length-1].components=i[i.length-1].components.concat(l),l=[]),i.push(c[S])),S==o-1){var O=i.length;if(O)i[O-1].components=i[O-1].components.concat(l);else for(var _=0,P=l.length;_=0;w--)if(b[g]=-1,p[w].containsBounds(p[g])){h[g]=-1*h[w],h[g]<0&&(b[g]=w);break}for(var S=0;S0?a.push(f[S]):(a[b[S]].components=a[b[S]].components.concat(f[S].components),a.push(""))}else{a=new Array;for(var O=0;O0&&a.length>0&&(a[a.length-1].components=a[a.length-1].components.concat(u),u=[]),a.push(f[O])),O==o-1){var _=a.length;if(_)a[_-1].components=a[_-1].components.concat(u);else for(var P=0,x=u.length;P-1||(t[n]=e[n]);return t}}])&&kr(t.prototype,r),n&&kr(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Dr(e){"@babel/helpers - typeof";return(Dr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ir(e,t){for(var r=0;r0&&o.push(","),r=t[i].geometry,o.push(this.extractGeometry(r));return n&&o.push(")"),o.join("")}},{key:"extractGeometry",value:function(e){var t=e.CLASS_NAME.split(".")[2].toLowerCase();return this.extract[t]?("collection"===t?"GEOMETRYCOLLECTION":t.toUpperCase())+"("+this.extract[t].apply(this,[e])+")":null}}])&&Ir(t.prototype,r),n&&Ir(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function zr(e,t){for(var r=0;r=0?t.speed:1,this.frequency=t.speed&&t.frequency>=0?t.frequency:1e3,this.startTime=t.startTime&&null!=t.startTime?t.startTime:0,this.endTime=t.endTime&&null!=t.endTime&&t.endTime>=r.startTime?t.endTime:+new Date,this.repeat=void 0===t.repeat||t.repeat,this.reverse=void 0!==t.reverse&&t.reverse,this.currentTime=null,this.oldTime=null,this.running=!1,this.EVENT_TYPES=["start","pause","stop"],r.events=new Ut(this,null,this.EVENT_TYPES),r.speed=Number(r.speed),r.frequency=Number(r.frequency),r.startTime=Number(r.startTime),r.endTime=Number(r.endTime),r.startTime=Date.parse(new Date(r.startTime)),r.endTime=Date.parse(new Date(r.endTime)),r.currentTime=r.startTime,this.CLASS_NAME="SuperMap.TimeControlBase"}var t,r,n;return t=e,(r=[{key:"updateOptions",value:function(e){var t=this;(e=e||{}).speed&&e.speed>=0&&(t.speed=e.speed,t.speed=Number(t.speed)),e.speed&&e.frequency>=0&&(t.frequency=e.frequency,t.frequency=Number(t.frequency)),e.startTime&&null!=e.startTime&&(t.startTime=e.startTime,t.startTime=Date.parse(new Date(t.startTime))),e.endTime&&null!=e.endTime&&e.endTime>=t.startTime&&(t.endTime=e.endTime,t.endTime=Date.parse(new Date(t.endTime))),null!=e.repeat&&(t.repeat=e.repeat),null!=e.reverse&&(t.reverse=e.reverse)}},{key:"start",value:function(){var e=this;e.running||(e.running=!0,e.tick(),e.events.triggerEvent("start",e.currentTime))}},{key:"pause",value:function(){this.running=!1,this.events.triggerEvent("pause",this.currentTime)}},{key:"stop",value:function(){var e=this;e.currentTime=e.startTime,e.running&&(e.running=!1),e.events.triggerEvent("stop",e.currentTime)}},{key:"toggle",value:function(){this.running?this.pause():this.start()}},{key:"setSpeed",value:function(e){return e>=0&&(this.speed=e,!0)}},{key:"getSpeed",value:function(){return this.speed}},{key:"setFrequency",value:function(e){return e>=0&&(this.frequency=e,!0)}},{key:"getFrequency",value:function(){return this.frequency}},{key:"setStartTime",value:function(e){var t=this;return!((e=Date.parse(new Date(e)))>t.endTime)&&(t.startTime=e,t.currentTime=t.endTime&&(t.currentTime=t.startTime,t.tick()),!0)}},{key:"getEndTime",value:function(){return this.endTime}},{key:"setCurrentTime",value:function(e){var t=this;return t.currentTime=Date.parse(new Date(t.currentTime)),e>=t.startTime&&e<=t.endTime&&(t.currentTime=e,t.startTime=t.currentTime,t.tick(),!0)}},{key:"getCurrentTime",value:function(){return this.currentTime}},{key:"setRepeat",value:function(e){this.repeat=e}},{key:"getRepeat",value:function(){return this.repeat}},{key:"setReverse",value:function(e){this.reverse=e}},{key:"getReverse",value:function(){return this.reverse}},{key:"getRunning",value:function(){return this.running}},{key:"destroy",value:function(){var e=this;e.speed=null,e.frequency=null,e.startTime=null,e.endTime=null,e.currentTime=null,e.repeat=null,e.running=!1,e.reverse=null}},{key:"tick",value:function(){}}])&&zr(t.prototype,r),n&&zr(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function Jr(e){"@babel/helpers - typeof";return(Jr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function qr(e,t){for(var r=0;r=e.endTime&&(e.currentTime=e.endTime)}}}])&&qr(t.prototype,r),n&&qr(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}(),en=(r(957),r(937),r(238)),tn=r.n(en),rn=window.fetch,nn={limitLength:1500,queryKeys:[],queryValues:[],supermap_callbacks:{},addQueryStrings:function(e){for(var t in e){this.queryKeys.push(t),"string"!=typeof e[t]&&(e[t]=fe.toJSON(e[t]));var r=encodeURIComponent(e[t]);this.queryValues.push(r)}},issue:function(e){for(var t=this,r=t.getUid(),n=e.url,o=[],i=new Promise(function(e){t.supermap_callbacks[r]=function(n){delete t.supermap_callbacks[r],e(n)}}),a=n,s=0,l=t.queryKeys?t.queryKeys.length:0,u=0;u=t.limitLength){if(0==s)return!1;o.push(a),a=n,s=0,u--}else if(a.length+t.queryKeys[u].length+2+t.queryValues[u].length>t.limitLength)for(var c=t.queryValues[u];c.length>0;){var f=t.limitLength-a.length-t.queryKeys[u].length-2;a.indexOf("?")>-1?a+="&":a+="?";var p=c.substring(0,f);"%"===p.substring(f-1,f)?(f-=1,p=c.substring(0,f)):"%"===p.substring(f-2,f-1)&&(f-=2,p=c.substring(0,f)),a+=t.queryKeys[u]+"="+p,c=c.substring(f),p.length>0&&(o.push(a),a=n,s=0)}else s++,a.indexOf("?")>-1?a+="&":a+="?",a+=t.queryKeys[u]+"="+t.queryValues[u];return o.push(a),t.send(o,"RequestJSONPPromise.supermap_callbacks["+r+"]",e&&e.proxy),i},getUid:function(){return 1e3*(new Date).getTime()+Math.floor(1e17*Math.random())},send:function(e,t,r){var n=e.length;if(n>0)for(var o=(new Date).getTime(),i=0;i-1?a+="&":a+="?",a+="sectionCount="+n,a+="§ionIndex="+i,a+="&jsonpUserID="+o,r&&(a=decodeURIComponent(a),a=r+encodeURIComponent(a)),tn()(a,{jsonpCallbackFunction:t,timeout:3e4})}},GET:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings(e.params),this.issue(e)},POST:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)},PUT:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)},DELETE:function(e){return this.queryKeys.length=0,this.queryValues.length=0,this.addQueryStrings({requestEntity:e.data}),this.issue(e)}},on=function(){return void 0!=Kr?Kr:window.XMLHttpRequest&&"withCredentials"in new window.XMLHttpRequest},an=function(){return Zr||45e3},sn={commit:function(e,t,r,n){switch(e=e?e.toUpperCase():e){case"GET":return this.get(t,r,n);case"POST":return this.post(t,r,n);case"PUT":return this.put(t,r,n);case"DELETE":return this.delete(t,r,n);default:return this.get(t,r,n)}},supportDirectRequest:function(e,t){return!!fe.isInTheSameDomain(e)||(void 0!=t.crossOrigin?t.crossOrigin:on()||t.proxy)},get:function(e,t,r){r=r||{};if(e=fe.urlAppend(e,this._getParameterString(t||{})),e=this._processUrl(e,r),!this.supportDirectRequest(e,r)){var n={url:e=e.replace(".json",".jsonp"),data:t};return nn.GET(n)}return this.urlIsLong(e)?this._postSimulatie("GET",e.substring(0,e.indexOf("?")-1),t,r):this._fetch(e,t,r,"GET")},delete:function(e,t,r){r=r||{};if(e=fe.urlAppend(e,this._getParameterString(t||{})),e=this._processUrl(e,r),!this.supportDirectRequest(e,r)){e=e.replace(".json",".jsonp");var n={url:e+="&_method=DELETE",data:t};return nn.DELETE(n)}return this.urlIsLong(e)?this._postSimulatie("DELETE",e.substring(0,e.indexOf("?")-1),t,r):this._fetch(e,t,r,"DELETE")},post:function(e,t,r){if(r=r||{},!this.supportDirectRequest(e,r)){e=e.replace(".json",".jsonp");var n={url:e+="&_method=POST",data:t};return nn.POST(n)}return this._fetch(this._processUrl(e,r),t,r,"POST")},put:function(e,t,r){if(r=r||{},e=this._processUrl(e,r),!this.supportDirectRequest(e,r)){e=e.replace(".json",".jsonp");var n={url:e+="&_method=PUT",data:t};return nn.PUT(n)}return this._fetch(e,t,r,"PUT")},urlIsLong:function(e){for(var t=0,r=null,n=0,o=e.length;n-1?"&":"?")+"_method="+e,"string"!=typeof r&&(r=JSON.stringify(r)),this.post(t,r,n)},_processUrl:function(e,t){if(this._isMVTRequest(e))return e;if(-1===e.indexOf(".json")&&!t.withoutFormatSuffix)if(e.indexOf("?")<0)e+=".json";else{var r=e.split("?");2===r.length&&(e=r[0]+".json?"+r[1])}return t&&t.proxy&&("function"==typeof t.proxy?e=t.proxy(e):(e=decodeURIComponent(e),e=t.proxy+encodeURIComponent(e))),e},_fetch:function(e,t,r,n){return(r=r||{}).headers=r.headers||{},r.headers["Content-Type"]||FormData.prototype.isPrototypeOf(t)||(r.headers["Content-Type"]="application/x-www-form-urlencoded;charset=UTF-8"),r.timeout?this._timeout(r.timeout,rn(e,{method:n,headers:r.headers,body:"PUT"===n||"POST"===n?t:void 0,credentials:this._getWithCredentials(r),mode:"cors",timeout:an()}).then(function(e){return e})):rn(e,{method:n,body:"PUT"===n||"POST"===n?t:void 0,headers:r.headers,credentials:this._getWithCredentials(r),mode:"cors",timeout:an()}).then(function(e){return e})},_getWithCredentials:function(e){return!0===e.withCredentials?"include":!1===e.withCredentials?"omit":"same-origin"},_fetchJsonp:function(e,t){return t=t||{},tn()(e,{method:"GET",timeout:t.timeout}).then(function(e){return e})},_timeout:function(e,t){return new Promise(function(r,n){setTimeout(function(){n(new Error("timeout"))},e),t.then(r,n)})},_getParameterString:function(e){var t=[];for(var r in e){var n,o=e[r];if(null!=o&&"function"!=typeof o)n=Array.isArray(o)||"[object Object]"===o.toString()?encodeURIComponent(JSON.stringify(o)):encodeURIComponent(o),t.push(encodeURIComponent(r)+"="+n)}return t.join("&")},_isMVTRequest:function(e){return e.indexOf(".mvt")>-1||e.indexOf(".pbf")>-1}};function ln(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:{headers:this.headers,crossOrigin:this.crossOrigin,withCredentials:this.withCredentials};return t=un.appendCredential(t),sn.commit(e,t,r,n).then(function(e){return e.json()})}}])&&wn(t.prototype,r),n&&wn(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function On(e,t){for(var r=0;r0?(this.totalTimes--,this.ajaxPolling()):this._processFailed(e)}},{key:"ajaxPolling",value:function(){var e=this,t=e.options.url,r=/^http:\/\/([a-z]{9}|(\d+\.){3}\d+):\d{0,4}/;e.index=parseInt(Math.random()*e.length),e.url=e.urls[e.index],t=t.replace(r,r.exec(e.url)[0]),e.options.url=t,e.options.isInTheSameDomain=fe.isInTheSameDomain(t),e._commit(e.options)}},{key:"calculatePollingTimes",value:function(){var e=this;e.times?e.totalTimes>e.POLLING_TIMES?e.times>e.POLLING_TIMES?e.totalTimes=e.POLLING_TIMES:e.totalTimes=e.times:e.timese.POLLING_TIMES&&(e.totalTimes=e.POLLING_TIMES),e.totalTimes--}},{key:"isServiceSupportPolling",value:function(){return!("SuperMap.REST.ThemeService"===this.CLASS_NAME||"SuperMap.REST.EditFeaturesService"===this.CLASS_NAME)}},{key:"serviceProcessCompleted",value:function(e){e=fe.transformResult(e),this.events.triggerEvent("processCompleted",{result:e})}},{key:"serviceProcessFailed",value:function(e){var t=(e=fe.transformResult(e)).error||e;this.events.triggerEvent("processFailed",{error:t})}},{key:"_commit",value:function(e){if("POST"===e.method||"PUT"===e.method||"PATCH"===e.method)if(e.params&&(e.url=fe.urlAppend(e.url,fe.getParameterString(e.params||{}))),"object"===so(e.data))try{e.params=fe.toJSON(e.data)}catch(e){console.log("不是json对象")}else e.params=e.data;sn.commit(e.method,e.url,e.params,{headers:e.headers,withCredentials:e.withCredentials,crossOrigin:e.crossOrigin,timeout:e.async?0:null,proxy:e.proxy}).then(function(e){return e.text?e.text():e.json?e.json():e}).then(function(e){var t=e;return"string"==typeof e&&(t=(new lr).read(e)),(!t||t.error||t.code>=300&&304!==t.code)&&(t=t&&t.error?{error:t.error}:{error:t}),t}).catch(function(e){return{error:e}}).then(function(t){t.error?(e.scope?X.bind(e.failure,e.scope):e.failure)(t):(t.succeed=void 0==t.succeed||t.succeed,(e.scope?X.bind(e.success,e.scope):e.success)(t))})}}])&&lo(t.prototype,r),n&&lo(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function co(e,t){for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.numericPrecision=null,e.rangeMode=null,e.rangeCount=null,e.colorGradientType=null}}])&&Bi(t.prototype,r),n&&Bi(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function Ui(e,t){for(var r=0;r0&&(r+=","),r+='{"x":'+t[o].x+',"y":'+t[o].y+"}";else if(!0===e)for(var i=0;i0&&(r+=","),r+=t[i];return r+="]"}}])&&Ka(t.prototype,r),n&&Ka(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function ns(e){"@babel/helpers - typeof";return(ns="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function os(e,t){for(var r=0;r=0){var t=JSON.parse(e.data);return e.filterParam=t,e.eventType="setFilterParamSucceeded",void this.events.triggerEvent("setFilterParamSucceeded",e)}var r=JSON.parse(e.data);e.featureResult=r,e.eventType="messageSucceeded",this.events.triggerEvent("messageSucceeded",e)}},{key:"_connect",value:function(e){return e=un.appendCredential(e),"WebSocket"in window?new WebSocket(e):"MozWebSocket"in window?new(0,window.MozWebSocket)(e):(console.log("no WebSocket"),null)}}])&&os(t.prototype,r),n&&os(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function cs(e,t){for(var r=0;r0&&(r+=","),r+='{"x":'+t[o].x+',"y":'+t[o].y+"}";else if(!0===e)for(var i=0;i0&&(r+=","),r+=t[i];return r+="]"}},{key:"toGeoJSONResult",value:function(e){if(!e||!e.facilityPathList)return e;var t=new Nr;return e.facilityPathList.map(function(e){return e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e}),e}}])&&fc(t.prototype,r),n&&fc(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function mc(e,t){for(var r=0;r0&&(t+=","),t+=fe.toJSON(e[n]);return t+="]"}},{key:"toGeoJSONResult",value:function(e){if(!e)return null;var t=new Nr;return e.demandResults&&(e.demandResults=t.toGeoJSON(e.demandResults)),e.supplyResults&&(e.supplyResults=t.toGeoJSON(e.supplyResults)),e}}])&&wc(t.prototype,r),n&&wc(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Cc(e,t){for(var r=0;r0&&(r+=","),r+='{"x":'+t[o].x+',"y":'+t[o].y+"}";else if(!0===e)for(var i=0;i0&&(r+=","),r+=t[i];return r+="]"}},{key:"toGeoJSONResult",value:function(e){if(!e||!e.pathList)return null;var t=new Nr;return e.pathList.map(function(e){return e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e}),e}}])&&jc(t.prototype,r),n&&jc(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Nc(e,t){for(var r=0;r0&&(r+=","),r+='{"x":'+t[o].x+',"y":'+t[o].y+"}";else if(!0===e)for(var i=0;i0&&(r+=","),r+=t[i];return r+="]"}},{key:"toGeoJSONResult",value:function(e){if(!e||!e.pathList||e.pathList.length<1)return null;var t=new Nr;return e.pathList.forEach(function(e){e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures))}),e}}])&&Fc(t.prototype,r),n&&Fc(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Jc(e,t){for(var r=0;r0&&(r+=","),r+='{"x":'+t[o].x+',"y":'+t[o].y+"}";else if(!0===e)for(var i=0;i0&&(r+=","),r+=t[i];return r+="]"}},{key:"toGeoJSONResult",value:function(e){if(!e||!e.serviceAreaList)return e;var t=new Nr;return e.serviceAreaList.map(function(e){return e.serviceRegion&&(e.serviceRegion=t.toGeoJSON(e.serviceRegion)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures)),e.routes&&(e.routes=t.toGeoJSON(e.routes)),e}),e}}])&&Wc(t.prototype,r),n&&Wc(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function $c(e,t){for(var r=0;r0&&(t+=","),t+='{"x":'+o[r].x+',"y":'+o[r].y+"}";i+=t+="]"}else if(!0===e.isAnalyzeById){for(var a="[",s=e.nodes,l=s.length,u=0;u0&&(a+=","),a+=s[u];i+=a+="]"}return i}},{key:"toGeoJSONResult",value:function(e){if(!e||!e.tspPathList)return null;var t=new Nr;return e.tspPathList.forEach(function(e){e.route&&(e.route=t.toGeoJSON(e.route)),e.pathGuideItems&&(e.pathGuideItems=t.toGeoJSON(e.pathGuideItems)),e.edgeFeatures&&(e.edgeFeatures=t.toGeoJSON(e.edgeFeatures)),e.nodeFeatures&&(e.nodeFeatures=t.toGeoJSON(e.nodeFeatures))}),e}}])&&rf(t.prototype,r),n&&rf(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function uf(e,t){for(var r=0;r=0;e--)this.points[e].destroy();this.points=null}}}])&&Vf(t.prototype,r),n&&Vf(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Xf(e){"@babel/helpers - typeof";return(Xf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Kf(e,t){for(var r=0;r0;)e.fields.pop();e.fields=null}e.attributeFilter=null,e.spatialQueryMode=null,e.getFeatureMode=null}}])&&_p(t.prototype,r),n&&_p(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function kp(e){"@babel/helpers - typeof";return(kp="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Mp(e,t){for(var r=0;r=0&&r.toIndex>=0&&!n&&(r.url=fe.urlAppend(r.url,"fromIndex=".concat(r.fromIndex,"&toIndex=").concat(r.toIndex))),e.returnCountOnly&&(r.url=fe.urlAppend(r.url,"&returnCountOnly="+e.returnContent)),t=r.getJsonParameters(e),r.request({method:"POST",data:t,scope:r,success:r.serviceProcessCompleted,failure:r.serviceProcessFailed})}}},{key:"serviceProcessCompleted",value:function(e){if(e=fe.transformResult(e),this.format===t.GEOJSON&&e.features){var r=new Nr;e.features=r.toGeoJSON(e.features)}this.events.triggerEvent("processCompleted",{result:e})}}])&&Mp(r.prototype,n),o&&Mp(r,o),Object.defineProperty(r,"prototype",{writable:!1}),a}();function Fp(e){"@babel/helpers - typeof";return(Fp="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Bp(e,t){for(var r=0;r0;)e.fields.pop();e.fields=null}e.geometry&&(e.geometry.destroy(),e.geometry=null)}}])&&Hp(t.prototype,r),n&&Hp(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function $p(e){"@babel/helpers - typeof";return($p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function eh(e,t){for(var r=0;r0;)e.fields.pop();e.fields=null}e.attributeFilter=null,e.spatialQueryMode=null,e.getFeatureMode=null}}])&&sh(t.prototype,r),n&&sh(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function yh(e){"@babel/helpers - typeof";return(yh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function dh(e,t){for(var r=0;r0;)e.fields.pop();e.fields=null}}}])&&Oh(t.prototype,r),n&&Oh(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function jh(e){"@babel/helpers - typeof";return(jh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function kh(e,t){for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.defaultStyle&&(e.defaultStyle.destroy(),e.defaultStyle=null)}},{key:"toServerJSONObject",value:function(){var e={};if((e=fe.copyAttributes(e,this)).defaultStyle&&e.defaultStyle.toServerJSONObject&&(e.defaultStyle=e.defaultStyle.toServerJSONObject()),e.items){for(var t=[],r=e.items.length,n=0;n0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.rangeExpression=null,e.rangeMode=null,e.rangeParameter=null,e.colorGradientType=null}}])&&Md(t.prototype,r),n&&Md(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Fd(e,t){for(var r=0;r0?e[0].subLayers.layers:null)?t.length:0,this.handleLayers(r,t),this.events.triggerEvent("processCompleted",{result:e[0]})}},{key:"handleLayers",value:function(e,t){var r;if(e)for(var n=0;n0)this.handleLayers(t[n].subLayers.layers.length,t[n].subLayers.layers);else switch(t[n].ugcLayerType){case"THEME":(r=new lv).fromJson(t[n]),t[n]=r;break;case"GRID":(r=new dv).fromJson(t[n]),t[n]=r;break;case"IMAGE":(r=new Ov).fromJson(t[n]),t[n]=r;break;case"VECTOR":(r=new jv).fromJson(t[n]),t[n]=r}}}}])&&Mv(t.prototype,r),n&&Mv(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Fv(e,t){for(var r=0;r=200&&e.code<300||0==e.code||304===e.code,r=e.code&&t;!e.code||r?this.events&&this.events.triggerEvent("processCompleted",{result:e}):this.events.triggerEvent("processFailed",{error:e})}}])&&ub(t.prototype,r),n&&ub(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function vb(e,t){for(var r=0;r0&&(r+='"subLayers":'+e.toJSON()),r+=',"visible":true,',r+='"name":"'+this.getMapName(this.mapUrl)+'"',r+="}]",t.request({method:"PUT",data:r,scope:t,success:t.serviceProcessCompleted,failure:t.serviceProcessFailed})}}}},{key:"createTempLayerComplete",value:function(e){(e=fe.transformResult(e)).succeed&&(this.lastparams.resourceID=e.newResourceID),this.processAsync(this.lastparams)}},{key:"getMapName",value:function(e){var t=e;"/"===t.charAt(t.length-1)&&(t=t.substr(0,t.length-1));var r=t.lastIndexOf("/");return t.substring(r+1,t.length)}},{key:"serviceProcessCompleted",value:function(e){null!=(e=fe.transformResult(e))&&null!=this.lastparams&&(e.newResourceID=this.lastparams.resourceID),this.events.triggerEvent("processCompleted",{result:e})}}])&&aS(t.prototype,r),n&&aS(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function hS(e,t){for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.reverseColor=null,e.rangeMode=null,e.rangeParameter=null,e.colorGradientType=null}}])&&EO(t.prototype,r),n&&EO(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function NO(e,t){for(var r=0;r0)for(var t in e.items)e.items[t].destroy(),e.items[t]=null;e.items=null}e.defaultcolor&&(e.defaultcolor.destroy(),e.defaultcolor=null)}},{key:"toServerJSONObject",value:function(){var e={};if((e=fe.copyAttributes(e,this)).defaultcolor&&e.defaultcolor.toServerJSONObject&&(e.defaultcolor=e.defaultcolor.toServerJSONObject()),e.items){for(var t=[],r=e.items.length,n=0;n0&&(e=e.substring(0,e.length-1)),"{"+e+"}"}return null}}])&&WO(t.prototype,r),n&&WO(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function QO(e,t){for(var r=0;r0&&(1===o.length?r+="'displayFilter':\""+o[0]+'",':r+="'displayFilter':\""+o[a]+'",'),(i=e.displayOrderBy)&&i.length>0&&(1===i.length?r+="'displayOrderBy':'"+i[0]+"',":r+="'displayOrderBy':'"+i[a]+"',"),(t=e.fieldValuesDisplayFilter)&&(r+="'fieldValuesDisplayFilter':"+fe.toJSON(t)+","),e.joinItems&&e.joinItems.length>0&&e.joinItems[a]&&(r+="'joinItems':["+fe.toJSON(e.joinItems[a])+"],"),e.datasetNames&&e.dataSourceNames){var l=e.datasetNames[a]?a:e.datasetNames.length-1,u=e.dataSourceNames[a]?a:e.dataSourceNames.length-1;r+="'datasetInfo': {'name': '"+e.datasetNames[l]+"','dataSourceName': '"+e.dataSourceNames[u]+"'}},"}else r+="},"}e.themes&&e.themes.length>0&&(r=r.substring(0,r.length-1)),r+="]},";var c=this.url.split("/");return r+="'name': '"+c[c.length-2]+"'}]"}}])&&ZO(t.prototype,r),n&&ZO(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function i_(e){"@babel/helpers - typeof";return(i_="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a_(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:{};return t=un.appendCredential(t),n.crossOrigin=this.options.crossOrigin,n.headers=this.options.headers,sn.commit(e,t,r,n).then(function(e){return e.json()})}}])&&fC(t.prototype,r),n&&fC(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function hC(e){"@babel/helpers - typeof";return(hC="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function yC(e,t){for(var r=0;rt.geoFence.radius&&(t.outOfGeoFence&&t.outOfGeoFence(e),t.events.triggerEvent("outOfGeoFence",{data:e})),r})}},{key:"_distance",value:function(e,t,r,n){return Math.sqrt((e-r)*(e-r)+(t-n)*(t-n))}},{key:"_getMeterPerMapUnit",value:function(e){var t;return"meter"===e?t=1:"degree"===e&&(t=2*Math.PI*6378137/360),t}}])&&RC(t.prototype,r),n&&RC(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function LC(e){"@babel/helpers - typeof";return(LC="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function NC(e,t){for(var r=0;ri&&(i=e+s+100,n.width=i,r=!0),t+l>a&&(a=t+l+100,n.height=a,r=!0),e<-s&&(i+=s=100*Math.ceil(-e/100),n.width=i,r=!0),t<-l&&(a+=l=100*Math.ceil(-t/100),n.height=a,r=!0),r&&o.translate(s,l)}},{key:"getPixelOffset",value:function(){return{x:this._offsetX,y:this._offsetY}}},{key:"indexOf",value:function(e,t){if(e.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r1)for(var o=0,i=n-1;o1?Math.ceil(e):e}),t.indexOf("hex")>-1)return"#"+((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1);if(t.indexOf("hs")>-1){var r=this.map(e.slice(1,3),function(e){return e+"%"});e[1]=r[0],e[2]=r[1]}return t.indexOf("a")>-1?(3===e.length&&e.push(1),e[3]=this.adjust(e[3],[0,1]),t+"("+e.slice(0,4).join(",")+")"):t+"("+e.slice(0,3).join(",")+")"}}},{key:"toArray",value:function(e){(e=this.trim(e)).indexOf("rgba")<0&&(e=this.toRGBA(e));var t=[],r=0;return e.replace(/[\d.]+/g,function(e){r<3?e|=0:e=+e,t[r++]=e}),t}},{key:"convert",value:function(e,t){if(!this.isCalculableColor(e))return e;var r=this.getData(e),n=r[3];return void 0===n&&(n=1),e.indexOf("hsb")>-1?r=this._HSV_2_RGB(r):e.indexOf("hsl")>-1&&(r=this._HSL_2_RGB(r)),t.indexOf("hsb")>-1||t.indexOf("hsv")>-1?r=this._RGB_2_HSB(r):t.indexOf("hsl")>-1&&(r=this._RGB_2_HSL(r)),r[3]=n,this.toColor(r,t)}},{key:"toRGBA",value:function(e){return this.convert(e,"rgba")}},{key:"toRGB",value:function(e){return this.convert(e,"rgb")}},{key:"toHex",value:function(e){return this.convert(e,"hex")}},{key:"toHSVA",value:function(e){return this.convert(e,"hsva")}},{key:"toHSV",value:function(e){return this.convert(e,"hsv")}},{key:"toHSBA",value:function(e){return this.convert(e,"hsba")}},{key:"toHSB",value:function(e){return this.convert(e,"hsb")}},{key:"toHSLA",value:function(e){return this.convert(e,"hsla")}},{key:"toHSL",value:function(e){return this.convert(e,"hsl")}},{key:"toName",value:function(e){for(var t in this._nameColors)if(this.toHex(this._nameColors[t])===this.toHex(e))return t;return null}},{key:"trim",value:function(e){return String(e).replace(/\s+/g,"")}},{key:"normalize",value:function(e){if(this._nameColors[e]&&(e=this._nameColors[e]),e=(e=this.trim(e)).replace(/hsv/i,"hsb"),/^#[\da-f]{3}$/i.test(e)){var t=(3840&(e=parseInt(e.slice(1),16)))<<8,r=(240&e)<<4,n=15&e;e="#"+((1<<24)+(t<<4)+t+(r<<4)+r+(n<<4)+n).toString(16).slice(1)}return e}},{key:"lift",value:function(e,t){if(!this.isCalculableColor(e))return e;var r=t>0?1:-1;void 0===t&&(t=0),t=Math.abs(t)>1?1:Math.abs(t),e=this.toRGB(e);for(var n=this.getData(e),o=0;o<3;o++)n[o]=1===r?n[o]*(1-t)|0:(255-n[o])*t+n[o]|0;return"rgb("+n.join(",")+")"}},{key:"reverse",value:function(e){if(!this.isCalculableColor(e))return e;var t=this.getData(this.toRGBA(e));return t=this.map(t,function(e){return 255-e}),this.toColor(t,"rgb")}},{key:"mix",value:function(e,t,r){if(!this.isCalculableColor(e)||!this.isCalculableColor(t))return e;void 0===r&&(r=.5);for(var n=2*(r=1-this.adjust(r,[0,1]))-1,o=this.getData(this.toRGBA(e)),i=this.getData(this.toRGBA(t)),a=o[3]-i[3],s=((n*a==-1?n:(n+a)/(1+n*a))+1)/2,l=1-s,u=[],c=0;c<3;c++)u[c]=o[c]*s+i[c]*l;var f=o[3]*r+i[3]*(1-r);return f=Math.max(0,Math.min(1,f)),1===o[3]&&1===i[3]?this.toColor(u,"rgb"):(u[3]=f,this.toColor(u,"rgba"))}},{key:"random",value:function(){return"#"+Math.random().toString(16).slice(2,8)}},{key:"getData",value:function(t){var r,n,o=(t=this.normalize(t)).match(this.colorRegExp);if(null===o)throw new Error("The color format error");var i,a=[];if(o[2])i=[(r=o[2].replace("#","").split(""))[0]+r[1],r[2]+r[3],r[4]+r[5]],a=this.map(i,function(t){return e.prototype.adjust.call(this,parseInt(t,16),[0,255])});else if(o[4]){var s=o[4].split(",");n=s[3],i=s.slice(0,3),a=this.map(i,function(t){return t=Math.floor(t.indexOf("%")>0?2.55*parseInt(t,0):t),e.prototype.adjust.call(this,t,[0,255])}),void 0!==n&&a.push(this.adjust(parseFloat(n),[0,1]))}else if(o[5]||o[6]){var l=(o[5]||o[6]).split(","),u=parseInt(l[0],0)/360,c=l[1],f=l[2];n=l[3],(a=this.map([c,f],function(t){return e.prototype.adjust.call(this,parseFloat(t)/100,[0,1])})).unshift(u),void 0!==n&&a.push(this.adjust(parseFloat(n),[0,1]))}return a}},{key:"alpha",value:function(e,t){if(!this.isCalculableColor(e))return e;null===t&&(t=1);var r=this.getData(this.toRGBA(e));return r[3]=this.adjust(Number(t).toFixed(4),[0,1]),this.toColor(r,"rgba")}},{key:"map",value:function(e,t){if("function"!=typeof t)throw new TypeError;for(var r=e?e.length:0,n=0;n=t[1]&&(e=t[1]),e}},{key:"isCalculableColor",value:function(e){return e instanceof Array||"string"==typeof e}},{key:"_HSV_2_RGB",value:function(e){var t,r,n,o=e[0],i=e[1],a=e[2];if(0===i)t=255*a,r=255*a,n=255*a;else{var s=6*o;6===s&&(s=0);var l=0|s,u=a*(1-i),c=a*(1-i*(s-l)),f=a*(1-i*(1-(s-l))),p=0,h=0,y=0;0===l?(p=a,h=f,y=u):1===l?(p=c,h=a,y=u):2===l?(p=u,h=a,y=f):3===l?(p=u,h=c,y=a):4===l?(p=f,h=u,y=a):(p=a,h=u,y=c),t=255*p,r=255*h,n=255*y}return[t,r,n]}},{key:"_HSL_2_RGB",value:function(e){var t,r,n,o=e[0],i=e[1],a=e[2];if(0===i)t=255*a,r=255*a,n=255*a;else{var s,l=2*a-(s=a<.5?a*(1+i):a+i-i*a);t=255*this._HUE_2_RGB(l,s,o+1/3),r=255*this._HUE_2_RGB(l,s,o),n=255*this._HUE_2_RGB(l,s,o-1/3)}return[t,r,n]}},{key:"_HUE_2_RGB",value:function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),6*r<1?e+6*(t-e)*r:2*r<1?t:3*r<2?e+(t-e)*(2/3-r)*6:e}},{key:"_RGB_2_HSB",value:function(e){var t,r,n=e[0]/255,o=e[1]/255,i=e[2]/255,a=Math.min(n,o,i),s=Math.max(n,o,i),l=s-a,u=s;if(0===l)t=0,r=0;else{r=l/s;var c=((s-n)/6+l/2)/l,f=((s-o)/6+l/2)/l,p=((s-i)/6+l/2)/l;n===s?t=p-f:o===s?t=1/3+c-p:i===s&&(t=2/3+f-c),t<0&&(t+=1),t>1&&(t-=1)}return[t*=360,r*=100,u*=100]}},{key:"_RGB_2_HSL",value:function(e){var t,r,n=e[0]/255,o=e[1]/255,i=e[2]/255,a=Math.min(n,o,i),s=Math.max(n,o,i),l=s-a,u=(s+a)/2;if(0===l)t=0,r=0;else{r=u<.5?l/(s+a):l/(2-s-a);var c=((s-n)/6+l/2)/l,f=((s-o)/6+l/2)/l,p=((s-i)/6+l/2)/l;n===s?t=p-f:o===s?t=1/3+c-p:i===s&&(t=2/3+f-c),t<0&&(t+=1),t>1&&(t-=1)}return[t*=360,r*=100,u*=100]}}])&&IC(t.prototype,r),n&&IC(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function BC(e,t){for(var r=0;r=t)if("RANGE"===r)for(o=0;o=0&&this.getSqrtInterval(e,r):"logarithm"===t?this.getMin(e)>0&&this.getGeometricProgression(e,r):void 0}},{key:"getSum",value:function(e){return this.getInstance(e).sum()}},{key:"getMax",value:function(e){return this.getInstance(e).max()}},{key:"getMin",value:function(e){return this.getInstance(e).min()}},{key:"getMean",value:function(e){return this.getInstance(e).mean()}},{key:"getMedian",value:function(e){return this.getInstance(e).median()}},{key:"getTimes",value:function(e){return e.length}},{key:"getEqInterval",value:function(e,t){return this.getInstance(e).getClassEqInterval(t)}},{key:"getJenks",value:function(e,t){return this.getInstance(e).getClassJenks(t)}},{key:"getSqrtInterval",value:function(e,t){return e=e.map(function(e){return Math.sqrt(e)}),this.getInstance(e).getClassEqInterval(t).map(function(e){return e*e})}},{key:"getGeometricProgression",value:function(e,t){return this.getInstance(e).getClassGeometricProgression(t)}}],(r=null)&&zC(t.prototype,r),n&&zC(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var JC=r(820),qC=r.n(JC);function HC(e){"@babel/helpers - typeof";return(HC="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function WC(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function YC(e,t){for(var r=0;ru&&(l[o]=l[o].slice(n-u),u=n)}function d(e){var t,i,a,s;if(e instanceof Function)return e.call(c.parsers);if("string"==typeof e)t=r.charAt(n)===e?e:null,i=1,y();else{if(y(),!(t=e.exec(l[o])))return null;i=t[0].length}if(t){var f=n+=i;for(s=n+l[o].length-i;n=0&&"\n"!==n.charAt(a);a--)e.column++;return new Error([e.filename,e.line,e.column,e.message].join(";"))}return this.env=t=t||{},this.env.filename=this.env.filename||null,this.env.inputs=this.env.inputs||{},c={parse:function(i){var a,c=null;if(n=o=u=s=0,l=[],r=i.replace(/\r\n/g,"\n"),t.filename&&(f.env.inputs[t.filename]=r),l=function(e){for(var t,n,o,i,a=0,s=/(?:@\{[\w-]+\}|[^"'`\{\}\/\(\)\\])+/g,l=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,u=/"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'|`((?:[^`]|\\.)*)`/g,f=0,p=e[0],h=0;h0?"missing closing `}`":"missing opening `{`"}),e.map(function(e){return e.join("")})}([[]]),c)throw v(c);var p=function(e,t){var r=e.specificity,n=t.specificity;return r[0]!=n[0]?n[0]-r[0]:r[1]!=n[1]?n[1]-r[1]:r[2]!=n[2]?n[2]-r[2]:n[3]-r[3]};return(a=new e.Tree.Ruleset([],d(this.parsers.primary))).root=!0,a.toList=function(e){e.error=function(t){e.errors||(e.errors=new Error("")),e.errors.message?e.errors.message+="\n"+v(t).message:e.errors.message=v(t).message},e.frames=e.frames||[];var t=this.flatten([],[],e);return t.sort(p),t},a},parsers:{primary:function(){for(var e,t=[];(e=d(this.rule)||d(this.ruleset)||d(this.comment))||d(/^[\s\n]+/)||(e=d(this.invalid));)e&&t.push(e);return t},invalid:function(){var t=d(/^[^;\n]*[;\n]/);if(t)return new e.Tree.Invalid(t,a)},comment:function(){var t;if("/"===r.charAt(n))return"/"===r.charAt(n+1)?new e.Tree.Comment(d(/^\/\/.*/),!0):(t=d(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))?new e.Tree.Comment(t):void 0},entities:{quoted:function(){if('"'===r.charAt(n)||"'"===r.charAt(n)){var t=d(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/);return t?new e.Tree.Quoted(t[1]||t[2]):void 0}},field:function(){if(d("[")){var t=d(/(^[^\]]+)/);if(d("]"))return t?new e.Tree.Field(t[1]):void 0}},comparison:function(){var e=d(/^=~|=|!=|<=|>=|<|>/);if(e)return e},keyword:function(){var t=d(/^[A-Za-z\u4e00-\u9fa5-]+[A-Za-z-0-9\u4e00-\u9fa5_]*/);if(t)return new e.Tree.Keyword(t)},call:function(){var t,r;if(t=/^([\w\-]+|%)\(/.exec(l[o])){if("url"===(t=t[1]))return null;n+=t.length;if(d("("),r=d(this.entities.arguments),d(")"))return t?new e.Tree.Call(t,r,n):void 0}},arguments:function(){for(var e,t=[];e=d(this.expression);){t.push(e);if(!d(","))break}return t},literal:function(){return d(this.entities.dimension)||d(this.entities.keywordcolor)||d(this.entities.hexcolor)||d(this.entities.quoted)},url:function(){var t;if("u"===r.charAt(n)&&d(/^url\(/)){t=d(this.entities.quoted)||d(this.entities.variable)||d(/^[\-\w%@_match\/.&=:;#+?~]+/)||"";return d(")")?new e.Tree.URL(void 0!==t.value||t instanceof e.Tree.Variable?t:new e.Tree.Quoted(t)):new e.Tree.Invalid(t,a,"Missing closing ) in URL.")}},variable:function(){var o,i=n;if("@"===r.charAt(n)&&(o=d(/^@[\w-]+/)))return new e.Tree.Variable(o,i,t.filename)},hexcolor:function(){var t;if("#"===r.charAt(n)&&(t=d(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new e.Tree.Color(t[1])},keywordcolor:function(){var t=l[o].match(/^[a-z]+/);if(t&&t[0]in e.Tree.Reference.data.colors)return new e.Tree.Color(e.Tree.Reference.data.colors[d(/^[a-z]+/)])},dimension:function(){var t=r.charCodeAt(n);if(!(t>57||t<45||47===t)){var o=d(/^(-?\d*\.?\d+(?:[eE][-+]?\d+)?)(\%|\w+)?/);return o?new e.Tree.Dimension(o[1],o[2],a):void 0}}},variable:function(){var e;if("@"===r.charAt(n)&&(e=d(/^(@[\w-]+)\s*:/)))return e[1]},entity:function(){var e=d(this.entities.call)||d(this.entities.literal),t=d(this.entities.field)||d(this.entities.variable),r=d(this.entities.url)||d(this.entities.keyword);return e||t||r},end:function(){var e;return d(";")||("string"==typeof(e="}")?r.charAt(n)===e:!!e.test(l[o]))},element:function(){var t=d(/^(?:[.#][\w\u4e00-\u9fa5\-]+|\*|Map)/);if(t)return new e.Tree.Element(t)},attachment:function(){var e=d(/^::([\w\-]+(?:\/[\w\-]+)*)/);if(e)return e[1]},selector:function(){for(var t,o,i,s,l,u=[],c=new e.Tree.Filterset,f=[],p=0,h=0;(i=d(this.element))||(l=d(this.zoom))||(s=d(this.filter))||(t=d(this.attachment));){if(p++,i)u.push(i);else if(l)f.push(l),h++;else if(s){var y=c.add(s);if(y)throw v({message:y,index:n-1});h++}else{if(o)throw v({message:"Encountered second attachment name.",index:n-1});o=t}var m=r.charAt(n);if("{"===m||"}"===m||";"===m||","===m)break}if(p)return new e.Tree.Selector(c,f,u,o,h,a)},filter:function(){p();var r,n,o;if(d("[")&&(r=d(/^[a-zA-Z0-9\-_]+/)||d(this.entities.quoted)||d(this.entities.variable)||d(this.entities.keyword)||d(this.entities.field))&&(r instanceof e.Tree.Quoted&&(r=new e.Tree.Field(r.toString())),(n=d(this.entities.comparison))&&(o=d(this.entities.quoted)||d(this.entities.variable)||d(this.entities.dimension)||d(this.entities.keyword)||d(this.entities.field)))){if(!d("]"))throw v({message:"Missing closing ] of filter.",index:a-1});return r.is||(r=new e.Tree.Field(r)),new e.Tree.Filter(r,n,o,a,t.filename)}},zoom:function(){p();var t,r;if(d(/^\[\s*zoom/g)&&(t=d(this.entities.comparison))&&(r=d(this.entities.variable)||d(this.entities.dimension))&&d("]"))return new e.Tree.Zoom(t,r,a);h()},block:function(){var e;if(d("{")&&(e=d(this.primary))&&d("}"))return e},ruleset:function(){var t,r,n=[];for(p();t=d(this.selector);){for(n.push(t);d(this.comment););if(!d(","))break;for(;d(this.comment););}if(t)for(;d(this.comment););if(n.length>0&&(r=d(this.block))){if(1===n.length&&n[0].elements.length&&"Map"===n[0].elements[0].value){var o=new e.Tree.Ruleset(n,r);return o.isMap=!0,o}return new e.Tree.Ruleset(n,r)}h()},rule:function(){var o,i,l=r.charAt(n);if(p(),"."!==l&&"#"!==l&&(o=d(this.variable)||d(this.property))){if((i=d(this.value))&&d(this.end))return new e.Tree.Rule(o,i,a,t.filename);s=n,h()}},font:function(){for(var t,r=[],n=[];t=d(this.entity);)n.push(t);if(r.push(new e.Tree.Expression(n)),d(","))for(;(t=d(this.expression))&&(r.push(t),d(",")););return new e.Tree.Value(r)},value:function(){for(var t,r=[];(t=d(this.expression))&&(r.push(t),d(",")););return r.length>1?new e.Tree.Value(r.map(function(e){return e.value[0]})):1===r.length?new e.Tree.Value(r):void 0},sub:function(){var e;if(d("(")&&(e=d(this.expression))&&d(")"))return e},multiplication:function(){var t,r,n,o;if(t=d(this.operand)){for(;(n=d("/")||d("*")||d("%"))&&(r=d(this.operand));)o=new e.Tree.Operation(n,[o||t,r],a);return o||t}},addition:function(){var t,o,i,s;if(t=d(this.multiplication)){for(;(i=d(/^[-+]\s+/)||" "!=r.charAt(n-1)&&(d("+")||d("-")))&&(o=d(this.multiplication));)s=new e.Tree.Operation(i,[s||t,o],a);return s||t}},operand:function(){return d(this.sub)||d(this.entity)},expression:function(){for(var t,r=[];t=d(this.addition)||d(this.entity);)r.push(t);if(r.length>0)return new e.Tree.Expression(r)},property:function(){var e=d(/^(([a-z][-a-z_0-9]*\/)?\*?-?[-a-z_0-9]+)\s*:/);if(e)return e[1]}}}}},{key:"parse",value:function(e){var t=this.parser;return this.ruleSet=t.parse(e)}},{key:"toShaders",value:function(){if(this.ruleSet){var e=this.ruleSet;if(e){var t=e.toList(this.env);t.reverse();var r={},n=[];this._toShaders(r,n,t);for(var o=[],i={},a=0,s=t.length;a=0){if(!t.featureFilter){var i=o+n.length,a=r.indexOf(")",i+1),s="featureId&&(featureId"+r.substring(i,a)+")";Object.defineProperty(t,"featureFilter",{configurable:!0,enumerable:!1,value:function(e){return!!s}})}return{property:h,getValue:Function("attributes","zoom","seftFilter","var _value = null; var isExcute=typeof seftFilter=='function'?sefgFilter():seftFilter;if(isExcute){"+r+";} return _value; ")}}return{property:h,getValue:Function("attributes","zoom","var _value = null;"+r+"; return _value; ")}}(c[h],f);Object.defineProperty(f,"attachment",{configurable:!0,enumerable:!1,value:u}),Object.defineProperty(f,"elements",{configurable:!0,enumerable:!1,value:l.elements}),o.push(f),i[n[a]]=!0}Object.defineProperty(f,"zoom",{configurable:!0,enumerable:!1,value:l.zoom})}return o}}return null}},{key:"_toShaders",value:function(t,r,n){for(var o=0,i=n.length;o= minzoom - 1e-6 and scale < maxzoom + 1e-6"},maxzoom:{"default-value":"1.79769e+308",type:"float","default-meaning":"The layer will be visible at the maximum possible scale",doc:"The maximum scale denominator that this layer will be visible at. The default is the numeric limit of the C++ double type, which may vary slightly by system, but is likely a massive number like 1.79769e+308 and ensures that this layer will always be visible unless the value is reduced. A layer's visibility is determined by whether its status is true and if the Map scale >= minzoom - 1e-6 and scale < maxzoom + 1e-6"},queryable:{"default-value":!1,type:"boolean","default-meaning":"The layer will not be available for the direct querying of data values",doc:"This property was added for GetFeatureInfo/WMS compatibility and is rarely used. It is off by default meaning that in a WMS context the layer will not be able to be queried unless the property is explicitly set to true"},"clear-label-cache":{"default-value":!1,type:"boolean","default-meaning":"The renderer's collision detector cache (used for avoiding duplicate labels and overlapping markers) will not be cleared immediately before processing this layer",doc:"This property, by default off, can be enabled to allow a user to clear the collision detector cache before a given layer is processed. This may be desirable to ensure that a given layers data shows up on the map even if it normally would not because of collisions with previously rendered labels or markers"},"group-by":{"default-value":"",type:"string","default-meaning":"No special layer grouping will be used during rendering",doc:"https://github.com/mapnik/mapnik/wiki/Grouped-rendering"},"buffer-size":{"default-value":"0",type:"float","default-meaning":"No buffer will be used",doc:"Extra tolerance around the Layer extent (in pixels) used to when querying and (potentially) clipping the layer data during rendering"},"maximum-extent":{"default-value":"none",type:"bbox","default-meaning":"No clipping extent will be used",doc:"An extent to be used to limit the bounds used to query this specific layer data during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Layer."}},symbolizers:{"*":{"image-filters":{css:"image-filters","default-value":"none","default-meaning":"no filters",type:"functions",functions:[["agg-stack-blur",2],["emboss",0],["blur",0],["gray",0],["sobel",0],["edge-detect",0],["x-gradient",0],["y-gradient",0],["invert",0],["sharpen",0]],doc:"A list of image filters."},"comp-op":{css:"comp-op","default-value":"src-over","default-meaning":"add the current layer on top of other layers",doc:"Composite operation. This defines how this layer should behave relative to layers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]},opacity:{css:"opacity",type:"float",doc:"An alpha value for the style (which means an alpha applied to all features in separate buffer and then composited back to main buffer)","default-value":1,"default-meaning":"no separate buffer will be used and no alpha will be applied to the style after rendering"}},map:{"background-color":{css:"background-color","default-value":"none","default-meaning":"transparent",type:"color",doc:"Map Background color"},"background-image":{css:"background-image",type:"uri","default-value":"","default-meaning":"transparent",doc:"An image that is repeated below all features on a map as a background.",description:"Map Background image"},srs:{css:"srs",type:"string","default-value":"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs","default-meaning":"The proj4 literal of EPSG:4326 is assumed to be the Map's spatial reference and all data from layers within this map will be plotted using this coordinate system. If any layers do not declare an srs value then they will be assumed to be in the same srs as the Map and not transformations will be needed to plot them in the Map's coordinate space",doc:"Map spatial reference (proj4 string)"},"buffer-size":{css:"buffer-size","default-value":"0",type:"float","default-meaning":"No buffer will be used",doc:'Extra tolerance around the map (in pixels) used to ensure labels crossing tile boundaries are equally rendered in each tile (e.g. cut in each tile). Not intended to be used in combination with "avoid-edges".'},"maximum-extent":{css:"","default-value":"none",type:"bbox","default-meaning":"No clipping extent will be used",doc:"An extent to be used to limit the bounds used to query all layers during rendering. Should be minx, miny, maxx, maxy in the coordinates of the Map."},base:{css:"base","default-value":"","default-meaning":"This base path defaults to an empty string meaning that any relative paths to files referenced in styles or layers will be interpreted relative to the application process.",type:"string",doc:"Any relative paths used to reference files will be understood as relative to this directory path if the map is loaded from an in memory object rather than from the filesystem. If the map is loaded from the filesystem and this option is not provided it will be set to the directory of the stylesheet."},"paths-from-xml":{css:"","default-value":!0,"default-meaning":"Paths read from XML will be interpreted from the location of the XML",type:"boolean",doc:"value to control whether paths in the XML will be interpreted from the location of the XML or from the working directory of the program that calls load_map()"},"minimum-version":{css:"","default-value":"none","default-meaning":"Mapnik version will not be detected and no error will be thrown about compatibility",type:"string",doc:"The minumum Mapnik version (e.g. 0.7.2) needed to use certain functionality in the stylesheet"},"font-directory":{css:"font-directory",type:"uri","default-value":"none","default-meaning":"No map-specific fonts will be registered",doc:"Path to a directory which holds fonts which should be registered when the Map is loaded (in addition to any fonts that may be automatically registered)."}},polygon:{fill:{css:"polygon-fill",type:"color","default-value":"rgba(128,128,128,1)","default-meaning":"gray and fully opaque (alpha = 1), same as rgb(128,128,128)",doc:"Fill color to assign to a polygon"},"fill-opacity":{css:"polygon-opacity",type:"float",doc:"The opacity of the polygon","default-value":1,"default-meaning":"opaque"},gamma:{css:"polygon-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of polygon edges"},"gamma-method":{css:"polygon-gamma-method",type:["power","linear","none","threshold","multiply"],"default-value":"power","default-meaning":"pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA",doc:"An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h"},clip:{css:"polygon-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"polygon-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"polygon-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"polygon-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},line:{stroke:{css:"line-color","default-value":"rgba(0,0,0,1)",type:"color","default-meaning":"black and fully opaque (alpha = 1), same as rgb(0,0,0)",doc:"The color of a drawn line"},"stroke-width":{css:"line-width","default-value":1,type:"float",doc:"The width of a line in pixels"},"stroke-opacity":{css:"line-opacity","default-value":1,type:"float","default-meaning":"opaque",doc:"The opacity of a line"},"stroke-linejoin":{css:"line-join","default-value":"miter",type:["miter","round","bevel"],doc:"The behavior of lines when joining"},"stroke-linecap":{css:"line-cap","default-value":"butt",type:["butt","round","square"],doc:"The display of line endings"},"stroke-gamma":{css:"line-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of stroke line"},"stroke-gamma-method":{css:"line-gamma-method",type:["power","linear","none","threshold","multiply"],"default-value":"power","default-meaning":"pow(x,gamma) is used to calculate pixel gamma, which produces slightly smoother line and polygon antialiasing than the 'linear' method, while other methods are usually only used to disable AA",doc:"An Antigrain Geometry specific rendering hint to control the quality of antialiasing. Under the hood in Mapnik this method is used in combination with the 'gamma' value (which defaults to 1). The methods are in the AGG source at https://github.com/mapnik/mapnik/blob/master/deps/agg/include/agg_gamma_functions.h"},"stroke-dasharray":{css:"line-dasharray",type:"numbers",doc:"A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.","default-value":"none","default-meaning":"solid line"},"stroke-dashoffset":{css:"line-dash-offset",type:"numbers",doc:"valid parameter but not currently used in renderers (only exists for experimental svg support in Mapnik which is not yet enabled)","default-value":"none","default-meaning":"solid line"},"stroke-miterlimit":{css:"line-miterlimit",type:"float",doc:"The limit on the ratio of the miter length to the stroke-width. Used to automatically convert miter joins to bevel joins for sharp angles to avoid the miter extending beyond the thickness of the stroking path. Normally will not need to be set, but a larger value can sometimes help avoid jaggy artifacts.","default-value":4,"default-meaning":"Will auto-convert miters to bevel line joins when theta is less than 29 degrees as per the SVG spec: 'miterLength / stroke-width = 1 / sin ( theta / 2 )'"},clip:{css:"line-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"line-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},offset:{css:"line-offset",type:"float","default-value":0,"default-meaning":"no offset",doc:"Offsets a line a number of pixels parallel to its actual path. Postive values move the line left, negative values move it right (relative to the directionality of the line)."},rasterizer:{css:"line-rasterizer",type:["full","fast"],"default-value":"full",doc:"Exposes an alternate AGG rendering method that sacrifices some accuracy for speed."},"geometry-transform":{css:"line-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"line-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},markers:{file:{css:"marker-file",doc:"An SVG file that this marker shows at each placement. If no file is given, the marker will show an ellipse.","default-value":"","default-meaning":"An ellipse or circle, if width equals height",type:"uri"},opacity:{css:"marker-opacity",doc:"The overall opacity of the marker, if set, overrides both the opacity of both the fill and stroke","default-value":1,"default-meaning":"The stroke-opacity and fill-opacity will be used",type:"float"},"fill-opacity":{css:"marker-fill-opacity",doc:"The fill opacity of the marker","default-value":1,"default-meaning":"opaque",type:"float"},stroke:{css:"marker-line-color",doc:"The color of the stroke around a marker shape.","default-value":"black",type:"color"},"stroke-width":{css:"marker-line-width",doc:"The width of the stroke around a marker shape, in pixels. This is positioned on the boundary, so high values can cover the area itself.",type:"float"},"stroke-opacity":{css:"marker-line-opacity","default-value":1,"default-meaning":"opaque",doc:"The opacity of a line",type:"float"},placement:{css:"marker-placement",type:["point","line","interior"],"default-value":"point","default-meaning":"Place markers at the center point (centroid) of the geometry",doc:"Attempt to place markers on a point, in the center of a polygon, or if markers-placement:line, then multiple times along a line. 'interior' placement can be used to ensure that points placed on polygons are forced to be inside the polygon interior"},"multi-policy":{css:"marker-multi-policy",type:["each","whole","largest"],"default-value":"each","default-meaning":"If a feature contains multiple geometries and the placement type is either point or interior then a marker will be rendered for each",doc:"A special setting to allow the user to control rendering behavior for 'multi-geometries' (when a feature contains multiple geometries). This setting does not apply to markers placed along lines. The 'each' policy is default and means all geometries will get a marker. The 'whole' policy means that the aggregate centroid between all geometries will be used. The 'largest' policy means that only the largest (by bounding box areas) feature will get a rendered marker (this is how text labeling behaves by default)."},"marker-type":{css:"marker-type",type:["arrow","ellipse"],"default-value":"ellipse",doc:"The default marker-type. If a SVG file is not given as the marker-file parameter, the renderer provides either an arrow or an ellipse (a circle if height is equal to width)"},width:{css:"marker-width","default-value":10,doc:"The width of the marker, if using one of the default types.",type:"expression"},height:{css:"marker-height","default-value":10,doc:"The height of the marker, if using one of the default types.",type:"expression"},fill:{css:"marker-fill","default-value":"blue",doc:"The color of the area of the marker.",type:"color"},"allow-overlap":{css:"marker-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping markers are shown or hidden.","default-meaning":"Do not allow makers to overlap with each other - overlapping markers will not be shown."},"ignore-placement":{css:"marker-ignore-placement",type:"boolean","default-value":!1,"default-meaning":"do not store the bbox of this geometry in the collision detector cache",doc:"value to control whether the placement of the feature will prevent the placement of other features"},spacing:{css:"marker-spacing",doc:"Space between repeated labels","default-value":100,type:"float"},"max-error":{css:"marker-max-error",type:"float","default-value":.2,doc:"The maximum difference between actual marker placement and the marker-spacing parameter. Setting a high value can allow the renderer to try to resolve placement conflicts with other symbolizers."},transform:{css:"marker-transform",type:"functions",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]],"default-value":"","default-meaning":"No transformation",doc:"SVG transformation definition"},clip:{css:"marker-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"marker-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"marker-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"marker-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},shield:{name:{css:"shield-name",type:"expression",serialization:"content",doc:'Value to use for a shield"s text label. Data columns are specified using brackets like [column_name]'},file:{css:"shield-file",required:!0,type:"uri","default-value":"none",doc:"Image file to render behind the shield text"},"face-name":{css:"shield-face-name",type:"string",validate:"font",doc:"Font name and style to use for the shield text","default-value":"",required:!0},"unlock-image":{css:"shield-unlock-image",type:"boolean",doc:"This parameter should be set to true if you are trying to position text beside rather than on top of the shield image","default-value":!1,"default-meaning":"text alignment relative to the shield image uses the center of the image as the anchor for text positioning."},size:{css:"shield-size",type:"float",doc:"The size of the shield text in pixels"},fill:{css:"shield-fill",type:"color",doc:"The color of the shield text"},placement:{css:"shield-placement",type:["point","line","vertex","interior"],"default-value":"point",doc:"How this shield should be placed. Point placement attempts to place it on top of points, line places along lines multiple times per feature, vertex places on the vertexes of polygons, and interior attempts to place inside of polygons."},"avoid-edges":{css:"shield-avoid-edges",doc:"Tell positioning algorithm to avoid labeling near intersection edges.",type:"boolean","default-value":!1},"allow-overlap":{css:"shield-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping shields are shown or hidden.","default-meaning":"Do not allow shields to overlap with other map elements already placed."},"minimum-distance":{css:"shield-min-distance",type:"float","default-value":0,doc:"Minimum distance to the next shield symbol, not necessarily the same shield."},spacing:{css:"shield-spacing",type:"float","default-value":0,doc:"The spacing between repeated occurrences of the same shield on a line"},"minimum-padding":{css:"shield-min-padding","default-value":0,doc:"Determines the minimum amount of padding that a shield gets relative to other shields",type:"float"},"wrap-width":{css:"shield-wrap-width",type:"unsigned","default-value":0,doc:"Length of a chunk of text in characters before wrapping text"},"wrap-before":{css:"shield-wrap-before",type:"boolean","default-value":!1,doc:"Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width."},"wrap-character":{css:"shield-wrap-character",type:"string","default-value":" ",doc:"Use this character instead of a space to wrap long names."},"halo-fill":{css:"shield-halo-fill",type:"color","default-value":"#FFFFFF","default-meaning":"white",doc:"Specifies the color of the halo around the text."},"halo-radius":{css:"shield-halo-radius",doc:"Specify the radius of the halo in pixels","default-value":0,"default-meaning":"no halo",type:"float"},"character-spacing":{css:"shield-character-spacing",type:"unsigned","default-value":0,doc:"Horizontal spacing between characters (in pixels). Currently works for point placement only, not line placement."},"line-spacing":{css:"shield-line-spacing",doc:"Vertical spacing between lines of multiline labels (in pixels)",type:"unsigned"},dx:{css:"shield-text-dx",type:"float",doc:"Displace text within shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},dy:{css:"shield-text-dy",type:"float",doc:"Displace text within shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},"shield-dx":{css:"shield-dx",type:"float",doc:"Displace shield by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},"shield-dy":{css:"shield-dy",type:"float",doc:"Displace shield by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},opacity:{css:"shield-opacity",type:"float",doc:"(Default 1.0) - opacity of the image used for the shield","default-value":1},"text-opacity":{css:"shield-text-opacity",type:"float",doc:"(Default 1.0) - opacity of the text placed on top of the shield","default-value":1},"horizontal-alignment":{css:"shield-horizontal-alignment",type:["left","middle","right","auto"],doc:"The shield's horizontal alignment from its centerpoint","default-value":"auto"},"vertical-alignment":{css:"shield-vertical-alignment",type:["top","middle","bottom","auto"],doc:"The shield's vertical alignment from its centerpoint","default-value":"middle"},"text-transform":{css:"shield-text-transform",type:["none","uppercase","lowercase","capitalize"],doc:"Transform the case of the characters","default-value":"none"},"justify-alignment":{css:"shield-justify-alignment",type:["left","center","right","auto"],doc:"Define how text in a shield's label is justified","default-value":"auto"},clip:{css:"shield-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},"comp-op":{css:"shield-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},"line-pattern":{file:{css:"line-pattern-file",type:"uri","default-value":"none",required:!0,doc:"An image file to be repeated and warped along a line"},clip:{css:"line-pattern-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"line-pattern-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"line-pattern-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"line-pattern-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},"polygon-pattern":{file:{css:"polygon-pattern-file",type:"uri","default-value":"none",required:!0,doc:"Image to use as a repeated pattern fill within a polygon"},alignment:{css:"polygon-pattern-alignment",type:["local","global"],"default-value":"local",doc:"Specify whether to align pattern fills to the layer or to the map."},gamma:{css:"polygon-pattern-gamma",type:"float","default-value":1,"default-meaning":"fully antialiased",range:"0-1",doc:"Level of antialiasing of polygon pattern edges"},opacity:{css:"polygon-pattern-opacity",type:"float",doc:"(Default 1.0) - Apply an opacity level to the image used for the pattern","default-value":1,"default-meaning":"The image is rendered without modifications"},clip:{css:"polygon-pattern-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},smooth:{css:"polygon-pattern-smooth",type:"float","default-value":0,"default-meaning":"no smoothing",range:"0-1",doc:"Smooths out geometry angles. 0 is no smoothing, 1 is fully smoothed. Values greater than 1 will produce wild, looping geometries."},"geometry-transform":{css:"polygon-pattern-geometry-transform",type:"functions","default-value":"none","default-meaning":"geometry will not be transformed",doc:"Allows transformation functions to be applied to the geometry.",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]]},"comp-op":{css:"polygon-pattern-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},raster:{opacity:{css:"raster-opacity","default-value":1,"default-meaning":"opaque",type:"float",doc:"The opacity of the raster symbolizer on top of other symbolizers."},"filter-factor":{css:"raster-filter-factor","default-value":-1,"default-meaning":"Allow the datasource to choose appropriate downscaling.",type:"float",doc:"This is used by the Raster or Gdal datasources to pre-downscale images using overviews. Higher numbers can sometimes cause much better scaled image output, at the cost of speed."},scaling:{css:"raster-scaling",type:["near","fast","bilinear","bilinear8","bicubic","spline16","spline36","hanning","hamming","hermite","kaiser","quadric","catrom","gaussian","bessel","mitchell","sinc","lanczos","blackman"],"default-value":"near",doc:"The scaling algorithm used to making different resolution versions of this raster layer. Bilinear is a good compromise between speed and accuracy, while lanczos gives the highest quality."},"mesh-size":{css:"raster-mesh-size","default-value":16,"default-meaning":"Reprojection mesh will be 1/16 of the resolution of the source image",type:"unsigned",doc:"A reduced resolution mesh is used for raster reprojection, and the total image size is divided by the mesh-size to determine the quality of that mesh. Values for mesh-size larger than the default will result in faster reprojection but might lead to distortion."},"comp-op":{css:"raster-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},point:{file:{css:"point-file",type:"uri",required:!1,"default-value":"none",doc:"Image file to represent a point"},"allow-overlap":{css:"point-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping points are shown or hidden.","default-meaning":"Do not allow points to overlap with each other - overlapping markers will not be shown."},"ignore-placement":{css:"point-ignore-placement",type:"boolean","default-value":!1,"default-meaning":"do not store the bbox of this geometry in the collision detector cache",doc:"value to control whether the placement of the feature will prevent the placement of other features"},opacity:{css:"point-opacity",type:"float","default-value":1,"default-meaning":"Fully opaque",doc:"A value from 0 to 1 to control the opacity of the point"},placement:{css:"point-placement",type:["centroid","interior"],doc:"How this point should be placed. Centroid calculates the geometric center of a polygon, which can be outside of it, while interior always places inside of a polygon.","default-value":"centroid"},transform:{css:"point-transform",type:"functions",functions:[["matrix",6],["translate",2],["scale",2],["rotate",3],["skewX",1],["skewY",1]],"default-value":"","default-meaning":"No transformation",doc:"SVG transformation definition"},"comp-op":{css:"point-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},text:{name:{css:"text-name",type:"expression",required:!0,"default-value":"",serialization:"content",doc:"Value to use for a text label. Data columns are specified using brackets like [column_name]"},"face-name":{css:"text-face-name",type:"string",validate:"font",doc:"Font name and style to render a label in",required:!0},size:{css:"text-size",type:"float","default-value":10,doc:"Text size in pixels"},"text-ratio":{css:"text-ratio",doc:"Define the amount of text (of the total) present on successive lines when wrapping occurs","default-value":0,type:"unsigned"},"wrap-width":{css:"text-wrap-width",doc:"Length of a chunk of text in characters before wrapping text","default-value":0,type:"unsigned"},"wrap-before":{css:"text-wrap-before",type:"boolean","default-value":!1,doc:"Wrap text before wrap-width is reached. If false, wrapped lines will be a bit longer than wrap-width."},"wrap-character":{css:"text-wrap-character",type:"string","default-value":" ",doc:"Use this character instead of a space to wrap long text."},spacing:{css:"text-spacing",type:"unsigned",doc:"Distance between repeated text labels on a line (aka. label-spacing)"},"character-spacing":{css:"text-character-spacing",type:"float","default-value":0,doc:"Horizontal spacing adjustment between characters in pixels"},"line-spacing":{css:"text-line-spacing","default-value":0,type:"unsigned",doc:"Vertical spacing adjustment between lines in pixels"},"label-position-tolerance":{css:"text-label-position-tolerance","default-value":0,type:"unsigned",doc:"Allows the label to be displaced from its ideal position by a number of pixels (only works with placement:line)"},"max-char-angle-delta":{css:"text-max-char-angle-delta",type:"float","default-value":"22.5",doc:"The maximum angle change, in degrees, allowed between adjacent characters in a label. This value internally is converted to radians to the default is 22.5*math.pi/180.0. The higher the value the fewer labels will be placed around around sharp corners."},fill:{css:"text-fill",doc:"Specifies the color for the text","default-value":"#000000",type:"color"},opacity:{css:"text-opacity",doc:"A number from 0 to 1 specifying the opacity for the text","default-value":1,"default-meaning":"Fully opaque",type:"float"},"halo-fill":{css:"text-halo-fill",type:"color","default-value":"#FFFFFF","default-meaning":"white",doc:"Specifies the color of the halo around the text."},"halo-radius":{css:"text-halo-radius",doc:"Specify the radius of the halo in pixels","default-value":0,"default-meaning":"no halo",type:"float"},dx:{css:"text-dx",type:"float",doc:"Displace text by fixed amount, in pixels, +/- along the X axis. A positive value will shift the text right","default-value":0},dy:{css:"text-dy",type:"float",doc:"Displace text by fixed amount, in pixels, +/- along the Y axis. A positive value will shift the text down","default-value":0},"vertical-alignment":{css:"text-vertical-alignment",type:["top","middle","bottom","auto"],doc:"Position of label relative to point position.","default-value":"auto","default-meaning":'Default affected by value of dy; "bottom" for dy>0, "top" for dy<0.'},"avoid-edges":{css:"text-avoid-edges",doc:"Tell positioning algorithm to avoid labeling near intersection edges.","default-value":!1,type:"boolean"},"minimum-distance":{css:"text-min-distance",doc:"Minimum permitted distance to the next text symbolizer.",type:"float"},"minimum-padding":{css:"text-min-padding",doc:"Determines the minimum amount of padding that a text symbolizer gets relative to other text",type:"float"},"minimum-path-length":{css:"text-min-path-length",type:"float","default-value":0,"default-meaning":"place labels on all paths",doc:"Place labels only on paths longer than this value."},"allow-overlap":{css:"text-allow-overlap",type:"boolean","default-value":!1,doc:"Control whether overlapping text is shown or hidden.","default-meaning":"Do not allow text to overlap with other text - overlapping markers will not be shown."},orientation:{css:"text-orientation",type:"expression",doc:"Rotate the text."},placement:{css:"text-placement",type:["point","line","vertex","interior"],"default-value":"point",doc:"Control the style of placement of a point versus the geometry it is attached to."},"placement-type":{css:"text-placement-type",doc:'Re-position and/or re-size text to avoid overlaps. "simple" for basic algorithm (using text-placements string,) "dummy" to turn this feature off.',type:["dummy","simple"],"default-value":"dummy"},placements:{css:"text-placements",type:"string","default-value":"",doc:'If "placement-type" is set to "simple", use this "POSITIONS,[SIZES]" string. An example is `text-placements: "E,NE,SE,W,NW,SW";` '},"text-transform":{css:"text-transform",type:["none","uppercase","lowercase","capitalize"],doc:"Transform the case of the characters","default-value":"none"},"horizontal-alignment":{css:"text-horizontal-alignment",type:["left","middle","right","auto"],doc:"The text's horizontal alignment from its centerpoint","default-value":"auto"},"justify-alignment":{css:"text-align",type:["left","right","center","auto"],doc:"Define how text is justified","default-value":"auto","default-meaning":"Auto alignment means that text will be centered by default except when using the `placement-type` parameter - in that case either right or left justification will be used automatically depending on where the text could be fit given the `text-placements` directives"},clip:{css:"text-clip",type:"boolean","default-value":!0,"default-meaning":"geometry will be clipped to map bounds before rendering",doc:"geometries are clipped to map bounds by default for best rendering performance. In some cases users may wish to disable this to avoid rendering artifacts."},"comp-op":{css:"text-comp-op","default-value":"src-over","default-meaning":"add the current symbolizer on top of other symbolizer",doc:"Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",type:["clear","src","dst","src-over","dst-over","src-in","dst-in","src-out","dst-out","src-atop","dst-atop","xor","plus","minus","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","contrast","invert","invert-rgb","grain-merge","grain-extract","hue","saturation","color","value"]}},building:{fill:{css:"building-fill","default-value":"#FFFFFF",doc:"The color of the buildings walls.",type:"color"},"fill-opacity":{css:"building-fill-opacity",type:"float",doc:"The opacity of the building as a whole, including all walls.","default-value":1},height:{css:"building-height",doc:"The height of the building in pixels.",type:"expression","default-value":"0"}}},colors:{aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50],transparent:[0,0,0,0]},filter:{value:["true","false","null","point","linestring","polygon","collection"]}};function ZC(e,t){for(var r=0;r1&&(t=arguments[1]),arguments.length>2&&(r=arguments[2]),{is:"tag",val:e,color:t,mode:r,toString:function(n){return'\n\t"}}},hsl:function(e,t,r){return this.hsla(e,t,r,1)},hsla:function(e,t,r,n){if([e=this.number(e)%360/360,t=this.number(t),r=this.number(r),n=this.number(n)].some(isNaN))return null;var o=r<=.5?r*(t+1):r+t-r*t,i=2*r-o;return this.rgba(255*a(e+1/3),255*a(e),255*a(e-1/3),n);function a(e){return 6*(e=e<0?e+1:e>1?e-1:e)<1?i+(o-i)*e*6:2*e<1?o:3*e<2?i+(o-i)*(2/3-e)*6:i}},hue:function(e){return"toHSL"in e?new XC.Tree.Dimension(Math.round(e.toHSL().h)):null},saturation:function(e){return"toHSL"in e?new XC.Tree.Dimension(Math.round(100*e.toHSL().s),"%"):null},lightness:function(e){return"toHSL"in e?new XC.Tree.Dimension(Math.round(100*e.toHSL().l),"%"):null},alpha:function(e){return"toHSL"in e?new XC.Tree.Dimension(e.toHSL().a):null},saturate:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.s+=t.value/100,r.s=this.clamp(r.s),this.hsla_simple(r)},desaturate:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.s-=t.value/100,r.s=this.clamp(r.s),this.hsla_simple(r)},lighten:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.l+=t.value/100,r.l=this.clamp(r.l),this.hsla_simple(r)},darken:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.l-=t.value/100,r.l=this.clamp(r.l),this.hsla_simple(r)},fadein:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.a+=t.value/100,r.a=this.clamp(r.a),this.hsla_simple(r)},fadeout:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL();return r.a-=t.value/100,r.a=this.clamp(r.a),this.hsla_simple(r)},spin:function(e,t){if(!("toHSL"in e))return null;var r=e.toHSL(),n=(r.h+t.value)%360;return r.h=n<0?360+n:n,this.hsla_simple(r)},replace:function(e,t,r){return"field"===e.is?e.toString+".replace("+t.toString()+", "+r.toString()+")":e.replace(t,r)},mix:function(e,t,r){var n=r.value/100,o=2*n-1,i=e.toHSL().a-t.toHSL().a,a=((o*i==-1?o:(o+i)/(1+o*i))+1)/2,s=1-a,l=[e.rgb[0]*a+t.rgb[0]*s,e.rgb[1]*a+t.rgb[1]*s,e.rgb[2]*a+t.rgb[2]*s],u=e.alpha*n+t.alpha*(1-n);return new XC.Tree.Color(l,u)},greyscale:function(e){return this.desaturate(e,new XC.Tree.Dimension(100))},"%":function(e){for(var t=Array.prototype.slice.call(arguments,1),r=e.value,n=0;n.5?u/(2-a-s):u/(a+s),a){case r:e=(n-o)/u+(n=0){if(!e.ppi)return e.error({message:"ppi is not set, so metric units can't be used",index:this.index}),{is:"undefined",value:"undefined"};this.value=this.value/this.densities[this.unit]*e.ppi,this.unit="px"}return this}},{key:"toColor",value:function(){return new XC.Tree.Color([this.value,this.value,this.value])}},{key:"round",value:function(){return this.value=Math.round(this.value),this}},{key:"toString",value:function(){return this.value.toString()}},{key:"operate",value:function(e,t,r){return"%"===this.unit&&"%"!==r.unit?(e.error({message:"If two operands differ, the first must not be %",index:this.index}),{is:"undefined",value:"undefined"}):"%"!==this.unit&&"%"===r.unit?"*"===t||"/"===t||"%"===t?(e.error({message:"Percent values can only be added or subtracted from other values",index:this.index}),{is:"undefined",value:"undefined"}):new XC.Tree.Dimension(XC.Tree.operate(t,this.value,this.value*r.value*.01),this.unit):new XC.Tree.Dimension(XC.Tree.operate(t,this.value,r.value),this.unit||r.unit)}}]),e}(),XC.Tree.Element=function(){function e(t){WC(this,e),this.value=t.trim(),"#"===this.value[0]&&(this.type="id",this.clean=this.value.replace(/^#/,"")),"."===this.value[0]&&(this.type="class",this.clean=this.value.replace(/^\./,"")),-1!==this.value.indexOf("*")&&(this.type="wildcard")}return QC(e,[{key:"specificity",value:function(){return["id"===this.type?1:0,"class"===this.type?1:0]}},{key:"toString",value:function(){return this.value}}]),e}(),XC.Tree.Expression=function(){function e(t){WC(this,e),this.is="expression",this.value=t}return QC(e,[{key:"ev",value:function(e){return this.value.length>1?new XC.Tree.Expression(this.value.map(function(t){return t.ev(e)})):this.value[0].ev(e)}},{key:"toString",value:function(e){return this.value.map(function(t){return t.toString(e)}).join(" ")}}]),e}(),XC.Tree.Field=function(){function e(t){WC(this,e),this.is="field",this.value=t||""}return QC(e,[{key:"toString",value:function(){return'["'+this.value.toUpperCase()+'"]'}},{key:"ev",value:function(){return this}}]),e}(),XC.Tree.Filter=function(){function e(t,r,n,o,i){WC(this,e),this.ops={"<":[" < ","numeric"],">":[" > ","numeric"],"=":[" = ","both"],"!=":[" != ","both"],"<=":[" <= ","numeric"],">=":[" >= ","numeric"],"=~":[".match(","string",")"]},this.key=t,this.op=r,this.val=n,this.index=o,this.filename=i,this.id=this.key+this.op+this.val}return QC(e,[{key:"ev",value:function(e){return this.key=this.key.ev(e),this.val=this.val.ev(e),this}},{key:"toString",value:function(){return"["+this.id+"]"}}]),e}(),XC.Tree.Filterset=function(){function e(){WC(this,e),this.filters={}}return QC(e,[{key:"toJS",value:function(e){function t(e){var t=e.op;"="===t&&(t="==");var r=e.val;void 0!==e._val&&(r=e._val.toString(!0)),e.key&&"scale"===e.key.value?r=+r:"string"!=typeof r&&"object"!==HC(r)||(r="'"+r+"'");var n="attributes";return n+"&&"+n+e.key+"&&"+n+e.key+" "+t+r}var r=[];for(var n in this.filters)r.push(t(this.filters[n]));return r.join(" && ")}},{key:"toString",value:function(){var e=[];for(var t in this.filters)e.push(this.filters[t].id);return e.sort().join("\t")}},{key:"ev",value:function(e){for(var t in this.filters)this.filters[t].ev(e);return this}},{key:"clone",value:function(){var e=new XC.Tree.Filterset;for(var t in this.filters)e.filters[t]=this.filters[t];return e}},{key:"cloneWith",value:function(e){var t=[];for(var r in e.filters){var n=this.addable(e.filters[r]);if(!1===n)return!1;!0===n&&t.push(e.filters[r])}if(!t.length)return null;var o=new XC.Tree.Filterset;for(r in this.filters)o.filters[r]=this.filters[r];for(;r=t.shift();)o.add(r);return o}},{key:"addable",value:function(e){var t=e.key.toString(),r=e.val.toString();switch(r.match(/^[0-9]+(\.[0-9]*)?_match/)&&(r=parseFloat(r)),e.op){case"=":return void 0!==this.filters[t+"="]?this.filters[t+"="].val.toString()==r&&null:void 0===this.filters[t+"!="+r]&&(!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=r)&&(!(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=r)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>r)&&!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val"]&&this.filters[t+">"].val>=r?null:void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=r?null:void 0!==this.filters[t+">="]&&this.filters[t+">="].val>r?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val":return t+"="in this.filters?!(this.filters[t+"="].val<=r)&&null:!(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=r)&&(!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val<=r)&&(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=r?null:!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>r)||null));case">=":return void 0!==this.filters[t+"="]?!(this.filters[t+"="].val"]&&this.filters[t+">"].val>=r?null:!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>=r)||null));case"<":return void 0!==this.filters[t+"="]?!(this.filters[t+"="].val>=r)&&null:!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=r)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>=r)&&(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=r?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].valr)&&null:!(void 0!==this.filters[t+">"]&&this.filters[t+">"].val>=r)&&(!(void 0!==this.filters[t+">="]&&this.filters[t+">="].val>r)&&(void 0!==this.filters[t+"<"]&&this.filters[t+"<"].val<=r?null:!(void 0!==this.filters[t+"<="]&&this.filters[t+"<="].val<=r)||null))}}},{key:"conflict",value:function(e){var t=e.key.toString(),r=e.val.toString();return isNaN(parseFloat(r))||(r=parseFloat(r)),("="===e.op&&void 0!==this.filters[t+"="]&&r!=this.filters[t+"="].val.toString()||"!="===e.op&&void 0!==this.filters[t+"="]&&r==this.filters[t+"="].val.toString()||"="===e.op&&void 0!==this.filters[t+"!="]&&r===this.filters[t+"!="].val.toString())&&e.toString()+" added to "+this.toString()+" produces an invalid filter"}},{key:"add",value:function(e,t){var r,n=e.key.toString(),o=e.op,i=this.conflict(e);if(i)return i;if("="===o){for(var a in this.filters)this.filters[a].key===n&&delete this.filters[a];this.filters[n+"="]=e}else if("!="===o)this.filters[n+"!="+e.val]=e;else if("=~"===o)this.filters[n+"=~"+e.val]=e;else if(">"===o){for(var s in this.filters)this.filters[s].key===n&&this.filters[s].val<=e.val&&delete this.filters[s];this.filters[n+">"]=e}else if(">="===o){for(var l in this.filters)r=+this.filters[l].val.toString(),this.filters[l].key===n&&r",this.filters[n+">"]=e):this.filters[n+">="]=e}else if("<"===o){for(var u in this.filters)r=+this.filters[u].val.toString(),this.filters[u].key===n&&r>=e.val&&delete this.filters[u];this.filters[n+"<"]=e}else if("<="===o){for(var c in this.filters)r=+this.filters[c].val.toString(),this.filters[c].key===n&&r>e.val&&delete this.filters[c];void 0!==this.filters[n+"!="+e.val]?(delete this.filters[n+"!="+e.val],e.op="<",this.filters[n+"<"]=e):this.filters[n+"<="]=e}}}]),e}(),XC.Tree.Fontset=QC(function e(t,r){WC(this,e),this.fonts=r,this.name="fontset-"+t.effects.length}),XC.Tree.Invalid=function(){function e(t,r,n){WC(this,e),this.is="invalid",this.chunk=t,this.index=r,this.type="syntax",this.message=n||"Invalid code: "+this.chunk}return QC(e,[{key:"ev",value:function(e){return e.error({chunk:this.chunk,index:this.index,type:"syntax",message:this.message||"Invalid code: "+this.chunk}),{is:"undefined"}}}]),e}(),XC.Tree.Keyword=function(){function e(t){WC(this,e),this.value=t;var r={transparent:"color",true:"boolean",false:"boolean"};this.is=r[t]?r[t]:"keyword"}return QC(e,[{key:"ev",value:function(){return this}},{key:"toString",value:function(){return this.value}}]),e}(),XC.Tree.Literal=function(){function e(t){WC(this,e),this.value=t||"",this.is="field"}return QC(e,[{key:"toString",value:function(){return this.value}},{key:"ev",value:function(){return this}}]),e}(),XC.Tree.Operation=function(){function e(t,r,n){WC(this,e),this.is="operation",this.op=t.trim(),this.operands=r,this.index=n}return QC(e,[{key:"ev",value:function(e){var t,r=this.operands[0].ev(e),n=this.operands[1].ev(e);return"undefined"===r.is||"undefined"===n.is?{is:"undefined",value:"undefined"}:(r instanceof XC.Tree.Dimension&&n instanceof XC.Tree.Color&&("*"===this.op||"+"===this.op?(t=n,n=r,r=t):e.error({name:"OperationError",message:"Can't substract or divide a color from a number",index:this.index})),r instanceof XC.Tree.Quoted&&n instanceof XC.Tree.Quoted&&"+"!==this.op?(e.error({message:"Can't subtract, divide, or multiply strings.",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):r instanceof XC.Tree.Field||n instanceof XC.Tree.Field||r instanceof XC.Tree.Literal||n instanceof XC.Tree.Literal?"color"===r.is||"color"===n.is?(e.error({message:"Can't subtract, divide, or multiply colors in expressions.",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):new XC.Tree.Literal(r.ev(e).toString(!0)+this.op+n.ev(e).toString(!0)):void 0===r.operate?(e.error({message:"Cannot do math with type "+r.is+".",index:this.index,type:"runtime",filename:this.filename}),{is:"undefined",value:"undefined"}):r.operate(e,this.op,n))}}]),e}(),XC.Tree.Quoted=function(){function e(t){WC(this,e),this.is="string",this.value=t||""}return QC(e,[{key:"toString",value:function(e){var t=this.value.replace(/&/g,"&"),r=t.replace(/\'/g,"\\'").replace(/\"/g,""").replace(//g,">");return!0===e?"'"+r+"'":t}},{key:"ev",value:function(){return this}},{key:"operate",value:function(e,t,r){return new XC.Tree.Quoted(XC.Tree.operate(t,this.toString(),r.toString(this.contains_field)))}}]),e}(),XC.Tree.Reference={_validateValue:{font:function(e,t){return!e.validation_data||!e.validation_data.fonts||-1!=e.validation_data.fonts.indexOf(t)}},setData:function(e){this.data=e,this.selector_cache=function(e){var t={};for(var r in e.symbolizers)for(var n in e.symbolizers[r])e.symbolizers[r][n].hasOwnProperty("css")&&(t[e.symbolizers[r][n].css]=[e.symbolizers[r][n],r,n]);return t}(e),this.mapnikFunctions=function(e){var t={};for(var r in e.symbolizers)for(var n in e.symbolizers[r])if("functions"===e.symbolizers[r][n].type)for(var o=0;o1?Array.prototype.push.apply(r,n.find(new XC.Tree.Selector(null,null,e.elements.slice(1)),t)):r.push(n);break}}),this._lookups[n]=r)}},{key:"evZooms",value:function(e){for(var t=0;tXC.Tree.Zoom.maxZoom||t<0)&&e.error({message:"Only zoom levels between 0 and "+XC.Tree.Zoom.maxZoom+" supported.",index:this.index}),this.op){case"=":return this.zoom="zoom && zoom === "+t,this;case">":this.zoom="zoom && zoom > "+t;break;case">=":this.zoom="zoom && zoom >= "+t;break;case"<":this.zoom="zoom && zoom < "+t;break;case"<=":this.zoom="zoom && zoom <= "+t}return this}},{key:"toString",value:function(){for(var e="",t=0;t<=XC.Tree.Zoom.maxZoom;t++)e+=this.zoom&1<3&&(t=Array.prototype.slice.call(t,1));for(var n=this._handlers[e],o=n.length,i=0;i4&&(t=Array.prototype.slice.call(t,1,t.length-1));for(var n=t[t.length-1],o=this._handlers[e],i=o.length,a=0;a-this.EPSILON&&ethis.EPSILON||e<-this.EPSILON}},{key:"cubicAt",value:function(e,t,r,n,o){var i=1-o;return i*i*(i*e+3*o*t)+o*o*(o*n+3*i*r)}},{key:"cubicDerivativeAt",value:function(e,t,r,n,o){var i=1-o;return 3*(((t-e)*i+2*(r-t)*o)*i+(n-r)*o*o)}},{key:"cubicRootAt",value:function(e,t,r,n,o,i){var a=n+3*(t-r)-e,s=3*(r-2*t+e),l=3*(t-e),u=e-o,c=s*s-3*a*l,f=s*l-9*a*u,p=l*l-3*s*u,h=0;if(this.isAroundZero(c)&&this.isAroundZero(f))if(this.isAroundZero(s))i[0]=0;else{var y=-l/s;y>=0&&y<=1&&(i[h++]=y)}else{var d=f*f-4*c*p;if(this.isAroundZero(d)){var v=f/c,m=-s/a+v,b=-v/2;m>=0&&m<=1&&(i[h++]=m),b>=0&&b<=1&&(i[h++]=b)}else if(d>0){var g=Math.sqrt(d),w=c*s+1.5*a*(-f+g),S=c*s+1.5*a*(-f-g),O=(-s-((w=w<0?-Math.pow(-w,this.ONE_THIRD):Math.pow(w,this.ONE_THIRD))+(S=S<0?-Math.pow(-S,this.ONE_THIRD):Math.pow(S,this.ONE_THIRD))))/(3*a);O>=0&&O<=1&&(i[h++]=O)}else{var _=(2*c*s-3*a*f)/(2*Math.sqrt(c*c*c)),P=Math.acos(_)/3,x=Math.sqrt(c),C=Math.cos(P),T=(-s-2*x*C)/(3*a),E=(-s+x*(C+this.THREE_SQRT*Math.sin(P)))/(3*a),j=(-s+x*(C-this.THREE_SQRT*Math.sin(P)))/(3*a);T>=0&&T<=1&&(i[h++]=T),E>=0&&E<=1&&(i[h++]=E),j>=0&&j<=1&&(i[h++]=j)}}return h}},{key:"cubicExtrema",value:function(e,t,r,n,o){var i=6*r-12*t+6*e,a=9*t+3*n-3*e-9*r,s=3*t-3*e,l=0;if(this.isAroundZero(a)){if(this.isNotAroundZero(i)){var u=-s/i;u>=0&&u<=1&&(o[l++]=u)}}else{var c=i*i-4*a*s;if(this.isAroundZero(c))o[0]=-i/(2*a);else if(c>0){var f=Math.sqrt(c),p=(-i+f)/(2*a),h=(-i-f)/(2*a);p>=0&&p<=1&&(o[l++]=p),h>=0&&h<=1&&(o[l++]=h)}}return l}},{key:"cubicSubdivide",value:function(e,t,r,n,o,i){var a=(t-e)*o+e,s=(r-t)*o+t,l=(n-r)*o+r,u=(s-a)*o+a,c=(l-s)*o+s,f=(c-u)*o+u;i[0]=e,i[1]=a,i[2]=u,i[3]=f,i[4]=f,i[5]=c,i[6]=l,i[7]=n}},{key:"cubicProjectPoint",value:function(e,t,r,n,o,i,a,s,l,u,c){var f,p=this.vector.create(),h=this.vector.create(),y=this.vector.create(),d=.005,v=1/0;p[0]=l,p[1]=u;for(var m=0;m<1;m+=.05){h[0]=this.cubicAt(e,r,o,a,m),h[1]=this.cubicAt(t,n,i,s,m);var b=this.vector.distSquare(p,h);b=0&&O=0&&u<=1&&(o[l++]=u)}}else{var c=a*a-4*i*s;if(this.isAroundZero(c)){var f=-a/(2*i);f>=0&&f<=1&&(o[l++]=f)}else if(c>0){var p=Math.sqrt(c),h=(-a+p)/(2*i),y=(-a-p)/(2*i);h>=0&&h<=1&&(o[l++]=h),y>=0&&y<=1&&(o[l++]=y)}}return l}},{key:"quadraticExtremum",value:function(e,t,r){var n=e+r-2*t;return 0===n?.5:(e-t)/n}},{key:"quadraticProjectPoint",value:function(e,t,r,n,o,i,a,s,l){var u,c=this.vector.create(),f=this.vector.create(),p=this.vector.create(),h=.005,y=1/0;c[0]=a,c[1]=s;for(var d=0;d<1;d+=.05){f[0]=this.quadraticAt(e,r,o,d),f[1]=this.quadraticAt(t,n,i,d);var v=this.vector.distSquare(c,f);v=0&&w0){for(var b=this.isInsidePolygon(t.pointList,v,m),g=e.holePolygonPointLists,w=!1,S=0,O=g.length;St+s&&a>n+s||ae+s&&i>r+s||it+f&&c>n+f&&c>i+f&&c>s+f||ce+f&&u>r+f&&u>o+f&&u>a+f||ut+u&&l>n+u&&l>i+u||le+u&&s>r+u&&s>o+u||sr||f+c=u)return!0;if(i){var p=n;n=this.normalizeRadian(o),o=this.normalizeRadian(p)}else n=this.normalizeRadian(n),o=this.normalizeRadian(o);n>o&&(o+=u);var h=Math.atan2(l,s);return h<0&&(h+=u),h>=n&&h<=o||h+u>=n&&h+u<=o}},{key:"isInsideBrokenLine",value:function(e,t,r,n){for(var o=Math.max(t,10),i=0,a=e.length-1;ir*r}},{key:"isInsideRect",value:function(e,t,r,n,o,i){return o>=e&&o<=e+r&&i>=t&&i<=t+n}},{key:"isInsideCircle",value:function(e,t,r,n,o){return(n-e)*(n-e)+(o-t)*(o-t)t&&i>n||io?nt&&u>n&&u>i&&u>s||u1&&this.swapExtrema(),y=c.cubicAt(t,n,i,s,p[0]),m>1&&(d=c.cubicAt(t,n,i,s,p[1]))),2==m?gt&&s>n&&s>i||s=0&&f<=1){for(var p=0,h=l.quadraticAt(t,n,i,f),y=0;ya||(u[y]a?0:ir||s<-r)return 0;var c=Math.sqrt(r*r-s*s);if(l[0]=-c,l[1]=c,Math.abs(n-o)>=u){n=0,o=u;var f=i?1:-1;return a>=l[0]+e&&a<=l[1]+e?f:0}if(i){var p=n;n=this.normalizeRadian(o),o=this.normalizeRadian(p)}else n=this.normalizeRadian(n),o=this.normalizeRadian(o);n>o&&(o+=u);for(var h=0,y=0;y<2;y++){var d=l[y];if(d+e>a){var v=Math.atan2(s,d),m=i?1:-1;v<0&&(v=u+v),(v>=n&&v<=o||v+u>=n&&v+u<=o)&&(v>Math.PI/2&&v<1.5*Math.PI&&(m=-m),h+=m)}}return h}},{key:"isInsidePath",value:function(e,t,r,n,o){for(var i=0,a=0,s=0,l=0,u=0,c=!0,f=!0,p="stroke"===(r=r||"fill")||"both"===r,h="fill"===r||"both"===r,y=0;y0&&(h&&(i+=this.windingLine(a,s,l,u,n,o)),0!==i))return!0;l=v[v.length-2],u=v[v.length-1],c=!1,f&&"A"!==d.command&&(f=!1,a=l,s=u)}switch(d.command){case"M":a=v[0],s=v[1];break;case"L":if(p&&this.isInsideLine(a,s,v[0],v[1],t,n,o))return!0;h&&(i+=this.windingLine(a,s,v[0],v[1],n,o)),a=v[0],s=v[1];break;case"C":if(p&&this.isInsideCubicStroke(a,s,v[0],v[1],v[2],v[3],v[4],v[5],t,n,o))return!0;h&&(i+=this.windingCubic(a,s,v[0],v[1],v[2],v[3],v[4],v[5],n,o)),a=v[4],s=v[5];break;case"Q":if(p&&this.isInsideQuadraticStroke(a,s,v[0],v[1],v[2],v[3],t,n,o))return!0;h&&(i+=this.windingQuadratic(a,s,v[0],v[1],v[2],v[3],n,o)),a=v[2],s=v[3];break;case"A":var m=v[0],b=v[1],g=v[2],w=v[3],S=v[4],O=v[5],_=Math.cos(S)*g+m,P=Math.sin(S)*w+b;f?(f=!1,l=_,u=P):i+=this.windingLine(a,s,_,P);var x=(n-m)*w/g+m;if(p&&this.isInsideArcStroke(m,b,w,S,S+O,1-v[7],t,x,o))return!0;h&&(i+=this.windingArc(m,b,w,S,S+O,1-v[7],x,o)),a=Math.cos(S+O)*g+m,s=Math.sin(S+O)*w+b;break;case"z":if(p&&this.isInsideLine(a,s,l,u,t,n,o))return!0;c=!0}}return h&&(i+=this.windingLine(a,s,l,u,n,o)),0!==i}},{key:"getTextWidth",value:function(e,t){var r=e+":"+t;if(this._textWidthCache[r])return this._textWidthCache[r];this._ctx=this._ctx||this.util.getContext(),this._ctx.save(),t&&(this._ctx.font=t);for(var n=0,o=0,i=(e=(e+"").split("\n")).length;othis.TEXT_CACHE_MAX&&(this._textWidthCacheCounter=0,this._textWidthCache={}),n}},{key:"getTextHeight",value:function(e,t){var r=e+":"+t;if(this._textHeightCache[r])return this._textHeightCache[r];this._ctx=this._ctx||this.util.getContext(),this._ctx.save(),t&&(this._ctx.font=t),e=(e+"").split("\n");var n=(this._ctx.measureText("ZH").width+2)*e.length;return this._ctx.restore(),this._textHeightCache[r]=n,++this._textHeightCacheCounter>this.TEXT_CACHE_MAX&&(this._textHeightCacheCounter=0,this._textHeightCache={}),n}}])&&cE(t.prototype,r),n&&cE(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function pE(e,t){for(var r=0;ro&&(o=l[0]),l[1]a&&(a=l[1])}t[0]=n,t[1]=i,r[0]=o,r[1]=a}}},{key:"cubeBezier",value:function(e,t,r,n,o,i){var a=new uE,s=[];a.cubicExtrema(e[0],t[0],r[0],n[0],s);for(var l=0;lo&&!i?o+=2*Math.PI:nn&&(f[0]=Math.cos(h)*r+e,f[1]=Math.sin(h)*r+t,l.min(a,f,a),l.max(s,f,s))}}])&&pE(t.prototype,r),n&&pE(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function yE(e,t){for(var r=0;r=200&&o.status<300||304===o.status?t&&t(o.responseText):r&&r(),o.onreadystatechange=new Function,o=null)},o.send(null)}}])&&gE(t.prototype,r),n&&gE(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function SE(e,t){for(var r=0;r1)for(var t in arguments)console.log(arguments[t])}}var t,r,n;return t=e,(r=[{key:"destory",value:function(){return!0}}])&&_E(t.prototype,r),n&&_E(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function xE(e,t){for(var r=0;ra-2?a-1:h+1][0]+i[0],t[h>a-2?a-1:h+1][1]+i[1]],b=[t[h>a-3?a-1:h+2][0]+i[0],t[h>a-3?a-1:h+2][1]+i[1]]);var g=y*y,w=y*g;s.push([S(d[0],v[0],m[0],b[0],y,g,w),S(d[1],v[1],m[1],b[1],y,g,w)])}return s;function S(e,t,r,n,o,i,a){var s=.5*(r-e),l=.5*(n-t);return(2*(t-r)+s+l)*a+(-3*(t-r)-2*s-l)*i+s*o+t}}},{key:"SUtil_dashedLineTo",value:function(e,t,r,n,o,i,a){var s=[5,5];if(i="number"!=typeof i?5:i,e.setLineDash)return s[0]=i,s[1]=i,a&&a instanceof Array?e.setLineDash(a):e.setLineDash(s),e.moveTo(t,r),void e.lineTo(n,o);var l=n-t,u=o-r,c=Math.floor(Math.sqrt(l*l+u*u)/i);l/=c,u/=c;for(var f=!0,p=0;p-5e-5&&e<5e-5}kE.Util_vector.sub(t,e,this.position),n(t[0])&&n(t[1])||(kE.Util_vector.normalize(t,t),r[2]=t[0]*this.scale[1],r[3]=t[1]*this.scale[1],r[0]=t[1]*this.scale[0],r[1]=-t[0]*this.scale[0],r[4]=this.position[0],r[5]=this.position[1],this.decomposeTransform())})}var t,r,n;return t=e,(r=[{key:"destroy",value:function(){this.position=null,this.rotation=null,this.scale=null,this.needLocalTransform=null,this.needTransform=null}},{key:"updateNeedTransform",value:function(){function e(e){return e>5e-5||e<-5e-5}this.needLocalTransform=e(this.rotation[0])||e(this.position[0])||e(this.position[1])||e(this.scale[0]-1)||e(this.scale[1]-1)}},{key:"updateTransform",value:function(){if(this.updateNeedTransform(),this.parent?this.needTransform=this.needLocalTransform||this.parent.needTransform:this.needTransform=this.needLocalTransform,this.needTransform){var e=[0,0],t=this.transform||kE.Util_matrix.create();if(kE.Util_matrix.identity(t),this.needLocalTransform){if(o(this.scale[0])||o(this.scale[1])){e[0]=-this.scale[2]||0,e[1]=-this.scale[3]||0;var r=o(e[0])||o(e[1]);r&&kE.Util_matrix.translate(t,t,e),kE.Util_matrix.scale(t,t,this.scale),r&&(e[0]=-e[0],e[1]=-e[1],kE.Util_matrix.translate(t,t,e))}if(this.rotation instanceof Array){if(0!==this.rotation[0]){e[0]=-this.rotation[1]||0,e[1]=-this.rotation[2]||0;var n=o(e[0])||o(e[1]);n&&kE.Util_matrix.translate(t,t,e),kE.Util_matrix.rotate(t,t,this.rotation[0]),n&&(e[0]=-e[0],e[1]=-e[1],kE.Util_matrix.translate(t,t,e))}}else 0!=+this.rotation&&kE.Util_matrix.rotate(t,t,this.rotation);(o(this.position[0])||o(this.position[1]))&&kE.Util_matrix.translate(t,t,this.position)}this.transform=t,this.parent&&this.parent.needTransform&&(this.needLocalTransform?kE.Util_matrix.mul(this.transform,this.parent.transform,this.transform):kE.Util_matrix.copy(this.transform,this.parent.transform))}function o(e){return e>5e-5||e<-5e-5}}},{key:"setTransform",value:function(e){if(this.needTransform){var t=this.transform;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}}},{key:"decomposeTransform",value:function(){if(this.transform){var e=this.transform,t=e[0]*e[0]+e[1]*e[1],r=this.position,n=this.scale,o=this.rotation;a(t-1)&&(t=Math.sqrt(t));var i=e[2]*e[2]+e[3]*e[3];a(i-1)&&(i=Math.sqrt(i)),r[0]=e[4],r[1]=e[5],n[0]=t,n[1]=i,n[2]=n[3]=0,o[0]=Math.atan2(-e[1]/i,e[0]/t),o[1]=o[2]=0}function a(e){return e>5e-5||e<-5e-5}}}])&&ME(t.prototype,r),n&&ME(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function AE(e){"@babel/helpers - typeof";return(AE="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function LE(e,t){for(var r=0;r0&&(this.setCtxGlobalAlpha(e,"stroke",r),e.stroke()),this.setCtxGlobalAlpha(e,"reset",r);break;case"stroke":this.setCtxGlobalAlpha(e,"stroke",r),r.lineWidth>0&&e.stroke(),this.setCtxGlobalAlpha(e,"reset",r);break;default:this.setCtxGlobalAlpha(e,"fill",r),e.fill(),this.setCtxGlobalAlpha(e,"reset",r)}this.drawText(e,r,this.style),this.afterBrush(e)}},{key:"beforeBrush",value:function(e,t){var r=this.style;return this.brushTypeOnly&&(r.brushType=this.brushTypeOnly),t&&(r=this.getHighlightStyle(r,this.highlightStyle||{},this.brushTypeOnly)),"stroke"==this.brushTypeOnly&&(r.strokeColor=r.strokeColor||r.color),e.save(),this.doClip(e),this.setContext(e,r),this.setTransform(e),r}},{key:"afterBrush",value:function(e){e.restore()}},{key:"setContext",value:function(e,t){for(var r=[["color","fillStyle"],["strokeColor","strokeStyle"],["opacity","globalAlpha"],["lineCap","lineCap"],["lineJoin","lineJoin"],["miterLimit","miterLimit"],["lineWidth","lineWidth"],["shadowBlur","shadowBlur"],["shadowColor","shadowColor"],["shadowOffsetX","shadowOffsetX"],["shadowOffsetY","shadowOffsetY"]],n=0,o=r.length;n=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height&&kE.Util_area.isInside(this,this.style,e,t)}},{key:"drawText",value:function(e,t,r){if(void 0!==t.text&&!1!==t.text){var n=t.textColor||t.color||t.strokeColor;e.fillStyle=n;var o,a,s,l,u=10,c=t.textPosition||this.textPosition||"top",f=[];switch(f=this.refOriginalPosition&&2===this.refOriginalPosition.length?this.refOriginalPosition:[0,0],c){case"inside":case"top":case"bottom":case"left":case"right":if(this.getRect){var p=(r||t).__rect||this.getRect(r||t);switch(c){case"inside":s=p.x+p.width/2,l=p.y+p.height/2,o="center",a="middle","stroke"!=t.brushType&&n==t.color&&(e.fillStyle="#fff");break;case"left":s=p.x-u,l=p.y+p.height/2,o="end",a="middle";break;case"right":s=p.x+p.width+u,l=p.y+p.height/2,o="start",a="middle";break;case"top":s=p.x+p.width/2,l=p.y-u,o="center",a="bottom";break;case"bottom":s=p.x+p.width/2,l=p.y+p.height+u,o="center",a="top"}}break;case"start":case"end":var h=0,y=0,d=0,v=0;if(void 0!==t.pointList){var m=t.pointList;if(m.length<2)return;var b=m.length;switch(c){case"start":h=m[0][0]+f[0],y=m[1][0]+f[0],d=m[0][1]+f[1],v=m[1][1]+f[1];break;case"end":h=m[b-2][0]+f[0],y=m[b-1][0]+f[0],d=m[b-2][1]+f[1],v=m[b-1][1]+f[1]}}else h=t.xStart+f[0]||0,y=t.xEnd+f[0]||0,d=t.yStart+f[1]||0,v=t.yEnd+f[1]||0;switch(c){case"start":o=hn&&(n=l[0]),l[1]o&&(o=l[1]))}return e.__rect={x:t,y:r,width:n-t,height:o-r},e.__rect}},{key:"getRectNoRotation",value:function(e){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t,r=this.refOriginalPosition,n=kE.Util_area.getTextHeight("ZH",e.textFont),o=kE.Util_area.getTextWidth(e.text,e.textFont),i=kE.Util_area.getTextHeight(e.text,e.textFont),a=e.x+r[0];"end"==e.textAlign||"right"==e.textAlign?a-=o:"center"==e.textAlign&&(a-=o/2),t="top"==e.textBaseline?e.y+r[1]:"bottom"==e.textBaseline?e.y+r[1]-i:e.y+r[1]-i/2;var s,l=!1;if(e.maxWidth){var u=parseInt(e.maxWidth);u-1&&(o+=!0===l?n/3*(o/s):n/3));return{x:a,y:t,width:o,height:i}}},{key:"getTextBackground",value:function(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var r=this.refOriginalPosition;if(!t&&e.__textBackground)return e.__textBackground;var n=this.getRectNoRotation(e),o=e.x+r[0],i=e.y+r[1],a=[];if(e.textRotation&&0!==e.textRotation){var s=e.textRotation,l=this.getRotatedLocation(n.x,n.y,o,i,s),u=this.getRotatedLocation(n.x+n.width,n.y,o,i,s),c=this.getRotatedLocation(n.x+n.width,n.y+n.height,o,i,s),f=this.getRotatedLocation(n.x,n.y+n.height,o,i,s);a.push(l),a.push(u),a.push(c),a.push(f)}else{var p=[n.x,n.y],h=[n.x+n.width,n.y],y=[n.x+n.width,n.y+n.height],d=[n.x,n.y+n.height];a.push(p),a.push(h),a.push(y),a.push(d)}return e.__textBackground=a,e.__textBackground}},{key:"getRotatedLocation",value:function(e,t,r,n,o){var i,a,s=new Array;return t=-t,n=-n,o=-o,i=(e-r)*Math.cos(o/180*Math.PI)-(t-n)*Math.sin(o/180*Math.PI)+r,a=(e-r)*Math.sin(o/180*Math.PI)+(t-n)*Math.cos(o/180*Math.PI)+n,s[0]=i,s[1]=-a,s}}])&&QE(t.prototype,r),n&&QE(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function tj(e){"@babel/helpers - typeof";return(tj="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function rj(e,t){for(var r=0;r0&&("stroke"==r.brushType||"both"==r.brushType)&&(n||(e.beginPath(),this.buildPath(e,r)),this.setCtxGlobalAlpha(e,"stroke",r),e.stroke(),this.setCtxGlobalAlpha(e,"reset",r)),this.drawText(e,r,this.style);var o=fe.cloneObject(r);if(o.pointList&&this.holePolygonPointLists&&this.holePolygonPointLists.length>0)for(var i=this.holePolygonPointLists,a=i.length,s=0;s0&&("stroke"==o.brushType||"both"==o.brushType)?(n||(e.beginPath(),this.buildPath(e,o)),e.globalCompositeOperation="source-over",this.setCtxGlobalAlpha(e,"stroke",o),e.stroke(),this.setCtxGlobalAlpha(e,"reset",o)):e.globalCompositeOperation="source-over"}e.restore()}},{key:"buildPath",value:function(e,t){t.showShadow&&(e.shadowBlur=t.shadowBlur,e.shadowColor=t.shadowColor,e.shadowOffsetX=t.shadowOffsetX,e.shadowOffsetY=t.shadowOffsetY),this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var r=this.refOriginalPosition,n=t.pointList;if(!(n.length<2))if(t.smooth&&"spline"!==t.smooth){var o,i,a,s=kE.SUtil_smoothBezier(n,t.smooth,!0,t.smoothConstraint,r);e.moveTo(n[0][0]+r[0],n[0][1]+r[1]);for(var l=n.length,u=0;ui&&(i=l[u][0]+r[0]),l[u][1]+r[1]s&&(s=l[u][1]+r[1]);return n="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(o-n/2),y:Math.round(a-n/2),width:i-o+n,height:s-a+n},e.__rect}}])&&uj(t.prototype,r),n&&uj(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function dj(e){"@babel/helpers - typeof";return(dj="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function vj(e,t){for(var r=0;rc&&(r*=c/(a=r+n),n*=c/a),o+i>c&&(o*=c/(a=o+i),i*=c/a),n+o>f&&(n*=f/(a=n+o),o*=f/a),r+i>f&&(r*=f/(a=r+i),i*=f/a),e.moveTo(l+r,u),e.lineTo(l+c-n,u),0!==n&&e.quadraticCurveTo(l+c,u,l+c,u+n),e.lineTo(l+c,u+f-o),0!==o&&e.quadraticCurveTo(l+c,u+f,l+c-o,u+f),e.lineTo(l+i,u+f),0!==i&&e.quadraticCurveTo(l,u+f,l,u+f-i),e.lineTo(l,u+r),0!==r&&e.quadraticCurveTo(l,u,l+r,u)}},{key:"buildPath",value:function(e,t){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var r=this.refOriginalPosition;t.radius?this._buildRadiusPath(e,t):(e.moveTo(t.x+r[0],t.y+r[1]),e.lineTo(t.x+r[0]+t.width,t.y+r[1]),e.lineTo(t.x+r[0]+t.width,t.y+r[1]+t.height),e.lineTo(t.x+r[0],t.y+r[1]+t.height),e.lineTo(t.x+r[0],t.y+r[1])),e.closePath()}},{key:"getRect",value:function(e){this.refOriginalPosition&&2===this.refOriginalPosition.length||(this.refOriginalPosition=[0,0]);var t,r=this.refOriginalPosition;return e.__rect?e.__rect:(t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x+r[0]-t/2),y:Math.round(e.y+r[1]-t/2),width:e.width+t,height:e.height+t},e.__rect)}}])&&kj(t.prototype,r),n&&kj(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Dj(e){"@babel/helpers - typeof";return(Dj="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ij(e,t){for(var r=0;r1?kE.Util_computeBoundingBox.arc(a,s,l,c,f,!p,r,o):(r[0]=o[0]=a,r[1]=o[1]=s),kE.Util_computeBoundingBox.arc(a,s,u,c,f,!p,n,i),kE.Util_vector.min(r,r,n),kE.Util_vector.max(o,o,i),e.__rect={x:r[0],y:r[1],width:o[0]-r[0],height:o[1]-r[1]},e.__rect}}])&&Ij(t.prototype,r),n&&Ij(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Vj(e,t){for(var r=0;r=15){var p=parseInt(i.axis3DParameter),h=[o[0]-p,o[1]+p];i.axisUseArrow?(c.push([h[0]+1.5,h[1]-7.5]),c.push([h[0]-1,h[1]+1]),c.push([h[0]+7.5,h[1]-1.5]),f.push([h[0],h[1]])):f.push([h[0],h[1]]),f.push([o[0],o[1]])}f.push([o[2]+5,o[1]])}else{var y=Math.abs(o[1]-o[3])/u,d=o[3];f.push([o[0],d-5]);for(var v=0;v=15){var b=parseInt(i.axis3DParameter),g=[o[0]-b,o[1]+b];i.axisUseArrow?(c.push([g[0]+1.5,g[1]-7.5]),c.push([g[0]-1,g[1]+1]),c.push([g[0]+7.5,g[1]-1.5]),f.push([g[0],g[1]])):f.push([g[0],g[1]]),f.push([o[0],o[1]])}f.push([o[2]+5,o[1]])}if(i.axisUseArrow){var w=[[o[2]+5,o[1]+4],[o[2]+13,o[1]],[o[2]+5,o[1]-4]],S=[[o[0]-4,o[3]-5],[o[0],o[3]-13],[o[0]+4,o[3]-5]],O=new OT(w);O.style={fillColor:"#008acd"},fe.copyAttributesWithClip(O.style,i.axisStyle),s.push(e.createShape(O));var _=new OT(S);if(_.style={fillColor:"#008acd"},fe.copyAttributesWithClip(_.style,i.axisStyle),s.push(e.createShape(_)),i.axis3DParameter&&!isNaN(i.axis3DParameter)&&i.axis3DParameter>=15){var P=new OT(c);P.style={fillColor:"#008acd"},fe.copyAttributesWithClip(P.style,i.axisStyle),s.push(e.createShape(P))}}var x=new dT(f);x.style={strokeLinecap:"butt",strokeLineJoin:"round",strokeColor:"#008acd",strokeWidth:1},i.axisStyle&&fe.copyAttributesWithClip(x.style,i.axisStyle),x.clickable=!1,x.hoverable=!1;var C=[e.createShape(x)],T=[];if(i.axisYLabels&&i.axisYLabels.length&&i.axisYLabels.length>0){var E=i.axisYLabels,j=E.length,k=[0,0];if(i.axisYLabelsOffset&&i.axisYLabelsOffset.length&&(k=i.axisYLabelsOffset),1==j){var M=new VT(o[0]-5+k[0],o[3]+k[1],E[0]);M.style={labelAlign:"right"},i.axisYLabelsStyle&&fe.copyAttributesWithClip(M.style,i.axisYLabelsStyle),M.clickable=!1,M.hoverable=!1,T.push(e.createShape(M))}else for(var R=o[3],A=Math.abs(o[1]-o[3])/(j-1),L=0;L0){var I=i.axisXLabels,F=I.length,B=[0,0];if(i.axisXLabelsOffset&&i.axisXLabelsOffset.length&&(B=i.axisXLabelsOffset),n&&n.xPositions&&n.xPositions.length&&n.xPositions.length==F)for(var G=n.xPositions,U=0;U=0&&r[o]&&fe.copyAttributesWithClip(a,r[o]),n&&n.length&&void 0!==i)for(var s=n,l=s.length,u=parseFloat(i),c=0;c=u[2]||u[1]<=u[3])&&(this.DVBOrigonPoint=[u[0],u[3]],this.DVBWidth=Math.abs(u[2]-u[0]),this.DVBHeight=Math.abs(u[1]-u[3]),this.DVBCenterPoint=[this.DVBOrigonPoint[0]+this.DVBWidth/2,this.DVBOrigonPoint[1]+this.DVBHeight/2],this.origonPointOffset=[this.DVBOrigonPoint[0]-a[0],this.DVBOrigonPoint[1]-a[1]],!0)}},{key:"resetLocation",value:function(e){e&&(this.lonlat=e);var t=this.getLocalXY(this.lonlat);t[0]+=this.XOffset,t[1]+=this.YOffset,this.location=t;var r=this.width,n=this.height,o=this.location;return this.chartBounds=new me(o[0]-r/2,o[1]+n/2,o[0]+r/2,o[1]-n/2),this.resetLinearGradient(),o}},{key:"resetLinearGradient",value:function(){}},{key:"shapesConvertToRelativeCoordinate",value:function(){for(var e=this.shapes,t=this.location,r=0,n=e.length;r=0?n.push(parseFloat(o[a].toString()).toFixed(r)):n.push(parseFloat(o[a].toString()))}catch(e){throw new Error("not a number")}return n.length===t.length&&n};var ak=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&nk(e,t)}(i,$j);var t,r,n,o=ok(i);function i(e,t,r,n,a){var s;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,i),(s=o.call(this,e,t,r,n,a)).CLASS_NAME="SuperMap.Feature.Theme.Bar",s}return t=i,(r=[{key:"destroy",value:function(){rk(ik(i.prototype),"destroy",this).call(this)}},{key:"assembleShapes",value:function(){var e={showShadow:!0,shadowBlur:8,shadowColor:"rgba(100,100,100,0.8)",shadowOffsetX:2,shadowOffsetY:2},t=this.setting;if(t.barLinearGradient||(t.barLinearGradient=[["#00FF00","#00CD00"],["#00CCFF","#5E87A2"],["#00FF66","#669985"],["#CCFF00","#94A25E"],["#FF9900","#A2945E"]]),t.dataViewBoxParameter||(void 0===t.useAxis||t.useAxis?t.dataViewBoxParameter=[45,15,15,15]:t.dataViewBoxParameter=[5,5,5,5]),this.initBaseParameter()){var r=this.DVBCodomain;this.DVBUnitValue=(r[1]-r[0])/this.DVBHeight;var n=this.dataViewBox,o=this.dataValues;if(!(o.length<1)){for(var i=0,a=o.length;ir[1])return;var s=this.calculateXShapeInfo();if(s){var l=s.xPositions,u=s.width;(void 0===t.useBackground||t.useBackground)&&this.shapes.push(Jj.Background(this.shapeFactory,this.chartBox,t)),(void 0===t.useAxis||t.useAxis)&&(this.shapes=this.shapes.concat(Jj.GraphAxis(this.shapeFactory,n,t,s)));for(var c=0;c=t.length&&(r%=t.length);var l=t[r][0],u=t[r][1],c=(new FC).getLinearGradient(a,0,s,0,[[0,l],[1,u]]);o.style.color=c}}}}])&&tk(t.prototype,r),n&&tk(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function sk(e){"@babel/helpers - typeof";return(sk="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function lk(e,t){for(var r=0;rt[1])return;var a=this.calculateXShapeInfo();if(a){var s=a.xPositions,l=a.width;(void 0===e.useBackground||e.useBackground)&&this.shapes.push(Jj.Background(this.shapeFactory,this.chartBox,e)),(!e.axis3DParameter||isNaN(e.axis3DParameter)||e.axis3DParameter<15)&&(e.axis3DParameter=20),(void 0===e.useAxis||e.useAxis)&&(this.shapes=this.shapes.concat(Jj.GraphAxis(this.shapeFactory,r,e,a)));for(var u=e.bar3DParameter&&!isNaN(e.bar3DParameter)?e.bar3DParameter:10,c=0;c=s[2]||s[1]<=s[3])&&(this.DVBOrigonPoint=[s[0],s[3]],this.DVBWidth=Math.abs(s[2]-s[0]),this.DVBHeight=Math.abs(s[1]-s[3]),this.DVBCenterPoint=[this.DVBOrigonPoint[0]+this.DVBWidth/2,this.DVBOrigonPoint[1]+this.DVBHeight/2],this.origonPointOffset=[this.DVBOrigonPoint[0]-o[0],this.DVBOrigonPoint[1]-o[1]],!0)}}])&&dk(t.prototype,r),n&&dk(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Sk(e){"@babel/helpers - typeof";return(Sk="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ok(e,t){for(var r=0;r0?this.DVBUnitValue=e.maxR/(o[1]-o[0]):this.DVBUnitValue=e.maxR;var i=this.DVBUnitValue,a=n[0]*i+e.minR;if(this.width=2*a,this.height=2*a,this.initBaseParameter()&&(!o||!(n[0]o[1]))){var s=this.DVBCenterPoint,l=new nE(s[0],s[1],a);l.style=Jj.ShapeStyleTool(null,e.circleStyle,null,null,0),void 0!==e.fillColor?l.style.fillColor=e.fillColor:l.style.fillColor="#ff9277",l.highlightStyle=Jj.ShapeStyleTool(null,e.circleHoverStyle),void 0!==e.circleHoverAble&&(l.hoverable=e.circleHoverAble),void 0!==e.circleClickAble&&(l.clickable=e.circleClickAble),l.refDataID=this.data.id,l.dataInfo={field:this.fields[0],r:a,value:n[0]},this.shapes.push(this.shapeFactory.createShape(l)),this.shapesConvertToRelativeCoordinate()}}}])&&Ok(t.prototype,r),n&&Ok(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function Ek(e){"@babel/helpers - typeof";return(Ek="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function jk(e,t){for(var r=0;rr[1])return null;a=l[f],s=t[1]-(o[f]-r[0])/n;var h=new lT(a,s);h.style=Jj.ShapeStyleTool({fillColor:"#ee9900"},e.pointStyle,e.pointStyleByFields,e.pointStyleByCodomain,f,o[f]),h.highlightStyle=Jj.ShapeStyleTool(null,e.pointHoverStyle),void 0!==e.pointHoverAble&&(h.hoverable=e.pointHoverAble),void 0!==e.pointClickAble&&(h.clickable=e.pointClickAble),h.refDataID=this.data.id,h.dataInfo={field:this.fields[f],value:o[f]},c.push(this.shapeFactory.createShape(h));var y=[a,s];u.push(y)}var d=new dT(u);d.style=Jj.ShapeStyleTool({strokeColor:"#ee9900"},e.lineStyle),d.clickable=!1,d.hoverable=!1;var v=this.shapeFactory.createShape(d);this.shapes.push(v),this.shapes=this.shapes.concat(c),this.shapesConvertToRelativeCoordinate()}}}}},{key:"calculateXShapeInfo",value:function(){var e,t=this.dataViewBox,r=this.setting,n=this.dataValues.length;if(n<1)return null;var o=[],i=this.DVBWidth,a=0;if(r.xShapeBlank&&r.xShapeBlank.length&&2==r.xShapeBlank.length){var s=i-((e=r.xShapeBlank)[0]+e[1]);if(s<=n)return null;a=s/(n-1)}else e=[a=i/(n+1),a,a];for(var l=0,u=0;un[1])return;for(var i=0,a=0;a=360&&(c=359.9999999);var d=new DT(l[0],l[1],p,u,c);if(void 0===e.sectorStyleByFields){var v=h%t.length;d.style=Jj.ShapeStyleTool(null,e.sectorStyle,t,null,v)}else d.style=Jj.ShapeStyleTool(null,e.sectorStyle,e.sectorStyleByFields,e.sectorStyleByCodomain,h,r[h]);d.highlightStyle=Jj.ShapeStyleTool(null,e.sectorHoverStyle),void 0!==e.sectorHoverAble&&(d.hoverable=e.sectorHoverAble),void 0!==e.sectorClickAble&&(d.clickable=e.sectorClickAble),d.refDataID=this.data.id,d.dataInfo={field:this.fields[h],value:r[h]},this.shapes.push(this.shapeFactory.createShape(d)),u=c}this.shapesConvertToRelativeCoordinate()}}}}])&&Dk(t.prototype,r),n&&Dk(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}();function zk(e){"@babel/helpers - typeof";return(zk="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Vk(e,t){for(var r=0;rr[1])return null;a=l[u],s=t[1]-(o[u]-r[0])/n;var f=new lT(a,s);f.style=Jj.ShapeStyleTool({fillColor:"#ee9900"},e.pointStyle,e.pointStyleByFields,e.pointStyleByCodomain,u,o[u]),f.highlightStyle=Jj.ShapeStyleTool(null,e.pointHoverStyle),void 0!==e.pointHoverAble&&(f.hoverable=e.pointHoverAble),void 0!==e.pointClickAble&&(f.clickable=e.pointClickAble),f.refDataID=this.data.id,f.dataInfo={field:this.fields[u],value:o[u]},this.shapes.push(this.shapeFactory.createShape(f))}this.shapesConvertToRelativeCoordinate()}}}},{key:"calculateXShapeInfo",value:function(){var e,t=this.dataViewBox,r=this.setting,n=this.dataValues.length;if(n<1)return null;var o=[],i=this.DVBWidth,a=0;if(r.xShapeBlank&&r.xShapeBlank.length&&2==r.xShapeBlank.length){var s=i-((e=r.xShapeBlank)[0]+e[1]);if(s<=n)return null;a=s/(n-1)}else e=[a=i/(n+1),a,a];for(var l=0,u=0;un[1])return;for(var i=0,a=0;a=0&&t.innerRingRadius0){var u=i[i.length-1];if(Math.abs(u[0]-n[0])<=a&&Math.abs(u[1]-n[1])<=a)continue}i.push(n)}if(i.length<2)return null;var c=new Object;(c=fe.copyAttributesWithClip(c,this.style,["pointList"])).pointList=i;var f=new Sj({style:c,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(f.highlightStyle=this.highlightStyle),f.refOriginalPosition=this.location,f.refDataID=this.data.id,f.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&fe.copyAttributesWithClip(f,this.shapeOptions),this.shapes.push(f)}},{key:"multiPointToTF",value:function(e){for(var t=e.components,r=[],n=[],o=this.location,i=[],a=this.nodesClipPixel,s=0;s0){var u=i[i.length-1];if(Math.abs(u[0]-n[0])<=a&&Math.abs(u[1]-n[1])<=a)continue}i.push(n);var c=new Object;c.r=6,(c=fe.copyAttributesWithClip(c,this.style)).x=n[0],c.y=n[1];var f=new WE({style:c,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(f.highlightStyle=this.highlightStyle),f.refOriginalPosition=o,f.refDataID=this.data.id,f.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&fe.copyAttributesWithClip(f,this.shapeOptions),this.shapes.push(f)}}},{key:"multiLineStringToTF",value:function(e){for(var t=e.components,r=0;r0){var p=i[i.length-1];if(Math.abs(p[0]-n[0])<=l&&Math.abs(p[1]-n[1])<=l)continue}i.push(n)}}else{a=[];for(var h=0;h0){var y=a[a.length-1];if(Math.abs(y[0]-n[0])<=l&&Math.abs(y[1]-n[1])<=l)continue}a.push(n)}}a.length<2||s.push(a)}if(!(i.length<2)){var d={};(d=fe.copyAttributesWithClip(d,this.style,["pointList"])).pointList=i;var v=new yj({style:d,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(v.highlightStyle=this.highlightStyle),v.refOriginalPosition=this.location,v.refDataID=this.data.id,v.isHoverByRefDataID=this.isMultiHover,s.length>0&&(v.holePolygonPointLists=s),this.shapeOptions&&fe.copyAttributesWithClip(v,this.shapeOptions),this.shapes.push(v)}}},{key:"rectangleToTF",value:function(e){var t=this.location,r=new de(e.x,e.y),n=this.layer.map.getResolution(),o=this.getLocalXY(r),i=new Object;i.r=6,(i=fe.copyAttributesWithClip(i,this.style)).x=o[0]-t[0],i.y=o[1]-t[1]-2*e.width/n,i.width=e.width/n,i.height=e.height/n;var a=new Nj({style:i,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(a.highlightStyle=this.highlightStyle),a.refOriginalPosition=t,a.refDataID=this.data.id,a.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&fe.copyAttributesWithClip(a,this.shapeOptions),this.shapes.push(a)}},{key:"geoTextToTF",value:function(e){var t=this.location,r=this.getLocalXY(e),n=new Object;n.r=6,(n=fe.copyAttributesWithClip(n,this.style,["x","y","text"])).x=r[0]-t[0],n.y=r[1]-t[1],n.text=e.text;var o=new ej({style:n,clickable:this.isClickAble,hoverable:this.isHoverAble});this.highlightStyle&&(o.highlightStyle=this.highlightStyle),o.refOriginalPosition=t,o.refDataID=this.data.id,o.isHoverByRefDataID=this.isMultiHover,this.shapeOptions&&fe.copyAttributesWithClip(o,this.shapeOptions),this.shapes.push(o)}},{key:"updateAndAddShapes",value:function(){var e=this.getLocalXY(this.lonlat);this.location=e;for(var t=this.layer.renderer,r=0,n=this.shapes.length;r0}},{key:"addRoot",value:function(e){e instanceof bM&&e.addChildrenToStorage(this),this.addToMap(e),this._roots.push(e)}},{key:"delRoot",value:function(e){if(void 0===e){for(var t=0;t=0&&(this.delFromMap(i.id),this._roots.splice(a,1),i instanceof bM&&i.delChildrenFromStorage(this))}}},{key:"addToMap",value:function(e){return e instanceof bM&&(e._storage=this),e.modSelf(),this._elements[e.id]=e,this}},{key:"get",value:function(e){return this._elements[e]}},{key:"delFromMap",value:function(e){var t=this._elements[e];return t&&(delete this._elements[e],t instanceof bM&&(t._storage=null)),this}},{key:"dispose",value:function(){this._elements=null,this._roots=null,this._hoverElements=null}}])&&gM(t.prototype,r),n&&gM(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function SM(e){"@babel/helpers - typeof";return(SM="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function OM(e,t){return(OM=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _M(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}();return function(){var r,n=PM(e);if(t){var o=PM(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return function(e,t){if(t&&("object"===SM(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(this,r)}}function PM(e){return(PM=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function xM(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function CM(e,t){for(var r=0;r0&&e>this._zlevelList[0]){for(o=0;oe);o++);n=this._layers[this._zlevelList[o]]}this._zlevelList.splice(o+1,0,e),t=new jM(fe.createUniqueID("_levelLayer_"+e),this);var i=n?n.dom:this._bgDom;i.nextSibling?i.parentNode.insertBefore(t.dom,i.nextSibling):i.parentNode.appendChild(t.dom),t.initContext(),this._layers[e]=t,this._layerConfig[e]&&(new DC).merge(t,this._layerConfig[e],!0),t.updateTransform()}return t}},{key:"getLayers",value:function(){return this._layers}},{key:"_updateLayerStatus",value:function(e){var t=this._layers,r={};for(var n in t)"hover"!==n&&(r[n]=t[n].elCount,t[n].elCount=0);for(var o=0;o0?1.1:1/1.1,r=this.painter.getLayers(),n=!1;for(var o in r)if("hover"!==o){var i=r[o],a=i.position;if(i.zoomable){i.__zoom=i.__zoom||1;var s=i.__zoom;s*=t,t=(s=Math.max(Math.min(i.maxZoom,s),i.minZoom))/i.__zoom,i.__zoom=s,a[0]-=(this._mouseX-a[0])*(t-1),a[1]-=(this._mouseY-a[1])*(t-1),i.scale[0]*=t,i.scale[1]*=t,i.dirty=!0,n=!0}}n&&this.painter.refresh(),this._dispatchAgency(this._lastHover,OE.EVENT.MOUSEWHEEL,e),this._mousemoveHandler(e)},mousemove:function(e){this._clickThreshold++,e=this._zrenderEventFixed(e),this._lastX=this._mouseX,this._lastY=this._mouseY,this._mouseX=kE.Util_event.getX(e),this._mouseY=kE.Util_event.getY(e);var t=this._mouseX-this._lastX,r=this._mouseY-this._lastY;this._processDragStart(e),this._hasfound=0,this._event=e,this._iterateAndFindHover(),this._hasfound||((!this._draggingTarget||this._lastHover&&this._lastHover!=this._draggingTarget)&&(this._processOutShape(e),this._processDragLeave(e)),this._lastHover=null,this.storage.delHover(),this.painter.clearHover());var n="";if(this._draggingTarget)this.storage.drift(this._draggingTarget.id,t,r),this._draggingTarget.modSelf(),this.storage.addHover(this._draggingTarget);else if(this._isMouseDown){var o=this.painter.getLayers(),i=!1;for(var a in o)if("hover"!==a){var s=o[a];s.panable&&(n="move",s.position[0]+=t,s.position[1]+=r,i=!0,s.dirty=!0)}i&&this.painter.refresh()}this._draggingTarget||this._hasfound&&this._lastHover.draggable?n="move":this._hasfound&&this._lastHover.clickable&&(n="pointer"),this.root.style.cursor=n,this._dispatchAgency(this._lastHover,OE.EVENT.MOUSEMOVE,e),(this._draggingTarget||this._hasfound||this.storage.hasHoverShape())&&this.painter.refreshHover()},mouseout:function(e){var t=(e=this._zrenderEventFixed(e)).toElement||e.relatedTarget;if(t!=this.root)for(;t&&9!=t.nodeType;){if(t==this.root)return void this._mousemoveHandler(e);t=t.parentNode}e.zrenderX=this._lastX,e.zrenderY=this._lastY,this.root.style.cursor="",this._isMouseDown=0,this._processOutShape(e),this._processDrop(e),this._processDragEnd(e),this.painter.refreshHover(),this.dispatch(OE.EVENT.GLOBALOUT,e)},mousedown:function(e){if(this._clickThreshold=0,2==this._lastDownButton)return this._lastDownButton=e.button,void(this._mouseDownTarget=null);this._lastMouseDownMoment=new Date,e=this._zrenderEventFixed(e),this._isMouseDown=1,this._mouseDownTarget=this._lastHover,this._dispatchAgency(this._lastHover,OE.EVENT.MOUSEDOWN,e),this._lastDownButton=e.button},mouseup:function(e){e=this._zrenderEventFixed(e),this.root.style.cursor="",this._isMouseDown=0,this._mouseDownTarget=null,this._dispatchAgency(this._lastHover,OE.EVENT.MOUSEUP,e),this._processDrop(e),this._processDragEnd(e)},touchstart:function(e){e=this._zrenderEventFixed(e,!0),this._lastTouchMoment=new Date,this._mobildFindFixed(e),this._mousedownHandler(e)},touchmove:function(e){e=this._zrenderEventFixed(e,!0),this._mousemoveHandler(e),this._isDragging&&kE.Util_event.stop(e)},touchend:function(e){e=this._zrenderEventFixed(e,!0),this._mouseupHandler(e);var t=new Date;t-this._lastTouchMoment=0;o--){var i=r[o];if(void 0!==i.zlevel&&(e=this.painter.getLayer(i.zlevel,e),n[0]=this._mouseX,n[1]=this._mouseY,e.needTransform&&(kE.Util_matrix.invert(t,e.transform),kE.Util_vector.applyTransform(n,n,t))),this._findHover(i,n[0],n[1]))break}}},{key:"_mobildFindFixed",value:function(e){var t=[{x:10},{x:-20},{x:10,y:10},{y:-20}];this._lastHover=null,this._mouseX=e.zrenderX,this._mouseY=e.zrenderY,this._event=e,this._iterateAndFindHover();for(var r=0;!this._lastHover&&r=0&&this._clips.splice(t,1)}},{key:"_update",value:function(){for(var e=(new Date).getTime(),t=e-this._time,r=this._clips,n=r.length,o=[],i=[],a=0;a=0&&!(d[w]<=a);w--);w=Math.min(w,u-2)}else{for(w=C;wa);w++);w=Math.min(w-1,u-2)}C=w,T=a;var s=d[w+1]-d[w];if(0!==s){var c,y;for(S=(a-d[w])/s,i?(_=v[w],O=v[0===w?w:w-1],P=v[w>u-2?u-1:w+1],x=v[w>u-3?u-1:w+2],f?QM._catmullRomInterpolateArray(O,_,P,x,S,S*S,S*S*S,n(e,l),h):(c=p?QM.rgba2String(E):QM._catmullRomInterpolate(O,_,P,x,S,S*S,S*S*S),r(e,l,c))):f?QM._interpolateArray(v[w],v[w+1],S,n(e,l),h):(p?(QM._interpolateArray(v[w],v[w+1],S,E,1),y=QM.rgba2String(E)):y=QM._interpolateNumber(v[w],v[w+1],S),r(e,l,y)),w=0;w1&&void 0!==arguments[1]?arguments[1]:"warring";"success"===t?(this.icon.setAttribute("class","supermapol-icons-message-success"),this.messageBoxContainer.setAttribute("class","component-messageboxcontainer component-border-bottom-green")):"failure"===t?(this.icon.setAttribute("class","supermapol-icons-message-failure"),this.messageBoxContainer.setAttribute("class","component-messageboxcontainer component-border-bottom-red")):"warring"===t&&(this.icon.setAttribute("class","supermapol-icons-message-warning"),this.messageBoxContainer.setAttribute("class","component-messageboxcontainer component-border-bottom-orange")),this.messageBox.innerHTML=e,this.messageBoxContainer.hidden=!1}}])&&iR(t.prototype,r),n&&iR(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),sR=function(){try{return echarts}catch(e){return{}}}(),lR=r.n(sR),uR={"en-US":{title_dataFlowService:"Data Flow Service",title_distributedAnalysis:"Distributed Analysis",title_clientComputing:"Client Computing",title_dataServiceQuery:"Data Service Query",title_searchCity:"Search city",title_searchLayer:" Search layer",text_input_value_inputDataFlowUrl:"Please enter the data stream service address such as: ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe",text_displayFeaturesInfo:"Display feature information",text_subscribe:"subscribe",text_cancelSubscribe:"unsubscribe",text_densityAnalysis:"Density Analysis",text_CalculateTheValuePerUnitArea:"Calculate the value per unit area within the neighborhood shape",text_option_selectDataset:"Please select a dataset",text_label_dataset:"Dataset",text_option_simplePointDensityAnalysis:"Simple point density analysis",text_option_nuclearDensityAnalysis:"Nuclear density analysis",text_label_analyticalMethod:"Analytical method",text_option_quadrilateral:"Quadrilateral",text_option_hexagon:"hexagon",text_label_meshType:"Mesh type",text_option_notSet:"Not set",text_label_weightField:"Weight field",text_label_gridSizeInMeters:"Grid size",text_label_searchRadius:"Search radius",text_label_queryRange:"Scope of analysis",text_label_areaUnit:"Area unit",text_option_equidistantSegmentation:"Equidistant segmentation",text_option_logarithm:"Logarithm",text_option_equalCountingSegment:"Equal counting segment",text_option_squareRootSegmentation:"Square root segmentation",text_label_thematicMapSegmentationMode:"Thematic map segmentation mode",text_label_thematicMapSegmentationParameters:"Thematic map segmentation parameters",text_option_greenOrangePurpleGradient:"Green orange purple gradient",text_option_greenOrangeRedGradient:"Green orange red gradient",text_option_rainbowGradient:"Rainbow gradient",text_option_spectralGradient:"Spectral gradient",text_option_terrainGradient:"Terrain gradient",text_label_thematicMapColorGradientMode:"Thematic map color gradient mode",text_label_resultLayerName:"Result layer name",text_chooseFile:"Open File",text_isoline:"Isoline",text_extractDiscreteValue:"Extract discrete value generation curve",text_buffer:"Buffer",text_specifyTheDistance:"Specify the distance to create the surrounding area",text_label_analysisLayer:"Analysis layer",text_label_extractField:"Extract field",text_label_extractedValue:"Extracted value",text_label_distanceAttenuation:"Distance attenuation",text_label_gridSize:"gridSize",text_label_bufferRadius:"Buffer radius",text_label_defaultkilometers:"Default 10 kilometers",text_label_kilometer:"kilometer",text_label_unit:"unit",text_retainOriginal:"Retain original object field",text_mergeBuffer:"Merge buffer",text_label_color:"Color",text_label_buffer:"[Buffer]",text_label_isolines:"[Isolines]",text_label_queryRangeTips:"The default is the full range of input data. Example: -74.050, 40.650, -73.850, 40.850",text_label_queryModel:"Query mode",text_label_IDArrayOfFeatures:"ID array of features",text_label_maxFeatures:"The maximum number of features that can be returned",text_label_bufferDistance:"Buffer distance",text_label_queryRange1:"Query range",text_label_spatialQueryMode:"Spatial query mode",text_label_featureFilter:"Feature filter",text_label_geometricObject:"Geometric object",text_label_queryMode:"Query mode",text_label_searchTips:"Search for city locations or layer features",text_label_chooseSearchLayers:"Select a query layer",text_loadSearchCriteria:"Load search criteria",text_saveSearchCriteria:"Save search criteria",btn_analyze:"Analyze",btn_analyzing:"Analyzing",btn_emptyTheAnalysisLayer:"Empty the analysis layer",btn_cancelAnalysis:"Cancel",btn_query:"Query",btn_querying:"Querying",btn_emptyTheRresultLayer:"Clear all result layers","msg_dataReturnedIsEmpty.":"The request is successful and the data returned by the query is empty.",msg_dataFlowServiceHasBeenSubscribed:"The data stream service has been subscribed to.",msg_inputDataFlowUrlFirst:"Please enter the data stream service address first.",msg_datasetOrMethodUnsupport:"This dataset does not support this analysis type. Please reselect the dataset.",msg_selectDataset:"Please select a data set!",msg_setTheWeightField:"Please set the weight field!",msg_theFieldNotSupportAnalysis:"The field you currently select does not support analysis!",msg_resultIsEmpty:"The result of the analysis is empty!",msg_openFileFail:"Failed to open file!",msg_fileTypeUnsupported:"File format is not supported!",msg_fileSizeExceeded:"File size exceeded! The file size should not exceed 10M!",msg_dataInWrongGeoJSONFormat:"Wrong data format! Non standard GEOJSON format data!",msg_dataInWrongFormat:"Wrong data format! Non standard EXCEL, CSV or GEOJSON format data!",msg_searchKeywords:"Search keywords cannot be empty. Please enter your search criteria.",msg_searchGeocodeField:"Did not match the address matching service data!",msg_cityGeocodeField:"The address matching service of the current city is not configured.",msg_getFeatureField:"No related vector features found!",msg_dataflowservicesubscribed:"The data stream service has been subscribed to.",msg_subscribesucceeded:"The data stream service subscription was successful.",msg_crsunsupport:"Does not support the coordinate system of the current map",msg_tilematrixsetunsupport:"Incoming TileMatrixSet is not supported",msg_jsonResolveFiled:"JSON format parsing failure!",msg_requestContentFiled:"Failed to request data through iportal!",msg_getdatafailed:"Failed to get data!"},"zh-CN":{title_dataFlowService:"数据流服务",title_distributedAnalysis:"分布式分析",title_clientComputing:"客户端计算",title_dataServiceQuery:"数据服务查询",title_searchCity:"搜索城市",title_searchLayer:"搜索图层",text_input_value_inputDataFlowUrl:"请输入数据流服务地址如:ws://{serviceRoot}/{dataFlowName}/dataflow/subscribe",text_displayFeaturesInfo:"显示要素信息",text_subscribe:"订阅",text_cancelSubscribe:"取消订阅",text_densityAnalysis:"密度分析",text_CalculateTheValuePerUnitArea:"计算点指定邻域形状内的每单位面积量值",text_option_selectDataset:"请选择数据集",text_label_dataset:"数据集",text_option_simplePointDensityAnalysis:"简单点密度分析",text_option_nuclearDensityAnalysis:"核密度分析",text_label_analyticalMethod:"分析方法",text_option_quadrilateral:"四边形",text_option_hexagon:"六边形",text_label_meshType:"网格面类型",text_option_notSet:"未设置",text_label_weightField:"权重字段",text_label_gridSizeInMeters:"网格大小",text_label_searchRadius:"搜索半径",text_label_queryRange:"分析范围",text_label_areaUnit:"面积单位",text_option_equidistantSegmentation:"等距离分段",text_option_logarithm:"对数",text_option_equalCountingSegment:"等计数分段",text_option_squareRootSegmentation:"平方根分段",text_label_thematicMapSegmentationMode:"专题图分段模式",text_label_thematicMapSegmentationParameters:"专题图分段参数",text_option_greenOrangePurpleGradient:"绿橙紫渐变",text_option_greenOrangeRedGradient:"绿橙红渐变",text_option_rainbowGradient:"彩虹渐变",text_option_spectralGradient:"光谱渐变",text_option_terrainGradient:"地形渐变",text_label_thematicMapColorGradientMode:"专题图颜色渐变模式",text_label_resultLayerName:"结果图层名称",text_chooseFile:"选择文件",text_isoline:"等值线",text_extractDiscreteValue:"提取离散值生成曲线",text_buffer:"缓冲区",text_specifyTheDistance:"指定距离创建周边区域",text_label_analysisLayer:"分析图层",text_label_extractField:"提取字段",text_label_extractedValue:"提取值",text_label_distanceAttenuation:"距离衰减",text_label_gridSize:"栅格大小",text_label_bufferRadius:"缓冲半径",text_label_defaultkilometers:"默认10千米",text_option_kilometer:"千米",text_label_unit:"单位",text_retainOriginal:"保留原对象字段属性",text_mergeBuffer:"合并缓冲区",text_label_color:"颜色",text_label_buffer:"[缓冲区]",text_label_isolines:"[等值线]",text_label_queryRangeTips:"默认为输入数据的全幅范围。范例:-74.050,40.650,-73.850,40.850",text_label_IDArrayOfFeatures:"要素 ID 数组",text_label_maxFeatures:"最多可返回的要素数量",text_label_bufferDistance:"缓冲区距离",text_label_queryRange1:"查询范围",text_label_spatialQueryMode:"空间查询模式",text_label_featureFilter:"要素过滤器",text_label_geometricObject:"几何对象",text_label_queryMode:"查询模式",text_label_searchTips:"搜索城市地点或图层要素",text_label_chooseSearchLayers:"选择查询图层",text_loadSearchCriteria:"加载搜索条件",text_saveSearchCriteria:"保存搜索条件",btn_analyze:"分析",btn_analyzing:"分析中",btn_emptyTheAnalysisLayer:"清空分析图层",btn_cancelAnalysis:"取消",btn_query:"查询",btn_querying:"查询中",btn_emptyTheRresultLayer:"清除所有结果图层",msg_dataFlowServiceHasBeenSubscribed:"已订阅该数据流服务。",msg_inputDataFlowUrlFirst:"请先输入数据流服务地址。",msg_datasetOrMethodUnsupport:"该数据集不支持本分析类型,请重新选择数据集",msg_selectDataset:"请选择数据集!",msg_setTheWeightField:"请设置权重字段!",msg_theFieldNotSupportAnalysis:"您当前选择的字段不支持分析!",msg_resultIsEmpty:"分析的结果为空!",msg_dataReturnedIsEmpty:"请求成功,查询返回的数据为空。",msg_openFileFail:"打开文件失败!",msg_fileTypeUnsupported:"不支持该文件格式!",msg_fileSizeExceeded:"文件大小超限!文件大小不得超过 10M!",msg_dataInWrongGeoJSONFormat:"数据格式错误!非标准的 GEOJSON 格式数据!",msg_dataInWrongFormat:"数据格式错误!非标准的 EXCEL, CSV 或 GEOJSON 格式数据!",msg_searchKeywords:"搜索关键字不能为空,请输入搜索条件。",msg_searchGeocodeField:"未匹配到地址匹配服务数据!",msg_cityGeocodeField:"未配置当前城市的地址匹配服务。",msg_getFeatureField:"未查找到相关矢量要素!",msg_dataflowservicesubscribed:"已订阅该数据流服务。",msg_subscribesucceeded:"数据流服务订阅成功。",msg_crsunsupport:"不支持当前地图的坐标系",msg_tilematrixsetunsupport:"不支持传入的TileMatrixSet",msg_jsonResolveFiled:"json格式解析失败!",msg_requestContentFiled:"通过iportal请求数据失败!",msg_getdatafailed:"获取数据失败!"},code:null,defaultCode:"en-US",getCode:function(){return uR.code||uR.setCode(),uR.code},setCode:function(){var e=this.getLanguageFromCookie();e?uR.code=e:(e=uR.defaultCode,0===(e="Netscape"===navigator.appName?navigator.language:navigator.browserLanguage).indexOf("zh")&&(e="zh-CN"),0===e.indexOf("en")&&(e="en-US"),uR.code=e)},getLanguageFromCookie:function(){for(var e=document.cookie.split(";"),t=0;t0){var a=i.SheetNames[0],s=fR().utils.sheet_to_csv(i.Sheets[a]);t&&t.call(n,s)}}catch(e){r&&r.call(n,e)}},o.onerror=function(e){r&&r.call(n,e)},this.rABF&&o.readAsArrayBuffer(e.file)},processDataToGeoJson:function(e,t,r,n,o){var i=null;if("EXCEL"===e||"CSV"===e)i=this.processExcelDataToGeoJson(t),r&&r.call(o,i);else if("JSON"===e||"GEOJSON"===e){var a=t;"string"==typeof a&&(a=JSON.parse(a)),"ISERVER"===a.type?i=a.data.recordsets[0].features:"FeatureCollection"===a.type?i=a:n&&n.call(o,uR.i18n("msg_dataInWrongGeoJSONFormat")),r&&r.call(o,i)}else n&&n.call(o,uR.i18n("msg_dataInWrongFormat"))},processExcelDataToGeoJson:function(e){for(var t=this.string2Csv(e),r=t.colTitles,n=-1,o=-1,i=0,a=r.length;i0?(n.dataItemServices.forEach(function(n){if("RESTDATA"===n.serviceType&&"PUBLISHED"===n.serviceStatus)o=n;else{if("RESTMAP"!==n.serviceType||"PUBLISHED"!==n.serviceStatus)return void r.getDatafromContent(e,t);o=n}}),o&&r.getDatafromRest(o.serviceType,o.address,t)):r.getDatafromContent(e,t):r._fireFailedEvent(n)}).catch(function(e){console.log(e),r._fireFailedEvent(e)})}},{key:"getDatafromContent",value:function(e,t){var r=this,n={result:{}},o=this;e+="/content.json?pageSize=9999999¤tPage=1",sn.get(e,null,{withCredentials:this.datasets.withCredentials}).then(function(e){return e.json()}).then(function(e){if(!1!==e.succeed){if(e.type){if("JSON"===e.type||"GEOJSON"===e.type){if(e.content=JSON.parse(e.content.trim()),!e.content.features)return void console.log(uR.i18n("msg_jsonResolveFiled"));var i=r._formatGeoJSON(e.content);n.result.features={type:e.content.type,features:i}}else if("EXCEL"===e.type||"CSV"===e.type){var a=r._excelData2Feature(e.content);n.result.features={type:"FeatureCollection",features:a}}t(n,"content")}}else o._fireFailedEvent(e)},this).catch(function(e){console.log(e),o._fireFailedEvent(e)})}},{key:"getDatafromRest",value:function(e,t,r){var n=this,o=this.datasets.withCredentials;if("RESTDATA"===e){var i,a,s="".concat(t,"/data/datasources");sn.get(s,null,{withCredentials:o}).then(function(e){return e.json()}).then(function(e){i=e.datasourceNames[0],s="".concat(t,"/data/datasources/").concat(i,"/datasets"),sn.get(s,null,{withCredentials:o}).then(function(e){return e.json()}).then(function(e){return a=e.datasetNames[0],n.getDatafromRestData("".concat(t,"/data"),[i+":"+a],r),[i+":"+a]}).catch(function(e){n._fireFailedEvent(e)})}).catch(function(e){n._fireFailedEvent(e)})}else{var l,u,c,f="".concat(t,"/maps");sn.get(f,null,{withCredentials:o}).then(function(e){return e.json()}).then(function(e){l=e[0].name,c=e[0].path,f=f="".concat(t,"/maps/").concat(l,"/layers"),sn.get(f,null,{withCredentials:o}).then(function(e){return e.json()}).then(function(e){return u=e[0].subLayers.layers[0].caption,n.getDatafromRestMap(u,c,r),u}).catch(function(e){n._fireFailedEvent(e)})}).catch(function(e){n._fireFailedEvent(e)})}}},{key:"getDatafromRestData",value:function(e,t,r){var n=this;this.datasets.queryInfo.attributeFilter=this.datasets.queryInfo.attributeFilter||"SmID>0",this._getFeatureBySQL(e,t,this.datasets.queryInfo,function(e){r(e,"RESTDATA")},function(e){console.log(e),n._fireFailedEvent(e)})}},{key:"getDatafromRestMap",value:function(e,t,r){var n=this;this.datasets.queryInfo.attributeFilter=this.datasets.queryInfo.attributeFilter||"smid=1",this._queryFeatureBySQL(t,e,this.datasets.queryInfo,null,null,function(e){r(e,"RESTMAP")},function(e){console.log(e),n._fireFailedEvent(e)})}},{key:"_getFeatureBySQL",value:function(e,t,r,n,o){var i,a,s={name:t.join().replace(":","@")};Object.assign(s,r),i=new ci(s),a=new Vh({queryParameter:i,datasetNames:t,fromIndex:0,toIndex:1e5,returnContent:!0}),new Xh(e,{eventListeners:{processCompleted:function(e){n&&n(e)},processFailed:function(e){o&&o(e)}}}).processAsync(a)}},{key:"_queryFeatureBySQL",value:function(e,t,r,n,o,a,s,l,u,c){var f,p,h={name:t};Object.assign(h,r),f=new ci(h),n&&(f.fields=n);var y={queryParams:[f]};c&&(y.queryOption=i.ATTRIBUTE),l&&(y.startRecord=l),u&&(y.expectCount=u),o&&(y.prjCoordSys={epsgCode:o}),p=new sw(y),this._queryBySQL(e,p,function(e){"processCompleted"===e.type?a(e):s(e)})}},{key:"_queryBySQL",value:function(e,t,r,n){new yw(e,{eventListeners:{scope:this,processCompleted:r,processFailed:r},format:this._processFormat(n)}).processAsync(t)}},{key:"_processFormat",value:function(e){return e||t.GEOJSON}},{key:"_formatGeoJSON",value:function(e){var t=e.features;return t.forEach(function(e,t){e.properties.index=t}),t}},{key:"_excelData2Feature",value:function(e){for(var t=e.colTitles,r=-1,n=-1,o=0,i=t.length;o=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(s)throw i}}}}function vR(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&e.forEach(function(e){e.xAxis&&t.xField.push({field:e.xAxis.field,name:e.xAxis.name}),e.yAxis&&t.yField.push({field:e.yAxis.field,name:e.yAxis.name})})}},{key:"getDatasetInfo",value:function(e){var t=this;this.createChart=e,this.datasets&&this._checkUrl(this.datasets.url)&&(this.chartModel=new yR(this.datasets),"iServer"===this.datasets.type?this.chartModel.getDatasetInfo(this._getDatasetInfoSuccess.bind(this)):"iPortal"===this.datasets.type&&this.chartModel.getDataInfoByIptl(this._getDataInfoSuccess.bind(this)),this.chartModel.events.on({getdatafailed:function(e){t.events.triggerEvent("getdatafailed",e)}}))}},{key:"_getDatasetInfoSuccess",value:function(e){var t=this.datasets.url,r=t.indexOf("rest");if(r>0){var n=t.indexOf("/",r+5),o=t.substring(r+5,n),i=t.substring(0,r+4)+"/data";if("maps"===o){var a=t.indexOf("/",n+1),s=t.substring(n+1,a);i=t.substring(0,r+4)+"/maps/"+s,e.result.dataUrl=i,this._getLayerFeatures(e)}else"data"===o&&(e.result.dataUrl=i,this._getDataFeatures(e))}}},{key:"_getDataInfoSuccess",value:function(e,t){"RESTMAP"===t?this._getChartDatasFromLayer(e):this._getChartDatas(e)}},{key:"_getDataFeatures",value:function(e){this.chartModel.getDataFeatures(e,this._getChartDatas.bind(this))}},{key:"_getLayerFeatures",value:function(e){this.chartModel.getLayerFeatures(e,this._getChartDatasFromLayer.bind(this))}},{key:"_getChartDatas",value:function(e){if(e){this.features=e.result.features;var t=this.features.features,r={};if(t.length){var n=t[0],o=[],i=[];for(var a in n.properties)o.push(a),i.push(this._getDataType(n.properties[a]));for(var s in r={features:t,fieldCaptions:o,fieldTypes:i,fieldValues:[]},i){var l=[];for(var u in t){var c=t[u],f=r.fieldCaptions[s],p=c.properties[f];l.push(p)}r.fieldValues.push(l)}this.createChart(r)}}}},{key:"_getChartDatasFromLayer",value:function(e){if(e.result.recordsets){var t=e.result.recordsets[0],r=t.features.features;this.features=t.features;var n={};if(r.length){for(var o in(n={features:t.features,fieldCaptions:t.fieldCaptions,fieldTypes:t.fieldTypes,fieldValues:[]}).fieldCaptions){var i=[];for(var a in r){var s=r[a],l=n.fieldCaptions[o],u=s.properties[l];i.push(u)}n.fieldValues.push(i)}this.createChart(n)}}}},{key:"_createChartOptions",value:function(e){return this.calculatedData=this._createChartDatas(e),this.updateChartOptions(this.chartType)}},{key:"changeType",value:function(e){if(e!==this.chartType)return this.chartType=e,this.updateChartOptions(this.chartType)}},{key:"updateData",value:function(e,t,r){this.updateChart=r,this.xField=[],this.yField=[],this._initXYField(t),e.type=e.type||"iServer",e.withCredentials=e.withCredentials||!1,this.datasets=e,this.getDatasetInfo(this._updateDataSuccess.bind(this))}},{key:"_updateDataSuccess",value:function(e){var t=this._createChartOptions(e);this.updateChart(t)}},{key:"updateChartOptions",value:function(e,t){if(this.calculatedData){var r=this.grid,n=this._createChartSeries(this.calculatedData,e),o=[];for(var i in this.calculatedData.XData)o.push({value:this.calculatedData.XData[i].fieldsData});var a={type:"category",name:this.xField[0].name||"X",data:o,nameTextStyle:{color:"#fff",fontSize:14},splitLine:{show:!1},axisLine:{lineStyle:{color:"#eee"}}},s={type:"value",name:this.yFieldName||"Y",data:{},nameTextStyle:{color:"#fff",fontSize:14},splitLine:{show:!1},axisLine:{lineStyle:{color:"#eee"}}},l={formatter:"{b0}: {c0}"},u="#404a59";return t&&(t.grid&&(r=t.grid),t.tooltip&&(l=t.tooltip),t.backgroundColor&&(u=t.backgroundColor)),{backgroundColor:u,grid:r,series:n,xAxis:a,yAxis:s,tooltip:l}}}},{key:"_createChartDatas",value:function(e){var t=0,r=[],n=e.fieldCaptions,o=this;n.forEach(function(e,r){o.xField[0]&&e===o.xField[0].field&&(t=r)}),this.yFieldName="",this.yField.forEach(function(e,t){0!==t&&(o.yFieldName=o.yFieldName+","),o.yFieldName=o.yFieldName+e.name,n.forEach(function(t,n){t===e.field&&r.push(n)})});var i=this._getAttrData(e,t),a=[];if(r.length>0)r.forEach(function(t){var r=[];for(var n in e.fieldValues[t])r.push({value:e.fieldValues[t][n]});a.push(r)});else{for(var s=[],l=[],u=i.length,c=0;c0;e--)this.header.removeChild(this.header.children[e]),this.content.removeChild(this.content.children[e])}},{key:"_changeTabsPage",value:function(e){for(var t=e.target.index,r=0;r0;t--)this.content.removeChild(this.content.children[t-1]);var r=this.config[e];for(var n in r)this._createCityItem(n,r[n])}},{key:"_createCityItem",value:function(e,t){var r=document.createElement("div"),n=document.createElement("div");n.setAttribute("class","component-citytabpag__py-key"),n.innerHTML=e,r.appendChild(n);var o=document.createElement("div");o.setAttribute("class","component-citytabpag__content");for(var i=0;i0&&this.appendTabs(e),this.rootContainer=t}},{key:"setTabs",value:function(e){this.removeAllTabs(),this.appendTabs(e)}},{key:"appendTabs",value:function(e){for(var t=0;t0;e--)this.navTabsTitle.removeChild(this.navTabsTitle.children[e]),this.navTabsContent.removeChild(this.navTabsContent.children[e])}},{key:"_changeTabsPage",value:function(e){for(var t=e.target.index,r=0;r=0;e--)this.content.removeChild(this.content.children[e])}},{key:"setPageLink",value:function(e){this.pageNumberLis=[],this.currentPageNumberLis=[],this.clearPageLink(),this._createPageLi(e),this._appendPageLink()}},{key:"_createPageLi",value:function(e){for(var t=0;t1;e--)this.link.removeChild(this.link.children[e])}},{key:"_createLink",value:function(e){for(var t=0;t<4;t++){var r=document.createElement("li");r.setAttribute("class","disable");var n=document.createElement("span");r.appendChild(n),0===t?(n.id="first",n.setAttribute("class","supermapol-icons-first")):1===t?(n.id="prev",n.setAttribute("class","supermapol-icons-prev")):2===t?(n.id="next",n.setAttribute("class","supermapol-icons-next")):3===t&&(n.id="last",n.setAttribute("class","supermapol-icons-last")),e.appendChild(r)}}},{key:"_changePageEvent",value:function(e){var t=e.target;if("disable"!==t.parentElement.classList[0]){var r;if(t.id)r=t.id;else{if(!Number(t.innerHTML))return;r=Number(t.innerHTML)}this._prePageNum(r),this.clearPageLink(),this._appendPageLink()}}},{key:"_changeDisableState",value:function(){this.link.children[0].setAttribute("class",""),this.link.children[1].setAttribute("class",""),this.link.children[this.link.children.length-1].setAttribute("class",""),this.link.children[this.link.children.length-2].setAttribute("class",""),1===this.currentPage&&(this.link.children[0].setAttribute("class","disable"),this.link.children[1].setAttribute("class","disable")),this.currentPage===this.pageNumberLis.length&&(this.link.children[this.link.children.length-1].setAttribute("class","disable"),this.link.children[this.link.children.length-2].setAttribute("class","disable"))}},{key:"_prePageNum",value:function(e){var t=[];if(this.currentPage="first"===e?1:"last"===e?this.pageNumberLis.length:"prev"===e?this.currentPage-1:"next"===e?this.currentPage+1:e,this.pageNumberLis.length<=5)for(var r=0;r=this.pageNumberLis.length-3)for(var o=this.pageNumberLis.length-5;o0&&(this.currentPageNumberLis=t)}}])&&bA(t.prototype,r),n&&bA(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}(),_A=function(e){return/^.*\.(?:xls|xlsx)$/i.test(e)?tR.EXCEL:/^.*\.(?:csv)$/i.test(e)?tR.CSV:/^.*\.(?:geojson|json)$/i.test(e)?tR.GEOJSON:null};function PA(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function xA(e){for(var t=1;t=this.text.length)return;e=this.text[this.place++]}switch(this.state){case eL:return this.neutral(e);case 2:return this.keyword(e);case 4:return this.quoted(e);case 5:return this.afterquote(e);case 3:return this.number(e);case-1:return}},aL.prototype.afterquote=function(e){if('"'===e)return this.word+='"',void(this.state=4);if(oL.test(e))return this.word=this.word.trim(),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in afterquote yet, index '+this.place)},aL.prototype.afterItem=function(e){return","===e?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=eL)):"]"===e?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=eL,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},aL.prototype.number=function(e){if(!iL.test(e)){if(oL.test(e))return this.word=parseFloat(this.word),void this.afterItem(e);throw new Error("havn't handled \""+e+'" in number yet, index '+this.place)}this.word+=e},aL.prototype.quoted=function(e){'"'!==e?this.word+=e:this.state=5},aL.prototype.keyword=function(e){if(nL.test(e))this.word+=e;else{if("["===e){var t=[];return t.push(this.word),this.level++,null===this.root?this.root=t:this.currentObject.push(t),this.stack.push(this.currentObject),this.currentObject=t,void(this.state=eL)}if(!oL.test(e))throw new Error("havn't handled \""+e+'" in keyword yet, index '+this.place);this.afterItem(e)}},aL.prototype.neutral=function(e){if(rL.test(e))return this.word=e,void(this.state=2);if('"'===e)return this.word="",void(this.state=4);if(iL.test(e))return this.word=e,void(this.state=3);if(!oL.test(e))throw new Error("havn't handled \""+e+'" in neutral yet, index '+this.place);this.afterItem(e)},aL.prototype.output=function(){for(;this.place0?90:-90),e.lat_ts=e.lat1)}(o),o}function hL(e){var t=this;if(2===arguments.length){var r=arguments[1];"string"==typeof r?"+"===r.charAt(0)?hL[e]=ZA(arguments[1]):hL[e]=pL(arguments[1]):hL[e]=r}else if(1===arguments.length){if(Array.isArray(e))return e.map(function(e){Array.isArray(e)?hL.apply(t,e):hL(e)});if("string"==typeof e){if(e in hL)return hL[e]}else"EPSG"in e?hL["EPSG:"+e.EPSG]=e:"ESRI"in e?hL["ESRI:"+e.ESRI]=e:"IAU2000"in e?hL["IAU2000:"+e.IAU2000]=e:console.log(e);return}}!function(e){e("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),e("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),e("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),e.WGS84=e["EPSG:4326"],e["EPSG:3785"]=e["EPSG:3857"],e.GOOGLE=e["EPSG:3857"],e["EPSG:900913"]=e["EPSG:3857"],e["EPSG:102113"]=e["EPSG:3857"]}(hL);var yL=hL;var dL=["PROJECTEDCRS","PROJCRS","GEOGCS","GEOCCS","PROJCS","LOCAL_CS","GEODCRS","GEODETICCRS","GEODETICDATUM","ENGCRS","ENGINEERINGCRS"];var vL=["3857","900913","3785","102113"];var mL=function(e){if(!function(e){return"string"==typeof e}(e))return e;if(function(e){return e in yL}(e))return yL[e];if(function(e){return dL.some(function(t){return e.indexOf(t)>-1})}(e)){var t=pL(e);if(function(e){var t=KA(e,"authority");if(t){var r=KA(t,"epsg");return r&&vL.indexOf(r)>-1}}(t))return yL["EPSG:3857"];var r=function(e){var t=KA(e,"extension");if(t)return KA(t,"proj4")}(t);return r?ZA(r):t}return function(e){return"+"===e[0]}(e)?ZA(e):void 0};function bL(e,t){var r,n;if(e=e||{},!t)return e;for(n in t)void 0!==(r=t[n])&&(e[n]=r);return e}function gL(e,t,r){var n=e*t;return r/Math.sqrt(1-n*n)}function wL(e){return e<0?-1:1}function SL(e){return Math.abs(e)<=WA?e:e-wL(e)*HA}function OL(e,t,r){var n=e*r,o=.5*e;return n=Math.pow((1-n)/(1+n),o),Math.tan(.5*(FA-t))/n}function _L(e,t){for(var r,n,o=.5*e,i=FA-2*Math.atan(t),a=0;a<=15;a++)if(r=e*Math.sin(i),i+=n=FA-2*Math.atan(t*Math.pow((1-r)/(1+r),o))-i,Math.abs(n)<=1e-10)return i;return-9999}function PL(e){return e}var xL=[{init:function(){var e=this.b/this.a;this.es=1-e*e,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=gL(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},forward:function(e){var t,r,n=e.x,o=e.y;if(o*JA>90&&o*JA<-90&&n*JA>180&&n*JA<-180)return null;if(Math.abs(Math.abs(o)-FA)<=zA)return null;if(this.sphere)t=this.x0+this.a*this.k0*SL(n-this.long0),r=this.y0+this.a*this.k0*Math.log(Math.tan(qA+.5*o));else{var i=Math.sin(o),a=OL(this.e,o,i);t=this.x0+this.a*this.k0*SL(n-this.long0),r=this.y0-this.a*this.k0*Math.log(a)}return e.x=t,e.y=r,e},inverse:function(e){var t,r,n=e.x-this.x0,o=e.y-this.y0;if(this.sphere)r=FA-2*Math.atan(Math.exp(-o/(this.a*this.k0)));else{var i=Math.exp(-o/(this.a*this.k0));if(-9999===(r=_L(this.e,i)))return null}return t=SL(this.long0+n/(this.a*this.k0)),e.x=t,e.y=r,e},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:PL,inverse:PL,names:["longlat","identity"]}],CL={},TL=[];function EL(e,t){var r=TL.length;return e.names?(TL[r]=e,e.names.forEach(function(e){CL[e.toLowerCase()]=r}),this):(console.log(t),!0)}var jL={start:function(){xL.forEach(EL)},add:EL,get:function(e){if(!e)return!1;var t=e.toLowerCase();return void 0!==CL[t]&&TL[CL[t]]?TL[CL[t]]:void 0}},kL={MERIT:{a:6378137,rf:298.257,ellipseName:"MERIT 1983"},SGS85:{a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},GRS80:{a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},IAU76:{a:6378140,rf:298.257,ellipseName:"IAU 1976"},airy:{a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},APL4:{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},NWL9D:{a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},mod_airy:{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},andrae:{a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},aust_SA:{a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},GRS67:{a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},bessel:{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},bess_nam:{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},clrk66:{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},clrk80:{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},clrk58:{a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},CPM:{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},delmbr:{a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},engelis:{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},evrst30:{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},evrst48:{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},evrst56:{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},evrst69:{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},evrstSS:{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},fschr60:{a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},fschr60m:{a:6378155,rf:298.3,ellipseName:"Fischer 1960"},fschr68:{a:6378150,rf:298.3,ellipseName:"Fischer 1968"},helmert:{a:6378200,rf:298.3,ellipseName:"Helmert 1906"},hough:{a:6378270,rf:297,ellipseName:"Hough"},intl:{a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},kaula:{a:6378163,rf:298.24,ellipseName:"Kaula 1961"},lerch:{a:6378139,rf:298.257,ellipseName:"Lerch 1979"},mprts:{a:6397300,rf:191,ellipseName:"Maupertius 1738"},new_intl:{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},plessis:{a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},krass:{a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},SEasia:{a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},walbeck:{a:6376896,b:6355834.8467,ellipseName:"Walbeck"},WGS60:{a:6378165,rf:298.3,ellipseName:"WGS 60"},WGS66:{a:6378145,rf:298.25,ellipseName:"WGS 66"},WGS7:{a:6378135,rf:298.26,ellipseName:"WGS 72"}},ML=kL.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};kL.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var RL={};RL.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},RL.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},RL.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},RL.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},RL.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},RL.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},RL.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},RL.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},RL.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},RL.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},RL.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},RL.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},RL.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},RL.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},RL.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},RL.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},RL.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};var AL=function(e,t,r,n,o,i,a){var s={};return s.datum_type=void 0===e||"none"===e?AA:RA,t&&(s.datum_params=t.map(parseFloat),0===s.datum_params[0]&&0===s.datum_params[1]&&0===s.datum_params[2]||(s.datum_type=jA),s.datum_params.length>3&&(0===s.datum_params[3]&&0===s.datum_params[4]&&0===s.datum_params[5]&&0===s.datum_params[6]||(s.datum_type=kA,s.datum_params[3]*=IA,s.datum_params[4]*=IA,s.datum_params[5]*=IA,s.datum_params[6]=s.datum_params[6]/1e6+1))),a&&(s.datum_type=MA,s.grids=a),s.a=r,s.b=n,s.es=o,s.ep2=i,s},LL={};function NL(e){if(0===e.length)return null;var t="@"===e[0];return t&&(e=e.slice(1)),"null"===e?{name:"null",mandatory:!t,grid:null,isNull:!0}:{name:e,mandatory:!t,grid:LL[e]||null,isNull:!1}}function DL(e){return e/3600*Math.PI/180}function IL(e,t,r){return String.fromCharCode.apply(null,new Uint8Array(e.buffer.slice(t,r)))}function FL(e){return e.map(function(e){return[DL(e.longitudeShift),DL(e.latitudeShift)]})}function BL(e,t,r){return{name:IL(e,t+8,t+16).trim(),parent:IL(e,t+24,t+24+8).trim(),lowerLatitude:e.getFloat64(t+72,r),upperLatitude:e.getFloat64(t+88,r),lowerLongitude:e.getFloat64(t+104,r),upperLongitude:e.getFloat64(t+120,r),latitudeInterval:e.getFloat64(t+136,r),longitudeInterval:e.getFloat64(t+152,r),gridNodeCount:e.getInt32(t+168,r)}}function GL(e,t,r,n){for(var o=t+176,i=[],a=0;a-1.001*FA)l=-FA;else if(l>FA&&l<1.001*FA)l=FA;else{if(l<-FA)return{x:-1/0,y:-1/0,z:e.z};if(l>FA)return{x:1/0,y:1/0,z:e.z}}return s>Math.PI&&(s-=2*Math.PI),o=Math.sin(l),a=Math.cos(l),i=o*o,{x:((n=r/Math.sqrt(1-t*i))+u)*a*Math.cos(s),y:(n+u)*a*Math.sin(s),z:(n*(1-t)+u)*o}}function qL(e,t,r,n){var o,i,a,s,l,u,c,f,p,h,y,d,v,m,b,g=e.x,w=e.y,S=e.z?e.z:0;if(o=Math.sqrt(g*g+w*w),i=Math.sqrt(g*g+w*w+S*S),o/r<1e-12){if(m=0,i/r<1e-12)return FA,b=-n,{x:e.x,y:e.y,z:e.z}}else m=Math.atan2(w,g);a=S/i,f=(s=o/i)*(1-t)*(l=1/Math.sqrt(1-t*(2-t)*s*s)),p=a*l,v=0;do{v++,u=t*(c=r/Math.sqrt(1-t*p*p))/(c+(b=o*f+S*p-c*(1-t*p*p))),d=(y=a*(l=1/Math.sqrt(1-u*(2-u)*s*s)))*f-(h=s*(1-u)*l)*p,f=h,p=y}while(d*d>1e-24&&v<30);return{x:m,y:Math.atan(y/Math.abs(h)),z:b}}function HL(e){return e===jA||e===kA}function WL(e,t,r){if(function(e,t){return e.datum_type===t.datum_type&&!(e.a!==t.a||Math.abs(e.es-t.es)>5e-11)&&(e.datum_type===jA?e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]:e.datum_type!==kA||e.datum_params[0]===t.datum_params[0]&&e.datum_params[1]===t.datum_params[1]&&e.datum_params[2]===t.datum_params[2]&&e.datum_params[3]===t.datum_params[3]&&e.datum_params[4]===t.datum_params[4]&&e.datum_params[5]===t.datum_params[5]&&e.datum_params[6]===t.datum_params[6])}(e,t))return r;if(e.datum_type===AA||t.datum_type===AA)return r;var n=e.a,o=e.es;if(e.datum_type===MA){if(0!==YL(e,!1,r))return;n=LA,o=DA}var i=t.a,a=t.b,s=t.es;if(t.datum_type===MA&&(i=LA,a=NA,s=DA),o===s&&n===i&&!HL(e.datum_type)&&!HL(t.datum_type))return r;if((r=JL(r,o,n),HL(e.datum_type)&&(r=function(e,t,r){if(t===jA)return{x:e.x+r[0],y:e.y+r[1],z:e.z+r[2]};if(t===kA){var n=r[0],o=r[1],i=r[2],a=r[3],s=r[4],l=r[5],u=r[6];return{x:u*(e.x-l*e.y+s*e.z)+n,y:u*(l*e.x+e.y-a*e.z)+o,z:u*(-s*e.x+a*e.y+e.z)+i}}}(r,e.datum_type,e.datum_params)),HL(t.datum_type)&&(r=function(e,t,r){if(t===jA)return{x:e.x-r[0],y:e.y-r[1],z:e.z-r[2]};if(t===kA){var n=r[0],o=r[1],i=r[2],a=r[3],s=r[4],l=r[5],u=r[6],c=(e.x-n)/u,f=(e.y-o)/u,p=(e.z-i)/u;return{x:c+l*f-s*p,y:-l*c+f+a*p,z:s*c-a*f+p}}}(r,t.datum_type,t.datum_params)),r=qL(r,s,i,a),t.datum_type===MA)&&0!==YL(t,!0,r))return;return r}function YL(e,t,r){if(null===e.grids||0===e.grids.length)return console.log("Grid shift grids not found"),-1;for(var n={x:-r.x,y:r.y},o={x:Number.NaN,y:Number.NaN},i=[],a=0;an.y||c>n.x||h1e-12&&Math.abs(a.y)>1e-12);if(l<0)return console.log("Inverse grid shift iterator failed to converge."),n;n.x=SL(i.x+r.ll[0]),n.y=i.y+r.ll[1]}else isNaN(i.x)||(n.x=e.x+i.x,n.y=e.y+i.y);return n}function XL(e,t){var r,n={x:e.x/t.del[0],y:e.y/t.del[1]},o=Math.floor(n.x),i=Math.floor(n.y),a=n.x-1*o,s=n.y-1*i,l={x:Number.NaN,y:Number.NaN};if(o<0||o>=t.lim[0])return l;if(i<0||i>=t.lim[1])return l;r=i*t.lim[0]+o;var u=t.cvs[r][0],c=t.cvs[r][1];r++;var f=t.cvs[r][0],p=t.cvs[r][1];r+=t.lim[0];var h=t.cvs[r][0],y=t.cvs[r][1];r--;var d=t.cvs[r][0],v=t.cvs[r][1],m=a*s,b=a*(1-s),g=(1-a)*(1-s),w=(1-a)*s;return l.x=g*u+b*f+w*d+m*h,l.y=g*c+b*p+w*v+m*y,l}function KL(e,t,r){var n,o,i,a=r.x,s=r.y,l=r.z||0,u={};for(i=0;i<3;i++)if(!t||2!==i||void 0!==r.z)switch(0===i?(n=a,o=-1!=="ew".indexOf(e.axis[i])?"x":"y"):1===i?(n=s,o=-1!=="ns".indexOf(e.axis[i])?"y":"x"):(n=l,o="z"),e.axis[i]){case"e":u[o]=n;break;case"w":u[o]=-n;break;case"n":u[o]=n;break;case"s":u[o]=-n;break;case"u":void 0!==r[o]&&(u.z=n);break;case"d":void 0!==r[o]&&(u.z=-n);break;default:return null}return u}function ZL(e){var t={x:e[0],y:e[1]};return e.length>2&&(t.z=e[2]),e.length>3&&(t.m=e[3]),t}function $L(e){if("function"==typeof Number.isFinite){if(Number.isFinite(e))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof e||e!=e||!isFinite(e))throw new TypeError("coordinates must be finite numbers")}function eN(e,t,r,n){var o;if(Array.isArray(r)&&(r=ZL(r)),function(e){$L(e.x),$L(e.y)}(r),e.datum&&t.datum&&function(e,t){return(e.datum.datum_type===jA||e.datum.datum_type===kA)&&"WGS84"!==t.datumCode||(t.datum.datum_type===jA||t.datum.datum_type===kA)&&"WGS84"!==e.datumCode}(e,t)&&(r=eN(e,o=new VL("WGS84"),r,n),e=o),n&&"enu"!==e.axis&&(r=KL(e,!1,r)),"longlat"===e.projName)r={x:r.x*VA,y:r.y*VA,z:r.z||0};else if(e.to_meter&&(r={x:r.x*e.to_meter,y:r.y*e.to_meter,z:r.z||0}),!(r=e.inverse(r)))return;if(e.from_greenwich&&(r.x+=e.from_greenwich),r=WL(e.datum,t.datum,r))return t.from_greenwich&&(r={x:r.x-t.from_greenwich,y:r.y,z:r.z||0}),"longlat"===t.projName?r={x:r.x*JA,y:r.y*JA,z:r.z||0}:(r=t.forward(r),t.to_meter&&(r={x:r.x/t.to_meter,y:r.y/t.to_meter,z:r.z||0})),n&&"enu"!==t.axis?KL(t,!0,r):r}var tN=VL("WGS84");function rN(e,t,r,n){var o,i,a;return Array.isArray(r)?(o=eN(e,t,r,n)||{x:NaN,y:NaN},r.length>2?void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name?"number"==typeof o.z?[o.x,o.y,o.z].concat(r.splice(3)):[o.x,o.y,r[2]].concat(r.splice(3)):[o.x,o.y].concat(r.splice(2)):[o.x,o.y]):(i=eN(e,t,r,n),2===(a=Object.keys(r)).length?i:(a.forEach(function(n){if(void 0!==e.name&&"geocent"===e.name||void 0!==t.name&&"geocent"===t.name){if("x"===n||"y"===n||"z"===n)return}else if("x"===n||"y"===n)return;i[n]=r[n]}),i))}function nN(e){return e instanceof VL?e:e.oProj?e.oProj:VL(e)}var oN=function(e,t,r){e=nN(e);var n,o=!1;return void 0===t?(t=e,e=tN,o=!0):(void 0!==t.x||Array.isArray(t))&&(r=t,t=e,e=tN,o=!0),t=nN(t),r?rN(e,t,r):(n={forward:function(r,n){return rN(e,t,r,n)},inverse:function(r,n){return rN(t,e,r,n)}},o&&(n.oProj=t),n)},iN=6,aN="AJSAJS",sN="AFAFAF",lN=65,uN=73,cN=79,fN=86,pN=90,hN={forward:yN,inverse:function(e){var t=bN(wN(e.toUpperCase()));if(t.lat&&t.lon)return[t.lon,t.lat,t.lon,t.lat];return[t.left,t.bottom,t.right,t.top]},toPoint:dN};function yN(e,t){return t=t||5,function(e,t){var r="00000"+e.easting,n="00000"+e.northing;return e.zoneNumber+e.zoneLetter+(h=e.easting,y=e.northing,d=e.zoneNumber,v=gN(d),m=Math.floor(h/1e5),b=Math.floor(y/1e5)%20,o=m,i=b,a=v,s=a-1,l=aN.charCodeAt(s),u=sN.charCodeAt(s),c=l+o-1,f=u+i,p=!1,c>pN&&(c=c-pN+lN-1,p=!0),(c===uN||luN||(c>uN||lcN||(c>cN||lpN&&(c=c-pN+lN-1),f>fN?(f=f-fN+lN-1,p=!0):p=!1,(f===uN||uuN||(f>uN||ucN||(f>cN||ufN&&(f=f-fN+lN-1),String.fromCharCode(c)+String.fromCharCode(f))+r.substr(r.length-5,t)+n.substr(n.length-5,t);var o,i,a,s,l,u,c,f,p;var h,y,d,v,m,b}(function(e){var t,r,n,o,i,a,s,l=e.lat,u=e.lon,c=6378137,f=vN(l),p=vN(u);s=Math.floor((u+180)/6)+1,180===u&&(s=60);l>=56&&l<64&&u>=3&&u<12&&(s=32);l>=72&&l<84&&(u>=0&&u<9?s=31:u>=9&&u<21?s=33:u>=21&&u<33?s=35:u>=33&&u<42&&(s=37));a=vN(6*(s-1)-180+3),.006739496752268451,t=c/Math.sqrt(1-.00669438*Math.sin(f)*Math.sin(f)),r=Math.tan(f)*Math.tan(f),n=.006739496752268451*Math.cos(f)*Math.cos(f),o=Math.cos(f)*(p-a),i=c*(.9983242984503243*f-.002514607064228144*Math.sin(2*f)+2639046602129982e-21*Math.sin(4*f)-3.418046101696858e-9*Math.sin(6*f));var h=.9996*t*(o+(1-r+n)*o*o*o/6+(5-18*r+r*r+72*n-.39089081163157013)*o*o*o*o*o/120)+5e5,y=.9996*(i+t*Math.tan(f)*(o*o/2+(5-r+9*n+4*n*n)*o*o*o*o/24+(61-58*r+r*r+600*n-2.2240339282485886)*o*o*o*o*o*o/720));l<0&&(y+=1e7);return{northing:Math.round(y),easting:Math.round(h),zoneNumber:s,zoneLetter:function(e){var t="Z";84>=e&&e>=72?t="X":72>e&&e>=64?t="W":64>e&&e>=56?t="V":56>e&&e>=48?t="U":48>e&&e>=40?t="T":40>e&&e>=32?t="S":32>e&&e>=24?t="R":24>e&&e>=16?t="Q":16>e&&e>=8?t="P":8>e&&e>=0?t="N":0>e&&e>=-8?t="M":-8>e&&e>=-16?t="L":-16>e&&e>=-24?t="K":-24>e&&e>=-32?t="J":-32>e&&e>=-40?t="H":-40>e&&e>=-48?t="G":-48>e&&e>=-56?t="F":-56>e&&e>=-64?t="E":-64>e&&e>=-72?t="D":-72>e&&e>=-80&&(t="C");return t}(l)}}({lat:e[1],lon:e[0]}),t)}function dN(e){var t=bN(wN(e.toUpperCase()));return t.lat&&t.lon?[t.lon,t.lat]:[(t.left+t.right)/2,(t.top+t.bottom)/2]}function vN(e){return e*(Math.PI/180)}function mN(e){return e/Math.PI*180}function bN(e){var t=e.northing,r=e.easting,n=e.zoneLetter,o=e.zoneNumber;if(o<0||o>60)return null;var i,a,s,l,u,c,f,p,h=6378137,y=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),d=r-5e5,v=t;n<"N"&&(v-=1e7),c=6*(o-1)-180+3,p=(f=v/.9996/6367449.145945056)+(3*y/2-27*y*y*y/32)*Math.sin(2*f)+(21*y*y/16-55*y*y*y*y/32)*Math.sin(4*f)+151*y*y*y/96*Math.sin(6*f),i=h/Math.sqrt(1-.00669438*Math.sin(p)*Math.sin(p)),a=Math.tan(p)*Math.tan(p),s=.006739496752268451*Math.cos(p)*Math.cos(p),l=.99330562*h/Math.pow(1-.00669438*Math.sin(p)*Math.sin(p),1.5),u=d/(.9996*i);var m=p-i*Math.tan(p)/l*(u*u/2-(5+3*a+10*s-4*s*s-.06065547077041606)*u*u*u*u/24+(61+90*a+298*s+45*a*a-1.6983531815716497-3*s*s)*u*u*u*u*u*u/720);m=mN(m);var b,g=(u-(1+2*a+s)*u*u*u/6+(5-2*s+28*a-3*s*s+.05391597401814761+24*a*a)*u*u*u*u*u/120)/Math.cos(p);if(g=c+mN(g),e.accuracy){var w=bN({northing:e.northing+e.accuracy,easting:e.easting+e.accuracy,zoneLetter:e.zoneLetter,zoneNumber:e.zoneNumber});b={top:w.lat,right:w.lon,bottom:m,left:g}}else b={lat:m,lon:g};return b}function gN(e){var t=e%iN;return 0===t&&(t=iN),t}function wN(e){if(e&&0===e.length)throw"MGRSPoint coverting from nothing";for(var t,r=e.length,n=null,o="",i=0;!/[A-Z]/.test(t=e.charAt(i));){if(i>=2)throw"MGRSPoint bad conversion from: "+e;o+=t,i++}var a=parseInt(o,10);if(0===i||i+3>r)throw"MGRSPoint bad conversion from: "+e;var s=e.charAt(i++);if(s<="A"||"B"===s||"Y"===s||s>="Z"||"I"===s||"O"===s)throw"MGRSPoint zone letter "+s+" not handled: "+e;n=e.substring(i,i+=2);for(var l=gN(a),u=function(e,t){var r=aN.charCodeAt(t-1),n=1e5,o=!1;for(;r!==e.charCodeAt(0);){if(++r===uN&&r++,r===cN&&r++,r>pN){if(o)throw"Bad character: "+e;r=lN,o=!0}n+=1e5}return n}(n.charAt(0),l),c=function(e,t){if(e>"V")throw"MGRSPoint given invalid Northing "+e;var r=sN.charCodeAt(t-1),n=0,o=!1;for(;r!==e.charCodeAt(0);){if(++r===uN&&r++,r===cN&&r++,r>fN){if(o)throw"Bad character: "+e;r=lN,o=!0}n+=1e5}return n}(n.charAt(1),l);c0&&(p=1e5/Math.pow(10,d),h=e.substring(i,i+d),v=parseFloat(h)*p,y=e.substring(i+d),m=parseFloat(y)*p),{easting:v+u,northing:m+c,zoneLetter:s,zoneNumber:a,accuracy:p}}function SN(e){var t;switch(e){case"C":t=11e5;break;case"D":t=2e6;break;case"E":t=28e5;break;case"F":t=37e5;break;case"G":t=46e5;break;case"H":t=55e5;break;case"J":t=64e5;break;case"K":t=73e5;break;case"L":t=82e5;break;case"M":t=91e5;break;case"N":t=0;break;case"P":t=8e5;break;case"Q":t=17e5;break;case"R":t=26e5;break;case"S":t=35e5;break;case"T":t=44e5;break;case"U":t=53e5;break;case"V":t=62e5;break;case"W":t=7e6;break;case"X":t=79e5;break;default:t=-1}if(t>=0)return t;throw"Invalid zone letter: "+e}function ON(e){"@babel/helpers - typeof";return(ON="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _N(e,t,r){if(!(this instanceof _N))return new _N(e,t,r);if(Array.isArray(e))this.x=e[0],this.y=e[1],this.z=e[2]||0;else if("object"===ON(e))this.x=e.x,this.y=e.y,this.z=e.z||0;else if("string"==typeof e&&void 0===t){var n=e.split(",");this.x=parseFloat(n[0],10),this.y=parseFloat(n[1],10),this.z=parseFloat(n[2],10)||0}else this.x=e,this.y=t,this.z=r||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}_N.fromMGRS=function(e){return new _N(dN(e))},_N.prototype.toMGRS=function(e){return yN([this.x,this.y],e)};var PN=_N,xN=1,CN=.25,TN=.046875,EN=.01953125,jN=.01068115234375,kN=.75,MN=.46875,RN=.013020833333333334,AN=.007120768229166667,LN=.3645833333333333,NN=.005696614583333333,DN=.3076171875;function IN(e){var t=[];t[0]=xN-e*(CN+e*(TN+e*(EN+e*jN))),t[1]=e*(kN-e*(TN+e*(EN+e*jN)));var r=e*e;return t[2]=r*(MN-e*(RN+e*AN)),r*=e,t[3]=r*(LN-e*NN),t[4]=r*e*DN,t}function FN(e,t,r,n){return r*=t,t*=t,n[0]*e-r*(n[1]+t*(n[2]+t*(n[3]+t*n[4])))}var BN=20;function GN(e,t,r){for(var n=1/(1-t),o=e,i=BN;i;--i){var a=Math.sin(o),s=1-t*a*a;if(o-=s=(FN(o,a,Math.cos(o),r)-e)*(s*Math.sqrt(s))*n,Math.abs(s)zA?Math.tan(i):0,y=Math.pow(h,2),d=Math.pow(y,2);t=1-this.es*Math.pow(s,2),u/=Math.sqrt(t);var v=FN(i,s,l,this.en);r=this.a*(this.k0*u*(1+c/6*(1-y+f+c/20*(5-18*y+d+14*f-58*y*f+c/42*(61+179*d-d*y-479*y)))))+this.x0,n=this.a*(this.k0*(v-this.ml0+s*a*u/2*(1+c/12*(5-y+9*f+4*p+c/30*(61+d-58*y+270*f-330*y*f+c/56*(1385+543*d-d*y-3111*y))))))+this.y0}else{var m=l*Math.sin(a);if(Math.abs(Math.abs(m)-1)=1){if(m-1>zA)return 93;n=0}else n=Math.acos(n);i<0&&(n=-n),n=this.a*this.k0*(n-this.lat0)+this.y0}return e.x=r,e.y=n,e},inverse:function(e){var t,r,n,o,i=(e.x-this.x0)*(1/this.a),a=(e.y-this.y0)*(1/this.a);if(this.es)if(r=GN(t=this.ml0+a/this.k0,this.es,this.en),Math.abs(r)zA?Math.tan(r):0,c=this.ep2*Math.pow(l,2),f=Math.pow(c,2),p=Math.pow(u,2),h=Math.pow(p,2);t=1-this.es*Math.pow(s,2);var y=i*Math.sqrt(t)/this.k0,d=Math.pow(y,2);n=r-(t*=u)*d/(1-this.es)*.5*(1-d/12*(5+3*p-9*c*p+c-4*f-d/30*(61+90*p-252*c*p+45*h+46*c-d/56*(1385+3633*p+4095*h+1574*h*p)))),o=SL(this.long0+y*(1-d/6*(1+2*p+c-d/20*(5+28*p+24*h+8*c*p+6*c-d/42*(61+662*p+1320*h+720*h*p))))/l)}else n=FA*wL(a),o=0;else{var v=Math.exp(i/this.k0),m=.5*(v-1/v),b=this.lat0+a/this.k0,g=Math.cos(b);t=Math.sqrt((1-Math.pow(g,2))/(1+Math.pow(m,2))),n=Math.asin(t),a<0&&(n=-n),o=0===m&&0===g?0:SL(Math.atan2(m,g)+this.long0)}return e.x=o,e.y=n,e},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]};function zN(e){var t=Math.exp(e);return t=(t-1/t)/2}function VN(e,t){e=Math.abs(e),t=Math.abs(t);var r=Math.max(e,t),n=Math.min(e,t)/(r||1);return r*Math.sqrt(1+Math.pow(n,2))}function JN(e){var t=Math.abs(e);return t=function(e){var t=1+e,r=t-1;return 0===r?e:e*Math.log(t)/r}(t*(1+t/(VN(1,t)+1))),e<0?-t:t}function qN(e,t){for(var r,n=2*Math.cos(2*t),o=e.length-1,i=e[o],a=0;--o>=0;)r=n*i-a+e[o],a=i,i=r;return t+r*Math.sin(2*t)}function HN(e,t,r){for(var n,o,i=Math.sin(t),a=Math.cos(t),s=zN(r),l=function(e){var t=Math.exp(e);return t=(t+1/t)/2}(r),u=2*a*l,c=-2*i*s,f=e.length-1,p=e[f],h=0,y=0,d=0;--f>=0;)n=y,o=h,p=u*(y=p)-n-c*(h=d)+e[f],d=c*y-o+u*h;return[(u=i*l)*p-(c=a*s)*d,u*d+c*p]}var WN={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(UN.init.apply(this),this.forward=UN.forward,this.inverse=UN.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var e=this.es/(1+Math.sqrt(1-this.es)),t=e/(2-e),r=t;this.cgb[0]=t*(2+t*(-2/3+t*(t*(116/45+t*(26/45+t*(-2854/675)))-2))),this.cbg[0]=t*(t*(2/3+t*(4/3+t*(-82/45+t*(32/45+t*(4642/4725)))))-2),r*=t,this.cgb[1]=r*(7/3+t*(t*(-227/45+t*(2704/315+t*(2323/945)))-1.6)),this.cbg[1]=r*(5/3+t*(-16/15+t*(-13/9+t*(904/315+t*(-1522/945))))),r*=t,this.cgb[2]=r*(56/15+t*(-136/35+t*(-1262/105+t*(73814/2835)))),this.cbg[2]=r*(-26/15+t*(34/21+t*(1.6+t*(-12686/2835)))),r*=t,this.cgb[3]=r*(4279/630+t*(-332/35+t*(-399572/14175))),this.cbg[3]=r*(1237/630+t*(t*(-24832/14175)-2.4)),r*=t,this.cgb[4]=r*(4174/315+t*(-144838/6237)),this.cbg[4]=r*(-734/315+t*(109598/31185)),r*=t,this.cgb[5]=r*(601676/22275),this.cbg[5]=r*(444337/155925),r=Math.pow(t,2),this.Qn=this.k0/(1+t)*(1+r*(.25+r*(1/64+r/256))),this.utg[0]=t*(t*(2/3+t*(-37/96+t*(1/360+t*(81/512+t*(-96199/604800)))))-.5),this.gtu[0]=t*(.5+t*(-2/3+t*(5/16+t*(41/180+t*(-127/288+t*(7891/37800)))))),this.utg[1]=r*(-1/48+t*(-1/15+t*(437/1440+t*(-46/105+t*(1118711/3870720))))),this.gtu[1]=r*(13/48+t*(t*(557/1440+t*(281/630+t*(-1983433/1935360)))-.6)),r*=t,this.utg[2]=r*(-17/480+t*(37/840+t*(209/4480+t*(-5569/90720)))),this.gtu[2]=r*(61/240+t*(-103/140+t*(15061/26880+t*(167603/181440)))),r*=t,this.utg[3]=r*(-4397/161280+t*(11/504+t*(830251/7257600))),this.gtu[3]=r*(49561/161280+t*(-179/168+t*(6601661/7257600))),r*=t,this.utg[4]=r*(-4583/161280+t*(108847/3991680)),this.gtu[4]=r*(34729/80640+t*(-3418889/1995840)),r*=t,this.utg[5]=-.03233083094085698*r,this.gtu[5]=.6650675310896665*r;var n=qN(this.cbg,this.lat0);this.Zb=-this.Qn*(n+function(e,t){for(var r,n=2*Math.cos(t),o=e.length-1,i=e[o],a=0;--o>=0;)r=n*i-a+e[o],a=i,i=r;return Math.sin(t)*r}(this.gtu,2*n))},forward:function(e){var t=SL(e.x-this.long0),r=e.y;r=qN(this.cbg,r);var n=Math.sin(r),o=Math.cos(r),i=Math.sin(t),a=Math.cos(t);r=Math.atan2(n,a*o),t=Math.atan2(i*o,VN(n,o*a)),t=JN(Math.tan(t));var s,l,u=HN(this.gtu,2*r,2*t);return r+=u[0],t+=u[1],Math.abs(t)<=2.623395162778?(s=this.a*(this.Qn*t)+this.x0,l=this.a*(this.Qn*r+this.Zb)+this.y0):(s=1/0,l=1/0),e.x=s,e.y=l,e},inverse:function(e){var t,r,n=(e.x-this.x0)*(1/this.a),o=(e.y-this.y0)*(1/this.a);if(o=(o-this.Zb)/this.Qn,n/=this.Qn,Math.abs(n)<=2.623395162778){var i=HN(this.utg,2*o,2*n);o+=i[0],n+=i[1],n=Math.atan(zN(n));var a=Math.sin(o),s=Math.cos(o),l=Math.sin(n),u=Math.cos(n);o=Math.atan2(a*u,VN(l,u*s)),t=SL((n=Math.atan2(l,u*s))+this.long0),r=qN(this.cgb,o)}else t=1/0,r=1/0;return e.x=t,e.y=r,e},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]};var YN={init:function(){var e=function(e,t){if(void 0===e){if((e=Math.floor(30*(SL(t)+Math.PI)/Math.PI)+1)<0)return 0;if(e>60)return 60}return e}(this.zone,this.long0);if(void 0===e)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(e)-183)*VA,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,WN.init.apply(this),this.forward=WN.forward,this.inverse=WN.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"};function QN(e,t){return Math.pow((1-e)/(1+e),t)}var XN=20;var KN={init:function(){var e=Math.sin(this.lat0),t=Math.cos(this.lat0);t*=t,this.rc=Math.sqrt(1-this.es)/(1-this.es*e*e),this.C=Math.sqrt(1+this.es*t*t/(1-this.es)),this.phic0=Math.asin(e/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+qA)/(Math.pow(Math.tan(.5*this.lat0+qA),this.C)*QN(this.e*e,this.ratexp))},forward:function(e){var t=e.x,r=e.y;return e.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*r+qA),this.C)*QN(this.e*Math.sin(r),this.ratexp))-FA,e.x=this.C*t,e},inverse:function(e){for(var t=e.x/this.C,r=e.y,n=Math.pow(Math.tan(.5*r+qA)/this.K,1/this.C),o=XN;o>0&&(r=2*Math.atan(n*QN(this.e*Math.sin(e.y),-.5*this.e))-FA,!(Math.abs(r-e.y)<1e-14));--o)e.y=r;return o?(e.x=t,e.y=r,e):null},names:["gauss"]};var ZN={init:function(){KN.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(e){var t,r,n,o;return e.x=SL(e.x-this.long0),KN.forward.apply(this,[e]),t=Math.sin(e.y),r=Math.cos(e.y),n=Math.cos(e.x),o=this.k0*this.R2/(1+this.sinc0*t+this.cosc0*r*n),e.x=o*r*Math.sin(e.x),e.y=o*(this.cosc0*t-this.sinc0*r*n),e.x=this.a*e.x+this.x0,e.y=this.a*e.y+this.y0,e},inverse:function(e){var t,r,n,o,i;if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,i=Math.sqrt(e.x*e.x+e.y*e.y)){var a=2*Math.atan2(i,this.R2);t=Math.sin(a),r=Math.cos(a),o=Math.asin(r*this.sinc0+e.y*t*this.cosc0/i),n=Math.atan2(e.x*t,i*this.cosc0*r-e.y*this.sinc0*t)}else o=this.phic0,n=0;return e.x=n,e.y=o,KN.inverse.apply(this,[e]),e.x=SL(e.x+this.long0),e},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]};var $N={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=zA&&(this.k0=.5*(1+wL(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=zA&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=zA&&(this.k0=.5*this.cons*gL(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/OL(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=gL(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-FA,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(e){var t,r,n,o,i,a,s=e.x,l=e.y,u=Math.sin(l),c=Math.cos(l),f=SL(s-this.long0);return Math.abs(Math.abs(s-this.long0)-Math.PI)<=zA&&Math.abs(l+this.lat0)<=zA?(e.x=NaN,e.y=NaN,e):this.sphere?(t=2*this.k0/(1+this.sinlat0*u+this.coslat0*c*Math.cos(f)),e.x=this.a*t*c*Math.sin(f)+this.x0,e.y=this.a*t*(this.coslat0*u-this.sinlat0*c*Math.cos(f))+this.y0,e):(r=2*Math.atan(this.ssfn_(l,u,this.e))-FA,o=Math.cos(r),n=Math.sin(r),Math.abs(this.coslat0)<=zA?(i=OL(this.e,l*this.con,this.con*u),a=2*this.a*this.k0*i/this.cons,e.x=this.x0+a*Math.sin(s-this.long0),e.y=this.y0-this.con*a*Math.cos(s-this.long0),e):(Math.abs(this.sinlat0)0?SL(this.long0+Math.atan2(e.x,-1*e.y)):SL(this.long0+Math.atan2(e.x,e.y)):SL(this.long0+Math.atan2(e.x*Math.sin(s),a*this.coslat0*Math.cos(s)-e.y*this.sinlat0*Math.sin(s))),e.x=t,e.y=r,e)}if(Math.abs(this.coslat0)<=zA){if(a<=zA)return r=this.lat0,t=this.long0,e.x=t,e.y=r,e;e.x*=this.con,e.y*=this.con,n=a*this.cons/(2*this.a*this.k0),r=this.con*_L(this.e,n),t=this.con*SL(this.con*this.long0+Math.atan2(e.x,-1*e.y))}else o=2*Math.atan(a*this.cosX0/(2*this.a*this.k0*this.ms1)),t=this.long0,a<=zA?i=this.X0:(i=Math.asin(Math.cos(o)*this.sinX0+e.y*Math.sin(o)*this.cosX0/a),t=SL(this.long0+Math.atan2(e.x*Math.sin(o),a*this.cosX0*Math.cos(o)-e.y*this.sinX0*Math.sin(o)))),r=-1*_L(this.e,Math.tan(.5*(FA+i)));return e.x=t,e.y=r,e},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(e,t,r){return t*=r,Math.tan(.5*(FA+e))*Math.pow((1-t)/(1+t),.5*r)}};var eD={init:function(){var e=this.lat0;this.lambda0=this.long0;var t=Math.sin(e),r=this.a,n=1/this.rf,o=2*n-Math.pow(n,2),i=this.e=Math.sqrt(o);this.R=this.k0*r*Math.sqrt(1-o)/(1-o*Math.pow(t,2)),this.alpha=Math.sqrt(1+o/(1-o)*Math.pow(Math.cos(e),4)),this.b0=Math.asin(t/this.alpha);var a=Math.log(Math.tan(Math.PI/4+this.b0/2)),s=Math.log(Math.tan(Math.PI/4+e/2)),l=Math.log((1+i*t)/(1-i*t));this.K=a-this.alpha*s+this.alpha*i/2*l},forward:function(e){var t=Math.log(Math.tan(Math.PI/4-e.y/2)),r=this.e/2*Math.log((1+this.e*Math.sin(e.y))/(1-this.e*Math.sin(e.y))),n=-this.alpha*(t+r)+this.K,o=2*(Math.atan(Math.exp(n))-Math.PI/4),i=this.alpha*(e.x-this.lambda0),a=Math.atan(Math.sin(i)/(Math.sin(this.b0)*Math.tan(o)+Math.cos(this.b0)*Math.cos(i))),s=Math.asin(Math.cos(this.b0)*Math.sin(o)-Math.sin(this.b0)*Math.cos(o)*Math.cos(i));return e.y=this.R/2*Math.log((1+Math.sin(s))/(1-Math.sin(s)))+this.y0,e.x=this.R*a+this.x0,e},inverse:function(e){for(var t=e.x-this.x0,r=e.y-this.y0,n=t/this.R,o=2*(Math.atan(Math.exp(r/this.R))-Math.PI/4),i=Math.asin(Math.cos(this.b0)*Math.sin(o)+Math.sin(this.b0)*Math.cos(o)*Math.cos(n)),a=Math.atan(Math.sin(n)/(Math.cos(this.b0)*Math.cos(n)-Math.sin(this.b0)*Math.tan(o))),s=this.lambda0+a/this.alpha,l=0,u=i,c=-1e3,f=0;Math.abs(u-c)>1e-7;){if(++f>20)return;l=1/this.alpha*(Math.log(Math.tan(Math.PI/4+i/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(u))/2)),c=u,u=2*Math.atan(Math.exp(l))-Math.PI/2}return e.x=s,e.y=u,e},names:["somerc"]};function tD(e){"@babel/helpers - typeof";return(tD="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var rD=1e-7;var nD={init:function(){var e,t,r,n,o,i,a,s,l,u,c,f,p,h=0,y=0,d=0,v=0,m=0,b=0,g=0;this.no_off=(p="object"===tD((f=this).PROJECTION)?Object.keys(f.PROJECTION)[0]:f.PROJECTION,"no_uoff"in f||"no_off"in f||-1!==["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"].indexOf(p)),this.no_rot="no_rot"in this;var w=!1;"alpha"in this&&(w=!0);var S=!1;if("rectified_grid_angle"in this&&(S=!0),w&&(g=this.alpha),S&&(h=this.rectified_grid_angle*VA),w||S)y=this.longc;else if(d=this.long1,m=this.lat1,v=this.long2,b=this.lat2,Math.abs(m-b)<=rD||(e=Math.abs(m))<=rD||Math.abs(e-FA)<=rD||Math.abs(Math.abs(this.lat0)-FA)<=rD||Math.abs(Math.abs(b)-FA)<=rD)throw new Error;var O=1-this.es;t=Math.sqrt(O),Math.abs(this.lat0)>zA?(s=Math.sin(this.lat0),r=Math.cos(this.lat0),e=1-this.es*s*s,this.B=r*r,this.B=Math.sqrt(1+this.es*this.B*this.B/O),this.A=this.B*this.k0*t/e,(o=(n=this.B*t/(r*Math.sqrt(e)))*n-1)<=0?o=0:(o=Math.sqrt(o),this.lat0<0&&(o=-o)),this.E=o+=n,this.E*=Math.pow(OL(this.e,this.lat0,s),this.B)):(this.B=1/t,this.A=this.k0,this.E=n=o=1),w||S?(w?(c=Math.asin(Math.sin(g)/n),S||(h=g)):(c=h,g=Math.asin(n*Math.sin(c))),this.lam0=y-Math.asin(.5*(o-1/o)*Math.tan(c))/this.B):(i=Math.pow(OL(this.e,m,Math.sin(m)),this.B),a=Math.pow(OL(this.e,b,Math.sin(b)),this.B),o=this.E/i,l=(a-i)/(a+i),u=((u=this.E*this.E)-a*i)/(u+a*i),(e=d-v)<-Math.pi?v-=HA:e>Math.pi&&(v+=HA),this.lam0=SL(.5*(d+v)-Math.atan(u*Math.tan(.5*this.B*(d-v))/l)/this.B),c=Math.atan(2*Math.sin(this.B*SL(d-this.lam0))/(o-1/o)),h=g=Math.asin(n*Math.sin(c))),this.singam=Math.sin(c),this.cosgam=Math.cos(c),this.sinrot=Math.sin(h),this.cosrot=Math.cos(h),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.A,this.B,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(n*n-1)/Math.cos(g))),this.lat0<0&&(this.u_0=-this.u_0)),o=.5*c,this.v_pole_n=this.ArB*Math.log(Math.tan(qA-o)),this.v_pole_s=this.ArB*Math.log(Math.tan(qA+o))},forward:function(e){var t,r,n,o,i,a,s,l,u={};if(e.x=e.x-this.lam0,Math.abs(Math.abs(e.y)-FA)>zA){if(t=.5*((i=this.E/Math.pow(OL(this.e,e.y,Math.sin(e.y)),this.B))-(a=1/i)),r=.5*(i+a),o=Math.sin(this.B*e.x),n=(t*this.singam-o*this.cosgam)/r,Math.abs(Math.abs(n)-1)0?this.v_pole_n:this.v_pole_s,s=this.ArB*e.y;return this.no_rot?(u.x=s,u.y=l):(s-=this.u_0,u.x=l*this.cosrot+s*this.sinrot,u.y=s*this.cosrot-l*this.sinrot),u.x=this.a*u.x+this.x0,u.y=this.a*u.y+this.y0,u},inverse:function(e){var t,r,n,o,i,a,s,l={};if(e.x=(e.x-this.x0)*(1/this.a),e.y=(e.y-this.y0)*(1/this.a),this.no_rot?(r=e.y,t=e.x):(r=e.x*this.cosrot-e.y*this.sinrot,t=e.y*this.cosrot+e.x*this.sinrot+this.u_0),o=.5*((n=Math.exp(-this.BrA*r))-1/n),i=.5*(n+1/n),s=((a=Math.sin(this.BrA*t))*this.cosgam+o*this.singam)/i,Math.abs(Math.abs(s)-1)zA?this.ns=Math.log(n/s)/Math.log(o/l):this.ns=t,isNaN(this.ns)&&(this.ns=t),this.f0=n/(this.ns*Math.pow(o,this.ns)),this.rh=this.a*this.f0*Math.pow(u,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(e){var t=e.x,r=e.y;Math.abs(2*Math.abs(r)-Math.PI)<=zA&&(r=wL(r)*(FA-2*zA));var n,o,i=Math.abs(Math.abs(r)-FA);if(i>zA)n=OL(this.e,r,Math.sin(r)),o=this.a*this.f0*Math.pow(n,this.ns);else{if((i=r*this.ns)<=0)return null;o=0}var a=this.ns*SL(t-this.long0);return e.x=this.k0*(o*Math.sin(a))+this.x0,e.y=this.k0*(this.rh-o*Math.cos(a))+this.y0,e},inverse:function(e){var t,r,n,o,i,a=(e.x-this.x0)/this.k0,s=this.rh-(e.y-this.y0)/this.k0;this.ns>0?(t=Math.sqrt(a*a+s*s),r=1):(t=-Math.sqrt(a*a+s*s),r=-1);var l=0;if(0!==t&&(l=Math.atan2(r*a,r*s)),0!==t||this.ns>0){if(r=1/this.ns,n=Math.pow(t/(this.a*this.f0),r),-9999===(o=_L(this.e,n)))return null}else o=-FA;return i=SL(l/this.ns+this.long0),e.x=i,e.y=o,e},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc"]};var iD={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(e){var t,r,n,o,i,a,s,l=e.x,u=e.y,c=SL(l-this.long0);return t=Math.pow((1+this.e*Math.sin(u))/(1-this.e*Math.sin(u)),this.alfa*this.e/2),r=2*(Math.atan(this.k*Math.pow(Math.tan(u/2+this.s45),this.alfa)/t)-this.s45),n=-c*this.alfa,o=Math.asin(Math.cos(this.ad)*Math.sin(r)+Math.sin(this.ad)*Math.cos(r)*Math.cos(n)),i=Math.asin(Math.cos(r)*Math.sin(n)/Math.cos(o)),a=this.n*i,s=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(o/2+this.s45),this.n),e.y=s*Math.cos(a)/1,e.x=s*Math.sin(a)/1,this.czech||(e.y*=-1,e.x*=-1),e},inverse:function(e){var t,r,n,o,i,a,s,l=e.x;e.x=e.y,e.y=l,this.czech||(e.y*=-1,e.x*=-1),i=Math.sqrt(e.x*e.x+e.y*e.y),o=Math.atan2(e.y,e.x)/Math.sin(this.s0),n=2*(Math.atan(Math.pow(this.ro0/i,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),t=Math.asin(Math.cos(this.ad)*Math.sin(n)-Math.sin(this.ad)*Math.cos(n)*Math.cos(o)),r=Math.asin(Math.cos(n)*Math.sin(o)/Math.cos(t)),e.x=this.long0-r/this.alfa,a=t,s=0;var u=0;do{e.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(t/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(a))/(1-this.e*Math.sin(a)),this.e/2))-this.s45),Math.abs(a-e.y)<1e-10&&(s=1),a=e.y,u+=1}while(0===s&&u<15);return u>=15?null:e},names:["Krovak","krovak"]};function aD(e,t,r,n,o){return e*o-t*Math.sin(2*o)+r*Math.sin(4*o)-n*Math.sin(6*o)}function sD(e){return 1-.25*e*(1+e/16*(3+1.25*e))}function lD(e){return.375*e*(1+.25*e*(1+.46875*e))}function uD(e){return.05859375*e*e*(1+.75*e)}function cD(e){return e*e*e*(35/3072)}function fD(e,t,r){var n=t*r;return e/Math.sqrt(1-n*n)}function pD(e){return Math.abs(e)1e-7?(1-e*e)*(t/(1-(r=e*t)*r)-.5/e*Math.log((1-r)/(1+r))):2*t}var vD=.3333333333333333,mD=.17222222222222222,bD=.10257936507936508,gD=.06388888888888888,wD=.0664021164021164,SD=.016415012942191543;var OD={init:function(){var e,t=Math.abs(this.lat0);if(Math.abs(t-FA)0)switch(this.qp=dD(this.e,1),this.mmf=.5/(1-this.es),this.apa=function(e){var t,r=[];return r[0]=e*vD,t=e*e,r[0]+=t*mD,r[1]=t*gD,t*=e,r[0]+=t*bD,r[1]+=t*wD,r[2]=t*SD,r}(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),e=Math.sin(this.lat0),this.sinb1=dD(this.e,e)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*e*e)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(e){var t,r,n,o,i,a,s,l,u,c,f=e.x,p=e.y;if(f=SL(f-this.long0),this.sphere){if(i=Math.sin(p),c=Math.cos(p),n=Math.cos(f),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((r=this.mode===this.EQUIT?1+c*n:1+this.sinph0*i+this.cosph0*c*n)<=zA)return null;t=(r=Math.sqrt(2/r))*c*Math.sin(f),r*=this.mode===this.EQUIT?i:this.cosph0*i-this.sinph0*c*n}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(n=-n),Math.abs(p+this.lat0)=0?(t=(u=Math.sqrt(a))*o,r=n*(this.mode===this.S_POLE?u:-u)):t=r=0}}return e.x=this.a*t+this.x0,e.y=this.a*r+this.y0,e},inverse:function(e){e.x-=this.x0,e.y-=this.y0;var t,r,n,o,i,a,s,l,u,c,f=e.x/this.a,p=e.y/this.a;if(this.sphere){var h,y=0,d=0;if((r=.5*(h=Math.sqrt(f*f+p*p)))>1)return null;switch(r=2*Math.asin(r),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(d=Math.sin(r),y=Math.cos(r)),this.mode){case this.EQUIT:r=Math.abs(h)<=zA?0:Math.asin(p*d/h),f*=d,p=y*h;break;case this.OBLIQ:r=Math.abs(h)<=zA?this.lat0:Math.asin(y*this.sinph0+p*d*this.cosph0/h),f*=d*this.cosph0,p=(y-Math.sin(r)*this.sinph0)*h;break;case this.N_POLE:p=-p,r=FA-r;break;case this.S_POLE:r-=FA}t=0!==p||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(f,p):0}else{if(s=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(f/=this.dd,p*=this.dd,(a=Math.sqrt(f*f+p*p))1&&(e=e>1?1:-1),Math.asin(e)}var PD={init:function(){Math.abs(this.lat1+this.lat2)zA?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(e){var t=e.x,r=e.y;this.sin_phi=Math.sin(r),this.cos_phi=Math.cos(r);var n=dD(this.e3,this.sin_phi,this.cos_phi),o=this.a*Math.sqrt(this.c-this.ns0*n)/this.ns0,i=this.ns0*SL(t-this.long0),a=o*Math.sin(i)+this.x0,s=this.rh-o*Math.cos(i)+this.y0;return e.x=a,e.y=s,e},inverse:function(e){var t,r,n,o,i,a;return e.x-=this.x0,e.y=this.rh-e.y+this.y0,this.ns0>=0?(t=Math.sqrt(e.x*e.x+e.y*e.y),n=1):(t=-Math.sqrt(e.x*e.x+e.y*e.y),n=-1),o=0,0!==t&&(o=Math.atan2(n*e.x,n*e.y)),n=t*this.ns0/this.a,this.sphere?a=Math.asin((this.c-n*n)/(2*this.ns0)):(r=(this.c-n*n)/this.ns0,a=this.phi1z(this.e3,r)),i=SL(o/this.ns0+this.long0),e.x=i,e.y=a,e},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(e,t){var r,n,o,i,a,s=_D(.5*t);if(e0||Math.abs(i)<=zA?(a=this.x0+1*this.a*r*Math.sin(n)/i,s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*r*o)/i):(a=this.x0+this.infinity_dist*r*Math.sin(n),s=this.y0+this.infinity_dist*(this.cos_p14*t-this.sin_p14*r*o)),e.x=a,e.y=s,e},inverse:function(e){var t,r,n,o,i,a;return e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,e.x/=this.k0,e.y/=this.k0,(t=Math.sqrt(e.x*e.x+e.y*e.y))?(o=Math.atan2(t,this.rc),r=Math.sin(o),a=_D((n=Math.cos(o))*this.sin_p14+e.y*r*this.cos_p14/t),i=Math.atan2(e.x*r,t*this.cos_p14*n-e.y*this.sin_p14*r),i=SL(this.long0+i)):(a=this.phic0,i=0),e.x=i,e.y=a,e},names:["gnom"]};var CD={init:function(){this.sphere||(this.k0=gL(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(e){var t,r,n=e.x,o=e.y,i=SL(n-this.long0);if(this.sphere)t=this.x0+this.a*i*Math.cos(this.lat_ts),r=this.y0+this.a*Math.sin(o)/Math.cos(this.lat_ts);else{var a=dD(this.e,Math.sin(o));t=this.x0+this.a*this.k0*i,r=this.y0+this.a*a*.5/this.k0}return e.x=t,e.y=r,e},inverse:function(e){var t,r;return e.x-=this.x0,e.y-=this.y0,this.sphere?(t=SL(this.long0+e.x/this.a/Math.cos(this.lat_ts)),r=Math.asin(e.y/this.a*Math.cos(this.lat_ts))):(r=function(e,t){var r=1-(1-e*e)/(2*e)*Math.log((1-e)/(1+e));if(Math.abs(Math.abs(t)-r)<1e-6)return t<0?-1*FA:FA;for(var n,o,i,a,s=Math.asin(.5*t),l=0;l<30;l++)if(o=Math.sin(s),i=Math.cos(s),a=e*o,s+=n=Math.pow(1-a*a,2)/(2*i)*(t/(1-e*e)-o/(1-a*a)+.5/e*Math.log((1-a)/(1+a))),Math.abs(n)<=1e-10)return s;return NaN}(this.e,2*e.y*this.k0/this.a),t=SL(this.long0+e.x/(this.a*this.k0))),e.x=t,e.y=r,e},names:["cea"]};var TD={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(e){var t=e.x,r=e.y,n=SL(t-this.long0),o=pD(r-this.lat0);return e.x=this.x0+this.a*n*this.rc,e.y=this.y0+this.a*o,e},inverse:function(e){var t=e.x,r=e.y;return e.x=SL(this.long0+(t-this.x0)/(this.a*this.rc)),e.y=pD(this.lat0+(r-this.y0)/this.a),e},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},ED=20;var jD={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=sD(this.es),this.e1=lD(this.es),this.e2=uD(this.es),this.e3=cD(this.es),this.ml0=this.a*aD(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(e){var t,r,n,o=e.x,i=e.y,a=SL(o-this.long0);if(n=a*Math.sin(i),this.sphere)Math.abs(i)<=zA?(t=this.a*a,r=-1*this.a*this.lat0):(t=this.a*Math.sin(n)/Math.tan(i),r=this.a*(pD(i-this.lat0)+(1-Math.cos(n))/Math.tan(i)));else if(Math.abs(i)<=zA)t=this.a*a,r=-1*this.ml0;else{var s=fD(this.a,this.e,Math.sin(i))/Math.tan(i);t=s*Math.sin(n),r=this.a*aD(this.e0,this.e1,this.e2,this.e3,i)-this.ml0+s*(1-Math.cos(n))}return e.x=t+this.x0,e.y=r+this.y0,e},inverse:function(e){var t,r,n,o,i,a,s,l,u;if(n=e.x-this.x0,o=e.y-this.y0,this.sphere)if(Math.abs(o+this.a*this.lat0)<=zA)t=SL(n/this.a+this.long0),r=0;else{var c;for(a=this.lat0+o/this.a,s=n*n/this.a/this.a+a*a,l=a,i=ED;i;--i)if(l+=u=-1*(a*(l*(c=Math.tan(l))+1)-l-.5*(l*l+s)*c)/((l-a)/c-1),Math.abs(u)<=zA){r=l;break}t=SL(this.long0+Math.asin(n*Math.tan(l)/this.a)/Math.sin(r))}else if(Math.abs(o+this.ml0)<=zA)r=0,t=SL(this.long0+n/this.a);else{var f,p,h,y,d;for(a=(this.ml0+o)/this.a,s=n*n/this.a/this.a+a*a,l=a,i=ED;i;--i)if(d=this.e*Math.sin(l),f=Math.sqrt(1-d*d)*Math.tan(l),p=this.a*aD(this.e0,this.e1,this.e2,this.e3,l),h=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),l-=u=(a*(f*(y=p/this.a)+1)-y-.5*f*(y*y+s))/(this.es*Math.sin(2*l)*(y*y+s-2*a*y)/(4*f)+(a-y)*(f*h-2/Math.sin(2*l))-h),Math.abs(u)<=zA){r=l;break}f=Math.sqrt(1-this.es*Math.pow(Math.sin(r),2))*Math.tan(r),t=SL(this.long0+Math.asin(n*f/this.a)/Math.sin(r))}return e.x=t,e.y=r,e},names:["Polyconic","poly"]};var kD={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(e){var t,r=e.x,n=e.y-this.lat0,o=r-this.long0,i=n/IA*1e-5,a=o,s=1,l=0;for(t=1;t<=10;t++)s*=i,l+=this.A[t]*s;var u,c=l,f=a,p=1,h=0,y=0,d=0;for(t=1;t<=6;t++)u=h*c+p*f,p=p*c-h*f,h=u,y=y+this.B_re[t]*p-this.B_im[t]*h,d=d+this.B_im[t]*p+this.B_re[t]*h;return e.x=d*this.a+this.x0,e.y=y*this.a+this.y0,e},inverse:function(e){var t,r,n=e.x,o=e.y,i=n-this.x0,a=(o-this.y0)/this.a,s=i/this.a,l=1,u=0,c=0,f=0;for(t=1;t<=6;t++)r=u*a+l*s,l=l*a-u*s,u=r,c=c+this.C_re[t]*l-this.C_im[t]*u,f=f+this.C_im[t]*l+this.C_re[t]*u;for(var p=0;p.999999999999&&(r=.999999999999),t=Math.asin(r);var n=SL(this.long0+e.x/(.900316316158*this.a*Math.cos(t)));n<-Math.PI&&(n=-Math.PI),n>Math.PI&&(n=Math.PI),r=(2*t+Math.sin(2*t))/Math.PI,Math.abs(r)>1&&(r=1);var o=Math.asin(r);return e.x=n,e.y=o,e},names:["Mollweide","moll"]};var ND={init:function(){Math.abs(this.lat1+this.lat2)=0?(r=Math.sqrt(e.x*e.x+e.y*e.y),t=1):(r=-Math.sqrt(e.x*e.x+e.y*e.y),t=-1);var i=0;return 0!==r&&(i=Math.atan2(t*e.x,t*e.y)),this.sphere?(o=SL(this.long0+i/this.ns),n=pD(this.g-r/this.a),e.x=o,e.y=n,e):(n=hD(this.g-r/this.a,this.e0,this.e1,this.e2,this.e3),o=SL(this.long0+i/this.ns),e.x=o,e.y=n,e)},names:["Equidistant_Conic","eqdc"]};var DD={init:function(){this.R=this.a},forward:function(e){var t,r,n=e.x,o=e.y,i=SL(n-this.long0);Math.abs(o)<=zA&&(t=this.x0+this.R*i,r=this.y0);var a=_D(2*Math.abs(o/Math.PI));(Math.abs(i)<=zA||Math.abs(Math.abs(o)-FA)<=zA)&&(t=this.x0,r=o>=0?this.y0+Math.PI*this.R*Math.tan(.5*a):this.y0+Math.PI*this.R*-Math.tan(.5*a));var s=.5*Math.abs(Math.PI/i-i/Math.PI),l=s*s,u=Math.sin(a),c=Math.cos(a),f=c/(u+c-1),p=f*f,h=f*(2/u-1),y=h*h,d=Math.PI*this.R*(s*(f-y)+Math.sqrt(l*(f-y)*(f-y)-(y+l)*(p-y)))/(y+l);i<0&&(d=-d),t=this.x0+d;var v=l+f;return d=Math.PI*this.R*(h*v-s*Math.sqrt((y+l)*(l+1)-v*v))/(y+l),r=o>=0?this.y0+d:this.y0-d,e.x=t,e.y=r,e},inverse:function(e){var t,r,n,o,i,a,s,l,u,c,f,p;return e.x-=this.x0,e.y-=this.y0,f=Math.PI*this.R,i=(n=e.x/f)*n+(o=e.y/f)*o,f=3*(o*o/(l=-2*(a=-Math.abs(o)*(1+i))+1+2*o*o+i*i)+(2*(s=a-2*o*o+n*n)*s*s/l/l/l-9*a*s/l/l)/27)/(u=(a-s*s/3/l)/l)/(c=2*Math.sqrt(-u/3)),Math.abs(f)>1&&(f=f>=0?1:-1),p=Math.acos(f)/3,r=e.y>=0?(-c*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI:-(-c*Math.cos(p+Math.PI/3)-s/3/l)*Math.PI,t=Math.abs(n)2*FA*this.a)return;return r=t/this.a,n=Math.sin(r),o=Math.cos(r),i=this.long0,Math.abs(t)<=zA?a=this.lat0:(a=_D(o*this.sin_p12+e.y*n*this.cos_p12/t),s=Math.abs(this.lat0)-FA,i=Math.abs(s)<=zA?this.lat0>=0?SL(this.long0+Math.atan2(e.x,-e.y)):SL(this.long0-Math.atan2(-e.x,e.y)):SL(this.long0+Math.atan2(e.x*n,t*this.cos_p12*o-e.y*this.sin_p12*n))),e.x=i,e.y=a,e}return l=sD(this.es),u=lD(this.es),c=uD(this.es),f=cD(this.es),Math.abs(this.sin_p12-1)<=zA?(a=hD(((p=this.a*aD(l,u,c,f,FA))-(t=Math.sqrt(e.x*e.x+e.y*e.y)))/this.a,l,u,c,f),i=SL(this.long0+Math.atan2(e.x,-1*e.y)),e.x=i,e.y=a,e):Math.abs(this.sin_p12+1)<=zA?(p=this.a*aD(l,u,c,f,FA),a=hD(((t=Math.sqrt(e.x*e.x+e.y*e.y))-p)/this.a,l,u,c,f),i=SL(this.long0+Math.atan2(e.x,e.y)),e.x=i,e.y=a,e):(t=Math.sqrt(e.x*e.x+e.y*e.y),d=Math.atan2(e.x,e.y),h=fD(this.a,this.e,this.sin_p12),v=Math.cos(d),b=-(m=this.e*this.cos_p12*v)*m/(1-this.es),g=3*this.es*(1-b)*this.sin_p12*this.cos_p12*v/(1-this.es),O=1-b*(S=(w=t/h)-b*(1+b)*Math.pow(w,3)/6-g*(1+3*b)*Math.pow(w,4)/24)*S/2-w*S*S*S/6,y=Math.asin(this.sin_p12*Math.cos(S)+this.cos_p12*Math.sin(S)*v),i=SL(this.long0+Math.asin(Math.sin(d)*Math.sin(S)/Math.cos(y))),_=Math.sin(y),a=Math.atan2((_-this.es*O*this.sin_p12)*Math.tan(y),_*(1-this.es)),e.x=i,e.y=a,e)},names:["Azimuthal_Equidistant","aeqd"]};var FD={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(e){var t,r,n,o,i,a,s,l=e.x,u=e.y;return n=SL(l-this.long0),t=Math.sin(u),r=Math.cos(u),o=Math.cos(n),((i=this.sin_p14*t+this.cos_p14*r*o)>0||Math.abs(i)<=zA)&&(a=1*this.a*r*Math.sin(n),s=this.y0+1*this.a*(this.cos_p14*t-this.sin_p14*r*o)),e.x=a,e.y=s,e},inverse:function(e){var t,r,n,o,i,a,s;return e.x-=this.x0,e.y-=this.y0,r=_D((t=Math.sqrt(e.x*e.x+e.y*e.y))/this.a),n=Math.sin(r),o=Math.cos(r),a=this.long0,Math.abs(t)<=zA?(s=this.lat0,e.x=a,e.y=s,e):(s=_D(o*this.sin_p14+e.y*n*this.cos_p14/t),i=Math.abs(this.lat0)-FA,Math.abs(i)<=zA?(a=this.lat0>=0?SL(this.long0+Math.atan2(e.x,-e.y)):SL(this.long0-Math.atan2(-e.x,e.y)),e.x=a,e.y=s,e):(a=SL(this.long0+Math.atan2(e.x*n,t*this.cos_p14*o-e.y*this.sin_p14*n)),e.x=a,e.y=s,e))},names:["ortho"]},BD={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},GD={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4};function UD(e,t,r,n){var o;return eqA&&o<=FA+qA?(n.value=GD.AREA_1,o-=FA):o>FA+qA||o<=-(FA+qA)?(n.value=GD.AREA_2,o=o>=0?o-WA:o+WA):(n.value=GD.AREA_3,o+=FA)),o}function zD(e,t){var r=e+t;return r<-WA?r+=HA:r>+WA&&(r-=HA),r}var VD={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=FA-qA/2?this.face=BD.TOP:this.lat0<=-(FA-qA/2)?this.face=BD.BOTTOM:Math.abs(this.long0)<=qA?this.face=BD.FRONT:Math.abs(this.long0)<=FA+qA?this.face=this.long0>0?BD.RIGHT:BD.LEFT:this.face=BD.BACK,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(e){var t,r,n,o,i,a,s={x:0,y:0},l={value:0};if(e.x-=this.long0,t=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(e.y)):e.y,r=e.x,this.face===BD.TOP)o=FA-t,r>=qA&&r<=FA+qA?(l.value=GD.AREA_0,n=r-FA):r>FA+qA||r<=-(FA+qA)?(l.value=GD.AREA_1,n=r>0?r-WA:r+WA):r>-(FA+qA)&&r<=-qA?(l.value=GD.AREA_2,n=r+FA):(l.value=GD.AREA_3,n=r);else if(this.face===BD.BOTTOM)o=FA+t,r>=qA&&r<=FA+qA?(l.value=GD.AREA_0,n=-r+FA):r=-qA?(l.value=GD.AREA_1,n=-r):r<-qA&&r>=-(FA+qA)?(l.value=GD.AREA_2,n=-r-FA):(l.value=GD.AREA_3,n=r>0?-r+WA:-r-WA);else{var u,c,f,p,h,y;this.face===BD.RIGHT?r=zD(r,+FA):this.face===BD.BACK?r=zD(r,+WA):this.face===BD.LEFT&&(r=zD(r,-FA)),p=Math.sin(t),h=Math.cos(t),y=Math.sin(r),u=h*Math.cos(r),c=h*y,f=p,this.face===BD.FRONT?n=UD(o=Math.acos(u),f,c,l):this.face===BD.RIGHT?n=UD(o=Math.acos(c),f,-u,l):this.face===BD.BACK?n=UD(o=Math.acos(-u),f,-c,l):this.face===BD.LEFT?n=UD(o=Math.acos(-c),f,u,l):(o=n=0,l.value=GD.AREA_0)}return a=Math.atan(12/WA*(n+Math.acos(Math.sin(n)*Math.cos(qA))-FA)),i=Math.sqrt((1-Math.cos(o))/(Math.cos(a)*Math.cos(a))/(1-Math.cos(Math.atan(1/Math.cos(n))))),l.value===GD.AREA_1?a+=FA:l.value===GD.AREA_2?a+=WA:l.value===GD.AREA_3&&(a+=1.5*WA),s.x=i*Math.cos(a),s.y=i*Math.sin(a),s.x=s.x*this.a+this.x0,s.y=s.y*this.a+this.y0,e.x=s.x,e.y=s.y,e},inverse:function(e){var t,r,n,o,i,a,s,l,u,c,f,p,h={lam:0,phi:0},y={value:0};if(e.x=(e.x-this.x0)/this.a,e.y=(e.y-this.y0)/this.a,r=Math.atan(Math.sqrt(e.x*e.x+e.y*e.y)),t=Math.atan2(e.y,e.x),e.x>=0&&e.x>=Math.abs(e.y)?y.value=GD.AREA_0:e.y>=0&&e.y>=Math.abs(e.x)?(y.value=GD.AREA_1,t-=FA):e.x<0&&-e.x>=Math.abs(e.y)?(y.value=GD.AREA_2,t=t<0?t+WA:t-WA):(y.value=GD.AREA_3,t+=FA),u=WA/12*Math.tan(t),i=Math.sin(u)/(Math.cos(u)-1/Math.sqrt(2)),a=Math.atan(i),(s=1-(n=Math.cos(t))*n*(o=Math.tan(r))*o*(1-Math.cos(Math.atan(1/Math.cos(a)))))<-1?s=-1:s>1&&(s=1),this.face===BD.TOP)l=Math.acos(s),h.phi=FA-l,y.value===GD.AREA_0?h.lam=a+FA:y.value===GD.AREA_1?h.lam=a<0?a+WA:a-WA:y.value===GD.AREA_2?h.lam=a-FA:h.lam=a;else if(this.face===BD.BOTTOM)l=Math.acos(s),h.phi=l-FA,y.value===GD.AREA_0?h.lam=-a+FA:y.value===GD.AREA_1?h.lam=-a:y.value===GD.AREA_2?h.lam=-a-FA:h.lam=a<0?-a-WA:-a+WA;else{var d,v,m;u=(d=s)*d,v=(u+=(m=u>=1?0:Math.sqrt(1-u)*Math.sin(a))*m)>=1?0:Math.sqrt(1-u),y.value===GD.AREA_1?(u=v,v=-m,m=u):y.value===GD.AREA_2?(v=-v,m=-m):y.value===GD.AREA_3&&(u=v,v=m,m=-u),this.face===BD.RIGHT?(u=d,d=-v,v=u):this.face===BD.BACK?(d=-d,v=-v):this.face===BD.LEFT&&(u=d,d=v,v=-u),h.phi=Math.acos(-m)-FA,h.lam=Math.atan2(v,d),this.face===BD.RIGHT?h.lam=zD(h.lam,-FA):this.face===BD.BACK?h.lam=zD(h.lam,-WA):this.face===BD.LEFT&&(h.lam=zD(h.lam,+FA))}return 0!==this.es&&(c=h.phi<0?1:0,f=Math.tan(h.phi),p=this.b/Math.sqrt(f*f+this.one_minus_f_squared),h.phi=Math.atan(Math.sqrt(this.a*this.a-p*p)/(this.one_minus_f*p)),c&&(h.phi=-h.phi)),h.lam+=this.long0,e.x=h.lam,e.y=h.phi,e},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},JD=[[1,2.2199e-17,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],qD=[[-5.20417e-18,.0124,1.21431e-18,-8.45284e-11],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],HD=.8487,WD=1.3523,YD=JA/5,QD=1/YD,XD=18,KD=function(e,t){return e[0]+t*(e[1]+t*(e[2]+t*e[3]))},ZD=function(e,t){return e[1]+t*(2*e[2]+3*t*e[3])};var $D={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(e){var t=SL(e.x-this.long0),r=Math.abs(e.y),n=Math.floor(r*YD);n<0?n=0:n>=XD&&(n=XD-1),r=JA*(r-QD*n);var o={x:KD(JD[n],r)*t,y:KD(qD[n],r)};return e.y<0&&(o.y=-o.y),o.x=o.x*this.a*HD+this.x0,o.y=o.y*this.a*WD+this.y0,o},inverse:function(e){var t={x:(e.x-this.x0)/(this.a*HD),y:Math.abs(e.y-this.y0)/(this.a*WD)};if(t.y>=1)t.x/=JD[XD][0],t.y=e.y<0?-FA:FA;else{var r=Math.floor(t.y*XD);for(r<0?r=0:r>=XD&&(r=XD-1);;)if(qD[r][0]>t.y)--r;else{if(!(qD[r+1][0]<=t.y))break;++r}var n=qD[r],o=5*(t.y-n[0])/(qD[r+1][0]-n[0]);o=function(e,t,r,n){for(var o=t;n;--n){var i=e(o);if(o-=i,Math.abs(i)1&&console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored");var i={header:o,subgrids:function(e,t,r){for(var n=[],o=0;othis.bounds.max.x?this.bounds.max.x:e.x,e.y=e.ythis.bounds.max.y?this.bounds.max.y:e.y);var r=this._proj.inverse([e.x,e.y]);return new(EA().LatLng)(r[1],r[0],t)},_projFromCodeDef:function(e,t){if(t)oI.defs(e,t);else if(void 0===oI.defs[e]){var r=e.split(":");if(r.length>3&&(e=r[r.length-3]+":"+r[r.length-1]),void 0===oI.defs[e])throw"No projection definition for code "+e}return oI(e)},getUnits:function(){return this._proj.oProj.units||"degrees"}});var iI=EA().Class.extend({includes:EA().CRS,options:{transformation:new(EA().Transformation)(1,0,-1,0)},initialize:function(e,t){var r,n,o;if(EA().Proj._isProj4Obj(e)?(r=(n=e).srsCode,t=t||{},this.projection=new(EA().Proj.Projection)(n,t.bounds,t.wrapLng)):(r=e,o=(t=t||{}).def||"",this.projection=new(EA().Proj.Projection)(r,o,t.bounds,t.wrapLng)),EA().Util.setOptions(this,t),this.options.wrapLng&&(this.wrapLng=this.options.wrapLng),this.code=r,this.transformation=this.options.transformation,this.options.dpi=this.options.dpi||96,this.options.bounds&&(this.options.bounds=EA().bounds(this.options.bounds)),!this.options.origin&&this.options.bounds&&(this.options.origin=[this.options.bounds.min.x,this.options.bounds.max.y]),this.options.origin&&(this.options.origin instanceof EA().Point&&(this.options.origin=[this.options.origin.x,this.options.origin.y]),this.transformation=new(EA().Transformation)(1,-this.options.origin[0],-1,this.options.origin[1])),this.options.scales&&this.options.scales.length>0)this.scales=this.options.scales,this._scales=this._toProj4Scales(this.options.scales,this.options.dpi);else if(this.options.scaleDenominators&&this.options.scaleDenominators.length>0){this.scales=[];for(var i=0;i0){this._scales=[];for(var a=this.options.resolutions.length-1;a>=0;a--)this.options.resolutions[a]&&(this._scales[a]=1/this.options.resolutions[a])}else this.options.bounds&&(this._scales=this._getDefaultProj4ScalesByBounds(this.options.bounds));this._rectify(),this.infinite=!this.options.bounds},_rectify:function(){if(this._scales&&(this.resolutions||(this.resolutions=[],this.resolutions=this._proj4ScalesToResolutions(this._scales)),!this.scales)){this.scales=[];for(var e=0;eLeaflet\n with © SuperMap iClient",Common:{attribution:"Map Data © SuperMap iServer"},Online:{attribution:"Map Data © SuperMap Online"},ECharts:{attribution:"© 2018 百度 ECharts"},MapV:{attribution:"© 2018 百度 MapV "},Turf:{attribution:"© turfjs"},Baidu:{attribution:"Map Data © 2018 Baidu - GS(2016)2089号 - Data © 长地万方"},Cloud:{attribution:"Map Data ©2014 SuperMap - GS(2014)6070号-data©Navinfo"},Tianditu:{attribution:"Map Data "}}; +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +EA().Control.Attribution.include({options:{position:"bottomright",prefix:sI.Prefix}}),EA().Map.include({latLngToAccurateContainerPoint:function(e){var t=this.project(EA().latLng(e))._subtract(this.getPixelOrigin());return EA().point(t).add(this._getMapPanePos())}}),[EA().Polyline,EA().Polygon,EA().Marker,EA().CircleMarker,EA().Circle,EA().LayerGroup].map(function(e){return e.defaultFunction=e.prototype.toGeoJSON,e.include({toGeoJSON:function(t){return e.defaultFunction.call(this,t||10)}}),e}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var lI=EA().Evented.extend({options:{url:null,proxy:null,withCredentials:!1,crossOrigin:null},initialize:function(e,t){e&&(e=e.indexOf("/")!==e.length-1?e:e.substr(0,e.length-1)),this.url=e,EA().setOptions(this,t),this.fire("initialized",this)},destroy:function(){this.fire("destroy",this)}}),uI=lI.extend({options:{projection:null},initialize:function(e,t){t=t||{},EA().setOptions(this,t),t.projection&&(this.options.projection=t.projection),lI.prototype.initialize.call(this,e,t)},getMapInfo:function(e){var t=this;new db(t.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e},projection:t.options.projection}).processAsync()},getTilesets:function(e){var t=this;new T_(t.url,{proxy:t.options.proxy,withCredentials:t.options.withCredentials,crossOrigin:t.options.crossOrigin,headers:t.options.headers,eventListeners:{scope:t,processCompleted:e,processFailed:e}}).processAsync()}}),cI=EA().Control.extend({options:{layer:null,position:"topleft",title:"switch tile version",tooltip:"top",collapsed:!0,nextText:"+",lastText:"-",ico:"V",orientation:"horizontal",switch:!0},onAdd:function(){"vertical"!==this.options.orientation&&(this.options.orientation="horizontal");var e=this._initLayout();return this.options.layer&&this.setLayer(this.options.layer),e},setContent:function(e){var t=EA().Util.extend({},e);this.setVersionName(t.desc).setToolTip(t.desc)},setVersionName:function(e){var t=e;return e||(t=this.getValue()),this._sliderValue.innerHTML=t,this},setToolTip:function(e){return this.tooltip.innerHTML=e,this},updateLength:function(e){e>0&&(this.length=e,this.max=this.length-1,this.slider.setAttribute("max",this.max))},setLayer:function(e){e&&(this.options.layer=e);var t=this,r=t.options.layer;r.on("tilesetsinfoloaded",function(e){var r=e&&e.tileVersions;t.update(r)}),r.on("tileversionschanged",function(e){var r=e&&e.tileVersion;t.setContent(r)}),t.getTileSetsInfo()},update:function(e){this.tileVersions=e||[],this.updateLength(this.tileVersions.length)},getTileSetsInfo:function(){var e=this;e.options.layer&&new uI(e.options.layer._url).getTilesets(function(t){e.options.layer.setTileSetsInfo(t.result)})},removeLayer:function(){this.options.layer=null},nextTilesVersion:function(){return this.firstLoad?(this.options.layer.nextTilesVersion(),this.firstLoad=!1,this):parseInt(this.slider.value)>this.max-1?this:(this.slider.value=parseInt(this.slider.value)+1,this.options.layer.nextTilesVersion(),this)},lastTilesVersion:function(){return parseInt(this.slider.value)"+r+"",e}});EA().Map.mergeOptions({logoControl:!0}),EA().Map.addInitHook(function(){!this._logoAdded&&this.options.logoControl&&(!0===this.options.logoControl?this.logoControl=new fI:this.options.logoControl instanceof EA().Control&&(this.logoControl=this.options.logoControl),this.logoControl&&(this.addControl(this.logoControl),this._logoAdded=!0))});for(var pI,hI=function(e){return"[object Array]"==Object.prototype.toString.call(e)},yI={toSuperMapBounds:function(e){return e&&-1!==["FeatureCollection","Feature"].indexOf(e.type)&&(e=EA().geoJSON(e).getBounds()),e instanceof EA().LatLngBounds?new me(e.getSouthWest().lng,e.getSouthWest().lat,e.getNorthEast().lng,e.getNorthEast().lat):e instanceof EA().Bounds?new me(e.min.x,e.min.y,e.max.x,e.max.y):hI(e)?new me(e[0],e[1],e[2],e[3]):new me},isArray:hI,toProcessingParam:function(e){var t={};if(e.length<1)t="";else{for(var r=[],n=0;n-1?r:Math.log(e/(1/this.resolutions[0]))/Math.LN2},distance:function(e,t){var r=t.lng-e.lng,n=t.lat-e.lat;return Math.sqrt(r*r+n*n)},infinite:!1}),TI=function(e){return new CI(e)},EI=function(e){return e?(new Nr).toGeoJSON(e):e},jI=function(e){if(!e)return e;var t,r=new Nr;if(-1!=["FeatureCollection","Feature","Geometry"].indexOf(e.type))t=r.read(e,e.type);else if("function"==typeof e.toGeoJSON){var n=e.toGeoJSON();t=n?r.read(n,n.type):e}var o=t||e;return EA().Util.isArray(t)&&(1===t.length?o=t[0]:t.length>1&&(o=[],t.map(function(e){return o.push(e.geometry),e}))),o&&o.geometry?o.geometry:o},kI=function(e){var t;if(e===l.METER)t=1;else if(e===l.DEGREE)t=2*Math.PI*6378137/360;else if(e===l.KILOMETER)t=.001;else if(e===l.INCH)t=1/.025399999918;else{if(e!==l.FOOT)return t;t=.3048}return t},MI=function(e,t,r){var n=e*t*(1/.0254)*kI(r);return n=1/n},RI=function(e,t,r){var n=e*t*(1/.0254)*kI(r);return n=1/n},AI=function(e){return e>1?1/e:e},LI=function(e,t,r,n){return n=n||6378137,r=r||"",e>0&&t>0?(e=AI(e),"degree"===r.toLowerCase()||"degrees"===r.toLowerCase()||"dd"===r.toLowerCase()?254/t/e/(2*Math.PI*n/360)/1e4:254/t/e/1e4):-1},NI=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:EA().CRS.EPSG4326,r=arguments.length>2?arguments[2]:void 0,n=null,o=null;if(-1===["FeatureCollection","Feature","Geometry"].indexOf(e.type))if(e.toGeoJSON)e=e.toGeoJSON();else if(e instanceof EA().LatLngBounds)e=EA().rectangle(e).toGeoJSON();else{if(!(e instanceof EA().Bounds))throw new Error("This tool only supports data conversion in geojson format or Vector Layers of Leaflet.");e=EA().rectangle([[e.getTopLeft().x,e.getTopLeft().y],[e.getBottomRight().x,e.getBottomRight().y]]).toGeoJSON()}var i={point:function(e){return o(e)},multipoint:function(e){return i.linestring.apply(this,[e])},linestring:function(e){for(var t=[],r=null,n=0,o=e.length;n(this._map.options.maxZoom||18)||e<(this._map.options.minZoom||0))this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null);else{var r=this._getImageParams();r?this._requestImage(r,t):this._currentImage&&(this._currentImage._map.removeLayer(this._currentImage),this._currentImage=null)}}},_calculateBounds:function(){var e=this._map.getPixelBounds(),t=this._map.unproject(e.getBottomLeft()),r=this._map.unproject(e.getTopRight()),n=this._map.options.crs.project(r),o=this._map.options.crs.project(t);return EA().bounds(n,o)},_compriseBounds:function(e){var t={leftBottom:{x:e.getBottomLeft().x,y:e.getTopRight().y},rightTop:{x:e.getTopRight().x,y:e.getBottomLeft().y}};return JSON.stringify(t)},_calculateImageSize:function(){var e=this._map,t=e.getPixelBounds(),r=e.getSize(),n=e.unproject(t.getBottomLeft()),o=e.unproject(t.getTopRight()),i=e.latLngToLayerPoint(o).y,a=e.latLngToLayerPoint(n).y;return(i>0||ar.max.x)||!t.wrapLat&&(e.yr.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(e);return EA().latLngBounds(this.options.bounds).overlaps(n)}}),JI=EA().TileLayer.extend({options:{layersID:null,redirect:!1,transparent:!0,cacheEnabled:!0,clipRegionEnabled:!1,clipRegion:null,prjCoordSys:null,overlapDisplayed:!1,overlapDisplayedOptions:null,tileversion:null,crs:null,format:"png",tileProxy:null,attribution:sI.Common.attribution,subdomains:null},initialize:function(e,t){this._url=e,EA().TileLayer.prototype.initialize.apply(this,arguments),EA().setOptions(this,t),EA().stamp(this),this.tileSetsIndex=-1,this.tempIndex=-1},onAdd:function(e){this._crs=this.options.crs||e.options.crs,EA().TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e){var t=this.getScaleFromCoords(e),r=this._getLayerUrl()+"&scale="+t+"&x="+e.x+"&y="+e.y;return this.options.tileProxy&&(r=this.options.tileProxy+encodeURIComponent(r)),this.options.cacheEnabled||(r+="&_t="+(new Date).getTime()),this.options.subdomains&&(r=EA().Util.template(r,{s:this._getSubdomain(e)})),r},getScale:function(e){var t=e||this._map.getZoom();return this.scales[t]},getScaleFromCoords:function(e){var t,r=this;return r.scales&&r.scales[e.z]?r.scales[e.z]:(r.scales=r.scales||{},t=r.getDefaultScale(e),r.scales[e.z]=t,t)},getDefaultScale:function(e){var t=this._crs;if(t.scales)return t.scales[e.z];var r=this._tileCoordsToBounds(e),n=t.project(r.getNorthEast()),o=t.project(r.getSouthWest()),i=this.options.tileSize,a=Math.max(Math.abs(n.x-o.x)/i,Math.abs(n.y-o.y)/i),s=l.METER;if(t.code){var u=t.code.split(":");if(u&&u.length>1){var c=parseInt(u[1]);s=c&&c>=4e3&&c<=5e3?l.DEGREE:l.METER}}return MI(a,96,s)},setTileSetsInfo:function(e){this.tileSets=e,EA().Util.isArray(this.tileSets)&&(this.tileSets=this.tileSets[0]),this.tileSets&&(this.fire("tilesetsinfoloaded",{tileVersions:this.tileSets.tileVersions}),this.changeTilesVersion())},lastTilesVersion:function(){this.tempIndex=this.tileSetsIndex-1,this.changeTilesVersion()},nextTilesVersion:function(){this.tempIndex=this.tileSetsIndex+1,this.changeTilesVersion()},changeTilesVersion:function(){var e=this;if(null!=e.tileSets&&!(e.tempIndex===e.tileSetsIndex||this.tempIndex<0)){var t=e.tileSets.tileVersions;if(t&&e.tempIndex=0){var r=t[e.tempIndex].name;e.mergeTileVersionParam(r)&&(e.tileSetsIndex=e.tempIndex,e.fire("tileversionschanged",{tileVersion:t[e.tempIndex]}))}}},updateCurrentTileSetsIndex:function(e){this.tempIndex=e},mergeTileVersionParam:function(e){return!!e&&(this.requestParams.tileversion=e,this._paramsChanged=!0,this.redraw(),this._paramsChanged=!1,!0)},_getLayerUrl:function(){return this._paramsChanged&&(this._layerUrl=this._createLayerUrl()),this._layerUrl||this._createLayerUrl()},_createLayerUrl:function(){var e=fe.urlPathAppend(this._url,"tileImage.".concat(this.options.format));return this.requestParams=this.requestParams||this._getAllRequestParams(),e=fe.urlAppend(e,TA.Util.getParamString(this.requestParams)),e=un.appendCredential(e),this._layerUrl=e,e},_getAllRequestParams:function(){var e=this.options||{},t={},r=this.options.tileSize;r instanceof EA().Point||(r=EA().point(r,r)),t.width=r.x,t.height=r.y,t.redirect=!0===e.redirect,t.transparent=!0===e.transparent,t.cacheEnabled=!(!1===e.cacheEnabled),e.prjCoordSys&&(t.prjCoordSys=JSON.stringify(e.prjCoordSys)),e.layersID&&(t.layersID=e.layersID.toString()),e.clipRegionEnabled&&e.clipRegion&&(e.clipRegion=Er.fromGeometry(jI(e.clipRegion)),t.clipRegionEnabled=e.clipRegionEnabled,t.clipRegion=JSON.stringify(e.clipRegion));var n=this._crs;if(n.options&&n.options.origin)t.origin=JSON.stringify({x:n.options.origin[0],y:n.options.origin[1]});else if(n.projection&&n.projection.bounds){var o=n.projection.bounds,i=EA().point(o.min.x,o.max.y);t.origin=JSON.stringify({x:i.x,y:i.y})}return!1===e.overlapDisplayed?(t.overlapDisplayed=!1,e.overlapDisplayedOptions&&(t.overlapDisplayedOptions=this.overlapDisplayedOptions.toString())):t.overlapDisplayed=!0,!0===t.cacheEnabled&&e.tileversion&&(t.tileversion=e.tileversion.toString()),e.rasterfunction&&(t.rasterfunction=JSON.stringify(e.rasterfunction)),t}}),qI=function(e,t){return new JI(e,t)},HI=r(879),WI=r.n(HI),YI={TEXT:{fontSize:"14px",fontFamily:"Arial Unicode MS Regular,Microsoft YaHei",textAlign:"left",color:"rgba(255,255,255,0)",fillColor:"rgba(80,80,80,1)",weight:1,globalAlpha:1},POINT:{fillColor:"#ffcc00",color:"#cc3333",weight:1,radius:3,opacity:1},LINE:{color:"rgba(0,0,0,0)",weight:1,lineCap:"butt",lineJoin:"round",dashOffset:0,dashArray:[],opacity:1},REGION:{color:"rgba(0,0,0,0)",fillColor:"rgba(0,0,0,0)",weight:1,lineCap:"butt",lineJoin:"round",dashOffset:0,opacity:1,fillOpacity:1,dashArray:[]}},QI={TEXT:{"text-size":"fontSize","text-face-name":"fontFamily","text-align":"textAlign","text-name":"textName","text-weight":"fontWeight","text-halo-color":"color","text-fill":"fillColor","text-comp-op":"globalCompositeOperation"},POINT:{"point-file":"iconUrl","point-fill":"fillColor","point-radius":"radius","point-halo-color":"color","point-comp-op":"globalCompositeOperation"},LINE:{"line-color":"color","line-width":"weight","line-cap":"lineCap","line-join":"lineJoin","line-dash-offset":"dashOffset","line-opacity":"opacity","line-dasharray":"dashArray","line-comp-op":"globalCompositeOperation"},REGION:{"line-color":"color","line-width":"weight","line-cap":"lineCap","line-join":"lineJoin","line-dash-offset":"dashOffset","line-opacity":"opacity","line-dasharray":"dashArray","polygon-fill":"fillColor","polygon-opacity":"fillOpacity","polygon-comp-op":"globalCompositeOperation"}},XI={lineWidth:{leafletStyle:"weight",type:"number",unit:"mm",defaultValue:.1},fillForeColor:{leafletStyle:"fillColor",type:"color",defaultValue:"rgba(0,0,0,0)"},foreColor:{leafletStyle:"color",type:"color",defaultValue:"rgba(0,0,0,0)"},markerSize:{leafletStyle:"markerSize",type:"number",unit:"mm",defaultValue:2.4},lineColor:{leafletStyle:"color",type:"color",defaultValue:"#000000"}},KI={clear:"",src:"",dst:"","src-over":"source-over","dst-over":"destination-over","src-in":"source-in","dst-in":"destination-in","src-out":"source-out","dst-out":"destination-out","src-atop":"source-atop","dst-atop":"destination-atop",xor:"xor",plus:"lighter",minus:"",multiply:"",screen:"",overlay:"",darken:"",lighten:"lighter","color-dodge":"","color-burn":"","hard-light":"","soft-light":"",difference:"",exclusion:"",contrast:"",invert:"","invert-rgb":"","grain-merge":"","grain-extract":"",hue:"",saturation:"",color:"",value:""};function ZI(e,t){for(var r=0;r-1;a--)if(e.indexOf(i[a])>-1){o=e.replace(i[a],r[i[a]]);break}o=o.replace(/[#]/gi,"#"),r[e]=n,t=t.replace(new RegExp(o,"g"),n)}),t=(t=t.replace(/[#]/gi,"\n#")).replace(/\[zoom/gi,"[scale")}}},{key:"pickShader",value:function(e){if(!this.cartoCSS)return null;var t=e.replace(/[@#\s]/gi,"___");return this.cartoCSS[t]}},{key:"getDefaultStyle",value:function(e){var t={},r=YI[e];for(var n in r){var o=r[n];t[n]=o}return t}},{key:"getStyleFromiPortalMarker",value:function(e){return 0==e.indexOf("./")?null:(0==e.indexOf("http://support.supermap.com.cn:8092/static/portal")&&(e=e.replace("http://support.supermap.com.cn:8092/static/portal","http://support.supermap.com.cn:8092/apps/viewer/static")),EA().icon({iconUrl:e,iconSize:EA().point(48,43),iconAnchor:EA().point(24,43),popupAnchor:EA().point(0,-43)}))}},{key:"getStyleFromiPortalStyle",value:function(e,t,r){var n=r?JSON.parse(r):null,o={};if("Point"===t||"MultiPoint"===t){var i=n||e.pointStyle;return i.externalGraphic?0==i.externalGraphic.indexOf("./")?null:(0==i.externalGraphic.indexOf("http://support.supermap.com.cn:8092/static/portal")&&(i.externalGraphic=i.externalGraphic.replace("http://support.supermap.com.cn:8092/static/portal","http://support.supermap.com.cn:8092/apps/viewer/static")),EA().icon({iconUrl:i.externalGraphic,iconSize:EA().point(i.graphicWidth,i.graphicHeight),iconAnchor:EA().point(-i.graphicXOffset,-i.graphicYOffset),popupAnchor:EA().point(0,-i.graphicHeight)})):(o.radius=i.pointRadius,o.color=i.strokeColor,o.opacity=i.strokeOpacity,o.lineCap=i.strokeLineCap,o.weight=i.strokeWidth,o.fillColor=i.fillColor,o.fillOpacity=i.fillOpacity,o.dashArray=this.dashStyle(i,1),o)}if("LineString"===t||"MultiLineString"===t||"Box"===t){var a=n||e.lineStyle;return o.color=a.strokeColor,o.opacity=a.strokeOpacity,o.fillOpacity=a.fillOpacity,o.lineCap=a.strokeLineCap,o.weight=a.strokeWidth,o.dashArray=this.dashStyle(a,1),o}if("Polygon"===t||"MultiPolygon"===t){var s=n||e.polygonStyle;return o.color=s.strokeColor,o.opacity=s.strokeOpacity,o.lineCap=s.strokeLineCap,o.weight=s.strokeWidth,o.fillColor=s.fillColor,o.fillOpacity=s.fillOpacity,o.dashArray=this.dashStyle(s,1),o}}},{key:"dashStyle",value:function(e,t){if(!e)return[];var r=e.strokeWidth*t,n=e.strokeDashstyle;switch(n){case"solid":return[];case"dot":return[1,4*r];case"dash":return[4*r,4*r];case"dashdot":return[4*r,4*r,1,4*r];case"longdash":return[8*r,4*r];case"longdashdot":return[8*r,4*r,1,4*r];default:return n?fe.isArray(n)?n:(n=Y.trim(n).replace(/\s+/g,",")).replace(/\[|\]/gi,"").split(","):[]}}},{key:"getValidStyleFromCarto",value:function(e,t,r,n,o){if(!r)return null;var i=n.type,a=n.properties.attributes||{},s=this.getDefaultStyle(i);o=void 0===o||o,a.FEATUREID=n.properties.id,a.SCALE=t;for(var l,u,c=QI[i],f=0,p=r.length;f7?0:o.fillSymbolID,c=o.lineSymbolID>5?0:o.lineSymbolID;for(var f in o){var p=XI[f];if(p){var h=p.leafletStyle;switch(p.type){case"number":var y=o[f];p.unit&&(y=96*y*pe[p.unit]*2.5),n[h]=y;break;case"color":var d=o[f],v=void 0,m=1;if("fillColor"===h)0!==u&&1!==u||(m=1-u,v="rgba("+d.red+","+d.green+","+d.blue+","+m+")");else if("color"===h){if(0===c||5===c)m=0===c?1:0;else{var b=[1,0];switch(c){case 1:b=[9.7,3.7];break;case 2:b=[3.7,3.7];break;case 3:b=[9.7,3.7,2.3,3.7];break;case 4:b=[9.7,3.7,2.3,3.7,2.3,3.7]}n.lineDasharray=b}v="rgba("+d.red+","+d.green+","+d.blue+","+m+")"}n[h]=v}}}return t.textField&&(n.textAlign="LEFT"),n}}])&&ZI(t.prototype,r),n&&ZI(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}(),eF=EA().Class.extend({initialize:function(e){var t=(e=e||{}).latLng||e._latLng;this._latLng=EA().latLng(t.lat,t.lng),this._style=e.style||e._canvas,this.attributes=e.attributes,this.id=e.id?e.id:null},getId:function(){return this.id},setId:function(e){this.id=e},setLatLng:function(e){this._latLng=e},setCanvas:function(e){this._style=e},setAttributes:function(e){this.attributes=e},getLatLng:function(){return this._latLng},getCanvas:function(){return this._style},getAttributes:function(){return this.attributes},setStyle:function(e){this._style=e},getStyle:function(){return this._style}}),tF=EA().Class.extend({initialize:function(e,t){this.geometry=e,this.attributes=t},toFeature:function(){var e=this.geometry;if(e.toGeoJSON){var t=e.toGeoJSON();return t.properties=this.attributes,(new Nr).read(t)[0]}if(3===e.length)e=new nt(e[1],e[0],e[2]);else if(2===e.length)e=new Ve(e[0],e[1]);else if(e instanceof EA().LatLng)e=new Ve(e.lng,e.lat);else if(e instanceof EA().Point)e=new Ve(e.x,e.y);else if(e instanceof EA().CircleMarker){var r=e.getLatLng();e=new Ve(r.lng,r.lat)}return new er(e,this.attributes)},reverseLatLngs:function(e){EA().Util.isArray(e)||(e=[e]);for(var t=0;t0&&t._reset(),t.addTFEvents(),t.mouseMoveHandler=function(e){var r=e.layerPoint;t.currentMousePosition=EA().point(r.x+t.movingOffset[0],r.y+t.movingOffset[1])},e.on("mousemove",t.mouseMoveHandler),t.update(e.getBounds())}else e.removeLayer(t)},addFeatures:function(e){},redrawThematicFeatures:function(e){},destroyFeatures:function(e){if(void 0===e&&(e=this.features),e){this.removeFeatures(e);for(var t=e.length-1;t>=0;t--)e[t].destroy()}},removeFeatures:function(e){var t=this;if(e&&0!==e.length){if(e===t.features)return t.removeAllFeatures();EA().Util.isArray(e)||(e=[e]);for(var r=[],n=e.length-1;n>=0;n--){var o=e[n],i=EA().Util.indexOf(t.features,o);-1!==i?t.features.splice(i,1):r.push(o)}for(var a=[],s=0,l=t.features.length;su)){var v=s[0];s.splice(0,1),delete a[v]}}}}if(t.renderer.render(),n&&t.options.isHoverAble&&t.options.isMultiHover){var m=this.getShapesByFeatureID(n);this.renderer.updateHoverShapes(m)}},createThematicFeature:function(e){var t=this,r=t.getStyleByData(e);e.style&&t.isAllowFeatureStyle&&(r=fe.copyAttributesWithClip(e.style));var n={};n.nodesClipPixel=t.options.nodesClipPixel,n.isHoverAble=t.options.isHoverAble,n.isMultiHover=t.options.isMultiHover,n.isClickAble=t.options.isClickAble,n.highlightStyle=Jj.transformStyle(t.highlightStyle);for(var o=new cM(e,t,Jj.transformStyle(r),n),i=0;i0;if(t.themeField&&s&&r.attributes){var l=t.themeField,u=r.attributes;for(var c in u)if(l===c){i=!0,a=u[c];break}}if(i)for(var f=0,p=o.length;f0;if(t.themeField&&s&&r.attributes){var l=t.themeField,u=r.attributes;for(var c in u)if(l===c){i=!0,a=u[c];break}}if(i)for(var f=0,p=o.length;f=o[f].start&&a<=o[f].end:a>=o[f].start&&a0&&0==this.labelFeatures.length)for(var t=this.setLabelsStyle(this.features),r=0,n=t.length;r=0&&h.x<=u.x&&h.y>=0&&h.y<=u.y){if(r.style.minZoomLevel>-1&&c<=r.style.minZoomLevel)continue;if(r.style.maxZoomLevel>-1&&c>r.style.maxZoomLevel)continue;var y=null;r.isStyleChange?(r.isStyleChange=null,y=this.calculateLabelBounds(r,h)):y=r.geometry.bsInfo.w&&r.geometry.bsInfo.h?this.calculateLabelBounds2(r,h):this.calculateLabelBounds(r,h);var d=new me(0,u.y,u.x,0),v=y.length;if(this.options.isAvoid){var m=this.getAvoidInfo(d,y);if(m){if("left"===m.aspectW){r.style.labelXOffset+=m.offsetX;for(var b=0;b=o[l].start&&a=o[l].start&&as&&(s=r,l="top")}if(t.y>e.bottom){var n=Math.abs(t.y-e.bottom);n>s&&(s=n,l="bottom")}if(t.xa&&(a=o,u="left")}if(t.x>e.right){var i=Math.abs(t.x-e.right);i>a&&(a=i,u="right")}}}},isQuadrilateralOverLap:function(e,t){var r=e.length,n=t.length;if(5!==r||5!==n)return null;for(var o=!1,i=0;i=0&&e.options.fontOpacity<1&&(r.globalAlpha=e.options.fontOpacity),r.fillText){r.font=n,r.textAlign=e.options.textAlign,r.textBaseline=e.options.textBaseline;var s=e.options.vfactor,l=r.measureText("Mg").height||r.measureText("xx").width;t.y+=l*s*(a-1);for(var u=0;u0;){var o=t.pop(),i=o.type,a=o.layerType=o.layerType||"BASE_LAYER";"OVERLAY_LAYER"!==a&&(i=a),this.createLayer(i,o)}this.fire("maploaded",{map:this._map})}},createCRS:function(e,t,r,n,o){return e<0?new CI({bounds:o,origin:n,resolutions:r}):910112===e||910102===e?dI:(910111===e&&(e=3857),910101===e&&(e=4326),aI("EPSG:"+e,{origin:n,resolutions:r,bounds:o}))},createMap:function(e){var t=e.crs||EA().CRS.EPSG3857,r=EA().latLngBounds(t.unproject(e.bounds.min),t.unproject(e.bounds.max));this._map=EA().map(this.options.map,{center:r.getCenter(),maxZoom:e.maxZoom||22,minZoom:e.minZoom||0,zoom:e.zoom||0,crs:t,renderer:EA().canvas()}),t instanceof CI?this._map.setZoom(e.zoom?e.zoom+2:2,{maxZoom:e.maxZoom||22}):this._map.fitBounds(r,{maxZoom:e.maxZoom||22})},getResolutionsFromScales:function(e,t,r,n){for(var o=[],i=0;i 0"},datasetNames:[t+":"+r],fromIndex:0,toIndex:1e5});lF(e).getFeaturesBySQL(a,i,o)},createThemeLayer:function(e){var t,r=this,n=e.themeSettings&&JSON.parse(e.themeSettings),o=n.type;if(e.themeSettings=n,(t="HEAT"===o?this.createHeatLayer(e,n):"UNIQUE"===o?this.createUniqueLayer(e,n):"RANGE"===o?this.createRangeLayer(e,n):this.createBaseThemeLayer(e,n))&&(this.addFeature2ThemeLayer(e,t),t.on("add",function(e){r.registerThemeEvent(e.target)})),n&&n.labelField){var i=this.createLabelLayer(e,n);i.on("add",function(e){r.registerThemeEvent(e.target)}),t.labelLayer=i}return t},createBaseThemeLayer:function(e,t){var r=e.style,n=e.opacity,o=t.vectorType,i=r.pointStyle;i.fill="LINE"!==o;var a={};a.radius=i.pointRadius,a.color=i.strokeColor,a.opacity=i.strokeOpacity,a.lineCap=i.strokeLineCap,a.weight=i.strokeWidth,a.fillColor=i.fillColor,a.fillOpacity=i.fillOpacity;var s=function(e,t){return EA().circleMarker(t,a)};return i.unicode&&(s=function(e,t){return new uF(t,i)}),EA().geoJSON({type:"GeometryCollection",geometries:[]},{pointToLayer:s,opacity:n})},createUniqueLayer:function(e,t){for(var r=e.title,n=t.field,o=[],i=t.settings,a=e.isVisible,s=e.opacity,l=t.vectorType,u=0;u0?{fillColor:"#ffffff"}:i[0].style;var s=EA().Util.extend(new $C,r);s.fontWeight="bold",s.fontSize="14px",s.labelRect=!0,s.strokeColor=s.fillColor,s.fontColor=t.labelColor,t.labelFont&&(s.fontFamily=t.labelFont);var l=new aF(n,{visibility:a,opacity:.7});return this.registerThemeEvent(l),l.style=s,l.themeField=o,l.styleGroups=[],l},createHeatLayer:function(e,t){for(var r,n=t.colors||["blue","cyan","lime","yellow","red"],o={},i=0,a=n.length,s=1;i0&&i.push(n[a]);else for(var u=0,c=(n=o.parseFeatureFromJson(t.content)).length;u0&&i.push(n[u]);var f=e.prjCoordSys&&e.prjCoordSys.epsgCode;s?o.changeFeatureLayerEpsgCode(f,"4326",r,i,function(e){j(e)}):j(i)},function(){});else{for(var b=[],g=e.features,w=0,S=g.length;w0){var _=O.geometry.points[0].x,P=O.geometry.points[0].y,x=new Ve(_,P),C=new er(x,O.attributes,O.style);b.push(C)}}j(b)}}else if(i){var T=e.datasourceName;f=(c=(u=e.subLayers&&JSON.parse(e.subLayers)).length&&u.length>0?u[0]:u)&&c.name,this.getFeaturesBySQL(e.url,T,f,y.filter,t.ISERVER,function(t){var o,i,a=t.result,l=[];if(a&&a.features){for(var u=0,c=(o=a.features).length;u0?u[0]:u)&&c.name;var E=e.prjCoordSys&&e.prjCoordSys.epsgCode;this.getFeaturesBySQL(p,h,f,d,t.ISERVER,function(e){s?o.changeFeatureLayerEpsgCode(E,"4326",r,e,function(e){j(e)}):j(e)})}}function j(t){if(r&&r.labelLayer instanceof aF&&o.addFeature2LabelLayer(r.labelLayer,t,e),EA().HeatLayer&&r instanceof EA().HeatLayer){for(var n=[],i=0,a=t.length;i0){for(i=0,a=n.length;i==/g,">=").replace(/<==/g,"<="))+")":" * where (1==1||1>=0)"},getAttributesObjFromTable:function(e,t){if(0!==e.length&&0!==t.length){for(var r=[],n=0;n-1?(r=(e=JSON.parse(e)).needTransform,t=e.isAddFile):"needTransform"===e?(r=!0,t=!1):t="true"===e,{isAddFile:t,needTransform:r}},registerThemeEvent:function(e){var t=this;e.on("click",function(r){var n;e.map&&(t.selectedFeature&&(t.fire("featureunselected",{feature:t.selectedFeature}),t.selectedFeature=null),r.target&&r.target.refDataID&&(n=e.getFeatureById(r.target.refDataID)),n&&(t.selectedFeature=n,t.fire("featureselected",{feature:n})))}),e.on("mousemove",function(r){var n;e.map&&(r.target&&r.target.refDataID&&(r.target&&r.target.refDataID&&(n=e.getFeatureById(r.target.refDataID)),n&&t.fire("featuremousemove",{feature:n})))})},SERVER_TYPE_MAP:{"EPSG:4326":"WGS84","EPSG:3857":"MERCATOR","EPSG:900913":"MERCATOR","EPSG:102113":"MERCATOR","EPSG:910101":"GCJ02","EPSG:910111":"GCJ02MERCATOR","EPSG:910102":"BD","EPSG:910112":"BDMERCATOR"}}),fF=EA().TileLayer.extend({options:{collectionId:null,sqlFilter:null,ids:null,names:null,renderingRule:null,format:"png",zoomOffset:1,transparent:!0,cacheEnabled:!0,tileProxy:null,attribution:sI.Common.attribution,subdomains:null},initialize:function(e,t){this._url=e,EA().TileLayer.prototype.initialize.apply(this,arguments),EA().setOptions(this,t),EA().stamp(this)},onAdd:function(e){EA().TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e){var t=this._getLayerUrl()+"&z="+this._getZoomForUrl()+"&x="+e.x+"&y="+e.y;return this.options.tileProxy&&(t=this.options.tileProxy+encodeURIComponent(t)),this.options.cacheEnabled||(t+="&_t="+(new Date).getTime()),this.options.subdomains&&(t=EA().Util.template(t,{s:this._getSubdomain(e)})),t},_getLayerUrl:function(){return this._layerUrl||this._createLayerUrl()},_createLayerUrl:function(){var e=fe.urlPathAppend(this._url,"/collections/".concat(this.options.collectionId,"/tile.").concat(this.options.format));return this.requestParams=this.requestParams||this._getAllRequestParams(),e=fe.urlAppend(e,TA.Util.getParamString(this.requestParams)),e=un.appendCredential(e),this._layerUrl=e,e},_getAllRequestParams:function(){var e=this.options||{},t={};return t.transparent=!0===e.transparent,t.cacheEnabled=!(!1===e.cacheEnabled),e.sqlFilter&&(t.sqlFilter=e.sqlFilter),e.renderingRule&&(t.renderingRule=JSON.stringify(e.renderingRule)),e.ids&&(t.ids=e.ids.join(",")),e.names&&(t.names=e.names.join(",")),t}}),pF=lI.extend({options:{geometry:null,prjCoordSys:null,excludeField:null},initialize:function(e,t){t=t||{},EA().setOptions(this,t),t.projection&&(this.options.prjCoordSys=t.projection),lI.prototype.initialize.call(this,e,t),this.dataFlow=new us(e,t),this.dataFlow.events.on({broadcastSocketConnected:this._defaultEvent,broadcastSocketError:this._defaultEvent,broadcastFailed:this._defaultEvent,broadcastSucceeded:this._defaultEvent,subscribeSocketConnected:this._defaultEvent,subscribeSocketError:this._defaultEvent,messageSucceeded:this._defaultEvent,setFilterParamSucceeded:this._defaultEvent,scope:this})},initBroadcast:function(){return this.dataFlow.initBroadcast(),this},broadcast:function(e){this.dataFlow.broadcast(e)},initSubscribe:function(){return this.dataFlow.initSubscribe(),this},setExcludeField:function(e){return this.dataFlow.setExcludeField(e),this.options.excludeField=e,this},setGeometry:function(e){return this.dataFlow.setGeometry(e),this.options.geometry=e,this},unSubscribe:function(){this.dataFlow.unSubscribe()},unBroadcast:function(){this.dataFlow.unBroadcast()},_defaultEvent:function(e){this.fire(e.eventType||e.type,e)}}),hF=function(){try{return mapv}catch(e){return{}}}();function yF(e){"@babel/helpers - typeof";return(yF="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function dF(e,t){for(var r=0;rt.options.maxZoom)){var a=o.getBounds(),s=a.getEast()-a.getWest(),l=a.getNorth()-a.getSouth(),u=o.getSize(),c=s/u.x,f=l/u.y,p=kI("DEGREE")*c,h=this.canvasLayer.getTopLeft(),y=o.latLngToAccurateContainerPoint(h),d={transferCoordinate:function(e){var r,n={x:(r="2d"===t.context?o.latLngToAccurateContainerPoint(EA().latLng(e[1],e[0])):{x:(e[0]-h.lng)/c,y:(h.lat-e[1])/f}).x-y.x,y:r.y-y.y};return[n.x,n.y]}};void 0!==e&&(d.filter=function(t){var n=r.trails||10;return e&&t.time>e-n&&t.time200&&(this._last=new Date,this.update({data:this.data,options:this.mapVOptions}))},_toMapvStyle:function(e){var t={draw:"simple"};return t.strokeStyle=e.color,t.lineWidth=e.width,t.globalAlpha=e.fillOpacity||e.opacity,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.fillStyle=e.fillColor,t.size=e.radius,t}}),CF=EA().GeoJSON.extend({initialize:function(e,t){(t=t||{}).style&&!t.pointToLayer&&(t.pointToLayer=function(e,r){return EA().circleMarker(r,t.style())}),EA().Util.setOptions(this,t),this._layers={},EA().stamp(this),this.url=e,this.idCache={}},onMessageSuccessed:function(e){var t=e.featureResult,r=e.featureResult.properties[this.options.idField],n=null;void 0!==r&&this.idCache[r]?(n=this.getLayer(this.idCache[r]),this._updateLayerData(n,t)):((n=EA().GeoJSON.geometryToLayer(t,this.options)).feature=EA().GeoJSON.asFeature(t),this.addLayer(n),void 0!==r&&(this.idCache[r]=this.getLayerId(n))),this.options.onEachFeature&&this.options.onEachFeature(t,n)},_updateLayerData:function(e,t){t.properties&&(e.feature.properties=t.properties);var r=[];switch(t.geometry.type){case"Point":r=EA().GeoJSON.coordsToLatLng(t.geometry.coordinates),e.setLatLng(r);break;case"LineString":r=EA().GeoJSON.coordsToLatLngs(t.geometry.coordinates,0),e.setLatLngs(r);break;case"MultiLineString":case"Polygon":r=EA().GeoJSON.coordsToLatLngs(t.geometry.coordinates,1),e.setLatLngs(r);break;case"MultiPolygon":r=EA().GeoJSON.coordsToLatLngs(t.geometry.coordinates,2),e.setLatLngs(r)}}}),TF=EA().LayerGroup.extend({options:{geometry:null,prjCoordSys:null,excludeField:null,idField:"id",render:"normal"},initialize:function(e,t){t=t||{},EA().Util.setOptions(this,t),this.url=e,this._layers={},this.dataService=new pF(this.url,{geometry:this.options.geometry,prjCoordSys:this.options.prjCoordSys,excludeField:this.options.excludeField})},onAdd:function(e){var t=this;this.dataService.initSubscribe(),this.dataService.on("subscribeSocketConnected",function(e){return t.fire("subscribesucceeded",e)}),this.dataService.on("subscribeSocketError",function(e){return t.fire("subscribefailed",e)}),this.dataService.on("messageSucceeded",function(e){return t._onMessageSuccessed(e)}),this.dataService.on("setFilterParamSucceeded",function(e){return t.fire("setfilterparamsucceeded",e)}),"mapv"===this.options.render?this.addLayer(new xF(this.url,this.options)):this.addLayer(new CF(this.url,this.options)),EA().LayerGroup.prototype.onAdd.call(this,e)},onRemove:function(e){EA().LayerGroup.prototype.onRemove.call(this,e),this.dataService&&this.dataService.unSubscribe()},setExcludeField:function(e){return this.dataService.setExcludeField(e),this.options.excludeField=e,this},setGeometry:function(e){return this.dataService.setGeometry(e),this.options.geometry=e,this},_onMessageSuccessed:function(e){var t=this;this.getLayers().map(function(r){return r.onMessageSuccessed&&(r.onMessageSuccessed(e),t.fire("dataupdated",{layer:r,data:e.featureResult})),r})}}),EF=EA().Layer.extend({includes:[],_echartsContainer:null,_map:null,_ec:null,_echartsOptions:null,options:{attribution:sI.ECharts.attribution,loadWhileAnimating:!1},initialize:function(e,t){EA().Util.setOptions(this,t),this.setOption(e)},setOption:function(e,t,r){var n=e.baseOption||e;n.LeafletMap=n.LeafletMap||{roam:!0},n.animation=!0===n.animation,this._echartsOptions=e,this._ec&&this._ec.setOption(e,t,r)},getEcharts:function(){return this._ec},_disableEchartsContainer:function(){this._echartsContainer.style.visibility="hidden"},_enableEchartsContainer:function(){this._echartsContainer.style.visibility="visible"},onAdd:function(e){this._map=e,this._initEchartsContainer(),this._ec=lR().init(this._echartsContainer),this._ec.leafletMap=e;var t=this;e.on("zoomstart",function(){t._disableEchartsContainer()}),!t.options.loadWhileAnimating&&e.on("movestart",function(){t._disableEchartsContainer()}),lR().registerAction({type:"LeafletMapLayout",event:"LeafletMapLayout",update:"updateLayout"},function(e){}),lR().registerCoordinateSystem("leaflet",jF),lR().extendComponentModel({type:"LeafletMap",getBMap:function(){return this.__LeafletMap},defaultOption:{roam:!1}}),lR().extendComponentView({type:"LeafletMap",render:function(e,r,n){var o=!0,i=r.scheduler.ecInstance.leafletMap,a=n.getZr().painter.getViewportRoot(),s=i.options.zoomAnimation&&EA().Browser.any3d;a.className=" leaflet-layer leaflet-zoom-"+(s?"animated":"hide")+" echarts-layer";var l=EA().DomUtil.testProp(["transformOrigin","WebkitTransformOrigin","msTransformOrigin"]);a.style[l]="50% 50%";var u=e.coordinateSystem,c=n.getZr().painter.getLayers(),f=function(){if(!o){var r,i=t._map.containerPointToLayerPoint([0,0]),s=[i.x||0,i.y||0];if(a.style.left=s[0]+"px",a.style.top=s[1]+"px",!t.options.loadWhileAnimating){for(var l in c)c.hasOwnProperty(l)&&c[l]&&(r=c[l].ctx)&&r.clearRect&&r.clearRect(0,0,r.canvas.width,r.canvas.height);t._enableEchartsContainer()}u.setMapOffset(s),e.__mapOffset=s,n.dispatchAction({type:"LeafletMapLayout"})}};function p(){o||(n.dispatchAction({type:"LeafletMapLayout"}),t._enableEchartsContainer())}t._oldMoveHandler&&i.off(t.options.loadWhileAnimating?"move":"moveend",t._oldMoveHandler),t._oldZoomEndHandler&&i.off("zoomend",t._oldZoomEndHandler),i.on(t.options.loadWhileAnimating?"move":"moveend",f),i.on("zoomend",p),t._oldMoveHandler=f,t._oldZoomEndHandler=p,o=!1}}),this._ec.setOption(this._echartsOptions)},onRemove:function(){this._ec.clear(),this._ec.dispose(),delete this._ec,EA().DomUtil.remove(this._echartsContainer),this._oldZoomEndHandler&&(this._map.off("zoomend",this._oldZoomEndHandler),this._oldZoomEndHandler=null),this._oldMoveHandler&&(this._map.off(this.options.loadWhileAnimating?"move":"moveend",this._oldMoveHandler),this._oldMoveHandler=null),this._resizeHandler&&(this._map.off("resize",this._resizeHandler),this._resizeHandler=null),delete this._map},_initEchartsContainer:function(){var e=this._map.getSize(),t=document.createElement("div");t.style.position="absolute",t.style.height=e.y+"px",t.style.width=e.x+"px",t.style.zIndex=10,this._echartsContainer=t,this.getPane().appendChild(this._echartsContainer);var r=this;function n(e){var t=e.newSize;r._echartsContainer.style.width=t.x+"px",r._echartsContainer.style.height=t.y+"px",r._ec.resize()}this._map.on("resize",n),this._resizeHandler=n}});function jF(e){this._LeafletMap=e,this.dimensions=["lng","lat"],this._mapOffset=[0,0]}jF.prototype.dimensions=["lng","lat"],jF.prototype.setMapOffset=function(e){this._mapOffset=e},jF.prototype.getBMap=function(){return this._LeafletMap},jF.prototype.prepareCustoms=function(){var e=lR().util,t=this.getViewRect();return{coordSys:{type:"leaflet",x:t.x,y:t.y,width:t.width,height:t.height},api:{coord:e.bind(this.dataToPoint,this),size:e.bind(function(t,r){return r=r||[0,0],e.map([0,1],function(e){var n=r[e],o=t[e]/2,i=[],a=[];return i[e]=n-o,a[e]=n+o,i[1-e]=a[1-e]=r[1-e],Math.abs(this.dataToPoint(i)[e]-this.dataToPoint(a)[e])},this)},this)}}},jF.prototype.dataToPoint=function(e){null===e[1]&&(e[1]=EA().CRS.EPSG3857.projection.MAX_LATITUDE);var t=this._LeafletMap.latLngToLayerPoint([e[1],e[0]]),r=this._mapOffset;return[t.x-r[0],t.y-r[1]]},jF.prototype.fixLat=function(e){return e>=90?89.99999999999999:e<=-90?-89.99999999999999:e},jF.prototype.pointToData=function(e){var t=this._mapOffset,r=this._LeafletMap.layerPointToLatLng([e[0]+t[0],e[1]+t[1]]);return[r.lng,r.lat]},jF.prototype.getViewRect=function(){var e=this._LeafletMap.getSize();return new(lR().graphic.BoundingRect)(0,0,e.x,e.y)},jF.prototype.getRoamTransform=function(){return lR().matrix.create()},jF.dimensions=jF.prototype.dimensions,jF.create=function(e){var t,r=e.scheduler.ecInstance.leafletMap;e.eachComponent("LeafletMap",function(e){t||(t=new jF(r)),e.coordinateSystem=t,e.coordinateSystem.setMapOffset(e.__mapOffset||[0,0])}),e.eachSeries(function(e){e.get("coordinateSystem")&&"leaflet"!==e.get("coordinateSystem")||(t||(t=new jF(r)),e.coordinateSystem=t,e.animation=!0===e.animation)})};function kF(e,t){for(var r=0;r=0;o--){var i=void 0,a=void 0,s=r.latLngToLayerPoint(n[o].getLatLng()),l=n[o].getStyle();if(!l&&this.defaultStyle&&(l=this.defaultStyle),l.img){var u=l.img.width,c=l.img.height;l.size&&l.size[0]&&l.size[1]&&(u=l.size[0],c=l.size[1]);var f=l.anchor||[u/2,c/2];i=EA().point(s.x-f[0],s.y-f[1]),a=EA().point(i.x+u,i.y+c)}else i=EA().point(s.x-l.width/2,s.y-l.height/2),a=EA().point(s.x+l.width/2,s.y+l.height/2);if(EA().bounds(i,a).contains(e))return n[o]}return null},containsPoint:function(e){return!!this._getGraphicAtPoint(e)},_handleClick:function(e){e.target=null;var t=this.layer,r=t._map,n=this._getGraphicAtPoint(r.latLngToLayerPoint(e.latlng));if(n)return this.layer._renderer._ctx.canvas.style.cursor="pointer",e.target=n,void("click"===e.type&&t.options.onClick&&t.options.onClick.call(t,n,e));this.layer._renderer._ctx.canvas.style.cursor="auto"},_clearBuffer:DF});EA().Canvas.include({drawGraphics:function(e,t){var r=this;r._drawing&&e.forEach(function(e){var n=e.getStyle();!n&&t&&(n=t),n.img?r._drawImage.call(r,r._ctx,n,e.getLatLng()):r._drawCanvas.call(r,r._ctx,n,e.getLatLng())})},_drawCanvas:function(e,t,r){var n=t,o=this._map.latLngToLayerPoint(r),i=o.x-n.width/2,a=o.y-n.height/2,s=n.width,l=n.height;e.drawImage(n,i,a,s,l)},_drawImage:function(e,t,r){var n,o;if(t.size){var i=t.size;n=i[0],o=i[1]}else n=t.img.width,o=t.img.height;var a=this._coordinateToPoint(r),s=EA().point(a),l=EA().point(t.anchor||[n/2,o/2]);a=[s.x-l.x,s.y-l.y],e.drawImage(t.img,a[0],a[1],n,o)},_coordinateToPoint:function(e){if(!this._map)return e;var t=e;EA().Util.isArray(e)?t=EA().latLng(e[0],e[1]):e instanceof EA().LatLng&&(t=EA().latLng(e.lat,e.lng));var r=this._map.latLngToLayerPoint(t);return[r.x,r.y]}}); +/* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ +var FF=EA().Util.falseFn,BF=function(){for(var e=document.createElement("div"),t=["transform","WebkitTransform","MozTransform","OTransform","msTransform"],r=0;r-1&&(this._data=e),this._renderLayer.setChangeFlags({dataChanged:!0,propsChanged:!0,viewportChanged:!0,updateTriggersChanged:!0}),this._refreshData();var t=this._getLayerState();t.data=this._data||[],this._layerDefaultStyleCache=null,this._renderLayer.setNeedsRedraw(!0),this._renderLayer.setState(t)},drawGraphics:function(e){this._clearBuffer();var t=this.layer._map.getSize();this._container.width!==t.x&&(this._container.width=t.x),this._container.height!==t.y&&(this._container.height=t.y);var r=this.layer._map.getPanes().mapPane._leaflet_pos;this._container.style[BF]="translate("+-Math.round(r.x)+"px,"+-Math.round(r.y)+"px)",this._data=e||[],this._renderLayer||this._createInnerRender(),this._draw()},_initContainer:function(){this._container=this._createCanvas(this.options.width,this.options.height),this._layerContainer=this.options.container,this._wrapper=EA().DomUtil.create("div","deck-wrapper",this._layerContainer),this._wrapper.appendChild(this._container)},_createCanvas:function(e,t){var r=EA().DomUtil.create("canvas","graphicLayer leaflet-layer leaflet-zoom-hide");return r.oncontextmenu=EA().Util.falseFn,r.width=e,r.height=t,r.style.width=e+"px",r.style.height=t+"px",r},_pixelToMeter:function(e){var t=this.layer._map.getBounds();return e*((t.getEast()-t.getWest())/this.layer._map.getSize().x*(6378137*Math.PI/180))},_createInnerRender:function(){var e=this,t=this._getLayerState(),r=t.color,n=t.radius,o=t.opacity,i=t.highlightColor,a=t.radiusScale,s=t.radiusMinPixels,l=t.radiusMaxPixels,u=t.strokeWidth,c=t.outline,f={id:"scatter-plot",data:e._data,pickable:Boolean(this.options.onClick)||Boolean(this.options.onHover),autoHighlight:!0,color:r,opacity:o,radius:n,radiusScale:a,highlightColor:i,radiusMinPixels:s,radiusMaxPixels:l,strokeWidth:u,coordinateSystem:this._isWGS84()?window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT,isGeographicCoordinateSystem:this._isWGS84(),outline:c,getPosition:function(e){if(!e)return[0,0,0];var t=e.getLatLng();return t&&[t.lng,t.lat,0]},getColor:function(t){var r=e._getLayerDefaultStyle(),n=t&&t.options;return n&&n.color||r.color},getRadius:function(t){var r=e._getLayerDefaultStyle(),n=t&&t.getStyle();return n&&n.radius||r.radius},updateTriggers:{getColor:[r],getRadius:[n]}},p=this;this.options.onClick&&(f.onClick=function(){p._container.style.cursor="pointer",p.options.onClick.apply(p,arguments)}),this.options.onHover&&(f.onHover=function(){p._container.style.cursor="pointer",p.options.onHover.apply(p,arguments)}),e._renderLayer=new window.DeckGL.ScatterplotLayer(f)},_getLayerDefaultStyle:function(){if(this._layerDefaultStyleCache)return this._layerDefaultStyleCache;var e=this.layer.options,t=e.color,r=e.opacity,n=e.radius,o=e.radiusScale,i=e.radiusMinPixels,a=e.radiusMaxPixels,s=e.strokeWidth,l=e.outline;return n=this._pixelToMeter(n),this._layerDefaultStyleCache={color:t,opacity:r,radius:n,radiusScale:o,radiusMinPixels:i,radiusMaxPixels:a,strokeWidth:s,outline:l},this._layerDefaultStyleCache},_getLayerState:function(){var e=this.layer.getState();return e.zoom=e.zoom-1,e},_draw:function(){var e=this._getLayerState();this._refreshData(),e.data=this._data||[];var t={};for(var r in e)t[r]=e[r];this._layerDefaultStyleCache=null,this._renderLayer.setNeedsRedraw(!0),t.layers=[this._renderLayer],t.canvas=this._container,t.onBeforeRender=this._onBeforeRender.bind(this),t.onAfterRender=this._onAfterRender.bind(this),t.coordinateSystem=this._isWGS84()?window.DeckGL.COORDINATE_SYSTEM.LNGLAT_OFFSETS:window.DeckGL.COORDINATE_SYSTEM.LNGLAT,t.isGeographicCoordinateSystem=this._isWGS84(),this.deckGL?this.deckGL.setProps(t):this.deckGL=new window.DeckGL.experimental.DeckGLJS(t)},_clearBuffer:function(){if(this.deckGL){var e=this.deckGL.layerManager;e&&e.context.gl.clear(e.context.gl.COLOR_BUFFER_BIT)}return this},_refreshData:function(){var e=this._data||[],t=EA().Util.isArray(e)?[].concat(e):[e];this._renderLayer.props.data||(this._renderLayer.props.data=[]),this._renderLayer.props.data.length=0;for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:null;if(!e||0===e.length||e===this.graphics)return this.graphics.length=0,void this.update();fe.isArray(e)||(e=[e]);for(var t=e.length-1;t>=0;t--){var r=e[t],n=fe.indexOf(this.graphics,r);-1!==n&&this.graphics.splice(n,1)}this.update()},setStyle:function(e){var t=this.options,r={color:t.color,radius:t.radius,opacity:t.opacity,highlightColor:t.highlightColor,radiusScale:t.radiusScale,radiusMinPixels:t.radiusMinPixels,radiusMaxPixels:t.radiusMaxPixels,strokeWidth:t.strokeWidth,outline:t.outline};this.options=EA().Util.extend(this.options,r,e),this.defaultStyle=this._getDefaultStyle(this.options),this.update()},update:function(){this._layerRenderer.update(this.graphics)},clear:function(){this.removeGraphics()},getRenderer:function(){return this._renderer},getState:function(){var e=this._map,t=e.getSize().x,r=e.getSize().y,n=e.getCenter(),o=n.lng,i=n.lat,a=JF[this._crs.code]||0;VF[this._crs.code]&&this._crs.resolutions&&this._crs.resolutions.length>0&&(a=Math.round(Math.log2(VF[this._crs.code]/this._crs.resolutions[0])));var s={longitude:o,latitude:i,zoom:e.getZoom()+a,maxZoom:e.getMaxZoom()+a,pitch:0,bearing:0},l={};for(var u in s)l[u]=s[u];l.width=t,l.height=r;var c=this.options;return l.color=c.color,l.radius=c.radius,l.opacity=c.opacity,l.highlightColor=c.highlightColor,l.radiusScale=c.radiusScale,l.radiusMinPixels=c.radiusMinPixels,l.radiusMaxPixels=c.radiusMaxPixels,l.strokeWidth=c.strokeWidth,l.outline=c.outline,l},_resize:function(){var e=this._map.getSize();this._container.width=e.x,this._container.height=e.y,this._container.style.width=e.x+"px",this._container.style.height=e.y+"px";var t=this._map.containerPointToLayerPoint([0,0]);EA().DomUtil.setPosition(this._container,t),this._update()},_moveEnd:function(){this._layerRenderer instanceof GF&&this._update()},_createRenderer:function(){var e,t=this._map,r=t.getSize().x,n=t.getSize().y;if(this.options.render===UF[0])e=new IF(this,{width:r,height:n,renderer:t.getRenderer(this)});else{var o=EA().Util.setOptions({},zF),i=EA().Util.setOptions({options:o},this.options);(i=EA().Util.setOptions(this,i)).container=t.getPane("overlayPane"),i.width=r,i.height=n,e=new GF(this,i)}return e.defaultStyle=this.defaultStyle,this._layerRenderer=e,this._layerRenderer.getRenderer()},_update:function(){this._map&&this._updatePath()},_updatePath:function(){var e=this._getGraphicsInBounds();this._renderer.drawGraphics(e,this.defaultStyle)},_project:function(){var e=this;e._getGraphicsInBounds().map(function(t){var r=e._map.latLngToLayerPoint(t.getLatLng()),n=e._clickTolerance(),o=[t._anchor+n,t._anchor+n];return t._pxBounds=new(EA().Bounds)(r.subtract(o),r.add(o)),t}),e._pxBounds=EA().bounds(EA().point(0,0),EA().point(this._container.width,this._container.height))},_getDefaultStyle:function(e){var t={};if(e.color){t.fill=!0;var r=this.toRGBA(e.color);t.color=r,t.fillColor=r}return e.opacity&&(t.opacity=e.opacity,t.fillOpacity=e.opacity),e.radius&&(t.radius=e.radius),e.strokeWidth&&(t.weight=e.strokeWidth),e.outline&&(t.stroke=e.outline),new LF(t).getStyle()},toRGBA:function(e){return"rgba(".concat(e[0],",").concat(e[1],",").concat(e[2],",").concat((e[3]||255)/255,")")},_getGraphicsInBounds:function(){var e=[],t=this._map.getBounds();return this.graphics.map(function(r){return t.contains(r.getLatLng())&&e.push(r),r}),e},_handleClick:function(e){this._layerRenderer._handleClick(e)},beforeAdd:EA().Util.falseFn,_containsPoint:function(e){return this._layerRenderer.containsPoint(e)}}),HF=rF.extend({options:{isOverLay:!0},initialize:function(e,t,r){var n=[];n.push(e),n.push(r),rF.prototype.initialize.apply(this,n),this.chartsType=t,this.themeFields=r&&r.themeFields?r.themeFields:null,this.charts=r&&r.charts?r.charts:[],this.cache=r&&r.cache?r.cache:{},this.chartsSetting=r&&r.chartsSetting?r.chartsSetting:{}},setChartsType:function(e){this.chartsType=e,this.redraw()},addFeatures:function(e){var t=this;t.fire("beforefeaturesadded",{features:e}),this.features=this.toiClientFeature(e),t.renderer&&(t._map?t.redrawThematicFeatures(t._map.getBounds()):t.redrawThematicFeatures())},redrawThematicFeatures:function(e){var t=this;t.renderer.clearAll();var r=t.features;if(this.options.alwaysMapCRS&&e&&e instanceof EA().LatLngBounds){var n=this._map.options.crs;e=EA().bounds(n.project(e.getSouthWest()),n.project(e.getNorthEast()))}e=yI.toSuperMapBounds(e);for(var o=0,i=r.length;o=r.left&&a.x<=r.right&&a.y>=r.top&&a.y<=r.bottom){n=!0;break}}return n},clearCache:function(){this.cache={},this.charts=[]},removeFeatures:function(e){this.clearCache(),rF.prototype.removeFeatures.apply(this,arguments)},removeAllFeatures:function(){this.clearCache(),rF.prototype.removeAllFeatures.apply(this,arguments)},redraw:function(){return this.clearCache(),rF.prototype.redraw.apply(this,arguments)},clear:function(){var e=this;e.renderer&&(e.renderer.clearAll(),e.renderer.refresh()),e.removeAllFeatures(),e.clearCache()},getWeightFieldValue:function(e,t,r){if((void 0===r||isNaN(r))&&(r=0),!e.attributes)return r;var n=e.attributes[t];return(void 0===n||isNaN(n))&&(n=r),n},_sortChart:function(){this.charts&&this.charts.sort(function(e,t){return void 0===e.__overlayWeight&&void 0===t.__overlayWeight?0:void 0!==e.__overlayWeight&&void 0===t.__overlayWeight?-1:void 0===e.__overlayWeight&&void 0!==t.__overlayWeight?1:void 0!==e.__overlayWeight&&void 0!==t.__overlayWeight?parseFloat(e.__overlayWeight)1?r.weight/10:r.weight)):t.setAttribute("stroke","none"),r.fill?(t.setAttribute("fill",r.fillColor||r.color),t.setAttribute("fill-opacity",r.fillOpacity)):t.setAttribute("fill","none")}});var iB=EA().CircleMarker.extend({includes:tB.prototype,statics:{iconCache:{}},initialize:function(e,t){tB.prototype.initialize.call(this,e),this._makeFeatureParts(e,t)},getLatLng:void 0,render:function(e,t){tB.prototype.render.call(this,e,t),this._radius=t.radius||EA().CircleMarker.prototype.options.radius,this._updatePath()},_makeFeatureParts:function(e,t){t=t||{x:1,y:1};var r=e.geometry[0];"object"===oB(r[0])&&"x"in r[0]?(this._point=EA().point(r[0]).scaleBy(t),this._empty=EA().Util.falseFn):(this._point=EA().point(r).scaleBy(t),this._empty=EA().Util.falseFn)},makeInteractive:function(){this._updateBounds()},updateStyle:function(e,t){return this._radius=t.radius||this._radius,this._updateBounds(),tB.prototype.updateStyle.call(this,e,t)},_updateBounds:function(){if(this.options.iconUrl&&this.options.iconSize){var e=EA().point(this.options.iconSize),t=e&&e.divideBy(2,!0),r=this._point.subtract(t);this._pxBounds=new(EA().Bounds)(r,r.add(e))}else EA().CircleMarker.prototype._updateBounds.call(this)},_updatePath:function(){this.options.iconUrl?this._renderer._updateIcon(this):EA().CircleMarker.prototype._updatePath.call(this)},_getImage:function(){if(!this.options.iconUrl)return null;var e=this.options.iconUrl,t=iB.iconCache[e];if(!t){var r=this.options.iconSize||[50,50];t=iB.iconCache[e]=this._createIcon(e,r)}return t},_createIcon:function(e,t){var r=e;if(!r)throw new Error("iconUrl not set in Icon options (see the docs).");var n=document.createElement("img");n.src=r,n.className="leaflet-marker-icon "+(this.layerName||"");var o=t;if("number"==typeof o&&(o=[o,o]),o){var i=EA().point(o),a=EA().point(i&&i.divideBy(2,!0));i&&(n.style.width=i.x+"px",n.style.height=i.y+"px"),a&&(n.style.marginLeft=-a.x+"px",n.style.marginTop=-a.y+"px")}return n.onload=function(){o||(n.style.width=this.width+"px",n.style.height=this.height+"px")},n},_containsPoint:function(e){return this.options.iconUrl?this._pxBounds.contains(e):EA().CircleMarker.prototype._containsPoint.call(this,e)}}),aB={_makeFeatureParts:function(e,t){t=t||{x:1,y:1};var r,n=e.geometry;this._parts=[];for(var o=0;o-1?new pB(n):new hB(n)).getTile().then(function(t){e.render(t,r)})},render:function(e,t){if(e){for(var r=this,n=r.renderer,o=r.layer,i=0;i0&&a[a.length-1]}t.properties.textField=i}r.vectorTileLayerStyles=r.vectorTileLayerStyles||{};var s=r.vectorTileLayerStyles[n];if(s)return t=this._mergeFeatureTextField(t,s),s;var l=this.getScaleFromCoords(e),u=this.cartoCSSToLeaflet.pickShader(n)||[];for(var c in s=[],u)for(var f=u[c],p=0;p1){var c=parseInt(u[1]);s=c&&c>=4e3&&c<=5e3?l.DEGREE:l.METER}}return MI(a,96,s)},_mergeFeatureTextField:function(e,t){if(!this.options.serverCartoCSSStyle||!t||"TEXT"!==e.type)return e;var r=t;EA().Util.isArray(t)||(r=[t]);for(var n=0;n0?this.convertFastToPixelPoints(e):this.canvasContext.clearRect(0,0,this.maxWidth,this.maxWidth)},convertFastToPixelPoints:function(e){var t,r,n,o,i,a,s,l=[],u=e.getEast()-e.getWest(),c=e.getNorth()-e.getSouth(),f=this._map.getSize();o=u/f.x>c/f.y?u/f.x:c/f.y,this.useRadius=this.useGeoUnit?parseInt(this.radius/o):this.radius;for(var p=0;p0&&this.maxWidth>0))return!1;var r=this.canvasContext;this.canvasContext.clearRect(0,0,this.maxWidth,this.maxHeight),this.drawCircle(this.useRadius),this.createGradient();for(var n=0;nthis.fileModel.FileConfig.fileMaxSize)return this.fire("filesizeexceed",{messageType:"warring",message:uR.i18n("msg_fileSizeExceeded")}),!1;var n=t.value,o=r.name,i=_A(o);if(!i)return this.fire("errorfileformat",{messageType:"failure",message:uR.i18n("msg_fileTypeUnsupported")}),!1;""!==o&&(this.fileModel.set("loadFileObject",{file:r,filePath:n,fileName:o,fileType:i}),this._readData())},_readData:function(){var e=this,t=this,r=this.fileModel.loadFileObject.fileType;pR.readFile(r,{file:this.fileModel.loadFileObject.file,path:this.fileModel.loadFileObject.filePath},function(n){pR.processDataToGeoJson(r,n,function(t){t&&e.fire("openfilesucceeded",{result:t,layerName:e.fileModel.loadFileObject.fileName.split(".")[0]})},function(e){t.fire("openfilefailed",{messageType:"failure",message:e})},e)},function(){t.fire("openfilefailed",{messageType:"failure",message:uR.i18n("msg_openFileFail")})},this)}}),VB=UB.extend({options:{layer:null},initialize:function(e){UB.prototype.initialize.apply(this,[e]),this.viewModel=new zB},setViewStyle:function(e,t){this.rootContainer.style[e]=t},_initView:function(){var e=this,t=EA().DomUtil.create("div","component-openfile");return t.id="openFile",this.fileSelect=EA().DomUtil.create("div","",t),this.label=EA().DomUtil.create("label","component-openfile__span--select",this.fileSelect),this.label.htmlFor="input_file",EA().DomUtil.create("div","supermapol-icons-upload",this.label),EA().DomUtil.create("span","component-openfile__span",this.label).appendChild(document.createTextNode(uR.i18n("text_chooseFile"))),this.fileInput=EA().DomUtil.create("input","component-openfile__input",this.fileSelect),this.fileInput.id="input_file",this.fileInput.type="file",this.fileInput.accept=".json,.geojson,.csv,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel",this.fileInput.onchange=function(t){e.messageBox.closeView(),e.viewModel.readFile(t)},this.messageBox=new aR,this.viewModel.on("filesizeexceed",function(t){e.messageBox.showView(t.message,t.messageType)}),this.viewModel.on("errorfileformat",function(t){e.messageBox.showView(t.message,t.messageType)}),this.viewModel.on("openfilefailed",function(t){e.messageBox.showView(t.message,t.messageType),e._event.fire("openfilefailed",t)}),this.viewModel.on("readdatafail",function(t){e.messageBox.showView(t.message,t.messageType)}),this.viewModel.on("openfilesucceeded",function(t){e._event.fire("openfilesucceeded",t)}),this._preventMapEvent(t,this.map),t}});function JB(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function qB(e,t){for(var r=0;r0&&this.addLayers(t),this.currentLayerDataModel=null}return HB(e,[{key:"addLayers",value:function(e,t,r,n){for(var o=0;o0?n.operatingAttributeNames:n.attributeNames).length;a0?this.fire("searchlayersucceeded",{result:r}):this.fire("searchfailed",{searchType:"searchLayersField"})}},searchFromCityLocalSearchService:function(e){if(this.searchCache[e])this.fire("geocodesucceeded",{result:this.searchCache[e]});else{this.geoCodeParam.keyWords=e||this.geoCodeParam.city;var t=this,r=this._getSearchUrl(this.geoCodeParam);sn.get(r).then(function(e){return e.json()}).then(function(e){if(e.error||0===e.poiInfos.length)t.fire("searchfailed",{searchType:"searchGeocodeField"});else if(e.poiInfos){var r=t._dataToGeoJson(e.poiInfos,t.geoCodeParam);t.fire("geocodesucceeded",{result:r})}})}},addSearchLayers:function(e){var t=this;this.dataModel.addLayers(e,function(e){t.fire("newlayeradded",{layerName:e.layerName})},null,this)},panToLayer:function(e){this.dataModel.layers[e]&&this.map.flyToBounds(this.dataModel.layers[e].layer.getBounds())},panToCity:function(e){this.geoCodeParam.keyWords=e,this.geoCodeParam.city=e;var t=this,r=this._getSearchUrl(this.geoCodeParam);sn.get(r).then(function(e){return e.json()}).then(function(e){if(e.poiInfos.length>0){var r=EA().latLng(e.poiInfos[0].location.y,e.poiInfos[0].location.x);t.map.setView(r,8)}else t.fire("searchfailed",{searchType:"cityGeocodeField"})})},_dataToGeoJson:function(e,t){for(var r=[],n=0;n0&&document.getElementsByClassName("component-single-checked-img")[0].setAttribute("class","component-single-default-img"),r.firstChild.setAttribute("class","component-single-checked-img"),t.currentSearchLayerName=r.lastChild.innerText,t.isSearchLayer=!0,i.removeChild(i.firstChild),i.insertBefore(document.createTextNode(t.currentSearchLayerName),i.firstChild),t.viewModel.panToLayer(t.currentSearchLayerName),t.messageBox.closeView()},r.appendChild(f),e}(),c=[];s&&c.push({title:uR.i18n("title_searchCity"),content:s}),c.push({title:uR.i18n("title_searchLayer"),content:u});var f=new vA({tabs:c}),p=f.getElement();f.closeView(),n.appendChild(p),o.onclick=function(){p.hidden?f.showView():f.closeView()},n.appendChild(o),i.innerText||i.appendChild(document.createTextNode(uR.i18n("text_label_chooseSearchLayers")));var h=document.createElement("div");h.setAttribute("class","component-search__input");var y=document.createElement("input");y.type="text",y.placeholder=uR.i18n("text_label_searchTips"),h.appendChild(y),this.poiInput=y;var d=document.createElement("span");d.setAttribute("class","supermapol-icons-close"),d.hidden=!0,h.appendChild(d),n.appendChild(h);var v=document.createElement("div");v.setAttribute("class","component-search-icon supermapol-icons-search");var m=new OA;this._resultDomObj=m,v.onclick=function(){m.closeView(),e.clearSearchResult(),e.messageBox.closeView(),f.closeView();var t=e.poiInput.value.trim();""!==t?e.isSearchLayer?e.viewModel.search(t,e.currentSearchLayerName):e.viewModel.search(t):e.messageBox.showView(uR.i18n("msg_searchKeywords"))},y.onkeypress=function(e){if(13==e.which){var t=document.createEvent("HTMLEvents");t.initEvent("click",!1,!0),v.dispatchEvent(t)}},n.appendChild(v);var b=function(){var e=m.getElement();return e.style.position="absolute",e.style.top="44px",e.style.right="0",m.closeView(),m.content.onclick=function(e){var r=null;if("component-search-result-info"===e.target.parentNode.className)r=e.target.parentNode.parentNode;else if("component-search__resultitme"===e.target.parentNode.className)r=e.target.parentNode;else{if("component-search__resultitme"!==e.target.className)return;r=e.target}document.getElementsByClassName("component-search__resultitme-selected").length>0&&document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"),r.firstChild.classList.add("component-search__resultitme-selected");var n=r.children[1].firstChild.innerText;t._linkageFeature(n)},e}();return n.appendChild(b),d.onclick=function(t){e.clearSearchResult(),y.value="",t.target.hidden=!0,m.closeView()},y.oninput=function(){d.hidden=!1},this.messageBox=new aR,this._addViewModelListener(),r.appendChild(n),this._preventMapEvent(r,this.map),r},_createSearchLayerItem:function(e){var t=document.createElement("div");t.setAttribute("class","component-search__layers__itme");var r=document.createElement("div");r.setAttribute("class","component-search__layers__itme__singleselect");var n=document.createElement("div");n.setAttribute("class","component-single-default-img"),r.appendChild(n);var o=document.createElement("span");o.setAttribute("class","single-label"),o.innerHTML=e,r.appendChild(o),t.appendChild(r),document.getElementsByClassName("component-search__layers__body")[0].appendChild(t)},_createResultItem:function(e,t){var r=document.createElement("div");r.setAttribute("class","component-search__resultitme");var n=document.createElement("div");"Point"===e||"MultiPoint"===e?n.setAttribute("class","supermapol-icons-marker-layer component-search-result-icon"):"LineString"===e||"MultiLineString "===e?n.setAttribute("class","supermapol-icons-line-layer component-search-result-icon"):"Polygon"===e||"MultiPolygon"===e?n.setAttribute("class","supermapol-icons-polygon-layer component-search-result-icon"):n.setAttribute("class","supermapol-icons-point-layer component-search-result-icon"),r.appendChild(n);var o=document.createElement("div");o.setAttribute("class","component-search-result-info");var i=document.createElement("div");o.appendChild(i);var a=document.createElement("div");return t.name?(i.innerHTML=t.name,a.innerHTML=t.address,o.appendChild(a)):i.innerHTML=t.filterAttributeName+": "+t.filterAttributeValue,r.appendChild(o),document.createElement("div").setAttribute("class","component-checkbox component-checkbox-default-img"),r},_addViewModelListener:function(){var e=this;this.viewModel.on("searchlayerschanged",function(t){for(var r=0;rt.length?(n=this.perPageDataNum*(e-1),r=t.length-1):(n=this.perPageDataNum*(e-1),r=e*this.perPageDataNum-1);for(var o=document.createElement("div"),i=n;i<=r;i++){var a=void 0,s="Point";t[i].filterAttribute?(s=t[i].feature.geometry.type,a=t[i].filterAttribute):a=t[i].properties,o.appendChild(this._createResultItem(s,a))}this._resultDomObj.setContent(o),this._resultDomObj.showView(),o.firstChild.getElementsByClassName("component-search-result-icon")[0].classList.add("component-search__resultitme-selected");var l=o.firstChild.getElementsByClassName("component-search-result-info")[0].firstChild.innerText;!this._selectMarkerFeature&&this._linkageFeature(l)},_flyToBounds:function(e){var t=e.getSouthWest(),r=e.getNorthEast();t.lat===r.lat&&t.lng===r.lng?this.map.flyTo(t):this.map.fitBounds(e)},_linkageFeature:function(e){var t=this,r="";r=this.isSearchLayer?e.split(":")[1].trim():e,this._selectFeature&&this._selectFeature.addTo(this.map),this.searchResultLayer.eachLayer(function(e){(!r||e.filterAttribute&&e.filterAttribute.filterAttributeValue===r||e.feature.properties&&e.feature.properties.name===r)&&(e.remove(),t._setSelectedLayerStyle(e))})},clearSearchResult:function(){this.searchResultLayer&&(this.map.closePopup(),!this.isSearchLayer&&this.map.removeLayer(this.searchResultLayer),this._selectMarkerFeature&&this.map.removeLayer(this._selectMarkerFeature),this._selectFeaturethis&&this.map.removeLayer(this._selectFeature),this._selectMarkerFeature=null,this._selectFeature=null,this.searchResultLayer=null,this.currentResult=null)},_featureOnclickEvent:function(e,t){var r=this;t.on("click",function(){var n,o,i=document.getElementsByClassName("component-pagination__link")[0];r._resultDomObj._changePageEvent({target:i.children[0].children[0]}),r._selectFeature&&r._selectFeature.addTo(r.map),t.remove();for(var a=0;a1)for(var l=1;l0&&document.getElementsByClassName("component-search__resultitme-selected")[0].classList.remove("component-search__resultitme-selected"),p.firstChild.classList.add("component-search__resultitme-selected"),r._setSelectedLayerStyle(t)}},this)},_setSelectedLayerStyle:function(e){var t;this._selectMarkerFeature&&this._selectMarkerFeature.remove(),this._selectMarkerFeature=null,this._selectFeature=e,this._selectMarkerFeature=EA().geoJSON(e.toGeoJSON(),{pointToLayer:function(e,t){return EA().marker(t,{icon:EA().divIcon({className:"component-select-marker-icon",iconAnchor:[15,0]})})},style:{fillColor:"red",weight:1,opacity:1,color:"red",fillOpacity:.2}}).addTo(this.map),this._selectMarkerFeature.bindPopup(function(){return new ZR({attributes:e.feature.properties}).getElement()},{closeOnClick:!1}).openPopup().addTo(this.map),this._flyToBounds(this.searchResultLayer.getBounds()),e.getLatLng?t=e.getLatLng():e.getCenter&&(t=e.getCenter()),this.map.setView(t)}}),KB=EA().Evented.extend({options:{_defaultLayerOptions:{style:null,onEachFeature:function(e,t){var r="属性信息如下:
";for(var n in e.properties)r+=n+": "+e.properties[n]+"
";t.bindPopup(r)}}},initialize:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!e)return new Error("Cannot find map, fileModel.map cannot be null.");this.map=e,EA().Util.extend(this.options._defaultLayerOptions,t),this.options._defaultLayerOptions.pointToLayer=this.options._defaultLayerOptions.style,this.popupsStatus=!0,this.dataFlowStatus=!1,this.dataFlowUrl="",this.currentFeatures=[],this.dataFlowLayer=null},subscribe:function(e){var t=this;if(this.dataFlowUrl===e){if(this.dataFlowStatus)return void this.fire("dataflowservicesubscribed")}else this.dataFlowUrl=e;this.dataFlowStatus=!0,this.dataFlowLayer&&(this.dataFlowLayer.remove(),this.dataFlowLayer=null);var r=new TF(e,this.options._defaultLayerOptions);r.on("subscribesucceeded",function(e){t.fire("subscribesucceeded",{result:e})}),r.on("subscribefailed",function(e){t.fire("subscribefailed",{result:e})}),r.on("dataupdated",function(e){t.fire("dataupdated",{result:e});var r=e.layer.getBounds(),n=yI.toSuperMapBounds(t.map.getBounds()),o=yI.toSuperMapBounds(r);n.intersectsBounds(o)||(o.left===o.right&&o.top===o.bottom?t.map.setView(r.getCenter()):t.map.flyToBounds(r)),t.popupsStatus&&t.openPopups()}),r.addTo(this.map),this.dataFlowLayer=r},cancelSubscribe:function(){this.dataFlowLayer&&(this.dataFlowStatus=!1,this.dataFlowLayer.dataService.unSubscribe(),this.dataFlowLayer.remove(),this.dataFlowLayer=null)},openPopups:function(){if(this.popupsStatus=!0,this.dataFlowLayer)for(var e=this.dataFlowLayer.getLayers(),t=0;t\n \n \n \n \n ',EA().DomUtil.create("span","",Z).innerHTML=uR.i18n("btn_analyzing");var ee=EA().DomUtil.create("button","component-analysis__analysisbtn--cancel",K);ee.innerHTML=uR.i18n("btn_cancelAnalysis");var te=EA().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",Q);te.innerHTML=uR.i18n("btn_emptyTheAnalysisLayer");for(var re=function(t){a.children[t].onclick=function(){i.innerHTML=a.children[t].outerHTML,i.children[0].id="dropDownTop";var r=document.getElementById("layersSelect"),o=document.getElementById("layerSelectName"),s=a.children[t].getAttribute("data-value"),l={};switch(s){case"buffer":d.classList.add("hidden"),M.classList.remove("hidden"),n.style.height="422px",W.value=uR.i18n("text_label_buffer")+o.title,l=e.fillData.point;break;case"isolines":d.classList.remove("hidden"),M.classList.add("hidden"),n.style.height="712px",W.value=uR.i18n("text_label_isolines")+o.title,l=e.fillData.point}if(e.currentFillData!==l){if(r.innerHTML="","{}"==JSON.stringify(l))return W.value="",o.title="",void(o.innerHTML="");var u=[];for(var c in l)u.push(c);o.title=u[0],o.innerHTML=u[0],e._createOptions(r,u),e.layerSelectObj.optionClickEvent(r,o,e.layersSelectOnchange),"buffer"===s?W.value=uR.i18n("text_label_buffer")+u[0]:"isolines"===s&&(W.value=uR.i18n("text_label_isolines")+u[0]),e.currentData=l[o.title],e.currentFillData=l}}},ne=0;ne\n \n \n \n \n ',EA().DomUtil.create("span","",ne).innerHTML=uR.i18n("btn_analyzing");var oe=EA().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",ee);function ie(e){if(this.messageBox.closeView(),this.dataHash){E.innerHTML="";var t=this.dataHash[e.title],r=this;this.viewModel.on("datasetinfoloaded",function(e){T.title=uR.i18n("text_option_notSet"),T.innerHTML=uR.i18n("text_option_notSet"),E.innerHTML="";var t=i.getAttribute("data-value"),n=e.result.type,o=e.result.fields;"density"===t&&("REGION"===n||"LINE"===n?r.messageBox.showView(uR.i18n("msg_datasetOrMethodUnsupport"),"failure"):(r.messageBox.closeView(),r._createOptions(E,o),r.weightFieldsSelectObj.optionClickEvent(E,T)))}),this.viewModel.getDatasetInfo(t)}}return oe.id="deleteLayersBtn",oe.innerHTML=uR.i18n("btn_emptyTheAnalysisLayer"),this.messageBox=new aR,this.datasetSelectOnchange=ie.bind(this),te.onclick=function(){e.messageBox.closeView();var t=function(){var e,t,r=i.getAttribute("data-value"),n=_.getAttribute("data-value"),o=x.getAttribute("data-value"),a=M.value,s=N.title,l=B.title,u=z.title,c=X.getAttribute("data-value"),f=q.getAttribute("data-value"),p=new Date,y=Z.value||p.getTime();e="NOTSET"===f?"":{rangeMode:f,rangeCount:W.value,colorGradientType:c};"density"===r&&(t=new Tm({datasetName:h.title,method:n,meshType:o,resolution:L.value,fields:T.title,radius:F.value,meshSizeUnit:s,radiusUnit:l,areaUnit:u,query:a,mappingParameters:new Gi({rangeMode:e.rangeMode,rangeCount:e.rangeCount,colorGradientType:e.colorGradientType})}));return{analysisParam:t,resultLayerName:y}}();h.title===uR.i18n("text_option_selectDataset")?e.messageBox.showView(uR.i18n("msg_selectDataset"),"failure"):T.title===uR.i18n("text_option_notSet")?e.messageBox.showView(uR.i18n("msg_setTheWeightField"),"failure"):(e.messageBox.closeView(),re.style.display="block",te.style.display="none",e.viewModel.on("layerloaded",function(t){re.style.display="none",te.style.display="block",e._event.fire("analysissucceeded",{layer:t.layer,name:t.name})}),e.viewModel.on("analysisfailed",function(t){e.messageBox.showView(uR.i18n("msg_theFieldNotSupportAnalysis"),"failure"),re.style.display="none",te.style.display="block",e._event.fire("analysisfailed",{error:t.error})}),e.viewModel.analysis(t,e.map))},oe.onclick=function(){e.viewModel.on("layersremoved",function(t){e._event.fire("layersremoved",{layers:t.layers})}),e.viewModel.clearLayers()},this._preventMapEvent(t,this.map),t},_createOptions:function(e,t){for(var r in t){var n=document.createElement("div");n.className="component-selecttool__option",n.title=t[r],n.innerHTML=t[r],n.setAttribute("data-value",t[r]),e.appendChild(n)}},_creatInputBox:function(e,t){var r=EA().DomUtil.create("div","",t);EA().DomUtil.create("span","",r).innerHTML=e.spanName;var n=EA().DomUtil.create("input","",r);return n.value=e.value,n.className="component-distributeanalysis__input",r},_creatUnitSelectBox:function(e,t){var r=EA().DomUtil.create("div","component-clientcomputation__buffer--radius",t);EA().DomUtil.create("span","",r).innerHTML=e.labelName;var n=EA().DomUtil.create("div","",r);EA().DomUtil.create("input","buffer-radius-input",n);var o=EA().DomUtil.create("div","component-clientcomputation__buffer--unit",n),i=e.selectOptions,a=new LR(i).getElement();return o.appendChild(a),r},_setEleAtribute:function(e,t,r){for(var n=0;n1){var n={optionsArr:e,labelName:uR.i18n("text_label_queryMode"),optionsClickCb:this.queryModeltOnchange},o=new LR(n).getElement();t.appendChild(o),r=o.children[1].children[0],o.children[1].classList.add("dataservice-select");var i=o.children[1];i.classList.add("dataservice-select"),i.classList.add("querymodel-select")}else{var a=EA().DomUtil.create("span","",l);a.innerHTML=uR.i18n("text_label_queryMode"),r=EA().DomUtil.create("div","component-servicequery__querymode-selectname",l);var s=EA().DomUtil.create("span","",r);e instanceof Array?s.innerHTML=e[0]:s.innerHTML=e,r.title=s.innerHTML,this.queryModeltOnchange(r)}return r.id="queryModelSelectName",r}.bind(this),this.queryModeltOnchange=W.bind(this),this.creatQueryModeSelect(n,u);var c=EA().DomUtil.create("div","component-analysis__container component-textarea--dataservice__container",a),f=EA().DomUtil.create("span","textarea-name",c);f.innerHTML=uR.i18n("text_label_IDArrayOfFeatures");var p=EA().DomUtil.create("div","component-textarea component-textarea--dataservice",c);p.id="getfeaturesIdArr";var h=EA().DomUtil.create("div","scrollarea",p),y=EA().DomUtil.create("div","component-scrollarea-content",h);y.setAttribute("tabindex","1");var d=EA().DomUtil.create("textarea","component-textarea__content",y);d.value="[1,2,3]",d.id="getValueTextArea";var v=EA().DomUtil.create("div","component-servicequery__maxfeatures-container hidden",a),m={spanName:uR.i18n("text_label_maxFeatures"),value:"1000"},b=this._creatInputBox(m,v).children[1];b.classList.add("max-features-input");var g=EA().DomUtil.create("div","component-servicequery__distance-container hidden",a),w={spanName:uR.i18n("text_label_bufferDistance"),value:"10"},S=this._creatInputBox(w,g).children[1],O=EA().DomUtil.create("div","component-analysis__container component-textarea--dataservice__container hidden",a),_=EA().DomUtil.create("span","textarea-name",O),P=EA().DomUtil.create("div","",O),x=EA().DomUtil.create("div","component-servicequery__rangeicon-container",P);_.innerHTML=uR.i18n("text_label_queryRange1");var C=EA().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-polygon-layer bounds",x),T=EA().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-line-layer hidden",x),E=EA().DomUtil.create("div","component-servicequery__rangeicon supermapol-icons-point-layer hidden",x),j=EA().DomUtil.create("div","component-textarea component-textarea--rangequery",P);j.id="getfeaturesIdArr";var k=EA().DomUtil.create("div","",j),M=EA().DomUtil.create("div","component-scrollarea-content",k);M.setAttribute("tabindex","1");var R=EA().DomUtil.create("textarea","component-textarea__content component-textarea--rangequery__content",M);R.value='{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}';var A=EA().DomUtil.create("div","component-servicequery__spatialquerymode-container hidden",a),L={optionsArr:["CONTAIN","CROSS","DISJOINT","IDENTITY","INTERSECT","NONE","OVERLAP","TOUCH","WITHIN"],labelName:uR.i18n("text_label_spatialQueryMode")},N=EA().DomUtil.create("div","component-analysis__selecttool",A),D=new LR(L).getElement();D.children[1].classList.add("dataservice-select"),N.appendChild(D);var I=D.children[1].children[0];I.id="spatialQueryModeSelectName",D.children[1].children[2].classList.add("component-servicequery__spatialquerymode__selectcontent");var F=EA().DomUtil.create("div","component-analysis__container__analysisbtn",a),B=EA().DomUtil.create("div","component-analysis__analysisbtn",F),G=EA().DomUtil.create("button","component-analysis__analysisbtn--analysis",B);G.innerHTML=uR.i18n("btn_query");var U=EA().DomUtil.create("div","component-analysis__analysisbtn--analysing-container hidden",B),z=EA().DomUtil.create("div","component-analysis__analysisbtn--analysising component-servicequery__querybtn--querying",U);EA().DomUtil.create("div","component-analysis__svg-container",z).innerHTML='\n \n \n \n \n ',EA().DomUtil.create("span","",z).innerHTML=uR.i18n("btn_querying");var V=EA().DomUtil.create("button","component-analysis__analysisbtn--analysis component-analysis__analysisbtn--deletelayers",B);V.innerHTML=uR.i18n("btn_emptyTheRresultLayer"),W(n[0]);var J,q,H=this;function W(e){var t;switch(t=e.title?e.title:e,v.classList.add("hidden"),O.classList.add("hidden"),g.classList.add("hidden"),T.classList.add("hidden"),E.classList.add("hidden"),C.classList.remove("bounds"),A.classList.add("hidden"),f.innerHTML=uR.i18n("text_label_featureFilter"),d.value="SMID<10","BUFFER"!==t&&"SPATIAL"!==t||(O.classList.remove("hidden"),_.innerHTML=uR.i18n("text_label_geometricObject"),R.value='{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[84.90234375,40.25390625]}}',T.classList.remove("hidden"),E.classList.remove("hidden")),t){case"ID":f.innerHTML=uR.i18n("text_label_IDArrayOfFeatures"),d.value="[1,2,3]";break;case"SQL":v.classList.remove("hidden");break;case"BOUNDS":O.classList.remove("hidden"),_.innerHTML=uR.i18n("text_label_queryRange"),R.value='{"leftBottom":{"x":-5,"y":-5},"rightTop":{"x":5,"y":5}}',C.classList.add("bounds");break;case"BUFFER":g.classList.remove("hidden");break;case"SPATIAL":A.classList.remove("hidden")}}return G.onclick=function(){e.messageBox.closeView(),U.style.display="block",G.style.display="none";var t=function(){var e,t=H.dataSetNames,r=document.getElementById("queryModelSelectName").title,n=d.value;if("ID"===r){var o=d.value,i=o.substring(1,o.length-1).split(",");e=new Eh({IDs:i,datasetNames:t})}else if("SQL"===r){var a=b.value;e=new Vh({queryParameter:{attributeFilter:n},datasetNames:t,maxFeatures:a})}else if("BOUNDS"===r){if(!J){var s=JSON.parse(R.value);J=EA().bounds([s.leftBottom.x,s.leftBottom.y],[s.rightTop.x,s.rightTop.y])}e=new jp({attributeFilter:n,datasetNames:t,bounds:J})}else if("BUFFER"===r){var l=S.value,u=JSON.parse(R.value),c=q||u;e=new Zp({attributeFilter:n,datasetNames:t,bufferDistance:l,geometry:c})}else if("SPATIAL"===r){var f=I.title,p=JSON.parse(R.value),h=q||p;e=new hh({attributeFilter:n,datasetNames:t,spatialQueryMode:f,geometry:h})}return e}();e.viewModel.on("getfeaturessucceeded",function(t){U.style.display="none",G.style.display="block",0===t.result.features.length&&e.messageBox.showView(uR.i18n("msg_dataReturnedIsEmpty"),"success"),e._event.fire("getfeaturessucceeded",{result:t.result})}),e.viewModel.on("getfeaturesfailed",function(t){U.style.display="none",G.style.display="block",e.messageBox.showView(t.error.errorMsg,"failure"),e._event.fire("getfeaturesfailed",{error:t.error})}),e.viewModel.getFeatures(t,e.map)},C.onclick=function(t){var r=document.getElementById("queryModelSelectName").title;q&&q.remove(),"BOUNDS"===r?e.map.pm.enableDraw("Rectangle"):e.map.pm.enableDraw("Poly"),t.stopPropagation(),t.preventDefault()},T.onclick=function(t){q&&q.remove(),e.map.pm.enableDraw("Line"),t.stopPropagation(),t.preventDefault()},E.onclick=function(t){q&&q.remove(),e.map.pm.enableDraw("Marker"),t.stopPropagation(),t.preventDefault()},this.map.on("pm:create",function(t){if("Rectangle"===t.shape){var r=(q=t.layer).getBounds();J=EA().bounds([r._southWest.lng,r._southWest.lat],[r._northEast.lng,r._northEast.lat]);var n={leftBottom:{x:r._southWest.lng,y:r._southWest.lat},rightTop:{x:r._northEast.lng,y:r._northEast.lat}};R.value=JSON.stringify(n)}"Marker"===t.shape&&(q=t.layer,R.value=JSON.stringify(t.layer.toGeoJSON()),e.map.pm.disableDraw("Marker")),"Line"===t.shape&&(q=t.layer,R.value=JSON.stringify(t.layer.toGeoJSON())),"Polygon"===t.shape&&(q=t.layer,R.value=JSON.stringify(t.layer.toGeoJSON()))}),V.onclick=function(){e.viewModel.clearLayers()},this._preventMapEvent(t,this.map),t},_creatInputBox:function(e,t){var r=EA().DomUtil.create("div","",t);return EA().DomUtil.create("span","",r).innerHTML=e.spanName,EA().DomUtil.create("input","",r).value=e.value,r}});function kG(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function MG(e){for(var t=1;t<' + '/script>'; + document.writeln(script); + } + + function inputCSS(url) { + var css = ''; + document.writeln(css); + } + + function inArray(arr, item) { + for (i in arr) { + if (arr[i] == item) { + return true; + } + } + return false; + } + + function supportES6() { + var code = "'use strict'; class Foo {}; class Bar extends Foo {};"; + try { + new Function(code)(); + } catch (err) { + return false; + } + if (!Array.from) { + return false; + } + return true; + } + + //加载类库资源文件 + function load() { + var includes = (targetScript.getAttribute('include') || '').split(','); + var excludes = (targetScript.getAttribute('exclude') || '').split(','); + // 在线 + if (!inArray(excludes, 'leaflet')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/1.7.1/leaflet.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/1.7.1/leaflet.js'); + } + if (inArray(includes, 'mapbox-gl-enhance')) { + inputCSS('https://iclient.supermap.io/web/libs/mapbox-gl-js-enhance/1.12.0/mapbox-gl-enhance.css'); + inputScript('https://iclient.supermap.io/web/libs/mapbox-gl-js-enhance/1.12.0/mapbox-gl-enhance.js'); + } + if (inArray(includes, 'leaflet.heat')) { + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.heat/leaflet-heat.js'); + } + if (inArray(includes, 'leaflet.markercluster')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.markercluster/1.5.1/MarkerCluster.Default.css'); + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.markercluster/1.5.1/MarkerCluster.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.markercluster/1.5.1/leaflet.markercluster.js'); + } + if (inArray(includes, 'leaflet.draw')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.draw/1.0.4/leaflet.draw.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.draw/1.0.4/leaflet.draw.js'); + } + if (inArray(includes, 'leaflet-geoman')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-geoman/2.11.3/leaflet-geoman.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-geoman/2.11.3/leaflet-geoman.min.js'); + + } + if (inArray(includes, 'leaflet.miniMap')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-miniMap/3.6.1/dist/Control.MiniMap.min.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-miniMap/3.6.1/dist/Control.MiniMap.min.js'); + } + if (inArray(includes, 'mapv')) { + inputScript('https://iclient.supermap.io/web/libs/mapv/2.0.62/mapv.min.js'); + } + if (inArray(includes, 'turf')) { + inputScript('https://iclient.supermap.io/web/libs/turf/6.5.0/turf.min.js'); + } + if (inArray(includes, 'echarts')) { + inputScript('https://iclient.supermap.io/web/libs/echarts/4.9.0/echarts.min.js'); + } + if (inArray(includes, 'elasticsearch')) { + inputScript('https://iclient.supermap.io/web/libs/elasticsearch/16.7.1/elasticsearch.min.js'); + } + if (inArray(includes, 'xlsx')) { + inputScript('https://iclient.supermap.io/web/libs/xlsx/0.18.0/xlsx.core.min.js'); + } + // 本地 + if (inArray(includes, 'leaflet.sidebyside')) { + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-side-by-side/leaflet-side-by-side.min.js'); + } + if (inArray(includes, 'd3')) { + inputScript('https://iclient.supermap.io/web/libs/d3/7.0.3/d3.min.js'); + } + if (inArray(includes, 'd3-hexbin')) { + inputScript('https://iclient.supermap.io/web/libs/d3/d3-hexbin.v0.2.min.js'); + } + if (inArray(includes, 'd3Layer')) { + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet.d3Layer/leaflet-d3Layer.js'); + } + if (inArray(includes, 'osmbuildings')) { + inputScript('https://iclient.supermap.io/web/libs/osmbuildings/OSMBuildings-Leaflet.js'); + } + if (inArray(includes, 'leaflet-icon-pulse')) { + inputCSS('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-icon-pulse/L.Icon.Pulse.css'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/leaflet-icon-pulse/L.Icon.Pulse.js'); + } + if (inArray(includes, 'deck')) { + inputScript('https://iclient.supermap.io/web/libs/deck.gl/5.1.3/deck.gl.min.js'); + } + if (inArray(includes, 'pixi')) { + inputScript('https://iclient.supermap.io/web/libs/pixi/4.8.7/pixi.min.js'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/Leaflet.PixiOverlay/1.8.2/L.PixiOverlay.min.js'); + inputScript('https://iclient.supermap.io/web/libs/leaflet/plugins/Leaflet.PixiOverlay/MarkerContainer.js'); + inputScript('https://iclient.supermap.io/web/libs/bezier-easing/2.1.0/bezier-easing.js'); + } + if (inArray(includes, 'tensorflow')) { + inputScript('https://iclient.supermap.io/web/libs/tensorflow/3.9.0/tf.min.js'); + } + + // iclient + if (!inArray(excludes, 'iclient-leaflet')) { + if (supportES6()) { + inputScript('../../dist/leaflet/iclient-leaflet-es6.min.js'); + } else { + inputScript('../../dist/leaflet/iclient-leaflet.min.js'); + } + } + if (inArray(includes, 'iclient-leaflet-css')) { + inputCSS('../../dist/leaflet/iclient-leaflet.min.css'); + } + if (inArray(includes, 'iclient-plot-leaflet')) { + inputCSS('https://iclient.supermap.io/web/libs/plotting/leaflet/11.0.0/iclient-plot-leaflet.css'); + if (supportES6()) { + inputScript('https://iclient.supermap.io/web/libs/plotting/leaflet/11.0.0/iclient-plot-leaflet-es6.min.js'); + } else { + inputScript('https://iclient.supermap.io/web/libs/plotting/leaflet/11.0.0/iclient-plot-leaflet.min.js'); + } + } + if (inArray(includes, 'ant-design-vue')) { + inputCSS('https://iclient.supermap.io/web/libs/ant-design-vue/1.7.8/antd.min.css'); + inputScript('https://iclient.supermap.io/web/libs/ant-design-vue/1.7.8/antd.min.js'); + } + if (inArray(includes, 'echarts-vue')) { + inputScript('https://iclient.supermap.io/web/libs/echarts/4.9.0/echarts.min.js'); + inputScript('https://iclient.supermap.io/web/libs/vue-echarts/4.1.0/vue-echarts.min.js'); + inputScript('https://iclient.supermap.io/web/libs/echarts-liquidfill/2.0.6/echarts-liquidfill.min.js'); + inputScript('https://iclient.supermap.io/web/libs/echartsLayer/EchartsLayer.min.js'); + } + if (inArray(includes, 'iclient-leaflet-vue')) { + inputCSS('../../dist/leaflet/iclient-leaflet-vue.css'); + inputScript('../../dist/leaflet/iclient-leaflet-vue.min.js'); + } + if (inArray(includes, 'leaflet-mapbox-gl')) { + inputScript('https://iclient.supermap.io/web/libs/leaflet-mapbox-gl/0.0.15/leaflet-mapbox-gl.min.js'); + } + + } + + load(); + window.isLocal = false; + window.server = document.location.toString().match(/file:\/\//) + ? 'http://localhost:8090' + : document.location.protocol + '//' + document.location.host; +})(); diff --git a/SuperMap iEarth/public/Resource/js/iclient-leaflet/workers/TurfWorker.js b/SuperMap iEarth/public/Resource/js/iclient-leaflet/workers/TurfWorker.js new file mode 100644 index 00000000..e7723cdb --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/iclient-leaflet/workers/TurfWorker.js @@ -0,0 +1,336 @@ +/* Copyright© 2000 - 2018 SuperMap Software Co.Ltd. All rights reserved. + * This program are made available under the terms of the Apache License, Version 2.0 + * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ + +importScripts('https://iclient.supermap.io/web/libs/turf/5.1.6/turf.min.js') +/** + * 空间分析所需工具类 + */ +onmessage = function (event) { + if (event.data) { + let params = event.data; + postMessage(analysis(params)) + } +} + +//IDW 插值 +function interpolate(points, cellSize, options) { + options = options || {}; + if (typeof options !== 'object') { + throw new Error('options is invalid'); + } + var gridType = options.gridType; + var property = options.property; + var weight = options.weight; + + if (!points) { + throw new Error('points is required'); + } + turf.collectionOf(points, 'Point', 'input must contain Points'); + if (!cellSize) { + throw new Error('cellSize is required'); + } + if (weight !== undefined && typeof weight !== 'number') { + throw new Error('weight must be a number'); + } + property = property || 'elevation'; + gridType = gridType || 'square'; + weight = weight || 1; + + var box = options.bbox || turf.bbox(points); + + var grid; + switch (gridType) { + case 'point': + case 'points': + grid = squareGrid(box, cellSize, options, gridType); + break; + case 'square': + case 'squares': + grid = squareGrid(box, cellSize, options, gridType); + break; + case 'hex': + case 'hexes': + grid = turf.hexGrid(box, cellSize, options); + break; + case 'triangle': + case 'triangles': + grid = turf.triangleGrid(box, cellSize, options); + break; + default: + throw new Error('invalid gridType'); + } + var results = []; + var gridFeatures = grid.features; + var pointFeatures = points.features; + for (var i = 0, len = gridFeatures.length; i < len; i++) { + var zw = 0; + var sw = 0; + var gridFeature = gridFeatures[i]; + for (var j = 0, leng = pointFeatures.length; j < leng; j++) { + var point = pointFeatures[j]; + var gridPoint = (gridType === 'point') ? gridFeature : turf.centroid(gridFeature); + var d = turf.distance(gridPoint, point, options); + var zValue; + if (point.properties[property]) { + zValue = point.properties[property]; + } + if (zValue === undefined) { + zValue = point.geometry.coordinates[2]; + } + if (zValue === undefined) { + throw new Error('zValue is missing'); + } + if (d === 0) { + zw = zValue; + } + var w = 1.0 / Math.pow(d, weight); + sw += w; + zw += w * zValue; + } + var newFeature = turf.clone(gridFeature); + newFeature.properties[property] = zw / sw; + results.push(newFeature); + } + return turf.featureCollection(results); +} + +function squareGrid(bbox, cellSide, options, gridType) { + options = options || {}; + if (!turf.isObject(options)) { + throw new Error('options is invalid'); + } + var properties = options.properties; + var mask = options.mask; + + var results = []; + + if (cellSide === null || cellSide === undefined) { + throw new Error('cellSide is required'); + } + if (!turf.isNumber(cellSide)) { + throw new Error('cellSide is invalid'); + } + if (!bbox) { + throw new Error('bbox is required'); + } + if (!Array.isArray(bbox)) { + throw new Error('bbox must be array'); + } + if (bbox.length !== 4) { + throw new Error('bbox must contain 4 numbers'); + } + if (mask && ['Polygon', 'MultiPolygon'].indexOf(turf.getType(mask)) === -1) { + throw new Error('options.mask must be a (Multi)Polygon'); + } + + var west = bbox[0]; + var south = bbox[1]; + var east = bbox[2]; + var north = bbox[3]; + + var bboxWidth = (east - west); + var bboxHeight = (north - south); + + var cellWidth = cellSide / 111.94; + var cellHeight = cellSide / 111.94; + + var columns = Math.floor(bboxWidth / cellWidth); + var rows = Math.floor(bboxHeight / cellHeight); + + var deltaX = (bboxWidth - columns * cellWidth) / 2; + var deltaY = (bboxHeight - rows * cellHeight) / 2; + + var currentX = west + deltaX; + if (gridType === "square" || gridType === "squares") { + // for (var column = 0; column < columns; column++) { + // var currentY = south + deltaY; + // for (var row = 0; row < rows; row++) { + // var cellPoly = turf.polygon([[ + // [currentX, currentY], + // [currentX, currentY + cellHeight], + // [currentX + cellWidth, currentY + cellHeight], + // [currentX + cellWidth, currentY], + // [currentX, currentY] + // ]], properties); + // if (mask) { + // if (intersect(mask, cellPoly)) results.push(cellPoly); + // } else { + // results.push(cellPoly); + // } + + // currentY += cellHeight; + // } + // currentX += cellWidth; + // } + return null; + } else { + while (currentX <= east) { + var currentY1 = south + deltaY; + while (currentY1 <= north) { + var cellPt = turf.point([currentX, currentY1], properties); + if (mask) { + if (turf.booleanWithin(cellPt, mask)) { + results.push(cellPt); + } + } else { + results.push(cellPt); + } + currentY1 += cellHeight; + } + currentX += cellWidth; + } + } + + return turf.featureCollection(results); +} + +function processBuffer(buffer, saveAttrs) { + var featureCollection = []; + //var maxBounds = [-180, -90, 180, 90]; + //获取缓冲区异常feature, 并从原featureCollection中删除 + for (var i = 0, len = buffer.features.length; i < len; i++) { + var feature = buffer.features[i]; + //不保留原有的属性值 + if (!saveAttrs) { + //对字段属性进行for循环 + for (var pro in feature.properties) { + var shouldDeleted = true; + //序号和参考地点保留 + if (pro === 'ID') { + shouldDeleted = false; + } + //删除除了位置和序号字段的其他字段属性 + if (shouldDeleted) delete feature.properties[pro]; + } + } + + var bbox = turf.bbox(buffer.features[i]); + //bounds的x轴距离作为判断依据,看数据误差<=1,这里写大一点防止意外 + if (parseInt(bbox[2] - bbox[0]) > 5) { + //if(util.isRectOverlap(maxBounds, turf.bbox(buffer.features[i]))) { + + //删除功能,第一个参数为第一项位置,第二个参数为要删除几个。 array.splice(index, num) ,返回值为删除内容,array为结果值。 + //删除位置为i的一个要素 + featureCollection.push(buffer.features.splice(i, 1)[0]); + i--; + len--; + } + } + //将异常feature分割为两个正常feature,重新添加到featureCollextion中 + var newCod; + for (var k = 0; k < featureCollection.length; k++) { + newCod = []; + //获取不正常features + var abnormalFeature = featureCollection[k]; + //获取不正常features的坐标 + var coordinates = turf.getCoords(abnormalFeature)[0]; + //对坐标进行循环 + for (var j = 0, leng = coordinates.length; j < leng; j++) { + if (coordinates[j][0] < 0) { + newCod.push(coordinates.splice(j, 1)[0]); + j--; + leng--; + } + } + //闭合polygon + if (newCod.length > 3) { + if (newCod[newCod.length - 1][0] !== newCod[0][0] || newCod[newCod.length - 1][1] !== newCod[0][1]) { + newCod.push(newCod[0]); + } + //两个feature属性相同 + buffer.features.push(turf.polygon([newCod], abnormalFeature.properties)); + } + //闭合polygon + if (coordinates.length > 3) { + if (coordinates[coordinates.length - 1][0] !== coordinates[0][0] || coordinates[coordinates.length - 1][1] !== coordinates[0][1]) { + coordinates.push(coordinates[0]); + } + buffer.features.push(abnormalFeature); + } + } +} + + +//feature合并 +function unionFeature(featureCollection, isFirst) { + var results = []; + var features = featureCollection.features; + var featureLength = features.length; + var oneceTotal = 2; //两两合并 直到最后剩一个多面对象为止(分网格 合并) + var total = Math.round(featureLength / oneceTotal); + //数组顺序打乱 + if (!isFirst) this.random(features); + for (var i = 0; i <= total; i++) { + var start = i * oneceTotal; + var result = featureCollection.features[start]; + for (var j = 1; j < oneceTotal; j++) { + var index = start + j; + if (featureCollection.features[index]) { + try { + result = this.union(result, featureCollection.features[index]); + } catch (e) { + results.push(featureCollection.features[index]); + } + } + } + if (result) results.push(result); + } + + if (results && results.length > 1) { + //结果还是多个 继续合并 + return this.unionFeature(turf.featureCollection(results), false); + } else { + return results[0]; + } +} + +//数组顺序打乱 +function random(arr) { + arr.sort(function () { return 0.5 - Math.random() }); +} + +function union(features, polys) { + let result = turf.union(features, polys); + return result; +} + +//多面转单面 +function toPolygons(multiPolygon) { + var polygons = []; + if (turf.getType(multiPolygon) === "Polygon") { + polygons = [multiPolygon]; + } else { + var coords = turf.getCoords(multiPolygon); + polygons = coords.map(function (coord) { + var poly = turf.polygon(coord); + poly.bbox = turf.bbox(poly); + poly.properties = multiPolygon.properties; + return poly; + }); + } + return polygons; +} + +function analysis(params) { + let analysisMethod = params.analysisMethod; + if (analysisMethod === "isolines") { + + let grid = interpolate(params.pointGrid, params.analysisCellSize, params.options); + return turf.isolines(grid, params.breaks, { zProperty: params.zProperty }); + + } else if (analysisMethod === "buffer") { + + let buffer = turf.buffer(params.geoJson, params.radius, { unit: params.unit }); + this.processBuffer(buffer, params.isSave); + if (params.isUnion) { + if (buffer.features.length > 0) { + var unied = this.unionFeature(buffer, true); + var result = this.toPolygons(unied); + return turf.featureCollection(result); + } + return null; + } + return buffer; + } +} \ No newline at end of file diff --git a/SuperMap iEarth/public/Resource/js/leaflet/images/layers-2x.png b/SuperMap iEarth/public/Resource/js/leaflet/images/layers-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..200c333dca9652ac4cba004d609e5af4eee168c1 GIT binary patch literal 1259 zcmVFhCYNy;#0irRPomHqW|G1C*;4?@4#E?jH>?v@U%cy?3dQAc-DchXVErpOh~ z-jbon+tNbnl6hoEb;)TVk+%hTDDi_G%i3*RZ&15!$Fjr^f;Ke&A@|?=`2&+{zr+3a z{D*=t(`AXyS%X7N z%a#RZw6vD^t_rnM`L4E>m=U&R!A-&}nZIi$BOPvkhrCuUe@BN~-lRD)f44;J%TwgE zcze8u!PQ_NR7?o(NylLXVTfDO zxs5=@|GsYEsNo4M#nT%N!UE(?dnS)t2+{ELYAFp*3=iF=|EQnTp`#vlSXuGVraYo? z+RCzXo6h3qA8{KG?S4nE(lM+;Eb4nT3XV;7gcAxUi5m)`k5tv}cPy()8ZR3TLW3I- zAS^}cq-IJvL7a4RgR!yk@~RT%$lA7{L5ES*hyx)M4(yxI$Ub(4f)K|^v1>zvwQY!_ zIrWw8q9GS^!Dp~}+?mbnB6jDF8mVlbQ!jFKDY;w=7;XO{9bq7>LXGK24WA`;rL)_Z z)&j}pbV(;6gY;VMhbxgvn`X;6x}VUEE-7 z%)7j-%t8S=ZL3yc)HbXDAqJZvBTPoiW_A-+a8m3_Z?v{DN7Tnr#O_VUMT0UBt$;p` zDh6JbGHN8JJ*JN%y2%msb97@_S>9!%Egwk;?PEkU9ntz&3uR}%Fj5d$JHQbQb3}a{ zSzFT^#n=VInPpcAS}CNxj?_ zVscANk5Cfz(51EI1pz};AWWb|kgbYNb4wCEGUn3+eMUMV?1-{=I4TlmLJMot@rd07 zZuo2hk1ccu{YmGkcYdWAVdk{Z4Nm?^cTD&}jGm+Q1SYIXMwmG*oO*83&#>l%nbR`G zhh=lZ%xIb7kU3#;TBbfECrnC9P=-XpL|TG2BoZdj61*XiFbW8?1Z_wp%#;>${SUIy V$8qr;L*)Pf002ovPDHLkV1hYLS~36t literal 0 HcmV?d00001 diff --git a/SuperMap iEarth/public/Resource/js/leaflet/images/layers.png b/SuperMap iEarth/public/Resource/js/leaflet/images/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..1a72e5784b2b456eac5d7670738db80697af3377 GIT binary patch literal 696 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 e-I|>x8~*?ZhF3snGbtJX0000cOl4 literal 0 HcmV?d00001 diff --git a/SuperMap iEarth/public/Resource/js/leaflet/images/marker-icon.png b/SuperMap iEarth/public/Resource/js/leaflet/images/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..950edf24677ded147df13b26f91baa2b0fa70513 GIT binary patch literal 1466 zcmV;r1x5OaP)P001cn1^@s6z>|W`000GnNklGNuHDcIX17Zdjl&3`L?0sTjIws<{((Dh&g-s0<@jYQyl?D*X^?%13;ml^gy> ziMrY_^1WI=(g@LMizu=zCoA>C`6|QEq1eV92k*7m>G65*&@&6)aC&e}G zI)pf-Za|N`DT&Cn1J|o`19mumxW~hiKiKyc-P`S@q)rdTo84@QI@;0yXrG%9uhI>A zG5QHb6s4=<6xy{1 z@NMxEkryp{LS44%z$3lP^cX!9+2-;CTt3wM4(k*#C{aiIiLuB>jJj;KPhPzIC00bL zU3a#;aJld94lCW=`4&aAy8M7PY=HQ>O%$YEP4c4UY#CRxfgbE~(|uiI=YS8q;O9y6 zmIkXzR`}p7ti|PrM3a}WMnR=3NVnWdAAR>b9X@)DKL6=YsvmH%?I24wdq?Gh54_;# z$?_LvgjEdspdQlft#4CQ z`2Zyvy?*)N1Ftw|{_hakhG9WjS?Az@I@+IZ8JbWewR!XUK4&6346+d#~gsE0SY(LX8&JfY>Aj)RxGy96nwhs2rv zzW6pTnMpFkDSkT*a*6Dx|u@ds6ISVn0@^RmIsKZ5Y;bazbc;tTSq(kg(=481ODrPyNB6n z-$+U}(w$m6U6H$w17Bw+wDaFIe~GvNMYvnw31MpY0eQKT9l>SU``8k7w4)z!GZKMI z#_cEKq7k~i%nlK@6c-K?+R;B#5$?T#YpKD`t_4bAs^#E+@5QW$@OX3*`;(#{U^d-vY)&xEE>n5lYl&T?Amke9$Lam@{1K@O ze*LXqlKQHiv=gx+V^Cbb2?z@ISBQ*3amF;9UJ3SBg(N|710TLamQmYZ&Qjn2LuO<* zCZlB4n%@pc&7NNnY1}x+NWpHlq`OJEo|`aYN9<`RBUB+79g;>dgb6YlfN#kGL?lO_ z!6~M^7sOnbsUkKk<@Ysie&`G>ruxH&Mgy&8;i=A zB9OO!xR{AyODw>DS-q5YM{0ExFEAzt zm>RdS+ssW(-8|?xr0(?$vBVB*%(xDLtq3Hf0I5yFm<_g=W2`QWAax{1rWVH=I!VrP zs(rTFX@W#t$hXNvbgX`gK&^w_YD;CQ!B@e0QbLIWaKAXQe2-kkloo;{iF#6}z!4=W zi$giRj1{ zt;2w`VSCF#WE&*ev7jpsC=6175@(~nTE2;7M-L((0bH@yG}-TB$R~WXd?tA$s3|%y zA`9$sA(>F%J3ioz<-LJl*^o1|w84l>HBR`>3l9c8$5Xr@xCiIQ7{x$fMCzOk_-M=% z+{a_Q#;42`#KfUte@$NT77uaTz?b-fBe)1s5XE$yA79fm?KqM^VgLXD07*qoM6N<$ Ef<_J(9smFU literal 0 HcmV?d00001 diff --git a/SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.esm.js b/SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.esm.js new file mode 100644 index 00000000..202a03c4 --- /dev/null +++ b/SuperMap iEarth/public/Resource/js/leaflet/leaflet-src.esm.js @@ -0,0 +1,13970 @@ +/* @preserve + * Leaflet 1.7.1+Detached: 0f904a515879fcd08f69b7f51799ee7f18f23fd8.0f904a5, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2021 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ + +var version = "1.7.1"; + +/* + * @namespace Util + * + * Various utility functions, used by Leaflet internally. + */ + +// @function extend(dest: Object, src?: Object): Object +// Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. +function extend(dest) { + var i, j, len, src; + + for (j = 1, len = arguments.length; j < len; j++) { + src = arguments[j]; + for (i in src) { + dest[i] = src[i]; + } + } + return dest; +} + +// @function create(proto: Object, properties?: Object): Object +// Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create) +var create = Object.create || (function () { + function F() {} + return function (proto) { + F.prototype = proto; + return new F(); + }; +})(); + +// @function bind(fn: Function, …): Function +// Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). +// Has a `L.bind()` shortcut. +function bind(fn, obj) { + var slice = Array.prototype.slice; + + if (fn.bind) { + return fn.bind.apply(fn, slice.call(arguments, 1)); + } + + var args = slice.call(arguments, 2); + + return function () { + return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); + }; +} + +// @property lastId: Number +// Last unique ID used by [`stamp()`](#util-stamp) +var lastId = 0; + +// @function stamp(obj: Object): Number +// Returns the unique ID of an object, assigning it one if it doesn't have it. +function stamp(obj) { + /*eslint-disable */ + obj._leaflet_id = obj._leaflet_id || ++lastId; + return obj._leaflet_id; + /* eslint-enable */ +} + +// @function throttle(fn: Function, time: Number, context: Object): Function +// Returns a function which executes function `fn` with the given scope `context` +// (so that the `this` keyword refers to `context` inside `fn`'s code). The function +// `fn` will be called no more than one time per given amount of `time`. The arguments +// received by the bound function will be any arguments passed when binding the +// function, followed by any arguments passed when invoking the bound function. +// Has an `L.throttle` shortcut. +function throttle(fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; + } + }; + + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; + + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } + }; + + return wrapperFn; +} + +// @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number +// Returns the number `num` modulo `range` in such a way so it lies within +// `range[0]` and `range[1]`. The returned value will be always smaller than +// `range[1]` unless `includeMax` is set to `true`. +function wrapNum(x, range, includeMax) { + var max = range[1], + min = range[0], + d = max - min; + return x === max && includeMax ? x : ((x - min) % d + d) % d + min; +} + +// @function falseFn(): Function +// Returns a function which always returns `false`. +function falseFn() { return false; } + +// @function formatNum(num: Number, digits?: Number): Number +// Returns the number `num` rounded to `digits` decimals, or to 6 decimals by default. +function formatNum(num, digits) { + var pow = Math.pow(10, (digits === undefined ? 6 : digits)); + return Math.round(num * pow) / pow; +} + +// @function trim(str: String): String +// Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) +function trim(str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); +} + +// @function splitWords(str: String): String[] +// Trims and splits the string on whitespace and returns the array of parts. +function splitWords(str) { + return trim(str).split(/\s+/); +} + +// @function setOptions(obj: Object, options: Object): Object +// Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. +function setOptions(obj, options) { + if (!Object.prototype.hasOwnProperty.call(obj, 'options')) { + obj.options = obj.options ? create(obj.options) : {}; + } + for (var i in options) { + obj.options[i] = options[i]; + } + return obj.options; +} + +// @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String +// Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}` +// translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will +// be appended at the end. If `uppercase` is `true`, the parameter names will +// be uppercased (e.g. `'?A=foo&B=bar'`) +function getParamString(obj, existingUrl, uppercase) { + var params = []; + for (var i in obj) { + params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); + } + return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); +} + +var templateRe = /\{ *([\w_ -]+) *\}/g; + +// @function template(str: String, data: Object): String +// Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` +// and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string +// `('Hello foo, bar')`. You can also specify functions instead of strings for +// data values — they will be evaluated passing `data` as an argument. +function template(str, data) { + return str.replace(templateRe, function (str, key) { + var value = data[key]; + + if (value === undefined) { + throw new Error('No value provided for variable ' + str); + + } else if (typeof value === 'function') { + value = value(data); + } + return value; + }); +} + +// @function isArray(obj): Boolean +// Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) +var isArray = Array.isArray || function (obj) { + return (Object.prototype.toString.call(obj) === '[object Array]'); +}; + +// @function indexOf(array: Array, el: Object): Number +// Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) +function indexOf(array, el) { + for (var i = 0; i < array.length; i++) { + if (array[i] === el) { return i; } + } + return -1; +} + +// @property emptyImageUrl: String +// Data URI string containing a base64-encoded empty GIF image. +// Used as a hack to free memory from unused images on WebKit-powered +// mobile devices (by setting image `src` to this string). +var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; + +// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + +function getPrefixed(name) { + return window['webkit' + name] || window['moz' + name] || window['ms' + name]; +} + +var lastTime = 0; + +// fallback for IE 7-8 +function timeoutDefer(fn) { + var time = +new Date(), + timeToCall = Math.max(0, 16 - (time - lastTime)); + + lastTime = time + timeToCall; + return window.setTimeout(fn, timeToCall); +} + +var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer; +var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || + getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; + +// @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number +// Schedules `fn` to be executed when the browser repaints. `fn` is bound to +// `context` if given. When `immediate` is set, `fn` is called immediately if +// the browser doesn't have native support for +// [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame), +// otherwise it's delayed. Returns a request ID that can be used to cancel the request. +function requestAnimFrame(fn, context, immediate) { + if (immediate && requestFn === timeoutDefer) { + fn.call(context); + } else { + return requestFn.call(window, bind(fn, context)); + } +} + +// @function cancelAnimFrame(id: Number): undefined +// Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame). +function cancelAnimFrame(id) { + if (id) { + cancelFn.call(window, id); + } +} + +var Util = ({ + extend: extend, + create: create, + bind: bind, + get lastId () { return lastId; }, + stamp: stamp, + throttle: throttle, + wrapNum: wrapNum, + falseFn: falseFn, + formatNum: formatNum, + trim: trim, + splitWords: splitWords, + setOptions: setOptions, + getParamString: getParamString, + template: template, + isArray: isArray, + indexOf: indexOf, + emptyImageUrl: emptyImageUrl, + requestFn: requestFn, + cancelFn: cancelFn, + requestAnimFrame: requestAnimFrame, + cancelAnimFrame: cancelAnimFrame +}); + +// @class Class +// @aka L.Class + +// @section +// @uninheritable + +// Thanks to John Resig and Dean Edwards for inspiration! + +function Class() {} + +Class.extend = function (props) { + + // @function extend(props: Object): Function + // [Extends the current class](#class-inheritance) given the properties to be included. + // Returns a Javascript function that is a class constructor (to be called with `new`). + var NewClass = function () { + + // call the constructor + if (this.initialize) { + this.initialize.apply(this, arguments); + } + + // call all constructor hooks + this.callInitHooks(); + }; + + var parentProto = NewClass.__super__ = this.prototype; + + var proto = create(parentProto); + proto.constructor = NewClass; + + NewClass.prototype = proto; + + // inherit parent's statics + for (var i in this) { + if (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') { + NewClass[i] = this[i]; + } + } + + // mix static properties into the class + if (props.statics) { + extend(NewClass, props.statics); + delete props.statics; + } + + // mix includes into the prototype + if (props.includes) { + checkDeprecatedMixinEvents(props.includes); + extend.apply(null, [proto].concat(props.includes)); + delete props.includes; + } + + // merge options + if (proto.options) { + props.options = extend(create(proto.options), props.options); + } + + // mix given properties into the prototype + extend(proto, props); + + proto._initHooks = []; + + // add method for calling all hooks + proto.callInitHooks = function () { + + if (this._initHooksCalled) { return; } + + if (parentProto.callInitHooks) { + parentProto.callInitHooks.call(this); + } + + this._initHooksCalled = true; + + for (var i = 0, len = proto._initHooks.length; i < len; i++) { + proto._initHooks[i].call(this); + } + }; + + return NewClass; +}; + + +// @function include(properties: Object): this +// [Includes a mixin](#class-includes) into the current class. +Class.include = function (props) { + extend(this.prototype, props); + return this; +}; + +// @function mergeOptions(options: Object): this +// [Merges `options`](#class-options) into the defaults of the class. +Class.mergeOptions = function (options) { + extend(this.prototype.options, options); + return this; +}; + +// @function addInitHook(fn: Function): this +// Adds a [constructor hook](#class-constructor-hooks) to the class. +Class.addInitHook = function (fn) { // (Function) || (String, args...) + var args = Array.prototype.slice.call(arguments, 1); + + var init = typeof fn === 'function' ? fn : function () { + this[fn].apply(this, args); + }; + + this.prototype._initHooks = this.prototype._initHooks || []; + this.prototype._initHooks.push(init); + return this; +}; + +function checkDeprecatedMixinEvents(includes) { + if (typeof L === 'undefined' || !L || !L.Mixin) { return; } + + includes = isArray(includes) ? includes : [includes]; + + for (var i = 0; i < includes.length; i++) { + if (includes[i] === L.Mixin.Events) { + console.warn('Deprecated include of L.Mixin.Events: ' + + 'this property will be removed in future releases, ' + + 'please inherit from L.Evented instead.', new Error().stack); + } + } +} + +/* + * @class Evented + * @aka L.Evented + * @inherits Class + * + * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event). + * + * @example + * + * ```js + * map.on('click', function(e) { + * alert(e.latlng); + * } ); + * ``` + * + * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function: + * + * ```js + * function onClick(e) { ... } + * + * map.on('click', onClick); + * map.off('click', onClick); + * ``` + */ + +var Events = { + /* @method on(type: String, fn: Function, context?: Object): this + * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`). + * + * @alternative + * @method on(eventMap: Object): this + * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + */ + on: function (types, fn, context) { + + // types can be a map of types/handlers + if (typeof types === 'object') { + for (var type in types) { + // we don't process space-separated events here for performance; + // it's a hot path since Layer uses the on(obj) syntax + this._on(type, types[type], fn); + } + + } else { + // types can be a string of space-separated words + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._on(types[i], fn, context); + } + } + + return this; + }, + + /* @method off(type: String, fn?: Function, context?: Object): this + * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener. + * + * @alternative + * @method off(eventMap: Object): this + * Removes a set of type/listener pairs. + * + * @alternative + * @method off: this + * Removes all listeners to all events on the object. This includes implicitly attached events. + */ + off: function (types, fn, context) { + + if (!types) { + // clear all listeners if called without arguments + delete this._events; + + } else if (typeof types === 'object') { + for (var type in types) { + this._off(type, types[type], fn); + } + + } else { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._off(types[i], fn, context); + } + } + + return this; + }, + + // attach listener (without syntactic sugar now) + _on: function (type, fn, context) { + this._events = this._events || {}; + + /* get/init listeners for type */ + var typeListeners = this._events[type]; + if (!typeListeners) { + typeListeners = []; + this._events[type] = typeListeners; + } + + if (context === this) { + // Less memory footprint. + context = undefined; + } + var newListener = {fn: fn, ctx: context}, + listeners = typeListeners; + + // check if fn already there + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].fn === fn && listeners[i].ctx === context) { + return; + } + } + + listeners.push(newListener); + }, + + _off: function (type, fn, context) { + var listeners, + i, + len; + + if (!this._events) { return; } + + listeners = this._events[type]; + + if (!listeners) { + return; + } + + if (!fn) { + // Set all removed listeners to noop so they are not called if remove happens in fire + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].fn = falseFn; + } + // clear all listeners for a type if function isn't specified + delete this._events[type]; + return; + } + + if (context === this) { + context = undefined; + } + + if (listeners) { + + // find fn and remove it + for (i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + if (l.ctx !== context) { continue; } + if (l.fn === fn) { + + // set the removed listener to noop so that's not called if remove happens in fire + l.fn = falseFn; + + if (this._firingCount) { + /* copy array in case events are being fired */ + this._events[type] = listeners = listeners.slice(); + } + listeners.splice(i, 1); + + return; + } + } + } + }, + + // @method fire(type: String, data?: Object, propagate?: Boolean): this + // Fires an event of the specified type. You can optionally provide a data + // object — the first argument of the listener function will contain its + // properties. The event can optionally be propagated to event parents. + fire: function (type, data, propagate) { + if (!this.listens(type, propagate)) { return this; } + + var event = extend({}, data, { + type: type, + target: this, + sourceTarget: data && data.sourceTarget || this + }); + + if (this._events) { + var listeners = this._events[type]; + + if (listeners) { + this._firingCount = (this._firingCount + 1) || 1; + for (var i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + l.fn.call(l.ctx || this, event); + } + + this._firingCount--; + } + } + + if (propagate) { + // propagate the event to parents (set with addEventParent) + this._propagateEvent(event); + } + + return this; + }, + + // @method listens(type: String): Boolean + // Returns `true` if a particular event type has any listeners attached to it. + listens: function (type, propagate) { + var listeners = this._events && this._events[type]; + if (listeners && listeners.length) { return true; } + + if (propagate) { + // also check parents for listeners if event propagates + for (var id in this._eventParents) { + if (this._eventParents[id].listens(type, propagate)) { return true; } + } + } + return false; + }, + + // @method once(…): this + // Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed. + once: function (types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + this.once(type, types[type], fn); + } + return this; + } + + var handler = bind(function () { + this + .off(types, fn, context) + .off(types, handler, context); + }, this); + + // add a listener that's executed once and removed after that + return this + .on(types, fn, context) + .on(types, handler, context); + }, + + // @method addEventParent(obj: Evented): this + // Adds an event parent - an `Evented` that will receive propagated events + addEventParent: function (obj) { + this._eventParents = this._eventParents || {}; + this._eventParents[stamp(obj)] = obj; + return this; + }, + + // @method removeEventParent(obj: Evented): this + // Removes an event parent, so it will stop receiving propagated events + removeEventParent: function (obj) { + if (this._eventParents) { + delete this._eventParents[stamp(obj)]; + } + return this; + }, + + _propagateEvent: function (e) { + for (var id in this._eventParents) { + this._eventParents[id].fire(e.type, extend({ + layer: e.target, + propagatedFrom: e.target + }, e), true); + } + } +}; + +// aliases; we should ditch those eventually + +// @method addEventListener(…): this +// Alias to [`on(…)`](#evented-on) +Events.addEventListener = Events.on; + +// @method removeEventListener(…): this +// Alias to [`off(…)`](#evented-off) + +// @method clearAllEventListeners(…): this +// Alias to [`off()`](#evented-off) +Events.removeEventListener = Events.clearAllEventListeners = Events.off; + +// @method addOneTimeEventListener(…): this +// Alias to [`once(…)`](#evented-once) +Events.addOneTimeEventListener = Events.once; + +// @method fireEvent(…): this +// Alias to [`fire(…)`](#evented-fire) +Events.fireEvent = Events.fire; + +// @method hasEventListeners(…): Boolean +// Alias to [`listens(…)`](#evented-listens) +Events.hasEventListeners = Events.listens; + +var Evented = Class.extend(Events); + +/* + * @class Point + * @aka L.Point + * + * Represents a point with `x` and `y` coordinates in pixels. + * + * @example + * + * ```js + * var point = L.point(200, 300); + * ``` + * + * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent: + * + * ```js + * map.panBy([200, 300]); + * map.panBy(L.point(200, 300)); + * ``` + * + * Note that `Point` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + +function Point(x, y, round) { + // @property x: Number; The `x` coordinate of the point + this.x = (round ? Math.round(x) : x); + // @property y: Number; The `y` coordinate of the point + this.y = (round ? Math.round(y) : y); +} + +var trunc = Math.trunc || function (v) { + return v > 0 ? Math.floor(v) : Math.ceil(v); +}; + +Point.prototype = { + + // @method clone(): Point + // Returns a copy of the current point. + clone: function () { + return new Point(this.x, this.y); + }, + + // @method add(otherPoint: Point): Point + // Returns the result of addition of the current and the given points. + add: function (point) { + // non-destructive, returns a new point + return this.clone()._add(toPoint(point)); + }, + + _add: function (point) { + // destructive, used directly for performance in situations where it's safe to modify existing point + this.x += point.x; + this.y += point.y; + return this; + }, + + // @method subtract(otherPoint: Point): Point + // Returns the result of subtraction of the given point from the current. + subtract: function (point) { + return this.clone()._subtract(toPoint(point)); + }, + + _subtract: function (point) { + this.x -= point.x; + this.y -= point.y; + return this; + }, + + // @method divideBy(num: Number): Point + // Returns the result of division of the current point by the given number. + divideBy: function (num) { + return this.clone()._divideBy(num); + }, + + _divideBy: function (num) { + this.x /= num; + this.y /= num; + return this; + }, + + // @method multiplyBy(num: Number): Point + // Returns the result of multiplication of the current point by the given number. + multiplyBy: function (num) { + return this.clone()._multiplyBy(num); + }, + + _multiplyBy: function (num) { + this.x *= num; + this.y *= num; + return this; + }, + + // @method scaleBy(scale: Point): Point + // Multiply each coordinate of the current point by each coordinate of + // `scale`. In linear algebra terms, multiply the point by the + // [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation) + // defined by `scale`. + scaleBy: function (point) { + return new Point(this.x * point.x, this.y * point.y); + }, + + // @method unscaleBy(scale: Point): Point + // Inverse of `scaleBy`. Divide each coordinate of the current point by + // each coordinate of `scale`. + unscaleBy: function (point) { + return new Point(this.x / point.x, this.y / point.y); + }, + + // @method round(): Point + // Returns a copy of the current point with rounded coordinates. + round: function () { + return this.clone()._round(); + }, + + _round: function () { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + }, + + // @method floor(): Point + // Returns a copy of the current point with floored coordinates (rounded down). + floor: function () { + return this.clone()._floor(); + }, + + _floor: function () { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + }, + + // @method ceil(): Point + // Returns a copy of the current point with ceiled coordinates (rounded up). + ceil: function () { + return this.clone()._ceil(); + }, + + _ceil: function () { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + }, + + // @method trunc(): Point + // Returns a copy of the current point with truncated coordinates (rounded towards zero). + trunc: function () { + return this.clone()._trunc(); + }, + + _trunc: function () { + this.x = trunc(this.x); + this.y = trunc(this.y); + return this; + }, + + // @method distanceTo(otherPoint: Point): Number + // Returns the cartesian distance between the current and the given points. + distanceTo: function (point) { + point = toPoint(point); + + var x = point.x - this.x, + y = point.y - this.y; + + return Math.sqrt(x * x + y * y); + }, + + // @method equals(otherPoint: Point): Boolean + // Returns `true` if the given point has the same coordinates. + equals: function (point) { + point = toPoint(point); + + return point.x === this.x && + point.y === this.y; + }, + + // @method contains(otherPoint: Point): Boolean + // Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + contains: function (point) { + point = toPoint(point); + + return Math.abs(point.x) <= Math.abs(this.x) && + Math.abs(point.y) <= Math.abs(this.y); + }, + + // @method toString(): String + // Returns a string representation of the point for debugging purposes. + toString: function () { + return 'Point(' + + formatNum(this.x) + ', ' + + formatNum(this.y) + ')'; + } +}; + +// @factory L.point(x: Number, y: Number, round?: Boolean) +// Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values. + +// @alternative +// @factory L.point(coords: Number[]) +// Expects an array of the form `[x, y]` instead. + +// @alternative +// @factory L.point(coords: Object) +// Expects a plain object of the form `{x: Number, y: Number}` instead. +function toPoint(x, y, round) { + if (x instanceof Point) { + return x; + } + if (isArray(x)) { + return new Point(x[0], x[1]); + } + if (x === undefined || x === null) { + return x; + } + if (typeof x === 'object' && 'x' in x && 'y' in x) { + return new Point(x.x, x.y); + } + return new Point(x, y, round); +} + +/* + * @class Bounds + * @aka L.Bounds + * + * Represents a rectangular area in pixel coordinates. + * + * @example + * + * ```js + * var p1 = L.point(10, 10), + * p2 = L.point(40, 60), + * bounds = L.bounds(p1, p2); + * ``` + * + * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * otherBounds.intersects([[10, 10], [40, 60]]); + * ``` + * + * Note that `Bounds` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + +function Bounds(a, b) { + if (!a) { return; } + + var points = b ? [a, b] : a; + + for (var i = 0, len = points.length; i < len; i++) { + this.extend(points[i]); + } +} + +Bounds.prototype = { + // @method extend(point: Point): this + // Extends the bounds to contain the given point. + extend: function (point) { // (Point) + point = toPoint(point); + + // @property min: Point + // The top left corner of the rectangle. + // @property max: Point + // The bottom right corner of the rectangle. + if (!this.min && !this.max) { + this.min = point.clone(); + this.max = point.clone(); + } else { + this.min.x = Math.min(point.x, this.min.x); + this.max.x = Math.max(point.x, this.max.x); + this.min.y = Math.min(point.y, this.min.y); + this.max.y = Math.max(point.y, this.max.y); + } + return this; + }, + + // @method getCenter(round?: Boolean): Point + // Returns the center point of the bounds. + getCenter: function (round) { + return new Point( + (this.min.x + this.max.x) / 2, + (this.min.y + this.max.y) / 2, round); + }, + + // @method getBottomLeft(): Point + // Returns the bottom-left point of the bounds. + getBottomLeft: function () { + return new Point(this.min.x, this.max.y); + }, + + // @method getTopRight(): Point + // Returns the top-right point of the bounds. + getTopRight: function () { // -> Point + return new Point(this.max.x, this.min.y); + }, + + // @method getTopLeft(): Point + // Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)). + getTopLeft: function () { + return this.min; // left, top + }, + + // @method getBottomRight(): Point + // Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)). + getBottomRight: function () { + return this.max; // right, bottom + }, + + // @method getSize(): Point + // Returns the size of the given bounds + getSize: function () { + return this.max.subtract(this.min); + }, + + // @method contains(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle contains the given one. + // @alternative + // @method contains(point: Point): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { + var min, max; + + if (typeof obj[0] === 'number' || obj instanceof Point) { + obj = toPoint(obj); + } else { + obj = toBounds(obj); + } + + if (obj instanceof Bounds) { + min = obj.min; + max = obj.max; + } else { + min = max = obj; + } + + return (min.x >= this.min.x) && + (max.x <= this.max.x) && + (min.y >= this.min.y) && + (max.y <= this.max.y); + }, + + // @method intersects(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds + // intersect if they have at least one point in common. + intersects: function (bounds) { // (Bounds) -> Boolean + bounds = toBounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xIntersects = (max2.x >= min.x) && (min2.x <= max.x), + yIntersects = (max2.y >= min.y) && (min2.y <= max.y); + + return xIntersects && yIntersects; + }, + + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds + // overlap if their intersection is an area. + overlaps: function (bounds) { // (Bounds) -> Boolean + bounds = toBounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xOverlaps = (max2.x > min.x) && (min2.x < max.x), + yOverlaps = (max2.y > min.y) && (min2.y < max.y); + + return xOverlaps && yOverlaps; + }, + + isValid: function () { + return !!(this.min && this.max); + } +}; + + +// @factory L.bounds(corner1: Point, corner2: Point) +// Creates a Bounds object from two corners coordinate pairs. +// @alternative +// @factory L.bounds(points: Point[]) +// Creates a Bounds object from the given array of points. +function toBounds(a, b) { + if (!a || a instanceof Bounds) { + return a; + } + return new Bounds(a, b); +} + +/* + * @class LatLngBounds + * @aka L.LatLngBounds + * + * Represents a rectangular geographical area on a map. + * + * @example + * + * ```js + * var corner1 = L.latLng(40.712, -74.227), + * corner2 = L.latLng(40.774, -74.125), + * bounds = L.latLngBounds(corner1, corner2); + * ``` + * + * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * map.fitBounds([ + * [40.712, -74.227], + * [40.774, -74.125] + * ]); + * ``` + * + * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. + * + * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + +function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[]) + if (!corner1) { return; } + + var latlngs = corner2 ? [corner1, corner2] : corner1; + + for (var i = 0, len = latlngs.length; i < len; i++) { + this.extend(latlngs[i]); + } +} + +LatLngBounds.prototype = { + + // @method extend(latlng: LatLng): this + // Extend the bounds to contain the given point + + // @alternative + // @method extend(otherBounds: LatLngBounds): this + // Extend the bounds to contain the given bounds + extend: function (obj) { + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof LatLng) { + sw2 = obj; + ne2 = obj; + + } else if (obj instanceof LatLngBounds) { + sw2 = obj._southWest; + ne2 = obj._northEast; + + if (!sw2 || !ne2) { return this; } + + } else { + return obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this; + } + + if (!sw && !ne) { + this._southWest = new LatLng(sw2.lat, sw2.lng); + this._northEast = new LatLng(ne2.lat, ne2.lng); + } else { + sw.lat = Math.min(sw2.lat, sw.lat); + sw.lng = Math.min(sw2.lng, sw.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + } + + return this; + }, + + // @method pad(bufferRatio: Number): LatLngBounds + // Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. + // For example, a ratio of 0.5 extends the bounds by 50% in each direction. + // Negative values will retract the bounds. + pad: function (bufferRatio) { + var sw = this._southWest, + ne = this._northEast, + heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, + widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; + + return new LatLngBounds( + new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), + new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); + }, + + // @method getCenter(): LatLng + // Returns the center point of the bounds. + getCenter: function () { + return new LatLng( + (this._southWest.lat + this._northEast.lat) / 2, + (this._southWest.lng + this._northEast.lng) / 2); + }, + + // @method getSouthWest(): LatLng + // Returns the south-west point of the bounds. + getSouthWest: function () { + return this._southWest; + }, + + // @method getNorthEast(): LatLng + // Returns the north-east point of the bounds. + getNorthEast: function () { + return this._northEast; + }, + + // @method getNorthWest(): LatLng + // Returns the north-west point of the bounds. + getNorthWest: function () { + return new LatLng(this.getNorth(), this.getWest()); + }, + + // @method getSouthEast(): LatLng + // Returns the south-east point of the bounds. + getSouthEast: function () { + return new LatLng(this.getSouth(), this.getEast()); + }, + + // @method getWest(): Number + // Returns the west longitude of the bounds + getWest: function () { + return this._southWest.lng; + }, + + // @method getSouth(): Number + // Returns the south latitude of the bounds + getSouth: function () { + return this._southWest.lat; + }, + + // @method getEast(): Number + // Returns the east longitude of the bounds + getEast: function () { + return this._northEast.lng; + }, + + // @method getNorth(): Number + // Returns the north latitude of the bounds + getNorth: function () { + return this._northEast.lat; + }, + + // @method contains(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle contains the given one. + + // @alternative + // @method contains (latlng: LatLng): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean + if (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) { + obj = toLatLng(obj); + } else { + obj = toLatLngBounds(obj); + } + + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof LatLngBounds) { + sw2 = obj.getSouthWest(); + ne2 = obj.getNorthEast(); + } else { + sw2 = ne2 = obj; + } + + return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && + (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); + }, + + // @method intersects(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + intersects: function (bounds) { + bounds = toLatLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), + lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); + + return latIntersects && lngIntersects; + }, + + // @method overlaps(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. + overlaps: function (bounds) { + bounds = toLatLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), + lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); + + return latOverlaps && lngOverlaps; + }, + + // @method toBBoxString(): String + // Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + toBBoxString: function () { + return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); + }, + + // @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean + // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number. + equals: function (bounds, maxMargin) { + if (!bounds) { return false; } + + bounds = toLatLngBounds(bounds); + + return this._southWest.equals(bounds.getSouthWest(), maxMargin) && + this._northEast.equals(bounds.getNorthEast(), maxMargin); + }, + + // @method isValid(): Boolean + // Returns `true` if the bounds are properly initialized. + isValid: function () { + return !!(this._southWest && this._northEast); + } +}; + +// TODO International date line? + +// @factory L.latLngBounds(corner1: LatLng, corner2: LatLng) +// Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle. + +// @alternative +// @factory L.latLngBounds(latlngs: LatLng[]) +// Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds). +function toLatLngBounds(a, b) { + if (a instanceof LatLngBounds) { + return a; + } + return new LatLngBounds(a, b); +} + +/* @class LatLng + * @aka L.LatLng + * + * Represents a geographical point with a certain latitude and longitude. + * + * @example + * + * ``` + * var latlng = L.latLng(50.5, 30.5); + * ``` + * + * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent: + * + * ``` + * map.panTo([50, 30]); + * map.panTo({lon: 30, lat: 50}); + * map.panTo({lat: 50, lng: 30}); + * map.panTo(L.latLng(50, 30)); + * ``` + * + * Note that `LatLng` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + +function LatLng(lat, lng, alt) { + if (isNaN(lat) || isNaN(lng)) { + throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); + } + + // @property lat: Number + // Latitude in degrees + this.lat = +lat; + + // @property lng: Number + // Longitude in degrees + this.lng = +lng; + + // @property alt: Number + // Altitude in meters (optional) + if (alt !== undefined) { + this.alt = +alt; + } +} + +LatLng.prototype = { + // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean + // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number. + equals: function (obj, maxMargin) { + if (!obj) { return false; } + + obj = toLatLng(obj); + + var margin = Math.max( + Math.abs(this.lat - obj.lat), + Math.abs(this.lng - obj.lng)); + + return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); + }, + + // @method toString(): String + // Returns a string representation of the point (for debugging purposes). + toString: function (precision) { + return 'LatLng(' + + formatNum(this.lat, precision) + ', ' + + formatNum(this.lng, precision) + ')'; + }, + + // @method distanceTo(otherLatLng: LatLng): Number + // Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines). + distanceTo: function (other) { + return Earth.distance(this, toLatLng(other)); + }, + + // @method wrap(): LatLng + // Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees. + wrap: function () { + return Earth.wrapLatLng(this); + }, + + // @method toBounds(sizeInMeters: Number): LatLngBounds + // Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`. + toBounds: function (sizeInMeters) { + var latAccuracy = 180 * sizeInMeters / 40075017, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); + + return toLatLngBounds( + [this.lat - latAccuracy, this.lng - lngAccuracy], + [this.lat + latAccuracy, this.lng + lngAccuracy]); + }, + + clone: function () { + return new LatLng(this.lat, this.lng, this.alt); + } +}; + + + +// @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng +// Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). + +// @alternative +// @factory L.latLng(coords: Array): LatLng +// Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead. + +// @alternative +// @factory L.latLng(coords: Object): LatLng +// Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead. + +function toLatLng(a, b, c) { + if (a instanceof LatLng) { + return a; + } + if (isArray(a) && typeof a[0] !== 'object') { + if (a.length === 3) { + return new LatLng(a[0], a[1], a[2]); + } + if (a.length === 2) { + return new LatLng(a[0], a[1]); + } + return null; + } + if (a === undefined || a === null) { + return a; + } + if (typeof a === 'object' && 'lat' in a) { + return new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); + } + if (b === undefined) { + return null; + } + return new LatLng(a, b, c); +} + +/* + * @namespace CRS + * @crs L.CRS.Base + * Object that defines coordinate reference systems for projecting + * geographical points into pixel (screen) coordinates and back (and to + * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See + * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system). + * + * Leaflet defines the most usual CRSs by default. If you want to use a + * CRS not defined by default, take a look at the + * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. + * + * Note that the CRS instances do not inherit from Leaflet's `Class` object, + * and can't be instantiated. Also, new classes can't inherit from them, + * and methods can't be added to them with the `include` function. + */ + +var CRS = { + // @method latLngToPoint(latlng: LatLng, zoom: Number): Point + // Projects geographical coordinates into pixel coordinates for a given zoom. + latLngToPoint: function (latlng, zoom) { + var projectedPoint = this.projection.project(latlng), + scale = this.scale(zoom); + + return this.transformation._transform(projectedPoint, scale); + }, + + // @method pointToLatLng(point: Point, zoom: Number): LatLng + // The inverse of `latLngToPoint`. Projects pixel coordinates on a given + // zoom into geographical coordinates. + pointToLatLng: function (point, zoom) { + var scale = this.scale(zoom), + untransformedPoint = this.transformation.untransform(point, scale); + + return this.projection.unproject(untransformedPoint); + }, + + // @method project(latlng: LatLng): Point + // Projects geographical coordinates into coordinates in units accepted for + // this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). + project: function (latlng) { + return this.projection.project(latlng); + }, + + // @method unproject(point: Point): LatLng + // Given a projected coordinate returns the corresponding LatLng. + // The inverse of `project`. + unproject: function (point) { + return this.projection.unproject(point); + }, + + // @method scale(zoom: Number): Number + // Returns the scale used when transforming projected coordinates into + // pixel coordinates for a particular zoom. For example, it returns + // `256 * 2^zoom` for Mercator-based CRS. + scale: function (zoom) { + return 256 * Math.pow(2, zoom); + }, + + // @method zoom(scale: Number): Number + // Inverse of `scale()`, returns the zoom level corresponding to a scale + // factor of `scale`. + zoom: function (scale) { + return Math.log(scale / 256) / Math.LN2; + }, + + // @method getProjectedBounds(zoom: Number): Bounds + // Returns the projection's bounds scaled and transformed for the provided `zoom`. + getProjectedBounds: function (zoom) { + if (this.infinite) { return null; } + + var b = this.projection.bounds, + s = this.scale(zoom), + min = this.transformation.transform(b.min, s), + max = this.transformation.transform(b.max, s); + + return new Bounds(min, max); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates. + + // @property code: String + // Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`) + // + // @property wrapLng: Number[] + // An array of two numbers defining whether the longitude (horizontal) coordinate + // axis wraps around a given range and how. Defaults to `[-180, 180]` in most + // geographical CRSs. If `undefined`, the longitude axis does not wrap around. + // + // @property wrapLat: Number[] + // Like `wrapLng`, but for the latitude (vertical) axis. + + // wrapLng: [min, max], + // wrapLat: [min, max], + + // @property infinite: Boolean + // If true, the coordinate space will be unbounded (infinite in both axes) + infinite: false, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where lat and lng has been wrapped according to the + // CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds. + wrapLatLng: function (latlng) { + var lng = this.wrapLng ? wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, + lat = this.wrapLat ? wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, + alt = latlng.alt; + + return new LatLng(lat, lng, alt); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring + // that its center is within the CRS's bounds. + // Only accepts actual `L.LatLngBounds` instances, not arrays. + wrapLatLngBounds: function (bounds) { + var center = bounds.getCenter(), + newCenter = this.wrapLatLng(center), + latShift = center.lat - newCenter.lat, + lngShift = center.lng - newCenter.lng; + + if (latShift === 0 && lngShift === 0) { + return bounds; + } + + var sw = bounds.getSouthWest(), + ne = bounds.getNorthEast(), + newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift), + newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift); + + return new LatLngBounds(newSw, newNe); + } +}; + +/* + * @namespace CRS + * @crs L.CRS.Earth + * + * Serves as the base for CRS that are global such that they cover the earth. + * Can only be used as the base for other CRS and cannot be used directly, + * since it does not have a `code`, `projection` or `transformation`. `distance()` returns + * meters. + */ + +var Earth = extend({}, CRS, { + wrapLng: [-180, 180], + + // Mean Earth Radius, as recommended for use by + // the International Union of Geodesy and Geophysics, + // see http://rosettacode.org/wiki/Haversine_formula + R: 6371000, + + // distance between two geographical points using spherical law of cosines approximation + distance: function (latlng1, latlng2) { + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2), + sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2), + a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon, + c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return this.R * c; + } +}); + +/* + * @namespace Projection + * @projection L.Projection.SphericalMercator + * + * Spherical Mercator projection — the most common projection for online maps, + * used by almost all free and commercial tile providers. Assumes that Earth is + * a sphere. Used by the `EPSG:3857` CRS. + */ + +var earthRadius = 6378137; + +var SphericalMercator = { + + R: earthRadius, + MAX_LATITUDE: 85.0511287798, + + project: function (latlng) { + var d = Math.PI / 180, + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + sin = Math.sin(lat * d); + + return new Point( + this.R * latlng.lng * d, + this.R * Math.log((1 + sin) / (1 - sin)) / 2); + }, + + unproject: function (point) { + var d = 180 / Math.PI; + + return new LatLng( + (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d, + point.x * d / this.R); + }, + + bounds: (function () { + var d = earthRadius * Math.PI; + return new Bounds([-d, -d], [d, d]); + })() +}; + +/* + * @class Transformation + * @aka L.Transformation + * + * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d` + * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing + * the reverse. Used by Leaflet in its projections code. + * + * @example + * + * ```js + * var transformation = L.transformation(2, 5, -1, 10), + * p = L.point(1, 2), + * p2 = transformation.transform(p), // L.point(7, 8) + * p3 = transformation.untransform(p2); // L.point(1, 2) + * ``` + */ + + +// factory new L.Transformation(a: Number, b: Number, c: Number, d: Number) +// Creates a `Transformation` object with the given coefficients. +function Transformation(a, b, c, d) { + if (isArray(a)) { + // use array properties + this._a = a[0]; + this._b = a[1]; + this._c = a[2]; + this._d = a[3]; + return; + } + this._a = a; + this._b = b; + this._c = c; + this._d = d; +} + +Transformation.prototype = { + // @method transform(point: Point, scale?: Number): Point + // Returns a transformed point, optionally multiplied by the given scale. + // Only accepts actual `L.Point` instances, not arrays. + transform: function (point, scale) { // (Point, Number) -> Point + return this._transform(point.clone(), scale); + }, + + // destructive transform (faster) + _transform: function (point, scale) { + scale = scale || 1; + point.x = scale * (this._a * point.x + this._b); + point.y = scale * (this._c * point.y + this._d); + return point; + }, + + // @method untransform(point: Point, scale?: Number): Point + // Returns the reverse transformation of the given point, optionally divided + // by the given scale. Only accepts actual `L.Point` instances, not arrays. + untransform: function (point, scale) { + scale = scale || 1; + return new Point( + (point.x / scale - this._b) / this._a, + (point.y / scale - this._d) / this._c); + } +}; + +// factory L.transformation(a: Number, b: Number, c: Number, d: Number) + +// @factory L.transformation(a: Number, b: Number, c: Number, d: Number) +// Instantiates a Transformation object with the given coefficients. + +// @alternative +// @factory L.transformation(coefficients: Array): Transformation +// Expects an coefficients array of the form +// `[a: Number, b: Number, c: Number, d: Number]`. + +function toTransformation(a, b, c, d) { + return new Transformation(a, b, c, d); +} + +/* + * @namespace CRS + * @crs L.CRS.EPSG3857 + * + * The most common CRS for online maps, used by almost all free and commercial + * tile providers. Uses Spherical Mercator projection. Set in by default in + * Map's `crs` option. + */ + +var EPSG3857 = extend({}, Earth, { + code: 'EPSG:3857', + projection: SphericalMercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * SphericalMercator.R); + return toTransformation(scale, 0.5, -scale, 0.5); + }()) +}); + +var EPSG900913 = extend({}, EPSG3857, { + code: 'EPSG:900913' +}); + +// @namespace SVG; @section +// There are several static functions which can be called without instantiating L.SVG: + +// @function create(name: String): SVGElement +// Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement), +// corresponding to the class name passed. For example, using 'line' will return +// an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement). +function svgCreate(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); +} + +// @function pointsToPath(rings: Point[], closed: Boolean): String +// Generates a SVG path string for multiple rings, with each ring turning +// into "M..L..L.." instructions +function pointsToPath(rings, closed) { + var str = '', + i, j, len, len2, points, p; + + for (i = 0, len = rings.length; i < len; i++) { + points = rings[i]; + + for (j = 0, len2 = points.length; j < len2; j++) { + p = points[j]; + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } + + // closes the ring for polygons; "x" is VML syntax + str += closed ? (svg ? 'z' : 'x') : ''; + } + + // SVG complains about empty path strings + return str || 'M0 0'; +} + +/* + * @namespace Browser + * @aka L.Browser + * + * A namespace with static properties for browser/feature detection used by Leaflet internally. + * + * @example + * + * ```js + * if (L.Browser.ielt9) { + * alert('Upgrade your browser, dude!'); + * } + * ``` + */ + +var style$1 = document.documentElement.style; + +// @property ie: Boolean; `true` for all Internet Explorer versions (not Edge). +var ie = 'ActiveXObject' in window; + +// @property ielt9: Boolean; `true` for Internet Explorer versions less than 9. +var ielt9 = ie && !document.addEventListener; + +// @property edge: Boolean; `true` for the Edge web browser. +var edge = 'msLaunchUri' in navigator && !('documentMode' in document); + +// @property webkit: Boolean; +// `true` for webkit-based browsers like Chrome and Safari (including mobile versions). +var webkit = userAgentContains('webkit'); + +// @property android: Boolean +// `true` for any browser running on an Android platform. +var android = userAgentContains('android'); + +// @property android23: Boolean; `true` for browsers running on Android 2 or Android 3. +var android23 = userAgentContains('android 2') || userAgentContains('android 3'); + +/* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */ +var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit +// @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome) +var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); + +// @property opera: Boolean; `true` for the Opera browser +var opera = !!window.opera; + +// @property chrome: Boolean; `true` for the Chrome browser. +var chrome = !edge && userAgentContains('chrome'); + +// @property gecko: Boolean; `true` for gecko-based browsers like Firefox. +var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; + +// @property safari: Boolean; `true` for the Safari browser. +var safari = !chrome && userAgentContains('safari'); + +var phantom = userAgentContains('phantom'); + +// @property opera12: Boolean +// `true` for the Opera browser supporting CSS transforms (version 12 or later). +var opera12 = 'OTransition' in style$1; + +// @property win: Boolean; `true` when the browser is running in a Windows platform +var win = navigator.platform.indexOf('Win') === 0; + +// @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms. +var ie3d = ie && ('transition' in style$1); + +// @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms. +var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23; + +// @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms. +var gecko3d = 'MozPerspective' in style$1; + +// @property any3d: Boolean +// `true` for all browsers supporting CSS transforms. +var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom; + +// @property mobile: Boolean; `true` for all browsers running in a mobile device. +var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile'); + +// @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device. +var mobileWebkit = mobile && webkit; + +// @property mobileWebkit3d: Boolean +// `true` for all webkit-based browsers in a mobile device supporting CSS transforms. +var mobileWebkit3d = mobile && webkit3d; + +// @property msPointer: Boolean +// `true` for browsers implementing the Microsoft touch events model (notably IE10). +var msPointer = !window.PointerEvent && window.MSPointerEvent; + +// @property pointer: Boolean +// `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). +var pointer = !!(window.PointerEvent || msPointer); + +// @property touch: Boolean +// `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). +// This does not necessarily mean that the browser is running in a computer with +// a touchscreen, it only means that the browser is capable of understanding +// touch events. +var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch)); + +// @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device. +var mobileOpera = mobile && opera; + +// @property mobileGecko: Boolean +// `true` for gecko-based browsers running in a mobile device. +var mobileGecko = mobile && gecko; + +// @property retina: Boolean +// `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%. +var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1; + +// @property passiveEvents: Boolean +// `true` for browsers that support passive events. +var passiveEvents = (function () { + var supportsPassiveOption = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function () { // eslint-disable-line getter-return + supportsPassiveOption = true; + } + }); + window.addEventListener('testPassiveEventSupport', falseFn, opts); + window.removeEventListener('testPassiveEventSupport', falseFn, opts); + } catch (e) { + // Errors can safely be ignored since this is only a browser support test. + } + return supportsPassiveOption; +}()); + +// @property canvas: Boolean +// `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). +var canvas = (function () { + return !!document.createElement('canvas').getContext; +}()); + +// @property svg: Boolean +// `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). +var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect); + +// @property vml: Boolean +// `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). +var vml = !svg && (function () { + try { + var div = document.createElement('div'); + div.innerHTML = ''; + + var shape = div.firstChild; + shape.style.behavior = 'url(#default#VML)'; + + return shape && (typeof shape.adj === 'object'); + + } catch (e) { + return false; + } +}()); + + +function userAgentContains(str) { + return navigator.userAgent.toLowerCase().indexOf(str) >= 0; +} + +var Browser = ({ + ie: ie, + ielt9: ielt9, + edge: edge, + webkit: webkit, + android: android, + android23: android23, + androidStock: androidStock, + opera: opera, + chrome: chrome, + gecko: gecko, + safari: safari, + phantom: phantom, + opera12: opera12, + win: win, + ie3d: ie3d, + webkit3d: webkit3d, + gecko3d: gecko3d, + any3d: any3d, + mobile: mobile, + mobileWebkit: mobileWebkit, + mobileWebkit3d: mobileWebkit3d, + msPointer: msPointer, + pointer: pointer, + touch: touch, + mobileOpera: mobileOpera, + mobileGecko: mobileGecko, + retina: retina, + passiveEvents: passiveEvents, + canvas: canvas, + svg: svg, + vml: vml +}); + +/* + * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. + */ + + +var POINTER_DOWN = msPointer ? 'MSPointerDown' : 'pointerdown'; +var POINTER_MOVE = msPointer ? 'MSPointerMove' : 'pointermove'; +var POINTER_UP = msPointer ? 'MSPointerUp' : 'pointerup'; +var POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel'; + +var _pointers = {}; +var _pointerDocListener = false; + +// Provides a touch events wrapper for (ms)pointer events. +// ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 + +function addPointerListener(obj, type, handler, id) { + if (type === 'touchstart') { + _addPointerStart(obj, handler, id); + + } else if (type === 'touchmove') { + _addPointerMove(obj, handler, id); + + } else if (type === 'touchend') { + _addPointerEnd(obj, handler, id); + } + + return this; +} + +function removePointerListener(obj, type, id) { + var handler = obj['_leaflet_' + type + id]; + + if (type === 'touchstart') { + obj.removeEventListener(POINTER_DOWN, handler, false); + + } else if (type === 'touchmove') { + obj.removeEventListener(POINTER_MOVE, handler, false); + + } else if (type === 'touchend') { + obj.removeEventListener(POINTER_UP, handler, false); + obj.removeEventListener(POINTER_CANCEL, handler, false); + } + + return this; +} + +function _addPointerStart(obj, handler, id) { + var onDown = bind(function (e) { + // IE10 specific: MsTouch needs preventDefault. See #2000 + if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { + preventDefault(e); + } + + _handlePointer(e, handler); + }); + + obj['_leaflet_touchstart' + id] = onDown; + obj.addEventListener(POINTER_DOWN, onDown, false); + + // need to keep track of what pointers and how many are active to provide e.touches emulation + if (!_pointerDocListener) { + // we listen document as any drags that end by moving the touch off the screen get fired there + document.addEventListener(POINTER_DOWN, _globalPointerDown, true); + document.addEventListener(POINTER_MOVE, _globalPointerMove, true); + document.addEventListener(POINTER_UP, _globalPointerUp, true); + document.addEventListener(POINTER_CANCEL, _globalPointerUp, true); + + _pointerDocListener = true; + } +} + +function _globalPointerDown(e) { + _pointers[e.pointerId] = e; +} + +function _globalPointerMove(e) { + if (_pointers[e.pointerId]) { + _pointers[e.pointerId] = e; + } +} + +function _globalPointerUp(e) { + delete _pointers[e.pointerId]; +} + +function _handlePointer(e, handler) { + e.touches = []; + for (var i in _pointers) { + e.touches.push(_pointers[i]); + } + e.changedTouches = [e]; + + handler(e); +} + +function _addPointerMove(obj, handler, id) { + var onMove = function (e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { + return; + } + + _handlePointer(e, handler); + }; + + obj['_leaflet_touchmove' + id] = onMove; + obj.addEventListener(POINTER_MOVE, onMove, false); +} + +function _addPointerEnd(obj, handler, id) { + var onUp = function (e) { + _handlePointer(e, handler); + }; + + obj['_leaflet_touchend' + id] = onUp; + obj.addEventListener(POINTER_UP, onUp, false); + obj.addEventListener(POINTER_CANCEL, onUp, false); +} + +/* + * Extends the event handling code with double tap support for mobile browsers. + */ + +var _touchstart = msPointer ? 'MSPointerDown' : pointer ? 'pointerdown' : 'touchstart'; +var _touchend = msPointer ? 'MSPointerUp' : pointer ? 'pointerup' : 'touchend'; +var _pre = '_leaflet_'; + +// inspired by Zepto touch code by Thomas Fuchs +function addDoubleTapListener(obj, handler, id) { + var last, touch$$1, + doubleTap = false, + delay = 250; + + function onTouchStart(e) { + + if (pointer) { + if (!e.isPrimary) { return; } + if (e.pointerType === 'mouse') { return; } // mouse fires native dblclick + } else if (e.touches.length > 1) { + return; + } + + var now = Date.now(), + delta = now - (last || now); + + touch$$1 = e.touches ? e.touches[0] : e; + doubleTap = (delta > 0 && delta <= delay); + last = now; + } + + function onTouchEnd(e) { + if (doubleTap && !touch$$1.cancelBubble) { + if (pointer) { + if (e.pointerType === 'mouse') { return; } + // work around .type being readonly with MSPointer* events + var newTouch = {}, + prop, i; + + for (i in touch$$1) { + prop = touch$$1[i]; + newTouch[i] = prop && prop.bind ? prop.bind(touch$$1) : prop; + } + touch$$1 = newTouch; + } + touch$$1.type = 'dblclick'; + touch$$1.button = 0; + handler(touch$$1); + last = null; + } + } + + obj[_pre + _touchstart + id] = onTouchStart; + obj[_pre + _touchend + id] = onTouchEnd; + obj[_pre + 'dblclick' + id] = handler; + + obj.addEventListener(_touchstart, onTouchStart, passiveEvents ? {passive: false} : false); + obj.addEventListener(_touchend, onTouchEnd, passiveEvents ? {passive: false} : false); + + // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse), + // the browser doesn't fire touchend/pointerup events but does fire + // native dblclicks. See #4127. + // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180. + obj.addEventListener('dblclick', handler, false); + + return this; +} + +function removeDoubleTapListener(obj, id) { + var touchstart = obj[_pre + _touchstart + id], + touchend = obj[_pre + _touchend + id], + dblclick = obj[_pre + 'dblclick' + id]; + + obj.removeEventListener(_touchstart, touchstart, passiveEvents ? {passive: false} : false); + obj.removeEventListener(_touchend, touchend, passiveEvents ? {passive: false} : false); + obj.removeEventListener('dblclick', dblclick, false); + + return this; +} + +/* + * @namespace DomUtil + * + * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) + * tree, used by Leaflet internally. + * + * Most functions expecting or returning a `HTMLElement` also work for + * SVG elements. The only difference is that classes refer to CSS classes + * in HTML and SVG classes in SVG. + */ + + +// @property TRANSFORM: String +// Vendor-prefixed transform style name (e.g. `'webkitTransform'` for WebKit). +var TRANSFORM = testProp( + ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + +// webkitTransition comes first because some browser versions that drop vendor prefix don't do +// the same for the transitionend event, in particular the Android 4.1 stock browser + +// @property TRANSITION: String +// Vendor-prefixed transition style name. +var TRANSITION = testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + +// @property TRANSITION_END: String +// Vendor-prefixed transitionend event name. +var TRANSITION_END = + TRANSITION === 'webkitTransition' || TRANSITION === 'OTransition' ? TRANSITION + 'End' : 'transitionend'; + + +// @function get(id: String|HTMLElement): HTMLElement +// Returns an element given its DOM id, or returns the element itself +// if it was passed directly. +function get(id) { + return typeof id === 'string' ? document.getElementById(id) : id; +} + +// @function getStyle(el: HTMLElement, styleAttrib: String): String +// Returns the value for a certain style attribute on an element, +// including computed values or values set through CSS. +function getStyle(el, style) { + var value = el.style[style] || (el.currentStyle && el.currentStyle[style]); + + if ((!value || value === 'auto') && document.defaultView) { + var css = document.defaultView.getComputedStyle(el, null); + value = css ? css[style] : null; + } + return value === 'auto' ? null : value; +} + +// @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement +// Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element. +function create$1(tagName, className, container) { + var el = document.createElement(tagName); + el.className = className || ''; + + if (container) { + container.appendChild(el); + } + return el; +} + +// @function remove(el: HTMLElement) +// Removes `el` from its parent element +function remove(el) { + var parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } +} + +// @function empty(el: HTMLElement) +// Removes all of `el`'s children elements from `el` +function empty(el) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } +} + +// @function toFront(el: HTMLElement) +// Makes `el` the last child of its parent, so it renders in front of the other children. +function toFront(el) { + var parent = el.parentNode; + if (parent && parent.lastChild !== el) { + parent.appendChild(el); + } +} + +// @function toBack(el: HTMLElement) +// Makes `el` the first child of its parent, so it renders behind the other children. +function toBack(el) { + var parent = el.parentNode; + if (parent && parent.firstChild !== el) { + parent.insertBefore(el, parent.firstChild); + } +} + +// @function hasClass(el: HTMLElement, name: String): Boolean +// Returns `true` if the element's class attribute contains `name`. +function hasClass(el, name) { + if (el.classList !== undefined) { + return el.classList.contains(name); + } + var className = getClass(el); + return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); +} + +// @function addClass(el: HTMLElement, name: String) +// Adds `name` to the element's class attribute. +function addClass(el, name) { + if (el.classList !== undefined) { + var classes = splitWords(name); + for (var i = 0, len = classes.length; i < len; i++) { + el.classList.add(classes[i]); + } + } else if (!hasClass(el, name)) { + var className = getClass(el); + setClass(el, (className ? className + ' ' : '') + name); + } +} + +// @function removeClass(el: HTMLElement, name: String) +// Removes `name` from the element's class attribute. +function removeClass(el, name) { + if (el.classList !== undefined) { + el.classList.remove(name); + } else { + setClass(el, trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + } +} + +// @function setClass(el: HTMLElement, name: String) +// Sets the element's class. +function setClass(el, name) { + if (el.className.baseVal === undefined) { + el.className = name; + } else { + // in case of SVG element + el.className.baseVal = name; + } +} + +// @function getClass(el: HTMLElement): String +// Returns the element's class. +function getClass(el) { + // Check if the element is an SVGElementInstance and use the correspondingElement instead + // (Required for linked SVG elements in IE11.) + if (el.correspondingElement) { + el = el.correspondingElement; + } + return el.className.baseVal === undefined ? el.className : el.className.baseVal; +} + +// @function setOpacity(el: HTMLElement, opacity: Number) +// Set the opacity of an element (including old IE support). +// `opacity` must be a number from `0` to `1`. +function setOpacity(el, value) { + if ('opacity' in el.style) { + el.style.opacity = value; + } else if ('filter' in el.style) { + _setOpacityIE(el, value); + } +} + +function _setOpacityIE(el, value) { + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; + + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } + + value = Math.round(value * 100); + + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; + } +} + +// @function testProp(props: String[]): String|false +// Goes through the array of style names and returns the first name +// that is a valid style name for an element. If no such name is found, +// it returns false. Useful for vendor-prefixed styles like `transform`. +function testProp(props) { + var style = document.documentElement.style; + + for (var i = 0; i < props.length; i++) { + if (props[i] in style) { + return props[i]; + } + } + return false; +} + +// @function setTransform(el: HTMLElement, offset: Point, scale?: Number) +// Resets the 3D CSS transform of `el` so it is translated by `offset` pixels +// and optionally scaled by `scale`. Does not have an effect if the +// browser doesn't support 3D CSS transforms. +function setTransform(el, offset, scale) { + var pos = offset || new Point(0, 0); + + el.style[TRANSFORM] = + (ie3d ? + 'translate(' + pos.x + 'px,' + pos.y + 'px)' : + 'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') + + (scale ? ' scale(' + scale + ')' : ''); +} + +// @function setPosition(el: HTMLElement, position: Point) +// Sets the position of `el` to coordinates specified by `position`, +// using CSS translate or top/left positioning depending on the browser +// (used by Leaflet internally to position its layers). +function setPosition(el, point) { + + /*eslint-disable */ + el._leaflet_pos = point; + /* eslint-enable */ + + if (any3d) { + setTransform(el, point); + } else { + el.style.left = point.x + 'px'; + el.style.top = point.y + 'px'; + } +} + +// @function getPosition(el: HTMLElement): Point +// Returns the coordinates of an element previously positioned with setPosition. +function getPosition(el) { + // this method is only used for elements previously positioned using setPosition, + // so it's safe to cache the position for performance + + return el._leaflet_pos || new Point(0, 0); +} + +// @function disableTextSelection() +// Prevents the user from generating `selectstart` DOM events, usually generated +// when the user drags the mouse through a page with text. Used internally +// by Leaflet to override the behaviour of any click-and-drag interaction on +// the map. Affects drag interactions on the whole document. + +// @function enableTextSelection() +// Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection). +var disableTextSelection; +var enableTextSelection; +var _userSelect; +if ('onselectstart' in document) { + disableTextSelection = function () { + on(window, 'selectstart', preventDefault); + }; + enableTextSelection = function () { + off(window, 'selectstart', preventDefault); + }; +} else { + var userSelectProperty = testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + disableTextSelection = function () { + if (userSelectProperty) { + var style = document.documentElement.style; + _userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }; + enableTextSelection = function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = _userSelect; + _userSelect = undefined; + } + }; +} + +// @function disableImageDrag() +// As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but +// for `dragstart` DOM events, usually generated when the user drags an image. +function disableImageDrag() { + on(window, 'dragstart', preventDefault); +} + +// @function enableImageDrag() +// Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection). +function enableImageDrag() { + off(window, 'dragstart', preventDefault); +} + +var _outlineElement, _outlineStyle; +// @function preventOutline(el: HTMLElement) +// Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline) +// of the element `el` invisible. Used internally by Leaflet to prevent +// focusable elements from displaying an outline when the user performs a +// drag interaction on them. +function preventOutline(element) { + while (element.tabIndex === -1) { + element = element.parentNode; + } + if (!element.style) { return; } + restoreOutline(); + _outlineElement = element; + _outlineStyle = element.style.outline; + element.style.outline = 'none'; + on(window, 'keydown', restoreOutline); +} + +// @function restoreOutline() +// Cancels the effects of a previous [`L.DomUtil.preventOutline`](). +function restoreOutline() { + if (!_outlineElement) { return; } + _outlineElement.style.outline = _outlineStyle; + _outlineElement = undefined; + _outlineStyle = undefined; + off(window, 'keydown', restoreOutline); +} + +// @function getSizedParentNode(el: HTMLElement): HTMLElement +// Finds the closest parent node which size (width and height) is not null. +function getSizedParentNode(element) { + do { + element = element.parentNode; + } while ((!element.offsetWidth || !element.offsetHeight) && element !== document.body); + return element; +} + +// @function getScale(el: HTMLElement): Object +// Computes the CSS scale currently applied on the element. +// Returns an object with `x` and `y` members as horizontal and vertical scales respectively, +// and `boundingClientRect` as the result of [`getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). +function getScale(element) { + var rect = element.getBoundingClientRect(); // Read-only in old browsers. + + return { + x: rect.width / element.offsetWidth || 1, + y: rect.height / element.offsetHeight || 1, + boundingClientRect: rect + }; +} + +var DomUtil = ({ + TRANSFORM: TRANSFORM, + TRANSITION: TRANSITION, + TRANSITION_END: TRANSITION_END, + get: get, + getStyle: getStyle, + create: create$1, + remove: remove, + empty: empty, + toFront: toFront, + toBack: toBack, + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + setClass: setClass, + getClass: getClass, + setOpacity: setOpacity, + testProp: testProp, + setTransform: setTransform, + setPosition: setPosition, + getPosition: getPosition, + get disableTextSelection () { return disableTextSelection; }, + get enableTextSelection () { return enableTextSelection; }, + disableImageDrag: disableImageDrag, + enableImageDrag: enableImageDrag, + preventOutline: preventOutline, + restoreOutline: restoreOutline, + getSizedParentNode: getSizedParentNode, + getScale: getScale +}); + +/* + * @namespace DomEvent + * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally. + */ + +// Inspired by John Resig, Dean Edwards and YUI addEvent implementations. + +// @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this +// Adds a listener function (`fn`) to a particular DOM event type of the +// element `el`. You can optionally specify the context of the listener +// (object the `this` keyword will point to). You can also pass several +// space-separated types (e.g. `'click dblclick'`). + +// @alternative +// @function on(el: HTMLElement, eventMap: Object, context?: Object): this +// Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` +function on(obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + addOne(obj, type, types[type], fn); + } + } else { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + addOne(obj, types[i], fn, context); + } + } + + return this; +} + +var eventsKey = '_leaflet_events'; + +// @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this +// Removes a previously added listener function. +// Note that if you passed a custom context to on, you must pass the same +// context to `off` in order to remove the listener. + +// @alternative +// @function off(el: HTMLElement, eventMap: Object, context?: Object): this +// Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` +function off(obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + removeOne(obj, type, types[type], fn); + } + } else if (types) { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + removeOne(obj, types[i], fn, context); + } + } else { + for (var j in obj[eventsKey]) { + removeOne(obj, j, obj[eventsKey][j]); + } + delete obj[eventsKey]; + } + + return this; +} + +function browserFiresNativeDblClick() { + // See https://github.com/w3c/pointerevents/issues/171 + if (pointer) { + return !(edge || safari); + } +} + +var mouseSubst = { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + wheel: !('onwheel' in window) && 'mousewheel' +}; + +function addOne(obj, type, fn, context) { + var id = type + stamp(fn) + (context ? '_' + stamp(context) : ''); + + if (obj[eventsKey] && obj[eventsKey][id]) { return this; } + + var handler = function (e) { + return fn.call(context || obj, e || window.event); + }; + + var originalHandler = handler; + + if (pointer && type.indexOf('touch') === 0) { + // Needs DomEvent.Pointer.js + addPointerListener(obj, type, handler, id); + + } else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { + addDoubleTapListener(obj, handler, id); + + } else if ('addEventListener' in obj) { + + if (type === 'touchstart' || type === 'touchmove' || type === 'wheel' || type === 'mousewheel') { + obj.addEventListener(mouseSubst[type] || type, handler, passiveEvents ? {passive: false} : false); + + } else if (type === 'mouseenter' || type === 'mouseleave') { + handler = function (e) { + e = e || window.event; + if (isExternalTarget(obj, e)) { + originalHandler(e); + } + }; + obj.addEventListener(mouseSubst[type], handler, false); + + } else { + obj.addEventListener(type, originalHandler, false); + } + + } else if ('attachEvent' in obj) { + obj.attachEvent('on' + type, handler); + } + + obj[eventsKey] = obj[eventsKey] || {}; + obj[eventsKey][id] = handler; +} + +function removeOne(obj, type, fn, context) { + + var id = type + stamp(fn) + (context ? '_' + stamp(context) : ''), + handler = obj[eventsKey] && obj[eventsKey][id]; + + if (!handler) { return this; } + + if (pointer && type.indexOf('touch') === 0) { + removePointerListener(obj, type, id); + + } else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { + removeDoubleTapListener(obj, id); + + } else if ('removeEventListener' in obj) { + + obj.removeEventListener(mouseSubst[type] || type, handler, false); + + } else if ('detachEvent' in obj) { + obj.detachEvent('on' + type, handler); + } + + obj[eventsKey][id] = null; +} + +// @function stopPropagation(ev: DOMEvent): this +// Stop the given event from propagation to parent elements. Used inside the listener functions: +// ```js +// L.DomEvent.on(div, 'click', function (ev) { +// L.DomEvent.stopPropagation(ev); +// }); +// ``` +function stopPropagation(e) { + + if (e.stopPropagation) { + e.stopPropagation(); + } else if (e.originalEvent) { // In case of Leaflet event. + e.originalEvent._stopped = true; + } else { + e.cancelBubble = true; + } + skipped(e); + + return this; +} + +// @function disableScrollPropagation(el: HTMLElement): this +// Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants). +function disableScrollPropagation(el) { + addOne(el, 'wheel', stopPropagation); + return this; +} + +// @function disableClickPropagation(el: HTMLElement): this +// Adds `stopPropagation` to the element's `'click'`, `'dblclick'`, +// `'mousedown'` and `'touchstart'` events (plus browser variants). +function disableClickPropagation(el) { + on(el, 'mousedown touchstart dblclick', stopPropagation); + addOne(el, 'click', fakeStop); + return this; +} + +// @function preventDefault(ev: DOMEvent): this +// Prevents the default action of the DOM Event `ev` from happening (such as +// following a link in the href of the a element, or doing a POST request +// with page reload when a `
` is submitted). +// Use it inside listener functions. +function preventDefault(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + return this; +} + +// @function stop(ev: DOMEvent): this +// Does `stopPropagation` and `preventDefault` at the same time. +function stop(e) { + preventDefault(e); + stopPropagation(e); + return this; +} + +// @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point +// Gets normalized mouse position from a DOM event relative to the +// `container` (border excluded) or to the whole page if not specified. +function getMousePosition(e, container) { + if (!container) { + return new Point(e.clientX, e.clientY); + } + + var scale = getScale(container), + offset = scale.boundingClientRect; // left and top values are in page scale (like the event clientX/Y) + + return new Point( + // offset.left/top values are in page scale (like clientX/Y), + // whereas clientLeft/Top (border width) values are the original values (before CSS scale applies). + (e.clientX - offset.left) / scale.x - container.clientLeft, + (e.clientY - offset.top) / scale.y - container.clientTop + ); +} + +// Chrome on Win scrolls double the pixels as in other platforms (see #4538), +// and Firefox scrolls device pixels, not CSS pixels +var wheelPxFactor = + (win && chrome) ? 2 * window.devicePixelRatio : + gecko ? window.devicePixelRatio : 1; + +// @function getWheelDelta(ev: DOMEvent): Number +// Gets normalized wheel delta from a wheel DOM event, in vertical +// pixels scrolled (negative if scrolling down). +// Events from pointing devices without precise scrolling are mapped to +// a best guess of 60 pixels. +function getWheelDelta(e) { + return (edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta + (e.deltaY && e.deltaMode === 0) ? -e.deltaY / wheelPxFactor : // Pixels + (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines + (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages + (e.deltaX || e.deltaZ) ? 0 : // Skip horizontal/depth wheel events + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels + (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines + e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages + 0; +} + +var skipEvents = {}; + +function fakeStop(e) { + // fakes stopPropagation by setting a special event flag, checked/reset with skipped(e) + skipEvents[e.type] = true; +} + +function skipped(e) { + var events = skipEvents[e.type]; + // reset when checking, as it's only used in map container and propagates outside of the map + skipEvents[e.type] = false; + return events; +} + +// check if element really left/entered the event target (for mouseenter/mouseleave) +function isExternalTarget(el, e) { + + var related = e.relatedTarget; + + if (!related) { return true; } + + try { + while (related && (related !== el)) { + related = related.parentNode; + } + } catch (err) { + return false; + } + return (related !== el); +} + +var DomEvent = ({ + on: on, + off: off, + stopPropagation: stopPropagation, + disableScrollPropagation: disableScrollPropagation, + disableClickPropagation: disableClickPropagation, + preventDefault: preventDefault, + stop: stop, + getMousePosition: getMousePosition, + getWheelDelta: getWheelDelta, + fakeStop: fakeStop, + skipped: skipped, + isExternalTarget: isExternalTarget, + addListener: on, + removeListener: off +}); + +/* + * @class PosAnimation + * @aka L.PosAnimation + * @inherits Evented + * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9. + * + * @example + * ```js + * var fx = new L.PosAnimation(); + * fx.run(el, [300, 500], 0.5); + * ``` + * + * @constructor L.PosAnimation() + * Creates a `PosAnimation` object. + * + */ + +var PosAnimation = Evented.extend({ + + // @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number) + // Run an animation of a given element to a new position, optionally setting + // duration in seconds (`0.25` by default) and easing linearity factor (3rd + // argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1), + // `0.5` by default). + run: function (el, newPos, duration, easeLinearity) { + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + // @event start: Event + // Fired when the animation starts + this.fire('start'); + + this._animate(); + }, + + // @method stop() + // Stops the animation (if currently running). + stop: function () { + if (!this._inProgress) { return; } + + this._step(true); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = requestAnimFrame(this._animate, this); + this._step(); + }, + + _step: function (round) { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; + + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration), round); + } else { + this._runFrame(1); + this._complete(); + } + }, + + _runFrame: function (progress, round) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + if (round) { + pos._round(); + } + setPosition(this._el, pos); + + // @event step: Event + // Fired continuously during the animation. + this.fire('step'); + }, + + _complete: function () { + cancelAnimFrame(this._animId); + + this._inProgress = false; + // @event end: Event + // Fired when the animation ends. + this.fire('end'); + }, + + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } +}); + +/* + * @class Map + * @aka L.Map + * @inherits Evented + * + * The central class of the API — it is used to create a map on a page and manipulate it. + * + * @example + * + * ```js + * // initialize the map on the "map" div with a given center and zoom + * var map = L.map('map', { + * center: [51.505, -0.09], + * zoom: 13 + * }); + * ``` + * + */ + +var Map = Evented.extend({ + + options: { + // @section Map State Options + // @option crs: CRS = L.CRS.EPSG3857 + // The [Coordinate Reference System](#crs) to use. Don't change this if you're not + // sure what it means. + crs: EPSG3857, + + // @option center: LatLng = undefined + // Initial geographic center of the map + center: undefined, + + // @option zoom: Number = undefined + // Initial map zoom level + zoom: undefined, + + // @option minZoom: Number = * + // Minimum zoom level of the map. + // If not specified and at least one `GridLayer` or `TileLayer` is in the map, + // the lowest of their `minZoom` options will be used instead. + minZoom: undefined, + + // @option maxZoom: Number = * + // Maximum zoom level of the map. + // If not specified and at least one `GridLayer` or `TileLayer` is in the map, + // the highest of their `maxZoom` options will be used instead. + maxZoom: undefined, + + // @option layers: Layer[] = [] + // Array of layers that will be added to the map initially + layers: [], + + // @option maxBounds: LatLngBounds = null + // When this option is set, the map restricts the view to the given + // geographical bounds, bouncing the user back if the user tries to pan + // outside the view. To set the restriction dynamically, use + // [`setMaxBounds`](#map-setmaxbounds) method. + maxBounds: undefined, + + // @option renderer: Renderer = * + // The default method for drawing vector layers on the map. `L.SVG` + // or `L.Canvas` by default depending on browser support. + renderer: undefined, + + + // @section Animation Options + // @option zoomAnimation: Boolean = true + // Whether the map zoom animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + zoomAnimation: true, + + // @option zoomAnimationThreshold: Number = 4 + // Won't animate zoom if the zoom difference exceeds this value. + zoomAnimationThreshold: 4, + + // @option fadeAnimation: Boolean = true + // Whether the tile fade animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + fadeAnimation: true, + + // @option markerZoomAnimation: Boolean = true + // Whether markers animate their zoom with the zoom animation, if disabled + // they will disappear for the length of the animation. By default it's + // enabled in all browsers that support CSS3 Transitions except Android. + markerZoomAnimation: true, + + // @option transform3DLimit: Number = 2^23 + // Defines the maximum size of a CSS translation transform. The default + // value should not be changed unless a web browser positions layers in + // the wrong place after doing a large `panBy`. + transform3DLimit: 8388608, // Precision limit of a 32-bit float + + // @section Interaction Options + // @option zoomSnap: Number = 1 + // Forces the map's zoom level to always be a multiple of this, particularly + // right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom. + // By default, the zoom level snaps to the nearest integer; lower values + // (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0` + // means the zoom level will not be snapped after `fitBounds` or a pinch-zoom. + zoomSnap: 1, + + // @option zoomDelta: Number = 1 + // Controls how much the map's zoom level will change after a + // [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+` + // or `-` on the keyboard, or using the [zoom controls](#control-zoom). + // Values smaller than `1` (e.g. `0.5`) allow for greater granularity. + zoomDelta: 1, + + // @option trackResize: Boolean = true + // Whether the map automatically handles browser window resize to update itself. + trackResize: true + }, + + initialize: function (id, options) { // (HTMLElement or String, Object) + options = setOptions(this, options); + + // Make sure to assign internal flags at the beginning, + // to avoid inconsistent state in some edge cases. + this._handlers = []; + this._layers = {}; + this._zoomBoundLayers = {}; + this._sizeChanged = true; + + this._initContainer(id); + this._initLayout(); + + // hack for https://github.com/Leaflet/Leaflet/issues/1980 + this._onResize = bind(this._onResize, this); + + this._initEvents(); + + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + + if (options.zoom !== undefined) { + this._zoom = this._limitZoom(options.zoom); + } + + if (options.center && options.zoom !== undefined) { + this.setView(toLatLng(options.center), options.zoom, {reset: true}); + } + + this.callInitHooks(); + + // don't animate on browsers without hardware-accelerated transitions or old Android/Opera + this._zoomAnimated = TRANSITION && any3d && !mobileOpera && + this.options.zoomAnimation; + + // zoom transitions run with the same duration for all layers, so if one of transitionend events + // happens after starting zoom animation (propagating to the map pane), we know that it ended globally + if (this._zoomAnimated) { + this._createAnimProxy(); + on(this._proxy, TRANSITION_END, this._catchTransitionEnd, this); + } + + this._addLayers(this.options.layers); + }, + + + // @section Methods for modifying map state + + // @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) with the given + // animation options. + setView: function (center, zoom, options) { + + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + center = this._limitCenter(toLatLng(center), zoom, this.options.maxBounds); + options = options || {}; + + this._stop(); + + if (this._loaded && !options.reset && options !== true) { + + if (options.animate !== undefined) { + options.zoom = extend({animate: options.animate}, options.zoom); + options.pan = extend({animate: options.animate, duration: options.duration}, options.pan); + } + + // try animating pan or zoom + var moved = (this._zoom !== zoom) ? + this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : + this._tryAnimatedPan(center, options.pan); + + if (moved) { + // prevent resize handler call, the view will refresh after animation anyway + clearTimeout(this._sizeTimer); + return this; + } + } + + // animation didn't start, just reset the map view + this._resetView(center, zoom); + + return this; + }, + + // @method setZoom(zoom: Number, options?: Zoom/pan options): this + // Sets the zoom of the map. + setZoom: function (zoom, options) { + if (!this._loaded) { + this._zoom = zoom; + return this; + } + return this.setView(this.getCenter(), zoom, {zoom: options}); + }, + + // @method zoomIn(delta?: Number, options?: Zoom options): this + // Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomIn: function (delta, options) { + delta = delta || (any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom + delta, options); + }, + + // @method zoomOut(delta?: Number, options?: Zoom options): this + // Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomOut: function (delta, options) { + delta = delta || (any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom - delta, options); + }, + + // @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified geographical point on the map + // stationary (e.g. used internally for scroll zoom and double-click zoom). + // @alternative + // @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary. + setZoomAround: function (latlng, zoom, options) { + var scale = this.getZoomScale(zoom), + viewHalf = this.getSize().divideBy(2), + containerPoint = latlng instanceof Point ? latlng : this.latLngToContainerPoint(latlng), + + centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), + newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); + + return this.setView(newCenter, zoom, {zoom: options}); + }, + + _getBoundsCenterZoom: function (bounds, options) { + + options = options || {}; + bounds = bounds.getBounds ? bounds.getBounds() : toLatLngBounds(bounds); + + var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]), + + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); + + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; + + if (zoom === Infinity) { + return { + center: bounds.getCenter(), + zoom: zoom + }; + } + + var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + + swPoint = this.project(bounds.getSouthWest(), zoom), + nePoint = this.project(bounds.getNorthEast(), zoom), + center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); + + return { + center: center, + zoom: zoom + }; + }, + + // @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets a map view that contains the given geographical bounds with the + // maximum zoom level possible. + fitBounds: function (bounds, options) { + + bounds = toLatLngBounds(bounds); + + if (!bounds.isValid()) { + throw new Error('Bounds are not valid.'); + } + + var target = this._getBoundsCenterZoom(bounds, options); + return this.setView(target.center, target.zoom, options); + }, + + // @method fitWorld(options?: fitBounds options): this + // Sets a map view that mostly contains the whole world with the maximum + // zoom level possible. + fitWorld: function (options) { + return this.fitBounds([[-90, -180], [90, 180]], options); + }, + + // @method panTo(latlng: LatLng, options?: Pan options): this + // Pans the map to a given center. + panTo: function (center, options) { // (LatLng) + return this.setView(center, this._zoom, {pan: options}); + }, + + // @method panBy(offset: Point, options?: Pan options): this + // Pans the map by a given number of pixels (animated). + panBy: function (offset, options) { + offset = toPoint(offset).round(); + options = options || {}; + + if (!offset.x && !offset.y) { + return this.fire('moveend'); + } + // If we pan too far, Chrome gets issues with tiles + // and makes them disappear or appear in the wrong place (slightly offset) #2602 + if (options.animate !== true && !this.getSize().contains(offset)) { + this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + return this; + } + + if (!this._panAnim) { + this._panAnim = new PosAnimation(); + + this._panAnim.on({ + 'step': this._onPanTransitionStep, + 'end': this._onPanTransitionEnd + }, this); + } + + // don't fire movestart if animating inertia + if (!options.noMoveStart) { + this.fire('movestart'); + } + + // animate pan unless animate: false specified + if (options.animate !== false) { + addClass(this._mapPane, 'leaflet-pan-anim'); + + var newPos = this._getMapPanePos().subtract(offset).round(); + this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); + } else { + this._rawPanBy(offset); + this.fire('move').fire('moveend'); + } + + return this; + }, + + // @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) performing a smooth + // pan-zoom animation. + flyTo: function (targetCenter, targetZoom, options) { + + options = options || {}; + if (options.animate === false || !any3d) { + return this.setView(targetCenter, targetZoom, options); + } + + this._stop(); + + var from = this.project(this.getCenter()), + to = this.project(targetCenter), + size = this.getSize(), + startZoom = this._zoom; + + targetCenter = toLatLng(targetCenter); + targetZoom = targetZoom === undefined ? startZoom : targetZoom; + + var w0 = Math.max(size.x, size.y), + w1 = w0 * this.getZoomScale(startZoom, targetZoom), + u1 = (to.distanceTo(from)) || 1, + rho = 1.42, + rho2 = rho * rho; + + function r(i) { + var s1 = i ? -1 : 1, + s2 = i ? w1 : w0, + t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1, + b1 = 2 * s2 * rho2 * u1, + b = t1 / b1, + sq = Math.sqrt(b * b + 1) - b; + + // workaround for floating point precision bug when sq = 0, log = -Infinite, + // thus triggering an infinite loop in flyTo + var log = sq < 0.000000001 ? -18 : Math.log(sq); + + return log; + } + + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + var r0 = r(0); + + function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } + function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } + + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } + + var start = Date.now(), + S = (r(1) - r0) / rho, + duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8; + + function frame() { + var t = (Date.now() - start) / duration, + s = easeOut(t) * S; + + if (t <= 1) { + this._flyToFrame = requestAnimFrame(frame, this); + + this._move( + this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), + this.getScaleZoom(w0 / w(s), startZoom), + {flyTo: true}); + + } else { + this + ._move(targetCenter, targetZoom) + ._moveEnd(true); + } + } + + this._moveStart(true, options.noMoveStart); + + frame.call(this); + return this; + }, + + // @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto), + // but takes a bounds parameter like [`fitBounds`](#map-fitbounds). + flyToBounds: function (bounds, options) { + var target = this._getBoundsCenterZoom(bounds, options); + return this.flyTo(target.center, target.zoom, options); + }, + + // @method setMaxBounds(bounds: LatLngBounds): this + // Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option). + setMaxBounds: function (bounds) { + bounds = toLatLngBounds(bounds); + + if (!bounds.isValid()) { + this.options.maxBounds = null; + return this.off('moveend', this._panInsideMaxBounds); + } else if (this.options.maxBounds) { + this.off('moveend', this._panInsideMaxBounds); + } + + this.options.maxBounds = bounds; + + if (this._loaded) { + this._panInsideMaxBounds(); + } + + return this.on('moveend', this._panInsideMaxBounds); + }, + + // @method setMinZoom(zoom: Number): this + // Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option). + setMinZoom: function (zoom) { + var oldZoom = this.options.minZoom; + this.options.minZoom = zoom; + + if (this._loaded && oldZoom !== zoom) { + this.fire('zoomlevelschange'); + + if (this.getZoom() < this.options.minZoom) { + return this.setZoom(zoom); + } + } + + return this; + }, + + // @method setMaxZoom(zoom: Number): this + // Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option). + setMaxZoom: function (zoom) { + var oldZoom = this.options.maxZoom; + this.options.maxZoom = zoom; + + if (this._loaded && oldZoom !== zoom) { + this.fire('zoomlevelschange'); + + if (this.getZoom() > this.options.maxZoom) { + return this.setZoom(zoom); + } + } + + return this; + }, + + // @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this + // Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. + panInsideBounds: function (bounds, options) { + this._enforcingBounds = true; + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, toLatLngBounds(bounds)); + + if (!center.equals(newCenter)) { + this.panTo(newCenter, options); + } + + this._enforcingBounds = false; + return this; + }, + + // @method panInside(latlng: LatLng, options?: options): this + // Pans the map the minimum amount to make the `latlng` visible. Use + // `padding`, `paddingTopLeft` and `paddingBottomRight` options to fit + // the display to more restricted bounds, like [`fitBounds`](#map-fitbounds). + // If `latlng` is already within the (optionally padded) display bounds, + // the map will not be panned. + panInside: function (latlng, options) { + options = options || {}; + + var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]), + pixelCenter = this.project(this.getCenter()), + pixelPoint = this.project(latlng), + pixelBounds = this.getPixelBounds(), + paddedBounds = toBounds([pixelBounds.min.add(paddingTL), pixelBounds.max.subtract(paddingBR)]), + paddedSize = paddedBounds.getSize(); + + if (!paddedBounds.contains(pixelPoint)) { + this._enforcingBounds = true; + var centerOffset = pixelPoint.subtract(paddedBounds.getCenter()); + var offset = paddedBounds.extend(pixelPoint).getSize().subtract(paddedSize); + pixelCenter.x += centerOffset.x < 0 ? -offset.x : offset.x; + pixelCenter.y += centerOffset.y < 0 ? -offset.y : offset.y; + this.panTo(this.unproject(pixelCenter), options); + this._enforcingBounds = false; + } + return this; + }, + + // @method invalidateSize(options: Zoom/pan options): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. If `options.pan` is `false`, panning will not occur. + // If `options.debounceMoveend` is `true`, it will delay `moveend` event so + // that it doesn't happen often even if the method is called many + // times in a row. + + // @alternative + // @method invalidateSize(animate: Boolean): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. + invalidateSize: function (options) { + if (!this._loaded) { return this; } + + options = extend({ + animate: false, + pan: true + }, options === true ? {animate: true} : options); + + var oldSize = this.getSize(); + this._sizeChanged = true; + this._lastCenter = null; + + var newSize = this.getSize(), + oldCenter = oldSize.divideBy(2).round(), + newCenter = newSize.divideBy(2).round(), + offset = oldCenter.subtract(newCenter); + + if (!offset.x && !offset.y) { return this; } + + if (options.animate && options.pan) { + this.panBy(offset); + + } else { + if (options.pan) { + this._rawPanBy(offset); + } + + this.fire('move'); + + if (options.debounceMoveend) { + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(bind(this.fire, this, 'moveend'), 200); + } else { + this.fire('moveend'); + } + } + + // @section Map state change events + // @event resize: ResizeEvent + // Fired when the map is resized. + return this.fire('resize', { + oldSize: oldSize, + newSize: newSize + }); + }, + + // @section Methods for modifying map state + // @method stop(): this + // Stops the currently running `panTo` or `flyTo` animation, if any. + stop: function () { + this.setZoom(this._limitZoom(this._zoom)); + if (!this.options.zoomSnap) { + this.fire('viewreset'); + } + return this._stop(); + }, + + // @section Geolocation methods + // @method locate(options?: Locate options): this + // Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound) + // event with location data on success or a [`locationerror`](#map-locationerror) event on failure, + // and optionally sets the map view to the user's location with respect to + // detection accuracy (or to the world view if geolocation failed). + // Note that, if your page doesn't use HTTPS, this method will fail in + // modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins)) + // See `Locate options` for more details. + locate: function (options) { + + options = this._locateOptions = extend({ + timeout: 10000, + watch: false + // setView: false + // maxZoom: + // maximumAge: 0 + // enableHighAccuracy: false + }, options); + + if (!('geolocation' in navigator)) { + this._handleGeolocationError({ + code: 0, + message: 'Geolocation not supported.' + }); + return this; + } + + var onResponse = bind(this._handleGeolocationResponse, this), + onError = bind(this._handleGeolocationError, this); + + if (options.watch) { + this._locationWatchId = + navigator.geolocation.watchPosition(onResponse, onError, options); + } else { + navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } + return this; + }, + + // @method stopLocate(): this + // Stops watching location previously initiated by `map.locate({watch: true})` + // and aborts resetting the map view if map.locate was called with + // `{setView: true}`. + stopLocate: function () { + if (navigator.geolocation && navigator.geolocation.clearWatch) { + navigator.geolocation.clearWatch(this._locationWatchId); + } + if (this._locateOptions) { + this._locateOptions.setView = false; + } + return this; + }, + + _handleGeolocationError: function (error) { + var c = error.code, + message = error.message || + (c === 1 ? 'permission denied' : + (c === 2 ? 'position unavailable' : 'timeout')); + + if (this._locateOptions.setView && !this._loaded) { + this.fitWorld(); + } + + // @section Location events + // @event locationerror: ErrorEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) failed. + this.fire('locationerror', { + code: c, + message: 'Geolocation error: ' + message + '.' + }); + }, + + _handleGeolocationResponse: function (pos) { + var lat = pos.coords.latitude, + lng = pos.coords.longitude, + latlng = new LatLng(lat, lng), + bounds = latlng.toBounds(pos.coords.accuracy * 2), + options = this._locateOptions; + + if (options.setView) { + var zoom = this.getBoundsZoom(bounds); + this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom); + } + + var data = { + latlng: latlng, + bounds: bounds, + timestamp: pos.timestamp + }; + + for (var i in pos.coords) { + if (typeof pos.coords[i] === 'number') { + data[i] = pos.coords[i]; + } + } + + // @event locationfound: LocationEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) + // went successfully. + this.fire('locationfound', data); + }, + + // TODO Appropriate docs section? + // @section Other Methods + // @method addHandler(name: String, HandlerClass: Function): this + // Adds a new `Handler` to the map, given its name and constructor function. + addHandler: function (name, HandlerClass) { + if (!HandlerClass) { return this; } + + var handler = this[name] = new HandlerClass(this); + + this._handlers.push(handler); + + if (this.options[name]) { + handler.enable(); + } + + return this; + }, + + // @method remove(): this + // Destroys the map and clears all related event listeners. + remove: function () { + + this._initEvents(true); + this.off('moveend', this._panInsideMaxBounds); + + if (this._containerId !== this._container._leaflet_id) { + throw new Error('Map container is being reused by another instance'); + } + + try { + // throws error in IE6-8 + delete this._container._leaflet_id; + delete this._containerId; + } catch (e) { + /*eslint-disable */ + this._container._leaflet_id = undefined; + /* eslint-enable */ + this._containerId = undefined; + } + + if (this._locationWatchId !== undefined) { + this.stopLocate(); + } + + this._stop(); + + remove(this._mapPane); + + if (this._clearControlPos) { + this._clearControlPos(); + } + if (this._resizeRequest) { + cancelAnimFrame(this._resizeRequest); + this._resizeRequest = null; + } + + this._clearHandlers(); + + if (this._loaded) { + // @section Map state change events + // @event unload: Event + // Fired when the map is destroyed with [remove](#map-remove) method. + this.fire('unload'); + } + + var i; + for (i in this._layers) { + this._layers[i].remove(); + } + for (i in this._panes) { + remove(this._panes[i]); + } + + this._layers = []; + this._panes = []; + delete this._mapPane; + delete this._renderer; + + return this; + }, + + // @section Other Methods + // @method createPane(name: String, container?: HTMLElement): HTMLElement + // Creates a new [map pane](#map-pane) with the given name if it doesn't exist already, + // then returns it. The pane is created as a child of `container`, or + // as a child of the main map pane if not set. + createPane: function (name, container) { + var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''), + pane = create$1('div', className, container || this._mapPane); + + if (name) { + this._panes[name] = pane; + } + return pane; + }, + + // @section Methods for Getting Map State + + // @method getCenter(): LatLng + // Returns the geographical center of the map view + getCenter: function () { + this._checkIfLoaded(); + + if (this._lastCenter && !this._moved()) { + return this._lastCenter; + } + return this.layerPointToLatLng(this._getCenterLayerPoint()); + }, + + // @method getZoom(): Number + // Returns the current zoom level of the map view + getZoom: function () { + return this._zoom; + }, + + // @method getBounds(): LatLngBounds + // Returns the geographical bounds visible in the current map view + getBounds: function () { + var bounds = this.getPixelBounds(), + sw = this.unproject(bounds.getBottomLeft()), + ne = this.unproject(bounds.getTopRight()); + + return new LatLngBounds(sw, ne); + }, + + // @method getMinZoom(): Number + // Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default. + getMinZoom: function () { + return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom; + }, + + // @method getMaxZoom(): Number + // Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers). + getMaxZoom: function () { + return this.options.maxZoom === undefined ? + (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : + this.options.maxZoom; + }, + + // @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean, padding?: Point): Number + // Returns the maximum zoom level on which the given bounds fit to the map + // view in its entirety. If `inside` (optional) is set to `true`, the method + // instead returns the minimum zoom level on which the map view fits into + // the given bounds in its entirety. + getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number + bounds = toLatLngBounds(bounds); + padding = toPoint(padding || [0, 0]); + + var zoom = this.getZoom() || 0, + min = this.getMinZoom(), + max = this.getMaxZoom(), + nw = bounds.getNorthWest(), + se = bounds.getSouthEast(), + size = this.getSize().subtract(padding), + boundsSize = toBounds(this.project(se, zoom), this.project(nw, zoom)).getSize(), + snap = any3d ? this.options.zoomSnap : 1, + scalex = size.x / boundsSize.x, + scaley = size.y / boundsSize.y, + scale = inside ? Math.max(scalex, scaley) : Math.min(scalex, scaley); + + zoom = this.getScaleZoom(scale, zoom); + + if (snap) { + zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; + } + + return Math.max(min, Math.min(max, zoom)); + }, + + // @method getSize(): Point + // Returns the current size of the map container (in pixels). + getSize: function () { + if (!this._size || this._sizeChanged) { + this._size = new Point( + this._container.clientWidth || 0, + this._container.clientHeight || 0); + + this._sizeChanged = false; + } + return this._size.clone(); + }, + + // @method getPixelBounds(): Bounds + // Returns the bounds of the current map view in projected pixel + // coordinates (sometimes useful in layer and overlay implementations). + getPixelBounds: function (center, zoom) { + var topLeftPoint = this._getTopLeftPoint(center, zoom); + return new Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); + }, + + // TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to + // the map pane? "left point of the map layer" can be confusing, specially + // since there can be negative offsets. + // @method getPixelOrigin(): Point + // Returns the projected pixel coordinates of the top left point of + // the map layer (useful in custom layer and overlay implementations). + getPixelOrigin: function () { + this._checkIfLoaded(); + return this._pixelOrigin; + }, + + // @method getPixelWorldBounds(zoom?: Number): Bounds + // Returns the world's bounds in pixel coordinates for zoom level `zoom`. + // If `zoom` is omitted, the map's current zoom level is used. + getPixelWorldBounds: function (zoom) { + return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom); + }, + + // @section Other Methods + + // @method getPane(pane: String|HTMLElement): HTMLElement + // Returns a [map pane](#map-pane), given its name or its HTML element (its identity). + getPane: function (pane) { + return typeof pane === 'string' ? this._panes[pane] : pane; + }, + + // @method getPanes(): Object + // Returns a plain object containing the names of all [panes](#map-pane) as keys and + // the panes as values. + getPanes: function () { + return this._panes; + }, + + // @method getContainer: HTMLElement + // Returns the HTML element that contains the map. + getContainer: function () { + return this._container; + }, + + + // @section Conversion Methods + + // @method getZoomScale(toZoom: Number, fromZoom: Number): Number + // Returns the scale factor to be applied to a map transition from zoom level + // `fromZoom` to `toZoom`. Used internally to help with zoom animations. + getZoomScale: function (toZoom, fromZoom) { + // TODO replace with universal implementation after refactoring projections + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + return crs.scale(toZoom) / crs.scale(fromZoom); + }, + + // @method getScaleZoom(scale: Number, fromZoom: Number): Number + // Returns the zoom level that the map would end up at, if it is at `fromZoom` + // level and everything is scaled by a factor of `scale`. Inverse of + // [`getZoomScale`](#map-getZoomScale). + getScaleZoom: function (scale, fromZoom) { + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + var zoom = crs.zoom(scale * crs.scale(fromZoom)); + return isNaN(zoom) ? Infinity : zoom; + }, + + // @method project(latlng: LatLng, zoom: Number): Point + // Projects a geographical coordinate `LatLng` according to the projection + // of the map's CRS, then scales it according to `zoom` and the CRS's + // `Transformation`. The result is pixel coordinate relative to + // the CRS origin. + project: function (latlng, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.latLngToPoint(toLatLng(latlng), zoom); + }, + + // @method unproject(point: Point, zoom: Number): LatLng + // Inverse of [`project`](#map-project). + unproject: function (point, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.pointToLatLng(toPoint(point), zoom); + }, + + // @method layerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding geographical coordinate (for the current zoom level). + layerPointToLatLng: function (point) { + var projectedPoint = toPoint(point).add(this.getPixelOrigin()); + return this.unproject(projectedPoint); + }, + + // @method latLngToLayerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the [origin pixel](#map-getpixelorigin). + latLngToLayerPoint: function (latlng) { + var projectedPoint = this.project(toLatLng(latlng))._round(); + return projectedPoint._subtract(this.getPixelOrigin()); + }, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where `lat` and `lng` has been wrapped according to the + // map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the + // CRS's bounds. + // By default this means longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees. + wrapLatLng: function (latlng) { + return this.options.crs.wrapLatLng(toLatLng(latlng)); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring that + // its center is within the CRS's bounds. + // By default this means the center longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees, and the majority of the bounds + // overlaps the CRS's bounds. + wrapLatLngBounds: function (latlng) { + return this.options.crs.wrapLatLngBounds(toLatLngBounds(latlng)); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates according to + // the map's CRS. By default this measures distance in meters. + distance: function (latlng1, latlng2) { + return this.options.crs.distance(toLatLng(latlng1), toLatLng(latlng2)); + }, + + // @method containerPointToLayerPoint(point: Point): Point + // Given a pixel coordinate relative to the map container, returns the corresponding + // pixel coordinate relative to the [origin pixel](#map-getpixelorigin). + containerPointToLayerPoint: function (point) { // (Point) + return toPoint(point).subtract(this._getMapPanePos()); + }, + + // @method layerPointToContainerPoint(point: Point): Point + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding pixel coordinate relative to the map container. + layerPointToContainerPoint: function (point) { // (Point) + return toPoint(point).add(this._getMapPanePos()); + }, + + // @method containerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the map container, returns + // the corresponding geographical coordinate (for the current zoom level). + containerPointToLatLng: function (point) { + var layerPoint = this.containerPointToLayerPoint(toPoint(point)); + return this.layerPointToLatLng(layerPoint); + }, + + // @method latLngToContainerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the map container. + latLngToContainerPoint: function (latlng) { + return this.layerPointToContainerPoint(this.latLngToLayerPoint(toLatLng(latlng))); + }, + + // @method mouseEventToContainerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to the + // map container where the event took place. + mouseEventToContainerPoint: function (e) { + return getMousePosition(e, this._container); + }, + + // @method mouseEventToLayerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to + // the [origin pixel](#map-getpixelorigin) where the event took place. + mouseEventToLayerPoint: function (e) { + return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); + }, + + // @method mouseEventToLatLng(ev: MouseEvent): LatLng + // Given a MouseEvent object, returns geographical coordinate where the + // event took place. + mouseEventToLatLng: function (e) { // (MouseEvent) + return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); + }, + + + // map initialization methods + + _initContainer: function (id) { + var container = this._container = get(id); + + if (!container) { + throw new Error('Map container not found.'); + } else if (container._leaflet_id) { + throw new Error('Map container is already initialized.'); + } + + on(container, 'scroll', this._onScroll, this); + this._containerId = stamp(container); + }, + + _initLayout: function () { + var container = this._container; + + this._fadeAnimated = this.options.fadeAnimation && any3d; + + addClass(container, 'leaflet-container' + + (touch ? ' leaflet-touch' : '') + + (retina ? ' leaflet-retina' : '') + + (ielt9 ? ' leaflet-oldie' : '') + + (safari ? ' leaflet-safari' : '') + + (this._fadeAnimated ? ' leaflet-fade-anim' : '')); + + var position = getStyle(container, 'position'); + + if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { + container.style.position = 'relative'; + } + + this._initPanes(); + + if (this._initControlPos) { + this._initControlPos(); + } + }, + + _initPanes: function () { + var panes = this._panes = {}; + this._paneRenderers = {}; + + // @section + // + // Panes are DOM elements used to control the ordering of layers on the map. You + // can access panes with [`map.getPane`](#map-getpane) or + // [`map.getPanes`](#map-getpanes) methods. New panes can be created with the + // [`map.createPane`](#map-createpane) method. + // + // Every map has the following default panes that differ only in zIndex. + // + // @pane mapPane: HTMLElement = 'auto' + // Pane that contains all other map panes + + this._mapPane = this.createPane('mapPane', this._container); + setPosition(this._mapPane, new Point(0, 0)); + + // @pane tilePane: HTMLElement = 200 + // Pane for `GridLayer`s and `TileLayer`s + this.createPane('tilePane'); + // @pane overlayPane: HTMLElement = 400 + // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s + this.createPane('overlayPane'); + // @pane shadowPane: HTMLElement = 500 + // Pane for overlay shadows (e.g. `Marker` shadows) + this.createPane('shadowPane'); + // @pane markerPane: HTMLElement = 600 + // Pane for `Icon`s of `Marker`s + this.createPane('markerPane'); + // @pane tooltipPane: HTMLElement = 650 + // Pane for `Tooltip`s. + this.createPane('tooltipPane'); + // @pane popupPane: HTMLElement = 700 + // Pane for `Popup`s. + this.createPane('popupPane'); + + if (!this.options.markerZoomAnimation) { + addClass(panes.markerPane, 'leaflet-zoom-hide'); + addClass(panes.shadowPane, 'leaflet-zoom-hide'); + } + }, + + + // private methods that modify map state + + // @section Map state change events + _resetView: function (center, zoom) { + setPosition(this._mapPane, new Point(0, 0)); + + var loading = !this._loaded; + this._loaded = true; + zoom = this._limitZoom(zoom); + + this.fire('viewprereset'); + + var zoomChanged = this._zoom !== zoom; + this + ._moveStart(zoomChanged, false) + ._move(center, zoom) + ._moveEnd(zoomChanged); + + // @event viewreset: Event + // Fired when the map needs to redraw its content (this usually happens + // on map zoom or load). Very useful for creating custom overlays. + this.fire('viewreset'); + + // @event load: Event + // Fired when the map is initialized (when its center and zoom are set + // for the first time). + if (loading) { + this.fire('load'); + } + }, + + _moveStart: function (zoomChanged, noMoveStart) { + // @event zoomstart: Event + // Fired when the map zoom is about to change (e.g. before zoom animation). + // @event movestart: Event + // Fired when the view of the map starts changing (e.g. user starts dragging the map). + if (zoomChanged) { + this.fire('zoomstart'); + } + if (!noMoveStart) { + this.fire('movestart'); + } + return this; + }, + + _move: function (center, zoom, data) { + if (zoom === undefined) { + zoom = this._zoom; + } + var zoomChanged = this._zoom !== zoom; + + this._zoom = zoom; + this._lastCenter = center; + this._pixelOrigin = this._getNewPixelOrigin(center); + + // @event zoom: Event + // Fired repeatedly during any change in zoom level, including zoom + // and fly animations. + if (zoomChanged || (data && data.pinch)) { // Always fire 'zoom' if pinching because #3530 + this.fire('zoom', data); + } + + // @event move: Event + // Fired repeatedly during any movement of the map, including pan and + // fly animations. + return this.fire('move', data); + }, + + _moveEnd: function (zoomChanged) { + // @event zoomend: Event + // Fired when the map has changed, after any animations. + if (zoomChanged) { + this.fire('zoomend'); + } + + // @event moveend: Event + // Fired when the center of the map stops changing (e.g. user stopped + // dragging the map). + return this.fire('moveend'); + }, + + _stop: function () { + cancelAnimFrame(this._flyToFrame); + if (this._panAnim) { + this._panAnim.stop(); + } + return this; + }, + + _rawPanBy: function (offset) { + setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); + }, + + _getZoomSpan: function () { + return this.getMaxZoom() - this.getMinZoom(); + }, + + _panInsideMaxBounds: function () { + if (!this._enforcingBounds) { + this.panInsideBounds(this.options.maxBounds); + } + }, + + _checkIfLoaded: function () { + if (!this._loaded) { + throw new Error('Set map center and zoom first.'); + } + }, + + // DOM event handling + + // @section Interaction events + _initEvents: function (remove$$1) { + this._targets = {}; + this._targets[stamp(this._container)] = this; + + var onOff = remove$$1 ? off : on; + + // @event click: MouseEvent + // Fired when the user clicks (or taps) the map. + // @event dblclick: MouseEvent + // Fired when the user double-clicks (or double-taps) the map. + // @event mousedown: MouseEvent + // Fired when the user pushes the mouse button on the map. + // @event mouseup: MouseEvent + // Fired when the user releases the mouse button on the map. + // @event mouseover: MouseEvent + // Fired when the mouse enters the map. + // @event mouseout: MouseEvent + // Fired when the mouse leaves the map. + // @event mousemove: MouseEvent + // Fired while the mouse moves over the map. + // @event contextmenu: MouseEvent + // Fired when the user pushes the right mouse button on the map, prevents + // default browser context menu from showing if there are listeners on + // this event. Also fired on mobile when the user holds a single touch + // for a second (also called long press). + // @event keypress: KeyboardEvent + // Fired when the user presses a key from the keyboard that produces a character value while the map is focused. + // @event keydown: KeyboardEvent + // Fired when the user presses a key from the keyboard while the map is focused. Unlike the `keypress` event, + // the `keydown` event is fired for keys that produce a character value and for keys + // that do not produce a character value. + // @event keyup: KeyboardEvent + // Fired when the user releases a key from the keyboard while the map is focused. + onOff(this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress keydown keyup', this._handleDOMEvent, this); + + if (this.options.trackResize) { + onOff(window, 'resize', this._onResize, this); + } + + if (any3d && this.options.transform3DLimit) { + (remove$$1 ? this.off : this.on).call(this, 'moveend', this._onMoveEnd); + } + }, + + _onResize: function () { + cancelAnimFrame(this._resizeRequest); + this._resizeRequest = requestAnimFrame( + function () { this.invalidateSize({debounceMoveend: true}); }, this); + }, + + _onScroll: function () { + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + }, + + _onMoveEnd: function () { + var pos = this._getMapPanePos(); + if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have + // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + this._resetView(this.getCenter(), this.getZoom()); + } + }, + + _findEventTargets: function (e, type) { + var targets = [], + target, + isHover = type === 'mouseout' || type === 'mouseover', + src = e.target || e.srcElement, + dragging = false; + + while (src) { + target = this._targets[stamp(src)]; + if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + // Prevent firing click after you just dragged an object. + dragging = true; + break; + } + if (target && target.listens(type, true)) { + if (isHover && !isExternalTarget(src, e)) { break; } + targets.push(target); + if (isHover) { break; } + } + if (src === this._container) { break; } + src = src.parentNode; + } + if (!targets.length && !dragging && !isHover && isExternalTarget(src, e)) { + targets = [this]; + } + return targets; + }, + + _handleDOMEvent: function (e) { + if (!this._loaded || skipped(e)) { return; } + + var type = e.type; + + if (type === 'mousedown') { + // prevents outline when clicking on keyboard-focusable element + preventOutline(e.target || e.srcElement); + } + + this._fireDOMEvent(e, type); + }, + + _mouseEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'], + + _fireDOMEvent: function (e, type, targets) { + + if (e.type === 'click') { + // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). + // @event preclick: MouseEvent + // Fired before mouse click on the map (sometimes useful when you + // want something to happen on click before any existing click + // handlers start running). + var synth = extend({}, e); + synth.type = 'preclick'; + this._fireDOMEvent(synth, synth.type, targets); + } + + if (e._stopped) { return; } + + // Find the layer the event is propagating from and its parents. + targets = (targets || []).concat(this._findEventTargets(e, type)); + + if (!targets.length) { return; } + + var target = targets[0]; + if (type === 'contextmenu' && target.listens(type, true)) { + preventDefault(e); + } + + var data = { + originalEvent: e + }; + + if (e.type !== 'keypress' && e.type !== 'keydown' && e.type !== 'keyup') { + var isMarker = target.getLatLng && (!target._radius || target._radius <= 10); + data.containerPoint = isMarker ? + this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint); + } + + for (var i = 0; i < targets.length; i++) { + targets[i].fire(type, data, true); + if (data.originalEvent._stopped || + (targets[i].options.bubblingMouseEvents === false && indexOf(this._mouseEvents, type) !== -1)) { return; } + } + }, + + _draggableMoved: function (obj) { + obj = obj.dragging && obj.dragging.enabled() ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); + }, + + _clearHandlers: function () { + for (var i = 0, len = this._handlers.length; i < len; i++) { + this._handlers[i].disable(); + } + }, + + // @section Other Methods + + // @method whenReady(fn: Function, context?: Object): this + // Runs the given function `fn` when the map gets initialized with + // a view (center and zoom) and at least one layer, or immediately + // if it's already initialized, optionally passing a function context. + whenReady: function (callback, context) { + if (this._loaded) { + callback.call(context || this, {target: this}); + } else { + this.on('load', callback, context); + } + return this; + }, + + + // private methods for getting map state + + _getMapPanePos: function () { + return getPosition(this._mapPane) || new Point(0, 0); + }, + + _moved: function () { + var pos = this._getMapPanePos(); + return pos && !pos.equals([0, 0]); + }, + + _getTopLeftPoint: function (center, zoom) { + var pixelOrigin = center && zoom !== undefined ? + this._getNewPixelOrigin(center, zoom) : + this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); + }, + + _getNewPixelOrigin: function (center, zoom) { + var viewHalf = this.getSize()._divideBy(2); + return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); + }, + + _latLngToNewLayerPoint: function (latlng, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return this.project(latlng, zoom)._subtract(topLeft); + }, + + _latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return toBounds([ + this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft) + ]); + }, + + // layer point of the current center + _getCenterLayerPoint: function () { + return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); + }, + + // offset of the specified place to the current center in pixels + _getCenterOffset: function (latlng) { + return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); + }, + + // adjust center for view to get inside bounds + _limitCenter: function (center, zoom, bounds) { + + if (!bounds) { return center; } + + var centerPoint = this.project(center, zoom), + viewHalf = this.getSize().divideBy(2), + viewBounds = new Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), + offset = this._getBoundsOffset(viewBounds, bounds, zoom); + + // If offset is less than a pixel, ignore. + // This prevents unstable projections from getting into + // an infinite loop of tiny offsets. + if (offset.round().equals([0, 0])) { + return center; + } + + return this.unproject(centerPoint.add(offset), zoom); + }, + + // adjust offset for view to get inside bounds + _limitOffset: function (offset, bounds) { + if (!bounds) { return offset; } + + var viewBounds = this.getPixelBounds(), + newBounds = new Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); + + return offset.add(this._getBoundsOffset(newBounds, bounds)); + }, + + // returns offset needed for pxBounds to get inside maxBounds at a specified zoom + _getBoundsOffset: function (pxBounds, maxBounds, zoom) { + var projectedMaxBounds = toBounds( + this.project(maxBounds.getNorthEast(), zoom), + this.project(maxBounds.getSouthWest(), zoom) + ), + minOffset = projectedMaxBounds.min.subtract(pxBounds.min), + maxOffset = projectedMaxBounds.max.subtract(pxBounds.max), + + dx = this._rebound(minOffset.x, -maxOffset.x), + dy = this._rebound(minOffset.y, -maxOffset.y); + + return new Point(dx, dy); + }, + + _rebound: function (left, right) { + return left + right > 0 ? + Math.round(left - right) / 2 : + Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); + }, + + _limitZoom: function (zoom) { + var min = this.getMinZoom(), + max = this.getMaxZoom(), + snap = any3d ? this.options.zoomSnap : 1; + if (snap) { + zoom = Math.round(zoom / snap) * snap; + } + return Math.max(min, Math.min(max, zoom)); + }, + + _onPanTransitionStep: function () { + this.fire('move'); + }, + + _onPanTransitionEnd: function () { + removeClass(this._mapPane, 'leaflet-pan-anim'); + this.fire('moveend'); + }, + + _tryAnimatedPan: function (center, options) { + // difference between the new and current centers in pixels + var offset = this._getCenterOffset(center)._trunc(); + + // don't animate too far unless animate: true specified in options + if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + + this.panBy(offset, options); + + return true; + }, + + _createAnimProxy: function () { + + var proxy = this._proxy = create$1('div', 'leaflet-proxy leaflet-zoom-animated'); + this._panes.mapPane.appendChild(proxy); + + this.on('zoomanim', function (e) { + var prop = TRANSFORM, + transform = this._proxy.style[prop]; + + setTransform(this._proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); + + // workaround for case when transform is the same and so transitionend event is not fired + if (transform === this._proxy.style[prop] && this._animatingZoom) { + this._onZoomTransitionEnd(); + } + }, this); + + this.on('load moveend', this._animMoveEnd, this); + + this._on('unload', this._destroyAnimProxy, this); + }, + + _destroyAnimProxy: function () { + remove(this._proxy); + this.off('load moveend', this._animMoveEnd, this); + delete this._proxy; + }, + + _animMoveEnd: function () { + var c = this.getCenter(), + z = this.getZoom(); + setTransform(this._proxy, this.project(c, z), this.getZoomScale(z, 1)); + }, + + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { + this._onZoomTransitionEnd(); + } + }, + + _nothingToAnimate: function () { + return !this._container.getElementsByClassName('leaflet-zoom-animated').length; + }, + + _tryAnimatedZoom: function (center, zoom, options) { + + if (this._animatingZoom) { return true; } + + options = options || {}; + + // don't animate if disabled, not supported or zoom difference is too large + if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || + Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } + + // offset is the pixel coords of the zoom origin relative to the current center + var scale = this.getZoomScale(zoom), + offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale); + + // don't animate if the zoom origin isn't within one screen from the current center, unless forced + if (options.animate !== true && !this.getSize().contains(offset)) { return false; } + + requestAnimFrame(function () { + this + ._moveStart(true, false) + ._animateZoom(center, zoom, true); + }, this); + + return true; + }, + + _animateZoom: function (center, zoom, startAnim, noUpdate) { + if (!this._mapPane) { return; } + + if (startAnim) { + this._animatingZoom = true; + + // remember what center/zoom to set after animation + this._animateToCenter = center; + this._animateToZoom = zoom; + + addClass(this._mapPane, 'leaflet-zoom-anim'); + } + + // @section Other Events + // @event zoomanim: ZoomAnimEvent + // Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom. + this.fire('zoomanim', { + center: center, + zoom: zoom, + noUpdate: noUpdate + }); + + // Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693 + setTimeout(bind(this._onZoomTransitionEnd, this), 250); + }, + + _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } + + if (this._mapPane) { + removeClass(this._mapPane, 'leaflet-zoom-anim'); + } + + this._animatingZoom = false; + + this._move(this._animateToCenter, this._animateToZoom); + + // This anim frame should prevent an obscure iOS webkit tile loading race condition. + requestAnimFrame(function () { + this._moveEnd(true); + }, this); + } +}); + +// @section + +// @factory L.map(id: String, options?: Map options) +// Instantiates a map object given the DOM ID of a `
` element +// and optionally an object literal with `Map options`. +// +// @alternative +// @factory L.map(el: HTMLElement, options?: Map options) +// Instantiates a map object given an instance of a `
` HTML element +// and optionally an object literal with `Map options`. +function createMap(id, options) { + return new Map(id, options); +} + +/* + * @class Control + * @aka L.Control + * @inherits Class + * + * L.Control is a base class for implementing map controls. Handles positioning. + * All other controls extend from this class. + */ + +var Control = Class.extend({ + // @section + // @aka Control options + options: { + // @option position: String = 'topright' + // The position of the control (one of the map corners). Possible values are `'topleft'`, + // `'topright'`, `'bottomleft'` or `'bottomright'` + position: 'topright' + }, + + initialize: function (options) { + setOptions(this, options); + }, + + /* @section + * Classes extending L.Control will inherit the following methods: + * + * @method getPosition: string + * Returns the position of the control. + */ + getPosition: function () { + return this.options.position; + }, + + // @method setPosition(position: string): this + // Sets the position of the control. + setPosition: function (position) { + var map = this._map; + + if (map) { + map.removeControl(this); + } + + this.options.position = position; + + if (map) { + map.addControl(this); + } + + return this; + }, + + // @method getContainer: HTMLElement + // Returns the HTMLElement that contains the control. + getContainer: function () { + return this._container; + }, + + // @method addTo(map: Map): this + // Adds the control to the given map. + addTo: function (map) { + this.remove(); + this._map = map; + + var container = this._container = this.onAdd(map), + pos = this.getPosition(), + corner = map._controlCorners[pos]; + + addClass(container, 'leaflet-control'); + + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + + this._map.on('unload', this.remove, this); + + return this; + }, + + // @method remove: this + // Removes the control from the map it is currently active on. + remove: function () { + if (!this._map) { + return this; + } + + remove(this._container); + + if (this.onRemove) { + this.onRemove(this._map); + } + + this._map.off('unload', this.remove, this); + this._map = null; + + return this; + }, + + _refocusOnMap: function (e) { + // if map exists and event is not a keyboard event + if (this._map && e && e.screenX > 0 && e.screenY > 0) { + this._map.getContainer().focus(); + } + } +}); + +var control = function (options) { + return new Control(options); +}; + +/* @section Extension methods + * @uninheritable + * + * Every control should extend from `L.Control` and (re-)implement the following methods. + * + * @method onAdd(map: Map): HTMLElement + * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo). + * + * @method onRemove(map: Map) + * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove). + */ + +/* @namespace Map + * @section Methods for Layers and Controls + */ +Map.include({ + // @method addControl(control: Control): this + // Adds the given control to the map + addControl: function (control) { + control.addTo(this); + return this; + }, + + // @method removeControl(control: Control): this + // Removes the given control from the map + removeControl: function (control) { + control.remove(); + return this; + }, + + _initControlPos: function () { + var corners = this._controlCorners = {}, + l = 'leaflet-', + container = this._controlContainer = + create$1('div', l + 'control-container', this._container); + + function createCorner(vSide, hSide) { + var className = l + vSide + ' ' + l + hSide; + + corners[vSide + hSide] = create$1('div', className, container); + } + + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); + }, + + _clearControlPos: function () { + for (var i in this._controlCorners) { + remove(this._controlCorners[i]); + } + remove(this._controlContainer); + delete this._controlCorners; + delete this._controlContainer; + } +}); + +/* + * @class Control.Layers + * @aka L.Control.Layers + * @inherits Control + * + * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control/)). Extends `Control`. + * + * @example + * + * ```js + * var baseLayers = { + * "Mapbox": mapbox, + * "OpenStreetMap": osm + * }; + * + * var overlays = { + * "Marker": marker, + * "Roads": roadsLayer + * }; + * + * L.control.layers(baseLayers, overlays).addTo(map); + * ``` + * + * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values: + * + * ```js + * { + * "": layer1, + * "": layer2 + * } + * ``` + * + * The layer names can contain HTML, which allows you to add additional styling to the items: + * + * ```js + * {" My Layer": myLayer} + * ``` + */ + +var Layers = Control.extend({ + // @section + // @aka Control.Layers options + options: { + // @option collapsed: Boolean = true + // If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch. + collapsed: true, + position: 'topright', + + // @option autoZIndex: Boolean = true + // If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + autoZIndex: true, + + // @option hideSingleBase: Boolean = false + // If `true`, the base layers in the control will be hidden when there is only one. + hideSingleBase: false, + + // @option sortLayers: Boolean = false + // Whether to sort the layers. When `false`, layers will keep the order + // in which they were added to the control. + sortLayers: false, + + // @option sortFunction: Function = * + // A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + // that will be used for sorting the layers, when `sortLayers` is `true`. + // The function receives both the `L.Layer` instances and their names, as in + // `sortFunction(layerA, layerB, nameA, nameB)`. + // By default, it sorts layers alphabetically by their name. + sortFunction: function (layerA, layerB, nameA, nameB) { + return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0); + } + }, + + initialize: function (baseLayers, overlays, options) { + setOptions(this, options); + + this._layerControlInputs = []; + this._layers = []; + this._lastZIndex = 0; + this._handlingClick = false; + + for (var i in baseLayers) { + this._addLayer(baseLayers[i], i); + } + + for (i in overlays) { + this._addLayer(overlays[i], i, true); + } + }, + + onAdd: function (map) { + this._initLayout(); + this._update(); + + this._map = map; + map.on('zoomend', this._checkDisabledLayers, this); + + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.on('add remove', this._onLayerChange, this); + } + + return this._container; + }, + + addTo: function (map) { + Control.prototype.addTo.call(this, map); + // Trigger expand after Layers Control has been inserted into DOM so that is now has an actual height. + return this._expandIfNotCollapsed(); + }, + + onRemove: function () { + this._map.off('zoomend', this._checkDisabledLayers, this); + + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.off('add remove', this._onLayerChange, this); + } + }, + + // @method addBaseLayer(layer: Layer, name: String): this + // Adds a base layer (radio button entry) with the given name to the control. + addBaseLayer: function (layer, name) { + this._addLayer(layer, name); + return (this._map) ? this._update() : this; + }, + + // @method addOverlay(layer: Layer, name: String): this + // Adds an overlay (checkbox entry) with the given name to the control. + addOverlay: function (layer, name) { + this._addLayer(layer, name, true); + return (this._map) ? this._update() : this; + }, + + // @method removeLayer(layer: Layer): this + // Remove the given layer from the control. + removeLayer: function (layer) { + layer.off('add remove', this._onLayerChange, this); + + var obj = this._getLayer(stamp(layer)); + if (obj) { + this._layers.splice(this._layers.indexOf(obj), 1); + } + return (this._map) ? this._update() : this; + }, + + // @method expand(): this + // Expand the control container if collapsed. + expand: function () { + addClass(this._container, 'leaflet-control-layers-expanded'); + this._section.style.height = null; + var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50); + if (acceptableHeight < this._section.clientHeight) { + addClass(this._section, 'leaflet-control-layers-scrollbar'); + this._section.style.height = acceptableHeight + 'px'; + } else { + removeClass(this._section, 'leaflet-control-layers-scrollbar'); + } + this._checkDisabledLayers(); + return this; + }, + + // @method collapse(): this + // Collapse the control container if expanded. + collapse: function () { + removeClass(this._container, 'leaflet-control-layers-expanded'); + return this; + }, + + _initLayout: function () { + var className = 'leaflet-control-layers', + container = this._container = create$1('div', className), + collapsed = this.options.collapsed; + + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', true); + + disableClickPropagation(container); + disableScrollPropagation(container); + + var section = this._section = create$1('section', className + '-list'); + + if (collapsed) { + this._map.on('click', this.collapse, this); + + if (!android) { + on(container, { + mouseenter: this.expand, + mouseleave: this.collapse + }, this); + } + } + + var link = this._layersLink = create$1('a', className + '-toggle', container); + link.href = '#'; + link.title = 'Layers'; + + if (touch) { + on(link, 'click', stop); + on(link, 'click', this.expand, this); + } else { + on(link, 'focus', this.expand, this); + } + + if (!collapsed) { + this.expand(); + } + + this._baseLayersList = create$1('div', className + '-base', section); + this._separator = create$1('div', className + '-separator', section); + this._overlaysList = create$1('div', className + '-overlays', section); + + container.appendChild(section); + }, + + _getLayer: function (id) { + for (var i = 0; i < this._layers.length; i++) { + + if (this._layers[i] && stamp(this._layers[i].layer) === id) { + return this._layers[i]; + } + } + }, + + _addLayer: function (layer, name, overlay) { + if (this._map) { + layer.on('add remove', this._onLayerChange, this); + } + + this._layers.push({ + layer: layer, + name: name, + overlay: overlay + }); + + if (this.options.sortLayers) { + this._layers.sort(bind(function (a, b) { + return this.options.sortFunction(a.layer, b.layer, a.name, b.name); + }, this)); + } + + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); + } + + this._expandIfNotCollapsed(); + }, + + _update: function () { + if (!this._container) { return this; } + + empty(this._baseLayersList); + empty(this._overlaysList); + + this._layerControlInputs = []; + var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0; + + for (i = 0; i < this._layers.length; i++) { + obj = this._layers[i]; + this._addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + baseLayersCount += !obj.overlay ? 1 : 0; + } + + // Hide base layers section if there's only one layer. + if (this.options.hideSingleBase) { + baseLayersPresent = baseLayersPresent && baseLayersCount > 1; + this._baseLayersList.style.display = baseLayersPresent ? '' : 'none'; + } + + this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + + return this; + }, + + _onLayerChange: function (e) { + if (!this._handlingClick) { + this._update(); + } + + var obj = this._getLayer(stamp(e.target)); + + // @namespace Map + // @section Layer events + // @event baselayerchange: LayersControlEvent + // Fired when the base layer is changed through the [layers control](#control-layers). + // @event overlayadd: LayersControlEvent + // Fired when an overlay is selected through the [layers control](#control-layers). + // @event overlayremove: LayersControlEvent + // Fired when an overlay is deselected through the [layers control](#control-layers). + // @namespace Control.Layers + var type = obj.overlay ? + (e.type === 'add' ? 'overlayadd' : 'overlayremove') : + (e.type === 'add' ? 'baselayerchange' : null); + + if (type) { + this._map.fire(type, obj); + } + }, + + // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see https://stackoverflow.com/a/119079) + _createRadioElement: function (name, checked) { + + var radioHtml = ''; + + var radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; + + return radioFragment.firstChild; + }, + + _addItem: function (obj) { + var label = document.createElement('label'), + checked = this._map.hasLayer(obj.layer), + input; + + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers_' + stamp(this), checked); + } + + this._layerControlInputs.push(input); + input.layerId = stamp(obj.layer); + + on(input, 'click', this._onInputClick, this); + + var name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + // Helps from preventing layer control flicker when checkboxes are disabled + // https://github.com/Leaflet/Leaflet/issues/2771 + var holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); + + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + container.appendChild(label); + + this._checkDisabledLayers(); + return label; + }, + + _onInputClick: function () { + var inputs = this._layerControlInputs, + input, layer; + var addedLayers = [], + removedLayers = []; + + this._handlingClick = true; + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + + if (input.checked) { + addedLayers.push(layer); + } else if (!input.checked) { + removedLayers.push(layer); + } + } + + // Bugfix issue 2318: Should remove all old layers before readding new ones + for (i = 0; i < removedLayers.length; i++) { + if (this._map.hasLayer(removedLayers[i])) { + this._map.removeLayer(removedLayers[i]); + } + } + for (i = 0; i < addedLayers.length; i++) { + if (!this._map.hasLayer(addedLayers[i])) { + this._map.addLayer(addedLayers[i]); + } + } + + this._handlingClick = false; + + this._refocusOnMap(); + }, + + _checkDisabledLayers: function () { + var inputs = this._layerControlInputs, + input, + layer, + zoom = this._map.getZoom(); + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) || + (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom); + + } + }, + + _expandIfNotCollapsed: function () { + if (this._map && !this.options.collapsed) { + this.expand(); + } + return this; + }, + + _expand: function () { + // Backward compatibility, remove me in 1.1. + return this.expand(); + }, + + _collapse: function () { + // Backward compatibility, remove me in 1.1. + return this.collapse(); + } + +}); + + +// @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options) +// Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. +var layers = function (baseLayers, overlays, options) { + return new Layers(baseLayers, overlays, options); +}; + +/* + * @class Control.Zoom + * @aka L.Control.Zoom + * @inherits Control + * + * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`. + */ + +var Zoom = Control.extend({ + // @section + // @aka Control.Zoom options + options: { + position: 'topleft', + + // @option zoomInText: String = '+' + // The text set on the 'zoom in' button. + zoomInText: '+', + + // @option zoomInTitle: String = 'Zoom in' + // The title set on the 'zoom in' button. + zoomInTitle: 'Zoom in', + + // @option zoomOutText: String = '−' + // The text set on the 'zoom out' button. + zoomOutText: '−', + + // @option zoomOutTitle: String = 'Zoom out' + // The title set on the 'zoom out' button. + zoomOutTitle: 'Zoom out' + }, + + onAdd: function (map) { + var zoomName = 'leaflet-control-zoom', + container = create$1('div', zoomName + ' leaflet-bar'), + options = this.options; + + this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, + zoomName + '-in', container, this._zoomIn); + this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, + zoomName + '-out', container, this._zoomOut); + + this._updateDisabled(); + map.on('zoomend zoomlevelschange', this._updateDisabled, this); + + return container; + }, + + onRemove: function (map) { + map.off('zoomend zoomlevelschange', this._updateDisabled, this); + }, + + disable: function () { + this._disabled = true; + this._updateDisabled(); + return this; + }, + + enable: function () { + this._disabled = false; + this._updateDisabled(); + return this; + }, + + _zoomIn: function (e) { + if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) { + this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _zoomOut: function (e) { + if (!this._disabled && this._map._zoom > this._map.getMinZoom()) { + this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _createButton: function (html, title, className, container, fn) { + var link = create$1('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; + + /* + * Will force screen readers like VoiceOver to read this as "Zoom in - button" + */ + link.setAttribute('role', 'button'); + link.setAttribute('aria-label', title); + + disableClickPropagation(link); + on(link, 'click', stop); + on(link, 'click', fn, this); + on(link, 'click', this._refocusOnMap, this); + + return link; + }, + + _updateDisabled: function () { + var map = this._map, + className = 'leaflet-disabled'; + + removeClass(this._zoomInButton, className); + removeClass(this._zoomOutButton, className); + this._zoomInButton.setAttribute('aria-disabled', 'false'); + this._zoomOutButton.setAttribute('aria-disabled', 'false'); + + if (this._disabled || map._zoom === map.getMinZoom()) { + addClass(this._zoomOutButton, className); + this._zoomOutButton.setAttribute('aria-disabled', 'true'); + } + if (this._disabled || map._zoom === map.getMaxZoom()) { + addClass(this._zoomInButton, className); + this._zoomInButton.setAttribute('aria-disabled', 'true'); + } + } +}); + +// @namespace Map +// @section Control options +// @option zoomControl: Boolean = true +// Whether a [zoom control](#control-zoom) is added to the map by default. +Map.mergeOptions({ + zoomControl: true +}); + +Map.addInitHook(function () { + if (this.options.zoomControl) { + // @section Controls + // @property zoomControl: Control.Zoom + // The default zoom control (only available if the + // [`zoomControl` option](#map-zoomcontrol) was `true` when creating the map). + this.zoomControl = new Zoom(); + this.addControl(this.zoomControl); + } +}); + +// @namespace Control.Zoom +// @factory L.control.zoom(options: Control.Zoom options) +// Creates a zoom control +var zoom = function (options) { + return new Zoom(options); +}; + +/* + * @class Control.Scale + * @aka L.Control.Scale + * @inherits Control + * + * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`. + * + * @example + * + * ```js + * L.control.scale().addTo(map); + * ``` + */ + +var Scale = Control.extend({ + // @section + // @aka Control.Scale options + options: { + position: 'bottomleft', + + // @option maxWidth: Number = 100 + // Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). + maxWidth: 100, + + // @option metric: Boolean = True + // Whether to show the metric scale line (m/km). + metric: true, + + // @option imperial: Boolean = True + // Whether to show the imperial scale line (mi/ft). + imperial: true + + // @option updateWhenIdle: Boolean = false + // If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)). + }, + + onAdd: function (map) { + var className = 'leaflet-control-scale', + container = create$1('div', className), + options = this.options; + + this._addScales(options, className + '-line', container); + + map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + map.whenReady(this._update, this); + + return container; + }, + + onRemove: function (map) { + map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + }, + + _addScales: function (options, className, container) { + if (options.metric) { + this._mScale = create$1('div', className, container); + } + if (options.imperial) { + this._iScale = create$1('div', className, container); + } + }, + + _update: function () { + var map = this._map, + y = map.getSize().y / 2; + + var maxMeters = map.distance( + map.containerPointToLatLng([0, y]), + map.containerPointToLatLng([this.options.maxWidth, y])); + + this._updateScales(maxMeters); + }, + + _updateScales: function (maxMeters) { + if (this.options.metric && maxMeters) { + this._updateMetric(maxMeters); + } + if (this.options.imperial && maxMeters) { + this._updateImperial(maxMeters); + } + }, + + _updateMetric: function (maxMeters) { + var meters = this._getRoundNum(maxMeters), + label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + + this._updateScale(this._mScale, label, meters / maxMeters); + }, + + _updateImperial: function (maxMeters) { + var maxFeet = maxMeters * 3.2808399, + maxMiles, miles, feet; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this._getRoundNum(maxMiles); + this._updateScale(this._iScale, miles + ' mi', miles / maxMiles); + + } else { + feet = this._getRoundNum(maxFeet); + this._updateScale(this._iScale, feet + ' ft', feet / maxFeet); + } + }, + + _updateScale: function (scale, text, ratio) { + scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px'; + scale.innerHTML = text; + }, + + _getRoundNum: function (num) { + var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), + d = num / pow10; + + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; + + return pow10 * d; + } +}); + + +// @factory L.control.scale(options?: Control.Scale options) +// Creates an scale control with the given options. +var scale = function (options) { + return new Scale(options); +}; + +/* + * @class Control.Attribution + * @aka L.Control.Attribution + * @inherits Control + * + * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control. + */ + +var Attribution = Control.extend({ + // @section + // @aka Control.Attribution options + options: { + position: 'bottomright', + + // @option prefix: String = 'Leaflet' + // The HTML text shown before the attributions. Pass `false` to disable. + prefix: 'Leaflet' + }, + + initialize: function (options) { + setOptions(this, options); + + this._attributions = {}; + }, + + onAdd: function (map) { + map.attributionControl = this; + this._container = create$1('div', 'leaflet-control-attribution'); + disableClickPropagation(this._container); + + // TODO ugly, refactor + for (var i in map._layers) { + if (map._layers[i].getAttribution) { + this.addAttribution(map._layers[i].getAttribution()); + } + } + + this._update(); + + return this._container; + }, + + // @method setPrefix(prefix: String): this + // Sets the text before the attributions. + setPrefix: function (prefix) { + this.options.prefix = prefix; + this._update(); + return this; + }, + + // @method addAttribution(text: String): this + // Adds an attribution text (e.g. `'Vector data © Mapbox'`). + addAttribution: function (text) { + if (!text) { return this; } + + if (!this._attributions[text]) { + this._attributions[text] = 0; + } + this._attributions[text]++; + + this._update(); + + return this; + }, + + // @method removeAttribution(text: String): this + // Removes an attribution text. + removeAttribution: function (text) { + if (!text) { return this; } + + if (this._attributions[text]) { + this._attributions[text]--; + this._update(); + } + + return this; + }, + + _update: function () { + if (!this._map) { return; } + + var attribs = []; + + for (var i in this._attributions) { + if (this._attributions[i]) { + attribs.push(i); + } + } + + var prefixAndAttribs = []; + + if (this.options.prefix) { + prefixAndAttribs.push(this.options.prefix); + } + if (attribs.length) { + prefixAndAttribs.push(attribs.join(', ')); + } + + this._container.innerHTML = prefixAndAttribs.join(' | '); + } +}); + +// @namespace Map +// @section Control options +// @option attributionControl: Boolean = true +// Whether a [attribution control](#control-attribution) is added to the map by default. +Map.mergeOptions({ + attributionControl: true +}); + +Map.addInitHook(function () { + if (this.options.attributionControl) { + new Attribution().addTo(this); + } +}); + +// @namespace Control.Attribution +// @factory L.control.attribution(options: Control.Attribution options) +// Creates an attribution control. +var attribution = function (options) { + return new Attribution(options); +}; + +Control.Layers = Layers; +Control.Zoom = Zoom; +Control.Scale = Scale; +Control.Attribution = Attribution; + +control.layers = layers; +control.zoom = zoom; +control.scale = scale; +control.attribution = attribution; + +/* + L.Handler is a base class for handler classes that are used internally to inject + interaction features like dragging to classes like Map and Marker. +*/ + +// @class Handler +// @aka L.Handler +// Abstract class for map interaction handlers + +var Handler = Class.extend({ + initialize: function (map) { + this._map = map; + }, + + // @method enable(): this + // Enables the handler + enable: function () { + if (this._enabled) { return this; } + + this._enabled = true; + this.addHooks(); + return this; + }, + + // @method disable(): this + // Disables the handler + disable: function () { + if (!this._enabled) { return this; } + + this._enabled = false; + this.removeHooks(); + return this; + }, + + // @method enabled(): Boolean + // Returns `true` if the handler is enabled + enabled: function () { + return !!this._enabled; + } + + // @section Extension methods + // Classes inheriting from `Handler` must implement the two following methods: + // @method addHooks() + // Called when the handler is enabled, should add event hooks. + // @method removeHooks() + // Called when the handler is disabled, should remove the event hooks added previously. +}); + +// @section There is static function which can be called without instantiating L.Handler: +// @function addTo(map: Map, name: String): this +// Adds a new Handler to the given map with the given name. +Handler.addTo = function (map, name) { + map.addHandler(name, this); + return this; +}; + +var Mixin = {Events: Events}; + +/* + * @class Draggable + * @aka L.Draggable + * @inherits Evented + * + * A class for making DOM elements draggable (including touch support). + * Used internally for map and marker dragging. Only works for elements + * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition). + * + * @example + * ```js + * var draggable = new L.Draggable(elementToDrag); + * draggable.enable(); + * ``` + */ + +var START = touch ? 'touchstart mousedown' : 'mousedown'; +var END = { + mousedown: 'mouseup', + touchstart: 'touchend', + pointerdown: 'touchend', + MSPointerDown: 'touchend' +}; +var MOVE = { + mousedown: 'mousemove', + touchstart: 'touchmove', + pointerdown: 'touchmove', + MSPointerDown: 'touchmove' +}; + + +var Draggable = Evented.extend({ + + options: { + // @section + // @aka Draggable options + // @option clickTolerance: Number = 3 + // The max number of pixels a user can shift the mouse pointer during a click + // for it to be considered a valid click (as opposed to a mouse drag). + clickTolerance: 3 + }, + + // @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline?: Boolean, options?: Draggable options) + // Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default). + initialize: function (element, dragStartTarget, preventOutline$$1, options) { + setOptions(this, options); + + this._element = element; + this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline$$1; + }, + + // @method enable() + // Enables the dragging ability + enable: function () { + if (this._enabled) { return; } + + on(this._dragStartTarget, START, this._onDown, this); + + this._enabled = true; + }, + + // @method disable() + // Disables the dragging ability + disable: function () { + if (!this._enabled) { return; } + + // If we're currently dragging this draggable, + // disabling it counts as first ending the drag. + if (Draggable._dragging === this) { + this.finishDrag(); + } + + off(this._dragStartTarget, START, this._onDown, this); + + this._enabled = false; + this._moved = false; + }, + + _onDown: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + this._moved = false; + + if (hasClass(this._element, 'leaflet-zoom-anim')) { return; } + + if (Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + Draggable._dragging = this; // Prevent dragging multiple objects at once. + + if (this._preventOutline) { + preventOutline(this._element); + } + + disableImageDrag(); + disableTextSelection(); + + if (this._moving) { return; } + + // @event down: Event + // Fired when a drag is about to start. + this.fire('down'); + + var first = e.touches ? e.touches[0] : e, + sizedParent = getSizedParentNode(this._element); + + this._startPoint = new Point(first.clientX, first.clientY); + + // Cache the scale, so that we can continuously compensate for it during drag (_onMove). + this._parentScale = getScale(sizedParent); + + on(document, MOVE[e.type], this._onMove, this); + on(document, END[e.type], this._onUp, this); + }, + + _onMove: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + if (e.touches && e.touches.length > 1) { + this._moved = true; + return; + } + + var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), + offset = new Point(first.clientX, first.clientY)._subtract(this._startPoint); + + if (!offset.x && !offset.y) { return; } + if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; } + + // We assume that the parent container's position, border and scale do not change for the duration of the drag. + // Therefore there is no need to account for the position and border (they are eliminated by the subtraction) + // and we can use the cached value for the scale. + offset.x /= this._parentScale.x; + offset.y /= this._parentScale.y; + + preventDefault(e); + + if (!this._moved) { + // @event dragstart: Event + // Fired when a drag starts + this.fire('dragstart'); + + this._moved = true; + this._startPos = getPosition(this._element).subtract(offset); + + addClass(document.body, 'leaflet-dragging'); + + this._lastTarget = e.target || e.srcElement; + // IE and Edge do not give the element, so fetch it + // if necessary + if (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) { + this._lastTarget = this._lastTarget.correspondingUseElement; + } + addClass(this._lastTarget, 'leaflet-drag-target'); + } + + this._newPos = this._startPos.add(offset); + this._moving = true; + + cancelAnimFrame(this._animRequest); + this._lastEvent = e; + this._animRequest = requestAnimFrame(this._updatePosition, this, true); + }, + + _updatePosition: function () { + var e = {originalEvent: this._lastEvent}; + + // @event predrag: Event + // Fired continuously during dragging *before* each corresponding + // update of the element's position. + this.fire('predrag', e); + setPosition(this._element, this._newPos); + + // @event drag: Event + // Fired continuously during dragging. + this.fire('drag', e); + }, + + _onUp: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + this.finishDrag(); + }, + + finishDrag: function () { + removeClass(document.body, 'leaflet-dragging'); + + if (this._lastTarget) { + removeClass(this._lastTarget, 'leaflet-drag-target'); + this._lastTarget = null; + } + + for (var i in MOVE) { + off(document, MOVE[i], this._onMove, this); + off(document, END[i], this._onUp, this); + } + + enableImageDrag(); + enableTextSelection(); + + if (this._moved && this._moving) { + // ensure drag is not fired after dragend + cancelAnimFrame(this._animRequest); + + // @event dragend: DragEndEvent + // Fired when the drag ends. + this.fire('dragend', { + distance: this._newPos.distanceTo(this._startPos) + }); + } + + this._moving = false; + Draggable._dragging = false; + } + +}); + +/* + * @namespace LineUtil + * + * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast. + */ + +// Simplify polyline with vertex reduction and Douglas-Peucker simplification. +// Improves rendering performance dramatically by lessening the number of points to draw. + +// @function simplify(points: Point[], tolerance: Number): Point[] +// Dramatically reduces the number of points in a polyline while retaining +// its shape and returns a new array of simplified points, using the +// [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm). +// Used for a huge performance boost when processing/displaying Leaflet polylines for +// each zoom level and also reducing visual noise. tolerance affects the amount of +// simplification (lesser value means higher quality but slower and with more points). +// Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/). +function simplify(points, tolerance) { + if (!tolerance || !points.length) { + return points.slice(); + } + + var sqTolerance = tolerance * tolerance; + + // stage 1: vertex reduction + points = _reducePoints(points, sqTolerance); + + // stage 2: Douglas-Peucker simplification + points = _simplifyDP(points, sqTolerance); + + return points; +} + +// @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number +// Returns the distance between point `p` and segment `p1` to `p2`. +function pointToSegmentDistance(p, p1, p2) { + return Math.sqrt(_sqClosestPointOnSegment(p, p1, p2, true)); +} + +// @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number +// Returns the closest point from a point `p` on a segment `p1` to `p2`. +function closestPointOnSegment(p, p1, p2) { + return _sqClosestPointOnSegment(p, p1, p2); +} + +// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm +function _simplifyDP(points, sqTolerance) { + + var len = points.length, + ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, + markers = new ArrayConstructor(len); + + markers[0] = markers[len - 1] = 1; + + _simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + + var i, + newPoints = []; + + for (i = 0; i < len; i++) { + if (markers[i]) { + newPoints.push(points[i]); + } + } + + return newPoints; +} + +function _simplifyDPStep(points, markers, sqTolerance, first, last) { + + var maxSqDist = 0, + index, i, sqDist; + + for (i = first + 1; i <= last - 1; i++) { + sqDist = _sqClosestPointOnSegment(points[i], points[first], points[last], true); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + markers[index] = 1; + + _simplifyDPStep(points, markers, sqTolerance, first, index); + _simplifyDPStep(points, markers, sqTolerance, index, last); + } +} + +// reduce points that are too close to each other to a single point +function _reducePoints(points, sqTolerance) { + var reducedPoints = [points[0]]; + + for (var i = 1, prev = 0, len = points.length; i < len; i++) { + if (_sqDist(points[i], points[prev]) > sqTolerance) { + reducedPoints.push(points[i]); + prev = i; + } + } + if (prev < len - 1) { + reducedPoints.push(points[len - 1]); + } + return reducedPoints; +} + +var _lastCode; + +// @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean +// Clips the segment a to b by rectangular bounds with the +// [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm) +// (modifying the segment points directly!). Used by Leaflet to only show polyline +// points that are on the screen or near, increasing performance. +function clipSegment(a, b, bounds, useLastCode, round) { + var codeA = useLastCode ? _lastCode : _getBitCode(a, bounds), + codeB = _getBitCode(b, bounds), + + codeOut, p, newCode; + + // save 2nd code to avoid calculating it on the next segment + _lastCode = codeB; + + while (true) { + // if a,b is inside the clip window (trivial accept) + if (!(codeA | codeB)) { + return [a, b]; + } + + // if a,b is outside the clip window (trivial reject) + if (codeA & codeB) { + return false; + } + + // other cases + codeOut = codeA || codeB; + p = _getEdgeIntersection(a, b, codeOut, bounds, round); + newCode = _getBitCode(p, bounds); + + if (codeOut === codeA) { + a = p; + codeA = newCode; + } else { + b = p; + codeB = newCode; + } + } +} + +function _getEdgeIntersection(a, b, code, bounds, round) { + var dx = b.x - a.x, + dy = b.y - a.y, + min = bounds.min, + max = bounds.max, + x, y; + + if (code & 8) { // top + x = a.x + dx * (max.y - a.y) / dy; + y = max.y; + + } else if (code & 4) { // bottom + x = a.x + dx * (min.y - a.y) / dy; + y = min.y; + + } else if (code & 2) { // right + x = max.x; + y = a.y + dy * (max.x - a.x) / dx; + + } else if (code & 1) { // left + x = min.x; + y = a.y + dy * (min.x - a.x) / dx; + } + + return new Point(x, y, round); +} + +function _getBitCode(p, bounds) { + var code = 0; + + if (p.x < bounds.min.x) { // left + code |= 1; + } else if (p.x > bounds.max.x) { // right + code |= 2; + } + + if (p.y < bounds.min.y) { // bottom + code |= 4; + } else if (p.y > bounds.max.y) { // top + code |= 8; + } + + return code; +} + +// square distance (to avoid unnecessary Math.sqrt calls) +function _sqDist(p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return dx * dx + dy * dy; +} + +// return closest point on segment or distance to that point +function _sqClosestPointOnSegment(p, p1, p2, sqDist) { + var x = p1.x, + y = p1.y, + dx = p2.x - x, + dy = p2.y - y, + dot = dx * dx + dy * dy, + t; + + if (dot > 0) { + t = ((p.x - x) * dx + (p.y - y) * dy) / dot; + + if (t > 1) { + x = p2.x; + y = p2.y; + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return sqDist ? dx * dx + dy * dy : new Point(x, y); +} + + +// @function isFlat(latlngs: LatLng[]): Boolean +// Returns true if `latlngs` is a flat array, false is nested. +function isFlat(latlngs) { + return !isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); +} + +function _flat(latlngs) { + console.warn('Deprecated use of _flat, please use L.LineUtil.isFlat instead.'); + return isFlat(latlngs); +} + +var LineUtil = ({ + simplify: simplify, + pointToSegmentDistance: pointToSegmentDistance, + closestPointOnSegment: closestPointOnSegment, + clipSegment: clipSegment, + _getEdgeIntersection: _getEdgeIntersection, + _getBitCode: _getBitCode, + _sqClosestPointOnSegment: _sqClosestPointOnSegment, + isFlat: isFlat, + _flat: _flat +}); + +/* + * @namespace PolyUtil + * Various utility functions for polygon geometries. + */ + +/* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[] + * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)). + * Used by Leaflet to only show polygon points that are on the screen or near, increasing + * performance. Note that polygon points needs different algorithm for clipping + * than polyline, so there's a separate method for it. + */ +function clipPolygon(points, bounds, round) { + var clippedPoints, + edges = [1, 4, 2, 8], + i, j, k, + a, b, + len, edge, p; + + for (i = 0, len = points.length; i < len; i++) { + points[i]._code = _getBitCode(points[i], bounds); + } + + // for each edge (left, bottom, right, top) + for (k = 0; k < 4; k++) { + edge = edges[k]; + clippedPoints = []; + + for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { + a = points[i]; + b = points[j]; + + // if a is inside the clip window + if (!(a._code & edge)) { + // if b is outside the clip window (a->b goes out of screen) + if (b._code & edge) { + p = _getEdgeIntersection(b, a, edge, bounds, round); + p._code = _getBitCode(p, bounds); + clippedPoints.push(p); + } + clippedPoints.push(a); + + // else if b is inside the clip window (a->b enters the screen) + } else if (!(b._code & edge)) { + p = _getEdgeIntersection(b, a, edge, bounds, round); + p._code = _getBitCode(p, bounds); + clippedPoints.push(p); + } + } + points = clippedPoints; + } + + return points; +} + +var PolyUtil = ({ + clipPolygon: clipPolygon +}); + +/* + * @namespace Projection + * @section + * Leaflet comes with a set of already defined Projections out of the box: + * + * @projection L.Projection.LonLat + * + * Equirectangular, or Plate Carree projection — the most simple projection, + * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as + * latitude. Also suitable for flat worlds, e.g. game maps. Used by the + * `EPSG:4326` and `Simple` CRS. + */ + +var LonLat = { + project: function (latlng) { + return new Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new LatLng(point.y, point.x); + }, + + bounds: new Bounds([-180, -90], [180, 90]) +}; + +/* + * @namespace Projection + * @projection L.Projection.Mercator + * + * Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS. + */ + +var Mercator = { + R: 6378137, + R_MINOR: 6356752.314245179, + + bounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), + + project: function (latlng) { + var d = Math.PI / 180, + r = this.R, + y = latlng.lat * d, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + con = e * Math.sin(y); + + var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2); + y = -r * Math.log(Math.max(ts, 1E-10)); + + return new Point(latlng.lng * d * r, y); + }, + + unproject: function (point) { + var d = 180 / Math.PI, + r = this.R, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + ts = Math.exp(-point.y / r), + phi = Math.PI / 2 - 2 * Math.atan(ts); + + for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) { + con = e * Math.sin(phi); + con = Math.pow((1 - con) / (1 + con), e / 2); + dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi; + phi += dphi; + } + + return new LatLng(phi * d, point.x * d / r); + } +}; + +/* + * @class Projection + + * An object with methods for projecting geographical coordinates of the world onto + * a flat surface (and back). See [Map projection](http://en.wikipedia.org/wiki/Map_projection). + + * @property bounds: Bounds + * The bounds (specified in CRS units) where the projection is valid + + * @method project(latlng: LatLng): Point + * Projects geographical coordinates into a 2D point. + * Only accepts actual `L.LatLng` instances, not arrays. + + * @method unproject(point: Point): LatLng + * The inverse of `project`. Projects a 2D point into a geographical location. + * Only accepts actual `L.Point` instances, not arrays. + + * Note that the projection instances do not inherit from Leaflet's `Class` object, + * and can't be instantiated. Also, new classes can't inherit from them, + * and methods can't be added to them with the `include` function. + + */ + +var index = ({ + LonLat: LonLat, + Mercator: Mercator, + SphericalMercator: SphericalMercator +}); + +/* + * @namespace CRS + * @crs L.CRS.EPSG3395 + * + * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection. + */ +var EPSG3395 = extend({}, Earth, { + code: 'EPSG:3395', + projection: Mercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * Mercator.R); + return toTransformation(scale, 0.5, -scale, 0.5); + }()) +}); + +/* + * @namespace CRS + * @crs L.CRS.EPSG4326 + * + * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. + * + * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic), + * which is a breaking change from 0.7.x behaviour. If you are using a `TileLayer` + * with this CRS, ensure that there are two 256x256 pixel tiles covering the + * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), + * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set. + */ + +var EPSG4326 = extend({}, Earth, { + code: 'EPSG:4326', + projection: LonLat, + transformation: toTransformation(1 / 180, 1, -1 / 180, 0.5) +}); + +/* + * @namespace CRS + * @crs L.CRS.Simple + * + * A simple CRS that maps longitude and latitude into `x` and `y` directly. + * May be used for maps of flat surfaces (e.g. game maps). Note that the `y` + * axis should still be inverted (going from bottom to top). `distance()` returns + * simple euclidean distance. + */ + +var Simple = extend({}, CRS, { + projection: LonLat, + transformation: toTransformation(1, 0, -1, 0), + + scale: function (zoom) { + return Math.pow(2, zoom); + }, + + zoom: function (scale) { + return Math.log(scale) / Math.LN2; + }, + + distance: function (latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + + return Math.sqrt(dx * dx + dy * dy); + }, + + infinite: true +}); + +CRS.Earth = Earth; +CRS.EPSG3395 = EPSG3395; +CRS.EPSG3857 = EPSG3857; +CRS.EPSG900913 = EPSG900913; +CRS.EPSG4326 = EPSG4326; +CRS.Simple = Simple; + +/* + * @class Layer + * @inherits Evented + * @aka L.Layer + * @aka ILayer + * + * A set of methods from the Layer base class that all Leaflet layers use. + * Inherits all methods, options and events from `L.Evented`. + * + * @example + * + * ```js + * var layer = L.marker(latlng).addTo(map); + * layer.addTo(map); + * layer.remove(); + * ``` + * + * @event add: Event + * Fired after the layer is added to a map + * + * @event remove: Event + * Fired after the layer is removed from a map + */ + + +var Layer = Evented.extend({ + + // Classes extending `L.Layer` will inherit the following options: + options: { + // @option pane: String = 'overlayPane' + // By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default. + pane: 'overlayPane', + + // @option attribution: String = null + // String to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers. + attribution: null, + + bubblingMouseEvents: true + }, + + /* @section + * Classes extending `L.Layer` will inherit the following methods: + * + * @method addTo(map: Map|LayerGroup): this + * Adds the layer to the given map or layer group. + */ + addTo: function (map) { + map.addLayer(this); + return this; + }, + + // @method remove: this + // Removes the layer from the map it is currently active on. + remove: function () { + return this.removeFrom(this._map || this._mapToAdd); + }, + + // @method removeFrom(map: Map): this + // Removes the layer from the given map + // + // @alternative + // @method removeFrom(group: LayerGroup): this + // Removes the layer from the given `LayerGroup` + removeFrom: function (obj) { + if (obj) { + obj.removeLayer(this); + } + return this; + }, + + // @method getPane(name? : String): HTMLElement + // Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer. + getPane: function (name) { + return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); + }, + + addInteractiveTarget: function (targetEl) { + this._map._targets[stamp(targetEl)] = this; + return this; + }, + + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[stamp(targetEl)]; + return this; + }, + + // @method getAttribution: String + // Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution). + getAttribution: function () { + return this.options.attribution; + }, + + _layerAdd: function (e) { + var map = e.target; + + // check in case layer gets added and then removed before the map is ready + if (!map.hasLayer(this)) { return; } + + this._map = map; + this._zoomAnimated = map._zoomAnimated; + + if (this.getEvents) { + var events = this.getEvents(); + map.on(events, this); + this.once('remove', function () { + map.off(events, this); + }, this); + } + + this.onAdd(map); + + if (this.getAttribution && map.attributionControl) { + map.attributionControl.addAttribution(this.getAttribution()); + } + + this.fire('add'); + map.fire('layeradd', {layer: this}); + } +}); + +/* @section Extension methods + * @uninheritable + * + * Every layer should extend from `L.Layer` and (re-)implement the following methods. + * + * @method onAdd(map: Map): this + * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer). + * + * @method onRemove(map: Map): this + * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer). + * + * @method getEvents(): Object + * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer. + * + * @method getAttribution(): String + * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible. + * + * @method beforeAdd(map: Map): this + * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only. + */ + + +/* @namespace Map + * @section Layer events + * + * @event layeradd: LayerEvent + * Fired when a new layer is added to the map. + * + * @event layerremove: LayerEvent + * Fired when some layer is removed from the map + * + * @section Methods for Layers and Controls + */ +Map.include({ + // @method addLayer(layer: Layer): this + // Adds the given layer to the map + addLayer: function (layer) { + if (!layer._layerAdd) { + throw new Error('The provided object is not a Layer.'); + } + + var id = stamp(layer); + if (this._layers[id]) { return this; } + this._layers[id] = layer; + + layer._mapToAdd = this; + + if (layer.beforeAdd) { + layer.beforeAdd(this); + } + + this.whenReady(layer._layerAdd, layer); + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the map. + removeLayer: function (layer) { + var id = stamp(layer); + + if (!this._layers[id]) { return this; } + + if (this._loaded) { + layer.onRemove(this); + } + + if (layer.getAttribution && this.attributionControl) { + this.attributionControl.removeAttribution(layer.getAttribution()); + } + + delete this._layers[id]; + + if (this._loaded) { + this.fire('layerremove', {layer: layer}); + layer.fire('remove'); + } + + layer._map = layer._mapToAdd = null; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the map + hasLayer: function (layer) { + return !!layer && (stamp(layer) in this._layers); + }, + + /* @method eachLayer(fn: Function, context?: Object): this + * Iterates over the layers of the map, optionally specifying context of the iterator function. + * ``` + * map.eachLayer(function(layer){ + * layer.bindPopup('Hello'); + * }); + * ``` + */ + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + _addLayers: function (layers) { + layers = layers ? (isArray(layers) ? layers : [layers]) : []; + + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + }, + + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, + + _removeZoomLimit: function (layer) { + var id = stamp(layer); + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + }, + + _updateZoomLevels: function () { + var minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); + + for (var i in this._zoomBoundLayers) { + var options = this._zoomBoundLayers[i].options; + + minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom); + } + + this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom; + this._layersMinZoom = minZoom === Infinity ? undefined : minZoom; + + // @section Map state change events + // @event zoomlevelschange: Event + // Fired when the number of zoomlevels on the map is changed due + // to adding or removing a layer. + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } + + if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) { + this.setZoom(this._layersMaxZoom); + } + if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) { + this.setZoom(this._layersMinZoom); + } + } +}); + +/* + * @class LayerGroup + * @aka L.LayerGroup + * @inherits Layer + * + * Used to group several layers and handle them as one. If you add it to the map, + * any layers added or removed from the group will be added/removed on the map as + * well. Extends `Layer`. + * + * @example + * + * ```js + * L.layerGroup([marker1, marker2]) + * .addLayer(polyline) + * .addTo(map); + * ``` + */ + +var LayerGroup = Layer.extend({ + + initialize: function (layers, options) { + setOptions(this, options); + + this._layers = {}; + + var i, len; + + if (layers) { + for (i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + } + }, + + // @method addLayer(layer: Layer): this + // Adds the given layer to the group. + addLayer: function (layer) { + var id = this.getLayerId(layer); + + this._layers[id] = layer; + + if (this._map) { + this._map.addLayer(layer); + } + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the group. + // @alternative + // @method removeLayer(id: Number): this + // Removes the layer with the given internal ID from the group. + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the group. + // @alternative + // @method hasLayer(id: Number): Boolean + // Returns `true` if the given internal ID is currently added to the group. + hasLayer: function (layer) { + if (!layer) { return false; } + var layerId = typeof layer === 'number' ? layer : this.getLayerId(layer); + return layerId in this._layers; + }, + + // @method clearLayers(): this + // Removes all the layers from the group. + clearLayers: function () { + return this.eachLayer(this.removeLayer, this); + }, + + // @method invoke(methodName: String, …): this + // Calls `methodName` on every layer contained in this group, passing any + // additional parameters. Has no effect if the layers contained do not + // implement `methodName`. + invoke: function (methodName) { + var args = Array.prototype.slice.call(arguments, 1), + i, layer; + + for (i in this._layers) { + layer = this._layers[i]; + + if (layer[methodName]) { + layer[methodName].apply(layer, args); + } + } + + return this; + }, + + onAdd: function (map) { + this.eachLayer(map.addLayer, map); + }, + + onRemove: function (map) { + this.eachLayer(map.removeLayer, map); + }, + + // @method eachLayer(fn: Function, context?: Object): this + // Iterates over the layers of the group, optionally specifying context of the iterator function. + // ```js + // group.eachLayer(function (layer) { + // layer.bindPopup('Hello'); + // }); + // ``` + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + // @method getLayer(id: Number): Layer + // Returns the layer with the given internal ID. + getLayer: function (id) { + return this._layers[id]; + }, + + // @method getLayers(): Layer[] + // Returns an array of all the layers added to the group. + getLayers: function () { + var layers = []; + this.eachLayer(layers.push, layers); + return layers; + }, + + // @method setZIndex(zIndex: Number): this + // Calls `setZIndex` on every layer contained in this group, passing the z-index. + setZIndex: function (zIndex) { + return this.invoke('setZIndex', zIndex); + }, + + // @method getLayerId(layer: Layer): Number + // Returns the internal ID for a layer + getLayerId: function (layer) { + return stamp(layer); + } +}); + + +// @factory L.layerGroup(layers?: Layer[], options?: Object) +// Create a layer group, optionally given an initial set of layers and an `options` object. +var layerGroup = function (layers, options) { + return new LayerGroup(layers, options); +}; + +/* + * @class FeatureGroup + * @aka L.FeatureGroup + * @inherits LayerGroup + * + * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers: + * * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip)) + * * Events are propagated to the `FeatureGroup`, so if the group has an event + * handler, it will handle events from any of the layers. This includes mouse events + * and custom events. + * * Has `layeradd` and `layerremove` events + * + * @example + * + * ```js + * L.featureGroup([marker1, marker2, polyline]) + * .bindPopup('Hello world!') + * .on('click', function() { alert('Clicked on a member of the group!'); }) + * .addTo(map); + * ``` + */ + +var FeatureGroup = LayerGroup.extend({ + + addLayer: function (layer) { + if (this.hasLayer(layer)) { + return this; + } + + layer.addEventParent(this); + + LayerGroup.prototype.addLayer.call(this, layer); + + // @event layeradd: LayerEvent + // Fired when a layer is added to this `FeatureGroup` + return this.fire('layeradd', {layer: layer}); + }, + + removeLayer: function (layer) { + if (!this.hasLayer(layer)) { + return this; + } + if (layer in this._layers) { + layer = this._layers[layer]; + } + + layer.removeEventParent(this); + + LayerGroup.prototype.removeLayer.call(this, layer); + + // @event layerremove: LayerEvent + // Fired when a layer is removed from this `FeatureGroup` + return this.fire('layerremove', {layer: layer}); + }, + + // @method setStyle(style: Path options): this + // Sets the given path options to each layer of the group that has a `setStyle` method. + setStyle: function (style) { + return this.invoke('setStyle', style); + }, + + // @method bringToFront(): this + // Brings the layer group to the top of all other layers + bringToFront: function () { + return this.invoke('bringToFront'); + }, + + // @method bringToBack(): this + // Brings the layer group to the back of all other layers + bringToBack: function () { + return this.invoke('bringToBack'); + }, + + // @method getBounds(): LatLngBounds + // Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). + getBounds: function () { + var bounds = new LatLngBounds(); + + for (var id in this._layers) { + var layer = this._layers[id]; + bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); + } + return bounds; + } +}); + +// @factory L.featureGroup(layers?: Layer[], options?: Object) +// Create a feature group, optionally given an initial set of layers and an `options` object. +var featureGroup = function (layers, options) { + return new FeatureGroup(layers, options); +}; + +/* + * @class Icon + * @aka L.Icon + * + * Represents an icon to provide when creating a marker. + * + * @example + * + * ```js + * var myIcon = L.icon({ + * iconUrl: 'my-icon.png', + * iconRetinaUrl: 'my-icon@2x.png', + * iconSize: [38, 95], + * iconAnchor: [22, 94], + * popupAnchor: [-3, -76], + * shadowUrl: 'my-icon-shadow.png', + * shadowRetinaUrl: 'my-icon-shadow@2x.png', + * shadowSize: [68, 95], + * shadowAnchor: [22, 94] + * }); + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default. + * + */ + +var Icon = Class.extend({ + + /* @section + * @aka Icon options + * + * @option iconUrl: String = null + * **(required)** The URL to the icon image (absolute or relative to your script path). + * + * @option iconRetinaUrl: String = null + * The URL to a retina sized version of the icon image (absolute or relative to your + * script path). Used for Retina screen devices. + * + * @option iconSize: Point = null + * Size of the icon image in pixels. + * + * @option iconAnchor: Point = null + * The coordinates of the "tip" of the icon (relative to its top left corner). The icon + * will be aligned so that this point is at the marker's geographical location. Centered + * by default if size is specified, also can be set in CSS with negative margins. + * + * @option popupAnchor: Point = [0, 0] + * The coordinates of the point from which popups will "open", relative to the icon anchor. + * + * @option tooltipAnchor: Point = [0, 0] + * The coordinates of the point from which tooltips will "open", relative to the icon anchor. + * + * @option shadowUrl: String = null + * The URL to the icon shadow image. If not specified, no shadow image will be created. + * + * @option shadowRetinaUrl: String = null + * + * @option shadowSize: Point = null + * Size of the shadow image in pixels. + * + * @option shadowAnchor: Point = null + * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same + * as iconAnchor if not specified). + * + * @option className: String = '' + * A custom class name to assign to both icon and shadow images. Empty by default. + */ + + options: { + popupAnchor: [0, 0], + tooltipAnchor: [0, 0], + + // @option crossOrigin: Boolean|String = false + // Whether the crossOrigin attribute will be added to the tiles. + // If a String is provided, all tiles will have their crossOrigin attribute set to the String provided. This is needed if you want to access tile pixel data. + // Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values. + crossOrigin: false + }, + + initialize: function (options) { + setOptions(this, options); + }, + + // @method createIcon(oldIcon?: HTMLElement): HTMLElement + // Called internally when the icon has to be shown, returns a `` HTML element + // styled according to the options. + createIcon: function (oldIcon) { + return this._createIcon('icon', oldIcon); + }, + + // @method createShadow(oldIcon?: HTMLElement): HTMLElement + // As `createIcon`, but for the shadow beneath it. + createShadow: function (oldIcon) { + return this._createIcon('shadow', oldIcon); + }, + + _createIcon: function (name, oldIcon) { + var src = this._getIconUrl(name); + + if (!src) { + if (name === 'icon') { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + return null; + } + + var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); + this._setIconStyles(img, name); + + if (this.options.crossOrigin || this.options.crossOrigin === '') { + img.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin; + } + + return img; + }, + + _setIconStyles: function (img, name) { + var options = this.options; + var sizeOption = options[name + 'Size']; + + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; + } + + var size = toPoint(sizeOption), + anchor = toPoint(name === 'shadow' && options.shadowAnchor || options.iconAnchor || + size && size.divideBy(2, true)); + + img.className = 'leaflet-marker-' + name + ' ' + (options.className || ''); + + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; + } + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + }, + + _createImg: function (src, el) { + el = el || document.createElement('img'); + el.src = src; + return el; + }, + + _getIconUrl: function (name) { + return retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; + } +}); + + +// @factory L.icon(options: Icon options) +// Creates an icon instance with the given options. +function icon(options) { + return new Icon(options); +} + +/* + * @miniclass Icon.Default (Icon) + * @aka L.Icon.Default + * @section + * + * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when + * no icon is specified. Points to the blue marker image distributed with Leaflet + * releases. + * + * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options` + * (which is a set of `Icon options`). + * + * If you want to _completely_ replace the default icon, override the + * `L.Marker.prototype.options.icon` with your own icon instead. + */ + +var IconDefault = Icon.extend({ + + options: { + iconUrl: 'marker-icon.png', + iconRetinaUrl: 'marker-icon-2x.png', + shadowUrl: 'marker-shadow.png', + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + tooltipAnchor: [16, -28], + shadowSize: [41, 41] + }, + + _getIconUrl: function (name) { + if (!IconDefault.imagePath) { // Deprecated, backwards-compatibility only + IconDefault.imagePath = this._detectIconPath(); + } + + // @option imagePath: String + // `Icon.Default` will try to auto-detect the location of the + // blue icon images. If you are placing these images in a non-standard + // way, set this option to point to the right path. + return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name); + }, + + _detectIconPath: function () { + var el = create$1('div', 'leaflet-default-icon-path', document.body); + var path = getStyle(el, 'background-image') || + getStyle(el, 'backgroundImage'); // IE8 + + document.body.removeChild(el); + + if (path === null || path.indexOf('url') !== 0) { + path = ''; + } else { + path = path.replace(/^url\(["']?/, '').replace(/marker-icon\.png["']?\)$/, ''); + } + + return path; + } +}); + +/* + * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. + */ + + +/* @namespace Marker + * @section Interaction handlers + * + * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example: + * + * ```js + * marker.dragging.disable(); + * ``` + * + * @property dragging: Handler + * Marker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set [`marker.options.draggable`](#marker-draggable)). + */ + +var MarkerDrag = Handler.extend({ + initialize: function (marker) { + this._marker = marker; + }, + + addHooks: function () { + var icon = this._marker._icon; + + if (!this._draggable) { + this._draggable = new Draggable(icon, icon, true); + } + + this._draggable.on({ + dragstart: this._onDragStart, + predrag: this._onPreDrag, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).enable(); + + addClass(icon, 'leaflet-marker-draggable'); + }, + + removeHooks: function () { + this._draggable.off({ + dragstart: this._onDragStart, + predrag: this._onPreDrag, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).disable(); + + if (this._marker._icon) { + removeClass(this._marker._icon, 'leaflet-marker-draggable'); + } + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + _adjustPan: function (e) { + var marker = this._marker, + map = marker._map, + speed = this._marker.options.autoPanSpeed, + padding = this._marker.options.autoPanPadding, + iconPos = getPosition(marker._icon), + bounds = map.getPixelBounds(), + origin = map.getPixelOrigin(); + + var panBounds = toBounds( + bounds.min._subtract(origin).add(padding), + bounds.max._subtract(origin).subtract(padding) + ); + + if (!panBounds.contains(iconPos)) { + // Compute incremental movement + var movement = toPoint( + (Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) - + (Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x), + + (Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) - + (Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y) + ).multiplyBy(speed); + + map.panBy(movement, {animate: false}); + + this._draggable._newPos._add(movement); + this._draggable._startPos._add(movement); + + setPosition(marker._icon, this._draggable._newPos); + this._onDrag(e); + + this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e)); + } + }, + + _onDragStart: function () { + // @section Dragging events + // @event dragstart: Event + // Fired when the user starts dragging the marker. + + // @event movestart: Event + // Fired when the marker starts moving (because of dragging). + + this._oldLatLng = this._marker.getLatLng(); + + // When using ES6 imports it could not be set when `Popup` was not imported as well + this._marker.closePopup && this._marker.closePopup(); + + this._marker + .fire('movestart') + .fire('dragstart'); + }, + + _onPreDrag: function (e) { + if (this._marker.options.autoPan) { + cancelAnimFrame(this._panRequest); + this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e)); + } + }, + + _onDrag: function (e) { + var marker = this._marker, + shadow = marker._shadow, + iconPos = getPosition(marker._icon), + latlng = marker._map.layerPointToLatLng(iconPos); + + // update shadow position + if (shadow) { + setPosition(shadow, iconPos); + } + + marker._latlng = latlng; + e.latlng = latlng; + e.oldLatLng = this._oldLatLng; + + // @event drag: Event + // Fired repeatedly while the user drags the marker. + marker + .fire('move', e) + .fire('drag', e); + }, + + _onDragEnd: function (e) { + // @event dragend: DragEndEvent + // Fired when the user stops dragging the marker. + + cancelAnimFrame(this._panRequest); + + // @event moveend: Event + // Fired when the marker stops moving (because of dragging). + delete this._oldLatLng; + this._marker + .fire('moveend') + .fire('dragend', e); + } +}); + +/* + * @class Marker + * @inherits Interactive layer + * @aka L.Marker + * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`. + * + * @example + * + * ```js + * L.marker([50.5, 30.5]).addTo(map); + * ``` + */ + +var Marker = Layer.extend({ + + // @section + // @aka Marker options + options: { + // @option icon: Icon = * + // Icon instance to use for rendering the marker. + // See [Icon documentation](#L.Icon) for details on how to customize the marker icon. + // If not specified, a common instance of `L.Icon.Default` is used. + icon: new IconDefault(), + + // Option inherited from "Interactive layer" abstract class + interactive: true, + + // @option keyboard: Boolean = true + // Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. + keyboard: true, + + // @option title: String = '' + // Text for the browser tooltip that appear on marker hover (no tooltip by default). + title: '', + + // @option alt: String = '' + // Text for the `alt` attribute of the icon image (useful for accessibility). + alt: '', + + // @option zIndexOffset: Number = 0 + // By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively). + zIndexOffset: 0, + + // @option opacity: Number = 1.0 + // The opacity of the marker. + opacity: 1, + + // @option riseOnHover: Boolean = false + // If `true`, the marker will get on top of others when you hover the mouse over it. + riseOnHover: false, + + // @option riseOffset: Number = 250 + // The z-index offset used for the `riseOnHover` feature. + riseOffset: 250, + + // @option pane: String = 'markerPane' + // `Map pane` where the markers icon will be added. + pane: 'markerPane', + + // @option shadowPane: String = 'shadowPane' + // `Map pane` where the markers shadow will be added. + shadowPane: 'shadowPane', + + // @option bubblingMouseEvents: Boolean = false + // When `true`, a mouse event on this marker will trigger the same event on the map + // (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used). + bubblingMouseEvents: false, + + // @section Draggable marker options + // @option draggable: Boolean = false + // Whether the marker is draggable with mouse/touch or not. + draggable: false, + + // @option autoPan: Boolean = false + // Whether to pan the map when dragging this marker near its edge or not. + autoPan: false, + + // @option autoPanPadding: Point = Point(50, 50) + // Distance (in pixels to the left/right and to the top/bottom) of the + // map edge to start panning the map. + autoPanPadding: [50, 50], + + // @option autoPanSpeed: Number = 10 + // Number of pixels the map should pan by. + autoPanSpeed: 10 + }, + + /* @section + * + * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods: + */ + + initialize: function (latlng, options) { + setOptions(this, options); + this._latlng = toLatLng(latlng); + }, + + onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation; + + if (this._zoomAnimated) { + map.on('zoomanim', this._animateZoom, this); + } + + this._initIcon(); + this.update(); + }, + + onRemove: function (map) { + if (this.dragging && this.dragging.enabled()) { + this.options.draggable = true; + this.dragging.removeHooks(); + } + delete this.dragging; + + if (this._zoomAnimated) { + map.off('zoomanim', this._animateZoom, this); + } + + this._removeIcon(); + this._removeShadow(); + }, + + getEvents: function () { + return { + zoom: this.update, + viewreset: this.update + }; + }, + + // @method getLatLng: LatLng + // Returns the current geographical position of the marker. + getLatLng: function () { + return this._latlng; + }, + + // @method setLatLng(latlng: LatLng): this + // Changes the marker position to the given point. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = toLatLng(latlng); + this.update(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); + }, + + // @method setZIndexOffset(offset: Number): this + // Changes the [zIndex offset](#marker-zindexoffset) of the marker. + setZIndexOffset: function (offset) { + this.options.zIndexOffset = offset; + return this.update(); + }, + + // @method getIcon: Icon + // Returns the current icon used by the marker + getIcon: function () { + return this.options.icon; + }, + + // @method setIcon(icon: Icon): this + // Changes the marker icon. + setIcon: function (icon) { + + this.options.icon = icon; + + if (this._map) { + this._initIcon(); + this.update(); + } + + if (this._popup) { + this.bindPopup(this._popup, this._popup.options); + } + + return this; + }, + + getElement: function () { + return this._icon; + }, + + update: function () { + + if (this._icon && this._map) { + var pos = this._map.latLngToLayerPoint(this._latlng).round(); + this._setPos(pos); + } + + return this; + }, + + _initIcon: function () { + var options = this.options, + classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + var icon = options.icon.createIcon(this._icon), + addIcon = false; + + // if we're not reusing the icon, remove the old one and init new one + if (icon !== this._icon) { + if (this._icon) { + this._removeIcon(); + } + addIcon = true; + + if (options.title) { + icon.title = options.title; + } + + if (icon.tagName === 'IMG') { + icon.alt = options.alt || ''; + } + } + + addClass(icon, classToAdd); + + if (options.keyboard) { + icon.tabIndex = '0'; + } + + this._icon = icon; + + if (options.riseOnHover) { + this.on({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + var newShadow = options.icon.createShadow(this._shadow), + addShadow = false; + + if (newShadow !== this._shadow) { + this._removeShadow(); + addShadow = true; + } + + if (newShadow) { + addClass(newShadow, classToAdd); + newShadow.alt = ''; + } + this._shadow = newShadow; + + + if (options.opacity < 1) { + this._updateOpacity(); + } + + + if (addIcon) { + this.getPane().appendChild(this._icon); + } + this._initInteraction(); + if (newShadow && addShadow) { + this.getPane(options.shadowPane).appendChild(this._shadow); + } + }, + + _removeIcon: function () { + if (this.options.riseOnHover) { + this.off({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + remove(this._icon); + this.removeInteractiveTarget(this._icon); + + this._icon = null; + }, + + _removeShadow: function () { + if (this._shadow) { + remove(this._shadow); + } + this._shadow = null; + }, + + _setPos: function (pos) { + + if (this._icon) { + setPosition(this._icon, pos); + } + + if (this._shadow) { + setPosition(this._shadow, pos); + } + + this._zIndex = pos.y + this.options.zIndexOffset; + + this._resetZIndex(); + }, + + _updateZIndex: function (offset) { + if (this._icon) { + this._icon.style.zIndex = this._zIndex + offset; + } + }, + + _animateZoom: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); + + this._setPos(pos); + }, + + _initInteraction: function () { + + if (!this.options.interactive) { return; } + + addClass(this._icon, 'leaflet-interactive'); + + this.addInteractiveTarget(this._icon); + + if (MarkerDrag) { + var draggable = this.options.draggable; + if (this.dragging) { + draggable = this.dragging.enabled(); + this.dragging.disable(); + } + + this.dragging = new MarkerDrag(this); + + if (draggable) { + this.dragging.enable(); + } + } + }, + + // @method setOpacity(opacity: Number): this + // Changes the opacity of the marker. + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._map) { + this._updateOpacity(); + } + + return this; + }, + + _updateOpacity: function () { + var opacity = this.options.opacity; + + if (this._icon) { + setOpacity(this._icon, opacity); + } + + if (this._shadow) { + setOpacity(this._shadow, opacity); + } + }, + + _bringToFront: function () { + this._updateZIndex(this.options.riseOffset); + }, + + _resetZIndex: function () { + this._updateZIndex(0); + }, + + _getPopupAnchor: function () { + return this.options.icon.options.popupAnchor; + }, + + _getTooltipAnchor: function () { + return this.options.icon.options.tooltipAnchor; + } +}); + + +// factory L.marker(latlng: LatLng, options? : Marker options) + +// @factory L.marker(latlng: LatLng, options? : Marker options) +// Instantiates a Marker object given a geographical point and optionally an options object. +function marker(latlng, options) { + return new Marker(latlng, options); +} + +/* + * @class Path + * @aka L.Path + * @inherits Interactive layer + * + * An abstract class that contains options and constants shared between vector + * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`. + */ + +var Path = Layer.extend({ + + // @section + // @aka Path options + options: { + // @option stroke: Boolean = true + // Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles. + stroke: true, + + // @option color: String = '#3388ff' + // Stroke color + color: '#3388ff', + + // @option weight: Number = 3 + // Stroke width in pixels + weight: 3, + + // @option opacity: Number = 1.0 + // Stroke opacity + opacity: 1, + + // @option lineCap: String= 'round' + // A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke. + lineCap: 'round', + + // @option lineJoin: String = 'round' + // A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke. + lineJoin: 'round', + + // @option dashArray: String = null + // A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashArray: null, + + // @option dashOffset: String = null + // A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashOffset: null, + + // @option fill: Boolean = depends + // Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles. + fill: false, + + // @option fillColor: String = * + // Fill color. Defaults to the value of the [`color`](#path-color) option + fillColor: null, + + // @option fillOpacity: Number = 0.2 + // Fill opacity. + fillOpacity: 0.2, + + // @option fillRule: String = 'evenodd' + // A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined. + fillRule: 'evenodd', + + // className: '', + + // Option inherited from "Interactive layer" abstract class + interactive: true, + + // @option bubblingMouseEvents: Boolean = true + // When `true`, a mouse event on this path will trigger the same event on the map + // (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used). + bubblingMouseEvents: true + }, + + beforeAdd: function (map) { + // Renderer is set here because we need to call renderer.getEvents + // before this.getEvents. + this._renderer = map.getRenderer(this); + }, + + onAdd: function () { + this._renderer._initPath(this); + this._reset(); + this._renderer._addPath(this); + }, + + onRemove: function () { + this._renderer._removePath(this); + }, + + // @method redraw(): this + // Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. + redraw: function () { + if (this._map) { + this._renderer._updatePath(this); + } + return this; + }, + + // @method setStyle(style: Path options): this + // Changes the appearance of a Path based on the options in the `Path options` object. + setStyle: function (style) { + setOptions(this, style); + if (this._renderer) { + this._renderer._updateStyle(this); + if (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) { + this._updateBounds(); + } + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all path layers. + bringToFront: function () { + if (this._renderer) { + this._renderer._bringToFront(this); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all path layers. + bringToBack: function () { + if (this._renderer) { + this._renderer._bringToBack(this); + } + return this; + }, + + getElement: function () { + return this._path; + }, + + _reset: function () { + // defined in child classes + this._project(); + this._update(); + }, + + _clickTolerance: function () { + // used when doing hit detection for Canvas layers + return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance; + } +}); + +/* + * @class CircleMarker + * @aka L.CircleMarker + * @inherits Path + * + * A circle of a fixed size with radius specified in pixels. Extends `Path`. + */ + +var CircleMarker = Path.extend({ + + // @section + // @aka CircleMarker options + options: { + fill: true, + + // @option radius: Number = 10 + // Radius of the circle marker, in pixels + radius: 10 + }, + + initialize: function (latlng, options) { + setOptions(this, options); + this._latlng = toLatLng(latlng); + this._radius = this.options.radius; + }, + + // @method setLatLng(latLng: LatLng): this + // Sets the position of a circle marker to a new location. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = toLatLng(latlng); + this.redraw(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); + }, + + // @method getLatLng(): LatLng + // Returns the current geographical position of the circle marker + getLatLng: function () { + return this._latlng; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle marker. Units are in pixels. + setRadius: function (radius) { + this.options.radius = this._radius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of the circle + getRadius: function () { + return this._radius; + }, + + setStyle : function (options) { + var radius = options && options.radius || this._radius; + Path.prototype.setStyle.call(this, options); + this.setRadius(radius); + return this; + }, + + _project: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + this._updateBounds(); + }, + + _updateBounds: function () { + var r = this._radius, + r2 = this._radiusY || r, + w = this._clickTolerance(), + p = [r + w, r2 + w]; + this._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p)); + }, + + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + _updatePath: function () { + this._renderer._updateCircle(this); + }, + + _empty: function () { + return this._radius && !this._renderer._bounds.intersects(this._pxBounds); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p) { + return p.distanceTo(this._point) <= this._radius + this._clickTolerance(); + } +}); + + +// @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options) +// Instantiates a circle marker object given a geographical point, and an optional options object. +function circleMarker(latlng, options) { + return new CircleMarker(latlng, options); +} + +/* + * @class Circle + * @aka L.Circle + * @inherits CircleMarker + * + * A class for drawing circle overlays on a map. Extends `CircleMarker`. + * + * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion). + * + * @example + * + * ```js + * L.circle([50.5, 30.5], {radius: 200}).addTo(map); + * ``` + */ + +var Circle = CircleMarker.extend({ + + initialize: function (latlng, options, legacyOptions) { + if (typeof options === 'number') { + // Backwards compatibility with 0.7.x factory (latlng, radius, options?) + options = extend({}, legacyOptions, {radius: options}); + } + setOptions(this, options); + this._latlng = toLatLng(latlng); + + if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); } + + // @section + // @aka Circle options + // @option radius: Number; Radius of the circle, in meters. + this._mRadius = this.options.radius; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle. Units are in meters. + setRadius: function (radius) { + this._mRadius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of a circle. Units are in meters. + getRadius: function () { + return this._mRadius; + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + var half = [this._radius, this._radiusY || this._radius]; + + return new LatLngBounds( + this._map.layerPointToLatLng(this._point.subtract(half)), + this._map.layerPointToLatLng(this._point.add(half))); + }, + + setStyle: Path.prototype.setStyle, + + _project: function () { + + var lng = this._latlng.lng, + lat = this._latlng.lat, + map = this._map, + crs = map.options.crs; + + if (crs.distance === Earth.distance) { + var d = Math.PI / 180, + latR = (this._mRadius / Earth.R) / d, + top = map.project([lat + latR, lng]), + bottom = map.project([lat - latR, lng]), + p = top.add(bottom).divideBy(2), + lat2 = map.unproject(p).lat, + lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / + (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; + + if (isNaN(lngR) || lngR === 0) { + lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425 + } + + this._point = p.subtract(map.getPixelOrigin()); + this._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x; + this._radiusY = p.y - top.y; + + } else { + var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0])); + + this._point = map.latLngToLayerPoint(this._latlng); + this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x; + } + + this._updateBounds(); + } +}); + +// @factory L.circle(latlng: LatLng, options?: Circle options) +// Instantiates a circle object given a geographical point, and an options object +// which contains the circle radius. +// @alternative +// @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options) +// Obsolete way of instantiating a circle, for compatibility with 0.7.x code. +// Do not use in new applications or plugins. +function circle(latlng, options, legacyOptions) { + return new Circle(latlng, options, legacyOptions); +} + +/* + * @class Polyline + * @aka L.Polyline + * @inherits Path + * + * A class for drawing polyline overlays on a map. Extends `Path`. + * + * @example + * + * ```js + * // create a red polyline from an array of LatLng points + * var latlngs = [ + * [45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2] + * ]; + * + * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polyline + * map.fitBounds(polyline.getBounds()); + * ``` + * + * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape: + * + * ```js + * // create a red polyline from an array of arrays of LatLng points + * var latlngs = [ + * [[45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2]], + * [[40.78, -73.91], + * [41.83, -87.62], + * [32.76, -96.72]] + * ]; + * ``` + */ + + +var Polyline = Path.extend({ + + // @section + // @aka Polyline options + options: { + // @option smoothFactor: Number = 1.0 + // How much to simplify the polyline on each zoom level. More means + // better performance and smoother look, and less means more accurate representation. + smoothFactor: 1.0, + + // @option noClip: Boolean = false + // Disable polyline clipping. + noClip: false + }, + + initialize: function (latlngs, options) { + setOptions(this, options); + this._setLatLngs(latlngs); + }, + + // @method getLatLngs(): LatLng[] + // Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. + getLatLngs: function () { + return this._latlngs; + }, + + // @method setLatLngs(latlngs: LatLng[]): this + // Replaces all the points in the polyline with the given array of geographical points. + setLatLngs: function (latlngs) { + this._setLatLngs(latlngs); + return this.redraw(); + }, + + // @method isEmpty(): Boolean + // Returns `true` if the Polyline has no LatLngs. + isEmpty: function () { + return !this._latlngs.length; + }, + + // @method closestLayerPoint(p: Point): Point + // Returns the point closest to `p` on the Polyline. + closestLayerPoint: function (p) { + var minDistance = Infinity, + minPoint = null, + closest = _sqClosestPointOnSegment, + p1, p2; + + for (var j = 0, jLen = this._parts.length; j < jLen; j++) { + var points = this._parts[j]; + + for (var i = 1, len = points.length; i < len; i++) { + p1 = points[i - 1]; + p2 = points[i]; + + var sqDist = closest(p, p1, p2, true); + + if (sqDist < minDistance) { + minDistance = sqDist; + minPoint = closest(p, p1, p2); + } + } + } + if (minPoint) { + minPoint.distance = Math.sqrt(minDistance); + } + return minPoint; + }, + + // @method getCenter(): LatLng + // Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline. + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, halfDist, segDist, dist, p1, p2, ratio, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polyline centroid algorithm; only uses the first ring if there are multiple + + for (i = 0, halfDist = 0; i < len - 1; i++) { + halfDist += points[i].distanceTo(points[i + 1]) / 2; + } + + // The line is so small in the current view that all points are on the same pixel. + if (halfDist === 0) { + return this._map.layerPointToLatLng(points[0]); + } + + for (i = 0, dist = 0; i < len - 1; i++) { + p1 = points[i]; + p2 = points[i + 1]; + segDist = p1.distanceTo(p2); + dist += segDist; + + if (dist > halfDist) { + ratio = (dist - halfDist) / segDist; + return this._map.layerPointToLatLng([ + p2.x - ratio * (p2.x - p1.x), + p2.y - ratio * (p2.y - p1.y) + ]); + } + } + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + return this._bounds; + }, + + // @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this + // Adds a given point to the polyline. By default, adds to the first ring of + // the polyline in case of a multi-polyline, but can be overridden by passing + // a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)). + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); + latlng = toLatLng(latlng); + latlngs.push(latlng); + this._bounds.extend(latlng); + return this.redraw(); + }, + + _setLatLngs: function (latlngs) { + this._bounds = new LatLngBounds(); + this._latlngs = this._convertLatLngs(latlngs); + }, + + _defaultShape: function () { + return isFlat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + + // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way + _convertLatLngs: function (latlngs) { + var result = [], + flat = isFlat(latlngs); + + for (var i = 0, len = latlngs.length; i < len; i++) { + if (flat) { + result[i] = toLatLng(latlngs[i]); + this._bounds.extend(result[i]); + } else { + result[i] = this._convertLatLngs(latlngs[i]); + } + } + + return result; + }, + + _project: function () { + var pxBounds = new Bounds(); + this._rings = []; + this._projectLatlngs(this._latlngs, this._rings, pxBounds); + + if (this._bounds.isValid() && pxBounds.isValid()) { + this._rawPxBounds = pxBounds; + this._updateBounds(); + } + }, + + _updateBounds: function () { + var w = this._clickTolerance(), + p = new Point(w, w); + this._pxBounds = new Bounds([ + this._rawPxBounds.min.subtract(p), + this._rawPxBounds.max.add(p) + ]); + }, + + // recursively turns latlngs into a set of rings with projected coordinates + _projectLatlngs: function (latlngs, result, projectedBounds) { + var flat = latlngs[0] instanceof LatLng, + len = latlngs.length, + i, ring; + + if (flat) { + ring = []; + for (i = 0; i < len; i++) { + ring[i] = this._map.latLngToLayerPoint(latlngs[i]); + projectedBounds.extend(ring[i]); + } + result.push(ring); + } else { + for (i = 0; i < len; i++) { + this._projectLatlngs(latlngs[i], result, projectedBounds); + } + } + }, + + // clip polyline by renderer bounds so that we have less to render for performance + _clipPoints: function () { + var bounds = this._renderer._bounds; + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + var parts = this._parts, + i, j, k, len, len2, segment, points; + + for (i = 0, k = 0, len = this._rings.length; i < len; i++) { + points = this._rings[i]; + + for (j = 0, len2 = points.length; j < len2 - 1; j++) { + segment = clipSegment(points[j], points[j + 1], bounds, j, true); + + if (!segment) { continue; } + + parts[k] = parts[k] || []; + parts[k].push(segment[0]); + + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) { + parts[k].push(segment[1]); + k++; + } + } + } + }, + + // simplify each clipped part of the polyline for performance + _simplifyPoints: function () { + var parts = this._parts, + tolerance = this.options.smoothFactor; + + for (var i = 0, len = parts.length; i < len; i++) { + parts[i] = simplify(parts[i], tolerance); + } + }, + + _update: function () { + if (!this._map) { return; } + + this._clipPoints(); + this._simplifyPoints(); + this._updatePath(); + }, + + _updatePath: function () { + this._renderer._updatePoly(this); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p, closed) { + var i, j, k, len, len2, part, + w = this._clickTolerance(); + + if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; } + + // hit detection for polylines + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + if (!closed && (j === 0)) { continue; } + + if (pointToSegmentDistance(p, part[k], part[j]) <= w) { + return true; + } + } + } + return false; + } +}); + +// @factory L.polyline(latlngs: LatLng[], options?: Polyline options) +// Instantiates a polyline object given an array of geographical points and +// optionally an options object. You can create a `Polyline` object with +// multiple separate lines (`MultiPolyline`) by passing an array of arrays +// of geographic points. +function polyline(latlngs, options) { + return new Polyline(latlngs, options); +} + +// Retrocompat. Allow plugins to support Leaflet versions before and after 1.1. +Polyline._flat = _flat; + +/* + * @class Polygon + * @aka L.Polygon + * @inherits Polyline + * + * A class for drawing polygon overlays on a map. Extends `Polyline`. + * + * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points. + * + * + * @example + * + * ```js + * // create a red polygon from an array of LatLng points + * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]]; + * + * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polygon + * map.fitBounds(polygon.getBounds()); + * ``` + * + * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape: + * + * ```js + * var latlngs = [ + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ]; + * ``` + * + * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape. + * + * ```js + * var latlngs = [ + * [ // first polygon + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ], + * [ // second polygon + * [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]] + * ] + * ]; + * ``` + */ + +var Polygon = Polyline.extend({ + + options: { + fill: true + }, + + isEmpty: function () { + return !this._latlngs.length || !this._latlngs[0].length; + }, + + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, j, p1, p2, f, area, x, y, center, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polygon centroid algorithm; only uses the first ring if there are multiple + + area = x = y = 0; + + for (i = 0, j = len - 1; i < len; j = i++) { + p1 = points[i]; + p2 = points[j]; + + f = p1.y * p2.x - p2.y * p1.x; + x += (p1.x + p2.x) * f; + y += (p1.y + p2.y) * f; + area += f * 3; + } + + if (area === 0) { + // Polygon is so small that all points are on same pixel. + center = points[0]; + } else { + center = [x / area, y / area]; + } + return this._map.layerPointToLatLng(center); + }, + + _convertLatLngs: function (latlngs) { + var result = Polyline.prototype._convertLatLngs.call(this, latlngs), + len = result.length; + + // remove last point if it equals first one + if (len >= 2 && result[0] instanceof LatLng && result[0].equals(result[len - 1])) { + result.pop(); + } + return result; + }, + + _setLatLngs: function (latlngs) { + Polyline.prototype._setLatLngs.call(this, latlngs); + if (isFlat(this._latlngs)) { + this._latlngs = [this._latlngs]; + } + }, + + _defaultShape: function () { + return isFlat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + + _clipPoints: function () { + // polygons need a different clipping algorithm so we redefine that + + var bounds = this._renderer._bounds, + w = this.options.weight, + p = new Point(w, w); + + // increase clip padding by stroke width to avoid stroke on clip edges + bounds = new Bounds(bounds.min.subtract(p), bounds.max.add(p)); + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + for (var i = 0, len = this._rings.length, clipped; i < len; i++) { + clipped = clipPolygon(this._rings[i], bounds, true); + if (clipped.length) { + this._parts.push(clipped); + } + } + }, + + _updatePath: function () { + this._renderer._updatePoly(this, true); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p) { + var inside = false, + part, p1, p2, i, j, k, len, len2; + + if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; } + + // ray casting algorithm for detecting if point is in polygon + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + p1 = part[j]; + p2 = part[k]; + + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + inside = !inside; + } + } + } + + // also check if it's on polygon stroke + return inside || Polyline.prototype._containsPoint.call(this, p, true); + } + +}); + + +// @factory L.polygon(latlngs: LatLng[], options?: Polyline options) +function polygon(latlngs, options) { + return new Polygon(latlngs, options); +} + +/* + * @class GeoJSON + * @aka L.GeoJSON + * @inherits FeatureGroup + * + * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse + * GeoJSON data and display it on the map. Extends `FeatureGroup`. + * + * @example + * + * ```js + * L.geoJSON(data, { + * style: function (feature) { + * return {color: feature.properties.color}; + * } + * }).bindPopup(function (layer) { + * return layer.feature.properties.description; + * }).addTo(map); + * ``` + */ + +var GeoJSON = FeatureGroup.extend({ + + /* @section + * @aka GeoJSON options + * + * @option pointToLayer: Function = * + * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally + * called when data is added, passing the GeoJSON point feature and its `LatLng`. + * The default is to spawn a default `Marker`: + * ```js + * function(geoJsonPoint, latlng) { + * return L.marker(latlng); + * } + * ``` + * + * @option style: Function = * + * A `Function` defining the `Path options` for styling GeoJSON lines and polygons, + * called internally when data is added. + * The default value is to not override any defaults: + * ```js + * function (geoJsonFeature) { + * return {} + * } + * ``` + * + * @option onEachFeature: Function = * + * A `Function` that will be called once for each created `Feature`, after it has + * been created and styled. Useful for attaching events and popups to features. + * The default is to do nothing with the newly created layers: + * ```js + * function (feature, layer) {} + * ``` + * + * @option filter: Function = * + * A `Function` that will be used to decide whether to include a feature or not. + * The default is to include all features: + * ```js + * function (geoJsonFeature) { + * return true; + * } + * ``` + * Note: dynamically changing the `filter` option will have effect only on newly + * added data. It will _not_ re-evaluate already included features. + * + * @option coordsToLatLng: Function = * + * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s. + * The default is the `coordsToLatLng` static method. + * + * @option markersInheritOptions: Boolean = false + * Whether default Markers for "Point" type Features inherit from group options. + */ + + initialize: function (geojson, options) { + setOptions(this, options); + + this._layers = {}; + + if (geojson) { + this.addData(geojson); + } + }, + + // @method addData( data ): this + // Adds a GeoJSON object to the layer. + addData: function (geojson) { + var features = isArray(geojson) ? geojson : geojson.features, + i, len, feature; + + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // only add this if geometry or geometries are set and not null + feature = features[i]; + if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { + this.addData(feature); + } + } + return this; + } + + var options = this.options; + + if (options.filter && !options.filter(geojson)) { return this; } + + var layer = geometryToLayer(geojson, options); + if (!layer) { + return this; + } + layer.feature = asFeature(geojson); + + layer.defaultOptions = layer.options; + this.resetStyle(layer); + + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); + }, + + // @method resetStyle( layer? ): this + // Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. + // If `layer` is omitted, the style of all features in the current layer is reset. + resetStyle: function (layer) { + if (layer === undefined) { + return this.eachLayer(this.resetStyle, this); + } + // reset any custom styles + layer.options = extend({}, layer.defaultOptions); + this._setLayerStyle(layer, this.options.style); + return this; + }, + + // @method setStyle( style ): this + // Changes styles of GeoJSON vector layers with the given style function. + setStyle: function (style) { + return this.eachLayer(function (layer) { + this._setLayerStyle(layer, style); + }, this); + }, + + _setLayerStyle: function (layer, style) { + if (layer.setStyle) { + if (typeof style === 'function') { + style = style(layer.feature); + } + layer.setStyle(style); + } + } +}); + +// @section +// There are several static functions which can be called without instantiating L.GeoJSON: + +// @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer +// Creates a `Layer` from a given GeoJSON feature. Can use a custom +// [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng) +// functions if provided as options. +function geometryToLayer(geojson, options) { + + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry ? geometry.coordinates : null, + layers = [], + pointToLayer = options && options.pointToLayer, + _coordsToLatLng = options && options.coordsToLatLng || coordsToLatLng, + latlng, latlngs, i, len; + + if (!coords && !geometry) { + return null; + } + + switch (geometry.type) { + case 'Point': + latlng = _coordsToLatLng(coords); + return _pointToLayer(pointToLayer, geojson, latlng, options); + + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = _coordsToLatLng(coords[i]); + layers.push(_pointToLayer(pointToLayer, geojson, latlng, options)); + } + return new FeatureGroup(layers); + + case 'LineString': + case 'MultiLineString': + latlngs = coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, _coordsToLatLng); + return new Polyline(latlngs, options); + + case 'Polygon': + case 'MultiPolygon': + latlngs = coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, _coordsToLatLng); + return new Polygon(latlngs, options); + + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + var layer = geometryToLayer({ + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties + }, options); + + if (layer) { + layers.push(layer); + } + } + return new FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); + } +} + +function _pointToLayer(pointToLayerFn, geojson, latlng, options) { + return pointToLayerFn ? + pointToLayerFn(geojson, latlng) : + new Marker(latlng, options && options.markersInheritOptions && options); +} + +// @function coordsToLatLng(coords: Array): LatLng +// Creates a `LatLng` object from an array of 2 numbers (longitude, latitude) +// or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points. +function coordsToLatLng(coords) { + return new LatLng(coords[1], coords[0], coords[2]); +} + +// @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array +// Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array. +// `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). +// Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function. +function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) { + var latlngs = []; + + for (var i = 0, len = coords.length, latlng; i < len; i++) { + latlng = levelsDeep ? + coordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) : + (_coordsToLatLng || coordsToLatLng)(coords[i]); + + latlngs.push(latlng); + } + + return latlngs; +} + +// @function latLngToCoords(latlng: LatLng, precision?: Number): Array +// Reverse of [`coordsToLatLng`](#geojson-coordstolatlng) +function latLngToCoords(latlng, precision) { + precision = typeof precision === 'number' ? precision : 6; + return latlng.alt !== undefined ? + [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision), formatNum(latlng.alt, precision)] : + [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision)]; +} + +// @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array +// Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs) +// `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default. +function latLngsToCoords(latlngs, levelsDeep, closed, precision) { + var coords = []; + + for (var i = 0, len = latlngs.length; i < len; i++) { + coords.push(levelsDeep ? + latLngsToCoords(latlngs[i], levelsDeep - 1, closed, precision) : + latLngToCoords(latlngs[i], precision)); + } + + if (!levelsDeep && closed) { + coords.push(coords[0]); + } + + return coords; +} + +function getFeature(layer, newGeometry) { + return layer.feature ? + extend({}, layer.feature, {geometry: newGeometry}) : + asFeature(newGeometry); +} + +// @function asFeature(geojson: Object): Object +// Normalize GeoJSON geometries/features into GeoJSON features. +function asFeature(geojson) { + if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') { + return geojson; + } + + return { + type: 'Feature', + properties: {}, + geometry: geojson + }; +} + +var PointToGeoJSON = { + toGeoJSON: function (precision) { + return getFeature(this, { + type: 'Point', + coordinates: latLngToCoords(this.getLatLng(), precision) + }); + } +}; + +// @namespace Marker +// @section Other methods +// @method toGeoJSON(precision?: Number): Object +// `precision` is the number of decimal places for coordinates. +// The default value is 6 places. +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). +Marker.include(PointToGeoJSON); + +// @namespace CircleMarker +// @method toGeoJSON(precision?: Number): Object +// `precision` is the number of decimal places for coordinates. +// The default value is 6 places. +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). +Circle.include(PointToGeoJSON); +CircleMarker.include(PointToGeoJSON); + + +// @namespace Polyline +// @method toGeoJSON(precision?: Number): Object +// `precision` is the number of decimal places for coordinates. +// The default value is 6 places. +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). +Polyline.include({ + toGeoJSON: function (precision) { + var multi = !isFlat(this._latlngs); + + var coords = latLngsToCoords(this._latlngs, multi ? 1 : 0, false, precision); + + return getFeature(this, { + type: (multi ? 'Multi' : '') + 'LineString', + coordinates: coords + }); + } +}); + +// @namespace Polygon +// @method toGeoJSON(precision?: Number): Object +// `precision` is the number of decimal places for coordinates. +// The default value is 6 places. +// Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). +Polygon.include({ + toGeoJSON: function (precision) { + var holes = !isFlat(this._latlngs), + multi = holes && !isFlat(this._latlngs[0]); + + var coords = latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true, precision); + + if (!holes) { + coords = [coords]; + } + + return getFeature(this, { + type: (multi ? 'Multi' : '') + 'Polygon', + coordinates: coords + }); + } +}); + + +// @namespace LayerGroup +LayerGroup.include({ + toMultiPoint: function (precision) { + var coords = []; + + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON(precision).geometry.coordinates); + }); + + return getFeature(this, { + type: 'MultiPoint', + coordinates: coords + }); + }, + + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`). + toGeoJSON: function (precision) { + + var type = this.feature && this.feature.geometry && this.feature.geometry.type; + + if (type === 'MultiPoint') { + return this.toMultiPoint(precision); + } + + var isGeometryCollection = type === 'GeometryCollection', + jsons = []; + + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + var json = layer.toGeoJSON(precision); + if (isGeometryCollection) { + jsons.push(json.geometry); + } else { + var feature = asFeature(json); + // Squash nested feature collections + if (feature.type === 'FeatureCollection') { + jsons.push.apply(jsons, feature.features); + } else { + jsons.push(feature); + } + } + } + }); + + if (isGeometryCollection) { + return getFeature(this, { + geometries: jsons, + type: 'GeometryCollection' + }); + } + + return { + type: 'FeatureCollection', + features: jsons + }; + } +}); + +// @namespace GeoJSON +// @factory L.geoJSON(geojson?: Object, options?: GeoJSON options) +// Creates a GeoJSON layer. Optionally accepts an object in +// [GeoJSON format](https://tools.ietf.org/html/rfc7946) to display on the map +// (you can alternatively add it later with `addData` method) and an `options` object. +function geoJSON(geojson, options) { + return new GeoJSON(geojson, options); +} + +// Backward compatibility. +var geoJson = geoJSON; + +/* + * @class ImageOverlay + * @aka L.ImageOverlay + * @inherits Interactive layer + * + * Used to load and display a single image over specific bounds of the map. Extends `Layer`. + * + * @example + * + * ```js + * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', + * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; + * L.imageOverlay(imageUrl, imageBounds).addTo(map); + * ``` + */ + +var ImageOverlay = Layer.extend({ + + // @section + // @aka ImageOverlay options + options: { + // @option opacity: Number = 1.0 + // The opacity of the image overlay. + opacity: 1, + + // @option alt: String = '' + // Text for the `alt` attribute of the image (useful for accessibility). + alt: '', + + // @option interactive: Boolean = false + // If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered. + interactive: false, + + // @option crossOrigin: Boolean|String = false + // Whether the crossOrigin attribute will be added to the image. + // If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. + // Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values. + crossOrigin: false, + + // @option errorOverlayUrl: String = '' + // URL to the overlay image to show in place of the overlay that failed to load. + errorOverlayUrl: '', + + // @option zIndex: Number = 1 + // The explicit [zIndex](https://developer.mozilla.org/docs/Web/CSS/CSS_Positioning/Understanding_z_index) of the overlay layer. + zIndex: 1, + + // @option className: String = '' + // A custom class name to assign to the image. Empty by default. + className: '' + }, + + initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) + this._url = url; + this._bounds = toLatLngBounds(bounds); + + setOptions(this, options); + }, + + onAdd: function () { + if (!this._image) { + this._initImage(); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + } + + if (this.options.interactive) { + addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); + } + + this.getPane().appendChild(this._image); + this._reset(); + }, + + onRemove: function () { + remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); + } + }, + + // @method setOpacity(opacity: Number): this + // Sets the opacity of the overlay. + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._image) { + this._updateOpacity(); + } + return this; + }, + + setStyle: function (styleOpts) { + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all overlays. + bringToFront: function () { + if (this._map) { + toFront(this._image); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all overlays. + bringToBack: function () { + if (this._map) { + toBack(this._image); + } + return this; + }, + + // @method setUrl(url: String): this + // Changes the URL of the image. + setUrl: function (url) { + this._url = url; + + if (this._image) { + this._image.src = url; + } + return this; + }, + + // @method setBounds(bounds: LatLngBounds): this + // Update the bounds that this ImageOverlay covers + setBounds: function (bounds) { + this._bounds = toLatLngBounds(bounds); + + if (this._map) { + this._reset(); + } + return this; + }, + + getEvents: function () { + var events = { + zoom: this._reset, + viewreset: this._reset + }; + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + + return events; + }, + + // @method setZIndex(value: Number): this + // Changes the [zIndex](#imageoverlay-zindex) of the image overlay. + setZIndex: function (value) { + this.options.zIndex = value; + this._updateZIndex(); + return this; + }, + + // @method getBounds(): LatLngBounds + // Get the bounds that this ImageOverlay covers + getBounds: function () { + return this._bounds; + }, + + // @method getElement(): HTMLElement + // Returns the instance of [`HTMLImageElement`](https://developer.mozilla.org/docs/Web/API/HTMLImageElement) + // used by this overlay. + getElement: function () { + return this._image; + }, + + _initImage: function () { + var wasElementSupplied = this._url.tagName === 'IMG'; + var img = this._image = wasElementSupplied ? this._url : create$1('img'); + + addClass(img, 'leaflet-image-layer'); + if (this._zoomAnimated) { addClass(img, 'leaflet-zoom-animated'); } + if (this.options.className) { addClass(img, this.options.className); } + + img.onselectstart = falseFn; + img.onmousemove = falseFn; + + // @event load: Event + // Fired when the ImageOverlay layer has loaded its image + img.onload = bind(this.fire, this, 'load'); + img.onerror = bind(this._overlayOnError, this, 'error'); + + if (this.options.crossOrigin || this.options.crossOrigin === '') { + img.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin; + } + + if (this.options.zIndex) { + this._updateZIndex(); + } + + if (wasElementSupplied) { + this._url = img.src; + return; + } + + img.src = this._url; + img.alt = this.options.alt; + }, + + _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min; + + setTransform(this._image, offset, scale); + }, + + _reset: function () { + var image = this._image, + bounds = new Bounds( + this._map.latLngToLayerPoint(this._bounds.getNorthWest()), + this._map.latLngToLayerPoint(this._bounds.getSouthEast())), + size = bounds.getSize(); + + setPosition(image, bounds.min); + + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; + }, + + _updateOpacity: function () { + setOpacity(this._image, this.options.opacity); + }, + + _updateZIndex: function () { + if (this._image && this.options.zIndex !== undefined && this.options.zIndex !== null) { + this._image.style.zIndex = this.options.zIndex; + } + }, + + _overlayOnError: function () { + // @event error: Event + // Fired when the ImageOverlay layer fails to load its image + this.fire('error'); + + var errorUrl = this.options.errorOverlayUrl; + if (errorUrl && this._url !== errorUrl) { + this._url = errorUrl; + this._image.src = errorUrl; + } + } +}); + +// @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options) +// Instantiates an image overlay object given the URL of the image and the +// geographical bounds it is tied to. +var imageOverlay = function (url, bounds, options) { + return new ImageOverlay(url, bounds, options); +}; + +/* + * @class VideoOverlay + * @aka L.VideoOverlay + * @inherits ImageOverlay + * + * Used to load and display a video player over specific bounds of the map. Extends `ImageOverlay`. + * + * A video overlay uses the [`

sr^l9Sa0>d{W4@^kaxr9dIGPzJjvrt1dfOG_> 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